@eaccess/auth 0.1.1 → 0.1.2
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/index.cjs +143 -106
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +36 -1
- package/dist/index.d.ts +36 -1
- package/dist/index.js +142 -106
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -15,6 +15,24 @@ interface AzureProviderConfig extends OAuthProviderConfig {
|
|
|
15
15
|
}
|
|
16
16
|
interface AuthConfig {
|
|
17
17
|
db: Pool;
|
|
18
|
+
/**
|
|
19
|
+
* If a user logs in with an OAuth provider, but a matching account (identified by the OAuth user's email address) doesn't
|
|
20
|
+
* exist, createUser will be called:
|
|
21
|
+
*
|
|
22
|
+
* @example:
|
|
23
|
+
*
|
|
24
|
+
* if (this.authConfig.createUser) {
|
|
25
|
+
* userId = await this.authConfig.createUser(userData);
|
|
26
|
+
* } else {
|
|
27
|
+
* // Generate UUID for OAuth users when no createUser function is provided
|
|
28
|
+
* userId = crypto.randomUUID();
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* This callback is your opportunity to create a user account in *your* database, and return
|
|
32
|
+
* the user ID of the newly-created user for this provider account to be linked to.
|
|
33
|
+
* @param userData
|
|
34
|
+
* @returns
|
|
35
|
+
*/
|
|
18
36
|
createUser?: (userData: OAuthUserData) => string | number | Promise<string | number>;
|
|
19
37
|
tablePrefix?: string;
|
|
20
38
|
minPasswordLength?: number;
|
|
@@ -513,6 +531,23 @@ declare function getAuthTableStats(config: AuthConfig): Promise<{
|
|
|
513
531
|
expiredTwoFactorTokens: number;
|
|
514
532
|
}>;
|
|
515
533
|
|
|
534
|
+
/**
|
|
535
|
+
* Create a new user account without requiring Express request/response objects.
|
|
536
|
+
* This function is suitable for use in seeders, CLI tools, and other standalone contexts.
|
|
537
|
+
*
|
|
538
|
+
* @param config - Auth configuration containing database connection and settings
|
|
539
|
+
* @param credentials - Email and password for new account
|
|
540
|
+
* @param userId - Optional user ID to link this auth account to. If not provided, a UUID will be generated automatically.
|
|
541
|
+
* @param callback - If provided, account is created unverified and callback receives confirmation token. Create a URL like /confirm/{token} and call confirmEmail() in that handler. If omitted, account is immediately verified.
|
|
542
|
+
* @returns The created account record
|
|
543
|
+
* @throws {EmailTakenError} Email is already registered
|
|
544
|
+
* @throws {InvalidPasswordError} Password doesn't meet length requirements
|
|
545
|
+
*/
|
|
546
|
+
declare function createUser(config: AuthConfig, credentials: {
|
|
547
|
+
email: string;
|
|
548
|
+
password: string;
|
|
549
|
+
}, userId?: string | number, callback?: TokenCallback): Promise<AuthAccount>;
|
|
550
|
+
|
|
516
551
|
declare class AuthError extends Error {
|
|
517
552
|
constructor(message: string);
|
|
518
553
|
}
|
|
@@ -927,4 +962,4 @@ declare class AzureProvider extends BaseOAuthProvider {
|
|
|
927
962
|
protected exchangeCodeForToken(code: string, tokenUrl: string): Promise<string>;
|
|
928
963
|
}
|
|
929
964
|
|
|
930
|
-
export { ActivityLogger, type AuthAccount, type AuthActivity, AuthActivityAction, type AuthActivityActionType, type AuthAdminManager, type AuthConfig, type AuthConfirmation, AuthError, type AuthManager$1 as AuthManager, type AuthProvider, type AuthRemember, type AuthReset, AuthRole, type AuthSession, AuthStatus, AzureProvider, type AzureProviderConfig, BaseOAuthProvider, ConfirmationExpiredError, ConfirmationNotFoundError, EmailNotVerifiedError, EmailTakenError, GitHubProvider, type GitHubProviderConfig, GoogleProvider, type GoogleProviderConfig, InvalidBackupCodeError, InvalidEmailError, InvalidPasswordError, InvalidTokenError, InvalidTwoFactorCodeError, type OAuthProvider, type OAuthProviderConfig, type OAuthUserData, OtpProvider, ResetDisabledError, ResetExpiredError, ResetNotFoundError, SecondFactorRequiredError, type TokenCallback, TooManyResetsError, TotpProvider, TwoFactorAlreadyEnabledError, type TwoFactorChallenge, TwoFactorExpiredError, TwoFactorManager, TwoFactorMechanism, type TwoFactorMethod, TwoFactorNotSetupError, TwoFactorSetupIncompleteError, type TwoFactorSetupResult, type TwoFactorToken, UserInactiveError, UserNotFoundError, UserNotLoggedInError, cleanupExpiredTokens, createAuthMiddleware, createAuthTables, dropAuthTables, getAuthTableStats, isValidEmail, validateEmail };
|
|
965
|
+
export { ActivityLogger, type AuthAccount, type AuthActivity, AuthActivityAction, type AuthActivityActionType, type AuthAdminManager, type AuthConfig, type AuthConfirmation, AuthError, type AuthManager$1 as AuthManager, type AuthProvider, type AuthRemember, type AuthReset, AuthRole, type AuthSession, AuthStatus, AzureProvider, type AzureProviderConfig, BaseOAuthProvider, ConfirmationExpiredError, ConfirmationNotFoundError, EmailNotVerifiedError, EmailTakenError, GitHubProvider, type GitHubProviderConfig, GoogleProvider, type GoogleProviderConfig, InvalidBackupCodeError, InvalidEmailError, InvalidPasswordError, InvalidTokenError, InvalidTwoFactorCodeError, type OAuthProvider, type OAuthProviderConfig, type OAuthUserData, OtpProvider, ResetDisabledError, ResetExpiredError, ResetNotFoundError, SecondFactorRequiredError, type TokenCallback, TooManyResetsError, TotpProvider, TwoFactorAlreadyEnabledError, type TwoFactorChallenge, TwoFactorExpiredError, TwoFactorManager, TwoFactorMechanism, type TwoFactorMethod, TwoFactorNotSetupError, TwoFactorSetupIncompleteError, type TwoFactorSetupResult, type TwoFactorToken, UserInactiveError, UserNotFoundError, UserNotLoggedInError, cleanupExpiredTokens, createAuthMiddleware, createAuthTables, createUser, dropAuthTables, getAuthTableStats, isValidEmail, validateEmail };
|
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,24 @@ interface AzureProviderConfig extends OAuthProviderConfig {
|
|
|
15
15
|
}
|
|
16
16
|
interface AuthConfig {
|
|
17
17
|
db: Pool;
|
|
18
|
+
/**
|
|
19
|
+
* If a user logs in with an OAuth provider, but a matching account (identified by the OAuth user's email address) doesn't
|
|
20
|
+
* exist, createUser will be called:
|
|
21
|
+
*
|
|
22
|
+
* @example:
|
|
23
|
+
*
|
|
24
|
+
* if (this.authConfig.createUser) {
|
|
25
|
+
* userId = await this.authConfig.createUser(userData);
|
|
26
|
+
* } else {
|
|
27
|
+
* // Generate UUID for OAuth users when no createUser function is provided
|
|
28
|
+
* userId = crypto.randomUUID();
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* This callback is your opportunity to create a user account in *your* database, and return
|
|
32
|
+
* the user ID of the newly-created user for this provider account to be linked to.
|
|
33
|
+
* @param userData
|
|
34
|
+
* @returns
|
|
35
|
+
*/
|
|
18
36
|
createUser?: (userData: OAuthUserData) => string | number | Promise<string | number>;
|
|
19
37
|
tablePrefix?: string;
|
|
20
38
|
minPasswordLength?: number;
|
|
@@ -513,6 +531,23 @@ declare function getAuthTableStats(config: AuthConfig): Promise<{
|
|
|
513
531
|
expiredTwoFactorTokens: number;
|
|
514
532
|
}>;
|
|
515
533
|
|
|
534
|
+
/**
|
|
535
|
+
* Create a new user account without requiring Express request/response objects.
|
|
536
|
+
* This function is suitable for use in seeders, CLI tools, and other standalone contexts.
|
|
537
|
+
*
|
|
538
|
+
* @param config - Auth configuration containing database connection and settings
|
|
539
|
+
* @param credentials - Email and password for new account
|
|
540
|
+
* @param userId - Optional user ID to link this auth account to. If not provided, a UUID will be generated automatically.
|
|
541
|
+
* @param callback - If provided, account is created unverified and callback receives confirmation token. Create a URL like /confirm/{token} and call confirmEmail() in that handler. If omitted, account is immediately verified.
|
|
542
|
+
* @returns The created account record
|
|
543
|
+
* @throws {EmailTakenError} Email is already registered
|
|
544
|
+
* @throws {InvalidPasswordError} Password doesn't meet length requirements
|
|
545
|
+
*/
|
|
546
|
+
declare function createUser(config: AuthConfig, credentials: {
|
|
547
|
+
email: string;
|
|
548
|
+
password: string;
|
|
549
|
+
}, userId?: string | number, callback?: TokenCallback): Promise<AuthAccount>;
|
|
550
|
+
|
|
516
551
|
declare class AuthError extends Error {
|
|
517
552
|
constructor(message: string);
|
|
518
553
|
}
|
|
@@ -927,4 +962,4 @@ declare class AzureProvider extends BaseOAuthProvider {
|
|
|
927
962
|
protected exchangeCodeForToken(code: string, tokenUrl: string): Promise<string>;
|
|
928
963
|
}
|
|
929
964
|
|
|
930
|
-
export { ActivityLogger, type AuthAccount, type AuthActivity, AuthActivityAction, type AuthActivityActionType, type AuthAdminManager, type AuthConfig, type AuthConfirmation, AuthError, type AuthManager$1 as AuthManager, type AuthProvider, type AuthRemember, type AuthReset, AuthRole, type AuthSession, AuthStatus, AzureProvider, type AzureProviderConfig, BaseOAuthProvider, ConfirmationExpiredError, ConfirmationNotFoundError, EmailNotVerifiedError, EmailTakenError, GitHubProvider, type GitHubProviderConfig, GoogleProvider, type GoogleProviderConfig, InvalidBackupCodeError, InvalidEmailError, InvalidPasswordError, InvalidTokenError, InvalidTwoFactorCodeError, type OAuthProvider, type OAuthProviderConfig, type OAuthUserData, OtpProvider, ResetDisabledError, ResetExpiredError, ResetNotFoundError, SecondFactorRequiredError, type TokenCallback, TooManyResetsError, TotpProvider, TwoFactorAlreadyEnabledError, type TwoFactorChallenge, TwoFactorExpiredError, TwoFactorManager, TwoFactorMechanism, type TwoFactorMethod, TwoFactorNotSetupError, TwoFactorSetupIncompleteError, type TwoFactorSetupResult, type TwoFactorToken, UserInactiveError, UserNotFoundError, UserNotLoggedInError, cleanupExpiredTokens, createAuthMiddleware, createAuthTables, dropAuthTables, getAuthTableStats, isValidEmail, validateEmail };
|
|
965
|
+
export { ActivityLogger, type AuthAccount, type AuthActivity, AuthActivityAction, type AuthActivityActionType, type AuthAdminManager, type AuthConfig, type AuthConfirmation, AuthError, type AuthManager$1 as AuthManager, type AuthProvider, type AuthRemember, type AuthReset, AuthRole, type AuthSession, AuthStatus, AzureProvider, type AzureProviderConfig, BaseOAuthProvider, ConfirmationExpiredError, ConfirmationNotFoundError, EmailNotVerifiedError, EmailTakenError, GitHubProvider, type GitHubProviderConfig, GoogleProvider, type GoogleProviderConfig, InvalidBackupCodeError, InvalidEmailError, InvalidPasswordError, InvalidTokenError, InvalidTwoFactorCodeError, type OAuthProvider, type OAuthProviderConfig, type OAuthUserData, OtpProvider, ResetDisabledError, ResetExpiredError, ResetNotFoundError, SecondFactorRequiredError, type TokenCallback, TooManyResetsError, TotpProvider, TwoFactorAlreadyEnabledError, type TwoFactorChallenge, TwoFactorExpiredError, TwoFactorManager, TwoFactorMechanism, type TwoFactorMethod, TwoFactorNotSetupError, TwoFactorSetupIncompleteError, type TwoFactorSetupResult, type TwoFactorToken, UserInactiveError, UserNotFoundError, UserNotLoggedInError, cleanupExpiredTokens, createAuthMiddleware, createAuthTables, createUser, dropAuthTables, getAuthTableStats, isValidEmail, validateEmail };
|
package/dist/index.js
CHANGED
|
@@ -1,69 +1,7 @@
|
|
|
1
1
|
// src/auth-admin-manager.ts
|
|
2
|
-
import { hash } from "@prsm/hash";
|
|
2
|
+
import { hash as hash2 } from "@prsm/hash";
|
|
3
3
|
import ms from "@prsm/ms";
|
|
4
4
|
|
|
5
|
-
// src/types.ts
|
|
6
|
-
import "express-session";
|
|
7
|
-
var TwoFactorMechanism = /* @__PURE__ */ ((TwoFactorMechanism2) => {
|
|
8
|
-
TwoFactorMechanism2[TwoFactorMechanism2["TOTP"] = 1] = "TOTP";
|
|
9
|
-
TwoFactorMechanism2[TwoFactorMechanism2["EMAIL"] = 2] = "EMAIL";
|
|
10
|
-
TwoFactorMechanism2[TwoFactorMechanism2["SMS"] = 3] = "SMS";
|
|
11
|
-
return TwoFactorMechanism2;
|
|
12
|
-
})(TwoFactorMechanism || {});
|
|
13
|
-
var AuthStatus = {
|
|
14
|
-
Normal: 0,
|
|
15
|
-
Archived: 1,
|
|
16
|
-
Banned: 2,
|
|
17
|
-
Locked: 3,
|
|
18
|
-
PendingReview: 4,
|
|
19
|
-
Suspended: 5
|
|
20
|
-
};
|
|
21
|
-
var AuthRole = {
|
|
22
|
-
Admin: 1,
|
|
23
|
-
Author: 2,
|
|
24
|
-
Collaborator: 4,
|
|
25
|
-
Consultant: 8,
|
|
26
|
-
Consumer: 16,
|
|
27
|
-
Contributor: 32,
|
|
28
|
-
Coordinator: 64,
|
|
29
|
-
Creator: 128,
|
|
30
|
-
Developer: 256,
|
|
31
|
-
Director: 512,
|
|
32
|
-
Editor: 1024,
|
|
33
|
-
Employee: 2048,
|
|
34
|
-
Maintainer: 4096,
|
|
35
|
-
Manager: 8192,
|
|
36
|
-
Moderator: 16384,
|
|
37
|
-
Publisher: 32768,
|
|
38
|
-
Reviewer: 65536,
|
|
39
|
-
Subscriber: 131072,
|
|
40
|
-
SuperAdmin: 262144,
|
|
41
|
-
SuperEditor: 524288,
|
|
42
|
-
SuperModerator: 1048576,
|
|
43
|
-
Translator: 2097152
|
|
44
|
-
};
|
|
45
|
-
var AuthActivityAction = {
|
|
46
|
-
Login: "login",
|
|
47
|
-
Logout: "logout",
|
|
48
|
-
FailedLogin: "failed_login",
|
|
49
|
-
Register: "register",
|
|
50
|
-
EmailConfirmed: "email_confirmed",
|
|
51
|
-
PasswordResetRequested: "password_reset_requested",
|
|
52
|
-
PasswordResetCompleted: "password_reset_completed",
|
|
53
|
-
PasswordChanged: "password_changed",
|
|
54
|
-
EmailChanged: "email_changed",
|
|
55
|
-
RoleChanged: "role_changed",
|
|
56
|
-
StatusChanged: "status_changed",
|
|
57
|
-
ForceLogout: "force_logout",
|
|
58
|
-
OAuthConnected: "oauth_connected",
|
|
59
|
-
RememberTokenCreated: "remember_token_created",
|
|
60
|
-
TwoFactorSetup: "two_factor_setup",
|
|
61
|
-
TwoFactorVerified: "two_factor_verified",
|
|
62
|
-
TwoFactorFailed: "two_factor_failed",
|
|
63
|
-
TwoFactorDisabled: "two_factor_disabled",
|
|
64
|
-
BackupCodeUsed: "backup_code_used"
|
|
65
|
-
};
|
|
66
|
-
|
|
67
5
|
// src/queries.ts
|
|
68
6
|
var AuthQueries = class {
|
|
69
7
|
constructor(config) {
|
|
@@ -440,6 +378,9 @@ var TwoFactorSetupIncompleteError = class extends AuthError {
|
|
|
440
378
|
}
|
|
441
379
|
};
|
|
442
380
|
|
|
381
|
+
// src/create-user.ts
|
|
382
|
+
import { hash } from "@prsm/hash";
|
|
383
|
+
|
|
443
384
|
// src/util.ts
|
|
444
385
|
var isValidEmail = (email) => {
|
|
445
386
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
@@ -458,6 +399,123 @@ var validateEmail = (email) => {
|
|
|
458
399
|
};
|
|
459
400
|
var createMapFromEnum = (enumObj) => Object.fromEntries(Object.entries(enumObj).map(([key, value]) => [value, key]));
|
|
460
401
|
|
|
402
|
+
// src/types.ts
|
|
403
|
+
import "express-session";
|
|
404
|
+
var TwoFactorMechanism = /* @__PURE__ */ ((TwoFactorMechanism2) => {
|
|
405
|
+
TwoFactorMechanism2[TwoFactorMechanism2["TOTP"] = 1] = "TOTP";
|
|
406
|
+
TwoFactorMechanism2[TwoFactorMechanism2["EMAIL"] = 2] = "EMAIL";
|
|
407
|
+
TwoFactorMechanism2[TwoFactorMechanism2["SMS"] = 3] = "SMS";
|
|
408
|
+
return TwoFactorMechanism2;
|
|
409
|
+
})(TwoFactorMechanism || {});
|
|
410
|
+
var AuthStatus = {
|
|
411
|
+
Normal: 0,
|
|
412
|
+
Archived: 1,
|
|
413
|
+
Banned: 2,
|
|
414
|
+
Locked: 3,
|
|
415
|
+
PendingReview: 4,
|
|
416
|
+
Suspended: 5
|
|
417
|
+
};
|
|
418
|
+
var AuthRole = {
|
|
419
|
+
Admin: 1,
|
|
420
|
+
Author: 2,
|
|
421
|
+
Collaborator: 4,
|
|
422
|
+
Consultant: 8,
|
|
423
|
+
Consumer: 16,
|
|
424
|
+
Contributor: 32,
|
|
425
|
+
Coordinator: 64,
|
|
426
|
+
Creator: 128,
|
|
427
|
+
Developer: 256,
|
|
428
|
+
Director: 512,
|
|
429
|
+
Editor: 1024,
|
|
430
|
+
Employee: 2048,
|
|
431
|
+
Maintainer: 4096,
|
|
432
|
+
Manager: 8192,
|
|
433
|
+
Moderator: 16384,
|
|
434
|
+
Publisher: 32768,
|
|
435
|
+
Reviewer: 65536,
|
|
436
|
+
Subscriber: 131072,
|
|
437
|
+
SuperAdmin: 262144,
|
|
438
|
+
SuperEditor: 524288,
|
|
439
|
+
SuperModerator: 1048576,
|
|
440
|
+
Translator: 2097152
|
|
441
|
+
};
|
|
442
|
+
var AuthActivityAction = {
|
|
443
|
+
Login: "login",
|
|
444
|
+
Logout: "logout",
|
|
445
|
+
FailedLogin: "failed_login",
|
|
446
|
+
Register: "register",
|
|
447
|
+
EmailConfirmed: "email_confirmed",
|
|
448
|
+
PasswordResetRequested: "password_reset_requested",
|
|
449
|
+
PasswordResetCompleted: "password_reset_completed",
|
|
450
|
+
PasswordChanged: "password_changed",
|
|
451
|
+
EmailChanged: "email_changed",
|
|
452
|
+
RoleChanged: "role_changed",
|
|
453
|
+
StatusChanged: "status_changed",
|
|
454
|
+
ForceLogout: "force_logout",
|
|
455
|
+
OAuthConnected: "oauth_connected",
|
|
456
|
+
RememberTokenCreated: "remember_token_created",
|
|
457
|
+
TwoFactorSetup: "two_factor_setup",
|
|
458
|
+
TwoFactorVerified: "two_factor_verified",
|
|
459
|
+
TwoFactorFailed: "two_factor_failed",
|
|
460
|
+
TwoFactorDisabled: "two_factor_disabled",
|
|
461
|
+
BackupCodeUsed: "backup_code_used"
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
// src/create-user.ts
|
|
465
|
+
function validatePassword(password, config) {
|
|
466
|
+
const minLength = config.minPasswordLength || 8;
|
|
467
|
+
const maxLength = config.maxPasswordLength || 64;
|
|
468
|
+
if (typeof password !== "string") {
|
|
469
|
+
throw new InvalidPasswordError();
|
|
470
|
+
}
|
|
471
|
+
if (password.length < minLength) {
|
|
472
|
+
throw new InvalidPasswordError();
|
|
473
|
+
}
|
|
474
|
+
if (password.length > maxLength) {
|
|
475
|
+
throw new InvalidPasswordError();
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
function generateAutoUserId() {
|
|
479
|
+
return crypto.randomUUID();
|
|
480
|
+
}
|
|
481
|
+
async function createConfirmationToken(queries, account, email, callback) {
|
|
482
|
+
const token = hash.encode(email);
|
|
483
|
+
const expires = new Date(Date.now() + 1e3 * 60 * 60 * 24 * 7);
|
|
484
|
+
await queries.createConfirmation({
|
|
485
|
+
accountId: account.id,
|
|
486
|
+
token,
|
|
487
|
+
email,
|
|
488
|
+
expires
|
|
489
|
+
});
|
|
490
|
+
if (callback) {
|
|
491
|
+
callback(token);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
async function createUser(config, credentials, userId, callback) {
|
|
495
|
+
validateEmail(credentials.email);
|
|
496
|
+
validatePassword(credentials.password, config);
|
|
497
|
+
const queries = new AuthQueries(config);
|
|
498
|
+
const existing = await queries.findAccountByEmail(credentials.email);
|
|
499
|
+
if (existing) {
|
|
500
|
+
throw new EmailTakenError();
|
|
501
|
+
}
|
|
502
|
+
const finalUserId = userId || generateAutoUserId();
|
|
503
|
+
const hashedPassword = hash.encode(credentials.password);
|
|
504
|
+
const verified = typeof callback !== "function";
|
|
505
|
+
const account = await queries.createAccount({
|
|
506
|
+
userId: finalUserId,
|
|
507
|
+
email: credentials.email,
|
|
508
|
+
password: hashedPassword,
|
|
509
|
+
verified,
|
|
510
|
+
status: AuthStatus.Normal,
|
|
511
|
+
rolemask: 0
|
|
512
|
+
});
|
|
513
|
+
if (!verified && callback) {
|
|
514
|
+
await createConfirmationToken(queries, account, credentials.email, callback);
|
|
515
|
+
}
|
|
516
|
+
return account;
|
|
517
|
+
}
|
|
518
|
+
|
|
461
519
|
// src/auth-admin-manager.ts
|
|
462
520
|
var AuthAdminManager = class {
|
|
463
521
|
constructor(req, res, config, auth) {
|
|
@@ -480,9 +538,6 @@ var AuthAdminManager = class {
|
|
|
480
538
|
throw new InvalidPasswordError();
|
|
481
539
|
}
|
|
482
540
|
}
|
|
483
|
-
generateAutoUserId() {
|
|
484
|
-
return crypto.randomUUID();
|
|
485
|
-
}
|
|
486
541
|
async findAccountByIdentifier(identifier) {
|
|
487
542
|
if (identifier.accountId !== void 0) {
|
|
488
543
|
return await this.queries.findAccountById(identifier.accountId);
|
|
@@ -494,7 +549,7 @@ var AuthAdminManager = class {
|
|
|
494
549
|
return null;
|
|
495
550
|
}
|
|
496
551
|
async createConfirmationToken(account, email, callback) {
|
|
497
|
-
const token =
|
|
552
|
+
const token = hash2.encode(email);
|
|
498
553
|
const expires = new Date(Date.now() + 1e3 * 60 * 60 * 24 * 7);
|
|
499
554
|
await this.queries.createConfirmation({
|
|
500
555
|
accountId: account.id,
|
|
@@ -517,27 +572,7 @@ var AuthAdminManager = class {
|
|
|
517
572
|
* @throws {InvalidPasswordError} Password doesn't meet length requirements
|
|
518
573
|
*/
|
|
519
574
|
async createUser(credentials, userId, callback) {
|
|
520
|
-
|
|
521
|
-
this.validatePassword(credentials.password);
|
|
522
|
-
const existing = await this.queries.findAccountByEmail(credentials.email);
|
|
523
|
-
if (existing) {
|
|
524
|
-
throw new EmailTakenError();
|
|
525
|
-
}
|
|
526
|
-
const finalUserId = userId || this.generateAutoUserId();
|
|
527
|
-
const hashedPassword = hash.encode(credentials.password);
|
|
528
|
-
const verified = typeof callback !== "function";
|
|
529
|
-
const account = await this.queries.createAccount({
|
|
530
|
-
userId: finalUserId,
|
|
531
|
-
email: credentials.email,
|
|
532
|
-
password: hashedPassword,
|
|
533
|
-
verified,
|
|
534
|
-
status: AuthStatus.Normal,
|
|
535
|
-
rolemask: 0
|
|
536
|
-
});
|
|
537
|
-
if (!verified && callback) {
|
|
538
|
-
await this.createConfirmationToken(account, credentials.email, callback);
|
|
539
|
-
}
|
|
540
|
-
return account;
|
|
575
|
+
return createUser(this.config, credentials, userId, callback);
|
|
541
576
|
}
|
|
542
577
|
/**
|
|
543
578
|
* Log in as another user (admin function).
|
|
@@ -630,7 +665,7 @@ var AuthAdminManager = class {
|
|
|
630
665
|
throw new UserNotFoundError();
|
|
631
666
|
}
|
|
632
667
|
await this.queries.updateAccount(account.id, {
|
|
633
|
-
password:
|
|
668
|
+
password: hash2.encode(password)
|
|
634
669
|
});
|
|
635
670
|
}
|
|
636
671
|
/**
|
|
@@ -666,7 +701,7 @@ var AuthAdminManager = class {
|
|
|
666
701
|
throw new EmailNotVerifiedError();
|
|
667
702
|
}
|
|
668
703
|
const expiry = !expiresAfter ? ms("6h") : ms(expiresAfter);
|
|
669
|
-
const token =
|
|
704
|
+
const token = hash2.encode(account.email);
|
|
670
705
|
const expires = new Date(Date.now() + expiry);
|
|
671
706
|
await this.queries.createResetToken({
|
|
672
707
|
accountId: account.id,
|
|
@@ -698,7 +733,7 @@ var AuthAdminManager = class {
|
|
|
698
733
|
};
|
|
699
734
|
|
|
700
735
|
// src/auth-manager.ts
|
|
701
|
-
import { hash as
|
|
736
|
+
import { hash as hash5 } from "@prsm/hash";
|
|
702
737
|
import ms3 from "@prsm/ms";
|
|
703
738
|
|
|
704
739
|
// src/activity-logger.ts
|
|
@@ -1096,7 +1131,7 @@ var AzureProvider = class extends BaseOAuthProvider {
|
|
|
1096
1131
|
|
|
1097
1132
|
// src/two-factor/totp-provider.ts
|
|
1098
1133
|
import Otp from "@eaccess/totp";
|
|
1099
|
-
import { hash as
|
|
1134
|
+
import { hash as hash3 } from "@prsm/hash";
|
|
1100
1135
|
var TotpProvider = class {
|
|
1101
1136
|
constructor(config) {
|
|
1102
1137
|
this.config = config;
|
|
@@ -1125,11 +1160,11 @@ var TotpProvider = class {
|
|
|
1125
1160
|
return codes;
|
|
1126
1161
|
}
|
|
1127
1162
|
hashBackupCodes(codes) {
|
|
1128
|
-
return codes.map((code) =>
|
|
1163
|
+
return codes.map((code) => hash3.encode(code));
|
|
1129
1164
|
}
|
|
1130
1165
|
verifyBackupCode(hashedCodes, inputCode) {
|
|
1131
1166
|
for (let i = 0; i < hashedCodes.length; i++) {
|
|
1132
|
-
if (
|
|
1167
|
+
if (hash3.verify(hashedCodes[i], inputCode.toUpperCase())) {
|
|
1133
1168
|
return { isValid: true, index: i };
|
|
1134
1169
|
}
|
|
1135
1170
|
}
|
|
@@ -1146,7 +1181,7 @@ var TotpProvider = class {
|
|
|
1146
1181
|
|
|
1147
1182
|
// src/two-factor/otp-provider.ts
|
|
1148
1183
|
import ms2 from "@prsm/ms";
|
|
1149
|
-
import { hash as
|
|
1184
|
+
import { hash as hash4 } from "@prsm/hash";
|
|
1150
1185
|
var OtpProvider = class {
|
|
1151
1186
|
constructor(config) {
|
|
1152
1187
|
this.config = config;
|
|
@@ -1171,7 +1206,7 @@ var OtpProvider = class {
|
|
|
1171
1206
|
async createAndStoreOTP(accountId, mechanism) {
|
|
1172
1207
|
const otp = this.generateOTP();
|
|
1173
1208
|
const selector = this.generateSelector();
|
|
1174
|
-
const tokenHash =
|
|
1209
|
+
const tokenHash = hash4.encode(otp);
|
|
1175
1210
|
const expiryDuration = this.config.twoFactor?.tokenExpiry || "5m";
|
|
1176
1211
|
const expiresAt = new Date(Date.now() + ms2(expiryDuration));
|
|
1177
1212
|
await this.queries.deleteTwoFactorTokensByAccountAndMechanism(accountId, mechanism);
|
|
@@ -1193,7 +1228,7 @@ var OtpProvider = class {
|
|
|
1193
1228
|
await this.queries.deleteTwoFactorToken(token.id);
|
|
1194
1229
|
return { isValid: false };
|
|
1195
1230
|
}
|
|
1196
|
-
const isValid =
|
|
1231
|
+
const isValid = hash4.verify(token.token_hash, inputCode);
|
|
1197
1232
|
if (isValid) {
|
|
1198
1233
|
await this.queries.deleteTwoFactorToken(token.id);
|
|
1199
1234
|
return { isValid: true, token };
|
|
@@ -1782,7 +1817,7 @@ var AuthManager = class {
|
|
|
1782
1817
|
});
|
|
1783
1818
|
}
|
|
1784
1819
|
async createRememberDirective(account) {
|
|
1785
|
-
const token =
|
|
1820
|
+
const token = hash5.encode(account.email);
|
|
1786
1821
|
const duration = this.config.rememberDuration || "30d";
|
|
1787
1822
|
const expires = new Date(Date.now() + ms3(duration));
|
|
1788
1823
|
await this.queries.createRememberToken({
|
|
@@ -1820,7 +1855,7 @@ var AuthManager = class {
|
|
|
1820
1855
|
await this.activityLogger.logActivity(null, AuthActivityAction.FailedLogin, this.req, false, { email, reason: "account_not_found" });
|
|
1821
1856
|
throw new UserNotFoundError();
|
|
1822
1857
|
}
|
|
1823
|
-
if (!account.password || !
|
|
1858
|
+
if (!account.password || !hash5.verify(account.password, password)) {
|
|
1824
1859
|
await this.activityLogger.logActivity(account.id, AuthActivityAction.FailedLogin, this.req, false, { email, reason: "invalid_password" });
|
|
1825
1860
|
throw new InvalidPasswordError();
|
|
1826
1861
|
}
|
|
@@ -1932,7 +1967,7 @@ var AuthManager = class {
|
|
|
1932
1967
|
throw new EmailTakenError();
|
|
1933
1968
|
}
|
|
1934
1969
|
const finalUserId = userId || this.generateAutoUserId();
|
|
1935
|
-
const hashedPassword =
|
|
1970
|
+
const hashedPassword = hash5.encode(password);
|
|
1936
1971
|
const verified = typeof callback !== "function";
|
|
1937
1972
|
const account = await this.queries.createAccount({
|
|
1938
1973
|
userId: finalUserId,
|
|
@@ -1949,7 +1984,7 @@ var AuthManager = class {
|
|
|
1949
1984
|
return account;
|
|
1950
1985
|
}
|
|
1951
1986
|
async createConfirmationToken(account, email, callback) {
|
|
1952
|
-
const token =
|
|
1987
|
+
const token = hash5.encode(email);
|
|
1953
1988
|
const expires = new Date(Date.now() + 1e3 * 60 * 60 * 24 * 7);
|
|
1954
1989
|
await this.queries.createConfirmation({
|
|
1955
1990
|
accountId: account.id,
|
|
@@ -2083,7 +2118,7 @@ var AuthManager = class {
|
|
|
2083
2118
|
if (new Date(confirmation.expires) < /* @__PURE__ */ new Date()) {
|
|
2084
2119
|
throw new ConfirmationExpiredError();
|
|
2085
2120
|
}
|
|
2086
|
-
if (!
|
|
2121
|
+
if (!hash5.verify(token, confirmation.email)) {
|
|
2087
2122
|
throw new InvalidTokenError();
|
|
2088
2123
|
}
|
|
2089
2124
|
await this.queries.updateAccount(confirmation.account_id, {
|
|
@@ -2180,7 +2215,7 @@ var AuthManager = class {
|
|
|
2180
2215
|
if (openRequests >= maxRequests) {
|
|
2181
2216
|
throw new TooManyResetsError();
|
|
2182
2217
|
}
|
|
2183
|
-
const token =
|
|
2218
|
+
const token = hash5.encode(email);
|
|
2184
2219
|
const expires = new Date(Date.now() + expiry);
|
|
2185
2220
|
await this.queries.createResetToken({
|
|
2186
2221
|
accountId: account.id,
|
|
@@ -2222,11 +2257,11 @@ var AuthManager = class {
|
|
|
2222
2257
|
throw new ResetDisabledError();
|
|
2223
2258
|
}
|
|
2224
2259
|
this.validatePassword(password);
|
|
2225
|
-
if (!
|
|
2260
|
+
if (!hash5.verify(token, account.email)) {
|
|
2226
2261
|
throw new InvalidTokenError();
|
|
2227
2262
|
}
|
|
2228
2263
|
await this.queries.updateAccount(account.id, {
|
|
2229
|
-
password:
|
|
2264
|
+
password: hash5.encode(password)
|
|
2230
2265
|
});
|
|
2231
2266
|
if (logout) {
|
|
2232
2267
|
await this.forceLogoutForAccountById(account.id);
|
|
@@ -2254,7 +2289,7 @@ var AuthManager = class {
|
|
|
2254
2289
|
if (!account.password) {
|
|
2255
2290
|
return false;
|
|
2256
2291
|
}
|
|
2257
|
-
return
|
|
2292
|
+
return hash5.verify(account.password, password);
|
|
2258
2293
|
}
|
|
2259
2294
|
async forceLogoutForAccountById(accountId) {
|
|
2260
2295
|
await this.queries.deleteRememberTokensForAccount(accountId);
|
|
@@ -2547,6 +2582,7 @@ export {
|
|
|
2547
2582
|
cleanupExpiredTokens,
|
|
2548
2583
|
createAuthMiddleware,
|
|
2549
2584
|
createAuthTables,
|
|
2585
|
+
createUser,
|
|
2550
2586
|
dropAuthTables,
|
|
2551
2587
|
getAuthTableStats,
|
|
2552
2588
|
isValidEmail,
|