From d6026d027ab887c68a0288096af65e8b59951bcb Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Wed, 10 Nov 2021 12:44:53 +0000 Subject: [PATCH] Move plugin cleanup to own file. --- src/CMakeLists.txt | 1 + src/Makefile | 4 ++ src/plugin_cleanup.c | 158 +++++++++++++++++++++++++++++++++++++++++++ src/security.c | 130 ----------------------------------- 4 files changed, 163 insertions(+), 130 deletions(-) create mode 100644 src/plugin_cleanup.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3ecceb53..ebc101fa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -44,6 +44,7 @@ set (MOSQ_SRCS persist_write_v5.c persist_write.c persist.h plugin.c plugin_v4.c plugin_v3.c plugin_v2.c + plugin_cleanup.c plugin_acl_check.c plugin_basic_auth.c plugin_connect.c plugin_disconnect.c plugin_extended_auth.c plugin_message.c plugin_psk_key.c plugin_public.c plugin_tick.c diff --git a/src/Makefile b/src/Makefile index ce1571e9..c5b8dbff 100644 --- a/src/Makefile +++ b/src/Makefile @@ -61,6 +61,7 @@ OBJS= mosquitto.o \ plugin_v4.o \ plugin_acl_check.o \ plugin_basic_auth.o \ + plugin_cleanup.o \ plugin_connect.o \ plugin_disconnect.o \ plugin_extended_auth.o \ @@ -280,6 +281,9 @@ plugin_acl_check.o : plugin_acl_check.c ../include/mosquitto_plugin.h mosquitto_ plugin_basic_auth.o : plugin_basic_auth.c ../include/mosquitto_plugin.h mosquitto_broker_internal.h ${CROSS_COMPILE}${CC} $(BROKER_CPPFLAGS) $(BROKER_CFLAGS) -c $< -o $@ +plugin_cleanup.o : plugin_cleanup.c ../include/mosquitto_plugin.h mosquitto_broker_internal.h + ${CROSS_COMPILE}${CC} $(BROKER_CPPFLAGS) $(BROKER_CFLAGS) -c $< -o $@ + plugin_connect.o : plugin_connect.c ../include/mosquitto_plugin.h mosquitto_broker_internal.h ${CROSS_COMPILE}${CC} $(BROKER_CPPFLAGS) $(BROKER_CFLAGS) -c $< -o $@ diff --git a/src/plugin_cleanup.c b/src/plugin_cleanup.c new file mode 100644 index 00000000..0bf892c7 --- /dev/null +++ b/src/plugin_cleanup.c @@ -0,0 +1,158 @@ +/* +Copyright (c) 2011-2021 Roger Light + +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License 2.0 +and Eclipse Distribution License v1.0 which accompany this distribution. + +The Eclipse Public License is available at + https://www.eclipse.org/legal/epl-2.0/ +and the Eclipse Distribution License is available at + http://www.eclipse.org/org/documents/edl-v10.php. + +SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause + +Contributors: + Roger Light - initial implementation and documentation. +*/ + +#include "config.h" + +#include +#include + +#include "mosquitto_broker.h" +#include "mosquitto_broker_internal.h" +#include "mosquitto_plugin.h" +#include "memory_mosq.h" +#include "lib_load.h" +#include "utlist.h" + +static int security__cleanup_single(struct mosquitto__security_options *opts, bool reload); + +static void security__module_cleanup_single(struct mosquitto__security_options *opts) +{ + int i; + struct control_endpoint *ep, *tmp; + struct mosquitto__plugin_config *conf; + + for(i=0; iplugin_config_count; i++){ + conf = opts->plugin_configs[i]; + + /* Run plugin cleanup function */ + if(conf->plugin.version == 5){ + if(conf->plugin.plugin_cleanup_v5){ + conf->plugin.plugin_cleanup_v5( + conf->plugin.user_data, + conf->options, + conf->option_count); + } + }else if(conf->plugin.version == 4){ + conf->plugin.plugin_cleanup_v4( + conf->plugin.user_data, + conf->options, + conf->option_count); + + }else if(conf->plugin.version == 3){ + conf->plugin.plugin_cleanup_v3( + conf->plugin.user_data, + conf->options, + conf->option_count); + + }else if(conf->plugin.version == 2){ + conf->plugin.plugin_cleanup_v2( + conf->plugin.user_data, + (struct mosquitto_auth_opt *)conf->options, + conf->option_count); + } + + plugin__callback_unregister_all(conf->plugin.identifier); + if(conf->plugin.identifier){ + mosquitto__free(conf->plugin.identifier->plugin_name); + mosquitto__free(conf->plugin.identifier->plugin_version); + DL_FOREACH_SAFE(conf->plugin.identifier->control_endpoints, ep, tmp){ + DL_DELETE(conf->plugin.identifier->control_endpoints, ep); + mosquitto__free(ep); + } + mosquitto__free(conf->plugin.identifier); + conf->plugin.identifier = NULL; + } + + if(conf->plugin.lib){ + LIB_CLOSE(conf->plugin.lib); + } + memset(&conf->plugin, 0, sizeof(struct mosquitto__plugin)); + } +} + + +int mosquitto_security_module_cleanup(void) +{ + int i; + + mosquitto_security_cleanup(false); + + security__module_cleanup_single(&db.config->security_options); + + for(i=0; ilistener_count; i++){ + security__module_cleanup_single(&db.config->listeners[i].security_options); + } + + return MOSQ_ERR_SUCCESS; +} + + +static int security__cleanup_single(struct mosquitto__security_options *opts, bool reload) +{ + int i; + int rc; + + for(i=0; iplugin_config_count; i++){ + if(opts->plugin_configs[i]->plugin.version == 5){ + rc = MOSQ_ERR_SUCCESS; + }else if(opts->plugin_configs[i]->plugin.version == 4){ + rc = opts->plugin_configs[i]->plugin.security_cleanup_v4( + opts->plugin_configs[i]->plugin.user_data, + opts->plugin_configs[i]->options, + opts->plugin_configs[i]->option_count, + reload); + + }else if(opts->plugin_configs[i]->plugin.version == 3){ + rc = opts->plugin_configs[i]->plugin.security_cleanup_v3( + opts->plugin_configs[i]->plugin.user_data, + opts->plugin_configs[i]->options, + opts->plugin_configs[i]->option_count, + reload); + + }else if(opts->plugin_configs[i]->plugin.version == 2){ + rc = opts->plugin_configs[i]->plugin.security_cleanup_v2( + opts->plugin_configs[i]->plugin.user_data, + (struct mosquitto_auth_opt *)opts->plugin_configs[i]->options, + opts->plugin_configs[i]->option_count, + reload); + }else{ + rc = MOSQ_ERR_INVAL; + } + if(rc != MOSQ_ERR_SUCCESS){ + return rc; + } + } + + return MOSQ_ERR_SUCCESS; +} + + +int mosquitto_security_cleanup(bool reload) +{ + int i; + int rc; + + rc = security__cleanup_single(&db.config->security_options, reload); + if(rc != MOSQ_ERR_SUCCESS) return rc; + + for(i=0; ilistener_count; i++){ + rc = security__cleanup_single(&db.config->listeners[i].security_options, reload); + if(rc != MOSQ_ERR_SUCCESS) return rc; + } + return mosquitto_security_cleanup_default(reload); +} diff --git a/src/security.c b/src/security.c index e534292c..f783f715 100644 --- a/src/security.c +++ b/src/security.c @@ -31,8 +31,6 @@ Contributors: typedef int (*FUNC_auth_plugin_version)(void); typedef int (*FUNC_plugin_version)(int, const int *); -static int security__cleanup_single(struct mosquitto__security_options *opts, bool reload); - void LIB_ERROR(void) { #ifdef WIN32 @@ -141,78 +139,6 @@ int mosquitto_security_module_init(void) } -static void security__module_cleanup_single(struct mosquitto__security_options *opts) -{ - int i; - struct control_endpoint *ep, *tmp; - struct mosquitto__plugin_config *conf; - - for(i=0; iplugin_config_count; i++){ - conf = opts->plugin_configs[i]; - - /* Run plugin cleanup function */ - if(conf->plugin.version == 5){ - if(conf->plugin.plugin_cleanup_v5){ - conf->plugin.plugin_cleanup_v5( - conf->plugin.user_data, - conf->options, - conf->option_count); - } - }else if(conf->plugin.version == 4){ - conf->plugin.plugin_cleanup_v4( - conf->plugin.user_data, - conf->options, - conf->option_count); - - }else if(conf->plugin.version == 3){ - conf->plugin.plugin_cleanup_v3( - conf->plugin.user_data, - conf->options, - conf->option_count); - - }else if(conf->plugin.version == 2){ - conf->plugin.plugin_cleanup_v2( - conf->plugin.user_data, - (struct mosquitto_auth_opt *)conf->options, - conf->option_count); - } - - plugin__callback_unregister_all(conf->plugin.identifier); - if(conf->plugin.identifier){ - mosquitto__free(conf->plugin.identifier->plugin_name); - mosquitto__free(conf->plugin.identifier->plugin_version); - DL_FOREACH_SAFE(conf->plugin.identifier->control_endpoints, ep, tmp){ - DL_DELETE(conf->plugin.identifier->control_endpoints, ep); - mosquitto__free(ep); - } - mosquitto__free(conf->plugin.identifier); - conf->plugin.identifier = NULL; - } - - if(conf->plugin.lib){ - LIB_CLOSE(conf->plugin.lib); - } - memset(&conf->plugin, 0, sizeof(struct mosquitto__plugin)); - } -} - - -int mosquitto_security_module_cleanup(void) -{ - int i; - - mosquitto_security_cleanup(false); - - security__module_cleanup_single(&db.config->security_options); - - for(i=0; ilistener_count; i++){ - security__module_cleanup_single(&db.config->listeners[i].security_options); - } - - return MOSQ_ERR_SUCCESS; -} - - static int security__init_single(struct mosquitto__security_options *opts, bool reload) { int i; @@ -292,59 +218,3 @@ int mosquitto_security_apply(void) { return mosquitto_security_apply_default(); } - - -static int security__cleanup_single(struct mosquitto__security_options *opts, bool reload) -{ - int i; - int rc; - - for(i=0; iplugin_config_count; i++){ - if(opts->plugin_configs[i]->plugin.version == 5){ - rc = MOSQ_ERR_SUCCESS; - }else if(opts->plugin_configs[i]->plugin.version == 4){ - rc = opts->plugin_configs[i]->plugin.security_cleanup_v4( - opts->plugin_configs[i]->plugin.user_data, - opts->plugin_configs[i]->options, - opts->plugin_configs[i]->option_count, - reload); - - }else if(opts->plugin_configs[i]->plugin.version == 3){ - rc = opts->plugin_configs[i]->plugin.security_cleanup_v3( - opts->plugin_configs[i]->plugin.user_data, - opts->plugin_configs[i]->options, - opts->plugin_configs[i]->option_count, - reload); - - }else if(opts->plugin_configs[i]->plugin.version == 2){ - rc = opts->plugin_configs[i]->plugin.security_cleanup_v2( - opts->plugin_configs[i]->plugin.user_data, - (struct mosquitto_auth_opt *)opts->plugin_configs[i]->options, - opts->plugin_configs[i]->option_count, - reload); - }else{ - rc = MOSQ_ERR_INVAL; - } - if(rc != MOSQ_ERR_SUCCESS){ - return rc; - } - } - - return MOSQ_ERR_SUCCESS; -} - - -int mosquitto_security_cleanup(bool reload) -{ - int i; - int rc; - - rc = security__cleanup_single(&db.config->security_options, reload); - if(rc != MOSQ_ERR_SUCCESS) return rc; - - for(i=0; ilistener_count; i++){ - rc = security__cleanup_single(&db.config->listeners[i].security_options, reload); - if(rc != MOSQ_ERR_SUCCESS) return rc; - } - return mosquitto_security_cleanup_default(reload); -} \ No newline at end of file