GNUnet  0.11.x
Functions
messenger_api_contact_store.c File Reference

messenger api: client implementation of GNUnet MESSENGER service More...

#include "messenger_api_contact_store.h"
#include "messenger_api_contact.h"
#include "messenger_api_util.h"
Include dependency graph for messenger_api_contact_store.c:

Go to the source code of this file.

Functions

void init_contact_store (struct GNUNET_MESSENGER_ContactStore *store)
 Initializes a contact store as fully empty. More...
 
static int iterate_destroy_contacts (void *cls, const struct GNUNET_HashCode *key, void *value)
 
void clear_contact_store (struct GNUNET_MESSENGER_ContactStore *store)
 Clears a contact store, wipes its content and deallocates its memory. More...
 
static struct GNUNET_CONTAINER_MultiHashMapselect_store_contact_map (struct GNUNET_MESSENGER_ContactStore *store, const struct GNUNET_HashCode *context, struct GNUNET_HashCode *hash)
 
struct GNUNET_MESSENGER_Contactget_store_contact_raw (struct GNUNET_MESSENGER_ContactStore *store, const struct GNUNET_HashCode *context, const struct GNUNET_HashCode *key_hash)
 Returns a contact using the hash of a specific public key. More...
 
struct GNUNET_MESSENGER_Contactget_store_contact (struct GNUNET_MESSENGER_ContactStore *store, const struct GNUNET_HashCode *context, const struct GNUNET_IDENTITY_PublicKey *pubkey)
 Returns a contact using a specific public key. More...
 
void update_store_contact (struct GNUNET_MESSENGER_ContactStore *store, struct GNUNET_MESSENGER_Contact *contact, const struct GNUNET_HashCode *context, const struct GNUNET_HashCode *next_context, const struct GNUNET_IDENTITY_PublicKey *pubkey)
 Moves a contact from the store to another location matching a given public key and member context. More...
 
void remove_store_contact (struct GNUNET_MESSENGER_ContactStore *store, struct GNUNET_MESSENGER_Contact *contact, const struct GNUNET_HashCode *context)
 Removes a contact from the store which uses a given member context. More...
 

Detailed Description

messenger api: client implementation of GNUnet MESSENGER service

Author
Tobias Frisch

Definition in file messenger_api_contact_store.c.

Function Documentation

◆ init_contact_store()

void init_contact_store ( struct GNUNET_MESSENGER_ContactStore store)

Initializes a contact store as fully empty.

Parameters
[out]storeContact store

Definition at line 32 of file messenger_api_contact_store.c.

33 {
34  GNUNET_assert (store);
35 
38 }
@ GNUNET_NO
Definition: gnunet_common.h:94
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_CONTAINER_MultiHashMap * contacts
struct GNUNET_CONTAINER_MultiHashMap * anonymous

References GNUNET_MESSENGER_ContactStore::anonymous, GNUNET_MESSENGER_ContactStore::contacts, GNUNET_assert, GNUNET_CONTAINER_multihashmap_create(), and GNUNET_NO.

Referenced by create_handle(), and create_service().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ iterate_destroy_contacts()

static int iterate_destroy_contacts ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Definition at line 41 of file messenger_api_contact_store.c.

44 {
45  struct GNUNET_MESSENGER_Contact *contact = value;
46  destroy_contact (contact);
47  return GNUNET_YES;
48 }
static char * value
Value of the record to add/remove.
@ GNUNET_YES
Definition: gnunet_common.h:97
void destroy_contact(struct GNUNET_MESSENGER_Contact *contact)
Destroys a contact and frees its memory fully.

References destroy_contact(), GNUNET_YES, and value.

Referenced by clear_contact_store().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ clear_contact_store()

void clear_contact_store ( struct GNUNET_MESSENGER_ContactStore store)

Clears a contact store, wipes its content and deallocates its memory.

Parameters
[in/out]store Contact store

Definition at line 51 of file messenger_api_contact_store.c.

52 {
53  GNUNET_assert ((store) && (store->contacts));
54 
57 
60 }
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MulitHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
static int iterate_destroy_contacts(void *cls, const struct GNUNET_HashCode *key, void *value)

References GNUNET_MESSENGER_ContactStore::anonymous, GNUNET_MESSENGER_ContactStore::contacts, GNUNET_assert, GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multihashmap_iterate(), and iterate_destroy_contacts().

Referenced by destroy_handle(), and destroy_service().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ select_store_contact_map()

static struct GNUNET_CONTAINER_MultiHashMap* select_store_contact_map ( struct GNUNET_MESSENGER_ContactStore store,
const struct GNUNET_HashCode context,
struct GNUNET_HashCode hash 
)
static

