Removed rest of the localStorage code & comments

This commit is contained in:
mhelander 2017-09-18 08:53:42 +03:00
parent 22f07734fc
commit d32eaf833e
2 changed files with 53 additions and 79 deletions

90
sea.js
View File

@ -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;

View File

@ -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);
}); });