diff options
Diffstat (limited to 'extension/lib')
-rw-r--r-- | extension/lib/wallet/wallet.ts | 103 | ||||
-rw-r--r-- | extension/lib/wallet/wxApi.ts | 40 | ||||
-rw-r--r-- | extension/lib/wallet/wxMessaging.ts (renamed from extension/lib/wallet/wxmessaging.ts) | 4 |
3 files changed, 100 insertions, 47 deletions
diff --git a/extension/lib/wallet/wallet.ts b/extension/lib/wallet/wallet.ts index ed719211f..448714254 100644 --- a/extension/lib/wallet/wallet.ts +++ b/extension/lib/wallet/wallet.ts @@ -108,60 +108,55 @@ class MintInfo implements IMintInfo { * the first error. */ mergeKeys(newKeys: KeysJson, wallet: Wallet): Promise<void> { - return Promise.resolve().then(() => { - if (!this.masterPublicKey) { - this.masterPublicKey = newKeys.master_public_key; - } + if (!this.masterPublicKey) { + this.masterPublicKey = newKeys.master_public_key; + } - if (this.masterPublicKey != newKeys.master_public_key) { - throw Error("public keys do not match"); - } + if (this.masterPublicKey != newKeys.master_public_key) { + throw Error("public keys do not match"); + } - for (let newDenom of newKeys.denoms) { - let found = false; - for (let oldDenom of this.denoms) { - if (oldDenom.denom_pub === newDenom.denom_pub) { - let a = Object.assign({}, oldDenom); - let b = Object.assign({}, newDenom); - // pub hash is only there for convenience in the wallet - delete a["pub_hash"]; - delete b["pub_hash"]; - if (!_.isEqual(a, b)) { - console.log("old/new:"); - console.dir(a); - console.dir(b); - throw Error("denomination modified"); - } - // TODO: check if info still matches - found = true; - break; + let ps = newKeys.denoms.map((newDenom) => { + let found = false; + for (let oldDenom of this.denoms) { + if (oldDenom.denom_pub === newDenom.denom_pub) { + let a = Object.assign({}, oldDenom); + let b = Object.assign({}, newDenom); + // pub hash is only there for convenience in the wallet + delete a["pub_hash"]; + delete b["pub_hash"]; + if (!deepEquals(a, b)) { + console.log("old/new:"); + console.dir(a); + console.dir(b); + throw Error("denomination modified"); } + found = true; + break; } + } - if (found) { - continue; - } - - console.log("validating denomination"); - - return wallet.isValidDenom(newDenom, this.masterPublicKey) - .then((valid) => { - if (!valid) { - throw Error("signature on denomination invalid"); - } + if (found) { + return Promise.resolve(); + } - let d: Denomination = Object.assign({}, newDenom); - d.pub_hash = native.RsaPublicKey.fromCrock(d.denom_pub) - .encode() - .hash() - .toCrock(); - this.denoms.push(d); + return wallet.isValidDenom(newDenom, this.masterPublicKey) + .then((valid) => { + if (!valid) { + throw Error("signature on denomination invalid"); + } - }); + let d: Denomination = Object.assign({}, newDenom); + d.pub_hash = native.RsaPublicKey.fromCrock(d.denom_pub) + .encode() + .hash() + .toCrock(); + this.denoms.push(d); - } - return; + }); }); + + return Promise.all(ps).then(() => void 0); } } @@ -308,6 +303,21 @@ export interface Badge { type PayCoinInfo = Array<{ updatedCoin: Coin, sig: CoinPaySig }>; +function deepEquals(x, y) { + if (x === y) { + return true; + } + + if (Array.isArray(x) && x.length !== y.length) { + return false; + } + + var p = Object.keys(x); + return Object.keys(y).every((i) => p.indexOf(i) !== -1) && + p.every((i) => deepEquals(x[i], y[i])); +} + + function getTalerStampSec(stamp: string) { const m = stamp.match(/\/?Date\(([0-9]*)\)\/?/); if (!m) { @@ -603,6 +613,9 @@ export class Wallet { payReq: payReq, }; + console.log("pay request"); + console.dir(payReq); + let historyEntry = { type: "pay", timestamp: (new Date).getTime(), diff --git a/extension/lib/wallet/wxApi.ts b/extension/lib/wallet/wxApi.ts new file mode 100644 index 000000000..9871b6e7f --- /dev/null +++ b/extension/lib/wallet/wxApi.ts @@ -0,0 +1,40 @@ +/* + This file is part of TALER + (C) 2016 GNUnet e.V. + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/> + */ + +import {AmountJson} from "./types"; +import {ReserveCreationInfo} from "./types"; + +/** + * Interface to the wallet through WebExtension messaging. + */ + + +export function getReserveCreationInfo(baseUrl: string, + amount: AmountJson): Promise<ReserveCreationInfo> { + let m = {type: "reserve-creation-info", detail: {baseUrl, amount}}; + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage(m, (resp) => { + if (resp.error) { + console.error("error response", resp); + let e = Error("call to reserve-creation-info failed"); + (e as any).errorResponse = resp; + reject(e); + return; + } + resolve(resp); + }); + }); +}
\ No newline at end of file diff --git a/extension/lib/wallet/wxmessaging.ts b/extension/lib/wallet/wxMessaging.ts index fc99a2054..df79648ab 100644 --- a/extension/lib/wallet/wxmessaging.ts +++ b/extension/lib/wallet/wxMessaging.ts @@ -140,7 +140,7 @@ function dispatch(handlers, req, sendResponse) { }) .catch((e) => { console.log("exception during wallet handler"); - console.error(e.stack); + console.error(e); sendResponse({ error: "exception", hint: e.message, @@ -206,7 +206,7 @@ export function wxMain() { return dispatch(handlers, req, sendResponse) } catch (e) { console.log("exception during wallet handler (dispatch)"); - console.error(e.stack); + console.error(e); sendResponse({ error: "exception", hint: e.message, |