aboutsummaryrefslogtreecommitdiff
path: root/extension
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2015-12-17 13:30:34 +0100
committerFlorian Dold <florian.dold@gmail.com>2015-12-17 13:30:34 +0100
commitb93638b6935e7fb179385cd38a1691372b4c8432 (patch)
treee36ab895ff4a39599d626cf0ff70e965f68ae9b2 /extension
parentc3a9888dfe308e063fc9edaebcc834d8d1896224 (diff)
downloadwallet-core-b93638b6935e7fb179385cd38a1691372b4c8432.tar.xz
Add types, simplify balance display.
Diffstat (limited to 'extension')
-rw-r--r--extension/background/emscriptif.js7
-rw-r--r--extension/background/emscriptif.ts8
-rw-r--r--extension/background/wallet.js47
-rw-r--r--extension/background/wallet.ts79
-rw-r--r--extension/content_scripts/notify.js4
-rw-r--r--extension/pages/confirm-contract.js10
-rw-r--r--extension/pages/confirm-contract.tsx12
-rw-r--r--extension/popup/balance-overview.html16
-rw-r--r--extension/popup/balance-overview.js28
-rw-r--r--extension/popup/balance-overview.tsx30
10 files changed, 129 insertions, 112 deletions
diff --git a/extension/background/emscriptif.js b/extension/background/emscriptif.js
index f94b58016..81580fbed 100644
--- a/extension/background/emscriptif.js
+++ b/extension/background/emscriptif.js
@@ -284,6 +284,13 @@ class RsaBlindingKey extends ArenaObject {
o.nativePtr = emscAlloc.rsa_blinding_key_create(len);
return o;
}
+ static fromCrock(s, a) {
+ let obj = new this(a);
+ let buf = ByteArray.fromCrock(s);
+ obj.setNative(emscAlloc.rsa_blinding_key_decode(buf.getNative(), buf.size()));
+ buf.destroy();
+ return obj;
+ }
toCrock() {
let ptr = emscAlloc.malloc(PTR_SIZE);
let size = emscAlloc.rsa_blinding_key_encode(this.nativePtr, ptr);
diff --git a/extension/background/emscriptif.ts b/extension/background/emscriptif.ts
index 150b68741..f21e60db4 100644
--- a/extension/background/emscriptif.ts
+++ b/extension/background/emscriptif.ts
@@ -416,12 +416,20 @@ class EddsaPublicKey extends PackedArenaObject {
}
+
class RsaBlindingKey extends ArenaObject {
static create(len: number, a?: Arena) {
let o = new RsaBlindingKey(a);
o.nativePtr = emscAlloc.rsa_blinding_key_create(len);
return o;
}
+ static fromCrock(s: string, a?: Arena): RsaBlindingKey {
+ let obj = new this(a);
+ let buf = ByteArray.fromCrock(s);
+ obj.setNative(emscAlloc.rsa_blinding_key_decode(buf.getNative(), buf.size()));
+ buf.destroy();
+ return obj;
+ }
toCrock(): string {
let ptr = emscAlloc.malloc(PTR_SIZE);
diff --git a/extension/background/wallet.js b/extension/background/wallet.js
index 36d3e8a85..3bcbde91b 100644
--- a/extension/background/wallet.js
+++ b/extension/background/wallet.js
@@ -24,15 +24,18 @@ function openTalerDb() {
db.createObjectStore("mints", { keyPath: "baseUrl" });
db.createObjectStore("reserves", { keyPath: "reserve_pub" });
db.createObjectStore("denoms", { keyPath: "denomPub" });
- db.createObjectStore("coins", { keyPath: "coinPub" });
- db.createObjectStore("withdrawals", { keyPath: "id", autoIncrement: true });
- db.createObjectStore("transactions", { keyPath: "id", autoIncrement: true });
+ let coins = db.createObjectStore("coins", { keyPath: "coinPub" });
+ coins.createIndex("mintBaseUrl", "mintBaseUrl");
+ db.createObjectStore("transactions", { keyPath: "contractHash" });
db.createObjectStore("precoins", { keyPath: "coinPub", autoIncrement: true });
break;
}
};
});
}
+/**
+ * See http://api.taler.net/wallet.html#general
+ */
function canonicalizeBaseUrl(url) {
let x = new URI(url);
if (!x.protocol()) {
@@ -43,8 +46,24 @@ function canonicalizeBaseUrl(url) {
x.query();
return x.href();
}
+function grantCoins(db, feeThreshold, paymentAmount, mintBaseUrl) {
+ throw "not implemented";
+}
+function confirmPay(db, detail, sendResponse) {
+ console.log("confirmPay", JSON.stringify(detail));
+ let tx = db.transaction(['transactions'], 'readwrite');
+ let trans = {
+ contractHash: detail.offer.H_contract,
+ contract: detail.offer.contract,
+ sig: detail.offer
+ };
+ let contract = detail.offer.contract;
+ //let chosenCoinPromise = chooseCoins(db, contract.max_fee, contract.amount)
+ // .then(x => generateDepositPermissions(db, x))
+ // .then(executePayment);
+ return true;
+}
function confirmReserve(db, detail, sendResponse) {
- console.log('detail: ' + JSON.stringify(detail));
let reservePriv = EddsaPrivateKey.create();
let reservePub = reservePriv.getPublicKey();
let form = new FormData();
@@ -114,11 +133,8 @@ function rankDenom(denom1, denom2) {
return (-1) * v1.cmp(v2);
}
function withdrawPrepare(db, denom, reserve) {
- console.log("in withdraw prepare");
let reservePriv = new EddsaPrivateKey();
- console.log("loading reserve priv", reserve.reserve_priv);
reservePriv.loadCrock(reserve.reserve_priv);
- console.log("reserve priv is", reservePriv.toCrock());
let reservePub = new EddsaPublicKey();
reservePub.loadCrock(reserve.reserve_pub);
let denomPub = RsaPublicKey.fromCrock(denom.denom_pub);
@@ -126,9 +142,7 @@ function withdrawPrepare(db, denom, reserve) {
let coinPub = coinPriv.getPublicKey();
let blindingFactor = RsaBlindingKey.create(1024);
let pubHash = coinPub.hash();
- console.log("about to blind");
let ev = rsaBlind(pubHash, blindingFactor, denomPub);
- console.log("blinded");
if (!denom.fee_withdraw) {
throw Error("Field fee_withdraw missing");
}
@@ -153,8 +167,10 @@ function withdrawPrepare(db, denom, reserve) {
coinPub: coinPub.toCrock(),
coinPriv: coinPriv.toCrock(),
denomPub: denomPub.encode().toCrock(),
+ mintBaseUrl: reserve.mintBaseUrl,
withdrawSig: sig.toCrock(),
- coinEv: ev.toCrock()
+ coinEv: ev.toCrock(),
+ coinValue: denom.value
};
console.log("storing precoin", JSON.stringify(preCoin));
let tx = db.transaction(['precoins'], 'readwrite');
@@ -197,15 +213,13 @@ function withdrawExecute(db, pc) {
console.log("Withdrawal successful");
console.log(myRequest.responseText);
let resp = JSON.parse(myRequest.responseText);
- //let denomSig = rsaUnblind(RsaSignature.fromCrock(resp.coin_ev),
- // RsaBlindingKey.fromCrock(pc.blindingKey),
- // RsaPublicKey.fromCrock(pc.denomPub));
+ let denomSig = rsaUnblind(RsaSignature.fromCrock(resp.coin_ev), RsaBlindingKey.fromCrock(pc.blindingKey), RsaPublicKey.fromCrock(pc.denomPub));
let coin = {
coinPub: pc.coinPub,
coinPriv: pc.coinPriv,
denomPub: pc.denomPub,
- reservePub: pc.reservePub,
- denomSig: "foo" //denomSig.encode().toCrock()
+ denomSig: denomSig.encode().toCrock(),
+ currentAmount: pc.coinValue
};
console.log("unblinded coin");
resolve(coin);
@@ -442,6 +456,7 @@ openTalerDb().then((db) => {
chrome.runtime.onMessage.addListener(function (req, sender, onresponse) {
let dispatch = {
"confirm-reserve": confirmReserve,
+ "confirm-pay": confirmPay,
"dump-db": dumpDb,
"balances": balances,
"reset": reset
@@ -449,7 +464,7 @@ openTalerDb().then((db) => {
if (req.type in dispatch) {
return dispatch[req.type](db, req.detail, onresponse);
}
- console.error(format("Request type unknown, req {0}", JSON.stringify(req)));
+ console.error(format("Request type {1} unknown, req {0}", JSON.stringify(req), req.type));
return false;
});
});
diff --git a/extension/background/wallet.ts b/extension/background/wallet.ts
index dd2ceca7d..bfc0bbcba 100644
--- a/extension/background/wallet.ts
+++ b/extension/background/wallet.ts
@@ -27,9 +27,9 @@ function openTalerDb(): Promise<IDBDatabase> {
db.createObjectStore("mints", { keyPath: "baseUrl" });
db.createObjectStore("reserves", { keyPath: "reserve_pub"});
db.createObjectStore("denoms", { keyPath: "denomPub" });
- db.createObjectStore("coins", { keyPath: "coinPub" });
- db.createObjectStore("withdrawals", { keyPath: "id", autoIncrement: true });
- db.createObjectStore("transactions", { keyPath: "id", autoIncrement: true });
+ let coins = db.createObjectStore("coins", { keyPath: "coinPub" });
+ coins.createIndex("mintBaseUrl", "mintBaseUrl");
+ db.createObjectStore("transactions", { keyPath: "contractHash" });
db.createObjectStore("precoins", { keyPath: "coinPub", autoIncrement: true });
break;
}
@@ -38,6 +38,9 @@ function openTalerDb(): Promise<IDBDatabase> {
}
+/**
+ * See http://api.taler.net/wallet.html#general
+ */
function canonicalizeBaseUrl(url) {
let x = new URI(url);
if (!x.protocol()) {
@@ -49,9 +52,39 @@ function canonicalizeBaseUrl(url) {
return x.href()
}
+interface ConfirmPayRequest {
+ offer: any;
+ selectedMint: any;
+}
+
+
+function grantCoins(db: IDBDatabase,
+ feeThreshold: AmountJson,
+ paymentAmount: AmountJson,
+ mintBaseUrl: string): Promise<any> {
+ throw "not implemented";
+}
+
+
+function confirmPay(db, detail: ConfirmPayRequest, sendResponse) {
+ console.log("confirmPay", JSON.stringify(detail));
+ let tx = db.transaction(['transactions'], 'readwrite');
+ let trans = {
+ contractHash: detail.offer.H_contract,
+ contract: detail.offer.contract,
+ sig: detail.offer
+ }
+
+ let contract = detail.offer.contract;
+
+ //let chosenCoinPromise = chooseCoins(db, contract.max_fee, contract.amount)
+ // .then(x => generateDepositPermissions(db, x))
+ // .then(executePayment);
+
+ return true;
+}
function confirmReserve(db, detail, sendResponse) {
- console.log('detail: ' + JSON.stringify(detail));
let reservePriv = EddsaPrivateKey.create();
let reservePub = reservePriv.getPublicKey();
let form = new FormData();
@@ -136,7 +169,8 @@ interface AmountJson {
interface Denomination {
value: AmountJson;
- denomPub: string;
+ denom_pub: string;
+ fee_withdraw: AmountJson;
}
interface PreCoin {
@@ -147,24 +181,25 @@ interface PreCoin {
blindingKey: string;
withdrawSig: string;
coinEv: string;
+ mintBaseUrl: string;
+ coinValue: AmountJson;
}
interface Coin {
coinPub: string;
coinPriv: string;
- reservePub: string;
denomPub: string;
denomSig: string;
+ currentAmount: AmountJson;
}
-function withdrawPrepare(db: IDBDatabase, denom, reserve): Promise<PreCoin> {
- console.log("in withdraw prepare");
+function withdrawPrepare(db: IDBDatabase,
+ denom: Denomination,
+ reserve): Promise<PreCoin> {
let reservePriv = new EddsaPrivateKey();
- console.log("loading reserve priv", reserve.reserve_priv);
reservePriv.loadCrock(reserve.reserve_priv);
- console.log("reserve priv is", reservePriv.toCrock());
let reservePub = new EddsaPublicKey();
reservePub.loadCrock(reserve.reserve_pub);
let denomPub = RsaPublicKey.fromCrock(denom.denom_pub);
@@ -172,9 +207,7 @@ function withdrawPrepare(db: IDBDatabase, denom, reserve): Promise<PreCoin> {
let coinPub = coinPriv.getPublicKey();
let blindingFactor = RsaBlindingKey.create(1024);
let pubHash: HashCode = coinPub.hash();
- console.log("about to blind");
let ev: ByteArray = rsaBlind(pubHash, blindingFactor, denomPub);
- console.log("blinded");
if (!denom.fee_withdraw) {
throw Error("Field fee_withdraw missing");
@@ -205,8 +238,10 @@ function withdrawPrepare(db: IDBDatabase, denom, reserve): Promise<PreCoin> {
coinPub: coinPub.toCrock(),
coinPriv: coinPriv.toCrock(),
denomPub: denomPub.encode().toCrock(),
+ mintBaseUrl: reserve.mintBaseUrl,
withdrawSig: sig.toCrock(),
- coinEv: ev.toCrock()
+ coinEv: ev.toCrock(),
+ coinValue: denom.value
};
console.log("storing precoin", JSON.stringify(preCoin));
@@ -254,15 +289,15 @@ function withdrawExecute(db, pc: PreCoin): Promise<Coin> {
console.log("Withdrawal successful");
console.log(myRequest.responseText);
let resp = JSON.parse(myRequest.responseText);
- //let denomSig = rsaUnblind(RsaSignature.fromCrock(resp.coin_ev),
- // RsaBlindingKey.fromCrock(pc.blindingKey),
- // RsaPublicKey.fromCrock(pc.denomPub));
+ let denomSig = rsaUnblind(RsaSignature.fromCrock(resp.coin_ev),
+ RsaBlindingKey.fromCrock(pc.blindingKey),
+ RsaPublicKey.fromCrock(pc.denomPub));
let coin: Coin = {
coinPub: pc.coinPub,
coinPriv: pc.coinPriv,
denomPub: pc.denomPub,
- reservePub: pc.reservePub,
- denomSig: "foo" //denomSig.encode().toCrock()
+ denomSig: denomSig.encode().toCrock(),
+ currentAmount: pc.coinValue
}
console.log("unblinded coin");
resolve(coin);
@@ -505,7 +540,7 @@ function balances(db, detail, sendResponse) {
sendResponse(byCurrency);
console.log("response", JSON.stringify(byCurrency));
}
- }
+ };
return true;
}
@@ -517,15 +552,15 @@ openTalerDb().then((db) => {
function (req, sender, onresponse) {
let dispatch = {
"confirm-reserve": confirmReserve,
+ "confirm-pay": confirmPay,
"dump-db": dumpDb,
"balances": balances,
"reset": reset
- }
+ };
if (req.type in dispatch) {
return dispatch[req.type](db, req.detail, onresponse);
}
- console.error(format("Request type unknown, req {0}", JSON.stringify(req)));
+ console.error(format("Request type {1} unknown, req {0}", JSON.stringify(req), req.type));
return false;
});
});
-
diff --git a/extension/content_scripts/notify.js b/extension/content_scripts/notify.js
index 640c5bdc6..e86c0f84f 100644
--- a/extension/content_scripts/notify.js
+++ b/extension/content_scripts/notify.js
@@ -44,10 +44,10 @@ document.addEventListener("DOMContentLoaded", function(e) {
});
document.body.addEventListener('taler-contract', function(e) {
// XXX: the merchant should just give us the parsed data ...
- let contract = JSON.parse(e.detail);
+ let offer = JSON.parse(e.detail);
let uri = URI(chrome.extension.getURL("pages/confirm-contract.html"));
let params = {
- contract: JSON.stringify(contract)
+ offer: JSON.stringify(offer)
}
document.location.href = uri.query(params).href();
});
diff --git a/extension/pages/confirm-contract.js b/extension/pages/confirm-contract.js
index fe16bcbca..c59ac90a9 100644
--- a/extension/pages/confirm-contract.js
+++ b/extension/pages/confirm-contract.js
@@ -16,15 +16,15 @@ Handlebars.registerHelper('prettyAmount', function (amount) {
return v.toFixed(2) + " " + amount.currency;
});
document.addEventListener("DOMContentLoaded", (e) => {
- let contract = JSON.parse(query.contract);
- console.dir(contract);
+ let offer = JSON.parse(query.offer);
+ console.dir(offer);
let source = $_("contract-template").innerHTML;
let template = Handlebars.compile(source);
- let html = template(contract.contract);
+ let html = template(offer.contract);
$_("render-contract").innerHTML = html;
- document.getElementById("confirm-purchase").addEventListener("click", (e) => {
+ document.getElementById("confirm-pay").addEventListener("click", (e) => {
let d = clone(query);
- chrome.runtime.sendMessage({ type: 'confirm-purchase', detail: d }, (resp) => {
+ chrome.runtime.sendMessage({ type: 'confirm-pay', detail: d }, (resp) => {
if (resp.success === true) {
document.location.href = resp.backlink;
}
diff --git a/extension/pages/confirm-contract.tsx b/extension/pages/confirm-contract.tsx
index e12fdfd2d..811e2e001 100644
--- a/extension/pages/confirm-contract.tsx
+++ b/extension/pages/confirm-contract.tsx
@@ -24,19 +24,18 @@ Handlebars.registerHelper('prettyAmount', function(amount) {
document.addEventListener("DOMContentLoaded", (e) => {
- let contract = JSON.parse(query.contract);
- console.dir(contract);
+ let offer = JSON.parse(query.offer);
+ console.dir(offer);
let source = $_("contract-template").innerHTML;
let template = Handlebars.compile(source);
- let html = template(contract.contract);
+ let html = template(offer.contract);
$_("render-contract").innerHTML = html;
-
- document.getElementById("confirm-purchase").addEventListener("click", (e) => {
+ document.getElementById("confirm-pay").addEventListener("click", (e) => {
let d = clone(query);
- chrome.runtime.sendMessage({type:'confirm-purchase', detail: d}, (resp) => {
+ chrome.runtime.sendMessage({type:'confirm-pay', detail: d}, (resp) => {
if (resp.success === true) {
document.location.href = resp.backlink;
} else {
@@ -46,7 +45,6 @@ document.addEventListener("DOMContentLoaded", (e) => {
<pre>${resp.text}</pre>`;
}
});
-
});
});
diff --git a/extension/popup/balance-overview.html b/extension/popup/balance-overview.html
index 2f82becf8..a3aeae697 100644
--- a/extension/popup/balance-overview.html
+++ b/extension/popup/balance-overview.html
@@ -10,9 +10,14 @@
<script src="balance-overview.js" type="text/javascript"></script>
<script id="balance-template" type="text/x-handlebars-template">
- {{#each this}}
- <p>{{prettyAmountNoCurrency this}} <a>{{@key}}</a></p>
- {{/each}}
+ {{#if this.length}}
+ {{#each this}}
+ <p>{{prettyAmountNoCurrency this}} <a>{{@key}}</a></p>
+ {{/each}}
+ {{else}}
+ <p>Looks like your wallet is empty. Want to get some
+ <a id="link-kudos" href="http://bank.demo.taler.net">KUDOS?</a>
+ {{/if}}
</script>
</head>
@@ -26,11 +31,6 @@
</div>
<div id="content">
- <div id="balance">
- <p>Looks like your wallet is empty. Want to get some
- <a id="link-kudos" href="http://bank.demo.taler.net">KUDOS?</a>
- </p>
- </div>
</div>
</body>
diff --git a/extension/popup/balance-overview.js b/extension/popup/balance-overview.js
index f33be0637..4fd991b23 100644
--- a/extension/popup/balance-overview.js
+++ b/extension/popup/balance-overview.js
@@ -17,31 +17,9 @@ let React = {
document.addEventListener('DOMContentLoaded', (e) => {
console.log("content loaded");
chrome.runtime.sendMessage({ type: "balances" }, function (wallet) {
- console.log("got balance");
- let n = 0;
- let table = React.createElement("div", null);
- let source = document.getElementById("balance-template").innerHTML;
- console.log("size", Object.keys(wallet).length);
- if (Object.keys(wallet).length > 0) {
- let template = Handlebars.compile(source);
- console.log("wallet ", JSON.stringify(wallet));
- let html = template(wallet);
- console.log("Hb generated html", html);
- table.innerHTML = html;
- let p = document.getElementById("content");
- p.replaceChild(table, p.firstElementChild);
- }
- /*
- for (let curr in wallet) {
- n++;
- let x = wallet[curr];
- let num = x.value + x.fraction / 10e6;
- table.appendChild(<p>{num} <a>{x.currency}</a></p>);
- }
- if (n != 0) {
- let p = document.getElementById("content");
- p.replaceChild(table, p.firstElementChild);
- } */
+ let context = document.getElementById("balance-template").innerHTML;
+ let template = Handlebars.compile(context);
+ document.getElementById("content").innerHTML = template(wallet);
});
document.getElementById("debug").addEventListener("click", (e) => {
chrome.tabs.create({
diff --git a/extension/popup/balance-overview.tsx b/extension/popup/balance-overview.tsx
index b1ee0fa27..88ff1bccb 100644
--- a/extension/popup/balance-overview.tsx
+++ b/extension/popup/balance-overview.tsx
@@ -19,33 +19,9 @@ let React = {
document.addEventListener('DOMContentLoaded', (e) => {
console.log("content loaded");
chrome.runtime.sendMessage({type: "balances"}, function(wallet) {
- console.log("got balance");
- let n = 0;
- let table = <div />;
-
- let source = document.getElementById("balance-template").innerHTML;
- console.log("size", Object.keys(wallet).length);
- if (Object.keys(wallet).length > 0){
- let template = Handlebars.compile(source);
- console.log("wallet ", JSON.stringify(wallet));
- let html = template(wallet);
- console.log("Hb generated html", html);
- table.innerHTML = html;
- let p = document.getElementById("content");
- p.replaceChild(table, p.firstElementChild);
- }
-
- /*
- for (let curr in wallet) {
- n++;
- let x = wallet[curr];
- let num = x.value + x.fraction / 10e6;
- table.appendChild(<p>{num} <a>{x.currency}</a></p>);
- }
- if (n != 0) {
- let p = document.getElementById("content");
- p.replaceChild(table, p.firstElementChild);
- } */
+ let context = document.getElementById("balance-template").innerHTML;
+ let template = Handlebars.compile(context);
+ document.getElementById("content").innerHTML = template(wallet);
});
document.getElementById("debug").addEventListener("click", (e) => {