80 lines
2.9 KiB
JavaScript
80 lines
2.9 KiB
JavaScript
import db from "../sql.mjs";
|
|
import lib from "../lib.mjs";
|
|
|
|
export default (router, tpl) => {
|
|
router.get(/^\/register(\/)?$/, async (req, res) => {
|
|
if (req.cookies.session) {
|
|
return res.writeHead(302, { "Location": "/" }).end();
|
|
}
|
|
res.reply({
|
|
body: tpl.render("register", { theme: req.cookies.theme ?? "f0ck" })
|
|
});
|
|
});
|
|
|
|
router.post(/^\/register(\/)?$/, async (req, res) => {
|
|
const { username, password, password_confirm, token } = req.post;
|
|
|
|
const renderError = (msg) => {
|
|
return res.reply({
|
|
body: tpl.render("register", { theme: req.cookies.theme ?? "f0ck", error: msg })
|
|
});
|
|
};
|
|
|
|
if (!username || !password || !token) return renderError("All fields are required");
|
|
if (password !== password_confirm) return renderError("Passwords do not match");
|
|
if (username.length < 3) return renderError("Username too short");
|
|
|
|
// Password complexity check
|
|
if (password.length < 20) return renderError("Password must be at least 20 characters long");
|
|
|
|
// Check token
|
|
const tokenRow = await db`
|
|
select * from invite_tokens where token = ${token} and is_used = false
|
|
`;
|
|
|
|
if (tokenRow.length === 0) {
|
|
return renderError("Invalid or used invite token");
|
|
}
|
|
|
|
// Check user existence
|
|
const existing = await db`select id from "user" where "login" = ${username.toLowerCase()}`;
|
|
if (existing.length > 0) return renderError("Username taken");
|
|
|
|
// Create User
|
|
const hash = await lib.hash(password);
|
|
const ts = ~~(Date.now() / 1e3);
|
|
|
|
// Note: Creating user. Assuming columns based on typical structure.
|
|
// Need to check 'user' table columns to be safe, but usually: login, password, user (display name), created_at, admin
|
|
// I'll assume 'user' is display name and 'login' is lowercase
|
|
|
|
const newUser = await db`
|
|
insert into "user" ("login", "password", "user", "created_at", "admin")
|
|
values (${username.toLowerCase()}, ${hash}, ${username}, to_timestamp(${ts}), false)
|
|
returning id
|
|
`;
|
|
const userId = newUser[0].id;
|
|
|
|
// Mark token used
|
|
await db`
|
|
update invite_tokens
|
|
set is_used = true, used_by = ${userId}
|
|
where id = ${tokenRow[0].id}
|
|
`;
|
|
|
|
// Get a valid avatar ID (default to 1)
|
|
const avatarRow = await db`select id from items where id = 1`;
|
|
const avatarId = avatarRow.length > 0 ? 1 : (await db`select id from items limit 1`)[0].id;
|
|
|
|
await db`
|
|
insert into user_options (user_id, mode, theme, fullscreen, avatar)
|
|
values (${userId}, 3, 'amoled', 0, ${avatarId})
|
|
`;
|
|
|
|
// Redirect to home with login success message
|
|
return res.writeHead(302, { "Location": "/?login=success" }).end();
|
|
});
|
|
|
|
return router;
|
|
};
|