[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnunet] 01/02: -implement messenger key update, fix ego store operation
From: |
gnunet |
Subject: |
[gnunet] 01/02: -implement messenger key update, fix ego store operations |
Date: |
Sat, 02 Apr 2022 20:04:02 +0200 |
This is an automated email from the git hooks/post-receive script.
thejackimonster pushed a commit to branch master
in repository gnunet.
commit e95235a5f71aa40dea29a02cd8d4d1625add7d39
Author: TheJackiMonster <thejackimonster@gmail.com>
AuthorDate: Sat Apr 2 20:02:54 2022 +0200
-implement messenger key update, fix ego store operations
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
---
src/messenger/gnunet-service-messenger_ego_store.c | 175 ++++++++++++++++++---
src/messenger/gnunet-service-messenger_ego_store.h | 57 ++++++-
src/messenger/gnunet-service-messenger_handle.c | 56 +++----
3 files changed, 231 insertions(+), 57 deletions(-)
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);
@@ -142,6 +167,17 @@ update_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
const char *identifier,
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
@@ -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
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.