This commit is contained in:
Johan
2025-12-19 09:39:42 +01:00
parent 954e3640ff
commit 37b72a970d

View File

@@ -186,17 +186,53 @@ app.post('/login', (req, res) => {
// 3. Créer une entrée
app.post('/entries', authenticateAndUnpackKey, (req, res) => {
const { title, username_field, url, password } = req.body;
// TODO
// On utilise req.user.vaultKey qui a été extrait du JWT
const encrypted = encryptAES(password, req.user.vaultKey);
// Stockage en BDD
const id = uuidv4();
db.run(`INSERT INTO entries (id, owner_id, title, username_field, url, encrypted_blob, iv, auth_tag)
VALUES (?,?,?,?,?,?,?,?)`,
[id, req.user.id, title, username_field, url, encrypted.content, encrypted.iv, encrypted.tag],
(err) => {
if (err) return res.status(500).json({ error: err.message });
res.json({ id, message: "Sauvegardé" });
}
);
});
// 4. Déchiffrer une entrée
app.get('/entries/:id/password', authenticateAndUnpackKey, (req, res) => {
// TODO
db.get("SELECT encrypted_blob, iv, auth_tag FROM entries WHERE id = ? AND owner_id = ?",
[req.params.id, req.user.id],
(err, entry) => {
if (!entry) return res.status(404).send();
try {
// Déchiffrement immédiat avec la clé du token
const clear = decryptAES(entry.encrypted_blob, req.user.vaultKey, entry.iv, entry.auth_tag);
res.json({ password: clear });
} catch (e) {
res.status(500).json({ error: "Erreur déchiffrement" });
}
}
);
});
// 5. Lister les entrées (Métadonnées uniquement)
app.get('/entries', authenticateAndUnpackKey, (req, res) => {
// TODO
// Notez qu'on ne sélectionne PAS 'encrypted_blob'.
// Cette requête est très rapide et ne demande aucune opération crypto.
const sql = "SELECT id, title, url, username_field FROM entries WHERE owner_id = ?";
db.all(sql, [req.user.id], (err, rows) => {
if (err) {
return res.status(500).json({ error: "Erreur lors de la récupération" });
}
// SQLite renvoie un tableau vide [] s'il n'y a pas de résultats, ce qui est parfait pour le JSON.
res.json(rows);
});
});
// 6. Logout (supprime le cookie)