From 40bf3e64fd2eb2f38b4ec302f79fe658fedd8608 Mon Sep 17 00:00:00 2001 From: April Hall Date: Mon, 24 Feb 2025 10:53:59 -0500 Subject: [PATCH] feat: Customizable auth for DB and S3 --- TODO.md | 9 +++------ bun.lockb | Bin 238519 -> 238868 bytes compose.yaml | 20 ++++++++++++-------- package.json | 5 +++-- src/lib/server/db/index.ts | 7 ++++++- src/lib/server/storage/minio-client.ts | 6 ++++++ 6 files changed, 30 insertions(+), 17 deletions(-) diff --git a/TODO.md b/TODO.md index 8d8cd56..b6b309b 100644 --- a/TODO.md +++ b/TODO.md @@ -16,12 +16,9 @@ A more complex version of this list is available [here](https://trello.com/b/kJw - [ ] Message context menus - [ ] Message Timestamps - [x] Markdown Support -- [ ] More Secure database passwords - - [ ] Minio - - [ ] Cassandra - - Ideas: - - User-controllable - - Randomly generated on each run +- [x] More Secure database passwords + - [x] Minio + - [x] Cassandra - [x] Profile photos - [ ] Reactive channels list - [ ] Replies diff --git a/bun.lockb b/bun.lockb index 21d50e63d6d7ef076b9763bb563cb89655c9d0a2..a5327e7a3f9f8d71cba93b06cf10318aaff03735 100755 GIT binary patch delta 22530 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 8`#W^adJLdeO86 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 diff --git a/compose.yaml b/compose.yaml index 4b244e5..3ef42e9 100644 --- a/compose.yaml +++ b/compose.yaml @@ -3,8 +3,12 @@ services: container_name: svchat-server image: ghcr.io/arithefirst/svchat environment: - NODE_ENV: docker_production - ORIGIN: http://localhost:3000 + - NODE_ENV=docker_production + - ORIGIN=http://localhost:3000 + - CASSANDRA_USER=admin + - CASSANDRA_PASSWORD=admin + - MINIO_ROOT_USER=minioadmin + - MINIO_ROOT_PASSWORD=minioadmin ports: - 3000:3000 depends_on: @@ -19,9 +23,9 @@ services: ports: - 9042:9042 environment: - # TODO Change default passwords - - CASSANDRA_USER: admin - - CASSANDRA_PASSWORD: admin + # CHANGEME + - CASSANDRA_USER=admin + - CASSANDRA_PASSWORD=admin volumes: - svchat-cassandra:/var/lib/cassandra @@ -33,9 +37,9 @@ services: - 9000:9000 - 9001:9001 environment: - # TODO Change default passwords - - MINIO_ROOT_USER: minioadmin - - MINIO_ROOT_PASSWORD: minioadmin + # CHANGEME + - MINIO_ROOT_USER=minioadmin + - MINIO_ROOT_PASSWORD=minioadmin volumes: - svchat-s3:/data diff --git a/package.json b/package.json index 31a0c7c..daae4d4 100644 --- a/package.json +++ b/package.json @@ -37,16 +37,17 @@ "typescript-eslint": "^8.20.0" }, "dependencies": { - "autoprefixer": "^10.4.20", "@sveltejs/adapter-node": "^5.2.12", "@tailwindcss/typography": "^0.5.16", "@types/better-sqlite3": "^7.6.12", "@types/express": "^5.0.0", "@types/minio": "^7.1.1", + "autoprefixer": "^10.4.20", "better-auth": "^1.1.16", "better-sqlite3": "^11.8.1", "bits-ui": "0.22.0", "cassandra-driver": "^4.7.2", + "dotenv": "^16.4.7", "express": "^4.21.2", "lucide-svelte": "^0.474.0", "markdown-it": "^14.1.0", @@ -57,9 +58,9 @@ "socket.io-client": "^4.8.1", "svelte-radix": "^2.0.1", "sveltekit-superforms": "^2.23.1", - "tailwindcss": "^3.4.17", "tailwind-merge": "^3.0.1", "tailwind-variants": "^0.3.1", + "tailwindcss": "^3.4.17", "tsm": "^2.3.0", "uuid": "^11.0.4", "vite": "^6.0.0", diff --git a/src/lib/server/db/index.ts b/src/lib/server/db/index.ts index 5b6eb5d..f01b7a7 100644 --- a/src/lib/server/db/index.ts +++ b/src/lib/server/db/index.ts @@ -1,4 +1,5 @@ import cassandra from 'cassandra-driver'; +import 'dotenv/config'; interface Messages { messages: cassandra.types.Row[] | null; @@ -22,11 +23,15 @@ class Db { private client: cassandra.Client = new cassandra.Client({ contactPoints: [this.clientUrl], localDataCenter: 'datacenter1', - authProvider: new cassandra.auth.PlainTextAuthProvider('admin', 'admin'), + authProvider: new cassandra.auth.PlainTextAuthProvider(process.env.CASSANDRA_USER!, process.env.CASSANDRA_PASSWORD!), }); // Initalize and connect async init() { + if (!process.env.CASSANDRA_USER || !process.env.CASSANDRA_PASSWORD) { + console.error('Missing Cassandra username or password. Exiting.'); + process.exit(1); + } while (true) { try { await this.client.connect(); diff --git a/src/lib/server/storage/minio-client.ts b/src/lib/server/storage/minio-client.ts index 6721151..2adad8f 100644 --- a/src/lib/server/storage/minio-client.ts +++ b/src/lib/server/storage/minio-client.ts @@ -1,3 +1,4 @@ +import 'dotenv/config'; import * as Minio from 'minio'; import { Readable } from 'stream'; import { v4 } from 'uuid'; @@ -70,6 +71,11 @@ class MinioClient { let fsClient: MinioClient | undefined; if (process.env.BUILDING !== 'true') { + if (!process.env.MINIO_ROOT_USER || !process.env.MINIO_ROOT_PASSWORD) { + console.error('Missing Minio username or password. Exiting.'); + process.exit(1); + } + fsClient = new MinioClient({ // Endpoint is 'minio' in compose, 'localhost' everywhere else endPoint: process.env.NODE_ENV === 'docker_production' ? 'minio' : 'localhost',