diff options
Diffstat (limited to 'src/exchange/taler-exchange-httpd_db.c')
| -rw-r--r-- | src/exchange/taler-exchange-httpd_db.c | 413 | 
1 files changed, 0 insertions, 413 deletions
diff --git a/src/exchange/taler-exchange-httpd_db.c b/src/exchange/taler-exchange-httpd_db.c index bfe2112c..bed2a7fb 100644 --- a/src/exchange/taler-exchange-httpd_db.c +++ b/src/exchange/taler-exchange-httpd_db.c @@ -1209,417 +1209,4 @@ TEH_DB_execute_admin_add_incoming (struct MHD_Connection *connection,  } -/** - * Closure for #handle_transaction_data. - */ -struct WtidTransactionContext -{ - -  /** -   * Total amount of the wire transfer, as calculated by -   * summing up the individual amounts. To be rounded down -   * to calculate the real transfer amount at the end. -   * Only valid if @e is_valid is #GNUNET_YES. -   */ -  struct TALER_Amount total; - -  /** -   * Public key of the merchant, only valid if @e is_valid -   * is #GNUNET_YES. -   */ -  struct TALER_MerchantPublicKeyP merchant_pub; - -  /** -   * Which method was used to wire the funds? -   */ -  char *wire_method; - -  /** -   * Hash of the wire details of the merchant (identical for all -   * deposits), only valid if @e is_valid is #GNUNET_YES. -   */ -  struct GNUNET_HashCode h_wire; - -  /** -   * Execution time of the wire transfer -   */ -  struct GNUNET_TIME_Absolute exec_time; - -  /** -   * Head of DLL with details for /wire/deposit response. -   */ -  struct TEH_TrackTransferDetail *wdd_head; - -  /** -   * Head of DLL with details for /wire/deposit response. -   */ -  struct TEH_TrackTransferDetail *wdd_tail; - -  /** -   * JSON array with details about the individual deposits. -   */ -  json_t *deposits; - -  /** -   * Initially #GNUNET_NO, if we found no deposits so far.  Set to -   * #GNUNET_YES if we got transaction data, and the database replies -   * remained consistent with respect to @e merchant_pub and @e h_wire -   * (as they should).  Set to #GNUNET_SYSERR if we encountered an -   * internal error. -   */ -  int is_valid; - -}; - - -/** - * Function called with the results of the lookup of the - * transaction data for the given wire transfer identifier. - * - * @param cls our context for transmission - * @param rowid which row in the DB is the information from (for diagnostics) - * @param merchant_pub public key of the merchant (should be same for all callbacks with the same @e cls) - * @param wire_method which wire plugin was used - * @param h_wire hash of wire transfer details of the merchant (should be same for all callbacks with the same @e cls) - * @param exec_time execution time of the wire transfer (should be same for all callbacks with the same @e cls) - * @param h_contract_terms which proposal was this payment about - * @param coin_pub which public key was this payment about - * @param deposit_value amount contributed by this coin in total - * @param deposit_fee deposit fee charged by exchange for this coin - */ -static void -handle_transaction_data (void *cls, -                         uint64_t rowid, -                         const struct TALER_MerchantPublicKeyP *merchant_pub, -                         const char *wire_method, -                         const struct GNUNET_HashCode *h_wire, -                         struct GNUNET_TIME_Absolute exec_time, -                         const struct GNUNET_HashCode *h_contract_terms, -                         const struct TALER_CoinSpendPublicKeyP *coin_pub, -                         const struct TALER_Amount *deposit_value, -                         const struct TALER_Amount *deposit_fee) -{ -  struct WtidTransactionContext *ctx = cls; -  struct TALER_Amount delta; -  struct TEH_TrackTransferDetail *wdd; - -  if (GNUNET_SYSERR == ctx->is_valid) -    return; -  if (GNUNET_NO == ctx->is_valid) -  { -    ctx->merchant_pub = *merchant_pub; -    ctx->h_wire = *h_wire; -    ctx->exec_time = exec_time; -    ctx->wire_method = GNUNET_strdup (wire_method); -    ctx->is_valid = GNUNET_YES; -    if (GNUNET_OK != -        TALER_amount_subtract (&ctx->total, -                               deposit_value, -                               deposit_fee)) -    { -      GNUNET_break (0); -      ctx->is_valid = GNUNET_SYSERR; -      return; -    } -  } -  else -  { -    if ( (0 != memcmp (&ctx->merchant_pub, -                       merchant_pub, -                       sizeof (struct TALER_MerchantPublicKeyP))) || -         (0 != strcmp (wire_method, -                       ctx->wire_method)) || -         (0 != memcmp (&ctx->h_wire, -                       h_wire, -                       sizeof (struct GNUNET_HashCode))) ) -    { -      GNUNET_break (0); -      ctx->is_valid = GNUNET_SYSERR; -      return; -    } -    if (GNUNET_OK != -        TALER_amount_subtract (&delta, -                               deposit_value, -                               deposit_fee)) -    { -      GNUNET_break (0); -      ctx->is_valid = GNUNET_SYSERR; -      return; -    } -    if (GNUNET_OK != -        TALER_amount_add (&ctx->total, -                          &ctx->total, -                          &delta)) -    { -      GNUNET_break (0); -      ctx->is_valid = GNUNET_SYSERR; -      return; -    } -  } -  wdd = GNUNET_new (struct TEH_TrackTransferDetail); -  wdd->deposit_value = *deposit_value; -  wdd->deposit_fee = *deposit_fee; -  wdd->h_contract_terms = *h_contract_terms; -  wdd->coin_pub = *coin_pub; -  GNUNET_CONTAINER_DLL_insert (ctx->wdd_head, -                               ctx->wdd_tail, -                               wdd); -} - - -/** - * Execute a "/track/transfer".  Returns the transaction information - * associated with the given wire transfer identifier. - * - * @param connection the MHD connection to handle - * @param wtid wire transfer identifier to resolve - * @return MHD result code - */ -int -TEH_DB_execute_track_transfer (struct MHD_Connection *connection, -                               const struct TALER_WireTransferIdentifierRawP *wtid) -{ -  int ret; -  struct WtidTransactionContext ctx; -  struct TALER_EXCHANGEDB_Session *session; -  struct TEH_TrackTransferDetail *wdd; -  struct GNUNET_TIME_Absolute wire_fee_start_date; -  struct GNUNET_TIME_Absolute wire_fee_end_date; -  struct TALER_Amount wire_fee; -  struct TALER_MasterSignatureP wire_fee_master_sig; - -  if (NULL == (session = TEH_plugin->get_session (TEH_plugin->cls))) -  { -    GNUNET_break (0); -    return TEH_RESPONSE_reply_internal_db_error (connection, -						 TALER_EC_DB_SETUP_FAILED); -  } -  ctx.is_valid = GNUNET_NO; -  ctx.wdd_head = NULL; -  ctx.wdd_tail = NULL; -  ctx.wire_method = NULL; -  ret = TEH_plugin->lookup_wire_transfer (TEH_plugin->cls, -                                          session, -                                          wtid, -                                          &handle_transaction_data, -                                          &ctx); -  if (GNUNET_SYSERR == ret) -  { -    GNUNET_break (0); -    ret = TEH_RESPONSE_reply_internal_db_error (connection, -						TALER_EC_TRACK_TRANSFER_DB_FETCH_FAILED); -    goto cleanup; -  } -  if (GNUNET_SYSERR == ctx.is_valid) -  { -    GNUNET_break (0); -    ret = TEH_RESPONSE_reply_internal_db_error (connection, -						TALER_EC_TRACK_TRANSFER_DB_INCONSISTENT); -    goto cleanup; -  } -  if (GNUNET_NO == ctx.is_valid) -  { -    ret = TEH_RESPONSE_reply_arg_unknown (connection, -					  TALER_EC_TRACK_TRANSFER_WTID_NOT_FOUND, -                                          "wtid"); -    goto cleanup; -  } -  if (GNUNET_OK != -      TEH_plugin->get_wire_fee (TEH_plugin->cls, -                                session, -                                ctx.wire_method, -                                ctx.exec_time, -                                &wire_fee_start_date, -                                &wire_fee_end_date, -                                &wire_fee, -                                &wire_fee_master_sig)) -  { -    GNUNET_break (0); -    ret = TEH_RESPONSE_reply_internal_db_error (connection, -						TALER_EC_TRACK_TRANSFER_WIRE_FEE_NOT_FOUND); -    goto cleanup; -  } -  if (GNUNET_OK != -      TALER_amount_subtract (&ctx.total, -                             &ctx.total, -                             &wire_fee)) -  { -    GNUNET_break (0); -    ret = TEH_RESPONSE_reply_internal_db_error (connection, -						TALER_EC_TRACK_TRANSFER_WIRE_FEE_INCONSISTENT); -    goto cleanup; -  } -  ret = TEH_RESPONSE_reply_track_transfer_details (connection, -                                                   &ctx.total, -                                                   &ctx.merchant_pub, -                                                   &ctx.h_wire, -                                                   &wire_fee, -                                                   ctx.exec_time, -                                                   ctx.wdd_head); - cleanup: -  while (NULL != (wdd = ctx.wdd_head)) -  { -    GNUNET_CONTAINER_DLL_remove (ctx.wdd_head, -                                 ctx.wdd_tail, -                                 wdd); -    GNUNET_free (wdd); -  } -  GNUNET_free_non_null (ctx.wire_method); -  return ret; -} - - -/** - * Closure for #handle_wtid_data. - */ -struct DepositWtidContext -{ - -  /** -   * Where should we send the reply? -   */ -  struct MHD_Connection *connection; - -  /** -   * Hash of the proposal data we are looking up. -   */ -  struct GNUNET_HashCode h_contract_terms; - -  /** -   * Hash of the wire transfer details we are looking up. -   */ -  struct GNUNET_HashCode h_wire; - -  /** -   * Public key we are looking up. -   */ -  struct TALER_CoinSpendPublicKeyP coin_pub; - -  /** -   * MHD result code to return. -   */ -  int res; -}; - - -/** - * Function called with the results of the lookup of the - * wire transfer identifier information. - * - * @param cls our context for transmission - * @param wtid raw wire transfer identifier, NULL - *         if the transaction was not yet done - * @param coin_contribution how much did the coin we asked about - *        contribute to the total transfer value? (deposit value including fee) - * @param coin_fee how much did the exchange charge for the deposit fee - * @param execution_time when was the transaction done, or - *         when we expect it to be done (if @a wtid was NULL); - *         #GNUNET_TIME_UNIT_FOREVER_ABS if the /deposit is unknown - *         to the exchange - */ -static void -handle_wtid_data (void *cls, -		  const struct TALER_WireTransferIdentifierRawP *wtid, -                  const struct TALER_Amount *coin_contribution, -                  const struct TALER_Amount *coin_fee, -		  struct GNUNET_TIME_Absolute execution_time) -{ -  struct DepositWtidContext *ctx = cls; -  struct TALER_Amount coin_delta; - -  if (NULL == wtid) -  { -    ctx->res = TEH_RESPONSE_reply_transfer_pending (ctx->connection, -                                                    execution_time); -  } -  else -  { -    if (GNUNET_SYSERR == -        TALER_amount_subtract (&coin_delta, -                               coin_contribution, -                               coin_fee)) -    { -      GNUNET_break (0); -      ctx->res = TEH_RESPONSE_reply_internal_db_error (ctx->connection, -						       TALER_EC_TRACK_TRANSACTION_DB_FEE_INCONSISTENT); -    } -    else -    { -      ctx->res = TEH_RESPONSE_reply_track_transaction (ctx->connection, -                                                       &ctx->h_contract_terms, -                                                       &ctx->h_wire, -                                                       &ctx->coin_pub, -                                                       &coin_delta, -                                                       wtid, -                                                       execution_time); -    } -  } -} - - -/** - * Execute a "/track/transaction".  Returns the transfer information - * associated with the given deposit. - * - * @param connection the MHD connection to handle - * @param h_contract_terms hash of the proposal data - * @param h_wire hash of the wire details - * @param coin_pub public key of the coin to link - * @param merchant_pub public key of the merchant - * @return MHD result code - */ -int -TEH_DB_execute_track_transaction (struct MHD_Connection *connection, -                                  const struct GNUNET_HashCode *h_contract_terms, -                                  const struct GNUNET_HashCode *h_wire, -                                  const struct TALER_CoinSpendPublicKeyP *coin_pub, -                                  const struct TALER_MerchantPublicKeyP *merchant_pub) -{ -  int ret; -  struct DepositWtidContext ctx; -  struct TALER_EXCHANGEDB_Session *session; - -  if (NULL == (session = TEH_plugin->get_session (TEH_plugin->cls))) -  { -    GNUNET_break (0); -    return TEH_RESPONSE_reply_internal_db_error (connection, -						 TALER_EC_DB_SETUP_FAILED); -  } -  ctx.connection = connection; -  ctx.h_contract_terms = *h_contract_terms; -  ctx.h_wire = *h_wire; -  ctx.coin_pub = *coin_pub; -  ctx.res = GNUNET_SYSERR; -  ret = TEH_plugin->wire_lookup_deposit_wtid (TEH_plugin->cls, -                                              session, -					      h_contract_terms, -					      h_wire, -					      coin_pub, -					      merchant_pub, -					      &handle_wtid_data, -					      &ctx); -  if (GNUNET_SYSERR == ret) -  { -    GNUNET_break (0); -    GNUNET_break (GNUNET_SYSERR == ctx.res); -    return TEH_RESPONSE_reply_internal_db_error (connection, -						 TALER_EC_TRACK_TRANSACTION_DB_FETCH_FAILED); -  } -  if (GNUNET_NO == ret) -  { -    GNUNET_break (GNUNET_SYSERR == ctx.res); -    return TEH_RESPONSE_reply_transaction_unknown (connection, -						   TALER_EC_TRACK_TRANSACTION_NOT_FOUND); -  } -  if (GNUNET_SYSERR == ctx.res) -  { -    GNUNET_break (0); -    return TEH_RESPONSE_reply_internal_error (connection, -					      TALER_EC_TRACK_TRANSACTION_WTID_RESOLUTION_ERROR, -                                              "bug resolving deposit wtid"); -  } -  return ctx.res; -} - -  /* end of taler-exchange-httpd_db.c */  | 
