@cogenta/auth 0.3.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-keys.d.ts +93 -4
- package/dist/api-keys.d.ts.map +1 -1
- package/dist/api-keys.js +260 -27
- package/dist/api-keys.js.map +1 -1
- package/dist/audit-integrity.d.ts +61 -0
- package/dist/audit-integrity.d.ts.map +1 -0
- package/dist/audit-integrity.js +130 -0
- package/dist/audit-integrity.js.map +1 -0
- package/dist/audit.d.ts +78 -2
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js +168 -24
- package/dist/audit.js.map +1 -1
- package/dist/credentials.d.ts +27 -0
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +61 -0
- package/dist/credentials.js.map +1 -1
- package/dist/index.d.ts +11 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/login.d.ts +63 -6
- package/dist/login.d.ts.map +1 -1
- package/dist/login.js +90 -10
- package/dist/login.js.map +1 -1
- package/dist/mfa.d.ts +1 -1
- package/dist/mfa.d.ts.map +1 -1
- package/dist/mfa.js +3 -1
- package/dist/mfa.js.map +1 -1
- package/dist/recovery-codes.d.ts +25 -0
- package/dist/recovery-codes.d.ts.map +1 -0
- package/dist/recovery-codes.js +56 -0
- package/dist/recovery-codes.js.map +1 -0
- package/dist/resets.d.ts +15 -1
- package/dist/resets.d.ts.map +1 -1
- package/dist/resets.js +10 -0
- package/dist/resets.js.map +1 -1
- package/dist/sessions.d.ts +24 -0
- package/dist/sessions.d.ts.map +1 -1
- package/dist/sessions.js +25 -4
- package/dist/sessions.js.map +1 -1
- package/dist/store.d.ts +3 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +4 -1
- package/dist/store.js.map +1 -1
- package/dist/tables.d.ts +17 -0
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +129 -1
- package/dist/tables.js.map +1 -1
- package/dist/types.d.ts +89 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -1
- package/dist/types.js.map +1 -1
- package/dist/user-agent.d.ts +18 -0
- package/dist/user-agent.d.ts.map +1 -0
- package/dist/user-agent.js +39 -0
- package/dist/user-agent.js.map +1 -0
- package/dist/users.d.ts +24 -1
- package/dist/users.d.ts.map +1 -1
- package/dist/users.js +72 -3
- package/dist/users.js.map +1 -1
- package/package.json +3 -3
package/dist/credentials.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { CogentaError, identifier, newId, sql } from '@cogenta/core';
|
|
2
2
|
import { hashPassword, verifyPassword } from './password.js';
|
|
3
|
+
import { verifyRecoveryCode } from './recovery-codes.js';
|
|
3
4
|
import { TABLES } from './tables.js';
|
|
5
|
+
/** Retries for `consumeRecoveryCode`'s compare-and-set — covers a genuine concurrent race, not a hostile client (see that function's own comment). */
|
|
6
|
+
const CONSUME_ATTEMPTS = 5;
|
|
4
7
|
export function createCredentialStore(db, now = Date.now) {
|
|
5
8
|
const table = identifier(TABLES.credentials, db.dialect);
|
|
6
9
|
async function findOne(userId, kind) {
|
|
@@ -90,6 +93,64 @@ export function createCredentialStore(db, now = Date.now) {
|
|
|
90
93
|
const result = await db.query(sql `select distinct kind from ${table} where user_id = ${userId}`);
|
|
91
94
|
return result.rows.map((row) => row.kind);
|
|
92
95
|
},
|
|
96
|
+
setRecoveryCodes: async (userId, hashes) => {
|
|
97
|
+
const codes = hashes.map((hash) => ({ hash, usedAt: null }));
|
|
98
|
+
await upsert(userId, 'recovery_codes', { codes });
|
|
99
|
+
},
|
|
100
|
+
recoveryCodesStatus: async (userId) => {
|
|
101
|
+
const row = await findOne(userId, 'recovery_codes');
|
|
102
|
+
if (row === undefined)
|
|
103
|
+
return null;
|
|
104
|
+
const { codes } = JSON.parse(row.data);
|
|
105
|
+
return {
|
|
106
|
+
total: codes.length,
|
|
107
|
+
remaining: codes.filter((entry) => entry.usedAt === null).length,
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
consumeRecoveryCode: async (userId, code) => {
|
|
111
|
+
// Bounded retries: a concurrent redemption can win the compare-and-set
|
|
112
|
+
// below between our read and our write. When that happens we re-read
|
|
113
|
+
// the row it just wrote and try again against the fresher data — the
|
|
114
|
+
// same shape as `resets.ts`'s single-use guarantee, applied to a batch
|
|
115
|
+
// of codes instead of one token. `CONSUME_ATTEMPTS` only has to cover
|
|
116
|
+
// genuine races, not a hostile client: a wrong code never enters this
|
|
117
|
+
// loop more than once, since a miss returns `false` on the first pass.
|
|
118
|
+
for (let attempt = 0; attempt < CONSUME_ATTEMPTS; attempt += 1) {
|
|
119
|
+
const row = await findOne(userId, 'recovery_codes');
|
|
120
|
+
if (row === undefined)
|
|
121
|
+
return false;
|
|
122
|
+
const parsed = JSON.parse(row.data);
|
|
123
|
+
let matchIndex = -1;
|
|
124
|
+
// Each candidate is scrypt-hashed; short-circuiting on the first
|
|
125
|
+
// match is the whole point — a code is a spare password, not a value
|
|
126
|
+
// worth a constant-time scan over up to ten entries.
|
|
127
|
+
for (const [index, entry] of parsed.codes.entries()) {
|
|
128
|
+
if (entry.usedAt !== null)
|
|
129
|
+
continue;
|
|
130
|
+
if (await verifyRecoveryCode(code, entry.hash)) {
|
|
131
|
+
matchIndex = index;
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (matchIndex === -1)
|
|
136
|
+
return false;
|
|
137
|
+
const updated = {
|
|
138
|
+
codes: parsed.codes.map((entry, index) => index === matchIndex ? { ...entry, usedAt: new Date(now()).toISOString() } : entry),
|
|
139
|
+
};
|
|
140
|
+
// Compare-and-set against the exact bytes this call read: if another
|
|
141
|
+
// caller already wrote a different version of this batch between our
|
|
142
|
+
// read and this write — consuming this same code, or a different
|
|
143
|
+
// one — `rowsAffected` is 0 and we loop to retry against the row
|
|
144
|
+
// that actually won, rather than clobbering it.
|
|
145
|
+
const result = await db.query(sql `update ${table} set data = ${JSON.stringify(updated)} where id = ${row.id} and data = ${row.data}`);
|
|
146
|
+
if (result.rowsAffected > 0)
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
return false;
|
|
150
|
+
},
|
|
151
|
+
removeRecoveryCodes: async (userId) => {
|
|
152
|
+
await db.query(sql `delete from ${table} where user_id = ${userId} and kind = ${'recovery_codes'}`);
|
|
153
|
+
},
|
|
93
154
|
};
|
|
94
155
|
}
|
|
95
156
|
//# sourceMappingURL=credentials.js.map
|
package/dist/credentials.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AACzF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,19 +7,22 @@
|
|
|
7
7
|
* bearer sessions, login-attempt backoff, MFA enforcement for sensitive
|
|
8
8
|
* roles, and the hash-chained audit log L4's agents will write to as well.
|
|
9
9
|
*/
|
|
10
|
-
export type { ApiKeyStore } from './api-keys.js';
|
|
11
|
-
export { createApiKeyStore, looksLikeApiKey } from './api-keys.js';
|
|
12
|
-
export type { AuditFilter, AuditLog } from './audit.js';
|
|
13
|
-
export { createAuditLog } from './audit.js';
|
|
10
|
+
export type { ApiKeyStore, ListApiKeysOptions, RotateApiKeyOptions, UpdateApiKeyInput, } from './api-keys.js';
|
|
11
|
+
export { createApiKeyStore, DEFAULT_RATE_LIMIT_PER_MINUTE, looksLikeApiKey, MIN_PURGE_AFTER_REVOKED_DAYS, RECOVERY_WINDOW_MS, } from './api-keys.js';
|
|
12
|
+
export type { AuditChainPoint, AuditFilter, AuditLog, AuditPruneResult, AuditVerifyRangeResult, } from './audit.js';
|
|
13
|
+
export { classifyAuditActor, createAuditLog } from './audit.js';
|
|
14
|
+
export type { AuditIntegrityStatus, AuditIntegrityStore } from './audit-integrity.js';
|
|
15
|
+
export { createAuditIntegrityStore } from './audit-integrity.js';
|
|
14
16
|
export type { CredentialStore, WebAuthnCredentialData } from './credentials.js';
|
|
15
17
|
export { createCredentialStore } from './credentials.js';
|
|
16
|
-
export type { AuthService, AuthServiceOptions, LoginResult } from './login.js';
|
|
18
|
+
export type { AuthService, AuthServiceOptions, LoginContext, LoginResult, RecoveryCodesIssued, } from './login.js';
|
|
17
19
|
export { createAuthService } from './login.js';
|
|
18
20
|
export { requiresMfa, sensitiveRoles } from './mfa.js';
|
|
19
21
|
export { hashPassword, verifyPassword } from './password.js';
|
|
20
22
|
export type { LoginAttemptSummary, RateLimiter } from './rate-limit.js';
|
|
21
23
|
export { createRateLimiter, LOGIN_ATTEMPT_WINDOW_MS } from './rate-limit.js';
|
|
22
|
-
export
|
|
24
|
+
export { generateRecoveryCodes, hashRecoveryCode, normaliseRecoveryCode, RECOVERY_CODE_COUNT, verifyRecoveryCode, } from './recovery-codes.js';
|
|
25
|
+
export type { IssuedPasswordReset, PasswordResetOutcome, PasswordResetStore, PendingReset, } from './resets.js';
|
|
23
26
|
export { createPasswordResetStore, PASSWORD_RESET_TTL_MS } from './resets.js';
|
|
24
27
|
export type { SessionStore } from './sessions.js';
|
|
25
28
|
export { createSessionStore } from './sessions.js';
|
|
@@ -29,6 +32,8 @@ export { ensureAuthTables, TABLES as AUTH_TABLES } from './tables.js';
|
|
|
29
32
|
export type { VerifyTotpOptions } from './totp.js';
|
|
30
33
|
export { assertTotpSecretFormat, generateTotpSecret, totpUri, verifyTotp, } from './totp.js';
|
|
31
34
|
export * from './types.js';
|
|
35
|
+
export type { ParsedUserAgent } from './user-agent.js';
|
|
36
|
+
export { parseUserAgent } from './user-agent.js';
|
|
32
37
|
export type { UserStore } from './users.js';
|
|
33
38
|
export { createUserStore } from './users.js';
|
|
34
39
|
export type { AuthenticationOptions, RegistrationOptions, WebAuthnAuthenticationResult, WebAuthnConfig, } from './webauthn.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,iBAAiB,EACjB,6BAA6B,EAC7B,eAAe,EACf,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,eAAe,EACf,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC/D,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAChE,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxD,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,mBAAmB,GACpB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC5D,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,GACb,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAC7E,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAClD,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AACrE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,OAAO,EACP,UAAU,GACX,MAAM,WAAW,CAAA;AAClB,cAAc,YAAY,CAAA;AAC1B,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,4BAA4B,EAC5B,cAAc,GACf,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,8BAA8B,EAC9B,4BAA4B,GAC7B,MAAM,eAAe,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -7,19 +7,22 @@
|
|
|
7
7
|
* bearer sessions, login-attempt backoff, MFA enforcement for sensitive
|
|
8
8
|
* roles, and the hash-chained audit log L4's agents will write to as well.
|
|
9
9
|
*/
|
|
10
|
-
export { createApiKeyStore, looksLikeApiKey } from './api-keys.js';
|
|
11
|
-
export { createAuditLog } from './audit.js';
|
|
10
|
+
export { createApiKeyStore, DEFAULT_RATE_LIMIT_PER_MINUTE, looksLikeApiKey, MIN_PURGE_AFTER_REVOKED_DAYS, RECOVERY_WINDOW_MS, } from './api-keys.js';
|
|
11
|
+
export { classifyAuditActor, createAuditLog } from './audit.js';
|
|
12
|
+
export { createAuditIntegrityStore } from './audit-integrity.js';
|
|
12
13
|
export { createCredentialStore } from './credentials.js';
|
|
13
14
|
export { createAuthService } from './login.js';
|
|
14
15
|
export { requiresMfa, sensitiveRoles } from './mfa.js';
|
|
15
16
|
export { hashPassword, verifyPassword } from './password.js';
|
|
16
17
|
export { createRateLimiter, LOGIN_ATTEMPT_WINDOW_MS } from './rate-limit.js';
|
|
18
|
+
export { generateRecoveryCodes, hashRecoveryCode, normaliseRecoveryCode, RECOVERY_CODE_COUNT, verifyRecoveryCode, } from './recovery-codes.js';
|
|
17
19
|
export { createPasswordResetStore, PASSWORD_RESET_TTL_MS } from './resets.js';
|
|
18
20
|
export { createSessionStore } from './sessions.js';
|
|
19
21
|
export { createAuthStore } from './store.js';
|
|
20
22
|
export { ensureAuthTables, TABLES as AUTH_TABLES } from './tables.js';
|
|
21
23
|
export { assertTotpSecretFormat, generateTotpSecret, totpUri, verifyTotp, } from './totp.js';
|
|
22
24
|
export * from './types.js';
|
|
25
|
+
export { parseUserAgent } from './user-agent.js';
|
|
23
26
|
export { createUserStore } from './users.js';
|
|
24
27
|
export { beginWebAuthnAuthentication, beginWebAuthnRegistration, completeWebAuthnAuthentication, completeWebAuthnRegistration, } from './webauthn.js';
|
|
25
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,EACL,iBAAiB,EACjB,6BAA6B,EAC7B,eAAe,EACf,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,eAAe,CAAA;AAQtB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAQxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE5D,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAO5B,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAE7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AAErE,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,OAAO,EACP,UAAU,GACX,MAAM,WAAW,CAAA;AAClB,cAAc,YAAY,CAAA;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAO5C,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,8BAA8B,EAC9B,4BAA4B,GAC7B,MAAM,eAAe,CAAA"}
|
package/dist/login.d.ts
CHANGED
|
@@ -26,6 +26,35 @@ export interface TotpSetup {
|
|
|
26
26
|
/** `otpauth://` URI, for a QR code the authenticator app scans. */
|
|
27
27
|
readonly uri: string;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* What confirming TOTP enrolment (or a later regeneration) hands back —
|
|
31
|
+
* fiche 18 task 1. `codes` is shown to the person **exactly once**: it is
|
|
32
|
+
* never returned again by any other call, and only its hash is kept.
|
|
33
|
+
*/
|
|
34
|
+
export interface RecoveryCodesIssued {
|
|
35
|
+
readonly codes: readonly string[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* What a caller resolved about the request making a sign-in call — fiche 18
|
|
39
|
+
* tasks 2 and 5. Optional everywhere: a caller that passes nothing gets
|
|
40
|
+
* exactly today's behaviour (no metadata, the default sliding session).
|
|
41
|
+
*/
|
|
42
|
+
export interface LoginContext {
|
|
43
|
+
/**
|
|
44
|
+
* Raw `User-Agent` header, if any. Distilled to a browser family and a
|
|
45
|
+
* device type at the point of writing (`sessions.ts`) and never stored
|
|
46
|
+
* whole — see that file's own comment.
|
|
47
|
+
*/
|
|
48
|
+
readonly userAgent?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Requested session lifetime in milliseconds. Absent means the default
|
|
51
|
+
* 30-day sliding window; "remember me" being left unchecked is what asks
|
|
52
|
+
* for a shorter one (fiche 18 task 5). Chosen at the password step and
|
|
53
|
+
* carried inside the MFA ticket to whichever step actually issues the
|
|
54
|
+
* session, since no session exists yet to hold it in.
|
|
55
|
+
*/
|
|
56
|
+
readonly ttlMs?: number;
|
|
57
|
+
}
|
|
29
58
|
export interface WebAuthnRegistrationChallenge {
|
|
30
59
|
readonly options: PublicKeyCredentialCreationOptionsJSON;
|
|
31
60
|
readonly ticket: string;
|
|
@@ -53,8 +82,16 @@ export interface AuthServiceOptions {
|
|
|
53
82
|
readonly now?: () => number;
|
|
54
83
|
}
|
|
55
84
|
export interface AuthService {
|
|
56
|
-
passwordLogin(email: string, password: string): Promise<LoginResult>;
|
|
57
|
-
totpLogin(ticket: string, token: string): Promise<LoginResult>;
|
|
85
|
+
passwordLogin(email: string, password: string, context?: LoginContext): Promise<LoginResult>;
|
|
86
|
+
totpLogin(ticket: string, token: string, context?: Pick<LoginContext, 'userAgent'>): Promise<LoginResult>;
|
|
87
|
+
/**
|
|
88
|
+
* Completes a sign-in with a recovery code instead of a TOTP code —
|
|
89
|
+
* fiche 18 task 1, the way back in for an account that lost the
|
|
90
|
+
* authenticator that would have produced one. The code is consumed
|
|
91
|
+
* atomically: a second attempt with the same code, even seconds later,
|
|
92
|
+
* fails exactly like a code that was never issued.
|
|
93
|
+
*/
|
|
94
|
+
recoveryCodeLogin(ticket: string, code: string, context?: Pick<LoginContext, 'userAgent'>): Promise<LoginResult>;
|
|
58
95
|
/** Issues a session directly: a verified passkey already proved a strong second factor. */
|
|
59
96
|
sessionForVerifiedUser(userId: string): Promise<LoginResult>;
|
|
60
97
|
/**
|
|
@@ -64,20 +101,40 @@ export interface AuthService {
|
|
|
64
101
|
* is the one making the call.
|
|
65
102
|
*/
|
|
66
103
|
beginTotpEnrolment(userId: string): Promise<TotpSetup>;
|
|
67
|
-
/**
|
|
68
|
-
|
|
104
|
+
/**
|
|
105
|
+
* Confirms the code from the authenticator app, which is what makes the
|
|
106
|
+
* factor real — and, in the same step, issues ten recovery codes (fiche 18
|
|
107
|
+
* task 1). TOTP without recovery codes is a lock with one key: losing the
|
|
108
|
+
* authenticator becomes a permanent lockout the moment this returns, so the
|
|
109
|
+
* two are minted together rather than as a second, skippable step.
|
|
110
|
+
*/
|
|
111
|
+
confirmTotpEnrolment(userId: string, token: string): Promise<RecoveryCodesIssued>;
|
|
69
112
|
/**
|
|
70
113
|
* Turns TOTP back off. No second proof is asked for: the caller already
|
|
71
114
|
* holds a live session for this account, which — if TOTP was on — they could
|
|
72
|
-
* only have obtained by passing it.
|
|
115
|
+
* only have obtained by passing it. Recovery codes go with it: they exist
|
|
116
|
+
* to be a spare key for TOTP, and there is nothing left for them to unlock
|
|
117
|
+
* once it is off.
|
|
73
118
|
*/
|
|
74
119
|
disableTotp(userId: string): Promise<void>;
|
|
120
|
+
/**
|
|
121
|
+
* Replaces this account's recovery codes with a fresh batch, invalidating
|
|
122
|
+
* every code from the previous one (fiche 18 task 1). Requires a confirmed
|
|
123
|
+
* TOTP factor — a recovery code with nothing to recover from is not a
|
|
124
|
+
* feature.
|
|
125
|
+
*/
|
|
126
|
+
regenerateRecoveryCodes(userId: string): Promise<RecoveryCodesIssued>;
|
|
127
|
+
/** How many recovery codes remain unused, for the profile screen's counter. `{ total: 0, remaining: 0 }` if none were ever issued. */
|
|
128
|
+
recoveryCodesStatus(userId: string): Promise<{
|
|
129
|
+
readonly total: number;
|
|
130
|
+
readonly remaining: number;
|
|
131
|
+
}>;
|
|
75
132
|
/** Adding a passkey to an already-identified account — `userId` comes from an existing session. */
|
|
76
133
|
beginWebAuthnRegistration(userId: string): Promise<WebAuthnRegistrationChallenge>;
|
|
77
134
|
completeWebAuthnRegistration(ticket: string, response: RegistrationResponseJSON, label?: string): Promise<void>;
|
|
78
135
|
/** Usernameless: no account is named up front, so any resident passkey the browser offers can answer. */
|
|
79
136
|
beginWebAuthnLogin(): Promise<WebAuthnAuthenticationChallenge>;
|
|
80
|
-
completeWebAuthnLogin(ticket: string, response: AuthenticationResponseJSON): Promise<LoginResult>;
|
|
137
|
+
completeWebAuthnLogin(ticket: string, response: AuthenticationResponseJSON, context?: Pick<LoginContext, 'userAgent'>): Promise<LoginResult>;
|
|
81
138
|
}
|
|
82
139
|
export declare function createAuthService(options: AuthServiceOptions): AuthService;
|
|
83
140
|
//# sourceMappingURL=login.d.ts.map
|
package/dist/login.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,KAAK,EACV,0BAA0B,EAC1B,sCAAsC,EACtC,qCAAqC,EACrC,wBAAwB,EACzB,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
package/dist/login.js
CHANGED
|
@@ -2,6 +2,7 @@ import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
|
2
2
|
import { CogentaError } from '@cogenta/core';
|
|
3
3
|
import { createCredentialStore } from './credentials.js';
|
|
4
4
|
import { createRateLimiter } from './rate-limit.js';
|
|
5
|
+
import { generateRecoveryCodes, hashRecoveryCode } from './recovery-codes.js';
|
|
5
6
|
import { createSessionStore } from './sessions.js';
|
|
6
7
|
import { generateTotpSecret, totpUri, verifyTotp } from './totp.js';
|
|
7
8
|
import { createUserStore } from './users.js';
|
|
@@ -51,7 +52,9 @@ function verifyTicket(key, purpose, ticket, now) {
|
|
|
51
52
|
return null;
|
|
52
53
|
if (parsed.challenge !== undefined && typeof parsed.challenge !== 'string')
|
|
53
54
|
return null;
|
|
54
|
-
|
|
55
|
+
if (parsed.ttlMs !== undefined && typeof parsed.ttlMs !== 'number')
|
|
56
|
+
return null;
|
|
57
|
+
return { userId: parsed.userId, challenge: parsed.challenge, ttlMs: parsed.ttlMs };
|
|
55
58
|
}
|
|
56
59
|
catch {
|
|
57
60
|
return null;
|
|
@@ -83,10 +86,33 @@ export function createAuthService(options) {
|
|
|
83
86
|
const credentials = createCredentialStore(db, now);
|
|
84
87
|
const sessions = createSessionStore(db, now);
|
|
85
88
|
const rateLimit = createRateLimiter(db, now);
|
|
86
|
-
async function issueSession(user) {
|
|
87
|
-
const session = await sessions.create(user.id
|
|
89
|
+
async function issueSession(user, context) {
|
|
90
|
+
const session = await sessions.create(user.id, {
|
|
91
|
+
...(context?.userAgent === undefined ? {} : { userAgent: context.userAgent }),
|
|
92
|
+
...(context?.ttlMs === undefined ? {} : { ttlMs: context.ttlMs }),
|
|
93
|
+
});
|
|
88
94
|
return { status: 'session', session, user };
|
|
89
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Builds the `issueSession` context for a step completing an MFA ticket: the
|
|
98
|
+
* `userAgent` this HTTP request carried, plus the `ttlMs` "remember me"
|
|
99
|
+
* chose at the password step and which rode inside the ticket ever since.
|
|
100
|
+
* `exactOptionalPropertyTypes` means an explicit `undefined` is not the same
|
|
101
|
+
* as an absent key, so each part is added only when it actually has a value.
|
|
102
|
+
*/
|
|
103
|
+
function sessionContextFrom(context, ttlMs) {
|
|
104
|
+
return {
|
|
105
|
+
...(context?.userAgent === undefined ? {} : { userAgent: context.userAgent }),
|
|
106
|
+
...(ttlMs === undefined ? {} : { ttlMs }),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Ten fresh codes, hashed and stored, replacing any still outstanding. */
|
|
110
|
+
async function issueRecoveryCodes(userId) {
|
|
111
|
+
const codes = generateRecoveryCodes();
|
|
112
|
+
const hashes = await Promise.all(codes.map((code) => hashRecoveryCode(code)));
|
|
113
|
+
await credentials.setRecoveryCodes(userId, hashes);
|
|
114
|
+
return { codes };
|
|
115
|
+
}
|
|
90
116
|
/**
|
|
91
117
|
* The second factors this account has actually finished setting up.
|
|
92
118
|
*
|
|
@@ -104,19 +130,20 @@ export function createAuthService(options) {
|
|
|
104
130
|
available.push('webauthn');
|
|
105
131
|
return available;
|
|
106
132
|
}
|
|
107
|
-
function mfaChallenge(user, available) {
|
|
133
|
+
function mfaChallenge(user, available, ttlMs) {
|
|
108
134
|
return {
|
|
109
135
|
status: 'mfa_required',
|
|
110
136
|
ticket: signTicket(signingKey, {
|
|
111
137
|
purpose: 'login',
|
|
112
138
|
userId: user.id,
|
|
113
139
|
expiresAt: now() + TICKET_TTL_MS,
|
|
140
|
+
...(ttlMs === undefined ? {} : { ttlMs }),
|
|
114
141
|
}),
|
|
115
142
|
availableFactors: available,
|
|
116
143
|
};
|
|
117
144
|
}
|
|
118
145
|
return {
|
|
119
|
-
passwordLogin: async (email, password) => {
|
|
146
|
+
passwordLogin: async (email, password, context) => {
|
|
120
147
|
const subject = email.trim().toLowerCase();
|
|
121
148
|
await rateLimit.check(subject);
|
|
122
149
|
const user = await users.byEmail(subject);
|
|
@@ -136,9 +163,11 @@ export function createAuthService(options) {
|
|
|
136
163
|
// ignoring a factor someone deliberately enabled would be a silent
|
|
137
164
|
// downgrade of their own security.
|
|
138
165
|
const factors = await enrolledFactors(user.id);
|
|
139
|
-
return factors.length === 0
|
|
166
|
+
return factors.length === 0
|
|
167
|
+
? issueSession(user, context)
|
|
168
|
+
: mfaChallenge(user, factors, context?.ttlMs);
|
|
140
169
|
},
|
|
141
|
-
totpLogin: async (ticket, token) => {
|
|
170
|
+
totpLogin: async (ticket, token, context) => {
|
|
142
171
|
const verified = verifyTicket(signingKey, 'login', ticket, now());
|
|
143
172
|
if (verified === null || verified.userId === null)
|
|
144
173
|
throw invalidTicket();
|
|
@@ -165,7 +194,37 @@ export function createAuthService(options) {
|
|
|
165
194
|
});
|
|
166
195
|
}
|
|
167
196
|
await rateLimit.clear(`mfa:${userId}`);
|
|
168
|
-
return issueSession(user);
|
|
197
|
+
return issueSession(user, sessionContextFrom(context, verified.ttlMs));
|
|
198
|
+
},
|
|
199
|
+
recoveryCodeLogin: async (ticket, code, context) => {
|
|
200
|
+
const verified = verifyTicket(signingKey, 'login', ticket, now());
|
|
201
|
+
if (verified === null || verified.userId === null)
|
|
202
|
+
throw invalidTicket();
|
|
203
|
+
const userId = verified.userId;
|
|
204
|
+
// Its own rate-limit subject, independent of `mfa:` (the TOTP guess
|
|
205
|
+
// counter) and `totp-setup:` — a wrong code here is a different event
|
|
206
|
+
// from a wrong 6-digit code, and neither should give the other a free
|
|
207
|
+
// pass on attempts.
|
|
208
|
+
await rateLimit.check(`recovery:${userId}`);
|
|
209
|
+
const consumed = await credentials.consumeRecoveryCode(userId, code);
|
|
210
|
+
if (!consumed) {
|
|
211
|
+
await rateLimit.record(`recovery:${userId}`);
|
|
212
|
+
throw new CogentaError({
|
|
213
|
+
code: 'AUTH_RECOVERY_CODE_INVALID',
|
|
214
|
+
message: 'This recovery code is not valid.',
|
|
215
|
+
hint: 'Check you typed it exactly as it was shown, dashes included. Each code works once.',
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
const user = await users.byId(userId);
|
|
219
|
+
if (user === null) {
|
|
220
|
+
throw new CogentaError({
|
|
221
|
+
code: 'AUTH_USER_NOT_FOUND',
|
|
222
|
+
message: 'This account no longer exists.',
|
|
223
|
+
hint: 'It may have been deleted between the password step and this one. Sign in again.',
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
await rateLimit.clear(`recovery:${userId}`);
|
|
227
|
+
return issueSession(user, sessionContextFrom(context, verified.ttlMs));
|
|
169
228
|
},
|
|
170
229
|
sessionForVerifiedUser: async (userId) => {
|
|
171
230
|
const user = await users.byId(userId);
|
|
@@ -207,9 +266,30 @@ export function createAuthService(options) {
|
|
|
207
266
|
}
|
|
208
267
|
await rateLimit.clear(`totp-setup:${userId}`);
|
|
209
268
|
await credentials.confirmTotp(userId);
|
|
269
|
+
// Minted in the same step, not a follow-up the person could skip: TOTP
|
|
270
|
+
// with no recovery codes is a lock with exactly one key, and losing the
|
|
271
|
+
// authenticator would be a permanent lockout the moment this returns.
|
|
272
|
+
return issueRecoveryCodes(userId);
|
|
210
273
|
},
|
|
211
274
|
disableTotp: async (userId) => {
|
|
212
275
|
await credentials.removeTotp(userId);
|
|
276
|
+
// Nothing left for them to be a spare key for once TOTP itself is off.
|
|
277
|
+
await credentials.removeRecoveryCodes(userId);
|
|
278
|
+
},
|
|
279
|
+
regenerateRecoveryCodes: async (userId) => {
|
|
280
|
+
const totp = await credentials.totpSecret(userId);
|
|
281
|
+
if (totp === null || !totp.verified) {
|
|
282
|
+
throw new CogentaError({
|
|
283
|
+
code: 'AUTH_RECOVERY_CODES_UNAVAILABLE',
|
|
284
|
+
message: 'Recovery codes exist to get back in when two-step verification is unusable.',
|
|
285
|
+
hint: 'Turn on two-step verification first — recovery codes are issued the moment it is confirmed.',
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
return issueRecoveryCodes(userId);
|
|
289
|
+
},
|
|
290
|
+
recoveryCodesStatus: async (userId) => {
|
|
291
|
+
const status = await credentials.recoveryCodesStatus(userId);
|
|
292
|
+
return status ?? { total: 0, remaining: 0 };
|
|
213
293
|
},
|
|
214
294
|
beginWebAuthnRegistration: async (userId) => {
|
|
215
295
|
if (webauthnConfig === undefined)
|
|
@@ -261,7 +341,7 @@ export function createAuthService(options) {
|
|
|
261
341
|
}),
|
|
262
342
|
};
|
|
263
343
|
},
|
|
264
|
-
completeWebAuthnLogin: async (ticket, response) => {
|
|
344
|
+
completeWebAuthnLogin: async (ticket, response, context) => {
|
|
265
345
|
if (webauthnConfig === undefined)
|
|
266
346
|
throw webauthnNotConfigured();
|
|
267
347
|
const verified = verifyTicket(signingKey, 'webauthn_login', ticket, now());
|
|
@@ -284,7 +364,7 @@ export function createAuthService(options) {
|
|
|
284
364
|
message: 'This account no longer exists or is disabled.',
|
|
285
365
|
});
|
|
286
366
|
}
|
|
287
|
-
return issueSession(user);
|
|
367
|
+
return issueSession(user, context);
|
|
288
368
|
},
|
|
289
369
|
};
|
|
290
370
|
}
|
package/dist/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
package/dist/mfa.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CollectionDefinition } from '@cogenta/schema';
|
|
2
2
|
export declare function sensitiveRoles(collections: readonly CollectionDefinition[]): ReadonlySet<string>;
|
|
3
3
|
/** Whether this set of roles is one MFA is recommended for. Never a gate — see above. */
|
|
4
4
|
export declare function requiresMfa(userRoles: readonly string[], collections: readonly CollectionDefinition[]): boolean;
|
package/dist/mfa.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mfa.d.ts","sourceRoot":"","sources":["../src/mfa.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"mfa.d.ts","sourceRoot":"","sources":["../src/mfa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,oBAAoB,EAA2B,MAAM,iBAAiB,CAAA;AA2BpF,wBAAgB,cAAc,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAQhG;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CACzB,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,WAAW,EAAE,SAAS,oBAAoB,EAAE,GAC3C,OAAO,CAGT"}
|
package/dist/mfa.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { normalisePermissionRule } from '@cogenta/schema';
|
|
1
2
|
/**
|
|
2
3
|
* Which roles are sensitive enough that a second factor is *recommended*.
|
|
3
4
|
*
|
|
@@ -25,8 +26,9 @@ const ALWAYS_SENSITIVE_ROLES = new Set(['admin']);
|
|
|
25
26
|
export function sensitiveRoles(collections) {
|
|
26
27
|
const roles = new Set(ALWAYS_SENSITIVE_ROLES);
|
|
27
28
|
for (const collection of collections) {
|
|
28
|
-
for (const role of collection.permissions.publish
|
|
29
|
+
for (const role of normalisePermissionRule(collection.permissions.publish).roles) {
|
|
29
30
|
roles.add(role);
|
|
31
|
+
}
|
|
30
32
|
}
|
|
31
33
|
return roles;
|
|
32
34
|
}
|
package/dist/mfa.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mfa.js","sourceRoot":"","sources":["../src/mfa.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mfa.js","sourceRoot":"","sources":["../src/mfa.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEpF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;AAEjD,MAAM,UAAU,cAAc,CAAC,WAA4C;IACzE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,sBAAsB,CAAC,CAAA;IAC7C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,uBAAuB,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YACjF,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,WAAW,CACzB,SAA4B,EAC5B,WAA4C;IAE5C,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC,CAAA;IAC7C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;AACtD,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TOTP recovery codes (fiche 18 task 1) — the way back in for an account that
|
|
3
|
+
* enrolled a second factor and then lost the device that produces it.
|
|
4
|
+
*
|
|
5
|
+
* Without this, `docs/lots/17-utilisateurs.md`'s deliberate decision not to let
|
|
6
|
+
* an admin reset somebody else's password, combined with a lost authenticator,
|
|
7
|
+
* is a permanent lockout. A recovery code is, in every way that matters, a
|
|
8
|
+
* spare password: ten of them are generated at once, shown to the person
|
|
9
|
+
* exactly once, and stored **hashed with the same scrypt as a real password**
|
|
10
|
+
* (`password.ts`) rather than a lighter or reversible encoding — a leaked
|
|
11
|
+
* credentials table must hand out nothing live here either.
|
|
12
|
+
*/
|
|
13
|
+
export declare const RECOVERY_CODE_COUNT = 10;
|
|
14
|
+
/** `count` fresh, distinct plaintext codes. The caller shows them to the person exactly once and never logs them. */
|
|
15
|
+
export declare function generateRecoveryCodes(count?: number): readonly string[];
|
|
16
|
+
/**
|
|
17
|
+
* What a person actually types back rarely matches the display exactly —
|
|
18
|
+
* lowercase, a missing dash, stray whitespace copied along with it. None of
|
|
19
|
+
* that is part of the secret, so it is normalised away before hashing and
|
|
20
|
+
* before verifying, on both sides, the same way.
|
|
21
|
+
*/
|
|
22
|
+
export declare function normaliseRecoveryCode(input: string): string;
|
|
23
|
+
export declare function hashRecoveryCode(code: string): Promise<string>;
|
|
24
|
+
export declare function verifyRecoveryCode(code: string, hash: string): Promise<boolean>;
|
|
25
|
+
//# sourceMappingURL=recovery-codes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-codes.d.ts","sourceRoot":"","sources":["../src/recovery-codes.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAoBrC,qHAAqH;AACrH,wBAAgB,qBAAqB,CAAC,KAAK,GAAE,MAA4B,GAAG,SAAS,MAAM,EAAE,CAI5F;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE9D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/E"}
|