summaryrefslogtreecommitdiff
path: root/src/or/rendservice.c
diff options
context:
space:
mode:
authormeejah <meejah@meejah.ca>2014-08-30 15:14:51 -0600
committermeejah <meejah@meejah.ca>2014-08-30 15:23:05 -0600
commit7caf7e9f2a26dfb425dab761b4b41a38d96db0af (patch)
treec30814ed954581202cd70969a3eb36c9cf1b390b /src/or/rendservice.c
parentae18c0812e917ae4d3352ef7e537c7ab8a396f36 (diff)
downloadtor-7caf7e9f2a26dfb425dab761b4b41a38d96db0af.tar.gz
tor-7caf7e9f2a26dfb425dab761b4b41a38d96db0af.zip
Make HiddenServiceDirGroupReadable per-hidden-service
Diffstat (limited to 'src/or/rendservice.c')
-rw-r--r--src/or/rendservice.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/or/rendservice.c b/src/or/rendservice.c
index 456b548715..a1d572e1ac 100644
--- a/src/or/rendservice.c
+++ b/src/or/rendservice.c
@@ -95,6 +95,7 @@ typedef struct rend_service_port_config_t {
typedef struct rend_service_t {
/* Fields specified in config file */
char *directory; /**< where in the filesystem it stores it */
+ int dir_group_readable; /**< if 1, allow group read permissions on directory */
smartlist_t *ports; /**< List of rend_service_port_config_t */
rend_auth_type_t auth_type; /**< Client authorization type or 0 if no client
* authorization is performed. */
@@ -359,6 +360,7 @@ rend_config_services(const or_options_t *options, int validate_only)
rend_service_t *service = NULL;
rend_service_port_config_t *portcfg;
smartlist_t *old_service_list = NULL;
+ int ok = 0;
if (!validate_only) {
old_service_list = rend_service_list;
@@ -393,6 +395,15 @@ rend_config_services(const or_options_t *options, int validate_only)
return -1;
}
smartlist_add(service->ports, portcfg);
+ } else if (!strcasecmp(line->key, "HiddenServiceDirGroupReadable")) {
+ service->dir_group_readable = (int)tor_parse_long(line->value, 10, 0, 1, &ok, NULL);
+ if (!ok) {
+ log_warn(LD_CONFIG, "HiddenServiceDirGroupReadable should be 0 or 1, not %s",
+ line->value);
+ rend_service_free(service);
+ return -1;
+ }
+ log_info(LD_CONFIG, "HiddenServiceDirGroupReadable=%d for %s", service->dir_group_readable, service->directory);
} else if (!strcasecmp(line->key, "HiddenServiceAuthorizeClient")) {
/* Parse auth type and comma-separated list of client names and add a
* rend_authorized_client_t for each client to the service's list
@@ -696,7 +707,7 @@ rend_service_load_keys(rend_service_t *s)
char buf[128];
cpd_check_t check_opts = CPD_CREATE;
- if (get_options()->HiddenServiceDirGroupReadable) {
+ if (s->dir_group_readable) {
check_opts |= CPD_GROUP_READ;
}
/* Check/create directory */
@@ -704,7 +715,7 @@ rend_service_load_keys(rend_service_t *s)
return -1;
}
#ifndef _WIN32
- if (get_options()->HiddenServiceDirGroupReadable) {
+ if (s->dir_group_readable) {
/* Only new dirs created get new opts, also enforce group read. */
if (chmod(s->directory, 0750)) {
log_warn(LD_FS,"Unable to make %s group-readable.", s->directory);
@@ -748,7 +759,7 @@ rend_service_load_keys(rend_service_t *s)
return -1;
}
#ifndef _WIN32
- if (get_options()->HiddenServiceDirGroupReadable) {
+ if (s->dir_group_readable) {
/* Also verify hostname file created with group read. */
if (chmod(fname, 0640)) {
log_warn(LD_FS,"Unable to make hidden hostname file %s group-readable.", fname);