UNPKG

4.22 kBJavaScriptView Raw
1const co = require('bluebird').coroutine;
2const fs = require('mz/fs');
3const path = require('path');
4const _ = require('lodash');
5const confProcessor = require('./utils/config.processor.js');
6const fsUtils = require('./utils/file.utils.js');
7
8const CONFIG = 'config.json';
9const GRANTS = 'grants.json';
10
11const baseClientConfig = {
12 jwt_configuration: {
13 alg: 'RS256',
14 lifetime_in_seconds: 36000
15 },
16 token_endpoint_auth_method: 'none',
17 app_type: 'regular_web'
18};
19
20const create = (client, dir, config) => {
21 return co(function* () {
22
23 const authClients = yield fsUtils.getDirectories(dir);
24
25 for (let i in authClients) {
26 const authClientData = yield getClientData(authClients[i], config);
27
28 yield createAuthClient(client, authClientData);
29 }
30 })();
31};
32
33const getClientData = (dir, config) => {
34 return co(function* () {
35 const files = yield fs.readdir(dir);
36
37 const configFile = files.find(f => f === CONFIG);
38 const grantFile = files.find(f => f === GRANTS);
39
40 const configData = (configFile) ? yield fsUtils.getFileContent(path.join(dir, configFile)) : '{}';
41 const grantData = (grantFile) ? yield fsUtils.getFileContent(path.join(dir, grantFile)) : '[]';
42
43 return {
44 name: path.basename(dir),
45 config: confProcessor.process(confProcessor.matcher.basic, configData, config),
46 grants: confProcessor.process(confProcessor.matcher.basic, grantData, config)
47 };
48
49 })();
50};
51
52const contains = (source, elem) => source.indexOf(elem) > -1;
53
54const createAuthClient = (client, authClientInfo) => {
55 return co(function* () {
56
57 const authClients = yield client.clients.getAll();
58
59 const existingAuthClient = authClients.find(res => {
60 return res.name === authClientInfo.name;
61 });
62
63 if (existingAuthClient) {
64 console.log(`Updating client: ${authClientInfo.name}`);
65
66 const delta = _.merge({}, baseClientConfig, authClientInfo.config);
67
68 yield client.clients.update({client_id: existingAuthClient.client_id}, delta);
69
70 const audiences = authClientInfo.grants.map(g => g.audience);
71
72 const allGrants = yield client.clientGrants.getAll();
73 const existingGrants = allGrants.filter(g => g.client_id === existingAuthClient.client_id);
74 const existingAudiences = existingGrants.map(g => g.audience);
75
76 const grantsToUpdate = existingGrants.filter(g => contains(audiences, g.audience));
77 const grantsToDelete = existingGrants.filter(g => !contains(audiences, g.audience));
78
79 const grantsToCreate = authClientInfo.grants.filter(g => !contains(existingAudiences, g.audience));
80
81 for (let i in grantsToDelete) {
82 const grant = grantsToDelete[i];
83 console.log(`Deleting grant with audience: ${grant.audience}`);
84 yield client.clientGrants.delete({id: grant.id});
85 }
86
87 for (let i in grantsToUpdate) {
88 const existingGrant = grantsToUpdate[i];
89 console.log(`Updating grant with audience: ${existingGrant.audience}`);
90 const grant = authClientInfo.grants.find(g => g.audience === existingGrant.audience);
91 delete grant.audience;
92 yield client.clientGrants.update({id: existingGrant.id}, grant);
93 }
94
95 for (let i in grantsToCreate) {
96 const grant = grantsToCreate[i];
97 grant.client_id = existingAuthClient.client_id;
98 console.log(`Creating grant for audience: ${grant.audience}`);
99 yield client.clientGrants.create(grant);
100 console.log(`Created grant`);
101 }
102
103 console.log('Updated client');
104
105 } else {
106 console.log(`Creating client: ${authClientInfo.name}`);
107 const authClient = _.merge({}, baseClientConfig, authClientInfo.config);
108 authClient.name = authClientInfo.name;
109
110 const createdClient = yield client.clients.create(authClient);
111
112 const grants = authClientInfo.grants.map(g => _.merge({client_id: createdClient.client_id}, g));
113
114 for (let i in grants) {
115 const grant = grants[i];
116 console.log(`Creating grant for audience: ${grant.audience}`);
117 yield client.clientGrants.create(grant);
118 console.log(`Created grant`);
119 }
120
121 console.log('Created client');
122 }
123
124 })();
125};
126
127module.exports = {
128 create
129};