Merge pull request #13 from sairajzero/master
This commit is contained in:
commit
634aa5aebd
@ -7231,7 +7231,7 @@ Bitcoin.Util = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<script id="floBlockchainAPI" version="2.0.0">
|
<script id="floBlockchainAPI" version="2.0.1">
|
||||||
/* FLO Blockchain Operator to send/receive data from blockchain using API calls*/
|
/* FLO Blockchain Operator to send/receive data from blockchain using API calls*/
|
||||||
const floBlockchainAPI = {
|
const floBlockchainAPI = {
|
||||||
|
|
||||||
@ -7592,6 +7592,14 @@ Bitcoin.Util = {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getTx: function (txid) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.promisedAPI(`api/tx/${txid}`)
|
||||||
|
.then(response => resolve(response))
|
||||||
|
.catch(error => reject(error))
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
//Read Txs of Address between from and to
|
//Read Txs of Address between from and to
|
||||||
readTxs: function (addr, from, to) {
|
readTxs: function (addr, from, to) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
@ -7667,7 +7675,7 @@ Bitcoin.Util = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<script id="compactIDB" version="2.0.0">
|
<script id="compactIDB" version="2.0.1">
|
||||||
/* Compact IndexedDB operations */
|
/* Compact IndexedDB operations */
|
||||||
|
|
||||||
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
|
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
|
||||||
@ -7683,43 +7691,66 @@ Bitcoin.Util = {
|
|||||||
this.defaultDB = dbName;
|
this.defaultDB = dbName;
|
||||||
},
|
},
|
||||||
|
|
||||||
initDB: function (dbName, objectStores = {}, version = null, removeStores = []) {
|
upgradeDB: function (dbName, createList = null, deleteList = null) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.defaultDB = this.defaultDB || dbName;
|
this.getDBversion(dbName).then(version => {
|
||||||
var idb = version ? indexedDB.open(dbName, version) : indexedDB.open(dbName);
|
var idb = indexedDB.open(dbName, version + 1);
|
||||||
idb.onerror = (event) => {
|
idb.onerror = (event) => reject("Error in opening IndexedDB");
|
||||||
reject("Error in opening IndexedDB!");
|
idb.onupgradeneeded = (event) => {
|
||||||
};
|
let db = event.target.result;
|
||||||
idb.onupgradeneeded = (event) => {
|
if (createList instanceof Object) {
|
||||||
var db = event.target.result;
|
if (Array.isArray(createList)) {
|
||||||
for (let obs in objectStores) {
|
let tmp = {}
|
||||||
var objectStore = db.createObjectStore(obs, objectStores[obs].options ||
|
createList.forEach(o => tmp[o] = {})
|
||||||
{});
|
createList = tmp
|
||||||
if (objectStores[obs].indexes && typeof objectStores[obs].indexes ===
|
}
|
||||||
'object')
|
for (let o in createList) {
|
||||||
for (let i in objectStores[obs].indexes)
|
let obs = db.createObjectStore(o, createList[o].options ||
|
||||||
objectStore.createIndex(i, i, objectStores[obs].indexes[i] || {});
|
{});
|
||||||
|
if (createList[o].indexes instanceof Object)
|
||||||
|
for (let i in createList[o].indexes)
|
||||||
|
obs.createIndex(i, i, createList[o].indexes || {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Array.isArray(deleteList))
|
||||||
|
deleteList.forEach(o => db.deleteObjectStore(o));
|
||||||
|
resolve('Database upgraded')
|
||||||
}
|
}
|
||||||
if (version)
|
idb.onsuccess = (event) => event.target.result.close();
|
||||||
removeStores.forEach(obs => db.deleteObjectStore(obs));
|
}).catch(error => reject(error))
|
||||||
}
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
initDB: function (dbName, objectStores = {}) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
if (!(objectStores instanceof Object))
|
||||||
|
return reject('ObjectStores must be an object or array')
|
||||||
|
this.defaultDB = this.defaultDB || dbName;
|
||||||
|
var idb = indexedDB.open(dbName);
|
||||||
|
idb.onerror = (event) => reject("Error in opening IndexedDB");
|
||||||
idb.onsuccess = (event) => {
|
idb.onsuccess = (event) => {
|
||||||
var db = event.target.result;
|
var db = event.target.result;
|
||||||
if (JSON.stringify(Object.values(db.objectStoreNames).sort()) === JSON
|
let cList = Object.values(db.objectStoreNames);
|
||||||
.stringify(Object.keys(objectStores).sort()))
|
var obs = {},
|
||||||
|
a_obs = {},
|
||||||
|
d_obs = [];
|
||||||
|
if (!Array.isArray(objectStores))
|
||||||
|
var obs = objectStores
|
||||||
|
else
|
||||||
|
objectStores.forEach(o => obs[o] = {})
|
||||||
|
let nList = Object.keys(obs)
|
||||||
|
for (let o of nList)
|
||||||
|
if (!cList.includes(o))
|
||||||
|
a_obs[o] = obs[o]
|
||||||
|
for (let o of cList)
|
||||||
|
if (!nList.includes(o))
|
||||||
|
d_obs.push(o)
|
||||||
|
if (!Object.keys(a_obs).length && !d_obs.length)
|
||||||
resolve("Initiated IndexedDB");
|
resolve("Initiated IndexedDB");
|
||||||
else {
|
else
|
||||||
let removeObs = [];
|
this.upgradeDB(dbName, a_obs, d_obs)
|
||||||
Object.values(db.objectStoreNames).forEach(obs => {
|
.then(result => resolve(result))
|
||||||
if (obs in objectStores)
|
.catch(error => reject(error))
|
||||||
delete objectStores[obs]
|
|
||||||
else
|
|
||||||
removeObs.push(obs)
|
|
||||||
})
|
|
||||||
this.initDB(dbName, objectStores, db.version + 1, removeObs)
|
|
||||||
.then(result => resolve(result))
|
|
||||||
.catch(error => reject(error))
|
|
||||||
}
|
|
||||||
db.close();
|
db.close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -7728,7 +7759,12 @@ Bitcoin.Util = {
|
|||||||
openDB: function (dbName = this.defaultDB) {
|
openDB: function (dbName = this.defaultDB) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
var idb = indexedDB.open(dbName);
|
var idb = indexedDB.open(dbName);
|
||||||
idb.onerror = (event) => reject("Error in opening IndexedDB!");
|
idb.onerror = (event) => reject("Error in opening IndexedDB");
|
||||||
|
idb.onupgradeneeded = (event) => {
|
||||||
|
event.target.result.close();
|
||||||
|
this.deleteDB(dbName)
|
||||||
|
reject("Datebase not found")
|
||||||
|
}
|
||||||
idb.onsuccess = (event) => resolve(event.target.result);
|
idb.onsuccess = (event) => resolve(event.target.result);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -7741,6 +7777,15 @@ Bitcoin.Util = {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getDBversion: function (dbName = this.defaultDB) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.openDB(dbName).then(db => {
|
||||||
|
resolve(db.version)
|
||||||
|
db.close()
|
||||||
|
}).catch(error => reject(error))
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
writeData: function (obsName, data, key = false, dbName = this.defaultDB) {
|
writeData: function (obsName, data, key = false, dbName = this.defaultDB) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.openDB(dbName).then(db => {
|
this.openDB(dbName).then(db => {
|
||||||
@ -7867,7 +7912,7 @@ Bitcoin.Util = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<script id="floCloudAPI" version="2.0.2a">
|
<script id="floCloudAPI" version="2.0.2c">
|
||||||
/* FLO Cloud operations to send/request application data*/
|
/* FLO Cloud operations to send/request application data*/
|
||||||
const floCloudAPI = {
|
const floCloudAPI = {
|
||||||
|
|
||||||
@ -8011,25 +8056,35 @@ Bitcoin.Util = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
inactive: [],
|
||||||
connect(snID) {
|
connect(snID) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (!(snID in floGlobals.supernodes))
|
if (!(snID in floGlobals.supernodes))
|
||||||
return reject(`${snID} is not a supernode`)
|
return reject(`${snID} is not a supernode`)
|
||||||
|
let inactive = this.inactive
|
||||||
|
if (inactive.includes(snID))
|
||||||
|
return reject(`${snID} is not active`)
|
||||||
var wsConn = new WebSocket("wss://" + floGlobals.supernodes[snID].uri + "/ws");
|
var wsConn = new WebSocket("wss://" + floGlobals.supernodes[snID].uri + "/ws");
|
||||||
wsConn.onmessage = (evt) => {
|
wsConn.onmessage = (evt) => {
|
||||||
if (evt.data == '$+')
|
if (evt.data == '$+')
|
||||||
resolve(wsConn)
|
resolve(wsConn)
|
||||||
else if (evt.data == '$-') {
|
else if (evt.data == '$-') {
|
||||||
wsConn.close();
|
wsConn.close();
|
||||||
|
inactive.push(snID)
|
||||||
reject(`${snID} is not active`)
|
reject(`${snID} is not active`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wsConn.onerror = evt => reject(`${snID} is unavailable`)
|
wsConn.onerror = evt => {
|
||||||
|
inactive.push(snID)
|
||||||
|
reject(`${snID} is unavailable`)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
connectActive(snID, reverse = false) {
|
connectActive(snID, reverse = false) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
if (this.inactive.length === this.kBucket.SNCO.length)
|
||||||
|
return reject('Cloud offline')
|
||||||
if (!(snID in floGlobals.supernodes))
|
if (!(snID in floGlobals.supernodes))
|
||||||
snID = this.kBucket.closestNode(snID);
|
snID = this.kBucket.closestNode(snID);
|
||||||
this.connect(snID)
|
this.connect(snID)
|
||||||
@ -8068,7 +8123,7 @@ Bitcoin.Util = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
liveRequest: function (floID, datareq, callback) {
|
liveRequest: function (floID, datareq, callback) {
|
||||||
request = {
|
let request = {
|
||||||
...datareq.request
|
...datareq.request
|
||||||
};
|
};
|
||||||
const checkFilter = (v, d, r) =>
|
const checkFilter = (v, d, r) =>
|
||||||
@ -8090,15 +8145,18 @@ Bitcoin.Util = {
|
|||||||
else if (evt.data.startsWith(floID, 1))
|
else if (evt.data.startsWith(floID, 1))
|
||||||
var i = 36
|
var i = 36
|
||||||
else return;
|
else return;
|
||||||
|
let d = e = null;
|
||||||
try {
|
try {
|
||||||
let data = JSON.parse(evt.data.substring(i))
|
let data = JSON.parse(evt.data.substring(i))
|
||||||
let filter = {}
|
let filter = {}
|
||||||
for (let v in data)
|
for (let v in data)
|
||||||
if (checkFilter(v, data[v], request))
|
if (checkFilter(v, data[v], request))
|
||||||
filter[v] = data[v]
|
filter[v] = data[v]
|
||||||
callback(filter, null)
|
d = filter
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
callback(null, evt.data.substring(i))
|
e = evt.data.substring(i)
|
||||||
|
} finally {
|
||||||
|
callback(d, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.liveRequest[randID] = node;
|
this.liveRequest[randID] = node;
|
||||||
@ -8629,7 +8687,7 @@ Bitcoin.Util = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<script id="floDapps" version="2.0.1">
|
<script id="floDapps" version="2.0.1a">
|
||||||
/* General functions for FLO Dapps*/
|
/* General functions for FLO Dapps*/
|
||||||
const floDapps = {
|
const floDapps = {
|
||||||
|
|
||||||
@ -9029,14 +9087,14 @@ Bitcoin.Util = {
|
|||||||
return reject("Invalid floID!")
|
return reject("Invalid floID!")
|
||||||
compactIDB.writeData("contacts", name, floID, `floDapps#${myFloID}`).then(result => {
|
compactIDB.writeData("contacts", name, floID, `floDapps#${myFloID}`).then(result => {
|
||||||
floGlobals.contacts[floID] = name;
|
floGlobals.contacts[floID] = name;
|
||||||
resolve(result)
|
resolve("Contact stored")
|
||||||
}).catch(error => reject(error))
|
}).catch(error => reject(error))
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
storePubKey(floID, pubKey) {
|
storePubKey(floID, pubKey) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (floID in floGlobals.pubKey)
|
if (floID in floGlobals.pubKeys)
|
||||||
return resolve("pubKey already stored")
|
return resolve("pubKey already stored")
|
||||||
if (!floCrypto.validateAddr(floID))
|
if (!floCrypto.validateAddr(floID))
|
||||||
return reject("Invalid floID!")
|
return reject("Invalid floID!")
|
||||||
@ -9044,7 +9102,7 @@ Bitcoin.Util = {
|
|||||||
return reject("Incorrect pubKey")
|
return reject("Incorrect pubKey")
|
||||||
compactIDB.writeData("pubKeys", pubKey, floID, `floDapps#${myFloID}`).then(result => {
|
compactIDB.writeData("pubKeys", pubKey, floID, `floDapps#${myFloID}`).then(result => {
|
||||||
floGlobals.pubKeys[floID] = pubKey;
|
floGlobals.pubKeys[floID] = pubKey;
|
||||||
resolve(result)
|
resolve("pubKey stored")
|
||||||
}).catch(error => reject(error))
|
}).catch(error => reject(error))
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -9074,8 +9132,10 @@ Bitcoin.Util = {
|
|||||||
}
|
}
|
||||||
options.callback = (d, e) => {
|
options.callback = (d, e) => {
|
||||||
for (let v in d) {
|
for (let v in d) {
|
||||||
if ("secret" in d[v].message)
|
try {
|
||||||
d[v].message = floCrypto.decryptData(d[v].message, myPrivKey)
|
if (d[v].message instanceof Object && "secret" in d[v].message)
|
||||||
|
d[v].message = floCrypto.decryptData(d[v].message, myPrivKey)
|
||||||
|
} catch (error) {}
|
||||||
compactIDB.writeData("messages", d[v], v, `floDapps#${myFloID}`)
|
compactIDB.writeData("messages", d[v], v, `floDapps#${myFloID}`)
|
||||||
floGlobals.messages[v] = d[v]
|
floGlobals.messages[v] = d[v]
|
||||||
}
|
}
|
||||||
@ -9115,7 +9175,7 @@ Bitcoin.Util = {
|
|||||||
|
|
||||||
clearCredentials: function () {
|
clearCredentials: function () {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
compactIDB.clearData('credentials').then(result => {
|
compactIDB.clearData('credentials', floGlobals.application).then(result => {
|
||||||
localStorage.removeItem(`${floGlobals.application}#privKey`)
|
localStorage.removeItem(`${floGlobals.application}#privKey`)
|
||||||
myPrivKey = myPubKey = myFloID = undefined;
|
myPrivKey = myPubKey = myFloID = undefined;
|
||||||
resolve("privKey credentials deleted!")
|
resolve("privKey credentials deleted!")
|
||||||
@ -9123,11 +9183,11 @@ Bitcoin.Util = {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
deleteUserData: function(credentials = false) {
|
deleteUserData: function (credentials = false) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let p = []
|
let p = []
|
||||||
p.push(compactIDB.deleteDB(`floDapps#${myFloID}`))
|
p.push(compactIDB.deleteDB(`floDapps#${myFloID}`))
|
||||||
if(credentials)
|
if (credentials)
|
||||||
p.push(this.clearCredentials())
|
p.push(this.clearCredentials())
|
||||||
Promise.all(p)
|
Promise.all(p)
|
||||||
.then(result => resolve('User database(local) deleted'))
|
.then(result => resolve('User database(local) deleted'))
|
||||||
@ -9135,9 +9195,9 @@ Bitcoin.Util = {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
deleteAppData: function() {
|
deleteAppData: function () {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
compactIDB.deleteDB().then(result => {
|
compactIDB.deleteDB(floGlobals.application).then(result => {
|
||||||
localStorage.removeItem(`${floGlobals.application}#privKey`)
|
localStorage.removeItem(`${floGlobals.application}#privKey`)
|
||||||
myPrivKey = myPubKey = myFloID = undefined;
|
myPrivKey = myPubKey = myFloID = undefined;
|
||||||
resolve("App database(local) deleted")
|
resolve("App database(local) deleted")
|
||||||
@ -9155,8 +9215,10 @@ Bitcoin.Util = {
|
|||||||
let threshold = indexArr.length;
|
let threshold = indexArr.length;
|
||||||
let shares = floCrypto.createShamirsSecretShares(encryptedKey, threshold, threshold)
|
let shares = floCrypto.createShamirsSecretShares(encryptedKey, threshold, threshold)
|
||||||
let promises = [];
|
let promises = [];
|
||||||
|
let overwriteFn = (share, index) =>
|
||||||
|
compactIDB.writeData("credentials", share, index, floGlobals.application);
|
||||||
for (var i = 0; i < threshold; i++)
|
for (var i = 0; i < threshold; i++)
|
||||||
promises.push(compactIDB.writeData("credentials", shares[i], indexArr[i]));
|
promises.push(overwriteFn(shares[i], indexArr[i]));
|
||||||
Promise.all(promises)
|
Promise.all(promises)
|
||||||
.then(results => resolve("Private Key Secured"))
|
.then(results => resolve("Private Key Secured"))
|
||||||
.catch(error => reject(error))
|
.catch(error => reject(error))
|
||||||
@ -9186,7 +9248,7 @@ Bitcoin.Util = {
|
|||||||
for (let f in filteredResult) {
|
for (let f in filteredResult) {
|
||||||
let data = filteredResult[f]
|
let data = filteredResult[f]
|
||||||
try {
|
try {
|
||||||
if ("secret" in data.message && "senderPublicKeyString" in data.message) {
|
if (data.message instanceof Object && "secret" in data.message) {
|
||||||
for (let key of decryptionKey) {
|
for (let key of decryptionKey) {
|
||||||
try {
|
try {
|
||||||
let tmp = floCrypto.decryptData(data.message, key)
|
let tmp = floCrypto.decryptData(data.message, key)
|
||||||
@ -9233,14 +9295,14 @@ Bitcoin.Util = {
|
|||||||
let vc = Object.keys(response).sort().pop()
|
let vc = Object.keys(response).sort().pop()
|
||||||
let sync = JSON.parse(Crypto.AES.decrypt(response[vc].message, myPrivKey))
|
let sync = JSON.parse(Crypto.AES.decrypt(response[vc].message, myPrivKey))
|
||||||
let promises = []
|
let promises = []
|
||||||
let store = (key, val, obs) =>
|
let store = (key, val, obs) =>
|
||||||
promises.push(compactIDB.writeData(obs, val, key, `floDapps#${floID}`))
|
promises.push(compactIDB.writeData(obs, val, key, `floDapps#${floID}`))[
|
||||||
["contacts", "pubKeys", "messages"].forEach(c => {
|
"contacts", "pubKeys", "messages"].forEach(c => {
|
||||||
for (let i in sync[c]) {
|
for (let i in sync[c]) {
|
||||||
store(i, sync[c][i], c)
|
store(i, sync[c][i], c)
|
||||||
floGlobals[c][i] = sync[c][i]
|
floGlobals[c][i] = sync[c][i]
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
Promise.all(promises)
|
Promise.all(promises)
|
||||||
.then(results => resolve("Sync data successful"))
|
.then(results => resolve("Sync data successful"))
|
||||||
.catch(error => reject(error))
|
.catch(error => reject(error))
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user