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
*/
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);
+}
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);
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);