tor  master
directory.h
Go to the documentation of this file.
1 /* Copyright (c) 2001 Matej Pfajfar.
2  * Copyright (c) 2001-2004, Roger Dingledine.
3  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4  * Copyright (c) 2007-2017, The Tor Project, Inc. */
5 /* See LICENSE for licensing information */
6 
12 #ifndef TOR_DIRECTORY_H
13 #define TOR_DIRECTORY_H
14 
15 #include "hs_ident.h"
16 
18 void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
19  dirinfo_type_t type, const char *payload,
20  size_t payload_len, size_t extrainfo_len);
21 MOCK_DECL(void, directory_get_from_dirserver, (
22  uint8_t dir_purpose,
23  uint8_t router_purpose,
24  const char *resource,
25  int pds_flags,
26  download_want_authority_t want_authority));
27 void directory_get_from_all_authorities(uint8_t dir_purpose,
28  uint8_t router_purpose,
29  const char *resource);
30 
32 typedef enum {
43 
44 int directory_must_use_begindir(const or_options_t *options);
45 
53 directory_request_t *directory_request_new(uint8_t dir_purpose);
55 #define directory_request_free(req) \
56  FREE_AND_NULL(directory_request_t, directory_request_free_, (req))
58  const tor_addr_port_t *p);
60  const tor_addr_port_t *p);
62  const char *digest);
64  struct circuit_guard_state_t *state);
66  uint8_t router_purpose);
68  dir_indirection_t indirection);
70  const char *resource);
72  const char *payload,
73  size_t payload_len);
75  time_t if_modified_since);
77  const rend_data_t *query);
79  const hs_ident_dir_conn_t *ident);
81  const hs_ident_dir_conn_t *ident);
82 
84  const routerstatus_t *rs);
86  const char *key,
87  const char *val);
88 MOCK_DECL(void, directory_initiate_request, (directory_request_t *request));
89 
90 int parse_http_response(const char *headers, int *code, time_t *date,
91  compress_method_t *compression, char **response);
92 int parse_http_command(const char *headers,
93  char **command_out, char **url_out);
94 char *http_get_header(const char *headers, const char *which);
95 
102 
103 #define DSR_HEX (1<<0)
104 #define DSR_BASE64 (1<<1)
105 #define DSR_DIGEST256 (1<<2)
106 #define DSR_SORT_UNIQ (1<<3)
107 int dir_split_resource_into_fingerprints(const char *resource,
108  smartlist_t *fp_out, int *compressed_out,
109  int flags);
110 enum dir_spool_source_t;
111 int dir_split_resource_into_spoolable(const char *resource,
112  enum dir_spool_source_t source,
113  smartlist_t *spool_out,
114  int *compressed_out,
115  int flags);
117  smartlist_t *pairs_out);
118 char *directory_dump_request_log(void);
119 void note_request(const char *key, size_t bytes);
120 int router_supports_extrainfo(const char *identity_digest, int is_authority);
121 
123  int status_code, const char *item,
124  int server, time_t now);
126  const char *item, time_t now);
129 #define download_status_failed(dls, sc) \
130  download_status_increment_failure((dls), (sc), NULL, \
131  dir_server_mode(get_options()), \
132  time(NULL))
133 
135 static int download_status_is_ready(download_status_t *dls, time_t now);
137 
140 static inline int
141 download_status_is_ready(download_status_t *dls, time_t now)
142 {
143  /* dls wasn't reset before it was used */
144  if (dls->next_attempt_at == 0) {
146  }
147 
148  return download_status_get_next_attempt_at(dls) <= now;
149 }
150 
151 static void download_status_mark_impossible(download_status_t *dl);
153 static inline void
154 download_status_mark_impossible(download_status_t *dl)
155 {
158 }
159 
162 
163 int purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose,
164  const char *resource);
165 
166 #ifdef DIRECTORY_PRIVATE
167 
170 typedef struct response_handler_args_t {
171  int status_code;
172  const char *reason;
173  const char *body;
174  size_t body_len;
175  const char *headers;
176 } response_handler_args_t;
177 
178 struct directory_request_t {
184  tor_addr_port_t or_addr_port;
185  tor_addr_port_t dir_addr_port;
186  char digest[DIGEST_LEN];
187 
188  const routerstatus_t *routerstatus;
193  uint8_t dir_purpose;
196  uint8_t router_purpose;
199  dir_indirection_t indirection;
201  const char *resource;
203  const char *payload;
205  size_t payload_len;
207  time_t if_modified_since;
209  const rend_data_t *rend_query;
211  config_line_t *additional_headers;
213  const hs_ident_dir_conn_t *hs_ident;
217  struct circuit_guard_state_t *guard_state;
218 };
219 
220 struct get_handler_args_t;
222  const struct get_handler_args_t *args);
224 STATIC char *accept_encoding_header(void);
227 
229  const response_handler_args_t *args);
231  const response_handler_args_t *args);
232 
234  const response_handler_args_t *args);
235 
236 #endif /* defined(DIRECTORY_PRIVATE) */
237 
238 #ifdef TOR_UNIT_TESTS
239 /* Used only by test_dir.c and test_hs_cache.c */
240 
241 STATIC int parse_http_url(const char *headers, char **url);
242 STATIC dirinfo_type_t dir_fetch_type(int dir_purpose, int router_purpose,
243  const char *resource);
244 MOCK_DECL(STATIC int, directory_handle_command_get,(dir_connection_t *conn,
245  const char *headers,
246  const char *req_body,
247  size_t req_body_len));
248 MOCK_DECL(STATIC int, directory_handle_command_post,(dir_connection_t *conn,
249  const char *headers,
250  const char *body,
251  size_t body_len));
253  int min_delay,
254  time_t now);
255 
256 STATIC int handle_post_hs_descriptor(const char *url, const char *body);
257 
258 STATIC char* authdir_type_to_string(dirinfo_type_t auth);
259 STATIC const char * dir_conn_purpose_to_string(int purpose);
260 STATIC int should_use_directory_guards(const or_options_t *options);
261 STATIC compression_level_t choose_compression_level(ssize_t n_bytes);
262 STATIC int find_dl_min_delay(const download_status_t *dls,
263  const or_options_t *options);
264 
265 STATIC int next_random_exponential_delay(int delay,
266  int base_delay);
267 
268 STATIC void next_random_exponential_delay_range(int *low_bound_out,
269  int *high_bound_out,
270  int delay,
271  int base_delay);
272 
273 STATIC int parse_hs_version_from_post(const char *url, const char *prefix,
274  const char **end_pos);
275 
276 STATIC unsigned parse_accept_encoding_header(const char *h);
277 #endif /* defined(TOR_UNIT_TESTS) */
278 
279 #if defined(TOR_UNIT_TESTS) || defined(DIRECTORY_PRIVATE)
280 /* Used only by directory.c and test_dir.c */
281 
282 /* no more than quadruple the previous delay (multiplier + 1) */
283 #define DIR_DEFAULT_RANDOM_MULTIPLIER (3)
284 /* no more than triple the previous delay */
285 #define DIR_TEST_NET_RANDOM_MULTIPLIER (2)
286 
287 #endif /* defined(TOR_UNIT_TESTS) || defined(DIRECTORY_PRIVATE) */
288 
289 #endif /* !defined(TOR_DIRECTORY_H) */
290 
Definition: or.h:842
Definition: confline.h:23
dir_indirection_t
Definition: directory.h:32
Definition: or.h:3657
const char * headers
Definition: directory.c:3743
#define DIGEST_LEN
Definition: crypto_digest.h:22
time_t download_status_get_next_attempt_at(const download_status_t *dls)
Definition: directory.c:5634
Definition: directory.h:37
void directory_request_set_payload(directory_request_t *req, const char *payload, size_t payload_len)
Definition: directory.c:1195
int connection_dir_reached_eof(dir_connection_t *conn)
Definition: directory.c:3350
STATIC void next_random_exponential_delay_range(int *low_bound_out, int *high_bound_out, int delay, int base_delay)
Definition: directory.c:5337
void download_status_reset(download_status_t *dls)
Definition: directory.c:5601
download_want_authority_t
Definition: or.h:2064
void connection_dir_about_to_close(dir_connection_t *dir_conn)
Definition: directory.c:3449
Definition: hs_ident.h:93
STATIC int find_dl_min_delay(const download_status_t *dls, const or_options_t *options)
Definition: directory.c:5269
STATIC char * accept_encoding_header(void)
Definition: directory.c:3644
int dir_split_resource_into_fingerprint_pairs(const char *res, smartlist_t *pairs_out)
Definition: directory.c:5746
int connection_dir_finished_flushing(dir_connection_t *conn)
Definition: directory.c:5175
STATIC int directory_handle_command(dir_connection_t *conn)
Definition: directory.c:5127
time_t download_status_increment_attempt(download_status_t *dls, const char *item, time_t now)
Definition: directory.c:5546
void directory_request_set_if_modified_since(directory_request_t *req, time_t if_modified_since)
Definition: directory.c:1209
void directory_request_set_router_purpose(directory_request_t *req, uint8_t router_purpose)
Definition: directory.c:1155
Definition: directory.c:3733
#define IMPOSSIBLE_TO_DOWNLOAD
Definition: or.h:2136
uint8_t n_download_attempts
Definition: or.h:2112
MOCK_DECL(int, router_have_minimum_dir_info,(void))
void directory_request_set_indirection(directory_request_t *req, dir_indirection_t indirection)
Definition: directory.c:1171
STATIC void warn_disallowed_anonymous_compression_method(compress_method_t method)
Definition: directory.c:4155
Definition: container.h:18
STATIC compression_level_t choose_compression_level(ssize_t n_bytes)
Definition: directory.c:3717
dirinfo_type_t
Definition: or.h:2879
STATIC int should_use_directory_guards(const or_options_t *options)
Definition: directory.c:446
Definition: address.h:68
int parse_http_command(const char *headers, char **command_out, char **url_out)
Definition: directory.c:1953
directory_request_t * directory_request_new(uint8_t dir_purpose)
Definition: directory.c:1087
Definition: directory.h:35
void directory_request_set_dir_addr_port(directory_request_t *req, const tor_addr_port_t *p)
Definition: directory.c:1133
int purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose, const char *resource)
Definition: directory.c:161
int connection_dir_process_inbuf(dir_connection_t *conn)
Definition: directory.c:3380
const char * url
Definition: directory.c:3741
dir_spool_source_t
Definition: dirserv.h:36
void directory_request_set_routerstatus(directory_request_t *req, const routerstatus_t *rs)
Definition: directory.c:1301
STATIC int download_status_schedule_get_delay(download_status_t *dls, int min_delay, time_t now)
Definition: directory.c:5391
void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, dirinfo_type_t type, const char *payload, size_t payload_len, size_t extrainfo_len)
Definition: directory.c:366
void directory_get_from_all_authorities(uint8_t dir_purpose, uint8_t router_purpose, const char *resource)
Definition: directory.c:718
time_t next_attempt_at
Definition: or.h:2108
Header file containing circuit and connection identifier data for the whole HS subsytem.
void directory_request_set_resource(directory_request_t *req, const char *resource)
Definition: directory.c:1184
STATIC int handle_get_hs_descriptor_v3(dir_connection_t *conn, const get_handler_args_t *args)
Definition: directory.c:4820
void directory_request_set_rend_query(directory_request_t *req, const rend_data_t *query)
Definition: directory.c:1235
int parse_http_response(const char *headers, int *code, time_t *date, compress_method_t *compression, char **response)
Definition: directory.c:2069
STATIC int handle_response_fetch_consensus(dir_connection_t *conn, const response_handler_args_t *args)
Definition: directory.c:2549
STATIC int next_random_exponential_delay(int delay, int base_delay)
Definition: directory.c:5367
int directories_have_accepted_server_descriptor(void)
Definition: directory.c:335
void directory_request_add_header(directory_request_t *req, const char *key, const char *val)
Definition: directory.c:1223
int dir_split_resource_into_fingerprints(const char *resource, smartlist_t *fp_out, int *compressed_out, int flags)
Definition: directory.c:5805
Definition: or.h:2107
char * http_get_header(const char *headers, const char *which)
Definition: directory.c:2007
void directory_request_free_(directory_request_t *req)
Definition: directory.c:1109
void directory_request_set_directory_id_digest(directory_request_t *req, const char *digest)
Definition: directory.c:1143
STATIC const char * dir_conn_purpose_to_string(int purpose)
Definition: directory.c:230
Definition: or.h:1833
int download_status_get_n_attempts(const download_status_t *dls)
Definition: directory.c:5627
int dir_split_resource_into_spoolable(const char *resource, enum dir_spool_source_t source, smartlist_t *spool_out, int *compressed_out, int flags)
Definition: directory.c:5887
int download_status_get_n_failures(const download_status_t *dls)
Definition: directory.c:5618
STATIC unsigned parse_accept_encoding_header(const char *h)
Definition: directory.c:3610
uint8_t n_download_failures
Definition: or.h:2110
int connection_dir_finished_connecting(dir_connection_t *conn)
Definition: directory.c:5247
STATIC int handle_response_fetch_hsdesc_v3(dir_connection_t *conn, const response_handler_args_t *args)
Definition: directory.c:3080
Definition: directory.h:39
compression_level_t
Definition: compress.h:32
Definition: directory.h:41
STATIC int allowed_anonymous_connection_compression_method(compress_method_t method)
Definition: directory.c:4133
compress_method_t
Definition: compress.h:18
int connection_dir_is_encrypted(const dir_connection_t *conn)
Definition: directory.c:1580
void directory_request_fetch_set_hs_ident(directory_request_t *req, const hs_ident_dir_conn_t *ident)
Definition: directory.c:1264
STATIC int handle_response_fetch_microdesc(dir_connection_t *conn, const response_handler_args_t *args)
Definition: directory.c:2880
void directory_request_upload_set_hs_ident(directory_request_t *req, const hs_ident_dir_conn_t *ident)
Definition: directory.c:1250
Definition: or.h:2344
struct directory_request_t directory_request_t
Definition: directory.h:52
void directory_request_set_guard_state(directory_request_t *req, struct circuit_guard_state_t *state)
Definition: directory.c:1276
time_t download_status_increment_failure(download_status_t *dls, int status_code, const char *item, int server, time_t now)
Definition: directory.c:5487
STATIC char * authdir_type_to_string(dirinfo_type_t auth)
Definition: directory.c:211
int router_supports_extrainfo(const char *identity_digest, int is_authority)
Definition: directory.c:312
STATIC int parse_http_url(const char *headers, char **url)
Definition: directory.c:1930
STATIC dirinfo_type_t dir_fetch_type(int dir_purpose, int router_purpose, const char *resource)
Definition: directory.c:270
void directory_request_set_or_addr_port(directory_request_t *req, const tor_addr_port_t *p)
Definition: directory.c:1122