]> code.citadel.org Git - citadel.git/blobdiff - citadel/user_ops.c
Replaced some of the 'autoconverted - document me' strings
[citadel.git] / citadel / user_ops.c
index f95c3bab5c4d9380f0dc0bc4858a0dc8cbaa0b57..2737c0446d78111af898ba3506d897fdd851afdb 100644 (file)
@@ -1,8 +1,5 @@
 /* 
- * $Id$
- *
  * Server functions which perform operations on user objects.
- *
  */
 
 #include "sysdep.h"
@@ -38,7 +35,6 @@
 #include "citadel.h"
 #include "server.h"
 #include "database.h"
-#include "user_ops.h"
 #include "sysdep_decls.h"
 #include "support.h"
 #include "room_ops.h"
 
 #include "ctdl_module.h"
 
+////#define CTDL_INLINE_USR INLINE
+#include "user_ops.h"
+
 /* These pipes are used to talk to the chkpwd daemon, which is forked during startup */
 int chkpwd_write_pipe[2];
 int chkpwd_read_pipe[2];
 
-/*
- * makeuserkey() - convert a username into the format used as a database key
- *              (it's just the username converted into lower case)
- */
-INLINE void makeuserkey(char *key, const char *username) {
-       int i, len;
-
-       len = strlen(username);
-       if (len >= USERNAME_SIZE)
-       {
-               CtdlLogPrintf (CTDL_EMERG, "Username to long: %s", username);
-               cit_backtrace ();
-               len = USERNAME_SIZE - 1; 
-               /* WHOOPSI! whats that??? todo. */
-               ((char*)username)[USERNAME_SIZE - 1]='\0';
-       }
-       for (i=0; i<=len; ++i) {
-               key[i] = tolower(username[i]);
-       }
-}
 
 
 /*
@@ -95,7 +74,7 @@ int getuser(struct ctdluser *usbuf, char name[])
  * CtdlGetUser()  -  retrieve named user into supplied buffer.
  *            returns 0 on success
  */
-int CtdlGetUser(struct ctdluser *usbuf, const char *name)
+int CtdlGetUserLen(struct ctdluser *usbuf, const char *name, long len)
 {
 
        char usernamekey[USERNAME_SIZE];
@@ -105,7 +84,7 @@ int CtdlGetUser(struct ctdluser *usbuf, const char *name)
                memset(usbuf, 0, sizeof(struct ctdluser));
        }
 
-       makeuserkey(usernamekey, name);
+       makeuserkey(usernamekey, name, len);
        cdbus = cdb_fetch(CDB_USERS, usernamekey, strlen(usernamekey));
 
        if (cdbus == NULL) {    /* user not found */
@@ -122,6 +101,12 @@ int CtdlGetUser(struct ctdluser *usbuf, const char *name)
 }
 
 
+int CtdlGetUser(struct ctdluser *usbuf, char *name)
+{
+       return CtdlGetUserLen(usbuf, name, cutuserkey(name));
+}
+
+
 /*
  * CtdlGetUserLock()  -  same as getuser() but locks the record
  */
