From 669199137ed401327c9c601fffaa254bb85a4fd4 Mon Sep 17 00:00:00 2001 From: Lncvrt Date: Mon, 21 Jul 2025 20:04:21 -0700 Subject: [PATCH] Config system --- src-tauri/capabilities/default.json | 2 + src/enums/Keys.ts | 3 +- src/types/NormalConfig.ts | 14 ++++++ src/types/SettingsType.ts | 6 +++ src/util/BazookaManager.ts | 70 +++++++++++++++++++++++++++++ src/util/Encryption.ts | 8 ++-- 6 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 src/types/NormalConfig.ts create mode 100644 src/types/SettingsType.ts create mode 100644 src/util/BazookaManager.ts diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index ae584e4..967ef86 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -21,6 +21,8 @@ "core:window:allow-toggle-maximize", "decorum:allow-show-snap-overlay", "fs:default", + "fs:allow-applocaldata-read", + "fs:allow-applocaldata-write", "dialog:default" ] } \ No newline at end of file diff --git a/src/enums/Keys.ts b/src/enums/Keys.ts index 0a5d523..4718f11 100644 --- a/src/enums/Keys.ts +++ b/src/enums/Keys.ts @@ -1,4 +1,5 @@ export enum Keys { SERVER_RECEIVE_TRANSFER_KEY = '', - SERVER_SEND_TRANSFER_KEY = '' + SERVER_SEND_TRANSFER_KEY = '', + CONFIG_ENCRYPTION_KEY = '' } diff --git a/src/types/NormalConfig.ts b/src/types/NormalConfig.ts new file mode 100644 index 0000000..3a4aef4 --- /dev/null +++ b/src/types/NormalConfig.ts @@ -0,0 +1,14 @@ +import { SettingsType } from './SettingsType' + +export class NormalConfig { + constructor ( + public version: string, + public settings: SettingsType = new SettingsType() + ) {} + + static import (data: any) { + const cfg = new NormalConfig(data.version) + Object.assign(cfg.settings, data.settings) + return cfg + } +} diff --git a/src/types/SettingsType.ts b/src/types/SettingsType.ts new file mode 100644 index 0000000..b115637 --- /dev/null +++ b/src/types/SettingsType.ts @@ -0,0 +1,6 @@ +export class SettingsType { + constructor ( + public checkForNewVersionOnLoad: boolean = true, + public useWineOnUnixWhenNeeded: boolean = false + ) {} +} diff --git a/src/util/BazookaManager.ts b/src/util/BazookaManager.ts new file mode 100644 index 0000000..deae6dd --- /dev/null +++ b/src/util/BazookaManager.ts @@ -0,0 +1,70 @@ +import { app } from '@tauri-apps/api' +import { NormalConfig } from '../types/NormalConfig' +import { + BaseDirectory, + create, + exists, + mkdir, + readTextFile, + writeFile, + writeTextFile +} from '@tauri-apps/plugin-fs' +import { decrypt, encrypt } from './Encryption' +import { Keys } from '../enums/Keys' + +export async function readConfig (): Promise { + const version = await app.getVersion() + const options = { + baseDir: BaseDirectory.AppLocalData + } + const doesFolderExist = await exists('', options) + const doesConfigExist = await exists('config.dat', options) + if (!doesFolderExist || !doesConfigExist) { + if (!doesFolderExist) { + await mkdir('', options) + } + const file = await create('config.dat', options) + await file.write( + new TextEncoder().encode( + encrypt( + JSON.stringify(new NormalConfig(version)), + Keys.CONFIG_ENCRYPTION_KEY + ) + ) + ) + await file.close() + return new NormalConfig(version) + } + const config = await readTextFile('config.dat', options) + return NormalConfig.import( + JSON.parse(decrypt(config, Keys.CONFIG_ENCRYPTION_KEY)) + ) +} + +export async function writeConfig (data: NormalConfig) { + const options = { + baseDir: BaseDirectory.AppLocalData + } + const doesFolderExist = await exists('', options) + const doesConfigExist = await exists('config.dat', options) + if (!doesFolderExist || !doesConfigExist) { + if (!doesFolderExist) { + await mkdir('', options) + } + const file = await create('config.dat', options) + await file.write( + new TextEncoder().encode( + encrypt(JSON.stringify(data), Keys.CONFIG_ENCRYPTION_KEY) + ) + ) + await file.close() + } else { + await writeFile( + 'config.dat', + new TextEncoder().encode( + encrypt(JSON.stringify(data), Keys.CONFIG_ENCRYPTION_KEY) + ), + options + ) + } +} diff --git a/src/util/Encryption.ts b/src/util/Encryption.ts index 27b13ed..0a8e325 100644 --- a/src/util/Encryption.ts +++ b/src/util/Encryption.ts @@ -1,11 +1,11 @@ import CryptoJS from 'crypto-js' import { Keys } from '../enums/Keys' -export function encrypt (plainText: string): string { +export function encrypt (plainText: string, key: string = Keys.SERVER_SEND_TRANSFER_KEY): string { const iv = CryptoJS.lib.WordArray.random(16) const encrypted = CryptoJS.AES.encrypt( plainText, - CryptoJS.enc.Utf8.parse(Keys.SERVER_SEND_TRANSFER_KEY), + CryptoJS.enc.Utf8.parse(key), { iv, mode: CryptoJS.mode.CBC, @@ -16,7 +16,7 @@ export function encrypt (plainText: string): string { return CryptoJS.enc.Base64.stringify(combined) } -export function decrypt (dataB64: string): string { +export function decrypt (dataB64: string, key: string = Keys.SERVER_RECEIVE_TRANSFER_KEY): string { const data = CryptoJS.enc.Base64.parse(dataB64) const iv = CryptoJS.lib.WordArray.create(data.words.slice(0, 4), 16) const ciphertext = CryptoJS.lib.WordArray.create( @@ -27,7 +27,7 @@ export function decrypt (dataB64: string): string { const decrypted = CryptoJS.AES.decrypt( cipherParams, - CryptoJS.enc.Utf8.parse(Keys.SERVER_RECEIVE_TRANSFER_KEY), + CryptoJS.enc.Utf8.parse(key), { iv, mode: CryptoJS.mode.CBC,