Files
NexusGate/scripts/reset-password.js
T

42 lines
1.6 KiB
JavaScript

'use strict';
const fs = require('node:fs');
const { hashSecret } = require('../lib/auth');
const file = process.env.NG_DATA_FILE || '/var/lib/nexusgate/nexusgate.json';
const username = process.argv[2] || '';
const nextUsername = String(process.env.NG_NEW_USERNAME || '').trim();
const password = process.env.NG_NEW_PASSWORD || '';
if (password && password.length < 10) {
console.error('密码至少需要 10 个字符');
process.exit(1);
}
if (nextUsername && (!/^[a-zA-Z0-9_.-]{3,64}$/.test(nextUsername))) {
console.error('账号只能使用 3–64 位英文字母、数字、下划线、点或连字符');
process.exit(1);
}
const data = JSON.parse(fs.readFileSync(file, 'utf8'));
const originalStat = fs.statSync(file);
const user = username ? data.users.find((item) => item.username === username) : data.users.find((item) => item.role === 'owner' && item.status === 'active');
if (!user) {
console.error('管理员账号不存在');
process.exit(1);
}
if (!nextUsername && !password) {
console.error('账号和密码均未更改');
process.exit(1);
}
if (nextUsername && data.users.some((item) => item.id !== user.id && item.username === nextUsername)) {
console.error('账号已被使用');
process.exit(1);
}
if (nextUsername) user.username = nextUsername;
if (password) user.passwordHash = hashSecret(password);
user.updatedAt = new Date().toISOString();
const temp = `${file}.${process.pid}.tmp`;
fs.writeFileSync(temp, `${JSON.stringify(data, null, 2)}\n`, { mode: 0o600 });
fs.chownSync(temp, originalStat.uid, originalStat.gid);
fs.renameSync(temp, file);
fs.chmodSync(file, 0o600);
console.log(`已更新管理员账号:${user.username}`);