error handling
This commit is contained in:
parent
5a12edcd5d
commit
29dfafaa12
@ -23,8 +23,8 @@
|
|||||||
// TypeScript does not allow ".js" extensions in the
|
// TypeScript does not allow ".js" extensions in the
|
||||||
// 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");
|
||||||
|
@ -108,60 +108,55 @@ 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;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (this.masterPublicKey != newKeys.master_public_key) {
|
if (this.masterPublicKey != newKeys.master_public_key) {
|
||||||
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) {
|
||||||
let a = Object.assign({}, oldDenom);
|
let a = Object.assign({}, oldDenom);
|
||||||
let b = Object.assign({}, newDenom);
|
let b = Object.assign({}, newDenom);
|
||||||
// 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;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
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 }>;
|
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(),
|
||||||
|
40
extension/lib/wallet/wxApi.ts
Normal file
40
extension/lib/wallet/wxApi.ts
Normal 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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
@ -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,
|
@ -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": {
|
||||||
|
@ -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;
|
||||||
|
@ -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());
|
||||||
|
@ -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",
|
||||||
|
Loading…
Reference in New Issue
Block a user