83 lines
2.3 KiB
TypeScript
83 lines
2.3 KiB
TypeScript
import { promises as fs } from "fs";
|
|
import path from "path";
|
|
import { existsSync } from "fs";
|
|
import bcrypt from "bcryptjs";
|
|
|
|
const PASSWORD_FILE = path.join(process.cwd(), "prisma", "password.json");
|
|
|
|
interface PasswordData {
|
|
hash: string;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
}
|
|
|
|
async function ensurePasswordFile(): Promise<void> {
|
|
if (!existsSync(PASSWORD_FILE)) {
|
|
// Create default password "admin" if file doesn't exist
|
|
const defaultHash = await bcrypt.hash("admin", 10);
|
|
const defaultData: PasswordData = {
|
|
hash: defaultHash,
|
|
createdAt: new Date().toISOString(),
|
|
updatedAt: new Date().toISOString(),
|
|
};
|
|
await fs.writeFile(PASSWORD_FILE, JSON.stringify(defaultData, null, 2), "utf-8");
|
|
}
|
|
}
|
|
|
|
async function loadPasswordData(): Promise<PasswordData> {
|
|
await ensurePasswordFile();
|
|
const content = await fs.readFile(PASSWORD_FILE, "utf-8");
|
|
return JSON.parse(content);
|
|
}
|
|
|
|
async function savePasswordData(data: PasswordData): Promise<void> {
|
|
await fs.writeFile(PASSWORD_FILE, JSON.stringify(data, null, 2), "utf-8");
|
|
}
|
|
|
|
export const authService = {
|
|
async verifyPassword(password: string): Promise<boolean> {
|
|
try {
|
|
const data = await loadPasswordData();
|
|
return await bcrypt.compare(password, data.hash);
|
|
} catch (error) {
|
|
console.error("Error verifying password:", error);
|
|
return false;
|
|
}
|
|
},
|
|
|
|
async changePassword(oldPassword: string, newPassword: string): Promise<{ success: boolean; error?: string }> {
|
|
try {
|
|
// Verify old password
|
|
const isValid = await this.verifyPassword(oldPassword);
|
|
if (!isValid) {
|
|
return { success: false, error: "Mot de passe actuel incorrect" };
|
|
}
|
|
|
|
// Hash new password
|
|
const newHash = await bcrypt.hash(newPassword, 10);
|
|
const data = await loadPasswordData();
|
|
|
|
// Update password
|
|
data.hash = newHash;
|
|
data.updatedAt = new Date().toISOString();
|
|
|
|
await savePasswordData(data);
|
|
|
|
return { success: true };
|
|
} catch (error) {
|
|
console.error("Error changing password:", error);
|
|
return { success: false, error: "Erreur lors du changement de mot de passe" };
|
|
}
|
|
},
|
|
|
|
async hasPassword(): Promise<boolean> {
|
|
try {
|
|
await ensurePasswordFile();
|
|
return existsSync(PASSWORD_FILE);
|
|
} catch {
|
|
return false;
|
|
}
|
|
},
|
|
};
|
|
|