gnunet

Main GNUnet Logic
Log | Files | Refs | Submodules | README | LICENSE

commit 27d840626cf46a2b0d6f2177b60f7822d479b2dd
parent baf5b12e7b6e5918895a71ace1c5217cb0f21637
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Tue, 24 Oct 2023 21:28:55 +0200

Merge branch 'master' of git+ssh://git.gnunet.org/gnunet

Diffstat:
Mdebian/control | 5+++++
Asrc/core/test_core_just_run_topo.conf | 8++++++++
Msrc/include/Makefile.am | 2--
Msrc/include/gnunet_dht_service.h | 1-
Dsrc/include/gnunet_hello_lib.h | 545-------------------------------------------------------------------------------
Msrc/include/gnunet_hello_uri_lib.h | 29+++++++++++++++++++++++++++++
Msrc/include/gnunet_peerstore_service.h | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/include/gnunet_transport_hello_service.h | 209-------------------------------------------------------------------------------
Msrc/lib/hello/Makefile.am | 2--
Dsrc/lib/hello/address.c | 139-------------------------------------------------------------------------------
Msrc/lib/hello/gnunet-hello.c | 1-
Msrc/lib/hello/hello-uri.c | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/lib/hello/hello.c | 1249-------------------------------------------------------------------------------
Dsrc/lib/hello/test_friend_hello.c | 185-------------------------------------------------------------------------------
Dsrc/lib/hello/test_hello-ng.c | 60------------------------------------------------------------
Dsrc/lib/hello/test_hello.c | 253-------------------------------------------------------------------------------
Msrc/service/core/core_api_cmd_connecting_peers.c | 1-
Asrc/service/core/test_core_just_run.conf | 48++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/service/core/test_core_just_run_host.conf | 46++++++++++++++++++++++++++++++++++++++++++++++
Msrc/service/dht/dht_api.c | 1-
Msrc/service/dht/test_dht_api.c | 1-
Msrc/service/hostlist/gnunet-daemon-hostlist_client.c | 30+++++++++++++++++++++++++++---
Msrc/service/peerstore/peerstore_api.c | 46----------------------------------------------
Msrc/service/topology/gnunet-daemon-topology.c | 31++++++++++++++++++++++++++++---
Msrc/service/transport/gnunet-service-transport.c | 1-
Msrc/service/transport/transport-testing-communicator.c | 1-
Msrc/service/transport/transport-testing2.c | 53-----------------------------------------------------
Msrc/service/transport/transport-testing2.h | 1-
Msrc/service/transport/transport_api2_core.c | 1-
Msrc/service/transport/transport_api_cmd_backchannel_check.c | 1-
Msrc/service/transport/transport_api_cmd_connecting_peers.c | 1-
31 files changed, 329 insertions(+), 2760 deletions(-)

