summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2024-02-05 11:33:14 +0100
committerChristian Grothoff <christian@grothoff.org>2024-02-05 11:33:14 +0100
commit14ccce8feebf4a9e5622ed4d93399cecf9a37248 (patch)
treef7899c35c1cf2f75fa173957d7fe69dedddd7e62 /src
parenta24a8eef9e71866f738f88e93d628c881014294b (diff)
downloadexchange-14ccce8feebf4a9e5622ed4d93399cecf9a37248.tar.gz
exchange-14ccce8feebf4a9e5622ed4d93399cecf9a37248.tar.bz2
exchange-14ccce8feebf4a9e5622ed4d93399cecf9a37248.zip
implement relevant parts of core bank API v4 in fakebank
Diffstat (limited to 'src')
-rw-r--r--src/bank-lib/Makefile.am1
-rw-r--r--src/bank-lib/fakebank.c2
-rw-r--r--src/bank-lib/fakebank_bank.c35
-rw-r--r--src/bank-lib/fakebank_bank_accounts_withdrawals.c2
-rw-r--r--src/bank-lib/fakebank_bank_post_withdrawals_id_op.c239
-rw-r--r--src/bank-lib/fakebank_bank_post_withdrawals_id_op.h53
-rw-r--r--src/bank-lib/fakebank_tbi.c2
-rw-r--r--src/bank-lib/fakebank_tbr.c2
-rw-r--r--src/bank-lib/fakebank_twg.c2
9 files changed, 331 insertions, 7 deletions
diff --git a/src/bank-lib/Makefile.am b/src/bank-lib/Makefile.am
index 3458b7a01..b849db5d8 100644
--- a/src/bank-lib/Makefile.am
+++ b/src/bank-lib/Makefile.am
@@ -74,6 +74,7 @@ libtalerfakebank_la_SOURCES = \
fakebank_bank_post_accounts_withdrawals.c fakebank_bank_post_accounts_withdrawals.h \
fakebank_bank_post_withdrawals_abort.c fakebank_bank_post_withdrawals_abort.h \
fakebank_bank_post_withdrawals_confirm.c fakebank_bank_post_withdrawals_confirm.h \
+ fakebank_bank_post_withdrawals_id_op.c fakebank_bank_post_withdrawals_id_op.h \
fakebank_bank_testing_register.c fakebank_bank_testing_register.h \
fakebank_tbr.c fakebank_tbr.h \
fakebank_tbr_get_history.c fakebank_tbr_get_history.h \
diff --git a/src/bank-lib/fakebank.c b/src/bank-lib/fakebank.c
index 12302be7b..3a004dc80 100644
--- a/src/bank-lib/fakebank.c
+++ b/src/bank-lib/fakebank.c
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- (C) 2016-2023 Taler Systems SA
+ (C) 2016-2024 Taler Systems SA
TALER is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
diff --git a/src/bank-lib/fakebank_bank.c b/src/bank-lib/fakebank_bank.c
index 353141a6a..7c2d39ab4 100644
--- a/src/bank-lib/fakebank_bank.c
+++ b/src/bank-lib/fakebank_bank.c
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- (C) 2016-2023 Taler Systems SA
+ (C) 2016-2024 Taler Systems SA
TALER is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@@ -36,6 +36,7 @@
#include "fakebank_bank_post_accounts_withdrawals.h"
#include "fakebank_bank_post_withdrawals_abort.h"
#include "fakebank_bank_post_withdrawals_confirm.h"
+#include "fakebank_bank_post_withdrawals_id_op.h"
#include "fakebank_bank_testing_register.h"
@@ -73,7 +74,7 @@ TALER_FAKEBANK_bank_main_ (
connection,
MHD_HTTP_OK,
GNUNET_JSON_pack_string ("version",
- "0:0:0"),
+ "4:0:4"), /* not sure, API versions are not properly marked up! */
GNUNET_JSON_pack_string ("currency",
h->currency),
GNUNET_JSON_pack_string ("implementation",
@@ -479,6 +480,36 @@ TALER_FAKEBANK_bank_main_ (
GNUNET_free (acc);
return ret;
}
+
+ if (0 == strncmp (end_acc,
+ "/withdrawals/",
+ strlen ("/withdrawals/")))
+ {
+ /* POST /accounts/$ACCOUNT/withdrawals/$WID/$OP */
+ MHD_RESULT ret;
+ const char *pos = &end_acc[strlen ("/withdrawals/")];
+ const char *op = strchr (pos, '/');
+
+ if (NULL != op)
+ {
+ char *wid = GNUNET_strndup (pos,
+ op - pos);
+
+ ret = TALER_FAKEBANK_bank_withdrawals_id_op_ (
+ h,
+ connection,
+ acc,
+ wid,
+ op,
+ upload_data,
+ upload_data_size,
+ con_cls);
+ GNUNET_free (wid);
+ GNUNET_free (acc);
+ return ret;
+ }
+ GNUNET_free (acc);
+ }
}
}
diff --git a/src/bank-lib/fakebank_bank_accounts_withdrawals.c b/src/bank-lib/fakebank_bank_accounts_withdrawals.c
index ffcff0e20..bb435d975 100644
--- a/src/bank-lib/fakebank_bank_accounts_withdrawals.c
+++ b/src/bank-lib/fakebank_bank_accounts_withdrawals.c
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- (C) 2016-2023 Taler Systems SA
+ (C) 2016-2024 Taler Systems SA
TALER is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
diff --git a/src/bank-lib/fakebank_bank_post_withdrawals_id_op.c b/src/bank-lib/fakebank_bank_post_withdrawals_id_op.c
new file mode 100644
index 000000000..90493b4bb
--- /dev/null
+++ b/src/bank-lib/fakebank_bank_post_withdrawals_id_op.c
@@ -0,0 +1,239 @@
+/*
+ This file is part of TALER
+ (C) 2016-2024 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 <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file bank-lib/fakebank_bank_post_withdrawals_id_op.c
+ * @brief implement bank API POST /accounts/$ACCOUNT/withdrawals/$WID/$OP endpoint(s)
+ * @author Christian Grothoff <christian@grothoff.org>
+ */
+#include "platform.h"
+#include <pthread.h>
+#include "taler_fakebank_lib.h"
+#include "taler_bank_service.h"
+#include "taler_mhd_lib.h"
+#include <gnunet/gnunet_mhd_compat.h>
+#include "fakebank.h"
+#include "fakebank_bank_post_withdrawals_id_op.h"
+#include "fakebank_common_lookup.h"
+#include "fakebank_common_lp.h"
+#include "fakebank_common_make_admin_transfer.h"
+
+
+/**
+ * Handle POST /accounts/$ACC/withdrawals/{withdrawal_id}/confirm request.
+ *
+ * @param h our fakebank handle
+ * @param connection the connection
+ * @param withdrawal_id the withdrawal operation identifier
+ * @return MHD result code
+ */
+static MHD_RESULT
+bank_withdrawals_confirm (
+ struct TALER_FAKEBANK_Handle *h,
+ struct MHD_Connection *connection,
+ const char *account,
+ const char *withdrawal_id)
+{
+ const struct Account *acc;
+ struct WithdrawalOperation *wo;
+
+ GNUNET_assert (0 ==
+ pthread_mutex_lock (&h->big_lock));
+ acc = TALER_FAKEBANK_lookup_account_ (h,
+ account,
+ NULL);
+ if (NULL == acc)
+ {
+ GNUNET_assert (0 ==
+ pthread_mutex_unlock (&h->big_lock));
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Account %s is unknown\n",
+ account);
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_NOT_FOUND,
+ TALER_EC_BANK_UNKNOWN_ACCOUNT,
+ account);
+ }
+ wo = TALER_FAKEBANK_lookup_withdrawal_operation_ (h,
+ withdrawal_id);
+ if ( (NULL == wo) ||
+ (acc != wo->debit_account) )
+ {
+ GNUNET_assert (0 ==
+ pthread_mutex_unlock (&h->big_lock));
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_NOT_FOUND,
+ TALER_EC_BANK_TRANSACTION_NOT_FOUND,
+ withdrawal_id);
+ }
+ if (NULL == wo->exchange_account)
+ {
+ GNUNET_assert (0 ==
+ pthread_mutex_unlock (&h->big_lock));
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_BAD_REQUEST,
+ TALER_EC_BANK_POST_WITHDRAWAL_OPERATION_REQUIRED,
+ NULL);
+ }
+ if (wo->aborted)
+ {
+ GNUNET_assert (0 ==
+ pthread_mutex_unlock (&h->big_lock));
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_CONFLICT,
+ TALER_EC_BANK_CONFIRM_ABORT_CONFLICT,
+ withdrawal_id);
+ }
+ GNUNET_assert (0 ==
+ pthread_mutex_unlock (&h->big_lock));
+ if (GNUNET_OK !=
+ TALER_FAKEBANK_make_admin_transfer_ (
+ h,
+ wo->debit_account->account_name,
+ wo->exchange_account->account_name,
+ &wo->amount,
+ &wo->reserve_pub,
+ &wo->row_id,
+ &wo->timestamp))
+ {
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_CONFLICT,
+ TALER_EC_BANK_DUPLICATE_RESERVE_PUB_SUBJECT,
+ NULL);
+ }
+ /* Re-acquiring the lock and continuing to operate on 'wo'
+ is currently (!) acceptable because we NEVER free 'wo'
+ until shutdown. We may want to revise this if keeping
+ all withdraw operations in RAM becomes an issue... */
+ GNUNET_assert (0 ==
+ pthread_mutex_lock (&h->big_lock));
+ wo->confirmation_done = true;
+ TALER_FAKEBANK_notify_withdrawal_ (h,
+ wo);
+ GNUNET_assert (0 ==
+ pthread_mutex_unlock (&h->big_lock));
+ return TALER_MHD_reply_static (connection,
+ MHD_HTTP_NO_CONTENT,
+ NULL,
+ NULL,
+ 0);
+}
+
+
+/**
+ * Handle POST /accounts/$ACC/withdrawals/{withdrawal_id}/abort request.
+ *
+ * @param h our fakebank handle
+ * @param connection the connection
+ * @param withdrawal_id the withdrawal operation identifier
+ * @return MHD result code
+ */
+static MHD_RESULT
+bank_withdrawals_abort (
+ struct TALER_FAKEBANK_Handle *h,
+ struct MHD_Connection *connection,
+ const char *account,
+ const char *withdrawal_id)
+{
+ struct WithdrawalOperation *wo;
+ const struct Account *acc;
+
+ GNUNET_assert (0 ==
+ pthread_mutex_lock (&h->big_lock));
+ acc = TALER_FAKEBANK_lookup_account_ (h,
+ account,
+ NULL);
+ if (NULL == acc)
+ {
+ GNUNET_assert (0 ==
+ pthread_mutex_unlock (&h->big_lock));
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Account %s is unknown\n",
+ account);
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_NOT_FOUND,
+ TALER_EC_BANK_UNKNOWN_ACCOUNT,
+ account);
+ }
+ wo = TALER_FAKEBANK_lookup_withdrawal_operation_ (h,
+ withdrawal_id);
+ if ( (NULL == wo) ||
+ (acc != wo->debit_account) )
+ {
+ GNUNET_assert (0 ==
+ pthread_mutex_unlock (&h->big_lock));
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_NOT_FOUND,
+ TALER_EC_BANK_TRANSACTION_NOT_FOUND,
+ withdrawal_id);
+ }
+ if (wo->confirmation_done)
+ {
+ GNUNET_assert (0 ==
+ pthread_mutex_unlock (&h->big_lock));
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_CONFLICT,
+ TALER_EC_BANK_ABORT_CONFIRM_CONFLICT,
+ withdrawal_id);
+ }
+ wo->aborted = true;
+ TALER_FAKEBANK_notify_withdrawal_ (h,
+ wo);
+ GNUNET_assert (0 ==
+ pthread_mutex_unlock (&h->big_lock));
+ return TALER_MHD_reply_static (connection,
+ MHD_HTTP_NO_CONTENT,
+ NULL,
+ NULL,
+ 0);
+}
+
+
+MHD_RESULT
+TALER_FAKEBANK_bank_withdrawals_id_op_ (
+ struct TALER_FAKEBANK_Handle *h,
+ struct MHD_Connection *connection,
+ const char *account,
+ const char *withdrawal_id,
+ const char *op,
+ const char *upload_data,
+ size_t *upload_data_size,
+ void **con_cls)
+{
+ if (0 == strcmp (op,
+ "/confirm"))
+ {
+ return bank_withdrawals_confirm (h,
+ connection,
+ account,
+ withdrawal_id);
+ }
+ if (0 == strcmp (op,
+ "/abort"))
+ {
+ return bank_withdrawals_abort (h,
+ connection,
+ account,
+ withdrawal_id);
+ }
+ GNUNET_break_op (0);
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_NOT_FOUND,
+ TALER_EC_GENERIC_ENDPOINT_UNKNOWN,
+ op);
+}
diff --git a/src/bank-lib/fakebank_bank_post_withdrawals_id_op.h b/src/bank-lib/fakebank_bank_post_withdrawals_id_op.h
new file mode 100644
index 000000000..52e9e796a
--- /dev/null
+++ b/src/bank-lib/fakebank_bank_post_withdrawals_id_op.h
@@ -0,0 +1,53 @@
+/*
+ This file is part of TALER
+ (C) 2016-2024 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 <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file bank-lib/fakebank_bank_post_withdrawals_id_op.h
+ * @brief implement bank API POST /accounts/$ACCOUNT/withdrawals/$WID/$OP endpoint(s)
+ * @author Christian Grothoff <christian@grothoff.org>
+ */
+#ifndef FAKEBANK_BANK_POST_WITHDRAWALS_ID_OP_H
+#define FAKEBANK_BANK_POST_WITHDRAWALS_ID_OP_H
+
+#include "taler_fakebank_lib.h"
+#include "taler_bank_service.h"
+#include "taler_mhd_lib.h"
+#include <gnunet/gnunet_mhd_compat.h>
+#include "fakebank.h"
+
+
+/**
+ * Handle POST /accounts/{account_name}/withdrawals/{withdrawal_id}/${OP} request.
+ *
+ * @param h our fakebank handle
+ * @param connection the connection
+ * @param withdrawal_id the withdrawal operation identifier
+ * @return MHD result code
+ */
+MHD_RESULT
+TALER_FAKEBANK_bank_withdrawals_id_op_ (
+ struct TALER_FAKEBANK_Handle *h,
+ struct MHD_Connection *connection,
+ const char *account,
+ const char *withdrawal_id,
+ const char *op,
+ const char *upload_data,
+ size_t *upload_data_size,
+ void **con_cls);
+
+#endif
diff --git a/src/bank-lib/fakebank_tbi.c b/src/bank-lib/fakebank_tbi.c
index 00db3ddca..463ec7d31 100644
--- a/src/bank-lib/fakebank_tbi.c
+++ b/src/bank-lib/fakebank_tbi.c
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- (C) 2016-2023 Taler Systems SA
+ (C) 2016-2024 Taler Systems SA
TALER is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
diff --git a/src/bank-lib/fakebank_tbr.c b/src/bank-lib/fakebank_tbr.c
index 56681841c..0f0e5bdc1 100644
--- a/src/bank-lib/fakebank_tbr.c
+++ b/src/bank-lib/fakebank_tbr.c
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- (C) 2016-2023 Taler Systems SA
+ (C) 2016-2024 Taler Systems SA
TALER is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
diff --git a/src/bank-lib/fakebank_twg.c b/src/bank-lib/fakebank_twg.c
index 775bbb58d..9356e69ba 100644
--- a/src/bank-lib/fakebank_twg.c
+++ b/src/bank-lib/fakebank_twg.c
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- (C) 2016-2023 Taler Systems SA
+ (C) 2016-2024 Taler Systems SA
TALER is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License