error handling

This commit is contained in:
Florian Dold 2016-02-19 04:23:00 +01:00
parent 5a12edcd5d
commit 29dfafaa12
8 changed files with 124 additions and 97 deletions

View File

@ -24,7 +24,7 @@
// module name, so SystemJS must add it. // module name, so SystemJS must add it.
System.config({ System.config({
defaultJSExtensions: true, defaultJSExtensions: true,
}); });
// We expect that in the manifest, the emscripten js is loaded // We expect that in the manifest, the emscripten js is loaded
// becore the background page. // becore the background page.
@ -36,14 +36,16 @@ if ("object" !== typeof Module) {
// Manually register the emscripten js as a SystemJS, so that // Manually register the emscripten js as a SystemJS, so that
// we can use it from TypeScript by importing it. // we can use it from TypeScript by importing it.
let mod = System.newModule({Module: Module}); {
let modName = System.normalizeSync("../lib/emscripten/emsc"); let mod = System.newModule({Module: Module});
console.log("registering", modName); let modName = System.normalizeSync("../lib/emscripten/emsc");
System.set(modName, mod); console.log("registering", modName);
System.set(modName, mod);
}
System.import("../lib/wallet/wxmessaging") System.import("../lib/wallet/wxMessaging")
.then((wxmessaging) => { .then((wxMessaging) => {
wxmessaging.wxMain(); wxMessaging.wxMain();
}) })
.catch((e) => { .catch((e) => {
console.log("wallet failed"); console.log("wallet failed");

View File

@ -108,7 +108,6 @@ class MintInfo implements IMintInfo {
* the first error. * the first error.
*/ */
mergeKeys(newKeys: KeysJson, wallet: Wallet): Promise<void> { mergeKeys(newKeys: KeysJson, wallet: Wallet): Promise<void> {
return Promise.resolve().then(() => {
if (!this.masterPublicKey) { if (!this.masterPublicKey) {
this.masterPublicKey = newKeys.master_public_key; this.masterPublicKey = newKeys.master_public_key;
} }
@ -117,7 +116,7 @@ class MintInfo implements IMintInfo {
throw Error("public keys do not match"); throw Error("public keys do not match");
} }
for (let newDenom of newKeys.denoms) { let ps = newKeys.denoms.map((newDenom) => {
let found = false; let found = false;
for (let oldDenom of this.denoms) { for (let oldDenom of this.denoms) {
if (oldDenom.denom_pub === newDenom.denom_pub) { if (oldDenom.denom_pub === newDenom.denom_pub) {
@ -126,24 +125,21 @@ class MintInfo implements IMintInfo {
// pub hash is only there for convenience in the wallet // pub hash is only there for convenience in the wallet
delete a["pub_hash"]; delete a["pub_hash"];
delete b["pub_hash"]; delete b["pub_hash"];
if (!_.isEqual(a, b)) { if (!deepEquals(a, b)) {
console.log("old/new:"); console.log("old/new:");
console.dir(a); console.dir(a);
console.dir(b); console.dir(b);
throw Error("denomination modified"); throw Error("denomination modified");
} }
// TODO: check if info still matches
found = true; found = true;
break; break;
} }
} }
if (found) { if (found) {
continue; return Promise.resolve();
} }
console.log("validating denomination");
return wallet.isValidDenom(newDenom, this.masterPublicKey) return wallet.isValidDenom(newDenom, this.masterPublicKey)
.then((valid) => { .then((valid) => {
if (!valid) { if (!valid) {
@ -158,10 +154,9 @@ class MintInfo implements IMintInfo {
this.denoms.push(d); 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 }>; 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) { function getTalerStampSec(stamp: string) {
const m = stamp.match(/\/?Date\(([0-9]*)\)\/?/); const m = stamp.match(/\/?Date\(([0-9]*)\)\/?/);
if (!m) { if (!m) {
@ -603,6 +613,9 @@ export class Wallet {
payReq: payReq, payReq: payReq,
}; };
console.log("pay request");
console.dir(payReq);
let historyEntry = { let historyEntry = {
type: "pay", type: "pay",
timestamp: (new Date).getTime(), timestamp: (new Date).getTime(),

View File

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

View File

@ -140,7 +140,7 @@ function dispatch(handlers, req, sendResponse) {
}) })
.catch((e) => { .catch((e) => {
console.log("exception during wallet handler"); console.log("exception during wallet handler");
console.error(e.stack); console.error(e);
sendResponse({ sendResponse({
error: "exception", error: "exception",
hint: e.message, hint: e.message,
@ -206,7 +206,7 @@ export function wxMain() {
return dispatch(handlers, req, sendResponse) return dispatch(handlers, req, sendResponse)
} catch (e) { } catch (e) {
console.log("exception during wallet handler (dispatch)"); console.log("exception during wallet handler (dispatch)");
console.error(e.stack); console.error(e);
sendResponse({ sendResponse({
error: "exception", error: "exception",
hint: e.message, hint: e.message,

View File

@ -2,7 +2,7 @@
"description": "Privacy preserving and transparent payments", "description": "Privacy preserving and transparent payments",
"manifest_version": 2, "manifest_version": 2,
"name": "GNU Taler Wallet (git)", "name": "GNU Taler Wallet (git)",
"version": "0.5.6", "version": "0.5.9",
"applications": { "applications": {
"gecko": { "gecko": {

View File

@ -13,10 +13,10 @@
You should have received a copy of the GNU General Public License along with 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/> TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/>
*/ */
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"; "use strict";
var __moduleName = context_1 && context_1.id; 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; var DelayTimer, Controller;
function view(ctrl) { function view(ctrl) {
var controls = []; var controls = [];
@ -104,21 +104,6 @@ System.register(["../lib/wallet/helpers", "../lib/wallet/types", "mithril"], fun
} }
return Promise.resolve(mint); 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() { function main() {
var url = URI(document.location.href); var url = URI(document.location.href);
var query = URI.parseQuery(url.query()); var query = URI.parseQuery(url.query());
@ -149,6 +134,9 @@ System.register(["../lib/wallet/helpers", "../lib/wallet/types", "mithril"], fun
}, },
function (mithril_1_1) { function (mithril_1_1) {
mithril_1 = mithril_1_1; mithril_1 = mithril_1_1;
},
function (wxApi_1_1) {
wxApi_1 = wxApi_1_1;
}], }],
execute: function() { execute: function() {
"use strict"; "use strict";
@ -208,7 +196,7 @@ System.register(["../lib/wallet/helpers", "../lib/wallet/types", "mithril"], fun
} }
mithril_1.default.redraw(true); mithril_1.default.redraw(true);
console.log("doing get mint info"); console.log("doing get mint info");
getReserveCreationInfo(_this.url(), _this.amount) wxApi_1.getReserveCreationInfo(_this.url(), _this.amount)
.then(function (r) { .then(function (r) {
console.log("get mint info resolved"); console.log("get mint info resolved");
_this.isValidMint = true; _this.isValidMint = true;

View File

@ -23,6 +23,7 @@ import {IMintInfo} from "../lib/wallet/types";
import {ReserveCreationInfo} from "../lib/wallet/types"; import {ReserveCreationInfo} from "../lib/wallet/types";
import MithrilComponent = _mithril.MithrilComponent; import MithrilComponent = _mithril.MithrilComponent;
import {Denomination} from "../lib/wallet/types"; import {Denomination} from "../lib/wallet/types";
import {getReserveCreationInfo} from "../lib/wallet/wxApi";
"use strict"; "use strict";
@ -273,24 +274,6 @@ function getSuggestedMint(currency: string): Promise<string> {
} }
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);
});
});
}
export function main() { export function main() {
const url = URI(document.location.href); const url = URI(document.location.href);
const query: any = URI.parseQuery(url.query()); const query: any = URI.parseQuery(url.query());

View File

@ -22,7 +22,8 @@
"lib/wallet/query.ts", "lib/wallet/query.ts",
"lib/wallet/types.ts", "lib/wallet/types.ts",
"lib/wallet/wallet.ts", "lib/wallet/wallet.ts",
"lib/wallet/wxmessaging.ts", "lib/wallet/wxApi.ts",
"lib/wallet/wxMessaging.ts",
"background/main.ts", "background/main.ts",
"content_scripts/notify.ts", "content_scripts/notify.ts",
"popup/popup.tsx", "popup/popup.tsx",