Decrypt private blobs

This commit is contained in:
cel
2019-01-25 12:59:04 -10:00
parent 7291151076
commit ad80496c9a
2 changed files with 22 additions and 4 deletions
+21 -4
View File
@@ -12,6 +12,7 @@ var lru = require('lrucache')
var webresolve = require('ssb-web-resolver')
var serveEmoji = require('emoji-server')()
var refs = require('ssb-ref')
var BoxStream = require('pull-box-stream')
var h = require('hyperscript')
var {
MdRenderer,
@@ -29,6 +30,8 @@ var appHash = hash([fs.readFileSync(__filename)])
var urlIdRegex = /^(?:\/(([%&@]|%25|%26|%40)(?:[A-Za-z0-9\/+]|%2[Ff]|%2[Bb]){43}(?:=|%3[Dd])\.(?:sha256|ed25519))(?:\.([^?]*))?|(\/.*?))(?:\?(.*))?$/
var zeros = new Buffer(24); zeros.fill(0)
function hash(arr) {
return arr.reduce(function (hash, item) {
return hash.update(String(item))
@@ -99,7 +102,7 @@ exports.init = function (sbot, config) {
switch (m[2]) {
case '%': return serveId(req, res, m[1], m[3], m[5])
case '@': return serveFeed(req, res, m[1], m[3], m[5])
case '&': return serveBlob(req, res, sbot, m[1])
case '&': return serveBlob(req, res, sbot, m[1], m[5])
}
if (m[4] === '/') return serveHome(req, res, m[5])
@@ -461,20 +464,34 @@ exports.init = function (sbot, config) {
}
}
function serveBlob(req, res, sbot, id) {
if (req.headers['if-none-match'] === id) return respond(res, 304)
function serveBlob(req, res, sbot, id, query) {
var q = query && qs.parse(query)
var unbox = q && typeof q.unbox === 'string' && q.unbox.replace(/\s/g, '+')
var etag = id + (unbox || '')
if (req.headers['if-none-match'] === etag) return respond(res, 304)
sbot.blobs.has(id, function (err, has) {
if (err) {
if (/^invalid/.test(err.message)) return respond(res, 400, err.message)
else return respond(res, 500, err.message || err)
}
if (!has) return respond(res, 404, 'Not found')
var unboxKey
if (unbox) {
try { unboxKey = new Buffer(unbox, 'base64') }
catch(e) { return respond(res, 400, err.message) }
if (unboxKey.length !== 32) return respond(res, 400, 'Bad blob key')
}
res.writeHead(200, {
'Cache-Control': 'public, max-age=315360000',
'etag': id
'etag': etag
})
pull(
sbot.blobs.get(id),
unboxKey ? BoxStream.createUnboxStream(unboxKey, zeros) : null,
toPull(res, function (err) {
if (err) console.error('[viewer]', err)
})
+1
View File
@@ -11,6 +11,7 @@
"human-time": "^0.0.1",
"hyperscript": "2.0.2",
"lrucache": "^1.0.2",
"pull-box-stream": "^1.0.13",
"pull-cat": "^1.1.11",
"pull-paramap": "^1.2.1",
"pull-stream": "^3.5.0",