diff options
author | t3sserakt <t3ss@posteo.de> | 2022-04-03 14:29:54 +0200 |
---|---|---|
committer | t3sserakt <t3ss@posteo.de> | 2022-04-03 14:30:32 +0200 |
commit | c0ef855502dfdb8dfe5fea867cd19d2de6d9af93 (patch) | |
tree | c55840e7adcc05d161144d7652a7d9fd0ea8fdd1 | |
parent | 8f5b71e500a10790bf72d42de03e2db4971bf772 (diff) | |
parent | d8f23ce7e46ff930ef1ccacc0869c4c44999e6e6 (diff) |
Merge branch 'master' of ssh://git.gnunet.org/gnunet
-rw-r--r-- | src/include/gnunet_network_lib.h | 10 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_ego_store.c | 175 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_ego_store.h | 57 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_handle.c | 56 | ||||
-rw-r--r-- | src/namestore/gnunet-service-namestore.c | 2 |
5 files changed, 240 insertions, 60 deletions
diff --git a/src/include/gnunet_network_lib.h b/src/include/gnunet_network_lib.h index ff1e853f5..b1cf58711 100644 --- a/src/include/gnunet_network_lib.h +++ b/src/include/gnunet_network_lib.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2009-2013 GNUnet e.V. + Copyright (C) 2009-2013, 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 @@ -20,6 +20,7 @@ /** * @author Nils Durner + * @author Tobias Frisch * * @file * Basic low-level networking interface @@ -39,6 +40,13 @@ extern "C" #endif #endif +//#ifdef HAVE_SYS_SELECT_H +/* + * Include "sys/select.h" because it is required to use + * "fd_set" in "struct GNUNET_NETWORK_FDSet"! + */ +#include <sys/select.h> +//#endif #ifdef HAVE_SYS_SOCKET_H #include <sys/socket.h> #endif diff --git a/src/messenger/gnunet-service-messenger_ego_store.c b/src/messenger/gnunet-service-messenger_ego_store.c index c460ac1c7..bcc301e95 100644 --- a/src/messenger/gnunet-service-messenger_ego_store.c +++ b/src/messenger/gnunet-service-messenger_ego_store.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2020--2021 GNUnet e.V. + Copyright (C) 2020--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 @@ -33,14 +33,21 @@ callback_update_ego (void *cls, void **ctx, const char *identifier) { - if ((!ego) || (!identifier)) + if ((!ctx) || (!identifier)) return; struct GNUNET_MESSENGER_EgoStore *store = cls; - GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "New ego in use: '%s'\n", identifier); - - update_store_ego (store, identifier, GNUNET_IDENTITY_ego_get_private_key (ego)); + if (ego) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New ego in use: '%s'\n", identifier); + update_store_ego (store, identifier, GNUNET_IDENTITY_ego_get_private_key (ego)); + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ego got deleted: '%s'\n", identifier); + delete_store_ego (store, identifier); + } } void @@ -52,6 +59,7 @@ init_ego_store(struct GNUNET_MESSENGER_EgoStore *store, store->cfg = config; store->identity = GNUNET_IDENTITY_connect (config, &callback_update_ego, store); store->egos = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO); + store->handles = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO); store->lu_start = NULL; store->lu_end = NULL; @@ -60,7 +68,6 @@ init_ego_store(struct GNUNET_MESSENGER_EgoStore *store, store->op_end = NULL; } - static int iterate_destroy_egos (void *cls, const struct GNUNET_HashCode *key, @@ -109,6 +116,8 @@ clear_ego_store(struct GNUNET_MESSENGER_EgoStore *store) GNUNET_CONTAINER_multihashmap_iterate (store->egos, iterate_destroy_egos, NULL); GNUNET_CONTAINER_multihashmap_destroy (store->egos); + GNUNET_CONTAINER_multihashmap_destroy (store->handles); + if (store->identity) { GNUNET_IDENTITY_disconnect (store->identity); @@ -117,6 +126,16 @@ clear_ego_store(struct GNUNET_MESSENGER_EgoStore *store) } } +static int +iterate_create_ego (void *cls, + const struct GNUNET_HashCode *key, + void *value) +{ + struct GNUNET_MESSENGER_SrvHandle *handle = value; + set_handle_ego (handle, (struct GNUNET_MESSENGER_Ego*) cls); + return GNUNET_YES; +} + static void callback_ego_create (void *cls, const struct GNUNET_IDENTITY_PrivateKey *key, @@ -125,21 +144,22 @@ callback_ego_create (void *cls, struct GNUNET_MESSENGER_EgoOperation *element = cls; struct GNUNET_MESSENGER_EgoStore *store = element->store; - GNUNET_assert(element->identifier); + GNUNET_assert (element->identifier); if (emsg) - GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "%s\n", emsg); + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "%s\n", emsg); if (key) { - struct GNUNET_MESSENGER_SrvHandle *handle = element->handle; - struct GNUNET_MESSENGER_Ego *msg_ego = update_store_ego (store, element->identifier, key); - set_handle_ego (handle, msg_ego); + struct GNUNET_HashCode hash; + GNUNET_CRYPTO_hash (element->identifier, strlen (element->identifier), &hash); + + GNUNET_CONTAINER_multihashmap_get_multiple (store->handles, &hash, iterate_create_ego, msg_ego); } else - GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Creating ego failed!\n"); + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Creating ego failed!\n"); GNUNET_CONTAINER_DLL_remove (store->op_start, store->op_end, element); GNUNET_free (element->identifier); @@ -148,15 +168,16 @@ callback_ego_create (void *cls, void create_store_ego (struct GNUNET_MESSENGER_EgoStore *store, - const char *identifier, - void *handle) + const char *identifier) { GNUNET_assert ((store) && (identifier)); + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store create ego: %s\n", identifier); + struct GNUNET_MESSENGER_EgoOperation *element = GNUNET_new (struct GNUNET_MESSENGER_EgoOperation); element->store = store; - element->handle = handle; + element->cls = NULL; element->identifier = GNUNET_strdup (identifier); @@ -166,6 +187,38 @@ create_store_ego (struct GNUNET_MESSENGER_EgoStore *store, GNUNET_CONTAINER_DLL_insert (store->op_start, store->op_end, element); } +void +bind_store_ego (struct GNUNET_MESSENGER_EgoStore *store, + const char *identifier, + void *handle) +{ + GNUNET_assert ((store) && (identifier) && (handle)); + + struct GNUNET_HashCode hash; + GNUNET_CRYPTO_hash (identifier, strlen (identifier), &hash); + + if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains_value(store->handles, &hash, handle)) + return; + + GNUNET_CONTAINER_multihashmap_put(store->handles, &hash, handle, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); +} + +void +unbind_store_ego (struct GNUNET_MESSENGER_EgoStore *store, + const char *identifier, + void *handle) +{ + GNUNET_assert ((store) && (identifier) && (handle)); + + struct GNUNET_HashCode hash; + GNUNET_CRYPTO_hash (identifier, strlen (identifier), &hash); + + if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_contains_value(store->handles, &hash, handle)) + return; + + GNUNET_CONTAINER_multihashmap_remove(store->handles, &hash, handle); +} + static void callback_ego_lookup (void *cls, struct GNUNET_IDENTITY_Ego *ego) @@ -173,7 +226,7 @@ callback_ego_lookup (void *cls, struct GNUNET_MESSENGER_EgoLookup *element = cls; struct GNUNET_MESSENGER_EgoStore *store = element->store; - GNUNET_assert(element->identifier); + GNUNET_assert (element->identifier); struct GNUNET_MESSENGER_Ego *msg_ego; @@ -200,6 +253,8 @@ lookup_store_ego(struct GNUNET_MESSENGER_EgoStore *store, { GNUNET_assert (store); + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store lookup ego: %s\n", identifier); + if (!identifier) { lookup(cls, identifier, NULL); @@ -231,12 +286,14 @@ lookup_store_ego(struct GNUNET_MESSENGER_EgoStore *store, } struct GNUNET_MESSENGER_Ego* -update_store_ego(struct GNUNET_MESSENGER_EgoStore *store, - const char *identifier, - const struct GNUNET_IDENTITY_PrivateKey *key) +update_store_ego (struct GNUNET_MESSENGER_EgoStore *store, + const char *identifier, + const struct GNUNET_IDENTITY_PrivateKey *key) { GNUNET_assert ((store) && (identifier) && (key)); + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store update ego: %s\n", identifier); + struct GNUNET_HashCode hash; GNUNET_CRYPTO_hash (identifier, strlen (identifier), &hash); @@ -256,6 +313,29 @@ update_store_ego(struct GNUNET_MESSENGER_EgoStore *store, return ego; } +void +delete_store_ego (struct GNUNET_MESSENGER_EgoStore *store, + const char *identifier) +{ + GNUNET_assert ((store) && (identifier)); + + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store delete ego: %s\n", identifier); + + struct GNUNET_HashCode hash; + GNUNET_CRYPTO_hash (identifier, strlen (identifier), &hash); + + struct GNUNET_MESSENGER_Ego *ego = GNUNET_CONTAINER_multihashmap_get (store->egos, &hash); + + if (ego) + { + GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Ego is not stored!\n"); + return; + } + + GNUNET_CONTAINER_multihashmap_remove (store->egos, &hash, ego); + GNUNET_free(ego); +} + static void callback_ego_rename (void *cls, const char *emsg) @@ -263,19 +343,24 @@ callback_ego_rename (void *cls, struct GNUNET_MESSENGER_EgoOperation *element = cls; struct GNUNET_MESSENGER_EgoStore *store = element->store; - GNUNET_assert(element->identifier); + GNUNET_assert (element->identifier); if (emsg) - GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "%s\n", emsg); + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "%s\n", emsg); struct GNUNET_HashCode hash; GNUNET_CRYPTO_hash (element->identifier, strlen (element->identifier), &hash); struct GNUNET_MESSENGER_Ego *ego = GNUNET_CONTAINER_multihashmap_get (store->egos, &hash); + if (!ego) + GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Ego is not stored!\n"); + + char *identifier = (char*) element->cls; + if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (store->egos, &hash, ego)) { - GNUNET_CRYPTO_hash ((char*) element->handle, strlen ((char*) element->handle), &hash); + GNUNET_CRYPTO_hash (identifier, strlen (identifier), &hash); GNUNET_CONTAINER_multihashmap_put (store->egos, &hash, ego, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); @@ -283,7 +368,7 @@ callback_ego_rename (void *cls, else GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Renaming ego failed!\n"); - GNUNET_free (element->handle); + GNUNET_free (identifier); GNUNET_CONTAINER_DLL_remove (store->op_start, store->op_end, element); GNUNET_free (element->identifier); @@ -297,10 +382,12 @@ rename_store_ego (struct GNUNET_MESSENGER_EgoStore *store, { GNUNET_assert ((store) && (old_identifier) && (new_identifier)); + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store rename ego: %s -> %s\n", old_identifier, new_identifier); + struct GNUNET_MESSENGER_EgoOperation *element = GNUNET_new (struct GNUNET_MESSENGER_EgoOperation); element->store = store; - element->handle = GNUNET_strdup (new_identifier); + element->cls = GNUNET_strdup (new_identifier); element->identifier = GNUNET_strdup (old_identifier); @@ -308,3 +395,43 @@ rename_store_ego (struct GNUNET_MESSENGER_EgoStore *store, GNUNET_CONTAINER_DLL_insert (store->op_start, store->op_end, element); } + + +static void +callback_ego_delete (void *cls, + const char *emsg) +{ + struct GNUNET_MESSENGER_EgoOperation *element = cls; + struct GNUNET_MESSENGER_EgoStore *store = element->store; + + GNUNET_assert (element->identifier); + + if (emsg) + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "%s\n", emsg); + + create_store_ego (store, element->identifier); + + GNUNET_CONTAINER_DLL_remove (store->op_start, store->op_end, element); + GNUNET_free (element->identifier); + GNUNET_free (element); +} + +void +renew_store_ego (struct GNUNET_MESSENGER_EgoStore *store, + const char *identifier) +{ + GNUNET_assert ((store) && (identifier)); + + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store renew ego: %s\n", identifier); + + struct GNUNET_MESSENGER_EgoOperation *element = GNUNET_new (struct GNUNET_MESSENGER_EgoOperation); + + element->store = store; + element->cls = NULL; + + element->identifier = GNUNET_strdup (identifier); + + element->operation = GNUNET_IDENTITY_delete(store->identity, identifier, callback_ego_delete, element); + + GNUNET_CONTAINER_DLL_insert (store->op_start, store->op_end, element); +} diff --git a/src/messenger/gnunet-service-messenger_ego_store.h b/src/messenger/gnunet-service-messenger_ego_store.h index 4222a4e91..4ed2bbf6d 100644 --- a/src/messenger/gnunet-service-messenger_ego_store.h +++ b/src/messenger/gnunet-service-messenger_ego_store.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2020--2021 GNUnet e.V. + Copyright (C) 2020--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 @@ -62,7 +62,8 @@ struct GNUNET_MESSENGER_EgoOperation struct GNUNET_IDENTITY_Operation *operation; struct GNUNET_MESSENGER_EgoStore *store; - void *handle; + + void *cls; char *identifier; }; @@ -73,6 +74,7 @@ struct GNUNET_MESSENGER_EgoStore struct GNUNET_IDENTITY_Handle *identity; struct GNUNET_CONTAINER_MultiHashMap *egos; + struct GNUNET_CONTAINER_MultiHashMap *handles; struct GNUNET_MESSENGER_EgoLookup *lu_start; struct GNUNET_MESSENGER_EgoLookup *lu_end; @@ -101,15 +103,38 @@ clear_ego_store (struct GNUNET_MESSENGER_EgoStore *store); /** * Creates a new EGO which will be registered to a <i>store</i> under - * a specific <i>identifier</i>. A given <i>handle</i> will be informed - * about the creation and changes its EGO accordingly. + * a specific <i>identifier</i>. * * @param[in/out] store EGO-store * @param[in] identifier Identifier string - * @param[in/out] handle Handle or NULL */ void create_store_ego (struct GNUNET_MESSENGER_EgoStore *store, + const char *identifier); + +/** + * Binds an EGO which was registered to a <i>store</i> under + * a specific <i>identifier</i> to a given <i>handle</i> + * + * @param[in/out] store EGO-store + * @param[in] identifier Identifier string + * @param[in/out] handle Handle + */ +void +bind_store_ego (struct GNUNET_MESSENGER_EgoStore *store, + const char *identifier, + void *handle); + +/** + * Binds an EGO which was registered to a <i>store</i> under + * a specific <i>identifier</i> to a given <i>handle</i> + * + * @param[in/out] store EGO-store + * @param[in] identifier Identifier string + * @param[in/out] handle Handle + */ +void +unbind_store_ego (struct GNUNET_MESSENGER_EgoStore *store, const char *identifier, void *handle); @@ -143,6 +168,17 @@ update_store_ego (struct GNUNET_MESSENGER_EgoStore *store, const struct GNUNET_IDENTITY_PrivateKey *key); /** + * Deletes the registration of an EGO in a <i>store</i> under + * a specific <i>identifier</i>. + * + * @param[in/out] store EGO-store + * @param[in] identifier Identifier string + */ +void +delete_store_ego (struct GNUNET_MESSENGER_EgoStore *store, + const char *identifier); + +/** * Updates the location of a registered EGO in a <i>store</i> to * a different one under a specific <i>new_identifier<i> replacing * its old one. @@ -156,4 +192,15 @@ rename_store_ego (struct GNUNET_MESSENGER_EgoStore *store, const char *old_identifier, const char *new_identifier); +/** + * Replaces the registered EGO in a <i>store</i> under a specific + * <i>identifier</i> with a newly created one. + * + * @param[in/out] store EGO-store + * @param[in] identifier Identifier string + */ +void +renew_store_ego (struct GNUNET_MESSENGER_EgoStore *store, + const char *identifier); + #endif //GNUNET_SERVICE_MESSENGER_EGO_STORE_H diff --git a/src/messenger/gnunet-service-messenger_handle.c b/src/messenger/gnunet-service-messenger_handle.c index 341bb7251..218482e45 100644 --- a/src/messenger/gnunet-service-messenger_handle.c +++ b/src/messenger/gnunet-service-messenger_handle.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2020--2021 GNUnet e.V. + Copyright (C) 2020--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 @@ -68,7 +68,13 @@ destroy_handle (struct GNUNET_MESSENGER_SrvHandle *handle) save_handle_configuration (handle); if (handle->name) + { + struct GNUNET_MESSENGER_EgoStore *store = get_service_ego_store(handle->service); + + unbind_store_ego(store, handle->name, handle); + GNUNET_free(handle->name); + } GNUNET_CONTAINER_multihashmap_iterate (handle->member_ids, iterate_free_member_ids, NULL); GNUNET_CONTAINER_multihashmap_destroy (handle->member_ids); @@ -317,24 +323,26 @@ callback_update_handle (void *cls, { struct GNUNET_MESSENGER_SrvHandle *handle = cls; - GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Updating handle...\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating handle...\n"); struct GNUNET_MESSENGER_EgoStore *store = get_service_ego_store(handle->service); + bind_store_ego(store, handle->name, handle); + if (!ego) - create_store_ego(store, handle->name, handle); + create_store_ego (store, handle->name); else - change_handle_ego (handle, ego); + renew_store_ego (store, handle->name); } void update_handle (struct GNUNET_MESSENGER_SrvHandle *handle) { - GNUNET_assert(handle); + GNUNET_assert (handle); if (!handle->name) { - GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Updating handle failed: Name is required!\n"); + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Updating handle failed: Name is required!\n"); return; } @@ -360,46 +368,38 @@ callback_set_handle_name (void *cls, struct GNUNET_MESSENGER_EgoStore *store = get_service_ego_store(handle->service); - int rename_ego_in_store = handle->ego? GNUNET_YES : GNUNET_NO; - char *old_dir; get_handle_data_subdir (handle, handle->name, &old_dir); char *new_dir; get_handle_data_subdir (handle, name, &new_dir); - int result = 0; + if ((GNUNET_YES == GNUNET_DISK_directory_test (new_dir, GNUNET_NO)) && + (GNUNET_OK != GNUNET_DISK_directory_remove(new_dir))) + goto free_dirs; if (GNUNET_YES == GNUNET_DISK_directory_test (old_dir, GNUNET_YES)) { GNUNET_DISK_directory_create_for_file (new_dir); - result = rename (old_dir, new_dir); + if (0 != rename (old_dir, new_dir)) + goto free_dirs; } - else if (GNUNET_YES == GNUNET_DISK_directory_test (new_dir, GNUNET_NO)) - result = -1; - - if (0 == result) - { - struct GNUNET_MESSENGER_MessageHandle msg_handle; - msg_handle.handle = handle; - msg_handle.message = create_message_name (name); - - GNUNET_CONTAINER_multihashmap_iterate (handle->member_ids, iterate_send_message, &msg_handle); + if (handle->ego) + rename_store_ego(store, handle->name, name); - destroy_message (msg_handle.message); + struct GNUNET_MESSENGER_MessageHandle msg_handle; + msg_handle.handle = handle; + msg_handle.message = create_message_name (name); - change_handle_name (handle, name); - } - else - rename_ego_in_store = GNUNET_NO; + GNUNET_CONTAINER_multihashmap_iterate (handle->member_ids, iterate_send_message, &msg_handle); + destroy_message (msg_handle.message); + change_handle_name (handle, name); +free_dirs: GNUNET_free(old_dir); GNUNET_free(new_dir); - - if (GNUNET_YES == rename_ego_in_store) - rename_store_ego(store, handle->name, name); } void diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c index 95260ff9c..6d3cc45ec 100644 --- a/src/namestore/gnunet-service-namestore.c +++ b/src/namestore/gnunet-service-namestore.c @@ -1375,7 +1375,6 @@ handle_record_lookup (void *cls, const struct LabelLookupMessage *ll_msg) struct GNUNET_MQ_Envelope *env; struct LabelLookupResponseMessage *llr_msg; struct RecordLookupContext rlc; - struct GNUNET_HashCode label_hash; const char *name_tmp; char *res_name; char *conv_name; @@ -1531,7 +1530,6 @@ handle_record_store (void *cls, const struct RecordStoreMessage *rp_msg) unsigned int rd_count; int res; struct StoreActivity *sa; - struct GNUNET_HashCode label_hash; struct GNUNET_TIME_Absolute existing_block_exp; struct GNUNET_TIME_Absolute new_block_exp; |