]> code.citadel.org Git - citadel.git/blobdiff - citadel/user_ops.c
Grabbed another chunk of code out of user_ops.c, purge_user()
[citadel.git] / citadel / user_ops.c
index 91e3d077a56934c3c72b4f0ef6d4feb1071d61d7..67935a34f20ae7bbfebfe3e25650eaef4df8f9ce 100644 (file)
@@ -51,6 +51,7 @@
 #include "genstamp.h"
 #include "threads.h"
 #include "citadel_ldap.h"
+#include "context.h"
 
 #include "ctdl_module.h"
 
@@ -196,20 +197,12 @@ void lputuser(struct ctdluser *usbuf)
  *
  */
 int rename_user(char *oldname, char *newname) {
-       struct CitContext *cptr;
        int retcode = RENAMEUSER_OK;
        struct ctdluser usbuf;
 
        char oldnamekey[USERNAME_SIZE];
        char newnamekey[USERNAME_SIZE];
 
-       /* We cannot rename a user who is currently logged in */
-       for (cptr = ContextList; cptr != NULL; cptr = cptr->next) {
-               if (!strcasecmp(cptr->user.fullname, oldname)) {
-                       return(RENAMEUSER_LOGGED_IN);
-               }
-       }
-
        /* Create the database keys... */
        makeuserkey(oldnamekey, oldname);
        makeuserkey(newnamekey, newname);
@@ -217,6 +210,12 @@ int rename_user(char *oldname, char *newname) {
        /* Lock up and get going */
        begin_critical_section(S_USERS);
 
+       /* We cannot rename a user who is currently logged in */
+       if (CtdlIsUserLoggedIn(oldname)) {
+               end_critical_section(S_USERS);
+               return RENAMEUSER_LOGGED_IN;
+       }
+
        if (CtdlGetUser(&usbuf, newname) == 0) {
                retcode = RENAMEUSER_ALREADY_EXISTS;
        }
@@ -775,7 +774,13 @@ void logged_in_response(void)
  */
 void logout(void)
 {
-       struct CitContext *CCC = CC;    /* CachedCitContext - performance boost */
+       CtdlUserLogout();
+}
+
+
+void CtdlUserLogout(void)
+{
+       CitContext *CCC = CC;   /* CachedCitContext - performance boost */
        /*
         * If there is a download in progress, abort it.
         */
@@ -1022,8 +1027,6 @@ int purge_user(char pname[])
        char filename[64];
        struct ctdluser usbuf;
        char usernamekey[USERNAME_SIZE];
-       struct CitContext *ccptr;
-       int user_is_logged_in = 0;
 
        makeuserkey(usernamekey, pname);
 
@@ -1039,15 +1042,7 @@ int purge_user(char pname[])
         * set the access level to 0, and let the account get swept up
         * during the next purge.
         */
-       user_is_logged_in = 0;
-       begin_critical_section(S_SESSION_TABLE);
-       for (ccptr = ContextList; ccptr != NULL; ccptr = ccptr->next) {
-               if (ccptr->user.usernum == usbuf.usernum) {
-                       user_is_logged_in = 1;
-               }
-       }
-       end_critical_section(S_SESSION_TABLE);
-       if (user_is_logged_in == 1) {
+       if (CtdlIsUserLoggedInByNum(usbuf.usernum)) {
                CtdlLogPrintf(CTDL_WARNING, "User <%s> is logged in; not deleting.\n", pname);
                usbuf.axlevel = 0;
                CtdlPutUser(&usbuf);
@@ -1055,6 +1050,16 @@ int purge_user(char pname[])
        }
        CtdlLogPrintf(CTDL_NOTICE, "Deleting user <%s>\n", pname);
 
+/*
+ * FIXME:
+ * This should all be wrapped in a S_USERS mutex.
+ * Without the mutex the user could log in before we get to the next function
+ * That would truly mess things up :-(
+ * I would like to see the S_USERS start before the CtdlIsUserLoggedInByNum() above
+ * and end after the user has been deleted from the database, below.
+ * Question is should we enter the EVT_PURGEUSER whilst S_USERS is active?
+ */
+
        /* Perform any purge functions registered by server extensions */
        PerformUserHooks(&usbuf, EVT_PURGEUSER);
 
@@ -1934,7 +1939,7 @@ void cmd_asup(char *cmdbuf)
  * receive a new mail notification without having to hit the database.
  */
 void BumpNewMailCounter(long which_user) {
-       struct CitContext *ptr;
+       CitContext *ptr;
 
        begin_critical_section(S_SESSION_TABLE);
 
@@ -2071,28 +2076,30 @@ void cmd_renu(char *cmdbuf)
 
 CTDL_MODULE_INIT(user_ops)
 {
-       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_gnur, "GNUR", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_vali, "VALI", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_list, "LIST", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_chek, "CHEK", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_qusr, "QUSR", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_agup, "AGUP", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_asup, "ASUP", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_seen, "SEEN", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_gtsn, "GTSN", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_view, "VIEW", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_renu, "RENU", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_newu, "NEWU", "Autoconverted. TODO: document me.");
+       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_gnur, "GNUR", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_vali, "VALI", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_list, "LIST", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_chek, "CHEK", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_qusr, "QUSR", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_agup, "AGUP", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_asup, "ASUP", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_seen, "SEEN", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_gtsn, "GTSN", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_view, "VIEW", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_renu, "RENU", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_newu, "NEWU", "Autoconverted. TODO: document me.");
+       }
        /* return our Subversion id for the Log */
        return "$Id$";
 }