diff options
Diffstat (limited to 'src/gns/gnunet-service-gns_resolver.h')
-rw-r--r-- | src/gns/gnunet-service-gns_resolver.h | 356 |
1 files changed, 356 insertions, 0 deletions
diff --git a/src/gns/gnunet-service-gns_resolver.h b/src/gns/gnunet-service-gns_resolver.h new file mode 100644 index 0000000..8222397 --- /dev/null +++ b/src/gns/gnunet-service-gns_resolver.h @@ -0,0 +1,356 @@ +#ifndef GNS_RESOLVER_H +#define GNS_RESOLVER_H + +#include "gns.h" +#include "gnunet_dht_service.h" + +#define DHT_OPERATION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60) +#define GNUNET_GNS_DEFAULT_LOOKUP_TIMEOUT \ + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10) +#define DHT_LOOKUP_TIMEOUT DHT_OPERATION_TIMEOUT +#define DHT_GNS_REPLICATION_LEVEL 5 + +#define GNUNET_GNS_MAX_PARALLEL_LOOKUPS 500 + +/* + * DLL to hold the authority chain + * we had to pass in the resolution process + */ +struct AuthorityChain +{ + struct AuthorityChain *prev; + + struct AuthorityChain *next; + + /* the zone hash of the authority */ + struct GNUNET_CRYPTO_ShortHashCode zone; + + /* (local) name of the authority */ + char name[MAX_DNS_LABEL_LENGTH]; + + /* was the ns entry fresh */ + int fresh; +}; + +/* handle to a resolution process */ +struct ResolverHandle; + +/** + * continuation called when cleanup of resolver finishes + */ +typedef void (*ResolverCleanupContinuation) (void); + +/** + * processor for a record lookup result + * + * @param cls the closure + * @param rd_count number of results + * @param rd result data + */ +typedef void (*RecordLookupProcessor) (void *cls, + uint32_t rd_count, + const struct GNUNET_NAMESTORE_RecordData *rd); + + +/** + * processor for a shorten result + * + * @param cls the closure + * @param name shortened name + */ +typedef void (*ShortenResultProcessor) (void *cls, const char* name); + + +/** + * processor for an authority result + * + * @param cls the closure + * @param name name + */ +typedef void (*GetAuthorityResultProcessor) (void *cls, const char* name); + +/** + * processor for a resolution result + * + * @param cls the closure + * @param rh the resolution handle + * @param rd_count number of results + * @param rd result data + */ +typedef void (*ResolutionResultProcessor) (void *cls, + struct ResolverHandle *rh, + uint32_t rd_count, + const struct GNUNET_NAMESTORE_RecordData *rd); + + +/** + * Resolution status indicator + * RSL_RECORD_EXISTS: the name to lookup exists + * RSL_RECORD_EXPIRED: the name in the record expired + * RSL_TIMED_OUT: resolution timed out + */ +enum ResolutionStatus +{ + RSL_RECORD_EXISTS = 1, + RSL_RECORD_EXPIRED = 2, + RSL_TIMED_OUT = 4 +}; + +/** + * Handle to a currenty pending resolution + * a ResolverHandle is passed to, for example + * resolve_record_ns to resolve a record in the namestore. + * On result (positive or negative) the ResolutionResultProcessor + * is called. + * If a timeout is set timeout_cont will be called. + * If no timeout is set (ie timeout forever) then background resolutions + * might be triggered. + */ +struct ResolverHandle +{ + /* The name to resolve */ + char name[MAX_DNS_NAME_LENGTH]; + + /* has this query been answered? how many matches */ + int answered; + + /* the authoritative zone to query */ + struct GNUNET_CRYPTO_ShortHashCode authority; + + /* the name of the authoritative zone to query */ + char authority_name[MAX_DNS_LABEL_LENGTH]; + + /* a handle for dht lookups. should be NULL if no lookups are in progress */ + struct GNUNET_DHT_GetHandle *get_handle; + + /* timeout set for this lookup task */ + struct GNUNET_TIME_Relative timeout; + + /* timeout task for the lookup */ + GNUNET_SCHEDULER_TaskIdentifier timeout_task; + + /* continuation to call on timeout */ + GNUNET_SCHEDULER_Task timeout_cont; + + /* closure for timeout cont */ + void* timeout_cont_cls; + + /* called when resolution phase finishes */ + ResolutionResultProcessor proc; + + /* closure passed to proc */ + void* proc_cls; + + /* DLL to store the authority chain */ + struct AuthorityChain *authority_chain_head; + + /* DLL to store the authority chain */ + struct AuthorityChain *authority_chain_tail; + + /* status of the resolution result */ + enum ResolutionStatus status; + + /* The provate local zone of this request */ + struct GNUNET_CRYPTO_ShortHashCode private_local_zone; + + /** + * private key of an/our authoritative zone + * can be NULL but automatical PKEY import will not work + */ + struct GNUNET_CRYPTO_RsaPrivateKey *priv_key; + + /** + * the heap node associated with this lookup, null if timeout is set + * used for DHT background lookups. + */ + struct GNUNET_CONTAINER_HeapNode *dht_heap_node; + + /** + * Id for resolution process + */ + unsigned long long id; + +}; + + +/** + * Handle to a record lookup + */ +struct RecordLookupHandle +{ + /* the record type to look up */ + enum GNUNET_GNS_RecordType record_type; + + /* the name to look up */ + char name[MAX_DNS_NAME_LENGTH]; + + /* Method to call on record resolution result */ + RecordLookupProcessor proc; + + /* closure to pass to proc */ + void* proc_cls; + +}; + + +/** + * Handle to a shorten context + */ +struct NameShortenHandle +{ + /* Method to call on shorten result */ + ShortenResultProcessor proc; + + /* closure to pass to proc */ + void* proc_cls; +}; + +/** + * Handle to a get authority context + */ +struct GetNameAuthorityHandle +{ + /* the name to look up authority for */ + char name[MAX_DNS_NAME_LENGTH]; + + /* Method to call on result */ + GetAuthorityResultProcessor proc; + + /* closure to pass to proc */ + void* proc_cls; +}; + +/** + * Handle to a pseu lookup + */ +struct GetPseuAuthorityHandle +{ + /* the name given from delegation */ + char name[MAX_DNS_LABEL_LENGTH]; + + /* name to store the pseu under */ + char new_name[MAX_DNS_LABEL_LENGTH]; + + /* the zone of discovered authority */ + struct GNUNET_CRYPTO_ShortHashCode new_zone; + + /* the zone of our authority */ + struct GNUNET_CRYPTO_ShortHashCode zone; + + /* the private key of the zone to store the pseu in */ + struct GNUNET_CRYPTO_RsaPrivateKey *key; + + /* a handle for dht lookups. should be NULL if no lookups are in progress */ + struct GNUNET_DHT_GetHandle *get_handle; + + /* timeout task for lookup */ + GNUNET_SCHEDULER_TaskIdentifier timeout; +}; + +/** + * Initialize the resolver + * MUST be called before other gns_resolver_* methods + * + * @param nh handle to the namestore + * @param dh handle to the dht + * @param lz the local zone + * @param max_bg_queries maximum amount of background queries + * @param ignore_pending ignore records that still require user confirmation + * on lookup + * @returns GNUNET_OK on success + */ +int +gns_resolver_init(struct GNUNET_NAMESTORE_Handle *nh, + struct GNUNET_DHT_Handle *dh, + struct GNUNET_CRYPTO_ShortHashCode lz, + unsigned long long max_bg_queries, + int ignore_pending); + +/** + * Cleanup resolver: Terminate pending lookups + * + * @param cont continuation to call when finished + */ +void +gns_resolver_cleanup(ResolverCleanupContinuation cont); + +/** + * Lookup of a record in a specific zone + * calls RecordLookupProcessor on result or timeout + * + * @param zone the root zone + * @param pzone the private local zone + * @param record_type the record type to look up + * @param name the name to look up + * @param key optional private key for authority caching + * @param timeout timeout for the resolution + * @param proc the processor to call + * @param cls the closure to pass to proc + */ +void +gns_resolver_lookup_record(struct GNUNET_CRYPTO_ShortHashCode zone, + struct GNUNET_CRYPTO_ShortHashCode pzone, + uint32_t record_type, + const char* name, + struct GNUNET_CRYPTO_RsaPrivateKey *key, + struct GNUNET_TIME_Relative timeout, + RecordLookupProcessor proc, + void* cls); + +/** + * Shortens a name if possible. If the shortening fails + * name will be returned as shortened string. Else + * a shorter version of the name will be returned. + * There is no guarantee that the shortened name will + * actually be canonical/short etc. + * + * @param zone the zone to perform the operation in + * @param pzone the private local zone + * @param name name to shorten + * @param key optional private key for background lookups and PSEU import + * @param proc the processor to call on shorten result + * @param proc_cls the closure to pass to proc + */ +void +gns_resolver_shorten_name(struct GNUNET_CRYPTO_ShortHashCode zone, + struct GNUNET_CRYPTO_ShortHashCode pzone, + const char* name, + struct GNUNET_CRYPTO_RsaPrivateKey *key, + ShortenResultProcessor proc, + void* proc_cls); + +/** + * Tries to resolve the authority for name + * in our namestore + * + * @param zone the root zone to look up for + * @param pzone the private local zone + * @param name the name to lookup up + * @param proc the processor to call when finished + * @param proc_cls the closure to pass to the processor + */ +void +gns_resolver_get_authority(struct GNUNET_CRYPTO_ShortHashCode zone, + struct GNUNET_CRYPTO_ShortHashCode pzone, + const char* name, + GetAuthorityResultProcessor proc, + void* proc_cls); + +/** + * Generic function to check for TLDs + * + * @param name the name to check + * @param tld the tld to check + * @return GNUNET_YES or GNUNET_NO + */ +int +is_tld(const char* name, const char* tld); + +/** + * Checks for gnunet/zkey + */ +#define is_gnunet_tld(name) is_tld(name, GNUNET_GNS_TLD) +#define is_zkey_tld(name) is_tld(name, GNUNET_GNS_TLD_ZKEY) + + +#endif |