diff --git a/server.js b/server.js index 61bcd64..af9a0a8 100644 --- a/server.js +++ b/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)