@autofleet/zehut 1.0.0-gery-ba-beta-1 → 1.0.1
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/.circleci/config.yml +26 -0
- package/.eslintrc.json +8 -0
- package/.gitlab-ci.yml +13 -0
- package/.jest.config.js +8 -0
- package/README.md +0 -4
- package/index.js +5 -0
- package/package.json +11 -32
- package/src/.env +0 -0
- package/src/user/index.ts +93 -0
- package/tsconfig.json +14 -0
- package/lib/app-auth.d.ts +0 -2
- package/lib/app-auth.js +0 -14
- package/lib/check-permission.d.ts +0 -6
- package/lib/check-permission.js +0 -35
- package/lib/errors.d.ts +0 -5
- package/lib/errors.js +0 -12
- package/lib/exceptions/appDoesNotExist.d.ts +0 -3
- package/lib/exceptions/appDoesNotExist.js +0 -5
- package/lib/index.d.ts +0 -50
- package/lib/index.js +0 -80
- package/lib/secret-getter.d.ts +0 -2
- package/lib/secret-getter.js +0 -30
- package/lib/secret-getter.test.d.ts +0 -1
- package/lib/secret-getter.test.js +0 -90
- package/lib/services.d.ts +0 -2
- package/lib/services.js +0 -27
- package/lib/test-helpers/index.d.ts +0 -9
- package/lib/test-helpers/index.js +0 -35
- package/lib/tracer.d.ts +0 -21
- package/lib/tracer.js +0 -73
- package/lib/user/ApiUser.d.ts +0 -48
- package/lib/user/ApiUser.js +0 -159
- package/lib/user/api-user-flows.test.d.ts +0 -1
- package/lib/user/api-user-flows.test.js +0 -125
- package/lib/user/index.d.ts +0 -19
- package/lib/user/index.js +0 -209
- package/lib/utils.d.ts +0 -5
- package/lib/utils.js +0 -99
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
jobs:
|
|
3
|
+
test:
|
|
4
|
+
docker:
|
|
5
|
+
- image: circleci/node:11.14.0
|
|
6
|
+
steps:
|
|
7
|
+
- checkout
|
|
8
|
+
- restore_cache:
|
|
9
|
+
keys:
|
|
10
|
+
- v1-dependencies-{{ checksum "package.json" }}
|
|
11
|
+
# fallback to using the latest cache if no exact match is found
|
|
12
|
+
- v1-dependencies-
|
|
13
|
+
- run: npm i
|
|
14
|
+
- save_cache:
|
|
15
|
+
paths:
|
|
16
|
+
- node_modules
|
|
17
|
+
key: v1-dependencies-{{ checksum "package.json" }}
|
|
18
|
+
- run: npm run coverage
|
|
19
|
+
- run: rm -rf ./coverage
|
|
20
|
+
- run: npm run linter
|
|
21
|
+
|
|
22
|
+
workflows:
|
|
23
|
+
version: 2
|
|
24
|
+
build_and_test:
|
|
25
|
+
jobs:
|
|
26
|
+
- test
|
package/.eslintrc.json
ADDED
package/.gitlab-ci.yml
ADDED
package/.jest.config.js
ADDED
package/README.md
CHANGED
package/index.js
ADDED
package/package.json
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@autofleet/zehut",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "manage user's identity",
|
|
5
|
-
"main": "lib/index.js",
|
|
6
|
-
"types": "lib/index.d.ts",
|
|
7
5
|
"scripts": {
|
|
8
|
-
"build": "
|
|
9
|
-
"
|
|
10
|
-
"coverage": "jest --coverage --forceExit --runInBand && rm -rf ./coverage",
|
|
6
|
+
"build": "tsc",
|
|
7
|
+
"coverage": "jest --coverage --forceExit --runInBand",
|
|
11
8
|
"test": "jest --forceExit --runInBand",
|
|
12
9
|
"test-auto": "jest --watch --runInBand",
|
|
13
10
|
"linter": "./node_modules/.bin/eslint ."
|
|
14
11
|
},
|
|
12
|
+
"jest": {
|
|
13
|
+
"setupTestFrameworkScriptFile": "jest-extended",
|
|
14
|
+
"testURL": "http://localhost:8085/"
|
|
15
|
+
},
|
|
15
16
|
"repository": {
|
|
16
17
|
"type": "git",
|
|
17
18
|
"url": "git+ssh://git@gitlab.com/AutoFleet/zehut.git"
|
|
@@ -23,32 +24,10 @@
|
|
|
23
24
|
},
|
|
24
25
|
"homepage": "https://github.com/Autofleet/zehut",
|
|
25
26
|
"dependencies": {
|
|
26
|
-
"@autofleet/network": "^1.
|
|
27
|
-
"
|
|
28
|
-
"axios": "^0.27.2",
|
|
29
|
-
"express": "^4.18.1",
|
|
30
|
-
"jsonwebtoken": "^8.5.1",
|
|
31
|
-
"merge-deep": "^3.0.3",
|
|
32
|
-
"methods": "^1.1.2",
|
|
33
|
-
"moment": "^2.29.1",
|
|
34
|
-
"nock": "^13.2.9",
|
|
35
|
-
"node-cache": "^5.1.2",
|
|
36
|
-
"supertest": "^6.2.4",
|
|
37
|
-
"uuid": "^8.3.2"
|
|
27
|
+
"@autofleet/network": "^1.1.4",
|
|
28
|
+
"axios": "^0.19.2"
|
|
38
29
|
},
|
|
39
30
|
"devDependencies": {
|
|
40
|
-
"
|
|
41
|
-
|
|
42
|
-
"@typescript-eslint/eslint-plugin": "^6.5.0",
|
|
43
|
-
"@typescript-eslint/parser": "^6.5.0",
|
|
44
|
-
"eslint": "^8.48.0",
|
|
45
|
-
"eslint-config-airbnb-typescript": "^17.1.0",
|
|
46
|
-
"eslint-plugin-import": "^2.28.1",
|
|
47
|
-
"jest": "^29.6.4",
|
|
48
|
-
"ts-jest": "^29.1.1",
|
|
49
|
-
"typescript": "^4.9.5"
|
|
50
|
-
},
|
|
51
|
-
"files": [
|
|
52
|
-
"lib/**/*"
|
|
53
|
-
]
|
|
31
|
+
"typescript": "^3.9.5"
|
|
32
|
+
}
|
|
54
33
|
}
|
package/src/.env
ADDED
|
File without changes
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import Network from '@autofleet/network';
|
|
2
|
+
const CACHE_LIFETIME_IN_SEC = 10;
|
|
3
|
+
const IdentityNetwork = new Network({
|
|
4
|
+
serviceName: 'IDENTITY_MS',
|
|
5
|
+
retries: 3,
|
|
6
|
+
retryCondition: () => true,
|
|
7
|
+
cache: process.env.NODE_ENV !== 'test' ? {
|
|
8
|
+
maxAge: CACHE_LIFETIME_IN_SEC * 1000,
|
|
9
|
+
} : undefined,
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
interface EntityPermissions {
|
|
13
|
+
[key: string]: string[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface UserPayload {
|
|
17
|
+
businessModels: EntityPermissions;
|
|
18
|
+
fleets: EntityPermissions;
|
|
19
|
+
demandSources: EntityPermissions;
|
|
20
|
+
createdAt?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
class ApiUser {
|
|
24
|
+
id: string | undefined;
|
|
25
|
+
privatePermissions: UserPayload | undefined;
|
|
26
|
+
privatePermissionsLegacy: any;
|
|
27
|
+
emptyUser: boolean;
|
|
28
|
+
|
|
29
|
+
constructor(id? : string) {
|
|
30
|
+
this.id = id;
|
|
31
|
+
this.emptyUser = !!id;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async getUserPermissions() {
|
|
35
|
+
if (this.privatePermissions) {
|
|
36
|
+
return this.privatePermissions;
|
|
37
|
+
}
|
|
38
|
+
const { data } = await IdentityNetwork(`/api/v1/users/${this.id}/authorization-payload`);
|
|
39
|
+
|
|
40
|
+
this.privatePermissions = data;
|
|
41
|
+
return this.privatePermissions;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
get permissions(): UserPayload | undefined {
|
|
45
|
+
if (!this.privatePermissionsLegacy) {
|
|
46
|
+
throw new Error('Cannot get permissions without calling (async) getUserPermissions before');
|
|
47
|
+
}
|
|
48
|
+
return this.privatePermissions;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async getUserPermissionsLegacy() {
|
|
52
|
+
if (this.privatePermissionsLegacy) {
|
|
53
|
+
return this.privatePermissionsLegacy;
|
|
54
|
+
}
|
|
55
|
+
const { data } = await IdentityNetwork(`/api/v1/users/${this.id}/authorization-payload-legacy`);
|
|
56
|
+
|
|
57
|
+
this.privatePermissionsLegacy = data;
|
|
58
|
+
return this.privatePermissionsLegacy;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
get permissionsLegacy(): UserPayload {
|
|
62
|
+
if (!this.privatePermissionsLegacy) {
|
|
63
|
+
throw new Error('Cannot get permissionsLegacy without calling (async) getUserPermissionsLegacy before');
|
|
64
|
+
}
|
|
65
|
+
return this.privatePermissionsLegacy;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export default (options: {
|
|
70
|
+
eagerLoadUserPermissions?: boolean;
|
|
71
|
+
eagerLoadUserPermissionsLegacy?: boolean;
|
|
72
|
+
} = {}) => async (req, res, next): Promise<void> => {
|
|
73
|
+
if (req.headers['x-af-user-id']) {
|
|
74
|
+
req.user = new ApiUser(req.headers['x-af-user-id']);
|
|
75
|
+
} else {
|
|
76
|
+
req.user = new ApiUser();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (options.eagerLoadUserPermissions) {
|
|
80
|
+
await req.user.getUserPermissions();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (options.eagerLoadUserPermissionsLegacy) {
|
|
84
|
+
await req.user.getUserPermissionsLegacy();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
next();
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const eagerLoadPermissionsMiddleware = async (req , res, next) => {
|
|
91
|
+
await req.user.getUserPermissions();
|
|
92
|
+
next();
|
|
93
|
+
};
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es6",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"declaration": true,
|
|
6
|
+
"outDir": "./lib",
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"experimentalDecorators": true,
|
|
9
|
+
"emitDecoratorMetadata": true,
|
|
10
|
+
"allowJs": true,
|
|
11
|
+
},
|
|
12
|
+
"include": ["src"],
|
|
13
|
+
"exclude": ["node_modules"]
|
|
14
|
+
}
|
package/lib/app-auth.d.ts
DELETED
package/lib/app-auth.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getClientSecret = exports.decodeAppBearer = void 0;
|
|
4
|
-
const services_1 = require("./services");
|
|
5
|
-
const decodeAppBearer = async (bearer, appId) => {
|
|
6
|
-
const { data: decoded } = await services_1.AutofleetApiNetwork.post('/api/v1/auth', { bearer, appId });
|
|
7
|
-
return decoded;
|
|
8
|
-
};
|
|
9
|
-
exports.decodeAppBearer = decodeAppBearer;
|
|
10
|
-
const getClientSecret = async (appId) => {
|
|
11
|
-
const { data: secret } = await services_1.AutofleetApiNetwork.get(`/api/v1/auth/client-secret/${appId}`);
|
|
12
|
-
return secret;
|
|
13
|
-
};
|
|
14
|
-
exports.getClientSecret = getClientSecret;
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import ApiUser from './user/ApiUser';
|
|
2
|
-
export declare const getUser: () => ApiUser | undefined;
|
|
3
|
-
export declare const isUserExist: () => string;
|
|
4
|
-
export declare const checkFleetPermission: (fleetId: any) => boolean;
|
|
5
|
-
export declare const checkBusinessModelPermission: (businessModelId: any) => boolean;
|
|
6
|
-
export declare const checkDemandSourcePermission: (demandSourceId: any) => boolean;
|
package/lib/check-permission.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.checkDemandSourcePermission = exports.checkBusinessModelPermission = exports.checkFleetPermission = exports.isUserExist = exports.getUser = void 0;
|
|
4
|
-
const tracer_1 = require("./tracer");
|
|
5
|
-
const getUser = () => (0, tracer_1.getCurrentTrace)()?.context?.get('userObject');
|
|
6
|
-
exports.getUser = getUser;
|
|
7
|
-
const isUserExist = () => {
|
|
8
|
-
const u = (0, exports.getUser)();
|
|
9
|
-
return u && u.id;
|
|
10
|
-
};
|
|
11
|
-
exports.isUserExist = isUserExist;
|
|
12
|
-
const checkFleetPermission = (fleetId) => {
|
|
13
|
-
if ((0, exports.isUserExist)()) {
|
|
14
|
-
const user = (0, exports.getUser)();
|
|
15
|
-
return !user || Object.keys(user.permissions.fleets).includes(fleetId);
|
|
16
|
-
}
|
|
17
|
-
return true;
|
|
18
|
-
};
|
|
19
|
-
exports.checkFleetPermission = checkFleetPermission;
|
|
20
|
-
const checkBusinessModelPermission = (businessModelId) => {
|
|
21
|
-
if ((0, exports.isUserExist)()) {
|
|
22
|
-
const user = (0, exports.getUser)();
|
|
23
|
-
return !user || Object.keys(user.permissions.businessModels).includes(businessModelId);
|
|
24
|
-
}
|
|
25
|
-
return true;
|
|
26
|
-
};
|
|
27
|
-
exports.checkBusinessModelPermission = checkBusinessModelPermission;
|
|
28
|
-
const checkDemandSourcePermission = (demandSourceId) => {
|
|
29
|
-
if ((0, exports.isUserExist)()) {
|
|
30
|
-
const user = (0, exports.getUser)();
|
|
31
|
-
return !user || Object.keys(user.permissions.demandSources).includes(demandSourceId);
|
|
32
|
-
}
|
|
33
|
-
return true;
|
|
34
|
-
};
|
|
35
|
-
exports.checkDemandSourcePermission = checkDemandSourcePermission;
|
package/lib/errors.d.ts
DELETED
package/lib/errors.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UnauthorizedAccessError = void 0;
|
|
4
|
-
// eslint-disable-next-line import/prefer-default-export
|
|
5
|
-
class UnauthorizedAccessError extends Error {
|
|
6
|
-
constructor(user = null, message = 'UnauthorizedAccessError') {
|
|
7
|
-
super(message);
|
|
8
|
-
this.name = 'UnauthorizedAccessError';
|
|
9
|
-
this.user = user;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
exports.UnauthorizedAccessError = UnauthorizedAccessError;
|
package/lib/index.d.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import * as outbreak from '@autofleet/outbreak';
|
|
2
|
-
import User, { middleware, eagerLoadPermissionsMiddleware, middlewareWithDecode, getDecodedBearer, appMiddleware, createOrSetRabbitTrace } from './user';
|
|
3
|
-
import { newTrace, traceTypes } from './tracer';
|
|
4
|
-
import { checkFleetPermission, checkBusinessModelPermission, checkDemandSourcePermission, isUserExist, getUser } from './check-permission';
|
|
5
|
-
import { UnauthorizedAccessError } from './errors';
|
|
6
|
-
import { getRefreshTokenSecret, getTokenSecret } from './secret-getter';
|
|
7
|
-
declare const getCurrentPayload: () => import("./tracer").Trace | {
|
|
8
|
-
[x: string]: never;
|
|
9
|
-
};
|
|
10
|
-
declare const enableTracing: ({ outbreakOptions }?: {
|
|
11
|
-
outbreakOptions?: {};
|
|
12
|
-
}) => void;
|
|
13
|
-
export { traceTypes, newTrace, enableTracing, User, middleware, middlewareWithDecode, eagerLoadPermissionsMiddleware, getCurrentPayload, getDecodedBearer, checkFleetPermission, checkBusinessModelPermission, checkDemandSourcePermission, isUserExist, getUser, getRefreshTokenSecret, getTokenSecret, UnauthorizedAccessError, appMiddleware, createOrSetRabbitTrace, outbreak, };
|
|
14
|
-
declare const _default: {
|
|
15
|
-
traceTypes: {
|
|
16
|
-
HTTP_REQUEST: string;
|
|
17
|
-
WEB_SOCKET: string;
|
|
18
|
-
RABBIT: string;
|
|
19
|
-
};
|
|
20
|
-
newTrace: (type: any) => import("./tracer").Trace;
|
|
21
|
-
User: typeof User;
|
|
22
|
-
middleware: (options?: {
|
|
23
|
-
eagerLoadUserPermissions?: boolean;
|
|
24
|
-
eagerLoadUserPermissionsLegacy?: boolean;
|
|
25
|
-
customPermissionLoader?: import("./user/ApiUser").CustomPermissionLoader;
|
|
26
|
-
}) => (req: any, res: any, next: any) => Promise<any>;
|
|
27
|
-
middlewareWithDecode: (options?: {
|
|
28
|
-
eagerLoadUserPermissions?: boolean;
|
|
29
|
-
eagerLoadUserPermissionsLegacy?: boolean;
|
|
30
|
-
returnErrorIfNoToken?: boolean;
|
|
31
|
-
}) => (req: any, res: any, next: any) => Promise<void>;
|
|
32
|
-
eagerLoadPermissionsMiddleware: (req: any, res: any, next: any) => Promise<any>;
|
|
33
|
-
getCurrentPayload: () => import("./tracer").Trace | {
|
|
34
|
-
[x: string]: never;
|
|
35
|
-
};
|
|
36
|
-
getDecodedBearer: (req: any) => any;
|
|
37
|
-
checkFleetPermission: (fleetId: any) => boolean;
|
|
38
|
-
checkBusinessModelPermission: (businessModelId: any) => boolean;
|
|
39
|
-
checkDemandSourcePermission: (demandSourceId: any) => boolean;
|
|
40
|
-
isUserExist: () => string;
|
|
41
|
-
getUser: () => User;
|
|
42
|
-
UnauthorizedAccessError: typeof UnauthorizedAccessError;
|
|
43
|
-
appMiddleware: (options: {
|
|
44
|
-
appId: string;
|
|
45
|
-
clientSecret: string;
|
|
46
|
-
}) => (req: any, res: any, next: any) => Promise<void>;
|
|
47
|
-
createOrSetRabbitTrace: (trace: any, userId: any) => Promise<void>;
|
|
48
|
-
outbreak: typeof outbreak;
|
|
49
|
-
};
|
|
50
|
-
export default _default;
|
package/lib/index.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.outbreak = exports.createOrSetRabbitTrace = exports.appMiddleware = exports.UnauthorizedAccessError = exports.getTokenSecret = exports.getRefreshTokenSecret = exports.getUser = exports.isUserExist = exports.checkDemandSourcePermission = exports.checkBusinessModelPermission = exports.checkFleetPermission = exports.getDecodedBearer = exports.getCurrentPayload = exports.eagerLoadPermissionsMiddleware = exports.middlewareWithDecode = exports.middleware = exports.User = exports.enableTracing = exports.newTrace = exports.traceTypes = void 0;
|
|
27
|
-
const outbreak = __importStar(require("@autofleet/outbreak"));
|
|
28
|
-
exports.outbreak = outbreak;
|
|
29
|
-
const user_1 = __importStar(require("./user"));
|
|
30
|
-
exports.User = user_1.default;
|
|
31
|
-
Object.defineProperty(exports, "middleware", { enumerable: true, get: function () { return user_1.middleware; } });
|
|
32
|
-
Object.defineProperty(exports, "eagerLoadPermissionsMiddleware", { enumerable: true, get: function () { return user_1.eagerLoadPermissionsMiddleware; } });
|
|
33
|
-
Object.defineProperty(exports, "middlewareWithDecode", { enumerable: true, get: function () { return user_1.middlewareWithDecode; } });
|
|
34
|
-
Object.defineProperty(exports, "getDecodedBearer", { enumerable: true, get: function () { return user_1.getDecodedBearer; } });
|
|
35
|
-
Object.defineProperty(exports, "appMiddleware", { enumerable: true, get: function () { return user_1.appMiddleware; } });
|
|
36
|
-
Object.defineProperty(exports, "createOrSetRabbitTrace", { enumerable: true, get: function () { return user_1.createOrSetRabbitTrace; } });
|
|
37
|
-
const tracer_1 = require("./tracer");
|
|
38
|
-
Object.defineProperty(exports, "newTrace", { enumerable: true, get: function () { return tracer_1.newTrace; } });
|
|
39
|
-
Object.defineProperty(exports, "traceTypes", { enumerable: true, get: function () { return tracer_1.traceTypes; } });
|
|
40
|
-
const check_permission_1 = require("./check-permission");
|
|
41
|
-
Object.defineProperty(exports, "checkFleetPermission", { enumerable: true, get: function () { return check_permission_1.checkFleetPermission; } });
|
|
42
|
-
Object.defineProperty(exports, "checkBusinessModelPermission", { enumerable: true, get: function () { return check_permission_1.checkBusinessModelPermission; } });
|
|
43
|
-
Object.defineProperty(exports, "checkDemandSourcePermission", { enumerable: true, get: function () { return check_permission_1.checkDemandSourcePermission; } });
|
|
44
|
-
Object.defineProperty(exports, "isUserExist", { enumerable: true, get: function () { return check_permission_1.isUserExist; } });
|
|
45
|
-
Object.defineProperty(exports, "getUser", { enumerable: true, get: function () { return check_permission_1.getUser; } });
|
|
46
|
-
const errors_1 = require("./errors");
|
|
47
|
-
Object.defineProperty(exports, "UnauthorizedAccessError", { enumerable: true, get: function () { return errors_1.UnauthorizedAccessError; } });
|
|
48
|
-
const secret_getter_1 = require("./secret-getter");
|
|
49
|
-
Object.defineProperty(exports, "getRefreshTokenSecret", { enumerable: true, get: function () { return secret_getter_1.getRefreshTokenSecret; } });
|
|
50
|
-
Object.defineProperty(exports, "getTokenSecret", { enumerable: true, get: function () { return secret_getter_1.getTokenSecret; } });
|
|
51
|
-
const headersTracer = outbreak.default;
|
|
52
|
-
const getCurrentPayload = tracer_1.getCurrentTrace;
|
|
53
|
-
exports.getCurrentPayload = getCurrentPayload;
|
|
54
|
-
const enableTracing = ({ outbreakOptions = {} } = {}) => {
|
|
55
|
-
headersTracer({
|
|
56
|
-
headersPrefix: 'x-af',
|
|
57
|
-
...outbreakOptions,
|
|
58
|
-
});
|
|
59
|
-
(0, tracer_1.enable)();
|
|
60
|
-
};
|
|
61
|
-
exports.enableTracing = enableTracing;
|
|
62
|
-
exports.default = {
|
|
63
|
-
traceTypes: tracer_1.traceTypes,
|
|
64
|
-
newTrace: tracer_1.newTrace,
|
|
65
|
-
User: user_1.default,
|
|
66
|
-
middleware: user_1.middleware,
|
|
67
|
-
middlewareWithDecode: user_1.middlewareWithDecode,
|
|
68
|
-
eagerLoadPermissionsMiddleware: user_1.eagerLoadPermissionsMiddleware,
|
|
69
|
-
getCurrentPayload,
|
|
70
|
-
getDecodedBearer: user_1.getDecodedBearer,
|
|
71
|
-
checkFleetPermission: check_permission_1.checkFleetPermission,
|
|
72
|
-
checkBusinessModelPermission: check_permission_1.checkBusinessModelPermission,
|
|
73
|
-
checkDemandSourcePermission: check_permission_1.checkDemandSourcePermission,
|
|
74
|
-
isUserExist: check_permission_1.isUserExist,
|
|
75
|
-
getUser: check_permission_1.getUser,
|
|
76
|
-
UnauthorizedAccessError: errors_1.UnauthorizedAccessError,
|
|
77
|
-
appMiddleware: user_1.appMiddleware,
|
|
78
|
-
createOrSetRabbitTrace: user_1.createOrSetRabbitTrace,
|
|
79
|
-
outbreak,
|
|
80
|
-
};
|
package/lib/secret-getter.d.ts
DELETED
package/lib/secret-getter.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getTokenSecret = exports.getRefreshTokenSecret = void 0;
|
|
7
|
-
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
-
const moment_1 = __importDefault(require("moment"));
|
|
9
|
-
const { DEPRECATED_JWT_SECRET, JWT_NEW_SECRET, DEPRECATED_REFRESH_JWT_SECRET, REFRESH_JWT_SECRET, DEPRECATION_UNIX_TIMESTAMP, } = process.env;
|
|
10
|
-
const getRelevantSecret = (token, deprecatedSecret, newSecret) => {
|
|
11
|
-
const deprecationTime = (0, moment_1.default)(parseInt(DEPRECATION_UNIX_TIMESTAMP, 10) * 1000);
|
|
12
|
-
try {
|
|
13
|
-
let unixTime;
|
|
14
|
-
if (token) {
|
|
15
|
-
const { iat } = jsonwebtoken_1.default.decode(token);
|
|
16
|
-
unixTime = (0, moment_1.default)(iat * 1000);
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
unixTime = (0, moment_1.default)();
|
|
20
|
-
}
|
|
21
|
-
return unixTime.isBefore(deprecationTime) ? deprecatedSecret : newSecret;
|
|
22
|
-
}
|
|
23
|
-
catch (e) {
|
|
24
|
-
return newSecret;
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
const getRefreshTokenSecret = (token) => getRelevantSecret(token, DEPRECATED_REFRESH_JWT_SECRET, REFRESH_JWT_SECRET);
|
|
28
|
-
exports.getRefreshTokenSecret = getRefreshTokenSecret;
|
|
29
|
-
const getTokenSecret = (token) => getRelevantSecret(token, DEPRECATED_JWT_SECRET, JWT_NEW_SECRET);
|
|
30
|
-
exports.getTokenSecret = getTokenSecret;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
30
|
-
const moment_1 = __importDefault(require("moment"));
|
|
31
|
-
const sleep = async (ms) => new Promise((resolve) => {
|
|
32
|
-
setTimeout(resolve, ms);
|
|
33
|
-
});
|
|
34
|
-
process.env.NODE_ENV = 'node-common-test';
|
|
35
|
-
describe('secret getter tests', () => {
|
|
36
|
-
const testSecrets = {
|
|
37
|
-
DEPRECATED_JWT_SECRET: 'test_deprecated_secret',
|
|
38
|
-
JWT_NEW_SECRET: 'test_secret',
|
|
39
|
-
DEPRECATED_REFRESH_JWT_SECRET: 'test_deprecated_refresh_secret',
|
|
40
|
-
REFRESH_JWT_SECRET: 'test_refresh_secret',
|
|
41
|
-
};
|
|
42
|
-
beforeEach(() => {
|
|
43
|
-
jest.resetModules();
|
|
44
|
-
process.env = {
|
|
45
|
-
...(process.env || {}),
|
|
46
|
-
...testSecrets,
|
|
47
|
-
}; // Make a copy
|
|
48
|
-
});
|
|
49
|
-
it('test get new refresh token secret when after deprecation timestamp', async () => {
|
|
50
|
-
process.env.DEPRECATION_UNIX_TIMESTAMP = (0, moment_1.default)().subtract(1, 'days').unix().toString();
|
|
51
|
-
const { getTokenSecret } = await Promise.resolve().then(() => __importStar(require('./secret-getter')));
|
|
52
|
-
const token = jsonwebtoken_1.default.sign({
|
|
53
|
-
exp: (0, moment_1.default)().unix() + (60 * 60 * 24 * 365),
|
|
54
|
-
}, testSecrets.JWT_NEW_SECRET);
|
|
55
|
-
const result = getTokenSecret(token);
|
|
56
|
-
expect(result).toBe(testSecrets.JWT_NEW_SECRET);
|
|
57
|
-
});
|
|
58
|
-
it('test get old refresh token secret when before deprecation timestamp', async () => {
|
|
59
|
-
process.env.DEPRECATION_UNIX_TIMESTAMP = (0, moment_1.default)().add(1, 'days').unix().toString();
|
|
60
|
-
const { getTokenSecret } = await Promise.resolve().then(() => __importStar(require('./secret-getter')));
|
|
61
|
-
const token = jsonwebtoken_1.default.sign({
|
|
62
|
-
exp: (0, 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', async () => {
|
|
68
|
-
const token = jsonwebtoken_1.default.sign({
|
|
69
|
-
exp: (0, moment_1.default)().unix() + (60 * 60 * 24 * 365),
|
|
70
|
-
}, testSecrets.DEPRECATED_JWT_SECRET);
|
|
71
|
-
process.env.DEPRECATION_UNIX_TIMESTAMP = (0, moment_1.default)().add(10, 'seconds').unix().toString();
|
|
72
|
-
const { getTokenSecret } = await Promise.resolve().then(() => __importStar(require('./secret-getter')));
|
|
73
|
-
await sleep(1000);
|
|
74
|
-
const result = getTokenSecret(token);
|
|
75
|
-
expect(result).toBe(testSecrets.DEPRECATED_JWT_SECRET);
|
|
76
|
-
});
|
|
77
|
-
it('test malformed token returns new secret', async () => {
|
|
78
|
-
const { getTokenSecret } = await Promise.resolve().then(() => __importStar(require('./secret-getter')));
|
|
79
|
-
const token = 'shit';
|
|
80
|
-
const result = getTokenSecret(token);
|
|
81
|
-
expect(result).toBe(testSecrets.JWT_NEW_SECRET);
|
|
82
|
-
});
|
|
83
|
-
it('test malformed token returns new secret even before deprecation time', async () => {
|
|
84
|
-
process.env.DEPRECATION_UNIX_TIMESTAMP = (0, moment_1.default)().add(10, 'day').unix().toString();
|
|
85
|
-
const { getTokenSecret } = await Promise.resolve().then(() => __importStar(require('./secret-getter')));
|
|
86
|
-
const token = 'shit';
|
|
87
|
-
const result = getTokenSecret(token);
|
|
88
|
-
expect(result).toBe(testSecrets.JWT_NEW_SECRET);
|
|
89
|
-
});
|
|
90
|
-
});
|
package/lib/services.d.ts
DELETED
package/lib/services.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.AutofleetApiNetwork = exports.IdentityNetwork = void 0;
|
|
7
|
-
const network_1 = __importDefault(require("@autofleet/network"));
|
|
8
|
-
const CACHE_LIFETIME_IN_SEC = 10;
|
|
9
|
-
const apiGwUrl = process.env.API_GATEWAY_URL || 'https://api.autofleet.io';
|
|
10
|
-
// eslint-disable-next-line import/prefer-default-export
|
|
11
|
-
exports.IdentityNetwork = new network_1.default({
|
|
12
|
-
serviceName: 'IDENTITY_MS',
|
|
13
|
-
retries: 3,
|
|
14
|
-
retryCondition: () => true,
|
|
15
|
-
cache: process.env.NODE_ENV !== 'test' ? {
|
|
16
|
-
maxAge: CACHE_LIFETIME_IN_SEC * 1000,
|
|
17
|
-
} : undefined,
|
|
18
|
-
});
|
|
19
|
-
exports.AutofleetApiNetwork = new network_1.default({
|
|
20
|
-
baseURL: apiGwUrl,
|
|
21
|
-
serviceUrl: apiGwUrl,
|
|
22
|
-
retries: 3,
|
|
23
|
-
retryCondition: () => true,
|
|
24
|
-
cache: process.env.NODE_ENV !== 'test' ? {
|
|
25
|
-
maxAge: CACHE_LIFETIME_IN_SEC * 1000,
|
|
26
|
-
} : undefined,
|
|
27
|
-
});
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { AccountType, PartialUserPayload } from '../user/ApiUser';
|
|
2
|
-
export type UserCustomAttributes = {
|
|
3
|
-
id?: string;
|
|
4
|
-
accountType?: AccountType;
|
|
5
|
-
elevatedPermissions?: PartialUserPayload;
|
|
6
|
-
permissions?: PartialUserPayload;
|
|
7
|
-
};
|
|
8
|
-
export declare const setIdentityNock: (userAttributes: any) => void;
|
|
9
|
-
export declare const mockRequestAndUser: (app: any, userCustomAttributes: any) => {};
|