aboutsummaryrefslogtreecommitdiff
path: root/lib/app.js
diff options
context:
space:
mode:
authorcel <cel@f/6sQ6d2CMxRUhLpspgGIulDxDCwYD7DzFzPNr7u5AU=.ed25519>2017-09-29 08:41:55 -1000
committercel <cel@f/6sQ6d2CMxRUhLpspgGIulDxDCwYD7DzFzPNr7u5AU=.ed25519>2017-09-29 08:41:55 -1000
commit440274d19f302e0f293d56cba685e39e372cda12 (patch)
tree5bcd754ab04f5080aaf353dfc2b60b5fac7edb31 /lib/app.js
parent7fffac329b2718f0ea918cd9fd53d3e2b47cc93e (diff)
parent62e7e74bd278473cc4358700b7f2b5c0a78ac681 (diff)
downloadpatchfoo-440274d19f302e0f293d56cba685e39e372cda12.tar.gz
patchfoo-440274d19f302e0f293d56cba685e39e372cda12.zip
Merge branch 'secretblobs' into master
Diffstat (limited to 'lib/app.js')
-rw-r--r--lib/app.js54
1 files changed, 52 insertions, 2 deletions
diff --git a/lib/app.js b/lib/app.js
index 1705d1c..5cc4e62 100644
--- a/lib/app.js
+++ b/lib/app.js
@@ -14,6 +14,10 @@ var Git = require('./git')
var cat = require('pull-cat')
var proc = require('child_process')
var toPull = require('stream-to-pull-stream')
+var BoxStream = require('pull-box-stream')
+var crypto = require('crypto')
+
+var zeros = new Buffer(24); zeros.fill(0)
module.exports = App
@@ -198,8 +202,54 @@ App.prototype.wantSizeBlob = function (id, cb) {
})
}
-App.prototype.addBlob = function (cb) {
- return this.sbot.blobs.add(cb)
+App.prototype.addBlobRaw = function (cb) {
+ var done = multicb({pluck: 1, spread: true})
+ var sink = pull(
+ u.pullLength(done()),
+ this.sbot.blobs.add(done())
+ )
+ done(function (err, size, hash) {
+ if (err) return cb(err)
+ cb(null, {link: hash, size: size})
+ })
+ return sink
+}
+
+App.prototype.addBlob = function (isPrivate, cb) {
+ if (!isPrivate) return this.addBlobRaw(cb)
+ else return this.addBlobPrivate(cb)
+}
+
+App.prototype.addBlobPrivate = function (cb) {
+ var bufs = []
+ var self = this
+ // use the hash of the cleartext as the key to encrypt the blob
+ var hash = crypto.createHash('sha256')
+ return pull.drain(function (buf) {
+ bufs.push(buf)
+ hash.update(buf)
+ }, function (err) {
+ if (err) return cb(err)
+ var secret = hash.digest()
+ pull(
+ pull.values(bufs),
+ BoxStream.createBoxStream(secret, zeros),
+ self.addBlobRaw(function (err, link) {
+ if (err) return cb(err)
+ link.key = secret.toString('base64')
+ cb(null, link)
+ })
+ )
+ })
+}
+
+App.prototype.getBlob = function (id, key) {
+ if (!key) return this.sbot.blobs.get(id)
+ if (typeof key === 'string') key = new Buffer(key, 'base64')
+ return pull(
+ this.sbot.blobs.get(id),
+ BoxStream.createUnboxStream(key, zeros)
+ )
}
App.prototype.pushBlob = function (id, cb) {