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;