[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-merchant] 20/31: add db functions to select & insert token family
From: |
gnunet |
Subject: |
[taler-merchant] 20/31: add db functions to select & insert token family keys |
Date: |
Thu, 18 Apr 2024 08:39:13 +0200 |
This is an automated email from the git hooks/post-receive script.
christian-blaettler pushed a commit to branch master
in repository merchant.
commit 53cdcd6cb3aadbeac7d878e817c1314c6fc7c63c
Author: Christian Blättler <blatc2@bfh.ch>
AuthorDate: Wed Apr 10 07:46:52 2024 +0200
add db functions to select & insert token family keys
---
src/backenddb/Makefile.am | 1 +
src/backenddb/pg_insert_token_family.h | 2 +-
src/backenddb/pg_insert_token_family_key.c | 95 ++++++++++++++++++++++
...n_family_key.h => pg_insert_token_family_key.h} | 34 ++++----
src/backenddb/pg_lookup_token_family_key.c | 80 +++++++++---------
src/backenddb/pg_lookup_token_family_key.h | 12 ++-
src/backenddb/plugin_merchantdb_postgres.c | 4 +
src/include/taler_merchantdb_plugin.h | 46 ++++++++---
8 files changed, 199 insertions(+), 75 deletions(-)
diff --git a/src/backenddb/Makefile.am b/src/backenddb/Makefile.am
index 773e2abc..defc3cf9 100644
--- a/src/backenddb/Makefile.am
+++ b/src/backenddb/Makefile.am
@@ -173,6 +173,7 @@ libtaler_plugin_merchantdb_postgres_la_SOURCES = \
pg_lookup_token_families.h pg_lookup_token_families.c \
pg_delete_token_family.h pg_delete_token_family.c \
pg_update_token_family.h pg_update_token_family.c \
+ pg_insert_token_family_key.h pg_insert_token_family_key.c \
pg_lookup_token_family_key.h pg_lookup_token_family_key.c \
plugin_merchantdb_postgres.c \
pg_helper.h pg_helper.c
diff --git a/src/backenddb/pg_insert_token_family.h
b/src/backenddb/pg_insert_token_family.h
index e05755a6..d584f5e7 100644
--- a/src/backenddb/pg_insert_token_family.h
+++ b/src/backenddb/pg_insert_token_family.h
@@ -28,7 +28,7 @@
/**
* @param cls closure
- * @param instance_id instance to insert token family for TODO: Is this needed?
+ * @param instance_id instance to insert token family for
* @param token_family_slug slug of the token family to insert
* @param details the token family details to insert
* @return database result code
diff --git a/src/backenddb/pg_insert_token_family_key.c
b/src/backenddb/pg_insert_token_family_key.c
new file mode 100644
index 00000000..30525d5f
--- /dev/null
+++ b/src/backenddb/pg_insert_token_family_key.c
@@ -0,0 +1,95 @@
+/*
+ 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 backenddb/pg_insert_token_family_key.c
+ * @brief Implementation of the insert_token_family_key function for Postgres
+ * @author Christian Blättler
+ */
+#include "platform.h"
+#include <gnunet/gnunet_common.h>
+#include <gnunet/gnunet_pq_lib.h>
+#include <taler/taler_error_codes.h>
+#include <taler/taler_dbevents.h>
+#include <taler/taler_pq_lib.h>
+#include "pg_insert_token_family_key.h"
+#include "pg_helper.h"
+
+enum GNUNET_DB_QueryStatus
+TMH_PG_insert_token_family_key (void *cls,
+ const char *token_family_slug,
+ const struct TALER_TokenFamilyPublicKey *pub,
+ const struct TALER_TokenFamilyPrivateKey *priv,
+ const struct GNUNET_TIME_Timestamp valid_after,
+ const struct GNUNET_TIME_Timestamp
valid_before)
+{
+ struct PostgresClosure *pg = cls;
+ const char *cipher;
+ // struct GNUNET_HashCode pub_hash;
+
+ switch (pub->public_key.cipher)
+ {
+ case GNUNET_CRYPTO_BSA_RSA:
+ cipher = "rsa";
+ break;
+ case GNUNET_CRYPTO_BSA_CS:
+ cipher = "cs";
+ break;
+ case GNUNET_CRYPTO_BSA_INVALID:
+ /* case listed to make compilers happy */
+ GNUNET_assert (0);
+ }
+
+ struct GNUNET_PQ_QueryParam params[] = {
+ GNUNET_PQ_query_param_string (token_family_slug),
+ GNUNET_PQ_query_param_blind_sign_pub (&pub->public_key),
+ GNUNET_PQ_query_param_auto_from_type (&pub->public_key.pub_key_hash),
+ GNUNET_PQ_query_param_blind_sign_priv (&priv->private_key),
+ GNUNET_PQ_query_param_timestamp (&valid_after),
+ GNUNET_PQ_query_param_timestamp (&valid_before),
+ GNUNET_PQ_query_param_string (cipher),
+ GNUNET_PQ_query_param_end
+ };
+
+ GNUNET_assert (pub->public_key.cipher == priv->private_key.cipher);
+ // TODO: Ensure pub->public_key.pub_key_hash matches the actual public key
+ // GNUNET_CRYPTO_hash (res,
+ // len,
+ // &bpk->pub_key_hash);
+ // GNUNET_assert (0 ==
+ // GNUNET_memcmp (&pub_hash,
+ // &pub->public_key.));
+ GNUNET_assert (! GNUNET_TIME_absolute_is_zero (
+ valid_after.abs_time));
+ GNUNET_assert (! GNUNET_TIME_absolute_is_zero (
+ valid_before.abs_time));
+
+ PREPARE (pg,
+ "token_family_key_insert",
+ "INSERT INTO merchant_token_family_keys "
+ "(token_family_serial"
+ ",pub"
+ ",h_pub"
+ ",priv"
+ ",valid_after"
+ ",valid_before"
+ ",cipher)"
+ " SELECT token_family_serial, $2, $3, $4, $5, $6, $7"
+ " FROM merchant_token_families"
+ " WHERE slug = $1");
+ return GNUNET_PQ_eval_prepared_non_select (pg->conn,
+ "token_family_key_insert",
+ params);
+}
\ No newline at end of file
diff --git a/src/backenddb/pg_lookup_token_family_key.h
b/src/backenddb/pg_insert_token_family_key.h
similarity index 50%
copy from src/backenddb/pg_lookup_token_family_key.h
copy to src/backenddb/pg_insert_token_family_key.h
index 6b9c538f..c4fc8d85 100644
--- a/src/backenddb/pg_lookup_token_family_key.h
+++ b/src/backenddb/pg_insert_token_family_key.h
@@ -14,33 +14,33 @@
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
/**
- * @file backenddb/pg_lookup_token_family_key.h
- * @brief implementation of the lookup_token_family_key function for Postgres
- * @author Christian Blättler
+ * @file backenddb/pg_insert_token_family_key.h
+ * @brief implementation of the insert_token_family_key function for Postgres
+ * @author Christian Grothoff
*/
-#ifndef PG_LOOKUP_TOKEN_FAMILY_KEY_H
-#define PG_LOOKUP_TOKEN_FAMILY_KEY_H
+#ifndef PG_INSERT_TOKEN_FAMILY_KEY_H
+#define PG_INSERT_TOKEN_FAMILY_KEY_H
-#include <gnunet/gnunet_common.h>
#include <taler/taler_util.h>
#include <taler/taler_json_lib.h>
#include "taler_merchantdb_plugin.h"
+
/**
- * Lookup details about a particular token family public key.
- *
* @param cls closure
- * @param instance_id instance to lookup token family for
- * @param h_public_key hash of token family public key to lookup
- * @param[out] details set to the token family key details on success, can be
NULL
- * (in that case we only want to check if the token family key
exists)
+ * @param token_family_slug slug of the token family to insert the key for
+ * @param pub public key to insert
+ * @param priv private key to insert
+ * @param valid_after start of validity period for this key
+ * @param valid_before end of validity period for this key
* @return database result code
*/
enum GNUNET_DB_QueryStatus
-TMH_PG_lookup_token_family_key (void *cls,
- const char *instance_id,
- struct GNUNET_HashCode *h_public_key,
- struct TALER_MERCHANTDB_TokenFamilyKeyDetails
*details);
-
+TMH_PG_insert_token_family_key (void *cls,
+ const char *token_family_slug,
+ const struct TALER_TokenFamilyPublicKey *pub,
+ const struct TALER_TokenFamilyPrivateKey *priv,
+ const struct GNUNET_TIME_Timestamp valid_after,
+ const struct GNUNET_TIME_Timestamp
valid_before);
#endif
diff --git a/src/backenddb/pg_lookup_token_family_key.c
b/src/backenddb/pg_lookup_token_family_key.c
index e35a0a58..f1fa75f3 100644
--- a/src/backenddb/pg_lookup_token_family_key.c
+++ b/src/backenddb/pg_lookup_token_family_key.c
@@ -20,6 +20,7 @@
*/
#include "platform.h"
#include <gnunet/gnunet_pq_lib.h>
+#include <gnunet/gnunet_time_lib.h>
#include <string.h>
#include <taler/taler_error_codes.h>
#include <taler/taler_dbevents.h>
@@ -30,13 +31,17 @@
enum GNUNET_DB_QueryStatus
TMH_PG_lookup_token_family_key (void *cls,
const char *instance_id,
- struct GNUNET_HashCode *h_public_key,
+ const char *token_family_slug,
+ struct GNUNET_TIME_Timestamp min_valid_after,
+ struct GNUNET_TIME_Timestamp max_valid_after,
struct TALER_MERCHANTDB_TokenFamilyKeyDetails
*details)
{
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_string (instance_id),
- GNUNET_PQ_query_param_auto_from_type (h_public_key),
+ GNUNET_PQ_query_param_string (token_family_slug),
+ GNUNET_PQ_query_param_timestamp (&min_valid_after),
+ GNUNET_PQ_query_param_timestamp (&max_valid_after),
GNUNET_PQ_query_param_end
};
@@ -55,33 +60,39 @@ TMH_PG_lookup_token_family_key (void *cls,
else
{
char *kind;
- char *cipher;
+ details->pub = NULL;
+ details->priv = NULL;
+ details->valid_after = GNUNET_TIME_UNIT_ZERO_TS;
+ details->valid_before = GNUNET_TIME_UNIT_ZERO_TS;
struct GNUNET_PQ_ResultSpec rs[] = {
- // TODO: Figure out how to parse keys
- // GNUNET_PQ_result_spec_auto_from_type ("h_pub",
- // &details->pub_h),
- // GNUNET_PQ_result_spec_auto_from_type ("pub",
- // &details->pub),
- // GNUNET_PQ_result_spec_auto_from_type ("priv",
- // &details->priv),
- GNUNET_PQ_result_spec_string ("cipher",
- &cipher),
+ // GNUNET_PQ_result_spec_allow_null (
+ // GNUNET_PQ_result_spec_blind_sign_pub ("pub",
+ // &details->pub->public_key),
+ // NULL),
+ // GNUNET_PQ_result_spec_allow_null (
+ // GNUNET_PQ_result_spec_blind_sign_priv ("priv",
+ // &details->priv->private_key),
+ // NULL),
+ GNUNET_PQ_result_spec_allow_null (
+ GNUNET_PQ_result_spec_timestamp ("key_valid_after",
+ &details->valid_after),
+ NULL),
+ GNUNET_PQ_result_spec_allow_null (
+ GNUNET_PQ_result_spec_timestamp ("key_valid_before",
+ &details->valid_before),
+ NULL),
GNUNET_PQ_result_spec_string ("slug",
&details->token_family.slug),
GNUNET_PQ_result_spec_string ("name",
&details->token_family.name),
- GNUNET_PQ_result_spec_timestamp
("merchant_token_family_keys.valid_after",
- &details->valid_after),
- GNUNET_PQ_result_spec_timestamp
("merchant_token_family_keys.valid_before",
- &details->valid_before),
GNUNET_PQ_result_spec_string ("description",
&details->token_family.description),
TALER_PQ_result_spec_json ("description_i18n",
&details->token_family.description_i18n),
- GNUNET_PQ_result_spec_timestamp ("merchant_token_families.valid_after",
+ GNUNET_PQ_result_spec_timestamp ("valid_after",
&details->token_family.valid_after),
- GNUNET_PQ_result_spec_timestamp ("merchant_token_families.valid_before",
+ GNUNET_PQ_result_spec_timestamp ("valid_before",
&details->token_family.valid_before),
GNUNET_PQ_result_spec_relative_time ("duration",
&details->token_family.duration),
@@ -102,8 +113,8 @@ TMH_PG_lookup_token_family_key (void *cls,
",pub"
",priv"
",cipher"
- ",merchant_token_family_keys.valid_after"
- ",merchant_token_family_keys.valid_before"
+ ",merchant_token_family_keys.valid_after as key_valid_after"
+ ",merchant_token_family_keys.valid_before as key_valid_before"
",slug"
",name"
",description"
@@ -114,13 +125,16 @@ TMH_PG_lookup_token_family_key (void *cls,
",kind"
",issued"
",redeemed"
- " FROM merchant_token_family_keys"
- " JOIN merchant_token_families"
- " USING (token_family_serial)"
+ " FROM merchant_token_families"
+ " LEFT JOIN merchant_token_family_keys"
+ " ON merchant_token_families.token_family_serial =
merchant_token_family_keys.token_family_serial"
+ " AND merchant_token_family_keys.valid_after >= $3"
+ " AND merchant_token_family_keys.valid_after <= $4"
" JOIN merchant_instances"
" USING (merchant_serial)"
" WHERE merchant_instances.merchant_id=$1"
- " AND h_pub=$2");
+ " AND slug=$2"
+ " LIMIT 1");
enum GNUNET_DB_QueryStatus qs;
qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
"lookup_token_family_key",
@@ -138,24 +152,10 @@ TMH_PG_lookup_token_family_key (void *cls,
GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR;
}
-
- if (0 == strcmp(cipher, "rsa"))
- {
- details->priv.private_key.cipher = GNUNET_CRYPTO_BSA_RSA;
- details->pub.public_key.cipher = GNUNET_CRYPTO_BSA_RSA;
- }
- else if (0 == strcmp(cipher, "cs"))
- {
- details->priv.private_key.cipher = GNUNET_CRYPTO_BSA_CS;
- details->pub.public_key.cipher = GNUNET_CRYPTO_BSA_CS;
- }
- else
- {
- GNUNET_break (0);
- return GNUNET_DB_STATUS_HARD_ERROR;
- }
}
+ /* TODO: How to handle multiple results? */
+
return qs;
}
}
\ No newline at end of file
diff --git a/src/backenddb/pg_lookup_token_family_key.h
b/src/backenddb/pg_lookup_token_family_key.h
index 6b9c538f..aa7335cf 100644
--- a/src/backenddb/pg_lookup_token_family_key.h
+++ b/src/backenddb/pg_lookup_token_family_key.h
@@ -27,11 +27,13 @@
#include "taler_merchantdb_plugin.h"
/**
- * Lookup details about a particular token family public key.
+ * Lookup details about a particular token family key.
*
* @param cls closure
- * @param instance_id instance to lookup token family for
- * @param h_public_key hash of token family public key to lookup
+ * @param instance_id instance to lookup token family key for
+ * @param token_family_slug slug of token family to lookup
+ * @param min_valid_after lower bound of the start of the key validation period
+ * @param max_valid_after upper bound of the start of the key validation period
* @param[out] details set to the token family key details on success, can be
NULL
* (in that case we only want to check if the token family key
exists)
* @return database result code
@@ -39,7 +41,9 @@
enum GNUNET_DB_QueryStatus
TMH_PG_lookup_token_family_key (void *cls,
const char *instance_id,
- struct GNUNET_HashCode *h_public_key,
+ const char *token_family_slug,
+ struct GNUNET_TIME_Timestamp min_valid_after,
+ struct GNUNET_TIME_Timestamp max_valid_after,
struct TALER_MERCHANTDB_TokenFamilyKeyDetails
*details);
diff --git a/src/backenddb/plugin_merchantdb_postgres.c
b/src/backenddb/plugin_merchantdb_postgres.c
index 166505ff..e5f3f2a1 100644
--- a/src/backenddb/plugin_merchantdb_postgres.c
+++ b/src/backenddb/plugin_merchantdb_postgres.c
@@ -138,6 +138,7 @@
#include "pg_lookup_token_families.h"
#include "pg_delete_token_family.h"
#include "pg_update_token_family.h"
+#include "pg_insert_token_family_key.h"
#include "pg_lookup_token_family_key.h"
@@ -576,11 +577,14 @@ libtaler_plugin_merchantdb_postgres_init (void *cls)
= &TMH_PG_delete_token_family;
plugin->update_token_family
= &TMH_PG_update_token_family;
+ plugin->insert_token_family_key
+ = &TMH_PG_insert_token_family_key;
plugin->lookup_token_family_key
= &TMH_PG_lookup_token_family_key;
plugin->update_deposit_confirmation_status
= &TMH_PG_update_deposit_confirmation_status;
+
return plugin;
}
diff --git a/src/include/taler_merchantdb_plugin.h
b/src/include/taler_merchantdb_plugin.h
index c7ff7463..07eff056 100644
--- a/src/include/taler_merchantdb_plugin.h
+++ b/src/include/taler_merchantdb_plugin.h
@@ -24,6 +24,7 @@
#define TALER_MERCHANTDB_PLUGIN_H
#include <gnunet/gnunet_common.h>
+#include <gnunet/gnunet_time_lib.h>
#include <gnunet/gnunet_util_lib.h>
#include <gnunet/gnunet_db_lib.h>
#include <taler/taler_exchange_service.h>
@@ -1077,18 +1078,12 @@ struct TALER_MERCHANTDB_TokenFamilyKeyDetails
/**
* Token family public key.
*/
- struct TALER_TokenFamilyPublicKey pub;
-
- /**
- * TODO: Remove this separate field, since it's already available within pub.
- * Hash of the token family public key.
- */
- struct TALER_TokenFamilyPublicKeyHash pub_h;
+ struct TALER_TokenFamilyPublicKey *pub;
/**
* Token family private key.
*/
- struct TALER_TokenFamilyPrivateKey priv;
+ struct TALER_TokenFamilyPrivateKey *priv;
/**
* Details about the token family this key belongs to.
@@ -3224,7 +3219,7 @@ struct TALER_MERCHANTDB_Plugin
* Insert details about a particular token family.
*
* @param cls closure
- * @param instance_id instance to insert product for
+ * @param instance_id instance to insert token family for
* @param token_family_slug slug of token family to insert
* @param details the token family details to insert
* @return database result code
@@ -3238,11 +3233,13 @@ struct TALER_MERCHANTDB_Plugin
/**
- * Lookup details about a particular token family public key.
+ * Lookup details about a particular token family key.
*
* @param cls closure
- * @param instance_id instance to lookup token family for
- * @param h_public_key hash of token family public key to lookup
+ * @param instance_id instance to lookup token family key for
+ * @param token_family_slug slug of token family to lookup
+ * @param min_valid_after lower bound of the start of the key validation
period
+ * @param max_valid_after upper bound of the start of the key validation
period
* @param[out] details set to the token family key details on success, can be
NULL
* (in that case we only want to check if the token family key
exists)
* @return database result code
@@ -3251,9 +3248,32 @@ struct TALER_MERCHANTDB_Plugin
(*lookup_token_family_key) (
void *cls,
const char *instance_id,
- struct GNUNET_HashCode *h_public_key,
+ const char *token_family_slug,
+ struct GNUNET_TIME_Timestamp min_valid_after,
+ struct GNUNET_TIME_Timestamp max_valid_after,
struct TALER_MERCHANTDB_TokenFamilyKeyDetails *details);
+
+ /**
+ * Insert details a key pair for a token family.
+ *
+ * @param cls closure
+ * @param token_family_slug slug of token family to insert the key pair for
+ * @param pub token family public key
+ * @param priv token family private key
+ * @param valid_after start of the key validation period
+ * @param valid_before end of the key validation period
+ * @return database result code
+ */
+ enum GNUNET_DB_QueryStatus
+ (*insert_token_family_key)(
+ void *cls,
+ const char *token_family_slug,
+ const struct TALER_TokenFamilyPublicKey *pub,
+ const struct TALER_TokenFamilyPrivateKey *priv,
+ struct GNUNET_TIME_Timestamp valid_after,
+ struct GNUNET_TIME_Timestamp valid_before);
+
/**
* Lookup deposits that are finished and awaiting a wire transfer.
*
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [taler-merchant] branch master updated (15d2a8c2 -> f76afc11), gnunet, 2024/04/18
- [taler-merchant] 05/31: add serialization switch based on version field, gnunet, 2024/04/18
- [taler-merchant] 01/31: rought first draft of v1 contract terms data structures, gnunet, 2024/04/18
- [taler-merchant] 02/31: separate structs implement discussed changes, gnunet, 2024/04/18
- [taler-merchant] 03/31: serialize v0 contract, gnunet, 2024/04/18
- [taler-merchant] 04/31: use v1 contract structure for v0 internally, gnunet, 2024/04/18
- [taler-merchant] 13/31: add merchant struct to contract datastructure, gnunet, 2024/04/18
- [taler-merchant] 15/31: serialize v1 contract ready for db, gnunet, 2024/04/18
- [taler-merchant] 11/31: implement parsing of choices array for v1 contracts, gnunet, 2024/04/18
- [taler-merchant] 20/31: add db functions to select & insert token family keys,
gnunet <=
- [taler-merchant] 17/31: Merge branch 'master' into tokens, gnunet, 2024/04/18
- [taler-merchant] 07/31: add choices array to v0 contract logic, gnunet, 2024/04/18
- [taler-merchant] 27/31: add post tokenfamilies cmd, gnunet, 2024/04/18
- [taler-merchant] 19/31: implement memory management review feedback, gnunet, 2024/04/18
- [taler-merchant] 08/31: parse v0 max_fee into limits struct, gnunet, 2024/04/18
- [taler-merchant] 23/31: Merge branch 'master' into tokens, gnunet, 2024/04/18
- [taler-merchant] 10/31: remove unused merchant_pub field (set directly in serialize order phase), gnunet, 2024/04/18
- [taler-merchant] 16/31: simplify contract structs, gnunet, 2024/04/18
- [taler-merchant] 12/31: first shot at v1 contract serialization, gnunet, 2024/04/18
- [taler-merchant] 18/31: first smoke tests, gnunet, 2024/04/18