From f681ebae2ef42258bfd9a8d60886908832b13942 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Fri, 7 Mar 2008 20:01:54 +0000 Subject: [PATCH] Added a RENU command (REName a User) --- citadel/citserver.c | 4 ++ citadel/modules/rwho/serv_rwho.c | 2 +- citadel/user_ops.c | 92 ++++++++++++++++++++++++++++++++ citadel/user_ops.h | 9 ++++ 4 files changed, 106 insertions(+), 1 deletion(-) diff --git a/citadel/citserver.c b/citadel/citserver.c index 5234f7d5d..efcaed9e4 100644 --- a/citadel/citserver.c +++ b/citadel/citserver.c @@ -1427,6 +1427,10 @@ void do_command_loop(void) { cmd_isme(&cmdbuf[5]); } + else if (!strncasecmp(cmdbuf, "RENU", 4)) { + cmd_renu(&cmdbuf[5]); + } + else if (!DLoader_Exec_Cmd(cmdbuf)) { cprintf("%d Unrecognized or unsupported command.\n", ERROR + CMD_NOT_SUPPORTED); } diff --git a/citadel/modules/rwho/serv_rwho.c b/citadel/modules/rwho/serv_rwho.c index 793272773..272a0de9e 100644 --- a/citadel/modules/rwho/serv_rwho.c +++ b/citadel/modules/rwho/serv_rwho.c @@ -1,7 +1,7 @@ /* * $Id$ * - * This module implementsserver commands related to the display and + * This module implements server commands related to the display and * manipulation of the "Who's online" list. * */ diff --git a/citadel/user_ops.c b/citadel/user_ops.c index 7f84fa21e..3fd6b4a85 100644 --- a/citadel/user_ops.c +++ b/citadel/user_ops.c @@ -148,6 +148,61 @@ void lputuser(struct ctdluser *usbuf) end_critical_section(S_USERS); } + +/* + * rename_user() - this is tricky because the user's display name is the database key + * + * Returns 0 on success or nonzero if there was an error... + * + */ +int rename_user(char *oldname, char *newname) { + struct CitContext *cptr; + int retcode = RENAMEUSER_OK; + struct ctdluser usbuf; + + char oldnamekey[USERNAME_SIZE]; + char newnamekey[USERNAME_SIZE]; + + /* We cannot rename a user who is currently logged in */ + for (cptr = ContextList; cptr != NULL; cptr = cptr->next) { + if (!strcasecmp(cptr->user.fullname, oldname)) { + return(RENAMEUSER_LOGGED_IN); + } + } + + /* Create the database keys... */ + makeuserkey(oldnamekey, oldname); + makeuserkey(newnamekey, newname); + + /* Lock up and get going */ + begin_critical_section(S_USERS); + + if (getuser(&usbuf, newname) == 0) { + retcode = RENAMEUSER_ALREADY_EXISTS; + } + else { + + if (getuser(&usbuf, oldname) != 0) { + retcode = RENAMEUSER_NOT_FOUND; + } + + else { /* Sanity checks succeeded. Now rename the user. */ + + lprintf(CTDL_DEBUG, "Renaming <%s> to <%s>\n", oldname, newname); + cdb_delete(CDB_USERS, oldnamekey, strlen(oldnamekey)); + safestrncpy(usbuf.fullname, newname, sizeof usbuf.fullname); + putuser(&usbuf); + retcode = RENAMEUSER_OK; + } + + } + + end_critical_section(S_USERS); + return(retcode); +} + + + /* * Index-generating function used by Ctdl[Get|Set]Relationship */ @@ -1783,3 +1838,40 @@ void cmd_view(char *cmdbuf) { cprintf("%d ok\n", CIT_OK); } + + +/* + * Rename a user + */ +void cmd_renu(char *cmdbuf) +{ + int retcode; + char oldname[USERNAME_SIZE]; + char newname[USERNAME_SIZE]; + + if (CtdlAccessCheck(ac_aide)) { + return; + } + + extract_token(oldname, cmdbuf, 0, '|', sizeof oldname); + extract_token(newname, cmdbuf, 1, '|', sizeof newname); + + retcode = rename_user(oldname, newname); + switch(retcode) { + case RENAMEUSER_OK: + cprintf("%d '%s' has been renamed to '%s'.\n", CIT_OK, oldname, newname); + return; + case RENAMEUSER_LOGGED_IN: + cprintf("%d '%s' is currently logged in and cannot be renamed.\n", + ERROR + ALREADY_LOGGED_IN , oldname); + return; + case RENAMEUSER_NOT_FOUND: + cprintf("%d '%s' does not exist.\n", ERROR + NO_SUCH_USER, oldname); + return; + case RENAMEUSER_ALREADY_EXISTS: + cprintf("%d A user named '%s' already exists.\n", ERROR + ALREADY_EXISTS, newname); + return; + } + + cprintf("%d An unknown error occurred.\n", ERROR); +} diff --git a/citadel/user_ops.h b/citadel/user_ops.h index 2df249b96..be1d4716d 100644 --- a/citadel/user_ops.h +++ b/citadel/user_ops.h @@ -34,6 +34,7 @@ void cmd_qusr (char *who); void cmd_agup (char *cmdbuf); void cmd_asup (char *cmdbuf); void cmd_view (char *cmdbuf); +void cmd_renu (char *cmdbuf); int NewMailCount(void); int InitialMailCheck(void); void put_visit(struct visit *newvisit); @@ -84,3 +85,11 @@ void cmd_seen(char *argbuf); void cmd_gtsn(char *argbuf); void BumpNewMailCounter(long); void start_chkpwd_daemon(void); + + +#define RENAMEUSER_OK 0 /* Operation succeeded */ +#define RENAMEUSER_LOGGED_IN 1 /* Cannot rename a user who is currently logged in */ +#define RENAMEUSER_NOT_FOUND 2 /* The old user name does not exist */ +#define RENAMEUSER_ALREADY_EXISTS 3 /* An account with the desired new name already exists */ + +int rename_user(char *oldname, char *newname); -- 2.30.2