@openora/core 0.4.1-canary.128 → 0.4.1-canary.129

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 (95) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/audit/__tests__/audit.service.int.test.js +45 -0
  3. package/dist/audit/__tests__/audit.service.int.test.js.map +1 -1
  4. package/dist/audit/plugin.d.ts.map +1 -1
  5. package/dist/audit/plugin.js +26 -0
  6. package/dist/audit/plugin.js.map +1 -1
  7. package/dist/compliance/contract/index.d.ts +1 -1
  8. package/dist/compliance/contract/rg.d.ts +2 -2
  9. package/dist/compliance/router/index.d.ts +1 -1
  10. package/dist/contracts/__tests__/identity.test.js +3 -2
  11. package/dist/contracts/__tests__/identity.test.js.map +1 -1
  12. package/dist/contracts/adapters/identity-reader.d.ts +6 -0
  13. package/dist/contracts/adapters/identity-reader.d.ts.map +1 -1
  14. package/dist/contracts/adapters/identity-reader.js.map +1 -1
  15. package/dist/contracts/schemas/__tests__/events.test.js +30 -0
  16. package/dist/contracts/schemas/__tests__/events.test.js.map +1 -1
  17. package/dist/contracts/schemas/events.d.ts +37 -0
  18. package/dist/contracts/schemas/events.d.ts.map +1 -1
  19. package/dist/contracts/schemas/events.js +29 -0
  20. package/dist/contracts/schemas/events.js.map +1 -1
  21. package/dist/contracts/schemas/identity.d.ts +28 -0
  22. package/dist/contracts/schemas/identity.d.ts.map +1 -1
  23. package/dist/contracts/schemas/identity.js +22 -1
  24. package/dist/contracts/schemas/identity.js.map +1 -1
  25. package/dist/engagement/notifications/plugin.d.ts +2 -2
  26. package/dist/engagement/notifications/plugin.d.ts.map +1 -1
  27. package/dist/engagement/notifications/plugin.js +71 -2
  28. package/dist/engagement/notifications/plugin.js.map +1 -1
  29. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.js +2 -2
  30. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.js.map +1 -1
  31. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.js +1 -1
  32. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.js.map +1 -1
  33. package/dist/pam/identity/__tests__/identity.service.int.test.js +67 -1
  34. package/dist/pam/identity/__tests__/identity.service.int.test.js.map +1 -1
  35. package/dist/pam/identity/__tests__/phone-login.service.int.test.js +23 -0
  36. package/dist/pam/identity/__tests__/phone-login.service.int.test.js.map +1 -1
  37. package/dist/pam/identity/__tests__/phone-verification.service.int.test.d.ts +2 -0
  38. package/dist/pam/identity/__tests__/phone-verification.service.int.test.d.ts.map +1 -0
  39. package/dist/pam/identity/__tests__/phone-verification.service.int.test.js +273 -0
  40. package/dist/pam/identity/__tests__/phone-verification.service.int.test.js.map +1 -0
  41. package/dist/pam/identity/adapters/identity-reader.service.d.ts +1 -0
  42. package/dist/pam/identity/adapters/identity-reader.service.d.ts.map +1 -1
  43. package/dist/pam/identity/adapters/identity-reader.service.js +8 -0
  44. package/dist/pam/identity/adapters/identity-reader.service.js.map +1 -1
  45. package/dist/pam/identity/contract/index.d.ts +40 -0
  46. package/dist/pam/identity/contract/index.d.ts.map +1 -1
  47. package/dist/pam/identity/contract/index.js +18 -1
  48. package/dist/pam/identity/contract/index.js.map +1 -1
  49. package/dist/pam/identity/drizzle/migrations/0010_lying_young_avengers.sql +19 -0
  50. package/dist/pam/identity/drizzle/migrations/meta/0010_snapshot.json +1066 -0
  51. package/dist/pam/identity/drizzle/migrations/meta/_journal.json +7 -0
  52. package/dist/pam/identity/plugin.d.ts.map +1 -1
  53. package/dist/pam/identity/plugin.js +9 -0
  54. package/dist/pam/identity/plugin.js.map +1 -1
  55. package/dist/pam/identity/react/account.d.ts +9 -1
  56. package/dist/pam/identity/react/account.d.ts.map +1 -1
  57. package/dist/pam/identity/react/account.js +33 -5
  58. package/dist/pam/identity/react/account.js.map +1 -1
  59. package/dist/pam/identity/router/index.d.ts +42 -1
  60. package/dist/pam/identity/router/index.d.ts.map +1 -1
  61. package/dist/pam/identity/router/index.js +28 -2
  62. package/dist/pam/identity/router/index.js.map +1 -1
  63. package/dist/pam/identity/schema/index.d.ts +195 -0
  64. package/dist/pam/identity/schema/index.d.ts.map +1 -1
  65. package/dist/pam/identity/schema/index.js +26 -0
  66. package/dist/pam/identity/schema/index.js.map +1 -1
  67. package/dist/pam/identity/service/identity.service.d.ts +4 -1
  68. package/dist/pam/identity/service/identity.service.d.ts.map +1 -1
  69. package/dist/pam/identity/service/identity.service.js +140 -1
  70. package/dist/pam/identity/service/identity.service.js.map +1 -1
  71. package/dist/pam/identity/service/phone-login.service.d.ts.map +1 -1
  72. package/dist/pam/identity/service/phone-login.service.js +34 -19
  73. package/dist/pam/identity/service/phone-login.service.js.map +1 -1
  74. package/dist/pam/identity/service/phone-verification.service.d.ts +38 -0
  75. package/dist/pam/identity/service/phone-verification.service.d.ts.map +1 -0
  76. package/dist/pam/identity/service/phone-verification.service.js +257 -0
  77. package/dist/pam/identity/service/phone-verification.service.js.map +1 -0
  78. package/dist/pam/identity/service/security-controls.service.d.ts +4 -0
  79. package/dist/pam/identity/service/security-controls.service.d.ts.map +1 -0
  80. package/dist/pam/identity/service/security-controls.service.js +28 -0
  81. package/dist/pam/identity/service/security-controls.service.js.map +1 -0
  82. package/dist/pam/react.d.ts +1 -1
  83. package/dist/pam/react.d.ts.map +1 -1
  84. package/dist/pam/react.js +1 -1
  85. package/dist/pam/react.js.map +1 -1
  86. package/dist/pam/shared/otp.d.ts +3 -0
  87. package/dist/pam/shared/otp.d.ts.map +1 -0
  88. package/dist/pam/shared/otp.js +11 -0
  89. package/dist/pam/shared/otp.js.map +1 -0
  90. package/dist/testing/mock.d.ts.map +1 -1
  91. package/dist/testing/mock.js +1 -0
  92. package/dist/testing/mock.js.map +1 -1
  93. package/dist/testing/seed-player.d.ts +4 -0
  94. package/dist/testing/seed-player.d.ts.map +1 -1
  95. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { createHash, randomInt, randomUUID } from 'node:crypto';
