add generate key script

This commit is contained in:
b1ek 2023-02-19 01:03:27 +10:00
parent 6ac670a25b
commit 8a4efca141
Signed by: blek
GPG Key ID: 14546221E3595D0C
5 changed files with 56 additions and 4 deletions

View File

@ -1,2 +1,4 @@
APP_PORT=8000 APP_PORT=8000
APP_DEBUG=true APP_DEBUG=true
# a 256-bit base64 encryption key
APP_KEY=TKe8lE2IdkgGBUrB4nxdq7mGMf8PK29xqOnGa3vU0PBmNXADJrVA5LKd8pg6g/YO5aFG/ESzUleo/9Hve3SAe4rvwLBejD/SKOmDR4gbaMv4PuiNi8S2sYL30aVyi1OeaSTyYsfjteumkFxFVwrsxhDCX94xvNEuTEfS4repfLo=

View File

@ -2,18 +2,20 @@ const crypto = require('crypto');
const path = require('path'); const path = require('path');
const args = require('args-parser')(process.argv); const args = require('args-parser')(process.argv);
const fs = require('fs'); const fs = require('fs');
const base64 = require('js-base64');
let key = crypto.randomBytes(256).toString('base64'); let key = crypto.randomBytes(256).toString('base64');
let dotenv = path.resolve('.env'); let dotenv = path.resolve('.env');
if (args['help']) { if (args['help']) {
console.log(path.basename(__filename) + ' [--key-only] [--env|-e] [--set-key] [--dry-run]'); console.log(path.basename(__filename) + ' [--key-only] [--env|-e] [--set-key] [--dry-run] [--stdout|-s]');
console.log('\n' + console.log('\n' +
' --help: Display this help\n' + ' --help: Display this help\n' +
' --key-only: Generate key only and put it in stdout\n' + ' --key-only: Generate key only and put it in stdout\n' +
' --env -e: Specify an env file\n' + ' --env -e: Specify an env file\n' +
' --set-key: Specify your key\n' + ' --set-key: Specify your key\n' +
' --dry-run: Don\'t write anything, just do the thing' ' --dry-run: Don\'t write anything, just do the thing\n' +
' --stdout -s: Don\'t write to file, write to stdout instead'
) )
} }
@ -41,6 +43,10 @@ for (let i = 0; i != lines.length; i++) {
const newfile = lines.join('\n'); const newfile = lines.join('\n');
const w_stdout = args['stdout'] || args['s'];
if (!args['dry-run']) { if (!args['dry-run']) {
if (w_stdout) console.log(newfile);
else
fs.writeFileSync(dotenv, newfile); fs.writeFileSync(dotenv, newfile);
} }

14
scripts/package.json Normal file
View File

@ -0,0 +1,14 @@
{
"name": "scripts",
"version": "1.0.0",
"description": "",
"main": "generate_key.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"args-parser": "^1.3.0"
}
}

View File

@ -5,6 +5,8 @@ if (process.env.APP_DEBUG) {
} }
const fs = require('fs'); const fs = require('fs');
const {Base64} = require('js-base64');
const crc32 = require('crc-32');
const hrt = () => { const hrt = () => {
let hr = process.hrtime(); let hr = process.hrtime();
@ -22,6 +24,15 @@ async function startup() {
path: dotpath path: dotpath
}); });
if (!process.env.APP_KEY) {
throw new Error('APP_KEY is not set.')
}
process.env.APP_KEY = Base64.decode(process.env.APP_KEY);
if (process.env.APP_KEY.length !== 256) {
throw new Error('APP_KEY has to be a 256-byte base64 string.');
}
console.log('Using a key with CRC32: ' + crc32.bstr(process.env.APP_KEY.toString(16)));
await require('./helpers').ViewLoader.preload(); await require('./helpers').ViewLoader.preload();
console.log('Views compiled in ' + (hrt() - t1) + ' ms'); console.log('Views compiled in ' + (hrt() - t1) + ' ms');

19
test/genkey.js Normal file
View File

@ -0,0 +1,19 @@
const test = require('unit.js');
const execSync = require('child_process').execSync;
const fs = require('fs');
const path = require('path');
describe('TestS generate key script', () => {
it('Check if key is generated properly', () => {
const stdout = execSync('node ./scripts/generate_key.js --key-only').toString('utf-8');
const key = Buffer.from(stdout, 'base64');
test.number(key.length).is(256);
});
it('Check if file is edited properly', () => {
const stdout = execSync('node ./scripts/generate_key.js -s').toString('utf-8');
const file = fs.readFileSync(path.resolve('.env'));
test.string(stdout).isNot(file);
});
});