-get taler-exchange-httpd_reserves_attest.c to build (but not finished)
This commit is contained in:
parent
2d9270a01d
commit
de657800a8
@ -161,6 +161,7 @@ taler_exchange_httpd_SOURCES = \
|
|||||||
taler-exchange-httpd_recoup-refresh.c taler-exchange-httpd_recoup-refresh.h \
|
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_refreshes_reveal.c taler-exchange-httpd_refreshes_reveal.h \
|
||||||
taler-exchange-httpd_refund.c taler-exchange-httpd_refund.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_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.c taler-exchange-httpd_reserves_get.h \
|
||||||
taler-exchange-httpd_reserves_get_attest.c taler-exchange-httpd_reserves_get_attest.h \
|
taler-exchange-httpd_reserves_get_attest.c taler-exchange-httpd_reserves_get_attest.h \
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* @file taler-exchange-httpd_reserves_close.c
|
* @file taler-exchange-httpd_reserves_attest.c
|
||||||
* @brief Handle /reserves/$RESERVE_PUB/close requests
|
* @brief Handle /reserves/$RESERVE_PUB/attest requests
|
||||||
* @author Florian Dold
|
* @author Florian Dold
|
||||||
* @author Benedikt Mueller
|
* @author Benedikt Mueller
|
||||||
* @author Christian Grothoff
|
* @author Christian Grothoff
|
||||||
@ -54,25 +54,26 @@ struct ReserveAttestContext
|
|||||||
*/
|
*/
|
||||||
struct GNUNET_TIME_Timestamp timestamp;
|
struct GNUNET_TIME_Timestamp timestamp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expiration time for the attestation.
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_Timestamp etime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of requested details.
|
||||||
|
*/
|
||||||
|
json_t *details;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Client signature approving the request.
|
* Client signature approving the request.
|
||||||
*/
|
*/
|
||||||
struct TALER_ReserveSignatureP reserve_sig;
|
struct TALER_ReserveSignatureP reserve_sig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attest of the reserve, set in the callback.
|
* Attributes we are affirming.
|
||||||
*/
|
*/
|
||||||
struct TALER_EXCHANGEDB_ReserveAttest *rh;
|
json_t *json_attest;
|
||||||
|
|
||||||
/**
|
|
||||||
* Global fees applying to the request.
|
|
||||||
*/
|
|
||||||
const struct TEH_GlobalFee *gf;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Current reserve balance.
|
|
||||||
*/
|
|
||||||
struct TALER_Amount balance;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -87,22 +88,44 @@ static MHD_RESULT
|
|||||||
reply_reserve_attest_success (struct MHD_Connection *connection,
|
reply_reserve_attest_success (struct MHD_Connection *connection,
|
||||||
const struct ReserveAttestContext *rhc)
|
const struct ReserveAttestContext *rhc)
|
||||||
{
|
{
|
||||||
const struct TALER_EXCHANGEDB_ReserveAttest *rh = rhc->rh;
|
struct TALER_ExchangeSignatureP exchange_sig;
|
||||||
json_t *json_attest;
|
struct TALER_ExchangePublicKeyP exchange_pub;
|
||||||
|
enum TALER_ErrorCode ec;
|
||||||
|
struct GNUNET_TIME_Timestamp now;
|
||||||
|
|
||||||
json_attest = TEH_RESPONSE_compile_reserve_attest (rh);
|
if (NULL == rhc->json_attest)
|
||||||
if (NULL == json_attest)
|
{
|
||||||
|
GNUNET_break (0);
|
||||||
return TALER_MHD_reply_with_error (connection,
|
return TALER_MHD_reply_with_error (connection,
|
||||||
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
||||||
TALER_EC_GENERIC_JSON_ALLOCATION_FAILURE,
|
TALER_EC_GENERIC_JSON_ALLOCATION_FAILURE,
|
||||||
NULL);
|
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 (
|
return TALER_MHD_REPLY_JSON_PACK (
|
||||||
connection,
|
connection,
|
||||||
MHD_HTTP_OK,
|
MHD_HTTP_OK,
|
||||||
TALER_JSON_pack_amount ("balance",
|
GNUNET_JSON_pack_data_auto ("exchange_sig",
|
||||||
&rhc->balance),
|
&exchange_sig),
|
||||||
|
GNUNET_JSON_pack_data_auto ("exchange_pub",
|
||||||
|
&exchange_pub),
|
||||||
GNUNET_JSON_pack_array_steal ("attest",
|
GNUNET_JSON_pack_array_steal ("attest",
|
||||||
json_attest));
|
rhc->json_attest));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -129,49 +152,15 @@ reserve_attest_transaction (void *cls,
|
|||||||
struct ReserveAttestContext *rsc = cls;
|
struct ReserveAttestContext *rsc = cls;
|
||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
|
|
||||||
if (! TALER_amount_is_zero (&rsc->gf->fees.attest))
|
#if FIXME
|
||||||
{
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
qs = TEH_plugin->get_reserve_attest (TEH_plugin->cls,
|
qs = TEH_plugin->get_reserve_attest (TEH_plugin->cls,
|
||||||
rsc->reserve_pub,
|
rsc->reserve_pub,
|
||||||
&rsc->balance,
|
&rsc->json_attest,
|
||||||
&rsc->rh);
|
&etime);
|
||||||
|
#else
|
||||||
|
qs = GNUNET_DB_STATUS_HARD_ERROR;
|
||||||
|
(void) rsc;
|
||||||
|
#endif
|
||||||
if (GNUNET_DB_STATUS_HARD_ERROR == qs)
|
if (GNUNET_DB_STATUS_HARD_ERROR == qs)
|
||||||
{
|
{
|
||||||
GNUNET_break (0);
|
GNUNET_break (0);
|
||||||
@ -181,6 +170,7 @@ reserve_attest_transaction (void *cls,
|
|||||||
TALER_EC_GENERIC_DB_FETCH_FAILED,
|
TALER_EC_GENERIC_DB_FETCH_FAILED,
|
||||||
"get_reserve_attest");
|
"get_reserve_attest");
|
||||||
}
|
}
|
||||||
|
// FIXME: filter json_attest by requested attributes!
|
||||||
return qs;
|
return qs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,6 +185,8 @@ TEH_handler_reserves_attest (struct TEH_RequestContext *rc,
|
|||||||
struct GNUNET_JSON_Specification spec[] = {
|
struct GNUNET_JSON_Specification spec[] = {
|
||||||
GNUNET_JSON_spec_timestamp ("request_timestamp",
|
GNUNET_JSON_spec_timestamp ("request_timestamp",
|
||||||
&rsc.timestamp),
|
&rsc.timestamp),
|
||||||
|
GNUNET_JSON_spec_json ("details",
|
||||||
|
&rsc.details),
|
||||||
GNUNET_JSON_spec_fixed_auto ("reserve_sig",
|
GNUNET_JSON_spec_fixed_auto ("reserve_sig",
|
||||||
&rsc.reserve_sig),
|
&rsc.reserve_sig),
|
||||||
GNUNET_JSON_spec_end ()
|
GNUNET_JSON_spec_end ()
|
||||||
@ -230,35 +222,12 @@ TEH_handler_reserves_attest (struct TEH_RequestContext *rc,
|
|||||||
TALER_EC_EXCHANGE_GENERIC_CLOCK_SKEW,
|
TALER_EC_EXCHANGE_GENERIC_CLOCK_SKEW,
|
||||||
NULL);
|
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 !=
|
if (GNUNET_OK !=
|
||||||
TALER_wallet_reserve_attest_verify (rsc.timestamp,
|
TALER_wallet_reserve_attest_request_verify (rsc.timestamp,
|
||||||
&rsc.gf->fees.attest,
|
rsc.details,
|
||||||
reserve_pub,
|
reserve_pub,
|
||||||
&rsc.reserve_sig))
|
&rsc.reserve_sig))
|
||||||
{
|
{
|
||||||
GNUNET_break_op (0);
|
GNUNET_break_op (0);
|
||||||
return TALER_MHD_reply_with_error (rc->connection,
|
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,
|
TALER_EC_EXCHANGE_RESERVES_ATTEST_BAD_SIGNATURE,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
rsc.rh = NULL;
|
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
TEH_DB_run_transaction (rc->connection,
|
TEH_DB_run_transaction (rc->connection,
|
||||||
"get reserve attest",
|
"post reserve attest",
|
||||||
TEH_MT_REQUEST_OTHER,
|
TEH_MT_REQUEST_OTHER,
|
||||||
&mhd_ret,
|
&mhd_ret,
|
||||||
&reserve_attest_transaction,
|
&reserve_attest_transaction,
|
||||||
@ -277,17 +245,8 @@ TEH_handler_reserves_attest (struct TEH_RequestContext *rc,
|
|||||||
{
|
{
|
||||||
return mhd_ret;
|
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,
|
mhd_ret = reply_reserve_attest_success (rc->connection,
|
||||||
&rsc);
|
&rsc);
|
||||||
TEH_plugin->free_reserve_attest (TEH_plugin->cls,
|
|
||||||
rsc.rh);
|
|
||||||
return mhd_ret;
|
return mhd_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user