TP done
This commit is contained in:
42
server.js
42
server.js
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user