]> code.citadel.org Git - citadel.git/blobdiff - citadel/user_ops.c
* Minor and/or cosmetic changes made during x64 troubleshooting
[citadel.git] / citadel / user_ops.c
index 2d343ae3caff32ce59a32f56ef97fbd4c63a2f2f..72ebc12986080952a3f6839d844958fe86fdb4b2 100644 (file)
@@ -79,7 +79,9 @@ int getuser(struct ctdluser *usbuf, char name[])
        struct cdbdata *cdbus;
        int using_sysuser = 0;
 
-       memset(usbuf, 0, sizeof(struct ctdluser));
+       if (usbuf != NULL) {
+               memset(usbuf, 0, sizeof(struct ctdluser));
+       }
 
 #ifdef ENABLE_AUTOLOGIN
        if (CtdlAssociateSystemUser(sysuser_name, name) == 0) {
@@ -98,9 +100,11 @@ int getuser(struct ctdluser *usbuf, char name[])
        if (cdbus == NULL) {    /* user not found */
                return(1);
        }
-       memcpy(usbuf, cdbus->ptr,
-              ((cdbus->len > sizeof(struct ctdluser)) ?
-               sizeof(struct ctdluser) : cdbus->len));
+       if (usbuf != NULL) {
+               memcpy(usbuf, cdbus->ptr,
+                       ((cdbus->len > sizeof(struct ctdluser)) ?
+                        sizeof(struct ctdluser) : cdbus->len));
+       }
        cdb_free(cdbus);
 
        return (0);
@@ -354,8 +358,8 @@ int CtdlLoginExistingUser(char *trythisname)
        struct recptypes *valid = NULL;
 
        if (trythisname == NULL) return login_not_found;
-       safestrncpy(username, trythisname, sizeof username);
-       strproc(username);
+       safestrncpy(username, trythisname, USERNAME_SIZE);
+       striplt(username);
 
        if ((CC->logged_in)) {
                return login_already_logged_in;
@@ -368,16 +372,31 @@ int CtdlLoginExistingUser(char *trythisname)
         * is an e-mail address
         */
        if (found_user != 0) {
-               valid = validate_recipients(trythisname);
+               valid = validate_recipients(username);
                if (valid != NULL) {
                        if (valid->num_local == 1) {
                                found_user = getuser(&CC->user,
                                                valid->recp_local);
                        }
-                       phree(valid);
+                       free(valid);
                }
        }
 
+#ifdef ENABLE_AUTOLOGIN
+       /* If we haven't found the account yet, and the supplied name
+        * is a login name on the underlying host system, create the
+        * account.
+        */
+       if (found_user != 0) {
+               struct passwd *p = (struct passwd *) getpwnam(username);
+
+               if (p != NULL) {
+                       create_user(username, 0);
+                       found_user = getuser(&CC->user, username);
+               }
+       }
+#endif /* ENABLE_AUTOLOGIN */
+
        /* Did we find something? */
        if (found_user == 0) {
                if (((CC->nologin)) && (CC->user.axlevel < 6)) {
@@ -423,6 +442,7 @@ void cmd_user(char *cmdbuf)
        case login_not_found:
                cprintf("%d %s not found.\n", ERROR + NO_SUCH_USER, username);
                return;
+       default:
                cprintf("%d Internal error\n", ERROR + INTERNAL_ERROR);
        }
 }
@@ -467,8 +487,8 @@ void session_startup(void)
        /* Create any personal rooms required by the system.
         * (Technically, MAILROOM should be there already, but just in case...)
         */
-       create_room(MAILROOM, 4, "", 0, 1, 0);
-       create_room(SENTITEMS, 4, "", 0, 1, 0);
+       create_room(MAILROOM, 4, "", 0, 1, 0, VIEW_BBS);
+       create_room(SENTITEMS, 4, "", 0, 1, 0, VIEW_BBS);
 
        /* Run any startup routines registered by loadable modules */
        PerformSessionHooks(EVT_LOGIN);
@@ -684,8 +704,6 @@ void cmd_pass(char *buf)
        case pass_ok:
                logged_in_response();
                return;
-               cprintf("%d Can't find user record!\n",
-                       ERROR + INTERNAL_ERROR);
        }
 }
 
@@ -729,7 +747,7 @@ int purge_user(char pname[])
        lprintf(CTDL_NOTICE, "Deleting user <%s>\n", pname);
 
        /* Perform any purge functions registered by server extensions */
-       PerformUserHooks(usbuf.fullname, usbuf.usernum, EVT_PURGEUSER);
+       PerformUserHooks(&usbuf, EVT_PURGEUSER);
 
        /* delete any existing user/room relationships */
        cdb_delete(CDB_VISIT, &usbuf.usernum, sizeof(long));
@@ -760,7 +778,6 @@ int create_user(char *newusername, int become_user)
 {
        struct ctdluser usbuf;
        struct ctdlroom qrbuf;
-       struct passwd *p = NULL;
        char username[SIZ];
        char mailboxname[ROOMNAMELEN];
        uid_t uid;
@@ -769,12 +786,15 @@ int create_user(char *newusername, int become_user)
        strproc(username);
 
 #ifdef ENABLE_AUTOLOGIN
-       p = (struct passwd *) getpwnam(username);
-       if (p != NULL) {
-               extract_token(username, p->pw_gecos, 0, ',');
-               uid = p->pw_uid;
-       } else {
-               uid = (-1);
+       {
+               struct passwd *p = (struct passwd *) getpwnam(username);
+
+               if (p != NULL) {
+                       extract_token(username, p->pw_gecos, 0, ',');
+                       uid = p->pw_uid;
+               } else {
+                       uid = (-1);
+               }
        }
 #else
        uid = (-1);
@@ -816,17 +836,20 @@ int create_user(char *newusername, int become_user)
         * Make the latter an invisible system room.
         */
        MailboxName(mailboxname, sizeof mailboxname, &usbuf, MAILROOM);
-       create_room(mailboxname, 5, "", 0, 1, 1);
+       create_room(mailboxname, 5, "", 0, 1, 1, VIEW_BBS);
 
        MailboxName(mailboxname, sizeof mailboxname, &usbuf, USERCONFIGROOM);
-       create_room(mailboxname, 5, "", 0, 1, 1);
+       create_room(mailboxname, 5, "", 0, 1, 1, VIEW_BBS);
         if (lgetroom(&qrbuf, mailboxname) == 0) {
                 qrbuf.QRflags2 |= QR2_SYSTEM;
                 lputroom(&qrbuf);
         }
 
+       /* Perform any create functions registered by server extensions */
+       PerformUserHooks(&usbuf, EVT_NEWUSER);
+
        /* Everything below this line can be bypassed if administratively
-          creating a user, instead of doing self-service account creation
+        * creating a user, instead of doing self-service account creation
         */
 
        if (become_user) {
@@ -1558,7 +1581,7 @@ int InitialMailCheck()
         cdbfr = cdb_fetch(CDB_MSGLISTS, &mailbox.QRnumber, sizeof(long));
 
         if (cdbfr != NULL) {
-                msglist = mallok(cdbfr->len);
+                msglist = malloc(cdbfr->len);
                 memcpy(msglist, cdbfr->ptr, cdbfr->len);
                 num_msgs = cdbfr->len / sizeof(long);
                 cdb_free(cdbfr);
@@ -1572,7 +1595,7 @@ int InitialMailCheck()
                         }
                 }
         if (msglist != NULL)
-                phree(msglist);
+                free(msglist);
 
         return (num_newmsgs);
 }