From 03b2993b56f0b01149712eb8cfe98abeae7a4cb0 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Mon, 14 Oct 2024 11:23:25 +0800 Subject: [PATCH] feat: load or create key --- server/src/config.ts | 17 ++++++++++++++--- server/src/utils/crypto.ts | 21 ++++++++++++++++++++- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/server/src/config.ts b/server/src/config.ts index e5a4721..a16399d 100644 --- a/server/src/config.ts +++ b/server/src/config.ts @@ -3,6 +3,7 @@ import dotenv from 'dotenv' import { fileURLToPath } from 'node:url' import path from 'path' import { get } from './utils/env.js' +import { loadOrCreateKeyPair } from './utils/crypto.js' // Import dotenv and load ../.env dotenv.config({ path: '../.env' }) @@ -35,6 +36,13 @@ function createConfig() { const port = Number(get('PORT', 3000)) const baseUrl = get('BASE_URL', `http://${host}:${port}`) const url = new URL(baseUrl) + const projectRoot = getProjectRoot() + const keypairPath = get( + 'KEYPAIR_PATH', + path.join(projectRoot, 'config', 'ssh_key') + ) + const keypair = loadOrCreateKeyPair(keypairPath) + return { host, port, @@ -60,17 +68,19 @@ function createConfig() { surveyUrl: getUrl('SURVEY_URL'), bugReportUrl: getUrl('BUG_REPORT_URL'), + projectRoot, + docker: { network: get('DOCKER_NETWORK', 'linux-odyssey-players'), defaultImage: get('QUEST_IMAGE', 'linuxodyssey/quest-base'), imagePrefix: get('DOCKER_PREFIX', 'linuxodyssey/quest-'), mountQuest: process.env.MOUNT_QUEST === 'true', + keypairPath, + keypair, }, - projectRoot: getProjectRoot(), - log: { - path: get('LOG_PATH', path.join(getProjectRoot(), 'logs')), + path: get('LOG_PATH', path.join(projectRoot, 'logs')), }, testing: { enabled: !isProduction && process.env.TESTING === 'true', @@ -87,6 +97,7 @@ function getProjectRoot(): string { } const config = createConfig() +console.log(config.docker.keypair) export function getQuestImage(id: string): string { return `${config.docker.imagePrefix}${id}` diff --git a/server/src/utils/crypto.ts b/server/src/utils/crypto.ts index ed452e8..fbe948c 100644 --- a/server/src/utils/crypto.ts +++ b/server/src/utils/crypto.ts @@ -1,3 +1,4 @@ +import fs from 'fs' import { generateKeyPairSync } from 'crypto' type KeyPair = { @@ -5,8 +6,26 @@ type KeyPair = { publicKey: string } +export function loadOrCreateKeyPair(privateKeyPath: string): KeyPair { + const publicKeyPath = `${privateKeyPath}.pub` + if (fs.existsSync(privateKeyPath) && fs.existsSync(publicKeyPath)) { + const privateKey = fs.readFileSync(privateKeyPath, 'utf8') + const publicKey = fs.readFileSync(publicKeyPath, 'utf8') + return { privateKey, publicKey } + } + const keyPair = generateKeyPair() + fs.writeFileSync(privateKeyPath, keyPair.privateKey, { + mode: 0o600, + }) + fs.writeFileSync(publicKeyPath, keyPair.publicKey, { + mode: 0o600, + }) + return keyPair +} + export function generateKeyPair(): KeyPair { - const { privateKey, publicKey } = generateKeyPairSync('ed25519', { + const { privateKey, publicKey } = generateKeyPairSync('rsa', { + modulusLength: 2048, publicKeyEncoding: { type: 'spki', format: 'pem',