@@ -153,7 +138,9 @@ void CtdlPutUser(struct ctdluser *usbuf)
 {
        char usernamekey[USERNAME_SIZE];
 
-       makeuserkey(usernamekey, usbuf->fullname);
+       makeuserkey(usernamekey, 
+                   usbuf->fullname, 
+                   cutuserkey(usbuf->fullname));
 
        usbuf->version = REV_LEVEL;
        cdb_store(CDB_USERS,
@@ -205,8 +192,8 @@ int rename_user(char *oldname, char *newname) {
        char newnamekey[USERNAME_SIZE];
 
        /* Create the database keys... */
-       makeuserkey(oldnamekey, oldname);
-       makeuserkey(newnamekey, newname);
+       makeuserkey(oldnamekey, oldname, cutuserkey(oldname));
+       makeuserkey(newnamekey, newname, cutuserkey(newname));
 
        /* Lock up and get going */
        begin_critical_section(S_USERS);
@@ -279,7 +266,7 @@ int GenerateRelationshipIndex(char *IndexBuf,
 /*
  * Back end for CtdlSetRelationship()
  */
-void put_visit(struct visit *newvisit)
+void put_visit(visit *newvisit)
 {
        char IndexBuf[32];
        int IndexLen = 0;
@@ -293,7 +280,7 @@ void put_visit(struct visit *newvisit)
 
        /* Store the record */
        cdb_store(CDB_VISIT, IndexBuf, IndexLen,
-                 newvisit, sizeof(struct visit)
+                 newvisit, sizeof(visit)
        );
 }
 
@@ -303,7 +290,7 @@ void put_visit(struct visit *newvisit)
 /*
  * Define a relationship between a user and a room
  */
-void CtdlSetRelationship(struct visit *newvisit,
+void CtdlSetRelationship(visit *newvisit,
                         struct ctdluser *rel_user,
                         struct ctdlroom *rel_room)
 {
@@ -322,7 +309,7 @@ void CtdlSetRelationship(struct visit *newvisit,
 /*
  * Locate a relationship between a user and a room
  */
-void CtdlGetRelationship(struct visit *vbuf,
+void CtdlGetRelationship(visit *vbuf,
                         struct ctdluser *rel_user,
                         struct ctdlroom *rel_room)
 {
@@ -338,13 +325,13 @@ void CtdlGetRelationship(struct visit *vbuf,
                                             rel_user->usernum);
 
        /* Clear out the buffer */
-       memset(vbuf, 0, sizeof(struct visit));
+       memset(vbuf, 0, sizeof(visit));
 
        cdbvisit = cdb_fetch(CDB_VISIT, IndexBuf, IndexLen);
        if (cdbvisit != NULL) {
                memcpy(vbuf, cdbvisit->ptr,
-                      ((cdbvisit->len > sizeof(struct visit)) ?
-                       sizeof(struct visit) : cdbvisit->len));
+                      ((cdbvisit->len > sizeof(visit)) ?
+                       sizeof(visit) : cdbvisit->len));
                cdb_free(cdbvisit);
        }
        else {
@@ -528,6 +515,7 @@ int CtdlLoginExistingUser(char *authname, const char *trythisname)
 {
        char username[SIZ];
        int found_user;
+       long len;
 
        CtdlLogPrintf(9, "CtdlLoginExistingUser(%s, %s)\n", authname, trythisname);
 
@@ -552,8 +540,9 @@ int CtdlLoginExistingUser(char *authname, const char *trythisname)
        }
 
        /* Continue attempting user validation... */
-       safestrncpy(username, trythisname, USERNAME_SIZE);
+       safestrncpy(username, trythisname, sizeof (username));
        striplt(username);
+       len = cutuserkey(username);
 
        if (IsEmptyStr(username)) {
                return login_not_found;
@@ -592,7 +581,8 @@ int CtdlLoginExistingUser(char *authname, const char *trythisname)
                CtdlLogPrintf(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);
+                       len = cutuserkey(username);
+                       create_user(username, len, 0);
                        found_user = getuserbyuid(&CC->user, pd.pw_uid);
                }
 
@@ -614,7 +604,7 @@ int CtdlLoginExistingUser(char *authname, const char *trythisname)
 
                found_user = getuserbyuid(&CC->user, ldap_uid);
                if (found_user != 0) {
-                       create_user(trythisname, 0);
+                       create_user(username, len, 0);
                        found_user = getuserbyuid(&CC->user, ldap_uid);
                }
 
@@ -749,7 +739,7 @@ void do_login(void)
        CtdlCreateRoom(MAILROOM, 4, "", 0, 1, 0, VIEW_MAILBOX);
        CtdlCreateRoom(SENTITEMS, 4, "", 0, 1, 0, VIEW_MAILBOX);
        CtdlCreateRoom(USERTRASHROOM, 4, "", 0, 1, 0, VIEW_MAILBOX);
-       /* CtdlCreateRoom(USERDRAFTROOM, 4, "", 0, 1, 0, VIEW_MAILBOX); temporarily disabled for 7.60 */
+       CtdlCreateRoom(USERDRAFTROOM, 4, "", 0, 1, 0, VIEW_MAILBOX);
 
        /* Run any startup routines registered by loadable modules */
        PerformSessionHooks(EVT_LOGIN);
@@ -781,7 +771,7 @@ void logout(void)
 
 void CtdlUserLogout(void)
 {
-       CitContext *CCC = CC;   /* CachedCitContext - performance boost */
+       CitContext *CCC = MyContext();
        /*
         * If there is a download in progress, abort it.
         */
@@ -901,7 +891,7 @@ void start_chkpwd_daemon(void) {
 }
 
 
-int CtdlTryPassword(char *password)
+int CtdlTryPassword(const char *password, long len)
 {
        int code;
 
@@ -973,13 +963,17 @@ int CtdlTryPassword(char *password)
        else {
 
                /* native auth mode */
+               char *pw;
 
-               strproc(password);
+               pw = (char*) malloc(len + 1);
+               memcpy(pw, password, len + 1);
+               strproc(pw);
                strproc(CC->user.password);
-               code = strcasecmp(CC->user.password, password);
-               strproc(password);
+               code = strcasecmp(CC->user.password, pw);
+               strproc(pw);
                strproc(CC->user.password);
-               code = strcasecmp(CC->user.password, password);
+               code = strcasecmp(CC->user.password, pw);
+               free (pw);
        }
 
        if (!code) {
@@ -994,12 +988,13 @@ int CtdlTryPassword(char *password)
 
 void cmd_pass(char *buf)
 {
-       char password[256];
+       char password[SIZ];
        int a;
+       long len;
 
        memset(password, 0, sizeof(password));
-       extract_token(password, buf, 0, '|', sizeof password);
-       a = CtdlTryPassword(password);
+       len = extract_token(password, buf, 0, '|', sizeof password);
+       a = CtdlTryPassword(password, len);
 
        switch (a) {
        case pass_already_logged_in:
@@ -1029,7 +1024,7 @@ int purge_user(char pname[])
        struct ctdluser usbuf;
        char usernamekey[USERNAME_SIZE];
 
-       makeuserkey(usernamekey, pname);
+       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))
@@ -1093,9 +1088,9 @@ int purge_user(char pname[])
 }
 
 
-int internal_create_user (const char *username, struct ctdluser *usbuf, uid_t uid)
+int internal_create_user (const char *username, long len, struct ctdluser *usbuf, uid_t uid)
 {
-       if (!CtdlGetUser(usbuf, username)) {
+       if (!CtdlGetUserLen(usbuf, username, len)) {
                return (ERROR + ALREADY_EXISTS);
        }
 
@@ -1111,8 +1106,6 @@ int internal_create_user (const char *username, struct ctdluser *usbuf, uid_t ui
        usbuf->timescalled = 0;
        usbuf->posted = 0;
        usbuf->axlevel = config.c_initax;
-       usbuf->USscreenwidth = 80;
-       usbuf->USscreenheight = 24;
        usbuf->lastcall = time(NULL);
 
        /* fetch a new user number */
@@ -1134,7 +1127,7 @@ int internal_create_user (const char *username, struct ctdluser *usbuf, uid_t ui
  * Set 'become_user' to nonzero if this is self-service account creation and we want
  * to actually log in as the user we just created, otherwise set it to 0.
  */
-int create_user(const char *newusername, int become_user)
+int create_user(const char *newusername, long len, int become_user)
 {
        struct ctdluser usbuf;
        struct ctdlroom qrbuf;
@@ -1155,7 +1148,7 @@ int create_user(const char *newusername, int become_user)
 
                struct passwd pd;
                struct passwd *tempPwdPtr;
-               char pwdbuffer[256];
+               char pwdbuffer[SIZ];
        
 #ifdef HAVE_GETPWNAM_R
 #ifdef SOLARIS_GETPWUID
@@ -1172,6 +1165,7 @@ int create_user(const char *newusername, int become_user)
                        if (IsEmptyStr (username))
                        {
                                safestrncpy(username, pd.pw_name, sizeof username);
+                               len = cutuserkey(username);
                        }
                }
                else {
@@ -1187,7 +1181,7 @@ int create_user(const char *newusername, int become_user)
        }
 #endif /* HAVE_LDAP */
        
-       if ((retval = internal_create_user(username, &usbuf, uid)) != 0)
+       if ((retval = internal_create_user(username, len, &usbuf, uid)) != 0)
                return retval;
        
        /*
@@ -1242,6 +1236,7 @@ int create_user(const char *newusername, int become_user)
 void cmd_newu(char *cmdbuf)
 {
        int a;
+       long len;
        char username[26];
 
        if (config.c_auth_mode != AUTHMODE_NATIVE) {
@@ -1266,8 +1261,8 @@ void cmd_newu(char *cmdbuf)
                        config.c_nodename, config.c_maxsessions);
        }
        extract_token(username, cmdbuf, 0, '|', sizeof username);
-       username[25] = 0;
        strproc(username);
+       len = cutuserkey(username);
 
        if (IsEmptyStr(username)) {
                cprintf("%d You must supply a user name.\n", ERROR + USERNAME_REQUIRED);
@@ -1281,7 +1276,7 @@ void cmd_newu(char *cmdbuf)
                return;
        }
 
-       a = create_user(username, 1);
+       a = create_user(username, len, 1);
 
        if (a == 0) {
                logged_in_response();
@@ -1357,8 +1352,9 @@ void cmd_setp(char *new_pw)
 void cmd_creu(char *cmdbuf)
 {
        int a;
-       char username[26];
-       char password[32];
+       long len;
+       char username[SIZ];
+       char password[SIZ];
        struct ctdluser tmp;
 
        if (CtdlAccessCheck(ac_aide)) {
@@ -1367,17 +1363,18 @@ void cmd_creu(char *cmdbuf)
 
        extract_token(username, cmdbuf, 0, '|', sizeof username);
        extract_token(password, cmdbuf, 1, '|', sizeof password);
-       username[25] = 0;
-       password[31] = 0;
+       ////username[25] = 0;
+       //password[31] = 0;
        strproc(username);
        strproc(password);
+       len = cutuserkey(username);
 
        if (IsEmptyStr(username)) {
                cprintf("%d You must supply a user name.\n", ERROR + USERNAME_REQUIRED);
                return;
        }
 
-       a = create_user(username, 0);
+       a = create_user(username, len, 0);
 
        if (a == 0) {
                if (!IsEmptyStr(password)) {
@@ -1413,12 +1410,10 @@ void cmd_getu(char *cmdbuf)
                return;
 
        CtdlGetUser(&CC->user, CC->curr_user);
-       cprintf("%d %d|%d|%d|\n",
+       cprintf("%d 80|24|%d|\n",
                CIT_OK,
-               CC->user.USscreenwidth,
-               CC->user.USscreenheight,
                (CC->user.flags & US_USER_SET)
-           );
+       );
 }
 
 /*
@@ -1434,12 +1429,8 @@ void cmd_setu(char *new_parms)
                return;
        }
        CtdlGetUserLock(&CC->user, CC->curr_user);
-       CC->user.USscreenwidth = extract_int(new_parms, 0);
-       CC->user.USscreenheight = extract_int(new_parms, 1);
        CC->user.flags = CC->user.flags & (~US_USER_SET);
-       CC->user.flags = CC->user.flags |
-           (extract_int(new_parms, 2) & US_USER_SET);
-
+       CC->user.flags = CC->user.flags | (extract_int(new_parms, 2) & US_USER_SET);
        CtdlPutUserLock(&CC->user);
        cprintf("%d Ok\n", CIT_OK);
 }
@@ -1450,8 +1441,8 @@ void cmd_setu(char *new_parms)
 void cmd_slrp(char *new_ptr)
 {
        long newlr;
-       struct visit vbuf;
-       struct visit original_vbuf;
+       visit vbuf;
+       visit original_vbuf;
 
        if (CtdlAccessCheck(ac_logged_in)) {
                return;
@@ -1466,7 +1457,7 @@ void cmd_slrp(char *new_ptr)
        CtdlGetUserLock(&CC->user, CC->curr_user);
 
        CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
-       memcpy(&original_vbuf, &vbuf, sizeof(struct visit));
+       memcpy(&original_vbuf, &vbuf, sizeof(visit));
        vbuf.v_lastseen = newlr;
        snprintf(vbuf.v_seen, sizeof vbuf.v_seen, "*:%ld", newlr);
 
@@ -1504,14 +1495,18 @@ void cmd_seen(char *argbuf) {
 
 
 void cmd_gtsn(char *argbuf) {
-       char buf[SIZ];
+       visit vbuf;
 
        if (CtdlAccessCheck(ac_logged_in)) {
                return;
        }
 
-       CtdlGetSeen(buf, ctdlsetseen_seen);
-       cprintf("%d %s\n", CIT_OK, buf);
+       /* Learn about the user and room in question */
+       CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
+
+       cprintf("%d ", CIT_OK);
+       client_write(vbuf.v_seen, strlen(vbuf.v_seen));
+       client_write(HKEY("\n"));
 }
 
 
@@ -1523,7 +1518,7 @@ void cmd_gtsn(char *argbuf) {
  */
 int CtdlInvtKick(char *iuser, int op) {
        struct ctdluser USscratch;
-       struct visit vbuf;
+       visit vbuf;
        char bbb[SIZ];
 
        if (CtdlGetUser(&USscratch, iuser) != 0) {
@@ -1562,8 +1557,9 @@ void cmd_invt_kick(char *iuser, int op) {
         * These commands are only allowed by aides, room aides,
         * and room namespace owners
         */
-       if (is_room_aide()
-          || (atol(CC->room.QRname) == CC->user.usernum) ) {
+       if (is_room_aide()) {
+               /* access granted */
+       } else if ( ((atol(CC->room.QRname) == CC->user.usernum) ) && (CC->user.usernum != 0) ) {
                /* access granted */
        } else {
                /* access denied */
@@ -1599,7 +1595,7 @@ void cmd_kick(char *iuser) {cmd_invt_kick(iuser, 0);}
  * Returns 0 on success
  */
 int CtdlForgetThisRoom(void) {
-       struct visit vbuf;
+       visit vbuf;
 
        /* On some systems, Aides are not allowed to forget rooms */
        if (is_aide() && (config.c_aide_zap == 0)
@@ -1959,7 +1955,7 @@ int InitialMailCheck()
        int a;
        char mailboxname[ROOMNAMELEN];
        struct ctdlroom mailbox;
-       struct visit vbuf;
+       visit vbuf;
        struct cdbdata *cdbfr;
        long *msglist = NULL;
        int num_msgs = 0;
@@ -1998,7 +1994,7 @@ int InitialMailCheck()
  */
 void cmd_view(char *cmdbuf) {
        int requested_view;
-       struct visit vbuf;
+       visit vbuf;
 
        if (CtdlAccessCheck(ac_logged_in)) {
                return;
@@ -2060,19 +2056,19 @@ void cmd_renu(char *cmdbuf)
 CTDL_MODULE_INIT(user_ops)
 {
        if (!threading) {
-               CtdlRegisterProtoHook(cmd_user, "USER", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_pass, "PASS", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_creu, "CREU", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_setp, "SETP", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_getu, "GETU", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_setu, "SETU", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_slrp, "SLRP", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_invt, "INVT", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_kick, "KICK", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_forg, "FORG", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_user, "USER", "Submit username for login");
+               CtdlRegisterProtoHook(cmd_pass, "PASS", "Complete login by submitting a password");
+               CtdlRegisterProtoHook(cmd_creu, "CREU", "Create User");
+               CtdlRegisterProtoHook(cmd_setp, "SETP", "Set the password for an account");
+               CtdlRegisterProtoHook(cmd_getu, "GETU", "Get User parameters");
+               CtdlRegisterProtoHook(cmd_setu, "SETU", "Set User parameters");
+               CtdlRegisterProtoHook(cmd_slrp, "SLRP", "Set Last Read Pointer");
+               CtdlRegisterProtoHook(cmd_invt, "INVT", "Invite a user to a room");
+               CtdlRegisterProtoHook(cmd_kick, "KICK", "Kick a user out of a room");
+               CtdlRegisterProtoHook(cmd_forg, "FORG", "Forget a room");
                CtdlRegisterProtoHook(cmd_gnur, "GNUR", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_vali, "VALI", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_list, "LIST", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_vali, "VALI", "Validate new users");
+               CtdlRegisterProtoHook(cmd_list, "LIST", "List users");
                CtdlRegisterProtoHook(cmd_chek, "CHEK", "Autoconverted. TODO: document me.");
                CtdlRegisterProtoHook(cmd_qusr, "QUSR", "Autoconverted. TODO: document me.");
                CtdlRegisterProtoHook(cmd_agup, "AGUP", "Autoconverted. TODO: document me.");
@@ -2084,5 +2080,5 @@ CTDL_MODULE_INIT(user_ops)
                CtdlRegisterProtoHook(cmd_newu, "NEWU", "Autoconverted. TODO: document me.");
        }
        /* return our Subversion id for the Log */
-       return "$Id$";
+       return "user_ops";
 }