@owlmeans/server-auth 0.1.18-rc.8 → 0.1.18

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 (218) hide show
  1. package/README.md +216 -38
  2. package/agent-meta/manifest.json +10 -3
  3. package/agent-meta/skills/server-auth/SKILL.md +161 -22
  4. package/agent-meta/skills/supervisor-auth/SKILL.md +128 -0
  5. package/build/actions/service.d.ts +6 -2
  6. package/build/actions/service.d.ts.map +1 -1
  7. package/build/actions/service.js +5 -4
  8. package/build/actions/service.js.map +1 -1
  9. package/build/actions/types.local.d.ts +6 -0
  10. package/build/actions/types.local.d.ts.map +1 -0
  11. package/build/actions/types.local.js +2 -0
  12. package/build/actions/types.local.js.map +1 -0
  13. package/build/entrypoints.d.ts +5 -0
  14. package/build/entrypoints.d.ts.map +1 -0
  15. package/build/entrypoints.js +9 -0
  16. package/build/entrypoints.js.map +1 -0
  17. package/build/index.d.ts +2 -1
  18. package/build/index.d.ts.map +1 -1
  19. package/build/index.js +2 -1
  20. package/build/index.js.map +1 -1
  21. package/build/manager/actions/authenticate.d.ts +8 -0
  22. package/build/manager/actions/authenticate.d.ts.map +1 -0
  23. package/build/manager/actions/authenticate.js +5 -0
  24. package/build/manager/actions/authenticate.js.map +1 -0
  25. package/build/manager/actions/index.d.ts +3 -1
  26. package/build/manager/actions/index.d.ts.map +1 -1
  27. package/build/manager/actions/index.js +3 -1
  28. package/build/manager/actions/index.js.map +1 -1
  29. package/build/manager/actions/init.d.ts +8 -0
  30. package/build/manager/actions/init.d.ts.map +1 -0
  31. package/build/manager/actions/init.js +5 -0
  32. package/build/manager/actions/init.js.map +1 -0
  33. package/build/manager/actions/rely.d.ts +8 -0
  34. package/build/manager/actions/rely.d.ts.map +1 -0
  35. package/build/manager/actions/rely.js +7 -0
  36. package/build/manager/actions/rely.js.map +1 -0
  37. package/build/manager/consts.local.d.ts +2 -0
  38. package/build/manager/consts.local.d.ts.map +1 -0
  39. package/build/manager/consts.local.js +2 -0
  40. package/build/manager/consts.local.js.map +1 -0
  41. package/build/manager/context.d.ts.map +1 -1
  42. package/build/manager/context.js +0 -1
  43. package/build/manager/context.js.map +1 -1
  44. package/build/manager/entrypoints.d.ts +9 -0
  45. package/build/manager/entrypoints.d.ts.map +1 -0
  46. package/build/manager/entrypoints.js +16 -0
  47. package/build/manager/entrypoints.js.map +1 -0
  48. package/build/manager/exports.d.ts +1 -2
  49. package/build/manager/exports.d.ts.map +1 -1
  50. package/build/manager/exports.js +1 -2
  51. package/build/manager/exports.js.map +1 -1
  52. package/build/manager/index.d.ts +1 -1
  53. package/build/manager/index.d.ts.map +1 -1
  54. package/build/manager/index.js +1 -1
  55. package/build/manager/index.js.map +1 -1
  56. package/build/manager/main.d.ts.map +1 -1
  57. package/build/manager/main.js +2 -2
  58. package/build/manager/main.js.map +1 -1
  59. package/build/manager/model.d.ts.map +1 -1
  60. package/build/manager/model.js +71 -32
  61. package/build/manager/model.js.map +1 -1
  62. package/build/manager/plugins/basic-ed25519.d.ts +1 -1
  63. package/build/manager/plugins/basic-ed25519.d.ts.map +1 -1
  64. package/build/manager/plugins/basic-ed25519.js +6 -6
  65. package/build/manager/plugins/basic-ed25519.js.map +1 -1
  66. package/build/manager/plugins/basic-rely.d.ts +1 -1
  67. package/build/manager/plugins/basic-rely.d.ts.map +1 -1
  68. package/build/manager/plugins/basic-rely.js +11 -8
  69. package/build/manager/plugins/basic-rely.js.map +1 -1
  70. package/build/manager/plugins/consts.d.ts +8 -0
  71. package/build/manager/plugins/consts.d.ts.map +1 -0
  72. package/build/manager/plugins/consts.js +9 -0
  73. package/build/manager/plugins/consts.js.map +1 -0
  74. package/build/manager/plugins/export.d.ts +5 -0
  75. package/build/manager/plugins/export.d.ts.map +1 -1
  76. package/build/manager/plugins/export.js +4 -0
  77. package/build/manager/plugins/export.js.map +1 -1
  78. package/build/manager/plugins/index.d.ts +3 -4
  79. package/build/manager/plugins/index.d.ts.map +1 -1
  80. package/build/manager/plugins/index.js +6 -6
  81. package/build/manager/plugins/index.js.map +1 -1
  82. package/build/manager/plugins/re-captcha/consts.d.ts +7 -0
  83. package/build/manager/plugins/re-captcha/consts.d.ts.map +1 -0
  84. package/build/manager/plugins/re-captcha/consts.js +7 -0
  85. package/build/manager/plugins/re-captcha/consts.js.map +1 -0
  86. package/build/manager/plugins/re-captcha/consts.local.d.ts +7 -0
  87. package/build/manager/plugins/re-captcha/consts.local.d.ts.map +1 -0
  88. package/build/manager/plugins/re-captcha/consts.local.js +9 -0
  89. package/build/manager/plugins/re-captcha/consts.local.js.map +1 -0
  90. package/build/manager/plugins/re-captcha/policy.d.ts +3 -0
  91. package/build/manager/plugins/re-captcha/policy.d.ts.map +1 -0
  92. package/build/manager/plugins/re-captcha/policy.js +44 -0
  93. package/build/manager/plugins/re-captcha/policy.js.map +1 -0
  94. package/build/manager/plugins/re-captcha/types.d.ts +79 -0
  95. package/build/manager/plugins/re-captcha/types.d.ts.map +1 -0
  96. package/build/manager/plugins/re-captcha/types.js +2 -0
  97. package/build/manager/plugins/re-captcha/types.js.map +1 -0
  98. package/build/manager/plugins/re-captcha/verifier.d.ts +12 -0
  99. package/build/manager/plugins/re-captcha/verifier.d.ts.map +1 -0
  100. package/build/manager/plugins/re-captcha/verifier.js +62 -0
  101. package/build/manager/plugins/re-captcha/verifier.js.map +1 -0
  102. package/build/manager/plugins/re-captcha.d.ts +10 -1
  103. package/build/manager/plugins/re-captcha.d.ts.map +1 -1
  104. package/build/manager/plugins/re-captcha.js +50 -37
  105. package/build/manager/plugins/re-captcha.js.map +1 -1
  106. package/build/manager/plugins/supervisor.d.ts +1 -2
  107. package/build/manager/plugins/supervisor.d.ts.map +1 -1
  108. package/build/manager/plugins/supervisor.js +6 -6
  109. package/build/manager/plugins/supervisor.js.map +1 -1
  110. package/build/manager/plugins/types.d.ts +22 -14
  111. package/build/manager/plugins/types.d.ts.map +1 -1
  112. package/build/manager/plugins/utils.d.ts +5 -4
  113. package/build/manager/plugins/utils.d.ts.map +1 -1
  114. package/build/manager/plugins/utils.js +20 -15
  115. package/build/manager/plugins/utils.js.map +1 -1
  116. package/build/manager/rely/flow.d.ts.map +1 -1
  117. package/build/manager/rely/flow.js +13 -11
  118. package/build/manager/rely/flow.js.map +1 -1
  119. package/build/manager/rely.d.ts.map +1 -1
  120. package/build/manager/rely.js.map +1 -1
  121. package/build/manager/supervisor.d.ts +4 -45
  122. package/build/manager/supervisor.d.ts.map +1 -1
  123. package/build/manager/supervisor.js +5 -5
  124. package/build/manager/supervisor.js.map +1 -1
  125. package/build/manager/types.d.ts +41 -1
  126. package/build/manager/types.d.ts.map +1 -1
  127. package/build/manager/types.local.d.ts +4 -0
  128. package/build/manager/types.local.d.ts.map +1 -0
  129. package/build/manager/types.local.js +2 -0
  130. package/build/manager/types.local.js.map +1 -0
  131. package/build/manager/utils/trusted.d.ts.map +1 -1
  132. package/build/manager/utils/trusted.js.map +1 -1
  133. package/build/model/rely/consumer.d.ts +3 -1
  134. package/build/model/rely/consumer.d.ts.map +1 -1
  135. package/build/model/rely/consumer.js.map +1 -1
  136. package/build/model/rely/peer.d.ts.map +1 -1
  137. package/build/model/rely/peer.js +7 -7
  138. package/build/model/rely/peer.js.map +1 -1
  139. package/build/model/rely/provider.d.ts +3 -1
  140. package/build/model/rely/provider.d.ts.map +1 -1
  141. package/build/model/rely/provider.js.map +1 -1
  142. package/build/re-captcha/guard.d.ts +12 -0
  143. package/build/re-captcha/guard.d.ts.map +1 -0
  144. package/build/re-captcha/guard.js +43 -0
  145. package/build/re-captcha/guard.js.map +1 -0
  146. package/build/re-captcha/index.d.ts +4 -0
  147. package/build/re-captcha/index.d.ts.map +1 -0
  148. package/build/re-captcha/index.js +3 -0
  149. package/build/re-captcha/index.js.map +1 -0
  150. package/build/re-captcha/token.d.ts +6 -0
  151. package/build/re-captcha/token.d.ts.map +1 -0
  152. package/build/re-captcha/token.js +74 -0
  153. package/build/re-captcha/token.js.map +1 -0
  154. package/build/re-captcha/types.d.ts +44 -0
  155. package/build/re-captcha/types.d.ts.map +1 -0
  156. package/build/re-captcha/types.js +2 -0
  157. package/build/re-captcha/types.js.map +1 -0
  158. package/build/service.d.ts +2 -3
  159. package/build/service.d.ts.map +1 -1
  160. package/build/service.js +136 -13
  161. package/build/service.js.map +1 -1
  162. package/build/types.local.d.ts +4 -0
  163. package/build/types.local.d.ts.map +1 -0
  164. package/build/types.local.js +2 -0
  165. package/build/types.local.js.map +1 -0
  166. package/package.json +33 -30
  167. package/src/actions/service.ts +10 -12
  168. package/src/actions/types.local.ts +6 -0
  169. package/src/entrypoints.ts +12 -0
  170. package/src/index.ts +2 -2
  171. package/src/manager/README.md +14 -18
  172. package/src/manager/actions/authenticate.ts +12 -0
  173. package/src/manager/actions/index.ts +3 -1
  174. package/src/manager/actions/init.ts +12 -0
  175. package/src/manager/actions/rely.ts +12 -0
  176. package/src/manager/consts.local.ts +1 -0
  177. package/src/manager/context.ts +0 -2
  178. package/src/manager/entrypoints.ts +17 -0
  179. package/src/manager/exports.ts +1 -2
  180. package/src/manager/index.ts +1 -1
  181. package/src/manager/main.ts +2 -2
  182. package/src/manager/model.ts +82 -41
  183. package/src/manager/plugins/basic-ed25519.ts +8 -8
  184. package/src/manager/plugins/basic-rely.ts +14 -9
  185. package/src/manager/plugins/consts.ts +7 -0
  186. package/src/manager/plugins/export.ts +5 -0
  187. package/src/manager/plugins/index.ts +10 -12
  188. package/src/manager/plugins/re-captcha/consts.local.ts +8 -0
  189. package/src/manager/plugins/re-captcha/consts.ts +8 -0
  190. package/src/manager/plugins/re-captcha/policy.ts +56 -0
  191. package/src/manager/plugins/re-captcha/types.ts +85 -0
  192. package/src/manager/plugins/re-captcha/verifier.ts +74 -0
  193. package/src/manager/plugins/re-captcha.ts +58 -43
  194. package/src/manager/plugins/supervisor.ts +9 -11
  195. package/src/manager/plugins/types.ts +23 -14
  196. package/src/manager/plugins/utils.ts +24 -14
  197. package/src/manager/rely/flow.ts +14 -11
  198. package/src/manager/rely.ts +2 -5
  199. package/src/manager/supervisor.ts +8 -54
  200. package/src/manager/types.local.ts +5 -0
  201. package/src/manager/types.ts +46 -1
  202. package/src/model/rely/consumer.ts +3 -1
  203. package/src/model/rely/peer.ts +8 -8
  204. package/src/model/rely/provider.ts +3 -1
  205. package/src/re-captcha/guard.ts +52 -0
  206. package/src/re-captcha/index.ts +3 -0
  207. package/src/re-captcha/token.ts +89 -0
  208. package/src/re-captcha/types.ts +45 -0
  209. package/src/service.ts +133 -19
  210. package/src/types.local.ts +5 -0
  211. package/tests/context.ts +3 -2
  212. package/tests/re-captcha.spec.ts +298 -0
  213. package/tests/replay-policy.spec.ts +36 -0
  214. package/tests/supervisor.spec.ts +6 -4
  215. package/build/.gitkeep +0 -0
  216. package/src/manager/actions/manager.ts +0 -23
  217. package/src/manager/modules.ts +0 -29
  218. package/src/modules.ts +0 -17
