soajs.controller 4.2.42 → 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 (37) 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/key/index.js +16 -1
  32. package/mw/mt/urac.js +21 -1
  33. package/mw/mt/utils.js +2 -0
  34. package/package.json +7 -7
  35. package/test/unit/mw/key/index.js +150 -0
  36. package/test/unit/mw/mt/urac.js +157 -4
  37. 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
  });
@@ -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
  });
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