153 lines
4.5 KiB
JavaScript
153 lines
4.5 KiB
JavaScript
import bcrypt from 'bcryptjs';
|
|
import jwt from 'jsonwebtoken';
|
|
import { promises } from 'fs';
|
|
import path from 'path';
|
|
import { d as decryptObject, a as encryptObject } from './encryption.mjs';
|
|
|
|
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");
|
|
function getEncryptionKey() {
|
|
return process.env.ENCRYPTION_KEY || "default-key-change-in-production";
|
|
}
|
|
function isEncrypted(data) {
|
|
try {
|
|
const parsed = JSON.parse(data.trim());
|
|
if (Array.isArray(parsed)) {
|
|
return false;
|
|
}
|
|
if (typeof parsed === "object" && parsed !== null && !parsed.encryptedData) {
|
|
return false;
|
|
}
|
|
return false;
|
|
} catch (e) {
|
|
return true;
|
|
}
|
|
}
|
|
async function readUsers() {
|
|
try {
|
|
const data = await promises.readFile(USERS_FILE, "utf-8");
|
|
const encrypted = isEncrypted(data);
|
|
if (encrypted) {
|
|
const encryptionKey = getEncryptionKey();
|
|
try {
|
|
return decryptObject(data, encryptionKey);
|
|
} catch (decryptError) {
|
|
console.error("Fehler beim Entschl\xFCsseln der Benutzerdaten:", decryptError);
|
|
try {
|
|
const plainData = JSON.parse(data);
|
|
console.warn("Entschl\xFCsselung fehlgeschlagen, versuche als unverschl\xFCsseltes Format zu lesen");
|
|
return plainData;
|
|
} catch (parseError) {
|
|
console.error("Konnte Benutzerdaten weder entschl\xFCsseln noch als JSON lesen");
|
|
return [];
|
|
}
|
|
}
|
|
} else {
|
|
const users = JSON.parse(data);
|
|
console.log("Migriere unverschl\xFCsselte Benutzerdaten zu verschl\xFCsselter Speicherung...");
|
|
await writeUsers(users);
|
|
return users;
|
|
}
|
|
} catch (error) {
|
|
if (error.code === "ENOENT") {
|
|
return [];
|
|
}
|
|
console.error("Fehler beim Lesen der Benutzerdaten:", error);
|
|
return [];
|
|
}
|
|
}
|
|
async function writeUsers(users) {
|
|
try {
|
|
const encryptionKey = getEncryptionKey();
|
|
const encryptedData = encryptObject(users, encryptionKey);
|
|
await promises.writeFile(USERS_FILE, encryptedData, "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 getUserById(id) {
|
|
const users = await readUsers();
|
|
return users.find((u) => u.id === id);
|
|
}
|
|
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, verifyToken as b, createSession as c, deleteSession as d, getUserById as e, generateToken as g, hashPassword as h, readUsers as r, verifyPassword as v, writeUsers as w };
|
|
//# sourceMappingURL=auth.mjs.map
|