/*
* Server functions which perform operations on user objects.
*
- * Copyright (c) 1987-2017 by the citadel.org team
+ * Copyright (c) 1987-2019 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License, version 3.
/*
* Back end for cmd_user() and its ilk
- *
- * NOTE: "authname" should only be used if we are attempting to use the "master user" feature
*/
-int CtdlLoginExistingUser(char *authname, const char *trythisname)
+int CtdlLoginExistingUser(const char *trythisname)
{
char username[SIZ];
int found_user;
- syslog(LOG_DEBUG, "user_ops: CtdlLoginExistingUser(%s, %s)", authname, trythisname);
+ syslog(LOG_DEBUG, "user_ops: CtdlLoginExistingUser(%s)", trythisname);
if ((CC->logged_in)) {
return login_already_logged_in;
return login_not_found;
}
- /* If a "master user" is defined, handle its authentication if specified */
- CC->is_master = 0;
- if ( (!IsEmptyStr(CtdlGetConfigStr("c_master_user"))) &&
- (!IsEmptyStr(CtdlGetConfigStr("c_master_pass"))) &&
- (authname != NULL) &&
- (!strcasecmp(authname, CtdlGetConfigStr("c_master_user"))) )
- {
- CC->is_master = 1;
- }
-
/* Continue attempting user validation... */
safestrncpy(username, trythisname, sizeof (username));
striplt(username);
return login_not_found;
}
- /* Locate the associated Citadel account.
- * If not found, make one attempt to create it.
- */
+ /* Locate the associated Citadel account. If not found, make one attempt to create it. */
found_user = getuserbyuid(&CC->user, pd.pw_uid);
if (found_user != 0) {
create_user(username, CREATE_USER_DO_NOT_BECOME_USER, pd.pw_uid);
*/
void do_login(void)
{
- struct CitContext *CCC = CC;
+ CC->logged_in = 1;
+ syslog(LOG_NOTICE, "user_ops: <%s> logged in", CC->curr_user);
- CCC->logged_in = 1;
- syslog(LOG_NOTICE, "user_ops: <%s> logged in", CCC->curr_user);
-
- CtdlGetUserLock(&CCC->user, CCC->curr_user);
- ++(CCC->user.timescalled);
- CCC->previous_login = CCC->user.lastcall;
- time(&CCC->user.lastcall);
+ CtdlGetUserLock(&CC->user, CC->curr_user);
+ ++(CC->user.timescalled);
+ CC->previous_login = CC->user.lastcall;
+ time(&CC->user.lastcall);
/* If this user's name is the name of the system administrator
* (as specified in setup), automatically assign access level 6.
*/
- if (!strcasecmp(CCC->user.fullname, CtdlGetConfigStr("c_sysadm"))) {
- CCC->user.axlevel = AxAideU;
+ if ( (!IsEmptyStr(CtdlGetConfigStr("c_sysadm"))) && (!strcasecmp(CC->user.fullname, CtdlGetConfigStr("c_sysadm"))) ) {
+ CC->user.axlevel = AxAideU;
}
- /* If we're authenticating off the host system, automatically give
- * root the highest level of access.
- */
+ /* If we're authenticating off the host system, automatically give root the highest level of access. */
if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_HOST) {
- if (CCC->user.uid == 0) {
- CCC->user.axlevel = AxAideU;
+ if (CC->user.uid == 0) {
+ CC->user.axlevel = AxAideU;
}
}
+ CtdlPutUserLock(&CC->user);
- /*
- * If we are using LDAP authentication, extract the user's email addresses from the directory.
- */
+ /* If we are using LDAP authentication, extract the user's email addresses from the directory. */
#ifdef HAVE_LDAP
if ((CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP) || (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD)) {
char new_emailaddrs[512];
if (CtdlGetConfigInt("c_ldap_sync_email_addrs") > 0) {
- if (extract_email_addresses_from_ldap(CCC->ldap_dn, new_emailaddrs) == 0) {
- CtdlSetEmailAddressesForUser(CCC->user.fullname, new_emailaddrs);
+ if (extract_email_addresses_from_ldap(CC->ldap_dn, new_emailaddrs) == 0) {
+ CtdlSetEmailAddressesForUser(CC->user.fullname, new_emailaddrs);
}
}
}
#endif
- /*
- * No email address for user? Make one up.
- */
- if (IsEmptyStr(CCC->user.emailaddrs)) {
- sprintf(CCC->user.emailaddrs, "cit%ld@%s", CCC->user.usernum, CtdlGetConfigStr("c_fqdn"));
+ /* If the user does not have any email addresses assigned, generate one. */
+ if (IsEmptyStr(CC->user.emailaddrs)) {
+ AutoGenerateEmailAddressForUser(&CC->user);
}
-
- CtdlPutUserLock(&CCC->user);
/*
* Populate cs_inet_email and cs_inet_other_emails with valid email addresses from the user record
*/
- strcpy(CCC->cs_inet_email, CCC->user.emailaddrs);
- char *firstsep = strstr(CCC->cs_inet_email, "|");
+ strcpy(CC->cs_inet_email, CC->user.emailaddrs);
+ char *firstsep = strstr(CC->cs_inet_email, "|");
if (firstsep) {
- strcpy(CCC->cs_inet_other_emails, firstsep+1);
+ strcpy(CC->cs_inet_other_emails, firstsep+1);
*firstsep = 0;
}
else {
- CCC->cs_inet_other_emails[0] = 0;
+ CC->cs_inet_other_emails[0] = 0;
}
/* Create any personal rooms required by the system.
* since it's possible to log in again without reconnecting, we cannot
* make that assumption.
*/
- strcpy(CCC->fake_username, "");
- strcpy(CCC->fake_hostname, "");
- strcpy(CCC->fake_roomname, "");
CCC->logged_in = 0;
- /* Check to see if the user was deleted whilst logged in and purge them if necessary */
+ /* Check to see if the user was deleted while logged in and purge them if necessary */
if ((CCC->user.axlevel == AxDeleted) && (CCC->user.usernum)) {
purge_user(CCC->user.fullname);
}
/* Clear out the user record in memory so we don't behave like a ghost */
memset(&CCC->user, 0, sizeof(struct ctdluser));
CCC->curr_user[0] = 0;
- CCC->is_master = 0;
CCC->cs_inet_email[0] = 0;
CCC->cs_inet_other_emails[0] = 0;
CCC->cs_inet_fn[0] = 0;
- CCC->fake_username[0] = 0;
- CCC->fake_hostname[0] = 0;
- CCC->fake_roomname[0] = 0;
/* Free any output buffers */
unbuffer_output();
return pass_wrong_password;
}
- if (CCC->is_master) {
- code = strcmp(password, CtdlGetConfigStr("c_master_pass"));
- }
-
else if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_HOST) {
/* host auth mode */
makeuserkey(usernamekey, pname, cutuserkey(pname));
/* If the name is empty we can't find them in the DB any way so just return */
- if (IsEmptyStr(pname))
+ if (IsEmptyStr(pname)) {
return(ERROR + NO_SUCH_USER);
+ }
if (CtdlGetUser(&usbuf, pname) != 0) {
syslog(LOG_ERR, "user_ops: cannot purge user <%s> - not found", pname);