[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-donau] branch master updated: [lib][include] add new client
From: |
gnunet |
Subject: |
[taler-donau] branch master updated: [lib][include] add new client |
Date: |
Tue, 28 May 2024 16:03:54 +0200 |
This is an automated email from the git hooks/post-receive script.
lukas-matyja pushed a commit to branch master
in repository donau.
The following commit(s) were added to refs/heads/master by this push:
new a32de70 [lib][include] add new client
new 443a818 Merge remote-tracking branch 'refs/remotes/origin/master'
a32de70 is described below
commit a32de704f62ff324d3daaa1fd3293a71680ad8c1
Author: Matyja Lukas Adam <lukas.matyja@students.bfh.ch>
AuthorDate: Tue May 28 16:05:19 2024 +0200
[lib][include] add new client
---
src/include/donau_crypto_lib.h | 36 +++-
src/include/donau_service.h | 120 +++++++++++---
src/lib/Makefile.am | 3 +-
src/lib/donau_api_donation_statement_get.c | 256 +++++++++++++++++++++++++++++
4 files changed, 380 insertions(+), 35 deletions(-)
diff --git a/src/include/donau_crypto_lib.h b/src/include/donau_crypto_lib.h
index 7cfccfc..da1290f 100644
--- a/src/include/donau_crypto_lib.h
+++ b/src/include/donau_crypto_lib.h
@@ -23,6 +23,7 @@
* @author Lukas Matyja
* @author Pius Loosli
*/
+
#if ! defined (__DONAU_UTIL_LIB_H_INSIDE__)
#error "Only <donau_util.h> can be included directly."
#endif
@@ -323,14 +324,6 @@ struct DONAU_BkpSignData
const struct DONAU_BlindedUniqueDonorIdentifier *budi;
};
-/** USED?
- * Hash of a budikeypair array
- */
-// struct DONAU_BudiHashP
-// {
-// struct GNUNET_HashCode hash;
-// };
-
/**
* Hash of a Unique Donor Identifier (h_donor_tax_id + nonce)
*/
@@ -372,6 +365,33 @@ struct DONAU_BudiMasterSecretP
};
+/**
+ * Donation Statement
+ */
+struct DONAU_DonationStatement
+{
+ /**
+ * The corresponding year.
+ */
+ uint64_t year;
+
+ /**
+ * The salted and hashed donor id.
+ */
+ struct DONAU_HashDonorTaxId *h_donor_tax_id;
+
+ /**
+ * The total donated amount.
+ */
+ struct TALER_Amount total_amount;
+
+ /**
+ * The donation statement signature over @year, @h_donor_tax_id and
@total_amount.
+ */
+ struct DONAU_DonauSignatureP *donation_statement_sig;
+
+};
+
/* ********************* charity eddsa signing ************************** */
diff --git a/src/include/donau_service.h b/src/include/donau_service.h
index d68c2ec..20f0b82 100644
--- a/src/include/donau_service.h
+++ b/src/include/donau_service.h
@@ -578,6 +578,89 @@ struct DONAU_DonorReceiptsToStatementHandle;
* operation's result.
*/
struct DONAU_DonorReceiptsToStatementResult
+{
+ /**
+ * HTTP response data
+ */
+ struct DONAU_HttpResponse hr;
+
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * permission request to a donau.
+ *
+ * @param cls closure
+ * @param dr response details
+ */
+typedef void
+(*DONAU_DonorReceiptsToStatementResultCallback) (
+ void *cls,
+ const struct DONAU_DonorReceiptsToStatementResult *dr);
+
+
+/**
+ * Submit a batch of receipts to the donau and get the
+ * donau's response. This API is typically used by a donor. Note that
+ * while we return the response verbatim to the caller for further processing,
+ * we do already verify that the response is well-formed (i.e. that signatures
+ * included in the response are all valid). If the donau's reply is not
+ * well-formed, we return an HTTP status code of zero to @a cb.
+ *
+ * We also verify that the signature of the charity is valid for this
+ * request. Also, the @a donau must be ready to operate (i.e. have
+ * finished processing the /keys reply). If either check fails, we do
+ * NOT initiate the receipts with the donau and instead return NULL.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param num_drs length of the @a drs array
+ * @param drs array with details about the donation receipts
+ * @param year corresponding year
+ * @param h_donor_tax_id salted and hashed tax id
+ * @param cb the callback to call when a reply for this request is available
+ * @param cls closure for the above callback
+ * @param[out] ec if NULL is returned, set to the error code explaining why
the operation failed
+ * @return a handle for this request; NULL if the inputs are invalid (i.e.
+ * signatures fail to verify). In this case, the callback is not
called.
+ */
+struct DONAU_DonorReceiptsToStatementHandle *
+DONAU_donor_receipts_to_statement (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const size_t num_drs,
+ const struct DONAU_DonationReceipt drs[num_drs],
+ const uint64_t year,
+ const struct DONAU_HashDonorTaxId *h_donor_tax_id,
+ DONAU_DonorReceiptsToStatementResultCallback cb,
+ void *cls);
+
+/**
+ * Cancel a batch permission request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param[in] the Batch Submit recipts handle
+ */
+void
+DONAU_donor_receipts_to_statement_cancel (
+ struct DONAU_DonorReceiptsToStatementHandle *);
+
+
+/* ********************* GET /donation-statement *********************** */
+
+
+/**
+ * @brief A get donation statement Handle
+ */
+struct DONAU_DonationStatementGetHandle;
+
+
+/**
+ * Structure with information about a
+ * operation's result.
+ */
+struct DONAU_DonationStatementResponse
{
/**
* HTTP response data
@@ -602,15 +685,10 @@ struct DONAU_DonorReceiptsToStatementResult
* The donation statment for a requested year. Signature over the total
amount,
* the year, the unique identifier hash
*/
- struct DONAU_DonauSignatureP *sig;
+ struct DONAU_DonauSignatureP *donation_statement_sig;
} ok;
- struct
- {
- /* TODO: returning full details is not implemented */
- } conflict;
-
} details;
};
@@ -623,28 +701,20 @@ struct DONAU_DonorReceiptsToStatementResult
* @param dr response details
*/
typedef void
-(*DONAU_DonorReceiptsToStatementResultCallback) (
+(*DONAU_GetDonationStatmentResponseCallback) (
void *cls,
- const struct DONAU_DonorReceiptsToStatementResult *dr);
+ const struct DONAU_DonationStatementResponse *dr);
/**
- * Submit a batch of receipts to the donau and get the
- * donau's response. This API is typically used by a donor. Note that
- * while we return the response verbatim to the caller for further processing,
+ * Get a specific donation statement from the donau. This API is typically
used by a donor.
+ * Note that while we return the response verbatim to the caller for further
processing,
* we do already verify that the response is well-formed (i.e. that signatures
* included in the response are all valid). If the donau's reply is not
* well-formed, we return an HTTP status code of zero to @a cb.
*
- * We also verify that the signature of the charity is valid for this
- * request. Also, the @a donau must be ready to operate (i.e. have
- * finished processing the /keys reply). If either check fails, we do
- * NOT initiate the receipts with the donau and instead return NULL.
- *
* @param ctx curl context
* @param url donau base URL
- * @param num_drs length of the @a drs array
- * @param drs array with details about the donation receipts
* @param year corresponding year
* @param h_donor_tax_id salted and hashed tax id
* @param cb the callback to call when a reply for this request is available
@@ -653,16 +723,14 @@ typedef void
* @return a handle for this request; NULL if the inputs are invalid (i.e.
* signatures fail to verify). In this case, the callback is not
called.
*/
-struct DONAU_DonorReceiptsToStatementHandle *
-DONAU_donor_receipts_to_statement (
+struct DONAU_DonationStatementGetHandle *
+DONAU_donation_statement_get (
struct GNUNET_CURL_Context *ctx,
const char *url,
- const size_t num_drs,
- const struct DONAU_DonationReceipt drs[num_drs],
const uint64_t year,
const struct DONAU_HashDonorTaxId *h_donor_tax_id,
- DONAU_DonorReceiptsToStatementResultCallback cb,
- void *cls);
+ DONAU_GetDonationStatmentResponseCallback cb,
+ void *cb_cls);
/**
* Cancel a batch permission request. This function cannot be used
@@ -671,8 +739,8 @@ DONAU_donor_receipts_to_statement (
* @param[in] the Batch Submit recipts handle
*/
void
-DONAU_donor_receipts_to_statement_cancel (
- struct DONAU_DonorReceiptsToStatementHandle *);
+DONAU_donation_statement_get_cancel (
+ struct DONAU_DonationStatementGetHandle *);
/* ********************* POST /csr batch-issue *********************** */
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 426bb0b..2691388 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -28,7 +28,8 @@ libdonau_la_SOURCES = \
donau_api_curl_defaults.c donau_api_curl_defaults.h \
donau_api_batch_issue_receipts.c \
donau_api_batch_submit_receipts.c \
- donau_api_csr_post.c
+ donau_api_csr_post.c \
+ donau_api_donation_statement_get.c
## maybe need libtalercurl
libdonau_la_LIBADD = \
diff --git a/src/lib/donau_api_donation_statement_get.c
b/src/lib/donau_api_donation_statement_get.c
new file mode 100644
index 0000000..2db2830
--- /dev/null
+++ b/src/lib/donau_api_donation_statement_get.c
@@ -0,0 +1,256 @@
+/*
+ This file is part of TALER
+ Copyright (C) 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 lib/donau_api_donation_statement_get.c
+ * @brief Implementation of the "handle" component of the donau's HTTP API
+ * @author Lukas Matyja
+ */
+#include <gnunet/gnunet_curl_lib.h>
+#include <taler/taler_json_lib.h>
+#include "donau_service.h"
+#include "donau_api_curl_defaults.h"
+#include "donau_json_lib.h"
+
+
+/**
+ * Handle for a GET /donation-statement/$YEAR/$HASH_DONOR_ID request.
+ */
+struct DONAU_DonationStatementGetHandle
+{
+ /**
+ * The url for the /donation-statement/$YEAR/$HASH_DONOR_ID request.
+ */
+ char *url;
+
+ /**
+ * Entry for this request with the `struct GNUNET_CURL_Context`.
+ */
+ struct GNUNET_CURL_Job *job;
+
+ /**
+ * Function to call with the result.
+ */
+ DONAU_GetDonationStatmentResponseCallback cb;
+
+ /**
+ * Salted and hashed donor id
+ */
+ const struct DONAU_HashDonorTaxId *h_donor_tax_id;
+
+ /**
+ * year
+ */
+ uint64_t year;
+
+ /**
+ * Closure to pass to @e cb.
+ */
+ void *cb_cls;
+
+};
+
+
+/**
+ * Callback used when downloading the reply to a
/donation-statement/$YEAR/$HASH_DONOR_ID request
+ * is complete.
+ *
+ * @param cls the `struct KeysRequest`
+ * @param response_code HTTP response code, 0 on error
+ * @param resp_obj parsed JSON result, NULL on error
+ */
+static void
+handle_donation_statement_get_finished (void *cls,
+ long response_code,
+ const void *resp_obj)
+{
+ struct DONAU_DonationStatementGetHandle *dsgh = cls;
+ const json_t *j = resp_obj;
+ struct DONAU_DonationStatementResponse dsresp = {
+ .hr.reply = j,
+ .hr.http_status = (unsigned int) response_code
+ };
+
+ dsgh->job = NULL;
+ switch (response_code)
+ {
+ case 0:
+ dsresp.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
+ break;
+ case MHD_HTTP_OK:
+ struct GNUNET_JSON_Specification spec[] = {
+ GNUNET_JSON_spec_fixed_auto (
+ "donation_statement",
+ dsresp.details.ok.donation_statement_sig),
+ TALER_JSON_spec_amount_any ("total_amount",
+ &dsresp.details.ok.total_amount),
+ GNUNET_JSON_spec_end ()
+ };
+ if (GNUNET_OK !=
+ GNUNET_JSON_parse (j,
+ spec,
+ NULL,
+ NULL))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Could not parse response from donation-statement GET\n");
+ GNUNET_break_op (0);
+ dsresp.hr.http_status = 0;
+ dsresp.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
+ }
+ dsgh->cb (dsgh->cb_cls,
+ &dsresp);
+ dsgh->cb = NULL;
+ case MHD_HTTP_BAD_REQUEST:
+ /* This should never happen, either us or the donau is buggy
+ (or API version conflict); just pass JSON reply to the application */
+ dsresp.hr.ec = TALER_JSON_get_error_code (j);
+ dsresp.hr.hint = TALER_JSON_get_error_hint (j);
+ break;
+ case MHD_HTTP_NOT_FOUND:
+ /* Nothing really to verify, this should never
+ happen, we should pass the JSON reply to the application */
+ dsresp.hr.ec = TALER_JSON_get_error_code (j);
+ dsresp.hr.hint = TALER_JSON_get_error_hint (j);
+ break;
+ case MHD_HTTP_INTERNAL_SERVER_ERROR:
+ /* Server had an internal issue; we should retry, but this API
+ leaves this to the application */
+ dsresp.hr.ec = TALER_JSON_get_error_code (j);
+ dsresp.hr.hint = TALER_JSON_get_error_hint (j);
+ break;
+ default:
+ /* unexpected response code */
+ GNUNET_break_op (0);
+ dsresp.hr.ec = TALER_JSON_get_error_code (j);
+ dsresp.hr.hint = TALER_JSON_get_error_hint (j);
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Unexpected response code %u/%d for GET %s\n",
+ (unsigned int) response_code,
+ (int) dsresp.hr.ec,
+ dsgh->url);
+ break;
+ }
+ if (NULL != dsgh->cb)
+ {
+ dsgh->cb (dsgh->cb_cls,
+ &dsresp);
+ dsgh->cb = NULL;
+ }
+ DONAU_donation_statement_get_cancel (dsgh);
+}
+
+
+/**
+ * Prepares the request URL for the age-withdraw request
+ *
+ * @param awbh The handler
+ * @param donau_url The base-URL to the donau
+ */
+static
+enum GNUNET_GenericReturnValue
+prepare_url (
+ struct DONAU_DonationStatementGetHandle *dsgh,
+ const char *donau_url)
+{
+ char arg_str[sizeof (struct DONAU_HashDonorTaxId) * 2 + 32];
+ char donor_id_hash_str[sizeof (struct DONAU_HashDonorTaxId) * 2];
+ char *end;
+
+ end = GNUNET_STRINGS_data_to_string (
+ &dsgh->h_donor_tax_id,
+ sizeof (struct DONAU_HashDonorTaxId),
+ donor_id_hash_str,
+ sizeof (donor_id_hash_str));
+ *end = '\0';
+ GNUNET_snprintf (arg_str,
+ sizeof (arg_str),
+ "donation-statement/%lu/%s",
+ dsgh->year,
+ donor_id_hash_str);
+
+ dsgh->url = TALER_url_join (donau_url,
+ arg_str,
+ NULL);
+ if (NULL == dsgh->url)
+ {
+ GNUNET_break (0);
+ DONAU_donation_statement_get_cancel (dsgh);
+ return GNUNET_SYSERR;
+ }
+
+ return GNUNET_OK;
+}
+
+
+struct DONAU_DonationStatementGetHandle *
+DONAU_donation_statement_get (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url, // FIXME change the name of every api function call base
url to donau_url.
+ const uint64_t year,
+ const struct DONAU_HashDonorTaxId *h_donor_tax_id,
+ DONAU_GetDonationStatmentResponseCallback cb,
+ void *cb_cls)
+{
+ struct DONAU_DonationStatementGetHandle *dsgh;
+ CURL *eh;
+
+ TALER_LOG_DEBUG ("Connecting to the donau (%s)\n",
+ url);
+ dsgh = GNUNET_new (struct DONAU_DonationStatementGetHandle);
+ // dsgh->url = GNUNET_strdup (url);
+ dsgh->cb = cb;
+ dsgh->cb_cls = cb_cls;
+ dsgh->year = year;
+ dsgh->h_donor_tax_id = h_donor_tax_id;
+ if (GNUNET_OK != prepare_url (dsgh,
+ url))
+ return NULL;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Requesting a charity with URL `%s'.\n",
+ dsgh->url);
+ eh = DONAU_curl_easy_get_ (dsgh->url);
+ if (NULL == eh)
+ {
+ GNUNET_break (0);
+ GNUNET_free (dsgh->url);
+ GNUNET_free (dsgh);
+ return NULL;
+ }
+ dsgh->job = GNUNET_CURL_job_add_with_ct_json (ctx,
+ eh,
+ &
+
handle_donation_statement_get_finished,
+ dsgh);
+ return dsgh;
+}
+
+
+void
+DONAU_donation_statement_get_cancel (
+ struct DONAU_DonationStatementGetHandle *dsgh)
+{
+ if (NULL != dsgh->job)
+ {
+ GNUNET_CURL_job_cancel (dsgh->job);
+ dsgh->job = NULL;
+ }
+ GNUNET_free (dsgh->url);
+ GNUNET_free (dsgh);
+}
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [taler-donau] branch master updated: [lib][include] add new client,
gnunet <=