@proteinjs/user-server 1.7.0 → 1.9.0
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/CHANGELOG.md +37 -0
- package/dist/generated/index.d.ts.map +1 -1
- package/dist/generated/index.js +11 -1
- package/dist/generated/index.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/src/authentication/DbSessionStore.d.ts +3 -2
- package/dist/src/authentication/DbSessionStore.d.ts.map +1 -1
- package/dist/src/authentication/DbSessionStore.js +3 -2
- package/dist/src/authentication/DbSessionStore.js.map +1 -1
- package/dist/src/authentication/PasswordHasher.d.ts +45 -0
- package/dist/src/authentication/PasswordHasher.d.ts.map +1 -0
- package/dist/src/authentication/PasswordHasher.js +152 -0
- package/dist/src/authentication/PasswordHasher.js.map +1 -0
- package/dist/src/authentication/UserStatusTableWatcher.d.ts +19 -0
- package/dist/src/authentication/UserStatusTableWatcher.d.ts.map +1 -0
- package/dist/src/authentication/UserStatusTableWatcher.js +115 -0
- package/dist/src/authentication/UserStatusTableWatcher.js.map +1 -0
- package/dist/src/authentication/authenticate.d.ts.map +1 -1
- package/dist/src/authentication/authenticate.js +41 -13
- package/dist/src/authentication/authenticate.js.map +1 -1
- package/dist/src/authentication/establishSession.d.ts +30 -0
- package/dist/src/authentication/establishSession.d.ts.map +1 -0
- package/dist/src/authentication/establishSession.js +83 -0
- package/dist/src/authentication/establishSession.js.map +1 -0
- package/dist/src/authorization/userCache.d.ts.map +1 -1
- package/dist/src/authorization/userCache.js +10 -1
- package/dist/src/authorization/userCache.js.map +1 -1
- package/dist/src/emails/AccountDeletionEmailConfigs.d.ts +35 -0
- package/dist/src/emails/AccountDeletionEmailConfigs.d.ts.map +1 -0
- package/dist/src/emails/AccountDeletionEmailConfigs.js +36 -0
- package/dist/src/emails/AccountDeletionEmailConfigs.js.map +1 -0
- package/dist/src/emails/AccountDeletionEmails.d.ts +13 -0
- package/dist/src/emails/AccountDeletionEmails.d.ts.map +1 -0
- package/dist/src/emails/AccountDeletionEmails.js +98 -0
- package/dist/src/emails/AccountDeletionEmails.js.map +1 -0
- package/dist/src/routes/devLogin.d.ts.map +1 -1
- package/dist/src/routes/devLogin.js +6 -12
- package/dist/src/routes/devLogin.js.map +1 -1
- package/dist/src/routes/executePasswordReset.js +5 -3
- package/dist/src/routes/executePasswordReset.js.map +1 -1
- package/dist/src/routes/login.d.ts.map +1 -1
- package/dist/src/routes/login.js +27 -4
- package/dist/src/routes/login.js.map +1 -1
- package/dist/src/routes/logout.d.ts +10 -0
- package/dist/src/routes/logout.d.ts.map +1 -1
- package/dist/src/routes/logout.js +13 -32
- package/dist/src/routes/logout.js.map +1 -1
- package/dist/src/routes/signup.d.ts +19 -0
- package/dist/src/routes/signup.d.ts.map +1 -0
- package/dist/src/routes/signup.js +102 -0
- package/dist/src/routes/signup.js.map +1 -0
- package/dist/src/routes/validateResetPasswordToken.d.ts.map +1 -1
- package/dist/src/routes/validateResetPasswordToken.js +5 -1
- package/dist/src/routes/validateResetPasswordToken.js.map +1 -1
- package/dist/src/services/AccountDeletion.d.ts +52 -0
- package/dist/src/services/AccountDeletion.d.ts.map +1 -0
- package/dist/src/services/AccountDeletion.js +426 -0
- package/dist/src/services/AccountDeletion.js.map +1 -0
- package/dist/src/services/MachineCredentials.d.ts +21 -0
- package/dist/src/services/MachineCredentials.d.ts.map +1 -0
- package/dist/src/services/MachineCredentials.js +164 -0
- package/dist/src/services/MachineCredentials.js.map +1 -0
- package/dist/src/services/Roles.d.ts.map +1 -1
- package/dist/src/services/Roles.js +7 -0
- package/dist/src/services/Roles.js.map +1 -1
- package/dist/src/services/SetUserStatus.d.ts +18 -0
- package/dist/src/services/SetUserStatus.d.ts.map +1 -0
- package/dist/src/services/SetUserStatus.js +118 -0
- package/dist/src/services/SetUserStatus.js.map +1 -0
- package/dist/src/services/Signup.d.ts +20 -3
- package/dist/src/services/Signup.d.ts.map +1 -1
- package/dist/src/services/Signup.js +30 -19
- package/dist/src/services/Signup.js.map +1 -1
- package/dist/src/services/UpdateUserInfo.d.ts.map +1 -1
- package/dist/src/services/UpdateUserInfo.js +20 -17
- package/dist/src/services/UpdateUserInfo.js.map +1 -1
- package/dist/test/AccountDeletion.integration.test.d.ts +2 -0
- package/dist/test/AccountDeletion.integration.test.d.ts.map +1 -0
- package/dist/test/AccountDeletion.integration.test.js +718 -0
- package/dist/test/AccountDeletion.integration.test.js.map +1 -0
- package/dist/test/DevLogin.test.js +27 -31
- package/dist/test/DevLogin.test.js.map +1 -1
- package/dist/test/LogoutRoute.test.d.ts +2 -0
- package/dist/test/LogoutRoute.test.d.ts.map +1 -0
- package/dist/test/LogoutRoute.test.js +81 -0
- package/dist/test/LogoutRoute.test.js.map +1 -0
- package/dist/test/MachineAccounts.integration.test.d.ts +2 -0
- package/dist/test/MachineAccounts.integration.test.d.ts.map +1 -0
- package/dist/test/MachineAccounts.integration.test.js +597 -0
- package/dist/test/MachineAccounts.integration.test.js.map +1 -0
- package/dist/test/PasswordMigration.integration.test.d.ts +2 -0
- package/dist/test/PasswordMigration.integration.test.d.ts.map +1 -0
- package/dist/test/PasswordMigration.integration.test.js +332 -0
- package/dist/test/PasswordMigration.integration.test.js.map +1 -0
- package/dist/test/SetUserStatus.integration.test.d.ts +2 -0
- package/dist/test/SetUserStatus.integration.test.d.ts.map +1 -0
- package/dist/test/SetUserStatus.integration.test.js +266 -0
- package/dist/test/SetUserStatus.integration.test.js.map +1 -0
- package/dist/test/Signup.test.js +4 -2
- package/dist/test/Signup.test.js.map +1 -1
- package/dist/test/SignupRoute.test.d.ts +2 -0
- package/dist/test/SignupRoute.test.d.ts.map +1 -0
- package/dist/test/SignupRoute.test.js +338 -0
- package/dist/test/SignupRoute.test.js.map +1 -0
- package/dist/test/UserStatusGate.integration.test.d.ts +2 -0
- package/dist/test/UserStatusGate.integration.test.d.ts.map +1 -0
- package/dist/test/UserStatusGate.integration.test.js +162 -0
- package/dist/test/UserStatusGate.integration.test.js.map +1 -0
- package/dist/test/ValidateResetToken.test.d.ts +2 -0
- package/dist/test/ValidateResetToken.test.d.ts.map +1 -0
- package/dist/test/ValidateResetToken.test.js +170 -0
- package/dist/test/ValidateResetToken.test.js.map +1 -0
- package/dist/test/passportSessionHarness.d.ts +31 -0
- package/dist/test/passportSessionHarness.d.ts.map +1 -0
- package/dist/test/passportSessionHarness.js +107 -0
- package/dist/test/passportSessionHarness.js.map +1 -0
- package/generated/index.ts +11 -1
- package/index.ts +3 -0
- package/package.json +11 -7
- package/src/authentication/DbSessionStore.ts +3 -2
- package/src/authentication/PasswordHasher.ts +87 -0
- package/src/authentication/UserStatusTableWatcher.ts +56 -0
- package/src/authentication/authenticate.ts +31 -6
- package/src/authentication/establishSession.ts +33 -0
- package/src/authorization/userCache.ts +9 -1
- package/src/emails/AccountDeletionEmailConfigs.ts +79 -0
- package/src/emails/AccountDeletionEmails.ts +39 -0
- package/src/routes/devLogin.ts +4 -6
- package/src/routes/executePasswordReset.ts +2 -2
- package/src/routes/login.ts +25 -3
- package/src/routes/logout.ts +13 -18
- package/src/routes/signup.ts +55 -0
- package/src/routes/validateResetPasswordToken.ts +5 -1
- package/src/services/AccountDeletion.ts +291 -0
- package/src/services/MachineCredentials.ts +94 -0
- package/src/services/Roles.ts +10 -0
- package/src/services/SetUserStatus.ts +56 -0
- package/src/services/Signup.ts +25 -6
- package/src/services/UpdateUserInfo.ts +4 -5
- package/test/AccountDeletion.integration.test.ts +395 -0
- package/test/DevLogin.test.ts +16 -18
- package/test/LogoutRoute.test.ts +33 -0
- package/test/MachineAccounts.integration.test.ts +312 -0
- package/test/PasswordMigration.integration.test.ts +132 -0
- package/test/SetUserStatus.integration.test.ts +120 -0
- package/test/Signup.test.ts +4 -2
- package/test/SignupRoute.test.ts +219 -0
- package/test/UserStatusGate.integration.test.ts +68 -0
- package/test/ValidateResetToken.test.ts +86 -0
- package/test/passportSessionHarness.ts +58 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDefaultAccountDeletedEmailConfigFactory = exports.getDefaultAccountDeletionRequestedEmailConfigFactory = void 0;
|
|
4
|
+
var reflection_1 = require("@proteinjs/reflection");
|
|
5
|
+
var getDefaultAccountDeletionRequestedEmailConfigFactory = function () {
|
|
6
|
+
var defaultFactory = {
|
|
7
|
+
getConfig: function () { return ({
|
|
8
|
+
options: { subject: 'Your account is scheduled for deletion' },
|
|
9
|
+
getEmailContent: function (purgeAfter) { return ({
|
|
10
|
+
text: "Your account is scheduled for deletion. Your content is no longer visible to you or to " +
|
|
11
|
+
"anyone you shared it with. You can change your mind until ".concat(purgeAfter.format('MMMM D, YYYY'), " ") +
|
|
12
|
+
"by simply logging back in \u2014 that restores everything, including shares. After that date, your " +
|
|
13
|
+
"account and everything in it are permanently removed from our systems, and we'll email you to " +
|
|
14
|
+
"confirm when it's done. If you didn't request this, log back in now to cancel.",
|
|
15
|
+
}); },
|
|
16
|
+
}); },
|
|
17
|
+
};
|
|
18
|
+
var retrievedFactory = reflection_1.SourceRepository.get().object('@proteinjs/user-server/DefaultAccountDeletionRequestedEmailConfigFactory');
|
|
19
|
+
return retrievedFactory || defaultFactory;
|
|
20
|
+
};
|
|
21
|
+
exports.getDefaultAccountDeletionRequestedEmailConfigFactory = getDefaultAccountDeletionRequestedEmailConfigFactory;
|
|
22
|
+
var getDefaultAccountDeletedEmailConfigFactory = function () {
|
|
23
|
+
var defaultFactory = {
|
|
24
|
+
getConfig: function () { return ({
|
|
25
|
+
options: { subject: 'Your account has been deleted' },
|
|
26
|
+
getEmailContent: function () { return ({
|
|
27
|
+
text: "Your account and everything in it have been permanently removed from our systems. " +
|
|
28
|
+
"This is the confirmation you were promised when you requested deletion. Goodbye, and thank you.",
|
|
29
|
+
}); },
|
|
30
|
+
}); },
|
|
31
|
+
};
|
|
32
|
+
var retrievedFactory = reflection_1.SourceRepository.get().object('@proteinjs/user-server/DefaultAccountDeletedEmailConfigFactory');
|
|
33
|
+
return retrievedFactory || defaultFactory;
|
|
34
|
+
};
|
|
35
|
+
exports.getDefaultAccountDeletedEmailConfigFactory = getDefaultAccountDeletedEmailConfigFactory;
|
|
36
|
+
//# sourceMappingURL=AccountDeletionEmailConfigs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountDeletionEmailConfigs.js","sourceRoot":"","sources":["../../../src/emails/AccountDeletionEmailConfigs.ts"],"names":[],"mappings":";;;AAAA,oDAAmE;AAyB5D,IAAM,oDAAoD,GAC/D;IACE,IAAM,cAAc,GAAsD;QACxE,SAAS,EAAE,cAAM,OAAA,CAAC;YAChB,OAAO,EAAE,EAAE,OAAO,EAAE,wCAAwC,EAAE;YAC9D,eAAe,EAAE,UAAC,UAAkB,IAAK,OAAA,CAAC;gBACxC,IAAI,EACF,yFAAyF;oBACzF,oEAA6D,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,MAAG;oBACjG,qGAAgG;oBAChG,gGAAgG;oBAChG,gFAAgF;aACnF,CAAC,EAPuC,CAOvC;SACH,CAAC,EAVe,CAUf;KACH,CAAC;IAEF,IAAM,gBAAgB,GAAG,6BAAgB,CAAC,GAAG,EAAE,CAAC,MAAM,CACpD,0EAA0E,CAC3E,CAAC;IAEF,OAAO,gBAAgB,IAAI,cAAc,CAAC;AAC5C,CAAC,CAAC;AArBS,QAAA,oDAAoD,wDAqB7D;AAeG,IAAM,0CAA0C,GAAG;IACxD,IAAM,cAAc,GAA4C;QAC9D,SAAS,EAAE,cAAM,OAAA,CAAC;YAChB,OAAO,EAAE,EAAE,OAAO,EAAE,+BAA+B,EAAE;YACrD,eAAe,EAAE,cAAM,OAAA,CAAC;gBACtB,IAAI,EACF,oFAAoF;oBACpF,iGAAiG;aACpG,CAAC,EAJqB,CAIrB;SACH,CAAC,EAPe,CAOf;KACH,CAAC;IAEF,IAAM,gBAAgB,GAAG,6BAAgB,CAAC,GAAG,EAAE,CAAC,MAAM,CACpD,gEAAgE,CACjE,CAAC;IAEF,OAAO,gBAAgB,IAAI,cAAc,CAAC;AAC5C,CAAC,CAAC;AAjBW,QAAA,0CAA0C,8CAiBrD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Moment } from 'moment';
|
|
2
|
+
/**
|
|
3
|
+
* Thin sender for the two account-deletion emails: deletion-requested (at deactivation — the
|
|
4
|
+
* only cancel channel an account-takeover victim has) and the store-required completion
|
|
5
|
+
* confirmation (sent by the purge walker after the user row is gone). Content comes from the
|
|
6
|
+
* config factories beside this class; transport is the app's DefaultEmailConfigFactory SMTP
|
|
7
|
+
* config via EmailSender.
|
|
8
|
+
*/
|
|
9
|
+
export declare class AccountDeletionEmails {
|
|
10
|
+
sendDeletionRequested(to: string, purgeAfter: Moment): Promise<void>;
|
|
11
|
+
sendAccountDeleted(to: string): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=AccountDeletionEmails.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountDeletionEmails.d.ts","sourceRoot":"","sources":["../../../src/emails/AccountDeletionEmails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAOhC;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAC1B,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpE,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWpD"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.AccountDeletionEmails = void 0;
|
|
51
|
+
var email_server_1 = require("@proteinjs/email-server");
|
|
52
|
+
var AccountDeletionEmailConfigs_1 = require("./AccountDeletionEmailConfigs");
|
|
53
|
+
/**
|
|
54
|
+
* Thin sender for the two account-deletion emails: deletion-requested (at deactivation — the
|
|
55
|
+
* only cancel channel an account-takeover victim has) and the store-required completion
|
|
56
|
+
* confirmation (sent by the purge walker after the user row is gone). Content comes from the
|
|
57
|
+
* config factories beside this class; transport is the app's DefaultEmailConfigFactory SMTP
|
|
58
|
+
* config via EmailSender.
|
|
59
|
+
*/
|
|
60
|
+
var AccountDeletionEmails = /** @class */ (function () {
|
|
61
|
+
function AccountDeletionEmails() {
|
|
62
|
+
}
|
|
63
|
+
AccountDeletionEmails.prototype.sendDeletionRequested = function (to, purgeAfter) {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
65
|
+
var config, _a, text, html;
|
|
66
|
+
return __generator(this, function (_b) {
|
|
67
|
+
switch (_b.label) {
|
|
68
|
+
case 0:
|
|
69
|
+
config = (0, AccountDeletionEmailConfigs_1.getDefaultAccountDeletionRequestedEmailConfigFactory)().getConfig();
|
|
70
|
+
_a = config.getEmailContent(purgeAfter), text = _a.text, html = _a.html;
|
|
71
|
+
return [4 /*yield*/, new email_server_1.EmailSender().sendEmail(__assign({ to: to, subject: 'Your account is scheduled for deletion', text: text, html: html }, config.options))];
|
|
72
|
+
case 1:
|
|
73
|
+
_b.sent();
|
|
74
|
+
return [2 /*return*/];
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
AccountDeletionEmails.prototype.sendAccountDeleted = function (to) {
|
|
80
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
81
|
+
var config, _a, text, html;
|
|
82
|
+
return __generator(this, function (_b) {
|
|
83
|
+
switch (_b.label) {
|
|
84
|
+
case 0:
|
|
85
|
+
config = (0, AccountDeletionEmailConfigs_1.getDefaultAccountDeletedEmailConfigFactory)().getConfig();
|
|
86
|
+
_a = config.getEmailContent(), text = _a.text, html = _a.html;
|
|
87
|
+
return [4 /*yield*/, new email_server_1.EmailSender().sendEmail(__assign({ to: to, subject: 'Your account has been deleted', text: text, html: html }, config.options))];
|
|
88
|
+
case 1:
|
|
89
|
+
_b.sent();
|
|
90
|
+
return [2 /*return*/];
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
return AccountDeletionEmails;
|
|
96
|
+
}());
|
|
97
|
+
exports.AccountDeletionEmails = AccountDeletionEmails;
|
|
98
|
+
//# sourceMappingURL=AccountDeletionEmails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountDeletionEmails.js","sourceRoot":"","sources":["../../../src/emails/AccountDeletionEmails.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,wDAAsD;AACtD,6EAGuC;AAEvC;;;;;;GAMG;AACH;IAAA;IAwBA,CAAC;IAvBO,qDAAqB,GAA3B,UAA4B,EAAU,EAAE,UAAkB;;;;;;wBAClD,MAAM,GAAG,IAAA,kFAAoD,GAAE,CAAC,SAAS,EAAE,CAAC;wBAC5E,KAAiB,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,EAAjD,IAAI,UAAA,EAAE,IAAI,UAAA,CAAwC;wBAC1D,qBAAM,IAAI,0BAAW,EAAE,CAAC,SAAS,YAC/B,EAAE,IAAA,EACF,OAAO,EAAE,wCAAwC,EACjD,IAAI,MAAA,EACJ,IAAI,MAAA,IACD,MAAM,CAAC,OAAO,EACjB,EAAA;;wBANF,SAME,CAAC;;;;;KACJ;IAEK,kDAAkB,GAAxB,UAAyB,EAAU;;;;;;wBAC3B,MAAM,GAAG,IAAA,wEAA0C,GAAE,CAAC,SAAS,EAAE,CAAC;wBAClE,KAAiB,MAAM,CAAC,eAAe,EAAE,EAAvC,IAAI,UAAA,EAAE,IAAI,UAAA,CAA8B;wBAChD,qBAAM,IAAI,0BAAW,EAAE,CAAC,SAAS,YAC/B,EAAE,IAAA,EACF,OAAO,EAAE,+BAA+B,EACxC,IAAI,MAAA,EACJ,IAAI,MAAA,IACD,MAAM,CAAC,OAAO,EACjB,EAAA;;wBANF,SAME,CAAC;;;;;KACJ;IACH,4BAAC;AAAD,CAAC,AAxBD,IAwBC;AAxBY,sDAAqB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devLogin.d.ts","sourceRoot":"","sources":["../../../src/routes/devLogin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"devLogin.d.ts","sourceRoot":"","sources":["../../../src/routes/devLogin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAW9C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,QAAQ,EAAE,KAuCtB,CAAC"}
|
|
@@ -38,6 +38,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.devLogin = void 0;
|
|
40
40
|
var logger_1 = require("@proteinjs/logger");
|
|
41
|
+
var establishSession_1 = require("../authentication/establishSession");
|
|
41
42
|
var Signup_1 = require("../services/Signup");
|
|
42
43
|
var logger = new logger_1.Logger({ name: 'devLogin' });
|
|
43
44
|
/** Lowercased domain of an email address (the whole string when there is no `@`, which can never
|
|
@@ -100,19 +101,12 @@ exports.devLogin = {
|
|
|
100
101
|
if (creation === 'created') {
|
|
101
102
|
logger.info({ message: 'Dev auto-login created missing test account', obj: { email: email } });
|
|
102
103
|
}
|
|
103
|
-
|
|
104
|
+
// establishSession commits the session row before the redirect — the redirected GET / must
|
|
105
|
+
// never read the store ahead of the write (observed: first /dev/login load landed on /login).
|
|
106
|
+
return [4 /*yield*/, (0, establishSession_1.establishSession)(request, email)];
|
|
104
107
|
case 2:
|
|
105
|
-
|
|
106
|
-
//
|
|
107
|
-
// races the redirected GET / — the follow-up request can read the session row before the
|
|
108
|
-
// write commits and render the login page (observed: first /dev/login load lands on /login,
|
|
109
|
-
// second succeeds). Awaiting the store write closes the race.
|
|
110
|
-
return [4 /*yield*/, new Promise(function (resolve) { return request.session.save(resolve); })];
|
|
111
|
-
case 3:
|
|
112
|
-
// Explicit save before redirecting: with a DB-backed session store, save-on-response-end
|
|
113
|
-
// races the redirected GET / — the follow-up request can read the session row before the
|
|
114
|
-
// write commits and render the login page (observed: first /dev/login load lands on /login,
|
|
115
|
-
// second succeeds). Awaiting the store write closes the race.
|
|
108
|
+
// establishSession commits the session row before the redirect — the redirected GET / must
|
|
109
|
+
// never read the store ahead of the write (observed: first /dev/login load landed on /login).
|
|
116
110
|
_c.sent();
|
|
117
111
|
logger.info({ message: 'Dev auto-login session established', obj: { email: email } });
|
|
118
112
|
response.redirect('/');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devLogin.js","sourceRoot":"","sources":["../../../src/routes/devLogin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4CAA2C;AAC3C,6CAA4C;AAE5C,IAAM,MAAM,GAAG,IAAI,eAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AAEhD;kFACkF;AAClF,IAAM,WAAW,GAAG,UAAC,OAAe,IAAK,OAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,EAAzD,CAAyD,CAAC;AAEnG;;;;;;;;;;;;;;;;;;;GAmBG;AACU,QAAA,QAAQ,GAAU;IAC7B,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,KAAK;IACb,SAAS,EAAE,UAAO,OAAY,EAAE,QAAQ;;;;;;oBAChC,QAAQ,GAAG,CAAC,MAAA,OAAO,CAAC,GAAG,CAAC,oBAAoB,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBACjE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,QAAQ,EAAE;wBACzC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC5B,sBAAO;qBACR;oBAEG,KAAK,GAAG,QAAQ,CAAC;oBACf,UAAU,GAAG,MAAA,OAAO,CAAC,KAAK,0CAAE,KAAK,CAAC;oBACxC,IAAI,UAAU,KAAK,SAAS,EAAE;wBACtB,SAAS,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC1E,IAAI,WAAW,CAAC,SAAS,CAAC,KAAK,WAAW,CAAC,QAAQ,CAAC,EAAE;4BACpD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,mDAA4C,WAAW,CAAC,QAAQ,CAAC,YAAS,CAAC,CAAC;4BACtG,sBAAO;yBACR;wBACD,KAAK,GAAG,SAAS,CAAC;qBACnB;oBACD,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;oBAEX,qBAAM,IAAI,eAAM,EAAE,CAAC,aAAa,CAAC;4BAChD,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;4BACxC,KAAK,OAAA;4BACL,QAAQ,EAAE,MAAM;4BAChB,aAAa,EAAE,KAAK;4BACpB,SAAS,EAAE,IAAI;yBAChB,CAAC,EAAA;;oBANI,QAAQ,GAAG,SAMf;oBACF,IAAI,QAAQ,KAAK,SAAS,EAAE;wBAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,6CAA6C,EAAE,GAAG,EAAE,EAAE,KAAK,OAAA,EAAE,EAAE,CAAC,CAAC;qBACzF;oBAED,
|
|
1
|
+
{"version":3,"file":"devLogin.js","sourceRoot":"","sources":["../../../src/routes/devLogin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4CAA2C;AAC3C,uEAAsE;AACtE,6CAA4C;AAE5C,IAAM,MAAM,GAAG,IAAI,eAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AAEhD;kFACkF;AAClF,IAAM,WAAW,GAAG,UAAC,OAAe,IAAK,OAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,EAAzD,CAAyD,CAAC;AAEnG;;;;;;;;;;;;;;;;;;;GAmBG;AACU,QAAA,QAAQ,GAAU;IAC7B,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,KAAK;IACb,SAAS,EAAE,UAAO,OAAY,EAAE,QAAQ;;;;;;oBAChC,QAAQ,GAAG,CAAC,MAAA,OAAO,CAAC,GAAG,CAAC,oBAAoB,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBACjE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,QAAQ,EAAE;wBACzC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC5B,sBAAO;qBACR;oBAEG,KAAK,GAAG,QAAQ,CAAC;oBACf,UAAU,GAAG,MAAA,OAAO,CAAC,KAAK,0CAAE,KAAK,CAAC;oBACxC,IAAI,UAAU,KAAK,SAAS,EAAE;wBACtB,SAAS,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC1E,IAAI,WAAW,CAAC,SAAS,CAAC,KAAK,WAAW,CAAC,QAAQ,CAAC,EAAE;4BACpD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,mDAA4C,WAAW,CAAC,QAAQ,CAAC,YAAS,CAAC,CAAC;4BACtG,sBAAO;yBACR;wBACD,KAAK,GAAG,SAAS,CAAC;qBACnB;oBACD,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;oBAEX,qBAAM,IAAI,eAAM,EAAE,CAAC,aAAa,CAAC;4BAChD,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;4BACxC,KAAK,OAAA;4BACL,QAAQ,EAAE,MAAM;4BAChB,aAAa,EAAE,KAAK;4BACpB,SAAS,EAAE,IAAI;yBAChB,CAAC,EAAA;;oBANI,QAAQ,GAAG,SAMf;oBACF,IAAI,QAAQ,KAAK,SAAS,EAAE;wBAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,6CAA6C,EAAE,GAAG,EAAE,EAAE,KAAK,OAAA,EAAE,EAAE,CAAC,CAAC;qBACzF;oBAED,2FAA2F;oBAC3F,8FAA8F;oBAC9F,qBAAM,IAAA,mCAAgB,EAAC,OAAO,EAAE,KAAK,CAAC,EAAA;;oBAFtC,2FAA2F;oBAC3F,8FAA8F;oBAC9F,SAAsC,CAAC;oBACvC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,oCAAoC,EAAE,GAAG,EAAE,EAAE,KAAK,OAAA,EAAE,EAAE,CAAC,CAAC;oBAC/E,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;;;;SACxB;CACF,CAAC"}
|
|
@@ -44,7 +44,7 @@ var db_1 = require("@proteinjs/db");
|
|
|
44
44
|
var user_1 = require("@proteinjs/user");
|
|
45
45
|
var logger_1 = require("@proteinjs/logger");
|
|
46
46
|
var moment_1 = __importDefault(require("moment"));
|
|
47
|
-
var
|
|
47
|
+
var PasswordHasher_1 = require("../authentication/PasswordHasher");
|
|
48
48
|
/**
|
|
49
49
|
* Route handler for executing a password reset.
|
|
50
50
|
*
|
|
@@ -82,14 +82,16 @@ exports.executePasswordReset = {
|
|
|
82
82
|
response.status(400).send({ error: 'Reset token has expired' });
|
|
83
83
|
return [2 /*return*/];
|
|
84
84
|
}
|
|
85
|
-
|
|
85
|
+
return [4 /*yield*/, new PasswordHasher_1.PasswordHasher().hash(newPassword)];
|
|
86
|
+
case 2:
|
|
87
|
+
hashedPassword = _b.sent();
|
|
86
88
|
return [4 /*yield*/, db.update(user_1.tables.User, {
|
|
87
89
|
id: user.id,
|
|
88
90
|
password: hashedPassword,
|
|
89
91
|
passwordResetToken: null,
|
|
90
92
|
passwordResetTokenExpiration: null,
|
|
91
93
|
})];
|
|
92
|
-
case
|
|
94
|
+
case 3:
|
|
93
95
|
_b.sent();
|
|
94
96
|
logger.info({ message: "Password successfully reset", obj: { email: user.email } });
|
|
95
97
|
response.send({ message: 'Password has been successfully reset' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executePasswordReset.js","sourceRoot":"","sources":["../../../src/routes/executePasswordReset.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,oCAA8C;AAC9C,wCAAiD;AACjD,4CAA2C;AAC3C,kDAA4B;AAC5B,
|
|
1
|
+
{"version":3,"file":"executePasswordReset.js","sourceRoot":"","sources":["../../../src/routes/executePasswordReset.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,oCAA8C;AAC9C,wCAAiD;AACjD,4CAA2C;AAC3C,kDAA4B;AAC5B,mEAAkE;AAElE;;;;;;;;;;GAUG;AACU,QAAA,oBAAoB,GAAU;IACzC,IAAI,EAAE,aAAM,CAAC,oBAAoB,CAAC,IAAI;IACtC,MAAM,EAAE,aAAM,CAAC,oBAAoB,CAAC,MAAM;IAC1C,SAAS,EAAE,UAAO,OAAO,EAAE,QAAQ;;;;;oBAC3B,MAAM,GAAG,IAAI,eAAM,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,CAAC;oBACtD,KAAyB,OAAO,CAAC,IAAI,EAAnC,KAAK,WAAA,EAAE,WAAW,iBAAA,CAAkB;oBACtC,EAAE,GAAG,IAAA,kBAAa,GAAE,CAAC;oBAGd,qBAAM,EAAE,CAAC,GAAG,CAAC,aAAM,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAA;;oBAA/D,IAAI,GAAG,SAAwD;oBACrE,IAAI,CAAC,IAAI,EAAE;wBACT,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,GAAG,EAAE,EAAE,KAAK,OAAA,EAAE,EAAE,CAAC,CAAC;wBACrE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC,CAAC;wBACvE,sBAAO;qBACR;oBAGK,WAAW,GAAG,IAAA,gBAAM,GAAE,CAAC;oBACvB,eAAe,GAAG,IAAA,gBAAM,EAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;oBAClE,IAAI,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;wBACxC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBACjF,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;wBAChE,sBAAO;qBACR;oBAGsB,qBAAM,IAAI,+BAAc,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAA;;oBAA7D,cAAc,GAAG,SAA4C;oBACnE,qBAAM,EAAE,CAAC,MAAM,CAAC,aAAM,CAAC,IAAI,EAAE;4BAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;4BACX,QAAQ,EAAE,cAAc;4BACxB,kBAAkB,EAAE,IAAI;4BACxB,4BAA4B,EAAE,IAAI;yBACnC,CAAC,EAAA;;oBALF,SAKE,CAAC;oBAEH,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACpF,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAC;;;;SACpE;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/routes/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/routes/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAM9C,eAAO,MAAM,KAAK,EAAE,KA4CnB,CAAC"}
|
package/dist/src/routes/login.js
CHANGED
|
@@ -39,11 +39,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.login = void 0;
|
|
40
40
|
var user_1 = require("@proteinjs/user");
|
|
41
41
|
var authenticate_1 = require("../authentication/authenticate");
|
|
42
|
+
var establishSession_1 = require("../authentication/establishSession");
|
|
43
|
+
var AccountDeletion_1 = require("../services/AccountDeletion");
|
|
42
44
|
exports.login = {
|
|
43
45
|
path: user_1.routes.login.path,
|
|
44
46
|
method: user_1.routes.login.method,
|
|
45
47
|
onRequest: function (request, response) { return __awaiter(void 0, void 0, void 0, function () {
|
|
46
|
-
var credentials, error, result;
|
|
48
|
+
var credentials, error, result, outcome, error_1, error;
|
|
47
49
|
return __generator(this, function (_a) {
|
|
48
50
|
switch (_a.label) {
|
|
49
51
|
case 0:
|
|
@@ -62,10 +64,31 @@ exports.login = {
|
|
|
62
64
|
response.send({ error: result });
|
|
63
65
|
return [2 /*return*/];
|
|
64
66
|
}
|
|
65
|
-
|
|
66
|
-
request.login(credentials.email, resolve);
|
|
67
|
-
})];
|
|
67
|
+
_a.label = 2;
|
|
68
68
|
case 2:
|
|
69
|
+
_a.trys.push([2, 4, , 5]);
|
|
70
|
+
return [4 /*yield*/, new AccountDeletion_1.AccountDeletion().cancelPendingDeletion(credentials.email)];
|
|
71
|
+
case 3:
|
|
72
|
+
outcome = _a.sent();
|
|
73
|
+
return [3 /*break*/, 5];
|
|
74
|
+
case 4:
|
|
75
|
+
error_1 = _a.sent();
|
|
76
|
+
// Security boundary: the login response never carries internal error detail — an
|
|
77
|
+
// attacker probing emails must learn nothing from failure shapes (founder ruling
|
|
78
|
+
// 2026-08-18 after a watcher error surfaced verbatim in the login form). The real
|
|
79
|
+
// error stays loud in the server log.
|
|
80
|
+
console.error('cancelPendingDeletion failed during login', error_1);
|
|
81
|
+
response.send({ error: 'Unable to log in right now. Please try again.' });
|
|
82
|
+
return [2 /*return*/];
|
|
83
|
+
case 5:
|
|
84
|
+
if (outcome === 'purging') {
|
|
85
|
+
error = 'This account is being deleted and can no longer be restored.';
|
|
86
|
+
console.error(error);
|
|
87
|
+
response.send({ error: error });
|
|
88
|
+
return [2 /*return*/];
|
|
89
|
+
}
|
|
90
|
+
return [4 /*yield*/, (0, establishSession_1.establishSession)(request, credentials.email)];
|
|
91
|
+
case 6:
|
|
69
92
|
_a.sent();
|
|
70
93
|
response.send({});
|
|
71
94
|
return [2 /*return*/];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/routes/login.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,wCAAyC;AACzC,+DAA8D;AAEjD,QAAA,KAAK,GAAU;IAC1B,IAAI,EAAE,aAAM,CAAC,KAAK,CAAC,IAAI;IACvB,MAAM,EAAE,aAAM,CAAC,KAAK,CAAC,MAAM;IAC3B,SAAS,EAAE,UAAO,OAAY,EAAE,QAAQ;;;;;oBAChC,WAAW,GAAwC,OAAO,CAAC,IAAI,CAAC;oBACtE,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;wBACzC,KAAK,GAAG,oCAAoC,CAAC;wBACnD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,OAAA,EAAE,CAAC,CAAC;wBACzB,sBAAO;qBACR;oBAEc,qBAAM,IAAA,2BAAY,EAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAA;;oBAApE,MAAM,GAAG,SAA2D;oBAC1E,IAAI,MAAM,KAAK,IAAI,EAAE;wBACnB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;wBACjC,sBAAO;qBACR
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/routes/login.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,wCAAyC;AACzC,+DAA8D;AAC9D,uEAAsE;AACtE,+DAA8D;AAEjD,QAAA,KAAK,GAAU;IAC1B,IAAI,EAAE,aAAM,CAAC,KAAK,CAAC,IAAI;IACvB,MAAM,EAAE,aAAM,CAAC,KAAK,CAAC,MAAM;IAC3B,SAAS,EAAE,UAAO,OAAY,EAAE,QAAQ;;;;;oBAChC,WAAW,GAAwC,OAAO,CAAC,IAAI,CAAC;oBACtE,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;wBACzC,KAAK,GAAG,oCAAoC,CAAC;wBACnD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,OAAA,EAAE,CAAC,CAAC;wBACzB,sBAAO;qBACR;oBAEc,qBAAM,IAAA,2BAAY,EAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAA;;oBAApE,MAAM,GAAG,SAA2D;oBAC1E,IAAI,MAAM,KAAK,IAAI,EAAE;wBACnB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;wBACjC,sBAAO;qBACR;;;;oBAOW,qBAAM,IAAI,iCAAe,EAAE,CAAC,qBAAqB,CAAC,WAAW,CAAC,KAAK,CAAC,EAAA;;oBAA9E,OAAO,GAAG,SAAoE,CAAC;;;;oBAE/E,iFAAiF;oBACjF,iFAAiF;oBACjF,kFAAkF;oBAClF,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,OAAK,CAAC,CAAC;oBAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC,CAAC;oBAC1E,sBAAO;;oBAET,IAAI,OAAO,KAAK,SAAS,EAAE;wBACnB,KAAK,GAAG,8DAA8D,CAAC;wBAC7E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,OAAA,EAAE,CAAC,CAAC;wBACzB,sBAAO;qBACR;oBAED,qBAAM,IAAA,mCAAgB,EAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,EAAA;;oBAAlD,SAAkD,CAAC;oBACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;;;SACnB;CACF,CAAC"}
|
|
@@ -1,3 +1,13 @@
|
|
|
1
1
|
import { Route } from '@proteinjs/server-api';
|
|
2
|
+
/**
|
|
3
|
+
* Logout rides passport's own `request.logout` (functional for store-backed sessions since
|
|
4
|
+
* passport 0.6, which added the callback form): it clears the user from the session and SAVES —
|
|
5
|
+
* a replayed old session id is logged out even before the id rotates — then REGENERATES the
|
|
6
|
+
* session id (fixation hygiene on the privilege change, mirroring login's rotation). The
|
|
7
|
+
* regenerate destroys the old session row through the store (`DbSessionStore.destroy`), whose
|
|
8
|
+
* row delete also disconnects the session's sockets (SocketIOSessionWatcher). The pre-0.6
|
|
9
|
+
* manual compensation — calling `destroySession` and nulling `session.passport.user` by hand
|
|
10
|
+
* because `request.logout` was broken — is retired with the workaround era that spawned it.
|
|
11
|
+
*/
|
|
2
12
|
export declare const logout: Route;
|
|
3
13
|
//# sourceMappingURL=logout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/routes/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/routes/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAG9C;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,EAAE,KASpB,CAAC"}
|
|
@@ -38,46 +38,27 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.logout = void 0;
|
|
40
40
|
var user_1 = require("@proteinjs/user");
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Logout rides passport's own `request.logout` (functional for store-backed sessions since
|
|
43
|
+
* passport 0.6, which added the callback form): it clears the user from the session and SAVES —
|
|
44
|
+
* a replayed old session id is logged out even before the id rotates — then REGENERATES the
|
|
45
|
+
* session id (fixation hygiene on the privilege change, mirroring login's rotation). The
|
|
46
|
+
* regenerate destroys the old session row through the store (`DbSessionStore.destroy`), whose
|
|
47
|
+
* row delete also disconnects the session's sockets (SocketIOSessionWatcher). The pre-0.6
|
|
48
|
+
* manual compensation — calling `destroySession` and nulling `session.passport.user` by hand
|
|
49
|
+
* because `request.logout` was broken — is retired with the workaround era that spawned it.
|
|
50
|
+
*/
|
|
42
51
|
exports.logout = {
|
|
43
52
|
path: user_1.routes.logout.path,
|
|
44
53
|
method: user_1.routes.logout.method,
|
|
45
54
|
onRequest: function (request, response) { return __awaiter(void 0, void 0, void 0, function () {
|
|
46
55
|
return __generator(this, function (_a) {
|
|
47
56
|
switch (_a.label) {
|
|
48
|
-
case 0:
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
// await new Promise((resolve, reject) => {
|
|
52
|
-
// request.session?.destroy((error: any) => {
|
|
53
|
-
// if (error) {
|
|
54
|
-
// reject(error);
|
|
55
|
-
// return;
|
|
56
|
-
// }
|
|
57
|
-
// resolve();
|
|
58
|
-
// });
|
|
59
|
-
// });
|
|
60
|
-
// delete request._passport?.session?.user;
|
|
61
|
-
// console.info(`request.sessionID: ${request.sessionID}`);
|
|
62
|
-
// console.info(`request.session?.id: ${request.session?.id}`);
|
|
63
|
-
return [4 /*yield*/, (0, destroySession_1.destroySession)(request.sessionID)];
|
|
57
|
+
case 0: return [4 /*yield*/, new Promise(function (resolve, reject) {
|
|
58
|
+
return request.logout(function (error) { return (error ? reject(error) : resolve()); });
|
|
59
|
+
})];
|
|
64
60
|
case 1:
|
|
65
|
-
// request.logout();
|
|
66
|
-
// await request.session.destroy();
|
|
67
|
-
// await new Promise((resolve, reject) => {
|
|
68
|
-
// request.session?.destroy((error: any) => {
|
|
69
|
-
// if (error) {
|
|
70
|
-
// reject(error);
|
|
71
|
-
// return;
|
|
72
|
-
// }
|
|
73
|
-
// resolve();
|
|
74
|
-
// });
|
|
75
|
-
// });
|
|
76
|
-
// delete request._passport?.session?.user;
|
|
77
|
-
// console.info(`request.sessionID: ${request.sessionID}`);
|
|
78
|
-
// console.info(`request.session?.id: ${request.session?.id}`);
|
|
79
61
|
_a.sent();
|
|
80
|
-
request.session.passport.user = null;
|
|
81
62
|
response.redirect('/login');
|
|
82
63
|
return [2 /*return*/];
|
|
83
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/routes/logout.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,wCAAyC;
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/routes/logout.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,wCAAyC;AAEzC;;;;;;;;;GASG;AACU,QAAA,MAAM,GAAU;IAC3B,IAAI,EAAE,aAAM,CAAC,MAAM,CAAC,IAAI;IACxB,MAAM,EAAE,aAAM,CAAC,MAAM,CAAC,MAAM;IAC5B,SAAS,EAAE,UAAO,OAAY,EAAE,QAAQ;;;wBACtC,qBAAM,IAAI,OAAO,CAAO,UAAC,OAAO,EAAE,MAAM;wBACtC,OAAA,OAAO,CAAC,MAAM,CAAC,UAAC,KAAc,IAAK,OAAA,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAnC,CAAmC,CAAC;oBAAvE,CAAuE,CACxE,EAAA;;oBAFD,SAEC,CAAC;oBACF,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;;;;SAC7B;CACF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Route } from '@proteinjs/server-api';
|
|
2
|
+
/**
|
|
3
|
+
* `POST /user/signup` — create the account AND establish its session in the same request
|
|
4
|
+
* (auto-login), so a new user lands in the app instead of being bounced to the login form to
|
|
5
|
+
* re-type the credentials they just submitted. Signup lives at the route layer beside login
|
|
6
|
+
* because session establishment is a request-level concern services never see; the domain flow
|
|
7
|
+
* (invite validation, account creation, notification emails) stays owned by `Signup.createUser`.
|
|
8
|
+
*
|
|
9
|
+
* Body: `UserSignup` (+ optional invite `token`; the invite carries the email on that path).
|
|
10
|
+
* Response mirrors the login route's contract: 200 with `{}` on success, `{ error }` with
|
|
11
|
+
* user-readable copy otherwise.
|
|
12
|
+
*
|
|
13
|
+
* When the email is already registered the response is byte-identical to success but NO session
|
|
14
|
+
* is minted — auto-login must never hand out a session for an account the caller didn't just
|
|
15
|
+
* create; the caller falls through to the login screen exactly as before. Existence is reported
|
|
16
|
+
* to the mailbox owner by email, never to the caller.
|
|
17
|
+
*/
|
|
18
|
+
export declare const signup: Route;
|
|
19
|
+
//# sourceMappingURL=signup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signup.d.ts","sourceRoot":"","sources":["../../../src/routes/signup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAQ9C;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,MAAM,EAAE,KA8BpB,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.signup = void 0;
|
|
40
|
+
var logger_1 = require("@proteinjs/logger");
|
|
41
|
+
var user_1 = require("@proteinjs/user");
|
|
42
|
+
var establishSession_1 = require("../authentication/establishSession");
|
|
43
|
+
var Signup_1 = require("../services/Signup");
|
|
44
|
+
var logger = new logger_1.Logger({ name: 'signup' });
|
|
45
|
+
/**
|
|
46
|
+
* `POST /user/signup` — create the account AND establish its session in the same request
|
|
47
|
+
* (auto-login), so a new user lands in the app instead of being bounced to the login form to
|
|
48
|
+
* re-type the credentials they just submitted. Signup lives at the route layer beside login
|
|
49
|
+
* because session establishment is a request-level concern services never see; the domain flow
|
|
50
|
+
* (invite validation, account creation, notification emails) stays owned by `Signup.createUser`.
|
|
51
|
+
*
|
|
52
|
+
* Body: `UserSignup` (+ optional invite `token`; the invite carries the email on that path).
|
|
53
|
+
* Response mirrors the login route's contract: 200 with `{}` on success, `{ error }` with
|
|
54
|
+
* user-readable copy otherwise.
|
|
55
|
+
*
|
|
56
|
+
* When the email is already registered the response is byte-identical to success but NO session
|
|
57
|
+
* is minted — auto-login must never hand out a session for an account the caller didn't just
|
|
58
|
+
* create; the caller falls through to the login screen exactly as before. Existence is reported
|
|
59
|
+
* to the mailbox owner by email, never to the caller.
|
|
60
|
+
*/
|
|
61
|
+
exports.signup = {
|
|
62
|
+
path: user_1.routes.signup.path,
|
|
63
|
+
method: user_1.routes.signup.method,
|
|
64
|
+
onRequest: function (request, response) { return __awaiter(void 0, void 0, void 0, function () {
|
|
65
|
+
var body, result, error_1;
|
|
66
|
+
var _a;
|
|
67
|
+
return __generator(this, function (_b) {
|
|
68
|
+
switch (_b.label) {
|
|
69
|
+
case 0:
|
|
70
|
+
body = (_a = request.body) !== null && _a !== void 0 ? _a : {};
|
|
71
|
+
if (!body.name || !body.password) {
|
|
72
|
+
response.send({ error: 'Name and password cannot be blank' });
|
|
73
|
+
return [2 /*return*/];
|
|
74
|
+
}
|
|
75
|
+
_b.label = 1;
|
|
76
|
+
case 1:
|
|
77
|
+
_b.trys.push([1, 3, , 4]);
|
|
78
|
+
return [4 /*yield*/, new Signup_1.Signup().createUser({ name: body.name, email: body.email, password: body.password }, body.token)];
|
|
79
|
+
case 2:
|
|
80
|
+
result = _b.sent();
|
|
81
|
+
return [3 /*break*/, 4];
|
|
82
|
+
case 3:
|
|
83
|
+
error_1 = _b.sent();
|
|
84
|
+
// createUser throws plain-words errors deliberately (invite expired / invite required /
|
|
85
|
+
// email missing); the message is the user-facing contract, same as the RPC layer's.
|
|
86
|
+
logger.error({ message: 'Signup failed', error: error_1 });
|
|
87
|
+
response.send({ error: error_1 instanceof Error ? error_1.message : 'Sign up failed.' });
|
|
88
|
+
return [2 /*return*/];
|
|
89
|
+
case 4:
|
|
90
|
+
if (!(result.outcome === 'created')) return [3 /*break*/, 6];
|
|
91
|
+
return [4 /*yield*/, (0, establishSession_1.establishSession)(request, result.email)];
|
|
92
|
+
case 5:
|
|
93
|
+
_b.sent();
|
|
94
|
+
_b.label = 6;
|
|
95
|
+
case 6:
|
|
96
|
+
response.send({});
|
|
97
|
+
return [2 /*return*/];
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}); },
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=signup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signup.js","sourceRoot":"","sources":["../../../src/routes/signup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4CAA2C;AAC3C,wCAAqD;AACrD,uEAAsE;AACtE,6CAA4C;AAE5C,IAAM,MAAM,GAAG,IAAI,eAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AAE9C;;;;;;;;;;;;;;;GAeG;AACU,QAAA,MAAM,GAAU;IAC3B,IAAI,EAAE,aAAM,CAAC,MAAM,CAAC,IAAI;IACxB,MAAM,EAAE,aAAM,CAAC,MAAM,CAAC,MAAM;IAC5B,SAAS,EAAE,UAAO,OAAY,EAAE,QAAQ;;;;;;oBAChC,IAAI,GAA6C,MAAA,OAAO,CAAC,IAAI,mCAAI,EAAE,CAAC;oBAC1E,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;wBAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;wBAC9D,sBAAO;qBACR;;;;oBAIU,qBAAM,IAAI,eAAM,EAAE,CAAC,UAAU,CACpC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAC/D,IAAI,CAAC,KAAK,CACX,EAAA;;oBAHD,MAAM,GAAG,SAGR,CAAC;;;;oBAEF,wFAAwF;oBACxF,oFAAoF;oBACpF,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,SAAA,EAAE,CAAC,CAAC;oBAClD,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAK,YAAY,KAAK,CAAC,CAAC,CAAC,OAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;oBACrF,sBAAO;;yBAGL,CAAA,MAAM,CAAC,OAAO,KAAK,SAAS,CAAA,EAA5B,wBAA4B;oBAC9B,qBAAM,IAAA,mCAAgB,EAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAA;;oBAA7C,SAA6C,CAAC;;;oBAGhD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;;;SACnB;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateResetPasswordToken.d.ts","sourceRoot":"","sources":["../../../src/routes/validateResetPasswordToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAM9C,eAAO,MAAM,0BAA0B,EAAE,
|
|
1
|
+
{"version":3,"file":"validateResetPasswordToken.d.ts","sourceRoot":"","sources":["../../../src/routes/validateResetPasswordToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAM9C,eAAO,MAAM,0BAA0B,EAAE,KAoCxC,CAAC"}
|
|
@@ -74,7 +74,11 @@ exports.validateResetPasswordToken = {
|
|
|
74
74
|
response.status(200).send({ isValid: false, message: 'Token has expired' });
|
|
75
75
|
return [2 /*return*/];
|
|
76
76
|
}
|
|
77
|
-
response
|
|
77
|
+
// The account email rides the VALID response only: the reset page renders it as the
|
|
78
|
+
// read-only `autocomplete="username"` field so password managers associate the updated
|
|
79
|
+
// password with the stored credential. The token was delivered to this very inbox, so a
|
|
80
|
+
// valid-token holder learns nothing new; invalid/expired verdicts stay email-free.
|
|
81
|
+
response.status(200).send({ isValid: true, email: user.email });
|
|
78
82
|
return [2 /*return*/];
|
|
79
83
|
}
|
|
80
84
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateResetPasswordToken.js","sourceRoot":"","sources":["../../../src/routes/validateResetPasswordToken.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,oCAA8C;AAC9C,wCAAiD;AACjD,4CAA2C;AAC3C,kDAA4B;AAEf,QAAA,0BAA0B,GAAU;IAC/C,IAAI,EAAE,aAAM,CAAC,kBAAkB,CAAC,IAAI;IACpC,MAAM,EAAE,aAAM,CAAC,kBAAkB,CAAC,MAAM;IACxC,SAAS,EAAE,UAAO,OAAO,EAAE,QAAQ;;;;;oBAC3B,MAAM,GAAG,IAAI,eAAM,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;oBAClD,KAAK,GAAK,OAAO,CAAC,KAAK,MAAlB,CAAmB;oBAC1B,EAAE,GAAG,IAAA,kBAAa,GAAE,CAAC;oBAE3B,IAAI,CAAC,KAAK,EAAE;wBACV,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;wBAC5E,sBAAO;qBACR;oBAGY,qBAAM,EAAE,CAAC,GAAG,CAAC,aAAM,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAA;;oBAA/D,IAAI,GAAG,SAAwD;oBACrE,IAAI,CAAC,IAAI,EAAE;wBACT,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,GAAG,EAAE,EAAE,KAAK,OAAA,EAAE,EAAE,CAAC,CAAC;wBACrE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;wBACxE,sBAAO;qBACR;oBAGK,WAAW,GAAG,IAAA,gBAAM,GAAE,CAAC;oBACvB,eAAe,GAAG,IAAA,gBAAM,EAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;oBAClE,IAAI,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;wBACxC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBACjF,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;wBAC5E,sBAAO;qBACR;oBAED,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;;;;
|
|
1
|
+
{"version":3,"file":"validateResetPasswordToken.js","sourceRoot":"","sources":["../../../src/routes/validateResetPasswordToken.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,oCAA8C;AAC9C,wCAAiD;AACjD,4CAA2C;AAC3C,kDAA4B;AAEf,QAAA,0BAA0B,GAAU;IAC/C,IAAI,EAAE,aAAM,CAAC,kBAAkB,CAAC,IAAI;IACpC,MAAM,EAAE,aAAM,CAAC,kBAAkB,CAAC,MAAM;IACxC,SAAS,EAAE,UAAO,OAAO,EAAE,QAAQ;;;;;oBAC3B,MAAM,GAAG,IAAI,eAAM,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;oBAClD,KAAK,GAAK,OAAO,CAAC,KAAK,MAAlB,CAAmB;oBAC1B,EAAE,GAAG,IAAA,kBAAa,GAAE,CAAC;oBAE3B,IAAI,CAAC,KAAK,EAAE;wBACV,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;wBAC5E,sBAAO;qBACR;oBAGY,qBAAM,EAAE,CAAC,GAAG,CAAC,aAAM,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAA;;oBAA/D,IAAI,GAAG,SAAwD;oBACrE,IAAI,CAAC,IAAI,EAAE;wBACT,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,GAAG,EAAE,EAAE,KAAK,OAAA,EAAE,EAAE,CAAC,CAAC;wBACrE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;wBACxE,sBAAO;qBACR;oBAGK,WAAW,GAAG,IAAA,gBAAM,GAAE,CAAC;oBACvB,eAAe,GAAG,IAAA,gBAAM,EAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;oBAClE,IAAI,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;wBACxC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBACjF,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;wBAC5E,sBAAO;qBACR;oBAED,oFAAoF;oBACpF,uFAAuF;oBACvF,wFAAwF;oBACxF,mFAAmF;oBACnF,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;;;;SACjE;CACF,CAAC"}
|