diff --git a/backend/dockge-server.ts b/backend/dockge-server.ts index 7aaba63..6b2bf1f 100644 --- a/backend/dockge-server.ts +++ b/backend/dockge-server.ts @@ -150,9 +150,6 @@ export class DockgeServer { } } - // Create all the necessary directories - this.initDataDir(); - // Create express this.app = express(); @@ -255,6 +252,9 @@ export class DockgeServer { * */ async serve() { + // Create all the necessary directories + this.initDataDir(); + // Connect to database try { await Database.init(this); diff --git a/extra/reset-password.ts b/extra/reset-password.ts new file mode 100644 index 0000000..8c2a2df --- /dev/null +++ b/extra/reset-password.ts @@ -0,0 +1,84 @@ +import { Database } from "../backend/database"; +import { R } from "redbean-node"; +import readline from "readline"; +import { User } from "../backend/models/user"; +import { DockgeServer } from "../backend/dockge-server"; +import { log } from "../backend/log"; + +console.log("== Dockge Reset Password Tool =="); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +export const main = async () => { + const server = new DockgeServer(); + + // Check if + + console.log("Connecting the database"); + try { + await Database.init(server); + } catch (e) { + if (e instanceof Error) { + log.error("server", "Failed to connect to your database: " + e.message); + } + process.exit(1); + } + + try { + // No need to actually reset the password for testing, just make sure no connection problem. It is ok for now. + if (!process.env.TEST_BACKEND) { + const user = await R.findOne("user"); + if (! user) { + throw new Error("user not found, have you installed?"); + } + + console.log("Found user: " + user.username); + + while (true) { + let password = await question("New Password: "); + let confirmPassword = await question("Confirm New Password: "); + + if (password === confirmPassword) { + await User.resetPassword(user.id, password); + + // Reset all sessions by reset jwt secret + await server.initJWTSecret(); + + break; + } else { + console.log("Passwords do not match, please try again."); + } + } + console.log("Password reset successfully."); + } + } catch (e) { + if (e instanceof Error) { + console.error("Error: " + e.message); + } + } + + await Database.close(); + rl.close(); + + console.log("Finished."); +}; + +/** + * Ask question of user + * @param question Question to ask + * @returns Users response + */ +function question(question : string) : Promise { + return new Promise((resolve) => { + rl.question(question, (answer) => { + resolve(answer); + }); + }); +} + +if (!process.env.TEST_BACKEND) { + main(); +} diff --git a/package.json b/package.json index 96d76fb..6959191 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "build:docker-nightly": "pnpm run build:frontend && docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:nightly --target nightly -f ./docker/Dockerfile . --push", "start-docker": "docker run --rm -p 5001:5001 --name dockge louislam/dockge:latest", "mark-as-nightly": "tsx ./extra/mark-as-nightly.ts", - "reformat-changelog": "tsx ./extra/reformat-changelog.ts" + "reformat-changelog": "tsx ./extra/reformat-changelog.ts", + "reset-password": "tsx ./extra/reset-password.ts" }, "dependencies": { "@homebridge/node-pty-prebuilt-multiarch": "~0.11.11",