Add types, simplify balance display.
This commit is contained in:
parent
c3a9888dfe
commit
b93638b693
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
});
|
||||
});
|
||||
|
@ -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;
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -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();
|
||||
});
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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>`;
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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({
|
||||
|
@ -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) => {
|
||||
|
Loading…
Reference in New Issue
Block a user