@verii/server-credentialagent 1.0.0-pre.1752076816

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 (395) hide show
  1. package/.localdev.e2e.env +40 -0
  2. package/.localdev.env +41 -0
  3. package/.standalone.env +5 -0
  4. package/LICENSE +202 -0
  5. package/NOTICE +1 -0
  6. package/README.md +19 -0
  7. package/docker/compose.yml +33 -0
  8. package/e2e/README.md +12 -0
  9. package/e2e/org-registration-and-issuing.e2e.test.js +624 -0
  10. package/jest.config.js +20 -0
  11. package/migrate-mongo.config.js +36 -0
  12. package/migrations/20210317133137-add-index-to-offers-repo.js +57 -0
  13. package/migrations/20210416145639-add-index-to-revocation-list.js +27 -0
  14. package/migrations/20210719120225-add_unique_did_index_to_tenant.js +45 -0
  15. package/migrations/20230524053029-add-vendorUserIdMappings-index.js +32 -0
  16. package/migrations/20230616111907-add-configuration-type-index.js +32 -0
  17. package/package.json +108 -0
  18. package/src/assets/public/favicon.ico +0 -0
  19. package/src/assets/public/logo192.png +0 -0
  20. package/src/assets/public/logo512.png +0 -0
  21. package/src/assets/public/manifest.json +28 -0
  22. package/src/assets/templates/app-redirect.hbs +16 -0
  23. package/src/config/config.js +44 -0
  24. package/src/config/core-config.js +143 -0
  25. package/src/config/holder-config.js +104 -0
  26. package/src/config/index.js +22 -0
  27. package/src/config/operator-config.js +64 -0
  28. package/src/controllers/autoload-holder-api-controllers.js +30 -0
  29. package/src/controllers/autoload-operator-api-controllers.js +31 -0
  30. package/src/controllers/autoload-root-api-controller.js +30 -0
  31. package/src/controllers/autoload-saasoperator-api-controllers.js +31 -0
  32. package/src/controllers/holder/autohooks.js +55 -0
  33. package/src/controllers/holder/get-exchange-progress/autohooks.js +27 -0
  34. package/src/controllers/holder/get-exchange-progress/controller.js +50 -0
  35. package/src/controllers/holder/inspect/autohooks.js +35 -0
  36. package/src/controllers/holder/inspect/get-presentation-request/controller.js +100 -0
  37. package/src/controllers/holder/inspect/schemas/holder-disclosure.schema.json +73 -0
  38. package/src/controllers/holder/inspect/schemas/index.js +33 -0
  39. package/src/controllers/holder/inspect/schemas/presentation-definition.v1.schema.json +461 -0
  40. package/src/controllers/holder/inspect/schemas/presentation-request.schema.json +279 -0
  41. package/src/controllers/holder/inspect/schemas/presentation-submission.schema.json +41 -0
  42. package/src/controllers/holder/inspect/schemas/siop-presentation-submission.schema.json +74 -0
  43. package/src/controllers/holder/inspect/schemas/velocity-presentation-submission.response.200.schema.json +36 -0
  44. package/src/controllers/holder/inspect/schemas/velocity-presentation-submission.schema.json +34 -0
  45. package/src/controllers/holder/inspect/submit-presentation/controller.js +89 -0
  46. package/src/controllers/holder/issue/autohooks.js +23 -0
  47. package/src/controllers/holder/issue/get-credential-manifest/controller.js +193 -0
  48. package/src/controllers/holder/issue/offers/autohooks.js +35 -0
  49. package/src/controllers/holder/issue/offers/controller.js +164 -0
  50. package/src/controllers/holder/issue/offers/credential-offers/controller.js +460 -0
  51. package/src/controllers/holder/issue/submit-identification/autohooks.js +37 -0
  52. package/src/controllers/holder/issue/submit-identification/controller.js +63 -0
  53. package/src/controllers/holder/oauth/autohooks.js +19 -0
  54. package/src/controllers/holder/oauth/controller.js +140 -0
  55. package/src/controllers/index.js +22 -0
  56. package/src/controllers/operator/tenants/_tenantId/autohooks.js +40 -0
  57. package/src/controllers/operator/tenants/_tenantId/check-credentials/autohooks.js +24 -0
  58. package/src/controllers/operator/tenants/_tenantId/check-credentials/controller-v0.8.js +200 -0
  59. package/src/controllers/operator/tenants/_tenantId/check-credentials/schemas/index.js +19 -0
  60. package/src/controllers/operator/tenants/_tenantId/check-credentials/schemas/vendor-credential.schema.json +244 -0
  61. package/src/controllers/operator/tenants/_tenantId/controller-v0.8.js +221 -0
  62. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/autohooks.js +30 -0
  63. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/controller-v0.8.js +271 -0
  64. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/autohooks.js +45 -0
  65. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/controller-v0.8.js +199 -0
  66. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/add-feed.schema.js +14 -0
  67. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/feed.schema.json +27 -0
  68. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/index.js +25 -0
  69. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/modify-feed-update-body.schema.js +18 -0
  70. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/modify-feed.schema.json +19 -0
  71. package/src/controllers/operator/tenants/_tenantId/disclosures/autohooks.js +34 -0
  72. package/src/controllers/operator/tenants/_tenantId/disclosures/controller-v0.8.js +100 -0
  73. package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/agent-disclosure-presentation-definition.schema.json +404 -0
  74. package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/agent-disclosure.schema.js +24 -0
  75. package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/index.js +29 -0
  76. package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/new-agent-disclosure.schema.json +166 -0
  77. package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/update-agent-disclosure.schema.js +20 -0
  78. package/src/controllers/operator/tenants/_tenantId/exchanges/_exchangeId/autohooks.js +30 -0
  79. package/src/controllers/operator/tenants/_tenantId/exchanges/_exchangeId/controller-v0.8.js +73 -0
  80. package/src/controllers/operator/tenants/_tenantId/exchanges/autohooks.js +19 -0
  81. package/src/controllers/operator/tenants/_tenantId/exchanges/controller-v0.8.js +150 -0
  82. package/src/controllers/operator/tenants/_tenantId/exchanges/schemas/get-exchange.response.body.json +147 -0
  83. package/src/controllers/operator/tenants/_tenantId/exchanges/schemas/index.js +21 -0
  84. package/src/controllers/operator/tenants/_tenantId/issued-credentials/autohooks.js +27 -0
  85. package/src/controllers/operator/tenants/_tenantId/issued-credentials/controller-v0.8.js +303 -0
  86. package/src/controllers/operator/tenants/_tenantId/issued-credentials/schemas/index.js +23 -0
  87. package/src/controllers/operator/tenants/_tenantId/issued-credentials/schemas/issued-credential.schema.json +115 -0
  88. package/src/controllers/operator/tenants/_tenantId/issued-credentials/schemas/revoke-credentials.schema.json +18 -0
  89. package/src/controllers/operator/tenants/_tenantId/keys/controller-v0.8.js +168 -0
  90. package/src/controllers/operator/tenants/_tenantId/offer-data/controller-v0.8.js +78 -0
  91. package/src/controllers/operator/tenants/_tenantId/offers/autohooks.js +34 -0
  92. package/src/controllers/operator/tenants/_tenantId/offers/controller-v0.8.js +253 -0
  93. package/src/controllers/operator/tenants/_tenantId/offers/schemas/index.js +23 -0
  94. package/src/controllers/operator/tenants/_tenantId/offers/schemas/new-vendor-offer.schema.js +47 -0
  95. package/src/controllers/operator/tenants/_tenantId/offers/schemas/vendor-offer.schema.json +56 -0
  96. package/src/controllers/operator/tenants/_tenantId/users/autohooks.js +24 -0
  97. package/src/controllers/operator/tenants/_tenantId/users/controller-v0.8.js +92 -0
  98. package/src/controllers/operator/tenants/_tenantId/users/schemas/index.js +23 -0
  99. package/src/controllers/operator/tenants/_tenantId/users/schemas/new-user.schema.json +13 -0
  100. package/src/controllers/operator/tenants/_tenantId/users/schemas/user.schema.json +16 -0
  101. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/autohooks.js +34 -0
  102. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/controller-v0.8.js +110 -0
  103. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/Credential.schema.js +18 -0
  104. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/IssueCredentialOptions.schema.json +42 -0
  105. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/IssueCredentialRequest.schema.json +13 -0
  106. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/IssueCredentialResponse.schema.json +19 -0
  107. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/LinkedDataProof.schema.json +43 -0
  108. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/VerifiableCredential.schema.js +16 -0
  109. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/index.js +31 -0
  110. package/src/controllers/operator/tenants/autohooks.js +65 -0
  111. package/src/controllers/operator/tenants/controller-v0.8.js +167 -0
  112. package/src/controllers/operator/tenants/schemas/index.js +41 -0
  113. package/src/controllers/operator/tenants/schemas/modify-secret.schema.json +11 -0
  114. package/src/controllers/operator/tenants/schemas/modify-tenant-v0.8.schema.json +44 -0
  115. package/src/controllers/operator/tenants/schemas/new-tenant-v0.8.schema.json +19 -0
  116. package/src/controllers/operator/tenants/schemas/new-tenant.response.200.schema.json +7 -0
  117. package/src/controllers/operator/tenants/schemas/secret-key-metadata.schema.json +31 -0
  118. package/src/controllers/operator/tenants/schemas/secret-key.schema.json +29 -0
  119. package/src/controllers/operator/tenants/schemas/secret-kid.schema.json +13 -0
  120. package/src/controllers/operator/tenants/schemas/secret-new-tenant-v0.8.schema.json +28 -0
  121. package/src/controllers/operator/tenants/schemas/secret-tenant-key-v0.8.schema.json +13 -0
  122. package/src/controllers/operator/tenants/schemas/tenant-key-v0.8.schema.json +14 -0
  123. package/src/controllers/operator/tenants/schemas/tenant-v0.8.schema.json +62 -0
  124. package/src/controllers/root/autohooks.js +23 -0
  125. package/src/controllers/root/controller.js +173 -0
  126. package/src/controllers/saasoperator/groups/_id/autohooks.js +9 -0
  127. package/src/controllers/saasoperator/groups/_id/controller.js +121 -0
  128. package/src/controllers/saasoperator/groups/autohooks.js +19 -0
  129. package/src/controllers/saasoperator/groups/controller.js +65 -0
  130. package/src/controllers/saasoperator/groups/schemas/group.schema.js +17 -0
  131. package/src/controllers/saasoperator/groups/schemas/index.js +4 -0
  132. package/src/controllers/saasoperator/groups/schemas/new-group.schema.js +13 -0
  133. package/src/entities/common/domains/get-json-at-path.js +28 -0
  134. package/src/entities/common/domains/index.js +17 -0
  135. package/src/entities/common/index.js +17 -0
  136. package/src/entities/credentials/domains/credential-format.js +22 -0
  137. package/src/entities/credentials/domains/index.js +19 -0
  138. package/src/entities/credentials/index.js +17 -0
  139. package/src/entities/deep-links/domains/extract-did.js +11 -0
  140. package/src/entities/deep-links/domains/index.js +20 -0
  141. package/src/entities/deep-links/domains/velocity-protocol-uri-to-http-uri.js +32 -0
  142. package/src/entities/deep-links/index.js +19 -0
  143. package/src/entities/disclosures/domains/assert-disclosure-active.js +21 -0
  144. package/src/entities/disclosures/domains/compute-disclosure-configuration-type.js +29 -0
  145. package/src/entities/disclosures/domains/constants.js +61 -0
  146. package/src/entities/disclosures/domains/errors.js +34 -0
  147. package/src/entities/disclosures/domains/get-disclosure-configuration-type.js +60 -0
  148. package/src/entities/disclosures/domains/index.js +32 -0
  149. package/src/entities/disclosures/domains/is-issuing-disclosure.js +23 -0
  150. package/src/entities/disclosures/domains/parse-body-to-disclosure.js +17 -0
  151. package/src/entities/disclosures/domains/validate-by-identification-method.js +69 -0
  152. package/src/entities/disclosures/domains/validate-commercial-entity.js +26 -0
  153. package/src/entities/disclosures/domains/validate-disclosure-by-configuration-type.js +47 -0
  154. package/src/entities/disclosures/domains/validate-disclosure-default-issuing.js +77 -0
  155. package/src/entities/disclosures/domains/validate-disclosure.js +37 -0
  156. package/src/entities/disclosures/domains/validate-feed.js +16 -0
  157. package/src/entities/disclosures/domains/validate-presentation-definition.js +54 -0
  158. package/src/entities/disclosures/domains/validate-vendor-endpoint.js +22 -0
  159. package/src/entities/disclosures/domains/validate-vendor-webhook.js +18 -0
  160. package/src/entities/disclosures/factories/disclosure-factory.js +94 -0
  161. package/src/entities/disclosures/factories/index.js +19 -0
  162. package/src/entities/disclosures/index.js +22 -0
  163. package/src/entities/disclosures/orchestrators/get-disclosure.js +18 -0
  164. package/src/entities/disclosures/orchestrators/index.js +20 -0
  165. package/src/entities/disclosures/orchestrators/update-disclosure-configuration-type.js +32 -0
  166. package/src/entities/disclosures/repos/index.js +20 -0
  167. package/src/entities/disclosures/repos/repo.js +118 -0
  168. package/src/entities/disclosures/repos/set-configuration-type.js +33 -0
  169. package/src/entities/exchanges/adapters/index.js +17 -0
  170. package/src/entities/exchanges/adapters/sign-exchange-response.js +45 -0
  171. package/src/entities/exchanges/domains/build-exchange-progress.js +56 -0
  172. package/src/entities/exchanges/domains/constants.js +24 -0
  173. package/src/entities/exchanges/domains/ensure-exchange-state-valid.js +35 -0
  174. package/src/entities/exchanges/domains/errors.js +33 -0
  175. package/src/entities/exchanges/domains/index.js +25 -0
  176. package/src/entities/exchanges/domains/states.js +43 -0
  177. package/src/entities/exchanges/domains/types.js +31 -0
  178. package/src/entities/exchanges/factories/disclosure-exchange-factory.js +46 -0
  179. package/src/entities/exchanges/factories/index.js +20 -0
  180. package/src/entities/exchanges/factories/offer-exchange-factory.js +48 -0
  181. package/src/entities/exchanges/index.js +23 -0
  182. package/src/entities/exchanges/orchestrators/build-exchange-request-deep-link.js +50 -0
  183. package/src/entities/exchanges/orchestrators/index.js +19 -0
  184. package/src/entities/exchanges/repos/exchange-repo-projections.js +45 -0
  185. package/src/entities/exchanges/repos/exchange-state-repo-extension.js +76 -0
  186. package/src/entities/exchanges/repos/index.js +20 -0
  187. package/src/entities/exchanges/repos/repo.js +44 -0
  188. package/src/entities/feeds/factories/feed-factory.js +47 -0
  189. package/src/entities/feeds/factories/index.js +19 -0
  190. package/src/entities/feeds/index.js +20 -0
  191. package/src/entities/feeds/repos/index.js +19 -0
  192. package/src/entities/feeds/repos/repo.js +95 -0
  193. package/src/entities/groups/domains/format-group.js +11 -0
  194. package/src/entities/groups/domains/index.js +3 -0
  195. package/src/entities/groups/factories/group-factory.js +40 -0
  196. package/src/entities/groups/factories/index.js +19 -0
  197. package/src/entities/groups/index.js +22 -0
  198. package/src/entities/groups/orchestrators/find-group-or-error.js +16 -0
  199. package/src/entities/groups/orchestrators/index.js +6 -0
  200. package/src/entities/groups/orchestrators/validate-did.js +24 -0
  201. package/src/entities/groups/orchestrators/validate-group-by-user.js +16 -0
  202. package/src/entities/groups/orchestrators/validate-group.js +39 -0
  203. package/src/entities/groups/repos/delete-tenant-extension.js +13 -0
  204. package/src/entities/groups/repos/index.js +19 -0
  205. package/src/entities/groups/repos/repo.js +38 -0
  206. package/src/entities/groups/repos/update-or-error-extension.js +46 -0
  207. package/src/entities/index.js +37 -0
  208. package/src/entities/keys/domains/constants.js +37 -0
  209. package/src/entities/keys/domains/index.js +21 -0
  210. package/src/entities/keys/domains/is-matching-private-key-kid.js +41 -0
  211. package/src/entities/keys/domains/validate-key.js +62 -0
  212. package/src/entities/keys/factories/index.js +19 -0
  213. package/src/entities/keys/factories/key-factory.js +56 -0
  214. package/src/entities/keys/index.js +22 -0
  215. package/src/entities/keys/orchestrators/index.js +3 -0
  216. package/src/entities/keys/orchestrators/validate-did-doc-keys.js +69 -0
  217. package/src/entities/metadata-list-allocations/index.js +19 -0
  218. package/src/entities/metadata-list-allocations/repos/index.js +19 -0
  219. package/src/entities/metadata-list-allocations/repos/repo.js +40 -0
  220. package/src/entities/notifications/domains/index.js +19 -0
  221. package/src/entities/notifications/domains/notification-types.js +25 -0
  222. package/src/entities/notifications/index.js +19 -0
  223. package/src/entities/offers/domains/build-clean-pii-filter.js +35 -0
  224. package/src/entities/offers/domains/build-deeplink-url.js +120 -0
  225. package/src/entities/offers/domains/build-offer.js +88 -0
  226. package/src/entities/offers/domains/build-qr-code-url.js +37 -0
  227. package/src/entities/offers/domains/constants.js +32 -0
  228. package/src/entities/offers/domains/filter-object-ids.js +34 -0
  229. package/src/entities/offers/domains/generate-issuing-challenge.js +26 -0
  230. package/src/entities/offers/domains/generate-link-code.js +35 -0
  231. package/src/entities/offers/domains/index.js +31 -0
  232. package/src/entities/offers/domains/post-validation-offers-handler.js +31 -0
  233. package/src/entities/offers/domains/prepare-linked-credentials-for-holder.js +36 -0
  234. package/src/entities/offers/domains/resolve-subject.js +142 -0
  235. package/src/entities/offers/domains/validate-offer-commercial-entity.js +24 -0
  236. package/src/entities/offers/domains/validate-offer.js +90 -0
  237. package/src/entities/offers/factories/index.js +19 -0
  238. package/src/entities/offers/factories/offer-factory.js +119 -0
  239. package/src/entities/offers/index.js +22 -0
  240. package/src/entities/offers/orchestrators/create-verifiable-credentials.js +131 -0
  241. package/src/entities/offers/orchestrators/finalize-exchange.js +44 -0
  242. package/src/entities/offers/orchestrators/index.js +23 -0
  243. package/src/entities/offers/orchestrators/load-credential-refs.js +57 -0
  244. package/src/entities/offers/orchestrators/load-credential-types-map.js +44 -0
  245. package/src/entities/offers/orchestrators/prepare-offers.js +35 -0
  246. package/src/entities/offers/orchestrators/trigger-issued-credentials-webhook.js +63 -0
  247. package/src/entities/offers/repos/clean-pii-extension.js +85 -0
  248. package/src/entities/offers/repos/index.js +20 -0
  249. package/src/entities/offers/repos/issued-credential-projection.js +44 -0
  250. package/src/entities/offers/repos/repo.js +177 -0
  251. package/src/entities/presentations/domains/build-identity-doc.js +120 -0
  252. package/src/entities/presentations/domains/build-request-response-schema.js +46 -0
  253. package/src/entities/presentations/domains/build-vendor-data.js +31 -0
  254. package/src/entities/presentations/domains/check-payment-requirement.js +30 -0
  255. package/src/entities/presentations/domains/errors.js +28 -0
  256. package/src/entities/presentations/domains/extract-fields-from-id-credential.js +35 -0
  257. package/src/entities/presentations/domains/index.js +26 -0
  258. package/src/entities/presentations/domains/merge-credential-check-results.js +24 -0
  259. package/src/entities/presentations/domains/validate-presentation.js +128 -0
  260. package/src/entities/presentations/index.js +20 -0
  261. package/src/entities/presentations/orchestrators/create-presentation-request.js +148 -0
  262. package/src/entities/presentations/orchestrators/deduplicate-disclosure-exchange.js +52 -0
  263. package/src/entities/presentations/orchestrators/handle-presentation-submission.js +47 -0
  264. package/src/entities/presentations/orchestrators/index.js +20 -0
  265. package/src/entities/presentations/orchestrators/match-identity-on-exchange.js +114 -0
  266. package/src/entities/presentations/orchestrators/share-identification-credentials.js +110 -0
  267. package/src/entities/presentations/orchestrators/share-presentation.js +234 -0
  268. package/src/entities/push-delegate/get-push-delegate.js +37 -0
  269. package/src/entities/push-delegate/index.js +17 -0
  270. package/src/entities/redirect/index.js +3 -0
  271. package/src/entities/redirect/orchestrators/index.js +3 -0
  272. package/src/entities/redirect/orchestrators/load-org-info.js +40 -0
  273. package/src/entities/revocation-list-allocations/index.js +19 -0
  274. package/src/entities/revocation-list-allocations/repos/index.js +19 -0
  275. package/src/entities/revocation-list-allocations/repos/repo.js +40 -0
  276. package/src/entities/schemas/index.js +19 -0
  277. package/src/entities/schemas/orchestrators/index.js +19 -0
  278. package/src/entities/schemas/orchestrators/load-schema-validation.js +73 -0
  279. package/src/entities/tenants/domains/build-service-ids.js +27 -0
  280. package/src/entities/tenants/domains/extract-service.js +27 -0
  281. package/src/entities/tenants/domains/index.js +21 -0
  282. package/src/entities/tenants/domains/validate-service-ids.js +35 -0
  283. package/src/entities/tenants/factories/index.js +19 -0
  284. package/src/entities/tenants/factories/tenant-factory.js +37 -0
  285. package/src/entities/tenants/index.js +22 -0
  286. package/src/entities/tenants/orchestrators/add-primary-address-to-tenant.js +47 -0
  287. package/src/entities/tenants/orchestrators/create-tenant.js +91 -0
  288. package/src/entities/tenants/orchestrators/index.js +22 -0
  289. package/src/entities/tenants/orchestrators/refresh-tenant-dids.js +146 -0
  290. package/src/entities/tenants/orchestrators/set-tenant-default-issuing-disclosure.js +31 -0
  291. package/src/entities/tenants/repos/index.js +20 -0
  292. package/src/entities/tenants/repos/insert-tenant-extension.js +33 -0
  293. package/src/entities/tenants/repos/repo.js +52 -0
  294. package/src/entities/tenants/repos/tenant-default-projection.js +33 -0
  295. package/src/entities/tokens/adapters/access-token.js +49 -0
  296. package/src/entities/tokens/adapters/index.js +19 -0
  297. package/src/entities/tokens/index.js +19 -0
  298. package/src/entities/users/factories/index.js +19 -0
  299. package/src/entities/users/factories/user-factory.js +36 -0
  300. package/src/entities/users/index.js +20 -0
  301. package/src/entities/users/repos/add-anonymous-user-repo-extension.js +23 -0
  302. package/src/entities/users/repos/find-or-insert-vendor-user-repo-extension.js +30 -0
  303. package/src/entities/users/repos/index.js +19 -0
  304. package/src/entities/users/repos/repo.js +50 -0
  305. package/src/fetchers/index.js +20 -0
  306. package/src/fetchers/operator/identify-fetcher.js +36 -0
  307. package/src/fetchers/operator/index.js +21 -0
  308. package/src/fetchers/operator/inspection-fetcher.js +35 -0
  309. package/src/fetchers/operator/issuing-fetcher.js +50 -0
  310. package/src/fetchers/operator/webhook-auth-header.js +45 -0
  311. package/src/fetchers/push-gateway/generate-push-gateway-token.js +40 -0
  312. package/src/fetchers/push-gateway/index.js +19 -0
  313. package/src/fetchers/push-gateway/push-fetcher.js +39 -0
  314. package/src/index.js +19 -0
  315. package/src/init-holder-server.js +108 -0
  316. package/src/init-operator-server.js +101 -0
  317. package/src/init-server.js +120 -0
  318. package/src/main-holder.js +18 -0
  319. package/src/main-operator.js +19 -0
  320. package/src/main.js +18 -0
  321. package/src/plugins/autoload-repos.js +28 -0
  322. package/src/plugins/disclosure-loader-plugin.js +56 -0
  323. package/src/plugins/ensure-disclosure-active-plugin.js +30 -0
  324. package/src/plugins/ensure-disclosure-configuration-type-plugin.js +29 -0
  325. package/src/plugins/ensure-tenant-default-issuing-disclosure-id-plugin.js +60 -0
  326. package/src/plugins/ensure-tenant-primary-address-plugin.js +44 -0
  327. package/src/plugins/exchange-error-handler-plugin.js +51 -0
  328. package/src/plugins/exchange-loader-plugin.js +50 -0
  329. package/src/plugins/group-loader-plugin.js +51 -0
  330. package/src/plugins/index.js +32 -0
  331. package/src/plugins/kms-plugin.js +57 -0
  332. package/src/plugins/tenant-loader-plugin.js +91 -0
  333. package/src/plugins/validate-cao-plugin.js +81 -0
  334. package/src/plugins/vendor-routes-auth-plugin.js +24 -0
  335. package/src/plugins/verify-access-token-plugin.js +88 -0
  336. package/src/standalone.js +24 -0
  337. package/src/start-app-server.js +38 -0
  338. package/test/combined/app-redirect.test.js +199 -0
  339. package/test/combined/helpers/credentialagent-build-fastify.js +29 -0
  340. package/test/combined/helpers/index.js +22 -0
  341. package/test/combined/helpers/nock-registrar-app-schema-name.js +50 -0
  342. package/test/combined/helpers/nock-registrar-get-organization-diddoc.js +26 -0
  343. package/test/combined/helpers/nock-registrar-get-organization-verified-profile.js +33 -0
  344. package/test/combined/manifest.json.test.js +55 -0
  345. package/test/combined/root-controller.test.js +42 -0
  346. package/test/combined/schemas/education-degree.schema.json +166 -0
  347. package/test/combined/schemas/employment-current-v1.1.schema.json +253 -0
  348. package/test/combined/schemas/open-badge-credential.schema.json +1285 -0
  349. package/test/combined/schemas/past-employment-position-with-uri-id.schema.js +22 -0
  350. package/test/combined/schemas/past-employment-position.schema.json +148 -0
  351. package/test/combined/schemas/will-always-validate.json +10 -0
  352. package/test/combined/validate-cao-plugin.test.js +155 -0
  353. package/test/get-push-delegate.test.js +54 -0
  354. package/test/helpers/jwt-vc-expectation.js +109 -0
  355. package/test/holder/build-request-response-schema.test.js +55 -0
  356. package/test/holder/credential-manifest-controller.test.js +3192 -0
  357. package/test/holder/e2e-issuing-controller.test.js +425 -0
  358. package/test/holder/get-exchange-progress-controller.test.js +521 -0
  359. package/test/holder/get-presentation-request.test.js +906 -0
  360. package/test/holder/helpers/credential-type-metadata.js +98 -0
  361. package/test/holder/helpers/credentialagent-holder-build-fastify.js +32 -0
  362. package/test/holder/helpers/generate-presentation.js +441 -0
  363. package/test/holder/helpers/generate-test-access-token.js +54 -0
  364. package/test/holder/helpers/jwt-access-token-expectation.js +32 -0
  365. package/test/holder/helpers/jwt-vc-expectation.js +115 -0
  366. package/test/holder/issuing-controller.test.js +7076 -0
  367. package/test/holder/oauth-token-controller.test.js +412 -0
  368. package/test/holder/presentation-submission.test.js +2365 -0
  369. package/test/holder/submit-identification.test.js +4815 -0
  370. package/test/operator/check-credentials-controller-v0.8.test.js +832 -0
  371. package/test/operator/credentials-revoke.test.js +536 -0
  372. package/test/operator/disclosures-controller-v0.8.test.js +4157 -0
  373. package/test/operator/exchanges-controller-v0.8.test.js +414 -0
  374. package/test/operator/exchanges-id-controller-v0.8.test.js +162 -0
  375. package/test/operator/feeds-controller-v0.8.test.js +659 -0
  376. package/test/operator/generate-push-gateway-token.test.js +116 -0
  377. package/test/operator/groups-controller.test.js +145 -0
  378. package/test/operator/groups-id-controller.test.js +287 -0
  379. package/test/operator/helpers/create-test-org-doc.js +60 -0
  380. package/test/operator/helpers/credentialagent-operator-build-fastify.js +32 -0
  381. package/test/operator/helpers/find-kms-key.js +31 -0
  382. package/test/operator/helpers/generate-primary-and-add-operator-to-primary.js +63 -0
  383. package/test/operator/helpers/init-agent-kms.js +22 -0
  384. package/test/operator/issued-credentials-controller-v0.8.test.js +398 -0
  385. package/test/operator/keys-controller-v0.8.test.js +1130 -0
  386. package/test/operator/offer-data-controller-v0.8.test.js +253 -0
  387. package/test/operator/offers-controller-v0.8.test.js +3026 -0
  388. package/test/operator/set-configuration-type-modifier.test.js +75 -0
  389. package/test/operator/swagger.test.js +37 -0
  390. package/test/operator/tenant-controller-v0.8.test.js +730 -0
  391. package/test/operator/tenant-loader-plugin.test.js +96 -0
  392. package/test/operator/tenants-controller-v0.8.test.js +2093 -0
  393. package/test/operator/users-controller-v0.8.test.js +137 -0
  394. package/test/operator/vc-api-credentials.test.js +963 -0
  395. package/verification.env +28 -0
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Copyright 2023 Velocity Team
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ const { split, last, first } = require('lodash/fp');
18
+ const { jwtDecode, jwtSign, jwtVerify } = require('@verii/jwt');
19
+ const {
20
+ KeyPurposes,
21
+ generateKeyPair,
22
+ createCommitment,
23
+ } = require('@verii/crypto');
24
+ const {
25
+ generatePushGatewayToken,
26
+ } = require('../../src/fetchers/push-gateway/generate-push-gateway-token');
27
+
28
+ describe('Generate authorization token for push gateway', () => {
29
+ const { privateKey, publicKey } = generateKeyPair({ format: 'jwk' });
30
+ const oracleUrl = 'https://oracle.vnf';
31
+ const pushUrl = 'https:/push.oracle.vnf/push';
32
+ const pushUrlOrigin = new URL(pushUrl).origin;
33
+ const traceId = '123';
34
+ const did = 'did:velocity:123';
35
+ const kidFragment = '#key-1';
36
+ const exchangeId = '234';
37
+ const body = {
38
+ testUndefined: undefined,
39
+ data: {
40
+ exchangeId,
41
+ },
42
+ };
43
+ const context = {
44
+ tenant: { did, _id: '321' },
45
+ traceId,
46
+ tenantKeysByPurpose: { [KeyPurposes.EXCHANGES]: { kidFragment } },
47
+ config: { oracleUrl },
48
+ kms: {
49
+ signJwt: (payload, keyId, headers) =>
50
+ jwtSign(payload, privateKey, headers),
51
+ },
52
+ };
53
+
54
+ it('Verify jwt token payload, header and hash of push gateway params', async () => {
55
+ const authHeader = await generatePushGatewayToken(body, pushUrl, context);
56
+
57
+ const token = last(split('Bearer ', authHeader));
58
+ const decodedToken = jwtDecode(token);
59
+ const {
60
+ payload: { hash },
61
+ } = decodedToken;
62
+
63
+ expect(hash).toEqual(createCommitment(JSON.stringify(body)));
64
+ expect(decodedToken).toEqual({
65
+ header: {
66
+ alg: 'ES256K',
67
+ kid: `${did}${kidFragment}`,
68
+ typ: 'JWT',
69
+ },
70
+ payload: {
71
+ aud: pushUrlOrigin,
72
+ hash,
73
+ iss: did,
74
+ jti: traceId,
75
+ sub: exchangeId,
76
+ iat: expect.any(Number),
77
+ nbf: expect.any(Number),
78
+ exp: expect.any(Number),
79
+ },
80
+ });
81
+ });
82
+
83
+ it('Verify jwt token signature and claims', async () => {
84
+ const authHeader = await generatePushGatewayToken(body, pushUrl, context);
85
+
86
+ const token = last(split('Bearer ', authHeader));
87
+ const decodedToken = jwtDecode(token);
88
+ const {
89
+ header: { kid },
90
+ } = decodedToken;
91
+ await jwtVerify(token, publicKey, {
92
+ issuer: first(split('#', kid)),
93
+ audience: pushUrlOrigin,
94
+ jti: traceId,
95
+ subject: exchangeId,
96
+ });
97
+ });
98
+
99
+ it('Verify jwt token fails if an invalid aud claim', async () => {
100
+ const authHeader = await generatePushGatewayToken(body, pushUrl, context);
101
+
102
+ const token = last(split('Bearer ', authHeader));
103
+ const decodedToken = jwtDecode(token);
104
+ const {
105
+ header: { kid },
106
+ } = decodedToken;
107
+ await expect(() =>
108
+ jwtVerify(token, publicKey, {
109
+ issuer: first(split('#', kid)),
110
+ audience: 'https:/oracle.vnf',
111
+ jti: traceId,
112
+ subject: exchangeId,
113
+ })
114
+ ).rejects.toThrow();
115
+ });
116
+ });
@@ -0,0 +1,145 @@
1
+ const { mongoDb } = require('@spencejs/spence-mongo-repos');
2
+ const { omit } = require('lodash/fp');
3
+ const { errorResponseMatcher } = require('@verii/tests-helpers');
4
+ const buildFastify = require('./helpers/credentialagent-operator-build-fastify');
5
+ const { initGroupsFactory } = require('../../src/entities');
6
+
7
+ const groupUrl = '/groups/';
8
+
9
+ const groupMatcher = (group) => ({
10
+ ...omit(['_id'], group),
11
+ did: group._id,
12
+ id: group._id,
13
+ createdAt: expect.any(String),
14
+ updatedAt: expect.any(String),
15
+ });
16
+
17
+ describe('Groups controller test suite', () => {
18
+ let fastify;
19
+ let persistGroup;
20
+
21
+ beforeAll(async () => {
22
+ fastify = buildFastify({
23
+ clientSecret: 'abc',
24
+ });
25
+ await fastify.ready();
26
+
27
+ ({ persistGroup } = initGroupsFactory(fastify));
28
+ });
29
+
30
+ beforeEach(async () => {
31
+ await mongoDb().collection('groups').deleteMany({});
32
+ });
33
+
34
+ afterAll(async () => {
35
+ await fastify.close();
36
+ });
37
+
38
+ describe('GET /groups', () => {
39
+ it('should return all groups', async () => {
40
+ const group1 = await persistGroup();
41
+ const group2 = await persistGroup();
42
+
43
+ const response = await fastify.inject({
44
+ method: 'GET',
45
+ url: groupUrl,
46
+ });
47
+
48
+ expect(response.statusCode).toBe(200);
49
+ expect(response.json()).toEqual({
50
+ groups: [groupMatcher(group2), groupMatcher(group1)],
51
+ });
52
+ });
53
+
54
+ it('should return empty response', async () => {
55
+ const response = await fastify.inject({
56
+ method: 'GET',
57
+ url: groupUrl,
58
+ });
59
+
60
+ expect(response.statusCode).toBe(200);
61
+ expect(response.json()).toEqual({
62
+ groups: [],
63
+ });
64
+ });
65
+ });
66
+ describe('POST /groups', () => {
67
+ it('should create a group', async () => {
68
+ const group = {
69
+ slug: 'test-group',
70
+ did: 'did:example:123',
71
+ };
72
+
73
+ const response = await fastify.inject({
74
+ method: 'POST',
75
+ url: groupUrl,
76
+ payload: group,
77
+ });
78
+
79
+ expect(response.statusCode).toBe(200);
80
+ expect(response.json()).toEqual({
81
+ group: {
82
+ id: group.did,
83
+ did: group.did,
84
+ slug: group.slug,
85
+ createdAt: expect.any(String),
86
+ updatedAt: expect.any(String),
87
+ },
88
+ });
89
+ });
90
+
91
+ it('should return error if slug already exists', async () => {
92
+ const group = {
93
+ slug: 'test-group',
94
+ did: 'did:example:123',
95
+ };
96
+
97
+ await persistGroup(group);
98
+
99
+ const response = await fastify.inject({
100
+ method: 'POST',
101
+ url: groupUrl,
102
+ payload: group,
103
+ });
104
+
105
+ expect(response.statusCode).toBe(400);
106
+ expect(response.json()).toEqual(
107
+ errorResponseMatcher({
108
+ error: 'Bad Request',
109
+ errorCode: 'slug_already_exist',
110
+ message: 'Group with the given SLUG already exists',
111
+ statusCode: 400,
112
+ })
113
+ );
114
+ });
115
+
116
+ it('should return error if did already exists', async () => {
117
+ const did = 'did:example:123';
118
+ const group = {
119
+ slug: 'test-group',
120
+ did,
121
+ };
122
+
123
+ await persistGroup({ ...group, _id: did });
124
+
125
+ const response = await fastify.inject({
126
+ method: 'POST',
127
+ url: groupUrl,
128
+ payload: {
129
+ ...group,
130
+ slug: 'test-group-2',
131
+ },
132
+ });
133
+
134
+ expect(response.statusCode).toBe(400);
135
+ expect(response.json()).toEqual(
136
+ errorResponseMatcher({
137
+ error: 'Bad Request',
138
+ errorCode: 'did_already_exist',
139
+ message: 'Group with the given DID already exists',
140
+ statusCode: 400,
141
+ })
142
+ );
143
+ });
144
+ });
145
+ });
@@ -0,0 +1,287 @@
1
+ const { mongoDb } = require('@spencejs/spence-mongo-repos');
2
+ const { omit } = require('lodash/fp');
3
+ const { errorResponseMatcher } = require('@verii/tests-helpers');
4
+ const buildFastify = require('./helpers/credentialagent-operator-build-fastify');
5
+ const { initGroupsFactory, groupRepoPlugin } = require('../../src/entities');
6
+
7
+ const groupUrl = '/groups/';
8
+
9
+ const groupMatcher = (group) => ({
10
+ ...omit(['_id'], group),
11
+ did: group._id.toString(),
12
+ id: group._id.toString(),
13
+ createdAt: expect.any(String),
14
+ updatedAt: expect.any(String),
15
+ });
16
+
17
+ describe('Groups controller test suite', () => {
18
+ let fastify;
19
+ let persistGroup;
20
+ let groupRepo;
21
+
22
+ beforeAll(async () => {
23
+ fastify = buildFastify();
24
+ await fastify.ready();
25
+
26
+ ({ persistGroup } = initGroupsFactory(fastify));
27
+
28
+ groupRepo = groupRepoPlugin({})(fastify);
29
+ });
30
+
31
+ beforeEach(async () => {
32
+ await mongoDb().collection('groups').deleteMany({});
33
+ });
34
+
35
+ afterAll(async () => {
36
+ await fastify.close();
37
+ });
38
+
39
+ describe('GET /groups/:id', () => {
40
+ it('should throw error if a group not found', async () => {
41
+ const response = await fastify.inject({
42
+ method: 'GET',
43
+ url: `${groupUrl}123`,
44
+ });
45
+ expect(response.statusCode).toEqual(404);
46
+ expect(response.json()).toEqual(
47
+ errorResponseMatcher({
48
+ error: 'Not Found',
49
+ errorCode: 'group_does_not_exist',
50
+ message: 'Group does not exist',
51
+ statusCode: 404,
52
+ })
53
+ );
54
+ });
55
+ it('should return a group', async () => {
56
+ const group = await persistGroup({
57
+ slug: 'test-group',
58
+ did: 'did:example:123',
59
+ });
60
+ const response = await fastify.inject({
61
+ method: 'GET',
62
+ url: `${groupUrl}${group._id.toString()}`,
63
+ });
64
+ expect(response.statusCode).toEqual(200);
65
+ expect(response.json()).toEqual({
66
+ group: groupMatcher(group),
67
+ });
68
+ });
69
+ });
70
+ describe('PUT /groups/:id', () => {
71
+ it('should throw error if a group not found', async () => {
72
+ const response = await fastify.inject({
73
+ method: 'PUT',
74
+ url: `${groupUrl}123`,
75
+ body: {
76
+ slug: 'new-slug',
77
+ did: 'did:example:123',
78
+ },
79
+ });
80
+ expect(response.statusCode).toEqual(404);
81
+ expect(response.json()).toEqual(
82
+ errorResponseMatcher({
83
+ error: 'Not Found',
84
+ errorCode: 'group_does_not_exist',
85
+ message: 'Group does not exist',
86
+ statusCode: 404,
87
+ })
88
+ );
89
+ });
90
+ it('should throw error if a slug already exists', async () => {
91
+ await persistGroup({
92
+ slug: 'new-test-group',
93
+ });
94
+ const group = await persistGroup({
95
+ slug: 'test-group',
96
+ _id: 'did:example:123',
97
+ });
98
+ const response = await fastify.inject({
99
+ method: 'PUT',
100
+ url: `${groupUrl}${group._id.toString()}`,
101
+ body: {
102
+ ...group,
103
+ slug: 'new-test-group',
104
+ },
105
+ });
106
+ expect(response.statusCode).toEqual(400);
107
+ expect(response.json()).toEqual(
108
+ errorResponseMatcher({
109
+ error: 'Bad Request',
110
+ errorCode: 'slug_already_exist',
111
+ message: 'Group with the given SLUG already exists',
112
+ statusCode: 400,
113
+ })
114
+ );
115
+ });
116
+ it('should update a group', async () => {
117
+ const group = await persistGroup({
118
+ slug: 'test-group',
119
+ _id: 'did:example:123',
120
+ });
121
+ const response = await fastify.inject({
122
+ method: 'PUT',
123
+ url: `${groupUrl}${group._id.toString()}`,
124
+ payload: {
125
+ slug: 'new-slug',
126
+ },
127
+ });
128
+ expect(response.statusCode).toEqual(200);
129
+ expect(response.json()).toEqual({
130
+ group: groupMatcher({ ...group, slug: 'new-slug' }),
131
+ });
132
+
133
+ const groupDb = await groupRepo.findById(group._id);
134
+ expect(groupDb).toEqual({
135
+ ...group,
136
+ slug: 'new-slug',
137
+ _id: expect.anything(),
138
+ createdAt: expect.anything(),
139
+ updatedAt: expect.anything(),
140
+ });
141
+ });
142
+ });
143
+ describe('DELETE /groups/:id', () => {
144
+ it('should throw error if a group not found', async () => {
145
+ const response = await fastify.inject({
146
+ method: 'DELETE',
147
+ url: `${groupUrl}123`,
148
+ });
149
+ expect(response.statusCode).toEqual(404);
150
+ expect(response.json()).toEqual(
151
+ errorResponseMatcher({
152
+ error: 'Not Found',
153
+ errorCode: 'group_does_not_exist',
154
+ message: 'Group does not exist',
155
+ statusCode: 404,
156
+ })
157
+ );
158
+ });
159
+ it('should throw error if a group has tenants', async () => {
160
+ const group = await persistGroup({
161
+ slug: 'test-group',
162
+ _id: 'did:example:123',
163
+ dids: ['did:example:456'],
164
+ });
165
+ const response = await fastify.inject({
166
+ method: 'DELETE',
167
+ url: `${groupUrl}${group._id}`,
168
+ });
169
+ expect(response.statusCode).toEqual(400);
170
+ expect(response.json()).toEqual(
171
+ errorResponseMatcher({
172
+ error: 'Bad Request',
173
+ errorCode: 'group_has_tenants',
174
+ message: 'Group has tenants associated with it',
175
+ statusCode: 400,
176
+ })
177
+ );
178
+ });
179
+ it('should delete a group', async () => {
180
+ const group = await persistGroup({
181
+ slug: 'test-group',
182
+ _id: 'did:example:123',
183
+ });
184
+ const response = await fastify.inject({
185
+ method: 'DELETE',
186
+ url: `${groupUrl}${group._id}`,
187
+ });
188
+ expect(response.statusCode).toEqual(204);
189
+
190
+ const groupDb = await groupRepo.findOne({
191
+ filter: {
192
+ _id: group._id,
193
+ },
194
+ });
195
+ expect(groupDb).toBeNull();
196
+ });
197
+ });
198
+
199
+ describe('POST /groups/:id/add-did', () => {
200
+ it('should throw error if a group not found', async () => {
201
+ const response = await fastify.inject({
202
+ method: 'POST',
203
+ url: `${groupUrl}123/add-did`,
204
+ body: {
205
+ did: 'did:example:123',
206
+ },
207
+ });
208
+ expect(response.statusCode).toEqual(404);
209
+ expect(response.json()).toEqual(
210
+ errorResponseMatcher({
211
+ error: 'Not Found',
212
+ errorCode: 'group_does_not_exist',
213
+ message: 'Group does not exist',
214
+ statusCode: 404,
215
+ })
216
+ );
217
+ const groupDb = await groupRepo.count({ filter: {} });
218
+ expect(groupDb).toBe(0);
219
+ });
220
+ it('should throw error if a did already linked', async () => {
221
+ await persistGroup({
222
+ dids: ['did:linked:123'],
223
+ });
224
+ const group = await persistGroup({
225
+ _id: 'did:example:123',
226
+ });
227
+ const response = await fastify.inject({
228
+ method: 'POST',
229
+ url: `${groupUrl}${group._id.toString()}/add-did`,
230
+ body: {
231
+ did: 'did:linked:123',
232
+ },
233
+ });
234
+ expect(response.statusCode).toEqual(400);
235
+ expect(response.json()).toEqual(
236
+ errorResponseMatcher({
237
+ error: 'Bad Request',
238
+ errorCode: 'did_already_in_group',
239
+ message: 'Did already linked to a group',
240
+ statusCode: 400,
241
+ })
242
+ );
243
+ });
244
+ it('should add a did to a group if a did already linked to the same group', async () => {
245
+ const group = await persistGroup({
246
+ dids: ['did:linked:123', 'did:linked:124', 'did:linked:125'],
247
+ });
248
+ const response = await fastify.inject({
249
+ method: 'POST',
250
+ url: `${groupUrl}${group._id.toString()}/add-did`,
251
+ body: {
252
+ did: 'did:linked:124',
253
+ },
254
+ });
255
+ expect(response.statusCode).toEqual(204);
256
+ const groupDb = await groupRepo.findById(group._id);
257
+ expect(groupDb).toEqual({
258
+ ...group,
259
+ _id: expect.anything(),
260
+ dids: ['did:linked:123', 'did:linked:124', 'did:linked:125'],
261
+ createdAt: expect.anything(),
262
+ updatedAt: expect.anything(),
263
+ });
264
+ });
265
+ it('should add a did to a group', async () => {
266
+ const group = await persistGroup({
267
+ _id: 'did:example:123',
268
+ });
269
+ const response = await fastify.inject({
270
+ method: 'POST',
271
+ url: `${groupUrl}${group._id.toString()}/add-did`,
272
+ payload: {
273
+ did: 'did:linked:123',
274
+ },
275
+ });
276
+ expect(response.statusCode).toEqual(204);
277
+ const groupDb = await groupRepo.findById(group._id);
278
+ expect(groupDb).toEqual({
279
+ ...group,
280
+ _id: expect.anything(),
281
+ dids: ['did:linked:123'],
282
+ createdAt: expect.anything(),
283
+ updatedAt: expect.anything(),
284
+ });
285
+ });
286
+ });
287
+ });
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Copyright 2023 Velocity Team
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ const { generateKeyPair } = require('@verii/crypto');
18
+ const { jwkFromSecp256k1Key } = require('@verii/jwt');
19
+ const { nanoid } = require('nanoid/non-secure');
20
+
21
+ const createOrgDoc = async () => {
22
+ const { privateKey, publicKey } = generateKeyPair();
23
+ const publicKeyJwk = jwkFromSecp256k1Key(publicKey, false);
24
+ const key = {
25
+ id: '#velocity-key-1',
26
+ publicKeyJwk,
27
+ algorithm: 'SECP256K1',
28
+ encoding: 'hex',
29
+ controller: 'did:key:01230123012',
30
+ };
31
+
32
+ const did = `did:nanoid:${nanoid(20)}`;
33
+ return {
34
+ orgDoc: {
35
+ '@context': [
36
+ 'https://www.w3.org/ns/did/v1',
37
+ {
38
+ '@base': did,
39
+ },
40
+ ],
41
+ id: did,
42
+ alsoKnownAs: ['did:aka:foo'],
43
+ service: [
44
+ {
45
+ id: '#test-service',
46
+ type: 'VlcCareerIssuer_v1',
47
+ credentialTypes: ['CurrentEmploymentPosition'],
48
+ serviceEndpoint: 'https://agent.samplevendor.com/acme',
49
+ },
50
+ ],
51
+ assertionMethod: [key.id],
52
+ verificationMethod: [key],
53
+ },
54
+ orgKey: privateKey,
55
+ orgPublicKey: publicKey,
56
+ };
57
+ };
58
+ module.exports = {
59
+ createOrgDoc,
60
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Copyright 2023 Velocity Team
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ const { createTestServer } = require('@verii/server-provider');
18
+ const { loadTestEnv, buildMongoConnection } = require('@verii/tests-helpers');
19
+
20
+ loadTestEnv();
21
+
22
+ const { flow } = require('lodash/fp');
23
+ const { operatorConfig } = require('../../../src/config');
24
+ const { initOperatorServer } = require('../../../src/init-operator-server');
25
+
26
+ const mongoConnection = buildMongoConnection('test-credential-agent');
27
+
28
+ module.exports = (overrideConfig = {}) =>
29
+ flow(
30
+ createTestServer,
31
+ initOperatorServer
32
+ )({ ...operatorConfig, ...overrideConfig, mongoConnection });
@@ -0,0 +1,31 @@
1
+ /*
2
+ * Copyright 2025 Velocity Team
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+
18
+ const { mongoDb } = require('@spencejs/spence-mongo-repos');
19
+ const { decryptCollection } = require('@verii/crypto');
20
+
21
+ const initFindKmsKey = (fastify) => async (filter) => {
22
+ const key = await mongoDb()
23
+ .collection('keys')
24
+ .findOne(filter, {
25
+ projection: { kidFragment: 1, key: 1 },
26
+ });
27
+ key.key = JSON.parse(decryptCollection(key.key, fastify.config.mongoSecret));
28
+ return key;
29
+ };
30
+
31
+ module.exports = { initFindKmsKey };