gnunet-svn
[Top][All Lists]
Advanced

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

[taler-challenger] branch master updated: add challenger-admin tool


From: gnunet
Subject: [taler-challenger] branch master updated: add challenger-admin tool
Date: Mon, 17 Apr 2023 14:59:33 +0200

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

grothoff pushed a commit to branch master
in repository challenger.

The following commit(s) were added to refs/heads/master by this push:
     new 8af7933  add challenger-admin tool
8af7933 is described below

commit 8af7933c17dba30eb0a73166b24d7a77f6a8b8d4
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Mon Apr 17 14:59:30 2023 +0200

    add challenger-admin tool
---
 INSTALL                                         |   6 +-
 contrib/uncrustify.cfg                          |  97 +++++++++++++
 src/challenger/.gitignore                       |   1 +
 src/challenger/Makefile.am                      |  10 ++
 src/challenger/challenger-admin.c               | 177 ++++++++++++++++++++++++
 src/challengerdb/Makefile.am                    |   2 +
 src/challengerdb/pg_client_add.c                |  58 ++++++++
 src/challengerdb/pg_client_add.h                |  45 ++++++
 src/challengerdb/pg_client_delete.c             |  46 ++++++
 src/challengerdb/pg_client_delete.h             |  39 ++++++
 src/challengerdb/pg_helper.h                    |  99 +++++++++++++
 src/challengerdb/pg_template.c                  |  26 ++++
 src/challengerdb/pg_template.h                  |  29 ++++
 src/challengerdb/pg_template.sh                 |  21 +++
 src/challengerdb/plugin_challengerdb_postgres.c | 167 +++++++---------------
 src/include/challenger_database_plugin.h        |  57 ++++++++
 src/util/.gitignore                             |   1 +
 17 files changed, 764 insertions(+), 117 deletions(-)

diff --git a/INSTALL b/INSTALL
index 8865734..e82fd21 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,8 +1,8 @@
 Installation Instructions
 *************************
 
-   Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
-Foundation, Inc.
+   Copyright (C) 1994-1996, 1999-2002, 2004-2017, 2020-2021 Free
+Software Foundation, Inc.
 
    Copying and distribution of this file, with or without modification,
 are permitted in any medium without royalty provided the copyright
@@ -225,7 +225,7 @@ order to use an ANSI C compiler:
 
 and if that doesn't work, install pre-built binaries of GCC for HP-UX.
 
-   HP-UX 'make' updates targets which have the same time stamps as their
+   HP-UX 'make' updates targets which have the same timestamps as their
 prerequisites, which makes it generally unusable when shipped generated
 files such as 'configure' are involved.  Use GNU 'make' instead.
 
diff --git a/contrib/uncrustify.cfg b/contrib/uncrustify.cfg
new file mode 100644
index 0000000..00cf228
--- /dev/null
+++ b/contrib/uncrustify.cfg
@@ -0,0 +1,97 @@
+input_tab_size = 2
+output_tab_size = 2
+
+indent_columns = 2
+indent_with_tabs = 0
+indent_case_brace = 2
+indent_label=-16
+
+code_width=80
+#cmd_width=80
+
+# Leave most comments alone for now
+cmt_indent_multi=false
+sp_cmt_cpp_start=add
+
+sp_not=add
+
+sp_func_call_user_paren_paren=remove
+sp_inside_fparen=remove
+sp_after_cast=add
+
+ls_for_split_full=true
+ls_func_split_full=true
+ls_code_width=true
+
+# Arithmetic operations in wrapped expressions should be at the start
+# of the line.
+pos_arith=lead
+
+# Fully parenthesize boolean exprs
+mod_full_paren_if_bool=true
+
+# Braces should be on their own line
+nl_fdef_brace=add
+nl_enum_brace=add
+nl_struct_brace=add
+nl_union_brace=add
+nl_if_brace=add
+nl_brace_else=add
+nl_elseif_brace=add
+nl_while_brace=add
+nl_switch_brace=add
+
+# no newline between "else" and "if"
+nl_else_if=remove
+
+nl_func_paren=remove
+nl_assign_brace=remove
+
+# No extra newlines that cause noisy diffs
+nl_start_of_file=remove
+nl_before_func_body_proto = 0
+nl_before_func_body_def = 0
+nl_after_func_proto = 2
+nl_after_func_body = 3
+# If there's no new line, it's not a text file!
+nl_end_of_file=add
+nl_max_blank_in_func = 3
+nl_max = 3
+
+sp_inside_paren = remove
+
+sp_arith = add
+sp_arith_additive = add
+
+# We want spaces before and after "="
+sp_before_assign = add
+sp_after_assign = add
+
+# we want "char *foo;"
+sp_after_ptr_star = remove
+sp_between_ptr_star = remove
+
+# we want "if (foo) { ... }"
+sp_before_sparen = add
+
+sp_inside_fparen = remove
+sp_inside_sparen = remove
+
+# add space before function call and decl: "foo (x)"
+sp_func_call_paren = add
+sp_func_proto_paren = add
+sp_func_proto_paren_empty = add
+sp_func_def_paren = add
+sp_func_def_paren_empty = add
+
+# We'd want it for "if ( (foo) || (bar) )", but not for "if (m())",
+# so as uncrustify doesn't give exactly what we want => ignore
+sp_paren_paren = ignore
+sp_inside_paren = remove
+sp_bool = force
+
+nl_func_type_name = force
+#nl_branch_else = add
+nl_else_brace = add
+nl_elseif_brace = add
+nl_for_brace = add
diff --git a/src/challenger/.gitignore b/src/challenger/.gitignore
new file mode 100644
index 0000000..f4b8f4b
--- /dev/null
+++ b/src/challenger/.gitignore
@@ -0,0 +1 @@
+challenger-admin
diff --git a/src/challenger/Makefile.am b/src/challenger/Makefile.am
index 92296c2..d0c4955 100644
--- a/src/challenger/Makefile.am
+++ b/src/challenger/Makefile.am
@@ -12,8 +12,18 @@ pkgcfg_DATA = \
   challenger.conf
 
 bin_PROGRAMS = \
