soajs.controller 4.2.41 → 4.2.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/.github/workflows/ci.yml +43 -0
  2. package/.github/workflows/release.yml +92 -0
  3. package/ARCHITECTURE.md +193 -0
  4. package/Gruntfile.js +1 -1
  5. package/docs/configuration-custom-registry.md +421 -0
  6. package/docs/configuration-services-config.md +275 -0
  7. package/docs/data-flow.md +138 -0
  8. package/docs/deployment.md +205 -0
  9. package/docs/external-integrations.md +159 -0
  10. package/docs/gateway-routes.md +259 -0
  11. package/docs/maintenance-routes.md +308 -0
  12. package/docs/middleware/awareness.md +120 -0
  13. package/docs/middleware/cors.md +88 -0
  14. package/docs/middleware/enhancer.md +75 -0
  15. package/docs/middleware/favicon.md +36 -0
  16. package/docs/middleware/gotoService.md +146 -0
  17. package/docs/middleware/ip2ban.md +70 -0
  18. package/docs/middleware/key.md +196 -0
  19. package/docs/middleware/keyACL.md +139 -0
  20. package/docs/middleware/lastSeen.md +111 -0
  21. package/docs/middleware/maintenanceMode.md +81 -0
  22. package/docs/middleware/mt.md +188 -0
  23. package/docs/middleware/oauth.md +173 -0
  24. package/docs/middleware/response.md +106 -0
  25. package/docs/middleware/soajs.md +71 -0
  26. package/docs/middleware/traffic.md +190 -0
  27. package/docs/middleware/url.md +102 -0
  28. package/docs/multi-tenant-security.md +183 -0
  29. package/docs/request-flow.md +230 -0
  30. package/docs/service-discovery.md +167 -0
  31. package/mw/gotoService/redirectToService.js +15 -4
  32. package/mw/key/index.js +16 -1
  33. package/mw/lastSeen/index.js +3 -0
  34. package/mw/mt/urac.js +21 -1
  35. package/mw/mt/utils.js +2 -0
  36. package/package.json +7 -7
  37. package/test/integration/UC1-gateway-routes/index.js +2 -2
  38. package/test/unit/mw/key/index.js +150 -0
  39. package/test/unit/mw/lastSeen/index.js +5 -4
  40. package/test/unit/mw/mt/urac.js +157 -4
  41. package/test/unit/mw/mt/utils.js +6 -6
  42. package/.travis.yml +0 -72
@@ -134,4 +134,154 @@ describe("Unit test for: mw - key", function () {
134
134
  done();
135
135
  });
136
136
  });
