Towards a dynamic plugin solution of extensions

- implemented TALER_Extensions.parse_config for age restriction
- implemented TALER_Extensions.config_to_json for age restriction
- TEH_extensions_init now initializes the global TEH_extensions ** list
This commit is contained in:
Özgür Kesim 2021-12-30 13:43:53 +01:00
parent c9ab318abc
commit 9978b25912
Signed by: oec
GPG Key ID: 3D76A56D79EDD9D7
7 changed files with 124 additions and 59 deletions

View File

@ -150,7 +150,7 @@ bool TEH_suicide;
/** /**
* Global register of extensions * Global register of extensions
*/ */
struct TALER_Extension *TEH_extensions; struct TALER_Extension **TEH_extensions;
/** /**
* Value to return from main() * Value to return from main()

View File

@ -204,7 +204,7 @@ extern struct GNUNET_CURL_Context *TEH_curl_ctx;
/** /**
* The manifest of the available extensions, NULL terminated * The manifest of the available extensions, NULL terminated
*/ */
extern struct TALER_Extension *TEH_extensions; extern struct TALER_Extension **TEH_extensions;
/** /**
* @brief Struct describing an URL and the handler for it. * @brief Struct describing an URL and the handler for it.

View File

@ -24,47 +24,94 @@
#include "taler-exchange-httpd_extensions.h" #include "taler-exchange-httpd_extensions.h"
#include "taler_json_lib.h" #include "taler_json_lib.h"
#include "taler_mhd_lib.h" #include "taler_mhd_lib.h"
#include "taler_extensions.h"
#include <jansson.h> #include <jansson.h>
/** /**
* Create a list with the extensions for Age Restriction and Peer2Peer * @brief implements the TALER_Extension.parse_config interface.
*
* TODO oec
*/ */
static struct TALER_Extension * enum GNUNET_GenericReturnValue
register_known_extensions () TALER_Extension_AgeRestriction_parse_config (struct TALER_Extension *this, const
json_t *config)
{ {
/* TODO oec enum GNUNET_GenericReturnValue ret;
* - create list of correct size, or linked list? struct TALER_AgeMask mask = {0};
* - fill data for age restriction and peer2peer
* - set function pointers for parser and json-converter
* - set function pointers for notimplemented?
*/
/**
* The global manifest with the list supported extensions, sorted by
* TALER_Extension_Type.
*
* TODO: This needs to become a dynamic list, once we have a model for
* extensions as plugins.
struct TALER_Extension *TEH_extensions[] = {
[TALER_Extension_AgeRestriction] = {
.type = TALER_Extension_AgeRestriction,
.name = "age_restriction",
.critical = false,
.config = NULL, // disabled per default
// .parse_config = &TALER_Extension_AgeRestriction_parse_config,
// .config_to_json = &TALER_Extension_AgeRestriction_config_to_json,
},
[TALER_Extension_Peer2Peer] = {
.type = TALER_Extension_Peer2Peer,
.name = "peer2peer",
.critical = false,
.config = NULL, // disabled per default
},
};
**/
return NULL; ret = TALER_agemask_parse_json (config, &mask);
if (GNUNET_OK != ret)
return ret;
if (this != NULL && TALER_Extension_AgeRestriction == this->type)
{
if (NULL != this->config)
{
GNUNET_free (this->config);
}
this->config = GNUNET_malloc (sizeof(struct TALER_AgeMask));
GNUNET_memcpy (this->config, &mask, sizeof(struct TALER_AgeMask));
}
return GNUNET_OK;
}
/**
* @brief implements the TALER_Extension.config_to_json interface.
*/
json_t *
TALER_Extension_AgeRestriction_config_to_json (const struct
TALER_Extension *this)
{
const struct TALER_AgeMask *mask;
if (NULL == this || TALER_Extension_AgeRestriction != this->type)
return NULL;
mask = (struct TALER_AgeMask *) this->config;
json_t *config = GNUNET_JSON_PACK (
GNUNET_JSON_pack_string ("extension", this->name),
GNUNET_JSON_pack_string ("mask",
TALER_age_mask_to_string (mask))
);
return config;
}
/* The extension for age restriction */
static struct TALER_Extension extension_ageRestriction = {
.type = TALER_Extension_AgeRestriction,
.name = "age_restriction",
.critical = false,
.config = NULL, // disabled per default
.parse_config = &TALER_Extension_AgeRestriction_parse_config,
.config_to_json = &TALER_Extension_AgeRestriction_config_to_json,
};
/* TODO: The extension for peer2peer */
static struct TALER_Extension extension_peer2peer = {
.type = TALER_Extension_Peer2Peer,
.name = "peer2peer",
.critical = false,
.config = NULL, // disabled per default
.parse_config = NULL, // TODO oec
.config_to_json = NULL, // TODO oec
};
/**
* Create a list with the extensions for Age Restriction and Peer2Peer
*/
static struct TALER_Extension **
get_known_extensions ()
{
struct TALER_Extension **list = GNUNET_new_array (TALER_Extension_Max + 1,
struct TALER_Extension *);
list[TALER_Extension_AgeRestriction] = &extension_ageRestriction;
list[TALER_Extension_Peer2Peer] = &extension_peer2peer;
list[TALER_Extension_Max] = NULL;
return list;
} }
@ -115,7 +162,7 @@ extension_update_event_cb (void *cls,
enum GNUNET_DB_QueryStatus qs; enum GNUNET_DB_QueryStatus qs;
qs = TEH_plugin->get_extension_config (TEH_plugin->cls, qs = TEH_plugin->get_extension_config (TEH_plugin->cls,
TEH_extensions[type].name, TEH_extensions[type]->name, // FIXME oec
&config); &config);
if (qs < 0) if (qs < 0)
@ -139,22 +186,24 @@ extension_update_event_cb (void *cls,
enum GNUNET_GenericReturnValue enum GNUNET_GenericReturnValue
TEH_extensions_init () TEH_extensions_init ()
{ {
// TEH_extensions = register_known_extensions(); TEH_extensions = get_known_extensions ();
struct GNUNET_DB_EventHeaderP ev = {
.size = htons (sizeof (ev)),
.type = htons (TALER_DBEVENT_EXCHANGE_EXTENSIONS_UPDATED),
};
extensions_eh = TEH_plugin->event_listen (TEH_plugin->cls,
GNUNET_TIME_UNIT_FOREVER_REL,
&ev,
&extension_update_event_cb,
NULL);
if (NULL == extensions_eh)
{ {
GNUNET_break (0); struct GNUNET_DB_EventHeaderP ev = {
return GNUNET_SYSERR; .size = htons (sizeof (ev)),
.type = htons (TALER_DBEVENT_EXCHANGE_EXTENSIONS_UPDATED),
};
extensions_eh = TEH_plugin->event_listen (TEH_plugin->cls,
GNUNET_TIME_UNIT_FOREVER_REL,
&ev,
&extension_update_event_cb,
NULL);
if (NULL == extensions_eh)
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
} }
return GNUNET_OK; return GNUNET_OK;
} }

View File

@ -128,7 +128,7 @@ set_extensions (void *cls,
qs = TEH_plugin->set_extension_config ( qs = TEH_plugin->set_extension_config (
TEH_plugin->cls, TEH_plugin->cls,
TEH_extensions[ext->type].name, TEH_extensions[ext->type]->name, // FIXME oec
config, config,
sig); sig);
@ -258,6 +258,8 @@ TEH_handler_management_post_extensions (
/* 2. Make sure name refers to a supported extension */ /* 2. Make sure name refers to a supported extension */
if (GNUNET_OK != TALER_get_extension_by_name (name, if (GNUNET_OK != TALER_get_extension_by_name (name,
(const struct
TALER_Extension **)
TEH_extensions, TEH_extensions,
&extension)) &extension))
{ {

View File

@ -72,7 +72,7 @@ struct TALER_Extension
*/ */
enum GNUNET_GenericReturnValue enum GNUNET_GenericReturnValue
TALER_get_extension_by_name (const char *name, TALER_get_extension_by_name (const char *name,
const struct TALER_Extension *extensions, const struct TALER_Extension **extensions,
const struct TALER_Extension **ext); const struct TALER_Extension **ext);
/* /*
@ -112,6 +112,19 @@ TALER_parse_age_group_string (char *groups,
struct TALER_AgeMask *mask); struct TALER_AgeMask *mask);
/** /**
* Encodes the age mask into a string, like "8:10:12:14:16:18:21"
*
* @param mask Age mask
* @return String representation of the age mask, allocated by GNUNET_malloc.
* Can be used as value in the TALER config.
*/
char *
TALER_age_mask_to_string (const struct TALER_AgeMask *mask);
/**
* @brief Reads the age groups from the configuration and sets the
* corresponding age mask.
* *
* @param cfg * @param cfg
* @param[out] mask for age restriction, will be set to 0 if age restriction is disabled. * @param[out] mask for age restriction, will be set to 0 if age restriction is disabled.

View File

@ -23,7 +23,6 @@
#include "taler_extensions.h" #include "taler_extensions.h"
#include "stdint.h" #include "stdint.h"
/** /**
* *
* @param cfg Handle to the GNUNET configuration * @param cfg Handle to the GNUNET configuration
@ -137,12 +136,14 @@ TALER_parse_age_group_string (char *groups,
/** /**
* Encodes the age mask into a string, like "8:10:12:14:16:18:21"
*
* @param mask Age mask * @param mask Age mask
* @return String representation of the age mask, allocated by GNUNET_malloc. * @return String representation of the age mask, allocated by GNUNET_malloc.
* Can be used as value in the TALER config. * Can be used as value in the TALER config.
*/ */
char * char *
TALER_age_mask_to_string (struct TALER_AgeMask *m) TALER_age_mask_to_string (const struct TALER_AgeMask *m)
{ {
uint32_t mask = m->mask; uint32_t mask = m->mask;
unsigned int n = 0; unsigned int n = 0;

View File

@ -25,13 +25,13 @@
enum GNUNET_GenericReturnValue enum GNUNET_GenericReturnValue
TALER_get_extension_by_name (const char *name, TALER_get_extension_by_name (const char *name,
const struct TALER_Extension *extensions, const struct TALER_Extension **extensions,
const struct TALER_Extension **ext) const struct TALER_Extension **ext)
{ {
const struct TALER_Extension *it = extensions; const struct TALER_Extension *it = *extensions;
for (; it->type != TALER_Extension_Max; it++) for (; NULL != it; it++)
{ {
if (0 == strncmp (name, if (0 == strncmp (name,
it->name, it->name,