gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-merchant] branch master updated: add libtalermerchantbank to acce


From: gnunet
Subject: [taler-merchant] branch master updated: add libtalermerchantbank to access libeufin merchant facade
Date: Wed, 12 Apr 2023 13:43:02 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository merchant.

The following commit(s) were added to refs/heads/master by this push:
     new 182b48ce add libtalermerchantbank to access libeufin merchant facade
182b48ce is described below

commit 182b48ceae21ec3902d08b1fda5fcc26110709b6
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Wed Apr 12 13:42:59 2023 +0200

    add libtalermerchantbank to access libeufin merchant facade
---
 configure.ac            |   1 +
 src/Makefile.am         |   2 +-
 src/backend/.gitignore  |   1 +
 src/bank/Makefile.am    |  28 ++++
 src/bank/mb_common.c    |  72 +++++++++++
 src/bank/mb_common.h    |  45 +++++++
 src/bank/mb_credit.c    | 331 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/bank/mb_parse.c     | 158 +++++++++++++++++++++++
 src/include/Makefile.am |   1 +
 9 files changed, 638 insertions(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index cf782ad9..fc228d86 100644
--- a/configure.ac
+++ b/configure.ac
@@ -355,6 +355,7 @@ contrib/Makefile
 doc/Makefile
 doc/doxygen/Makefile
 src/Makefile
+src/bank/Makefile
 src/backend/Makefile
 src/backenddb/Makefile
 src/include/Makefile
diff --git a/src/Makefile.am b/src/Makefile.am
index 984c780f..23b34b38 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,3 +1,3 @@
 # This Makefile is in the public domain
 AM_CPPFLAGS = -I$(top_srcdir)/src/include
-SUBDIRS = include backenddb backend lib testing merchant-tools
+SUBDIRS = include bank backenddb backend lib testing merchant-tools
diff --git a/src/backend/.gitignore b/src/backend/.gitignore
index 70cba102..0154aa73 100644
--- a/src/backend/.gitignore
+++ b/src/backend/.gitignore
@@ -1 +1,2 @@
 taler-merchant-webhook
+taler-merchant-wirewatch
diff --git a/src/bank/Makefile.am b/src/bank/Makefile.am
new file mode 100644
index 00000000..b7bb209f
--- /dev/null
+++ b/src/bank/Makefile.am
@@ -0,0 +1,28 @@
+# This Makefile.am is in the public domain
+AM_CPPFLAGS = -I$(top_srcdir)/src/include
+
+if USE_COVERAGE
+  AM_CFLAGS = --coverage -O0
+  XLIB = -lgcov
+endif
+
+lib_LTLIBRARIES = \
+  libtalermerchantbank.la
+
+libtalermerchantbank_la_LDFLAGS = \
+  -version-info 0:0:0 \
+  -no-undefined
+libtalermerchantbank_la_SOURCES = \
+  mb_common.c mb_common.h \
+  mb_credit.c \
+  mb_parse.c
+libtalermerchantbank_la_LIBADD = \
+  -ltalerjson \
+  -ltalercurl \
+  -ltalerutil \
+  -lgnunetcurl \
+  -lgnunetjson \
+  -lgnunetutil \
+  -ljansson \
+  $(LIBGNURLCURL_LIBS) \
+  $(XLIB)
diff --git a/src/bank/mb_common.c b/src/bank/mb_common.c
new file mode 100644
index 00000000..c85eea80
--- /dev/null
+++ b/src/bank/mb_common.c
@@ -0,0 +1,72 @@
+/*
+  This file is part of Taler
+  Copyright (C) 2015-2023 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/mb_common.c
+ * @brief Common functions for the bank API
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include "mb_common.h"
+
+
+/**
+ * Set authentication data in @a easy from @a auth.
+ * The API currently specifies the use of HTTP basic
+ * authentication.
+ *
+ * @param easy curl handle to setup for authentication
+ * @param auth authentication data to use
+ * @return #GNUNET_OK in success
+ */
+enum GNUNET_GenericReturnValue
+TALER_MERCHANT_BANK_setup_auth_ (
+  CURL *easy,
+  const struct TALER_MERCHANT_BANK_AuthenticationData *auth)
+{
+  enum GNUNET_GenericReturnValue ret;
+
+  ret = GNUNET_OK;
+  switch (auth->method)
+  {
+  case TALER_MERCHANT_BANK_AUTH_NONE:
+    return GNUNET_OK;
+  case TALER_MERCHANT_BANK_AUTH_BASIC:
+    {
+      char *up;
+
+      GNUNET_asprintf (&up,
+                       "%s:%s",
+                       auth->details.basic.username,
+                       auth->details.basic.password);
+      if ( (CURLE_OK !=
+            curl_easy_setopt (easy,
+                              CURLOPT_HTTPAUTH,
+                              CURLAUTH_BASIC)) ||
+           (CURLE_OK !=
+            curl_easy_setopt (easy,
+                              CURLOPT_USERPWD,
+                              up)) )
+        ret = GNUNET_SYSERR;
+      GNUNET_free (up);
+      break;
+    }
+  }
+  return ret;
+}
+
+
+/* end of mb_common.c */
diff --git a/src/bank/mb_common.h b/src/bank/mb_common.h
new file mode 100644
index 00000000..efca1dd0
--- /dev/null
+++ b/src/bank/mb_common.h
@@ -0,0 +1,45 @@
+/*
+  This file is part of Taler
+  Copyright (C) 2015-2023 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/mb_common.h
+ * @brief Common functions for the bank API
+ * @author Christian Grothoff
+ */
+#ifndef MB_COMMON_H
+#define MB_COMMON_H
+
+#include <gnunet/gnunet_util_lib.h>
+#include <gnunet/gnunet_json_lib.h>
+#include <gnunet/gnunet_curl_lib.h>
+#include "taler_merchant_bank_lib.h"
+#include <taler/taler_json_lib.h>
+
+
+/**
+ * Set authentication data in @a easy from @a auth.
+ *
+ * @param easy curl handle to setup for authentication
+ * @param auth authentication data to use
+ * @return #GNUNET_OK in success
+ */
+enum GNUNET_GenericReturnValue
+TALER_MERCHANT_BANK_setup_auth_ (
+  CURL *easy,
+  const struct TALER_MERCHANT_BANK_AuthenticationData *auth);
+
+
+#endif
diff --git a/src/bank/mb_credit.c b/src/bank/mb_credit.c
new file mode 100644
index 00000000..345a79c8
--- /dev/null
+++ b/src/bank/mb_credit.c
@@ -0,0 +1,331 @@
+/*
+  This file is part of GNU Taler
+  Copyright (C) 2017--2023 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/mb_credit.c
+ * @brief Implementation of the /history/incoming
+ *        requests of the libeufin's Taler merchant facade
+ * @author Christian Grothoff
+ * @author Marcello Stanisci
+ */
+#include "platform.h"
+#include "mb_common.h"
+#include <microhttpd.h> /* just for HTTP status codes */
+
+
+/**
+ * @brief A /history/incoming Handle
+ */
+struct TALER_MERCHANT_BANK_CreditHistoryHandle
+{
+
+  /**
+   * The url for this request.
+   */
+  char *request_url;
+
+  /**
+   * Handle for the request.
+   */
+  struct GNUNET_CURL_Job *job;
+
+  /**
+   * Function to call with the result.
+   */
+  TALER_MERCHANT_BANK_CreditHistoryCallback hcb;
+
+  /**
+   * Closure for @a cb.
+   */
+  void *hcb_cls;
+};
+
+
+/**
+ * Parse history given in JSON format and invoke the callback on each item.
+ *
+ * @param hh handle to the account history request
+ * @param history JSON array with the history
+ * @return #GNUNET_OK if history was valid and @a rhistory and @a balance
+ *         were set,
+ *         #GNUNET_SYSERR if there was a protocol violation in @a history
+ */
+static enum GNUNET_GenericReturnValue
+parse_account_history (struct TALER_MERCHANT_BANK_CreditHistoryHandle *hh,
+                       const json_t *history)
+{
+  json_t *history_array;
+
+  if (NULL == (history_array = json_object_get (history,
+                                                "incoming_transactions")))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+  if (! json_is_array (history_array))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+  for (unsigned int i = 0; i<json_array_size (history_array); i++)
+  {
+    struct TALER_MERCHANT_BANK_CreditDetails td;
+    uint64_t row_id;
+    struct GNUNET_JSON_Specification hist_spec[] = {
+      TALER_JSON_spec_amount_any ("amount",
+                                  &td.amount),
+      GNUNET_JSON_spec_timestamp ("date",
+                                  &td.execution_date),
+      GNUNET_JSON_spec_uint64 ("row_id",
+                               &row_id),
+      GNUNET_JSON_spec_string ("subject",
+                               &td.wire_subject),
+      GNUNET_JSON_spec_string ("debit_account",
+                               &td.debit_account_uri),
+      GNUNET_JSON_spec_string ("credit_account",
+                               &td.credit_account_uri),
+      GNUNET_JSON_spec_end ()
+    };
+    json_t *transaction = json_array_get (history_array,
+                                          i);
+
+    if (GNUNET_OK !=
+        GNUNET_JSON_parse (transaction,
+                           hist_spec,
+                           NULL, NULL))
+    {
+      GNUNET_break_op (0);
+      return GNUNET_SYSERR;
+    }
+    if (GNUNET_OK !=
+        hh->hcb (hh->hcb_cls,
+                 MHD_HTTP_OK,
+                 TALER_EC_NONE,
+                 row_id,
+                 &td))
+    {
+      hh->hcb = NULL;
+      GNUNET_JSON_parse_free (hist_spec);
+      return GNUNET_OK;
+    }
+    GNUNET_JSON_parse_free (hist_spec);
+  }
+  return GNUNET_OK;
+}
+
+
+/**
+ * Function called when we're done processing the
+ * HTTP /history/incoming request.
+ *
+ * @param cls the `struct TALER_MERCHANT_BANK_CreditHistoryHandle`
+ * @param response_code HTTP response code, 0 on error
+ * @param response parsed JSON result, NULL on error
+ */
+static void
+handle_credit_history_finished (void *cls,
+                                long response_code,
+                                const void *response)
+{
+  struct TALER_MERCHANT_BANK_CreditHistoryHandle *hh = cls;
+  const json_t *j = response;
+  enum TALER_ErrorCode ec;
+
+  hh->job = NULL;
+  switch (response_code)
+  {
+  case 0:
+    ec = TALER_EC_GENERIC_INVALID_RESPONSE;
+    break;
+  case MHD_HTTP_OK:
+    if (GNUNET_OK !=
+        parse_account_history (hh,
+                               j))
+    {
+      GNUNET_break_op (0);
+      response_code = 0;
+      ec = TALER_EC_GENERIC_INVALID_RESPONSE;
+      break;
+    }
+    response_code = MHD_HTTP_NO_CONTENT; /* signal end of list */
+    ec = TALER_EC_NONE;
+    break;
+  case MHD_HTTP_NO_CONTENT:
+    ec = TALER_EC_NONE;
+    break;
+  case MHD_HTTP_BAD_REQUEST:
+    /* This should never happen, either us or the bank is buggy
+       (or API version conflict); just pass JSON reply to the application */
+    GNUNET_break_op (0);
+    ec = TALER_JSON_get_error_code (j);
+    break;
+  case MHD_HTTP_UNAUTHORIZED:
+    /* Nothing really to verify, bank says the HTTP Authentication
+       failed. May happen if HTTP authentication is used and the
+       user supplied a wrong username/password combination. */
+    ec = TALER_JSON_get_error_code (j);
+    break;
+  case MHD_HTTP_NOT_FOUND:
+    /* Nothing really to verify: the bank is either unaware
+       of the endpoint (not a bank), or of the account.
+       We should pass the JSON (?) reply to the application */
+    ec = TALER_JSON_get_error_code (j);
+    break;
+  case MHD_HTTP_INTERNAL_SERVER_ERROR:
+    /* Server had an internal issue; we should retry, but this API
+       leaves this to the application */
+    ec = TALER_JSON_get_error_code (j);
+    break;
+  default:
+    /* unexpected response code */
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Unexpected response code %u\n",
+                (unsigned int) response_code);
+    ec = TALER_JSON_get_error_code (j);
+    break;
+  }
+  if (NULL != hh->hcb)
+    hh->hcb (hh->hcb_cls,
+             response_code,
+             ec,
+             0LLU,
+             NULL);
+  TALER_MERCHANT_BANK_credit_history_cancel (hh);
+}
+
+
+struct TALER_MERCHANT_BANK_CreditHistoryHandle *
+TALER_MERCHANT_BANK_credit_history (
+  struct GNUNET_CURL_Context *ctx,
+  const struct TALER_MERCHANT_BANK_AuthenticationData *auth,
+  uint64_t start_row,
+  int64_t num_results,
+  struct GNUNET_TIME_Relative timeout,
+  TALER_MERCHANT_BANK_CreditHistoryCallback hres_cb,
+  void *hres_cb_cls)
+{
+  char url[128];
+  struct TALER_MERCHANT_BANK_CreditHistoryHandle *hh;
+  CURL *eh;
+  unsigned long long tms;
+
+  if (0 == num_results)
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
+
+  tms = (unsigned long long) (timeout.rel_value_us
+                              / GNUNET_TIME_UNIT_MILLISECONDS.rel_value_us);
+  if ( ( (UINT64_MAX == start_row) &&
+         (0 > num_results) ) ||
+       ( (0 == start_row) &&
+         (0 < num_results) ) )
+  {
+    if ( (0 < num_results) &&
+         (! GNUNET_TIME_relative_is_zero (timeout)) )
+      GNUNET_snprintf (url,
+                       sizeof (url),
+                       "history/incoming?delta=%lld&long_poll_ms=%llu",
+                       (long long) num_results,
+                       tms);
+    else
+      GNUNET_snprintf (url,
+                       sizeof (url),
+                       "history/incoming?delta=%lld",
+                       (long long) num_results);
+  }
+  else
+  {
+    if ( (0 < num_results) &&
+         (! GNUNET_TIME_relative_is_zero (timeout)) )
+      GNUNET_snprintf (url,
+                       sizeof (url),
+                       
"history/incoming?delta=%lld&start=%llu&long_poll_ms=%llu",
+                       (long long) num_results,
+                       (unsigned long long) start_row,
+                       tms);
+    else
+      GNUNET_snprintf (url,
+                       sizeof (url),
+                       "history/incoming?delta=%lld&start=%llu",
+                       (long long) num_results,
+                       (unsigned long long) start_row);
+  }
+  hh = GNUNET_new (struct TALER_MERCHANT_BANK_CreditHistoryHandle);
+  hh->hcb = hres_cb;
+  hh->hcb_cls = hres_cb_cls;
+  hh->request_url = TALER_url_join (auth->wire_gateway_url,
+                                    url,
+                                    NULL);
+  if (NULL == hh->request_url)
+  {
+    GNUNET_free (hh);
+    GNUNET_break (0);
+    return NULL;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Requesting credit history at `%s'\n",
+              hh->request_url);
+  eh = curl_easy_init ();
+  if ( (NULL == eh) ||
+       (GNUNET_OK !=
+        TALER_MERCHANT_BANK_setup_auth_ (eh,
+                                         auth)) ||
+       (CURLE_OK !=
+        curl_easy_setopt (eh,
+                          CURLOPT_URL,
+                          hh->request_url)) )
+  {
+    GNUNET_break (0);
+    TALER_MERCHANT_BANK_credit_history_cancel (hh);
+    if (NULL != eh)
+      curl_easy_cleanup (eh);
+    return NULL;
+  }
+  if (0 != tms)
+  {
+    GNUNET_break (CURLE_OK ==
+                  curl_easy_setopt (eh,
+                                    CURLOPT_TIMEOUT_MS,
+                                    (long) tms));
+  }
+  hh->job = GNUNET_CURL_job_add2 (ctx,
+                                  eh,
+                                  NULL,
+                                  &handle_credit_history_finished,
+                                  hh);
+  return hh;
+}
+
+
+void
+TALER_MERCHANT_BANK_credit_history_cancel (
+  struct TALER_MERCHANT_BANK_CreditHistoryHandle *hh)
+{
+  if (NULL != hh->job)
+  {
+    GNUNET_CURL_job_cancel (hh->job);
+    hh->job = NULL;
+  }
+  GNUNET_free (hh->request_url);
+  GNUNET_free (hh);
+}
+
+
+/* end of mb_credit.c */
diff --git a/src/bank/mb_parse.c b/src/bank/mb_parse.c
new file mode 100644
index 00000000..f785ed11
--- /dev/null
+++ b/src/bank/mb_parse.c
@@ -0,0 +1,158 @@
+/*
+  This file is part of Taler
+  Copyright (C) 2018-2023 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/mb_parse.c
+ * @brief Convenience function to parse authentication configuration
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include "taler_merchant_bank_lib.h"
+
+
+/**
+ * Parse configuration section with bank authentication data.
+ *
+ * @param cfg configuration to parse
+ * @param section the section with the configuration data
+ * @param[out] auth set to the configuration data found
+ * @return #GNUNET_OK on success
+ */
+enum GNUNET_GenericReturnValue
+TALER_MERCHANT_BANK_auth_parse_cfg (
+  const struct GNUNET_CONFIGURATION_Handle *cfg,
+  const char *section,
+  struct TALER_MERCHANT_BANK_AuthenticationData *auth)
+{
+  const struct
+  {
+    const char *m;
+    enum TALER_MERCHANT_BANK_AuthenticationMethod e;
+  } methods[] = {
+    { "NONE",  TALER_MERCHANT_BANK_AUTH_NONE  },
+    { "BASIC", TALER_MERCHANT_BANK_AUTH_BASIC },
+    { NULL, TALER_MERCHANT_BANK_AUTH_NONE     }
+  };
+  char *method;
+
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_string (cfg,
+                                             section,
+                                             "WIRE_GATEWAY_URL",
+                                             &auth->wire_gateway_url))
+  {
+    GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                               section,
+                               "WIRE_GATEWAY_URL");
+    return GNUNET_SYSERR;
+  }
+
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_string (cfg,
+                                             section,
+                                             "WIRE_GATEWAY_AUTH_METHOD",
+                                             &method))
+  {
+    GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                               section,
+                               "WIRE_GATEWAY_AUTH_METHOD");
+    GNUNET_free (auth->wire_gateway_url);
+    return GNUNET_SYSERR;
+  }
+  for (unsigned int i = 0; NULL != methods[i].m; i++)
+  {
+    if (0 == strcasecmp (method,
+                         methods[i].m))
+    {
+      switch (methods[i].e)
+      {
+      case TALER_MERCHANT_BANK_AUTH_NONE:
+        auth->method = TALER_MERCHANT_BANK_AUTH_NONE;
+        GNUNET_free (method);
+        return GNUNET_OK;
+      case TALER_MERCHANT_BANK_AUTH_BASIC:
+        if (GNUNET_OK !=
+            GNUNET_CONFIGURATION_get_value_string (cfg,
+                                                   section,
+                                                   "USERNAME",
+                                                   
&auth->details.basic.username))
+        {
+          GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                                     section,
+                                     "USERNAME");
+          GNUNET_free (method);
+          GNUNET_free (auth->wire_gateway_url);
+          return GNUNET_SYSERR;
+        }
+        if (GNUNET_OK !=
+            GNUNET_CONFIGURATION_get_value_string (cfg,
+                                                   section,
+                                                   "PASSWORD",
+                                                   
&auth->details.basic.password))
+        {
+          GNUNET_free (auth->details.basic.username);
+          auth->details.basic.username = NULL;
+          GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                                     section,
+                                     "PASSWORD");
+          GNUNET_free (method);
+          GNUNET_free (auth->wire_gateway_url);
+          return GNUNET_SYSERR;
+        }
+        auth->method = TALER_MERCHANT_BANK_AUTH_BASIC;
+        GNUNET_free (method);
+        return GNUNET_OK;
+      }
+    }
+  }
+  GNUNET_free (method);
+  return GNUNET_SYSERR;
+}
+
+
+/**
+ * Free memory inside of @a auth (but not @a auth itself).
+ * Dual to #TALER_MERCHANT_BANK_auth_parse_cfg().
+ *
+ * @param[in] auth authentication data to free
+ */
+void
+TALER_MERCHANT_BANK_auth_free (
+  struct TALER_MERCHANT_BANK_AuthenticationData *auth)
+{
+  switch (auth->method)
+  {
+  case TALER_MERCHANT_BANK_AUTH_NONE:
+    break;
+  case TALER_MERCHANT_BANK_AUTH_BASIC:
+    if (NULL != auth->details.basic.username)
+    {
+      GNUNET_free (auth->details.basic.username);
+      auth->details.basic.username = NULL;
+    }
+    if (NULL != auth->details.basic.password)
+    {
+      GNUNET_free (auth->details.basic.password);
+      auth->details.basic.password = NULL;
+    }
+    break;
+  }
+  GNUNET_free (auth->wire_gateway_url);
+  auth->wire_gateway_url = NULL;
+}
+
+
+/* end of mb_parse.c */
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
index aeb65712..7f1b9292 100644
--- a/src/include/Makefile.am
+++ b/src/include/Makefile.am
@@ -5,6 +5,7 @@ EXTRA_DIST = \
 talerincludedir = $(includedir)/taler
 
 talerinclude_HEADERS = \
+  taler_merchant_bank_lib.h \
   taler_merchantdb_lib.h \
   taler_merchantdb_plugin.h \
   taler_merchant_service.h \

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]