+  challenger-admin \
   challenger-httpd
 
+challenger_admin_SOURCES = \
+  challenger-admin.c
+challenger_admin_LDADD = \
+  $(top_builddir)/src/challengerdb/libchallengerdb.la \
+  $(top_builddir)/src/util/libchallengerutil.la \
+  -ltalerutil \
+  -lgnunetutil \
+  $(XLIB)
+
 challenger_httpd_SOURCES = \
   challenger-httpd.c challenger-httpd.h \
   challenger-httpd_config.c challenger-httpd_config.h \
diff --git a/src/challenger/challenger-admin.c 
b/src/challenger/challenger-admin.c
new file mode 100644
index 0000000..bbbb576
--- /dev/null
+++ b/src/challenger/challenger-admin.c
@@ -0,0 +1,177 @@
+/*
+  This file is part of Challenger
+  Copyright (C) 2023 Taler Systems SA
+
+  Challenger 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.
+
+  Challenger 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
+  Challenger; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file util/challenger-admin.c
+ * @brief Administer clients of a challenger service
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include <gnunet/gnunet_util_lib.h>
+#include <gnunet/gnunet_db_lib.h>
+#include "challenger_util.h"
+#include "challenger_database_lib.h"
+
+
+/**
+ * Return value from main().
+ */
+static int global_ret;
+
+/**
+ * -a option: client secret
+ */
+static char *client_secret;
+
+/**
+ * -d option: delete client
+ */
+static int del_flag;
+
+
+/**
+ * Main function that will be run.
+ *
+ * @param cls closure
+ * @param args remaining command-line arguments
+ * @param cfgfile name of the configuration file used (for saving, can be 
NULL!)
+ * @param cfg configuration
+ */
+static void
+run (void *cls,
+     char *const *args,
+     const char *cfgfile,
+     const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+  const char *url = args[0];
+  struct CHALLENGER_DatabasePlugin *plugin;
+
+  if (NULL == url)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "challenger-admin must be invoked with the client URL as first 
argument\n");
+    return;
+  }
+  if (NULL ==
+      (plugin = CHALLENGER_DB_plugin_load (cfg)))
+  {
+    fprintf (stderr,
+             "Failed to initialize database plugin.\n");
+    global_ret = EXIT_NOTINSTALLED;
+    return;
+  }
+  if (del_flag)
+  {
+    enum GNUNET_DB_QueryStatus qs;
+
+    qs = plugin->client_delete (plugin->cls,
+                                url);
+    switch (qs)
+    {
+    case GNUNET_DB_STATUS_SOFT_ERROR:
+    case GNUNET_DB_STATUS_HARD_ERROR:
+      GNUNET_break (0);
+      global_ret = EXIT_FAILURE;
+      goto cleanup;
+    case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Client with this URL is not known.\n");
+      global_ret = EXIT_FAILURE;
+      goto cleanup;
+    case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
+      GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
+                  "Client deleted\n");
+      break;
+    }
+  }
+  if (NULL != client_secret)
+  {
+    enum GNUNET_DB_QueryStatus qs;
+    uint64_t row_id;
+
+    qs = plugin->client_add (plugin->cls,
+                             url,
+                             client_secret,
+                             &row_id);
+    switch (qs)
+    {
+    case GNUNET_DB_STATUS_SOFT_ERROR:
+    case GNUNET_DB_STATUS_HARD_ERROR:
+      GNUNET_break (0);
+      global_ret = EXIT_FAILURE;
+      goto cleanup;
+    case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Client with this URL already exists.\n");
+      global_ret = EXIT_FAILURE;
+      goto cleanup;
+    case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
+      GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
+                  "Client added. Client ID is: %llu\n",
+                  (unsigned long long) row_id);
+      break;
+    }
+  }
+cleanup:
+  CHALLENGER_DB_plugin_unload (plugin);
+}
+
+
+/**
+ * The main function of the client management tool.  Used to add or
+ * remove clients from the Challenger' database.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, non-zero on error
+ */
+int
+main (int argc,
+      char *const *argv)
+{
+  struct GNUNET_GETOPT_CommandLineOption options[] = {
+    GNUNET_GETOPT_option_string ('a',
+                                 "add",
+                                 "CLIENT_SECRET",
+                                 "add client",
+                                 &client_secret),
+    GNUNET_GETOPT_option_flag ('d',
+                               "delete",
+                               "delete client",
+                               &del_flag),
+    /* TODO: add -l / --list option */
+    GNUNET_GETOPT_OPTION_END
+  };
+  enum GNUNET_GenericReturnValue ret;
+
+  /* FIRST get the libtalerutil initialization out
+     of the way. Then throw that one away, and force
+     the CHALLENGER defaults to be used! */
+  (void) TALER_project_data_default ();
+  GNUNET_OS_init (CHALLENGER_project_data_default ());
+  ret = GNUNET_PROGRAM_run (argc, argv,
+                            "challenger-admin CLIENT_URL CLIENT_SECRET",
+                            "Tool to add or remove clients from challenger",
+                            options,
+                            &run, NULL);
+  if (GNUNET_SYSERR == ret)
+    return EXIT_INVALIDARGUMENT;
+  if (GNUNET_NO == ret)
+    return EXIT_SUCCESS;
+  return global_ret;
+}
+
+
+/* end of challenger-dbinit.c */
diff --git a/src/challengerdb/Makefile.am b/src/challengerdb/Makefile.am
index 7c349ad..9211c65 100644
--- a/src/challengerdb/Makefile.am
+++ b/src/challengerdb/Makefile.am
@@ -57,6 +57,8 @@ libchallengerdb_la_LDFLAGS = \
    -no-undefined
 
 libchallenger_plugin_db_postgres_la_SOURCES = \
