Mon Aug 24 20:04:04 EDT 1998 Nathan Bryant <bryant@cs.usm.maine.edu>
[citadel.git] / citadel / user_ops.c
index ce832d949101d5383b52c90c1636ccef63e99438..1e1e84499cc936d751a79015edcd915eee3c01ad 100644 (file)
 #include <pthread.h>
 #include "citadel.h"
 #include "server.h"
-#include "proto.h"
+#include "database.h"
+#include "user_ops.h"
+#include "sysdep_decls.h"
+#include "support.h"
+#include "hooks.h"
+#include "room_ops.h"
+#include "logging.h"
+#include "file_ops.h"
+#include "control.h"
+#include "msgbase.h"
 
 extern struct config config;
 
@@ -50,11 +59,13 @@ int getuser(struct usersupp *usbuf, char name[]) {
                }
 
        cdbus = cdb_fetch(CDB_USERSUPP, lowercase_name, strlen(lowercase_name));
-       if (cdbus == NULL) {    /* not found */
-               return(1);
+       if (cdbus == NULL) {
+               return(1);      /* user not found */
                }
 
-       memcpy(usbuf, cdbus->ptr, cdbus->len);
+       memcpy(usbuf, cdbus->ptr,
+               ( (cdbus->len > sizeof(struct usersupp)) ?
+               sizeof(struct usersupp) : cdbus->len) );
        cdb_free(cdbus);
        return(0);
        }
@@ -87,7 +98,8 @@ void putuser(struct usersupp *usbuf, char *name)
                lowercase_name[a] = tolower(name[a]);
                }
 
-       cdb_store(CDB_USERSUPP, lowercase_name, strlen(lowercase_name),
+       cdb_store(CDB_USERSUPP,
+               lowercase_name, strlen(lowercase_name),
                usbuf, sizeof(struct usersupp));
 
        }
@@ -96,8 +108,7 @@ void putuser(struct usersupp *usbuf, char *name)
 /*
  * lputuser()  -  same as putuser() but locks the record
  */
-void lputuser(struct usersupp *usbuf, char *name)
-{
+void lputuser(struct usersupp *usbuf, char *name) {
        putuser(usbuf,name);
        end_critical_section(S_USERSUPP);
        }
@@ -117,8 +128,12 @@ int is_aide(void) {
  */
 int is_room_aide(void) {
        if ( (CC->usersupp.axlevel >= 6)
-               || (CC->quickroom.QRroomaide == CC->usersupp.usernum) ) return(1);
-       else return(0);
+          || (CC->quickroom.QRroomaide == CC->usersupp.usernum) ) {
+               return(1);
+               }
+       else {
+               return(0);
+               }
        }
 
 /*
@@ -133,7 +148,9 @@ int getuserbynumber(struct usersupp *usbuf, long int number)
 
        while(cdbus = cdb_next_item(CDB_USERSUPP), cdbus != NULL) {
                bzero(usbuf, sizeof(struct usersupp));
-               memcpy(usbuf, cdbus->ptr, cdbus->len);
+               memcpy(usbuf, cdbus->ptr,
+                       ( (cdbus->len > sizeof(struct usersupp)) ?
+                       sizeof(struct usersupp) : cdbus->len) );
                cdb_free(cdbus);
                if (usbuf->usernum == number) {
                        return(0);
@@ -310,9 +327,9 @@ void cmd_pass(char *buf)
 
 
 /*
- * purge related files when removing or overwriting a user record
+ * Delete a user record *and* all of its related resources.
  */
-void purge_user(char *pname) {
+int purge_user(char *pname) {
        char filename[64];
        struct usersupp usbuf;
        int a;
@@ -322,9 +339,11 @@ void purge_user(char *pname) {
 
        if (getuser(&usbuf, pname) != 0) {
                lprintf(5, "Cannot purge user <%s> - not found\n", pname);
-               return;
+               return(1);
                }
 
+       /* FIX   Don't delete a user who is currently logged in. */
+
        /* delete any messages in the user's mailbox */
        cdbmb = cdb_fetch(CDB_MAILBOXES, &usbuf.usernum, sizeof(long));
        if (cdbmb != NULL) {
@@ -349,7 +368,8 @@ void purge_user(char *pname) {
        /* remove the user's picture */
        sprintf(filename, "./userpics/%ld.gif", usbuf.usernum);
        unlink(filename);
-       
+
+       return(0);
        }
 
 
@@ -711,7 +731,9 @@ void cmd_gnur(void) {
        cdb_rewind(CDB_USERSUPP);
        while (cdbus = cdb_next_item(CDB_USERSUPP), cdbus != NULL) {
                bzero(&usbuf, sizeof(struct usersupp));
-               memcpy(&usbuf, cdbus->ptr, cdbus->len);
+               memcpy(&usbuf, cdbus->ptr,
+                       ( (cdbus->len > sizeof(struct usersupp)) ?
+                       sizeof(struct usersupp) : cdbus->len) );
                cdb_free(cdbus);
                if ((usbuf.flags & US_NEEDVALID)
                   &&(usbuf.axlevel > 0)) {
@@ -831,9 +853,10 @@ void cmd_vali(char *v_args)
 
        /* If the access level was set to zero, delete the user */
        if (newax == 0) {
-               purge_user(user);
-               cprintf("%d %s Deleted.\n", OK, userbuf.fullname);
-               return;
+               if (purge_user(user)==0) {
+                       cprintf("%d %s Deleted.\n", OK, userbuf.fullname);
+                       return;
+                       }
                }
 
        cprintf("%d ok\n",OK);
@@ -853,7 +876,9 @@ void cmd_list(void) {
 
        while(cdbus = cdb_next_item(CDB_USERSUPP), cdbus != NULL) {
                bzero(&usbuf, sizeof(struct usersupp));
-               memcpy(&usbuf, cdbus->ptr, cdbus->len);
+               memcpy(&usbuf, cdbus->ptr,
+                       ( (cdbus->len > sizeof(struct usersupp)) ?
+                       sizeof(struct usersupp) : cdbus->len) );
                cdb_free(cdbus);
 
            if (usbuf.axlevel > 0) {
@@ -1126,6 +1151,7 @@ void cmd_agup(char *cmdbuf) {
                usbuf.posted,
                (int)usbuf.axlevel,
                usbuf.usernum);
+
        }
 
 
@@ -1137,6 +1163,7 @@ void cmd_asup(char *cmdbuf) {
        struct usersupp usbuf;
        char requested_user[256];
        int np;
+       int newax;
        
        if ( (CC->internal_pgm==0)
           && ( (CC->logged_in == 0) || (is_aide()==0) ) ) {
@@ -1156,8 +1183,18 @@ void cmd_asup(char *cmdbuf) {
        if (np > 2) usbuf.flags = extract_int(cmdbuf, 2);
        if (np > 3) usbuf.timescalled = extract_int(cmdbuf, 3);
        if (np > 4) usbuf.posted = extract_int(cmdbuf, 4);
-       if (np > 5) usbuf.axlevel = extract_int(cmdbuf, 5);
+       if (np > 5) {
+               newax = extract_int(cmdbuf, 5);
+               if ((newax >=0) && (newax <= 6)) {
+                       usbuf.axlevel = extract_int(cmdbuf, 5);
+                       }
+               }
 
        lputuser(&usbuf, requested_user);
+       if (usbuf.axlevel == 0) {
+               if (purge_user(requested_user)==0) {
+                       cprintf("%d %s deleted.\n", OK, requested_user);
+                       }
+               }
        cprintf("%d Ok\n", OK);
        }