diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/exchange_api_deposits_get.c | 77 | 
1 files changed, 43 insertions, 34 deletions
diff --git a/src/lib/exchange_api_deposits_get.c b/src/lib/exchange_api_deposits_get.c index aecd8824..6a2ad5c3 100644 --- a/src/lib/exchange_api_deposits_get.c +++ b/src/lib/exchange_api_deposits_get.c @@ -33,7 +33,7 @@  /** - * @brief A Deposit Wtid Handle + * @brief A Deposit Get Handle   */  struct TALER_EXCHANGE_DepositGetHandle  { @@ -84,31 +84,19 @@ struct TALER_EXCHANGE_DepositGetHandle   *   * @param dwh deposit wtid handle   * @param json json reply with the signature - * @param[out] exchange_pub set to the exchange's public key + * @param exchange_pub the exchange's public key + * @param exchange_sig the exchange's signature   * @return #GNUNET_OK if the signature is valid, #GNUNET_SYSERR if not   */  static int  verify_deposit_wtid_signature_ok (    const struct TALER_EXCHANGE_DepositGetHandle *dwh,    const json_t *json, -  struct TALER_ExchangePublicKeyP *exchange_pub) +  const struct TALER_ExchangePublicKeyP *exchange_pub, +  const struct TALER_ExchangeSignatureP *exchange_sig)  { -  struct TALER_ExchangeSignatureP exchange_sig;    const struct TALER_EXCHANGE_Keys *key_state; -  struct GNUNET_JSON_Specification spec[] = { -    GNUNET_JSON_spec_fixed_auto ("exchange_sig", &exchange_sig), -    GNUNET_JSON_spec_fixed_auto ("exchange_pub", exchange_pub), -    GNUNET_JSON_spec_end () -  }; -  if (GNUNET_OK != -      GNUNET_JSON_parse (json, -                         spec, -                         NULL, NULL)) -  { -    GNUNET_break_op (0); -    return GNUNET_SYSERR; -  }    key_state = TALER_EXCHANGE_get_keys (dwh->exchange);    if (GNUNET_OK !=        TALER_EXCHANGE_test_signing_key (key_state, @@ -120,7 +108,7 @@ verify_deposit_wtid_signature_ok (    if (GNUNET_OK !=        GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE,                                    &dwh->depconf, -                                  &exchange_sig.eddsa_signature, +                                  &exchange_sig->eddsa_signature,                                    &exchange_pub->eddsa_pub))    {      GNUNET_break_op (0); @@ -144,12 +132,6 @@ handle_deposit_wtid_finished (void *cls,                                const void *response)  {    struct TALER_EXCHANGE_DepositGetHandle *dwh = cls; -  const struct TALER_WireTransferIdentifierRawP *wtid = NULL; -  struct GNUNET_TIME_Absolute execution_time = GNUNET_TIME_UNIT_FOREVER_ABS; -  const struct TALER_Amount *coin_contribution = NULL; -  struct TALER_Amount coin_contribution_s; -  struct TALER_ExchangePublicKeyP exchange_pub; -  struct TALER_ExchangePublicKeyP *ep = NULL;    const json_t *j = response;    struct TALER_EXCHANGE_HttpResponse hr = {      .reply = j, @@ -164,10 +146,16 @@ handle_deposit_wtid_finished (void *cls,      break;    case MHD_HTTP_OK:      { +      struct GNUNET_TIME_Absolute execution_time; +      struct TALER_Amount coin_contribution; +      struct TALER_ExchangePublicKeyP exchange_pub; +      struct TALER_ExchangeSignatureP exchange_sig;        struct GNUNET_JSON_Specification spec[] = {          GNUNET_JSON_spec_fixed_auto ("wtid", &dwh->depconf.wtid),          GNUNET_JSON_spec_absolute_time ("execution_time", &execution_time), -        TALER_JSON_spec_amount ("coin_contribution", &coin_contribution_s), +        TALER_JSON_spec_amount ("coin_contribution", &coin_contribution), +        GNUNET_JSON_spec_fixed_auto ("exchange_sig", &exchange_sig), +        GNUNET_JSON_spec_fixed_auto ("exchange_pub", &exchange_pub),          GNUNET_JSON_spec_end ()        }; @@ -181,15 +169,14 @@ handle_deposit_wtid_finished (void *cls,          hr.ec = TALER_EC_DEPOSITS_INVALID_BODY_BY_EXCHANGE;          break;        } -      wtid = &dwh->depconf.wtid;        dwh->depconf.execution_time = GNUNET_TIME_absolute_hton (execution_time);        TALER_amount_hton (&dwh->depconf.coin_contribution, -                         &coin_contribution_s); -      coin_contribution = &coin_contribution_s; +                         &coin_contribution);        if (GNUNET_OK !=            verify_deposit_wtid_signature_ok (dwh,                                              j, -                                            &exchange_pub)) +                                            &exchange_pub, +                                            &exchange_sig))        {          GNUNET_break_op (0);          hr.http_status = 0; @@ -197,13 +184,26 @@ handle_deposit_wtid_finished (void *cls,        }        else        { -        ep = &exchange_pub; +        struct TALER_EXCHANGE_DepositData dd = { +          .exchange_pub = &exchange_pub, +          .exchange_sig = &exchange_sig, +          .wtid = &dwh->depconf.wtid, +          .execution_time = execution_time, +          .coin_contribution = &coin_contribution +        }; + +        dwh->cb (dwh->cb_cls, +                 &hr, +                 &dd); +        TALER_EXCHANGE_deposits_get_cancel (dwh); +        return;        }      }      break;    case MHD_HTTP_ACCEPTED:      {        /* Transaction known, but not executed yet */ +      struct GNUNET_TIME_Absolute execution_time;        struct GNUNET_JSON_Specification spec[] = {          GNUNET_JSON_spec_absolute_time ("execution_time", &execution_time),          GNUNET_JSON_spec_end () @@ -219,6 +219,18 @@ handle_deposit_wtid_finished (void *cls,          hr.ec = TALER_EC_DEPOSITS_INVALID_BODY_BY_EXCHANGE;          break;        } +      else +      { +        struct TALER_EXCHANGE_DepositData dd = { +          .execution_time = execution_time +        }; + +        dwh->cb (dwh->cb_cls, +                 &hr, +                 &dd); +        TALER_EXCHANGE_deposits_get_cancel (dwh); +        return; +      }      }      break;    case MHD_HTTP_BAD_REQUEST: @@ -259,10 +271,7 @@ handle_deposit_wtid_finished (void *cls,    }    dwh->cb (dwh->cb_cls,             &hr, -           ep, -           wtid, -           execution_time, -           coin_contribution); +           NULL);    TALER_EXCHANGE_deposits_get_cancel (dwh);  }  | 