137
+
138
+ describe("Network Package Override", function () {
139
+ let networkKeyObj = {
140
+ "key": "a139786a6e6d18e48b4987e83789430b",
141
+ "tenant": {"id": "10d2cb5fc04ce51e06000001", "code": "DBTN", "locked": true},
142
+ "application": {
143
+ "product": "AVAPP",
144
+ "package": "AVAPP_EXMPL",
145
+ "appId": "5c0e74ba9acc3c5a84a5125a",
146
+ "acl": null,
147
+ "acl_all_env": null
148
+ },
149
+ "device": null,
150
+ "env": "dev",
151
+ "geo": null,
152
+ "config": {
153
+ "gateway": {
154
+ "networkPackages": {
155
+ "mw": {
156
+ "AVAPP": {
157
+ "default": "AVAPP_DEFAU",
158
+ "users": {
159
+ "AVAPP_EXMPL": "AVAPP_ALTRN"
160
+ }
161
+ }
162
+ }
163
+ }
164
+ }
165
+ }
166
+ };
167
+
168
+ let networkReq = {
169
+ "get": () => {
170
+ return key;
171
+ },
172
+ "soajs": {
173
+ "controller": {"serviceParams": {}},
174
+ "registry": {
175
+ "serviceConfig": {
176
+ "key": {
177
+ algorithm: "aes256",
178
+ password: "soajs key lal massa"
179
+ }
180
+ },
181
+ "custom": {
182
+ "gateway": {
183
+ "value": {
184
+ "lastSeen": {
185
+ "network": "mw"
186
+ }
187
+ }
188
+ }
189
+ }
190
+ },
191
+ "log": {
192
+ "error": (err) => {
193
+ console.log(err);
194
+ },
195
+ "debug": (msg) => {
196
+ console.log(msg);
197
+ }
198
+ }
199
+ }
200
+ };
201
+
202
+ it("Call MW with network package override - should replace package with default", function (done) {
203
+ let networkProvision = {
204
+ "getExternalKeyData": (key, keyConfig, cb) => {
205
+ return cb(null, JSON.parse(JSON.stringify(networkKeyObj)));
206
+ },
207
+ "getPackageData": (pack, cb) => {
208
+ // Verify the package was overridden
209
+ if (pack === "AVAPP_DEFAU") {
210
+ return cb(null, {"acl": {}, "_TTL": 604800000});
211
+ }
212
+ return cb(new Error("Expected package AVAPP_DEFAU but got " + pack));
213
+ }
214
+ };
215
+ let mw_use = mw({"provision": networkProvision, "regEnvironment": "dev"});
216
+ mw_use(networkReq, res, (err) => {
217
+ if (err) {
218
+ done(new Error("Unexpected error: " + err));
219
+ } else {
220
+ done();
221
+ }
222
+ });
223
+ });
224
+
225
+ it("Call MW without network in registry - should NOT replace package", function (done) {
226
+ let reqNoNetwork = JSON.parse(JSON.stringify(networkReq));
227
+ reqNoNetwork.soajs.registry.custom = {};
228
+ reqNoNetwork.get = () => key;
229
+ reqNoNetwork.soajs.log = {
230
+ "error": (err) => { console.log(err); },
231
+ "debug": (msg) => { console.log(msg); }
232
+ };
233
+
234
+ let networkProvision = {
235
+ "getExternalKeyData": (key, keyConfig, cb) => {
236
+ return cb(null, JSON.parse(JSON.stringify(networkKeyObj)));
237
+ },
238
+ "getPackageData": (pack, cb) => {
239
+ // Verify the package was NOT overridden
240
+ if (pack === "AVAPP_EXMPL") {
241
+ return cb(null, {"acl": {}, "_TTL": 604800000});
242
+ }
243
+ return cb(new Error("Expected package AVAPP_EXMPL but got " + pack));
244
+ }
245
+ };
246
+ let mw_use = mw({"provision": networkProvision, "regEnvironment": "dev"});
247
+ mw_use(reqNoNetwork, res, (err) => {
248
+ if (err) {
249
+ done(new Error("Unexpected error: " + err));
250
+ } else {
251
+ done();
252
+ }
253
+ });
254
+ });
255
+
256
+ it("Call MW with different network - should NOT replace package", function (done) {
257
+ let reqDiffNetwork = JSON.parse(JSON.stringify(networkReq));
258
+ reqDiffNetwork.soajs.registry.custom.gateway.value.lastSeen.network = "other";
259
+ reqDiffNetwork.get = () => key;
260
+ reqDiffNetwork.soajs.log = {
261
+ "error": (err) => { console.log(err); },
262
+ "debug": (msg) => { console.log(msg); }
263
+ };
264
+
265
+ let networkProvision = {
266
+ "getExternalKeyData": (key, keyConfig, cb) => {
267
+ return cb(null, JSON.parse(JSON.stringify(networkKeyObj)));
268
+ },
269
+ "getPackageData": (pack, cb) => {
270
+ // Verify the package was NOT overridden (different network)
271
+ if (pack === "AVAPP_EXMPL") {
272
+ return cb(null, {"acl": {}, "_TTL": 604800000});
273
+ }
274
+ return cb(new Error("Expected package AVAPP_EXMPL but got " + pack));
275
+ }
276
+ };
277
+ let mw_use = mw({"provision": networkProvision, "regEnvironment": "dev"});
278
+ mw_use(reqDiffNetwork, res, (err) => {
279
+ if (err) {
280
+ done(new Error("Unexpected error: " + err));
281
+ } else {
282
+ done();
283
+ }
284
+ });
285
+ });
286
+ });
137
287
  });
@@ -7,7 +7,7 @@ const nock = require('nock')
7
7
 