Definition at line 63 of file messenger_api_contact_store.c.

66 {
67  const struct GNUNET_IDENTITY_PublicKey *anonymous = get_anonymous_public_key ();
68 
69  struct GNUNET_HashCode anonHash;
70  GNUNET_CRYPTO_hash (anonymous, sizeof(*anonymous), &anonHash);
71 
72  if ((context) && (0 == GNUNET_CRYPTO_hash_cmp(hash, &anonHash)))
73  {
74  GNUNET_memcpy(hash, context, sizeof(*context));
75  return store->anonymous;
76  }
77  else
78  return store->contacts;
79 }
static pa_context * context
Pulseaudio context.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:41
int GNUNET_CRYPTO_hash_cmp(const struct GNUNET_HashCode *h1, const struct GNUNET_HashCode *h2)
Compare function for HashCodes, producing a total ordering of all hashcodes.
Definition: crypto_hash.c:201
const struct GNUNET_IDENTITY_PublicKey * get_anonymous_public_key()
Returns the public identity key of GNUNET_IDENTITY_ego_get_anonymous() without recalculating it every...
A 512-bit hashcode.
An identity key as per LSD0001.

References GNUNET_MESSENGER_ContactStore::anonymous, GNUNET_MESSENGER_ContactStore::contacts, context, get_anonymous_public_key(), GNUNET_CRYPTO_hash(), GNUNET_CRYPTO_hash_cmp(), and GNUNET_memcpy.

Referenced by get_store_contact(), get_store_contact_raw(), remove_store_contact(), and update_store_contact().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_store_contact_raw()

struct GNUNET_MESSENGER_Contact* get_store_contact_raw ( struct GNUNET_MESSENGER_ContactStore store,
const struct GNUNET_HashCode context,
const struct GNUNET_HashCode key_hash 
)

Returns a contact using the hash of a specific public key.

In case the anonymous key gets used by the requested contact, it will use its provided member context to select the matching contact from the store.

In case there is no contact stored which uses the given key or context, NULL gets returned.

Parameters
[in/out]store Contact store
[in]contextMember context
[in]key_hashHash of public key

Definition at line 82 of file messenger_api_contact_store.c.

85 {
86  GNUNET_assert ((store) && (store->contacts) && (context) && (key_hash));
87 
88  struct GNUNET_HashCode hash;
89  GNUNET_memcpy(&hash, key_hash, sizeof(*key_hash));
90 
92  store, context, &hash
93  );
94 
95  return GNUNET_CONTAINER_multihashmap_get (map, &hash);
96 }
static struct GNUNET_CONTAINER_MultiPeerMap * map
Handle to the map used to store old latency values for peers.
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.
static struct GNUNET_CONTAINER_MultiHashMap * select_store_contact_map(struct GNUNET_MESSENGER_ContactStore *store, const struct GNUNET_HashCode *context, struct GNUNET_HashCode *hash)
Internal representation of the hash map.

References GNUNET_MESSENGER_ContactStore::contacts, context, GNUNET_assert, GNUNET_CONTAINER_multihashmap_get(), GNUNET_memcpy, map, and select_store_contact_map().

Referenced by handle_recv_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_store_contact()

struct GNUNET_MESSENGER_Contact* get_store_contact ( struct GNUNET_MESSENGER_ContactStore store,
const struct GNUNET_HashCode context,
const struct GNUNET_IDENTITY_PublicKey pubkey 
)

Returns a contact using a specific public key.

In case the anonymous key gets used by the requested contact, it will use its provided member context to select the matching contact from the store.

In case there is no contact stored which uses the given key or context, a new contact will be created automatically.

The function returns NULL if an error occurs during allocation or validation of the contacts key.

Parameters
[in/out]store Contact store
[in]contextMember context
[in]pubkeyPublic key of EGO

Definition at line 99 of file messenger_api_contact_store.c.

