was-teaching-server 0.9.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 (295) hide show
  1. package/CHANGELOG.md +1432 -0
  2. package/LICENSE +661 -0
  3. package/README.md +305 -0
  4. package/common/css/materialize.1.0.0.min.css +13 -0
  5. package/dist/auth-header-hooks.d.ts +84 -0
  6. package/dist/auth-header-hooks.d.ts.map +1 -0
  7. package/dist/auth-header-hooks.js +136 -0
  8. package/dist/auth-header-hooks.js.map +1 -0
  9. package/dist/authorize.d.ts +45 -0
  10. package/dist/authorize.d.ts.map +1 -0
  11. package/dist/authorize.js +76 -0
  12. package/dist/authorize.js.map +1 -0
  13. package/dist/backends/filesystem.d.ts +1179 -0
  14. package/dist/backends/filesystem.d.ts.map +1 -0
  15. package/dist/backends/filesystem.js +2727 -0
  16. package/dist/backends/filesystem.js.map +1 -0
  17. package/dist/backends/postgres.d.ts +833 -0
  18. package/dist/backends/postgres.d.ts.map +1 -0
  19. package/dist/backends/postgres.js +2164 -0
  20. package/dist/backends/postgres.js.map +1 -0
  21. package/dist/backends/postgresSchema.d.ts +36 -0
  22. package/dist/backends/postgresSchema.d.ts.map +1 -0
  23. package/dist/backends/postgresSchema.js +203 -0
  24. package/dist/backends/postgresSchema.js.map +1 -0
  25. package/dist/config.default.d.ts +360 -0
  26. package/dist/config.default.d.ts.map +1 -0
  27. package/dist/config.default.js +493 -0
  28. package/dist/config.default.js.map +1 -0
  29. package/dist/corsProxy.d.ts +45 -0
  30. package/dist/corsProxy.d.ts.map +1 -0
  31. package/dist/corsProxy.js +278 -0
  32. package/dist/corsProxy.js.map +1 -0
  33. package/dist/digest.d.ts +45 -0
  34. package/dist/digest.d.ts.map +1 -0
  35. package/dist/digest.js +174 -0
  36. package/dist/digest.js.map +1 -0
  37. package/dist/errors.d.ts +654 -0
  38. package/dist/errors.d.ts.map +1 -0
  39. package/dist/errors.js +960 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/index.d.ts +22 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +21 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/lib/atomicFile.d.ts +61 -0
  46. package/dist/lib/atomicFile.d.ts.map +1 -0
  47. package/dist/lib/atomicFile.js +150 -0
  48. package/dist/lib/atomicFile.js.map +1 -0
  49. package/dist/lib/backendRegistry.d.ts +59 -0
  50. package/dist/lib/backendRegistry.d.ts.map +1 -0
  51. package/dist/lib/backendRegistry.js +92 -0
  52. package/dist/lib/backendRegistry.js.map +1 -0
  53. package/dist/lib/backendUsage.d.ts +28 -0
  54. package/dist/lib/backendUsage.d.ts.map +1 -0
  55. package/dist/lib/backendUsage.js +55 -0
  56. package/dist/lib/backendUsage.js.map +1 -0
  57. package/dist/lib/backends.d.ts +142 -0
  58. package/dist/lib/backends.d.ts.map +1 -0
  59. package/dist/lib/backends.js +272 -0
  60. package/dist/lib/backends.js.map +1 -0
  61. package/dist/lib/blindedIndex.d.ts +156 -0
  62. package/dist/lib/blindedIndex.d.ts.map +1 -0
  63. package/dist/lib/blindedIndex.js +338 -0
  64. package/dist/lib/blindedIndex.js.map +1 -0
  65. package/dist/lib/collectionDescription.d.ts +33 -0
  66. package/dist/lib/collectionDescription.d.ts.map +1 -0
  67. package/dist/lib/collectionDescription.js +21 -0
  68. package/dist/lib/collectionDescription.js.map +1 -0
  69. package/dist/lib/cursor.d.ts +18 -0
  70. package/dist/lib/cursor.d.ts.map +1 -0
  71. package/dist/lib/cursor.js +50 -0
  72. package/dist/lib/cursor.js.map +1 -0
  73. package/dist/lib/edvEnvelope.d.ts +50 -0
  74. package/dist/lib/edvEnvelope.d.ts.map +1 -0
  75. package/dist/lib/edvEnvelope.js +106 -0
  76. package/dist/lib/edvEnvelope.js.map +1 -0
  77. package/dist/lib/encryption.d.ts +192 -0
  78. package/dist/lib/encryption.d.ts.map +1 -0
  79. package/dist/lib/encryption.js +383 -0
  80. package/dist/lib/encryption.js.map +1 -0
  81. package/dist/lib/etag.d.ts +33 -0
  82. package/dist/lib/etag.d.ts.map +1 -0
  83. package/dist/lib/etag.js +36 -0
  84. package/dist/lib/etag.js.map +1 -0
  85. package/dist/lib/exportManifest.d.ts +29 -0
  86. package/dist/lib/exportManifest.d.ts.map +1 -0
  87. package/dist/lib/exportManifest.js +77 -0
  88. package/dist/lib/exportManifest.js.map +1 -0
  89. package/dist/lib/importTar.d.ts +81 -0
  90. package/dist/lib/importTar.d.ts.map +1 -0
  91. package/dist/lib/importTar.js +301 -0
  92. package/dist/lib/importTar.js.map +1 -0
  93. package/dist/lib/isJson.d.ts +16 -0
  94. package/dist/lib/isJson.d.ts.map +1 -0
  95. package/dist/lib/isJson.js +17 -0
  96. package/dist/lib/isJson.js.map +1 -0
  97. package/dist/lib/keyEpoch.d.ts +38 -0
  98. package/dist/lib/keyEpoch.d.ts.map +1 -0
  99. package/dist/lib/keyEpoch.js +75 -0
  100. package/dist/lib/keyEpoch.js.map +1 -0
  101. package/dist/lib/keyedMutex.d.ts +28 -0
  102. package/dist/lib/keyedMutex.d.ts.map +1 -0
  103. package/dist/lib/keyedMutex.js +45 -0
  104. package/dist/lib/keyedMutex.js.map +1 -0
  105. package/dist/lib/kmsModule.d.ts +62 -0
  106. package/dist/lib/kmsModule.d.ts.map +1 -0
  107. package/dist/lib/kmsModule.js +327 -0
  108. package/dist/lib/kmsModule.js.map +1 -0
  109. package/dist/lib/kmsRecordCipher.d.ts +82 -0
  110. package/dist/lib/kmsRecordCipher.d.ts.map +1 -0
  111. package/dist/lib/kmsRecordCipher.js +226 -0
  112. package/dist/lib/kmsRecordCipher.js.map +1 -0
  113. package/dist/lib/pagination.d.ts +19 -0
  114. package/dist/lib/pagination.d.ts.map +1 -0
  115. package/dist/lib/pagination.js +21 -0
  116. package/dist/lib/pagination.js.map +1 -0
  117. package/dist/lib/paths.d.ts +273 -0
  118. package/dist/lib/paths.d.ts.map +1 -0
  119. package/dist/lib/paths.js +270 -0
  120. package/dist/lib/paths.js.map +1 -0
  121. package/dist/lib/preconditions.d.ts +65 -0
  122. package/dist/lib/preconditions.d.ts.map +1 -0
  123. package/dist/lib/preconditions.js +112 -0
  124. package/dist/lib/preconditions.js.map +1 -0
  125. package/dist/lib/resourceFileName.d.ts +41 -0
  126. package/dist/lib/resourceFileName.d.ts.map +1 -0
  127. package/dist/lib/resourceFileName.js +58 -0
  128. package/dist/lib/resourceFileName.js.map +1 -0
  129. package/dist/lib/revocations.d.ts +49 -0
  130. package/dist/lib/revocations.d.ts.map +1 -0
  131. package/dist/lib/revocations.js +86 -0
  132. package/dist/lib/revocations.js.map +1 -0
  133. package/dist/lib/validateDid.d.ts +19 -0
  134. package/dist/lib/validateDid.d.ts.map +1 -0
  135. package/dist/lib/validateDid.js +35 -0
  136. package/dist/lib/validateDid.js.map +1 -0
  137. package/dist/lib/validateId.d.ts +66 -0
  138. package/dist/lib/validateId.d.ts.map +1 -0
  139. package/dist/lib/validateId.js +126 -0
  140. package/dist/lib/validateId.js.map +1 -0
  141. package/dist/plugin.d.ts +115 -0
  142. package/dist/plugin.d.ts.map +1 -0
  143. package/dist/plugin.js +134 -0
  144. package/dist/plugin.js.map +1 -0
  145. package/dist/policy.d.ts +78 -0
  146. package/dist/policy.d.ts.map +1 -0
  147. package/dist/policy.js +115 -0
  148. package/dist/policy.js.map +1 -0
  149. package/dist/provisioning.d.ts +38 -0
  150. package/dist/provisioning.d.ts.map +1 -0
  151. package/dist/provisioning.js +72 -0
  152. package/dist/provisioning.js.map +1 -0
  153. package/dist/requests/BackendRequest.d.ts +61 -0
  154. package/dist/requests/BackendRequest.d.ts.map +1 -0
  155. package/dist/requests/BackendRequest.js +152 -0
  156. package/dist/requests/BackendRequest.js.map +1 -0
  157. package/dist/requests/CollectionRequest.d.ts +234 -0
  158. package/dist/requests/CollectionRequest.d.ts.map +1 -0
  159. package/dist/requests/CollectionRequest.js +705 -0
  160. package/dist/requests/CollectionRequest.js.map +1 -0
  161. package/dist/requests/KeyRequest.d.ts +115 -0
  162. package/dist/requests/KeyRequest.d.ts.map +1 -0
  163. package/dist/requests/KeyRequest.js +468 -0
  164. package/dist/requests/KeyRequest.js.map +1 -0
  165. package/dist/requests/KeystoreRequest.d.ts +99 -0
  166. package/dist/requests/KeystoreRequest.d.ts.map +1 -0
  167. package/dist/requests/KeystoreRequest.js +247 -0
  168. package/dist/requests/KeystoreRequest.js.map +1 -0
  169. package/dist/requests/PolicyRequest.d.ts +53 -0
  170. package/dist/requests/PolicyRequest.d.ts.map +1 -0
  171. package/dist/requests/PolicyRequest.js +124 -0
  172. package/dist/requests/PolicyRequest.js.map +1 -0
  173. package/dist/requests/ResourceRequest.d.ts +134 -0
  174. package/dist/requests/ResourceRequest.d.ts.map +1 -0
  175. package/dist/requests/ResourceRequest.js +548 -0
  176. package/dist/requests/ResourceRequest.js.map +1 -0
  177. package/dist/requests/RevocationRequest.d.ts +67 -0
  178. package/dist/requests/RevocationRequest.d.ts.map +1 -0
  179. package/dist/requests/RevocationRequest.js +187 -0
  180. package/dist/requests/RevocationRequest.js.map +1 -0
  181. package/dist/requests/SpaceRequest.d.ts +204 -0
  182. package/dist/requests/SpaceRequest.d.ts.map +1 -0
  183. package/dist/requests/SpaceRequest.js +520 -0
  184. package/dist/requests/SpaceRequest.js.map +1 -0
  185. package/dist/requests/SpacesRepositoryRequest.d.ts +50 -0
  186. package/dist/requests/SpacesRepositoryRequest.d.ts.map +1 -0
  187. package/dist/requests/SpacesRepositoryRequest.js +159 -0
  188. package/dist/requests/SpacesRepositoryRequest.js.map +1 -0
  189. package/dist/requests/collectionContext.d.ts +21 -0
  190. package/dist/requests/collectionContext.d.ts.map +1 -0
  191. package/dist/requests/collectionContext.js +30 -0
  192. package/dist/requests/collectionContext.js.map +1 -0
  193. package/dist/requests/controllerConsent.d.ts +58 -0
  194. package/dist/requests/controllerConsent.d.ts.map +1 -0
  195. package/dist/requests/controllerConsent.js +73 -0
  196. package/dist/requests/controllerConsent.js.map +1 -0
  197. package/dist/requests/keystoreContext.d.ts +68 -0
  198. package/dist/requests/keystoreContext.d.ts.map +1 -0
  199. package/dist/requests/keystoreContext.js +87 -0
  200. package/dist/requests/keystoreContext.js.map +1 -0
  201. package/dist/requests/resourceInput.d.ts +19 -0
  202. package/dist/requests/resourceInput.d.ts.map +1 -0
  203. package/dist/requests/resourceInput.js +102 -0
  204. package/dist/requests/resourceInput.js.map +1 -0
  205. package/dist/requests/spaceContext.d.ts +127 -0
  206. package/dist/requests/spaceContext.d.ts.map +1 -0
  207. package/dist/requests/spaceContext.js +201 -0
  208. package/dist/requests/spaceContext.js.map +1 -0
  209. package/dist/routes.d.ts +55 -0
  210. package/dist/routes.d.ts.map +1 -0
  211. package/dist/routes.js +306 -0
  212. package/dist/routes.js.map +1 -0
  213. package/dist/server.d.ts +20 -0
  214. package/dist/server.d.ts.map +1 -0
  215. package/dist/server.js +60 -0
  216. package/dist/server.js.map +1 -0
  217. package/dist/start.d.ts +7 -0
  218. package/dist/start.d.ts.map +1 -0
  219. package/dist/start.js +61 -0
  220. package/dist/start.js.map +1 -0
  221. package/dist/storage.d.ts +29 -0
  222. package/dist/storage.d.ts.map +1 -0
  223. package/dist/storage.js +47 -0
  224. package/dist/storage.js.map +1 -0
  225. package/dist/types.d.ts +915 -0
  226. package/dist/types.d.ts.map +1 -0
  227. package/dist/types.js +2 -0
  228. package/dist/types.js.map +1 -0
  229. package/dist/views/home.hbs +9 -0
  230. package/dist/views/templates/main.hbs +12 -0
  231. package/dist/zcap.d.ts +267 -0
  232. package/dist/zcap.d.ts.map +1 -0
  233. package/dist/zcap.js +478 -0
  234. package/dist/zcap.js.map +1 -0
  235. package/package.json +109 -0
  236. package/src/auth-header-hooks.ts +163 -0
  237. package/src/authorize.ts +117 -0
  238. package/src/backends/filesystem.ts +3626 -0
  239. package/src/backends/postgres.ts +3073 -0
  240. package/src/backends/postgresSchema.ts +231 -0
  241. package/src/config.default.ts +657 -0
  242. package/src/corsProxy.ts +326 -0
  243. package/src/declarations.d.ts +28 -0
  244. package/src/digest.ts +223 -0
  245. package/src/errors.ts +1122 -0
  246. package/src/index.ts +21 -0
  247. package/src/lib/atomicFile.ts +176 -0
  248. package/src/lib/backendRegistry.ts +139 -0
  249. package/src/lib/backendUsage.ts +79 -0
  250. package/src/lib/backends.ts +351 -0
  251. package/src/lib/blindedIndex.ts +466 -0
  252. package/src/lib/collectionDescription.ts +43 -0
  253. package/src/lib/cursor.ts +52 -0
  254. package/src/lib/edvEnvelope.ts +120 -0
  255. package/src/lib/encryption.ts +472 -0
  256. package/src/lib/etag.ts +40 -0
  257. package/src/lib/exportManifest.ts +115 -0
  258. package/src/lib/importTar.ts +381 -0
  259. package/src/lib/isJson.ts +18 -0
  260. package/src/lib/keyEpoch.ts +89 -0
  261. package/src/lib/keyedMutex.ts +45 -0
  262. package/src/lib/kmsModule.ts +451 -0
  263. package/src/lib/kmsRecordCipher.ts +292 -0
  264. package/src/lib/pagination.ts +22 -0
  265. package/src/lib/paths.ts +382 -0
  266. package/src/lib/preconditions.ts +145 -0
  267. package/src/lib/resourceFileName.ts +69 -0
  268. package/src/lib/revocations.ts +116 -0
  269. package/src/lib/validateDid.ts +41 -0
  270. package/src/lib/validateId.ts +148 -0
  271. package/src/plugin.ts +288 -0
  272. package/src/policy.ts +176 -0
  273. package/src/provisioning.ts +98 -0
  274. package/src/requests/BackendRequest.ts +219 -0
  275. package/src/requests/CollectionRequest.ts +899 -0
  276. package/src/requests/KeyRequest.ts +617 -0
  277. package/src/requests/KeystoreRequest.ts +325 -0
  278. package/src/requests/PolicyRequest.ts +169 -0
  279. package/src/requests/ResourceRequest.ts +649 -0
  280. package/src/requests/RevocationRequest.ts +267 -0
  281. package/src/requests/SpaceRequest.ts +686 -0
  282. package/src/requests/SpacesRepositoryRequest.ts +194 -0
  283. package/src/requests/collectionContext.ts +41 -0
  284. package/src/requests/controllerConsent.ts +108 -0
  285. package/src/requests/keystoreContext.ts +124 -0
  286. package/src/requests/resourceInput.ts +118 -0
  287. package/src/requests/spaceContext.ts +311 -0
  288. package/src/routes.ts +420 -0
  289. package/src/server.ts +69 -0
  290. package/src/start.ts +71 -0
  291. package/src/storage.ts +60 -0
  292. package/src/types.ts +1016 -0
  293. package/src/views/home.hbs +9 -0
  294. package/src/views/templates/main.hbs +12 -0
  295. package/src/zcap.ts +657 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollectionRequest.js","sourceRoot":"","sources":["../../src/requests/CollectionRequest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Request handlers for WebKMS key operations (the `/kms` facet):
