mirror of
https://github.com/amark/gun.git
synced 2025-06-04 13: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.
|
||||
function authenticate(alias,pass,root){
|
||||
return new Promise(function(resolve, reject){
|
||||
@ -154,7 +153,6 @@
|
||||
}).catch(function(e){ reject({err: e}) });
|
||||
});
|
||||
}
|
||||
|
||||
// This internal func finalizes User authentication
|
||||
function finalizelogin(alias,key,root,opts){
|
||||
var user = root._.user;
|
||||
@ -175,25 +173,7 @@
|
||||
return user._;
|
||||
});
|
||||
}
|
||||
|
||||
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_() }
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
// This updates sessionStorage & IndexedDB to persist authenticated "session"
|
||||
function updatestorage(proof,priv,pin){
|
||||
return function(props){
|
||||
return new Promise(function(resolve, reject){
|
||||
@ -203,43 +183,42 @@
|
||||
delete props.remember; // Not stored if present
|
||||
|
||||
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){
|
||||
sessionStorage.setItem('user', props.alias);
|
||||
sessionStorage.setItem('remember', signed);
|
||||
if(!encrypted){
|
||||
if(!persist){
|
||||
return new Promise(function(resolve){
|
||||
callOnStore(function(store) {
|
||||
SEA._callonstore_(function(store) {
|
||||
var act = store.clear(); // Wipes whole IndexedDB
|
||||
act.onsuccess = function(){};
|
||||
}, function(){ resolve() });
|
||||
});
|
||||
}
|
||||
}).then(function(){
|
||||
return !encrypted || SEA.enc(encrypted, pin).then(function(encrypted){
|
||||
return encrypted && SEA.write(encrypted, priv).then(function(encsig){
|
||||
return !persist || SEA.enc(persist, pin).then(function(encrypted){
|
||||
return encrypted && SEA.write(encrypted, priv).then(function(signed){
|
||||
return new Promise(function(resolve){
|
||||
callOnStore(function(store){
|
||||
store.put({id: props.alias, auth: encsig});
|
||||
SEA._callonstore_(function(store){
|
||||
store.put({id: props.alias, auth: signed});
|
||||
}, function(){ resolve() });
|
||||
});
|
||||
}).catch(reject);
|
||||
}).catch(reject);
|
||||
}).then(function(){ resolve(props) })
|
||||
.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:
|
||||
// called when app bootstraps, with wanted options
|
||||
// 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
|
||||
var pin = Gun.obj.has(opts, 'pin') && opts.pin
|
||||
&& new Buffer(opts.pin, 'utf8').toString('base64');
|
||||
@ -274,6 +253,7 @@
|
||||
// This internal func recalls persisted User authentication if so configured
|
||||
function authrecall(root,authprops){
|
||||
return new Promise(function(resolve, reject){
|
||||
// TODO: sessionStorage to only hold signed { alias, pin } !!!
|
||||
var remember = authprops || sessionStorage.getItem('remember');
|
||||
var alias = Gun.obj.has(authprops, 'alias') && authprops.alias
|
||||
|| sessionStorage.getItem('user');
|
||||
@ -330,10 +310,10 @@
|
||||
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')
|
||||
&& 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){
|
||||
var remember;
|
||||
callOnStore(function(store) {
|
||||
SEA._callonstore_(function(store) {
|
||||
var getData = store.get(alias);
|
||||
getData.onsuccess = function(){
|
||||
remember = getData.result && getData.result.auth;
|
||||
@ -388,7 +368,7 @@
|
||||
return reject({err: 'No authentication session found!'});
|
||||
}
|
||||
var gotRemember;
|
||||
callOnStore(function(store) {
|
||||
SEA._callonstore_(function(store) {
|
||||
var getData = store.get(alias);
|
||||
getData.onsuccess = function(){
|
||||
gotRemember = getData.result && getData.result.auth;
|
||||
@ -433,13 +413,13 @@
|
||||
if(authsettings.validity && typeof window !== 'undefined'
|
||||
&& Gun.obj.has(p, 'pub') && Gun.obj.has(p, 'key')){
|
||||
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});
|
||||
}, function(){ resolve(key) }); });
|
||||
};
|
||||
if(Gun.obj.has(p, 'set')){ return importAndStoreKey() } // proof update so overwrite
|
||||
var aesKey;
|
||||
callOnStore(function(store) {
|
||||
SEA._callonstore_(function(store) {
|
||||
var getData = store.get(p.pub);
|
||||
getData.onsuccess = function(){ aesKey = getData.result && getData.result.key };
|
||||
}, function(){ return aesKey ? resolve(aesKey) : importAndStoreKey() });
|
||||
@ -649,7 +629,7 @@
|
||||
// TODO: how this works:
|
||||
// called when app bootstraps, with wanted options
|
||||
// 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
|
||||
: _initial_authsettings.validity;
|
||||
if(Gun.obj.has(opts, 'session')){
|
||||
@ -985,6 +965,24 @@
|
||||
doIt(cb, function(){cb()});
|
||||
} 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;
|
||||
|
||||
|
42
test/sea.js
42
test/sea.js
@ -7,34 +7,15 @@ var root;
|
||||
|
||||
(function(env){
|
||||
root = env.window ? env.window : global;
|
||||
root.indexedDB = require("fake-indexeddb");
|
||||
}(this));
|
||||
|
||||
if(typeof Buffer === 'undefined'){
|
||||
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_){
|
||||
var result;
|
||||
callOnStore(function(store) {
|
||||
Gun.SEA._callonstore_(function(store) {
|
||||
var getData = store.get(key);
|
||||
getData.onsuccess = function(){
|
||||
result = getData.result && getData.result[prop];
|
||||
@ -258,10 +239,9 @@ Gun().user && describe('Gun', function(){
|
||||
|
||||
if(wipeStorageData){
|
||||
// ... and persisted session
|
||||
// localStorage.removeItem('remember');
|
||||
sessionStorage.removeItem('remember');
|
||||
sessionStorage.removeItem('alias');
|
||||
callOnStore(function(store) {
|
||||
Gun.SEA._callonstore_(function(store) {
|
||||
var act = store.clear(); // Wipes whole IndexedDB
|
||||
act.onsuccess = function(){};
|
||||
});
|
||||
@ -641,7 +621,7 @@ Gun().user && describe('Gun', function(){
|
||||
return !pin ? sessionStorage.setItem('remember', remember)
|
||||
: Gun.SEA.enc(remember, pin).then(function(encauth){
|
||||
return new Promise(function(resolve){
|
||||
callOnStore(function(store){
|
||||
Gun.SEA._callonstore_(function(store){
|
||||
store.put({id: usr._.alias, auth: encauth});
|
||||
}, 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(){
|
||||
user.auth(alias+type, pass+' new', {pin: 'PIN'})
|
||||
.then(doCheck(done, true)).catch(done);
|
||||
@ -731,7 +711,7 @@ Gun().user && describe('Gun', function(){
|
||||
}).catch(done);
|
||||
});
|
||||
|
||||
it('valid localStorage session bootstrap', function(done){
|
||||
it('valid IndexedDB session bootstrap', function(done){
|
||||
var sUser;
|
||||
var sRemember;
|
||||
var iAuth;
|
||||
@ -744,8 +724,6 @@ Gun().user && describe('Gun', function(){
|
||||
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('');
|
||||
expect(root.localStorage.getItem('remember')).to.not.be(undefined);
|
||||
expect(root.localStorage.getItem('remember')).to.not.be('');
|
||||
|
||||
sUser = root.sessionStorage.getItem('user');
|
||||
sRemember = root.sessionStorage.getItem('remember');
|
||||
@ -774,7 +752,7 @@ Gun().user && describe('Gun', function(){
|
||||
root.sessionStorage.setItem('remember', sRemember);
|
||||
|
||||
return new Promise(function(resolve){
|
||||
callOnStore(function(store){
|
||||
Gun.SEA._callonstore_(function(store){
|
||||
store.put({id: sUser, auth: iAuth});
|
||||
}, resolve);
|
||||
});
|
||||
@ -809,7 +787,7 @@ Gun().user && describe('Gun', function(){
|
||||
checkIndexedDB(sUser, 'auth', function(auth){
|
||||
try{ expect(auth).to.not.be(iAuth) }catch(e){ done(e) }
|
||||
// Then restore IndexedDB auth data, skip sessionStorage
|
||||
callOnStore(function(store){
|
||||
Gun.SEA._callonstore_(function(store){
|
||||
store.put({id: sUser, auth: iAuth});
|
||||
}, function(){
|
||||
root.sessionStorage.setItem('user', sUser);
|
||||
@ -868,7 +846,7 @@ Gun().user && describe('Gun', function(){
|
||||
checkIndexedDB(sUser, 'auth', function(auth){
|
||||
try{ expect(auth).to.not.be(iAuth) }catch(e){ done(e) }
|
||||
// Then restore IndexedDB auth data, skip sessionStorage
|
||||
callOnStore(function(store){
|
||||
Gun.SEA._callonstore_(function(store){
|
||||
store.put({id: sUser, auth: iAuth});
|
||||
}, function(){
|
||||
root.sessionStorage.setItem('user', sUser);
|
||||
@ -942,8 +920,6 @@ Gun().user && describe('Gun', function(){
|
||||
sRemember = root.sessionStorage.getItem('remember');
|
||||
expect(sRemember).to.not.be(undefined);
|
||||
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 }
|
||||
|
||||
return new Promise(function(resolve){
|
||||
@ -969,7 +945,7 @@ Gun().user && describe('Gun', function(){
|
||||
root.sessionStorage.setItem('remember', sRemember);
|
||||
|
||||
return new Promise(function(resolve){
|
||||
callOnStore(function(store){
|
||||
Gun.SEA._callonstore_(function(store){
|
||||
store.put({id: sUser, auth: iAuth});
|
||||
}, resolve);
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user