-
Notifications
You must be signed in to change notification settings - Fork 27
/
encrypt-repo.js
99 lines (89 loc) · 2.93 KB
/
encrypt-repo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
"use strict";
var forge = window.forge;//require('forge');
var bodec = require('bodec');
var defer = require('js-git/lib/defer');
var prefs = require('prefs');
module.exports = function (storage, passphrase) {
require('js-git/mixins/path-to-entry')(storage);
require('js-git/mixins/mem-cache')(storage);
require('js-git/mixins/create-tree')(storage);
require('js-git/mixins/formats')(storage);
// Derive a 32 bit key from the passphrase
var key = forge.pkcs5.pbkdf2(passphrase, 'kodeforkids', 16000, 32);
var repo = {};
var fs = require('js-git/lib/git-fs')(storage, {
shouldEncrypt: function (path) {
// We only want to encrypt the actual blobs
// Everything else can be plaintext.
return path.split("/").filter(Boolean)[0] === "objects";
},
encrypt: function (plain) {
var iv = forge.random.getBytesSync(16);
var cipher = forge.cipher.createCipher('AES-CBC', key);
cipher.start({iv: iv});
var raw = bodec.toRaw(plain);
cipher.update(forge.util.createBuffer(raw));
cipher.finish();
var encrypted = cipher.output.bytes();
return bodec.fromRaw(iv + encrypted);
},
decrypt: function (encrypted) {
var decipher = forge.cipher.createDecipher('AES-CBC', key);
var iv = bodec.toRaw(encrypted, 0, 16);
encrypted = bodec.toRaw(encrypted, 16);
decipher.start({iv: iv});
decipher.update(forge.util.createBuffer(encrypted));
decipher.finish();
return bodec.fromRaw(decipher.output.bytes());
},
getRootTree: function (callback) {
if (rootTree) {
callback(null, rootTree);
callback = null;
if (Date.now() - rootTime < 1000) return;
}
storage.readRef("refs/heads/master", function (err, hash) {
if (!hash) return callback(err);
storage.loadAs("commit", hash, function (err, commit) {
if (!commit) return callback(err);
rootTree = commit.tree;
rootTime = Date.now();
if (callback) callback(null, commit.tree);
});
});
},
setRootTree: function (hash, callback) {
rootTree = hash;
rootTime = Date.now();
defer(saveRoot);
callback();
}
});
var rootTree;
var rootTime;
var saving, savedRoot;
function saveRoot() {
if (saving || savedRoot === rootTree) return;
saving = rootTree;
storage.saveAs("commit", {
tree: rootTree,
author: {
name: prefs.get("userName", "JS-Git"),
email: prefs.get("userEmail", "js-git@creationix.com")
},
message: "Auto commit to update fs image"
}, function (err, hash) {
if (!hash) return onDone(err);
storage.updateRef("refs/heads/master", hash, function (err) {
onDone(err);
}, true);
function onDone(err) {
if (!err) savedRoot = saving;
saving = false;
if (err) throw err;
}
});
}
require('js-git/mixins/fs-db')(repo, fs);
return repo;
};