From 9862fc36d1c97aaed13c8aa17ebadfca420a5943 Mon Sep 17 00:00:00 2001 From: Martin Schanzenbach Date: Fri, 20 Oct 2023 13:22:07 +0200 Subject: MESSENGER: Move block plugin to plugin dir --- configure.ac | 1 + po/POTFILES.in | 2 +- src/plugin/Makefile.am | 3 +- src/plugin/meson.build | 1 + src/plugin/messenger/Makefile.am | 26 ++ src/plugin/messenger/meson.build | 7 + src/plugin/messenger/plugin_gnsrecord_messenger.c | 298 +++++++++++++++++++++ src/service/messenger/Makefile.am | 13 - src/service/messenger/meson.build | 8 - src/service/messenger/plugin_gnsrecord_messenger.c | 298 --------------------- 10 files changed, 336 insertions(+), 321 deletions(-) create mode 100644 src/plugin/messenger/Makefile.am create mode 100644 src/plugin/messenger/meson.build create mode 100644 src/plugin/messenger/plugin_gnsrecord_messenger.c delete mode 100644 src/service/messenger/plugin_gnsrecord_messenger.c diff --git a/configure.ac b/configure.ac index 028739808..8ebcbd4a8 100644 --- a/configure.ac +++ b/configure.ac @@ -1253,6 +1253,7 @@ src/plugin/regex/Makefile src/plugin/revocation/Makefile src/plugin/seti/Makefile src/plugin/setu/Makefile +src/plugin/messenger/Makefile src/service/Makefile src/service/arm/Makefile src/service/arm/arm.conf diff --git a/po/POTFILES.in b/po/POTFILES.in index b32c62628..a1471f455 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -222,6 +222,7 @@ src/plugin/fs/plugin_block_fs.c src/plugin/gns/plugin_block_gns.c src/plugin/gns/plugin_gnsrecord_gns.c src/plugin/gnsrecord/plugin_gnsrecord_dns.c +src/plugin/messenger/plugin_gnsrecord_messenger.c src/plugin/namecache/plugin_namecache_flat.c src/plugin/namecache/plugin_namecache_postgres.c src/plugin/namecache/plugin_namecache_sqlite.c @@ -369,7 +370,6 @@ src/service/messenger/messenger_api_list_tunnels.c src/service/messenger/messenger_api_message.c src/service/messenger/messenger_api_room.c src/service/messenger/messenger_api_util.c -src/service/messenger/plugin_gnsrecord_messenger.c src/service/messenger/testing_messenger_barrier.c src/service/messenger/testing_messenger_setup.c src/service/namecache/gnunet-service-namecache.c diff --git a/src/plugin/Makefile.am b/src/plugin/Makefile.am index f3ca55ff0..78e06fd63 100644 --- a/src/plugin/Makefile.am +++ b/src/plugin/Makefile.am @@ -12,4 +12,5 @@ SUBDIRS = \ regex \ gns \ fs \ - reclaim + reclaim \ + messenger diff --git a/src/plugin/meson.build b/src/plugin/meson.build index a978d6e42..d4f797c54 100644 --- a/src/plugin/meson.build +++ b/src/plugin/meson.build @@ -14,3 +14,4 @@ subdir('revocation') subdir('gns') subdir('fs') subdir('reclaim') +subdir('messenger') diff --git a/src/plugin/messenger/Makefile.am b/src/plugin/messenger/Makefile.am new file mode 100644 index 000000000..e3c69ea33 --- /dev/null +++ b/src/plugin/messenger/Makefile.am @@ -0,0 +1,26 @@ +# 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 + +pkgcfgdir= $(pkgdatadir)/config.d/ + +libexecdir= $(pkglibdir)/libexec/ + +plugin_LTLIBRARIES = \ + libgnunet_plugin_gnsrecord_messenger.la + + +libgnunet_plugin_gnsrecord_messenger_la_SOURCES = \ + plugin_gnsrecord_messenger.c +libgnunet_plugin_gnsrecord_messenger_la_LIBADD = \ + $(top_builddir)/src/lib/util/libgnunetutil.la \ + $(LTLIBINTL) +libgnunet_plugin_gnsrecord_messenger_la_LDFLAGS = \ + $(GN_PLUGIN_LDFLAGS) + + +plugindir = $(libdir)/gnunet diff --git a/src/plugin/messenger/meson.build b/src/plugin/messenger/meson.build new file mode 100644 index 000000000..17dd9bd32 --- /dev/null +++ b/src/plugin/messenger/meson.build @@ -0,0 +1,7 @@ +shared_module('gnunet_plugin_gnsrecord_messenger', + ['plugin_gnsrecord_messenger.c'], + dependencies: [libgnunetutil_dep, libgnunetgnsrecord_dep, + ], + include_directories: [incdir, configuration_inc], + install: true, + install_dir: get_option('libdir')/'gnunet') diff --git a/src/plugin/messenger/plugin_gnsrecord_messenger.c b/src/plugin/messenger/plugin_gnsrecord_messenger.c new file mode 100644 index 000000000..e09a0330d --- /dev/null +++ b/src/plugin/messenger/plugin_gnsrecord_messenger.c @@ -0,0 +1,298 @@ +/* + This file is part of GNUnet. + Copyright (C) 2021--2022 GNUnet e.V. + + GNUnet is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, + or (at your option) any later version. + + GNUnet 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 + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + SPDX-License-Identifier: AGPL3.0-or-later + */ +/** + * @author Tobias Frisch + * @file src/messenger/plugin_gnsrecord_messenger.c + * @brief Plugin to provide the API for useful GNS records to improve + * the usability of the messenger service. + */ + +#include "platform.h" +#include "gnunet_util_lib.h" +#include "gnunet_gnsrecord_lib.h" +#include "gnunet_messenger_service.h" +#include "gnunet_gnsrecord_plugin.h" + + +/** + * Convert the 'value' of a record to a string. + * + * @param cls closure, unused + * @param type type of the record + * @param data value in binary encoding + * @param data_size number of bytes in @a data + * @return NULL on error, otherwise human-readable representation of the value + */ +static char * +messenger_value_to_string (void *cls, + uint32_t type, + const void *data, + size_t data_size) +{ + (void) cls; + switch (type) + { + case GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_ENTRY: + { + if (data_size != sizeof(struct GNUNET_MESSENGER_RoomEntryRecord)) + { + GNUNET_break_op (0); + return NULL; + } + + const struct GNUNET_MESSENGER_RoomEntryRecord *record = data; + + char *door = GNUNET_CRYPTO_eddsa_public_key_to_string (&(record->door.public_key)); + char *key = GNUNET_STRINGS_data_to_string_alloc (&(record->key), sizeof(struct GNUNET_HashCode)); + + char *ret; + GNUNET_asprintf (&ret, "%s-%s", key, door); + GNUNET_free (key); + GNUNET_free (door); + return ret; + } + case GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_DETAILS: + { + if (data_size != sizeof(struct GNUNET_MESSENGER_RoomDetailsRecord)) + { + GNUNET_break_op (0); + return NULL; + } + + const struct GNUNET_MESSENGER_RoomDetailsRecord *record = data; + + char *name = GNUNET_strndup(record->name, 256); + char *flags = GNUNET_STRINGS_data_to_string_alloc (&(record->flags), sizeof(uint32_t)); + + char *ret; + GNUNET_asprintf (&ret, "%s-%s", flags, name); + GNUNET_free (flags); + GNUNET_free (name); + return ret; + } + default: + return NULL; + } +} + + +/** + * Convert human-readable version of a 'value' of a record to the binary + * representation. + * + * @param cls closure, unused + * @param type type of the record + * @param s human-readable string + * @param data set to value in binary encoding (will be allocated) + * @param data_size set to number of bytes in @a data + * @return #GNUNET_OK on success + */ +static int +messenger_string_to_value (void *cls, + uint32_t type, + const char *s, + void **data, + size_t *data_size) +{ + (void) cls; + if (NULL == s) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + + switch (type) + { + case GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_ENTRY: + { + char key [103]; + const char *dash; + struct GNUNET_PeerIdentity door; + + if ((NULL == (dash = strchr (s, '-'))) || + (1 != sscanf (s, "%103s-", key)) || + (GNUNET_OK != GNUNET_CRYPTO_eddsa_public_key_from_string (dash + 1, + strlen (dash + 1), + &(door.public_key)))) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _ ("Unable to parse MESSENGER_ROOM_ENTRY record `%s'\n"), + s); + return GNUNET_SYSERR; + } + + struct GNUNET_MESSENGER_RoomEntryRecord *record = GNUNET_new ( + struct GNUNET_MESSENGER_RoomEntryRecord + ); + + if (GNUNET_OK != GNUNET_STRINGS_string_to_data (key, + strlen (key), + &(record->key), + sizeof(struct GNUNET_HashCode))) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _ ("Unable to parse MESSENGER_ROOM_ENTRY record `%s'\n"), + s); + GNUNET_free (record); + return GNUNET_SYSERR; + } + + record->door = door; + *data = record; + *data_size = sizeof(struct GNUNET_MESSENGER_RoomEntryRecord); + return GNUNET_OK; + } + case GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_DETAILS: + { + char flags [7]; + const char *dash; + + if ((NULL == (dash = strchr (s, '-'))) || + (1 != sscanf (s, "%7s-", flags)) || + (strlen (dash + 1) > 256)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _ ("Unable to parse MESSENGER_ROOM_DETAILS record `%s'\n"), + s); + return GNUNET_SYSERR; + } + + struct GNUNET_MESSENGER_RoomDetailsRecord *record = GNUNET_new ( + struct GNUNET_MESSENGER_RoomDetailsRecord + ); + + if (GNUNET_OK != GNUNET_STRINGS_string_to_data (flags, + strlen (flags), + &(record->flags), + sizeof(uint32_t))) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _ ("Unable to parse MESSENGER_ROOM_DETAILS record `%s'\n"), + s); + GNUNET_free (record); + return GNUNET_SYSERR; + } + + GNUNET_memcpy(record->name, dash + 1, strlen(dash + 1)); + + *data = record; + *data_size = sizeof(struct GNUNET_MESSENGER_RoomDetailsRecord); + return GNUNET_OK; + } + default: + return GNUNET_SYSERR; + } +} + + +/** + * Mapping of record type numbers to human-readable + * record type names. + */ +static struct +{ + const char *name; + uint32_t number; +} name_map[] = { + { "MESSENGER_ROOM_ENTRY", GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_ENTRY }, + { "MESSENGER_ROOM_DETAILS", GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_DETAILS }, + { NULL, UINT32_MAX } +}; + + +/** + * Convert a type name (e.g. "AAAA") to the corresponding number. + * + * @param cls closure, unused + * @param gns_typename name to convert + * @return corresponding number, UINT32_MAX on error + */ +static uint32_t +messenger_typename_to_number (void *cls, + const char *gns_typename) +{ + unsigned int i; + + (void) cls; + i = 0; + while ((name_map[i].name != NULL) && + (0 != strcasecmp (gns_typename, name_map[i].name))) + i++; + return name_map[i].number; +} + + +/** + * Convert a type number to the corresponding type string (e.g. 1 to "A") + * + * @param cls closure, unused + * @param type number of a type to convert + * @return corresponding typestring, NULL on error + */ +static const char * +messenger_number_to_typename (void *cls, + uint32_t type) +{ + unsigned int i; + + (void) cls; + i = 0; + while ((name_map[i].name != NULL) && + (type != name_map[i].number)) + i++; + return name_map[i].name; +} + + +/** + * Entry point for the plugin. + * + * @param cls NULL + * @return the exported block API + */ +void * +libgnunet_plugin_gnsrecord_messenger_init (void *cls) +{ + struct GNUNET_GNSRECORD_PluginFunctions *api; + + (void) cls; + api = GNUNET_new (struct GNUNET_GNSRECORD_PluginFunctions); + api->value_to_string = &messenger_value_to_string; + api->string_to_value = &messenger_string_to_value; + api->typename_to_number = &messenger_typename_to_number; + api->number_to_typename = &messenger_number_to_typename; + return api; +} + + +/** + * Exit point from the plugin. + * + * @param cls the return value from #libgnunet_plugin_block_test_init + * @return NULL + */ +void * +libgnunet_plugin_gnsrecord_messenger_done (void *cls) +{ + struct GNUNET_GNSRECORD_PluginFunctions *api = cls; + + GNUNET_free (api); + return NULL; +} diff --git a/src/service/messenger/Makefile.am b/src/service/messenger/Makefile.am index d778d6e0c..c2ae65a08 100644 --- a/src/service/messenger/Makefile.am +++ b/src/service/messenger/Makefile.am @@ -10,19 +10,6 @@ pkgcfgdir= $(pkgdatadir)/config.d/ libexecdir= $(pkglibdir)/libexec/ -plugin_LTLIBRARIES = \ - libgnunet_plugin_gnsrecord_messenger.la - - -libgnunet_plugin_gnsrecord_messenger_la_SOURCES = \ - plugin_gnsrecord_messenger.c -libgnunet_plugin_gnsrecord_messenger_la_LIBADD = \ - $(top_builddir)/src/lib/util/libgnunetutil.la \ - $(LTLIBINTL) -libgnunet_plugin_gnsrecord_messenger_la_LDFLAGS = \ - $(GN_PLUGIN_LDFLAGS) - - pkgcfg_DATA = \ messenger.conf diff --git a/src/service/messenger/meson.build b/src/service/messenger/meson.build index a6de2f516..3c05d7760 100644 --- a/src/service/messenger/meson.build +++ b/src/service/messenger/meson.build @@ -55,14 +55,6 @@ libgnunetmessenger_dep = declare_dependency(link_with : libgnunetmessenger) pkg.generate(libgnunetmessenger, url: 'https://www.gnunet.org', description : 'Provides API to access the GNUnet Messenger subsystem') -shared_module('gnunet_plugin_gnsrecord_messenger', - ['plugin_gnsrecord_messenger.c'], - dependencies: [libgnunetutil_dep, libgnunetgnsrecord_dep, - libgnunetmessenger_dep], - include_directories: [incdir, configuration_inc], - install: true, - install_dir: get_option('libdir')/'gnunet') - executable ('gnunet-service-messenger', gnunetservicemessenger_src, dependencies: [libgnunetmessenger_dep, diff --git a/src/service/messenger/plugin_gnsrecord_messenger.c b/src/service/messenger/plugin_gnsrecord_messenger.c deleted file mode 100644 index e09a0330d..000000000 --- a/src/service/messenger/plugin_gnsrecord_messenger.c +++ /dev/null @@ -1,298 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2021--2022 GNUnet e.V. - - GNUnet is free software: you can redistribute it and/or modify it - under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, - or (at your option) any later version. - - GNUnet 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 - Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - - SPDX-License-Identifier: AGPL3.0-or-later - */ -/** - * @author Tobias Frisch - * @file src/messenger/plugin_gnsrecord_messenger.c - * @brief Plugin to provide the API for useful GNS records to improve - * the usability of the messenger service. - */ - -#include "platform.h" -#include "gnunet_util_lib.h" -#include "gnunet_gnsrecord_lib.h" -#include "gnunet_messenger_service.h" -#include "gnunet_gnsrecord_plugin.h" - - -/** - * Convert the 'value' of a record to a string. - * - * @param cls closure, unused - * @param type type of the record - * @param data value in binary encoding - * @param data_size number of bytes in @a data - * @return NULL on error, otherwise human-readable representation of the value - */ -static char * -messenger_value_to_string (void *cls, - uint32_t type, - const void *data, - size_t data_size) -{ - (void) cls; - switch (type) - { - case GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_ENTRY: - { - if (data_size != sizeof(struct GNUNET_MESSENGER_RoomEntryRecord)) - { - GNUNET_break_op (0); - return NULL; - } - - const struct GNUNET_MESSENGER_RoomEntryRecord *record = data; - - char *door = GNUNET_CRYPTO_eddsa_public_key_to_string (&(record->door.public_key)); - char *key = GNUNET_STRINGS_data_to_string_alloc (&(record->key), sizeof(struct GNUNET_HashCode)); - - char *ret; - GNUNET_asprintf (&ret, "%s-%s", key, door); - GNUNET_free (key); - GNUNET_free (door); - return ret; - } - case GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_DETAILS: - { - if (data_size != sizeof(struct GNUNET_MESSENGER_RoomDetailsRecord)) - { - GNUNET_break_op (0); - return NULL; - } - - const struct GNUNET_MESSENGER_RoomDetailsRecord *record = data; - - char *name = GNUNET_strndup(record->name, 256); - char *flags = GNUNET_STRINGS_data_to_string_alloc (&(record->flags), sizeof(uint32_t)); - - char *ret; - GNUNET_asprintf (&ret, "%s-%s", flags, name); - GNUNET_free (flags); - GNUNET_free (name); - return ret; - } - default: - return NULL; - } -} - - -/** - * Convert human-readable version of a 'value' of a record to the binary - * representation. - * - * @param cls closure, unused - * @param type type of the record - * @param s human-readable string - * @param data set to value in binary encoding (will be allocated) - * @param data_size set to number of bytes in @a data - * @return #GNUNET_OK on success - */ -static int -messenger_string_to_value (void *cls, - uint32_t type, - const char *s, - void **data, - size_t *data_size) -{ - (void) cls; - if (NULL == s) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - - switch (type) - { - case GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_ENTRY: - { - char key [103]; - const char *dash; - struct GNUNET_PeerIdentity door; - - if ((NULL == (dash = strchr (s, '-'))) || - (1 != sscanf (s, "%103s-", key)) || - (GNUNET_OK != GNUNET_CRYPTO_eddsa_public_key_from_string (dash + 1, - strlen (dash + 1), - &(door.public_key)))) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _ ("Unable to parse MESSENGER_ROOM_ENTRY record `%s'\n"), - s); - return GNUNET_SYSERR; - } - - struct GNUNET_MESSENGER_RoomEntryRecord *record = GNUNET_new ( - struct GNUNET_MESSENGER_RoomEntryRecord - ); - - if (GNUNET_OK != GNUNET_STRINGS_string_to_data (key, - strlen (key), - &(record->key), - sizeof(struct GNUNET_HashCode))) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _ ("Unable to parse MESSENGER_ROOM_ENTRY record `%s'\n"), - s); - GNUNET_free (record); - return GNUNET_SYSERR; - } - - record->door = door; - *data = record; - *data_size = sizeof(struct GNUNET_MESSENGER_RoomEntryRecord); - return GNUNET_OK; - } - case GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_DETAILS: - { - char flags [7]; - const char *dash; - - if ((NULL == (dash = strchr (s, '-'))) || - (1 != sscanf (s, "%7s-", flags)) || - (strlen (dash + 1) > 256)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _ ("Unable to parse MESSENGER_ROOM_DETAILS record `%s'\n"), - s); - return GNUNET_SYSERR; - } - - struct GNUNET_MESSENGER_RoomDetailsRecord *record = GNUNET_new ( - struct GNUNET_MESSENGER_RoomDetailsRecord - ); - - if (GNUNET_OK != GNUNET_STRINGS_string_to_data (flags, - strlen (flags), - &(record->flags), - sizeof(uint32_t))) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _ ("Unable to parse MESSENGER_ROOM_DETAILS record `%s'\n"), - s); - GNUNET_free (record); - return GNUNET_SYSERR; - } - - GNUNET_memcpy(record->name, dash + 1, strlen(dash + 1)); - - *data = record; - *data_size = sizeof(struct GNUNET_MESSENGER_RoomDetailsRecord); - return GNUNET_OK; - } - default: - return GNUNET_SYSERR; - } -} - - -/** - * Mapping of record type numbers to human-readable - * record type names. - */ -static struct -{ - const char *name; - uint32_t number; -} name_map[] = { - { "MESSENGER_ROOM_ENTRY", GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_ENTRY }, - { "MESSENGER_ROOM_DETAILS", GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_DETAILS }, - { NULL, UINT32_MAX } -}; - - -/** - * Convert a type name (e.g. "AAAA") to the corresponding number. - * - * @param cls closure, unused - * @param gns_typename name to convert - * @return corresponding number, UINT32_MAX on error - */ -static uint32_t -messenger_typename_to_number (void *cls, - const char *gns_typename) -{ - unsigned int i; - - (void) cls; - i = 0; - while ((name_map[i].name != NULL) && - (0 != strcasecmp (gns_typename, name_map[i].name))) - i++; - return name_map[i].number; -} - - -/** - * Convert a type number to the corresponding type string (e.g. 1 to "A") - * - * @param cls closure, unused - * @param type number of a type to convert - * @return corresponding typestring, NULL on error - */ -static const char * -messenger_number_to_typename (void *cls, - uint32_t type) -{ - unsigned int i; - - (void) cls; - i = 0; - while ((name_map[i].name != NULL) && - (type != name_map[i].number)) - i++; - return name_map[i].name; -} - - -/** - * Entry point for the plugin. - * - * @param cls NULL - * @return the exported block API - */ -void * -libgnunet_plugin_gnsrecord_messenger_init (void *cls) -{ - struct GNUNET_GNSRECORD_PluginFunctions *api; - - (void) cls; - api = GNUNET_new (struct GNUNET_GNSRECORD_PluginFunctions); - api->value_to_string = &messenger_value_to_string; - api->string_to_value = &messenger_string_to_value; - api->typename_to_number = &messenger_typename_to_number; - api->number_to_typename = &messenger_number_to_typename; - return api; -} - - -/** - * Exit point from the plugin. - * - * @param cls the return value from #libgnunet_plugin_block_test_init - * @return NULL - */ -void * -libgnunet_plugin_gnsrecord_messenger_done (void *cls) -{ - struct GNUNET_GNSRECORD_PluginFunctions *api = cls; - - GNUNET_free (api); - return NULL; -} -- cgit v1.2.3