|
@@ -419,7 +419,7 @@ config_generic_service(const config_line_t *line_,
|
|
|
dup_opt_seen = line->key;
|
|
|
goto err;
|
|
|
}
|
|
|
- have_version = 1;
|
|
|
+ have_version = service->config.hs_version_explicitly_set = 1;
|
|
|
continue;
|
|
|
}
|
|
|
|
|
@@ -534,18 +534,15 @@ config_service(const config_line_t *line, const or_options_t *options,
|
|
|
|
|
|
|
|
|
service = hs_service_new(options);
|
|
|
+
|
|
|
|
|
|
* specific function according to the configured version number. */
|
|
|
if (config_generic_service(line, options, service) < 0) {
|
|
|
goto err;
|
|
|
}
|
|
|
+
|
|
|
tor_assert(service->config.version <= HS_VERSION_MAX);
|
|
|
-
|
|
|
- * sure that this set of options for a service are valid that is for
|
|
|
- * instance an option only for v2 is not used for v3. */
|
|
|
- if (config_has_invalid_options(line->next, service)) {
|
|
|
- goto err;
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
* be done regardless of the service version. Do not ask for the directory
|
|
|
* to be created, this is done when the keys are loaded because we could be
|
|
@@ -556,11 +553,19 @@ config_service(const config_line_t *line, const or_options_t *options,
|
|
|
0) < 0) {
|
|
|
goto err;
|
|
|
}
|
|
|
+
|
|
|
|
|
|
- * present. Depending on the key format, we can figure out the service
|
|
|
- * version. If we can't find a key, the configuration version will be used
|
|
|
- * which has been set previously. */
|
|
|
- service->config.version = config_learn_service_version(service);
|
|
|
+ * present and we did not set HiddenServiceVersion. Depending on the key
|
|
|
+ * format, we can figure out the service version. */
|
|
|
+ if (!service->config.hs_version_explicitly_set) {
|
|
|
+ service->config.version = config_learn_service_version(service);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * instance an option only for v2 is not used for v3. */
|
|
|
+ if (config_has_invalid_options(line->next, service)) {
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
|
|
|
|
|
|
* start just after the service directory line so once we hit another
|
|
@@ -580,13 +585,16 @@ config_service(const config_line_t *line, const or_options_t *options,
|
|
|
if (ret < 0) {
|
|
|
goto err;
|
|
|
}
|
|
|
+
|
|
|
|
|
|
* configured previously. */
|
|
|
if (service_is_duplicate_in_list(service_list, service)) {
|
|
|
goto err;
|
|
|
}
|
|
|
+
|
|
|
|
|
|
smartlist_add(service_list, service);
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
err:
|