3
+ * - POST /kms/keystores/:keystoreId/keys (GenerateKeyOperation)
4
+ * - GET /kms/keystores/:keystoreId/keys (List Keys -- a fork extension beyond
5
+ * upstream webkms-switch; enumerate the keystore's public key descriptions)
6
+ * - POST /kms/keystores/:keystoreId/keys/:keyId (Sign / Verify / DeriveSecret /
7
+ * WrapKey / UnwrapKey operation, dispatched by envelope `type`)
8
+ * - GET /kms/keystores/:keystoreId/keys/:keyId (public key description)
9
+ *
10
+ * The wire contract is protocol-fixed by webkms-switch /
11
+ * `@interop/webkms-client` (the conformance suite): operation envelopes carry
12
+ * an optional `@context`, generate responds 200 (not 201) with a `Location`
13
+ * header and a `{ keyId, keyDescription }` body, every other operation
14
+ * responds 200 with its own single-field result. Every route roots its
15
+ * capability in the **keystore** URL (never the key -- the client computes the
16
+ * root zcap by stripping the key URL at the last `/keys/`), with the key URL
17
+ * accepted as an attenuated target; the expected zcap action is the operation
18
+ * name, decapitalized, minus `Operation` (`generateKey`, `sign`, ...), and
19
+ * `read` for the description GET (which this server authorizes rather than
20
+ * leaving open).
21
+ */
22
+ import type { FastifyReply, FastifyRequest } from 'fastify';
23
+ export declare class KeyRequest {
24
+ /**
25
+ * POST /kms/keystores/:keystoreId/keys
26
+ * Generate Key (`GenerateKeyOperation`). The envelope's `invocationTarget`
27
+ * is an *object* (`{ type, maxCapabilityChainLength?, publicAlias? |
28
+ * publicAliasTemplate? }`), unlike every other operation's string. Verified
29
+ * against the keystore's controller with the `generateKey` action; the new
30
+ * key's local id is server-generated (the same bnid multihash scheme as
31
+ * keystore ids, per webkms-switch `generateRandom`). Responds 200 with a
32
+ * `Location` header and `{ keyId, keyDescription }` -- the client reads the
33
+ * key id from the *body*, never the header.
34
+ *
35
+ * @param request {import('fastify').FastifyRequest}
36
+ * @param reply {import('fastify').FastifyReply}
37
+ * @returns {Promise<FastifyReply>}
38
+ */
39
+ static generate(request: FastifyRequest<{
40
+ Params: {
41
+ keystoreId: string;
42
+ };
43
+ Body: Record<string, unknown>;
44
+ }>, reply: FastifyReply): Promise<FastifyReply>;
45
+ /**
46
+ * POST /kms/keystores/:keystoreId/keys/:keyId
47
+ * Key operation dispatch by envelope `type` (Sign / Verify / DeriveSecret /
48
+ * WrapKey / UnwrapKey). The envelope's string `invocationTarget` must equal
49
+ * the request URL exactly (400, per webkms-switch); the expected zcap action
50
+ * is the decapitalized operation name, verified against the keystore's
51
+ * controller with the key URL as an attenuated target. An operation the KMS
52
+ * does not recognize -- or does not serve for the key's type, e.g.
53
+ * `VerifyOperation` on an asymmetric key -- is a clean 400 not-supported.
54
+ * Responds 200 with the operation's single-field result.
55
+ *
56
+ * @param request {import('fastify').FastifyRequest}
57
+ * @param reply {import('fastify').FastifyReply}
58
+ * @returns {Promise<FastifyReply>}
59
+ */
60
+ static operation(request: FastifyRequest<{
61
+ Params: {
62
+ keystoreId: string;
63
+ keyId: string;
64
+ };
65
+ Body: Record<string, unknown>;
66
+ }>, reply: FastifyReply): Promise<FastifyReply>;
67
+ /**
68
+ * GET /kms/keystores/:keystoreId/keys/:keyId
69
+ * Public key description: capability-verified against the keystore's
70
+ * controller (`read`, with the key URL as an attenuated target -- this
71
+ * server authorizes the route rather than serving it open). The
72
+ * description's `controller` is the keystore's *live*
73
+ * controller, and the `publicAlias` / `publicAliasTemplate` override is
74
+ * re-applied on every read, so descriptions are stable (the client caches
75
+ * them for five minutes).
76
+ *
77
+ * @param request {import('fastify').FastifyRequest}
78
+ * @param reply {import('fastify').FastifyReply}
79
+ * @returns {Promise<FastifyReply>}
80
+ */
81
+ static get(request: FastifyRequest<{
82
+ Params: {
83
+ keystoreId: string;
84
+ keyId: string;
85
+ };
86
+ }>, reply: FastifyReply): Promise<FastifyReply>;
87
+ /**
88
+ * GET /kms/keystores/:keystoreId/keys
89
+ * List Keys (a fork extension beyond upstream webkms-switch). Enumerates the
90
+ * keystore's public key descriptions -- the Get Key Description projection
91
+ * per key (`describeKmsKey`: allowlisted public fields, the keystore's live
92
+ * controller, alias re-applied; never a secret field), plus `keyUrl`, the
93
+ * key's canonical invocation URL (which the alias override erases from `id`
94
+ * for precisely the keys a recovery client must rediscover) --
95
+ * sorted by local id and paginated (`KEY_LIST_LIMIT` per page, an opaque
96
+ * `cursor` following the standard convention). Capability-verified against the
97
+ * keystore's controller (`read`), with the `<keystoreId>/keys` URL accepted as
98
+ * an attenuated target (the same treatment Get Key gives the key URL). An
99
+ * empty keystore returns `{ results: [] }`, not a 404. Responds `{ results }`,
100
+ * plus a `next` cursor URL when a further page follows.
101
+ *
102
+ * @param request {import('fastify').FastifyRequest}
103
+ * @param reply {import('fastify').FastifyReply}
104
+ * @returns {Promise<FastifyReply>}
105
+ */
106
+ static list(request: FastifyRequest<{
107
+ Params: {
108
+ keystoreId: string;
109
+ };
110
+ Querystring: {
111
+ cursor?: string;
112
+ };
113
+ }>, reply: FastifyReply): Promise<FastifyReply>;
114
+ }
115
+ //# sourceMappingURL=KeyRequest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyRequest.d.ts","sourceRoot":"","sources":["../../src/requests/KeyRequest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAyR3D,qBAAa,UAAU;IACrB;;;;;;;;;;;;;;OAcG;WACU,QAAQ,CACnB,OAAO,EAAE,cAAc,CAAC;QACtB,MAAM,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,CAAA;QAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAC9B,CAAC,EACF,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,YAAY,CAAC;IAgExB;;;;;;;;;;;;;;OAcG;WACU,SAAS,CACpB,OAAO,EAAE,cAAc,CAAC;QACtB,MAAM,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;QAC7C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAC9B,CAAC,EACF,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,YAAY,CAAC;IA2ExB;;;;;;;;;;;;;OAaG;WACU,GAAG,CACd,OAAO,EAAE,cAAc,CAAC;QACtB,MAAM,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAC9C,CAAC,EACF,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,YAAY,CAAC;IAuBxB;;;;;;;;;;;;;;;;;;OAkBG;WACU,IAAI,CACf,OAAO,EAAE,cAAc,CAAC;QACtB,MAAM,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,CAAA;QAC9B,WAAW,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KACjC,CAAC,EACF,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,YAAY,CAAC;CAiEzB"}
@@ -0,0 +1,468 @@
1
+ import { generateId } from '@digitalcredentials/bnid';
2
+ import { fetchKeystoreAndVerify } from './keystoreContext.js';
3
+ import { generateKmsKey, describeKmsKey, runKeyOperation } from '../lib/kmsModule.js';
4
+ import { encryptKeyRecord, decryptKeyRecord, currentRecordKek, recordKekLoader } from '../lib/kmsRecordCipher.js';
5
+ import { isUrlSafeSegment } from '../lib/validateId.js';
6
+ import { kmsKeysPath } from '../lib/paths.js';
7
+ import { encodeCursor, decodeCursor } from '../lib/cursor.js';
8
+ import { KEY_LIST_LIMIT } from '../config.default.js';
9
+ import { InvalidRequestBodyError, KeyNotFoundError, KmsRecordCipherError, UnauthorizedError, UnsupportedKeyOperationError } from '../errors.js';
10
+ /**
11
+ * The operation-specific body fields of each dispatchable (non-generate)
12
+ * operation envelope. Doubles as the recognized-operation registry: an
13
+ * envelope `type` outside this table is the clean 400 not-supported. The
14
+ * fields' *values* are validated by the KMS module's per-operation
15
+ * implementations; the request layer enforces the envelope shape
16
+ * (`additionalProperties: false`, per the webkms-switch schemas).
17
+ */
18
+ const OPERATION_FIELDS = {
19
+ SignOperation: ['verifyData'],
20
+ VerifyOperation: ['verifyData', 'signatureValue'],
21
+ DeriveSecretOperation: ['publicKey'],
22
+ WrapKeyOperation: ['unwrappedKey'],
23
+ UnwrapKeyOperation: ['wrappedKey']
24
+ };
25
+ /**
26
+ * Derives the expected zcap action from an operation envelope `type`:
27
+ * decapitalized, minus the `Operation` suffix (webkms-switch `_parseAction`) --
28
+ * `SignOperation` to `sign`, `DeriveSecretOperation` to `deriveSecret`, etc.
29
+ * @param operationType {string}
30
+ * @returns {string}
31
+ */
32
+ function operationAction(operationType) {
33
+ const name = operationType.slice(0, operationType.indexOf('Operation'));
34
+ return name.charAt(0).toLowerCase() + name.slice(1);
35
+ }
36
+ /**
37
+ * Asserts the request body is a JSON object envelope of the given operation
38
+ * `type` carrying only the allowed keys (`additionalProperties: false`).
39
+ * `@context` is allowed but never required -- the webkms-switch schemas make
40
+ * it optional and `@interop/webkms-client` omits it entirely.
41
+ *
42
+ * @param options {object}
43
+ * @param options.body {unknown} the parsed request body
44
+ * @param options.allowedKeys {string[]} allowed keys beyond `@context`/`type`
45
+ * @param options.requestName {string} request name used in error titles
46
+ * @returns {Record<string, unknown>} the body, narrowed
47
+ */
48
+ function assertOperationEnvelope({ body, allowedKeys, requestName }) {
49
+ if (typeof body !== 'object' || body === null || Array.isArray(body)) {
50
+ throw new InvalidRequestBodyError({
51
+ requestName,
52
+ detail: 'Operation body must be a JSON object.'
53
+ });
54
+ }
55
+ const envelope = body;
56
+ for (const key of Object.keys(envelope)) {
57
+ if (key !== '@context' && key !== 'type' && !allowedKeys.includes(key)) {
58
+ throw new InvalidRequestBodyError({
59
+ requestName,
60
+ detail: `Unexpected operation property "${key}".`,
61
+ pointer: `#/${key}`
62
+ });
63
+ }
64
+ }
65
+ return envelope;
66
+ }
67
+ /**
68
+ * Decrypts a stored key record through the at-rest cipher seam
69
+ * (`KMS_RECORD_KEK`): a plaintext record passes through untouched; an encrypted
70
+ * one is unwrapped under its stored `kekId` (a failure -- missing KEK / bad
71
+ * ciphertext -- is a 500 `KmsRecordCipherError`, a server misconfiguration).
72
+ * The single funnel every path that needs the *secret* (operation dispatch,
73
+ * description GET) goes through, so no operation can read a ciphertext envelope
74
+ * as key material. List Keys deliberately does NOT use it: it projects only
75
+ * public fields, which stay plaintext at rest, so it never unwraps a secret.
76
+ *
77
+ * @param options {object}
78
+ * @param options.record {KmsKeyRecord} the record as stored (maybe encrypted)
79
+ * @param [options.kmsRecordKek] {KmsRecordKekRegistry} the configured KEK
80
+ * registry (`request.server.kmsRecordKek`), or `undefined` when disabled
81
+ * @param options.requestName {string} request name used in error titles
82
+ * @returns {KmsKeyRecord} the decrypted (secret-bearing) record
83
+ */
84
+ function decryptStoredKeyRecord({ record, kmsRecordKek, requestName }) {
85
+ try {
86
+ return decryptKeyRecord({
87
+ record,
88
+ kekLoader: recordKekLoader(kmsRecordKek)
89
+ });
90
+ }
91
+ catch (err) {
92
+ throw new KmsRecordCipherError({ cause: err, requestName });
93
+ }
94
+ }
95
+ /**
96
+ * Loads a key record by its URL params, masking an unknown (or non-URL-safe)
97
+ * key id as the 404 `KeyNotFoundError`. Call after capability verification,
98
+ * so an under-authorized caller cannot distinguish absent from forbidden. The
99
+ * record is decrypted through the cipher seam (see `decryptStoredKeyRecord`)
100
+ * before it is returned.
101
+ *
102
+ * @param options {object}
103
+ * @param options.request {FastifyRequest} supplies `request.server.storage`
104
+ * @param options.keystoreId {string} the keystore's local id (URL param)
105
+ * @param options.keyId {string} the key's local id (URL param)
106
+ * @param options.requestName {string} request name used in error titles
107
+ * @returns {Promise<KmsKeyRecord>} the decrypted (secret-bearing) record
108
+ */
109
+ async function fetchKeyRecord({ request, keystoreId, keyId, requestName }) {
110
+ if (!isUrlSafeSegment(keyId)) {
111
+ throw new KeyNotFoundError({ requestName });
112
+ }
113
+ const record = await request.server.storage.getKey({
114
+ keystoreId,
115
+ localId: keyId
116
+ });
117
+ if (!record) {
118
+ throw new KeyNotFoundError({ requestName });
119
+ }
120
+ return decryptStoredKeyRecord({
121
+ record,
122
+ kmsRecordKek: request.server.kmsRecordKek,
123
+ requestName
124
+ });
125
+ }
126
+ /**
127
+ * Asserts a `GenerateKeyOperation`'s object `invocationTarget`: a required
128
+ * non-empty string `type`, an optional integer `maxCapabilityChainLength`
129
+ * (1-10; the chain includes the root, so 1 means controller-only), and at
130
+ * most one of `publicAlias` / `publicAliasTemplate` (non-empty strings).
131
+ *
132
+ * @param options {object}
133
+ * @param options.invocationTarget {unknown} the envelope's invocationTarget
134
+ * @param options.requestName {string} request name used in error titles
135
+ * @returns {object} the narrowed target fields
136
+ */
137
+ function assertGenerateKeyTarget({ invocationTarget, requestName }) {
138
+ if (typeof invocationTarget !== 'object' ||
139
+ invocationTarget === null ||
140
+ Array.isArray(invocationTarget)) {
141
+ throw new InvalidRequestBodyError({
142
+ requestName,
143
+ detail: 'Operation "invocationTarget" must be an object.',
144
+ pointer: '#/invocationTarget'
145
+ });
146
+ }
147
+ const allowedKeys = [
148
+ 'type',
149
+ 'maxCapabilityChainLength',
150
+ 'publicAlias',
151
+ 'publicAliasTemplate'
152
+ ];
153
+ for (const key of Object.keys(invocationTarget)) {
154
+ if (!allowedKeys.includes(key)) {
155
+ throw new InvalidRequestBodyError({
156
+ requestName,
157
+ detail: `Unexpected invocationTarget property "${key}".`,
158
+ pointer: `#/invocationTarget/${key}`
159
+ });
160
+ }
161
+ }
162
+ const target = invocationTarget;
163
+ if (typeof target.type !== 'string' || target.type.length === 0) {
164
+ throw new InvalidRequestBodyError({
165
+ requestName,
166
+ detail: 'invocationTarget "type" must be a non-empty string.',
167
+ pointer: '#/invocationTarget/type'
168
+ });
169
+ }
170
+ if (target.maxCapabilityChainLength !== undefined &&
171
+ (!Number.isInteger(target.maxCapabilityChainLength) ||
172
+ target.maxCapabilityChainLength < 1 ||
173
+ target.maxCapabilityChainLength > 10)) {
174
+ throw new InvalidRequestBodyError({
175
+ requestName,
176
+ detail: 'invocationTarget "maxCapabilityChainLength" must be an integer' +
177
+ ' between 1 and 10.',
178
+ pointer: '#/invocationTarget/maxCapabilityChainLength'
179
+ });
180
+ }
181
+ for (const aliasField of ['publicAlias', 'publicAliasTemplate']) {
182
+ const value = target[aliasField];
183
+ if (value !== undefined &&
184
+ (typeof value !== 'string' || value.length === 0)) {
185
+ throw new InvalidRequestBodyError({
186
+ requestName,
187
+ detail: `invocationTarget "${aliasField}" must be a non-empty string.`,
188
+ pointer: `#/invocationTarget/${aliasField}`
189
+ });
190
+ }
191
+ }
192
+ if (target.publicAlias !== undefined &&
193
+ target.publicAliasTemplate !== undefined) {
194
+ throw new InvalidRequestBodyError({
195
+ requestName,
196
+ detail: 'Only one of "publicAlias" or "publicAliasTemplate" may be given.',
197
+ pointer: '#/invocationTarget/publicAlias'
198
+ });
199
+ }
200
+ return target;
201
+ }
202
+ export class KeyRequest {
203
+ /**
204
+ * POST /kms/keystores/:keystoreId/keys
205
+ * Generate Key (`GenerateKeyOperation`). The envelope's `invocationTarget`
206
+ * is an *object* (`{ type, maxCapabilityChainLength?, publicAlias? |
207
+ * publicAliasTemplate? }`), unlike every other operation's string. Verified
208
+ * against the keystore's controller with the `generateKey` action; the new
209
+ * key's local id is server-generated (the same bnid multihash scheme as
210
+ * keystore ids, per webkms-switch `generateRandom`). Responds 200 with a
211
+ * `Location` header and `{ keyId, keyDescription }` -- the client reads the
212
+ * key id from the *body*, never the header.
213
+ *
214
+ * @param request {import('fastify').FastifyRequest}
215
+ * @param reply {import('fastify').FastifyReply}
216
+ * @returns {Promise<FastifyReply>}
217
+ */
218
+ static async generate(request, reply) {
219
+ const requestName = 'Generate Key';
220
+ const { keystoreId } = request.params;
221
+ const { storage } = request.server;
222
+ const envelope = assertOperationEnvelope({
223
+ body: request.body,
224
+ allowedKeys: ['invocationTarget'],
225
+ requestName
226
+ });
227
+ if (envelope.type !== 'GenerateKeyOperation') {
228
+ throw new InvalidRequestBodyError({
229
+ requestName,
230
+ detail: 'Operation "type" must be "GenerateKeyOperation".',
231
+ pointer: '#/type'
232
+ });
233
+ }
234
+ const target = assertGenerateKeyTarget({
235
+ invocationTarget: envelope.invocationTarget,
236
+ requestName
237
+ });
238
+ const { config } = await fetchKeystoreAndVerify({
239
+ request,
240
+ keystoreId,
241
+ allowedAction: 'generateKey',
242
+ requestName,
243
+ allowTargetAttenuation: true
244
+ });
245
+ // Server-generated local id, per webkms-switch `generateRandom`: multibase
246
+ // base58btc of a multihash-framed (identity, 16-byte) 128-bit random value.
247
+ const localId = await generateId({ multihash: true });
248
+ const keyId = `${config.id}/keys/${localId}`;
249
+ const { key, keyDescription } = await generateKmsKey({
250
+ keyId,
251
+ type: target.type,
252
+ controller: config.controller,
253
+ maxCapabilityChainLength: target.maxCapabilityChainLength,
254
+ publicAlias: target.publicAlias,
255
+ publicAliasTemplate: target.publicAliasTemplate
256
+ });
257
+ const now = new Date().toISOString();
258
+ // At-rest cipher seam (`KMS_RECORD_KEK`): when a current KEK is configured,
259
+ // encrypt the record's secret fields before it reaches storage (the record
260
+ // stays opaque to the backend); unconfigured, it is stored plaintext.
261
+ let record = {
262
+ keystoreId,
263
+ localId,
264
+ meta: { created: now, updated: now },
265
+ key
266
+ };
267
+ const kek = currentRecordKek(request.server.kmsRecordKek);
268
+ if (kek !== undefined) {
269
+ record = encryptKeyRecord({ record, kek });
270
+ }
271
+ await storage.insertKey({ keystoreId, localId, record });
272
+ // 200 (not the keystore create's 201) with a Location header, per
273
+ // webkms-switch `runOperationMiddleware`.
274
+ reply.header('Location', keyId);
275
+ return reply.send({ keyId, keyDescription });
276
+ }
277
+ /**
278
+ * POST /kms/keystores/:keystoreId/keys/:keyId
279
+ * Key operation dispatch by envelope `type` (Sign / Verify / DeriveSecret /
280
+ * WrapKey / UnwrapKey). The envelope's string `invocationTarget` must equal
281
+ * the request URL exactly (400, per webkms-switch); the expected zcap action
282
+ * is the decapitalized operation name, verified against the keystore's
283
+ * controller with the key URL as an attenuated target. An operation the KMS
284
+ * does not recognize -- or does not serve for the key's type, e.g.
285
+ * `VerifyOperation` on an asymmetric key -- is a clean 400 not-supported.
286
+ * Responds 200 with the operation's single-field result.
287
+ *
288
+ * @param request {import('fastify').FastifyRequest}
289
+ * @param reply {import('fastify').FastifyReply}
290
+ * @returns {Promise<FastifyReply>}
291
+ */
292
+ static async operation(request, reply) {
293
+ const requestName = 'Key Operation';
294
+ const { keystoreId, keyId } = request.params;
295
+ const { serverUrl } = request.server;
296
+ if (typeof request.body !== 'object' ||
297
+ request.body === null ||
298
+ typeof request.body.type !== 'string') {
299
+ throw new InvalidRequestBodyError({
300
+ requestName,
301
+ detail: 'Operation body must be a JSON object with a string "type".',
302
+ pointer: '#/type'
303
+ });
304
+ }
305
+ const operationType = request.body
306
+ .type;
307
+ const operationFields = OPERATION_FIELDS[operationType];
308
+ if (operationFields === undefined) {
309
+ // Unknown-but-well-formed operation types (GenerateKeyOperation included:
310
+ // it is only dispatchable at the keys-collection URL) are not served.
311
+ throw new UnsupportedKeyOperationError({ operationType });
312
+ }
313
+ const envelope = assertOperationEnvelope({
314
+ body: request.body,
315
+ allowedKeys: ['invocationTarget', ...operationFields],
316
+ requestName
317
+ });
318
+ // The envelope names the key it operates on; it must be the key it was
319
+ // posted to (webkms-switch's invocation-target-vs-request-URL 400).
320
+ const fullRequestUrl = new URL(kmsKeysPath({ keystoreId, keyId }), serverUrl).toString();
321
+ if (envelope.invocationTarget !== fullRequestUrl) {
322
+ throw new InvalidRequestBodyError({
323
+ requestName,
324
+ detail: 'Operation "invocationTarget" does not match the request URL.',
325
+ pointer: '#/invocationTarget'
326
+ });
327
+ }
328
+ const { dereferencedChainLength } = await fetchKeystoreAndVerify({
329
+ request,
330
+ keystoreId,
331
+ allowedAction: operationAction(operationType),
332
+ requestName,
333
+ allowTargetAttenuation: true
334
+ });
335
+ const record = await fetchKeyRecord({
336
+ request,
337
+ keystoreId,
338
+ keyId,
339
+ requestName
340
+ });
341
+ // Per-key invocation chain bound, set at generate time and enforced at
342
+ // operation time. The chain includes the root, so a bound of 1 means
343
+ // controller-only. An
344
+ // over-long chain is an authorization failure: masked 404, per the
345
+ // server-wide convention.
346
+ if (record.key.maxCapabilityChainLength !== undefined &&
347
+ dereferencedChainLength > record.key.maxCapabilityChainLength) {
348
+ throw new UnauthorizedError({ requestName });
349
+ }
350
+ const result = await runKeyOperation({
351
+ key: record.key,
352
+ operation: envelope
353
+ });
354
+ return reply.send(result);
355
+ }
356
+ /**
357
+ * GET /kms/keystores/:keystoreId/keys/:keyId
358
+ * Public key description: capability-verified against the keystore's
359
+ * controller (`read`, with the key URL as an attenuated target -- this
360
+ * server authorizes the route rather than serving it open). The
361
+ * description's `controller` is the keystore's *live*
362
+ * controller, and the `publicAlias` / `publicAliasTemplate` override is
363
+ * re-applied on every read, so descriptions are stable (the client caches
364
+ * them for five minutes).
365
+ *
366
+ * @param request {import('fastify').FastifyRequest}
367
+ * @param reply {import('fastify').FastifyReply}
368
+ * @returns {Promise<FastifyReply>}
369
+ */
370
+ static async get(request, reply) {
371
+ const requestName = 'Get Key Description';
372
+ const { keystoreId, keyId } = request.params;
373
+ const { config } = await fetchKeystoreAndVerify({
374
+ request,
375
+ keystoreId,
376
+ allowedAction: 'read',
377
+ requestName,
378
+ allowTargetAttenuation: true
379
+ });
380
+ const record = await fetchKeyRecord({
381
+ request,
382
+ keystoreId,
383
+ keyId,
384
+ requestName
385
+ });
386
+ return reply.send(describeKmsKey({ key: record.key, controller: config.controller }));
387
+ }
388
+ /**
389
+ * GET /kms/keystores/:keystoreId/keys
390
+ * List Keys (a fork extension beyond upstream webkms-switch). Enumerates the
391
+ * keystore's public key descriptions -- the Get Key Description projection
392
+ * per key (`describeKmsKey`: allowlisted public fields, the keystore's live
393
+ * controller, alias re-applied; never a secret field), plus `keyUrl`, the
394
+ * key's canonical invocation URL (which the alias override erases from `id`
395
+ * for precisely the keys a recovery client must rediscover) --
396
+ * sorted by local id and paginated (`KEY_LIST_LIMIT` per page, an opaque
397
+ * `cursor` following the standard convention). Capability-verified against the
398
+ * keystore's controller (`read`), with the `<keystoreId>/keys` URL accepted as
399
+ * an attenuated target (the same treatment Get Key gives the key URL). An
400
+ * empty keystore returns `{ results: [] }`, not a 404. Responds `{ results }`,
401
+ * plus a `next` cursor URL when a further page follows.
402
+ *
403
+ * @param request {import('fastify').FastifyRequest}
404
+ * @param reply {import('fastify').FastifyReply}
405
+ * @returns {Promise<FastifyReply>}
406
+ */
407
+ static async list(request, reply) {
408
+ const requestName = 'List Keys';
409
+ const { keystoreId } = request.params;
410
+ const { cursor } = request.query;
411
+ const { storage } = request.server;
412
+ // The `?cursor` pagination parameter rides the signed request URL, so
413
+ // verification runs in target-query mode (as List Keystores / List
414
+ // Collection do). Authorization runs before any cursor validation below, so
415
+ // an under-authorized caller gets the merged 404 -- never `invalid-cursor`.
416
+ const { config } = await fetchKeystoreAndVerify({
417
+ request,
418
+ keystoreId,
419
+ allowedAction: 'read',
420
+ requestName,
421
+ allowTargetAttenuation: true,
422
+ allowTargetQuery: true
423
+ });
424
+ // The backend returns every record sorted by local id; key records are
425
+ // insert-once and immutable, so the cursor's `after` names a stable
426
+ // position -- resume from just past it (falling back to a keyset compare
427
+ // should the id somehow be absent). The cursor is opaque and validated
428
+ // here (400 `invalid-cursor` on a malformed token).
429
+ const keys = await storage.listKeys({ keystoreId });
430
+ let remaining = keys;
431
+ if (cursor !== undefined) {
432
+ const { after } = decodeCursor(cursor);
433
+ const index = keys.findIndex(entry => entry.localId === after);
434
+ remaining =
435
+ index === -1
436
+ ? keys.filter(entry => entry.localId > after)
437
+ : keys.slice(index + 1);
438
+ }
439
+ const hasMore = remaining.length > KEY_LIST_LIMIT;
440
+ const page = remaining.slice(0, KEY_LIST_LIMIT);
441
+ // Project directly from the stored record -- NO decrypt. The description
442
+ // reads only public fields, which stay plaintext at rest even under the
443
+ // record cipher (the `encrypted` envelope replaces only the secret subset).
444
+ // So listing never unwraps a key: it does not bulk-materialize private
445
+ // material in memory, and it still enumerates keys whose KEK is rotated out
446
+ // or whose envelope is corrupt -- the recovery-path robustness this endpoint
447
+ // exists for. (Contrast `fetchKeyRecord`, which must decrypt: get/operation
448
+ // need the secret.)
449
+ // Each entry additionally carries `keyUrl`, the key's canonical invocation
450
+ // URL. The alias override rewrites the description's `id`, erasing the one
451
+ // handle (`<keystoreId>/keys/<localId>`) a recovery client needs to invoke
452
+ // sign -- and a lister, unlike a Get Key caller, does not already hold it.
453
+ // Always stamped (aliased or not), so consumers need no fallback logic; it
454
+ // discloses only addressing an authorized lister already has, never key
455
+ // material.
456
+ const results = page.map(({ localId, record }) => ({
457
+ ...describeKmsKey({ key: record.key, controller: config.controller }),
458
+ keyUrl: `${config.id}/keys/${localId}`
459
+ }));
460
+ let next;
461
+ if (hasMore) {
462
+ const lastId = page[page.length - 1].localId;
463
+ next = `${kmsKeysPath({ keystoreId })}?cursor=${encodeCursor(lastId)}`;
464
+ }
465
+ return reply.send({ results, ...(next !== undefined && { next }) });
466
+ }
467
+ }
468
+ //# sourceMappingURL=KeyRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyRequest.js","sourceRoot":"","sources":["../../src/requests/KeyRequest.ts"],"names":[],"mappings":"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"}