@antelopejs/dms 0.14.0 → 0.15.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/CHANGELOG.md +50 -0
- package/README.md +1 -1
- package/bin/control/journey.mjs +5 -0
- package/bin/control/session.mjs +1 -0
- package/bin/control/stack.mjs +1 -0
- package/dist/config/internal/state.d.ts +7 -0
- package/dist/config/internal/state.js +9 -0
- package/dist/config/internal/state.js.map +1 -1
- package/dist/config/startup-config.d.ts +1 -0
- package/dist/config/startup-config.js +11 -0
- package/dist/config/startup-config.js.map +1 -1
- package/dist/db/index.d.ts +1 -0
- package/dist/db/index.js +1 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/models/index.d.ts +1 -0
- package/dist/db/models/index.js +1 -0
- package/dist/db/models/index.js.map +1 -1
- package/dist/db/models/setupToken.model.d.ts +29 -0
- package/dist/db/models/setupToken.model.js +62 -0
- package/dist/db/models/setupToken.model.js.map +1 -0
- package/dist/db/setup-token.d.ts +2 -0
- package/dist/db/setup-token.js +28 -0
- package/dist/db/setup-token.js.map +1 -0
- package/dist/db/tables/index.d.ts +1 -0
- package/dist/db/tables/index.js +1 -0
- package/dist/db/tables/index.js.map +1 -1
- package/dist/db/tables/setupToken.table.d.ts +7 -0
- package/dist/db/tables/setupToken.table.js +34 -0
- package/dist/db/tables/setupToken.table.js.map +1 -0
- package/dist/implementations/dms/page/payloads.js +6 -10
- package/dist/implementations/dms/page/payloads.js.map +1 -1
- package/dist/implementations/dms/page/public-layout.d.ts +2 -0
- package/dist/implementations/dms/page/public-layout.js +45 -0
- package/dist/implementations/dms/page/public-layout.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/pages/settings/users/current-password.js +1 -1
- package/dist/pages/settings/users/current-password.js.map +1 -1
- package/dist/routes/auth/login.d.ts +1 -1
- package/dist/routes/auth/login.js +7 -2
- package/dist/routes/auth/login.js.map +1 -1
- package/dist/routes/auth/password-hash-upgrade.d.ts +2 -0
- package/dist/routes/auth/password-hash-upgrade.js +22 -0
- package/dist/routes/auth/password-hash-upgrade.js.map +1 -0
- package/dist/routes/authentication.d.ts +2 -0
- package/dist/routes/authentication.js +2 -0
- package/dist/routes/authentication.js.map +1 -1
- package/dist/routes/onboarding.d.ts +3 -1
- package/dist/routes/onboarding.js +20 -3
- package/dist/routes/onboarding.js.map +1 -1
- package/dist/utils/ensure-default-tenant.d.ts +2 -1
- package/dist/utils/ensure-default-tenant.js +126 -8
- package/dist/utils/ensure-default-tenant.js.map +1 -1
- package/dist/validation/onboarding/register-admin.schema.d.ts +5 -0
- package/dist/validation/onboarding/register-admin.schema.js +3 -0
- package/dist/validation/onboarding/register-admin.schema.js.map +1 -1
- package/frontend-vue/layers/dms-core/app/utils/formatter.ts +15 -1
- package/frontend-vue/layers/dms-core/i18n/locales/core-en-GB.json +1 -0
- package/frontend-vue/layers/dms-core/i18n/locales/core-fr-FR.json +1 -0
- package/frontend-vue/layers/dms-core/shared/types/app-config.ts +5 -0
- package/frontend-vue/layers/dms-layout/app/app.config.ts +1 -0
- package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardSidebar.vue +9 -9
- package/frontend-vue/layers/dms-layout/app/components/layout/AppLogo.vue +1 -0
- package/frontend-vue/layers/dms-layout/app/composables/page/useInstalledModules.ts +78 -0
- package/frontend-vue/layers/dms-layout/app/custom-pages/modules.vue +5 -24
- package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +2 -1
- package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +2 -1
- package/frontend-vue/layers/dms-onboarding/app/components/onboarding/steps/register.vue +21 -1
- package/frontend-vue/layers/dms-onboarding/app/custom-pages/onboarding.vue +14 -0
- package/frontend-vue/layers/dms-onboarding/i18n/locales/onboarding-en-GB.json +2 -0
- package/frontend-vue/layers/dms-onboarding/i18n/locales/onboarding-fr-FR.json +2 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/blocks/blockDataState.ts +86 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/chart/apexAxes.ts +22 -3
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/tableViewCounts.ts +30 -11
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/tableViewTabs.ts +2 -2
- package/frontend-vue/layers/dms-ui/app/components/RecursiveComponent.vue +6 -0
- package/frontend-vue/layers/dms-ui/app/components/chart/Chart.vue +17 -1
- package/frontend-vue/layers/dms-ui/app/components/chart/ChartCard.vue +22 -2
- package/frontend-vue/layers/dms-ui/app/components/kpi/KpiCard.vue +14 -0
- package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +14 -1
- package/frontend-vue/layers/dms-ui/app/components/top-list/TopListCard.vue +17 -1
- package/frontend-vue/layers/dms-ui/app/composables/chart/apexCategoryLabels.ts +12 -10
- package/frontend-vue/layers/dms-ui/app/composables/chart/useApexChart.ts +11 -2
- package/frontend-vue/layers/dms-ui/app/entries/composables/blocks/blockDataState.ts +1 -0
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -46,7 +46,7 @@ const modules_1 = require("@antelopejs/interface-core/modules");
|
|
|
46
46
|
const runtime_1 = require("@antelopejs/interface-core/runtime");
|
|
47
47
|
const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
|
|
48
48
|
const constants_1 = require("@antelopejs/interface-dms/constants");
|
|
49
|
-
require("./db");
|
|
49
|
+
const db_1 = require("./db");
|
|
50
50
|
require("./realtime");
|
|
51
51
|
require("./implementations/dms-auth/email-templates");
|
|
52
52
|
require("./pages");
|
|
@@ -73,6 +73,7 @@ __exportStar(require("./config"), exports);
|
|
|
73
73
|
let cronTasks = [];
|
|
74
74
|
let staleExportsSweep = Promise.resolve();
|
|
75
75
|
let defaultTenantProvisioning;
|
|
76
|
+
let provisioningWait = new AbortController();
|
|
76
77
|
let globalRealtimeConfig;
|
|
77
78
|
async function construct(config) {
|
|
78
79
|
const { dev } = await (0, runtime_1.GetRuntimeInfo)();
|
|
@@ -157,7 +158,8 @@ function destroy() {
|
|
|
157
158
|
function onModulesStarted() {
|
|
158
159
|
if (defaultTenantProvisioning)
|
|
159
160
|
return;
|
|
160
|
-
|
|
161
|
+
provisioningWait = new AbortController();
|
|
162
|
+
defaultTenantProvisioning = (0, utils_1.provisionDefaultTenant)(provisioningWait.signal).finally(() => {
|
|
161
163
|
defaultTenantProvisioning = undefined;
|
|
162
164
|
});
|
|
163
165
|
}
|
|
@@ -167,6 +169,7 @@ async function start() {
|
|
|
167
169
|
await (0, interface_database_decorators_1.RegisterSchema)(constants_1.CORE_SCHEMA_NAME);
|
|
168
170
|
await (0, interface_database_decorators_1.RegisterSchema)(constants_1.TENANT_SCHEMA_NAME);
|
|
169
171
|
await (0, utils_1.ensureDefaultTenantExists)();
|
|
172
|
+
await (0, db_1.announceSetupToken)();
|
|
170
173
|
await (0, utils_1.registerExistingTenantInstances)();
|
|
171
174
|
await (0, hooks_1.SettleHook)(hooks_1.Hook.DATABASE_INITIALIZED);
|
|
172
175
|
staleExportsSweep = (0, crons_1.runSweepStaleExports)().catch((error) => {
|
|
@@ -183,6 +186,7 @@ async function start() {
|
|
|
183
186
|
}
|
|
184
187
|
async function stop() {
|
|
185
188
|
modules_1.Events.ModulesStarted.unregister(onModulesStarted);
|
|
189
|
+
provisioningWait.abort();
|
|
186
190
|
await defaultTenantProvisioning;
|
|
187
191
|
await staleExportsSweep;
|
|
188
192
|
(0, hooks_1.UnsettleHook)(hooks_1.Hook.DATABASE_INITIALIZED);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,7 @@ async function assertCurrentPassword(userModel, user, password, now = new Date()
|
|
|
28
28
|
(0, interface_api_util_1.assert)(stored?.password, HTTP_BAD_REQUEST, "error.password_not_set");
|
|
29
29
|
(0, interface_api_util_1.assert)(password, HTTP_BAD_REQUEST, INVALID_CURRENT_PASSWORD);
|
|
30
30
|
await claimAttempt(stored._id, now);
|
|
31
|
-
(0, interface_api_util_1.assert)(stored.
|
|
31
|
+
(0, interface_api_util_1.assert)(await stored.testHashAsync("password", password), HTTP_BAD_REQUEST, INVALID_CURRENT_PASSWORD);
|
|
32
32
|
await (0, interface_database_decorators_1.GetModel)(models_1.SignInAttemptsModel).clearCurrentPasswordAttempts(stored._id);
|
|
33
33
|
}
|
|
34
34
|
async function assertCurrentPasswordIfSet(userModel, user, password) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"current-password.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/current-password.ts"],"names":[],"mappings":";;AA6CA,sDAgBC;AAMD,gEAQC;AA3ED,uEAAwD;AACxD,6FAAqE;AAErE,+CAAyD;AACzD,0CAAuE;AACvE,0CAAsD;AAEtD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,MAAM,wBAAwB,GAAG,gCAAgC,CAAC;AAClE,MAAM,iBAAiB,GAAG,0CAA0C,CAAC;AAErE,SAAS,eAAe,CAAC,KAAa,EAAE,OAAe;IACrD,IAAA,2BAAM,EACJ,KAAK,GAAG,OAAO,IAAI,4BAAoB,EACvC,sBAAsB,EACtB,iBAAiB,CAClB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,GAAS;IACnD,MAAM,QAAQ,GAAG,IAAA,wCAAQ,EAAC,4BAAmB,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,uBAAe,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,4BAA4B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9E,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,4BAA4B,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9E,MAAM,QAAQ,CAAC,WAAW,CACxB,MAAM,EACN,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,4BAAoB,CAAC,CAC/C,CAAC;IACF,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5B,CAAC;AAaM,KAAK,UAAU,qBAAqB,CACzC,SAAoB,EACpB,IAAU,EACV,QAA4B,EAC5B,GAAG,GAAG,IAAI,IAAI,EAAE;IAEhB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAA,2BAAM,EAAC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,wBAAwB,CAAC,CAAC;IACrE,IAAA,2BAAM,EAAC,QAAQ,EAAE,gBAAgB,EAAE,wBAAwB,CAAC,CAAC;IAC7D,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpC,IAAA,2BAAM,EACJ,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"current-password.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/current-password.ts"],"names":[],"mappings":";;AA6CA,sDAgBC;AAMD,gEAQC;AA3ED,uEAAwD;AACxD,6FAAqE;AAErE,+CAAyD;AACzD,0CAAuE;AACvE,0CAAsD;AAEtD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,MAAM,wBAAwB,GAAG,gCAAgC,CAAC;AAClE,MAAM,iBAAiB,GAAG,0CAA0C,CAAC;AAErE,SAAS,eAAe,CAAC,KAAa,EAAE,OAAe;IACrD,IAAA,2BAAM,EACJ,KAAK,GAAG,OAAO,IAAI,4BAAoB,EACvC,sBAAsB,EACtB,iBAAiB,CAClB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,GAAS;IACnD,MAAM,QAAQ,GAAG,IAAA,wCAAQ,EAAC,4BAAmB,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,uBAAe,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,4BAA4B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9E,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,4BAA4B,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9E,MAAM,QAAQ,CAAC,WAAW,CACxB,MAAM,EACN,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,4BAAoB,CAAC,CAC/C,CAAC;IACF,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5B,CAAC;AAaM,KAAK,UAAU,qBAAqB,CACzC,SAAoB,EACpB,IAAU,EACV,QAA4B,EAC5B,GAAG,GAAG,IAAI,IAAI,EAAE;IAEhB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAA,2BAAM,EAAC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,wBAAwB,CAAC,CAAC;IACrE,IAAA,2BAAM,EAAC,QAAQ,EAAE,gBAAgB,EAAE,wBAAwB,CAAC,CAAC;IAC7D,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpC,IAAA,2BAAM,EACJ,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,EAChD,gBAAgB,EAChB,wBAAwB,CACzB,CAAC;IACF,MAAM,IAAA,wCAAQ,EAAC,4BAAmB,CAAC,CAAC,4BAA4B,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC/E,CAAC;AAMM,KAAK,UAAU,0BAA0B,CAC9C,SAAoB,EACpB,IAAU,EACV,QAA4B;IAE5B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,QAAQ;QAAE,OAAO;IAC9B,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type SessionModel, type UserModel } from "@antelopejs/interface-dms/auth/db";
|
|
2
2
|
import type { ClientOrigin } from "../../utils";
|
|
3
3
|
import { authSchema } from "../../validation";
|
|
4
4
|
import { type LoginOutcome } from "./session-response";
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.login = login;
|
|
4
4
|
const interface_api_util_1 = require("@antelopejs/interface-api-util");
|
|
5
|
+
const db_1 = require("@antelopejs/interface-dms/auth/db");
|
|
5
6
|
const hooks_1 = require("../../hooks");
|
|
6
7
|
const validation_1 = require("../../validation");
|
|
7
8
|
const utils_1 = require("../../utils");
|
|
9
|
+
const password_hash_upgrade_1 = require("./password-hash-upgrade");
|
|
8
10
|
const session_response_1 = require("./session-response");
|
|
9
11
|
const fire_and_forget_1 = require("@antelopejs/interface-dms/utils/fire-and-forget");
|
|
10
12
|
const HTTP_UNAUTHORIZED = 401;
|
|
@@ -14,8 +16,10 @@ async function login(userModel, sessionModel, body, userAgent, origin) {
|
|
|
14
16
|
const normalizedEmail = email.toLowerCase();
|
|
15
17
|
(0, utils_1.assertLoginAllowed)(normalizedEmail, origin.ip);
|
|
16
18
|
const user = await userModel.getByEmail(normalizedEmail);
|
|
17
|
-
const isPasswordValid =
|
|
18
|
-
if (
|
|
19
|
+
const isPasswordValid = await (user ?? new db_1.User()).testHashAsync("password", password);
|
|
20
|
+
if (isPasswordValid)
|
|
21
|
+
(0, utils_1.assertLoginAllowed)(normalizedEmail, origin.ip);
|
|
22
|
+
else
|
|
19
23
|
(0, utils_1.recordLoginFailure)(normalizedEmail, origin.ip);
|
|
20
24
|
(0, interface_api_util_1.assert)(user, HTTP_UNAUTHORIZED, INVALID_CREDENTIALS_MESSAGE);
|
|
21
25
|
(0, fire_and_forget_1.fireAndForget)(isPasswordValid
|
|
@@ -23,6 +27,7 @@ async function login(userModel, sessionModel, body, userAgent, origin) {
|
|
|
23
27
|
: (0, hooks_1.recordFailedPassword)(user), "failed password bookkeeping");
|
|
24
28
|
(0, interface_api_util_1.assert)(isPasswordValid, HTTP_UNAUTHORIZED, INVALID_CREDENTIALS_MESSAGE);
|
|
25
29
|
(0, utils_1.clearLoginFailures)(normalizedEmail);
|
|
30
|
+
(0, fire_and_forget_1.fireAndForget)((0, password_hash_upgrade_1.upgradePasswordHash)(userModel, user, password), "password hash upgrade");
|
|
26
31
|
return (0, session_response_1.resolveLoginOutcome)(sessionModel, user, userAgent, origin);
|
|
27
32
|
}
|
|
28
33
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/routes/auth/login.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/routes/auth/login.ts"],"names":[],"mappings":";;AAqBA,sBAmCC;AAxDD,uEAA0E;AAC1E,0DAI2C;AAC3C,uCAAyE;AAEzE,iDAA8C;AAC9C,uCAIqB;AACrB,mEAA8D;AAC9D,yDAA4E;AAC5E,qFAAgF;AAEhF,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,2BAA2B,GAAG,2BAA2B,CAAC;AAEzD,KAAK,UAAU,KAAK,CACzB,SAAoB,EACpB,YAA0B,EAC1B,IAAkD,EAClD,SAAiB,EACjB,MAAoB;IAEpB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAA,qCAAgB,EAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CACvD,uBAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAC1B,CAAC;IACF,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAA,0BAAkB,EAAC,eAAe,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IACzD,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,SAAI,EAAE,CAAC,CAAC,aAAa,CAC9D,UAAU,EACV,QAAQ,CACT,CAAC;IACF,IAAI,eAAe;QAAE,IAAA,0BAAkB,EAAC,eAAe,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;;QAC/D,IAAA,0BAAkB,EAAC,eAAe,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAEpD,IAAA,2BAAM,EAAC,IAAI,EAAE,iBAAiB,EAAE,2BAA2B,CAAC,CAAC;IAC7D,IAAA,+BAAa,EACX,eAAe;QACb,CAAC,CAAC,IAAA,4BAAoB,EAAC,IAAI,CAAC,GAAG,CAAC;QAChC,CAAC,CAAC,IAAA,4BAAoB,EAAC,IAAI,CAAC,EAC9B,6BAA6B,CAC9B,CAAC;IACF,IAAA,2BAAM,EAAC,eAAe,EAAE,iBAAiB,EAAE,2BAA2B,CAAC,CAAC;IACxE,IAAA,0BAAkB,EAAC,eAAe,CAAC,CAAC;IACpC,IAAA,+BAAa,EACX,IAAA,2CAAmB,EAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,EAC9C,uBAAuB,CACxB,CAAC;IAEF,OAAO,IAAA,sCAAmB,EAAC,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.upgradePasswordHash = upgradePasswordHash;
|
|
4
|
+
const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
|
|
5
|
+
const db_1 = require("@antelopejs/interface-dms/auth/db");
|
|
6
|
+
async function upgradePasswordHash(userModel, user, password) {
|
|
7
|
+
if (!user.isHashOutdated("password"))
|
|
8
|
+
return;
|
|
9
|
+
const testedHash = user.password;
|
|
10
|
+
user.password = password;
|
|
11
|
+
const { _internal } = db_1.UserModel.toDatabase(user);
|
|
12
|
+
const storedHashes = { _internal };
|
|
13
|
+
await userModel.table
|
|
14
|
+
.getAll(user.email, "email")
|
|
15
|
+
.filter((row) => row
|
|
16
|
+
.key("_id")
|
|
17
|
+
.eq(user._id)
|
|
18
|
+
.and((0, interface_database_decorators_1.unlockrequest)(db_1.User, row, "password", []).eq(testedHash)))
|
|
19
|
+
.update(storedHashes)
|
|
20
|
+
.run();
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=password-hash-upgrade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password-hash-upgrade.js","sourceRoot":"","sources":["../../../src/routes/auth/password-hash-upgrade.ts"],"names":[],"mappings":";;AAcA,kDAoBC;AAlCD,6FAA0E;AAC1E,0DAAoE;AAa7D,KAAK,UAAU,mBAAmB,CACvC,SAAoB,EACpB,IAAU,EACV,QAAgB;IAEhB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;QAAE,OAAO;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;IACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACzB,MAAM,EAAE,SAAS,EAAE,GAAG,cAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,YAAY,GAA4C,EAAE,SAAS,EAAE,CAAC;IAC5E,MAAM,SAAS,CAAC,KAAK;SAClB,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;SAC3B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CACd,GAAG;SACA,GAAG,CAAC,KAAK,CAAC;SACV,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;SACZ,GAAG,CAAC,IAAA,6CAAa,EAAC,SAAI,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAChE;SACA,MAAM,CAAC,YAAY,CAAC;SACpB,GAAG,EAAE,CAAC;AACX,CAAC"}
|
|
@@ -15,6 +15,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./auth/invite"), exports);
|
|
18
|
+
__exportStar(require("./auth/login"), exports);
|
|
19
|
+
__exportStar(require("./auth/password-hash-upgrade"), exports);
|
|
18
20
|
__exportStar(require("./auth/signup"), exports);
|
|
19
21
|
__exportStar(require("./auth/validate-invite-token"), exports);
|
|
20
22
|
//# sourceMappingURL=authentication.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authentication.js","sourceRoot":"","sources":["../../src/routes/authentication.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,gDAA8B;AAC9B,+DAA6C"}
|
|
1
|
+
{"version":3,"file":"authentication.js","sourceRoot":"","sources":["../../src/routes/authentication.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,+CAA6B;AAC7B,+DAA6C;AAC7C,gDAA8B;AAC9B,+DAA6C"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { UserModel } from "@antelopejs/interface-dms/auth/db";
|
|
2
|
-
import { SystemStateModel } from "../db";
|
|
2
|
+
import { SetupTokenModel, SystemStateModel } from "../db";
|
|
3
3
|
import { onboardingRegisterAdminSchema } from "../validation/onboarding";
|
|
4
4
|
declare const PublicOnboardingController_base: import("@antelopejs/interface-api").ControllerClass<object>;
|
|
5
5
|
export declare class PublicOnboardingController extends PublicOnboardingController_base {
|
|
6
6
|
model: SystemStateModel;
|
|
7
|
+
setupTokens: SetupTokenModel;
|
|
7
8
|
getInformations(userModel: UserModel): Promise<{
|
|
8
9
|
has_onboarded: boolean;
|
|
9
10
|
}>;
|
|
10
11
|
postRegister(userModel: UserModel, body: Parameters<typeof onboardingRegisterAdminSchema.parse>[0]): Promise<string[]>;
|
|
12
|
+
private restoreUnusedToken;
|
|
11
13
|
private createOwner;
|
|
12
14
|
private completeOnboarding;
|
|
13
15
|
}
|
|
@@ -41,9 +41,22 @@ class PublicOnboardingController extends (0, interface_api_1.Controller)("/api/o
|
|
|
41
41
|
const data = (0, interface_api_util_1.assertValidation)(body, (v) => onboarding_1.onboardingRegisterAdminSchema.parse(v));
|
|
42
42
|
const users = await userModel.table.slice(0, 1).run();
|
|
43
43
|
(0, interface_api_util_1.assert)(users.length === 0, 400, "error.admin_already_set");
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
const spentToken = await this.setupTokens.claim(data.setupToken);
|
|
45
|
+
(0, interface_api_util_1.assert)(spentToken, 403, "error.invalid_setup_token");
|
|
46
|
+
try {
|
|
47
|
+
const insertedIds = await this.createOwner(userModel, data);
|
|
48
|
+
await this.completeOnboarding(data);
|
|
49
|
+
return insertedIds;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
await this.restoreUnusedToken(userModel, spentToken);
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async restoreUnusedToken(userModel, spentToken) {
|
|
57
|
+
const users = await userModel.table.slice(0, 1).run();
|
|
58
|
+
if (users.length === 0)
|
|
59
|
+
await this.setupTokens.restore(spentToken);
|
|
47
60
|
}
|
|
48
61
|
async createOwner(userModel, data) {
|
|
49
62
|
const insertedIds = await userModel.insert({
|
|
@@ -82,6 +95,10 @@ __decorate([
|
|
|
82
95
|
(0, interface_database_decorators_1.Model)(db_2.SystemStateModel),
|
|
83
96
|
__metadata("design:type", db_2.SystemStateModel)
|
|
84
97
|
], PublicOnboardingController.prototype, "model", void 0);
|
|
98
|
+
__decorate([
|
|
99
|
+
(0, interface_database_decorators_1.Model)(db_2.SetupTokenModel),
|
|
100
|
+
__metadata("design:type", db_2.SetupTokenModel)
|
|
101
|
+
], PublicOnboardingController.prototype, "setupTokens", void 0);
|
|
85
102
|
__decorate([
|
|
86
103
|
(0, interface_api_1.Get)("/informations"),
|
|
87
104
|
__param(0, (0, interface_database_decorators_1.Model)(db_1.UserModel)),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/routes/onboarding.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6DAA4E;AAC5E,uEAA0E;AAC1E,6FAAkE;AAClE,mEAAwE;AACxE,iFAAkF;AAClF,0DAA8E;AAC9E,
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/routes/onboarding.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
import { type ProvisioningLeaseConfig } from "../config";
|
|
1
2
|
export declare function ensureDefaultTenantExists(): Promise<boolean>;
|
|
2
|
-
export declare function provisionDefaultTenant(): Promise<void>;
|
|
3
|
+
export declare function provisionDefaultTenant(signal?: AbortSignal, lease?: ProvisioningLeaseConfig): Promise<void>;
|
|
@@ -2,11 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ensureDefaultTenantExists = ensureDefaultTenantExists;
|
|
4
4
|
exports.provisionDefaultTenant = provisionDefaultTenant;
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
const node_os_1 = require("node:os");
|
|
7
|
+
const promises_1 = require("node:timers/promises");
|
|
5
8
|
const logging_1 = require("@antelopejs/interface-core/logging");
|
|
6
9
|
const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
|
|
7
10
|
const constants_1 = require("@antelopejs/interface-dms/constants");
|
|
8
11
|
const db_1 = require("@antelopejs/interface-dms/db");
|
|
9
12
|
const tenant_provisioning_1 = require("@antelopejs/interface-dms/tenant-provisioning");
|
|
13
|
+
const config_1 = require("../config");
|
|
14
|
+
const NO_REVISION = { kind: "missing" };
|
|
10
15
|
function buildDefaultTenant() {
|
|
11
16
|
const now = new Date();
|
|
12
17
|
return {
|
|
@@ -24,21 +29,134 @@ async function ensureDefaultTenantExists() {
|
|
|
24
29
|
logging_1.Logging.Info(`Default tenant '${constants_1.DEFAULT_TENANT_ID}' already exists.`);
|
|
25
30
|
return false;
|
|
26
31
|
}
|
|
27
|
-
|
|
32
|
+
try {
|
|
33
|
+
await tenants.insert(buildDefaultTenant());
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (!(await tenants.get(constants_1.DEFAULT_TENANT_ID)))
|
|
37
|
+
throw error;
|
|
38
|
+
logging_1.Logging.Info(`Default tenant '${constants_1.DEFAULT_TENANT_ID}' already exists.`);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
28
41
|
logging_1.Logging.Info(`Default tenant '${constants_1.DEFAULT_TENANT_ID}' created.`);
|
|
29
42
|
return true;
|
|
30
43
|
}
|
|
31
|
-
async function
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
44
|
+
async function swapLease(expected, patch) {
|
|
45
|
+
const tenants = (0, interface_database_decorators_1.GetModel)(db_1.TenantModel);
|
|
46
|
+
const next = (0, node_crypto_1.randomUUID)();
|
|
47
|
+
const outcome = await tenants.table
|
|
48
|
+
.atomicMutation(constants_1.DEFAULT_TENANT_ID, {
|
|
49
|
+
type: "update",
|
|
50
|
+
revisionField: "provisioningRevision",
|
|
51
|
+
expectedRevision: expected,
|
|
52
|
+
nextRevision: next,
|
|
53
|
+
patch,
|
|
54
|
+
})
|
|
55
|
+
.run();
|
|
56
|
+
if (outcome === "applied")
|
|
57
|
+
return next;
|
|
58
|
+
if (outcome === "not-applied")
|
|
59
|
+
return undefined;
|
|
60
|
+
const stored = await tenants.get(constants_1.DEFAULT_TENANT_ID);
|
|
61
|
+
return stored?.provisioningRevision === next ? next : undefined;
|
|
62
|
+
}
|
|
63
|
+
function holdLease(claimed, renewEveryMs) {
|
|
64
|
+
let token = claimed;
|
|
65
|
+
let renewal = Promise.resolve();
|
|
66
|
+
const renew = async () => {
|
|
67
|
+
if (!token)
|
|
36
68
|
return;
|
|
69
|
+
try {
|
|
70
|
+
const next = await swapLease(token, {});
|
|
71
|
+
if (next) {
|
|
72
|
+
token = next;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const stored = await (0, interface_database_decorators_1.GetModel)(db_1.TenantModel).get(constants_1.DEFAULT_TENANT_ID);
|
|
76
|
+
if (stored?.provisioningRevision !== token)
|
|
77
|
+
token = undefined;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
logging_1.Logging.Warn(`Default tenant '${constants_1.DEFAULT_TENANT_ID}' lease renewal failed:`, error);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const timer = setInterval(() => {
|
|
84
|
+
renewal = renewal.then(renew);
|
|
85
|
+
}, renewEveryMs);
|
|
86
|
+
return {
|
|
87
|
+
async stopRenewing() {
|
|
88
|
+
clearInterval(timer);
|
|
89
|
+
await renewal;
|
|
90
|
+
return token;
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async function provisionUnderLease(claimed, renewEveryMs) {
|
|
95
|
+
const lease = holdLease(claimed, renewEveryMs);
|
|
96
|
+
let failure;
|
|
97
|
+
try {
|
|
37
98
|
await (0, tenant_provisioning_1.ProvisionTenant)({ tenantId: constants_1.DEFAULT_TENANT_ID, extras: {} });
|
|
38
|
-
await tenants.update(constants_1.DEFAULT_TENANT_ID, { provisioningPending: false });
|
|
39
99
|
}
|
|
40
100
|
catch (error) {
|
|
41
|
-
|
|
101
|
+
failure = { error };
|
|
102
|
+
}
|
|
103
|
+
const token = await lease.stopRenewing();
|
|
104
|
+
if (failure) {
|
|
105
|
+
logging_1.Logging.Error(`Default tenant '${constants_1.DEFAULT_TENANT_ID}' provisioning failed:`, failure.error);
|
|
106
|
+
}
|
|
107
|
+
const finished = token &&
|
|
108
|
+
(await swapLease(token, {
|
|
109
|
+
provisioningHolder: null,
|
|
110
|
+
provisioningPending: failure !== undefined,
|
|
111
|
+
}));
|
|
112
|
+
if (!finished) {
|
|
113
|
+
logging_1.Logging.Warn(`Default tenant '${constants_1.DEFAULT_TENANT_ID}' provisioning lease was lost; another replica took over.`);
|
|
114
|
+
}
|
|
115
|
+
return finished !== undefined || failure !== undefined;
|
|
116
|
+
}
|
|
117
|
+
function createStaleWatch(staleAfterMs) {
|
|
118
|
+
let seen;
|
|
119
|
+
return {
|
|
120
|
+
forget() {
|
|
121
|
+
seen = undefined;
|
|
122
|
+
},
|
|
123
|
+
isStale(revision) {
|
|
124
|
+
const now = performance.now();
|
|
125
|
+
if (seen?.revision !== revision)
|
|
126
|
+
seen = undefined;
|
|
127
|
+
seen ??= { revision, at: now };
|
|
128
|
+
return now - seen.at >= staleAfterMs;
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async function advanceLease(watch, renewEveryMs) {
|
|
133
|
+
const tenant = await (0, interface_database_decorators_1.GetModel)(db_1.TenantModel).get(constants_1.DEFAULT_TENANT_ID);
|
|
134
|
+
if (!tenant?.provisioningPending)
|
|
135
|
+
return true;
|
|
136
|
+
const stale = watch.isStale(tenant.provisioningRevision);
|
|
137
|
+
if (tenant.provisioningHolder && !stale)
|
|
138
|
+
return false;
|
|
139
|
+
const claimed = await swapLease(tenant.provisioningRevision ?? NO_REVISION, {
|
|
140
|
+
provisioningHolder: holderName(),
|
|
141
|
+
});
|
|
142
|
+
return claimed !== undefined && provisionUnderLease(claimed, renewEveryMs);
|
|
143
|
+
}
|
|
144
|
+
function holderName() {
|
|
145
|
+
return `${(0, node_os_1.hostname)()}:${process.pid}`;
|
|
146
|
+
}
|
|
147
|
+
async function provisionDefaultTenant(signal = new AbortController().signal, lease = (0, config_1.getProvisioningLeaseConfig)()) {
|
|
148
|
+
const { renewEveryMs, staleAfterMs, pollEveryMs } = lease;
|
|
149
|
+
const watch = createStaleWatch(staleAfterMs);
|
|
150
|
+
while (!signal.aborted) {
|
|
151
|
+
try {
|
|
152
|
+
if (await advanceLease(watch, renewEveryMs))
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
watch.forget();
|
|
157
|
+
logging_1.Logging.Warn(`Default tenant '${constants_1.DEFAULT_TENANT_ID}' provisioning lease check failed:`, error);
|
|
158
|
+
}
|
|
159
|
+
await (0, promises_1.setTimeout)(pollEveryMs, undefined, { signal }).catch(() => undefined);
|
|
42
160
|
}
|
|
43
161
|
}
|
|
44
162
|
//# sourceMappingURL=ensure-default-tenant.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-default-tenant.js","sourceRoot":"","sources":["../../src/utils/ensure-default-tenant.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"ensure-default-tenant.js","sourceRoot":"","sources":["../../src/utils/ensure-default-tenant.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ export declare const onboardingRegisterAdminSchema: z.ZodEffects<z.ZodObject<{
|
|
|
4
4
|
firstName: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
|
|
5
5
|
lastName: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
|
|
6
6
|
password: z.ZodString;
|
|
7
|
+
setupToken: z.ZodOptional<z.ZodString>;
|
|
7
8
|
platformName: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
|
|
8
9
|
language: z.ZodOptional<z.ZodString>;
|
|
9
10
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -13,6 +14,7 @@ export declare const onboardingRegisterAdminSchema: z.ZodEffects<z.ZodObject<{
|
|
|
13
14
|
lastName: string;
|
|
14
15
|
language?: string | undefined;
|
|
15
16
|
platformName?: string | undefined;
|
|
17
|
+
setupToken?: string | undefined;
|
|
16
18
|
}, {
|
|
17
19
|
email: string;
|
|
18
20
|
password: string;
|
|
@@ -20,10 +22,12 @@ export declare const onboardingRegisterAdminSchema: z.ZodEffects<z.ZodObject<{
|
|
|
20
22
|
lastName: string;
|
|
21
23
|
language?: string | undefined;
|
|
22
24
|
platformName?: string | undefined;
|
|
25
|
+
setupToken?: string | undefined;
|
|
23
26
|
}>, {
|
|
24
27
|
email: string;
|
|
25
28
|
name: string;
|
|
26
29
|
password: string;
|
|
30
|
+
setupToken: string | undefined;
|
|
27
31
|
platformName: string | undefined;
|
|
28
32
|
language: string | undefined;
|
|
29
33
|
}, {
|
|
@@ -33,5 +37,6 @@ export declare const onboardingRegisterAdminSchema: z.ZodEffects<z.ZodObject<{
|
|
|
33
37
|
lastName: string;
|
|
34
38
|
language?: string | undefined;
|
|
35
39
|
platformName?: string | undefined;
|
|
40
|
+
setupToken?: string | undefined;
|
|
36
41
|
}>;
|
|
37
42
|
export type OnboardingRegisterAdmin = z.output<typeof onboardingRegisterAdminSchema>;
|
|
@@ -43,6 +43,7 @@ const password_1 = require("../password");
|
|
|
43
43
|
const MAX_NAME_PART_LENGTH = 100;
|
|
44
44
|
const MAX_PLATFORM_NAME_LENGTH = 120;
|
|
45
45
|
const MAX_LANGUAGE_TAG_LENGTH = 35;
|
|
46
|
+
const MAX_SETUP_TOKEN_LENGTH = 256;
|
|
46
47
|
const LANGUAGE_TAG_PATTERN = /^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$/;
|
|
47
48
|
function withoutTags(value) {
|
|
48
49
|
return (0, striptags_1.default)(value).trim();
|
|
@@ -58,6 +59,7 @@ exports.onboardingRegisterAdminSchema = z
|
|
|
58
59
|
firstName: namePartSchema,
|
|
59
60
|
lastName: namePartSchema,
|
|
60
61
|
password: password_1.passwordSchema,
|
|
62
|
+
setupToken: z.string().max(MAX_SETUP_TOKEN_LENGTH).optional(),
|
|
61
63
|
platformName: z
|
|
62
64
|
.string()
|
|
63
65
|
.max(MAX_PLATFORM_NAME_LENGTH)
|
|
@@ -73,6 +75,7 @@ exports.onboardingRegisterAdminSchema = z
|
|
|
73
75
|
email: (0, striptags_1.default)(data.email),
|
|
74
76
|
name: `${data.firstName} ${data.lastName}`,
|
|
75
77
|
password: data.password,
|
|
78
|
+
setupToken: data.setupToken,
|
|
76
79
|
platformName: data.platformName || undefined,
|
|
77
80
|
language: data.language,
|
|
78
81
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-admin.schema.js","sourceRoot":"","sources":["../../../src/validation/onboarding/register-admin.schema.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0DAAkC;AAClC,uCAAyB;AAEzB,0CAA6C;AAE7C,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AACrC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,oBAAoB,GAAG,uCAAuC,CAAC;AAErE,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,IAAA,mBAAS,EAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC;AAGD,MAAM,cAAc,GAAG,CAAC;KACrB,MAAM,EAAE;KACR,GAAG,CAAC,oBAAoB,CAAC;KACzB,SAAS,CAAC,WAAW,CAAC;KACtB,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"register-admin.schema.js","sourceRoot":"","sources":["../../../src/validation/onboarding/register-admin.schema.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0DAAkC;AAClC,uCAAyB;AAEzB,0CAA6C;AAE7C,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AACrC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,oBAAoB,GAAG,uCAAuC,CAAC;AAErE,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,IAAA,mBAAS,EAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC;AAGD,MAAM,cAAc,GAAG,CAAC;KACrB,MAAM,EAAE;KACR,GAAG,CAAC,oBAAoB,CAAC;KACzB,SAAS,CAAC,WAAW,CAAC;KACtB,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAQd,QAAA,6BAA6B,GAAG,CAAC;KAC3C,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;IAChC,SAAS,EAAE,cAAc;IACzB,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,yBAAc;IACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,QAAQ,EAAE;IAC7D,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,GAAG,CAAC,wBAAwB,CAAC;SAC7B,SAAS,CAAC,WAAW,CAAC;SACtB,QAAQ,EAAE;IACb,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,uBAAuB,CAAC;SAC5B,KAAK,CAAC,oBAAoB,CAAC;SAC3B,QAAQ,EAAE;CACd,CAAC;KACD,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACpB,KAAK,EAAE,IAAA,mBAAS,EAAC,IAAI,CAAC,KAAK,CAAC;IAC5B,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE;IAC1C,QAAQ,EAAE,IAAI,CAAC,QAAQ;IACvB,UAAU,EAAE,IAAI,CAAC,UAAU;IAC3B,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,SAAS;IAC5C,QAAQ,EAAE,IAAI,CAAC,QAAQ;CACxB,CAAC,CAAC,CAAC"}
|
|
@@ -271,6 +271,20 @@ export function formatNumber(
|
|
|
271
271
|
}
|
|
272
272
|
}
|
|
273
273
|
|
|
274
|
+
const CURRENCY_CODE = /^[A-Za-z]{3}$/;
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* The currency an amount is written in: `options.currency` when it is an
|
|
278
|
+
* ISO 4217 code, euros otherwise (a missing or malformed code never turns the
|
|
279
|
+
* amount into a bare number).
|
|
280
|
+
*/
|
|
281
|
+
function priceCurrency(options: Intl.NumberFormatOptions | undefined): string {
|
|
282
|
+
const code = options?.currency;
|
|
283
|
+
return typeof code === "string" && CURRENCY_CODE.test(code)
|
|
284
|
+
? code.toUpperCase()
|
|
285
|
+
: DEFAULT_CURRENCY;
|
|
286
|
+
}
|
|
287
|
+
|
|
274
288
|
/** An amount, in euros unless `options.currency` says otherwise. */
|
|
275
289
|
export function formatPrice(
|
|
276
290
|
value: number,
|
|
@@ -289,10 +303,10 @@ export function formatPrice(
|
|
|
289
303
|
): Parameters<typeof isNumber>[0] {
|
|
290
304
|
return formatNumber(value, locale, {
|
|
291
305
|
style: "currency",
|
|
292
|
-
currency: DEFAULT_CURRENCY,
|
|
293
306
|
minimumFractionDigits: DEFAULT_PRICE_FRACTION_DIGITS,
|
|
294
307
|
maximumFractionDigits: DEFAULT_PRICE_FRACTION_DIGITS,
|
|
295
308
|
...options,
|
|
309
|
+
currency: priceCurrency(options),
|
|
296
310
|
});
|
|
297
311
|
}
|
|
298
312
|
|
|
@@ -64,6 +64,7 @@
|
|
|
64
64
|
"invite_used": "This invitation was already used. Please log in.",
|
|
65
65
|
"onboarding_already_completed": "Onboarding already completed.",
|
|
66
66
|
"admin_already_set": "An administrator account already exists.",
|
|
67
|
+
"invalid_setup_token": "The setup token is missing or wrong. Use the address in the server log, or the value of DMS_SETUP_TOKEN.",
|
|
67
68
|
"user_creation_failed": "The user account could not be created. Please try again.",
|
|
68
69
|
"settings_not_found": "General settings not found.",
|
|
69
70
|
"token_expired": "The validation code has expired.",
|
|
@@ -64,6 +64,7 @@
|
|
|
64
64
|
"invite_used": "Cette invitation a déjà été utilisée. Veuillez vous connecter.",
|
|
65
65
|
"onboarding_already_completed": "L'onboarding a déjà été completé.",
|
|
66
66
|
"admin_already_set": "Un compte administrateur existe déjà.",
|
|
67
|
+
"invalid_setup_token": "Le jeton d'installation est absent ou incorrect. Utilisez l'adresse affichée dans les logs du serveur, ou la valeur de DMS_SETUP_TOKEN.",
|
|
67
68
|
"user_creation_failed": "Le compte utilisateur n'a pas pu être créé. Veuillez réessayer.",
|
|
68
69
|
"settings_not_found": "Les paramètres généraux n'ont pas été trouvés.",
|
|
69
70
|
"token_expired": "Le code de validation a expiré.",
|
|
@@ -14,6 +14,11 @@ export interface DmsLogoSources {
|
|
|
14
14
|
|
|
15
15
|
/** The logos of an instance, one per place it is drawn. */
|
|
16
16
|
export interface DmsBrandingLogo {
|
|
17
|
+
/**
|
|
18
|
+
* The name a screen reader announces for the logo: the application's name.
|
|
19
|
+
* Set it with a logo of your own.
|
|
20
|
+
*/
|
|
21
|
+
alt?: string;
|
|
17
22
|
/** The expanded sidebar and the auth pages. */
|
|
18
23
|
default: DmsLogoSources;
|
|
19
24
|
/** The icon-only sidebar. */
|