diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-07-20 02:17:55 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-07-20 02:17:55 +0200 |
commit | a8bd05298eccf3ac3f89afca4b28856fbb1be82f (patch) | |
tree | 66fb1d9943d7f60e2e72f8dba4944b24e4e63b81 | |
parent | 8d5b1e539be1d86c3d184448de9e38fce52a7bd4 (diff) |
Store bank account information for reserve.
Fixes #4852.
-rw-r--r-- | src/webex/pages/confirm-create-reserve.tsx | 99 | ||||
-rw-r--r-- | src/webex/wxApi.ts | 9 | ||||
-rw-r--r-- | src/webex/wxBackend.ts | 31 |
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); } |