@autofleet/zehut 3.1.2 → 3.2.0

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/user/index.js CHANGED
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.createOrSetRabbitTrace = exports.getDecodedBearer = exports.eagerLoadPermissionsMiddleware = exports.appMiddleware = exports.middlewareWithDecode = exports.middleware = void 0;
29
+ exports.createOrSetRabbitTrace = exports.getDecodedBearer = exports.eagerLoadPermissionsMiddleware = exports.appMiddleware = exports.middlewareWithDecode = exports.middleware = exports.USER_OBJECT = void 0;
30
30
  const jsonwebtoken_1 = require("jsonwebtoken");
31
31
  const ApiUser_1 = __importStar(require("./ApiUser"));
32
32
  const tracer_1 = require("../tracer");
@@ -34,22 +34,31 @@ const app_auth_1 = require("../app-auth");
34
34
  const appDoesNotExist_1 = __importDefault(require("../exceptions/appDoesNotExist"));
35
35
  const utils_1 = require("../utils");
36
36
  const IDENTITY_MS = 'identity-ms';
37
+ const ACCESS_TOKEN = 'accessToken';
38
+ exports.USER_OBJECT = 'userObject';
39
+ const USER_TRACING_HEADER = 'x-af-user-id';
40
+ const ORIGIN_HEADER = 'X-IAF-ORIGIN-SERVICE';
41
+ const USER_PERMISSIONS_HEADER = 'x-af-user-permissions';
42
+ const LOWER_CASE_ORIGIN_HEADER = ORIGIN_HEADER.toLowerCase();
43
+ const AUTOFLEET_APPS_SECRET_HEADER = 'x-autofleet-apps-secret';
37
44
  const middleware = (options = {}) => async (req, res, next) => {
38
45
  try {
39
- const originHeader = req.headers['X-IAF-ORIGIN-SERVICE'] || req.headers['x-iaf-origin-service'] || '';
46
+ const originHeader = (req.headers[ORIGIN_HEADER] || req.headers[LOWER_CASE_ORIGIN_HEADER] || '');
40
47
  if (originHeader.toLowerCase() === IDENTITY_MS) {
41
- return next();
48
+ next();
49
+ return;
42
50
  }
43
51
  const { eagerLoadUserPermissions, eagerLoadUserPermissionsLegacy, customPermissionLoader, } = options;
44
- const userId = req.headers['x-af-user-id'];
45
- const contextIds = req.headers?.[ApiUser_1.CONTEXTS_IDS_HEADER]?.split(',');
52
+ const userId = req.headers[USER_TRACING_HEADER];
46
53
  const trace = (0, tracer_1.newTrace)('userPayload');
47
54
  if (!userId) {
48
- return next();
55
+ next();
56
+ return;
49
57
  }
50
58
  const elevatedPermissionsFromHeader = req.headers[ApiUser_1.ELEVATED_PERMISSIONS_HEADER] && req.headers[ApiUser_1.ELEVATED_PERMISSIONS_HEADER].length > 0
51
59
  ? JSON.parse(req.headers[ApiUser_1.ELEVATED_PERMISSIONS_HEADER])
52
60
  : {};
61
+ const contextIds = req.headers?.[ApiUser_1.CONTEXTS_IDS_HEADER]?.split(',');
53
62
  const userObject = new ApiUser_1.default(userId, 'user', elevatedPermissionsFromHeader, contextIds);
54
63
  if (eagerLoadUserPermissions) {
55
64
  if (customPermissionLoader) {
@@ -63,16 +72,14 @@ const middleware = (options = {}) => async (req, res, next) => {
63
72
  await userObject.getUserPermissionsLegacy();
64
73
  }
65
74
  req.user = userObject;
66
- trace.context.set('userObject', userObject);
75
+ trace.context.set(exports.USER_OBJECT, userObject);
67
76
  // Added in order to support outbreak.
68
- req.headers['x-af-user-permissions'] = userObject;
69
- return next();
77
+ // @ts-expect-error we are setting an object onto the request headers.
78
+ req.headers[USER_PERMISSIONS_HEADER] = userObject;
79
+ next();
70
80
  }
71
81
  catch (e) {
72
- res.status(401);
73
- return res.json({
74
- error: 'cannot authenticate user',
75
- });
82
+ res.status(401).json({ error: 'cannot authenticate user' });
76
83
  }
77
84
  };
78
85
  exports.middleware = middleware;
@@ -86,51 +93,39 @@ const middlewareWithDecode = (options = {}) => async (req, res, next) => {
86
93
  }
87
94
  catch (e) {
88
95
  if (e instanceof jsonwebtoken_1.TokenExpiredError) {
89
- res.status(401);
90
- res.json({
91
- errors: ['Access token expired'],
92
- });
96
+ res.status(401).json({ errors: ['Access token expired'] });
93
97
  }
94
98
  else if (e instanceof jsonwebtoken_1.JsonWebTokenError) {
95
- res.status(400);
96
- res.json({
97
- errors: [e.message],
98
- });
99
+ res.status(400).json({ errors: [e.message] });
99
100
  }
100
101
  else {
101
- res.status(500);
102
- res.json({
103
- errors: ['Server error while parsing token'],
104
- });
102
+ res.status(500).json({ errors: ['Server error while parsing token'] });
105
103
  }
106
104
  return;
107
105
  }
108
106
  const userId = decoded?.user?.id;
109
107
  if (userId) {
110
- req.headers['X-AF-USER-ID'] = userId;
108
+ req.headers[USER_TRACING_HEADER] = userId;
111
109
  }
112
110
  const contextIds = req.headers?.[ApiUser_1.CONTEXTS_IDS_HEADER]?.split(',');
113
111
  const userObject = new ApiUser_1.default(userId, decoded?.user?.accountType, undefined, contextIds);
114
- if (eagerLoadUserPermissions) {
115
- await userObject.getUserPermissions();
116
- }
117
- if (eagerLoadUserPermissionsLegacy) {
118
- await userObject.getUserPermissionsLegacy();
112
+ if (eagerLoadUserPermissions || eagerLoadUserPermissionsLegacy) {
113
+ await Promise.all([
114
+ eagerLoadUserPermissions && userObject.getUserPermissions(),
115
+ eagerLoadUserPermissionsLegacy && userObject.getUserPermissionsLegacy(),
116
+ ]);
119
117
  }
120
118
  req.user = userObject;
121
- trace.context.set('userObject', userObject);
119
+ trace.context.set(exports.USER_OBJECT, userObject);
122
120
  // Added in order to support outbreak.
123
- req.headers['x-af-user-permissions'] = userObject;
121
+ // @ts-expect-error we are setting an object onto the request headers.
122
+ req.headers[USER_PERMISSIONS_HEADER] = userObject;
124
123
  }
125
124
  else if (returnErrorIfNoToken) {
126
- res.status(401);
127
- // eslint-disable-next-line consistent-return
128
- return res.json({
129
- errors: ['No token provided'],
130
- });
125
+ res.status(401).json({ errors: ['No token provided'] });
126
+ return;
131
127
  }
132
- // eslint-disable-next-line consistent-return
133
- return next();
128
+ next();
134
129
  };
135
130
  exports.middlewareWithDecode = middlewareWithDecode;
136
131
  const appMiddleware = (options) => async (req, res, next) => {
@@ -138,10 +133,8 @@ const appMiddleware = (options) => async (req, res, next) => {
138
133
  const trace = (0, tracer_1.newTrace)('userPayload');
139
134
  let decoded;
140
135
  if (!req.headers.authorization) {
141
- res.status(401);
142
- return res.json({
143
- errors: ['No token provided'],
144
- });
136
+ res.status(401).json({ errors: ['No token provided'] });
137
+ return;
145
138
  }
146
139
  try {
147
140
  decoded = await (0, app_auth_1.decodeAppBearer)(req.headers.authorization, appId);
@@ -151,66 +144,53 @@ const appMiddleware = (options) => async (req, res, next) => {
151
144
  }
152
145
  catch (e) {
153
146
  if (e instanceof jsonwebtoken_1.TokenExpiredError) {
154
- res.status(401);
155
- return res.json({
156
- errors: ['Access token expired'],
157
- });
158
- }
159
- if (e instanceof jsonwebtoken_1.JsonWebTokenError) {
160
- res.status(400);
161
- return res.json({
162
- errors: [e.message],
163
- });
147
+ res.status(401).json({ errors: ['Access token expired'] });
148
+ return;
164
149
  }
165
- if (e instanceof appDoesNotExist_1.default) {
166
- res.status(400);
167
- return res.json({
168
- errors: [e.message],
169
- });
150
+ if ([jsonwebtoken_1.JsonWebTokenError, appDoesNotExist_1.default].some((Err) => e instanceof Err)) {
151
+ res.status(400).json({ errors: [e.message] });
152
+ return;
170
153
  }
171
- res.status(500);
172
- return res.json({
173
- errors: ['Server error while parsing token'],
174
- });
154
+ res.status(500).json({ errors: ['Server error while parsing token'] });
155
+ return;
175
156
  }
176
157
  const userId = decoded?.userId;
177
158
  if (userId) {
178
- req.headers['X-AF-USER-ID'] = userId;
159
+ req.headers[USER_TRACING_HEADER] = userId;
179
160
  }
180
161
  const userObject = new ApiUser_1.default(userId);
181
162
  if (appId) {
182
- req.headers['x-autofleet-apps-secret'] = clientSecret;
163
+ req.headers[AUTOFLEET_APPS_SECRET_HEADER] = clientSecret;
183
164
  // Won't work until we find a better solution for identity ms
184
165
  await userObject.getUserAppPermissions(appId, clientSecret);
185
166
  }
186
167
  req.user = userObject;
187
- trace.context.set('userObject', userObject);
188
- trace.context.set('accessToken', (0, utils_1.getAuthFromBearer)(req.headers.authorization));
168
+ trace.context.set(exports.USER_OBJECT, userObject);
169
+ trace.context.set(ACCESS_TOKEN, (0, utils_1.getAuthFromBearer)(req.headers.authorization));
189
170
  // Added in order to support outbreak.
190
- req.headers['x-af-user-permissions'] = userObject;
191
- return next();
171
+ // @ts-expect-error we are setting an object onto the request headers.
172
+ req.headers[USER_PERMISSIONS_HEADER] = userObject;
173
+ next();
192
174
  };
193
175
  exports.appMiddleware = appMiddleware;
194
176
  const eagerLoadPermissionsMiddleware = async (req, res, next) => {
195
177
  await req.user.getUserPermissions();
196
- return next();
178
+ next();
197
179
  };
198
180
  exports.eagerLoadPermissionsMiddleware = eagerLoadPermissionsMiddleware;
199
181
  const getDecodedBearer = (req) => {
200
- if (req.headers.authorization) {
201
- return (0, utils_1.decodeBearer)(req.headers.authorization);
182
+ if (!req.headers.authorization) {
183
+ return null;
202
184
  }
203
- return null;
185
+ return (0, utils_1.decodeBearer)(req.headers.authorization);
204
186
  };
205
187
  exports.getDecodedBearer = getDecodedBearer;
206
188
  const createOrSetRabbitTrace = async (trace, userId) => {
207
189
  const userObject = new ApiUser_1.default(userId);
208
190
  await userObject.getUserPermissions();
209
- if (!trace) {
210
- // eslint-disable-next-line no-param-reassign
211
- trace = (0, tracer_1.newTrace)(tracer_1.traceTypes.RABBIT);
212
- }
213
- trace.context.set('userObject', userObject);
191
+ // eslint-disable-next-line no-param-reassign
192
+ trace ?? (trace = (0, tracer_1.newTrace)(tracer_1.traceTypes.RABBIT));
193
+ trace.context.set(exports.USER_OBJECT, userObject);
214
194
  };
215
195
  exports.createOrSetRabbitTrace = createOrSetRabbitTrace;
216
196
  exports.default = ApiUser_1.default;
package/lib/utils.d.ts CHANGED
@@ -1,5 +1,8 @@
1
+ /// <reference types="node" />
2
+ import type { UUID } from 'node:crypto';
1
3
  export declare const getAuthFromBearer: (bearer: string) => string;
2
4
  export declare const decodeBearer: (bearer: string, appSecret?: string) => any;
3
5
  export declare const parsePermissions: (contextId: any, decodedToken: any) => any;
4
6
  export declare const getEntitiesFromContext: (contextId: string, decodedToken: any) => any;
5
7
  export declare const getContextAttributes: (contextId: string, decodedToken: any) => any;
8
+ export declare function validateUUID(uuid: unknown): uuid is UUID;
package/lib/utils.js CHANGED
@@ -23,8 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.getContextAttributes = exports.getEntitiesFromContext = exports.parsePermissions = exports.decodeBearer = exports.getAuthFromBearer = void 0;
27
- /* eslint-disable prefer-destructuring */
26
+ exports.validateUUID = exports.getContextAttributes = exports.getEntitiesFromContext = exports.parsePermissions = exports.decodeBearer = exports.getAuthFromBearer = void 0;
28
27
  const jwt = __importStar(require("jsonwebtoken"));
29
28
  const secret_getter_1 = require("./secret-getter");
30
29
  const CONTEXT_PROPS = ['fleetId', 'businessModelId', 'demandSourceId'];
@@ -45,7 +44,7 @@ const parsePermissions = (contextId, decodedToken) => {
45
44
  if (!decodedToken) {
46
45
  return [];
47
46
  }
48
- const contexts = decodedToken.contexts;
47
+ const { contexts } = decodedToken;
49
48
  const activeContext = contexts.find((context) => context.id === contextId);
50
49
  const permissionsValue = `${activeContext.permissions?.map((cp) => `${cp},`)}`;
51
50
  return {
@@ -58,7 +57,7 @@ const getEntitiesFromContext = (contextId, decodedToken) => {
58
57
  if (!decodedToken) {
59
58
  return [];
60
59
  }
61
- let contexts = decodedToken.contexts;
60
+ let { contexts } = decodedToken;
62
61
  if (contextId) {
63
62
  contexts = contexts.filter((context) => context.id === contextId);
64
63
  }
@@ -66,10 +65,8 @@ const getEntitiesFromContext = (contextId, decodedToken) => {
66
65
  contexts.forEach((context) => {
67
66
  const prop = CONTEXT_MAP_PROPS[context.subSystem || 'business'];
68
67
  const permissions = (0, exports.parsePermissions)(context.id, decodedToken);
69
- // eslint-disable-next-line no-unused-expressions
70
- attributes[prop]
71
- ? attributes[prop][permissions.key] = permissions.value
72
- : attributes[prop] = { [permissions.key]: permissions.value };
68
+ attributes[prop] || (attributes[prop] = {});
69
+ attributes[prop][permissions.key] = permissions.value;
73
70
  });
74
71
  return attributes;
75
72
  };
@@ -78,7 +75,7 @@ const getContextAttributes = (contextId, decodedToken) => {
78
75
  if (!decodedToken) {
79
76
  return [];
80
77
  }
81
- let contexts = decodedToken.contexts;
78
+ let { contexts } = decodedToken;
82
79
  if (contextId) {
83
80
  contexts = contexts.filter((context) => context.id === contextId);
84
81
  }
@@ -87,13 +84,20 @@ const getContextAttributes = (contextId, decodedToken) => {
87
84
  CONTEXT_PROPS.forEach((prop) => {
88
85
  if (context[prop]) {
89
86
  const contextPropWrapped = [context[prop]];
90
- // eslint-disable-next-line no-unused-expressions
91
- attributes[prop]
92
- ? attributes[prop] = attributes[prop].concat(contextPropWrapped)
93
- : attributes[prop] = contextPropWrapped;
87
+ attributes[prop] || (attributes[prop] = []);
88
+ attributes[prop] = attributes[prop].concat(contextPropWrapped);
94
89
  }
95
90
  });
96
91
  });
97
92
  return attributes;
98
93
  };
99
94
  exports.getContextAttributes = getContextAttributes;
95
+ const EMPTY_UUID = '00000000-0000-0000-0000-000000000000';
96
+ const FULL_UUID = 'ffffffff-ffff-ffff-ffff-ffffffffffff';
97
+ const VALID_CHARS_REGEX = '[0-9a-f]';
98
+ const UUID_VERSION_REGEX = '[1-8]';
99
+ const UUID_REGEX = new RegExp(`^(?:${VALID_CHARS_REGEX}{8}-${VALID_CHARS_REGEX}{4}-${UUID_VERSION_REGEX}${VALID_CHARS_REGEX}{3}-[89ab]${VALID_CHARS_REGEX}{3}-${VALID_CHARS_REGEX}{12}|${EMPTY_UUID}|${FULL_UUID})$`, 'i');
100
+ function validateUUID(uuid) {
101
+ return typeof uuid === 'string' && UUID_REGEX.test(uuid);
102
+ }
103
+ exports.validateUUID = validateUUID;
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@autofleet/zehut",
3
- "version": "3.1.2",
3
+ "version": "3.2.0",
4
4
  "description": "manage user's identity",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
7
7
  "scripts": {
8
- "build": "rm -rf lib && tsc",
8
+ "build": "rm -rf lib && tsc -p tsconfig.build.json",
9
9
  "prepublish": "npm run build",
10
- "coverage": "jest --coverage --forceExit --runInBand && rm -rf ./coverage",
11
- "test": "jest --forceExit --runInBand",
12
- "test-auto": "jest --watch --runInBand",
13
- "linter": "./node_modules/.bin/eslint ."
10
+ "coverage": "vitest --coverage",
11
+ "test": "vitest",
12
+ "test-auto": "vitest --watch",
13
+ "linter": "eslint ."
14
14
  },
15
15
  "repository": {
16
16
  "type": "git",
17
- "url": "git+ssh://git@gitlab.com/AutoFleet/zehut.git"
17
+ "url": "https://github.com/Autofleet/zehut.git"
18
18
  },
19
19
  "author": "",
20
20
  "license": "ISC",
@@ -23,30 +23,30 @@
23
23
  },
24
24
  "homepage": "https://github.com/Autofleet/zehut",
25
25
  "dependencies": {
26
- "@autofleet/network": "^1.5.0",
26
+ "@autofleet/network": "^1.7.4",
27
27
  "@autofleet/outbreak": "^1.0.4",
28
- "axios": "^0.27.2",
29
- "express": "^4.18.1",
30
28
  "jsonwebtoken": "^8.5.1",
31
- "methods": "^1.1.2",
32
- "moment": "^2.29.1",
33
- "nock": "^13.2.9",
29
+ "moment": "^2.30.1",
34
30
  "node-cache": "^5.1.2",
35
- "object-hash": "^3.0.0",
36
- "supertest": "^6.2.4",
37
- "uuid": "^8.3.2"
31
+ "object-hash": "^3.0.0"
38
32
  },
39
33
  "devDependencies": {
40
- "@types/jest": "^29.5.4",
41
- "@types/node": "^16.14.2",
34
+ "@autofleet/logger": "^4.2.0",
35
+ "@types/express": "^4.17.21",
36
+ "@types/jsonwebtoken": "^8.5.9",
37
+ "@types/node": "^18.19.75",
42
38
  "@typescript-eslint/eslint-plugin": "^6.5.0",
43
39
  "@typescript-eslint/parser": "^6.5.0",
40
+ "@vitest/coverage-v8": "^3.0.6",
41
+ "axios": "^0.29.0",
44
42
  "eslint": "^8.48.0",
45
43
  "eslint-config-airbnb-typescript": "^17.1.0",
46
44
  "eslint-plugin-import": "^2.28.1",
47
- "jest": "^29.6.4",
48
- "ts-jest": "^29.1.1",
49
- "typescript": "^4.9.5"
45
+ "express": "^4.21.2",
46
+ "nock": "^14.0.0",
47
+ "supertest": "^7.0.0",
48
+ "typescript": "^4.9.5",
49
+ "vitest": "^3.0.6"
50
50
  },
51
51
  "peerDependencies": {
52
52
  "@autofleet/shtinker": "^1.2.0"
@@ -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
- });
@@ -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) => {};
@@ -1,35 +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.mockRequestAndUser = exports.setIdentityNock = void 0;
7
- const supertest_1 = __importDefault(require("supertest"));
8
- const nock_1 = __importDefault(require("nock"));
9
- const http_1 = __importDefault(require("http"));
10
- const uuid_1 = require("uuid");
11
- const setIdentityNock = (userAttributes) => {
12
- (0, nock_1.default)(`http://${process.env.IDENTITY_MS_SERVICE_HOST}`)
13
- .get(`/api/v1/users/${userAttributes.id}/authorization-payload`)
14
- .reply(200, userAttributes.permissions);
15
- };
16
- exports.setIdentityNock = setIdentityNock;
17
- const mockRequestAndUser = (app, userCustomAttributes) => {
18
- const agent = supertest_1.default.agent(app);
19
- const userAttributes = {
20
- id: userCustomAttributes.id || (0, uuid_1.v4)(),
21
- permissions: {
22
- businessModels: userCustomAttributes?.permissions?.businessModels || {},
23
- fleets: userCustomAttributes?.permissions?.fleets || {},
24
- demandSources: userCustomAttributes?.permissions?.demandSources || {},
25
- },
26
- };
27
- agent.set('x-af-user-id', userAttributes.id);
28
- (0, exports.setIdentityNock)(userAttributes);
29
- const agentObject = {};
30
- http_1.default.METHODS.forEach((method) => {
31
- agentObject[method.toLowerCase()] = (path) => agent[method.toLowerCase()](path).set('x-af-user-id', userAttributes.id);
32
- });
33
- return agentObject;
34
- };
35
- exports.mockRequestAndUser = mockRequestAndUser;
@@ -1 +0,0 @@
1
- export {};