aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2016-03-02 04:38:20 +0100
committerFlorian Dold <florian.dold@gmail.com>2016-03-02 04:38:20 +0100
commit7eba6a6c3b131934d5006f3afa66bbb34d0c3f83 (patch)
tree6a635b86be0783a2f0358e37243434f05419c2ec
parent660a53a64128a5c2471d69ac82ffd312f42e9b0d (diff)
handle replacing navigation on taler-confirm-contract
-rw-r--r--content_scripts/notify.js58
-rw-r--r--content_scripts/notify.ts67
2 files changed, 121 insertions, 4 deletions
diff --git a/content_scripts/notify.js b/content_scripts/notify.js
index 1a8f56b99..aa7dee730 100644
--- a/content_scripts/notify.js
+++ b/content_scripts/notify.js
@@ -25,13 +25,22 @@
var TalerNotify;
(function (TalerNotify) {
var PROTOCOL_VERSION = 1;
- console.log("Taler injected");
+ console.log("Taler injected", chrome.runtime.id);
+ // FIXME: only do this for test wallets?
+ // This is no security risk, since the extension ID for published
+ // extension is publicly known.
function subst(url, H_contract) {
url = url.replace("${H_contract}", H_contract);
url = url.replace("${$}", "$");
return url;
}
var $ = function (x) { return document.getElementById(x); };
+ document.addEventListener("DOMContentLoaded", function (e) {
+ if (document.documentElement.getAttribute("data-taler-requested")) {
+ console.log("taler requested in html element");
+ document.documentElement.setAttribute("data-taler-extension-id", chrome.runtime.id);
+ }
+ });
document.addEventListener("taler-probe", function (e) {
var evt = new CustomEvent("taler-wallet-present", {
detail: {
@@ -45,7 +54,8 @@ var TalerNotify;
console.log("taler-create-reserve with " + JSON.stringify(e.detail));
var params = {
amount: JSON.stringify(e.detail.amount),
- callback_url: URI(e.detail.callback_url).absoluteTo(document.location.href),
+ callback_url: URI(e.detail.callback_url)
+ .absoluteTo(document.location.href),
bank_url: document.location.href,
};
var uri = URI(chrome.extension.getURL("pages/confirm-create-reserve.html"));
@@ -63,6 +73,7 @@ var TalerNotify;
console.log("confirm reserve done");
});
});
+ // XXX: remove in a bit, just here for compatibility ...
document.addEventListener("taler-contract", function (e) {
// XXX: the merchant should just give us the parsed data ...
var offer = JSON.parse(e.detail);
@@ -97,6 +108,49 @@ var TalerNotify;
}
});
});
+ document.addEventListener("taler-confirm-contract", function (e) {
+ if (!e.detail.contract_wrapper) {
+ console.error("contract wrapper missing");
+ return;
+ }
+ var offer = e.detail.contract_wrapper;
+ if (!offer.contract) {
+ console.error("contract field missing");
+ return;
+ }
+ var msg = {
+ type: "check-repurchase",
+ detail: {
+ contract: offer.contract
+ },
+ };
+ chrome.runtime.sendMessage(msg, function (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 {
+ var uri = URI(chrome.extension.getURL("pages/confirm-contract.html"));
+ var params = {
+ offer: JSON.stringify(offer),
+ merchantPageUrl: document.location.href,
+ };
+ var target = uri.query(params).href();
+ if (e.detail.replace_navigation === true) {
+ document.location.replace(target);
+ }
+ else {
+ document.location.href = target;
+ }
+ }
+ });
+ });
document.addEventListener('taler-execute-payment', function (e) {
console.log("got taler-execute-payment in content page");
if (!e.detail.pay_url) {
diff --git a/content_scripts/notify.ts b/content_scripts/notify.ts
index afc03c934..c87c9450e 100644
--- a/content_scripts/notify.ts
+++ b/content_scripts/notify.ts
@@ -31,7 +31,11 @@
namespace TalerNotify {
const PROTOCOL_VERSION = 1;
- console.log("Taler injected");
+ console.log("Taler injected", chrome.runtime.id);
+
+ // FIXME: only do this for test wallets?
+ // This is no security risk, since the extension ID for published
+ // extension is publicly known.
function subst(url: string, H_contract) {
url = url.replace("${H_contract}", H_contract);
@@ -41,6 +45,14 @@ namespace TalerNotify {
let $ = (x) => document.getElementById(x);
+ document.addEventListener("DOMContentLoaded", function(e) {
+ if (document.documentElement.getAttribute("data-taler-requested")) {
+ console.log("taler requested in html element");
+ document.documentElement.setAttribute("data-taler-extension-id",
+ chrome.runtime.id);
+ }
+ });
+
document.addEventListener("taler-probe", function(e) {
let evt = new CustomEvent("taler-wallet-present", {
detail: {
@@ -55,7 +67,8 @@ namespace TalerNotify {
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),
+ callback_url: URI(e.detail.callback_url)
+ .absoluteTo(document.location.href),
bank_url: document.location.href,
};
let uri = URI(chrome.extension.getURL("pages/confirm-create-reserve.html"));
@@ -76,6 +89,7 @@ namespace TalerNotify {
});
+ // XXX: remove in a bit, just here for compatibility ...
document.addEventListener("taler-contract", function(e: CustomEvent) {
// XXX: the merchant should just give us the parsed data ...
let offer = JSON.parse(e.detail);
@@ -116,6 +130,55 @@ namespace TalerNotify {
});
+ document.addEventListener("taler-confirm-contract", function(e: CustomEvent) {
+ if (!e.detail.contract_wrapper) {
+ console.error("contract wrapper missing");
+ return;
+ }
+
+ let offer = e.detail.contract_wrapper;
+
+ if (!offer.contract) {
+ console.error("contract field missing");
+ return;
+ }
+
+ let 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 {
+ let uri = URI(chrome.extension.getURL("pages/confirm-contract.html"));
+ let params = {
+ offer: JSON.stringify(offer),
+ merchantPageUrl: document.location.href,
+ };
+ let target = uri.query(params).href();
+ if (e.detail.replace_navigation === true) {
+ document.location.replace(target);
+ } else {
+ document.location.href = target;
+ }
+ }
+ });
+ });
+
+
document.addEventListener('taler-execute-payment', function(e: CustomEvent) {
console.log("got taler-execute-payment in content page");
if (!e.detail.pay_url) {