diff --git a/server/core/adminusers.c b/server/core/adminusers.c index 9072202cc..c599de38c 100644 --- a/server/core/adminusers.c +++ b/server/core/adminusers.c @@ -55,6 +55,8 @@ static char *ADMIN_ERR_FILEAPPEND = "Unable to append to password file"; static char *ADMIN_ERR_PWDFILEOPEN = "Failed to open password file"; static char *ADMIN_ERR_TMPFILEOPEN = "Failed to open temporary password file"; static char *ADMIN_ERR_PWDFILEACCESS = "Failed to access password file"; +static char *ADMIN_ERR_DELLASTUSER = "Deleting user failed, deleting the " + "last user is forbidden"; static char *ADMIN_SUCCESS = NULL; static const int LINELEN=80; @@ -193,15 +195,16 @@ char* admin_remove_user( char* uname, char* passwd) { - FILE* fp; - FILE* fp_tmp; - char fname[1024]; - char fname_tmp[1024]; - char* home; - char fusr[LINELEN]; - char fpwd[LINELEN]; - char line[LINELEN]; + FILE* fp; + FILE* fp_tmp; + char fname[1024]; + char fname_tmp[1024]; + char* home; + char fusr[LINELEN]; + char fpwd[LINELEN]; + char line[LINELEN]; fpos_t rpos; + int n_deleted; if (!admin_search_user(uname)) { skygw_log_write(NULL, @@ -218,9 +221,17 @@ char* admin_remove_user( return ADMIN_ERR_AUTHENTICATION; } + /** Remove user from in-memory structure */ - users_delete(users, uname); - + n_deleted = users_delete(users, uname); + + if (n_deleted == 0) { + skygw_log_write(NULL, + LOGFILE_MESSAGE, + "Deleting the only user is forbidden. add new user " + "before deleting the old one.\n"); + return ADMIN_ERR_DELLASTUSER; + } /** * Open passwd file and remove user from the file. */ diff --git a/server/core/users.c b/server/core/users.c index a836f6ad2..63b8a3f6c 100644 --- a/server/core/users.c +++ b/server/core/users.c @@ -113,6 +113,10 @@ users_delete(USERS *users, char *user) int del; atomic_add(&users->stats.n_deletes, 1); + if (users->stats.n_entries == 1) { + atomic_add(&users->stats.n_entries, del * -1); + return 0; + } del = hashtable_delete(users->data, user); atomic_add(&users->stats.n_entries, del * -1); return del; diff --git a/server/include/adminusers.h b/server/include/adminusers.h index 380e9ee70..d46570e38 100644 --- a/server/include/adminusers.h +++ b/server/include/adminusers.h @@ -33,7 +33,7 @@ extern int admin_verify(char *, char *); extern char *admin_add_user(char *, char *); -extern int admin_test_user(char *); +extern int admin_search_user(char *); extern void dcb_PrintAdminUsers(DCB *dcb); char* admin_remove_user(char* uname, char* passwd);