diff --git a/debian/control b/debian/control @@ -98,7 +98,12 @@ Depends: libextractor-dev (>=1:0.6.3), libgcrypt20-dev (>=1.6), libmicrohttpd-dev (>=0.9.71), + libsodium-dev (>=1.0.11), ${misc:Depends} +Recommends: + libpq-dev (>=13), + libsqlite3-dev (>=3.8), + libjansson-dev Description: GNU's framework for secure peer-to-peer networking (development) GNUnet is a framework for secure peer-to-peer networking that does not use any centralized or otherwise trusted services. Its high-level goal is to provide a diff --git a/src/core/test_core_just_run_topo.conf b/src/core/test_core_just_run_topo.conf @@ -0,0 +1,7 @@ +M:4 +N:1 +X:0 +T:libgnunet_test_core_plugin_cmd_just_run +P:1:1|{connect:{P:1:2:tcp}|{P:1:2:udp}} +P:1:2|{connect:{P:1:1:tcp}|{P:1:1:udp}} +P:1:3|{connect:{P:1:1:tcp}|{P:1:1:udp}} +\ No newline at end of file diff --git a/src/include/Makefile.am b/src/include/Makefile.am @@ -54,7 +54,6 @@ gnunetinclude_HEADERS = \ gnunet_gnsrecord_json_lib.h \ gnunet_gnsrecord_plugin.h \ gnu_name_system_record_types.h \ - gnunet_hello_lib.h \ gnunet_hello_uri_lib.h \ gnunet_helper_lib.h \ gnunet_identity_service.h \ @@ -121,7 +120,6 @@ gnunetinclude_HEADERS = \ gnunet_transport_communication_service.h \ gnunet_transport_monitor_service.h \ gnunet_transport_core_service.h \ - gnunet_transport_hello_service.h \ gnunet_transport_testing_ng_lib.h \ gnunet_tun_lib.h \ gnunet_uri_lib.h \ diff --git a/src/include/gnunet_dht_service.h b/src/include/gnunet_dht_service.h @@ -43,7 +43,6 @@ #include "gnunet_util_lib.h" #include "gnunet_block_lib.h" -#include "gnunet_hello_lib.h" #ifdef __cplusplus extern "C" diff --git a/src/include/gnunet_hello_lib.h b/src/include/gnunet_hello_lib.h @@ -1,545 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2010, 2011 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 <http://www.gnu.org/licenses/>. - - SPDX-License-Identifier: AGPL3.0-or-later - */ - -/** - * @addtogroup Backbone - * @{ - * - * @author Christian Grothoff - * @file - * Helper library for handling HELLOs - * - * @defgroup hello Hello library - * Helper library for handling HELLOs - * - * @see [Documentation](https://gnunet.org/gnunets-hostlist-subsystem) - * - * @{ - */ - -#ifndef GNUNET_HELLO_LIB_H -#define GNUNET_HELLO_LIB_H - -#ifdef __cplusplus -extern "C" { -#if 0 /* keep Emacsens' auto-indent happy */ -} -#endif -#endif - - -#include "gnunet_util_lib.h" - -/** - * Prefix that every HELLO URI must start with. - */ -#define GNUNET_HELLO_URI_PREFIX "gnunet://hello/" - -/** - * Prefix that every FRIEND HELLO URI must start with. - */ -#define GNUNET_FRIEND_HELLO_URI_PREFIX "gnunet://friend-hello/" - -/** - * Separator used in HELLO URI - */ -#define GNUNET_HELLO_URI_SEP '+' - - -/** - * Additional local information about an address - * - * These information are only valid for the local peer and are not serialized - * when a #GNUNET_HELLO_Message is created - */ -enum GNUNET_HELLO_AddressInfo -{ - /** - * No additional information - */ - GNUNET_HELLO_ADDRESS_INFO_NONE = 0, - - /** - * This is an inbound address and cannot be used to initiate an outbound - * connection to another peer - */ - GNUNET_HELLO_ADDRESS_INFO_INBOUND = 1 -}; - - -/** - * An address for communicating with a peer. We frequently - * need this tuple and the components cannot really be - * separated. This is NOT the format that would be used - * on the wire. - */ -struct GNUNET_HELLO_Address -{ - /** - * For which peer is this an address? - */ - struct GNUNET_PeerIdentity peer; - - /** - * Name of the transport plugin enabling the communication using - * this address. - */ - const char *transport_name; - - /** - * Binary representation of the address (plugin-specific). - */ - const void *address; - - /** - * Number of bytes in @e address. - */ - size_t address_length; - - /** - * Extended information about address - * - * This field contains additional #GNUNET_HELLO_AddressInfo flags e.g. - * to indicate an address is inbound and cannot be used to initiate an - * outbound connection. - * - * These information are only valid for the local peer and are not serialized - * when a #GNUNET_HELLO_Message is created - */ - enum GNUNET_HELLO_AddressInfo local_info; -}; - - -/** - * Allocate an address struct. - * - * @param peer the peer - * @param transport_name plugin name - * @param address binary address - * @param address_length number of bytes in @a address - * @param local_info additional local information for the address - * @return the address struct - */ -struct GNUNET_HELLO_Address * -GNUNET_HELLO_address_allocate (const struct GNUNET_PeerIdentity *peer, - const char *transport_name, - const void *address, - size_t address_length, - enum GNUNET_HELLO_AddressInfo local_info); - - -/** - * Copy an address struct. - * - * @param address address to copy - * @return a copy of the address struct - */ -struct GNUNET_HELLO_Address * -GNUNET_HELLO_address_copy (const struct GNUNET_HELLO_Address *address); - - -/** - * Compare two addresses. Does NOT compare the peer identity, - * that is assumed already to match! - * - * @param a1 first address - * @param a2 second address - * @return 0 if the addresses are equal, -1 if @a a1< @a a2, 1 if @a a1> @a a2. - */ -int -GNUNET_HELLO_address_cmp (const struct GNUNET_HELLO_Address *a1, - const struct GNUNET_HELLO_Address *a2); - - -/** - * Get the size of an address struct. - * - * @param address address - * @return the size - */ -size_t -GNUNET_HELLO_address_get_size (const struct GNUNET_HELLO_Address *address); - - -/** - * Check if an address has a local option set - * - * @param address the address to check - * @param option the respective option to check for - * @return #GNUNET_YES or #GNUNET_NO - */ -int -GNUNET_HELLO_address_check_option (const struct GNUNET_HELLO_Address *address, - enum GNUNET_HELLO_AddressInfo option); - - -/** - * Free an address. - * - * @param addr address to free - */ -#define GNUNET_HELLO_address_free(addr) GNUNET_free (addr) - - -GNUNET_NETWORK_STRUCT_BEGIN - -/** - * A HELLO message is used to exchange information about - * transports with other peers. This struct is always - * followed by the actual network addresses which have - * the format: - * - * 1) transport-name (0-terminated) - * 2) address-length (uint16_t, network byte order; possibly - * unaligned!) - * 3) address expiration (`struct GNUNET_TIME_AbsoluteNBO`); possibly - * unaligned!) - * 4) address (address-length bytes; possibly unaligned!) - */ -struct GNUNET_HELLO_Message -{ - /** - * Type will be #GNUNET_MESSAGE_TYPE_HELLO. - */ - struct GNUNET_MessageHeader header; - - /** - * Use in F2F mode: Do not gossip this HELLO message - */ - uint32_t friend_only GNUNET_PACKED; - - /** - * The public key of the peer. - */ - struct GNUNET_CRYPTO_EddsaPublicKey publicKey; -}; -GNUNET_NETWORK_STRUCT_END - - -/** - * Return HELLO type - * - * @param h HELLO Message to test - * @return #GNUNET_YES for friend-only or #GNUNET_NO otherwise - */ -int -GNUNET_HELLO_is_friend_only (const struct GNUNET_HELLO_Message *h); - - -/** - * Copy the given address information into - * the given buffer using the format of HELLOs. - * - * @param address address to add - * @param expiration expiration for the address - * @param target where to copy the address - * @param max maximum number of bytes to copy to @a target - * @return number of bytes copied, 0 if - * the target buffer was not big enough. - */ -size_t -GNUNET_HELLO_add_address (const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration, - char *target, - size_t max); - - -/** - * Callback function used to fill a buffer of max bytes with a list of - * addresses in the format used by HELLOs. Should use - * #GNUNET_HELLO_add_address() as a helper function. - * - * @param cls closure - * @param max maximum number of bytes that can be written to @a buf - * @param buf where to write the address information - * @return number of bytes written or 0, #GNUNET_SYSERR to signal the - * end of the iteration. - */ -typedef ssize_t -(*GNUNET_HELLO_GenerateAddressListCallback) (void *cls, - size_t max, - void *buf); - - -/** - * Construct a HELLO message given the public key, - * expiration time and an iterator that spews the - * transport addresses. - * - * If friend only is set to #GNUNET_YES we create a FRIEND_HELLO which - * will not be gossiped to other peers. - * - * @param public_key public key to include in the HELLO - * @param addrgen callback to invoke to get addresses - * @param addrgen_cls closure for @a addrgen - * @param friend_only should the returned HELLO be only visible to friends? - * @return the hello message - */ -struct GNUNET_HELLO_Message * -GNUNET_HELLO_create (const struct GNUNET_CRYPTO_EddsaPublicKey *public_key, - GNUNET_HELLO_GenerateAddressListCallback addrgen, - void *addrgen_cls, - int friend_only); - - -/** - * Return the size of the given HELLO message. - * - * @param hello to inspect - * @return the size, 0 if HELLO is invalid - */ -uint16_t -GNUNET_HELLO_size (const struct GNUNET_HELLO_Message *hello); - - -/** - * Construct a HELLO message by merging the - * addresses in two existing HELLOs (which - * must be for the same peer). - * - * @param h1 first HELLO message - * @param h2 the second HELLO message - * @return the combined hello message - */ -struct GNUNET_HELLO_Message * -GNUNET_HELLO_merge (const struct GNUNET_HELLO_Message *h1, - const struct GNUNET_HELLO_Message *h2); - - -/** - * Test if two HELLO messages contain the same addresses. - * If they only differ in expiration time, the lowest - * expiration time larger than 'now' where they differ - * is returned. - * - * @param h1 first HELLO message - * @param h2 the second HELLO message - * @param now time to use for deciding which addresses have - * expired and should not be considered at all - * @return absolute time forever if the two HELLOs are - * totally identical; smallest timestamp >= now if - * they only differ in timestamps; - * zero if the some addresses with expirations >= now - * do not match at all - */ -struct GNUNET_TIME_Absolute -GNUNET_HELLO_equals (const struct GNUNET_HELLO_Message *h1, - const struct GNUNET_HELLO_Message *h2, - struct GNUNET_TIME_Absolute now); - - -/** - * Iterator callback to go over all addresses. - * - * @param cls closure - * @param address the address - * @param expiration expiration time - * @return #GNUNET_OK to keep the address, - * #GNUNET_NO to delete it from the HELLO - * #GNUNET_SYSERR to stop iterating (but keep current address) - */ -typedef int (*GNUNET_HELLO_AddressIterator) ( - void *cls, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration); - - -/** - * When does the last address in the given HELLO expire? - * - * @param msg HELLO to inspect - * @return time the last address expires, 0 if there are no addresses in the HELLO - */ -struct GNUNET_TIME_Absolute -GNUNET_HELLO_get_last_expiration (const struct GNUNET_HELLO_Message *msg); - - -/** - * Iterate over all of the addresses in the HELLO. - * - * @param msg HELLO to iterate over; client does not need to - * have verified that msg is well-formed (beyond starting - * with a GNUNET_MessageHeader of the right type). - * @param return_modified if a modified copy should be returned, - * otherwise NULL will be returned - * @param it iterator to call on each address - * @param it_cls closure for @a it - * @return the modified HELLO or NULL - */ -struct GNUNET_HELLO_Message * -GNUNET_HELLO_iterate_addresses (const struct GNUNET_HELLO_Message *msg, - int return_modified, - GNUNET_HELLO_AddressIterator it, - void *it_cls); - - -/** - * Iterate over addresses in @a new_hello that are NOT already present - * in @a old_hello. Note that if the address is present in @a old_hello - * but the expiration time in @a new_hello is more recent, the - * iterator is also called. - * - * @param new_hello a HELLO message - * @param old_hello a HELLO message - * @param expiration_limit ignore addresses in old_hello - * that expired before the given time stamp - * @param it iterator to call on each address - * @param it_cls closure for @a it - */ -void -GNUNET_HELLO_iterate_new_addresses ( - const struct GNUNET_HELLO_Message *new_hello, - const struct GNUNET_HELLO_Message *old_hello, - struct GNUNET_TIME_Absolute expiration_limit, - GNUNET_HELLO_AddressIterator it, - void *it_cls); - - -/** - * Get the peer identity from a HELLO message. - * - * @param hello the hello message - * @param peer where to store the peer's identity - * @return #GNUNET_SYSERR if the HELLO was malformed - */ -int -GNUNET_HELLO_get_id (const struct GNUNET_HELLO_Message *hello, - struct GNUNET_PeerIdentity *peer); - - -/** - * Get the header from a HELLO message, used so other code - * can correctly send HELLO messages. - * - * @param hello the hello message - * - * @return header or NULL if the HELLO was malformed - */ -struct GNUNET_MessageHeader * -GNUNET_HELLO_get_header (struct GNUNET_HELLO_Message *hello); - - -/** - * Helper function to load/access transport plugins. - * FIXME: pass closure! - * - * @param name name of the transport plugin to load - * @return NULL if a plugin with name @a name is not known/loadable - */ -typedef struct GNUNET_TRANSPORT_PluginFunctions *( -*GNUNET_HELLO_TransportPluginsFind) (const char *name); - - -/** - * Compose a hello URI string from a hello message. - * - * @param hello Hello message - * @param plugins_find Function to find transport plugins by name - * @return Hello URI string - */ -char * -GNUNET_HELLO_compose_uri (const struct GNUNET_HELLO_Message *hello, - GNUNET_HELLO_TransportPluginsFind plugins_find); - - -/** - * Parse a hello URI string to a hello message. - * - * @param uri URI string to parse - * @param pubkey Pointer to struct where public key is parsed - * @param hello Pointer to struct where hello message is parsed - * @param plugins_find Function to find transport plugins by name - * @return #GNUNET_OK on success, #GNUNET_SYSERR if the URI was invalid, #GNUNET_NO on other errors - */ -int -GNUNET_HELLO_parse_uri (const char *uri, - struct GNUNET_CRYPTO_EddsaPublicKey *pubkey, - struct GNUNET_HELLO_Message **hello, - GNUNET_HELLO_TransportPluginsFind plugins_find); - - -/* NG API */ -#include "gnunet_util_lib.h" - - -/** - * Build address record by signing raw information with private key. - * - * @param address text address to sign - * @param nt network type of @a address - * @param mono_time when was @a address valid - * @param private_key signing key to use - * @param[out] result where to write address record (allocated) - * @param[out] result_size set to size of @a result - */ -void -GNUNET_HELLO_sign_address ( - const char *address, - enum GNUNET_NetworkType nt, - struct GNUNET_TIME_Absolute mono_time, - const struct GNUNET_CRYPTO_EddsaPrivateKey *private_key, - void **result, - size_t *result_size); - - -/** - * Check signature and extract address record. - * - * @param raw raw signed address - * @param raw_size size of @a raw - * @param pid public key to use for signature verification - * @param[out] nt set to network type - * @param[out] mono_time when was the address generated - * @return NULL on error, otherwise the address - */ -char * -GNUNET_HELLO_extract_address (const void *raw, - size_t raw_size, - const struct GNUNET_PeerIdentity *pid, - enum GNUNET_NetworkType *nt, - struct GNUNET_TIME_Absolute *mono_time); - - -/** - * Given an address as a string, extract the prefix that identifies - * the communicator offering transmissions to that address. - * - * @param address a peer's address - * @return NULL if the address is mal-formed, otherwise the prefix - */ -char * -GNUNET_HELLO_address_to_prefix (const char *address); - - -#if 0 /* keep Emacsens' auto-indent happy */ -{ -#endif -#ifdef __cplusplus -} -#endif - -/* ifndef GNUNET_HELLO_LIB_H */ -#endif - -/** @} */ /* end of group */ - -/** @} */ /* end of group addition */ - -/* end of gnunet_hello_lib.h */ diff --git a/src/include/gnunet_hello_uri_lib.h b/src/include/gnunet_hello_uri_lib.h @@ -258,6 +258,35 @@ GNUNET_HELLO_dht_msg_to_block (const struct GNUNET_MessageHeader *hello, struct GNUNET_TIME_Absolute *block_expiration); +/** + * Given an address as a string, extract the prefix that identifies + * the communicator offering transmissions to that address. + * + * @param address a peer's address + * @return NULL if the address is mal-formed, otherwise the prefix + */ +char * +GNUNET_HELLO_address_to_prefix (const char *address); + +/** + * Build address record by signing raw information with private key. + * + * @param address text address to sign + * @param nt network type of @a address + * @param mono_time when was @a address valid + * @param private_key signing key to use + * @param[out] result where to write address record (allocated) + * @param[out] result_size set to size of @a result + */ +void +GNUNET_HELLO_sign_address ( + const char *address, + enum GNUNET_NetworkType nt, + struct GNUNET_TIME_Absolute mono_time, + const struct GNUNET_CRYPTO_EddsaPrivateKey *private_key, + void **result, + size_t *result_size); + #if 0 /* keep Emacsens' auto-indent happy */ { #endif diff --git a/src/include/gnunet_peerstore_service.h b/src/include/gnunet_peerstore_service.h @@ -179,6 +179,63 @@ typedef void (*GNUNET_PEERSTORE_Continuation) (void *cls, int success); /** + * Context for a add hello uri request. + */ +struct GNUNET_PEERSTORE_StoreHelloContext +{ + /** + * Kept (also) in a DLL. + */ + struct GNUNET_PEERSTORE_StoreHelloContext *prev; + + /** + * Kept (also) in a DLL. + */ + struct GNUNET_PEERSTORE_StoreHelloContext *next; + + /** + * Peerstore handle. + */ + struct GNUNET_PEERSTORE_Handle *h; + + /** + * Function to call with information. + */ + GNUNET_PEERSTORE_Continuation cont; + + /** + * Closure for @e callback. + */ + void *cont_cls; + + /** + * Map with all store contexts started during adding hello. + */ + struct GNUNET_CONTAINER_MultiPeerMap *store_context_map; + + /** + * Active watch to be notified about conflicting hello uri add requests. + */ + struct GNUNET_PEERSTORE_WatchContext *wc; + + /** + * Hello uri which was request for storing. + */ + struct GNUNET_MessageHeader *hello; + + /** + * The peer id for the hello. + */ + struct GNUNET_PeerIdentity *pid; + + /** + * Was this request successful. + */ + int success; +}; + + +/** * Function called by PEERSTORE for each matching record. * * @param cls closure diff --git a/src/include/gnunet_transport_hello_service.h b/src/include/gnunet_transport_hello_service.h @@ -1,209 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2009-2016 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 <http://www.gnu.org/licenses/>. - - SPDX-License-Identifier: AGPL3.0-or-later - */ - -/** - * @addtogroup Backbone - * @{ - * - * @author Christian Grothoff - * - * @file - * obtain information about our current address - * - * @deprecated, in TNG applications should query PEERSTORE directly! - * - * @defgroup transport Transport service - * address information - * - * @see [Documentation](https://gnunet.org/transport-service) - * - * @{ - */ -#ifndef GNUNET_TRANSPORT_HELLO_SERVICE_H -#define GNUNET_TRANSPORT_HELLO_SERVICE_H - -#ifdef __cplusplus -extern "C" { -#if 0 /* keep Emacsens' auto-indent happy */ -} -#endif -#endif - - -#include "gnunet_util_lib.h" -#include "gnunet_ats_service.h" - -/** - * Version number of the transport API. - */ -#define GNUNET_TRANSPORT_HELLO_VERSION 0x00000000 - - -/** - * Some addresses contain sensitive information or are - * not suitable for global distribution. We use address - * classes to filter addresses by which domain they make - * sense to be used in. These are used in a bitmask. - */ -enum GNUNET_TRANSPORT_AddressClass -{ - /** - * No address. - */ - GNUNET_TRANSPORT_AC_NONE = 0, - - /** - * Addresses that fall into no other category - * (i.e. incoming which we cannot use elsewhere). - */ - GNUNET_TRANSPORT_AC_OTHER = 1, - - /** - * Addresses that are global and are insensitive - * (i.e. IPv4). - */ - GNUNET_TRANSPORT_AC_GLOBAL = 2, - - /** - * Addresses that are global and are sensitive - * (i.e. IPv6 with our MAC). - */ - GNUNET_TRANSPORT_AC_GLOBAL_PRIVATE = 4, - - /** - * Addresses useful in the local wired network, - * i.e. a MAC. Sensitive, but obvious to people nearby. - * Useful for broadcasts. - */ - GNUNET_TRANSPORT_AC_LAN = 8, - - /** - * Addresses useful in the local wireless network, - * i.e. a MAC. Sensitive, but obvious to people nearby. - * Useful for broadcasts. - */ - GNUNET_TRANSPORT_AC_WLAN = 16, - - /** - * Addresses useful in the local bluetooth network. Sensitive, but - * obvious to people nearby. Useful for broadcasts. - */ - GNUNET_TRANSPORT_AC_BT = 32, - - /** - * Bitmask for "any" address. - */ - GNUNET_TRANSPORT_AC_ANY = 65535 -}; - - -/** - * Function called whenever there is an update to the - * HELLO of this peer. - * - * @param cls closure - * @param hello our updated HELLO - */ -typedef void (*GNUNET_TRANSPORT_HelloUpdateCallback) ( - void *cls, - const struct GNUNET_MessageHeader *hello); - - -/** - * Handle to cancel a #GNUNET_TRANSPORT_hello_get() operation. - */ -struct GNUNET_TRANSPORT_HelloGetHandle; - - -/** - * Obtain updates on changes to the HELLO message for this peer. The callback - * given in this function is never called synchronously. - * - * @param cfg configuration to use - * @param ac which network type should the addresses from the HELLO belong to? - * @param rec function to call with the HELLO - * @param rec_cls closure for @a rec - * @return handle to cancel the operation - */ -struct GNUNET_TRANSPORT_HelloGetHandle * -GNUNET_TRANSPORT_hello_get (const struct GNUNET_CONFIGURATION_Handle *cfg, - enum GNUNET_TRANSPORT_AddressClass ac, - GNUNET_TRANSPORT_HelloUpdateCallback rec, - void *rec_cls) __attribute__((deprecated)); - - -/** - * Stop receiving updates about changes to our HELLO message. - * - * @param ghh handle to cancel - */ -void -GNUNET_TRANSPORT_hello_get_cancel (struct - GNUNET_TRANSPORT_HelloGetHandle *ghh) -__attribute__((deprecated)); - - -/** - * Function with addresses found in a HELLO. - * - * @param cls closure - * @param peer identity of the peer - * @param address the address (UTF-8, 0-terminated) - * @param nt network type of the address - * @param expiration when does this address expire? - */ -typedef void (*GNUNET_TRANSPORT_AddressCallback)( - void *cls, - const struct GNUNET_PeerIdentity *peer, - const char *address, - enum GNUNET_NetworkType nt, - struct GNUNET_TIME_Absolute expiration) __attribute__((deprecated)); - - -/** - * Parse a HELLO message that we have received into its - * constituent addresses. - * - * @param hello message to parse - * @param cb function to call on each address found - * @param cb_cls closure for @a cb - * @return #GNUNET_OK if hello was well-formed, #GNUNET_SYSERR if not - */ -int -GNUNET_TRANSPORT_hello_parse (const struct GNUNET_MessageHeader *hello, - GNUNET_TRANSPORT_AddressCallback cb, - void *cb_cls) __attribute__((deprecated)); - - -#if 0 /* keep Emacsens' auto-indent happy */ -{ -#endif -#ifdef __cplusplus -} -#endif - -/* ifndef GNUNET_TRANSPORT_HELLO_SERVICE_H */ -#endif - -/** @} */ /* end of group */ - -/** @} */ /* end of group addition */ - -/* end of gnunet_transport_hello_service.h */ diff --git a/src/lib/hello/Makefile.am b/src/lib/hello/Makefile.am @@ -9,8 +9,6 @@ endif lib_LTLIBRARIES = libgnunethello.la libgnunethello_la_SOURCES = \ - address.c \ - hello-ng.c \ hello-uri.c libgnunethello_la_LIBADD = \ $(top_builddir)/src/lib/util/libgnunetutil.la $(XLIB) \ diff --git a/src/lib/hello/address.c b/src/lib/hello/address.c @@ -1,139 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2009 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 <http://www.gnu.org/licenses/>. - - SPDX-License-Identifier: AGPL3.0-or-later - */ - -/** - * @file hello/address.c - * @brief helper functions for handling addresses - * @author Christian Grothoff - */ -#include "platform.h" -#include "gnunet_hello_lib.h" -#include "gnunet_util_lib.h" - - -/** - * Check if an address has a local option set - * - * @param address the address to check - * @param option the respective option to check for - * @return #GNUNET_YES or #GNUNET_NO - */ -int -GNUNET_HELLO_address_check_option (const struct GNUNET_HELLO_Address *address, - enum GNUNET_HELLO_AddressInfo option) -{ - if (option == (address->local_info & option)) - return GNUNET_YES; - return GNUNET_NO; -} - - -/** - * Get the size of an address struct. - * - * @param address address - * @return the size - */ -size_t -GNUNET_HELLO_address_get_size (const struct GNUNET_HELLO_Address *address) -{ - return sizeof(struct GNUNET_HELLO_Address) + address->address_length - + strlen (address->transport_name) + 1; -} - - -struct GNUNET_HELLO_Address * -GNUNET_HELLO_address_allocate (const struct GNUNET_PeerIdentity *peer, - const char *transport_name, - const void *address, - size_t address_length, - enum GNUNET_HELLO_AddressInfo local_info) -{ - struct GNUNET_HELLO_Address *addr; - size_t slen; - char *end; - - slen = strlen (transport_name) + 1; - addr = GNUNET_malloc (sizeof(struct GNUNET_HELLO_Address) - + address_length + slen); - addr->peer = *peer; - addr->address = &addr[1]; - addr->address_length = address_length; - addr->local_info = local_info; - end = (char *) &addr[1]; - addr->transport_name = &end[address_length]; - GNUNET_memcpy (end, - address, - address_length); - GNUNET_memcpy (&end[address_length], - transport_name, - slen); - return addr; -} - - -/** - * Copy an address struct. - * - * @param address address to copy - * @return a copy of the address struct - */ -struct GNUNET_HELLO_Address * -GNUNET_HELLO_address_copy (const struct GNUNET_HELLO_Address *address) -{ - if (NULL == address) - return NULL; - return GNUNET_HELLO_address_allocate (&address->peer, - address->transport_name, - address->address, - address->address_length, - address->local_info); -} - - -int -GNUNET_HELLO_address_cmp (const struct GNUNET_HELLO_Address *a1, - const struct GNUNET_HELLO_Address *a2) -{ - int ret; - - if ((NULL == a1) && - (NULL == a2)) - return 0; - if (NULL == a1) - return 1; - if (NULL == a2) - return -1; - ret = strcmp (a1->transport_name, a2->transport_name); - if (0 != ret) - return ret; - if (a1->local_info != a2->local_info) - return (((int) a1->local_info) < ((int) a2->local_info)) ? -1 : 1; - if (a1->address_length < a2->address_length) - return -1; - if (a1->address_length > a2->address_length) - return 1; - return memcmp (a1->address, - a2->address, - a1->address_length); -} - - -/* end of address.c */ diff --git a/src/lib/hello/gnunet-hello.c b/src/lib/hello/gnunet-hello.c @@ -24,7 +24,6 @@ */ #include "platform.h" #include "gnunet_protocols.h" -#include "gnunet_hello_lib.h" #include "gnunet_hello_uri_lib.h" #include "gnunet_transport_plugin.h" diff --git a/src/lib/hello/hello-uri.c b/src/lib/hello/hello-uri.c @@ -44,6 +44,27 @@ GNUNET_NETWORK_STRUCT_BEGIN /** + * Binary block we sign when we sign an address. + */ +struct SignedAddress +{ + /** + * Purpose must be #GNUNET_SIGNATURE_PURPOSE_TRANSPORT_ADDRESS + */ + struct GNUNET_CRYPTO_EccSignaturePurpose purpose; + + /** + * When was the address generated. + */ + struct GNUNET_TIME_AbsoluteNBO mono_time; + + /** + * Hash of the address. + */ + struct GNUNET_HashCode addr_hash GNUNET_PACKED; +}; + +/** * Message signed as part of a HELLO block/URL. */ struct HelloSignaturePurpose @@ -962,3 +983,63 @@ GNUNET_HELLO_dht_msg_to_block (const struct GNUNET_MessageHeader *hello, } return ret; } + + +/** + * Given an address as a string, extract the prefix that identifies + * the communicator offering transmissions to that address. + * + * @param address a peer's address + * @return NULL if the address is mal-formed, otherwise the prefix + */ +char * +GNUNET_HELLO_address_to_prefix (const char *address) +{ + const char *dash; + + dash = strchr (address, '-'); + if (NULL == dash) + return NULL; + return GNUNET_strndup (address, dash - address); +} + + +/** + * Build address record by signing raw information with private key. + * + * @param address text address at @a communicator to sign + * @param nt network type of @a address + * @param mono_time monotonic time at which @a address was valid + * @param private_key signing key to use + * @param[out] result where to write address record (allocated) + * @param[out] result_size set to size of @a result + */ +void +GNUNET_HELLO_sign_address ( + const char *address, + enum GNUNET_NetworkType nt, + struct GNUNET_TIME_Absolute mono_time, + const struct GNUNET_CRYPTO_EddsaPrivateKey *private_key, + void **result, + size_t *result_size) +{ + struct SignedAddress sa; + struct GNUNET_CRYPTO_EddsaSignature sig; + char *sig_str; + + sa.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_TRANSPORT_ADDRESS); + sa.purpose.size = htonl (sizeof(sa)); + sa.mono_time = GNUNET_TIME_absolute_hton (mono_time); + GNUNET_CRYPTO_hash (address, strlen (address), &sa.addr_hash); + GNUNET_CRYPTO_eddsa_sign (private_key, &sa, &sig); + sig_str = NULL; + (void) GNUNET_STRINGS_base64_encode (&sig, sizeof(sig), &sig_str); + *result_size = + 1 + GNUNET_asprintf ((char **) result, + "%s;%llu;%u;%s", + sig_str, + (unsigned long long) mono_time.abs_value_us, + (unsigned int) nt, + address); + GNUNET_free (sig_str); +} diff --git a/src/lib/hello/hello.c b/src/lib/hello/hello.c @@ -1,1249 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2009, 2015 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 <http://www.gnu.org/licenses/>. - - SPDX-License-Identifier: AGPL3.0-or-later - */ - -/** - * @file hello/hello.c - * @brief helper library for handling HELLOs - * @author Christian Grothoff - * @author Matthias Wachs - */ -#include "platform.h" -#include "gnunet_hello_lib.h" -#include "gnunet_protocols.h" -#include "gnunet_util_lib.h" -#include "gnunet_transport_plugin.h" - -/** - * Context used for building our own URI. - */ -struct GNUNET_HELLO_ComposeUriContext -{ - /** - * Final URI. - */ - char *uri; - - /** - * Function for finding transport plugins by name. - */ - GNUNET_HELLO_TransportPluginsFind plugins_find; -}; - - -/** - * Context for #add_address_to_hello(). - */ -struct GNUNET_HELLO_ParseUriContext -{ - /** - * Position in the URI with the next address to parse. - */ - const char *pos; - - /** - * Set to #GNUNET_SYSERR to indicate parse errors. - */ - int ret; - - /** - * Counter - */ - unsigned int counter_total; - - /** - * Counter skipped addresses - */ - unsigned int counter_added; - - /** - * Function for finding transport plugins by name. - */ - GNUNET_HELLO_TransportPluginsFind plugins_find; -}; - - -/** - * Return HELLO type - * - * @param h HELLO Message to test - * @return #GNUNET_YES for friend-only or #GNUNET_NO otherwise - */ -int -GNUNET_HELLO_is_friend_only (const struct GNUNET_HELLO_Message *h) -{ - if (GNUNET_YES == ntohl (h->friend_only)) - return GNUNET_YES; - return GNUNET_NO; -} - - -/** - * Copy the given address information into - * the given buffer using the format of HELLOs. - * - * @param address the address - * @param expiration expiration for the @a address - * @param target where to copy the @a address - * @param max maximum number of bytes to copy to target - * @return number of bytes copied, 0 if - * the target buffer was not big enough. - */ -size_t -GNUNET_HELLO_add_address (const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration, - char *target, - size_t max) -{ - uint16_t alen; - size_t slen; - struct GNUNET_TIME_AbsoluteNBO exp; - - slen = strlen (address->transport_name) + 1; - if (slen + sizeof(uint16_t) + sizeof(struct GNUNET_TIME_AbsoluteNBO) - + address->address_length > max) - return 0; - exp = GNUNET_TIME_absolute_hton (expiration); - alen = htons ((uint16_t) address->address_length); - GNUNET_memcpy (target, address->transport_name, slen); - GNUNET_memcpy (&target[slen], &alen, sizeof(uint16_t)); - slen += sizeof(uint16_t); - GNUNET_memcpy (&target[slen], &exp, sizeof(struct GNUNET_TIME_AbsoluteNBO)); - slen += sizeof(struct GNUNET_TIME_AbsoluteNBO); - GNUNET_memcpy (&target[slen], address->address, address->address_length); - slen += address->address_length; - return slen; -} - - -/** - * Get the size of an address entry in a HELLO message. - * - * @param buf pointer to the start of the address entry - * @param max maximum size of the entry (end of @a buf) - * @param ralen set to the address length - * @return size of the entry, or 0 if @a max is not large enough - */ -static size_t -get_hello_address_size (const char *buf, - size_t max, - uint16_t *ralen) -{ - const char *pos; - uint16_t alen; - size_t left; - size_t slen; - - left = max; - pos = buf; - slen = 1; - while ((left > 0) && ('\0' != *pos)) - { - left--; - pos++; - slen++; - } - if (0 == left) - { - /* 0-termination not found */ - GNUNET_break_op (0); - return 0; - } - pos++; - if (left < sizeof(uint16_t) + sizeof(struct GNUNET_TIME_AbsoluteNBO)) - { - /* not enough space for addrlen */ - GNUNET_break_op (0); - return 0; - } - GNUNET_memcpy (&alen, pos, sizeof(uint16_t)); - alen = ntohs (alen); - *ralen = alen; - slen += alen + sizeof(uint16_t) + sizeof(struct GNUNET_TIME_AbsoluteNBO); - if (max < slen) - { - /* not enough space for addr */ - GNUNET_break_op (0); - return 0; - } - return slen; -} - - -/** - * Construct a HELLO message given the public key, - * expiration time and an iterator that spews the - * transport addresses. - * - * If friend only is set to #GNUNET_YES we create a FRIEND_HELLO which - * will not be gossiped to other peers. - * - * @param public_key public key to include in the HELLO - * @param addrgen callback to invoke to get addresses - * @param addrgen_cls closure for @a addrgen - * @param friend_only should the returned HELLO be only visible to friends? - * @return the hello message - */ -struct GNUNET_HELLO_Message * -GNUNET_HELLO_create (const struct GNUNET_CRYPTO_EddsaPublicKey *public_key, - GNUNET_HELLO_GenerateAddressListCallback addrgen, - void *addrgen_cls, - int friend_only) -{ - char buffer[GNUNET_MAX_MESSAGE_SIZE - 1 - 256 - - sizeof(struct GNUNET_HELLO_Message)]; - size_t max; - size_t used; - size_t ret; - struct GNUNET_HELLO_Message *hello; - - GNUNET_assert (NULL != public_key); - GNUNET_assert ((GNUNET_YES == friend_only) || - (GNUNET_NO == friend_only)); - max = sizeof(buffer); - used = 0; - if (NULL != addrgen) - { - while (GNUNET_SYSERR != (ret = addrgen (addrgen_cls, - max, - &buffer[used]))) - { - max -= ret; - used += ret; - } - } - hello = GNUNET_malloc (sizeof(struct GNUNET_HELLO_Message) + used); - hello->header.type = htons (GNUNET_MESSAGE_TYPE_HELLO); - hello->header.size = htons (sizeof(struct GNUNET_HELLO_Message) + used); - hello->friend_only = htonl (friend_only); - hello->publicKey = *public_key; - GNUNET_memcpy (&hello[1], - buffer, - used); - return hello; -} - - -/** - * Iterate over all of the addresses in the HELLO. - * - * @param msg HELLO to iterate over - * @param return_modified if a modified copy should be returned, - * otherwise NULL will be returned - * @param it iterator to call on each address - * @param it_cls closure for @a it - * @return modified HELLO message - */ -struct GNUNET_HELLO_Message * -GNUNET_HELLO_iterate_addresses (const struct GNUNET_HELLO_Message *msg, - int return_modified, - GNUNET_HELLO_AddressIterator it, - void *it_cls) -{ - struct GNUNET_HELLO_Address address; - uint16_t msize; - struct GNUNET_HELLO_Message *ret; - const char *inptr; - size_t insize; - size_t esize; - size_t wpos; - char *woff; - uint16_t alen; - struct GNUNET_TIME_AbsoluteNBO expire; - int iret; - - msize = GNUNET_HELLO_size (msg); - if ((msize < sizeof(struct GNUNET_HELLO_Message)) || - (ntohs (msg->header.type) != GNUNET_MESSAGE_TYPE_HELLO)) - { - GNUNET_break_op (0); - return NULL; - } - ret = NULL; - if (return_modified) - { - ret = GNUNET_malloc (msize); - GNUNET_memcpy (ret, - msg, - msize); - } - inptr = (const char *) &msg[1]; - insize = msize - sizeof(struct GNUNET_HELLO_Message); - wpos = 0; - woff = (NULL != ret) ? (char *) &ret[1] : NULL; - address.peer.public_key = msg->publicKey; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "HELLO has %u bytes of address data\n", - (unsigned int) insize); - - while (insize > 0) - { - esize = get_hello_address_size (inptr, - insize, - &alen); - if (0 == esize) - { - GNUNET_break (0); - GNUNET_free (ret); - return NULL; - } - /* need GNUNET_memcpy() due to possibility of misalignment */ - GNUNET_memcpy (&expire, - &inptr[esize - alen - sizeof(struct - GNUNET_TIME_AbsoluteNBO)], - sizeof(struct GNUNET_TIME_AbsoluteNBO)); - address.address = &inptr[esize - alen]; - address.address_length = alen; - address.transport_name = inptr; - address.local_info = GNUNET_HELLO_ADDRESS_INFO_NONE; - iret = it (it_cls, - &address, - GNUNET_TIME_absolute_ntoh (expire)); - if (GNUNET_SYSERR == iret) - break; - if ((GNUNET_OK == iret) && - (NULL != ret)) - { - /* copy address over */ - GNUNET_memcpy (woff, - inptr, - esize); - woff += esize; - wpos += esize; - } - insize -= esize; - inptr += esize; - } - if (NULL != ret) - ret->header.size = ntohs (sizeof(struct GNUNET_HELLO_Message) + wpos); - return ret; -} - - -/** - * Closure for #get_match_exp(). - */ -struct ExpireContext -{ - /** - * Address we are looking for. - */ - const struct GNUNET_HELLO_Address *address; - - /** - * Set to #GNUNET_YES if we found the @e address. - */ - int found; - - /** - * Set to the expiration of the match if @e found is #GNUNET_YES. - */ - struct GNUNET_TIME_Absolute expiration; -}; - - -/** - * Store the expiration time of an address that matches the template. - * - * @param cls the `struct ExpireContext` - * @param address address to match against the template - * @param expiration expiration time of @a address, to store in @a cls - * @return #GNUNET_SYSERR if we found a matching address, #GNUNET_OK otherwise - */ -static int -get_match_exp (void *cls, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration) -{ - struct ExpireContext *ec = cls; - - if (0 != GNUNET_HELLO_address_cmp (address, - ec->address)) - return GNUNET_OK; - ec->found = GNUNET_YES; - ec->expiration = expiration; - return GNUNET_SYSERR; /* done here */ -} - - -/** - * Context for a #GNUNET_HELLO_Merge operation. - */ -struct MergeContext -{ - /** - * First HELLO we are merging. - */ - const struct GNUNET_HELLO_Message *h1; - - /** - * Second HELLO we are merging. - */ - const struct GNUNET_HELLO_Message *h2; - - /** - * Either @e h1 or @e h2, used when copying - * to compare against (so we only copy the - * most recent entry). - */ - const struct GNUNET_HELLO_Message *other; - - /** - * Buffer where we copy to. - */ - char *buf; - - /** - * Number of bytes allocated in @e buf - */ - size_t max; - - /** - * Current (write) offset in @e buf. - */ - size_t ret; - - /** - * Should we copy addresses with an identical value - * and expiration time in @e other, or do we only - * copy addresses with strictly later expiration times? - */ - int take_equal; -}; - - -/** - * Append the address @a address to the buffer from - * the merge context IF it is more recent than equivalent - * addresses in `other`. - * - * @param cls the `struct MergeContext` - * @param address the HELLO address we might copy - * @param expiration expiration time for @a address - * @return always #GNUNET_OK - */ -static int -copy_latest (void *cls, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration) -{ - struct MergeContext *mc = cls; - struct ExpireContext ec; - - ec.address = address; - ec.found = GNUNET_NO; - /* check if address exists in other */ - GNUNET_HELLO_iterate_addresses (mc->other, - GNUNET_NO, - &get_match_exp, - &ec); - if ((GNUNET_NO == ec.found) || - (ec.expiration.abs_value_us < expiration.abs_value_us) || - ((ec.expiration.abs_value_us == expiration.abs_value_us) && - (GNUNET_YES == mc->take_equal))) - { - /* copy address to buffer */ - mc->ret += - GNUNET_HELLO_add_address (address, - expiration, - &mc->buf[mc->ret], - mc->max - mc->ret); - } - return GNUNET_OK; -} - - -/** - * Function called to build the HELLO during - * #GNUNET_HELLO_merge() by merging addresses from - * two original HELLOs. - * - * @param cls the `struct MergeContext` - * @param max number of bytes we can write at most in @a buf - * @param buf where to copy the addresses - * @return #GNUNET_SYSERR to end iteration, otherwise number of bytes written to @a buf - */ -static ssize_t -merge_addr (void *cls, - size_t max, - void *buf) -{ - struct MergeContext *mc = cls; - - if (NULL == mc->h1) - return GNUNET_SYSERR; /* Stop iteration */ - mc->ret = 0; - mc->max = max; - mc->buf = buf; - mc->take_equal = GNUNET_NO; - mc->other = mc->h2; - /* copy addresses from h1, if strictly larger expiration than h2 */ - GNUNET_HELLO_iterate_addresses (mc->h1, - GNUNET_NO, - &copy_latest, - mc); - mc->take_equal = GNUNET_YES; - mc->other = mc->h1; - /* copy addresses from h2, if larger or equal expiration than h1 */ - GNUNET_HELLO_iterate_addresses (mc->h2, - GNUNET_NO, - &copy_latest, - mc); - /* set marker to stop iteration */ - mc->h1 = NULL; - return mc->ret; -} - - -struct GNUNET_HELLO_Message * -GNUNET_HELLO_merge (const struct GNUNET_HELLO_Message *h1, - const struct GNUNET_HELLO_Message *h2) -{ - struct MergeContext mc = { h1, h2, NULL, NULL, 0, 0, 0 }; - int friend_only; - - if (h1->friend_only != h2->friend_only) - friend_only = GNUNET_YES; /* One of the HELLOs is friend only */ - else - friend_only = ntohl (h1->friend_only); /* Both HELLO's have the same type */ - - return GNUNET_HELLO_create (&h1->publicKey, - &merge_addr, - &mc, - friend_only); -} - - -/** - * Context used in #GNUNET_HELLO_iterate_new_addresses() to - * figure out which addresses are in fact 'new'. - */ -struct DeltaContext -{ - /** - * We should ignore addresses that expire before this time. - */ - struct GNUNET_TIME_Absolute expiration_limit; - - /** - * Function to call on addresses that are indeed new. - */ - GNUNET_HELLO_AddressIterator it; - - /** - * Closure for @e it. - */ - void *it_cls; - - /** - * HELLO with known addresses, addresses in this HELLO - * we must always ignore. - */ - const struct GNUNET_HELLO_Message *old_hello; -}; - - -/** - * Check if the given address is 'new', and if so, call - * the iterator. Compares the existing address against - * addresses in the context's `old_hello` and calls the - * iterator on those that are new (and not expired). - * - * @param cls the `struct DeltaContext` - * @param address an address to check whether it is new - * @param expiration expiration time for @a address - * @return #GNUNET_YES if the address is ignored, otherwise - * whatever the iterator returned. - */ -static int -delta_match (void *cls, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration) -{ - struct DeltaContext *dc = cls; - int ret; - struct ExpireContext ec; - - ec.address = address; - ec.found = GNUNET_NO; - GNUNET_HELLO_iterate_addresses (dc->old_hello, - GNUNET_NO, - &get_match_exp, - &ec); - if ((GNUNET_YES == ec.found) && - ((ec.expiration.abs_value_us > expiration.abs_value_us) || - (ec.expiration.abs_value_us >= dc->expiration_limit.abs_value_us))) - return GNUNET_YES; /* skip: found and boring */ - ret = dc->it (dc->it_cls, - address, - expiration); - return ret; -} - - -void -GNUNET_HELLO_iterate_new_addresses (const struct - GNUNET_HELLO_Message *new_hello, - const struct - GNUNET_HELLO_Message *old_hello, - struct GNUNET_TIME_Absolute - expiration_limit, - GNUNET_HELLO_AddressIterator it, - void *it_cls) -{ - struct DeltaContext dc; - - dc.expiration_limit = expiration_limit; - dc.it = it; - dc.it_cls = it_cls; - dc.old_hello = old_hello; - GNUNET_assert (NULL == - GNUNET_HELLO_iterate_addresses (new_hello, - GNUNET_NO, - &delta_match, - &dc)); -} - - -/** - * Return the size of the given HELLO message. - * @param hello to inspect - * @return the size, 0 if HELLO is invalid - */ -uint16_t -GNUNET_HELLO_size (const struct GNUNET_HELLO_Message *hello) -{ - uint16_t ret = ntohs (hello->header.size); - - if ((ret < sizeof(struct GNUNET_HELLO_Message)) || - (ntohs (hello->header.type) != GNUNET_MESSAGE_TYPE_HELLO)) - return 0; - return ret; -} - - -/** - * Get the peer identity from a HELLO message. - * - * @param hello the hello message - * @param peer where to store the peer's identity - * @return #GNUNET_SYSERR if the HELLO was malformed - */ -int -GNUNET_HELLO_get_id (const struct GNUNET_HELLO_Message *hello, - struct GNUNET_PeerIdentity *peer) -{ - uint16_t ret = ntohs (hello->header.size); - - if ((ret < sizeof(struct GNUNET_HELLO_Message)) || - (ntohs (hello->header.type) != GNUNET_MESSAGE_TYPE_HELLO)) - return GNUNET_SYSERR; - peer->public_key = hello->publicKey; - return GNUNET_OK; -} - - -/** - * Get the header from a HELLO message, used so other code - * can correctly send HELLO messages. - * - * @param hello the hello message - * - * @return header or NULL if the HELLO was malformed - */ -struct GNUNET_MessageHeader * -GNUNET_HELLO_get_header (struct GNUNET_HELLO_Message *hello) -{ - uint16_t ret = ntohs (hello->header.size); - - if ((ret < sizeof(struct GNUNET_HELLO_Message)) || - (ntohs (hello->header.type) != GNUNET_MESSAGE_TYPE_HELLO)) - return NULL; - - return &hello->header; -} - - -/** - * Context used for comparing HELLOs in #GNUNET_HELLO_equals(). - */ -struct EqualsContext -{ - /** - * Addresses that expired before this date are ignored for - * the comparison. - */ - struct GNUNET_TIME_Absolute expiration_limit; - - /** - * Earliest expiration time for which we found a match - * with a difference in expiration times. - * At this time, the two HELLOs may start to diverge. - */ - struct GNUNET_TIME_Absolute result; - - /** - * HELLO message to compare against. (First set to the second - * HELLO, then set to the first HELLO.) - */ - const struct GNUNET_HELLO_Message *ref; - - /** - * Address we are currently looking for. - */ - const struct GNUNET_HELLO_Address *address; - - /** - * Expiration time of @e address. - */ - struct GNUNET_TIME_Absolute expiration; - - /** - * Did we find the address we were looking for? - */ - int found; -}; - - -/** - * Check if the given address matches the address we are currently - * looking for. If so, sets `found` to #GNUNET_YES and, if the - * expiration times for the two addresses differ, updates `result` to - * the minimum of our @a expiration and the existing value - * - * @param cls the `struct EqualsContext` - * @param address address from the reference HELLO - * @param expiration expiration time for @a address - * @return #GNUNET_YES if the address is expired or does not match - * #GNUNET_SYSERR if the address does match. - */ -static int -find_other_matching (void *cls, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration) -{ - struct EqualsContext *ec = cls; - - if (expiration.abs_value_us < ec->expiration_limit.abs_value_us) - return GNUNET_YES; - if (0 == GNUNET_HELLO_address_cmp (address, ec->address)) - { - ec->found = GNUNET_YES; - if (expiration.abs_value_us < ec->expiration.abs_value_us) - ec->result = GNUNET_TIME_absolute_min (expiration, - ec->result); - return GNUNET_SYSERR; - } - return GNUNET_YES; -} - - -/** - * Helper function for #GNUNET_HELLO_equals(). Checks - * if the given @a address exists also in the other HELLO; - * if not, the result time is set to zero and the iteration - * is aborted. - * - * @param cls the `struct EqualsContext` - * @param address address to locate - * @param expiration expiration time of the current address - * @return #GNUNET_OK if the address exists or is expired, - * #GNUNET_SYSERR if it was not found - */ -static int -find_matching (void *cls, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration) -{ - struct EqualsContext *ec = cls; - - if (expiration.abs_value_us < ec->expiration_limit.abs_value_us) - return GNUNET_OK; /* expired, we don't care */ - ec->address = address; - ec->expiration = expiration; - ec->found = GNUNET_NO; - GNUNET_HELLO_iterate_addresses (ec->ref, - GNUNET_NO, - &find_other_matching, - ec); - if (GNUNET_NO == ec->found) - { - /* not found, we differ *now* */ - ec->result = GNUNET_TIME_UNIT_ZERO_ABS; - return GNUNET_SYSERR; - } - return GNUNET_OK; -} - - -/** - * Test if two HELLO messages contain the same addresses. - * If they only differ in expiration time, the lowest - * expiration time larger than @a now where they differ - * is returned. - * - * @param h1 first HELLO message - * @param h2 the second HELLO message - * @param now time to use for deciding which addresses have - * expired and should not be considered at all - * @return absolute time forever if the two HELLOs are - * totally identical; smallest timestamp >= @a now if - * they only differ in timestamps; - * zero if the some addresses with expirations >= @a now - * do not match at all - */ -struct GNUNET_TIME_Absolute -GNUNET_HELLO_equals (const struct GNUNET_HELLO_Message *h1, - const struct GNUNET_HELLO_Message *h2, - struct GNUNET_TIME_Absolute now) -{ - struct EqualsContext ec; - - if (h1->header.type != h2->header.type) - return GNUNET_TIME_UNIT_ZERO_ABS; - if (0 != - GNUNET_memcmp (&h1->publicKey, - &h2->publicKey)) - return GNUNET_TIME_UNIT_ZERO_ABS; - ec.expiration_limit = now; - ec.result = GNUNET_TIME_UNIT_FOREVER_ABS; - ec.ref = h2; - GNUNET_HELLO_iterate_addresses (h1, - GNUNET_NO, - &find_matching, - &ec); - if (ec.result.abs_value_us == GNUNET_TIME_UNIT_ZERO.rel_value_us) - return ec.result; - ec.ref = h1; - GNUNET_HELLO_iterate_addresses (h2, - GNUNET_NO, - &find_matching, - &ec); - return ec.result; -} - - -/** - * Iterator to find the time when the last address will expire. - * Updates the maximum value stored in @a cls. - * - * @param cls where to store the max, a `struct GNUNET_TIME_Absolute` - * @param address an address (ignored) - * @param expiration expiration time for @a address - * @return #GNUNET_OK (always) - */ -static int -find_max_expire (void *cls, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration) -{ - struct GNUNET_TIME_Absolute *max = cls; - - *max = GNUNET_TIME_absolute_max (*max, expiration); - return GNUNET_OK; -} - - -/** - * When does the last address in the given HELLO expire? - * - * @param msg HELLO to inspect - * @return time the last address expires, 0 if there are no addresses in the HELLO - */ -struct GNUNET_TIME_Absolute -GNUNET_HELLO_get_last_expiration (const struct GNUNET_HELLO_Message *msg) -{ - struct GNUNET_TIME_Absolute ret; - - ret = GNUNET_TIME_UNIT_ZERO_ABS; - GNUNET_HELLO_iterate_addresses (msg, - GNUNET_NO, - &find_max_expire, - &ret); - return ret; -} - - -/** - * GNUnet URIs are of the general form "gnunet://MODULE/IDENTIFIER". - * The specific structure of "IDENTIFIER" depends on the module and - * maybe differentiated into additional subcategories if applicable. - * This module only deals with hello identifiers (MODULE = "hello"). - * <p> - * - * The concrete URI format is: - * - * "gnunet://hello/PEER[+YYYYMMDDHHMMSS+<TYPE>+<ADDRESS>]...". - * These URIs can be used to add a peer record to peerinfo service. - * PEER is the string representation of peer's public key. - * YYYYMMDDHHMMSS is the expiration date. - * TYPE is a transport type. - * ADDRESS is the address, its format depends upon the transport type. - * The concrete transport types and corresponding address formats are: - * - * <ul><li> - * - * <TCP|UDP>!IPADDRESS - * IPVDDRESS is either IPV4 .-delimited address in form of XXX.XXX.XXX.XXX:PPPPP - * or IPV6 :-delimited address with '[' and ']' (according to RFC2732): - * [XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX]:PPPPP - * PPPPP is the port number. May be 0. - * - * </li><li> - * - * [add SMTP, HTTP and other addresses here] - * - * </li></ul> - * - * The encoding for hexadecimal values is defined in the crypto_hash.c - * module in the gnunetutil library and discussed there. - * - * Examples: - * - * gnunet://hello/V8XXK9GAN5ZJFRFQP8MQX3D83BZTSBQVHKWWD0JPE63Z821906EG+20120302010059+TCP+192.168.0.1:2086+TCP+64.23.8.174:0 - * gnunet://hello/V8XXK9GAN5ZJFRFQP8MQX3D83BZTSBQVHKWWD0JPE63Z821906EG+20120302010059+TCP+[2001:db8:85a3:8d3:1319:8a2e:370:7348]:2086 - * - * <p> - */ - - -/** - * Function that is called on each address of this peer. - * Expands the corresponding URI string. - * - * @param cls the `struct GNUNET_HELLO_ComposeUriContext` - * @param address address to add - * @param expiration expiration time for the address - * @return #GNUNET_OK (continue iteration). - */ -static int -add_address_to_uri (void *cls, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration) -{ - struct GNUNET_HELLO_ComposeUriContext *ctx = cls; - struct GNUNET_TRANSPORT_PluginFunctions *papi; - const char *addr; - char *ret; - char *addr_dup; - char *pos; - char tbuf[16] = ""; - char *client_str = "_client"; - struct tm *t; - time_t seconds; - - papi = ctx->plugins_find (address->transport_name); - if (NULL == papi) - { - /* Not an error - we might just not have the right plugin. */ - return GNUNET_OK; - } - if (NULL == papi->address_to_string) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "URI conversion not implemented for plugin `%s'\n", - address->transport_name); - return GNUNET_OK; - } - addr = papi->address_to_string (papi->cls, - address->address, - address->address_length); - if ((NULL == addr) || - (0 == strlen (addr))) - return GNUNET_OK; - - addr_dup = GNUNET_strdup (addr); - if (NULL != (pos = strstr (addr_dup, "_server"))) - GNUNET_memcpy (pos, - client_str, - strlen (client_str)); /* Replace all server addresses with client addresses */ - - seconds = expiration.abs_value_us / 1000LL / 1000LL; - t = gmtime (&seconds); - - GNUNET_asprintf (&ret, - "%s%c%s%c%s%c%s", - ctx->uri, - GNUNET_HELLO_URI_SEP, - strftime (tbuf, - sizeof(tbuf), - "%Y%m%d%H%M%S", - t) ? tbuf : "0", - GNUNET_HELLO_URI_SEP, - address->transport_name, - GNUNET_HELLO_URI_SEP, - addr_dup); - GNUNET_free (addr_dup); - GNUNET_free (ctx->uri); - ctx->uri = ret; - return GNUNET_OK; -} - - -/** - * Compose a hello URI string from a hello message. - * - * @param hello Hello message - * @param plugins_find Function to find transport plugins by name - * @return Hello URI string - */ -char * -GNUNET_HELLO_compose_uri (const struct GNUNET_HELLO_Message *hello, - GNUNET_HELLO_TransportPluginsFind plugins_find) -{ - struct GNUNET_HELLO_ComposeUriContext ctx; - char *pkey; - - ctx.plugins_find = plugins_find; - pkey = GNUNET_CRYPTO_eddsa_public_key_to_string (&hello->publicKey); - GNUNET_asprintf (&ctx.uri, - "%s%s", - (GNUNET_YES == GNUNET_HELLO_is_friend_only (hello)) - ? GNUNET_FRIEND_HELLO_URI_PREFIX - : GNUNET_HELLO_URI_PREFIX, - pkey); - GNUNET_free (pkey); - GNUNET_HELLO_iterate_addresses (hello, - GNUNET_NO, - &add_address_to_uri, - &ctx); - return ctx.uri; -} - - -/* ************************* Parse HELLO URI ********************* */ - - -/** - * We're building a HELLO. Parse the next address from the - * parsing context and append it. - * - * @param cls the `struct GNUNET_HELLO_ParseUriContext` - * @param max number of bytes available for HELLO construction - * @param buffer where to copy the next address (in binary format) - * @return number of bytes added to buffer, #GNUNET_SYSERR on error - */ -static ssize_t -add_address_to_hello (void *cls, - size_t max, - void *buffer) -{ - struct GNUNET_HELLO_ParseUriContext *ctx = cls; - const char *tname; - const char *address; - char *uri_address; - const char *end; - char *plugin_name; - struct tm expiration_time; - time_t expiration_seconds; - struct GNUNET_TIME_Absolute expire; - struct GNUNET_TRANSPORT_PluginFunctions *papi; - void *addr; - size_t addr_len; - struct GNUNET_HELLO_Address haddr; - ssize_t ret; - - if (NULL == ctx->pos) - return GNUNET_SYSERR; - if (GNUNET_HELLO_URI_SEP != ctx->pos[0]) - { - ctx->ret = GNUNET_SYSERR; - GNUNET_break (0); - return GNUNET_SYSERR; - } - ctx->pos++; - - if (('0' == ctx->pos[0]) && - (GNUNET_HELLO_URI_SEP == ctx->pos[1])) - { - expire = GNUNET_TIME_UNIT_FOREVER_ABS; - tname = ctx->pos + 1; - } - else - { - memset (&expiration_time, 0, sizeof(expiration_time)); - tname = strptime (ctx->pos, - "%Y%m%d%H%M%S", - &expiration_time); - if (NULL == tname) - { - ctx->ret = GNUNET_SYSERR; - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _ ( - "Failed to parse HELLO message: missing expiration time\n")); - GNUNET_break (0); - return GNUNET_SYSERR; - } - - expiration_seconds = mktime (&expiration_time); - if (expiration_seconds == (time_t) -1) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _ ( - "Failed to parse HELLO message: invalid expiration time\n")); - ctx->ret = GNUNET_SYSERR; - GNUNET_break (0); - return GNUNET_SYSERR; - } - expire.abs_value_us = expiration_seconds * 1000LL * 1000LL; - } - if (GNUNET_HELLO_URI_SEP != tname[0]) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _ ("Failed to parse HELLO message: malformed\n")); - ctx->ret = GNUNET_SYSERR; - GNUNET_break (0); - return GNUNET_SYSERR; - } - tname++; - address = strchr (tname, - (int) GNUNET_HELLO_URI_SEP); - if (NULL == address) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _ ( - "Failed to parse HELLO message: missing transport plugin\n")); - ctx->ret = GNUNET_SYSERR; - GNUNET_break (0); - return GNUNET_SYSERR; - } - address++; - end = strchr (address, (int) GNUNET_HELLO_URI_SEP); - ctx->pos = end; - ctx->counter_total++; - plugin_name = GNUNET_strndup (tname, address - (tname + 1)); - papi = ctx->plugins_find (plugin_name); - if (NULL == papi) - { - /* Not an error - we might just not have the right plugin. - * Skip this part, advance to the next one and recurse. - * But only if this is not the end of string. - */ - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - _ ("Plugin `%s' not found, skipping address\n"), - plugin_name); - GNUNET_free (plugin_name); - return 0; - } - if (NULL == papi->string_to_address) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - _ ("Plugin `%s' does not support URIs yet\n"), - plugin_name); - GNUNET_free (plugin_name); - GNUNET_break (0); - return 0; - } - uri_address = GNUNET_strndup (address, end - address); - if (GNUNET_OK != - papi->string_to_address (papi->cls, - uri_address, - strlen (uri_address) + 1, - &addr, - &addr_len)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _ ("Failed to parse `%s' as an address for plugin `%s'\n"), - uri_address, - plugin_name); - GNUNET_free (plugin_name); - GNUNET_free (uri_address); - return 0; - } - GNUNET_free (uri_address); - /* address.peer is unset - not used by add_address() */ - haddr.address_length = addr_len; - haddr.address = addr; - haddr.transport_name = plugin_name; - ret = GNUNET_HELLO_add_address (&haddr, - expire, - buffer, - max); - ctx->counter_added++; - GNUNET_free (addr); - GNUNET_free (plugin_name); - return ret; -} - - -/** - * Parse a hello URI string to a hello message. - * - * @param uri URI string to parse - * @param pubkey Pointer to struct where public key is parsed - * @param hello Pointer to struct where hello message is parsed - * @param plugins_find Function to find transport plugins by name - * @return #GNUNET_OK on success, #GNUNET_SYSERR if the URI was invalid, #GNUNET_NO on other errors - */ -int -GNUNET_HELLO_parse_uri (const char *uri, - struct GNUNET_CRYPTO_EddsaPublicKey *pubkey, - struct GNUNET_HELLO_Message **hello, - GNUNET_HELLO_TransportPluginsFind plugins_find) -{ - const char *pks; - const char *exc; - int friend_only; - struct GNUNET_HELLO_ParseUriContext ctx; - - if (0 == strncmp (uri, - GNUNET_HELLO_URI_PREFIX, - strlen (GNUNET_HELLO_URI_PREFIX))) - { - pks = &uri[strlen (GNUNET_HELLO_URI_PREFIX)]; - friend_only = GNUNET_NO; - } - else if (0 == strncmp (uri, - GNUNET_FRIEND_HELLO_URI_PREFIX, - strlen (GNUNET_FRIEND_HELLO_URI_PREFIX))) - { - pks = &uri[strlen (GNUNET_FRIEND_HELLO_URI_PREFIX)]; - friend_only = GNUNET_YES; - } - else - return GNUNET_SYSERR; - exc = strchr (pks, GNUNET_HELLO_URI_SEP); - - if (GNUNET_OK != - GNUNET_STRINGS_string_to_data (pks, - (NULL == exc) ? strlen (pks) : (exc - pks), - (unsigned char *) pubkey, - sizeof(*pubkey))) - return GNUNET_SYSERR; - - ctx.pos = exc; - ctx.ret = GNUNET_OK; - ctx.counter_total = 0; - ctx.counter_added = 0; - ctx.plugins_find = plugins_find; - *hello = GNUNET_HELLO_create (pubkey, - &add_address_to_hello, - &ctx, - friend_only); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "HELLO URI contained %u addresses, added %u addresses\n", - ctx.counter_total, - ctx.counter_added); - - return ctx.ret; -} - - -/* end of hello.c */ diff --git a/src/lib/hello/test_friend_hello.c b/src/lib/hello/test_friend_hello.c @@ -1,185 +0,0 @@ -/* - This file is part of GNUnet - Copyright (C) 2009 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 <http://www.gnu.org/licenses/>. - - SPDX-License-Identifier: AGPL3.0-or-later - */ -/** - * @file hello/test_friend_hello.c - * @brief test for hello.c - * @author Christian Grothoff - */ -#include "platform.h" -#include "gnunet_hello_lib.h" - - -static ssize_t -my_addr_gen (void *cls, - size_t max, - void *buf) -{ - unsigned int *i = cls; - size_t ret; - struct GNUNET_HELLO_Address address; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "DEBUG: my_addr_gen called with i = %d\n", *i); - if (0 == *i) - return GNUNET_SYSERR; /* Stop iteration */ - memset (&address.peer, 0, sizeof(struct GNUNET_PeerIdentity)); - address.address = "address_information"; - address.transport_name = "test"; - address.address_length = *i; - ret = - GNUNET_HELLO_add_address (&address, GNUNET_TIME_absolute_get (), buf, - max); - (*i)--; - return ret; -} - - -static int -check_addr (void *cls, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration) -{ - unsigned int *i = cls; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "DEBUG: check_addr called with i = %d and addrlen = %u\n", - *i, (unsigned int) address->address_length); - GNUNET_assert (address->address_length > 0); - GNUNET_assert (*i & (1 << (address->address_length - 1))); - *i -= (1 << (address->address_length - 1)); - GNUNET_assert (0 == - strncmp ("address_information", address->address, - address->address_length)); - GNUNET_assert (0 == strcmp ("test", address->transport_name)); - return GNUNET_OK; -} - - -static int -remove_some (void *cls, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration) -{ - unsigned int *i = cls; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "DEBUG: remove_some called with i = %d and addrlen = %u\n", - *i, (unsigned int) address->address_length); - GNUNET_assert (address->address_length > 0); - if (*i & (1 << (address->address_length - 1))) - { - *i -= (1 << (address->address_length - 1)); - return GNUNET_NO; - } - return GNUNET_OK; -} - - -int -main (int argc, char *argv[]) -{ - struct GNUNET_HELLO_Message *msg1; - struct GNUNET_HELLO_Message *msg2; - struct GNUNET_HELLO_Message *msg3; - struct GNUNET_CRYPTO_EddsaPublicKey publicKey; - struct GNUNET_TIME_Absolute startup_time; - unsigned int i; - - GNUNET_log_setup ("test-hello", "DEBUG", NULL); - startup_time = GNUNET_TIME_absolute_get (); - memset (&publicKey, 42, sizeof(publicKey)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing HELLO creation (without addresses)...\n"); - i = 0; - msg1 = GNUNET_HELLO_create (&publicKey, &my_addr_gen, &i, GNUNET_YES); - GNUNET_assert (msg1 != NULL); - GNUNET_assert (0 < GNUNET_HELLO_size (msg1)); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing address iteration (empty set)...\n"); - GNUNET_assert (NULL == - GNUNET_HELLO_iterate_addresses (msg1, GNUNET_NO, &check_addr, - &i)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing HELLO creation (with one address)...\n"); - i = 1; - msg2 = GNUNET_HELLO_create (&publicKey, &my_addr_gen, &i, GNUNET_YES); - GNUNET_assert (msg2 != NULL); - GNUNET_assert (GNUNET_HELLO_size (msg1) < GNUNET_HELLO_size (msg2)); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing address iteration (one address)...\n"); - i = 1; - GNUNET_assert (NULL == - GNUNET_HELLO_iterate_addresses (msg2, GNUNET_NO, &check_addr, - &i)); - GNUNET_assert (i == 0); - GNUNET_free (msg1); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing HELLO creation (with two addresses)...\n"); - i = 2; - msg3 = GNUNET_HELLO_create (&publicKey, &my_addr_gen, &i, GNUNET_YES); - GNUNET_assert (msg3 != NULL); - GNUNET_assert (GNUNET_HELLO_size (msg2) < GNUNET_HELLO_size (msg3)); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing address iteration (two addresses)...\n"); - i = 3; - GNUNET_assert (NULL == - GNUNET_HELLO_iterate_addresses (msg3, GNUNET_NO, &check_addr, - &i)); - GNUNET_assert (i == 0); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing HELLO merge...\n"); - msg1 = GNUNET_HELLO_merge (msg2, msg3); - GNUNET_assert (GNUNET_HELLO_size (msg1) == GNUNET_HELLO_size (msg3)); - - i = 3; - GNUNET_assert (NULL == - GNUNET_HELLO_iterate_addresses (msg1, GNUNET_NO, &check_addr, - &i)); - GNUNET_assert (i == 0); - GNUNET_free (msg1); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing address iteration to copy HELLO...\n"); - i = 2; - msg1 = GNUNET_HELLO_iterate_addresses (msg3, GNUNET_YES, &remove_some, &i); - GNUNET_assert (msg1 != NULL); - GNUNET_assert (i == 0); - i = 1; - GNUNET_assert (NULL == - GNUNET_HELLO_iterate_addresses (msg1, GNUNET_NO, &check_addr, - &i)); - GNUNET_assert (i == 0); - GNUNET_free (msg1); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing delta address iteration...\n"); - i = 2; - GNUNET_HELLO_iterate_new_addresses (msg3, msg2, startup_time, &check_addr, - &i); - GNUNET_assert (i == 0); - GNUNET_free (msg2); - GNUNET_free (msg3); - return 0; /* testcase passed */ -} diff --git a/src/lib/hello/test_hello-ng.c b/src/lib/hello/test_hello-ng.c @@ -1,60 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 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 <http://www.gnu.org/licenses/>. - - SPDX-License-Identifier: AGPL3.0-or-later - */ -#include "platform.h" -#include "gnunet_util_lib.h" -#include "gnunet_nt_lib.h" -#include "gnunet_hello_lib.h" - -int -main (int argc, - char *argv[]) -{ - struct GNUNET_CRYPTO_EddsaPublicKey pubKey; - struct GNUNET_CRYPTO_EddsaPrivateKey privKey; - struct GNUNET_PeerIdentity pid; - struct GNUNET_TIME_Absolute t = GNUNET_TIME_absolute_get (); - char *res; - char *address; - size_t res_len; - enum GNUNET_NetworkType nt; - - GNUNET_CRYPTO_eddsa_key_create (&privKey); - GNUNET_CRYPTO_eddsa_key_get_public (&privKey, - &pubKey); - pid.public_key = pubKey; - GNUNET_HELLO_sign_address ("127.0.0.1:8080", - GNUNET_NT_LAN, - t, - &privKey, - (void**) &res, - &res_len); - GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, - "%s\n", res); - GNUNET_assert (NULL != - (address = - GNUNET_HELLO_extract_address ((void**) res, - res_len, - &pid, - &nt, - &t))); - GNUNET_free (address); - GNUNET_free (res); - return 0; -} diff --git a/src/lib/hello/test_hello.c b/src/lib/hello/test_hello.c @@ -1,253 +0,0 @@ -/* - This file is part of GNUnet - Copyright (C) 2009, 2015 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 <http://www.gnu.org/licenses/>. - - SPDX-License-Identifier: AGPL3.0-or-later - */ -/** - * @file hello/test_hello.c - * @brief test for hello.c - * @author Christian Grothoff - */ -#include "platform.h" -#include "gnunet_hello_lib.h" - - -/** - * - * - * @param cls - * @param max - * @param buf - * @return - */ -static ssize_t -my_addr_gen (void *cls, - size_t max, - void *buf) -{ - unsigned int *i = cls; - size_t ret; - struct GNUNET_HELLO_Address address; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "DEBUG: my_addr_gen called with i = %d\n", - *i); - if (0 == *i) - return GNUNET_SYSERR; - memset (&address.peer, 0, sizeof(struct GNUNET_PeerIdentity)); - address.address = "address_information"; - address.transport_name = "test"; - address.address_length = *i; - ret = GNUNET_HELLO_add_address (&address, - GNUNET_TIME_absolute_get (), - buf, - max); - (*i)--; - return ret; -} - - -/** - * - * - * @param cls - * @param address - * @param expiration - * @return - */ -static int -check_addr (void *cls, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration) -{ - unsigned int *i = cls; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "DEBUG: check_addr called with i = %d and addrlen = %u\n", - *i, - (unsigned int) address->address_length); - GNUNET_assert (address->address_length > 0); - GNUNET_assert (*i & (1 << (address->address_length - 1))); - *i -= (1 << (address->address_length - 1)); - GNUNET_assert (0 == - strncmp ("address_information", - address->address, - address->address_length)); - GNUNET_assert (0 == strcmp ("test", - address->transport_name)); - return GNUNET_OK; -} - - -/** - * - * - * @param cls - * @param address - * @param expiration - * @return - */ -static int -remove_some (void *cls, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute expiration) -{ - unsigned int *i = cls; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "DEBUG: remove_some called with i = %d and addrlen = %u\n", - *i, - (unsigned int) address->address_length); - GNUNET_assert (address->address_length > 0); - if (*i & (1 << (address->address_length - 1))) - { - *i -= (1 << (address->address_length - 1)); - return GNUNET_NO; - } - return GNUNET_OK; -} - - -int -main (int argc, - char *argv[]) -{ - struct GNUNET_HELLO_Message *msg1; - struct GNUNET_HELLO_Message *msg2; - struct GNUNET_HELLO_Message *msg3; - struct GNUNET_CRYPTO_EddsaPublicKey publicKey; - struct GNUNET_PeerIdentity pid; - struct GNUNET_TIME_Absolute startup_time; - unsigned int i; - - GNUNET_log_setup ("test-hello", - "DEBUG", - NULL); - startup_time = GNUNET_TIME_absolute_get (); - memset (&publicKey, 42, sizeof(publicKey)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing HELLO creation (without addresses)...\n"); - i = 0; - msg1 = GNUNET_HELLO_create (&publicKey, - &my_addr_gen, - &i, - GNUNET_NO); - GNUNET_assert (msg1 != NULL); - GNUNET_assert (0 < GNUNET_HELLO_size (msg1)); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing address iteration (empty set)...\n"); - GNUNET_assert (NULL == - GNUNET_HELLO_iterate_addresses (msg1, - GNUNET_NO, - &check_addr, - &i)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing HELLO creation (with one address)...\n"); - i = 1; - msg2 = GNUNET_HELLO_create (&publicKey, - &my_addr_gen, - &i, - GNUNET_NO); - GNUNET_assert (msg2 != NULL); - GNUNET_assert (GNUNET_HELLO_size (msg1) < GNUNET_HELLO_size (msg2)); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing address iteration (one address)...\n"); - i = 1; - GNUNET_assert (NULL == - GNUNET_HELLO_iterate_addresses (msg2, - GNUNET_NO, - &check_addr, - &i)); - GNUNET_assert (i == 0); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing get_key from HELLO...\n"); - GNUNET_assert (GNUNET_OK == GNUNET_HELLO_get_id (msg2, &pid)); - GNUNET_assert (0 == GNUNET_memcmp (&publicKey, - &pid.public_key)); - GNUNET_free (msg1); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing HELLO creation (with two addresses)...\n"); - i = 2; - msg3 = GNUNET_HELLO_create (&publicKey, - &my_addr_gen, - &i, - GNUNET_NO); - GNUNET_assert (msg3 != NULL); - GNUNET_assert (GNUNET_HELLO_size (msg2) < GNUNET_HELLO_size (msg3)); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing address iteration (two addresses)...\n"); - i = 3; - GNUNET_assert (NULL == - GNUNET_HELLO_iterate_addresses (msg3, - GNUNET_NO, - &check_addr, - &i)); - GNUNET_assert (i == 0); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing HELLO merge...\n"); - msg1 = GNUNET_HELLO_merge (msg2, msg3); - GNUNET_assert (GNUNET_HELLO_size (msg1) == GNUNET_HELLO_size (msg3)); - - i = 3; - GNUNET_assert (NULL == - GNUNET_HELLO_iterate_addresses (msg1, - GNUNET_NO, - &check_addr, - &i)); - GNUNET_assert (i == 0); - GNUNET_free (msg1); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing address iteration to copy HELLO...\n"); - i = 2; - msg1 = GNUNET_HELLO_iterate_addresses (msg3, - GNUNET_YES, - &remove_some, - &i); - GNUNET_assert (msg1 != NULL); - GNUNET_assert (i == 0); - i = 1; - GNUNET_assert (NULL == - GNUNET_HELLO_iterate_addresses (msg1, - GNUNET_NO, - &check_addr, - &i)); - GNUNET_assert (i == 0); - GNUNET_free (msg1); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Testing delta address iteration...\n"); - i = 2; - GNUNET_HELLO_iterate_new_addresses (msg3, - msg2, - startup_time, - &check_addr, - &i); - GNUNET_assert (i == 0); - GNUNET_free (msg2); - GNUNET_free (msg3); - return 0; /* testcase passed */ -} - - -/* end of test_hello.c */ diff --git a/src/service/core/core_api_cmd_connecting_peers.c b/src/service/core/core_api_cmd_connecting_peers.c @@ -28,7 +28,6 @@ #include "gnunet_testing_ng_lib.h" #include "gnunet_testing_netjail_lib.h" #include "gnunet_transport_application_service.h" -#include "gnunet_hello_lib.h" #include "gnunet_transport_core_service.h" /** diff --git a/src/service/core/test_core_just_run.conf b/src/service/core/test_core_just_run.conf @@ -0,0 +1,47 @@ +@INLINE@ ../transport/template_tng_cfg_peer1.conf +[PATHS] +GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/ + +[transport] +BINARY = gnunet-service-tng +#PREFIX = valgrind --leak-check=full --track-origins=yes --trace-children=yes --log-file=$GNUNET_TEST_HOME/vg_peer1-%p +UNIXPATH = $GNUNET_RUNTIME_DIR/tng-p1.sock + +[PEER] +PRIVATE_KEY = $GNUNET_RUNTIME_DIR/private.key + +[communicator-tcp] +BINARY = gnunet-communicator-tcp +BINDTO = 192.168.15.1:60002 +DISABLE_V6 = YES +IMMEDIATE_START = YES +UNIXPATH = $GNUNET_RUNTIME_DIR/tcp-comm-p1.sock +#PREFIX = valgrind --leak-check=full --track-origins=yes --trace-children=yes --log-file=$GNUNET_TEST_HOME/vg_ctpeer1-%p +#PREFIX = xterm -geometry 100x85 -T peer1 -e gdb --args + +[communicator-udp] +#PREFIX = valgrind --leak-check=full --track-origins=yes --trace-children=yes --log-file=$GNUNET_TEST_HOME/vg_cupeer1-%p +BINARY = gnunet-communicator-udp +BINDTO = 192.168.15.1:60002 +DISABLE_V6 = YES +IMMEDIATE_START = YES +UNIXPATH = $GNUNET_RUNTIME_DIR/udp-comm-p1.sock + +[peerstore] +IMMEDIATE_START = YES +USE_INCLUDED_HELLOS = YES +#PREFIX = valgrind --leak-check=full --track-origins=yes --trace-children=yes --log-file=$GNUNET_TEST_HOME/vg_peer1-%p + +[topology] +IMMEDIATE_START = YES + +[dht] +IMMEDIATE_START = YES + +[fs] +IMMEDIATE_START = YES + +[hostlist] +IMMEDIATE_START = YES +SERVERS = http://192.168.15.1:8080/ +#PREFIX = valgrind --leak-check=full --track-origins=yes --trace-children=yes --log-file=$GNUNET_TEST_HOME/vg_peer1-%p +\ No newline at end of file diff --git a/src/service/core/test_core_just_run_host.conf b/src/service/core/test_core_just_run_host.conf @@ -0,0 +1,45 @@ +@INLINE@ ../transport/template_tng_cfg_peer1.conf +[PATHS] +GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/ + +[transport] +BINARY = gnunet-service-tng +#PREFIX = valgrind --leak-check=full --track-origins=yes --trace-children=yes --log-file=$GNUNET_TEST_HOME/vg_peer1-%p +UNIXPATH = $GNUNET_RUNTIME_DIR/tng-p1.sock + +[PEER] +PRIVATE_KEY = $GNUNET_RUNTIME_DIR/private.key + +[communicator-tcp] +BINARY = gnunet-communicator-tcp +BINDTO = 192.168.15.1:60002 +DISABLE_V6 = YES +IMMEDIATE_START = YES +UNIXPATH = $GNUNET_RUNTIME_DIR/tcp-comm-p1.sock +#PREFIX = valgrind --leak-check=full --track-origins=yes --trace-children=yes --log-file=$GNUNET_TEST_HOME/vg_ctpeer1-%p +#PREFIX = xterm -geometry 100x85 -T peer1 -e gdb --args + +[communicator-udp] +#PREFIX = valgrind --leak-check=full --track-origins=yes --trace-children=yes --log-file=$GNUNET_TEST_HOME/vg_cupeer1-%p +BINARY = gnunet-communicator-udp +BINDTO = 192.168.15.1:60002 +DISABLE_V6 = YES +IMMEDIATE_START = YES +UNIXPATH = $GNUNET_RUNTIME_DIR/udp-comm-p1.sock + +[peerstore] +IMMEDIATE_START = YES +USE_INCLUDED_HELLOS = YES + +[topology] +IMMEDIATE_START = YES + +[dht] +IMMEDIATE_START = YES + +[fs] +IMMEDIATE_START = YES + +[hostlist] +IMMEDIATE_START = YES +OPTIONS = -p +\ No newline at end of file diff --git a/src/service/dht/dht_api.c b/src/service/dht/dht_api.c @@ -29,7 +29,6 @@ #include "gnunet_constants.h" #include "gnunet_signatures.h" #include "gnunet_arm_service.h" -#include "gnunet_hello_lib.h" #include "gnunet_protocols.h" #include "gnunet_dht_service.h" #include "dht.h" diff --git a/src/service/dht/test_dht_api.c b/src/service/dht/test_dht_api.c @@ -26,7 +26,6 @@ */ #include "platform.h" #include "gnunet_util_lib.h" -#include "gnunet_hello_lib.h" #include "gnunet_testing_lib.h" #include "gnunet_dht_service.h" diff --git a/src/service/hostlist/gnunet-daemon-hostlist_client.c b/src/service/hostlist/gnunet-daemon-hostlist_client.c @@ -230,6 +230,16 @@ static struct GNUNET_SCHEDULER_Task *ti_testing_intervall_task; static struct GNUNET_TIME_Absolute end_time; /** + * Head of the linkd list to store the store context for hellos. + */ +static struct GNUNET_PEERSTORE_StoreHelloContext *shc_head; + +/** + * Tail of the linkd list to store the store context for hellos. + */ +static struct GNUNET_PEERSTORE_StoreHelloContext *shc_tail; + +/** * Head of the linked list used to store hostlists */ static struct Hostlist *linked_list_head; @@ -313,8 +323,14 @@ static struct GNUNET_PEERSTORE_Handle *peerstore; static void shc_cont (void *cls, int success) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Hostlist entry stored successfully!\n"); + (void *) cls; + + if (GNUNET_YES == success) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Hostlist entry stored successfully!\n"); + else + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Error storing hostlist entry!\n"); } @@ -398,7 +414,8 @@ callback_download (void *ptr, size_t size, size_t nmemb, void *ctx) shc = GNUNET_PEERSTORE_hello_add (peerstore, msg, shc_cont, - shc); + NULL); + GNUNET_CONTAINER_DLL_insert (shc_head, shc_tail, shc); memmove (download_buffer, &download_buffer[msize], download_pos - msize); download_pos -= msize; } @@ -1735,7 +1752,14 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c, void GNUNET_HOSTLIST_client_stop () { + struct GNUNET_PEERSTORE_StoreHelloContext *pos; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Hostlist client shutdown\n"); + while (NULL != (pos = shc_head)) + { + GNUNET_CONTAINER_DLL_remove (shc_head, shc_tail, pos); + GNUNET_PEERSTORE_hello_add_cancel (pos); + } if (NULL != sget) { GNUNET_STATISTICS_get_cancel (sget); diff --git a/src/service/peerstore/peerstore_api.c b/src/service/peerstore/peerstore_api.c @@ -312,52 +312,6 @@ struct GNUNET_PEERSTORE_NotifyContext unsigned int canceled; }; -/** - * Context for a add hello uri request. - */ -struct GNUNET_PEERSTORE_StoreHelloContext -{ - /** - * Peerstore handle. - */ - struct GNUNET_PEERSTORE_Handle *h; - - /** - * Function to call with information. - */ - GNUNET_PEERSTORE_Continuation cont; - - /** - * Closure for @e callback. - */ - void *cont_cls; - - /** - * Map with all store contexts started during adding hello. - */ - struct GNUNET_CONTAINER_MultiPeerMap *store_context_map; - - /** - * Active watch to be notified about conflicting hello uri add requests. - */ - struct GNUNET_PEERSTORE_WatchContext *wc; - - /** - * Hello uri which was request for storing. - */ - struct GNUNET_MessageHeader *hello; - - /** - * The peer id for the hello. - */ - struct GNUNET_PeerIdentity *pid; - - /** - * Was this request successful. - */ - int success; -}; - /******************************************************************************/ /******************* DECLARATIONS *********************/ /******************************************************************************/ diff --git a/src/service/topology/gnunet-daemon-topology.c b/src/service/topology/gnunet-daemon-topology.c @@ -179,6 +179,16 @@ static unsigned int connection_count; static unsigned int target_connection_count; /** + * Head of the linkd list to store the store context for hellos. + */ +static struct GNUNET_PEERSTORE_StoreHelloContext *shc_head; + +/** + * Tail of the linkd list to store the store context for hellos. + */ +static struct GNUNET_PEERSTORE_StoreHelloContext *shc_tail; + +/** * Free all resources associated with the given peer. * * @param cls closure (not used) @@ -833,7 +843,14 @@ check_hello (void *cls, const struct GNUNET_MessageHeader *message) static void shc_cont (void *cls, int success) { - GNUNET_free (cls); + (void *) cls; + + if (GNUNET_YES == success) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Hello stored successfully!\n"); + else + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Error storing hello!\n"); } @@ -860,8 +877,8 @@ handle_hello (void *cls, const struct GNUNET_MessageHeader *message) 1, GNUNET_NO); GNUNET_HELLO_builder_from_msg (message); - // FIXME this is not working shc uninitialized - shc = GNUNET_PEERSTORE_hello_add (ps, message, &shc_cont, shc); + shc = GNUNET_PEERSTORE_hello_add (ps, message, &shc_cont, NULL); + GNUNET_CONTAINER_DLL_insert (shc_head, shc_tail, shc); GNUNET_HELLO_builder_free (builder); } @@ -875,6 +892,14 @@ handle_hello (void *cls, const struct GNUNET_MessageHeader *message) static void cleaning_task (void *cls) { + struct GNUNET_PEERSTORE_StoreHelloContext *pos; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Topology shutdown\n"); + while (NULL != (pos = shc_head)) + { + GNUNET_CONTAINER_DLL_remove (shc_head, shc_tail, pos); + GNUNET_PEERSTORE_hello_add_cancel (pos); + } if (NULL != peerstore_notify) { GNUNET_PEERSTORE_hello_changed_notify_cancel (peerstore_notify); diff --git a/src/service/transport/gnunet-service-transport.c b/src/service/transport/gnunet-service-transport.c @@ -77,7 +77,6 @@ #include "gnunet_statistics_service.h" #include "gnunet_transport_monitor_service.h" #include "gnunet_peerstore_service.h" -#include "gnunet_hello_lib.h" #include "gnunet_hello_uri_lib.h" #include "gnunet_signatures.h" #include "transport.h" diff --git a/src/service/transport/transport-testing-communicator.c b/src/service/transport/transport-testing-communicator.c @@ -29,7 +29,6 @@ #include "gnunet_protocols.h" #include "gnunet_constants.h" #include "transport-testing-communicator.h" -#include "gnunet_hello_lib.h" #include "gnunet_signatures.h" #include "transport.h" #include <inttypes.h> diff --git a/src/service/transport/transport-testing2.c b/src/service/transport/transport-testing2.c @@ -247,15 +247,6 @@ notify_connect (void *cls, } -/** - * Offer the current HELLO of P2 to P1. - * - * @param cls our `struct GNUNET_TRANSPORT_TESTING_ConnectRequest` - */ -static void -offer_hello (void *cls); - - static void notify_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer, @@ -318,9 +309,6 @@ notify_disconnect (void *cls, { cc->connected = GNUNET_NO; /* start trying to connect */ - if (NULL == cc->tct) - cc->tct = GNUNET_SCHEDULER_add_now (&offer_hello, - cc); if (NULL == cc->ah_sh) cc->ah_sh = GNUNET_TRANSPORT_application_suggest (cc->p1->ah, &p2->id, @@ -725,45 +713,6 @@ GNUNET_TRANSPORT_TESTING_stop_peer (struct }*/ -static void -offer_hello (void *cls) -{ - struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc = cls; - struct GNUNET_TRANSPORT_TESTING_PeerContext *p1 = cc->p1; - struct GNUNET_TRANSPORT_TESTING_PeerContext *p2 = cc->p2; - struct GNUNET_TIME_Absolute t; - enum GNUNET_NetworkType nt = 0; - char *addr; - - cc->tct = NULL; - { - char *p2_s = GNUNET_strdup (GNUNET_i2s (&p2->id)); - - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Asking peer %u (`%s') to connect peer %u (`%s'), providing HELLO with %s\n", - p1->no, - GNUNET_i2s (&p1->id), - p2->no, - p2_s, - p2->hello); - GNUNET_free (p2_s); - } - - addr = GNUNET_HELLO_extract_address (p2->hello, - p2->hello_size, - &p2->id, - &nt, - &t); - GNUNET_assert (NULL != addr); - GNUNET_assert (NULL != p1->hello); - GNUNET_TRANSPORT_application_validate (p1->ah, - &p2->id, - nt, - addr); - GNUNET_free (addr); -} - - /** * Initiate a connection from p1 to p2 by offering p1 p2's HELLO message * @@ -816,8 +765,6 @@ GNUNET_TRANSPORT_TESTING_connect_peers (struct GNUNET_CONTAINER_DLL_insert (tth->cc_head, tth->cc_tail, cc); - cc->tct = GNUNET_SCHEDULER_add_now (&offer_hello, - cc); cc->ah_sh = GNUNET_TRANSPORT_application_suggest (cc->p1->ah, &p2->id, GNUNET_MQ_PRIO_BEST_EFFORT, diff --git a/src/service/transport/transport-testing2.h b/src/service/transport/transport-testing2.h @@ -28,7 +28,6 @@ #define TRANSPORT_TESTING_H #include "platform.h" #include "gnunet_util_lib.h" -#include "gnunet_hello_lib.h" #include "gnunet_peerstore_service.h" #include "gnunet_transport_core_service.h" #include "gnunet_transport_application_service.h" diff --git a/src/service/transport/transport_api2_core.c b/src/service/transport/transport_api2_core.c @@ -27,7 +27,6 @@ #include "gnunet_util_lib.h" #include "gnunet_constants.h" #include "gnunet_arm_service.h" -#include "gnunet_hello_lib.h" #include "gnunet_protocols.h" #include "gnunet_transport_core_service.h" #include "transport.h" diff --git a/src/service/transport/transport_api_cmd_backchannel_check.c b/src/service/transport/transport_api_cmd_backchannel_check.c @@ -29,7 +29,6 @@ #include "gnunet_testing_ng_lib.h" #include "gnunet_testing_netjail_lib.h" #include "gnunet_transport_application_service.h" -#include "gnunet_hello_lib.h" #include "transport-testing-cmds.h" /** diff --git a/src/service/transport/transport_api_cmd_connecting_peers.c b/src/service/transport/transport_api_cmd_connecting_peers.c @@ -28,7 +28,6 @@ #include "gnunet_testing_ng_lib.h" #include "gnunet_testing_netjail_lib.h" #include "gnunet_transport_application_service.h" -#include "gnunet_hello_lib.h" #include "transport-testing-cmds.h" /**