@stoker-platform/cli 0.5.131 → 0.5.132
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/lib/package.json +3 -3
- package/lib/src/main.js +8 -0
- package/lib/src/ops/mfaStatus.js +57 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/lib/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stoker-platform/cli",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.131",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"main": "./lib/src/main.js",
|
|
@@ -24,9 +24,9 @@
|
|
|
24
24
|
"@google-cloud/secret-manager": "^6.1.2",
|
|
25
25
|
"@google-cloud/storage": "^7.19.0",
|
|
26
26
|
"@inquirer/prompts": "^8.5.2",
|
|
27
|
-
"@stoker-platform/node-client": "0.5.
|
|
27
|
+
"@stoker-platform/node-client": "0.5.84",
|
|
28
28
|
"@stoker-platform/types": "0.5.62",
|
|
29
|
-
"@stoker-platform/utils": "0.5.
|
|
29
|
+
"@stoker-platform/utils": "0.5.75",
|
|
30
30
|
"algoliasearch": "^5.53.0",
|
|
31
31
|
"commander": "^15.0.0",
|
|
32
32
|
"cross-spawn": "^7.0.6",
|
package/lib/src/main.js
CHANGED
|
@@ -73,6 +73,7 @@ import { setUserRole } from "./ops/setUserRole.js";
|
|
|
73
73
|
import { setUserCollection } from "./ops/setUserCollection.js";
|
|
74
74
|
import { setUserDocument } from "./ops/setUserDocument.js";
|
|
75
75
|
import { getUser } from "./ops/getUser.js";
|
|
76
|
+
import { mfaStatus } from "./ops/mfaStatus.js";
|
|
76
77
|
import { getUserRecord } from "./ops/getUserRecord.js";
|
|
77
78
|
import { getUserPermissions } from "./ops/getUserPermissions.js";
|
|
78
79
|
import { auditPermissions } from "./ops/auditPermissions.js";
|
|
@@ -421,6 +422,13 @@ program
|
|
|
421
422
|
.action((options) => {
|
|
422
423
|
getUser(options);
|
|
423
424
|
});
|
|
425
|
+
program
|
|
426
|
+
.command("mfa-status")
|
|
427
|
+
.description("list user MFA statuses")
|
|
428
|
+
.option("-s, --status <status>", "filter by enabled / disabled")
|
|
429
|
+
.action((options) => {
|
|
430
|
+
mfaStatus(options);
|
|
431
|
+
});
|
|
424
432
|
program
|
|
425
433
|
.command("get-user-record")
|
|
426
434
|
.description("retrieve a Firestore user record")
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { initializeFirebase } from "@stoker-platform/node-client";
|
|
2
|
+
import { getAuth } from "firebase-admin/auth";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { pathToFileURL } from "url";
|
|
5
|
+
const roleRequiresMfa = (enableMultiFactorAuth, role) => {
|
|
6
|
+
if (enableMultiFactorAuth === true)
|
|
7
|
+
return true;
|
|
8
|
+
if (enableMultiFactorAuth === false)
|
|
9
|
+
return false;
|
|
10
|
+
return !!role && enableMultiFactorAuth.includes(role);
|
|
11
|
+
};
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
+
export const mfaStatus = async (options) => {
|
|
14
|
+
const statusFilter = options.status;
|
|
15
|
+
if (statusFilter && statusFilter !== "enabled" && statusFilter !== "disabled") {
|
|
16
|
+
console.error('Invalid status. Use "enabled" or "disabled".');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const path = join(process.cwd(), "lib", "main.js");
|
|
20
|
+
const url = pathToFileURL(path).href;
|
|
21
|
+
const globalConfigFile = await import(url);
|
|
22
|
+
const globalConfig = globalConfigFile.default({ sdk: "node" });
|
|
23
|
+
const enableMultiFactorAuth = globalConfig.auth.enableMultiFactorAuth;
|
|
24
|
+
await initializeFirebase();
|
|
25
|
+
const auth = getAuth();
|
|
26
|
+
const results = [];
|
|
27
|
+
let pageToken;
|
|
28
|
+
do {
|
|
29
|
+
const list = await auth.listUsers(1000, pageToken);
|
|
30
|
+
for (const user of list.users) {
|
|
31
|
+
const role = user.customClaims?.role;
|
|
32
|
+
if (!roleRequiresMfa(enableMultiFactorAuth, role))
|
|
33
|
+
continue;
|
|
34
|
+
const factors = user.multiFactor?.enrolledFactors ?? [];
|
|
35
|
+
const mfaEnabled = factors.length > 0;
|
|
36
|
+
if (statusFilter === "enabled" && !mfaEnabled)
|
|
37
|
+
continue;
|
|
38
|
+
if (statusFilter === "disabled" && mfaEnabled)
|
|
39
|
+
continue;
|
|
40
|
+
results.push({
|
|
41
|
+
uid: user.uid,
|
|
42
|
+
email: user.email ?? null,
|
|
43
|
+
mfaEnabled,
|
|
44
|
+
enrolledFactors: factors.map((factor) => factor.factorId),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
pageToken = list.pageToken;
|
|
48
|
+
} while (pageToken);
|
|
49
|
+
const lines = results.map((user) => {
|
|
50
|
+
const email = user.email ?? "(no email)";
|
|
51
|
+
const status = user.mfaEnabled ? "enabled" : "DISABLED";
|
|
52
|
+
const factors = user.enrolledFactors.length > 0 ? ` [${user.enrolledFactors.join(", ")}]` : "";
|
|
53
|
+
return `${email} (${user.uid}): ${status}${factors}`;
|
|
54
|
+
});
|
|
55
|
+
console.log(lines.join("\n"));
|
|
56
|
+
process.exit();
|
|
57
|
+
};
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/main.ts","../src/data/exporttobigquery.ts","../src/data/seeddata.ts","../src/deploy/deployproject.ts","../src/deploy/cloud-functions/getfunctionsdata.ts","../src/deploy/firestore-export/exportfirestoredata.ts","../src/deploy/firestore-ttl/deployttls.ts","../src/deploy/live-update/liveupdate.ts","../src/deploy/maintenance/activatemaintenancemode.ts","../src/deploy/maintenance/disablemaintenancemode.ts","../src/deploy/maintenance/setdeploymentstatus.ts","../src/deploy/rules-indexes/generatefirestoreindexes.ts","../src/deploy/rules-indexes/generatefirestorerules.ts","../src/deploy/rules-indexes/generatestoragerules.ts","../src/deploy/schema/applyschema.ts","../src/deploy/schema/generateschema.ts","../src/deploy/schema/persistschema.ts","../src/deploy/schema/updateliveschema.ts","../src/lint/lintschema.ts","../src/lint/securityreport.ts","../src/migration/migrateall.ts","../src/migration/firestore/migratefirestore.ts","../src/migration/firestore/operations/deletefield.ts","../src/ops/auditdenormalized.ts","../src/ops/auditpermissions.ts","../src/ops/auditrelations.ts","../src/ops/explainpreloadqueries.ts","../src/ops/getuser.ts","../src/ops/getuserpermissions.ts","../src/ops/getuserrecord.ts","../src/ops/listprojects.ts","../src/ops/setusercollection.ts","../src/ops/setuserdocument.ts","../src/ops/setuserrole.ts","../src/project/addproject.ts","../src/project/addrecord.ts","../src/project/addrecordprompt.ts","../src/project/addtenant.ts","../src/project/buildwebapp.ts","../src/project/customdomain.ts","../src/project/deleteproject.ts","../src/project/deleterecord.ts","../src/project/deletetenant.ts","../src/project/getone.ts","../src/project/getsome.ts","../src/project/initproject.ts","../src/project/prepareemulatordata.ts","../src/project/setproject.ts","../src/project/startemulators.ts","../src/project/updaterecord.ts","../src/types/generatetypes.ts"],"version":"6.0.3"}
|
|
1
|
+
{"root":["../src/main.ts","../src/data/exporttobigquery.ts","../src/data/seeddata.ts","../src/deploy/deployproject.ts","../src/deploy/cloud-functions/getfunctionsdata.ts","../src/deploy/firestore-export/exportfirestoredata.ts","../src/deploy/firestore-ttl/deployttls.ts","../src/deploy/live-update/liveupdate.ts","../src/deploy/maintenance/activatemaintenancemode.ts","../src/deploy/maintenance/disablemaintenancemode.ts","../src/deploy/maintenance/setdeploymentstatus.ts","../src/deploy/rules-indexes/generatefirestoreindexes.ts","../src/deploy/rules-indexes/generatefirestorerules.ts","../src/deploy/rules-indexes/generatestoragerules.ts","../src/deploy/schema/applyschema.ts","../src/deploy/schema/generateschema.ts","../src/deploy/schema/persistschema.ts","../src/deploy/schema/updateliveschema.ts","../src/lint/lintschema.ts","../src/lint/securityreport.ts","../src/migration/migrateall.ts","../src/migration/firestore/migratefirestore.ts","../src/migration/firestore/operations/deletefield.ts","../src/ops/auditdenormalized.ts","../src/ops/auditpermissions.ts","../src/ops/auditrelations.ts","../src/ops/explainpreloadqueries.ts","../src/ops/getuser.ts","../src/ops/getuserpermissions.ts","../src/ops/getuserrecord.ts","../src/ops/listprojects.ts","../src/ops/mfastatus.ts","../src/ops/setusercollection.ts","../src/ops/setuserdocument.ts","../src/ops/setuserrole.ts","../src/project/addproject.ts","../src/project/addrecord.ts","../src/project/addrecordprompt.ts","../src/project/addtenant.ts","../src/project/buildwebapp.ts","../src/project/customdomain.ts","../src/project/deleteproject.ts","../src/project/deleterecord.ts","../src/project/deletetenant.ts","../src/project/getone.ts","../src/project/getsome.ts","../src/project/initproject.ts","../src/project/prepareemulatordata.ts","../src/project/setproject.ts","../src/project/startemulators.ts","../src/project/updaterecord.ts","../src/types/generatetypes.ts"],"version":"6.0.3"}
|