1 | const co = require('bluebird').coroutine;
|
2 | const fs = require('mz/fs');
|
3 | const path = require('path');
|
4 | const _ = require('lodash');
|
5 | const confProcessor = require('./utils/config.processor.js');
|
6 | const fsUtils = require('./utils/file.utils.js');
|
7 |
|
8 | const CONFIG = 'config.json';
|
9 | const GRANTS = 'grants.json';
|
10 |
|
11 | const 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 |
|
20 | const 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 |
|
33 | const 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 |
|
52 | const contains = (source, elem) => source.indexOf(elem) > -1;
|
53 |
|
54 | const 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 |
|
127 | module.exports = {
|
128 | create
|
129 | };
|