mirror of
https://github.com/amark/gun.git
synced 2025-06-06 14:16:44 +00:00
Removed rest of the localStorage code & comments
This commit is contained in:
parent
22f07734fc
commit
d32eaf833e
90
sea.js
90
sea.js
@ -112,7 +112,6 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is internal User authentication func.
|
// This is internal User authentication func.
|
||||||
function authenticate(alias,pass,root){
|
function authenticate(alias,pass,root){
|
||||||
return new Promise(function(resolve, reject){
|
return new Promise(function(resolve, reject){
|
||||||
@ -154,7 +153,6 @@
|
|||||||
}).catch(function(e){ reject({err: e}) });
|
}).catch(function(e){ reject({err: e}) });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// This internal func finalizes User authentication
|
// This internal func finalizes User authentication
|
||||||
function finalizelogin(alias,key,root,opts){
|
function finalizelogin(alias,key,root,opts){
|
||||||
var user = root._.user;
|
var user = root._.user;
|
||||||
@ -175,25 +173,7 @@
|
|||||||
return user._;
|
return user._;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// This updates sessionStorage & IndexedDB to persist authenticated "session"
|
||||||
function callOnStore(fn_, resolve_){
|
|
||||||
var open = indexedDB.open('GunDB', 1); // Open (or create) the database; 1 === 'version'
|
|
||||||
open.onupgradeneeded = function(){ // Create the schema; props === current version
|
|
||||||
var db = open.result;
|
|
||||||
db.createObjectStore('SEA', {keyPath: 'id'});
|
|
||||||
};
|
|
||||||
open.onsuccess = function(){ // Start a new transaction
|
|
||||||
var db = open.result;
|
|
||||||
var tx = db.transaction('SEA', 'readwrite');
|
|
||||||
var store = tx.objectStore('SEA');
|
|
||||||
fn_(store);
|
|
||||||
tx.oncomplete = function(){ // Close the db when the transaction is done
|
|
||||||
db.close();
|
|
||||||
if(typeof resolve_ === 'function'){ resolve_() }
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function updatestorage(proof,priv,pin){
|
function updatestorage(proof,priv,pin){
|
||||||
return function(props){
|
return function(props){
|
||||||
return new Promise(function(resolve, reject){
|
return new Promise(function(resolve, reject){
|
||||||
@ -203,43 +183,42 @@
|
|||||||
delete props.remember; // Not stored if present
|
delete props.remember; // Not stored if present
|
||||||
|
|
||||||
var remember = (pin && {alias: props.alias, pin: pin}) || props;
|
var remember = (pin && {alias: props.alias, pin: pin}) || props;
|
||||||
var encrypted = !authsettings.session && pin && props;
|
var persist = !authsettings.session && pin && props;
|
||||||
|
|
||||||
return SEA.write(JSON.stringify(remember), priv).then(function(signed){
|
return SEA.write(JSON.stringify(remember), priv).then(function(signed){
|
||||||
sessionStorage.setItem('user', props.alias);
|
sessionStorage.setItem('user', props.alias);
|
||||||
sessionStorage.setItem('remember', signed);
|
sessionStorage.setItem('remember', signed);
|
||||||
if(!encrypted){
|
if(!persist){
|
||||||
return new Promise(function(resolve){
|
return new Promise(function(resolve){
|
||||||
callOnStore(function(store) {
|
SEA._callonstore_(function(store) {
|
||||||
var act = store.clear(); // Wipes whole IndexedDB
|
var act = store.clear(); // Wipes whole IndexedDB
|
||||||
act.onsuccess = function(){};
|
act.onsuccess = function(){};
|
||||||
}, function(){ resolve() });
|
}, function(){ resolve() });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}).then(function(){
|
}).then(function(){
|
||||||
return !encrypted || SEA.enc(encrypted, pin).then(function(encrypted){
|
return !persist || SEA.enc(persist, pin).then(function(encrypted){
|
||||||
return encrypted && SEA.write(encrypted, priv).then(function(encsig){
|
return encrypted && SEA.write(encrypted, priv).then(function(signed){
|
||||||
return new Promise(function(resolve){
|
return new Promise(function(resolve){
|
||||||
callOnStore(function(store){
|
SEA._callonstore_(function(store){
|
||||||
store.put({id: props.alias, auth: encsig});
|
store.put({id: props.alias, auth: signed});
|
||||||
}, function(){ resolve() });
|
}, function(){ resolve() });
|
||||||
});
|
});
|
||||||
}).catch(reject);
|
}).catch(reject);
|
||||||
}).catch(reject);
|
}).catch(reject);
|
||||||
}).then(function(){ resolve(props) })
|
}).then(function(){ resolve(props) })
|
||||||
.catch(function(e){ reject({err: 'Session persisting failed!'}) });
|
.catch(function(e){ reject({err: 'Session persisting failed!'}) });
|
||||||
} else {
|
|
||||||
return new Promise(function(resolve){
|
|
||||||
callOnStore(function(store) {
|
|
||||||
var act = store.clear(); // Wipes whole IndexedDB
|
|
||||||
act.onsuccess = function(){};
|
|
||||||
}, function(){ resolve() });
|
|
||||||
}).then(function(){
|
|
||||||
sessionStorage.removeItem('user');
|
|
||||||
sessionStorage.removeItem('remember');
|
|
||||||
resolve(props);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
return new Promise(function(resolve){
|
||||||
|
SEA._callonstore_(function(store) {
|
||||||
|
var act = store.clear(); // Wipes whole IndexedDB
|
||||||
|
act.onsuccess = function(){};
|
||||||
|
}, function(){ resolve() });
|
||||||
|
}).then(function(){
|
||||||
|
sessionStorage.removeItem('user');
|
||||||
|
sessionStorage.removeItem('remember');
|
||||||
|
resolve(props);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -251,7 +230,7 @@
|
|||||||
// TODO: how this works:
|
// TODO: how this works:
|
||||||
// called when app bootstraps, with wanted options
|
// called when app bootstraps, with wanted options
|
||||||
// IF authsettings.validity === 0 THEN no remember-me, ever
|
// IF authsettings.validity === 0 THEN no remember-me, ever
|
||||||
// IF authsettings.session === true THEN no window.localStorage in use; nor PIN
|
// IF authsettings.session === true THEN no window.indexedDB in use; nor PIN
|
||||||
// ELSE if no PIN then window.sessionStorage
|
// ELSE if no PIN then window.sessionStorage
|
||||||
var pin = Gun.obj.has(opts, 'pin') && opts.pin
|
var pin = Gun.obj.has(opts, 'pin') && opts.pin
|
||||||
&& new Buffer(opts.pin, 'utf8').toString('base64');
|
&& new Buffer(opts.pin, 'utf8').toString('base64');
|
||||||
@ -274,6 +253,7 @@
|
|||||||
// This internal func recalls persisted User authentication if so configured
|
// This internal func recalls persisted User authentication if so configured
|
||||||
function authrecall(root,authprops){
|
function authrecall(root,authprops){
|
||||||
return new Promise(function(resolve, reject){
|
return new Promise(function(resolve, reject){
|
||||||
|
// TODO: sessionStorage to only hold signed { alias, pin } !!!
|
||||||
var remember = authprops || sessionStorage.getItem('remember');
|
var remember = authprops || sessionStorage.getItem('remember');
|
||||||
var alias = Gun.obj.has(authprops, 'alias') && authprops.alias
|
var alias = Gun.obj.has(authprops, 'alias') && authprops.alias
|
||||||
|| sessionStorage.getItem('user');
|
|| sessionStorage.getItem('user');
|
||||||
@ -330,10 +310,10 @@
|
|||||||
try{ props = props.slice ? JSON.parse(props) : props }catch(e){} //eslint-disable-line no-empty
|
try{ props = props.slice ? JSON.parse(props) : props }catch(e){} //eslint-disable-line no-empty
|
||||||
if(Gun.obj.has(props, 'pin') && Gun.obj.has(props, 'alias')
|
if(Gun.obj.has(props, 'pin') && Gun.obj.has(props, 'alias')
|
||||||
&& props.alias === alias){
|
&& props.alias === alias){
|
||||||
pin = props.pin; // Got PIN so get localStorage secret if signature is ok
|
pin = props.pin; // Got PIN so get IndexedDB secret if signature is ok
|
||||||
return new Promise(function(resolve){
|
return new Promise(function(resolve){
|
||||||
var remember;
|
var remember;
|
||||||
callOnStore(function(store) {
|
SEA._callonstore_(function(store) {
|
||||||
var getData = store.get(alias);
|
var getData = store.get(alias);
|
||||||
getData.onsuccess = function(){
|
getData.onsuccess = function(){
|
||||||
remember = getData.result && getData.result.auth;
|
remember = getData.result && getData.result.auth;
|
||||||
@ -388,7 +368,7 @@
|
|||||||
return reject({err: 'No authentication session found!'});
|
return reject({err: 'No authentication session found!'});
|
||||||
}
|
}
|
||||||
var gotRemember;
|
var gotRemember;
|
||||||
callOnStore(function(store) {
|
SEA._callonstore_(function(store) {
|
||||||
var getData = store.get(alias);
|
var getData = store.get(alias);
|
||||||
getData.onsuccess = function(){
|
getData.onsuccess = function(){
|
||||||
gotRemember = getData.result && getData.result.auth;
|
gotRemember = getData.result && getData.result.auth;
|
||||||
@ -433,13 +413,13 @@
|
|||||||
if(authsettings.validity && typeof window !== 'undefined'
|
if(authsettings.validity && typeof window !== 'undefined'
|
||||||
&& Gun.obj.has(p, 'pub') && Gun.obj.has(p, 'key')){
|
&& Gun.obj.has(p, 'pub') && Gun.obj.has(p, 'key')){
|
||||||
var importAndStoreKey = function(){ // Creates new CryptoKey & stores it
|
var importAndStoreKey = function(){ // Creates new CryptoKey & stores it
|
||||||
importKey(p).then(function(key){ callOnStore(function(store){
|
importKey(p).then(function(key){ SEA._callonstore_(function(store){
|
||||||
store.put({id: p.pub, key: key});
|
store.put({id: p.pub, key: key});
|
||||||
}, function(){ resolve(key) }); });
|
}, function(){ resolve(key) }); });
|
||||||
};
|
};
|
||||||
if(Gun.obj.has(p, 'set')){ return importAndStoreKey() } // proof update so overwrite
|
if(Gun.obj.has(p, 'set')){ return importAndStoreKey() } // proof update so overwrite
|
||||||
var aesKey;
|
var aesKey;
|
||||||
callOnStore(function(store) {
|
SEA._callonstore_(function(store) {
|
||||||
var getData = store.get(p.pub);
|
var getData = store.get(p.pub);
|
||||||
getData.onsuccess = function(){ aesKey = getData.result && getData.result.key };
|
getData.onsuccess = function(){ aesKey = getData.result && getData.result.key };
|
||||||
}, function(){ return aesKey ? resolve(aesKey) : importAndStoreKey() });
|
}, function(){ return aesKey ? resolve(aesKey) : importAndStoreKey() });
|
||||||
@ -649,7 +629,7 @@
|
|||||||
// TODO: how this works:
|
// TODO: how this works:
|
||||||
// called when app bootstraps, with wanted options
|
// called when app bootstraps, with wanted options
|
||||||
// IF validity === 0 THEN no remember-me, ever
|
// IF validity === 0 THEN no remember-me, ever
|
||||||
// IF opt.session === true THEN no window.localStorage in use; nor PIN
|
// IF opt.session === true THEN no window.indexedDB in use; nor PIN
|
||||||
authsettings.validity = typeof validity !== 'undefined' ? validity
|
authsettings.validity = typeof validity !== 'undefined' ? validity
|
||||||
: _initial_authsettings.validity;
|
: _initial_authsettings.validity;
|
||||||
if(Gun.obj.has(opts, 'session')){
|
if(Gun.obj.has(opts, 'session')){
|
||||||
@ -985,6 +965,24 @@
|
|||||||
doIt(cb, function(){cb()});
|
doIt(cb, function(){cb()});
|
||||||
} else { return new Promise(doIt) }
|
} else { return new Promise(doIt) }
|
||||||
};
|
};
|
||||||
|
// Internal helper for IndexedDB use
|
||||||
|
SEA._callonstore_ = function(fn_, resolve_){
|
||||||
|
var open = indexedDB.open('GunDB', 1); // Open (or create) the database; 1 === 'version'
|
||||||
|
open.onupgradeneeded = function(){ // Create the schema; props === current version
|
||||||
|
var db = open.result;
|
||||||
|
db.createObjectStore('SEA', {keyPath: 'id'});
|
||||||
|
};
|
||||||
|
open.onsuccess = function(){ // Start a new transaction
|
||||||
|
var db = open.result;
|
||||||
|
var tx = db.transaction('SEA', 'readwrite');
|
||||||
|
var store = tx.objectStore('SEA');
|
||||||
|
fn_(store);
|
||||||
|
tx.oncomplete = function(){ // Close the db when the transaction is done
|
||||||
|
db.close();
|
||||||
|
if(typeof resolve_ === 'function'){ resolve_() }
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
Gun.SEA = SEA;
|
Gun.SEA = SEA;
|
||||||
|
|
||||||
|
42
test/sea.js
42
test/sea.js
@ -7,34 +7,15 @@ var root;
|
|||||||
|
|
||||||
(function(env){
|
(function(env){
|
||||||
root = env.window ? env.window : global;
|
root = env.window ? env.window : global;
|
||||||
root.indexedDB = require("fake-indexeddb");
|
|
||||||
}(this));
|
}(this));
|
||||||
|
|
||||||
if(typeof Buffer === 'undefined'){
|
if(typeof Buffer === 'undefined'){
|
||||||
var Buffer = require('buffer').Buffer;
|
var Buffer = require('buffer').Buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
function callOnStore(fn_, resolve_){
|
|
||||||
var open = indexedDB.open('GunDB', 1); // Open (or create) the database; 1 === 'version'
|
|
||||||
open.onupgradeneeded = function(){ // Create the schema; props === current version
|
|
||||||
var db = open.result;
|
|
||||||
db.createObjectStore('SEA', {keyPath: 'id'});
|
|
||||||
};
|
|
||||||
open.onsuccess = function(){ // Start a new transaction
|
|
||||||
var db = open.result;
|
|
||||||
var tx = db.transaction('SEA', 'readwrite');
|
|
||||||
var store = tx.objectStore('SEA');
|
|
||||||
fn_(store);
|
|
||||||
tx.oncomplete = function(){ // Close the db when the transaction is done
|
|
||||||
db.close();
|
|
||||||
if(typeof resolve_ === 'function'){ resolve_() }
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkIndexedDB(key, prop, resolve_){
|
function checkIndexedDB(key, prop, resolve_){
|
||||||
var result;
|
var result;
|
||||||
callOnStore(function(store) {
|
Gun.SEA._callonstore_(function(store) {
|
||||||
var getData = store.get(key);
|
var getData = store.get(key);
|
||||||
getData.onsuccess = function(){
|
getData.onsuccess = function(){
|
||||||
result = getData.result && getData.result[prop];
|
result = getData.result && getData.result[prop];
|
||||||
@ -258,10 +239,9 @@ Gun().user && describe('Gun', function(){
|
|||||||
|
|
||||||
if(wipeStorageData){
|
if(wipeStorageData){
|
||||||
// ... and persisted session
|
// ... and persisted session
|
||||||
// localStorage.removeItem('remember');
|
|
||||||
sessionStorage.removeItem('remember');
|
sessionStorage.removeItem('remember');
|
||||||
sessionStorage.removeItem('alias');
|
sessionStorage.removeItem('alias');
|
||||||
callOnStore(function(store) {
|
Gun.SEA._callonstore_(function(store) {
|
||||||
var act = store.clear(); // Wipes whole IndexedDB
|
var act = store.clear(); // Wipes whole IndexedDB
|
||||||
act.onsuccess = function(){};
|
act.onsuccess = function(){};
|
||||||
});
|
});
|
||||||
@ -641,7 +621,7 @@ Gun().user && describe('Gun', function(){
|
|||||||
return !pin ? sessionStorage.setItem('remember', remember)
|
return !pin ? sessionStorage.setItem('remember', remember)
|
||||||
: Gun.SEA.enc(remember, pin).then(function(encauth){
|
: Gun.SEA.enc(remember, pin).then(function(encauth){
|
||||||
return new Promise(function(resolve){
|
return new Promise(function(resolve){
|
||||||
callOnStore(function(store){
|
Gun.SEA._callonstore_(function(store){
|
||||||
store.put({id: usr._.alias, auth: encauth});
|
store.put({id: usr._.alias, auth: encauth});
|
||||||
}, resolve);
|
}, resolve);
|
||||||
});
|
});
|
||||||
@ -650,7 +630,7 @@ Gun().user && describe('Gun', function(){
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
it('with PIN auth session stored to localStorage', function(done){
|
it('with PIN auth session stored to IndexedDB', function(done){
|
||||||
var doAction = function(){
|
var doAction = function(){
|
||||||
user.auth(alias+type, pass+' new', {pin: 'PIN'})
|
user.auth(alias+type, pass+' new', {pin: 'PIN'})
|
||||||
.then(doCheck(done, true)).catch(done);
|
.then(doCheck(done, true)).catch(done);
|
||||||
@ -731,7 +711,7 @@ Gun().user && describe('Gun', function(){
|
|||||||
}).catch(done);
|
}).catch(done);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('valid localStorage session bootstrap', function(done){
|
it('valid IndexedDB session bootstrap', function(done){
|
||||||
var sUser;
|
var sUser;
|
||||||
var sRemember;
|
var sRemember;
|
||||||
var iAuth;
|
var iAuth;
|
||||||
@ -744,8 +724,6 @@ Gun().user && describe('Gun', function(){
|
|||||||
expect(root.sessionStorage.getItem('user')).to.be(alias+type);
|
expect(root.sessionStorage.getItem('user')).to.be(alias+type);
|
||||||
expect(root.sessionStorage.getItem('remember')).to.not.be(undefined);
|
expect(root.sessionStorage.getItem('remember')).to.not.be(undefined);
|
||||||
expect(root.sessionStorage.getItem('remember')).to.not.be('');
|
expect(root.sessionStorage.getItem('remember')).to.not.be('');
|
||||||
expect(root.localStorage.getItem('remember')).to.not.be(undefined);
|
|
||||||
expect(root.localStorage.getItem('remember')).to.not.be('');
|
|
||||||
|
|
||||||
sUser = root.sessionStorage.getItem('user');
|
sUser = root.sessionStorage.getItem('user');
|
||||||
sRemember = root.sessionStorage.getItem('remember');
|
sRemember = root.sessionStorage.getItem('remember');
|
||||||
@ -774,7 +752,7 @@ Gun().user && describe('Gun', function(){
|
|||||||
root.sessionStorage.setItem('remember', sRemember);
|
root.sessionStorage.setItem('remember', sRemember);
|
||||||
|
|
||||||
return new Promise(function(resolve){
|
return new Promise(function(resolve){
|
||||||
callOnStore(function(store){
|
Gun.SEA._callonstore_(function(store){
|
||||||
store.put({id: sUser, auth: iAuth});
|
store.put({id: sUser, auth: iAuth});
|
||||||
}, resolve);
|
}, resolve);
|
||||||
});
|
});
|
||||||
@ -809,7 +787,7 @@ Gun().user && describe('Gun', function(){
|
|||||||
checkIndexedDB(sUser, 'auth', function(auth){
|
checkIndexedDB(sUser, 'auth', function(auth){
|
||||||
try{ expect(auth).to.not.be(iAuth) }catch(e){ done(e) }
|
try{ expect(auth).to.not.be(iAuth) }catch(e){ done(e) }
|
||||||
// Then restore IndexedDB auth data, skip sessionStorage
|
// Then restore IndexedDB auth data, skip sessionStorage
|
||||||
callOnStore(function(store){
|
Gun.SEA._callonstore_(function(store){
|
||||||
store.put({id: sUser, auth: iAuth});
|
store.put({id: sUser, auth: iAuth});
|
||||||
}, function(){
|
}, function(){
|
||||||
root.sessionStorage.setItem('user', sUser);
|
root.sessionStorage.setItem('user', sUser);
|
||||||
@ -868,7 +846,7 @@ Gun().user && describe('Gun', function(){
|
|||||||
checkIndexedDB(sUser, 'auth', function(auth){
|
checkIndexedDB(sUser, 'auth', function(auth){
|
||||||
try{ expect(auth).to.not.be(iAuth) }catch(e){ done(e) }
|
try{ expect(auth).to.not.be(iAuth) }catch(e){ done(e) }
|
||||||
// Then restore IndexedDB auth data, skip sessionStorage
|
// Then restore IndexedDB auth data, skip sessionStorage
|
||||||
callOnStore(function(store){
|
Gun.SEA._callonstore_(function(store){
|
||||||
store.put({id: sUser, auth: iAuth});
|
store.put({id: sUser, auth: iAuth});
|
||||||
}, function(){
|
}, function(){
|
||||||
root.sessionStorage.setItem('user', sUser);
|
root.sessionStorage.setItem('user', sUser);
|
||||||
@ -942,8 +920,6 @@ Gun().user && describe('Gun', function(){
|
|||||||
sRemember = root.sessionStorage.getItem('remember');
|
sRemember = root.sessionStorage.getItem('remember');
|
||||||
expect(sRemember).to.not.be(undefined);
|
expect(sRemember).to.not.be(undefined);
|
||||||
expect(sRemember).to.not.be('');
|
expect(sRemember).to.not.be('');
|
||||||
expect(root.localStorage.getItem('remember')).to.not.be(undefined);
|
|
||||||
expect(root.localStorage.getItem('remember')).to.not.be('');
|
|
||||||
}catch(e){ done(e); return }
|
}catch(e){ done(e); return }
|
||||||
|
|
||||||
return new Promise(function(resolve){
|
return new Promise(function(resolve){
|
||||||
@ -969,7 +945,7 @@ Gun().user && describe('Gun', function(){
|
|||||||
root.sessionStorage.setItem('remember', sRemember);
|
root.sessionStorage.setItem('remember', sRemember);
|
||||||
|
|
||||||
return new Promise(function(resolve){
|
return new Promise(function(resolve){
|
||||||
callOnStore(function(store){
|
Gun.SEA._callonstore_(function(store){
|
||||||
store.put({id: sUser, auth: iAuth});
|
store.put({id: sUser, auth: iAuth});
|
||||||
}, resolve);
|
}, resolve);
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user