diff --git a/extension/background/main.ts b/extension/background/main.ts index 5fdee658e..4ec2c4d5d 100644 --- a/extension/background/main.ts +++ b/extension/background/main.ts @@ -23,8 +23,8 @@ // TypeScript does not allow ".js" extensions in the // module name, so SystemJS must add it. System.config({ - defaultJSExtensions: true, -}); + defaultJSExtensions: true, + }); // We expect that in the manifest, the emscripten js is loaded // becore the background page. @@ -36,14 +36,16 @@ if ("object" !== typeof Module) { // Manually register the emscripten js as a SystemJS, so that // we can use it from TypeScript by importing it. -let mod = System.newModule({Module: Module}); -let modName = System.normalizeSync("../lib/emscripten/emsc"); -console.log("registering", modName); -System.set(modName, mod); +{ + let mod = System.newModule({Module: Module}); + let modName = System.normalizeSync("../lib/emscripten/emsc"); + console.log("registering", modName); + System.set(modName, mod); +} -System.import("../lib/wallet/wxmessaging") - .then((wxmessaging) => { - wxmessaging.wxMain(); +System.import("../lib/wallet/wxMessaging") + .then((wxMessaging) => { + wxMessaging.wxMain(); }) .catch((e) => { console.log("wallet failed"); 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 { - 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"); - } - - let d: Denomination = Object.assign({}, newDenom); - d.pub_hash = native.RsaPublicKey.fromCrock(d.denom_pub) - .encode() - .hash() - .toCrock(); - this.denoms.push(d); - - }); - } - return; + + if (found) { + return Promise.resolve(); + } + + 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 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 + */ + +import {AmountJson} from "./types"; +import {ReserveCreationInfo} from "./types"; + +/** + * Interface to the wallet through WebExtension messaging. + */ + + +export function getReserveCreationInfo(baseUrl: string, + amount: AmountJson): Promise { + 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 similarity index 98% rename from extension/lib/wallet/wxmessaging.ts rename to 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, diff --git a/extension/manifest.json b/extension/manifest.json index 1589be886..2c74c0b48 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -2,7 +2,7 @@ "description": "Privacy preserving and transparent payments", "manifest_version": 2, "name": "GNU Taler Wallet (git)", - "version": "0.5.6", + "version": "0.5.9", "applications": { "gecko": { diff --git a/extension/pages/confirm-create-reserve.js b/extension/pages/confirm-create-reserve.js index 6241fcab0..610697246 100644 --- a/extension/pages/confirm-create-reserve.js +++ b/extension/pages/confirm-create-reserve.js @@ -13,10 +13,10 @@ You should have received a copy of the GNU General Public License along with TALER; see the file COPYING. If not, If not, see */ -System.register(["../lib/wallet/helpers", "../lib/wallet/types", "mithril"], function(exports_1, context_1) { +System.register(["../lib/wallet/helpers", "../lib/wallet/types", "mithril", "../lib/wallet/wxApi"], function(exports_1, context_1) { "use strict"; var __moduleName = context_1 && context_1.id; - var helpers_1, types_1, mithril_1; + var helpers_1, types_1, mithril_1, wxApi_1; var DelayTimer, Controller; function view(ctrl) { var controls = []; @@ -104,21 +104,6 @@ System.register(["../lib/wallet/helpers", "../lib/wallet/types", "mithril"], fun } return Promise.resolve(mint); } - function getReserveCreationInfo(baseUrl, amount) { - var m = { type: "reserve-creation-info", detail: { baseUrl: baseUrl, amount: amount } }; - return new Promise(function (resolve, reject) { - chrome.runtime.sendMessage(m, function (resp) { - if (resp.error) { - console.error("error response", resp); - var e = Error("call to reserve-creation-info failed"); - e.errorResponse = resp; - reject(e); - return; - } - resolve(resp); - }); - }); - } function main() { var url = URI(document.location.href); var query = URI.parseQuery(url.query()); @@ -149,6 +134,9 @@ System.register(["../lib/wallet/helpers", "../lib/wallet/types", "mithril"], fun }, function (mithril_1_1) { mithril_1 = mithril_1_1; + }, + function (wxApi_1_1) { + wxApi_1 = wxApi_1_1; }], execute: function() { "use strict"; @@ -208,7 +196,7 @@ System.register(["../lib/wallet/helpers", "../lib/wallet/types", "mithril"], fun } mithril_1.default.redraw(true); console.log("doing get mint info"); - getReserveCreationInfo(_this.url(), _this.amount) + wxApi_1.getReserveCreationInfo(_this.url(), _this.amount) .then(function (r) { console.log("get mint info resolved"); _this.isValidMint = true; diff --git a/extension/pages/confirm-create-reserve.tsx b/extension/pages/confirm-create-reserve.tsx index 386fa24e3..9ae2938f3 100644 --- a/extension/pages/confirm-create-reserve.tsx +++ b/extension/pages/confirm-create-reserve.tsx @@ -23,6 +23,7 @@ import {IMintInfo} from "../lib/wallet/types"; import {ReserveCreationInfo} from "../lib/wallet/types"; import MithrilComponent = _mithril.MithrilComponent; import {Denomination} from "../lib/wallet/types"; +import {getReserveCreationInfo} from "../lib/wallet/wxApi"; "use strict"; @@ -273,24 +274,6 @@ function getSuggestedMint(currency: string): Promise { } -function getReserveCreationInfo(baseUrl: string, - amount: AmountJson): Promise { - 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); - }); - }); -} - - export function main() { const url = URI(document.location.href); const query: any = URI.parseQuery(url.query()); diff --git a/extension/tsconfig.json b/extension/tsconfig.json index 96f360370..f11267a0c 100644 --- a/extension/tsconfig.json +++ b/extension/tsconfig.json @@ -22,7 +22,8 @@ "lib/wallet/query.ts", "lib/wallet/types.ts", "lib/wallet/wallet.ts", - "lib/wallet/wxmessaging.ts", + "lib/wallet/wxApi.ts", + "lib/wallet/wxMessaging.ts", "background/main.ts", "content_scripts/notify.ts", "popup/popup.tsx",