summaryrefslogtreecommitdiff
path: root/backend/chat-reader.cjs
diff options
context:
space:
mode:
authoraura <nw@moneybot.cc>2026-02-17 22:39:42 +0100
committeraura <nw@moneybot.cc>2026-02-17 22:39:42 +0100
commit636b0323075225c584b62719ed51e75521bb7ffb (patch)
tree61b02271b6d0695a4beffc23fb6eb062a7da22c3 /backend/chat-reader.cjs
push source
Diffstat (limited to 'backend/chat-reader.cjs')
-rw-r--r--backend/chat-reader.cjs82
1 files changed, 82 insertions, 0 deletions
diff --git a/backend/chat-reader.cjs b/backend/chat-reader.cjs
new file mode 100644
index 0000000..e30e7c9
--- /dev/null
+++ b/backend/chat-reader.cjs
@@ -0,0 +1,82 @@
+const fs = require('fs');
+const crypto = require('crypto');
+
+function jwt_secret() {
+ let file = fs.readFileSync( '../data/jwt_secret.txt', 'utf8' );
+ if( file.endsWith( '\n' ) ) {
+ file = file.slice( 0, -1 );
+ }
+
+ return file;
+}
+
+function write( content, filename ) {
+ const chatJson = content;
+
+ const salt = crypto.randomBytes( 16 );
+ const key = crypto.pbkdf2Sync( jwt_secret(), salt, 100000, 32, 'sha512' );
+ const iv = crypto.randomBytes( 12 );
+
+ const cipher = crypto.createCipheriv( 'aes-256-gcm', key, iv );
+ let encrypted = cipher.update( chatJson, 'utf8', 'hex' );
+ encrypted += cipher.final( 'hex' );
+ const authTag = cipher.getAuthTag().toString( 'hex' );
+
+ let fullStr = salt.toString( 'hex' ) + iv.toString( 'hex' ) + authTag + encrypted;
+
+ fs.writeFileSync( filename, fullStr );
+}
+
+function read( filename ) {
+ let contents = '';
+ try {
+ contents = fs.readFileSync( filename, 'utf8' );
+ } catch( e ) {
+ console.log( '0' );
+ return;
+ }
+ const salt = Buffer.from( contents.slice( 0, 32 ), 'hex' );
+ const iv = Buffer.from( contents.slice( 32, 56 ), 'hex' );
+ const authTag = Buffer.from( contents.slice( 56, 88 ), 'hex' );
+ const data = contents.slice( 88 );
+
+ const key = crypto.pbkdf2Sync( jwt_secret(), salt, 100000, 32, 'sha512' );
+ const decipher = crypto.createDecipheriv( 'aes-256-gcm', key, iv );
+ decipher.setAuthTag( authTag );
+
+ let decrypted = decipher.update( data, 'hex', 'utf8' );
+ decrypted += decipher.final( 'utf8' );
+
+ return decrypted;
+}
+
+function main() {
+ const args = process.argv.slice(2);
+ const operation = args[0];
+
+ switch( operation ) {
+ case 'read': {
+ try {
+ const data = read( args[1] );
+ console.log( JSON.parse( JSON.stringify( data ) ) );
+ } catch( e ) {
+ console.log( "0" );
+ console.log( e.message );
+ }
+ break;
+ }
+ case 'write': {
+ try {
+ const data = args[2];
+ write( data, args[1] );
+ console.log( "1" );
+ } catch( e ) {
+ console.log( "0" );
+ console.log( e.message );
+ }
+ break;
+ }
+ }
+}
+
+main();