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
|
// 3. Créer une entrée
|
||||||
app.post('/entries', authenticateAndUnpackKey, (req, res) => {
|
app.post('/entries', authenticateAndUnpackKey, (req, res) => {
|
||||||
const { title, username_field, url, password } = req.body;
|
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
|
// 4. Déchiffrer une entrée
|
||||||
app.get('/entries/:id/password', authenticateAndUnpackKey, (req, res) => {
|
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)
|
// 5. Lister les entrées (Métadonnées uniquement)
|
||||||
app.get('/entries', authenticateAndUnpackKey, (req, res) => {
|
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)
|
// 6. Logout (supprime le cookie)
|
||||||
|
|||||||
Reference in New Issue
Block a user