X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fctdlproto%2Fserv_user.c;h=73465ab2647708275fcd3f45c3ab7ba039f2e67c;hb=9ffea7c3315046ddcea2589656c13da5f5e0c076;hp=51ea437b7241951c9c7fb7bffe77c8178ddbe421;hpb=7b6c1a40ca8adc2e68c525d09a5788a5d46034ce;p=citadel.git diff --git a/citadel/modules/ctdlproto/serv_user.c b/citadel/modules/ctdlproto/serv_user.c index 51ea437b7..73465ab26 100644 --- a/citadel/modules/ctdlproto/serv_user.c +++ b/citadel/modules/ctdlproto/serv_user.c @@ -1,7 +1,7 @@ /* * Server functions which perform operations on user objects. * - * Copyright (c) 1987-2015 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. @@ -12,6 +12,7 @@ * GNU General Public License for more details. */ + #include "support.h" #include "control.h" #include "ctdl_module.h" @@ -29,13 +30,11 @@ void cmd_user(char *cmdbuf) char username[256]; int a; - CON_syslog(LOG_DEBUG, "cmd_user(%s)\n", cmdbuf); extract_token(username, cmdbuf, 0, '|', sizeof username); - CON_syslog(LOG_DEBUG, "username: %s\n", username); striplt(username); - CON_syslog(LOG_DEBUG, "username: %s\n", username); + syslog(LOG_DEBUG, "user_ops: cmd_user(%s)", username); - a = CtdlLoginExistingUser(NULL, username); + a = CtdlLoginExistingUser(username); switch (a) { case login_already_logged_in: cprintf("%d Already logged in.\n", ERROR + ALREADY_LOGGED_IN); @@ -94,7 +93,6 @@ void cmd_pass(char *buf) void cmd_newu(char *cmdbuf) { int a; - long len; char username[SIZ]; if (CtdlGetConfigInt("c_auth_mode") != AUTHMODE_NATIVE) { @@ -121,7 +119,6 @@ void cmd_newu(char *cmdbuf) } extract_token(username, cmdbuf, 0, '|', sizeof username); strproc(username); - len = cutuserkey(username); if (IsEmptyStr(username)) { cprintf("%d You must supply a user name.\n", ERROR + USERNAME_REQUIRED); @@ -135,7 +132,7 @@ void cmd_newu(char *cmdbuf) return; } - a = create_user(username, len, 1); + a = create_user(username, CREATE_USER_BECOME_USER, NATIVE_AUTH_UID); if (a == 0) { logged_in_response(); @@ -152,6 +149,7 @@ void cmd_newu(char *cmdbuf) } } + /* * set password - citadel protocol implementation */ @@ -164,11 +162,6 @@ void cmd_setp(char *new_pw) cprintf("%d Not allowed. Use the 'passwd' command.\n", ERROR + NOT_HERE); return; } - if (CC->is_master) { - cprintf("%d The master prefix password cannot be changed with this command.\n", - ERROR + NOT_HERE); - return; - } if (!strcasecmp(new_pw, "GENERATE_RANDOM_PASSWORD")) { char random_password[17]; @@ -194,7 +187,6 @@ void cmd_setp(char *new_pw) void cmd_creu(char *cmdbuf) { int a; - long len; char username[SIZ]; char password[SIZ]; struct ctdluser tmp; @@ -210,12 +202,10 @@ void cmd_creu(char *cmdbuf) cprintf("%d You must supply a user name.\n", ERROR + USERNAME_REQUIRED); return; } - len = cutuserkey(username); - extract_token(password, cmdbuf, 1, '|', sizeof password); - a = create_user(username, len, 0); + a = create_user(username, CREATE_USER_DO_NOT_BECOME_USER, NATIVE_AUTH_UID); if (a == 0) { if (!IsEmptyStr(password)) { @@ -223,16 +213,13 @@ void cmd_creu(char *cmdbuf) safestrncpy(tmp.password, password, sizeof(tmp.password)); CtdlPutUserLock(&tmp); } - cprintf("%d User '%s' created %s.\n", CIT_OK, username, - (!IsEmptyStr(password)) ? "and password set" : - "with no password"); + cprintf("%d User '%s' created %s.\n", CIT_OK, username, (!IsEmptyStr(password)) ? "and password set" : "with no password"); return; } else if (a == ERROR + ALREADY_EXISTS) { cprintf("%d '%s' already exists.\n", ERROR + ALREADY_EXISTS, username); return; } else if ( (CtdlGetConfigInt("c_auth_mode") != AUTHMODE_NATIVE) && (a == ERROR + NO_SUCH_USER) ) { - cprintf("%d User accounts are not created within Citadel in host authentication mode.\n", - ERROR + NO_SUCH_USER); + cprintf("%d User accounts are not created within Citadel in host authentication mode.\n", ERROR + NO_SUCH_USER); return; } else { cprintf("%d An error occurred creating the user account.\n", ERROR + INTERNAL_ERROR); @@ -272,6 +259,7 @@ void cmd_setu(char *new_parms) cprintf("%d Ok\n", CIT_OK); } + /* * set last read pointer */ @@ -346,6 +334,7 @@ void cmd_gtsn(char *argbuf) { client_write(HKEY("\n")); } + /* * INVT and KICK commands */ @@ -361,15 +350,13 @@ void cmd_invt_kick(char *iuser, int op) { /* access granted */ } else { /* access denied */ - cprintf("%d Higher access or room ownership required.\n", - ERROR + HIGHER_ACCESS_REQUIRED); + cprintf("%d Higher access or room ownership required.\n", ERROR + HIGHER_ACCESS_REQUIRED); return; } if (!strncasecmp(CC->room.QRname, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) { - cprintf("%d Can't add/remove users from this room.\n", - ERROR + NOT_HERE); + cprintf("%d Can't add/remove users from this room.\n", ERROR + NOT_HERE); return; } @@ -385,8 +372,15 @@ void cmd_invt_kick(char *iuser, int op) { return; } -void cmd_invt(char *iuser) {cmd_invt_kick(iuser, 1);} -void cmd_kick(char *iuser) {cmd_invt_kick(iuser, 0);} + +void cmd_invt(char *iuser) { + cmd_invt_kick(iuser, 1); +} + + +void cmd_kick(char *iuser) { + cmd_invt_kick(iuser, 0); +} /* @@ -407,6 +401,7 @@ void cmd_forg(char *argbuf) } } + /* * Get Next Unregistered User */ @@ -430,12 +425,9 @@ void cmd_gnur(char *argbuf) cdb_rewind(CDB_USERS); while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) { memset(&usbuf, 0, sizeof(struct ctdluser)); - memcpy(&usbuf, cdbus->ptr, - ((cdbus->len > sizeof(struct ctdluser)) ? - sizeof(struct ctdluser) : cdbus->len)); + memcpy(&usbuf, cdbus->ptr, ((cdbus->len > sizeof(struct ctdluser)) ? sizeof(struct ctdluser) : cdbus->len)); cdb_free(cdbus); - if ((usbuf.flags & US_NEEDVALID) - && (usbuf.axlevel > AxDeleted)) { + if ((usbuf.flags & US_NEEDVALID) && (usbuf.axlevel > AxDeleted)) { cprintf("%d %s\n", MORE_DATA, usbuf.fullname); cdb_close_cursor(CDB_USERS); return; @@ -468,9 +460,7 @@ void cmd_vali(char *v_args) extract_token(user, v_args, 0, '|', sizeof user); newax = extract_int(v_args, 1); - if (CtdlAccessCheck(ac_aide) || - (newax > AxAideU) || - (newax < AxDeleted)) { + if (CtdlAccessCheck(ac_aide) || (newax > AxAideU) || (newax < AxDeleted)) { return; } @@ -494,6 +484,40 @@ void cmd_vali(char *v_args) cprintf("%d User '%s' validated.\n", CIT_OK, userbuf.fullname); } + +/* + * List one user (this works with cmd_list) + */ +void ListThisUser(char *username, void *data) +{ + char *searchstring; + struct ctdluser usbuf; + + if (CtdlGetUser(&usbuf, username) != 0) { + return; + } + + searchstring = (char *)data; + if (bmstrcasestr(usbuf.fullname, searchstring) == NULL) { + return; + } + + if (usbuf.axlevel > AxDeleted) { + if ((CC->user.axlevel >= AxAideU) + || ((usbuf.flags & US_UNLISTED) == 0) + || ((CC->internal_pgm))) { + cprintf("%s|%d|%ld|%ld|%ld|%ld||\n", + usbuf.fullname, + usbuf.axlevel, + usbuf.usernum, + (long)usbuf.lastcall, + usbuf.timescalled, + usbuf.posted); + } + } +} + + /* * List users (searchstring may be empty to list all users) */ @@ -508,8 +532,6 @@ void cmd_list(char *cmdbuf) } - - /* * assorted info we need to check at login */ @@ -523,9 +545,10 @@ void cmd_chek(char *argbuf) return; } - CtdlGetUser(&CC->user, CC->curr_user); /* no lock is needed here */ - if ((REGISCALL != 0) && ((CC->user.flags & US_REGIS) == 0)) + CtdlGetUser(&CC->user, CC->curr_user); // no lock is needed here + if ((REGISCALL != 0) && ((CC->user.flags & US_REGIS) == 0)) { regis = 1; + } if (CC->user.axlevel >= AxAideU) { if (CtdlGetConfigInt("MMflags") & MM_VALID) { @@ -533,8 +556,7 @@ void cmd_chek(char *argbuf) } } - /* check for mail */ - mail = InitialMailCheck(); + mail = InitialMailCheck(); // check for mail cprintf("%d %d|%d|%d|%s|\n", CIT_OK, mail, regis, vali, CC->cs_inet_email); } @@ -586,7 +608,6 @@ void cmd_agup(char *cmdbuf) } - /* * Administrative Set User Parameters */ @@ -637,16 +658,16 @@ void cmd_asup(char *cmdbuf) if (deleted) { snprintf(notify, SIZ, - "User \"%s\" has been deleted by %s.\n", - usbuf.fullname, - (CC->logged_in ? CC->user.fullname : "an administrator") + "User \"%s\" has been deleted by %s.\n", + usbuf.fullname, (CC->logged_in ? CC->user.fullname : "an administrator") ); CtdlAideMessage(notify, "User Deletion Message"); } cprintf("%d Ok", CIT_OK); - if (deleted) + if (deleted) { cprintf(" (%s deleted)", requested_user); + } cprintf("\n"); } @@ -670,6 +691,77 @@ void cmd_isme(char *argbuf) { } +/* + * Administrative Get Email Addresses + */ +void cmd_agea(char *cmdbuf) +{ + struct ctdluser usbuf; + char requested_user[128]; + int i, num_e; + char e[512]; + + if (CtdlAccessCheck(ac_aide)) { + return; + } + + extract_token(requested_user, cmdbuf, 0, '|', sizeof requested_user); + if (CtdlGetUser(&usbuf, requested_user) != 0) { + cprintf("%d No such user.\n", ERROR + NO_SUCH_USER); + return; + } + cprintf("%d internet email addresses for %s\n", LISTING_FOLLOWS, usbuf.fullname); + num_e = num_tokens(usbuf.emailaddrs, '|'); + for (i=0; i= 0 && strcmp(buf, "000")) { + if ( // addresses must be: + (!IsEmptyStr(buf)) // non-empty + && ((strlen(new_emailaddrs) + strlen(buf) + 2) < sizeof(new_emailaddrs)) // fit in the remaining buffer + && (IsDirectory(buf, 0)) // in one of our own domains + && ( // not belong to someone else + (CtdlDirectoryLookup(whodat, buf, sizeof whodat) != 0) + || (!strcasecmp(whodat, requested_user)) + ) + ) { + if (!IsEmptyStr(new_emailaddrs)) { + strcat(new_emailaddrs, "|"); + } + strcat(new_emailaddrs, buf); + } + } + + + CtdlSetEmailAddressesForUser(requested_user, new_emailaddrs); +} + + /* * Set the preferred view for the current user/room combination */ @@ -714,7 +806,8 @@ void cmd_renu(char *cmdbuf) return; case RENAMEUSER_LOGGED_IN: cprintf("%d '%s' is currently logged in and cannot be renamed.\n", - ERROR + ALREADY_LOGGED_IN , oldname); + ERROR + ALREADY_LOGGED_IN , oldname + ); return; case RENAMEUSER_NOT_FOUND: cprintf("%d '%s' does not exist.\n", ERROR + NO_SUCH_USER, oldname); @@ -728,7 +821,6 @@ void cmd_renu(char *cmdbuf) } - void cmd_quit(char *argbuf) { cprintf("%d Goodbye.\n", CIT_OK); @@ -771,6 +863,8 @@ CTDL_MODULE_INIT(serv_user) CtdlRegisterProtoHook(cmd_qusr, "QUSR", "check to see if a user exists"); CtdlRegisterProtoHook(cmd_agup, "AGUP", "Administratively Get User Parameters"); CtdlRegisterProtoHook(cmd_asup, "ASUP", "Administratively Set User Parameters"); + CtdlRegisterProtoHook(cmd_agea, "AGEA", "Administratively Get Email Addresses"); + CtdlRegisterProtoHook(cmd_asea, "ASEA", "Administratively Set Email Addresses"); CtdlRegisterProtoHook(cmd_seen, "SEEN", "Manipulate seen/unread message flags"); CtdlRegisterProtoHook(cmd_gtsn, "GTSN", "Fetch seen/unread message flags"); CtdlRegisterProtoHook(cmd_view, "VIEW", "Set preferred view for user/room combination");