@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/audit/__tests__/audit.service.int.test.js +45 -0
- package/dist/audit/__tests__/audit.service.int.test.js.map +1 -1
- package/dist/audit/plugin.d.ts.map +1 -1
- package/dist/audit/plugin.js +26 -0
- package/dist/audit/plugin.js.map +1 -1
- package/dist/compliance/contract/index.d.ts +1 -1
- package/dist/compliance/contract/rg.d.ts +2 -2
- package/dist/compliance/router/index.d.ts +1 -1
- package/dist/contracts/__tests__/identity.test.js +3 -2
- package/dist/contracts/__tests__/identity.test.js.map +1 -1
- package/dist/contracts/adapters/identity-reader.d.ts +6 -0
- package/dist/contracts/adapters/identity-reader.d.ts.map +1 -1
- package/dist/contracts/adapters/identity-reader.js.map +1 -1
- package/dist/contracts/schemas/__tests__/events.test.js +30 -0
- package/dist/contracts/schemas/__tests__/events.test.js.map +1 -1
- package/dist/contracts/schemas/events.d.ts +37 -0
- package/dist/contracts/schemas/events.d.ts.map +1 -1
- package/dist/contracts/schemas/events.js +29 -0
- package/dist/contracts/schemas/events.js.map +1 -1
- package/dist/contracts/schemas/identity.d.ts +28 -0
- package/dist/contracts/schemas/identity.d.ts.map +1 -1
- package/dist/contracts/schemas/identity.js +22 -1
- package/dist/contracts/schemas/identity.js.map +1 -1
- package/dist/engagement/notifications/plugin.d.ts +2 -2
- package/dist/engagement/notifications/plugin.d.ts.map +1 -1
- package/dist/engagement/notifications/plugin.js +71 -2
- package/dist/engagement/notifications/plugin.js.map +1 -1
- package/dist/pam/identity/__tests__/identity.rate-limit.int.test.js +2 -2
- package/dist/pam/identity/__tests__/identity.rate-limit.int.test.js.map +1 -1
- package/dist/pam/identity/__tests__/identity.registration-gates.int.test.js +1 -1
- package/dist/pam/identity/__tests__/identity.registration-gates.int.test.js.map +1 -1
- package/dist/pam/identity/__tests__/identity.service.int.test.js +67 -1
- package/dist/pam/identity/__tests__/identity.service.int.test.js.map +1 -1
- package/dist/pam/identity/__tests__/phone-login.service.int.test.js +23 -0
- package/dist/pam/identity/__tests__/phone-login.service.int.test.js.map +1 -1
- package/dist/pam/identity/__tests__/phone-verification.service.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/phone-verification.service.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/phone-verification.service.int.test.js +273 -0
- package/dist/pam/identity/__tests__/phone-verification.service.int.test.js.map +1 -0
- package/dist/pam/identity/adapters/identity-reader.service.d.ts +1 -0
- package/dist/pam/identity/adapters/identity-reader.service.d.ts.map +1 -1
- package/dist/pam/identity/adapters/identity-reader.service.js +8 -0
- package/dist/pam/identity/adapters/identity-reader.service.js.map +1 -1
- package/dist/pam/identity/contract/index.d.ts +40 -0
- package/dist/pam/identity/contract/index.d.ts.map +1 -1
- package/dist/pam/identity/contract/index.js +18 -1
- package/dist/pam/identity/contract/index.js.map +1 -1
- package/dist/pam/identity/drizzle/migrations/0010_lying_young_avengers.sql +19 -0
- package/dist/pam/identity/drizzle/migrations/meta/0010_snapshot.json +1066 -0
- package/dist/pam/identity/drizzle/migrations/meta/_journal.json +7 -0
- package/dist/pam/identity/plugin.d.ts.map +1 -1
- package/dist/pam/identity/plugin.js +9 -0
- package/dist/pam/identity/plugin.js.map +1 -1
- package/dist/pam/identity/react/account.d.ts +9 -1
- package/dist/pam/identity/react/account.d.ts.map +1 -1
- package/dist/pam/identity/react/account.js +33 -5
- package/dist/pam/identity/react/account.js.map +1 -1
- package/dist/pam/identity/router/index.d.ts +42 -1
- package/dist/pam/identity/router/index.d.ts.map +1 -1
- package/dist/pam/identity/router/index.js +28 -2
- package/dist/pam/identity/router/index.js.map +1 -1
- package/dist/pam/identity/schema/index.d.ts +195 -0
- package/dist/pam/identity/schema/index.d.ts.map +1 -1
- package/dist/pam/identity/schema/index.js +26 -0
- package/dist/pam/identity/schema/index.js.map +1 -1
- package/dist/pam/identity/service/identity.service.d.ts +4 -1
- package/dist/pam/identity/service/identity.service.d.ts.map +1 -1
- package/dist/pam/identity/service/identity.service.js +140 -1
- package/dist/pam/identity/service/identity.service.js.map +1 -1
- package/dist/pam/identity/service/phone-login.service.d.ts.map +1 -1
- package/dist/pam/identity/service/phone-login.service.js +34 -19
- package/dist/pam/identity/service/phone-login.service.js.map +1 -1
- package/dist/pam/identity/service/phone-verification.service.d.ts +38 -0
- package/dist/pam/identity/service/phone-verification.service.d.ts.map +1 -0
- package/dist/pam/identity/service/phone-verification.service.js +257 -0
- package/dist/pam/identity/service/phone-verification.service.js.map +1 -0
- package/dist/pam/identity/service/security-controls.service.d.ts +4 -0
- package/dist/pam/identity/service/security-controls.service.d.ts.map +1 -0
- package/dist/pam/identity/service/security-controls.service.js +28 -0
- package/dist/pam/identity/service/security-controls.service.js.map +1 -0
- package/dist/pam/react.d.ts +1 -1
- package/dist/pam/react.d.ts.map +1 -1
- package/dist/pam/react.js +1 -1
- package/dist/pam/react.js.map +1 -1
- package/dist/pam/shared/otp.d.ts +3 -0
- package/dist/pam/shared/otp.d.ts.map +1 -0
- package/dist/pam/shared/otp.js +11 -0
- package/dist/pam/shared/otp.js.map +1 -0
- package/dist/testing/mock.d.ts.map +1 -1
- package/dist/testing/mock.js +1 -0
- package/dist/testing/mock.js.map +1 -1
- package/dist/testing/seed-player.d.ts +4 -0
- package/dist/testing/seed-player.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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({
|
|
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
|
|
132
|
-
// response, minus the SMS. A
|
|
133
|
-
//
|
|
134
|
-
|
|
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
|
-
//
|
|
313
|
-
//
|
|
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"}
|
package/dist/pam/react.d.ts
CHANGED
|
@@ -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
|
package/dist/pam/react.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
package/dist/pam/react.js.map
CHANGED
|
@@ -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,
|
|
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 @@
|
|
|
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,
|
|
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"}
|
package/dist/testing/mock.js
CHANGED
|
@@ -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
|