102 {
103  GNUNET_assert ((store) && (store->contacts) && (context) && (pubkey));
104 
105  struct GNUNET_HashCode hash;
106  GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &hash);
107 
109  store, context, &hash
110  );
111 
113 
114  if (contact)
115  {
116  if (0 != GNUNET_memcmp(pubkey, get_contact_key(contact)))
117  {
119  GNUNET_log (GNUNET_ERROR_TYPE_INVALID, "Contact in store uses wrong key: %s\n", str);
120  GNUNET_free (str);
121  return NULL;
122  }
123 
124  return contact;
125  }
126 
127  contact = create_contact (pubkey);
128 
129  if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (map, &hash, contact,
131  return contact;
132 
133  destroy_contact (contact);
134  return NULL;
135 }
static struct GNUNET_IDENTITY_PublicKey pubkey
Public key of the zone to look in.
#define GNUNET_log(kind,...)
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
@ GNUNET_OK
Definition: gnunet_common.h:95
int GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST
, ' bother checking if a value already exists (faster than GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE...
char * GNUNET_IDENTITY_public_key_to_string(const struct GNUNET_IDENTITY_PublicKey *key)
Creates a (Base32) string representation of the public key.
@ GNUNET_ERROR_TYPE_INVALID
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_MESSENGER_Contact * create_contact(const struct GNUNET_IDENTITY_PublicKey *key)
Creates and allocates a new contact with a given public key from an EGO.
const struct GNUNET_IDENTITY_PublicKey * get_contact_key(const struct GNUNET_MESSENGER_Contact *contact)
Returns the public key of a given contact.

References GNUNET_MESSENGER_ContactStore::contacts, context, create_contact(), destroy_contact(), get_contact_key(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_get(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_INVALID, GNUNET_free, GNUNET_IDENTITY_public_key_to_string(), GNUNET_log, GNUNET_memcmp, GNUNET_OK, map, pubkey, and select_store_contact_map().

Referenced by create_member_session(), get_handle_contact(), handle_join_message(), and reset_member_session().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_store_contact()

void update_store_contact ( struct GNUNET_MESSENGER_ContactStore store,
struct GNUNET_MESSENGER_Contact contact,
const struct GNUNET_HashCode context,
const struct GNUNET_HashCode next_context,
const struct GNUNET_IDENTITY_PublicKey pubkey 
)

Moves a contact from the store to another location matching a given public key and member context.

This function allows changes of keys or changes of member contexts!

Parameters
[in/out]store Contact store
[in/out]contact Contact
[in]contextMember context
[in]next_contextMember context
[in]pubkeyPublic key of EGO

Definition at line 138 of file messenger_api_contact_store.c.

143 {
144  GNUNET_assert ((store) && (store->contacts) && (contact) && (pubkey));
145 
146  const struct GNUNET_IDENTITY_PublicKey* oldkey = get_contact_key (contact);
147 
148  struct GNUNET_HashCode hash;
149  GNUNET_CRYPTO_hash (oldkey, sizeof(*oldkey), &hash);
150 
152  store, context, &hash
153  );
154 
155  if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (map, &hash, contact))
156  {
157  GNUNET_memcpy(&(contact->public_key), pubkey, sizeof(*pubkey));
158 
159  GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &hash);
160 
162  store, next_context, &hash
163  );
164 
165  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (map, &hash, contact,
167  GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Updating a contact failed: %s\n",
168  GNUNET_h2s(&hash));
169  }
170 }
int GNUNET_CONTAINER_multihashmap_remove(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, const void *value)
Remove the given key-value pair from the map.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_WARNING
struct GNUNET_IDENTITY_PublicKey public_key

References GNUNET_MESSENGER_ContactStore::contacts, context, get_contact_key(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_multihashmap_remove(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_WARNING, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_OK, GNUNET_YES, map, pubkey, GNUNET_MESSENGER_Contact::public_key, and select_store_contact_map().

Referenced by handle_id_message(), handle_key_message(), and switch_member_session().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ remove_store_contact()

void remove_store_contact ( struct GNUNET_MESSENGER_ContactStore store,
struct GNUNET_MESSENGER_Contact contact,
const struct GNUNET_HashCode context 
)

Removes a contact from the store which uses a given member context.

Parameters
[in/out]store Contact store
[in/out]contact Contact
[in]contextMember context

Definition at line 173 of file messenger_api_contact_store.c.

176 {
177  GNUNET_assert ((store) && (store->contacts) && (contact));
178 
179  const struct GNUNET_IDENTITY_PublicKey* pubkey = get_contact_key(contact);
180 
181  struct GNUNET_HashCode hash;
182  GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &hash);
183 
185  store, context, &hash
186  );
187 
188  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (map, &hash, contact))
189  GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Removing a contact failed: %s\n",
190  GNUNET_h2s(&hash));
191 
192  destroy_contact (contact);
193 }

References GNUNET_MESSENGER_ContactStore::contacts, context, destroy_contact(), get_contact_key(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_remove(), GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_WARNING, GNUNET_h2s(), GNUNET_log, GNUNET_YES, map, pubkey, and select_store_contact_map().

Referenced by check_member_session_completion(), and destroy_member_session().

Here is the call graph for this function:
Here is the caller graph for this function: