Sync public tree to bc3642c

This commit is contained in:
Michel Paulissen 2026-07-04 15:30:37 +02:00
parent 2c2dfdf8e2
commit 81942fa2ad
4 changed files with 58 additions and 8 deletions

View file

@ -1,7 +1,7 @@
{
"kind": "disasmer-filtered-public-tree",
"source_commit": "8ac74137c6035c1f9f995a2357684131483ed1e3",
"release_name": "dryrun-8ac74137c603",
"source_commit": "bc3642c6900c2551532a7e2263e822fd1c668ba8",
"release_name": "dryrun-bc3642c6900c",
"filtered_out": [
"private/**",
"experiments/**",

View file

@ -7903,6 +7903,27 @@ mod tests {
}
}
#[test]
fn cli_has_no_direct_hosted_account_creation_command() {
for args in [
&["disasmer", "signup"][..],
&["disasmer", "account", "create"],
&["disasmer", "login", "--create-account"],
] {
let error = Cli::try_parse_from(args).unwrap_err().to_string();
assert!(
error.contains("unrecognized subcommand") || error.contains("unexpected argument"),
"expected no direct account creation command for {args:?}, got {error}"
);
}
let mut command = Cli::command();
let help = command.render_help().to_string();
assert!(help.contains("Hosted account creation happens in the browser login flow."));
assert!(!help.contains("disasmer signup"));
assert!(!help.contains("account create"));
}
#[test]
fn admin_bootstrap_reports_self_hosted_cli_only_path() {
let temp = tempfile::tempdir().unwrap();

View file

@ -76,6 +76,21 @@ expect(
"hosted signup provider and password policy criteria",
/approved external identity-provider requirement[\s\S]*disasmer_native_password_signup_allowed: false/
);
expect(
criteria,
"hosted provider normalization criteria",
/Google sign-in may be treated as OIDC; GitHub sign-in is OAuth2 social login[\s\S]*normalizes Google as `google_oidc` and GitHub as `github_oauth2` from an Authentik-issued OIDC session[\s\S]*does not consume provider-specific tokens directly/
);
expect(
criteria,
"hosted CLI cannot create accounts directly",
/The CLI cannot create a hosted account directly[\s\S]*parser coverage rejects `disasmer signup`, `disasmer account create`, and `disasmer login --create-account`/
);
expect(
criteria,
"hosted safe claim failure criteria",
/If identity is ambiguous, missing required claims, unverified where required, or blocked by policy[\s\S]*exactly one approved external identity provider[\s\S]*stable subject[\s\S]*verified email/
);
expect(
criteria,
"hosted signup sanitized failure criteria",

View file

@ -2,17 +2,31 @@
const assert = require("assert");
const cp = require("child_process");
const fs = require("fs");
const os = require("os");
const path = require("path");
const repo = path.resolve(__dirname, "..");
const project = path.join(repo, "examples/launch-build-demo");
const isolatedCwd = fs.mkdtempSync(path.join(os.tmpdir(), "disasmer-cli-output-"));
function disasmer(args, env = {}) {
function disasmer(args, env = {}, cwd = repo) {
return cp.execFileSync(
"cargo",
["run", "-q", "-p", "disasmer-cli", "--bin", "disasmer", "--", ...args],
[
"run",
"-q",
"--manifest-path",
path.join(repo, "Cargo.toml"),
"-p",
"disasmer-cli",
"--bin",
"disasmer",
"--",
...args,
],
{
cwd: repo,
cwd,
encoding: "utf8",
env: {
...process.env,
@ -22,8 +36,8 @@ function disasmer(args, env = {}) {
);
}
function json(args, env) {
return JSON.parse(disasmer(args, env));
function json(args, env, cwd) {
return JSON.parse(disasmer(args, env, cwd));
}
function assertHuman(name, output, requiredPatterns) {
@ -88,7 +102,7 @@ assert(doctorJson.node_readiness_summary.next_actions.length >= 2);
const authJson = json(["auth", "status", "--json"], {
DISASMER_TOKEN: "token",
DISASMER_TOKEN_EXPIRES_AT: "2026-07-04T00:00:00Z",
});
}, isolatedCwd);
assert.strictEqual(authJson.session.kind, "human");
assert.strictEqual(authJson.session.token_expiry_posture, "expires_at");
assert.strictEqual(authJson.session.expires_at, "2026-07-04T00:00:00Z");