@@ -1,53 +1,12 @@
1
- import type { AuthPayload } from '@owlmeans/auth';
2
- import type { AppConfig, AppContext } from './types.js';
3
- /**
4
- * What a `SupervisorUserResolver` returns: the identity the supervisor-minted
5
- * token will represent. Only `userId` is required - the rest default sensibly.
6
- */
7
- export interface SupervisorUserResolution extends Partial<Pick<AuthPayload, 'profileId' | 'entityId' | 'role' | 'scopes'>> {
8
- userId: string;
9
- }
10
- /**
11
- * Find-or-create the target identity for a supervisor login. `register` reflects
12
- * `allowRegistration`; when false the resolver should only look existing users up.
13
- * Wire this to the project's identity store (e.g. `@owlmeans/server-auth-identity`).
14
- */
15
- export interface SupervisorUserResolver {
16
- <C extends AppConfig, T extends AppContext<C>>(userId: string, context: T, opts: {
17
- register: boolean;
18
- }): Promise<SupervisorUserResolution>;
19
- }
20
- /** Resolved options handed to the plugin factory. */
21
- export interface SupervisorPluginOptions {
22
- supervisors: string[];
23
- allowRegistration: boolean;
24
- resolveUser?: SupervisorUserResolver;
25
- }
26
- export interface SupervisorAuthOptions {
27
- /** Trusted-record aliases authorized to act as supervisor. Default: master + superuser. */
28
- supervisors?: string[];
29
- /** Find-or-create the target user by id/email. Default: trust the id as-is. */
30
- resolveUser?: SupervisorUserResolver;
31
- /** Allow minting a token for an unknown user (registration). Default: true. */
32
- allowRegistration?: boolean;
33
- /** Force enable/disable. Default: development only (cfg.debug.all || cfg.debug.supervisor). */
34
- enabled?: boolean;
35
- /**
36
- * Also accept internal owlmeans `Ed25519BasicToken`s even when another guard
37
- * (e.g. OIDC) is the primary guard on protected modules. Default: true.
38
- */
39
- acceptInternalTokens?: boolean;
40
- /** The internal-token guard to add as a coguard. Default: DEFAULT_GUARD ('auth'). */
41
- guard?: string;
42
- }
1
+ import type { AppConfig, AppContext, SupervisorAuthOptions } from './types.js';
43
2
  /**
44
3
  * Ensure the internal `Ed25519BasicToken` guard is accepted as a coguard on every
45
- * already-guarded backend module, so internal owlmeans tokens keep working even
4
+ * already-guarded backend entrypoint, so internal owlmeans tokens keep working even
46
5
  * when another guard (e.g. OIDC) is the primary guard. The primary guard stays
47
6
  * first; the internal guard is appended as a fallback (its `match` only fires for
48
7
  * an `Ed25519BasicToken` authorization header).
49
8
  */
