diff options
-rw-r--r-- | content_scripts/notify.ts | 112 |
1 files changed, 106 insertions, 6 deletions
diff --git a/content_scripts/notify.ts b/content_scripts/notify.ts index c6351fcf7..54d7b6acb 100644 --- a/content_scripts/notify.ts +++ b/content_scripts/notify.ts @@ -27,14 +27,18 @@ "use strict"; -import {createReserve, confirmContract, fetchPayment} from "../lib/shopApi"; - // Make sure we don't pollute the namespace too much. namespace TalerNotify { const PROTOCOL_VERSION = 1; console.log("Taler injected", chrome.runtime.id); + function subst(url: string, H_contract) { + url = url.replace("${H_contract}", H_contract); + url = url.replace("${$}", "$"); + return url; + } + const handlers = []; function init() { @@ -61,6 +65,8 @@ namespace TalerNotify { init(); function registerHandlers() { + const $ = (x) => document.getElementById(x); + function addHandler(type, listener) { document.addEventListener(type, listener); handlers.push({type, listener}); @@ -85,7 +91,16 @@ namespace TalerNotify { }); addHandler("taler-create-reserve", function(e: CustomEvent) { - createReserve(e.detail.amount, e.detail.callback_url, e.detail.wt_types); + console.log("taler-create-reserve with " + JSON.stringify(e.detail)); + let params = { + amount: JSON.stringify(e.detail.amount), + callback_url: URI(e.detail.callback_url) + .absoluteTo(document.location.href), + bank_url: document.location.href, + wt_types: JSON.stringify(e.detail.wt_types), + }; + let uri = URI(chrome.extension.getURL("pages/confirm-create-reserve.html")); + document.location.href = uri.query(params).href(); }); addHandler("taler-confirm-reserve", function(e: CustomEvent) { @@ -101,8 +116,53 @@ namespace TalerNotify { }); }); + addHandler("taler-confirm-contract", function(e: CustomEvent) { - confirmContract(e.detail.contract_wrapper, e.detail.replace_navigation); + if (!e.detail.contract_wrapper) { + console.error("contract wrapper missing"); + return; + } + + const offer = e.detail.contract_wrapper; + + if (!offer.contract) { + console.error("contract field missing"); + return; + } + + const msg = { + type: "check-repurchase", + detail: { + contract: offer.contract + }, + }; + + chrome.runtime.sendMessage(msg, (resp) => { + if (resp.error) { + console.error("wallet backend error", resp); + return; + } + if (resp.isRepurchase) { + console.log("doing repurchase"); + console.assert(resp.existingFulfillmentUrl); + console.assert(resp.existingContractHash); + window.location.href = subst(resp.existingFulfillmentUrl, + resp.existingContractHash); + + } else { + const uri = URI(chrome.extension.getURL("pages/confirm-contract.html")); + const params = { + offer: JSON.stringify(offer), + merchantPageUrl: document.location.href, + }; + const target = uri.query(params).href(); + if (e.detail.replace_navigation === true) { + document.location.replace(target); + } else { + document.location.href = target; + } + } + }); }); addHandler("taler-payment-failed", (e: CustomEvent) => { @@ -118,8 +178,48 @@ namespace TalerNotify { }); }); - addHandler("taler-fetch-payment", (e: CustomEvent) => { - fetchPayment(e.detail.H_contract, e.detail.offering_url); + // Should be: taler-request-payment, taler-result-payment + + addHandler("taler-execute-contract", (e: CustomEvent) => { + console.log("got taler-execute-contract in content page"); + const msg = { + type: "execute-payment", + detail: { + H_contract: e.detail.H_contract, + }, + }; + + chrome.runtime.sendMessage(msg, (resp) => { + console.log("got resp"); + console.dir(resp); + if (!resp.success) { + console.log("got event detial:"); + console.dir(e.detail); + if (e.detail.offering_url) { + console.log("offering url", e.detail.offering_url); + window.location.href = e.detail.offering_url; + } else { + console.error("execute-payment failed"); + } + return; + } + let contract = resp.contract; + if (!contract) { + throw Error("contract missing"); + } + + // We have the details for then payment, the merchant page + // is responsible to give it to the merchant. + + let evt = new CustomEvent("taler-notify-payment", { + detail: { + H_contract: e.detail.H_contract, + contract: resp.contract, + payment: resp.payReq, + } + }); + document.dispatchEvent(evt); + }); }); } }
\ No newline at end of file |