event handler implemented and refactoring

- extension_update_event handler implemented
- TALER_AgeMask moved to taler_extensions.h
This commit is contained in:
Özgür Kesim 2021-12-28 18:55:00 +01:00
parent d0d7d78336
commit 128d136885
Signed by: oec
GPG Key ID: 3D76A56D79EDD9D7
6 changed files with 124 additions and 93 deletions

View File

@ -33,7 +33,6 @@
*/ */
static struct GNUNET_DB_EventHandler *extensions_eh; static struct GNUNET_DB_EventHandler *extensions_eh;
/** /**
* Function called whenever another exchange process has updated * Function called whenever another exchange process has updated
* the extensions data in the database. * the extensions data in the database.
@ -48,24 +47,65 @@ extension_update_event_cb (void *cls,
size_t extra_size) size_t extra_size)
{ {
(void) cls; (void) cls;
(void) extra; enum TALER_Extension_Type type;
(void) extra_size;
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Received /management/extensions update event\n"); "Received extensions update event\n");
if (sizeof(enum TALER_Extension_Type) != extra_size)
{
GNUNET_break (0);
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Oops, incorrect size of extra for TALER_Extension_type\n");
return;
}
type = *(enum TALER_Extension_Type *) extra;
if (type <0 || type >= TALER_Extension_Max)
{
GNUNET_break (0);
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Oops, incorrect type for TALER_Extension_type\n");
return;
}
{
char *config;
enum GNUNET_DB_QueryStatus qs;
qs = TEH_plugin->get_extension_config (TEH_plugin->cls,
TEH_extensions[type].name,
&config);
if (qs < 0)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Couldn't get extension config\n");
return;
}
/*
* TODO:
* - parse string as json
* - update global config
*/
}
} }
enum GNUNET_GenericReturnValue enum GNUNET_GenericReturnValue
TEH_extensions_init () TEH_extensions_init ()
{ {
struct GNUNET_DB_EventHeaderP es = { struct GNUNET_DB_EventHeaderP ev = {
.size = htons (sizeof (es)), .size = htons (sizeof (ev)),
.type = htons (TALER_DBEVENT_EXCHANGE_EXTENSIONS_UPDATED), .type = htons (TALER_DBEVENT_EXCHANGE_EXTENSIONS_UPDATED),
}; };
extensions_eh = TEH_plugin->event_listen (TEH_plugin->cls, extensions_eh = TEH_plugin->event_listen (TEH_plugin->cls,
GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_TIME_UNIT_FOREVER_REL,
&es, &ev,
&extension_update_event_cb, &extension_update_event_cb,
NULL); NULL);
if (NULL == extensions_eh) if (NULL == extensions_eh)
@ -89,22 +129,4 @@ TEH_extensions_done ()
} }
void
TEH_extensions_update_state (void)
{
/* TODO */
#if 0
struct GNUNET_DB_EventHeaderP es = {
.size = htons (sizeof (es)),
.type = htons (TALER_DBEVENT_EXCHANGE_WIRE_UPDATED),
};
TEH_plugin->event_notify (TEH_plugin->cls,
&es,
NULL,
0);
#endif
}
/* end of taler-exchange-httpd_extensions.c */ /* end of taler-exchange-httpd_extensions.c */

View File

@ -40,12 +40,4 @@ TEH_extensions_init (void);
void void
TEH_extensions_done (void); TEH_extensions_done (void);
/**
* Something changed in the database. Rebuild the extension state metadata.
* This function should be called if the exchange learns about a new signature
* from our master key.
*/
void
TEH_extensions_update_state (void);
#endif #endif

View File