+  pg_client_add.h pg_client_add.c \
+  pg_client_delete.h pg_client_delete.c \
   plugin_challengerdb_postgres.c
 libchallenger_plugin_db_postgres_la_LIBADD = \
   $(LTLIBINTL)
diff --git a/src/challengerdb/pg_client_add.c b/src/challengerdb/pg_client_add.c
new file mode 100644
index 0000000..b2f2774
--- /dev/null
+++ b/src/challengerdb/pg_client_add.c
@@ -0,0 +1,58 @@
+/*
+   This file is part of Challenger
+   Copyright (C) 2023 Taler Systems SA
+
+   Challenger 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.
+
+   Challenger 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
+   Challenger; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
+ */
+/**
+ * @file challengerdb/pg_client_add.c
+ * @brief Implementation of the client_add function for Postgres
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include <taler/taler_error_codes.h>
+#include <taler/taler_dbevents.h>
+#include <taler/taler_pq_lib.h>
+#include "pg_client_add.h"
+#include "pg_helper.h"
+
+enum GNUNET_DB_QueryStatus
+CH_PG_client_add (void *cls,
+                  const char *client_url,
+                  const char *client_secret,
+                  uint64_t *client_id)
+{
+  struct PostgresClosure *pg = cls;
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_string (client_url),
+    GNUNET_PQ_query_param_string (client_secret),
+    GNUNET_PQ_query_param_end
+  };
+  struct GNUNET_PQ_ResultSpec rs[] = {
+    GNUNET_PQ_result_spec_uint64 ("client_serial_id",
+                                  client_id),
+    GNUNET_PQ_result_spec_end
+  };
+
+  PREPARE (pg,
+           "client_add",
+           "INSERT INTO clients"
+           " (url"
+           " ,client_secret"
+           ") "
+           "ON CONFLICT DO NOTHING" /* CONFLICT on (url) */
+           "RETURNING client_serial_id");
+  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
+                                                   "client_add",
+                                                   params,
+                                                   rs);
+}
diff --git a/src/challengerdb/pg_client_add.h b/src/challengerdb/pg_client_add.h
new file mode 100644
index 0000000..1964f98
--- /dev/null
+++ b/src/challengerdb/pg_client_add.h
@@ -0,0 +1,45 @@
+/*
+   This file is part of Challenger
+   Copyright (C) 2023 Taler Systems SA
+
+   Challenger 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.
+
+   Challenger 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
+   Challenger; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
+ */
+/**
+ * @file backenddb/pg_client_add.h
+ * @brief implementation of the client_add function for Postgres
+ * @author Christian Grothoff
+ */
+#ifndef PG_CLIENT_ADD_H
+#define PG_CLIENT_ADD_H
+
+#include <taler/taler_util.h>
+#include <taler/taler_json_lib.h>
+#include <challenger/challenger_database_plugin.h>
+
+
+/**
+ * Add client to the list of authorized clients.
+ *
+ * @param cls
+ * @param client_url URL of the client
+ * @param client_secret authorization secret for the client
+ * @param[out] client_id set to the client ID on success
+ * @return transaction status
+ */
+enum GNUNET_DB_QueryStatus
+CH_PG_client_add (void *cls,
+                  const char *client_url,
+                  const char *client_secret,
+                  uint64_t *client_id);
+
+
+#endif
diff --git a/src/challengerdb/pg_client_delete.c 
b/src/challengerdb/pg_client_delete.c
new file mode 100644
index 0000000..cf9e194
--- /dev/null
+++ b/src/challengerdb/pg_client_delete.c
@@ -0,0 +1,46 @@
+/*
+   This file is part of Challenger
+   Copyright (C) 2023 Taler Systems SA
+
+   Challenger 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.
+
+   Challenger 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
+   Challenger; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
+ */
+/**
+ * @file challengerdb/pg_client_delete.c
+ * @brief Implementation of the client_delete function for Postgres
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include <taler/taler_error_codes.h>
+#include <taler/taler_dbevents.h>
+#include <taler/taler_pq_lib.h>
+#include "pg_client_delete.h"
+#include "pg_helper.h"
+
+
+enum GNUNET_DB_QueryStatus
+CH_PG_client_delete (void *cls,
+                     const char *client_url)
+{
+  struct PostgresClosure *pg = cls;
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_string (client_url),
+    GNUNET_PQ_query_param_end
+  };
+
+  PREPARE (pg,
+           "client_delete",
+           "DELETE FROM clients"
+           " WHERE url=$1;");
+  return GNUNET_PQ_eval_prepared_non_select (pg->conn,
+                                             "client_delete",
+                                             params);
+}
diff --git a/src/challengerdb/pg_client_delete.h 
b/src/challengerdb/pg_client_delete.h
new file mode 100644
index 0000000..3611851
--- /dev/null
+++ b/src/challengerdb/pg_client_delete.h
@@ -0,0 +1,39 @@
+/*
+   This file is part of Challenger
+   Copyright (C) 2023 Taler Systems SA
+
+   Challenger 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.
+
+   Challenger 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
+   Challenger; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
+ */
+/**
+ * @file backenddb/pg_client_delete.h
+ * @brief implementation of the client_delete function for Postgres
+ * @author Christian Grothoff
+ */
+#ifndef PG_CLIENT_DELETE_H
+#define PG_CLIENT_DELETE_H
+
+#include <taler/taler_util.h>
+#include <taler/taler_json_lib.h>
+#include <challenger/challenger_database_plugin.h>
+
+/**
+ * Delete client from the list of authorized clients.
+ *
+ * @param cls
+ * @param client_url URL of the client
+ * @return transaction status
+ */
+enum GNUNET_DB_QueryStatus
+CH_PG_client_delete (void *cls,
+                     const char *client_url);
+
+#endif
diff --git a/src/challengerdb/pg_helper.h b/src/challengerdb/pg_helper.h
new file mode 100644
index 0000000..5135555
--- /dev/null
+++ b/src/challengerdb/pg_helper.h
@@ -0,0 +1,99 @@
+/*
+  This file is part of Challenger
+  (C) 2023 Taler Systems SA
+
+  Challenger is free software; you can redistribute it and/or modify it under 
the
+  terms of the GNU Lesser General Public License as published by the Free 
Software
+  Foundation; either version 3, or (at your option) any later version.
+
+  Challenger is distributed in the hope that it will be useful, but WITHOUT ANY
+  WARRANTY; without even the implied warranty of ANASTASISABILITY 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
+  Challenger; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file challenger/pg_helper.h
+ * @brief database helper definitions
+ * @author Christian Grothoff
+ */
+#ifndef PG_HELPER_H
+#define PG_HELPER_H
+
+
+/**
+ * Type of the "cls" argument given to each of the functions in
+ * our API.
+ */
+struct PostgresClosure
+{
+
+  /**
+   * Postgres connection handle.
+   */
+  struct GNUNET_PQ_Context *conn;
+
+  /**
+   * Directory with SQL statements to run to create tables.
+   */
+  char *sql_dir;
+
+  /**
+   * Underlying configuration.
+   */
+  const struct GNUNET_CONFIGURATION_Handle *cfg;
+
+  /**
+   * Name of the currently active transaction, NULL if none is active.
+   */
+  const char *transaction_name;
+
+  /**
+   * How often did we (re)establish @a conn so far?
+   */
+  uint64_t prep_gen;
+
+};
+
+
+/**
+ * Check that the database connection is still up.
+ *
+ * @param cls a `struct PostgresClosure` with connection to check
+ */
+void
+CH_PG_check_connection (void *cls);
+
+/**
+ * Prepares SQL statement @a sql under @a name for
+ * connection @a pg once.
+ * Returns with #GNUNET_DB_STATUS_HARD_ERROR on failure.
+ *
+ * @param pg a `struct PostgresClosure`
+ * @param name name to prepare the statement under
+ * @param sql actual SQL text
+ */
+#define PREPARE(pg,name,sql)                      \
+  do {                                            \
+    static unsigned long long gen;                \
+                                                  \
+    if (gen < pg->prep_gen)                       \
+    {                                             \
+      struct GNUNET_PQ_PreparedStatement ps[] = { \
+        GNUNET_PQ_make_prepare (name, sql),       \
+        GNUNET_PQ_PREPARED_STATEMENT_END          \
+      };                                          \
+                                                  \
+      if (GNUNET_OK !=                            \
+          GNUNET_PQ_prepare_statements (pg->conn, \
+                                        ps))      \
+      {                                           \
+        GNUNET_break (0);                         \
+        return GNUNET_DB_STATUS_HARD_ERROR;       \
+      }                                           \
+      gen = pg->prep_gen;                         \
+    }                                             \
+  } while (0)
+
+#endif
diff --git a/src/challengerdb/pg_template.c b/src/challengerdb/pg_template.c
new file mode 100644
index 0000000..9cef42f
--- /dev/null
+++ b/src/challengerdb/pg_template.c
@@ -0,0 +1,26 @@
+/*
+   This file is part of Challenger
+   Copyright (C) 2023 Taler Systems SA
+
+   Challenger 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.
+
+   Challenger 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
+   Challenger; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
+ */
+/**
+ * @file challengerdb/pg_template.c
+ * @brief Implementation of the template function for Postgres
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include <taler/taler_error_codes.h>
+#include <taler/taler_dbevents.h>
+#include <taler/taler_pq_lib.h>
+#include "pg_template.h"
+#include "pg_helper.h"
diff --git a/src/challengerdb/pg_template.h b/src/challengerdb/pg_template.h
new file mode 100644
index 0000000..cf3e990
--- /dev/null
+++ b/src/challengerdb/pg_template.h
@@ -0,0 +1,29 @@
+/*
+   This file is part of Challenger
+   Copyright (C) 2023 Taler Systems SA
+
+   Challenger 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.
+
+   Challenger 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
+   Challenger; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
+ */
+/**
+ * @file backenddb/pg_template.h
+ * @brief implementation of the template function for Postgres
+ * @author Christian Grothoff
+ */
+#ifndef PG_TEMPLATE_H
+#define PG_TEMPLATE_H
+
+#include <taler/taler_util.h>
+#include <taler/taler_json_lib.h>
+#include <challenger/challenger_database_plugin.h>
+
+
+#endif
diff --git a/src/challengerdb/pg_template.sh b/src/challengerdb/pg_template.sh
new file mode 100755
index 0000000..b05cfdf
--- /dev/null
+++ b/src/challengerdb/pg_template.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+# This file is in the public domain.
+#
+# Instantiates pg_template for a particular function.
+
+for n in $*
+do
+    NCAPS=`echo $n | tr a-z A-Z`
+    if test ! -e pg_$n.c
+    then
+        cat pg_template.c | sed -e s/template/$n/g -e s/TEMPLATE/$NCAPS/g > 
pg_$n.c
+        cat pg_template.h | sed -e s/template/$n/g -e s/TEMPLATE/$NCAPS/g > 
pg_$n.h
+        echo "  plugin->$n\n    = &TMH_PG_$n;" >> tmpl.c
+        echo "#include \"pg_$n.h\"" >> tmpl.inc
+        echo "  pg_$n.h pg_$n.c \\" >> tmpl.am
+    fi
+done
+
+echo "Add lines from tmpl.am to Makefile.am"
+echo "Add lines from tmpl.inc to plugin_challengerdb_postgres.c at the 
beginning"
+echo "Add lines from tmpl.c to plugin_challengerdb_postgres.c at the end"
diff --git a/src/challengerdb/plugin_challengerdb_postgres.c 
b/src/challengerdb/plugin_challengerdb_postgres.c
index b80bc72..045a527 100644
--- a/src/challengerdb/plugin_challengerdb_postgres.c
+++ b/src/challengerdb/plugin_challengerdb_postgres.c
@@ -14,8 +14,8 @@
   Challenger; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
 */
 /**
- * @file sync/plugin_syncdb_postgres.c
- * @brief database helper functions for postgres used by sync
+ * @file challenger/plugin_challengerdb_postgres.c
+ * @brief database helper functions for postgres used by challenger
  * @author Christian Grothoff
  */
 #include "platform.h"
