@uniorganization/uni-lib 4.0.50 → 4.1.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.
Files changed (283) hide show
  1. package/dist/entities/active-loads.entity.d.ts +1 -0
  2. package/dist/entities/active-loads.entity.js +4 -0
  3. package/dist/entities/applications.entity.d.ts +1 -0
  4. package/dist/entities/applications.entity.js +4 -0
  5. package/dist/entities/audit.entity.d.ts +1 -0
  6. package/dist/entities/audit.entity.js +4 -0
  7. package/dist/entities/autofail-reasons.entity.d.ts +1 -0
  8. package/dist/entities/autofail-reasons.entity.js +4 -0
  9. package/dist/entities/blacklist.entity.d.ts +1 -0
  10. package/dist/entities/blacklist.entity.js +5 -1
  11. package/dist/entities/bp-alerts.entity.d.ts +1 -0
  12. package/dist/entities/bp-alerts.entity.js +4 -0
  13. package/dist/entities/business-schedule-day.entity.d.ts +1 -0
  14. package/dist/entities/business-schedule-day.entity.js +4 -0
  15. package/dist/entities/business-schedule.entity.d.ts +1 -0
  16. package/dist/entities/business-schedule.entity.js +4 -0
  17. package/dist/entities/call-driver-data.entity.d.ts +1 -0
  18. package/dist/entities/call-driver-data.entity.js +4 -0
  19. package/dist/entities/call-drivers.entity.d.ts +1 -0
  20. package/dist/entities/call-drivers.entity.js +4 -0
  21. package/dist/entities/cb-completed-reasons.entity.d.ts +1 -0
  22. package/dist/entities/cb-completed-reasons.entity.js +4 -0
  23. package/dist/entities/change-alert.entity.d.ts +1 -0
  24. package/dist/entities/change-alert.entity.js +4 -0
  25. package/dist/entities/claim-report.entity.d.ts +1 -0
  26. package/dist/entities/claim-report.entity.js +6 -2
  27. package/dist/entities/client-credential.entity.d.ts +17 -0
  28. package/dist/entities/client-credential.entity.js +87 -0
  29. package/dist/entities/client.entity.d.ts +12 -0
  30. package/dist/entities/client.entity.js +67 -0
  31. package/dist/entities/config.entity.d.ts +1 -0
  32. package/dist/entities/config.entity.js +4 -0
  33. package/dist/entities/contact-search.entity.d.ts +1 -0
  34. package/dist/entities/contact-search.entity.js +17 -13
  35. package/dist/entities/daily-payment-status.entity.d.ts +1 -0
  36. package/dist/entities/daily-payment-status.entity.js +4 -0
  37. package/dist/entities/daily-payment.entity.d.ts +58 -0
  38. package/dist/entities/daily-payment.entity.js +248 -0
  39. package/dist/entities/daily-pending.entity.d.ts +1 -0
  40. package/dist/entities/daily-pending.entity.js +5 -1
  41. package/dist/entities/depreciation-categories.entity.d.ts +1 -0
  42. package/dist/entities/depreciation-categories.entity.js +4 -0
  43. package/dist/entities/depreciation-details.entity.d.ts +1 -0
  44. package/dist/entities/depreciation-details.entity.js +4 -0
  45. package/dist/entities/detail-type.entity.d.ts +1 -0
  46. package/dist/entities/detail-type.entity.js +4 -0
  47. package/dist/entities/dispute-request.entity.d.ts +1 -0
  48. package/dist/entities/dispute-request.entity.js +4 -0
  49. package/dist/entities/enr-calculation-log.entity.d.ts +1 -0
  50. package/dist/entities/enr-calculation-log.entity.js +4 -0
  51. package/dist/entities/enr-inventory.entity.d.ts +1 -0
  52. package/dist/entities/enr-inventory.entity.js +4 -0
  53. package/dist/entities/enr-results.entity.d.ts +1 -0
  54. package/dist/entities/enr-results.entity.js +4 -0
  55. package/dist/entities/escalation-category.entity.d.ts +1 -0
  56. package/dist/entities/escalation-category.entity.js +4 -0
  57. package/dist/entities/escalation-notes.entity.d.ts +1 -0
  58. package/dist/entities/escalation-notes.entity.js +4 -0
  59. package/dist/entities/escalation-outcome.entity.d.ts +1 -0
  60. package/dist/entities/escalation-outcome.entity.js +4 -0
  61. package/dist/entities/escalation-status-log.entity.d.ts +1 -0
  62. package/dist/entities/escalation-status-log.entity.js +4 -0
  63. package/dist/entities/escalation-status.entity.d.ts +1 -0
  64. package/dist/entities/escalation-status.entity.js +4 -0
  65. package/dist/entities/escalation-type.entity.d.ts +1 -0
  66. package/dist/entities/escalation-type.entity.js +4 -0
  67. package/dist/entities/escalations.entity.d.ts +1 -0
  68. package/dist/entities/escalations.entity.js +4 -0
  69. package/dist/entities/evaluation-autofail-reasons.entity.d.ts +1 -0
  70. package/dist/entities/evaluation-autofail-reasons.entity.js +4 -0
  71. package/dist/entities/evaluation-data.entity.d.ts +1 -0
  72. package/dist/entities/evaluation-data.entity.js +4 -0
  73. package/dist/entities/evaluation-forms.entity.d.ts +1 -0
  74. package/dist/entities/evaluation-forms.entity.js +4 -0
  75. package/dist/entities/evaluation-questions.entity.d.ts +1 -0
  76. package/dist/entities/evaluation-questions.entity.js +4 -0
  77. package/dist/entities/evaluations.entity.d.ts +1 -0
  78. package/dist/entities/evaluations.entity.js +4 -0
  79. package/dist/entities/feedback.entity.d.ts +1 -0
  80. package/dist/entities/feedback.entity.js +4 -0
  81. package/dist/entities/file-contents.entity.d.ts +1 -0
  82. package/dist/entities/file-contents.entity.js +4 -0
  83. package/dist/entities/file-type.entity.d.ts +1 -0
  84. package/dist/entities/file-type.entity.js +5 -2
  85. package/dist/entities/file-upload.entity.d.ts +1 -0
  86. package/dist/entities/file-upload.entity.js +4 -0
  87. package/dist/entities/file.entity.d.ts +1 -0
  88. package/dist/entities/file.entity.js +4 -0
  89. package/dist/entities/form-definition.entity.d.ts +1 -0
  90. package/dist/entities/form-definition.entity.js +4 -0
  91. package/dist/entities/form-fields.entity.d.ts +1 -0
  92. package/dist/entities/form-fields.entity.js +4 -0
  93. package/dist/entities/form.entity.d.ts +1 -0
  94. package/dist/entities/form.entity.js +4 -0
  95. package/dist/entities/inbox/agent-extension-backup.entity.d.ts +1 -0
  96. package/dist/entities/inbox/agent-extension-backup.entity.js +10 -2
  97. package/dist/entities/inbox/agent-extension.entity.d.ts +1 -0
  98. package/dist/entities/inbox/agent-extension.entity.js +6 -2
  99. package/dist/entities/inbox/assignment.entity.d.ts +1 -0
  100. package/dist/entities/inbox/assignment.entity.js +5 -3
  101. package/dist/entities/inbox/case-event.entity.d.ts +1 -0
  102. package/dist/entities/inbox/case-event.entity.js +4 -0
  103. package/dist/entities/inbox/case-file.entity.d.ts +1 -0
  104. package/dist/entities/inbox/case-file.entity.js +4 -0
  105. package/dist/entities/inbox/case-link.entity.d.ts +1 -0
  106. package/dist/entities/inbox/case-link.entity.js +4 -0
  107. package/dist/entities/inbox/case-note.entity.d.ts +1 -0
  108. package/dist/entities/inbox/case-note.entity.js +4 -0
  109. package/dist/entities/inbox/case-tag.entity.d.ts +1 -0
  110. package/dist/entities/inbox/case-tag.entity.js +4 -0
  111. package/dist/entities/inbox/case-text.entity.d.ts +1 -0
  112. package/dist/entities/inbox/case-text.entity.js +5 -3
  113. package/dist/entities/inbox/contact-attempt.entity.d.ts +1 -0
  114. package/dist/entities/inbox/contact-attempt.entity.js +4 -0
  115. package/dist/entities/inbox/inbound-message.entity.d.ts +1 -0
  116. package/dist/entities/inbox/inbound-message.entity.js +5 -1
  117. package/dist/entities/inbox/message-case.entity.d.ts +2 -0
  118. package/dist/entities/inbox/message-case.entity.js +18 -3
  119. package/dist/entities/inbox/notification.entity.d.ts +1 -0
  120. package/dist/entities/inbox/notification.entity.js +4 -0
  121. package/dist/entities/inbox/sla-policy.entity.d.ts +1 -0
  122. package/dist/entities/inbox/sla-policy.entity.js +7 -2
  123. package/dist/entities/inbox/tag.entity.d.ts +1 -0
  124. package/dist/entities/inbox/tag.entity.js +7 -2
  125. package/dist/entities/incoterms.entity.d.ts +1 -0
  126. package/dist/entities/incoterms.entity.js +4 -0
  127. package/dist/entities/index.d.ts +2 -0
  128. package/dist/entities/index.js +2 -0
  129. package/dist/entities/inventory.entity.d.ts +1 -0
  130. package/dist/entities/inventory.entity.js +4 -0
  131. package/dist/entities/kenko.entity.d.ts +1 -0
  132. package/dist/entities/kenko.entity.js +4 -0
  133. package/dist/entities/lob-assignment.entity.d.ts +1 -0
  134. package/dist/entities/lob-assignment.entity.js +4 -0
  135. package/dist/entities/lob-call-drivers.entity.d.ts +1 -0
  136. package/dist/entities/lob-call-drivers.entity.js +4 -0
  137. package/dist/entities/location-addresses.entity.d.ts +1 -0
  138. package/dist/entities/location-addresses.entity.js +4 -0
  139. package/dist/entities/ltp-history-transactions.entity.d.ts +1 -0
  140. package/dist/entities/ltp-history-transactions.entity.js +4 -0
  141. package/dist/entities/ltp-stm-roster.entity.d.ts +1 -0
  142. package/dist/entities/ltp-stm-roster.entity.js +4 -0
  143. package/dist/entities/modules-roles.entity.d.ts +1 -0
  144. package/dist/entities/modules-roles.entity.js +4 -0
  145. package/dist/entities/offphone-activities.entity.d.ts +1 -0
  146. package/dist/entities/offphone-activities.entity.js +4 -0
  147. package/dist/entities/onsite-ordering.entity.d.ts +1 -0
  148. package/dist/entities/onsite-ordering.entity.js +4 -0
  149. package/dist/entities/ost.entity.d.ts +1 -0
  150. package/dist/entities/ost.entity.js +4 -0
  151. package/dist/entities/otwe-offers.entity.d.ts +1 -0
  152. package/dist/entities/otwe-offers.entity.js +4 -0
  153. package/dist/entities/outbound-ticket-history.entity.d.ts +1 -0
  154. package/dist/entities/outbound-ticket-history.entity.js +4 -0
  155. package/dist/entities/p1-service-center.entity.d.ts +1 -0
  156. package/dist/entities/p1-service-center.entity.js +4 -0
  157. package/dist/entities/p1-service-network.entity.d.ts +1 -0
  158. package/dist/entities/p1-service-network.entity.js +4 -0
  159. package/dist/entities/pending-ticket-history.entity.d.ts +1 -0
  160. package/dist/entities/pending-ticket-history.entity.js +4 -0
  161. package/dist/entities/product-codes.entity.d.ts +1 -0
  162. package/dist/entities/product-codes.entity.js +4 -0
  163. package/dist/entities/question-group.entity.d.ts +1 -0
  164. package/dist/entities/question-group.entity.js +4 -0
  165. package/dist/entities/questions.entity.d.ts +1 -0
  166. package/dist/entities/questions.entity.js +4 -0
  167. package/dist/entities/raw_roster.entity.d.ts +1 -0
  168. package/dist/entities/raw_roster.entity.js +4 -0
  169. package/dist/entities/regional-service-mgr.entity.d.ts +1 -0
  170. package/dist/entities/regional-service-mgr.entity.js +4 -0
  171. package/dist/entities/role-definition.entity.d.ts +1 -0
  172. package/dist/entities/role-definition.entity.js +4 -0
  173. package/dist/entities/role-privileges.entity.d.ts +1 -0
  174. package/dist/entities/role-privileges.entity.js +4 -0
  175. package/dist/entities/roster-personnel.entity.d.ts +1 -0
  176. package/dist/entities/roster-personnel.entity.js +4 -0
  177. package/dist/entities/sap-raw-data.entity.d.ts +1 -0
  178. package/dist/entities/sap-raw-data.entity.js +4 -0
  179. package/dist/entities/service-center-distance-cache.entity.d.ts +1 -0
  180. package/dist/entities/service-center-distance-cache.entity.js +5 -1
  181. package/dist/entities/service-center-geocode-cache.entity.d.ts +1 -0
  182. package/dist/entities/service-center-geocode-cache.entity.js +5 -1
  183. package/dist/entities/service-center-interaction.entity.d.ts +1 -0
  184. package/dist/entities/service-center-interaction.entity.js +4 -0
  185. package/dist/entities/service-center-phone.entity.d.ts +1 -0
  186. package/dist/entities/service-center-phone.entity.js +4 -0
  187. package/dist/entities/service-center-ranking.entity.d.ts +1 -0
  188. package/dist/entities/service-center-ranking.entity.js +4 -0
  189. package/dist/entities/service-center-review.entity.d.ts +1 -0
  190. package/dist/entities/service-center-review.entity.js +4 -0
  191. package/dist/entities/service-center-unsupported-model.entity.d.ts +1 -0
  192. package/dist/entities/service-center-unsupported-model.entity.js +5 -1
  193. package/dist/entities/service-center.entity.d.ts +1 -0
  194. package/dist/entities/service-center.entity.js +6 -2
  195. package/dist/entities/service-type.entity.d.ts +1 -0
  196. package/dist/entities/service-type.entity.js +4 -0
  197. package/dist/entities/skipped-ticket.entity.d.ts +1 -0
  198. package/dist/entities/skipped-ticket.entity.js +4 -0
  199. package/dist/entities/state.entity.d.ts +1 -0
  200. package/dist/entities/state.entity.js +4 -0
  201. package/dist/entities/template.entity.d.ts +1 -0
  202. package/dist/entities/template.entity.js +4 -0
  203. package/dist/entities/ticket-queue.entity.d.ts +1 -0
  204. package/dist/entities/ticket-queue.entity.js +4 -0
  205. package/dist/entities/ticket-service-center-match-loa-pricing.entity.d.ts +1 -0
  206. package/dist/entities/ticket-service-center-match-loa-pricing.entity.js +4 -0
  207. package/dist/entities/ticket-service-center-match-process.entity.d.ts +1 -0
  208. package/dist/entities/ticket-service-center-match-process.entity.js +4 -0
  209. package/dist/entities/transactions.entity.d.ts +1 -0
  210. package/dist/entities/transactions.entity.js +4 -0
  211. package/dist/entities/user-campaign.entity.d.ts +1 -0
  212. package/dist/entities/user-campaign.entity.js +4 -0
  213. package/dist/entities/user-roles.entity.d.ts +4 -0
  214. package/dist/entities/user-roles.entity.js +22 -3
  215. package/dist/entities/usr.entity.d.ts +1 -0
  216. package/dist/entities/usr.entity.js +4 -0
  217. package/dist/entities/vw-escalation-age.d.ts +1 -0
  218. package/dist/entities/vw-escalation-age.js +4 -0
  219. package/dist/entities/warranty-category.entity.d.ts +1 -0
  220. package/dist/entities/warranty-category.entity.js +4 -0
  221. package/dist/enums/inbox/event-type.enum.d.ts +2 -1
  222. package/dist/enums/inbox/event-type.enum.js +1 -0
  223. package/dist/middlewares/index.d.ts +1 -0
  224. package/dist/middlewares/index.js +17 -0
  225. package/dist/middlewares/version-checker.middleware.d.ts +2 -0
  226. package/dist/middlewares/version-checker.middleware.js +27 -0
  227. package/dist/modules/common/common.module.js +5 -4
  228. package/dist/modules/common/jwt-auth.guard.d.ts +5 -2
  229. package/dist/modules/common/jwt-auth.guard.js +20 -12
  230. package/dist/modules/common/jwt.strategy.d.ts +6 -18
  231. package/dist/modules/common/jwt.strategy.js +80 -16
  232. package/dist/modules/common/logged-user.decorator.js +2 -2
  233. package/dist/modules/common/skip-jwt-auth.decorator.d.ts +3 -1
  234. package/dist/modules/common/skip-jwt-auth.decorator.js +5 -2
  235. package/dist/modules/index.d.ts +1 -0
  236. package/dist/modules/index.js +1 -0
  237. package/dist/modules/tenant/current-tenant.decorator.d.ts +1 -0
  238. package/dist/modules/tenant/current-tenant.decorator.js +14 -0
  239. package/dist/modules/tenant/index.d.ts +21 -0
  240. package/dist/modules/tenant/index.js +37 -0
  241. package/dist/modules/tenant/master-tenant.decorator.d.ts +1 -0
  242. package/dist/modules/tenant/master-tenant.decorator.js +7 -0
  243. package/dist/modules/tenant/master-tenant.guard.d.ts +7 -0
  244. package/dist/modules/tenant/master-tenant.guard.js +44 -0
  245. package/dist/modules/tenant/redis-tenant-state.store.d.ts +21 -0
  246. package/dist/modules/tenant/redis-tenant-state.store.js +165 -0
  247. package/dist/modules/tenant/tenant-audit.types.d.ts +15 -0
  248. package/dist/modules/tenant/tenant-audit.types.js +2 -0
  249. package/dist/modules/tenant/tenant-authorization.keys.d.ts +3 -0
  250. package/dist/modules/tenant/tenant-authorization.keys.js +28 -0
  251. package/dist/modules/tenant/tenant-authorization.service.d.ts +24 -0
  252. package/dist/modules/tenant/tenant-authorization.service.js +235 -0
  253. package/dist/modules/tenant/tenant-authorization.store.d.ts +8 -0
  254. package/dist/modules/tenant/tenant-authorization.store.js +4 -0
  255. package/dist/modules/tenant/tenant-authorization.types.d.ts +36 -0
  256. package/dist/modules/tenant/tenant-authorization.types.js +2 -0
  257. package/dist/modules/tenant/tenant-context.errors.d.ts +3 -0
  258. package/dist/modules/tenant/tenant-context.errors.js +10 -0
  259. package/dist/modules/tenant/tenant-context.interceptor.d.ts +9 -0
  260. package/dist/modules/tenant/tenant-context.interceptor.js +69 -0
  261. package/dist/modules/tenant/tenant-context.service.d.ts +15 -0
  262. package/dist/modules/tenant/tenant-context.service.js +56 -0
  263. package/dist/modules/tenant/tenant-context.storage.d.ts +6 -0
  264. package/dist/modules/tenant/tenant-context.storage.js +34 -0
  265. package/dist/modules/tenant/tenant-credential.guard.d.ts +13 -0
  266. package/dist/modules/tenant/tenant-credential.guard.js +119 -0
  267. package/dist/modules/tenant/tenant-ownership.service.d.ts +7 -0
  268. package/dist/modules/tenant/tenant-ownership.service.js +28 -0
  269. package/dist/modules/tenant/tenant-query.helpers.d.ts +12 -0
  270. package/dist/modules/tenant/tenant-query.helpers.js +37 -0
  271. package/dist/modules/tenant/tenant-runner.service.d.ts +7 -0
  272. package/dist/modules/tenant/tenant-runner.service.js +41 -0
  273. package/dist/modules/tenant/tenant-security-state.service.d.ts +11 -0
  274. package/dist/modules/tenant/tenant-security-state.service.js +75 -0
  275. package/dist/modules/tenant/tenant-security-state.store.d.ts +7 -0
  276. package/dist/modules/tenant/tenant-security-state.store.js +4 -0
  277. package/dist/modules/tenant/tenant.constants.d.ts +7 -0
  278. package/dist/modules/tenant/tenant.constants.js +10 -0
  279. package/dist/modules/tenant/tenant.module.d.ts +2 -0
  280. package/dist/modules/tenant/tenant.module.js +70 -0
  281. package/dist/modules/tenant/tenant.types.d.ts +69 -0
  282. package/dist/modules/tenant/tenant.types.js +2 -0
  283. package/package.json +2 -1
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ var TenantAuthorizationService_1;
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.TenantAuthorizationService = exports.TENANT_AUTHORIZATION_TTL_SECONDS = void 0;
26
+ const common_1 = require("@nestjs/common");
27
+ const typeorm_1 = require("@nestjs/typeorm");
28
+ const typeorm_2 = require("typeorm");
29
+ const client_entity_1 = require("../../entities/client.entity");
30
+ const user_roles_entity_1 = require("../../entities/user-roles.entity");
31
+ const usr_entity_1 = require("../../entities/usr.entity");
32
+ const tenant_constants_1 = require("./tenant.constants");
33
+ const tenant_authorization_keys_1 = require("./tenant-authorization.keys");
34
+ const tenant_authorization_store_1 = require("./tenant-authorization.store");
35
+ exports.TENANT_AUTHORIZATION_TTL_SECONDS = 60;
36
+ let TenantAuthorizationService = TenantAuthorizationService_1 = class TenantAuthorizationService {
37
+ constructor(store, userRepository, clientRepository, userRoleRepository) {
38
+ this.store = store;
39
+ this.userRepository = userRepository;
40
+ this.clientRepository = clientRepository;
41
+ this.userRoleRepository = userRoleRepository;
42
+ this.logger = new common_1.Logger(TenantAuthorizationService_1.name);
43
+ }
44
+ resolve(userId, clientId, expectedHomeClientId) {
45
+ return __awaiter(this, void 0, void 0, function* () {
46
+ var _a;
47
+ this.assertPositiveInteger(userId);
48
+ this.assertPositiveInteger(clientId);
49
+ this.assertPositiveInteger(expectedHomeClientId);
50
+ const key = (0, tenant_authorization_keys_1.tenantAuthorizationKey)(clientId, userId);
51
+ const cached = yield this.readCache(key);
52
+ if (cached &&
53
+ cached.userId === userId &&
54
+ cached.clientId === clientId &&
55
+ cached.homeClientId === expectedHomeClientId &&
56
+ ((_a = cached.identity) === null || _a === void 0 ? void 0 : _a.id) === userId &&
57
+ cached.identity.homeClientId === expectedHomeClientId &&
58
+ this.isFresh(cached.cachedAt) &&
59
+ cached.roles.length > 0) {
60
+ return { identity: cached.identity, snapshot: cached };
61
+ }
62
+ const resolved = yield this.loadFromDatabase(userId, clientId, expectedHomeClientId);
63
+ yield this.writeCache(key, resolved.snapshot);
64
+ return resolved;
65
+ });
66
+ }
67
+ resolveImpersonation(userId, homeClientId, targetClientId) {
68
+ return __awaiter(this, void 0, void 0, function* () {
69
+ if (homeClientId !== tenant_constants_1.NEWTECH_CLIENT_ID ||
70
+ targetClientId === tenant_constants_1.NEWTECH_CLIENT_ID) {
71
+ throw new common_1.UnauthorizedException();
72
+ }
73
+ const origin = yield this.resolve(userId, homeClientId, homeClientId);
74
+ const isNewtechMaster = origin.snapshot.roles.some((role) => role.moduleName.toLowerCase() === 'root' &&
75
+ role.roleName.toLowerCase() === 'sysadmin');
76
+ const targetClient = yield this.clientRepository.findOne({
77
+ where: { id: targetClientId, deletedAt: (0, typeorm_2.IsNull)() },
78
+ });
79
+ if (!isNewtechMaster || !targetClient) {
80
+ throw new common_1.UnauthorizedException();
81
+ }
82
+ const snapshot = {
83
+ userId,
84
+ homeClientId,
85
+ clientId: targetClientId,
86
+ clientName: targetClient.name,
87
+ clientAlias: targetClient.alias,
88
+ roles: [
89
+ {
90
+ roleId: 0,
91
+ roleName: tenant_constants_1.TENANT_IMPERSONATOR_ROLE,
92
+ moduleId: 0,
93
+ moduleName: tenant_constants_1.TENANT_IMPERSONATOR_ROLE,
94
+ },
95
+ ],
96
+ privileges: [],
97
+ identity: origin.identity,
98
+ cachedAt: new Date().toISOString(),
99
+ };
100
+ return { identity: origin.identity, snapshot };
101
+ });
102
+ }
103
+ invalidate(userId, clientId) {
104
+ return __awaiter(this, void 0, void 0, function* () {
105
+ yield this.store.delete((0, tenant_authorization_keys_1.tenantAuthorizationKey)(clientId, userId));
106
+ });
107
+ }
108
+ invalidateMany(clientId, userIds) {
109
+ return __awaiter(this, void 0, void 0, function* () {
110
+ const keys = Array.from(new Set(userIds)).map((userId) => (0, tenant_authorization_keys_1.tenantAuthorizationKey)(clientId, userId));
111
+ if (keys.length > 0) {
112
+ yield this.store.deleteMany(keys);
113
+ }
114
+ });
115
+ }
116
+ loadFromDatabase(userId, clientId, expectedHomeClientId) {
117
+ return __awaiter(this, void 0, void 0, function* () {
118
+ const [user, client, assignments] = yield Promise.all([
119
+ this.userRepository.findOne({ where: { id: userId } }),
120
+ this.clientRepository.findOne({
121
+ where: { id: clientId, deletedAt: (0, typeorm_2.IsNull)() },
122
+ }),
123
+ this.userRoleRepository
124
+ .createQueryBuilder('assignment')
125
+ .innerJoinAndSelect('assignment.role', 'role', 'role.client_id = assignment.client_id')
126
+ .innerJoinAndSelect('role.module', 'module', 'module.is_active = true')
127
+ .leftJoinAndSelect('role.privileges', 'definition', 'definition.client_id = assignment.client_id')
128
+ .leftJoinAndSelect('definition.privilege', 'privilege', 'privilege.client_id = assignment.client_id AND privilege."IS_ACTIVE" <> 0')
129
+ .where('assignment."USER_ID" = :userId', { userId })
130
+ .andWhere('assignment.client_id = :clientId', { clientId })
131
+ .getMany(),
132
+ ]);
133
+ if (!user ||
134
+ !Number(user.is_active) ||
135
+ user.clientId !== expectedHomeClientId ||
136
+ !client ||
137
+ assignments.length === 0) {
138
+ throw new common_1.UnauthorizedException();
139
+ }
140
+ const roles = assignments.map((assignment) => {
141
+ var _a, _b, _c, _d, _e, _f;
142
+ return ({
143
+ roleId: Number(assignment.roleId || ((_a = assignment.role) === null || _a === void 0 ? void 0 : _a.id)),
144
+ roleName: (_b = assignment.role) === null || _b === void 0 ? void 0 : _b.roleName,
145
+ moduleId: Number((_d = (_c = assignment.role) === null || _c === void 0 ? void 0 : _c.module) === null || _d === void 0 ? void 0 : _d.id),
146
+ moduleName: (_f = (_e = assignment.role) === null || _e === void 0 ? void 0 : _e.module) === null || _f === void 0 ? void 0 : _f.moduleName,
147
+ });
148
+ });
149
+ if (roles.some((role) => !Number.isInteger(role.roleId) ||
150
+ role.roleId <= 0 ||
151
+ !role.roleName ||
152
+ !Number.isInteger(role.moduleId) ||
153
+ role.moduleId <= 0 ||
154
+ !role.moduleName)) {
155
+ throw new common_1.UnauthorizedException();
156
+ }
157
+ const privileges = Array.from(new Set(assignments.flatMap((assignment) => {
158
+ var _a;
159
+ return (((_a = assignment.role) === null || _a === void 0 ? void 0 : _a.privileges) || [])
160
+ .map((definition) => { var _a; return (_a = definition.privilege) === null || _a === void 0 ? void 0 : _a.privilege; })
161
+ .filter((privilege) => Boolean(privilege));
162
+ }))).sort();
163
+ const identity = {
164
+ id: user.id,
165
+ homeClientId: user.clientId,
166
+ firstName: user.first_name,
167
+ username: user.username,
168
+ lastName: user.last_name,
169
+ division: user.division,
170
+ lob: user.lob,
171
+ fullName: user.fullName,
172
+ ntgid: user.ntgid,
173
+ profile: user.profile,
174
+ passwordExpired: user.password_expired,
175
+ viewEvaluations: user.viewEvaluations,
176
+ ern: user.ern,
177
+ };
178
+ const snapshot = {
179
+ userId,
180
+ homeClientId: user.clientId,
181
+ clientId,
182
+ clientName: client.name,
183
+ clientAlias: client.alias,
184
+ roles,
185
+ privileges,
186
+ identity,
187
+ cachedAt: new Date().toISOString(),
188
+ };
189
+ return { identity, snapshot };
190
+ });
191
+ }
192
+ readCache(key) {
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ try {
195
+ return yield this.store.get(key);
196
+ }
197
+ catch (_a) {
198
+ this.logger.warn('Authorization cache read failed; falling back to PostgreSQL');
199
+ return null;
200
+ }
201
+ });
202
+ }
203
+ writeCache(key, snapshot) {
204
+ return __awaiter(this, void 0, void 0, function* () {
205
+ try {
206
+ yield this.store.set(key, snapshot, exports.TENANT_AUTHORIZATION_TTL_SECONDS);
207
+ }
208
+ catch (_a) {
209
+ this.logger.warn('Authorization cache write failed; continuing with PostgreSQL result');
210
+ }
211
+ });
212
+ }
213
+ assertPositiveInteger(value) {
214
+ if (!Number.isInteger(value) || value <= 0) {
215
+ throw new common_1.UnauthorizedException();
216
+ }
217
+ }
218
+ isFresh(cachedAt) {
219
+ const ageMilliseconds = Date.now() - Date.parse(cachedAt);
220
+ return (Number.isFinite(ageMilliseconds) &&
221
+ ageMilliseconds >= 0 &&
222
+ ageMilliseconds <= exports.TENANT_AUTHORIZATION_TTL_SECONDS * 1000);
223
+ }
224
+ };
225
+ exports.TenantAuthorizationService = TenantAuthorizationService;
226
+ exports.TenantAuthorizationService = TenantAuthorizationService = TenantAuthorizationService_1 = __decorate([
227
+ (0, common_1.Injectable)(),
228
+ __param(0, (0, common_1.Inject)(tenant_authorization_store_1.TENANT_AUTHORIZATION_STORE)),
229
+ __param(1, (0, typeorm_1.InjectRepository)(usr_entity_1.Users)),
230
+ __param(2, (0, typeorm_1.InjectRepository)(client_entity_1.Client)),
231
+ __param(3, (0, typeorm_1.InjectRepository)(user_roles_entity_1.UserRoles)),
232
+ __metadata("design:paramtypes", [Object, typeorm_2.Repository,
233
+ typeorm_2.Repository,
234
+ typeorm_2.Repository])
235
+ ], TenantAuthorizationService);
@@ -0,0 +1,8 @@
1
+ import { TenantAuthorizationSnapshot } from './tenant-authorization.types';
2
+ export declare const TENANT_AUTHORIZATION_STORE: unique symbol;
3
+ export interface TenantAuthorizationStore {
4
+ get(key: string): Promise<TenantAuthorizationSnapshot | null>;
5
+ set(key: string, value: TenantAuthorizationSnapshot, ttlSeconds: number): Promise<void>;
6
+ delete(key: string): Promise<void>;
7
+ deleteMany(keys: readonly string[]): Promise<void>;
8
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TENANT_AUTHORIZATION_STORE = void 0;
4
+ exports.TENANT_AUTHORIZATION_STORE = Symbol('TENANT_AUTHORIZATION_STORE');
@@ -0,0 +1,36 @@
1
+ export interface TenantRoleAuthorization {
2
+ roleId: number;
3
+ roleName: string;
4
+ moduleId: number;
5
+ moduleName: string;
6
+ }
7
+ export interface TenantAuthorizationSnapshot {
8
+ userId: number;
9
+ homeClientId: number;
10
+ clientId: number;
11
+ clientName: string;
12
+ clientAlias: string;
13
+ roles: TenantRoleAuthorization[];
14
+ privileges: string[];
15
+ identity: TenantAuthorizationIdentity;
16
+ cachedAt: string;
17
+ }
18
+ export interface TenantAuthorizationIdentity {
19
+ id: number;
20
+ homeClientId: number;
21
+ firstName?: string;
22
+ username?: string;
23
+ lastName?: string;
24
+ division?: string;
25
+ lob?: string;
26
+ fullName?: string;
27
+ ntgid?: string;
28
+ profile?: string;
29
+ passwordExpired?: number;
30
+ viewEvaluations?: boolean;
31
+ ern?: string;
32
+ }
33
+ export interface ResolvedTenantAuthorization {
34
+ identity: TenantAuthorizationIdentity;
35
+ snapshot: TenantAuthorizationSnapshot;
36
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ export declare class MissingTenantContextError extends Error {
2
+ constructor();
3
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MissingTenantContextError = void 0;
4
+ class MissingTenantContextError extends Error {
5
+ constructor() {
6
+ super('Tenant context is required for this operation');
7
+ this.name = MissingTenantContextError.name;
8
+ }
9
+ }
10
+ exports.MissingTenantContextError = MissingTenantContextError;
@@ -0,0 +1,9 @@
1
+ import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ import { TenantContextStorage } from './tenant-context.storage';
4
+ export declare class TenantContextInterceptor implements NestInterceptor {
5
+ private readonly tenantContextStorage;
6
+ constructor(tenantContextStorage: TenantContextStorage);
7
+ intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
8
+ private fromAuthenticatedUser;
9
+ }
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TenantContextInterceptor = void 0;
13
+ const crypto_1 = require("crypto");
14
+ const common_1 = require("@nestjs/common");
15
+ const rxjs_1 = require("rxjs");
16
+ const tenant_context_storage_1 = require("./tenant-context.storage");
17
+ let TenantContextInterceptor = class TenantContextInterceptor {
18
+ constructor(tenantContextStorage) {
19
+ this.tenantContextStorage = tenantContextStorage;
20
+ }
21
+ intercept(context, next) {
22
+ if (context.getType() !== 'http') {
23
+ return next.handle();
24
+ }
25
+ const request = context.switchToHttp().getRequest();
26
+ const state = request.tenantContext || this.fromAuthenticatedUser(request);
27
+ if (!state) {
28
+ return next.handle();
29
+ }
30
+ request.tenantContext = Object.freeze(state);
31
+ return new rxjs_1.Observable((subscriber) => {
32
+ const subscription = this.tenantContextStorage.run(state, () => next.handle().subscribe(subscriber));
33
+ return () => subscription.unsubscribe();
34
+ });
35
+ }
36
+ fromAuthenticatedUser(request) {
37
+ var _a, _b, _c, _d;
38
+ if (!request.user || request.user === true) {
39
+ return undefined;
40
+ }
41
+ const user = request.user;
42
+ if (!Number.isInteger(user.clientId) || user.clientId <= 0) {
43
+ throw new common_1.UnauthorizedException();
44
+ }
45
+ const correlationHeader = (_a = request.headers) === null || _a === void 0 ? void 0 : _a['x-correlation-id'];
46
+ const presentedCorrelationId = Array.isArray(correlationHeader)
47
+ ? correlationHeader[0]
48
+ : correlationHeader;
49
+ const correlationId = presentedCorrelationId &&
50
+ /^[A-Za-z0-9._:-]{1,128}$/.test(presentedCorrelationId)
51
+ ? presentedCorrelationId
52
+ : (0, crypto_1.randomUUID)();
53
+ return {
54
+ clientId: user.clientId,
55
+ originalClientId: (_b = user.originalClientId) !== null && _b !== void 0 ? _b : null,
56
+ actorUserId: user.id,
57
+ authenticationType: 'jwt',
58
+ impersonatedAt: (_c = user.impersonatedAt) !== null && _c !== void 0 ? _c : null,
59
+ impersonationReason: (_d = user.impersonationReason) !== null && _d !== void 0 ? _d : null,
60
+ correlationId,
61
+ roles: user.roles || [],
62
+ };
63
+ }
64
+ };
65
+ exports.TenantContextInterceptor = TenantContextInterceptor;
66
+ exports.TenantContextInterceptor = TenantContextInterceptor = __decorate([
67
+ (0, common_1.Injectable)(),
68
+ __metadata("design:paramtypes", [tenant_context_storage_1.TenantContextStorage])
69
+ ], TenantContextInterceptor);
@@ -0,0 +1,15 @@
1
+ import { TenantContextStorage } from './tenant-context.storage';
2
+ import { TenantAuthenticationType, TenantContextState } from './tenant.types';
3
+ export declare class TenantContext {
4
+ private readonly storage;
5
+ constructor(storage: TenantContextStorage);
6
+ getState(): Readonly<TenantContextState>;
7
+ tryGetState(): Readonly<TenantContextState> | undefined;
8
+ getClientId(): number;
9
+ getOriginalClientId(): number | null;
10
+ getActorUserId(): number | null;
11
+ getAuthenticationType(): TenantAuthenticationType;
12
+ getImpersonationReason(): string | null;
13
+ getCorrelationId(): string;
14
+ isImpersonating(): boolean;
15
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TenantContext = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const tenant_context_errors_1 = require("./tenant-context.errors");
15
+ const tenant_context_storage_1 = require("./tenant-context.storage");
16
+ let TenantContext = class TenantContext {
17
+ constructor(storage) {
18
+ this.storage = storage;
19
+ }
20
+ getState() {
21
+ const state = this.storage.getStore();
22
+ if (!state) {
23
+ throw new tenant_context_errors_1.MissingTenantContextError();
24
+ }
25
+ return state;
26
+ }
27
+ tryGetState() {
28
+ return this.storage.getStore();
29
+ }
30
+ getClientId() {
31
+ return this.getState().clientId;
32
+ }
33
+ getOriginalClientId() {
34
+ return this.getState().originalClientId;
35
+ }
36
+ getActorUserId() {
37
+ return this.getState().actorUserId;
38
+ }
39
+ getAuthenticationType() {
40
+ return this.getState().authenticationType;
41
+ }
42
+ getImpersonationReason() {
43
+ return this.getState().impersonationReason;
44
+ }
45
+ getCorrelationId() {
46
+ return this.getState().correlationId;
47
+ }
48
+ isImpersonating() {
49
+ return this.getState().originalClientId !== null;
50
+ }
51
+ };
52
+ exports.TenantContext = TenantContext;
53
+ exports.TenantContext = TenantContext = __decorate([
54
+ (0, common_1.Injectable)(),
55
+ __metadata("design:paramtypes", [tenant_context_storage_1.TenantContextStorage])
56
+ ], TenantContext);
@@ -0,0 +1,6 @@
1
+ import { TenantContextState } from './tenant.types';
2
+ export declare class TenantContextStorage {
3
+ private readonly storage;
4
+ run<T>(state: TenantContextState, callback: () => T): T;
5
+ getStore(): Readonly<TenantContextState> | undefined;
6
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.TenantContextStorage = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const async_hooks_1 = require("async_hooks");
12
+ let TenantContextStorage = class TenantContextStorage {
13
+ constructor() {
14
+ this.storage = new async_hooks_1.AsyncLocalStorage();
15
+ }
16
+ run(state, callback) {
17
+ if (!Number.isInteger(state.clientId) || state.clientId <= 0) {
18
+ throw new Error('A valid tenant is required to establish context');
19
+ }
20
+ const current = this.storage.getStore();
21
+ if (current && current.clientId !== state.clientId) {
22
+ throw new Error('An established tenant context cannot be replaced');
23
+ }
24
+ const immutableState = Object.freeze(Object.assign(Object.assign({}, state), { roles: state.roles ? Object.freeze([...state.roles]) : undefined }));
25
+ return this.storage.run(immutableState, callback);
26
+ }
27
+ getStore() {
28
+ return this.storage.getStore();
29
+ }
30
+ };
31
+ exports.TenantContextStorage = TenantContextStorage;
32
+ exports.TenantContextStorage = TenantContextStorage = __decorate([
33
+ (0, common_1.Injectable)()
34
+ ], TenantContextStorage);
@@ -0,0 +1,13 @@
1
+ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
+ import { Repository } from 'typeorm';
3
+ import { ClientCredential } from '../../entities/client-credential.entity';
4
+ export declare function hashTenantCredentialSecret(secret: string): string;
5
+ export declare class TenantCredentialGuard implements CanActivate {
6
+ private readonly credentialRepository;
7
+ constructor(credentialRepository: Repository<ClientCredential>);
8
+ canActivate(context: ExecutionContext): Promise<boolean>;
9
+ private getHeader;
10
+ private getCorrelationId;
11
+ private parseCredential;
12
+ private matches;
13
+ }
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.TenantCredentialGuard = void 0;
25
+ exports.hashTenantCredentialSecret = hashTenantCredentialSecret;
26
+ const crypto_1 = require("crypto");
27
+ const common_1 = require("@nestjs/common");
28
+ const typeorm_1 = require("@nestjs/typeorm");
29
+ const typeorm_2 = require("typeorm");
30
+ const client_credential_entity_1 = require("../../entities/client-credential.entity");
31
+ const tenant_constants_1 = require("./tenant.constants");
32
+ function hashTenantCredentialSecret(secret) {
33
+ return (0, crypto_1.createHash)('sha256').update(secret, 'utf8').digest('hex');
34
+ }
35
+ let TenantCredentialGuard = class TenantCredentialGuard {
36
+ constructor(credentialRepository) {
37
+ this.credentialRepository = credentialRepository;
38
+ }
39
+ canActivate(context) {
40
+ return __awaiter(this, void 0, void 0, function* () {
41
+ const request = context.switchToHttp().getRequest();
42
+ const presentedCredential = this.getHeader(request);
43
+ const parsed = this.parseCredential(presentedCredential);
44
+ if (!parsed) {
45
+ throw new common_1.UnauthorizedException();
46
+ }
47
+ const credential = yield this.credentialRepository
48
+ .createQueryBuilder('credential')
49
+ .addSelect('credential.secretHash')
50
+ .innerJoinAndSelect('credential.client', 'client')
51
+ .where('credential.keyPrefix = :keyPrefix', {
52
+ keyPrefix: parsed.keyPrefix,
53
+ })
54
+ .andWhere('credential.isActive = true')
55
+ .andWhere('credential.revokedAt IS NULL')
56
+ .andWhere('client.deletedAt IS NULL')
57
+ .getOne();
58
+ if (!credential ||
59
+ (credential.expiresAt && credential.expiresAt.getTime() <= Date.now()) ||
60
+ !this.matches(parsed.secret, credential.secretHash)) {
61
+ throw new common_1.UnauthorizedException();
62
+ }
63
+ const state = {
64
+ clientId: credential.clientId,
65
+ originalClientId: null,
66
+ actorUserId: null,
67
+ authenticationType: 'client-credential',
68
+ impersonatedAt: null,
69
+ impersonationReason: null,
70
+ correlationId: this.getCorrelationId(request),
71
+ credentialId: credential.id,
72
+ };
73
+ request[tenant_constants_1.TENANT_CONTEXT_REQUEST_KEY] = Object.freeze(state);
74
+ return true;
75
+ });
76
+ }
77
+ getHeader(request) {
78
+ var _a;
79
+ const value = (_a = request.headers) === null || _a === void 0 ? void 0 : _a[tenant_constants_1.TENANT_CREDENTIAL_HEADER];
80
+ return Array.isArray(value) ? value[0] : value;
81
+ }
82
+ getCorrelationId(request) {
83
+ var _a;
84
+ const value = (_a = request.headers) === null || _a === void 0 ? void 0 : _a['x-correlation-id'];
85
+ const presentedCorrelationId = Array.isArray(value) ? value[0] : value;
86
+ return presentedCorrelationId &&
87
+ /^[A-Za-z0-9._:-]{1,128}$/.test(presentedCorrelationId)
88
+ ? presentedCorrelationId
89
+ : (0, crypto_1.randomUUID)();
90
+ }
91
+ parseCredential(value) {
92
+ if (!value) {
93
+ return undefined;
94
+ }
95
+ const separatorIndex = value.indexOf('.');
96
+ if (separatorIndex <= 0 || separatorIndex === value.length - 1) {
97
+ return undefined;
98
+ }
99
+ const keyPrefix = value.slice(0, separatorIndex);
100
+ const secret = value.slice(separatorIndex + 1);
101
+ if (!/^[A-Za-z0-9_-]{6,32}$/.test(keyPrefix) ||
102
+ secret.length < 32 ||
103
+ secret.length > 512) {
104
+ return undefined;
105
+ }
106
+ return { keyPrefix, secret };
107
+ }
108
+ matches(secret, expectedHash) {
109
+ const actual = Buffer.from(hashTenantCredentialSecret(secret), 'hex');
110
+ const expected = Buffer.from(expectedHash || '', 'hex');
111
+ return (actual.length === expected.length && (0, crypto_1.timingSafeEqual)(actual, expected));
112
+ }
113
+ };
114
+ exports.TenantCredentialGuard = TenantCredentialGuard;
115
+ exports.TenantCredentialGuard = TenantCredentialGuard = __decorate([
116
+ (0, common_1.Injectable)(),
117
+ __param(0, (0, typeorm_1.InjectRepository)(client_credential_entity_1.ClientCredential)),
118
+ __metadata("design:paramtypes", [typeorm_2.Repository])
119
+ ], TenantCredentialGuard);
@@ -0,0 +1,7 @@
1
+ export interface RecordWithTenant {
2
+ clientId: number | null;
3
+ }
4
+ export declare class TenantOwnershipService {
5
+ assertOwned<T extends RecordWithTenant>(record: T | null | undefined, clientId: number, resourceName?: string): T;
6
+ assertReadableGlobalOrOwned<T extends RecordWithTenant>(record: T | null | undefined, clientId: number, resourceName?: string): T;
7
+ }