gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [taler-wallet-webex] branch master updated: store reservePu


From: gnunet
Subject: [GNUnet-SVN] [taler-wallet-webex] branch master updated: store reservePub/blindingKey directly in coin
Date: Mon, 01 May 2017 04:33:52 +0200

This is an automated email from the git hooks/post-receive script.

dold pushed a commit to branch master
in repository wallet-webex.

The following commit(s) were added to refs/heads/master by this push:
     new 10efd87  store reservePub/blindingKey directly in coin
10efd87 is described below

commit 10efd87a8ebcddb75d784f111af534b9d6ea494b
Author: Florian Dold <address@hidden>
AuthorDate: Mon May 1 04:33:47 2017 +0200

    store reservePub/blindingKey directly in coin
---
 src/cryptoApi.ts    |  4 ++--
 src/cryptoWorker.ts |  9 +++------
 src/pages/tree.tsx  |  3 ++-
 src/types.ts        |  8 ++++++++
 src/wallet.ts       | 20 ++++++++++++--------
 src/wxApi.ts        |  4 ++++
 src/wxBackend.ts    |  6 ++++++
 7 files changed, 37 insertions(+), 17 deletions(-)

diff --git a/src/cryptoApi.ts b/src/cryptoApi.ts
index 8dd1439..402b33a 100644
--- a/src/cryptoApi.ts
+++ b/src/cryptoApi.ts
@@ -267,8 +267,8 @@ export class CryptoApi {
     return this.doRpc<string>("rsaUnblind", 4, sig, bk, pk);
   }
 
