Save worktree changes

This commit is contained in:
2026-07-25 02:29:19 +01:00
parent 8d3b7d557b
commit db9d718cd8
170 changed files with 11719 additions and 3414 deletions
+58
View File
@@ -0,0 +1,58 @@
module.exports = function registerAuthRoutes(app, deps) {
const pool = deps.pool;
const pages = deps.pages;
const createUserSession = deps.createUserSession;
const setSessionCookie = deps.setSessionCookie;
const clearSessionCookie = deps.clearSessionCookie;
const parseCookies = deps.parseCookies;
const hashSessionToken = deps.hashSessionToken;
const verifyPassword = deps.verifyPassword;
const sessionCookieName = deps.sessionCookieName;
app.get('/', function (req, res) {
res.redirect(req.currentUser ? '/dashboard' : '/login');
});
app.get('/login', function (req, res) {
if (req.currentUser) {
return res.redirect('/dashboard');
}
res.send(pages.renderLoginPage(req.query.message ? String(req.query.message) : ''));
});
app.post('/login', async function (req, res, next) {
try {
const username = String(req.body.username || '').trim();
const password = String(req.body.password || '');
if (!username || !password) {
return res.status(400).send('Username and password are required.');
}
const [rows] = await pool.query('SELECT id, name, username, password_hash, password_salt, password_iterations FROM users WHERE username = ? LIMIT 1', [username]);
const user = rows[0] || null;
if (!user || !verifyPassword(password, user)) {
return res.redirect('/login?message=' + encodeURIComponent('Invalid username or password.'));
}
const token = await createUserSession(pool, user.id);
setSessionCookie(res, token);
res.redirect('/dashboard');
} catch (error) {
next(error);
}
});
app.get('/logout', async function (req, res, next) {
try {
const cookies = parseCookies(req.headers.cookie || '');
const token = cookies[sessionCookieName];
if (token) {
await pool.query('DELETE FROM auth_sessions WHERE session_hash = ?', [hashSessionToken(token)]);
}
clearSessionCookie(res);
res.redirect('/login?message=' + encodeURIComponent('You have been signed out.'));
} catch (error) {
next(error);
}
});
};
+1 -1
View File
@@ -1,7 +1,7 @@
const { renderView } = require('../../view');
module.exports = function renderLoginPage(message) {
return renderView('login', {
return renderView('auth/login', {
title: 'Sign in',
authShell: true,
bodyClass: 'login-page-body',