(feature)(profile) cards backup - MR fixes

This commit is contained in:
Andrea Vos 2023-10-08 23:32:54 +02:00
parent 84269657d3
commit 2ffa8f36e5
2 changed files with 15 additions and 16 deletions

View File

@ -910,21 +910,20 @@ router.get('/profile/export', handleErrorAsync(async (req, res) => {
profiles, profiles,
}); });
const payload = { const payload = JSON.stringify({
version: 1,
profiles, profiles,
images, images,
} });
const signature = crypto.sign(payload); const signature = crypto.sign(payload);
res.setHeader('Content-disposition', `attachment; filename=pronounspage-${req.user.username}-${+new Date}.json.gz`); res.setHeader('Content-disposition', `attachment; filename=pronounspage-${req.user.username}-${+new Date}.sjson.gz`);
res.setHeader('Content-type', 'application/gzip'); res.setHeader('Content-type', 'application/gzip');
res.end( res.end(
zlib.gzipSync( zlib.gzipSync(
JSON.stringify({ payload + '\n' +
...payload, signature
signature,
})
) )
); );
})); }));
@ -938,16 +937,16 @@ router.post('/profile/import', multer({limits: {fileSize: 10 * 1024 * 1024}}).an
return res.status(401).json({error: 'One file expected'}); return res.status(401).json({error: 'One file expected'});
} }
const payload = JSON.parse(zlib.gunzipSync(req.files[0].buffer)); const [payload, signature] = zlib.gunzipSync(req.files[0].buffer).toString('utf-8').split('\n');
const signature = payload.signature;
delete payload.signature;
if (!crypto.validate(payload, signature)) { if (!crypto.validate(payload, signature)) {
return res.status(400).json({error: 'profile.backup.error.signature'}); return res.status(400).json({error: 'profile.backup.error.signature'});
} }
const {version, profiles, images} = JSON.parse(payload);
const s3 = new S3(awsConfig); const s3 = new S3(awsConfig);
for (let [id, sizes] of Object.entries(payload.images)) { for (let [id, sizes] of Object.entries(images)) {
for (let [size, content] of Object.entries(sizes)) { for (let [size, content] of Object.entries(sizes)) {
try { try {
const data = await s3.headObject({ const data = await s3.headObject({
@ -965,7 +964,7 @@ router.post('/profile/import', multer({limits: {fileSize: 10 * 1024 * 1024}}).an
} }
} }
for (let [locale, profile] of Object.entries(payload.profiles)) { for (let [locale, profile] of Object.entries(profiles)) {
await saveProfile(req, locale, profile); await saveProfile(req, locale, profile);
} }

View File

@ -3,19 +3,19 @@ import fs from 'fs'
class Crypto { class Crypto {
constructor(privateKey, publicKey) { constructor(privateKey, publicKey) {
this.privateKey = fs.readFileSync(privateKey); this.privateKey = crypto.createPrivateKey(fs.readFileSync(privateKey));
this.publicKey = fs.readFileSync(publicKey); this.publicKey = crypto.createPublicKey(fs.readFileSync(publicKey));
} }
sign(payload) { sign(payload) {
const sign = crypto.createSign('SHA256'); const sign = crypto.createSign('SHA256');
sign.update(JSON.stringify(payload)); sign.update(payload);
return sign.sign(this.privateKey, 'hex'); return sign.sign(this.privateKey, 'hex');
} }
validate(payload, signature) { validate(payload, signature) {
const verify = crypto.createVerify('SHA256'); const verify = crypto.createVerify('SHA256');
verify.update(JSON.stringify(payload)); verify.update(payload);
return verify.verify(this.publicKey, signature, 'hex'); return verify.verify(this.publicKey, signature, 'hex');
} }
} }