@ -29,6 +29,7 @@
#include "taler-exchange-httpd_management.h" #include "taler-exchange-httpd_management.h"
#include "taler-exchange-httpd_responses.h" #include "taler-exchange-httpd_responses.h"
#include "taler_extensions.h" #include "taler_extensions.h"
#include "taler_dbevents.h"
struct Extension struct Extension
@ -95,7 +96,7 @@ set_extensions (void *cls,
MHD_HTTP_INTERNAL_SERVER_ERROR, MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_GENERIC_JSON_INVALID, TALER_EC_GENERIC_JSON_INVALID,
"convert configuration to string"); "convert configuration to string");
return GNUNET_DB_STATUS_SOFT_ERROR; /* FIXME: right error? */ return GNUNET_DB_STATUS_HARD_ERROR;
} }
qs = TEH_plugin->set_extension_config ( qs = TEH_plugin->set_extension_config (
@ -115,6 +116,19 @@ set_extensions (void *cls,
"save extension configuration"); "save extension configuration");
} }
/* success, trigger event */
{
enum TALER_Extension_Type *type = &sec->extensions[i].type;
struct GNUNET_DB_EventHeaderP ev = {
.size = htons (sizeof (ev)),
.type = htons (TALER_DBEVENT_EXCHANGE_EXTENSIONS_UPDATED)
};
TEH_plugin->event_notify (TEH_plugin->cls,
&ev,
type,
sizeof(*type));
}
} }
return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT; /* only 'success', so >=0, matters here */ return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT; /* only 'success', so >=0, matters here */

View File

