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
*/
char username[SIZ];
int found_user;
+ lprintf(9, "CtdlLoginExistingUser(%s, %s)\n", authname, trythisname);
+
if ((CC->logged_in)) {
return login_already_logged_in;
}
lprintf(CTDL_DEBUG, "asking host about <%s>\n", username);
#ifdef HAVE_GETPWNAM_R
#ifdef SOLARIS_GETPWUID
+ lprintf(CTDL_DEBUG, "Calling getpwnam_r()\n");
tempPwdPtr = getpwnam_r(username, &pd, pwdbuffer, sizeof pwdbuffer);
#else // SOLARIS_GETPWUID
+ lprintf(CTDL_DEBUG, "Calling getpwnam_r()\n");
getpwnam_r(username, &pd, pwdbuffer, sizeof pwdbuffer, &tempPwdPtr);
#endif // SOLARIS_GETPWUID
#else // HAVE_GETPWNAM_R
+ lprintf(CTDL_DEBUG, "SHOULD NEVER GET HERE!!!\n");
tempPwdPtr = NULL;
#endif // HAVE_GETPWNAM_R
if (tempPwdPtr == NULL) {
+ lprintf(CTDL_DEBUG, "no such user <%s>\n", username);
return login_not_found;
}
* If not found, make one attempt to create it.
*/
found_user = getuserbyuid(&CC->user, pd.pw_uid);
- lprintf(CTDL_DEBUG, "found it: uid=%ld, gecos=%s here: %ld\n", (long)pd.pw_uid, pd.pw_gecos, found_user);
+ lprintf(CTDL_DEBUG, "found it: uid=%ld, gecos=%s here: %d\n",
+ (long)pd.pw_uid, pd.pw_gecos, found_user);
if (found_user != 0) {
create_user(username, 0);
found_user = getuserbyuid(&CC->user, pd.pw_uid);
*/
void session_startup(void)
{
- int i = 0;
-
lprintf(CTDL_NOTICE, "<%s> logged in\n", CC->curr_user);
lgetuser(&CC->user, CC->curr_user);
*/
snprintf(CC->cs_inet_email, sizeof CC->cs_inet_email, "%s@%s",
CC->user.fullname, config.c_fqdn);
- for (i=0; !IsEmptyStr(&CC->cs_inet_email[i]); ++i) {
- if (isspace(CC->cs_inet_email[i])) {
- CC->cs_inet_email[i] = '_';
- }
- }
+ convert_spaces_to_underscores(CC->cs_inet_email);
/* Create any personal rooms required by the system.
* (Technically, MAILROOM should be there already, but just in case...)
/* Do modular stuff... */
PerformSessionHooks(EVT_LOGOUT);
+
+ /* Check to see if the user was deleted whilst logged in and purge them if necessary */
+ if (who->user.axlevel == 0)
+ purge_user(who->user.fullname);
/* Free any output buffers */
if (who->output_buffer != NULL) {
{
char buf[256];
+ if (IsEmptyStr(pass)) {
+ lprintf(CTDL_DEBUG, "refusing to check empty password for uid=%d using chkpwd...\n", uid);
+ return 0;
+ }
+
lprintf(CTDL_DEBUG, "Validating password for uid=%d using chkpwd...\n", uid);
begin_critical_section(S_CHKPWD);
makeuserkey(usernamekey, pname);
+ /* If the name is empty we can't find them in the DB any way so just return */
+ if (IsEmptyStr(pname))
+ return (ERROR + NO_SUCH_USER);
+
if (getuser(&usbuf, pname) != 0) {
lprintf(CTDL_ERR, "Cannot purge user <%s> - not found\n", pname);
return (ERROR + NO_SUCH_USER);
}
if (deleted) {
- sprintf(notify, "User \"%s\" has been deleted by %s.\n",
- usbuf.fullname, CC->user.fullname);
+ snprintf(notify, SIZ,
+ "User \"%s\" has been deleted by %s.\n",
+ usbuf.fullname, CC->user.fullname);
aide_message(notify, "User Deletion Message");
}
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);
+}