105 lines
2.9 KiB
JavaScript
105 lines
2.9 KiB
JavaScript
import bcrypt from 'bcryptjs';
|
|
import jwt from 'jsonwebtoken';
|
|
import { promises } from 'fs';
|
|
import path from 'path';
|
|
|
|
const JWT_SECRET = process.env.JWT_SECRET || "harheimertc-secret-key-change-in-production";
|
|
const getDataPath = (filename) => {
|
|
const cwd = process.cwd();
|
|
if (cwd.endsWith(".output")) {
|
|
return path.join(cwd, "../server/data", filename);
|
|
}
|
|
return path.join(cwd, "server/data", filename);
|
|
};
|
|
const USERS_FILE = getDataPath("users.json");
|
|
const SESSIONS_FILE = getDataPath("sessions.json");
|
|
async function readUsers() {
|
|
try {
|
|
const data = await promises.readFile(USERS_FILE, "utf-8");
|
|
return JSON.parse(data);
|
|
} catch (error) {
|
|
console.error("Fehler beim Lesen der Benutzerdaten:", error);
|
|
return [];
|
|
}
|
|
}
|
|
async function writeUsers(users) {
|
|
try {
|
|
await promises.writeFile(USERS_FILE, JSON.stringify(users, null, 2), "utf-8");
|
|
return true;
|
|
} catch (error) {
|
|
console.error("Fehler beim Schreiben der Benutzerdaten:", error);
|
|
return false;
|
|
}
|
|
}
|
|
async function readSessions() {
|
|
try {
|
|
const data = await promises.readFile(SESSIONS_FILE, "utf-8");
|
|
return JSON.parse(data);
|
|
} catch (error) {
|
|
console.error("Fehler beim Lesen der Sessions:", error);
|
|
return [];
|
|
}
|
|
}
|
|
async function writeSessions(sessions) {
|
|
try {
|
|
await promises.writeFile(SESSIONS_FILE, JSON.stringify(sessions, null, 2), "utf-8");
|
|
return true;
|
|
} catch (error) {
|
|
console.error("Fehler beim Schreiben der Sessions:", error);
|
|
return false;
|
|
}
|
|
}
|
|
async function hashPassword(password) {
|
|
const salt = await bcrypt.genSalt(10);
|
|
return await bcrypt.hash(password, salt);
|
|
}
|
|
async function verifyPassword(password, hash) {
|
|
return await bcrypt.compare(password, hash);
|
|
}
|
|
function generateToken(user) {
|
|
return jwt.sign(
|
|
{
|
|
id: user.id,
|
|
email: user.email,
|
|
role: user.role
|
|
},
|
|
JWT_SECRET,
|
|
{ expiresIn: "7d" }
|
|
);
|
|
}
|
|
function verifyToken(token) {
|
|
try {
|
|
return jwt.verify(token, JWT_SECRET);
|
|
} catch (error) {
|
|
return null;
|
|
}
|
|
}
|
|
async function getUserFromToken(token) {
|
|
const decoded = verifyToken(token);
|
|
if (!decoded) return null;
|
|
const users = await readUsers();
|
|
return users.find((u) => u.id === decoded.id);
|
|
}
|
|
async function createSession(userId, token) {
|
|
const sessions = await readSessions();
|
|
const session = {
|
|
id: Date.now().toString(),
|
|
userId,
|
|
token,
|
|
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1e3).toISOString()
|
|
// 7 days
|
|
};
|
|
sessions.push(session);
|
|
await writeSessions(sessions);
|
|
return session;
|
|
}
|
|
async function deleteSession(token) {
|
|
const sessions = await readSessions();
|
|
const filtered = sessions.filter((s) => s.token !== token);
|
|
await writeSessions(filtered);
|
|
}
|
|
|
|
export { getUserFromToken as a, createSession as c, deleteSession as d, generateToken as g, hashPassword as h, readUsers as r, verifyPassword as v, writeUsers as w };
|
|
//# sourceMappingURL=auth.mjs.map
|