1
+ import { randomUUID } from 'node:crypto';
2
2
  import { ORPCError } from '@orpc/server';
3
3
  import { assertRateLimit, signSessionCookie, createLogger, invalidate, } from '@openora/core/server';
4
4
  import { and, eq, gt, sql } from 'drizzle-orm';
@@ -7,6 +7,7 @@ import { user, session, smsOtpSession } from '../schema/index.js';
7
7
  import { captureTimezone } from './capture-timezone.service.js';
8
8
  import { assertAccountNotBlocked } from './rg-guard.service.js';
9
9
  import { DEFAULT_MAX_LOGIN_ATTEMPTS, createAccountLockedError, hasFailedLoginWindowExpired, makeLoginSecurityState, } from './lockout-policy.service.js';
10
+ import { hashCode, generateCode } from '../../shared/otp.js';
10
11
  const MINUTE_MS = 60 * 1000;
11
12
  const OTP_TTL_MS = 5 * MINUTE_MS;
12
13
  const RESEND_COOLDOWN_MS = MINUTE_MS;
@@ -48,16 +49,6 @@ export function OtpCancelledError() {
48
49
  data: { reason: PhoneLoginErrorReasonSchema.enum.otp_cancelled },
49
50
  });
50
51
  }
51
- function hashCode(code) {
52
- return createHash('sha256').update(code).digest('hex');
53
- }
54
- function generateCode() {
55
- const code = randomInt(0, 1_000_000).toString().padStart(6, '0');
56
- if (process.env['NODE_ENV'] !== 'production') {
57
- console.log(`SMS Verification code sent: ${code}`); // oxlint-disable-line no-console
58
- }
59
- return code;
60
- }
61
52
  function serializeUser(u) {
62
53
  const base = {
63
54
  id: u.id,
@@ -123,15 +114,25 @@ export class PhoneLoginService {
123
114
  const now = Date.now();
124
115
  const expiresAt = new Date(now + OTP_TTL_MS);
125
116
  const resendAfter = new Date(now + RESEND_COOLDOWN_MS);
117
+ // Role-filtered at the source: SMS is a single factor, so this flow only ever
118
+ // resolves a player. A backoffice account with a verified number stays on password
119
+ // plus its own second factor, and never becomes reachable through an SMS code.
126
120
  const [account] = await this.drizzle.db
127
- .select({ id: user.id, phoneVerified: user.phoneVerified })
121
+ .select({
122
+ id: user.id,
123
+ phoneVerified: user.phoneVerified,
124
+ twoFactorEnabled: user.twoFactorEnabled,
125
+ })
128
126
  .from(user)
129
- .where(eq(user.phoneNumber, phone))
127
+ .where(and(eq(user.phoneNumber, phone), eq(user.role, 'player')))
130
128
  .limit(1);
131
- // Anti-enumeration: an unknown or unverified phone gets the same success-shaped
132
- // response, minus the SMS. A caller cannot distinguish a real verified number from
133
- // a fake or unverified one.
134
- if (!account || !account.phoneVerified) {
129
+ // Anti-enumeration: an unknown, unverified, non-player, or 2FA-enabled phone gets the
130
+ // same success-shaped response, minus the SMS. A 2FA-enabled account's phone login is
131
+ // always rejected once the OTP is entered (see the guard below in `verifyOtp`), so
132
+ // sending a real code here would just be a billable no-op; folding it into the same
133
+ // shadow path also keeps a caller from telling 2FA-enabled accounts apart from
134
+ // unknown/unverified ones by response shape alone.
135
+ if (!account || !account.phoneVerified || account.twoFactorEnabled) {
135
136
  const key = phoneOtpShadowKey(phone);
136
137
  const shadow = await this.shadowGet(key);
137
138
  if (shadow && now - shadow.createdAt < RESEND_COOLDOWN_MS) {
@@ -309,8 +310,15 @@ export class PhoneLoginService {
309
310
  suspended: { reason: PhoneLoginErrorReasonSchema.enum.account_suspended },
310
311
  },
311
312
  });
312
- // Mint the session directly - bypasses better-auth's TOTP plugin chain by design,
313
- // so phone login never triggers a second factor.
313
+ // This flow mints sessions directly and cannot hand a challenge to better-auth's
314
+ // pending-2FA cookie. Refuse rather than silently downgrade a 2FA-protected
315
+ // account to a single SMS factor; a later dedicated handoff may replace this.
316
+ if (account.twoFactorEnabled) {
317
+ throw new ORPCError('FORBIDDEN', {
318
+ message: 'Phone login requires an authenticator challenge for this account.',
319
+ });
320
+ }
321
+ // Mint the session directly only after the no-2FA guard above.
314
322
  // Delete the OTP and insert the new session atomically: if the insert fails the
315
323
  // OTP is not consumed and the user can retry with the same code.
316
324
  const token = randomUUID();
@@ -345,6 +353,13 @@ export class PhoneLoginService {
345
353
  ip,
346
354
  userAgent,
347
355
  });
356
+ this.events.emit('identity.authentication.succeeded', {
357
+ userId: account.id,
358
+ playerId,
359
+ method: 'phone',
360
+ ip,
361
+ userAgent,
362
+ });
348
363
  // Only once the OTP has cleared and the session exists.
349
364
  await captureTimezone(this.playerProvisioning, account.id, timezone);
350
365
  const authContext = await this.auth.$context;
@@ -1 +1 @@
1
- {"version":3,"file":"phone-login.service.js","sourceRoot":"","sources":["../../../../src/pam/identity/service/phone-login.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"phone-login.service.js","sourceRoot":"","sources":["../../../../src/pam/identity/service/phone-login.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type Auth, type EventBus, type DrizzleService, type NodeHeaders } from '@openora/core/server';
2
+ import type { ClientMeta, IdentityReader, PhoneVerificationConfirmInput, PhoneVerificationRequestInput, PhoneVerificationRequestOutput, RateLimiterAdapter, SecurityControls, SmsAdapter, User } from '@openora/core/contracts';
3
+ import { type Session } from '../schema/index.js';
4
+ import type { TwoFactorLockoutService } from './two-factor-lockout.service.js';
5
+ export type PhoneVerificationServiceDeps = {
6
+ drizzle: DrizzleService;
7
+ events: EventBus;
8
+ sms: SmsAdapter;
9
+ limiter: RateLimiterAdapter;
10
+ auth: Auth;
11
+ identityReader: IdentityReader;
12
+ twoFactorLockout?: TwoFactorLockoutService;
13
+ };
14
+ export declare class PhoneVerificationService {
15
+ private readonly drizzle;
16
+ private readonly events;
17
+ private readonly sms;
18
+ private readonly limiter;
19
+ private readonly auth;
20
+ private readonly identityReader;
21
+ private readonly twoFactorLockout?;
22
+ constructor({ drizzle, events, sms, limiter, auth, identityReader, twoFactorLockout, }: PhoneVerificationServiceDeps);
23
+ private assertFreshReauthentication;
24
+ request({ userId, sessionId, input, reqHeaders, meta, }: {
25
+ userId: User['id'];
26
+ sessionId: Session['id'];
27
+ input: PhoneVerificationRequestInput;
28
+ reqHeaders: NodeHeaders;
29
+ meta: ClientMeta;
30
+ }): Promise<PhoneVerificationRequestOutput>;
31
+ confirm({ userId, sessionId, input, meta, }: {
32
+ userId: User['id'];
33
+ sessionId: Session['id'];
34
+ input: PhoneVerificationConfirmInput;
35
+ meta: ClientMeta;
36
+ }): Promise<SecurityControls>;
37
+ }
38
+ //# sourceMappingURL=phone-verification.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-verification.service.d.ts","sourceRoot":"","sources":["../../../../src/pam/identity/service/phone-verification.service.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,WAAW,EAEjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,6BAA6B,EAC7B,6BAA6B,EAC7B,8BAA8B,EAC9B,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACV,IAAI,EACL,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAA2C,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE3F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAyC/E,MAAM,MAAM,4BAA4B,GAAG;IACzC,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,QAAQ,CAAC;IACjB,GAAG,EAAE,UAAU,CAAC;IAChB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,cAAc,EAAE,cAAc,CAAC;IAC/B,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;CAC5C,CAAC;AAEF,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAA0B;gBAEhD,EACV,OAAO,EACP,MAAM,EACN,GAAG,EACH,OAAO,EACP,IAAI,EACJ,cAAc,EACd,gBAAgB,GACjB,EAAE,4BAA4B;YAUjB,2BAA2B;IA0DnC,OAAO,CAAC,EACZ,MAAM,EACN,SAAS,EACT,KAAK,EACL,UAAU,EACV,IAAI,GACL,EAAE;QACD,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,EAAE,6BAA6B,CAAC;QACrC,UAAU,EAAE,WAAW,CAAC;QACxB,IAAI,EAAE,UAAU,CAAC;KAClB,GAAG,OAAO,CAAC,8BAA8B,CAAC;IA2FrC,OAAO,CAAC,EACZ,MAAM,EACN,SAAS,EACT,KAAK,EACL,IAAI,GACL,EAAE;QACD,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,EAAE,6BAA6B,CAAC;QACrC,IAAI,EAAE,UAAU,CAAC;KAClB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA8F9B"}
@@ -0,0 +1,257 @@
1
+ import { ORPCError } from '@orpc/server';
2
+ import { DatabaseError } from 'pg';
3
+ import { and, eq, gt, isNotNull, sql } from 'drizzle-orm';
4
+ import { assertRateLimit, } from '@openora/core/server';
5
+ import { account, phoneVerificationSession, user } from '../schema/index.js';
6
+ import { getSecurityControls } from './security-controls.service.js';
7
+ import { nodeHeadersToHeaders } from '../../shared/headers-mapper.js';
8
+ import { hashCode, generateCode } from '../../shared/otp.js';
9
+ const MINUTE_MS = 60 * 1000;
10
+ const OTP_TTL_MS = 5 * MINUTE_MS;
11
+ const RESEND_COOLDOWN_MS = MINUTE_MS;
12
+ const MAX_VERIFY_ATTEMPTS = 5;
13
+ const REAUTH_TTL_MS = 5 * MINUTE_MS;
14
+ const REQUEST_RATE_LIMIT = { limit: 3, windowMs: 15 * MINUTE_MS, onUnavailable: 'deny' };
15
+ const VERIFY_RATE_LIMIT = { limit: 10, windowMs: 5 * MINUTE_MS, onUnavailable: 'deny' };
16
+ function phoneVerificationCooldownError(retryAfterMs) {
17
+ return new ORPCError('TOO_MANY_REQUESTS', {
18
+ message: 'A code was already sent. Please wait before requesting another.',
19
+ data: { retryAfterMs },
20
+ });
21
+ }
22
+ function phoneVerificationInvalidError() {
23
+ return new ORPCError('UNPROCESSABLE_CONTENT', { message: 'The code is invalid or expired.' });
24
+ }
25
+ function isPhoneNumberCollision(error) {
26
+ const cause = error instanceof DatabaseError ? error : error?.cause;
27
+ return (cause instanceof DatabaseError &&
28
+ cause.code === '23505' &&
29
+ cause.constraint === 'user_phoneNumber_unique');
30
+ }
31
+ export class PhoneVerificationService {
32
+ drizzle;
33
+ events;
34
+ sms;
35
+ limiter;
36
+ auth;
37
+ identityReader;
38
+ twoFactorLockout;
39
+ constructor({ drizzle, events, sms, limiter, auth, identityReader, twoFactorLockout, }) {
40
+ this.drizzle = drizzle;
41
+ this.events = events;
42
+ this.sms = sms;
43
+ this.limiter = limiter;
44
+ this.auth = auth;
45
+ this.identityReader = identityReader;
46
+ this.twoFactorLockout = twoFactorLockout;
47
+ }
48
+ async assertFreshReauthentication({ userId, headers, currentPassword, totpCode, twoFactorEnabled, meta, }) {
49
+ const [credential] = await this.drizzle.db
50
+ .select({ password: account.password })
51
+ .from(account)
52
+ .where(and(eq(account.userId, userId), isNotNull(account.password)))
53
+ .limit(1);
54
+ if (!credential?.password) {
55
+ throw new ORPCError('UNAUTHORIZED', { message: 'Current password is invalid.' });
56
+ }
57
+ const authContext = await this.auth.$context;
58
+ const passwordMatches = await authContext.password.verify({
59
+ password: currentPassword,
60
+ hash: credential.password,
61
+ });
62
+ if (!passwordMatches) {
63
+ throw new ORPCError('UNAUTHORIZED', { message: 'Current password is invalid.' });
64
+ }
65
+ if (!twoFactorEnabled) {
66
+ return;
67
+ }
68
+ if (!totpCode) {
69
+ throw new ORPCError('UNPROCESSABLE_CONTENT', {
70
+ message: 'An authenticator code is required.',
71
+ });
72
+ }
73
+ await this.twoFactorLockout?.assertNotLocked(userId);
74
+ // Library boundary: the base Auth API type omits endpoints contributed by the
75
+ // twoFactor plugin, but createAuth always installs that plugin for identity.
76
+ const api = this.auth.api;
77
+ const verification = await api.verifyTOTP({
78
+ body: { code: totpCode, trustDevice: false },
79
+ headers,
80
+ asResponse: true,
81
+ });
82
+ if (!verification.ok) {
83
+ await this.twoFactorLockout?.recordFailure(userId, meta);
84
+ throw new ORPCError('UNAUTHORIZED', { message: 'Invalid authenticator code.' });
85
+ }
86
+ await this.twoFactorLockout?.reset(userId);
87
+ }
88
+ async request({ userId, sessionId, input, reqHeaders, meta, }) {
89
+ await assertRateLimit(this.limiter, `phone-verification-request:${userId}`, REQUEST_RATE_LIMIT);
90
+ const [caller] = await this.drizzle.db
91
+ .select({ role: user.role, twoFactorEnabled: user.twoFactorEnabled })
92
+ .from(user)
93
+ .where(eq(user.id, userId))
94
+ .limit(1);
95
+ if (!caller) {
96
+ throw new ORPCError('UNAUTHORIZED', { message: 'Not signed in.' });
97
+ }
98
+ // A verified number is also a login credential: PhoneLoginService mints a session
99
+ // from an SMS code alone. Binding one therefore stays a player-only control, so a
100
+ // backoffice account cannot trade its password login for a single SMS factor.
101
+ if (caller.role !== 'player') {
102
+ throw new ORPCError('FORBIDDEN', {
103
+ message: 'Only players can verify a phone number.',
104
+ });
105
+ }
106
+ await this.assertFreshReauthentication({
107
+ userId,
108
+ headers: nodeHeadersToHeaders(reqHeaders),
109
+ currentPassword: input.currentPassword,
110
+ totpCode: input.totpCode,
111
+ twoFactorEnabled: caller.twoFactorEnabled ?? false,
112
+ meta,
113
+ });
114
+ const now = new Date();
115
+ const [phoneOwner] = await this.drizzle.db
116
+ .select({ id: user.id })
117
+ .from(user)
118
+ .where(eq(user.phoneNumber, input.phone))
119
+ .limit(1);
120
+ // Anti-enumeration, the same trade PhoneLoginService makes for this identifier: a
121
+ // number owned by someone else answers with the ordinary success shape and no SMS,
122
+ // rather than a CONFLICT that would confirm to any signed-in player that a given
123
+ // number belongs to an account here. No challenge is written, so `confirm` then fails
124
+ // as invalid-or-expired, which is indistinguishable from a wrong code.
125
+ if (phoneOwner && phoneOwner.id !== userId) {
126
+ return {
127
+ expiresAt: new Date(now.getTime() + OTP_TTL_MS).toISOString(),
128
+ resendAfter: new Date(now.getTime() + RESEND_COOLDOWN_MS).toISOString(),
129
+ };
130
+ }
131
+ const [existing] = await this.drizzle.db
132
+ .select({ createdAt: phoneVerificationSession.createdAt })
133
+ .from(phoneVerificationSession)
134
+ .where(and(eq(phoneVerificationSession.userId, userId), gt(phoneVerificationSession.expiresAt, now)))
135
+ .limit(1);
136
+ const elapsedMs = existing ? now.getTime() - existing.createdAt.getTime() : RESEND_COOLDOWN_MS;
137
+ if (elapsedMs < RESEND_COOLDOWN_MS) {
138
+ throw phoneVerificationCooldownError(RESEND_COOLDOWN_MS - elapsedMs);
139
+ }
140
+ const code = generateCode();
141
+ const expiresAt = new Date(now.getTime() + OTP_TTL_MS);
142
+ await this.drizzle.db
143
+ .insert(phoneVerificationSession)
144
+ .values({
145
+ userId,
146
+ sessionId,
147
+ phone: input.phone,
148
+ codeHash: hashCode(code),
149
+ reauthenticatedAt: now,
150
+ expiresAt,
151
+ })
152
+ .onConflictDoUpdate({
153
+ target: phoneVerificationSession.userId,
154
+ set: {
155
+ sessionId,
156
+ phone: input.phone,
157
+ codeHash: hashCode(code),
158
+ reauthenticatedAt: now,
159
+ expiresAt,
160
+ failedAttempts: 0,
161
+ createdAt: now,
162
+ },
163
+ });
164
+ await this.sms.sendOtp({ to: input.phone, code });
165
+ return {
166
+ expiresAt: expiresAt.toISOString(),
167
+ resendAfter: new Date(now.getTime() + RESEND_COOLDOWN_MS).toISOString(),
168
+ };
169
+ }
170
+ async confirm({ userId, sessionId, input, meta, }) {
171
+ await assertRateLimit(this.limiter, `phone-verification-confirm:${userId}`, VERIFY_RATE_LIMIT);
172
+ const now = new Date();
173
+ const [otp] = await this.drizzle.db
174
+ .select({
175
+ id: phoneVerificationSession.id,
176
+ sessionId: phoneVerificationSession.sessionId,
177
+ phone: phoneVerificationSession.phone,
178
+ codeHash: phoneVerificationSession.codeHash,
179
+ reauthenticatedAt: phoneVerificationSession.reauthenticatedAt,
180
+ failedAttempts: phoneVerificationSession.failedAttempts,
181
+ })
182
+ .from(phoneVerificationSession)
183
+ .where(and(eq(phoneVerificationSession.userId, userId), gt(phoneVerificationSession.expiresAt, now)))
184
+ .limit(1);
185
+ if (!otp ||
186
+ otp.sessionId !== sessionId ||
187
+ now.getTime() - otp.reauthenticatedAt.getTime() > REAUTH_TTL_MS) {
188
+ throw phoneVerificationInvalidError();
189
+ }
190
+ if (hashCode(input.code) !== otp.codeHash) {
191
+ // Outside any transaction on purpose: a rejected attempt has to survive the throw
192
+ // that rejects it, and the increment is atomic so concurrent guesses cannot each
193
+ // read a stale count and slip past the cap (same shape as PhoneLoginService).
194
+ const [attempt] = await this.drizzle.db
195
+ .update(phoneVerificationSession)
196
+ .set({ failedAttempts: sql `${phoneVerificationSession.failedAttempts} + 1` })
197
+ .where(eq(phoneVerificationSession.id, otp.id))
198
+ .returning({ failedAttempts: phoneVerificationSession.failedAttempts });
199
+ if (attempt !== undefined && attempt.failedAttempts >= MAX_VERIFY_ATTEMPTS) {
200
+ await this.drizzle.db
201
+ .delete(phoneVerificationSession)
202
+ .where(eq(phoneVerificationSession.id, otp.id));
203
+ }
204
+ throw phoneVerificationInvalidError();
205
+ }
206
+ let previousPhoneVerified = false;
207
+ try {
208
+ await this.drizzle.db.transaction(async (tx) => {
209
+ // Consuming the challenge and binding the number commit together, and the
210
+ // conditional delete is what makes a concurrent second confirm lose the race:
211
+ // only the transaction whose DELETE returns a row proceeds to the update.
212
+ const [consumed] = await tx
213
+ .delete(phoneVerificationSession)
214
+ .where(eq(phoneVerificationSession.id, otp.id))
215
+ .returning({ id: phoneVerificationSession.id });
216
+ if (!consumed) {
217
+ throw phoneVerificationInvalidError();
218
+ }
219
+ // Read before the write: RETURNING yields the new row, and the audit record needs
220
+ // the state this verification replaced.
221
+ const [before] = await tx
222
+ .select({ phoneVerified: user.phoneVerified })
223
+ .from(user)
224
+ .where(eq(user.id, userId))
225
+ .limit(1);
226
+ const [updated] = await tx
227
+ .update(user)
228
+ .set({ phoneNumber: otp.phone, phoneVerified: true, phoneVerifiedAt: new Date() })
229
+ .where(eq(user.id, userId))
230
+ .returning({ id: user.id });
231
+ if (!updated) {
232
+ throw new ORPCError('UNAUTHORIZED', { message: 'Not signed in.' });
233
+ }
234
+ previousPhoneVerified = before?.phoneVerified ?? false;
235
+ });
236
+ }
237
+ catch (error) {
238
+ if (isPhoneNumberCollision(error)) {
239
+ throw new ORPCError('CONFLICT', { message: 'Phone number is unavailable.' });
240
+ }
241
+ throw error;
242
+ }
243
+ const controls = await getSecurityControls(this.drizzle, userId);
244
+ if (!controls) {
245
+ throw new ORPCError('UNAUTHORIZED', { message: 'Not signed in.' });
246
+ }
247
+ this.events.emit('identity.phone.verified', {
248
+ userId,
249
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
250
+ previousPhoneVerified,
251
+ ip: meta.ip,
252
+ userAgent: meta.userAgent,
253
+ });
254
+ return controls;
255
+ }
256
+ }
257
+ //# sourceMappingURL=phone-verification.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-verification.service.js","sourceRoot":"","sources":["../../../../src/pam/identity/service/phone-verification.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DrizzleService } from '@openora/core/server';
2
+ import { type SecurityControls, type User } from '@openora/core/contracts';
3
+ export declare function getSecurityControls(drizzle: DrizzleService, userId: User['id']): Promise<SecurityControls | null>;
4
+ //# sourceMappingURL=security-controls.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-controls.service.d.ts","sourceRoot":"","sources":["../../../../src/pam/identity/service/security-controls.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAmB,KAAK,gBAAgB,EAAE,KAAK,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAI5F,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GACjB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAuBlC"}
@@ -0,0 +1,28 @@
1
+ import { E164PhoneSchema } from '@openora/core/contracts';
2
+ import { eq } from 'drizzle-orm';
3
+ import { user } from '../schema/index.js';
4
+ export async function getSecurityControls(drizzle, userId) {
5
+ const [row] = await drizzle.db
6
+ .select({
7
+ passwordMeetsPolicy: user.passwordMeetsPolicy,
8
+ emailVerified: user.emailVerified,
9
+ phoneNumber: user.phoneNumber,
10
+ phoneVerified: user.phoneVerified,
11
+ twoFactorEnabled: user.twoFactorEnabled,
12
+ loginWithdrawalAlertsEnabled: user.loginWithdrawalAlertsEnabled,
13
+ })
14
+ .from(user)
15
+ .where(eq(user.id, userId))
16
+ .limit(1);
17
+ if (!row) {
18
+ return null;
19
+ }
20
+ const phone = E164PhoneSchema.safeParse(row.phoneNumber);
21
+ return {
22
+ ...row,
23
+ phoneNumber: phone.success ? phone.data : null,
24
+ phoneVerified: phone.success && row.phoneVerified,
25
+ twoFactorEnabled: row.twoFactorEnabled ?? false,
26
+ };
27
+ }
28
+ //# sourceMappingURL=security-controls.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-controls.service.js","sourceRoot":"","sources":["../../../../src/pam/identity/service/security-controls.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAoC,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAuB,EACvB,MAAkB;IAElB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE;SAC3B,MAAM,CAAC;QACN,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,4BAA4B,EAAE,IAAI,CAAC,4BAA4B;KAChE,CAAC;SACD,IAAI,CAAC,IAAI,CAAC;SACV,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;SAC1B,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzD,OAAO;QACL,GAAG,GAAG;QACN,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QAC9C,aAAa,EAAE,KAAK,CAAC,OAAO,IAAI,GAAG,CAAC,aAAa;QACjD,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,IAAI,KAAK;KAChD,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
1
  export { useCurrentUser, useLogin, useLogout, useRegister, useRequestPasswordReset, useResetPassword, } from './identity/react/auth.js';
2
- export { useEnable2fa, useVerify2fa, useDisable2fa, useVerifyEmail, useUpdateProfile, useChangePassword, useSendEmailVerification, useMySessions, useRevokeMySession, type Enable2faResult, } from './identity/react/account.js';
2
+ export { useEnable2fa, useVerify2fa, useDisable2fa, useVerifyEmail, useUpdateProfile, useChangePassword, useSendEmailVerification, useMySecurityControls, useSetLoginWithdrawalAlerts, useRequestPhoneVerification, useConfirmPhoneVerification, useMySessions, useRevokeMySession, type Enable2faResult, type UseMySecurityControlsResult, type UseSetLoginWithdrawalAlertsResult, type UseRequestPhoneVerificationResult, type UseConfirmPhoneVerificationResult, } from './identity/react/account.js';
3
3
  export { usePlayerProfile, useUpdatePlayerProfile, useDisplayCurrency, useSetDisplayCurrency, type PlayerProfile, type DisplayCurrencyInfo, } from './profile/react/profile.js';
4
4
  //# sourceMappingURL=react.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/pam/react.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,EACxB,aAAa,EACb,kBAAkB,EAClB,KAAK,eAAe,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/pam/react.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACrB,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,EAC3B,aAAa,EACb,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,GACvC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,4BAA4B,CAAC"}
package/dist/pam/react.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // `@openora/core/pam/react` - domain-owned hooks, keeping the base @openora/core/react SDK domain-agnostic.
2
2
  export { useCurrentUser, useLogin, useLogout, useRegister, useRequestPasswordReset, useResetPassword, } from './identity/react/auth.js';
3
- export { useEnable2fa, useVerify2fa, useDisable2fa, useVerifyEmail, useUpdateProfile, useChangePassword, useSendEmailVerification, useMySessions, useRevokeMySession, } from './identity/react/account.js';
3
+ export { useEnable2fa, useVerify2fa, useDisable2fa, useVerifyEmail, useUpdateProfile, useChangePassword, useSendEmailVerification, useMySecurityControls, useSetLoginWithdrawalAlerts, useRequestPhoneVerification, useConfirmPhoneVerification, useMySessions, useRevokeMySession, } from './identity/react/account.js';
4
4
  export { usePlayerProfile, useUpdatePlayerProfile, useDisplayCurrency, useSetDisplayCurrency, } from './profile/react/profile.js';
5
5
  //# sourceMappingURL=react.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/pam/react.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,OAAO,EACL,cAAc,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,EACxB,aAAa,EACb,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,GAGtB,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/pam/react.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,OAAO,EACL,cAAc,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACrB,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,EAC3B,aAAa,EACb,kBAAkB,GAMnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,GAGtB,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function hashCode(code: string): string;
2
+ export declare function generateCode(): string;
3
+ //# sourceMappingURL=otp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otp.d.ts","sourceRoot":"","sources":["../../../src/pam/shared/otp.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAKD,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
@@ -0,0 +1,11 @@
1
+ import { createHash, randomInt } from 'node:crypto';
2
+ export function hashCode(code) {
3
+ return createHash('sha256').update(code).digest('hex');
4
+ }
5
+ // Never logged here: the code is a login credential, and NODE_ENV is not set by the
6
+ // consumer scaffold, so an env-guarded log leaks it on a stock deploy. MockSmsAdapter
7
+ // already prints it for dev, which is the one place it belongs.
8
+ export function generateCode() {
9
+ return randomInt(0, 1_000_000).toString().padStart(6, '0');
10
+ }
11
+ //# sourceMappingURL=otp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otp.js","sourceRoot":"","sources":["../../../src/pam/shared/otp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,oFAAoF;AACpF,sFAAsF;AACtF,gEAAgE;AAChE,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/testing/mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACd,QAAQ,EACR,UAAU,EACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAC;AAQjC,sDAAsD;AACtD,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,UAAS,MAAW,KAAG,CAA4B,CAAC;AAE5E,eAAO,MAAM,cAAc,EAAE,UAA0C,CAAC;AAExE,eAAO,MAAM,WAAW,GAAI,OAAM,OAAO,CAAC,WAAW,CAAM,KAAG,WAK5D,CAAC;AAEH,eAAO,MAAM,WAAW,GAAI,OAAM,OAAO,CAAC,UAAU,CAAM,KAAG,UAI3D,CAAC;AAEH,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAsCnC;6FAC6F;AAC7F,eAAO,MAAM,WAAW,GACtB,UAAS;IAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,CAAA;CAAO,KAY9C,cAC7B,CAAC;AAEF,KAAK,cAAc,GAAG,QAAQ,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,iBAAiB,EAAE,IAAI,CAAA;CAAE,CAAC;AAEnF;;;GAGG;AACH,eAAO,MAAM,YAAY,QAAO,cACkD,CAAC;AAEnF,eAAO,MAAM,eAAe,QAAO,cAAc,GAAG;IAClD,MAAM,EAAE,IAAI,CAAC;IACb,mBAAmB,EAAE,IAAI,CAAC;CAI1B,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,GACtC,UAAS;IACP,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtB,KACL,uBAWF,CAAC;AAEF;qEACqE;AACrE,eAAO,MAAM,YAAY,QAAO,eAAe,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAO7D,CAAC;AAEL;;;;GAIG;AACH,eAAO,MAAM,SAAS,QAAO,YA+B5B,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAO,iBAMrC,CAAC;AAEL,eAAO,MAAM,kBAAkB,QAAO,cASlC,CAAC;AAcL;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GACzB,UAAS;IACP,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;CACjB,KACL,UAcC,CAAC"}
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/testing/mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACd,QAAQ,EACR,UAAU,EACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAC;AAQjC,sDAAsD;AACtD,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,UAAS,MAAW,KAAG,CAA4B,CAAC;AAE5E,eAAO,MAAM,cAAc,EAAE,UAA0C,CAAC;AAExE,eAAO,MAAM,WAAW,GAAI,OAAM,OAAO,CAAC,WAAW,CAAM,KAAG,WAK5D,CAAC;AAEH,eAAO,MAAM,WAAW,GAAI,OAAM,OAAO,CAAC,UAAU,CAAM,KAAG,UAI3D,CAAC;AAEH,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAsCnC;6FAC6F;AAC7F,eAAO,MAAM,WAAW,GACtB,UAAS;IAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,CAAA;CAAO,KAY9C,cAC7B,CAAC;AAEF,KAAK,cAAc,GAAG,QAAQ,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,iBAAiB,EAAE,IAAI,CAAA;CAAE,CAAC;AAEnF;;;GAGG;AACH,eAAO,MAAM,YAAY,QAAO,cACkD,CAAC;AAEnF,eAAO,MAAM,eAAe,QAAO,cAAc,GAAG;IAClD,MAAM,EAAE,IAAI,CAAC;IACb,mBAAmB,EAAE,IAAI,CAAC;CAI1B,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,GACtC,UAAS;IACP,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtB,KACL,uBAWF,CAAC;AAEF;qEACqE;AACrE,eAAO,MAAM,YAAY,QAAO,eAAe,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAO7D,CAAC;AAEL;;;;GAIG;AACH,eAAO,MAAM,SAAS,QAAO,YA+B5B,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAO,iBAMrC,CAAC;AAEL,eAAO,MAAM,kBAAkB,QAAO,cAUlC,CAAC;AAcL;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GACzB,UAAS;IACP,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;CACjB,KACL,UAcC,CAAC"}
@@ -155,6 +155,7 @@ export const makeIdentityReader = () => mock({
155
155
  getPlayerIdsByUserIdsSafe: vi.fn().mockResolvedValue(new Map()),
156
156
  getPlayerKycStatusByUserId: vi.fn().mockResolvedValue(null),
157
157
  getPlayerUserIdsSharingLoginIp: vi.fn().mockResolvedValue([]),
158
+ canReceiveLoginWithdrawalAlerts: vi.fn().mockResolvedValue(false),
158
159
  });
159
160
  const matches = (refs, resource, action) => refs.includes(resource) || refs.includes(`${resource}:${action}`);
160
161
  const isPermitted = (options, resource, action) => options.allow