-  createPaybackRequest(coin: CoinRecord, preCoin: PreCoinRecord): 
Promise<PaybackRequest> {
-    return this.doRpc<PaybackRequest>("createPaybackRequest", 1, coin, 
preCoin);
+  createPaybackRequest(coin: CoinRecord): Promise<PaybackRequest> {
+    return this.doRpc<PaybackRequest>("createPaybackRequest", 1, coin);
   }
 
   createRefreshSession(exchangeBaseUrl: string,
diff --git a/src/cryptoWorker.ts b/src/cryptoWorker.ts
index a11a0d0..aab7d33 100644
--- a/src/cryptoWorker.ts
+++ b/src/cryptoWorker.ts
@@ -102,21 +102,18 @@ namespace RpcFunctions {
     return preCoin;
   }
 
-  export function createPaybackRequest(coin: CoinRecord, preCoin: 
PreCoinRecord): PaybackRequest {
-    if (coin.coinPub != preCoin.coinPub) {
-      throw Error("coin doesn't match precoin");
-    }
+  export function createPaybackRequest(coin: CoinRecord): PaybackRequest {
     let p = new native.PaybackRequestPS({
       coin_pub: native.EddsaPublicKey.fromCrock(coin.coinPub),
       h_denom_pub: 
native.RsaPublicKey.fromCrock(coin.denomPub).encode().hash(),
-      coin_blind: native.RsaBlindingKeySecret.fromCrock(preCoin.blindingKey),
+      coin_blind: native.RsaBlindingKeySecret.fromCrock(coin.blindingKey),
     });
     let coinPriv = native.EddsaPrivateKey.fromCrock(coin.coinPriv);
     let coinSig = native.eddsaSign(p.toPurpose(), coinPriv);
     let paybackRequest: PaybackRequest = {
       denom_pub: coin.denomPub,
       denom_sig: coin.denomSig,
-      coin_blind_key_secret: preCoin.blindingKey,
+      coin_blind_key_secret: coin.blindingKey,
       coin_pub: coin.coinPub,
       coin_sig: coinSig.toCrock(),
     };
diff --git a/src/pages/tree.tsx b/src/pages/tree.tsx
index a465cff..201d411 100644
--- a/src/pages/tree.tsx
+++ b/src/pages/tree.tsx
@@ -33,7 +33,7 @@ import {
 import { ImplicitStateComponent, StateHolder } from "../components";
 import {
   getReserves, getExchanges, getCoins, getPreCoins,
-  refresh, getDenoms
+  refresh, getDenoms, payback,
 } from "../wxApi";
 import { prettyAmount } from "../renderHtml";
 import { getTalerStampDate } from "../helpers";
@@ -135,6 +135,7 @@ class CoinView extends React.Component<CoinViewProps, void> 
{
           <li>Suspended: {(c.suspended || false).toString()}</li>
           <li>Status: {CoinStatus[c.status]}</li>
           <li><RefreshDialog coin={c} /></li>
+          <li><button onClick={() => payback(c.coinPub)}>Payback</button></li>
         </ul>
       </div>
     );
diff --git a/src/types.ts b/src/types.ts
index 4964d9f..8fec79e 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -461,6 +461,14 @@ export interface CoinRecord {
    */
   suspended?: boolean;
 
+  blindingKey: string;
+
+  /**
+   * Reserve public key for the reserve we got this coin from,
+   * or zero when we got the coin from refresh.
+   */
+  reservePub: string|undefined,
+
   /**
    * Status of the coin.
    */
diff --git a/src/wallet.ts b/src/wallet.ts
index 71dc175..b39cbd9 100644
--- a/src/wallet.ts
+++ b/src/wallet.ts
@@ -1144,10 +1144,12 @@ export class Wallet {
                                                    pc.blindingKey,
                                                    pc.denomPub);
     let coin: CoinRecord = {
+      reservePub: pc.reservePub,
       coinPub: pc.coinPub,
       coinPriv: pc.coinPriv,
       denomPub: pc.denomPub,
       denomSig: denomSig,
+      blindingKey: pc.blindingKey,
       currentAmount: pc.coinValue,
       exchangeBaseUrl: pc.exchangeBaseUrl,
       status: CoinStatus.Fresh,
@@ -1971,6 +1973,8 @@ export class Wallet {
                                                      pc.blindingKey,
                                                      denom.denomPub);
       let coin: CoinRecord = {
+        reservePub: undefined,
+        blindingKey: pc.blindingKey,
         coinPub: pc.publicKey,
         coinPriv: pc.privateKey,
         denomPub: denom.denomPub,
@@ -2128,11 +2132,11 @@ export class Wallet {
     if (!coin) {
       throw Error(`Coin ${coinPub} not found, can't request payback`);
     }
-    let preCoin = await this.q().get(Stores.precoins, coin.coinPub);
-    if (!preCoin) {
-      throw Error(`Precoin of coin ${coinPub} not found`);
+    let reservePub = coin.reservePub;
+    if (!reservePub) {
+      throw Error(`Can't request payback for a refreshed coin`);
     }
-    let reserve = await this.q().get(Stores.reserves, preCoin.reservePub);
+    let reserve = await this.q().get(Stores.reserves, reservePub);
     if (!reserve) {
       throw Error(`Reserve of coin ${coinPub} not found`);
     }
@@ -2150,14 +2154,14 @@ export class Wallet {
     reserve.hasPayback = true;
     await this.q().put(Stores.coins, coin).put(Stores.reserves, reserve);
 
-    let paybackRequest = await this.cryptoApi.createPaybackRequest(coin, 
preCoin);
-    let reqUrl = new URI("payback").absoluteTo(preCoin.exchangeBaseUrl);
+    let paybackRequest = await this.cryptoApi.createPaybackRequest(coin);
+    let reqUrl = new URI("payback").absoluteTo(coin.exchangeBaseUrl);
     let resp = await this.http.get(reqUrl.href());
     if (resp.status != 200) {
       throw Error();
     }
     let paybackConfirmation = 
PaybackConfirmation.checked(JSON.parse(resp.responseText));
-    if (paybackConfirmation.reserve_pub != preCoin.reservePub) {
+    if (paybackConfirmation.reserve_pub != coin.reservePub) {
       throw Error(`Coin's reserve doesn't match reserve on payback`);
     }
     coin = await this.q().get(Stores.coins, coinPub);
@@ -2166,7 +2170,7 @@ export class Wallet {
     }
     coin.status = CoinStatus.PaybackDone;
     await this.q().put(Stores.coins, coin);
-    await this.updateReserve(preCoin.reservePub);
+    await this.updateReserve(reservePub!);
   }
 
 
diff --git a/src/wxApi.ts b/src/wxApi.ts
index 0f46008..f06ab69 100644
--- a/src/wxApi.ts
+++ b/src/wxApi.ts
@@ -107,3 +107,7 @@ export async function getDenoms(exchangeBaseUrl: string): 
Promise<DenominationRe
 export async function refresh(coinPub: string): Promise<void> {
   return await callBackend("refresh-coin", { coinPub });
 }
+
+export async function payback(coinPub: string): Promise<void> {
+  return await callBackend("payback-coin", { coinPub });
+}
diff --git a/src/wxBackend.ts b/src/wxBackend.ts
index 1588ec8..089526a 100644
--- a/src/wxBackend.ts
+++ b/src/wxBackend.ts
@@ -259,6 +259,12 @@ function makeHandlers(db: IDBDatabase,
       }
       return wallet.refresh(detail.coinPub);
     },
+    ["payback-coin"]: function (detail, sender) {
+      if (typeof detail.coinPub !== "string") {
+        return Promise.reject(Error("coinPub missing"));
+      }
+      return wallet.payback(detail.coinPub);
+    },
     ["payment-failed"]: function (detail, sender) {
       // For now we just update exchanges (maybe the exchange did something
       // wrong and the keys were messed up).

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]