mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-28 14:23:30 +01:00
prop224: Introduce v2/v3 HS desc fetch retry functionality.
Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
parent
776e796d96
commit
ebacf4dd6e
@ -25,6 +25,7 @@
|
||||
#include "geoip.h"
|
||||
#include "hs_cache.h"
|
||||
#include "hs_common.h"
|
||||
#include "hs_client.h"
|
||||
#include "main.h"
|
||||
#include "microdesc.h"
|
||||
#include "networkstatus.h"
|
||||
@ -3345,6 +3346,33 @@ connection_dir_process_inbuf(dir_connection_t *conn)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** We are closing a dir connection: If <b>dir_conn</b> is a dir connection
|
||||
* that tried to fetch an HS descriptor, check if it successfuly fetched it,
|
||||
* or if we need to try again. */
|
||||
static void
|
||||
refetch_hsdesc_if_needed(dir_connection_t *dir_conn)
|
||||
{
|
||||
connection_t *conn = TO_CONN(dir_conn);
|
||||
|
||||
/* If we were trying to fetch a v2 rend desc and did not succeed,
|
||||
* retry as needed. (If a fetch is successful, the connection state
|
||||
* is changed to DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2 to mark that
|
||||
* refetching is unnecessary.) */
|
||||
if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 &&
|
||||
dir_conn->rend_data &&
|
||||
rend_valid_v2_service_id(
|
||||
rend_data_get_address(dir_conn->rend_data))) {
|
||||
rend_client_refetch_v2_renddesc(dir_conn->rend_data);
|
||||
}
|
||||
|
||||
/* Check for v3 rend desc fetch */
|
||||
if (conn->purpose == DIR_PURPOSE_FETCH_HSDESC &&
|
||||
dir_conn->hs_ident &&
|
||||
!ed25519_public_key_is_zero(&dir_conn->hs_ident->identity_pk)) {
|
||||
hs_client_refetch_hsdesc(&dir_conn->hs_ident->identity_pk);
|
||||
}
|
||||
}
|
||||
|
||||
/** Called when we're about to finally unlink and free a directory connection:
|
||||
* perform necessary accounting and cleanup */
|
||||
void
|
||||
@ -3357,15 +3385,8 @@ connection_dir_about_to_close(dir_connection_t *dir_conn)
|
||||
* failed: forget about this router, and maybe try again. */
|
||||
connection_dir_request_failed(dir_conn);
|
||||
}
|
||||
/* If we were trying to fetch a v2 rend desc and did not succeed,
|
||||
* retry as needed. (If a fetch is successful, the connection state
|
||||
* is changed to DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2 to mark that
|
||||
* refetching is unnecessary.) */
|
||||
if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 &&
|
||||
dir_conn->rend_data &&
|
||||
strlen(rend_data_get_address(dir_conn->rend_data)) ==
|
||||
REND_SERVICE_ID_LEN_BASE32)
|
||||
rend_client_refetch_v2_renddesc(dir_conn->rend_data);
|
||||
|
||||
refetch_hsdesc_if_needed(dir_conn);
|
||||
}
|
||||
|
||||
/** Create an http response for the client <b>conn</b> out of
|
||||
|
Loading…
Reference in New Issue
Block a user