8
8
  describe("Unit test for: mw - lastSeen", () => {
9
9
 
10
- it("success - default from environment", (done) => {
10
+ it("success - with network", (done) => {
11
11
  let res = {};
12
12
  let req = {
13
13
  getClientIP: () => {
@@ -42,7 +42,8 @@ describe("Unit test for: mw - lastSeen", () => {
42
42
  gateway: {
43
43
  value: {
44
44
  lastSeen: {
45
- active: true
45
+ active: true,
46
+ network: "YAYA"
46
47
  }
47
48
  }
48
49
  }
@@ -51,11 +52,11 @@ describe("Unit test for: mw - lastSeen", () => {
51
52
  }
52
53
  };
53
54
  const scope = nock('http://urac.fake:4001')
54
- .post('/user/last/seen')
55
+ .post('/user/last/seen', "{\"network\":\"YAYA\"}")
55
56
  .reply(200, {
56
57
  result: true,
57
58
  data: true
58
- })
59
+ });
59
60
  let functionMw = mw({});
60
61
  functionMw(req, res, (error) => {
61
62
  assert.ifError(error);
@@ -78,17 +78,17 @@ describe("Unit test for: mw - mt URAC", () => {
78
78
  oauth.bearerToken = require('../../../data/sample/bearerToken.json');
79
79
  soajs.tenant.application.product = "DSBRD";
80
80
  let uracDriver = new UracDriver({"soajs": soajs, "oauth": oauth});
81
-
81
+
82
82
  let provisionStub;
83
-
83
+
84
84
  before((done) => {
85
85
  const coreModules = require("soajs.core.modules");
86
86
  let provision = coreModules.provision;
87
-
87
+
88
88
  provisionStub = sinon.stub(provision, 'getPackagesData').callsFake((code, cb) => {
89
89
  return cb(null, []);
90
90
  });
91
-
91
+
92
92
  done();
93
93
  });
94
94
  after((done) => {
@@ -154,4 +154,157 @@ describe("Unit test for: mw - mt URAC", () => {
154
154
  done();
155
155
  });
156
156
  });
157
+
158
+ describe("Network Package Override test for: mw - mt URAC", () => {
159
+ let networkSoajs = {
160
+ tenant: {
161
+ application: {
162
+ product: "AVAPP"
163
+ },
164
+ key: {
165
+ iKey: "1111"
166
+ }
167
+ },
168
+ registry: {
169
+ custom: {
170
+ gateway: {
171
+ value: {
172
+ lastSeen: {
173
+ network: "mw"
174
+ }
175
+ }
176
+ }
177
+ }
178
+ },
179
+ controller: {
180
+ serviceParams: {
181
+ keyObj: {
182
+ config: {
183
+ gateway: {
184
+ networkPackages: {
185
+ "mw": {
186
+ "AVAPP": {
187
+ "default": "AVAPP_DEFAU",
188
+ "users": {
189
+ "AVAPP_EXMPL": "AVAPP_ALTRN"
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
198
+ },
199
+ log: {
200
+ debug: (msg) => {
201
+ console.log(msg);
202
+ }
203
+ }
204
+ };
205
+
206
+ let networkOauth = {
207
+ type: 2,
208
+ bearerToken: {
209
+ user: {
210
+ "_id": "user123",
211
+ "username": "testuser",
212
+ "firstName": "Test",
213
+ "lastName": "User",
214
+ "email": "test@example.com",
215
+ "groups": ["testgroup"],
216
+ "config": {},
217
+ "tenant": {"id": "tenant123", "code": "TEST"},
218
+ "groupsConfig": {
219
+ "allowedPackages": {
220
+ "AVAPP": ["AVAPP_EXMPL"]
221
+ }
222
+ },
223
+ "loginMode": "oauth",
224
+ "id": "user123"
225
+ }
226
+ }
227
+ };
228
+
229
+ let provisionStub;
230
+ let receivedPackages = null;
231
+
232
+ before((done) => {
233
+ const coreModules = require("soajs.core.modules");
234
+ let provision = coreModules.provision;
235
+
236
+ provisionStub = sinon.stub(provision, 'getPackagesData').callsFake((packages, cb) => {
237
+ receivedPackages = packages;
238
+ return cb(null, []);
239
+ });
240
+
241
+ done();
242
+ });
243
+
244
+ after((done) => {
245
+ if (provisionStub) {
246
+ provisionStub.restore();
247
+ }
248
+ done();
249
+ });
250
+
251
+ it("test resolveACL with user network package override - should replace package", (done) => {
252
+ receivedPackages = null;
253
+ let uracDriver = new UracDriver({"soajs": networkSoajs, "oauth": networkOauth});
254
+
255
+ uracDriver.init((error, uracProfile) => {
256
+ // Verify getPackagesData was called with the overridden package
257
+ assert.ok(receivedPackages, "getPackagesData should have been called");
258
+ assert.deepStrictEqual(receivedPackages, ["AVAPP_ALTRN"], "Package should be overridden from AVAPP_EXMPL to AVAPP_ALTRN");
259
+ done();
260
+ });
261
+ });
262
+
263
+ it("test resolveACL without network - should NOT replace package", (done) => {
264
+ receivedPackages = null;
265
+ let soajsNoNetwork = JSON.parse(JSON.stringify(networkSoajs));
266
+ soajsNoNetwork.registry.custom = {};
267
+ soajsNoNetwork.log = {debug: (msg) => console.log(msg)};
268
+
269
+ let uracDriver = new UracDriver({"soajs": soajsNoNetwork, "oauth": networkOauth});
270
+
271
+ uracDriver.init((error, uracProfile) => {
272
+ // Verify getPackagesData was called with the original package
273
+ assert.ok(receivedPackages, "getPackagesData should have been called");
274
+ assert.deepStrictEqual(receivedPackages, ["AVAPP_EXMPL"], "Package should NOT be overridden");
275
+ done();
276
+ });
277
+ });
278
+
279
+ it("test resolveACL with different network - should NOT replace package", (done) => {
280
+ receivedPackages = null;
281
+ let soajsDiffNetwork = JSON.parse(JSON.stringify(networkSoajs));
282
+ soajsDiffNetwork.registry.custom.gateway.value.lastSeen.network = "other";
283
+ soajsDiffNetwork.log = {debug: (msg) => console.log(msg)};
284
+
285
+ let uracDriver = new UracDriver({"soajs": soajsDiffNetwork, "oauth": networkOauth});
286
+
287
+ uracDriver.init((error, uracProfile) => {
288
+ // Verify getPackagesData was called with the original package (different network)
289
+ assert.ok(receivedPackages, "getPackagesData should have been called");
290
+ assert.deepStrictEqual(receivedPackages, ["AVAPP_EXMPL"], "Package should NOT be overridden for different network");
291
+ done();
292
+ });
293
+ });
294
+
295
+ it("test resolveACL with no user mapping for package - should NOT replace package", (done) => {
296
+ receivedPackages = null;
297
+ let oauthDiffPackage = JSON.parse(JSON.stringify(networkOauth));
298
+ oauthDiffPackage.bearerToken.user.groupsConfig.allowedPackages.AVAPP = ["AVAPP_OTHER"];
299
+
300
+ let uracDriver = new UracDriver({"soajs": networkSoajs, "oauth": oauthDiffPackage});
301
+
302
+ uracDriver.init((error, uracProfile) => {
303
+ // Verify getPackagesData was called with original package (no mapping exists)
304
+ assert.ok(receivedPackages, "getPackagesData should have been called");
305
+ assert.deepStrictEqual(receivedPackages, ["AVAPP_OTHER"], "Package should NOT be overridden when no mapping exists");
306
+ done();
307
+ });
308
+ });
309
+ });
157
310
  });
@@ -83,7 +83,7 @@ describe("Unit test for: mw - mt utils", () => {
83
83
  }
84
84
  };
85
85
  utils.securityDeviceCheck(obj, function (error, obj) {
86
- assert.equal(error, 156);
86
+ assert.strictEqual(error, 156);
87
87
  done();
88
88
  });
89
89
  });
@@ -132,7 +132,7 @@ describe("Unit test for: mw - mt utils", () => {
132
132
  }
133
133
  };
134
134
  utils.securityDeviceCheck(obj, function (error, obj) {
135
- assert.equal(error, 156);
135
+ assert.strictEqual(error, 156);
136
136
  done();
137
137
  });
138
138
  });
@@ -181,7 +181,7 @@ describe("Unit test for: mw - mt utils", () => {
181
181
  }
182
182
  };
183
183
  utils.securityDeviceCheck(obj, function (error, obj) {
184
- assert.equal(error, 156);
184
+ assert.strictEqual(error, 156);
185
185
  done();
186
186
  });
187
187
  });
@@ -223,7 +223,7 @@ describe("Unit test for: mw - mt utils", () => {
223
223
  }
224
224
  };
225
225
  utils.securityDeviceCheck(obj, function (error, obj) {
226
- assert.equal(error, 156);
226
+ assert.strictEqual(error, 156);
227
227
  done();
228
228
  });
229
229
  });
@@ -265,7 +265,7 @@ describe("Unit test for: mw - mt utils", () => {
265
265
  }
266
266
  };
267
267
  utils.securityDeviceCheck(obj, function (error, obj) {
268
- assert.equal(error, 156);
268
+ assert.strictEqual(error, 156);
269
269
  done();
270
270
  });
271
271
  });
@@ -305,7 +305,7 @@ describe("Unit test for: mw - mt utils", () => {
305
305
  }
306
306
  };
307
307
  utils.securityDeviceCheck(obj, function (error, obj) {
308
- assert.equal(error, 156);
308
+ assert.strictEqual(error, 156);
309
309
  done();
310
310
  });
311
311
  });
package/.travis.yml DELETED
@@ -1,72 +0,0 @@
1
- dist: focal
2
- language: node_js
3
- node_js: 20
4
-
5
- jobs:
6
- include:
7
-
8
- - stage: install, check code style and coverage
9
- if: tag IS blank
10
- services:
11
- - mongodb
12
- addons:
13
- hosts:
14
- - localhost
15
- before_script:
16
- - npm install -g grunt-cli
17
- - sleep 10
18
- script:
19
- - grunt
20
- - if [ "$TRAVIS_BRANCH" != "master" ]; then grunt test; fi
21
- - if [ "$TRAVIS_BRANCH" = "master" ]; then grunt coverage; fi
22
-
23
- # - stage: Publish to npm
24
- # if: branch =~ /(release)/
25
- # script:
26
- # - echo "PUBLISH npm"
27
- # deploy:
28
- # skip_cleanup: true
29
- # provider: npm
30
- # email: $NPM_EMAIL
31
- # api_key: $NPM_TOKEN
32
- # on:
33
- # all_branches: true
34
- # condition: $TRAVIS_BRANCH =~ ^(release)*
35
-
36
- - stage: Publish to docker registry
37
- if: branch =~ /(release)/
38
- script:
39
- - echo "PUBLISH docker"
40
- - export PACKAGE_VERSION=$(cat package.json | grep version | head -1 | awk -Fn '{ print $2 }' | sed 's/[n:",]//g' | tr -d '[[:space:]]')
41
- - export MAJOR_VERSION=$(echo ${PACKAGE_VERSION} | awk -F. '{ print $1 }')
42
- - echo Package version ${PACKAGE_VERSION}
43
- - echo Major version ${MAJOR_VERSION}
44
-
45
- - git config --local user.name ${GIT_USER}
46
- - git config --local user.email ${GIT_EMAIL}
47
- - git tag ${PACKAGE_VERSION}
48
-
49
- - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
50
-
51
- - docker build -t soajsorg/gateway . --platform linux/amd64
52
-
53
- - docker images
54
-
55
- - docker tag soajsorg/gateway:latest soajsorg/gateway:${PACKAGE_VERSION}
56
- - docker tag soajsorg/gateway:latest soajsorg/gateway:${MAJOR_VERSION}.x
57
-
58
- - docker push soajsorg/gateway
59
- - docker push soajsorg/gateway:${PACKAGE_VERSION}
60
- - docker push soajsorg/gateway:${MAJOR_VERSION}.x
61
- before_deploy:
62
- - yes | gem update --system --force
63
- - gem install bundler
64
- - gem install faraday-net_http -v '3.3.0'
65
- - gem install uri
66
- - gem install logger
67
- deploy:
68
- on:
69
- all_branches: true
70
- provider: releases
71
- api_key: ${GIT_TOKEN}
72
- skip_cleanup: true