From 34927df20f6aba26f3c22713d85b888540c4b470 Mon Sep 17 00:00:00 2001 From: Levi Yan Date: Thu, 17 Oct 2024 12:15:32 +0800 Subject: [PATCH] feat: ssh default public/key related operation * if default private/public key exist * get default private/public key or their path * create new default SSH key --- src/utils.ts | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/utils.ts b/src/utils.ts index 1c9486d..74ea736 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,6 +1,13 @@ import { exec } from 'child_process'; import * as http from 'http'; import * as https from 'https'; +import * as fs from 'fs'; +import * as path from 'path'; +import * as os from 'os'; +import { BlobOptions } from 'buffer'; +const { + generateKeyPairSync, +} = require('node:crypto') export function fetch(url: string): Promise { // determine the library to use (based on the url protocol) @@ -52,3 +59,63 @@ export function getVsCodeCommitId(): Promise { }); }) } + +export function getDefaultPrivateKeyPath() : string{ + return path.join(os.homedir(), '.ssh', 'id_rsa') +} + +export function getDefaultPublicKeyPath() :string{ + return path.join(os.homedir(), '.ssh', 'id_rsa.pub') +} + +export function existDefaultPublicKey() :boolean{ + const defaultPublicKeyPath = getDefaultPublicKeyPath(); + return fs.existsSync(defaultPublicKeyPath) +} + +export function existDefaultPrivateKey() :boolean{ + const defaultPrivateKeyPath = getDefaultPrivateKeyPath(); + return fs.existsSync(defaultPrivateKeyPath) +} + +export function getDefaultPublicKey(): string { + const defaultPublicKeyPath = getDefaultPublicKey(); + return fs.readFileSync(defaultPublicKeyPath, 'utf-8'); + +} + +export function getDefaultPrivateKey(): string { + const defaultPrivateKey = getDefaultPrivateKeyPath(); + return fs.readFileSync(defaultPrivateKey, 'utf-8'); +} + +export function createSSHKey() { + if (!existDefaultPublicKey() || existDefaultPrivateKey()) { + // if public or private key exists, stop + return; + } + + const { + publicKey, + privateKey, + } = generateKeyPairSync('rsa', { + modulusLength: 4096, + publicKeyEncoding: { + type: 'spki', + format: 'pem', + }, + privateKeyEncoding: { + type: 'pkcs8', + format: 'pem', + cipher: 'aes-256-cbc', + passphrase: 'devstar' + }, + }); + + try { + fs.writeFileSync(getDefaultPublicKeyPath(), publicKey); + fs.writeFileSync(getDefaultPrivateKeyPath(), privateKey); + } catch(error) { + console.error("Failed to write public/private key into the default ssh public/key file: ", error); + } +} \ No newline at end of file