mirror of
https://github.com/amark/gun.git
synced 2025-03-30 15:08:33 +00:00

later with @bmatusiak check sea.then for '../gun.js' vs '../' vs ... note: src/index -> core.js TODO: something about WebRTC candidates hitting ack decrement limits?
138 lines
4.8 KiB
JavaScript
138 lines
4.8 KiB
JavaScript
;(function(){
|
|
|
|
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<any>}
|
|
// 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
|
|
|
|
}()); |