@ -1,18 +1,18 @@
/* /*
This file is part of TALER This file is part of TALER
Copyright (C) 2014--2021 Taler Systems SA Copyright (C) 2014--2021 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it under the 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 terms of the GNU General Public License as published by the Free Software
Foundation; either version 3, or (at your option) any later version. 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 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 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details. 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 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/> TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/ */
/** /**
* @file plugin_exchangedb_postgres.c * @file plugin_exchangedb_postgres.c
@ -211,7 +211,7 @@ prepare_statements (struct PostgresClosure *pg)
enum GNUNET_GenericReturnValue ret; enum GNUNET_GenericReturnValue ret;
struct GNUNET_PQ_PreparedStatement ps[] = { struct GNUNET_PQ_PreparedStatement ps[] = {
/* Used in #postgres_insert_denomination_info() and /* Used in #postgres_insert_denomination_info() and
#postgres_add_denomination_key() */ #postgres_add_denomination_key() */
GNUNET_PQ_make_prepare ( GNUNET_PQ_make_prepare (
"denomination_insert", "denomination_insert",
"INSERT INTO denominations " "INSERT INTO denominations "
@ -222,8 +222,8 @@ prepare_statements (struct PostgresClosure *pg)
",expire_withdraw" ",expire_withdraw"
",expire_deposit" ",expire_deposit"
",expire_legal" ",expire_legal"
",coin_val" /* value of this denom */ ",coin_val" /* value of this denom */
",coin_frac" /* fractional value of this denom */ ",coin_frac" /* fractional value of this denom */
",fee_withdraw_val" ",fee_withdraw_val"
",fee_withdraw_frac" ",fee_withdraw_frac"
",fee_deposit_val" ",fee_deposit_val"
@ -245,8 +245,8 @@ prepare_statements (struct PostgresClosure *pg)
",expire_withdraw" ",expire_withdraw"
",expire_deposit" ",expire_deposit"
",expire_legal" ",expire_legal"
",coin_val" /* value of this denom */ ",coin_val" /* value of this denom */
",coin_frac" /* fractional value of this denom */ ",coin_frac" /* fractional value of this denom */
",fee_withdraw_val" ",fee_withdraw_val"
",fee_withdraw_frac" ",fee_withdraw_frac"
",fee_deposit_val" ",fee_deposit_val"
@ -268,8 +268,8 @@ prepare_statements (struct PostgresClosure *pg)
",expire_withdraw" ",expire_withdraw"
",expire_deposit" ",expire_deposit"
",expire_legal" ",expire_legal"
",coin_val" /* value of this denom */ ",coin_val" /* value of this denom */
",coin_frac" /* fractional value of this denom */ ",coin_frac" /* fractional value of this denom */
",fee_withdraw_val" ",fee_withdraw_val"
",fee_withdraw_frac" ",fee_withdraw_frac"
",fee_deposit_val" ",fee_deposit_val"
@ -332,8 +332,8 @@ prepare_statements (struct PostgresClosure *pg)
",expire_withdraw" ",expire_withdraw"
",expire_deposit" ",expire_deposit"
",expire_legal" ",expire_legal"
",coin_val" /* value of this denom */ ",coin_val" /* value of this denom */
",coin_frac" /* fractional value of this denom */ ",coin_frac" /* fractional value of this denom */
",fee_withdraw_val" ",fee_withdraw_val"
",fee_withdraw_frac" ",fee_withdraw_frac"
",fee_deposit_val" ",fee_deposit_val"
@ -766,7 +766,7 @@ prepare_statements (struct PostgresClosure *pg)
See also: See also:
https://stackoverflow.com/questions/34708509/how-to-use-returning-with-on-conflict-in-postgresql/37543015#37543015 https://stackoverflow.com/questions/34708509/how-to-use-returning-with-on-conflict-in-postgresql/37543015#37543015
*/ */
GNUNET_PQ_make_prepare ( GNUNET_PQ_make_prepare (
"insert_known_coin", "insert_known_coin",
"WITH dd" "WITH dd"
@ -3413,11 +3413,11 @@ dominations_cb_helper (void *cls,
/** /**
* Function called to invoke @a cb on every known denomination key (revoked * Function called to invoke @a cb on every known denomination key (revoked
* and non-revoked) that has been signed by the master key. Runs in its own * and non-revoked) that has been signed by the master key. Runs in its own
* read-only transaction. * read-only transaction.
* *
* *
* @param cls the @e cls of this struct with the plugin-specific state * @param cls the @e cls of this struct with the plugin-specific state
* @param cb function to call on each denomination key * @param cb function to call on each denomination key
* @param cb_cls closure for @a cb * @param cb_cls closure for @a cb
@ -3617,7 +3617,7 @@ auditors_cb_helper (void *cls,
/** /**
* Function called to invoke @a cb on every active auditor. Disabled * Function called to invoke @a cb on every active auditor. Disabled
* auditors are skipped. Runs in its own read-only transaction. * auditors are skipped. Runs in its own read-only transaction.
* *
* @param cls the @e cls of this struct with the plugin-specific state * @param cls the @e cls of this struct with the plugin-specific state
* @param cb function to call on each active auditor * @param cb function to call on each active auditor
* @param cb_cls closure for @a cb * @param cb_cls closure for @a cb
@ -4927,7 +4927,7 @@ add_bank_to_exchange (void *cls,
tail = append_rh (rhc); tail = append_rh (rhc);
tail->type = TALER_EXCHANGEDB_RO_BANK_TO_EXCHANGE; tail->type = TALER_EXCHANGEDB_RO_BANK_TO_EXCHANGE;
tail->details.bank = bt; tail->details.bank = bt;
} /* end of 'while (0 < rows)' */ } /* end of 'while (0 < rows)' */
} }
@ -5052,7 +5052,7 @@ add_recoup (void *cls,
tail = append_rh (rhc); tail = append_rh (rhc);
tail->type = TALER_EXCHANGEDB_RO_RECOUP_COIN; tail->type = TALER_EXCHANGEDB_RO_RECOUP_COIN;
tail->details.recoup = recoup; tail->details.recoup = recoup;
} /* end of 'while (0 < rows)' */ } /* end of 'while (0 < rows)' */
} }
@ -5112,7 +5112,7 @@ add_exchange_to_bank (void *cls,
tail = append_rh (rhc); tail = append_rh (rhc);
tail->type = TALER_EXCHANGEDB_RO_EXCHANGE_TO_BANK; tail->type = TALER_EXCHANGEDB_RO_EXCHANGE_TO_BANK;
tail->details.closing = closing; tail->details.closing = closing;
} /* end of 'while (0 < rows)' */ } /* end of 'while (0 < rows)' */
} }
@ -6279,7 +6279,7 @@ postgres_get_refresh_reveal (void *cls,
case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
goto cleanup; goto cleanup;
case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
default: /* can have more than one result */ default: /* can have more than one result */
break; break;
} }
switch (grctx.qs) switch (grctx.qs)
@ -6288,7 +6288,7 @@ postgres_get_refresh_reveal (void *cls,
case GNUNET_DB_STATUS_SOFT_ERROR: case GNUNET_DB_STATUS_SOFT_ERROR:
goto cleanup; goto cleanup;
case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: /* should be impossible */ case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: /* should be impossible */
break; break;
} }
@ -11415,7 +11415,8 @@ postgres_delete_shard_locks (void *cls)
/** /**
* Function called to save the configuration of an extension * Function called to save the configuration of an extension
* (age-restriction, peer2peer, ...) * (age-restriction, peer2peer, ...). After succesfull storage of the
* configuration it triggers the corresponding event.
* *
* @param cls the @e cls of this struct with the plugin-specific state * @param cls the @e cls of this struct with the plugin-specific state
* @param extension_name the name of the extension * @param extension_name the name of the extension

View File

@ -23,6 +23,7 @@
#define TALER_CRYPTO_LIB_H #define TALER_CRYPTO_LIB_H
#include <gnunet/gnunet_util_lib.h> #include <gnunet/gnunet_util_lib.h>
#include "taler_extensions.h"
#include "taler_error_codes.h" #include "taler_error_codes.h"
#include <gcrypt.h> #include <gcrypt.h>
@ -280,26 +281,6 @@ struct TALER_MasterSignatureP
struct GNUNET_CRYPTO_EddsaSignature eddsa_signature; struct GNUNET_CRYPTO_EddsaSignature eddsa_signature;
}; };
/*
* @brief Type of a list of age groups, represented as bit mask.
*
* The bits set in the mask mark the edges at the beginning of a next age
* group. F.e. for the age groups
* 0-7, 8-9, 10-11, 12-14, 14-15, 16-17, 18-21, 21-*
* the following bits are set:
*
* 31 24 16 8 0
* | | | | |
* oooooooo oo1oo1o1 o1o1o1o1 ooooooo1
*
* A value of 0 means that the exchange does not support the extension for
* age-restriction.
*/
struct TALER_AgeMask
{
uint32_t mask;
};
/** /**
* @brief Age restriction commitment of a coin. * @brief Age restriction commitment of a coin.
*/ */

