]> code.citadel.org Git - citadel.git/blobdiff - citadel/server/user_ops.c
validate_recipients() - completed removal of unused param
[citadel.git] / citadel / server / user_ops.c
index 31bd579d3ab15a884a698142c35c9272a5f550f8..e35b00a27e71b222b20c5f3772b9b7aaac255552 100644 (file)
@@ -18,6 +18,7 @@
 #include "citadel_ldap.h"
 #include "ctdl_module.h"
 #include "user_ops.h"
+#include "room_ops.h"
 #include "makeuserkey.h"
 #include "internet_addressing.h"
 
@@ -42,7 +43,7 @@ int CtdlUserCmp(char *s1, char *s2) {
 //                     returns 0 on success
 int CtdlGetUser(struct ctdluser *usbuf, char *name) {
        char usernamekey[USERNAME_SIZE];
-       struct cdbdata *cdbus;
+       struct cdbdata cdbus;
 
        if (usbuf != NULL) {
                memset(usbuf, 0, sizeof(struct ctdluser));
@@ -54,13 +55,12 @@ int CtdlGetUser(struct ctdluser *usbuf, char *name) {
        }
        cdbus = cdb_fetch(CDB_USERS, usernamekey, strlen(usernamekey));
 
-       if (cdbus == NULL) {    // user not found
+       if (cdbus.ptr == NULL) {        // user not found
                return(1);
        }
        if (usbuf != NULL) {
-               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);
        return(0);
 }
 
@@ -178,7 +178,7 @@ void reindex_user_928(char *username, void *out_data) {
 
        char oldkey[USERNAME_SIZE];
        char newkey[USERNAME_SIZE];
-       struct cdbdata *cdbus;
+       struct cdbdata cdbus;
        struct ctdluser usbuf;
 
        makeuserkey_pre928(oldkey, username);
@@ -188,12 +188,11 @@ void reindex_user_928(char *username, void *out_data) {
 
        // Fetch the user record using the old index format
        cdbus = cdb_fetch(CDB_USERS, oldkey, strlen(oldkey));
-       if (cdbus == NULL) {
+       if (cdbus.ptr == NULL) {
                syslog(LOG_INFO, "user_ops: <%s> not found, were they already reindexed?", username);
                return;
        }
-       memcpy(&usbuf, cdbus->ptr, ((cdbus->len > sizeof(struct ctdluser)) ? sizeof(struct ctdluser) : cdbus->len));
-       cdb_free(cdbus);
+       memcpy(&usbuf, cdbus.ptr, ((cdbus.len > sizeof(struct ctdluser)) ? sizeof(struct ctdluser) : cdbus.len));
 
        // delete the old record
        cdb_delete(CDB_USERS, oldkey, strlen(oldkey));
@@ -235,7 +234,7 @@ void CtdlSetRelationship(struct visit *newvisit, struct ctdluser *rel_user, stru
 
 // Locate a relationship between a user and a room
 void CtdlGetRelationship(struct visit *vbuf, struct ctdluser *rel_user, struct ctdlroom *rel_room) {
-       struct cdbdata *cdbvisit;
+       struct cdbdata cdbvisit;
 
        // Clear out the buffer
        memset(vbuf, 0, sizeof(struct visit));
@@ -246,9 +245,8 @@ void CtdlGetRelationship(struct visit *vbuf, struct ctdluser *rel_user, struct c
        vbuf->v_usernum = rel_user->usernum;
 
        cdbvisit = cdb_fetch(CDB_VISIT, vbuf, (sizeof(long)*3));
-       if (cdbvisit != NULL) {
-               memcpy(vbuf, cdbvisit->ptr, ((cdbvisit->len > sizeof(struct visit)) ?  sizeof(struct visit) : cdbvisit->len));
-               cdb_free(cdbvisit);
+       if (cdbvisit.ptr != NULL) {
+               memcpy(vbuf, cdbvisit.ptr, ((cdbvisit.len > sizeof(struct visit)) ? sizeof(struct visit) : cdbvisit.len));
        }
        else {
                // If this is the first time the user has seen this room, set the view to be the default for the room.
@@ -356,18 +354,17 @@ int is_room_aide(void) {
 // CtdlGetUserByNumber() - get user by number, returns 0 if user was found
 // Note: fetching a user this way requires one additional database operation.
 int CtdlGetUserByNumber(struct ctdluser *usbuf, long number) {
-       struct cdbdata *cdbun;
+       struct cdbdata cdbun;
        int r;
 
        cdbun = cdb_fetch(CDB_USERSBYNUMBER, &number, sizeof(long));
-       if (cdbun == NULL) {
+       if (cdbun.ptr == NULL) {
                syslog(LOG_INFO, "user_ops: %ld not found", number);
                return(-1);
        }
 
-       syslog(LOG_INFO, "user_ops: %ld maps to %s", number, cdbun->ptr);
-       r = CtdlGetUser(usbuf, cdbun->ptr);
-       cdb_free(cdbun);
+       syslog(LOG_INFO, "user_ops: %ld maps to %s", number, cdbun.ptr);
+       r = CtdlGetUser(usbuf, cdbun.ptr);
        return(r);
 }
 
@@ -394,16 +391,15 @@ void rebuild_usersbynumber(void) {
 //                     Returns 0 if user was found
 int getuserbyuid(struct ctdluser *usbuf, uid_t number) {
 
-       struct cdbdata *cdbus;
+       struct cdbkeyval cdbus;
        struct ctdluser *usptr;
        int return_value = (-1);
 
-       // Yes, we do this the long way.
+       // Yes, we do this the long way.  Someday we might want to try an index.
        // No, we don't use CtdlForEachUser() because that requires multiple reads for each record
-       // TODO: make an index
        cdb_rewind(CDB_USERS);
-       while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) {
-               usptr = (struct ctdluser *) cdbus->ptr;
+       while (cdbus = cdb_next_item(CDB_USERS), cdbus.val.ptr!=NULL) {         // always read through to the end
+               usptr = (struct ctdluser *) cdbus.val.ptr;
 
                if (usptr->uid == number) {
                        syslog(LOG_DEBUG, "user_ops: found uid=%d username=%s", usptr->uid, usptr->fullname);
@@ -509,7 +505,7 @@ int CtdlLoginExistingUser(const char *trythisname) {
        
                // If that didn't work, try to log in as if the supplied name * is an e-mail address
                if (found_user != 0) {
-                       valid = validate_recipients(username, NULL, 0);
+                       valid = validate_recipients(username, 0);
                        if (valid != NULL) {
                                if (valid->num_local == 1) {
                                        found_user = CtdlGetUser(&CC->user, valid->recp_local);
@@ -1034,7 +1030,7 @@ int CtdlForgetThisRoom(void) {
 // Traverse the user file and perform a callback for each user record.
 // (New improved version that runs in two phases so that callbacks can perform writes without having a r/o cursor open)
 void ForEachUser(void (*CallBack) (char *, void *out_data), void *in_data) {
-       struct cdbdata *cdbus;
+       struct cdbkeyval cdbus;
        struct ctdluser *usptr;
 
        Array *all_users = array_new(USERNAME_SIZE);
@@ -1044,11 +1040,10 @@ void ForEachUser(void (*CallBack) (char *, void *out_data), void *in_data) {
        }
 
 
-       cdb_rewind(CDB_USERS);
-
        // Phase 1 : build an array of all our user account names
-       while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) {
-               usptr = (struct ctdluser *) cdbus->ptr;
+       cdb_rewind(CDB_USERS);
+       while (cdbus = cdb_next_item(CDB_USERS), cdbus.val.ptr!=NULL) {         // always read through to the end
+               usptr = (struct ctdluser *) cdbus.val.ptr;
                if (strlen(usptr->fullname) > 0) {
                        array_append(all_users, usptr->fullname);
                }
@@ -1081,24 +1076,17 @@ int InitialMailCheck() {
        char mailboxname[ROOMNAMELEN];
        struct ctdlroom mailbox;
        struct visit vbuf;
-       struct cdbdata *cdbfr;
        long *msglist = NULL;
        int num_msgs = 0;
 
        CtdlMailboxName(mailboxname, sizeof mailboxname, &CC->user, MAILROOM);
-       if (CtdlGetRoom(&mailbox, mailboxname) != 0)
+       if (CtdlGetRoom(&mailbox, mailboxname) != 0) {
                return(0);
+       }
        CtdlGetRelationship(&vbuf, &CC->user, &mailbox);
 
-       cdbfr = cdb_fetch(CDB_MSGLISTS, &mailbox.QRnumber, sizeof(long));
-
-       if (cdbfr != NULL) {
-               msglist = malloc(cdbfr->len);
-               memcpy(msglist, cdbfr->ptr, cdbfr->len);
-               num_msgs = cdbfr->len / sizeof(long);
-               cdb_free(cdbfr);
-       }
-       if (num_msgs > 0)
+       num_msgs = CtdlFetchMsgList(mailbox.QRnumber, &msglist);
+       if (num_msgs > 0) {
                for (a = 0; a < num_msgs; ++a) {
                        if (msglist[a] > 0L) {
                                if (msglist[a] > vbuf.v_lastseen) {
@@ -1106,9 +1094,8 @@ int InitialMailCheck() {
                                }
                        }
                }
-       if (msglist != NULL)
-               free(msglist);
-
+       }
+       free(msglist);
        return(num_newmsgs);
 }