commit 419c0c07881c71050546c1049173a7eadf936799 Author: David Goulet dgoulet@torproject.org Date: Thu Dec 22 16:40:21 2016 -0500
hs: Move service check private dir to hs_common.c
Another building blocks for prop224 service work. This also makes the function takes specific argument instead of the or_option_t object.
Signed-off-by: David Goulet dgoulet@torproject.org --- src/or/hs_common.c | 34 ++++++++++++++++++++++++++++++++++ src/or/hs_common.h | 4 ++++ src/or/rendservice.c | 35 ++++------------------------------- 3 files changed, 42 insertions(+), 31 deletions(-)
diff --git a/src/or/hs_common.c b/src/or/hs_common.c index 7e0b6ca..4af3081 100644 --- a/src/or/hs_common.c +++ b/src/or/hs_common.c @@ -16,6 +16,40 @@ #include "hs_common.h" #include "rendcommon.h"
+/* Make sure that the directory for <b>service</b> is private, using the config + * <b>username</b>. + * If <b>create</b> is true: + * - if the directory exists, change permissions if needed, + * - if the directory does not exist, create it with the correct permissions. + * If <b>create</b> is false: + * - if the directory exists, check permissions, + * - if the directory does not exist, check if we think we can create it. + * Return 0 on success, -1 on failure. */ +int +hs_check_service_private_dir(const char *username, const char *path, + unsigned int dir_group_readable, + unsigned int create) +{ + cpd_check_t check_opts = CPD_NONE; + + tor_assert(path); + + if (create) { + check_opts |= CPD_CREATE; + } else { + check_opts |= CPD_CHECK_MODE_ONLY; + check_opts |= CPD_CHECK; + } + if (dir_group_readable) { + check_opts |= CPD_GROUP_READ; + } + /* Check/create directory */ + if (check_private_dir(path, check_opts, username) < 0) { + return -1; + } + return 0; +} + /* Create a new rend_data_t for a specific given <b>version</b>. * Return a pointer to the newly allocated data structure. */ static rend_data_t * diff --git a/src/or/hs_common.h b/src/or/hs_common.h index 7ac2a15..890797c 100644 --- a/src/or/hs_common.h +++ b/src/or/hs_common.h @@ -23,6 +23,10 @@ /* String prefix for the signature of ESTABLISH_INTRO */ #define ESTABLISH_INTRO_SIG_PREFIX "Tor establish-intro cell v1"
+int hs_check_service_private_dir(const char *username, const char *path, + unsigned int dir_group_readable, + unsigned int create); + void rend_data_free(rend_data_t *data); rend_data_t *rend_data_dup(const rend_data_t *data); rend_data_t *rend_data_client_create(const char *onion_address, diff --git a/src/or/rendservice.c b/src/or/rendservice.c index ac231c2..6b40ed9 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -76,9 +76,6 @@ static ssize_t rend_service_parse_intro_for_v3( static int rend_service_check_private_dir(const or_options_t *options, const rend_service_t *s, int create); -static int rend_service_check_private_dir_impl(const or_options_t *options, - const rend_service_t *s, - int create); static const smartlist_t* rend_get_service_list( const smartlist_t* substitute_service_list); static smartlist_t* rend_get_service_list_mutable( @@ -1294,7 +1291,8 @@ poison_new_single_onion_hidden_service_dir_impl(const rend_service_t *service, }
/* Make sure the directory was created before calling this function. */ - if (BUG(rend_service_check_private_dir_impl(options, service, 0) < 0)) + if (BUG(hs_check_service_private_dir(options->User, service->directory, + service->dir_group_readable, 0) < 0)) return -1;
poison_fname = rend_service_sos_poison_path(service); @@ -1444,32 +1442,6 @@ rend_service_derive_key_digests(struct rend_service_t *s) return 0; }
-/* Implements the directory check from rend_service_check_private_dir, - * without doing the single onion poison checks. */ -static int -rend_service_check_private_dir_impl(const or_options_t *options, - const rend_service_t *s, - int create) -{ - cpd_check_t check_opts = CPD_NONE; - if (create) { - check_opts |= CPD_CREATE; - } else { - check_opts |= CPD_CHECK_MODE_ONLY; - check_opts |= CPD_CHECK; - } - if (s->dir_group_readable) { - check_opts |= CPD_GROUP_READ; - } - /* Check/create directory */ - if (check_private_dir(s->directory, check_opts, options->User) < 0) { - log_warn(LD_REND, "Checking service directory %s failed.", s->directory); - return -1; - } - - return 0; -} - /** Make sure that the directory for <b>s</b> is private, using the config in * <b>options</b>. * If <b>create</b> is true: @@ -1490,7 +1462,8 @@ rend_service_check_private_dir(const or_options_t *options, }
/* Check/create directory */ - if (rend_service_check_private_dir_impl(options, s, create) < 0) { + if (hs_check_service_private_dir(options->User, s->directory, + s->dir_group_readable, create) < 0) { return -1; }
tor-commits@lists.torproject.org