@autofleet/zehut 1.5.6 → 1.5.9
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.
- package/lib/check-permission.d.ts +2 -2
- package/lib/check-permission.js +6 -6
- package/lib/errors.d.ts +1 -1
- package/lib/errors.js +1 -0
- package/lib/secret-getter.js +1 -1
- package/lib/secret-getter.test.d.ts +1 -0
- package/lib/secret-getter.test.js +90 -0
- package/lib/services.js +1 -0
- package/lib/user/ApiUser.js +1 -0
- package/lib/user/index.js +1 -1
- package/lib/utils.js +9 -10
- package/package.json +13 -6
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
export declare const getUser: () => any;
|
|
2
|
+
export declare const isUserExist: () => boolean;
|
|
1
3
|
export declare const checkFleetPermission: (fleetId: any) => boolean;
|
|
2
4
|
export declare const checkBusinessModelPermission: (businessModelId: any) => boolean;
|
|
3
5
|
export declare const checkDemandSourcePermission: (demandSourceId: any) => boolean;
|
|
4
|
-
export declare const getUser: () => any;
|
|
5
|
-
export declare const isUserExist: () => boolean;
|
package/lib/check-permission.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.checkDemandSourcePermission = exports.checkBusinessModelPermission = exports.checkFleetPermission = exports.isUserExist = exports.getUser = void 0;
|
|
4
4
|
const tracer_1 = require("./tracer");
|
|
5
|
-
exports.
|
|
5
|
+
exports.getUser = () => { var _a, _b; return (_b = (_a = tracer_1.getCurrentTrace()) === null || _a === void 0 ? void 0 : _a.context) === null || _b === void 0 ? void 0 : _b.user; };
|
|
6
|
+
exports.isUserExist = () => !!exports.getUser();
|
|
7
|
+
exports.checkFleetPermission = (fleetId) => {
|
|
6
8
|
if (exports.isUserExist()) {
|
|
7
9
|
const { context } = tracer_1.getCurrentTrace();
|
|
8
10
|
const user = context === null || context === void 0 ? void 0 : context.get('userObject');
|
|
@@ -10,7 +12,7 @@ exports.checkFleetPermission = fleetId => {
|
|
|
10
12
|
}
|
|
11
13
|
return true;
|
|
12
14
|
};
|
|
13
|
-
exports.checkBusinessModelPermission = businessModelId => {
|
|
15
|
+
exports.checkBusinessModelPermission = (businessModelId) => {
|
|
14
16
|
if (exports.isUserExist()) {
|
|
15
17
|
const { context } = tracer_1.getCurrentTrace();
|
|
16
18
|
const user = context === null || context === void 0 ? void 0 : context.get('userObject');
|
|
@@ -18,7 +20,7 @@ exports.checkBusinessModelPermission = businessModelId => {
|
|
|
18
20
|
}
|
|
19
21
|
return true;
|
|
20
22
|
};
|
|
21
|
-
exports.checkDemandSourcePermission = demandSourceId => {
|
|
23
|
+
exports.checkDemandSourcePermission = (demandSourceId) => {
|
|
22
24
|
if (exports.isUserExist()) {
|
|
23
25
|
const { context } = tracer_1.getCurrentTrace();
|
|
24
26
|
const user = context === null || context === void 0 ? void 0 : context.get('userObject');
|
|
@@ -26,5 +28,3 @@ exports.checkDemandSourcePermission = demandSourceId => {
|
|
|
26
28
|
}
|
|
27
29
|
return true;
|
|
28
30
|
};
|
|
29
|
-
exports.getUser = () => { var _a, _b; return (_b = (_a = tracer_1.getCurrentTrace()) === null || _a === void 0 ? void 0 : _a.context) === null || _b === void 0 ? void 0 : _b.user; };
|
|
30
|
-
exports.isUserExist = () => !!exports.getUser();
|
package/lib/errors.d.ts
CHANGED
package/lib/errors.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UnauthorizedAccessError = void 0;
|
|
4
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
4
5
|
class UnauthorizedAccessError extends Error {
|
|
5
6
|
constructor(user = null, message) {
|
|
6
7
|
super(message);
|
package/lib/secret-getter.js
CHANGED
|
@@ -7,8 +7,8 @@ exports.getTokenSecret = exports.getRefreshTokenSecret = void 0;
|
|
|
7
7
|
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
8
|
const moment_1 = __importDefault(require("moment"));
|
|
9
9
|
const { DEPRECATED_JWT_SECRET, JWT_SECRET, DEPRECATED_REFRESH_JWT_SECRET, REFRESH_JWT_SECRET, DEPRECATION_UNIX_TIMESTAMP, } = process.env;
|
|
10
|
-
const deprecationTime = moment_1.default(DEPRECATION_UNIX_TIMESTAMP || undefined);
|
|
11
10
|
const getRelevantSecret = (token, deprecatedSecret, newSecret) => {
|
|
11
|
+
const deprecationTime = moment_1.default((parseInt(DEPRECATION_UNIX_TIMESTAMP, 10) * 1000) || undefined);
|
|
12
12
|
try {
|
|
13
13
|
let unixTime;
|
|
14
14
|
if (token) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
24
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
25
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
26
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
27
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
|
+
};
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
35
|
+
const moment_1 = __importDefault(require("moment"));
|
|
36
|
+
const sleep = (ms) => __awaiter(void 0, void 0, void 0, function* () { return new Promise((resolve) => setTimeout(resolve, ms)); });
|
|
37
|
+
process.env.NODE_ENV = 'node-common-test';
|
|
38
|
+
describe('secret getter tests', () => {
|
|
39
|
+
const testSecrets = {
|
|
40
|
+
DEPRECATED_JWT_SECRET: 'test_deprecated_secret',
|
|
41
|
+
JWT_SECRET: 'test_secret',
|
|
42
|
+
DEPRECATED_REFRESH_JWT_SECRET: 'test_deprecated_refresh_secret',
|
|
43
|
+
REFRESH_JWT_SECRET: 'test_refresh_secret',
|
|
44
|
+
};
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
jest.resetModules();
|
|
47
|
+
process.env = Object.assign(Object.assign({}, (process.env || {})), testSecrets); // Make a copy
|
|
48
|
+
});
|
|
49
|
+
it('test get new refresh token secret when after deprecation timestamp', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
50
|
+
process.env.DEPRECATION_UNIX_TIMESTAMP = moment_1.default().subtract(1, 'days').unix().toString();
|
|
51
|
+
const { getTokenSecret } = yield Promise.resolve().then(() => __importStar(require('./secret-getter')));
|
|
52
|
+
const token = jsonwebtoken_1.default.sign({
|
|
53
|
+
exp: moment_1.default().unix() + (60 * 60 * 24 * 365),
|
|
54
|
+
}, testSecrets.JWT_SECRET);
|
|
55
|
+
const result = getTokenSecret(token);
|
|
56
|
+
expect(result).toBe(testSecrets.JWT_SECRET);
|
|
57
|
+
}));
|
|
58
|
+
it('test get old refresh token secret when before deprecation timestamp', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
59
|
+
process.env.DEPRECATION_UNIX_TIMESTAMP = moment_1.default().add(1, 'days').unix().toString();
|
|
60
|
+
const { getTokenSecret } = yield Promise.resolve().then(() => __importStar(require('./secret-getter')));
|
|
61
|
+
const token = jsonwebtoken_1.default.sign({
|
|
62
|
+
exp: moment_1.default().unix() + (60 * 60 * 24 * 365),
|
|
63
|
+
}, testSecrets.DEPRECATED_JWT_SECRET);
|
|
64
|
+
const result = getTokenSecret(token);
|
|
65
|
+
expect(result).toBe(testSecrets.DEPRECATED_JWT_SECRET);
|
|
66
|
+
}));
|
|
67
|
+
it('test get old refresh token secret when after deprecation timestamp, but token is from before', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
68
|
+
const token = jsonwebtoken_1.default.sign({
|
|
69
|
+
exp: moment_1.default().unix() + (60 * 60 * 24 * 365),
|
|
70
|
+
}, testSecrets.DEPRECATED_JWT_SECRET);
|
|
71
|
+
process.env.DEPRECATION_UNIX_TIMESTAMP = moment_1.default().add(10, 'seconds').unix().toString();
|
|
72
|
+
const { getTokenSecret } = yield Promise.resolve().then(() => __importStar(require('./secret-getter')));
|
|
73
|
+
yield sleep(1000);
|
|
74
|
+
const result = getTokenSecret(token);
|
|
75
|
+
expect(result).toBe(testSecrets.DEPRECATED_JWT_SECRET);
|
|
76
|
+
}));
|
|
77
|
+
it('test malformed token returns new secret', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
78
|
+
const { getTokenSecret } = yield Promise.resolve().then(() => __importStar(require('./secret-getter')));
|
|
79
|
+
const token = 'shit';
|
|
80
|
+
const result = getTokenSecret(token);
|
|
81
|
+
expect(result).toBe(testSecrets.JWT_SECRET);
|
|
82
|
+
}));
|
|
83
|
+
it('test malformed token returns new secret even before deprecation time', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
84
|
+
process.env.DEPRECATION_UNIX_TIMESTAMP = moment_1.default().add(10, 'day').unix().toString();
|
|
85
|
+
const { getTokenSecret } = yield Promise.resolve().then(() => __importStar(require('./secret-getter')));
|
|
86
|
+
const token = 'shit';
|
|
87
|
+
const result = getTokenSecret(token);
|
|
88
|
+
expect(result).toBe(testSecrets.JWT_SECRET);
|
|
89
|
+
}));
|
|
90
|
+
});
|
package/lib/services.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.IdentityNetwork = void 0;
|
|
7
7
|
const network_1 = __importDefault(require("@autofleet/network"));
|
|
8
8
|
const CACHE_LIFETIME_IN_SEC = 10;
|
|
9
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
9
10
|
exports.IdentityNetwork = new network_1.default({
|
|
10
11
|
serviceName: 'IDENTITY_MS',
|
|
11
12
|
retries: 3,
|
package/lib/user/ApiUser.js
CHANGED
|
@@ -9,6 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
/* eslint-disable consistent-return */
|
|
12
13
|
const services_1 = require("../services");
|
|
13
14
|
class ApiUser {
|
|
14
15
|
constructor(id) {
|
package/lib/user/index.js
CHANGED
|
@@ -81,9 +81,9 @@ exports.middlewareWithDecode = (options = {}) => (req, res, next) => __awaiter(v
|
|
|
81
81
|
trace.context.set('userObject', userObject);
|
|
82
82
|
// Added in order to support outbreak.
|
|
83
83
|
req.headers['x-af-user-permissions'] = userObject;
|
|
84
|
-
const entities = req.user.permissions;
|
|
85
84
|
}
|
|
86
85
|
trace.context.set('userObject', {});
|
|
86
|
+
// eslint-disable-next-line consistent-return
|
|
87
87
|
return next();
|
|
88
88
|
});
|
|
89
89
|
exports.eagerLoadPermissionsMiddleware = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
|
package/lib/utils.js
CHANGED
|
@@ -41,9 +41,8 @@ exports.parsePermissions = (contextId, decodedToken) => {
|
|
|
41
41
|
return [];
|
|
42
42
|
}
|
|
43
43
|
const contexts = decodedToken.contexts;
|
|
44
|
-
const activeContext = contexts.find(context => context.id === contextId);
|
|
45
|
-
const
|
|
46
|
-
const permissionsValue = `${(_a = activeContext.permissions) === null || _a === void 0 ? void 0 : _a.map(cp => `${cp},`)}`;
|
|
44
|
+
const activeContext = contexts.find((context) => context.id === contextId);
|
|
45
|
+
const permissionsValue = `${(_a = activeContext.permissions) === null || _a === void 0 ? void 0 : _a.map((cp) => `${cp},`)}`;
|
|
47
46
|
return {
|
|
48
47
|
key: activeContext.entityId,
|
|
49
48
|
value: permissionsValue,
|
|
@@ -55,15 +54,15 @@ exports.getEntitiesFromContext = (contextId, decodedToken) => {
|
|
|
55
54
|
}
|
|
56
55
|
let contexts = decodedToken.contexts;
|
|
57
56
|
if (contextId) {
|
|
58
|
-
contexts = contexts.filter(context => context.id === contextId);
|
|
57
|
+
contexts = contexts.filter((context) => context.id === contextId);
|
|
59
58
|
}
|
|
60
59
|
const attributes = {};
|
|
61
60
|
contexts.forEach((context) => {
|
|
62
61
|
const prop = CONTEXT_MAP_PROPS[context.subSystem || 'business'];
|
|
63
62
|
const permissions = exports.parsePermissions(context.id, decodedToken);
|
|
64
63
|
// eslint-disable-next-line no-unused-expressions
|
|
65
|
-
attributes[prop]
|
|
66
|
-
attributes[prop][permissions.key] = permissions.value
|
|
64
|
+
attributes[prop]
|
|
65
|
+
? attributes[prop][permissions.key] = permissions.value
|
|
67
66
|
: attributes[prop] = { [permissions.key]: permissions.value };
|
|
68
67
|
});
|
|
69
68
|
return attributes;
|
|
@@ -74,7 +73,7 @@ exports.getContextAttributes = (contextId, decodedToken) => {
|
|
|
74
73
|
}
|
|
75
74
|
let contexts = decodedToken.contexts;
|
|
76
75
|
if (contextId) {
|
|
77
|
-
contexts = contexts.filter(context => context.id === contextId);
|
|
76
|
+
contexts = contexts.filter((context) => context.id === contextId);
|
|
78
77
|
}
|
|
79
78
|
const attributes = {};
|
|
80
79
|
contexts.forEach((context) => {
|
|
@@ -82,9 +81,9 @@ exports.getContextAttributes = (contextId, decodedToken) => {
|
|
|
82
81
|
if (context[prop]) {
|
|
83
82
|
const contextPropWrapped = [context[prop]];
|
|
84
83
|
// eslint-disable-next-line no-unused-expressions
|
|
85
|
-
attributes[prop]
|
|
86
|
-
attributes[prop] = attributes[prop].concat(contextPropWrapped)
|
|
87
|
-
attributes[prop] = contextPropWrapped;
|
|
84
|
+
attributes[prop]
|
|
85
|
+
? attributes[prop] = attributes[prop].concat(contextPropWrapped)
|
|
86
|
+
: attributes[prop] = contextPropWrapped;
|
|
88
87
|
}
|
|
89
88
|
});
|
|
90
89
|
});
|
package/package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@autofleet/zehut",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.9",
|
|
4
4
|
"description": "manage user's identity",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "rm -rf lib && tsc",
|
|
9
9
|
"prepublish": "npm run build",
|
|
10
|
-
"coverage": "jest --coverage --forceExit --runInBand",
|
|
10
|
+
"coverage": "jest --coverage --forceExit --runInBand && rm -rf ./coverage",
|
|
11
11
|
"test": "jest --forceExit --runInBand",
|
|
12
12
|
"test-auto": "jest --watch --runInBand",
|
|
13
13
|
"linter": "./node_modules/.bin/eslint ."
|
|
14
14
|
},
|
|
15
15
|
"jest": {
|
|
16
|
-
"
|
|
17
|
-
"testURL": "http://localhost
|
|
16
|
+
"verbose": true,
|
|
17
|
+
"testURL": "http://localhost/"
|
|
18
18
|
},
|
|
19
19
|
"repository": {
|
|
20
20
|
"type": "git",
|
|
@@ -27,15 +27,22 @@
|
|
|
27
27
|
},
|
|
28
28
|
"homepage": "https://github.com/Autofleet/zehut",
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@autofleet/network": "^1.
|
|
30
|
+
"@autofleet/network": "^1.1.4",
|
|
31
31
|
"@autofleet/outbreak": "0.0.7",
|
|
32
|
+
"@types/jest": "^22.0.0",
|
|
32
33
|
"axios": "^0.19.2",
|
|
33
34
|
"jsonwebtoken": "^8.5.1",
|
|
34
35
|
"moment": "^2.29.1",
|
|
35
36
|
"uuid": "^8.3.2"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
38
|
-
"typescript": "^3.9.5"
|
|
39
|
+
"typescript": "^3.9.5",
|
|
40
|
+
"jest": "^22.4.4",
|
|
41
|
+
"ts-jest": "^25.4.0",
|
|
42
|
+
"@typescript-eslint/eslint-plugin": "^4.8.1",
|
|
43
|
+
"eslint": "^7.13.0",
|
|
44
|
+
"eslint-config-airbnb-typescript": "^12.0.0",
|
|
45
|
+
"eslint-plugin-import": "^2.22.1"
|
|
39
46
|
},
|
|
40
47
|
"files": [
|
|
41
48
|
"lib/**/*"
|