var User = require('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){}; User.prototype.pair = function(){ var user = this, proxy; // undeprecated, hiding with proxies. try{ proxy = new Proxy({DANGER:'\u2620'}, {get: function(t,p,r){ if(!user.is || !(user._||'').sea){ return } return user._.sea[p]; }})}catch(e){} return proxy; } // If authenticated user wants to delete his/her account, let's support it! User.prototype.delete = async function(alias, pass, cb){ console.log("user.delete() IS DEPRECATED AND WILL BE MOVED TO A MODULE!!!"); var gun = this, root = gun.back(-1), user = gun.back('user'); try { user.auth(alias, pass, function(ack){ var pub = (user.is||{}).pub; // Delete user data user.map().once(function(){ this.put(null) }); // Wipe user data from memory user.leave(); (cb || noop)({ok: 0}); }); } catch (e) { Gun.log('User.delete failed! Error:', e); } return gun; } User.prototype.alive = async function(){ console.log("user.alive() IS DEPRECATED!!!"); const gunRoot = this.back(-1) try { // All is good. Should we do something more with actual recalled data? await authRecall(gunRoot) return gunRoot._.user._ } catch (e) { const err = 'No session!' Gun.log(err) throw { err } } } User.prototype.trust = async function(user){ console.log("`.trust` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!"); // TODO: BUG!!! SEA `node` read listener needs to be async, which means core needs to be async too. //gun.get('alice').get('age').trust(bob); if (Gun.is(user)) { user.get('pub').get((ctx, ev) => { console.log(ctx, ev) }) } user.get('trust').get(path).put(theirPubkey); // do a lookup on this gun chain directly (that gets bob's copy of the data) // do a lookup on the metadata trust table for this path (that gets all the pubkeys allowed to write on this path) // do a lookup on each of those pubKeys ON the path (to get the collab data "layers") // THEN you perform Jachen's mix operation // and return the result of that to... } User.prototype.grant = function(to, cb){ console.log("`.grant` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!"); var gun = this, user = gun.back(-1).user(), pair = user._.sea, path = ''; gun.back(function(at){ if(at.is){ return } path += (at.get||'') }); (async function(){ var enc, sec = await user.get('grant').get(pair.pub).get(path).then(); sec = await SEA.decrypt(sec, pair); if(!sec){ sec = SEA.random(16).toString(); enc = await SEA.encrypt(sec, pair); user.get('grant').get(pair.pub).get(path).put(enc); } var pub = to.get('pub').then(); var epub = to.get('epub').then(); pub = await pub; epub = await epub; var dh = await SEA.secret(epub, pair); enc = await SEA.encrypt(sec, dh); user.get('grant').get(pub).get(path).put(enc, cb); }()); return gun; } User.prototype.secret = function(data, cb){ console.log("`.secret` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!"); var gun = this, user = gun.back(-1).user(), pair = user.pair(), path = ''; gun.back(function(at){ if(at.is){ return } path += (at.get||'') }); (async function(){ var enc, sec = await user.get('trust').get(pair.pub).get(path).then(); sec = await SEA.decrypt(sec, pair); if(!sec){ sec = SEA.random(16).toString(); enc = await SEA.encrypt(sec, pair); user.get('trust').get(pair.pub).get(path).put(enc); } enc = await SEA.encrypt(data, sec); gun.put(enc, cb); }()); return gun; } /** * returns the decrypted value, encrypted by secret * @returns {Promise} // Mark needs to review 1st before officially supported User.prototype.decrypt = function(cb) { let gun = this, path = '' gun.back(function(at) { if (at.is) { return } path += at.get || '' }) return gun .then(async data => { if (data == null) { return } const user = gun.back(-1).user() const pair = user.pair() let sec = await user .get('trust') .get(pair.pub) .get(path) sec = await SEA.decrypt(sec, pair) if (!sec) { return data } let decrypted = await SEA.decrypt(data, sec) return decrypted }) .then(res => { cb && cb(res) return res }) } */ module.exports = User