Files
HookPilot/server/src/cli.ts
T
2026-09-27 20:09:10 +08:00

43 lines
1.5 KiB
TypeScript

import './warnings.js';
import fs from 'node:fs';
import { deleteOtherSessions, getAdmin, MIN_PASSWORD_LENGTH, setAdminCredentials } from './auth/admin.js';
import { config, dataPath } from './config.js';
import { Db } from './db.js';
import { randomToken } from './util/crypto.js';
const USAGE = `用法:
node dist/cli.js reset-password [用户名]
重置管理员密码并使所有登录会话失效。
新密码取自环境变量 HOOKPILOT_NEW_PASSWORD,未设置时随机生成并输出。`;
async function resetPassword(username: string | undefined): Promise<void> {
fs.mkdirSync(config.dataDir, { recursive: true, mode: 0o700 });
const db = new Db(dataPath('hookpilot.db'));
try {
const provided = process.env.HOOKPILOT_NEW_PASSWORD;
if (provided !== undefined && provided.length < MIN_PASSWORD_LENGTH) {
throw new Error(`HOOKPILOT_NEW_PASSWORD 至少需要 ${MIN_PASSWORD_LENGTH} 个字符`);
}
const password = provided ?? randomToken(12);
const name = username ?? getAdmin(db)?.username ?? config.initialAdminUser;
await setAdminCredentials(db, name, password);
deleteOtherSessions(db, null);
console.log(`管理员 ${name} 的密码已重置。`);
if (!provided) console.log(`新密码:${password}`);
} finally {
db.close();
}
}
const [command, arg] = process.argv.slice(2);
if (command === 'reset-password') {
resetPassword(arg).catch((err) => {
console.error(err instanceof Error ? err.message : err);
process.exit(1);
});
} else {
console.log(USAGE);
process.exit(command ? 1 : 0);
}