gnunet-svn
[Top][All Lists]
Advanced

[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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]