@@ -25,42 +25,9 @@
 #include <taler/taler_pq_lib.h>
 #include "challenger_database_plugin.h"
 #include "challenger_database_lib.h"
-
-/**
- * Type of the "cls" argument given to each of the functions in
- * our API.
- */
-struct PostgresClosure
-{
-
-  /**
-   * Postgres connection handle.
-   */
-  struct GNUNET_PQ_Context *conn;
-
-  /**
-   * Directory with SQL statements to run to create tables.
-   */
-  char *sql_dir;
-
-  /**
-   * Underlying configuration.
-   */
-  const struct GNUNET_CONFIGURATION_Handle *cfg;
-
-  /**
-   * Name of the currently active transaction, NULL if none is active.
-   */
-  const char *transaction_name;
-
-  /**
-   * Did we initialize the prepared statements
-   * for this session?
-   */
-  bool init;
-
-};
-
+#include "pg_helper.h"
+#include "pg_client_add.h"
+#include "pg_client_delete.h"
 
 /**
  * Drop challenger tables
@@ -79,7 +46,6 @@ postgres_drop_tables (void *cls)
   {
     GNUNET_PQ_disconnect (pg->conn);
     pg->conn = NULL;
-    pg->init = false;
   }
   conn = GNUNET_PQ_connect_with_cfg (pg->cfg,
                                      "challengerdb-postgres",
@@ -96,38 +62,27 @@ postgres_drop_tables (void *cls)
 
 
 /**
- * Establish connection to the database.
+ * Roll back the current transaction of a database connection.
  *
- * @param cls plugin context
- * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure
+ * @param cls the `struct PostgresClosure` with the plugin-specific state
  */
