diff --git a/apps/mosquitto_ctrl/CMakeLists.txt b/apps/mosquitto_ctrl/CMakeLists.txt index a7c19237b..adc795cf6 100644 --- a/apps/mosquitto_ctrl/CMakeLists.txt +++ b/apps/mosquitto_ctrl/CMakeLists.txt @@ -3,7 +3,7 @@ if (WITH_TLS AND CJSON_FOUND) include_directories(${mosquitto_SOURCE_DIR} ${mosquitto_SOURCE_DIR}/include ${mosquitto_SOURCE_DIR}/lib ${mosquitto_SOURCE_DIR}/src ${OPENSSL_INCLUDE_DIR} ${STDBOOL_H_PATH} ${STDINT_H_PATH} - ${CJSON_INCLUDE_DIRS}) + ${CJSON_INCLUDE_DIRS}) ${mosquitto_SOURCE_DIR}/apps/mosquitto_passwd add_executable(mosquitto_ctrl mosquitto_ctrl.c mosquitto_ctrl.h @@ -12,6 +12,7 @@ if (WITH_TLS AND CJSON_FOUND) dynsec_client.c dynsec_group.c dynsec_role.c + ../mosquitto_passwd/get_password.c ../mosquitto_passwd/get_password.h ../../lib/memory_mosq.c ../../lib/memory_mosq.h ../../src/memory_public.c options.c diff --git a/apps/mosquitto_ctrl/Makefile b/apps/mosquitto_ctrl/Makefile index ad87760b5..486c6db03 100644 --- a/apps/mosquitto_ctrl/Makefile +++ b/apps/mosquitto_ctrl/Makefile @@ -8,7 +8,7 @@ else LIBMOSQ:=../../lib/libmosquitto.a endif -LOCAL_CPPFLAGS:=-I/usr/include/cjson -I/usr/local/include/cjson +LOCAL_CPPFLAGS:=-I/usr/include/cjson -I/usr/local/include/cjson -I../mosquitto_passwd OBJS= mosquitto_ctrl.o \ client.o \ @@ -16,6 +16,7 @@ OBJS= mosquitto_ctrl.o \ dynsec_client.o \ dynsec_group.o \ dynsec_role.o \ + get_password.o \ memory_mosq.o \ memory_public.o \ options.o \ @@ -50,6 +51,9 @@ dynsec_group.o : dynsec_group.c mosquitto_ctrl.h dynsec_role.o : dynsec_role.c mosquitto_ctrl.h ${CROSS_COMPILE}${CC} $(LOCAL_CPPFLAGS) $(APP_CPPFLAGS) $(APP_CFLAGS) -c $< -o $@ +get_password.o : ../mosquitto_passwd/get_password.c ../mosquitto_passwd/get_password.h + ${CROSS_COMPILE}${CC} $(LOCAL_CPPFLAGS) $(APP_CPPFLAGS) $(APP_CFLAGS) -c $< -o $@ + memory_mosq.o : ../../lib/memory_mosq.c ${CROSS_COMPILE}${CC} $(APP_CPPFLAGS) $(APP_CFLAGS) -c $< -o $@ diff --git a/apps/mosquitto_ctrl/options.c b/apps/mosquitto_ctrl/options.c index 42dd0195c..a418269f7 100644 --- a/apps/mosquitto_ctrl/options.c +++ b/apps/mosquitto_ctrl/options.c @@ -35,6 +35,7 @@ Contributors: #include #include #include "mosquitto_ctrl.h" +#include "get_password.h" #ifdef WITH_SOCKS static int mosquitto__parse_socks_url(struct mosq_config *cfg, char *url); @@ -558,12 +559,29 @@ int client_config_load(struct mosq_config *cfg) int client_opts_set(struct mosquitto *mosq, struct mosq_config *cfg) { -#if defined(WITH_TLS) || defined(WITH_SOCKS) int rc; -#endif + char prompt[1000]; + char password[1000]; mosquitto_int_option(mosq, MOSQ_OPT_PROTOCOL_VERSION, cfg->protocol_version); + if(cfg->username && cfg->password == NULL){ + /* Ask for password */ + snprintf(prompt, sizeof(prompt), "Password for %s: ", cfg->username); + rc = get_password(prompt, NULL, password, sizeof(password)); + if(rc){ + fprintf(stderr, "Error getting password.\n"); + mosquitto_lib_cleanup(); + return 1; + } + cfg->password = strdup(password); + if(cfg->password == NULL){ + fprintf(stderr, "Error: Out of memory.\n"); + mosquitto_lib_cleanup(); + return 1; + } + } + if((cfg->username || cfg->password) && mosquitto_username_pw_set(mosq, cfg->username, cfg->password)){ fprintf(stderr, "Error: Problem setting username and/or password.\n"); mosquitto_lib_cleanup();