summaryrefslogtreecommitdiff
path: root/src/exchange
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2022-10-02 13:34:51 +0200
committerChristian Grothoff <christian@grothoff.org>2022-10-02 13:34:51 +0200
commitde657800a854a031e61f5bcc7d1c168150d1c626 (patch)
treec330469fd1a5a66528269b1320532deb60a6ae98 /src/exchange
parent2d9270a01d48aa1408e049425ee2398b4cbd1011 (diff)
downloadexchange-de657800a854a031e61f5bcc7d1c168150d1c626.tar.gz
exchange-de657800a854a031e61f5bcc7d1c168150d1c626.tar.bz2
exchange-de657800a854a031e61f5bcc7d1c168150d1c626.zip
-get taler-exchange-httpd_reserves_attest.c to build (but not finished)
Diffstat (limited to 'src/exchange')
-rw-r--r--src/exchange/Makefile.am1
-rw-r--r--src/exchange/taler-exchange-httpd_reserves_attest.c151
2 files changed, 56 insertions, 96 deletions
diff --git a/src/exchange/Makefile.am b/src/exchange/Makefile.am
index 9a4c107c9..b2365eecb 100644
--- a/src/exchange/Makefile.am
+++ b/src/exchange/Makefile.am
@@ -161,6 +161,7 @@ taler_exchange_httpd_SOURCES = \
taler-exchange-httpd_recoup-refresh.c taler-exchange-httpd_recoup-refresh.h \
taler-exchange-httpd_refreshes_reveal.c taler-exchange-httpd_refreshes_reveal.h \
taler-exchange-httpd_refund.c taler-exchange-httpd_refund.h \
+ taler-exchange-httpd_reserves_attest.c taler-exchange-httpd_reserves_attest.h \
taler-exchange-httpd_reserves_close.c taler-exchange-httpd_reserves_close.h \
taler-exchange-httpd_reserves_get.c taler-exchange-httpd_reserves_get.h \
taler-exchange-httpd_reserves_get_attest.c taler-exchange-httpd_reserves_get_attest.h \
diff --git a/src/exchange/taler-exchange-httpd_reserves_attest.c b/src/exchange/taler-exchange-httpd_reserves_attest.c
index 2bde9eb2b..6a030dbd3 100644
--- a/src/exchange/taler-exchange-httpd_reserves_attest.c
+++ b/src/exchange/taler-exchange-httpd_reserves_attest.c
@@ -14,8 +14,8 @@
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
/**
- * @file taler-exchange-httpd_reserves_close.c
- * @brief Handle /reserves/$RESERVE_PUB/close requests
+ * @file taler-exchange-httpd_reserves_attest.c
+ * @brief Handle /reserves/$RESERVE_PUB/attest requests
* @author Florian Dold
* @author Benedikt Mueller
* @author Christian Grothoff
@@ -55,24 +55,25 @@ struct ReserveAttestContext
struct GNUNET_TIME_Timestamp timestamp;
/**
- * Client signature approving the request.
+ * Expiration time for the attestation.
*/
- struct TALER_ReserveSignatureP reserve_sig;
+ struct GNUNET_TIME_Timestamp etime;
/**
- * Attest of the reserve, set in the callback.
+ * List of requested details.
*/
- struct TALER_EXCHANGEDB_ReserveAttest *rh;
+ json_t *details;
/**
- * Global fees applying to the request.
+ * Client signature approving the request.
*/
- const struct TEH_GlobalFee *gf;
+ struct TALER_ReserveSignatureP reserve_sig;
/**
- * Current reserve balance.
+ * Attributes we are affirming.
*/
- struct TALER_Amount balance;
+ json_t *json_attest;
+
};
@@ -87,22 +88,44 @@ static MHD_RESULT
reply_reserve_attest_success (struct MHD_Connection *connection,
const struct ReserveAttestContext *rhc)
{
- const struct TALER_EXCHANGEDB_ReserveAttest *rh = rhc->rh;
- json_t *json_attest;
+ struct TALER_ExchangeSignatureP exchange_sig;
+ struct TALER_ExchangePublicKeyP exchange_pub;
+ enum TALER_ErrorCode ec;
+ struct GNUNET_TIME_Timestamp now;
- json_attest = TEH_RESPONSE_compile_reserve_attest (rh);
- if (NULL == json_attest)
+ if (NULL == rhc->json_attest)
+ {
+ GNUNET_break (0);
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_GENERIC_JSON_ALLOCATION_FAILURE,
NULL);
+ }
+ now = GNUNET_TIME_timestamp_get ();
+ ec = TALER_exchange_online_reserve_attest_details_sign (
+ &TEH_keys_exchange_sign_,
+ now,
+ rhc->etime,
+ rhc->reserve_pub,
+ rhc->json_attest,
+ &exchange_pub,
+ &exchange_sig);
+ if (TALER_EC_NONE != ec)
+ {
+ GNUNET_break (0);
+ return TALER_MHD_reply_with_ec (connection,
+ ec,
+ NULL);
+ }
return TALER_MHD_REPLY_JSON_PACK (
connection,
MHD_HTTP_OK,
- TALER_JSON_pack_amount ("balance",
- &rhc->balance),
+ GNUNET_JSON_pack_data_auto ("exchange_sig",
+ &exchange_sig),
+ GNUNET_JSON_pack_data_auto ("exchange_pub",
+ &exchange_pub),
GNUNET_JSON_pack_array_steal ("attest",
- json_attest));
+ rhc->json_attest));
}
@@ -129,49 +152,15 @@ reserve_attest_transaction (void *cls,
struct ReserveAttestContext *rsc = cls;
enum GNUNET_DB_QueryStatus qs;
- if (! TALER_amount_is_zero (&rsc->gf->fees.attest))
- {
- bool balance_ok = false;
- bool idempotent = true;
-
- qs = TEH_plugin->insert_attest_request (TEH_plugin->cls,
- rsc->reserve_pub,
- &rsc->reserve_sig,
- rsc->timestamp,
- &rsc->gf->fees.attest,
- &balance_ok,
- &idempotent);
- if (GNUNET_DB_STATUS_HARD_ERROR == qs)
- {
- GNUNET_break (0);
- *mhd_ret
- = TALER_MHD_reply_with_error (connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_GENERIC_DB_FETCH_FAILED,
- "get_reserve_attest");
- }
- if (qs <= 0)
- {
- GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
- return qs;
- }
- if (! balance_ok)
- {
- return TALER_MHD_reply_with_error (connection,
- MHD_HTTP_CONFLICT,
- TALER_EC_EXCHANGE_WITHDRAW_ATTEST_ERROR_INSUFFICIENT_FUNDS,
- NULL);
- }
- if (idempotent)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Idempotent /reserves/attest request observed. Is caching working?\n");
- }
- }
+#if FIXME
qs = TEH_plugin->get_reserve_attest (TEH_plugin->cls,
rsc->reserve_pub,
- &rsc->balance,
- &rsc->rh);
+ &rsc->json_attest,
+ &etime);
+#else
+ qs = GNUNET_DB_STATUS_HARD_ERROR;
+ (void) rsc;
+#endif
if (GNUNET_DB_STATUS_HARD_ERROR == qs)
{
GNUNET_break (0);
@@ -181,6 +170,7 @@ reserve_attest_transaction (void *cls,
TALER_EC_GENERIC_DB_FETCH_FAILED,
"get_reserve_attest");
}
+ // FIXME: filter json_attest by requested attributes!
return qs;
}
@@ -195,6 +185,8 @@ TEH_handler_reserves_attest (struct TEH_RequestContext *rc,
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_timestamp ("request_timestamp",
&rsc.timestamp),
+ GNUNET_JSON_spec_json ("details",
+ &rsc.details),
GNUNET_JSON_spec_fixed_auto ("reserve_sig",
&rsc.reserve_sig),
GNUNET_JSON_spec_end ()
@@ -230,35 +222,12 @@ TEH_handler_reserves_attest (struct TEH_RequestContext *rc,
TALER_EC_EXCHANGE_GENERIC_CLOCK_SKEW,
NULL);
}
- {
- struct TEH_KeyStateHandle *keys;
- keys = TEH_keys_get_state ();
- if (NULL == keys)
- {
- GNUNET_break (0);
- GNUNET_JSON_parse_free (spec);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_EXCHANGE_GENERIC_KEYS_MISSING,
- NULL);
- }
- rsc.gf = TEH_keys_global_fee_by_time (keys,
- rsc.timestamp);
- }
- if (NULL == rsc.gf)
- {
- GNUNET_break (0);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_EXCHANGE_GENERIC_BAD_CONFIGURATION,
- NULL);
- }
if (GNUNET_OK !=
- TALER_wallet_reserve_attest_verify (rsc.timestamp,
- &rsc.gf->fees.attest,
- reserve_pub,
- &rsc.reserve_sig))
+ TALER_wallet_reserve_attest_request_verify (rsc.timestamp,
+ rsc.details,
+ reserve_pub,
+ &rsc.reserve_sig))
{
GNUNET_break_op (0);
return TALER_MHD_reply_with_error (rc->connection,
@@ -266,10 +235,9 @@ TEH_handler_reserves_attest (struct TEH_RequestContext *rc,
TALER_EC_EXCHANGE_RESERVES_ATTEST_BAD_SIGNATURE,
NULL);
}
- rsc.rh = NULL;
if (GNUNET_OK !=
TEH_DB_run_transaction (rc->connection,
- "get reserve attest",
+ "post reserve attest",
TEH_MT_REQUEST_OTHER,
&mhd_ret,
&reserve_attest_transaction,
@@ -277,17 +245,8 @@ TEH_handler_reserves_attest (struct TEH_RequestContext *rc,
{
return mhd_ret;
}
- if (NULL == rsc.rh)
- {
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_NOT_FOUND,
- TALER_EC_EXCHANGE_GENERIC_RESERVE_UNKNOWN,
- NULL);
- }
mhd_ret = reply_reserve_attest_success (rc->connection,
&rsc);
- TEH_plugin->free_reserve_attest (TEH_plugin->cls,
- rsc.rh);
return mhd_ret;
}