-static enum GNUNET_GenericReturnValue
-prepare_statements (void *cls)
+static void
+postgres_rollback (void *cls)
 {
   struct PostgresClosure *pg = cls;
-  struct GNUNET_PQ_PreparedStatement ps[] = {
-    GNUNET_PQ_make_prepare ("gc_accounts",
-                            "DELETE FROM accounts "
-                            "WHERE"
-                            " expiration_date < $1;"),
-    GNUNET_PQ_make_prepare ("gc_pending_payments",
-                            "DELETE FROM payments "
-                            "WHERE"
-                            "  paid=FALSE"
-                            " AND"
-                            "  timestamp < $1;"),
-    GNUNET_PQ_make_prepare ("do_commit",
-                            "COMMIT"),
-    GNUNET_PQ_PREPARED_STATEMENT_END
+  struct GNUNET_PQ_ExecuteStatement es[] = {
+    GNUNET_PQ_make_execute ("ROLLBACK"),
+    GNUNET_PQ_EXECUTE_STATEMENT_END
   };
-  enum GNUNET_GenericReturnValue ret;
 
-  ret = GNUNET_PQ_prepare_statements (pg->conn,
-                                      ps);
-  if (GNUNET_OK != ret)
-    return ret;
-  pg->init = true;
-  return GNUNET_OK;
+  if (GNUNET_OK !=
+      GNUNET_PQ_exec_statements (pg->conn,
+                                 es))
+  {
+    TALER_LOG_ERROR ("Failed to rollback transaction\n");
+    GNUNET_break (0);
+  }
+  pg->transaction_name = NULL;
 }
 
 
@@ -135,12 +90,10 @@ prepare_statements (void *cls)
  * Connect to the database if the connection does not exist yet.
  *
  * @param pg the plugin-specific state
- * @param skip_prepare true if we should skip prepared statement setup
  * @return #GNUNET_OK on success
  */
 static enum GNUNET_GenericReturnValue
-internal_setup (struct PostgresClosure *pg,
-                bool skip_prepare)
+internal_setup (struct PostgresClosure *pg)
 {
   if (NULL == pg->conn)
   {
@@ -156,8 +109,6 @@ internal_setup (struct PostgresClosure *pg,
          force the default to 'serializable' if SSI is to be used. */
       GNUNET_PQ_make_try_execute (
         "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL 
SERIALIZABLE;"),
-      GNUNET_PQ_make_try_execute ("SET enable_sort=OFF;"),
-      GNUNET_PQ_make_try_execute ("SET enable_seqscan=OFF;"),
       GNUNET_PQ_make_execute ("SET search_path TO challenger;"),
       GNUNET_PQ_EXECUTE_STATEMENT_END
     };
@@ -177,14 +128,11 @@ internal_setup (struct PostgresClosure *pg,
     if (NULL == db_conn)
       return GNUNET_SYSERR;
     pg->conn = db_conn;
+    pg->prep_gen++;
   }
   if (NULL == pg->transaction_name)
     GNUNET_PQ_reconnect_if_down (pg->conn);
-  if (pg->init)
-    return GNUNET_OK;
-  if (skip_prepare)
-    return GNUNET_OK;
-  return prepare_statements (pg);
+  return GNUNET_OK;
 }
 
 
@@ -207,11 +155,10 @@ postgres_preflight (void *cls)
     GNUNET_PQ_EXECUTE_STATEMENT_END
   };
 
-  if (! pg->init)
+  if (NULL == pg->conn)
   {
     if (GNUNET_OK !=
-        internal_setup (pg,
-                        false))
+        internal_setup (pg))
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                   "Failed to ensure DB is initialized\n");
@@ -244,8 +191,8 @@ postgres_preflight (void *cls)
  *
  * @param cls a `struct PostgresClosure` with connection to check
  */
-static void
-check_connection (void *cls)
+void
+CH_PG_check_connection (void *cls)
 {
   struct PostgresClosure *pg = cls;
 
@@ -262,8 +209,8 @@ check_connection (void *cls)
  * @return #GNUNET_OK on success
  */
 static enum GNUNET_GenericReturnValue
-begin_transaction (void *cls,
-                   const char *name)
+postgres_begin_transaction (void *cls,
+                            const char *name)
 {
   struct PostgresClosure *pg = cls;
   struct GNUNET_PQ_ExecuteStatement es[] = {
@@ -271,7 +218,7 @@ begin_transaction (void *cls,
     GNUNET_PQ_EXECUTE_STATEMENT_END
   };
 
-  check_connection (pg);
+  CH_PG_check_connection (pg);
   postgres_preflight (pg);
   pg->transaction_name = name;
   if (GNUNET_OK !=
@@ -286,31 +233,6 @@ begin_transaction (void *cls,
 }
 
 
-/**
- * Roll back the current transaction of a database connection.
- *
- * @param cls the `struct PostgresClosure` with the plugin-specific state
- */
-static void
-rollback (void *cls)
-{
-  struct PostgresClosure *pg = cls;
-  struct GNUNET_PQ_ExecuteStatement es[] = {
-    GNUNET_PQ_make_execute ("ROLLBACK"),
-    GNUNET_PQ_EXECUTE_STATEMENT_END
-  };
-
-  if (GNUNET_OK !=
-      GNUNET_PQ_exec_statements (pg->conn,
-                                 es))
-  {
-    TALER_LOG_ERROR ("Failed to rollback transaction\n");
-    GNUNET_break (0);
-  }
-  pg->transaction_name = NULL;
-}
-
-
 /**
  * Commit the current transaction of a database connection.
  *
@@ -318,7 +240,7 @@ rollback (void *cls)
  * @return transaction status code
  */
 static enum GNUNET_DB_QueryStatus
-commit_transaction (void *cls)
+postgres_commit_transaction (void *cls)
 {
   struct PostgresClosure *pg = cls;
   enum GNUNET_DB_QueryStatus qs;
@@ -326,6 +248,9 @@ commit_transaction (void *cls)
     GNUNET_PQ_query_param_end
   };
 
+  PREPARE (pg,
+           "do_commit",
+           "COMMIT");
   qs = GNUNET_PQ_eval_prepared_non_select (pg->conn,
                                            "do_commit",
                                            no_params);
@@ -353,15 +278,23 @@ postgres_gc (void *cls,
   };
   enum GNUNET_DB_QueryStatus qs;
 
-  check_connection (pg);
+  CH_PG_check_connection (pg);
+  PREPARE (pg,
+           "gc_validations",
+           "DELETE FROM validations"
+           " WHERE expiration_time < $1;");
+  PREPARE (pg,
+           "gc_grants",
+           "DELETE FROM grants"
+           " WHERE expiration_time < $1;");
   postgres_preflight (pg);
   qs = GNUNET_PQ_eval_prepared_non_select (pg->conn,
-                                           "gc_accounts",
+                                           "gc_validations",
                                            params);
   if (qs < 0)
     return qs;
   return GNUNET_PQ_eval_prepared_non_select (pg->conn,
-                                             "gc_pending_payments",
+                                             "gc_grants",
                                              params);
 }
 
@@ -422,8 +355,7 @@ libchallenger_plugin_db_postgres_init (void *cls)
     return NULL;
   }
   if (GNUNET_OK !=
-      internal_setup (pg,
-                      true))
+      internal_setup (pg))
   {
     GNUNET_free (pg->sql_dir);
     GNUNET_free (pg);
@@ -435,6 +367,13 @@ libchallenger_plugin_db_postgres_init (void *cls)
   plugin->drop_tables = &postgres_drop_tables;
   plugin->preflight = &postgres_preflight;
   plugin->gc = &postgres_gc;
+  plugin->begin_transaction = &postgres_begin_transaction;
+  plugin->commit_transaction = &postgres_commit_transaction;
+  plugin->rollback = &postgres_rollback;
+  plugin->client_add
+    = &CH_PG_client_add;
+  plugin->client_delete
+    = &CH_PG_client_delete;
   return plugin;
 }
 
diff --git a/src/include/challenger_database_plugin.h 
b/src/include/challenger_database_plugin.h
index a71ceee..e07aa27 100644
--- a/src/include/challenger_database_plugin.h
+++ b/src/include/challenger_database_plugin.h
@@ -84,6 +84,37 @@ struct CHALLENGER_DatabasePlugin
   (*preflight)(void *cls);
 
 
+  /**
+   * Start a transaction.
+   *
+   * @param cls the `struct PostgresClosure` with the plugin-specific state
+   * @param name unique name identifying the transaction (for debugging),
+   *             must point to a constant
+   * @return #GNUNET_OK on success
+   */
+  enum GNUNET_GenericReturnValue
+  (*begin_transaction)(void *cls,
+                       const char *name);
+
+
+  /**
+   * Commit the current transaction of a database connection.
+   *
+   * @param cls the `struct PostgresClosure` with the plugin-specific state
+   * @return transaction status code
+   */
+  enum GNUNET_DB_QueryStatus
+  (*commit_transaction)(void *cls);
+
+
+  /**
+   * Roll back the current transaction of a database connection.
+   *
+   * @param cls the `struct PostgresClosure` with the plugin-specific state
+   */
+  void
+  (*rollback) (void *cls);
+
   /**
    * Function called to perform "garbage collection" on the
    * database, expiring records we no longer require.
@@ -97,5 +128,31 @@ struct CHALLENGER_DatabasePlugin
         struct GNUNET_TIME_Absolute expire);
 
 
+  /**
+   * Add client to the list of authorized clients.
+   *
+   * @param cls
+   * @param client_url URL of the client
+   * @param client_secret authorization secret for the client
+   * @param[out] client_id set to the client ID on success
+   * @return transaction status
+   */
+  enum GNUNET_DB_QueryStatus
+  (*client_add)(void *cls,
+                const char *client_url,
+                const char *client_secret,
+                uint64_t *client_id);
+
+  /**
+   * Delete client from the list of authorized clients.
+   *
+   * @param cls
+   * @param client_url URL of the client
+   * @return transaction status
+   */
+  enum GNUNET_DB_QueryStatus
+  (*client_delete)(void *cls,
+                   const char *client_url);
+
 };
 #endif
diff --git a/src/util/.gitignore b/src/util/.gitignore
new file mode 100644
index 0000000..12bac9f
--- /dev/null
+++ b/src/util/.gitignore
@@ -0,0 +1 @@
+challenger-config

-- 
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]