32 lines
1.1 KiB
JavaScript
32 lines
1.1 KiB
JavaScript
/** 首次安装生成独立密钥;覆盖升级不改变已有配置。 */
|
|||
|
|
const fs = require('node:fs');
|
||
|
|
const path = require('node:path');
|
||
|
|
const crypto = require('node:crypto');
|
||
|
|
const MARKER = 'CLASSHELPER_GENERATE_SECRET_ON_INSTALL';
|
||
|
|
function initialiseEnvironment(file = path.join(__dirname, '.env')) {
|
||
|
|
const content = fs.readFileSync(file, 'utf8');
|
||
|
|
const line = /^JWT_SECRET=CLASSHELPER_GENERATE_SECRET_ON_INSTALL\r?$/m;
|
||
|
|
if (!line.test(content)) return false;
|
||
|
|
const value = crypto.randomBytes(48).toString('hex');
|
||
|
|
const temporary = file + '.initialising-' + crypto.randomUUID();
|
||
|
|
try {
|
||
|
|
fs.writeFileSync(temporary, content.replace(line, 'JWT_SECRET=' + value), {
|
||
|
|
encoding: 'utf8',
|
||
|
|
mode: 0o600,
|
||
|
|
flag: 'wx',
|
||
|
|
});
|
||
|
|
fs.renameSync(temporary, file);
|
||
|
|
} finally {
|
||
|
|
fs.rmSync(temporary, { force: true });
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
module.exports = { initialiseEnvironment, MARKER };
|
||
|
|
if (require.main === module) {
|
||
|
|
try {
|
||
|
|
initialiseEnvironment();
|
||
|
|
} catch (error) {
|
||
|
|
console.error('服务端配置初始化失败:' + error.message);
|
||
|
|
process.exitCode = 1;
|
||
|
|
}
|
||
|
|
}
|