diff --git a/man/mosquitto.conf.5.xml b/man/mosquitto.conf.5.xml index f492a70a..031d1fcb 100644 --- a/man/mosquitto.conf.5.xml +++ b/man/mosquitto.conf.5.xml @@ -489,7 +489,8 @@ , , , , - . + , + . The default behaviour is for this to be set to false, which maintains the settings behaviour from previous versions of diff --git a/mosquitto.conf b/mosquitto.conf index ecb8cefb..29f84fe1 100644 --- a/mosquitto.conf +++ b/mosquitto.conf @@ -142,6 +142,7 @@ # affected: # # password_file acl_file psk_file auth_plugin auth_opt_* allow_anonymous +# auto_id_prefix # # The default behaviour is for this to be set to false, which maintains the # setting behaviour from previous versions of mosquitto. diff --git a/src/conf.c b/src/conf.c index 32705b84..c7b8469d 100644 --- a/src/conf.c +++ b/src/conf.c @@ -153,8 +153,8 @@ static void config__init_reload(struct mosquitto__config *config) config->security_options.allow_anonymous = -1; config->allow_duplicate_messages = false; config->allow_zero_length_clientid = true; - config->auto_id_prefix = NULL; - config->auto_id_prefix_len = 0; + config->security_options.auto_id_prefix = NULL; + config->security_options.auto_id_prefix_len = 0; config->autosave_interval = 1800; config->autosave_on_changes = false; mosquitto__free(config->clientid_prefixes); @@ -241,7 +241,7 @@ void config__cleanup(struct mosquitto__config *config) struct mosquitto__auth_plugin_config *plug; mosquitto__free(config->acl_file); - mosquitto__free(config->auto_id_prefix); + mosquitto__free(config->security_options.auto_id_prefix); mosquitto__free(config->clientid_prefixes); mosquitto__free(config->config_file); mosquitto__free(config->security_options.password_file); @@ -776,11 +776,12 @@ int config__read_file_core(struct mosquitto__config *config, bool reload, const } if(conf__parse_bool(&token, "auth_plugin_deny_special_chars", &cur_auth_plugin->deny_special_chars, saveptr)) return MOSQ_ERR_INVAL; }else if(!strcmp(token, "auto_id_prefix")){ - if(conf__parse_string(&token, "auto_id_prefix", &config->auto_id_prefix, saveptr)) return MOSQ_ERR_INVAL; - if(config->auto_id_prefix){ - config->auto_id_prefix_len = strlen(config->auto_id_prefix); + conf__set_cur_security_options(config, cur_listener, &cur_security_options); + if(conf__parse_string(&token, "auto_id_prefix", &cur_security_options->auto_id_prefix, saveptr)) return MOSQ_ERR_INVAL; + if(cur_security_options->auto_id_prefix){ + cur_security_options->auto_id_prefix_len = strlen(cur_security_options->auto_id_prefix); }else{ - config->auto_id_prefix_len = 0; + cur_security_options->auto_id_prefix_len = 0; } }else if(!strcmp(token, "autosave_interval")){ if(conf__parse_int(&token, "autosave_interval", &config->autosave_interval, saveptr)) return MOSQ_ERR_INVAL; diff --git a/src/handle_connect.c b/src/handle_connect.c index ce4f7dd1..d6d5871d 100644 --- a/src/handle_connect.c +++ b/src/handle_connect.c @@ -37,7 +37,7 @@ Contributors: # include #endif -static char *client_id_gen(struct mosquitto_db *db, int *idlen) +static char *client_id_gen(struct mosquitto_db *db, int *idlen, const char *auto_id_prefix, int auto_id_prefix_len) { char *client_id; #ifdef WITH_UUID @@ -47,26 +47,26 @@ static char *client_id_gen(struct mosquitto_db *db, int *idlen) #endif #ifdef WITH_UUID - *idlen = 36 + db->config->auto_id_prefix_len; + *idlen = 36 + auto_id_prefix_len; #else - *idlen = 64 + db->config->auto_id_prefix_len; + *idlen = 64 + auto_id_prefix_len; #endif client_id = (char *)mosquitto__calloc((*idlen) + 1, sizeof(char)); if(!client_id){ return NULL; } - if(db->config->auto_id_prefix){ - memcpy(client_id, db->config->auto_id_prefix, db->config->auto_id_prefix_len); + if(auto_id_prefix){ + memcpy(client_id, auto_id_prefix, auto_id_prefix_len); } #ifdef WITH_UUID uuid_generate_random(uuid); - uuid_unparse_lower(uuid, &client_id[db->config->auto_id_prefix_len]); + uuid_unparse_lower(uuid, &client_id[auto_id_prefix_len]); #else for(i=0; i<64; i++){ - client_id[i+db->config->auto_id_prefix_len] = (rand()%73)+48; + client_id[i+auto_id_prefix_len] = (rand()%73)+48; } client_id[i] = '\0'; #endif @@ -245,7 +245,11 @@ int handle__connect(struct mosquitto_db *db, struct mosquitto *context) rc = MOSQ_ERR_PROTOCOL; goto handle_connect_error; }else{ - client_id = client_id_gen(db, &slen); + if(db->config->per_listener_settings){ + client_id = client_id_gen(db, &slen, context->listener->security_options.auto_id_prefix, context->listener->security_options.auto_id_prefix_len); + }else{ + client_id = client_id_gen(db, &slen, db->config->security_options.auto_id_prefix, db->config->security_options.auto_id_prefix_len); + } if(!client_id){ rc = MOSQ_ERR_NOMEM; goto handle_connect_error; diff --git a/src/mosquitto_broker_internal.h b/src/mosquitto_broker_internal.h index 5071e0c2..267694a6 100644 --- a/src/mosquitto_broker_internal.h +++ b/src/mosquitto_broker_internal.h @@ -156,6 +156,8 @@ struct mosquitto__security_options { struct mosquitto__auth_plugin_config *auth_plugins; int auth_plugin_count; char allow_anonymous; + char *auto_id_prefix; + int auto_id_prefix_len; }; struct mosquitto__listener { @@ -198,8 +200,6 @@ struct mosquitto__config { char *acl_file; bool allow_duplicate_messages; bool allow_zero_length_clientid; - char *auto_id_prefix; - int auto_id_prefix_len; int autosave_interval; bool autosave_on_changes; char *clientid_prefixes;