Added a RENU command (REName a User)
authorArt Cancro <ajc@citadel.org>
Fri, 7 Mar 2008 20:01:54 +0000 (20:01 +0000)
committerArt Cancro <ajc@citadel.org>
Fri, 7 Mar 2008 20:01:54 +0000 (20:01 +0000)
citadel/citserver.c
citadel/modules/rwho/serv_rwho.c
citadel/user_ops.c
citadel/user_ops.h

index 5234f7d5d337c2ee3e93bfa53ee4cb7f725c6a89..efcaed9e48b3a84f25c621fdad02678815808984 100644 (file)
@@ -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);
        }
index 7932727736e5848280a6043a3cb8b218f85a0fb7..272a0de9e7e28d598f60ad7b5fd271996400ddb4 100644 (file)
@@ -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.
  *
  */
index 7f84fa21eadb893c5bbd51cfe5bc6b8533616702..3fd6b4a8536ab6ddd2511e2dcb7787aab7a0e78b 100644 (file)
@@ -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);
+}
index 2df249b96c23a896dc6136d2ac2ae0f09a35dcff..be1d4716d9f71f12553e558b755b5155fad26462 100644 (file)
@@ -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);