@atlasauth/cli 0.12.0 → 0.13.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 +6 -0
- package/dist/args.d.ts +15 -0
- package/dist/args.js +7 -0
- package/dist/args.js.map +1 -1
- package/dist/commands/config.js +71 -6
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/dev.d.ts +8 -0
- package/dist/commands/dev.js +84 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/pages.d.ts +14 -0
- package/dist/commands/pages.js +113 -0
- package/dist/commands/pages.js.map +1 -0
- package/dist/context.d.ts +1 -1
- package/dist/help.d.ts +1 -1
- package/dist/help.js +58 -2
- package/dist/help.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/migrate/appwrite/plugin.d.ts +2 -0
- package/dist/migrate/appwrite/plugin.js +103 -0
- package/dist/migrate/appwrite/plugin.js.map +1 -0
- package/dist/migrate/authentik/plugin.d.ts +2 -0
- package/dist/migrate/authentik/plugin.js +135 -0
- package/dist/migrate/authentik/plugin.js.map +1 -0
- package/dist/migrate/azure-ad-b2c/plugin.d.ts +8 -0
- package/dist/migrate/azure-ad-b2c/plugin.js +165 -0
- package/dist/migrate/azure-ad-b2c/plugin.js.map +1 -0
- package/dist/migrate/cognito/plugin.d.ts +5 -0
- package/dist/migrate/cognito/plugin.js +170 -0
- package/dist/migrate/cognito/plugin.js.map +1 -0
- package/dist/migrate/corbado/plugin.d.ts +2 -0
- package/dist/migrate/corbado/plugin.js +63 -0
- package/dist/migrate/corbado/plugin.js.map +1 -0
- package/dist/migrate/entra-external-id/plugin.d.ts +8 -0
- package/dist/migrate/entra-external-id/plugin.js +12 -0
- package/dist/migrate/entra-external-id/plugin.js.map +1 -0
- package/dist/migrate/export/appwrite-config.d.ts +28 -0
- package/dist/migrate/export/appwrite-config.js +170 -0
- package/dist/migrate/export/appwrite-config.js.map +1 -0
- package/dist/migrate/export/appwrite.d.ts +51 -0
- package/dist/migrate/export/appwrite.js +288 -0
- package/dist/migrate/export/appwrite.js.map +1 -0
- package/dist/migrate/export/authentik-config.d.ts +45 -0
- package/dist/migrate/export/authentik-config.js +357 -0
- package/dist/migrate/export/authentik-config.js.map +1 -0
- package/dist/migrate/export/authentik.d.ts +110 -0
- package/dist/migrate/export/authentik.js +838 -0
- package/dist/migrate/export/authentik.js.map +1 -0
- package/dist/migrate/export/azure-config.d.ts +58 -0
- package/dist/migrate/export/azure-config.js +344 -0
- package/dist/migrate/export/azure-config.js.map +1 -0
- package/dist/migrate/export/azure.d.ts +85 -0
- package/dist/migrate/export/azure.js +373 -0
- package/dist/migrate/export/azure.js.map +1 -0
- package/dist/migrate/export/cognito-config.d.ts +25 -0
- package/dist/migrate/export/cognito-config.js +273 -0
- package/dist/migrate/export/cognito-config.js.map +1 -0
- package/dist/migrate/export/cognito.d.ts +103 -0
- package/dist/migrate/export/cognito.js +441 -0
- package/dist/migrate/export/cognito.js.map +1 -0
- package/dist/migrate/export/corbado-config.d.ts +20 -0
- package/dist/migrate/export/corbado-config.js +63 -0
- package/dist/migrate/export/corbado-config.js.map +1 -0
- package/dist/migrate/export/corbado.d.ts +37 -0
- package/dist/migrate/export/corbado.js +132 -0
- package/dist/migrate/export/corbado.js.map +1 -0
- package/dist/migrate/export/firebase-config.d.ts +24 -0
- package/dist/migrate/export/firebase-config.js +215 -0
- package/dist/migrate/export/firebase-config.js.map +1 -0
- package/dist/migrate/export/firebase.d.ts +102 -0
- package/dist/migrate/export/firebase.js +464 -0
- package/dist/migrate/export/firebase.js.map +1 -0
- package/dist/migrate/export/frontegg-config.d.ts +29 -0
- package/dist/migrate/export/frontegg-config.js +238 -0
- package/dist/migrate/export/frontegg-config.js.map +1 -0
- package/dist/migrate/export/frontegg.d.ts +67 -0
- package/dist/migrate/export/frontegg.js +410 -0
- package/dist/migrate/export/frontegg.js.map +1 -0
- package/dist/migrate/export/fusionauth-config.d.ts +26 -0
- package/dist/migrate/export/fusionauth-config.js +226 -0
- package/dist/migrate/export/fusionauth-config.js.map +1 -0
- package/dist/migrate/export/fusionauth.d.ts +99 -0
- package/dist/migrate/export/fusionauth.js +642 -0
- package/dist/migrate/export/fusionauth.js.map +1 -0
- package/dist/migrate/export/hanko-config.d.ts +27 -0
- package/dist/migrate/export/hanko-config.js +265 -0
- package/dist/migrate/export/hanko-config.js.map +1 -0
- package/dist/migrate/export/hanko.d.ts +52 -0
- package/dist/migrate/export/hanko.js +605 -0
- package/dist/migrate/export/hanko.js.map +1 -0
- package/dist/migrate/export/keycloak-config.d.ts +19 -0
- package/dist/migrate/export/keycloak-config.js +219 -0
- package/dist/migrate/export/keycloak-config.js.map +1 -0
- package/dist/migrate/export/keycloak.d.ts +155 -0
- package/dist/migrate/export/keycloak.js +878 -0
- package/dist/migrate/export/keycloak.js.map +1 -0
- package/dist/migrate/export/ldap.d.ts +53 -0
- package/dist/migrate/export/ldap.js +277 -0
- package/dist/migrate/export/ldap.js.map +1 -0
- package/dist/migrate/export/logto-config.d.ts +27 -0
- package/dist/migrate/export/logto-config.js +264 -0
- package/dist/migrate/export/logto-config.js.map +1 -0
- package/dist/migrate/export/logto.d.ts +150 -0
- package/dist/migrate/export/logto.js +809 -0
- package/dist/migrate/export/logto.js.map +1 -0
- package/dist/migrate/export/magic-config.d.ts +14 -0
- package/dist/migrate/export/magic-config.js +28 -0
- package/dist/migrate/export/magic-config.js.map +1 -0
- package/dist/migrate/export/magic.d.ts +31 -0
- package/dist/migrate/export/magic.js +93 -0
- package/dist/migrate/export/magic.js.map +1 -0
- package/dist/migrate/export/mini-yaml.d.ts +19 -0
- package/dist/migrate/export/mini-yaml.js +581 -0
- package/dist/migrate/export/mini-yaml.js.map +1 -0
- package/dist/migrate/export/nhost-config.d.ts +26 -0
- package/dist/migrate/export/nhost-config.js +360 -0
- package/dist/migrate/export/nhost-config.js.map +1 -0
- package/dist/migrate/export/nhost.d.ts +64 -0
- package/dist/migrate/export/nhost.js +304 -0
- package/dist/migrate/export/nhost.js.map +1 -0
- package/dist/migrate/export/onelogin.d.ts +22 -0
- package/dist/migrate/export/onelogin.js +123 -0
- package/dist/migrate/export/onelogin.js.map +1 -0
- package/dist/migrate/export/ory-config.d.ts +58 -0
- package/dist/migrate/export/ory-config.js +451 -0
- package/dist/migrate/export/ory-config.js.map +1 -0
- package/dist/migrate/export/ory.d.ts +81 -0
- package/dist/migrate/export/ory.js +555 -0
- package/dist/migrate/export/ory.js.map +1 -0
- package/dist/migrate/export/password-detect.d.ts +29 -0
- package/dist/migrate/export/password-detect.js +81 -0
- package/dist/migrate/export/password-detect.js.map +1 -0
- package/dist/migrate/export/pingone.d.ts +36 -0
- package/dist/migrate/export/pingone.js +218 -0
- package/dist/migrate/export/pingone.js.map +1 -0
- package/dist/migrate/export/pocketbase-config.d.ts +28 -0
- package/dist/migrate/export/pocketbase-config.js +180 -0
- package/dist/migrate/export/pocketbase-config.js.map +1 -0
- package/dist/migrate/export/pocketbase.d.ts +52 -0
- package/dist/migrate/export/pocketbase.js +243 -0
- package/dist/migrate/export/pocketbase.js.map +1 -0
- package/dist/migrate/export/project-files.d.ts +15 -0
- package/dist/migrate/export/project-files.js +43 -0
- package/dist/migrate/export/project-files.js.map +1 -0
- package/dist/migrate/export/propelauth-config.d.ts +18 -0
- package/dist/migrate/export/propelauth-config.js +58 -0
- package/dist/migrate/export/propelauth-config.js.map +1 -0
- package/dist/migrate/export/propelauth-harness.test-helper.d.ts +62 -0
- package/dist/migrate/export/propelauth-harness.test-helper.js +109 -0
- package/dist/migrate/export/propelauth-harness.test-helper.js.map +1 -0
- package/dist/migrate/export/propelauth.d.ts +48 -0
- package/dist/migrate/export/propelauth.js +255 -0
- package/dist/migrate/export/propelauth.js.map +1 -0
- package/dist/migrate/export/source-lines.d.ts +17 -0
- package/dist/migrate/export/source-lines.js +43 -0
- package/dist/migrate/export/source-lines.js.map +1 -0
- package/dist/migrate/export/sso-metadata.d.ts +47 -0
- package/dist/migrate/export/sso-metadata.js +180 -0
- package/dist/migrate/export/sso-metadata.js.map +1 -0
- package/dist/migrate/export/stytch-config.d.ts +22 -0
- package/dist/migrate/export/stytch-config.js +102 -0
- package/dist/migrate/export/stytch-config.js.map +1 -0
- package/dist/migrate/export/stytch.d.ts +68 -0
- package/dist/migrate/export/stytch.js +510 -0
- package/dist/migrate/export/stytch.js.map +1 -0
- package/dist/migrate/export/supabase-config.d.ts +48 -0
- package/dist/migrate/export/supabase-config.js +408 -0
- package/dist/migrate/export/supabase-config.js.map +1 -0
- package/dist/migrate/export/supabase.d.ts +86 -0
- package/dist/migrate/export/supabase.js +524 -0
- package/dist/migrate/export/supabase.js.map +1 -0
- package/dist/migrate/export/supertokens-config.d.ts +20 -0
- package/dist/migrate/export/supertokens-config.js +150 -0
- package/dist/migrate/export/supertokens-config.js.map +1 -0
- package/dist/migrate/export/supertokens.d.ts +125 -0
- package/dist/migrate/export/supertokens.js +464 -0
- package/dist/migrate/export/supertokens.js.map +1 -0
- package/dist/migrate/export/table.d.ts +35 -0
- package/dist/migrate/export/table.js +248 -0
- package/dist/migrate/export/table.js.map +1 -0
- package/dist/migrate/export/userfront-config.d.ts +15 -0
- package/dist/migrate/export/userfront-config.js +49 -0
- package/dist/migrate/export/userfront-config.js.map +1 -0
- package/dist/migrate/export/userfront.d.ts +38 -0
- package/dist/migrate/export/userfront.js +189 -0
- package/dist/migrate/export/userfront.js.map +1 -0
- package/dist/migrate/export/workos-config.d.ts +23 -0
- package/dist/migrate/export/workos-config.js +125 -0
- package/dist/migrate/export/workos-config.js.map +1 -0
- package/dist/migrate/export/workos.d.ts +46 -0
- package/dist/migrate/export/workos.js +272 -0
- package/dist/migrate/export/workos.js.map +1 -0
- package/dist/migrate/export/zitadel-config.d.ts +37 -0
- package/dist/migrate/export/zitadel-config.js +279 -0
- package/dist/migrate/export/zitadel-config.js.map +1 -0
- package/dist/migrate/export/zitadel.d.ts +82 -0
- package/dist/migrate/export/zitadel.js +447 -0
- package/dist/migrate/export/zitadel.js.map +1 -0
- package/dist/migrate/firebase/plugin.d.ts +2 -0
- package/dist/migrate/firebase/plugin.js +152 -0
- package/dist/migrate/firebase/plugin.js.map +1 -0
- package/dist/migrate/framework/builtins.js +35 -6
- package/dist/migrate/framework/builtins.js.map +1 -1
- package/dist/migrate/framework/orchestrator.js +3 -2
- package/dist/migrate/framework/orchestrator.js.map +1 -1
- package/dist/migrate/framework/plugin.d.ts +2 -0
- package/dist/migrate/frontegg/plugin.d.ts +2 -0
- package/dist/migrate/frontegg/plugin.js +78 -0
- package/dist/migrate/frontegg/plugin.js.map +1 -0
- package/dist/migrate/fusionauth/plugin.d.ts +2 -0
- package/dist/migrate/fusionauth/plugin.js +109 -0
- package/dist/migrate/fusionauth/plugin.js.map +1 -0
- package/dist/migrate/hanko/plugin.d.ts +2 -0
- package/dist/migrate/hanko/plugin.js +100 -0
- package/dist/migrate/hanko/plugin.js.map +1 -0
- package/dist/migrate/keycloak/plugin.d.ts +2 -0
- package/dist/migrate/keycloak/plugin.js +148 -0
- package/dist/migrate/keycloak/plugin.js.map +1 -0
- package/dist/migrate/ldap/plugin.d.ts +2 -0
- package/dist/migrate/ldap/plugin.js +73 -0
- package/dist/migrate/ldap/plugin.js.map +1 -0
- package/dist/migrate/logto/plugin.d.ts +2 -0
- package/dist/migrate/logto/plugin.js +131 -0
- package/dist/migrate/logto/plugin.js.map +1 -0
- package/dist/migrate/magic/plugin.d.ts +2 -0
- package/dist/migrate/magic/plugin.js +56 -0
- package/dist/migrate/magic/plugin.js.map +1 -0
- package/dist/migrate/nhost/plugin.d.ts +2 -0
- package/dist/migrate/nhost/plugin.js +115 -0
- package/dist/migrate/nhost/plugin.js.map +1 -0
- package/dist/migrate/oidc/plugin.d.ts +2 -0
- package/dist/migrate/oidc/plugin.js +73 -0
- package/dist/migrate/oidc/plugin.js.map +1 -0
- package/dist/migrate/onelogin/plugin.d.ts +2 -0
- package/dist/migrate/onelogin/plugin.js +61 -0
- package/dist/migrate/onelogin/plugin.js.map +1 -0
- package/dist/migrate/ory/plugin.d.ts +2 -0
- package/dist/migrate/ory/plugin.js +186 -0
- package/dist/migrate/ory/plugin.js.map +1 -0
- package/dist/migrate/ping-identity/plugin.d.ts +2 -0
- package/dist/migrate/ping-identity/plugin.js +100 -0
- package/dist/migrate/ping-identity/plugin.js.map +1 -0
- package/dist/migrate/pocketbase/plugin.d.ts +2 -0
- package/dist/migrate/pocketbase/plugin.js +99 -0
- package/dist/migrate/pocketbase/plugin.js.map +1 -0
- package/dist/migrate/propelauth/plugin.d.ts +2 -0
- package/dist/migrate/propelauth/plugin.js +65 -0
- package/dist/migrate/propelauth/plugin.js.map +1 -0
- package/dist/migrate/saml/plugin.d.ts +2 -0
- package/dist/migrate/saml/plugin.js +79 -0
- package/dist/migrate/saml/plugin.js.map +1 -0
- package/dist/migrate/stytch/plugin.d.ts +2 -0
- package/dist/migrate/stytch/plugin.js +97 -0
- package/dist/migrate/stytch/plugin.js.map +1 -0
- package/dist/migrate/supabase/plugin.d.ts +2 -0
- package/dist/migrate/supabase/plugin.js +149 -0
- package/dist/migrate/supabase/plugin.js.map +1 -0
- package/dist/migrate/supertokens/plugin.d.ts +2 -0
- package/dist/migrate/supertokens/plugin.js +114 -0
- package/dist/migrate/supertokens/plugin.js.map +1 -0
- package/dist/migrate/user-table/plugin.d.ts +2 -0
- package/dist/migrate/user-table/plugin.js +62 -0
- package/dist/migrate/user-table/plugin.js.map +1 -0
- package/dist/migrate/userfront/plugin.d.ts +2 -0
- package/dist/migrate/userfront/plugin.js +60 -0
- package/dist/migrate/userfront/plugin.js.map +1 -0
- package/dist/migrate/workos/plugin.d.ts +2 -0
- package/dist/migrate/workos/plugin.js +81 -0
- package/dist/migrate/workos/plugin.js.map +1 -0
- package/dist/migrate/zitadel/plugin.d.ts +2 -0
- package/dist/migrate/zitadel/plugin.js +114 -0
- package/dist/migrate/zitadel/plugin.js.map +1 -0
- package/dist/run.js +4 -0
- package/dist/run.js.map +1 -1
- package/package.json +6 -5
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PLAINTEXT_PBKDF2_ITERATIONS = void 0;
|
|
4
|
+
exports.detectPasswordHash = detectPasswordHash;
|
|
5
|
+
exports.isKnownAlgorithm = isKnownAlgorithm;
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const migrate_1 = require("@atlasauth/migrate");
|
|
8
|
+
const SHAPES = [
|
|
9
|
+
{ re: /^\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}$/, algorithm: 'bcrypt' },
|
|
10
|
+
{ re: /^\$argon2(id|i|d)\$/, algorithm: 'argon2' },
|
|
11
|
+
{ re: /^\$6\$(rounds=\d{1,9}\$)?[^$]{0,16}\$[./0-9A-Za-z]{86}$/, algorithm: 'sha_crypt' },
|
|
12
|
+
{ re: /^\$5\$(rounds=\d{1,9}\$)?[^$]{0,16}\$[./0-9A-Za-z]{43}$/, algorithm: 'sha_crypt' },
|
|
13
|
+
{ re: /^\$(1|apr1)\$[^$]{0,8}\$[./0-9A-Za-z]{22}$/, algorithm: 'md5_crypt', weak: true },
|
|
14
|
+
{ re: /^pbkdf2_(sha1|sha256|sha512)\$\d+\$[^$]+\$.+$/, algorithm: 'pbkdf2_django' },
|
|
15
|
+
{ re: /^bcrypt_sha256\$\$2[aby]\$/, algorithm: 'bcrypt_sha256_django' },
|
|
16
|
+
{ re: /^\$pbkdf2-(sha1|sha256|sha512)\$\d+\$[^$]*\$.+$/, algorithm: 'pbkdf2_phc' },
|
|
17
|
+
{ re: /^\$scrypt\$ln=\d+,r=\d+,p=\d+\$/, algorithm: 'scrypt_phc' },
|
|
18
|
+
{ re: /^pbkdf2:(sha1|sha256|sha512)(:\d+)?\$[^$]+\$[0-9a-f]+$/, algorithm: 'pbkdf2_werkzeug' },
|
|
19
|
+
{ re: /^scrypt:\d+:\d+:\d+\$[^$]+\$[0-9a-f]+$/, algorithm: 'scrypt_werkzeug' },
|
|
20
|
+
{ re: /^\$[PH]\$[./0-9A-Za-z]{31}$/, algorithm: 'phpass', weak: true },
|
|
21
|
+
{ re: /^\{(SSHA|SHA|SSHA256|SSHA512|SHA256|SHA512)\}[A-Za-z0-9+/=]+$/i, algorithm: 'ldap_ssha', weak: true },
|
|
22
|
+
{ re: /^\{(MD5|SMD5|SHA384|SSHA384)\}[A-Za-z0-9+/=]+$/i, algorithm: 'ldap_digest', weak: true },
|
|
23
|
+
{ re: /^\{PBKDF2(-(SHA1|SHA256|SHA512))?\}\d+\$/i, algorithm: 'ldap_pbkdf2' },
|
|
24
|
+
{ re: /^\{PBKDF2_SHA256\}[A-Za-z0-9+/=]+$/i, algorithm: 'ldap_pbkdf2' },
|
|
25
|
+
];
|
|
26
|
+
/** `{CRYPT}` / `{BCRYPT}` / `{ARGON2}` around one of the crypt-style shapes above. */
|
|
27
|
+
const WRAPPED = /^\{(CRYPT|BCRYPT|ARGON2)\}(\$.+)$/i;
|
|
28
|
+
/** Directory schemes that are not hashes Atlas can check (pass-through or Kerberos). */
|
|
29
|
+
const DELEGATED = /^\{(SASL|K5KEY|KERBEROS|UNIX|NS-MTA-MD5|RADIUS|TOTP)\}/i;
|
|
30
|
+
/**
|
|
31
|
+
* Identify a self-describing hash. `{CLEARTEXT}` (and a plaintext value when
|
|
32
|
+
* `plaintext` is allowed) is hashed here with PBKDF2 before it is written, so
|
|
33
|
+
* no password is ever stored in the clear (Atlas re-hashes it to Argon2id on
|
|
34
|
+
* the first sign-in).
|
|
35
|
+
*/
|
|
36
|
+
function detectPasswordHash(raw, options = {}) {
|
|
37
|
+
const value = raw?.trim();
|
|
38
|
+
if (!value)
|
|
39
|
+
return { ok: false, reason: 'no password' };
|
|
40
|
+
for (const s of SHAPES)
|
|
41
|
+
if (s.re.test(value))
|
|
42
|
+
return { ok: true, password: { algorithm: s.algorithm, hash: value }, weak: s.weak === true };
|
|
43
|
+
const wrapped = WRAPPED.exec(value);
|
|
44
|
+
if (wrapped) {
|
|
45
|
+
const inner = wrapped[2];
|
|
46
|
+
const known = SHAPES.find((s) => s.re.test(inner) && ['bcrypt', 'argon2', 'sha_crypt', 'sha_crypt', 'md5_crypt'].includes(s.algorithm));
|
|
47
|
+
if (known)
|
|
48
|
+
return { ok: true, password: { algorithm: 'ldap_crypt', hash: value }, weak: known.weak === true };
|
|
49
|
+
return { ok: false, reason: `{${wrapped[1].toUpperCase()}} hash in a format Atlas cannot verify` };
|
|
50
|
+
}
|
|
51
|
+
if (/^\{CRYPT\}/i.test(value))
|
|
52
|
+
return { ok: false, reason: 'traditional DES {CRYPT} hash (not verifiable)' };
|
|
53
|
+
if (DELEGATED.test(value))
|
|
54
|
+
return { ok: false, reason: `${/^\{[^}]+\}/.exec(value)[0]} is checked by another service (pass-through authentication)` };
|
|
55
|
+
const clear = /^\{CLEARTEXT\}(.*)$/i.exec(value);
|
|
56
|
+
if (clear)
|
|
57
|
+
return hashPlaintext(clear[1]);
|
|
58
|
+
if (/^\{[A-Z0-9_-]+\}/i.test(value))
|
|
59
|
+
return { ok: false, reason: `unsupported scheme ${/^\{[^}]+\}/.exec(value)[0]}` };
|
|
60
|
+
if (options.plaintext)
|
|
61
|
+
return hashPlaintext(value);
|
|
62
|
+
return { ok: false, reason: 'unrecognised hash format (name its algorithm)' };
|
|
63
|
+
}
|
|
64
|
+
/** PBKDF2-SHA256 rounds for a plaintext password hashed on export (re-hashed to Argon2id on first sign-in). */
|
|
65
|
+
exports.PLAINTEXT_PBKDF2_ITERATIONS = 10_000;
|
|
66
|
+
function hashPlaintext(password) {
|
|
67
|
+
if (!password)
|
|
68
|
+
return { ok: false, reason: 'empty password' };
|
|
69
|
+
const salt = (0, node_crypto_1.randomBytes)(16);
|
|
70
|
+
const hash = (0, node_crypto_1.pbkdf2Sync)(password, salt, exports.PLAINTEXT_PBKDF2_ITERATIONS, 32, 'sha256');
|
|
71
|
+
return {
|
|
72
|
+
ok: true,
|
|
73
|
+
password: { algorithm: 'pbkdf2', hash: hash.toString('base64'), salt: salt.toString('base64'), params: { digest: 'sha256', iterations: exports.PLAINTEXT_PBKDF2_ITERATIONS, encoding: 'base64', salt_encoding: 'base64' } },
|
|
74
|
+
weak: false,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** Whether Atlas's registry has a verifier id (or `auto`). */
|
|
78
|
+
function isKnownAlgorithm(id) {
|
|
79
|
+
return migrate_1.PASSWORD_HASH_ALGORITHMS.includes(id);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=password-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password-detect.js","sourceRoot":"","sources":["../../../src/migrate/export/password-detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { SsoConnectionRecord } from '@atlasauth/migrate';
|
|
2
|
+
import { RecordSet, type Obj } from './record-set';
|
|
3
|
+
import { VendorHttp } from './vendor-http';
|
|
4
|
+
/**
|
|
5
|
+
* `atlas migrate ping-identity export` — a PingOne environment through its
|
|
6
|
+
* management API with a worker application (client id + secret, on this
|
|
7
|
+
* machine): users (login, email and verification, name, phones, enabled /
|
|
8
|
+
* locked state, population, last sign-on), groups (as roles, with their
|
|
9
|
+
* members), external-IdP identities and the environment's SAML / OIDC identity
|
|
10
|
+
* providers (as SSO connections).
|
|
11
|
+
*
|
|
12
|
+
* PingOne never returns password hashes, TOTP secrets or FIDO2 credentials:
|
|
13
|
+
* passwords move by lazy migration (the `ping_identity` preset checks them with
|
|
14
|
+
* PingOne's password-check call), second factors are enrolled again.
|
|
15
|
+
*/
|
|
16
|
+
/** auth.pingone.<tld> / api.pingone.<tld> for a region code. */
|
|
17
|
+
export declare function pingRegion(region: string | undefined): string;
|
|
18
|
+
export interface PingOneExportOptions {
|
|
19
|
+
environmentId: string;
|
|
20
|
+
clientId: string;
|
|
21
|
+
clientSecret: string;
|
|
22
|
+
region?: string;
|
|
23
|
+
/** Read each user's group memberships (one call per user; off for very large environments). */
|
|
24
|
+
groups?: boolean;
|
|
25
|
+
fetchImpl?: typeof fetch;
|
|
26
|
+
sleep?: (ms: number) => Promise<void>;
|
|
27
|
+
onProgress?: (message: string) => void;
|
|
28
|
+
}
|
|
29
|
+
/** A client-credentials access token for the worker application. */
|
|
30
|
+
export declare function pingOneToken(o: Pick<PingOneExportOptions, 'environmentId' | 'clientId' | 'clientSecret' | 'region' | 'fetchImpl'>): Promise<string>;
|
|
31
|
+
export declare function pingOneHttp(o: PingOneExportOptions, token: string): VendorHttp;
|
|
32
|
+
/** Every item of a PingOne collection (`_embedded.<key>`, next page in `_links.next.href`). */
|
|
33
|
+
export declare function pingOneList(http: VendorHttp, path: string, key: string): Promise<Obj[]>;
|
|
34
|
+
/** A PingOne identity provider → an SSO connection (SAML / OIDC); other types are social logins. */
|
|
35
|
+
export declare function ssoConnectionOf(idp: Obj): SsoConnectionRecord | null;
|
|
36
|
+
export declare function exportPingOne(o: PingOneExportOptions): Promise<RecordSet>;
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pingRegion = pingRegion;
|
|
4
|
+
exports.pingOneToken = pingOneToken;
|
|
5
|
+
exports.pingOneHttp = pingOneHttp;
|
|
6
|
+
exports.pingOneList = pingOneList;
|
|
7
|
+
exports.ssoConnectionOf = ssoConnectionOf;
|
|
8
|
+
exports.exportPingOne = exportPingOne;
|
|
9
|
+
const record_set_1 = require("./record-set");
|
|
10
|
+
const translate_kit_1 = require("./translate-kit");
|
|
11
|
+
const vendor_http_1 = require("./vendor-http");
|
|
12
|
+
/**
|
|
13
|
+
* `atlas migrate ping-identity export` — a PingOne environment through its
|
|
14
|
+
* management API with a worker application (client id + secret, on this
|
|
15
|
+
* machine): users (login, email and verification, name, phones, enabled /
|
|
16
|
+
* locked state, population, last sign-on), groups (as roles, with their
|
|
17
|
+
* members), external-IdP identities and the environment's SAML / OIDC identity
|
|
18
|
+
* providers (as SSO connections).
|
|
19
|
+
*
|
|
20
|
+
* PingOne never returns password hashes, TOTP secrets or FIDO2 credentials:
|
|
21
|
+
* passwords move by lazy migration (the `ping_identity` preset checks them with
|
|
22
|
+
* PingOne's password-check call), second factors are enrolled again.
|
|
23
|
+
*/
|
|
24
|
+
/** auth.pingone.<tld> / api.pingone.<tld> for a region code. */
|
|
25
|
+
function pingRegion(region) {
|
|
26
|
+
const r = (region ?? 'com').toLowerCase().replace(/^\./, '');
|
|
27
|
+
if (!/^(com|eu|asia|ca|com\.au|sg)$/.test(r))
|
|
28
|
+
throw new Error(`Unknown PingOne region "${region}" (use com, eu, asia, ca, com.au or sg).`);
|
|
29
|
+
return r;
|
|
30
|
+
}
|
|
31
|
+
/** A client-credentials access token for the worker application. */
|
|
32
|
+
async function pingOneToken(o) {
|
|
33
|
+
const f = o.fetchImpl ?? fetch;
|
|
34
|
+
const res = await f(`https://auth.pingone.${pingRegion(o.region)}/${o.environmentId}/as/token`, {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
headers: {
|
|
37
|
+
'content-type': 'application/x-www-form-urlencoded',
|
|
38
|
+
authorization: `Basic ${Buffer.from(`${encodeURIComponent(o.clientId)}:${encodeURIComponent(o.clientSecret)}`).toString('base64')}`,
|
|
39
|
+
},
|
|
40
|
+
body: 'grant_type=client_credentials',
|
|
41
|
+
});
|
|
42
|
+
const body = (await res.json().catch(() => null));
|
|
43
|
+
const token = (0, record_set_1.str)(body?.access_token);
|
|
44
|
+
if (res.status !== 200 || !token)
|
|
45
|
+
throw new Error(`PingOne refused the worker application's credentials (${res.status}${(0, record_set_1.str)(body?.error_description) ? `: ${(0, record_set_1.str)(body?.error_description)}` : ''}).`);
|
|
46
|
+
return token;
|
|
47
|
+
}
|
|
48
|
+
function pingOneHttp(o, token) {
|
|
49
|
+
return new vendor_http_1.VendorHttp({
|
|
50
|
+
vendor: 'PingOne',
|
|
51
|
+
baseUrl: `https://api.pingone.${pingRegion(o.region)}/v1/environments/${o.environmentId}`,
|
|
52
|
+
headers: { authorization: `Bearer ${token}` },
|
|
53
|
+
fetchImpl: o.fetchImpl,
|
|
54
|
+
sleep: o.sleep,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** Every item of a PingOne collection (`_embedded.<key>`, next page in `_links.next.href`). */
|
|
58
|
+
async function pingOneList(http, path, key) {
|
|
59
|
+
const out = [];
|
|
60
|
+
let next = path;
|
|
61
|
+
while (next) {
|
|
62
|
+
const res = await http.get(next);
|
|
63
|
+
const body = (0, record_set_1.isObj)(res.body) ? res.body : {};
|
|
64
|
+
out.push(...(0, record_set_1.objs)((0, record_set_1.isObj)(body._embedded) ? body._embedded[key] : undefined));
|
|
65
|
+
const href = (0, record_set_1.isObj)(body._links) && (0, record_set_1.isObj)(body._links.next) ? body._links.next.href : undefined;
|
|
66
|
+
next = typeof href === 'string' ? href : undefined;
|
|
67
|
+
}
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
async function listOrEmpty(http, path, key) {
|
|
71
|
+
try {
|
|
72
|
+
return await pingOneList(http, path, key);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
if (err instanceof vendor_http_1.VendorApiError && [403, 404].includes(err.status))
|
|
76
|
+
return [];
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** A PingOne identity provider → an SSO connection (SAML / OIDC); other types are social logins. */
|
|
81
|
+
function ssoConnectionOf(idp) {
|
|
82
|
+
const type = (0, record_set_1.str)(idp.type);
|
|
83
|
+
const id = (0, record_set_1.str)(idp.id);
|
|
84
|
+
if (!id)
|
|
85
|
+
return null;
|
|
86
|
+
if (type === 'SAML') {
|
|
87
|
+
const certs = (0, record_set_1.isObj)(idp.idpVerification) ? (0, record_set_1.objs)(idp.idpVerification.certificates) : [];
|
|
88
|
+
return (0, record_set_1.compact)({
|
|
89
|
+
id,
|
|
90
|
+
name: (0, record_set_1.str)(idp.name),
|
|
91
|
+
protocol: 'saml',
|
|
92
|
+
enabled: idp.enabled !== false,
|
|
93
|
+
saml: (0, record_set_1.compact)({
|
|
94
|
+
idp_entity_id: (0, record_set_1.str)(idp.idpEntityId),
|
|
95
|
+
idp_sso_url: (0, record_set_1.str)(idp.ssoEndpoint),
|
|
96
|
+
sp_entity_id: (0, record_set_1.str)(idp.spEntityId),
|
|
97
|
+
// The signing certificate itself is not in the list answer: fetch the certificate id's key from PingOne or paste the IdP metadata.
|
|
98
|
+
idp_certificate: (0, record_set_1.str)(certs[0]?.certificate),
|
|
99
|
+
}),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (type === 'OPENID_CONNECT') {
|
|
103
|
+
return (0, record_set_1.compact)({
|
|
104
|
+
id,
|
|
105
|
+
name: (0, record_set_1.str)(idp.name),
|
|
106
|
+
protocol: 'oidc',
|
|
107
|
+
enabled: idp.enabled !== false,
|
|
108
|
+
oidc: (0, record_set_1.compact)({
|
|
109
|
+
issuer: (0, record_set_1.str)(idp.issuer),
|
|
110
|
+
discovery_url: (0, record_set_1.str)(idp.discoveryEndpoint),
|
|
111
|
+
client_id: (0, record_set_1.str)(idp.clientId),
|
|
112
|
+
scopes: Array.isArray(idp.scopes) ? idp.scopes.map(String) : undefined,
|
|
113
|
+
}),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
async function exportPingOne(o) {
|
|
119
|
+
const set = new record_set_1.RecordSet();
|
|
120
|
+
const say = o.onProgress ?? (() => undefined);
|
|
121
|
+
set.manifest = { origin: `PingOne environment ${o.environmentId}` };
|
|
122
|
+
const http = pingOneHttp(o, await pingOneToken(o));
|
|
123
|
+
say('identity providers');
|
|
124
|
+
const connections = new Set();
|
|
125
|
+
for (const idp of await listOrEmpty(http, '/identityProviders', 'identityProviders')) {
|
|
126
|
+
const sso = ssoConnectionOf(idp);
|
|
127
|
+
if (sso) {
|
|
128
|
+
set.add('sso_connection', sso, sso.id);
|
|
129
|
+
connections.add(sso.id);
|
|
130
|
+
}
|
|
131
|
+
else if ((0, record_set_1.str)(idp.type))
|
|
132
|
+
set.warn(`Social identity provider "${(0, record_set_1.str)(idp.name) ?? (0, record_set_1.str)(idp.type)}" (${(0, record_set_1.str)(idp.type)}) is configured in Atlas as an OAuth provider (atlas migrate ping-identity config), not imported as a connection.`);
|
|
133
|
+
}
|
|
134
|
+
say('groups');
|
|
135
|
+
const groups = await listOrEmpty(http, '/groups', 'groups');
|
|
136
|
+
const roleOf = new Map();
|
|
137
|
+
for (const g of groups) {
|
|
138
|
+
const id = (0, record_set_1.str)(g.id);
|
|
139
|
+
const name = (0, record_set_1.str)(g.name);
|
|
140
|
+
if (!id || !name)
|
|
141
|
+
continue;
|
|
142
|
+
const key = (0, translate_kit_1.keyOf)(name);
|
|
143
|
+
roleOf.set(id, key);
|
|
144
|
+
set.add('role', { key, name, scope: 'app', description: (0, record_set_1.str)(g.description) }, key);
|
|
145
|
+
}
|
|
146
|
+
say('users');
|
|
147
|
+
const users = await pingOneList(http, '/users?limit=100', 'users');
|
|
148
|
+
let i = 0;
|
|
149
|
+
for (const u of users) {
|
|
150
|
+
const id = (0, record_set_1.str)(u.id);
|
|
151
|
+
if (!id)
|
|
152
|
+
continue;
|
|
153
|
+
if (++i % 500 === 0)
|
|
154
|
+
say(` ${i} of ${users.length} users`);
|
|
155
|
+
const name = (0, record_set_1.isObj)(u.name) ? u.name : {};
|
|
156
|
+
const email = (0, record_set_1.str)(u.email)?.toLowerCase();
|
|
157
|
+
const emails = email ? [{ email, verified: u.emailVerified === true || (0, record_set_1.str)(u.verifyStatus) === 'VERIFIED', primary: true }] : [];
|
|
158
|
+
const phones = [];
|
|
159
|
+
for (const raw of [u.mobilePhone, u.primaryPhone]) {
|
|
160
|
+
const p = (0, record_set_1.e164)(raw);
|
|
161
|
+
if (p && !phones.some((x) => x.phone === p))
|
|
162
|
+
phones.push({ phone: p, verified: false, primary: phones.length === 0 });
|
|
163
|
+
}
|
|
164
|
+
const account = (0, record_set_1.isObj)(u.account) ? u.account : {};
|
|
165
|
+
const lifecycle = (0, record_set_1.isObj)(u.lifecycle) ? u.lifecycle : {};
|
|
166
|
+
const record = (0, record_set_1.compact)({
|
|
167
|
+
id,
|
|
168
|
+
emails,
|
|
169
|
+
phones,
|
|
170
|
+
username: (0, record_set_1.str)(u.username),
|
|
171
|
+
first_name: (0, record_set_1.str)(name.given),
|
|
172
|
+
last_name: (0, record_set_1.str)(name.family),
|
|
173
|
+
name: (0, record_set_1.str)(name.formatted),
|
|
174
|
+
created_at: (0, record_set_1.str)(u.createdAt),
|
|
175
|
+
last_sign_in_at: (0, record_set_1.isObj)(u.lastSignOn) ? (0, record_set_1.str)(u.lastSignOn.at) : undefined,
|
|
176
|
+
private_metadata: { pingone: (0, record_set_1.compact)({ population: (0, record_set_1.isObj)(u.population) ? (0, record_set_1.str)(u.population.id) : undefined, type: (0, record_set_1.str)(u.type), mfa_enabled: u.mfaEnabled === true ? true : undefined }) },
|
|
177
|
+
});
|
|
178
|
+
if (u.enabled === false) {
|
|
179
|
+
record.banned = true;
|
|
180
|
+
record.ban_reason = 'Disabled in PingOne';
|
|
181
|
+
}
|
|
182
|
+
else if ((0, record_set_1.str)(account.status) === 'LOCKED')
|
|
183
|
+
record.locked = true;
|
|
184
|
+
if (['ACCOUNT_DISABLED', 'DISABLED'].includes((0, record_set_1.str)(lifecycle.status) ?? ''))
|
|
185
|
+
record.banned = true;
|
|
186
|
+
if (!record.emails?.length && !record.phones?.length && !record.username) {
|
|
187
|
+
set.omit('user', 'no email, phone or username', 1);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (o.groups !== false && roleOf.size) {
|
|
191
|
+
const memberOf = await listOrEmpty(http, `/users/${encodeURIComponent(id)}/memberOfGroups`, 'groups');
|
|
192
|
+
const roles = memberOf.map((g) => roleOf.get((0, record_set_1.str)(g.id) ?? '')).filter((r) => !!r);
|
|
193
|
+
if (roles.length)
|
|
194
|
+
record.roles = roles;
|
|
195
|
+
}
|
|
196
|
+
set.add('user', record, id);
|
|
197
|
+
// A user who signs in through an external IdP keeps that link.
|
|
198
|
+
const ext = (0, record_set_1.isObj)(u.identityProvider) ? u.identityProvider : undefined;
|
|
199
|
+
const extType = (0, record_set_1.str)(ext?.type);
|
|
200
|
+
if (ext && extType && extType !== 'PING_ONE') {
|
|
201
|
+
const link = (0, record_set_1.compact)({
|
|
202
|
+
user_id: id,
|
|
203
|
+
provider: extType.toLowerCase(),
|
|
204
|
+
provider_user_id: (0, record_set_1.str)(ext.id) ?? id,
|
|
205
|
+
kind: connections.has((0, record_set_1.str)(ext.id) ?? '') ? 'enterprise' : 'oauth',
|
|
206
|
+
sso_connection_id: connections.has((0, record_set_1.str)(ext.id) ?? '') ? (0, record_set_1.str)(ext.id) : undefined,
|
|
207
|
+
email,
|
|
208
|
+
profile: (0, record_set_1.bag)({ external_id: (0, record_set_1.str)(u.externalId) }),
|
|
209
|
+
});
|
|
210
|
+
set.add('identity', link);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
set.omit('password', 'PingOne never exports password hashes', users.length);
|
|
214
|
+
set.omit('mfa_factor', 'PingOne never exports TOTP secrets or FIDO2 credentials', 0);
|
|
215
|
+
set.warn('Passwords move by lazy migration (preset ping_identity); users enrol their second factor again.');
|
|
216
|
+
return set;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=pingone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pingone.js","sourceRoot":"","sources":["../../../src/migrate/export/pingone.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { TranslationResult } from '../framework/plugin';
|
|
2
|
+
import { type Obj } from './record-set';
|
|
3
|
+
/**
|
|
4
|
+
* `atlas migrate pocketbase config` — a PocketBase app's auth-collection
|
|
5
|
+
* options → Atlas config.
|
|
6
|
+
*
|
|
7
|
+
* Read from `_collections` (the data.db or its dump — the same source the
|
|
8
|
+
* export reads) or from a collections export file (Settings → Export
|
|
9
|
+
* collections, `pb_schema.json`), with file:line for the file. v0.23+
|
|
10
|
+
* options (`passwordAuth`, `oauth2`, `mfa`, `otp`, `authToken`, `authRule`,
|
|
11
|
+
* flattened onto the collection in an export file, under `options` in the
|
|
12
|
+
* database) and ≤0.22 options (`allowEmailAuth`, `minPasswordLength`,
|
|
13
|
+
* `onlyVerified` …) are both understood. Token secrets and OAuth client
|
|
14
|
+
* secrets are never copied.
|
|
15
|
+
*/
|
|
16
|
+
export interface PocketBaseConfigSnapshot {
|
|
17
|
+
/** `_collections` rows, or the collections array of an export file. */
|
|
18
|
+
collections: Obj[];
|
|
19
|
+
/** The export file, for file:line in the report. */
|
|
20
|
+
file?: {
|
|
21
|
+
path: string;
|
|
22
|
+
text: string;
|
|
23
|
+
};
|
|
24
|
+
/** The public PocketBase URL (bridge and lazy-migration presets). */
|
|
25
|
+
url?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function parsePocketBaseSchema(text: string): Obj[];
|
|
28
|
+
export declare function translatePocketBaseConfig(snap: PocketBaseConfigSnapshot): TranslationResult;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parsePocketBaseSchema = parsePocketBaseSchema;
|
|
4
|
+
exports.translatePocketBaseConfig = translatePocketBaseConfig;
|
|
5
|
+
const record_set_1 = require("./record-set");
|
|
6
|
+
const source_lines_1 = require("./source-lines");
|
|
7
|
+
const translate_kit_1 = require("./translate-kit");
|
|
8
|
+
function parsePocketBaseSchema(text) {
|
|
9
|
+
const parsed = JSON.parse(text);
|
|
10
|
+
if (Array.isArray(parsed))
|
|
11
|
+
return (0, record_set_1.objs)(parsed);
|
|
12
|
+
if ((0, record_set_1.isObj)(parsed) && Array.isArray(parsed.collections))
|
|
13
|
+
return (0, record_set_1.objs)(parsed.collections);
|
|
14
|
+
throw new Error('Not a PocketBase collections export (expected a JSON array of collections).');
|
|
15
|
+
}
|
|
16
|
+
/** Options of a collection, wherever this PocketBase version keeps them. */
|
|
17
|
+
function optionsOf(c) {
|
|
18
|
+
const o = typeof c.options === 'string' ? safeJson(c.options) : c.options;
|
|
19
|
+
return { ...((0, record_set_1.isObj)(o) ? o : {}), ...c };
|
|
20
|
+
}
|
|
21
|
+
function safeJson(s) {
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(s);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function translatePocketBaseConfig(snap) {
|
|
30
|
+
const b = new translate_kit_1.ConfigBuilder();
|
|
31
|
+
const auth = snap.collections.filter((c) => (0, record_set_1.str)(c.type) === 'auth' && (0, record_set_1.str)(c.name) !== '_superusers');
|
|
32
|
+
const main = auth.find((c) => (0, record_set_1.str)(c.name) === 'users') ?? auth[0];
|
|
33
|
+
if (!main) {
|
|
34
|
+
b.add('manual', 'collections', '_collections', 'No auth collection found: nothing to translate.');
|
|
35
|
+
return b.result(snap.file?.path ?? 'pocketbase _collections');
|
|
36
|
+
}
|
|
37
|
+
const name = (0, record_set_1.str)(main.name);
|
|
38
|
+
const o = optionsOf(main);
|
|
39
|
+
const file = snap.file;
|
|
40
|
+
// Lines are searched from the collection's own "name" key onwards.
|
|
41
|
+
const start = file ? Math.max(0, file.text.search(new RegExp(`"name"\\s*:\\s*"${name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}"`))) : 0;
|
|
42
|
+
const line = (...keys) => {
|
|
43
|
+
if (!file)
|
|
44
|
+
return undefined;
|
|
45
|
+
// The collection's "id" may come before "name": search the whole object for the first key.
|
|
46
|
+
const from = file.text.lastIndexOf('{', start);
|
|
47
|
+
let at = from < 0 ? 0 : from;
|
|
48
|
+
for (const k of keys) {
|
|
49
|
+
const i = file.text.indexOf(`"${k}"`, at);
|
|
50
|
+
if (i < 0)
|
|
51
|
+
return undefined;
|
|
52
|
+
at = i + k.length + 2;
|
|
53
|
+
}
|
|
54
|
+
return (0, source_lines_1.lineAt)(file.text, at);
|
|
55
|
+
};
|
|
56
|
+
const where = (...keys) => {
|
|
57
|
+
const l = line(...keys);
|
|
58
|
+
return { f: l ? file.path : undefined, l };
|
|
59
|
+
};
|
|
60
|
+
const area = `collection ${name}`;
|
|
61
|
+
const put = (status, keys, note, atlas) => {
|
|
62
|
+
const w = where(...keys);
|
|
63
|
+
(0, source_lines_1.addAt)(b, w.f, w.l, status, area, keys.join('.'), note, atlas);
|
|
64
|
+
};
|
|
65
|
+
if (auth.length > 1) {
|
|
66
|
+
b.add('differs', 'collections', 'auth collections', `${auth.length} auth collections (${auth.map((c) => (0, record_set_1.str)(c.name)).join(', ')}): Atlas has one user pool per instance. Their records are imported together, each tagged with private_metadata.pocketbase_collection; use app roles to tell them apart.`, 'users');
|
|
67
|
+
}
|
|
68
|
+
// ── password and identity fields ──
|
|
69
|
+
const pa = (0, record_set_1.isObj)(o.passwordAuth) ? o.passwordAuth : undefined;
|
|
70
|
+
if (pa) {
|
|
71
|
+
const on = pa.enabled !== false;
|
|
72
|
+
b.set('strategies.password', on);
|
|
73
|
+
if (on)
|
|
74
|
+
put('mapped', ['passwordAuth', 'enabled'], 'Password sign-in. Imported bcrypt hashes verify as they are and are upgraded to Argon2id.', 'auth_config.strategies.password');
|
|
75
|
+
const fields = (0, record_set_1.strs)(pa.identityFields);
|
|
76
|
+
if (fields.includes('username')) {
|
|
77
|
+
b.set('strategies.username', true);
|
|
78
|
+
put('mapped', ['passwordAuth', 'identityFields'], 'Username sign-in.', 'auth_config.strategies.username');
|
|
79
|
+
}
|
|
80
|
+
const other = fields.filter((f) => f !== 'email' && f !== 'username');
|
|
81
|
+
if (other.length)
|
|
82
|
+
put('manual', ['passwordAuth', 'identityFields'], `Sign-in by ${other.join(', ')} has no Atlas equivalent: those users sign in by email or username.`);
|
|
83
|
+
}
|
|
84
|
+
else if (typeof o.allowEmailAuth === 'boolean' || typeof o.allowUsernameAuth === 'boolean') {
|
|
85
|
+
// ≤0.22
|
|
86
|
+
const email = o.allowEmailAuth === true;
|
|
87
|
+
const username = o.allowUsernameAuth === true;
|
|
88
|
+
b.set('strategies.password', email || username);
|
|
89
|
+
if (email || username)
|
|
90
|
+
put('mapped', ['allowEmailAuth'], 'Password sign-in. Imported bcrypt hashes verify as they are and are upgraded to Argon2id.', 'auth_config.strategies.password');
|
|
91
|
+
if (username) {
|
|
92
|
+
b.set('strategies.username', true);
|
|
93
|
+
put('mapped', ['allowUsernameAuth'], 'Username sign-in.', 'auth_config.strategies.username');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const minPw = typeof o.minPasswordLength === 'number' ? o.minPasswordLength : passwordFieldMin(main);
|
|
97
|
+
if (minPw !== undefined) {
|
|
98
|
+
b.set('passwordPolicy.minLength', Math.max(8, minPw));
|
|
99
|
+
put(minPw < 8 ? 'differs' : 'mapped', typeof o.minPasswordLength === 'number' ? ['minPasswordLength'] : ['fields', 'password', 'min'], minPw < 8 ? `PocketBase allows ${minPw}; Atlas requires at least 8 (existing passwords still sign in).` : `${minPw} characters minimum.`, 'auth_config.passwordPolicy.minLength');
|
|
100
|
+
}
|
|
101
|
+
if (o.onlyVerified === true) {
|
|
102
|
+
b.set('requireEmailVerification', true);
|
|
103
|
+
put('mapped', ['onlyVerified'], 'Only verified users may sign in.', 'auth_config.requireEmailVerification');
|
|
104
|
+
}
|
|
105
|
+
if ((0, record_set_1.strs)(o.onlyEmailDomains).length)
|
|
106
|
+
put('manual', ['onlyEmailDomains'], `Sign-up limited to ${(0, record_set_1.strs)(o.onlyEmailDomains).join(', ')}: add these domains to the Atlas allowlist (restrictions.allowlistOnly).`, 'auth_config.restrictions');
|
|
107
|
+
if ((0, record_set_1.strs)(o.exceptEmailDomains).length)
|
|
108
|
+
put('manual', ['exceptEmailDomains'], `Blocked domains ${(0, record_set_1.strs)(o.exceptEmailDomains).join(', ')}: add them to the Atlas blocklist.`, 'blocklist');
|
|
109
|
+
// ── OAuth2 ──
|
|
110
|
+
const oauth = (0, record_set_1.isObj)(o.oauth2) ? o.oauth2 : undefined;
|
|
111
|
+
if (oauth?.enabled === true || o.allowOAuth2Auth === true) {
|
|
112
|
+
const providers = (0, record_set_1.objs)(oauth?.providers);
|
|
113
|
+
for (const p of providers) {
|
|
114
|
+
const pname = (0, record_set_1.str)(p.name);
|
|
115
|
+
if (!pname)
|
|
116
|
+
continue;
|
|
117
|
+
const atlas = (0, translate_kit_1.socialKey)(pname);
|
|
118
|
+
const w = where('oauth2', 'providers', pname);
|
|
119
|
+
if (atlas) {
|
|
120
|
+
b.socialProvider({ atlasKey: atlas, vendorName: pname, area: `${area} oauth2`, setting: `oauth2.providers.${pname}`, clientId: (0, record_set_1.str)(p.clientId) });
|
|
121
|
+
if (w.l)
|
|
122
|
+
Object.assign(b.report[b.report.length - 1], { file: w.f, line: w.l });
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
(0, source_lines_1.addAt)(b, w.f, w.l, 'manual', `${area} oauth2`, `oauth2.providers.${pname}`, `"${pname}" is not an Atlas built-in provider: add it as a custom OAuth/OIDC provider with the same client id${(0, record_set_1.str)(p.clientId) ? ` (${(0, record_set_1.str)(p.clientId)})` : ''} and authorization / token / userinfo URLs.`, 'custom_oauth_providers');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (!providers.length)
|
|
129
|
+
put('manual', ['allowOAuth2Auth'], 'OAuth2 is on but the providers live in the app settings (≤0.22): add each one in the Atlas dashboard with the same client id so imported links keep working.', 'oauth_providers');
|
|
130
|
+
const mapped = (0, record_set_1.isObj)(oauth?.mappedFields) ? oauth.mappedFields : undefined;
|
|
131
|
+
if (mapped && Object.values(mapped).some((v) => (0, record_set_1.str)(v)))
|
|
132
|
+
put('differs', ['oauth2', 'mappedFields'], 'PocketBase copies provider fields onto the record; Atlas fills first/last name and image from the provider profile automatically.', 'user profile');
|
|
133
|
+
}
|
|
134
|
+
// ── OTP and MFA ──
|
|
135
|
+
const otp = (0, record_set_1.isObj)(o.otp) ? o.otp : undefined;
|
|
136
|
+
if (otp?.enabled === true) {
|
|
137
|
+
b.set('strategies.emailCode', true);
|
|
138
|
+
put('mapped', ['otp', 'enabled'], 'One-time email codes become Atlas email-code sign-in.', 'auth_config.strategies.emailCode');
|
|
139
|
+
if (typeof otp.duration === 'number')
|
|
140
|
+
put('differs', ['otp', 'duration'], `Codes live ${otp.duration} s in PocketBase; set verification.emailCode.ttlMinutes (whole minutes).`, 'auth_config.verification.emailCode.ttlMinutes');
|
|
141
|
+
if (typeof otp.length === 'number' && otp.length !== 6)
|
|
142
|
+
put('differs', ['otp', 'length'], `PocketBase sends ${otp.length}-digit codes; Atlas's length is set in verification.emailCode.length.`, 'auth_config.verification.emailCode.length');
|
|
143
|
+
}
|
|
144
|
+
const mfa = (0, record_set_1.isObj)(o.mfa) ? o.mfa : undefined;
|
|
145
|
+
if (mfa?.enabled === true) {
|
|
146
|
+
b.set('mfaPolicy', (0, record_set_1.str)(mfa.rule) ? 'optional' : 'required');
|
|
147
|
+
put('differs', ['mfa', 'enabled'], `PocketBase MFA asks for a second, different sign-in method (password then OTP)${(0, record_set_1.str)(mfa.rule) ? ` when "${(0, record_set_1.str)(mfa.rule)}" matches` : ''}. Atlas MFA is an enrolled second factor (authenticator app, SMS, passkey or email code): users enrol one after the move.`, 'auth_config.mfaPolicy');
|
|
148
|
+
}
|
|
149
|
+
// ── tokens, rules, emails ──
|
|
150
|
+
const token = (0, record_set_1.isObj)(o.authToken) ? o.authToken : undefined;
|
|
151
|
+
if (typeof token?.duration === 'number' && token.duration > 0) {
|
|
152
|
+
const ms = (0, translate_kit_1.clampSessionMs)(token.duration * 1000);
|
|
153
|
+
b.set('session.absoluteMs', ms);
|
|
154
|
+
put(ms === token.duration * 1000 ? 'mapped' : 'differs', ['authToken', 'duration'], `Auth tokens last ${token.duration} s; Atlas sessions last as long (and refresh short-lived session tokens on their own). The token secret is not copied.`, 'auth_config.session.absoluteMs');
|
|
155
|
+
}
|
|
156
|
+
if ((0, record_set_1.str)(o.authRule))
|
|
157
|
+
put('manual', ['authRule'], `Sign-in is limited by the rule "${(0, record_set_1.str)(o.authRule)}": express it as an Atlas pre-sign-in action or restriction.`, 'actions');
|
|
158
|
+
if ((0, record_set_1.str)(o.manageRule))
|
|
159
|
+
put('manual', ['manageRule'], `"${(0, record_set_1.str)(o.manageRule)}" may manage other users: give those users an Atlas app role with the users:write permission.`, 'roles');
|
|
160
|
+
if ((0, record_set_1.isObj)(o.authAlert) && o.authAlert.enabled === true)
|
|
161
|
+
put('manual', ['authAlert', 'enabled'], 'New-device sign-in alerts: enable Atlas\'s new sign-in notification email (Emails).');
|
|
162
|
+
for (const tpl of ['verificationTemplate', 'resetPasswordTemplate', 'confirmEmailChangeTemplate']) {
|
|
163
|
+
if ((0, record_set_1.isObj)(o[tpl]) && (0, record_set_1.str)(o[tpl].body))
|
|
164
|
+
put('manual', [tpl], 'Custom email template: recreate it in Atlas Emails (Atlas variables differ).', 'email_templates');
|
|
165
|
+
}
|
|
166
|
+
const vars = { collection: name };
|
|
167
|
+
if (snap.url)
|
|
168
|
+
vars.url = snap.url.replace(/\/+$/, '');
|
|
169
|
+
return b.result(file?.path ?? `pocketbase collection ${name}`, {
|
|
170
|
+
bridge: { preset: 'pocketbase', vars: { ...vars } },
|
|
171
|
+
lazy: { preset: 'pocketbase', config: { ...vars } },
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/** v0.23+ keeps the minimum length on the password field. */
|
|
175
|
+
function passwordFieldMin(c) {
|
|
176
|
+
const fields = typeof c.fields === 'string' ? safeJson(c.fields) : c.fields;
|
|
177
|
+
const pw = (0, record_set_1.objs)(fields).find((f) => (0, record_set_1.str)(f.name) === 'password' && (0, record_set_1.str)(f.type) === 'password');
|
|
178
|
+
return typeof pw?.min === 'number' && pw.min > 0 ? pw.min : undefined;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=pocketbase-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pocketbase-config.js","sourceRoot":"","sources":["../../../src/migrate/export/pocketbase-config.ts"],"names":[],"mappings":"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"}
|