aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/webex/pages/confirm-create-reserve.tsx99
-rw-r--r--src/webex/wxApi.ts9
-rw-r--r--src/webex/wxBackend.ts31
3 files changed, 87 insertions, 52 deletions
diff --git a/src/webex/pages/confirm-create-reserve.tsx b/src/webex/pages/confirm-create-reserve.tsx
index f8f53510c..4e3b6748f 100644
--- a/src/webex/pages/confirm-create-reserve.tsx
+++ b/src/webex/pages/confirm-create-reserve.tsx
@@ -35,6 +35,7 @@ import {
import {ImplicitStateComponent, StateHolder} from "../components";
import {
+ createReserve,
getCurrency,
getExchangeInfo,
getReserveCreationInfo,
@@ -242,6 +243,7 @@ interface ExchangeSelectionProps {
callback_url: string;
wt_types: string[];
currencyRecord: CurrencyRecord|null;
+ sender_wire: object | undefined;
}
interface ManualSelectionProps {
@@ -529,7 +531,8 @@ class ExchangeSelection extends ImplicitStateComponent<ExchangeSelectionProps> {
this.confirmReserveImpl(this.reserveCreationInfo()!,
this.url()!,
this.props.amount,
- this.props.callback_url);
+ this.props.callback_url,
+ this.props.sender_wire);
}
/**
@@ -555,53 +558,55 @@ class ExchangeSelection extends ImplicitStateComponent<ExchangeSelectionProps> {
}
}
- confirmReserveImpl(rci: ReserveCreationInfo,
+ async confirmReserveImpl(rci: ReserveCreationInfo,
exchange: string,
amount: AmountJson,
- callback_url: string) {
- const d = {exchange: canonicalizeBaseUrl(exchange), amount};
- const cb = (rawResp: any) => {
- if (!rawResp) {
- throw Error("empty response");
- }
- // FIXME: filter out types that bank/exchange don't have in common
- const wireDetails = rci.wireInfo;
- const filteredWireDetails: any = {};
- for (const wireType in wireDetails) {
- if (this.props.wt_types.findIndex((x) => x.toLowerCase() === wireType.toLowerCase()) < 0) {
- continue;
- }
- const obj = Object.assign({}, wireDetails[wireType]);
- // The bank doesn't need to know about fees
- delete obj.fees;
- // Consequently the bank can't verify signatures anyway, so
- // we delete this extra data, to make the request URL shorter.
- delete obj.salt;
- delete obj.sig;
- filteredWireDetails[wireType] = obj;
+ callback_url: string,
+ sender_wire: object | undefined) {
+ const rawResp = await createReserve({
+ amount,
+ exchange: canonicalizeBaseUrl(exchange),
+ senderWire: sender_wire,
+ });
+ if (!rawResp) {
+ throw Error("empty response");
+ }
+ // FIXME: filter out types that bank/exchange don't have in common
+ const wireDetails = rci.wireInfo;
+ const filteredWireDetails: any = {};
+ for (const wireType in wireDetails) {
+ if (this.props.wt_types.findIndex((x) => x.toLowerCase() === wireType.toLowerCase()) < 0) {
+ continue;
}
- if (!rawResp.error) {
- const resp = CreateReserveResponse.checked(rawResp);
- const q: {[name: string]: string|number} = {
- amount_currency: amount.currency,
- amount_fraction: amount.fraction,
- amount_value: amount.value,
- exchange: resp.exchange,
- reserve_pub: resp.reservePub,
- wire_details: JSON.stringify(filteredWireDetails),
- };
- const url = new URI(callback_url).addQuery(q);
- if (!url.is("absolute")) {
- throw Error("callback url is not absolute");
- }
- console.log("going to", url.href());
- document.location.href = url.href();
- } else {
- this.statusString(
- i18n.str`Oops, something went wrong. The wallet responded with error status (${rawResp.error}).`);
+ const obj = Object.assign({}, wireDetails[wireType]);
+ // The bank doesn't need to know about fees
+ delete obj.fees;
+ // Consequently the bank can't verify signatures anyway, so
+ // we delete this extra data, to make the request URL shorter.
+ delete obj.salt;
+ delete obj.sig;
+ filteredWireDetails[wireType] = obj;
+ }
+ if (!rawResp.error) {
+ const resp = CreateReserveResponse.checked(rawResp);
+ const q: {[name: string]: string|number} = {
+ amount_currency: amount.currency,
+ amount_fraction: amount.fraction,
+ amount_value: amount.value,
+ exchange: resp.exchange,
+ reserve_pub: resp.reservePub,
+ wire_details: JSON.stringify(filteredWireDetails),
+ };
+ const url = new URI(callback_url).addQuery(q);
+ if (!url.is("absolute")) {
+ throw Error("callback url is not absolute");
}
- };
- chrome.runtime.sendMessage({type: "create-reserve", detail: d}, cb);
+ console.log("going to", url.href());
+ document.location.href = url.href();
+ } else {
+ this.statusString(
+ i18n.str`Oops, something went wrong. The wallet responded with error status (${rawResp.error}).`);
+ }
}
renderStatus(): any {
@@ -632,6 +637,11 @@ async function main() {
throw Error(i18n.str`Can't parse wire_types: ${e.message}`);
}
+ let sender_wire;
+ if (query.sender_wire) {
+ sender_wire = JSON.parse(query.sender_wire);
+ }
+
const suggestedExchangeUrl = query.suggested_exchange_url;
const currencyRecord = await getCurrency(amount.currency);
@@ -641,6 +651,7 @@ async function main() {
currencyRecord,
suggestedExchangeUrl,
wt_types,
+ sender_wire,
};
ReactDOM.render(<ExchangeSelection {...args} />, document.getElementById(
diff --git a/src/webex/wxApi.ts b/src/webex/wxApi.ts
index a064b4133..9d8ba4d1d 100644
--- a/src/webex/wxApi.ts
+++ b/src/webex/wxApi.ts
@@ -264,7 +264,7 @@ export function paymentFailed(contractTermsHash: string): Promise<void> {
* Get the payment cookie for the current tab, or undefined if no payment
* cookie was set.
*/
-export function getTabCookie(contractTermsHash: string, merchantSig: string): Promise<any> {
+export function getTabCookie(): Promise<any> {
return callBackend("get-tab-cookie", { });
}
@@ -284,6 +284,13 @@ export function checkUpgrade(): Promise<UpgradeResponse> {
}
/**
+ * Create a reserve.
+ */
+export function createReserve(args: { amount: AmountJson, exchange: string, senderWire?: object }): Promise<any> {
+ return callBackend("create-reserve", args);
+}
+
+/**
* Reset database
*/
export function resetDb(): Promise<void> {
diff --git a/src/webex/wxBackend.ts b/src/webex/wxBackend.ts
index 0531b7d68..a8b725495 100644
--- a/src/webex/wxBackend.ts
+++ b/src/webex/wxBackend.ts
@@ -114,6 +114,7 @@ function handleMessage(sender: MessageSender,
const d = {
amount: detail.amount,
exchange: detail.exchange,
+ senderWire: detail.senderWire,
};
const req = CreateReserveRequest.checked(d);
return needsWallet().createReserve(req);
@@ -414,15 +415,29 @@ function handleBankRequest(wallet: Wallet, headerList: chrome.webRequest.HttpHea
}
}
- const reservePub = headers["x-taler-reserve-pub"];
- if (reservePub !== undefined) {
- console.log(`confirming reserve ${reservePub} via 201`);
- wallet.confirmReserve({reservePub});
+ const operation = headers["x-taler-operation"];
+
+ if (!operation) {
+ // Not a taler related request.
+ return;
+ }
+
+ if (operation == "confirm-reserve") {
+ const reservePub = headers["x-taler-reserve-pub"];
+ if (reservePub !== undefined) {
+ console.log(`confirming reserve ${reservePub} via 201`);
+ wallet.confirmReserve({reservePub});
+ }
+ console.warn("got 'X-Taler-Operation: confirm-reserve' without 'X-Taler-Reserve-Pub'");
return;
}
- const amount = headers["x-taler-amount"];
- if (amount) {
+ if (operation == "create-reserve") {
+ const amount = headers["x-taler-amount"];
+ if (!amount) {
+ console.log("202 not understood (X-Taler-Amount missing)");
+ return;
+ }
const callbackUrl = headers["x-taler-callback-url"];
if (!callbackUrl) {
console.log("202 not understood (X-Taler-Callback-Url missing)");
@@ -452,6 +467,7 @@ function handleBankRequest(wallet: Wallet, headerList: chrome.webRequest.HttpHea
callback_url: new URI(callbackUrl) .absoluteTo(url),
suggested_exchange_url: headers["x-taler-suggested-exchange"],
wt_types: wtTypes,
+ sender_wire: headers["x-taler-sender-wire"],
};
const uri = new URI(chrome.extension.getURL("/src/webex/pages/confirm-create-reserve.html"));
const redirectUrl = uri.query(params).href();
@@ -460,7 +476,8 @@ function handleBankRequest(wallet: Wallet, headerList: chrome.webRequest.HttpHea
chrome.tabs.update(tabId, {url: redirectUrl});
return;
}
- // no known headers found, not a taler request ...
+
+ console.log("Ignoring unknown X-Taler-Operation:", operation);
}