50
- export declare const setupInternalTokenCoguard: (modules: Array<{
9
+ export declare const setupInternalTokenCoguard: (entrypoints: Array<{
51
10
  guards?: string[];
52
11
  }>, guard?: string) => void;
53
12
  /**
@@ -56,7 +15,7 @@ export declare const setupInternalTokenCoguard: (modules: Array<{
56
15
  *
57
16
  * It registers the supervisor auth plugin (verifies a front-end signature against
58
17
  * the allowlisted trusted keys, then resolves/registers the target user) and -
59
- * unless disabled - makes protected modules also accept internal owlmeans tokens
18
+ * unless disabled - makes protected entrypoints also accept internal owlmeans tokens
60
19
  * (requirement: understand internal tokens even when OIDC is the primary guard).
61
20
  */
62
21
  export declare const appendSupervisorAuth: <C extends AppConfig, T extends AppContext<C>>(context: T, opts?: SupervisorAuthOptions) => T;
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/manager/supervisor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvD;;;GAGG;AACH,MAAM,WAAW,wBAAyB,SAAQ,OAAO,CAAC,IAAI,CAAC,WAAW,EACxE,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAC3C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,GACtD,OAAO,CAAC,wBAAwB,CAAC,CAAA;CACrC;AAED,qDAAqD;AACrD,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,WAAW,CAAC,EAAE,sBAAsB,CAAA;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,sBAAsB,CAAA;IACpC,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,+FAA+F;IAC/F,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAOD;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,GACpC,SAAS,KAAK,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,EAAE,QAAO,MAAsB,KACnE,IAMF,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAC/E,SAAS,CAAC,EAAE,OAAO,qBAAqB,KACvC,CAyBF,CAAA"}
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/manager/supervisor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,qBAAqB,EAA2B,MAAM,YAAY,CAAA;AASvG;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,gBACvB,KAAK,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,UAAS,MAAM,KACvD,IAMF,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,WACtE,CAAC,SAAS,qBAAqB,KACvC,CAyBF,CAAA"}
@@ -2,17 +2,17 @@ import { AuthenticationType } from '@owlmeans/auth';
2
2
  import { DEFAULT_GUARD } from '@owlmeans/auth-common';
3
3
  import { registerPlugin } from './plugins/index.js';
4
4
  import { makeSupervisorPlugin } from './plugins/supervisor.js';
5
- const DEFAULT_SUPERVISORS = ['master', 'superuser'];
5
+ import { DEFAULT_SUPERVISORS } from './consts.local.js';
6
6
  const isDevelopment = (context) => context.cfg.debug?.all === true || context.cfg.debug?.supervisor === true;
7
7
  /**
8
8
  * Ensure the internal `Ed25519BasicToken` guard is accepted as a coguard on every
9
- * already-guarded backend module, so internal owlmeans tokens keep working even
9
+ * already-guarded backend entrypoint, so internal owlmeans tokens keep working even
10
10
  * when another guard (e.g. OIDC) is the primary guard. The primary guard stays
11
11
  * first; the internal guard is appended as a fallback (its `match` only fires for
12
12
  * an `Ed25519BasicToken` authorization header).
13
13
  */
14
- export const setupInternalTokenCoguard = (modules, guard = DEFAULT_GUARD) => {
15
- modules.forEach(module => {
14
+ export const setupInternalTokenCoguard = (entrypoints, guard = DEFAULT_GUARD) => {
15
+ entrypoints.forEach(module => {
16
16
  if (module.guards != null && module.guards.length > 0 && !module.guards.includes(guard)) {
17
17
  module.guards.push(guard);
18
18
  }
@@ -24,7 +24,7 @@ export const setupInternalTokenCoguard = (modules, guard = DEFAULT_GUARD) => {
24
24
  *
25
25
  * It registers the supervisor auth plugin (verifies a front-end signature against
26
26
  * the allowlisted trusted keys, then resolves/registers the target user) and -
27
- * unless disabled - makes protected modules also accept internal owlmeans tokens
27
+ * unless disabled - makes protected entrypoints also accept internal owlmeans tokens
28
28
  * (requirement: understand internal tokens even when OIDC is the primary guard).
29
29
  */
30
30
  export const appendSupervisorAuth = (context, opts) => {
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/manager/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AA+C9D,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;AAEnD,MAAM,aAAa,GAAG,CAAC,OAAqE,EAAW,EAAE,CACvG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;AAE3E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,OAAqC,EAAE,QAAgB,aAAa,EAC9D,EAAE;IACR,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACvB,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAU,EAAE,IAA4B,EACrC,EAAE;IACL,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAA;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,MAAM,QAAQ,GAA4B;QACxC,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,mBAAmB;QACrD,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,IAAI,IAAI;QAClD,WAAW,EAAE,IAAI,EAAE,WAAW;KAC/B,CAAA;IAED,cAAc,CACZ,kBAAkB,CAAC,UAAU,EAC7B,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,CAAC,GAAuC,EAAE,QAAQ,CAAC,CAAyC,CACzH,CAAA;IAED,IAAI,IAAI,EAAE,oBAAoB,KAAK,KAAK,EAAE,CAAC;QACzC,yBAAyB,CACvB,OAAO,CAAC,WAAW,EAA6C,EAChE,IAAI,EAAE,KAAK,IAAI,aAAa,CAC7B,CAAA;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/manager/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGrD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEvD,MAAM,aAAa,GAAG,CAAC,OAAqE,EAAW,EAAE,CACvG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;AAE3E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,WAAyC,EAAE,KAAK,GAAW,aAAa,EAClE,EAAE;IACR,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAC3B,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAU,EAAE,IAA4B,EACrC,EAAE;IACL,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAA;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,MAAM,QAAQ,GAA4B;QACxC,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,mBAAmB;QACrD,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,IAAI,IAAI;QAClD,WAAW,EAAE,IAAI,EAAE,WAAW;KAC/B,CAAA;IAED,cAAc,CACZ,kBAAkB,CAAC,UAAU,EAC7B,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,CAAC,GAAuC,EAAE,QAAQ,CAAC,CAAsB,CACtG,CAAA;IAED,IAAI,IAAI,EAAE,oBAAoB,KAAK,KAAK,EAAE,CAAC;QACzC,yBAAyB,CACvB,OAAO,CAAC,WAAW,EAA6C,EAChE,IAAI,EAAE,KAAK,IAAI,aAAa,CAC7B,CAAA;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { AllowanceRequest, AllowanceResponse, Auth, AuthCredentials, AuthToken, RelyToken } from '@owlmeans/auth';
1
+ import type { AllowanceRequest, AllowanceResponse, Auth, AuthCredentials, AuthToken, RelyToken, AuthPayload } from '@owlmeans/auth';
2
2
  import type { KlusterConfig } from '@owlmeans/kluster';
3
3
  import type { GuardService } from '@owlmeans/entrypoint';
4
4
  import type { ApiServerAppend } from '@owlmeans/server-api';
@@ -30,4 +30,44 @@ export interface RelyCarrier {
30
30
  source: RelyToken;
31
31
  rely: RelyToken;
32
32
  }
33
+ /**
34
+ * What a `SupervisorUserResolver` returns: the identity the supervisor-minted
35
+ * token will represent. Only `userId` is required - the rest default sensibly.
36
+ */
37
+ export interface SupervisorUserResolution extends Partial<Pick<AuthPayload, 'profileId' | 'entitySlug' | 'role' | 'scopes'>> {
38
+ userId: string;
39
+ }
40
+ /**
41
+ * Find-or-create the target identity for a supervisor login. `register` reflects
42
+ * `allowRegistration`; when false the resolver should only look existing users up.
43
+ * Wire this to the project's identity store (e.g. `@owlmeans/server-auth-identity`).
44
+ */
45
+ export interface SupervisorUserResolver {
46
+ <C extends AppConfig, T extends AppContext<C>>(userId: string, context: T, opts: {
47
+ register: boolean;
48
+ }): Promise<SupervisorUserResolution>;
49
+ }
50
+ /** Resolved options handed to the plugin factory. */
51
+ export interface SupervisorPluginOptions {
52
+ supervisors: string[];
53
+ allowRegistration: boolean;
54
+ resolveUser?: SupervisorUserResolver;
55
+ }
56
+ export interface SupervisorAuthOptions {
57
+ /** Trusted-record aliases authorized to act as supervisor. Default: master + superuser. */
58
+ supervisors?: string[];
59
+ /** Find-or-create the target user by id/email. Default: trust the id as-is. */
60
+ resolveUser?: SupervisorUserResolver;
61
+ /** Allow minting a token for an unknown user (registration). Default: true. */
62
+ allowRegistration?: boolean;
63
+ /** Force enable/disable. Default: development only (cfg.debug.all || cfg.debug.supervisor). */
64
+ enabled?: boolean;
65
+ /**
66
+ * Also accept internal owlmeans `Ed25519BasicToken`s even when another guard
67
+ * (e.g. OIDC) is the primary guard on protected entrypoints. Default: true.
68
+ */
69
+ acceptInternalTokens?: boolean;
70
+ /** The internal-token guard to add as a coguard. Default: DEFAULT_GUARD ('auth'). */
71
+ guard?: string;
72
+ }
33
73
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/manager/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AACtH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAErE,MAAM,WAAW,SAAU,SAAQ,YAAY,EAAE,aAAa;IAC5D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAE/D,YAAY,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,SAAS,CAAC,CAAA;IAEjE,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAChE;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC,EACjF,eAAe,EACf,oBAAoB;CAAI;AAE5B,MAAM,WAAW,WAAY,SAAQ,YAAY;CAChD;AAED,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,SAAS,CAAA;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/manager/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACnI,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAErE,MAAM,WAAW,SAAU,SAAQ,YAAY,EAAE,aAAa;IAC5D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAE/D,YAAY,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,SAAS,CAAC,CAAA;IAEjE,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAChE;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC,EACjF,eAAe,EACf,oBAAoB;CAAI;AAE5B,MAAM,WAAW,WAAY,SAAQ,YAAY;CAChD;AAED,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,SAAS,CAAA;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAyB,SAAQ,OAAO,CAAC,IAAI,CAAC,WAAW,EACxE,WAAW,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;IAChD,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAC3C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,GACtD,OAAO,CAAC,wBAAwB,CAAC,CAAA;CACrC;AAED,qDAAqD;AACrD,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,WAAW,CAAC,EAAE,sBAAsB,CAAA;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,sBAAsB,CAAA;IACpC,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,+FAA+F;IAC/F,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
@@ -0,0 +1,4 @@
1
+ import type { ServerConfig, ServerContext } from '@owlmeans/server-context';
2
+ export type Config = ServerConfig;
3
+ export type Context = ServerContext<Config>;
4
+ //# sourceMappingURL=types.local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.local.d.ts","sourceRoot":"","sources":["../../src/manager/types.local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAE3E,MAAM,MAAM,MAAM,GAAG,YAAY,CAAA;AAEjC,MAAM,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.local.js","sourceRoot":"","sources":["../../src/manager/types.local.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"trusted.d.ts","sourceRoot":"","sources":["../../../src/manager/utils/trusted.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,aAAa,CAAA;AAGxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAG1D,eAAO,MAAM,OAAO,GAAU,SAAS,UAAU,EAAE,WAAU,MAAqB,KAAG,OAAO,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,CAQzH,CAAA"}
1
+ {"version":3,"file":"trusted.d.ts","sourceRoot":"","sources":["../../../src/manager/utils/trusted.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,aAAa,CAAA;AAGxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAG1D,eAAO,MAAM,OAAO,YAAmB,UAAU,aAAY,MAAM,KAAkB,OAAO,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,CAQzH,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"trusted.js","sourceRoot":"","sources":["../../../src/manager/utils/trusted.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAA;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,OAAmB,EAAE,WAAmB,YAAY,EAA0C,EAAE;IAC5H,MAAM,OAAO,GAAG,MAAM,KAAK,CAAwB,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAE9E,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,WAAW,CAAC,gEAAgE,QAAQ,EAAE,CAAC,CAAA;IACnG,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;AACpC,CAAC,CAAA"}
1
+ {"version":3,"file":"trusted.js","sourceRoot":"","sources":["../../../src/manager/utils/trusted.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAA;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,OAAmB,EAAE,QAAQ,GAAW,YAAY,EAA0C,EAAE;IAC5H,MAAM,OAAO,GAAG,MAAM,KAAK,CAAwB,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAE9E,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,WAAW,CAAC,gEAAgE,QAAQ,EAAE,CAAC,CAAA;IACnG,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;AACpC,CAAC,CAAA"}
@@ -1,3 +1,5 @@
1
+ import type { RelyToken } from '@owlmeans/auth';
2
+ import type { EnvelopeModel } from '@owlmeans/basic-envelope';
1
3
  import type { RelyOptions } from './types.js';
2
- export declare const makeConsumerRely: (opts?: RelyOptions) => import("@owlmeans/basic-envelope").EnvelopeModel<import("@owlmeans/auth").RelyToken>;
4
+ export declare const makeConsumerRely: (opts?: RelyOptions) => EnvelopeModel<RelyToken>;
3
5
  //# sourceMappingURL=consumer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../../../src/model/rely/consumer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,eAAO,MAAM,gBAAgB,GAAI,OAAO,WAAW,yFAOlD,CAAA"}
1
+ {"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../../../src/model/rely/consumer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,eAAO,MAAM,gBAAgB,UAAW,WAAW,KAAG,aAAa,CAAC,SAAS,CAO5E,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"consumer.js","sourceRoot":"","sources":["../../../src/model/rely/consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAkB,EAAE,EAAE;IACrD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;IAC3B,OAAO,GAAG,CAAC,GAAG,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEf,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
1
+ {"version":3,"file":"consumer.js","sourceRoot":"","sources":["../../../src/model/rely/consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAKzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAkB,EAA4B,EAAE;IAC/E,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;IAC3B,OAAO,GAAG,CAAC,GAAG,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEf,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../../src/model/rely/peer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAI7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG7C,eAAO,MAAM,aAAa,GAAI,OAAO,WAAW,KAAG,aAAa,CAAC,SAAS,CAyBzE,CAAA"}
1
+ {"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../../src/model/rely/peer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAI7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAW7C,eAAO,MAAM,aAAa,UAAW,WAAW,KAAG,aAAa,CAAC,SAAS,CAyBzE,CAAA"}
@@ -3,6 +3,13 @@ import { makeEnvelopeModel } from '@owlmeans/basic-envelope';
3
3
  import { createRandomPrefix, createIdOfLength, IdStyle } from '@owlmeans/basic-ids';
4
4
  import { base58 } from '@scure/base';
5
5
  import { RELY_CALL_TIMEOUT } from '@owlmeans/auth-common';
6
+ const toNumber = (bytes) => {
7
+ let pinInt = 0n;
8
+ for (let i = bytes.length - 1; i >= 0; i--) {
9
+ pinInt = (pinInt << 8n) | BigInt(bytes[i]);
10
+ }
11
+ return pinInt.toString();
12
+ };
6
13
  export const makeRelyModel = (opts) => {
7
14
  const envelope = makeEnvelopeModel(RELY_3RD);
8
15
  const pinLength = opts?.pinLength ?? 6;
@@ -26,11 +33,4 @@ export const makeRelyModel = (opts) => {
26
33
  }, opts?.liveTime ?? RELY_CALL_TIMEOUT * 1000);
27
34
  return envelope;
28
35
  };
29
- const toNumber = (bytes) => {
30
- let pinInt = 0n;
31
- for (let i = bytes.length - 1; i >= 0; i--) {
32
- pinInt = (pinInt << 8n) | BigInt(bytes[i]);
33
- }
34
- return pinInt.toString();
35
- };
36
36
  //# sourceMappingURL=peer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"peer.js","sourceRoot":"","sources":["../../../src/model/rely/peer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAEzD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAkB,EAA4B,EAAE;IAC5E,MAAM,QAAQ,GAAG,iBAAiB,CAAY,QAAQ,CAAC,CAAA;IAEvD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,CAAC,CAAA;IACtC,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,CAAC,CAAA;IAC1C,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,EAAE,CAAA;IAC3C,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,EAAE,CAAA;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,WAAW,CAAA;IAC5B,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAA;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACvC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAA;IACzD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAA;IAEjD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IACtD,QAAQ,CAAC,IAAI,CAAC;QACZ,GAAG;QACH,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC;QACrD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC;QAC1D,KAAK,EAAE,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC;KACrD,EAAE,IAAI,EAAE,QAAQ,IAAI,iBAAiB,GAAG,IAAI,CAAC,CAAA;IAE9C,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,KAAiB,EAAU,EAAE;IAC7C,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAA;AAC1B,CAAC,CAAA"}
1
+ {"version":3,"file":"peer.js","sourceRoot":"","sources":["../../../src/model/rely/peer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAEzD,MAAM,QAAQ,GAAG,CAAC,KAAiB,EAAU,EAAE;IAC7C,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAA;AAC1B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAkB,EAA4B,EAAE;IAC5E,MAAM,QAAQ,GAAG,iBAAiB,CAAY,QAAQ,CAAC,CAAA;IAEvD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,CAAC,CAAA;IACtC,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,CAAC,CAAA;IAC1C,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,EAAE,CAAA;IAC3C,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,EAAE,CAAA;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,WAAW,CAAA;IAC5B,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAA;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACvC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAA;IACzD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAA;IAEjD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IACtD,QAAQ,CAAC,IAAI,CAAC;QACZ,GAAG;QACH,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC;QACrD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC;QAC1D,KAAK,EAAE,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC;KACrD,EAAE,IAAI,EAAE,QAAQ,IAAI,iBAAiB,GAAG,IAAI,CAAC,CAAA;IAE9C,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA"}
@@ -1,3 +1,5 @@
1
+ import type { RelyToken } from '@owlmeans/auth';
2
+ import type { EnvelopeModel } from '@owlmeans/basic-envelope';
1
3
  import type { RelyOptions } from './types.js';
2
- export declare const makeProviderRely: (opts?: RelyOptions) => import("@owlmeans/basic-envelope").EnvelopeModel<import("@owlmeans/auth").RelyToken>;
4
+ export declare const makeProviderRely: (opts?: RelyOptions) => EnvelopeModel<RelyToken>;
3
5
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/model/rely/provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,eAAO,MAAM,gBAAgB,GAAI,OAAO,WAAW,yFAIlD,CAAA"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/model/rely/provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,eAAO,MAAM,gBAAgB,UAAW,WAAW,KAAG,aAAa,CAAC,SAAS,CAI5E,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/model/rely/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAkB,EAAE,EAAE;IACrD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAEjC,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/model/rely/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAKzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAkB,EAA4B,EAAE;IAC/E,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAEjC,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { GuardService } from '@owlmeans/entrypoint';
2
+ /**
3
+ * The guard of a route a reCAPTCHA-proven guest may call once (`RECAPTCHA_GUARD`):
4
+ * `Authorization: RE-CAPTCHA <token>`, the token the auth manager's reCAPTCHA plugin issued.
5
+ *
6
+ * Every check of `ReCaptchaTokenHelper.inspect`, then the spend — a token admits one request. The
7
+ * request's `auth` is a guest (`GUEST_ID`, role Guest, `[AUTH_SCOPE]`, type ReCaptcha) with an empty
8
+ * `token`: whatever reads an authorization downstream may log it. A refused token is no credential at
9
+ * all, so the request is unauthenticated (401).
10
+ */
11
+ export declare const makeReCaptchaGuard: (alias?: string) => GuardService;
12
+ //# sourceMappingURL=guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/re-captcha/guard.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAqC,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAI3F;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,WAAW,MAAM,KAAqB,YAkCpE,CAAA"}
@@ -0,0 +1,43 @@
1
+ import { AUTH_SCOPE, AuthenticationType, AuthRole, GUEST_ID, RECAPTCHA_GUARD } from '@owlmeans/auth';
2
+ import { extractAuthToken } from '@owlmeans/auth-common/utils';
3
+ import { createService } from '@owlmeans/context';
4
+ import { reCaptchaTokenOf } from './token.js';
5
+ /**
6
+ * The guard of a route a reCAPTCHA-proven guest may call once (`RECAPTCHA_GUARD`):
7
+ * `Authorization: RE-CAPTCHA <token>`, the token the auth manager's reCAPTCHA plugin issued.
8
+ *
9
+ * Every check of `ReCaptchaTokenHelper.inspect`, then the spend — a token admits one request. The
10
+ * request's `auth` is a guest (`GUEST_ID`, role Guest, `[AUTH_SCOPE]`, type ReCaptcha) with an empty
11
+ * `token`: whatever reads an authorization downstream may log it. A refused token is no credential at
12
+ * all, so the request is unauthenticated (401).
13
+ */
14
+ export const makeReCaptchaGuard = (alias = RECAPTCHA_GUARD) => {
15
+ const service = createService(alias, {
16
+ match: async (req) => req != null && extractAuthToken(req, AuthenticationType.ReCaptcha) != null,
17
+ handle: async (req, res) => {
18
+ const context = service.assertCtx();
19
+ const tokens = reCaptchaTokenOf(context);
20
+ const guest = await tokens.inspect(req);
21
+ if (guest == null || !await tokens.spend(guest)) {
22
+ return false;
23
+ }
24
+ const auth = {
25
+ token: '',
26
+ type: AuthenticationType.ReCaptcha,
27
+ role: AuthRole.Guest,
28
+ userId: GUEST_ID,
29
+ scopes: [AUTH_SCOPE],
30
+ isUser: false,
31
+ source: context.cfg.service,
32
+ createdAt: new Date(),
33
+ expiresAt: guest.expiresAt,
34
+ };
35
+ res.resolve(auth);
36
+ return true;
37
+ },
38
+ /** Server-side guard: it verifies what arrives, it never produces a credential. */
39
+ authenticated: async () => null,
40
+ });
41
+ return service;
42
+ };
43
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/re-captcha/guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAEpG,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAK,GAAW,eAAe,EAAgB,EAAE;IAClF,MAAM,OAAO,GAAiB,aAAa,CAAe,KAAK,EAAE;QAC/D,KAAK,EAAE,KAAK,EAAC,GAAG,EAAC,EAAE,CAAC,GAAG,IAAI,IAAI,IAAI,gBAAgB,CAAC,GAAG,EAAE,kBAAkB,CAAC,SAAS,CAAC,IAAI,IAAI;QAE9F,MAAM,EAAE,KAAK,EAAK,GAAoB,EAAE,GAA2B,EAAE,EAAE;YACrE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAmB,CAAA;YACpD,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;YAExC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACvC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,OAAO,KAAU,CAAA;YACnB,CAAC;YAED,MAAM,IAAI,GAAS;gBACjB,KAAK,EAAE,EAAE;gBACT,IAAI,EAAE,kBAAkB,CAAC,SAAS;gBAClC,IAAI,EAAE,QAAQ,CAAC,KAAK;gBACpB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,CAAC,UAAU,CAAC;gBACpB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;gBAC3B,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAA;YACD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAEjB,OAAO,IAAS,CAAA;QAClB,CAAC;QAED,mFAAmF;QACnF,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;KAChC,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export type * from './types.js';
2
+ export * from './token.js';
3
+ export * from './guard.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/re-captcha/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './token.js';
2
+ export * from './guard.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/re-captcha/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { Context } from '../types.local.js';
2
+ import type { ReCaptchaTokenHelper } from './types.js';
3
+ export declare const makeReCaptchaTokenHelper: (context: Context) => ReCaptchaTokenHelper;
4
+ /** The reCAPTCHA token checks of a context — built once per context. */
5
+ export declare const reCaptchaTokenOf: (target: Context) => ReCaptchaTokenHelper;
6
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/re-captcha/token.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAU,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EAAoC,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAIxF,eAAO,MAAM,wBAAwB,YAAa,OAAO,KAAG,oBAoE3D,CAAA;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,2CAA+C,CAAA"}
@@ -0,0 +1,74 @@
1
+ import { AuthenticationType, AuthRole, AuthUnavailable, GUEST_ID } from '@owlmeans/auth';
2
+ import { extractAuthToken, trust } from '@owlmeans/auth-common/utils';
3
+ import { EnvelopeKind, makeEnvelopeModel } from '@owlmeans/basic-envelope';
4
+ import { TRUSTED } from '@owlmeans/config';
5
+ import { memoHelper } from '@owlmeans/context';
6
+ import { logger } from '@owlmeans/log';
7
+ import { RecordExists } from '@owlmeans/resource';
8
+ import { AUTH_CACHE, AUTH_SRV_KEY, AUTHEN_TIMEFRAME } from '../consts.js';
9
+ const log = logger('server-auth:re-captcha');
10
+ export const makeReCaptchaTokenHelper = (context) => {
11
+ const refuse = (reason) => {
12
+ log.debug('reCAPTCHA token refused', { reason }, { event: 'auth.refused' });
13
+ return null;
14
+ };
15
+ const verify = async (token) => {
16
+ let envelope;
17
+ try {
18
+ envelope = makeEnvelopeModel(token, EnvelopeKind.Token);
19
+ }
20
+ catch {
21
+ return refuse('token');
22
+ }
23
+ if (envelope.type() !== AuthenticationType.ReCaptcha) {
24
+ return refuse('type');
25
+ }
26
+ // A guest token lives no longer than its spend record does, so it can never be spent twice.
27
+ const ttl = envelope.envelope.ttl;
28
+ if (ttl == null || ttl > AUTHEN_TIMEFRAME) {
29
+ return refuse('ttl');
30
+ }
31
+ const signer = await trust(context, TRUSTED, AUTH_SRV_KEY);
32
+ // Signature and expiry: an envelope past `dt + ttl` does not verify.
33
+ if (!await envelope.verify(signer.key)) {
34
+ return refuse('signature');
35
+ }
36
+ const credential = envelope.message();
37
+ if (credential == null || typeof credential !== 'object') {
38
+ return refuse('token');
39
+ }
40
+ if (credential.credential !== signer.user.id) {
41
+ return refuse('issuer');
42
+ }
43
+ if (credential.type !== AuthenticationType.ReCaptcha || credential.role !== AuthRole.Guest
44
+ || credential.userId !== GUEST_ID) {
45
+ return refuse('guest');
46
+ }
47
+ if (typeof credential.challenge !== 'string' || credential.challenge === '') {
48
+ return refuse('challenge');
49
+ }
50
+ return { credential, challenge: credential.challenge, expiresAt: new Date(envelope.envelope.dt + ttl) };
51
+ };
52
+ const inspect = async (req) => {
53
+ const token = extractAuthToken(req, AuthenticationType.ReCaptcha);
54
+ return token == null || token === '' ? null : await verify(token);
55
+ };
56
+ const spend = async (guest) => {
57
+ try {
58
+ await context.resource(AUTH_CACHE)
59
+ .create({ id: guest.challenge }, { ttl: AUTHEN_TIMEFRAME / 1000 });
60
+ }
61
+ catch (error) {
62
+ if (error instanceof RecordExists || error?.type === RecordExists.typeName) {
63
+ log.debug('reCAPTCHA token refused', { reason: 'spent' }, { event: 'auth.refused' });
64
+ return false;
65
+ }
66
+ throw new AuthUnavailable('auth-cache');
67
+ }
68
+ return true;
69
+ };
70
+ return { inspect, verify, spend };
71
+ };
72
+ /** The reCAPTCHA token checks of a context — built once per context. */
73
+ export const reCaptchaTokenOf = memoHelper.oncePer(makeReCaptchaTokenHelper);
74
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/re-captcha/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { AuthCredentials } from '@owlmeans/auth';
2
+ import type { AbstractRequest } from '@owlmeans/entrypoint';
3
+ /** A reCAPTCHA guest token that passed every check but the spend. */
4
+ export interface ReCaptchaGuest {
5
+ /**
6
+ * The credential the auth manager signed: `GUEST_ID`, role Guest, type ReCaptcha, stamped with
7
+ * the auth service record's id. It names nobody.
8
+ */
9
+ credential: AuthCredentials;
10
+ /** The server-issued challenge the token carries — the key it is spent under in `AUTH_CACHE`. */
11
+ challenge: string;
12
+ /** When the token stops being accepted. */
13
+ expiresAt: Date;
14
+ }
15
+ /** Anything that carries request headers: an entrypoint request, or a raw Fastify request. */
16
+ export interface ReCaptchaCarrier extends Partial<Pick<AbstractRequest, 'headers'>> {
17
+ }
18
+ /**
19
+ * The checks of a reCAPTCHA guest token (`Authorization: RE-CAPTCHA <token>`), bound to the context
20
+ * whose `TRUSTED` record `AUTH_SRV_KEY` signed it and whose `AUTH_CACHE` spends it.
21
+ */
22
+ export interface ReCaptchaTokenHelper {
23
+ /**
24
+ * The guest a request carries, checked WITHOUT spending: envelope type, signature by the auth
25
+ * service key, TTL (at most `AUTHEN_TIMEFRAME`), the auth record's stamp, type ReCaptcha, role
26
+ * Guest, `GUEST_ID`, a server-issued challenge. Made for a pre-parse check (before a body is read);
27
+ * the route itself still needs the guard, which spends.
28
+ *
29
+ * @returns `null` for a request without such a header or with a token that fails a check.
30
+ * @throws {SyntaxError} when the context has no `AUTH_SRV_KEY` trusted record (a configuration fault).
31
+ */
32
+ inspect: (req: ReCaptchaCarrier) => Promise<ReCaptchaGuest | null>;
33
+ /** {@link inspect} for a bare token (the value after `RE-CAPTCHA `). */
34
+ verify: (token: string) => Promise<ReCaptchaGuest | null>;
35
+ /**
36
+ * Spend the token: an atomic create-once of its challenge in `AUTH_CACHE` (Redis `SET NX` in a
37
+ * backend context), under the same key a bearer exchange and the IAM finalizer claim.
38
+ *
39
+ * @returns `false` when the token was spent before.
40
+ * @throws {AuthUnavailable} when the cache cannot answer.
41
+ */
42
+ spend: (guest: ReCaptchaGuest) => Promise<boolean>;
43
+ }
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/re-captcha/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,UAAU,EAAE,eAAe,CAAA;IAC3B,iGAAiG;IACjG,SAAS,EAAE,MAAM,CAAA;IACjB,2CAA2C;IAC3C,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,8FAA8F;AAC9F,MAAM,WAAW,gBAAiB,SAAQ,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;CAAG;AAEtF;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;OAQG;IACH,OAAO,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAClE,wEAAwE;IACxE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IACzD;;;;;;OAMG;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACnD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/re-captcha/types.ts"],"names":[],"mappings":""}
@@ -1,7 +1,6 @@
1
- import type { ServerContext, ServerConfig } from '@owlmeans/server-context';
1
+ import type { ServerContext } from '@owlmeans/server-context';
2
2
  import type { AuthServiceAppend, AuthService } from './types.js';
3
- type Config = ServerConfig;
3
+ import type { Config } from './types.local.js';
4
4
  export declare const makeAuthService: (alias?: string) => AuthService;
5
5
  export declare const appendAuthService: <C extends Config, T extends ServerContext<C>>(ctx: T, alias?: string) => T & AuthServiceAppend;
6
- export {};
7
6
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAG3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAa,MAAM,YAAY,CAAA;AAU3E,KAAK,MAAM,GAAG,YAAY,CAAA;AAG1B,eAAO,MAAM,eAAe,GAAI,QAAO,MAAsB,KAAG,WA4F/D,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,EAC5E,KAAK,CAAC,EAAE,QAAO,MAAsB,KACpC,CAAC,GAAG,iBAaN,CAAA"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAG7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAa,MAAM,YAAY,CAAA;AAa3E,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,kBAAkB,CAAA;AAKvD,eAAO,MAAM,eAAe,WAAW,MAAM,KAAmB,WAqM/D,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,OACvE,CAAC,UAAS,MAAM,KACpB,CAAC,GAAG,iBAiBN,CAAA"}