fix(auth): harden login bootstrap checks

Stabilize the bootstrap metadata test by clearing
INITIAL_PASSWORD before each run and add focused coverage
for env-backed and stored-password states.

Log settings lookup failures before returning the
bootstrap-safe fallback payload so operational errors are
still visible on the server side.
This commit is contained in:
Kfir Amar
2026-03-15 02:06:49 +02:00
parent bbf7a6b2f8
commit b0d6c15e63
2 changed files with 44 additions and 2 deletions

View File

@@ -12,6 +12,7 @@ export async function GET() {
const setupComplete = !!settings.setupComplete;
return NextResponse.json({ requireLogin, hasPassword, setupComplete });
} catch (error) {
console.error("[API] Error fetching require-login settings:", error);
return NextResponse.json(
{ requireLogin: true, hasPassword: true, setupComplete: true },
{ status: 200 }

View File

@@ -17,14 +17,18 @@ async function resetStorage() {
fs.mkdirSync(TEST_DATA_DIR, { recursive: true });
}
test.beforeEach(async () => {
delete process.env.INITIAL_PASSWORD;
await resetStorage();
});
test.after(() => {
delete process.env.INITIAL_PASSWORD;
core.resetDbInstance();
fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true });
});
test("public login bootstrap route exposes the metadata the login page consumes", async () => {
await resetStorage();
await settingsDb.updateSettings({
requireLogin: true,
setupComplete: true,
@@ -40,3 +44,40 @@ test("public login bootstrap route exposes the metadata the login page consumes"
setupComplete: true,
});
});
test("public login bootstrap route reports env-provided bootstrap password metadata", async () => {
process.env.INITIAL_PASSWORD = "bootstrap-secret";
await settingsDb.updateSettings({
requireLogin: true,
setupComplete: true,
});
const response = await route.GET();
const body = await response.json();
assert.equal(response.status, 200);
assert.deepEqual(body, {
requireLogin: true,
hasPassword: true,
setupComplete: true,
});
});
test("public login bootstrap route reports stored password metadata and disabled auth state", async () => {
await settingsDb.updateSettings({
requireLogin: false,
password: "hashed-password",
setupComplete: true,
});
const response = await route.GET();
const body = await response.json();
assert.equal(response.status, 200);
assert.deepEqual(body, {
requireLogin: false,
hasPassword: true,
setupComplete: true,
});
});