#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;
}
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);
}
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));
}
/*
* 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);
}
*/
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);
+ }
}
/*
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);
/*
- * 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;
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) {
/* remove the user's picture */
sprintf(filename, "./userpics/%ld.gif", usbuf.usernum);
unlink(filename);
-
+
+ return(0);
}
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)) {
/* 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);
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) {
usbuf.posted,
(int)usbuf.axlevel,
usbuf.usernum);
+
}
struct usersupp usbuf;
char requested_user[256];
int np;
+ int newax;
if ( (CC->internal_pgm==0)
&& ( (CC->logged_in == 0) || (is_aide()==0) ) ) {
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);
}