diff --git a/app/src/Download.vue b/app/src/Download.vue index ca4ff87..7378eb9 100644 --- a/app/src/Download.vue +++ b/app/src/Download.vue @@ -14,10 +14,10 @@ p.text-danger(v-show='passwordWrong') strong {{ $root.lang.accessDenied }} | - button.decrypt.btn.btn-primary(:disabled='password.length<1', @click='decrypt()') + button.decrypt.btn.btn-primary(:disabled='password.length<1', @click='fetchBucket()') icon.fa-fw(name="key") | {{ $root.lang.decrypt }} - .panel.panel-primary(v-if='!needsPassword') + .panel.panel-primary(v-if='!needsPassword && !loading') .panel-heading strong {{ $root.lang.files }} div.pull-right.btn-group.btn-download-archive(v-if="downloadsAvailable") @@ -53,8 +53,6 @@ diff --git a/lib/endpoints.js b/lib/endpoints.js index 6d8e2d8..52f310c 100644 --- a/lib/endpoints.js +++ b/lib/endpoints.js @@ -158,16 +158,22 @@ app.get(`${ config.baseUrl }:sid`, (req, res, next) => { const sid = req.params.sid.substr(0, req.params.sid.length - 5); if (!db.get(sid)) return res.status(404).end(); + const downloadPassword = req.get('x-download-pass'); + const items = db.get(sid).map(item => ({ + ...item, + url: `${ config.baseUrl }files/${ sid }++${ item.key }` + })); + res.header('Cache-control', 'private, max-age=0, no-cache, no-store, must-revalidate'); + + // Currently, every item in a bucket must have the same password + if(items.some(item => item.metadata.password && item.metadata.password !== downloadPassword)) { + setTimeout(() => res.status(401).send('Unauthorized'), 500); + return; + } + res.json({ - items: db.get(sid).map(data => { - const item = Object.assign(data, { url: `${ config.baseUrl }files/${ sid }++${ data.key }` }); - if (item.metadata.password) { - return AES.encrypt(JSON.stringify(data), item.metadata.password).toString(); - } else { - return item; - } - }), + items, config: { maxPreviewSize: config.maxPreviewSize }