diff options
author | Florian Dold <florian.dold@gmail.com> | 2015-12-17 13:30:34 +0100 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2015-12-17 13:30:34 +0100 |
commit | b93638b6935e7fb179385cd38a1691372b4c8432 (patch) | |
tree | e36ab895ff4a39599d626cf0ff70e965f68ae9b2 /extension/background | |
parent | c3a9888dfe308e063fc9edaebcc834d8d1896224 (diff) |
Add types, simplify balance display.
Diffstat (limited to 'extension/background')
-rw-r--r-- | extension/background/emscriptif.js | 7 | ||||
-rw-r--r-- | extension/background/emscriptif.ts | 8 | ||||
-rw-r--r-- | extension/background/wallet.js | 47 | ||||
-rw-r--r-- | extension/background/wallet.ts | 79 |
4 files changed, 103 insertions, 38 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; }); }); - |