View File

@ -50,16 +50,30 @@ struct TALER_Extension
void *config; void *config;
}; };
/*
* TALER Peer2Peer Extension
* FIXME oec
*/
/* /*
* TALER Age Restriction Extension * TALER Age Restriction Extension
*/ */
/*
* @brief Type of a list of age groups, represented as bit mask.
*
* The bits set in the mask mark the edges at the beginning of a next age
* group. F.e. for the age groups
* 0-7, 8-9, 10-11, 12-14, 14-15, 16-17, 18-21, 21-*
* the following bits are set:
*
* 31 24 16 8 0
* | | | | |
* oooooooo oo1oo1o1 o1o1o1o1 ooooooo1
*
* A value of 0 means that the exchange does not support the extension for
* age-restriction.
*/
struct TALER_AgeMask
{
uint32_t mask;
};
#define TALER_EXTENSION_SECTION_AGE_RESTRICTION (TALER_EXTENSION_SECTION_PREFIX \ #define TALER_EXTENSION_SECTION_AGE_RESTRICTION (TALER_EXTENSION_SECTION_PREFIX \
"age_restriction") "age_restriction")
@ -90,4 +104,11 @@ TALER_parse_age_group_string (char *groups,
enum TALER_Extension_ReturnValue enum TALER_Extension_ReturnValue
TALER_get_age_mask (const struct GNUNET_CONFIGURATION_Handle *cfg, TALER_get_age_mask (const struct GNUNET_CONFIGURATION_Handle *cfg,
struct TALER_AgeMask *mask); struct TALER_AgeMask *mask);
/*
* TALER Peer2Peer Extension
* TODO oec
*/
#endif #endif