/*
This file is part of TALER
(C) 2017-2020 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3, or (at your option) any later version.
TALER is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
TALER; see the file COPYING. If not, see
*/
/**
* @file backend/taler-merchant-httpd_tip-pickup.c
* @brief implementation of /tip-pickup handler
* @author Christian Grothoff
*/
#include "platform.h"
#include
#include
#include
#include
#include "taler-merchant-httpd.h"
#include "taler-merchant-httpd_mhd.h"
#include "taler-merchant-httpd_exchanges.h"
#include "taler-merchant-httpd_tip-pickup.h"
/**
* Manages a GET /tip-pickup call, checking that the tip is authorized,
* and if so, returning the withdrawal permissions.
*
* @param rh context of the handler
* @param connection the MHD connection to handle
* @param[in,out] connection_cls the connection's closure (can be updated)
* @param upload_data upload data
* @param[in,out] upload_data_size number of bytes (left) in @a upload_data
* @param mi merchant backend instance, never NULL
* @return MHD result code
*/
MHD_RESULT
MH_handler_tip_pickup_get (struct TMH_RequestHandler *rh,
struct MHD_Connection *connection,
void **connection_cls,
const char *upload_data,
size_t *upload_data_size,
struct MerchantInstance *mi)
{
const char *tip_id_str;
char *exchange_url;
json_t *extra;
struct GNUNET_HashCode tip_id;
struct TALER_Amount tip_amount;
struct TALER_Amount tip_amount_left;
struct GNUNET_TIME_Absolute timestamp;
struct GNUNET_TIME_Absolute timestamp_expire;
MHD_RESULT ret;
enum GNUNET_DB_QueryStatus qs;
tip_id_str = MHD_lookup_connection_value (connection,
MHD_GET_ARGUMENT_KIND,
"tip_id");
if (NULL == tip_id_str)
{
/* tip_id is required but missing */
GNUNET_break_op (0);
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_PARAMETER_MISSING,
"tip_id required");
}
if (GNUNET_OK !=
GNUNET_CRYPTO_hash_from_string (tip_id_str,
&tip_id))
{
/* tip_id has wrong encoding */
GNUNET_break_op (0);
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_PARAMETER_MALFORMED,
"tip_id malformed");
}
db->preflight (db->cls);
qs = db->lookup_tip_by_id (db->cls,
&tip_id,
&exchange_url,
&extra,
&tip_amount,
&tip_amount_left,
×tamp);
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
{
unsigned int response_code;
enum TALER_ErrorCode ec;
switch (qs)
{
case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
ec = TALER_EC_TIP_PICKUP_TIP_ID_UNKNOWN;
response_code = MHD_HTTP_NOT_FOUND;
break;
case GNUNET_DB_STATUS_SOFT_ERROR:
ec = TALER_EC_TIP_PICKUP_DB_ERROR_SOFT;
response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
break;
case GNUNET_DB_STATUS_HARD_ERROR:
ec = TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
break;
default:
GNUNET_break (0);
ec = TALER_EC_INTERNAL_LOGIC_ERROR;
response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
break;
}
return TALER_MHD_reply_with_error (connection,
response_code,
ec,
"Could not determine exchange URL for the given tip id");
}
timestamp_expire = GNUNET_TIME_absolute_add (timestamp,
GNUNET_TIME_UNIT_DAYS);
ret = TALER_MHD_reply_json_pack (
connection,
MHD_HTTP_OK,
"{s:s, s:o, s:o, s:o, s:o, s:o}",
"exchange_url", exchange_url,
"amount", TALER_JSON_from_amount (&tip_amount),
"amount_left", TALER_JSON_from_amount (&tip_amount_left),
"stamp_created", GNUNET_JSON_from_time_abs (timestamp),
"stamp_expire", GNUNET_JSON_from_time_abs (timestamp_expire),
"extra", extra);
GNUNET_free (exchange_url);
json_decref (extra);
return ret;
}