add function to lock the current user.
authorWilfried Goesgens <dothebart@citadel.org>
Sat, 8 Nov 2014 14:13:16 +0000 (15:13 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Sat, 8 Nov 2014 14:13:16 +0000 (15:13 +0100)
citadel/include/ctdl_module.h
citadel/modules/ctdlproto/serv_user.c
citadel/modules/pop3/serv_pop3.c
citadel/modules/vcard/serv_vcard.c
citadel/modules/xmpp/serv_xmpp.c
citadel/msgbase.c
citadel/user_ops.c
citadel/user_ops.h

index 7005c1c38a8df3368b7c2a1032cabaed093b8883..86255e2f304a410ed020e01ba689484b9a188b7d 100644 (file)
@@ -515,6 +515,10 @@ int CtdlGetUserLen(struct ctdluser *usbuf, const char *name, long len);
 int CtdlGetUserLock(struct ctdluser *usbuf, char *name);
 void CtdlPutUser(struct ctdluser *usbuf);
 void CtdlPutUserLock(struct ctdluser *usbuf);
+
+int CtdlLockGetCurrentUser(void);
+void CtdlPutCurrentUserLock(void);
+
 int CtdlGetUserByNumber(struct ctdluser *usbuf, long number);
 void CtdlGetRelationship(visit *vbuf,
                         struct ctdluser *rel_user,
index eee6516b864d0af2be766d0ce9f89e8d4f650269..5a7162977c717e91f5a2decbffa3d77d420c4670 100644 (file)
@@ -270,10 +270,10 @@ void cmd_setu(char *new_parms)
                cprintf("%d Usage error.\n", ERROR + ILLEGAL_VALUE);
                return;
        }
-       CtdlGetUserLock(&CC->user, CC->curr_user);
+       CtdlLockGetCurrentUser();
        CC->user.flags = CC->user.flags & (~US_USER_SET);
        CC->user.flags = CC->user.flags | (extract_int(new_parms, 2) & US_USER_SET);
-       CtdlPutUserLock(&CC->user);
+       CtdlPutCurrentUserLock();
        cprintf("%d Ok\n", CIT_OK);
 }
 
@@ -296,7 +296,7 @@ void cmd_slrp(char *new_ptr)
                newlr = atol(new_ptr);
        }
 
-       CtdlGetUserLock(&CC->user, CC->curr_user);
+       CtdlLockGetCurrentUser();
 
        CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
        memcpy(&original_vbuf, &vbuf, sizeof(visit));
@@ -309,7 +309,7 @@ void cmd_slrp(char *new_ptr)
                CtdlSetRelationship(&vbuf, &CC->user, &CC->room);
        }
 
-       CtdlPutUserLock(&CC->user);
+       CtdlPutCurrentUserLock();
        cprintf("%d %ld\n", CIT_OK, newlr);
 }
 
index fcc194cca6b0119fbf4b5abb6a911a4ea9e9d57c..d49f7deb7b0e9550d66dd61db53cf186882b4462 100644 (file)
@@ -480,14 +480,14 @@ void pop3_update(void)
 
        /* Set last read pointer */
        if (POP3->num_msgs > 0) {
-               CtdlGetUserLock(&CCC->user, CCC->curr_user);
+               CtdlLockGetCurrentUser();
 
                CtdlGetRelationship(&vbuf, &CCC->user, &CCC->room);
                snprintf(vbuf.v_seen, sizeof vbuf.v_seen, "*:%ld",
                        POP3->msgs[POP3->num_msgs-1].msgnum);
                CtdlSetRelationship(&vbuf, &CCC->user, &CCC->room);
 
-               CtdlPutUserLock(&CCC->user);
+               CtdlPutCurrentUserLock();
        }
 
 }
index 2bd58bd1a4c1924dc4977d2599a9314d65a19f5a..dad28b8dd508f1d2ec7b8832e81eddb6f2b7c367 100644 (file)
@@ -588,18 +588,18 @@ int vcard_upload_aftersave(struct CtdlMessage *msg, recptypes *recp) {
                         * Assume they don't need validating.
                         */
                        if (CCC->user.axlevel >= AxAideU) {
-                               CtdlGetUserLock(&CCC->user, CCC->curr_user);
+                               CtdlLockGetCurrentUser();
                                CCC->user.flags |= US_REGIS;
-                               CtdlPutUserLock(&CCC->user);
+                               CtdlPutCurrentUserLock();
                                return (0);
                        }
                        
                        set_mm_valid();
 
                        /* ...which also means we need to flag the user */
-                       CtdlGetUserLock(&CCC->user, CCC->curr_user);
+                       CtdlLockGetCurrentUser();
                        CCC->user.flags |= (US_REGIS|US_NEEDVALID);
-                       CtdlPutUserLock(&CCC->user);
+                       CtdlPutCurrentUserLock();
 
                        return(0);
                }
index ea58e3b627dbf9efd6fe658419ed5dfc14f29ee5..ea2de10244571e12c2ab1d4dd94e1e0b0873cae9 100644 (file)
@@ -68,9 +68,10 @@ HashList *XMPP_StartHandlers = NULL;
 HashList *XMPP_EndHandlers = NULL;
 HashList *XMPP_SupportedNamespaces = NULL;
 HashList *XMPP_NameSpaces = NULL;
+HashList *XMPP_EndToken = NULL;
 HashList *FlatToken = NULL;
 
-int XMPPSrvDebugEnable = 0;
+int XMPPSrvDebugEnable = 1;
 
 void XUnbuffer(void)
 {
@@ -194,6 +195,43 @@ void XPrint(const char *Token, long tlen,
        va_end(arg_ptr);
 }
 
+void
+separate_namespace(const char *supplied_el,
+                  const char **Token, long *TLen,
+                  HashList **ThisNamespace)
+{
+       const char *pch;
+       const char *pToken;
+       const char *NS = NULL;
+       long NSLen;
+       void *pv;
+
+       *ThisNamespace = NULL;
+
+       pToken = supplied_el;
+       pch = strchr(pToken, ':');
+       while (pch != NULL)
+       {
+               pToken = pch;
+               pch = strchr(pToken  + 1, ':');
+       }
+
+       if (*pToken == ':')
+       {
+               NS = supplied_el;
+               NSLen = pToken - supplied_el;
+               if (GetHash(XMPP_NameSpaces, NS, NSLen, &pv))
+               {
+                       *ThisNamespace = pv;
+
+               }
+               
+               pToken ++;
+       }
+
+       *TLen = strlen(pToken);
+}
+
 #ifdef HAVE_XML_STOPPARSER
 /* Stop the parser if an entity declaration is hit. */
 static void xmpp_entity_declaration(void *userData, const XML_Char *entityName,
@@ -299,40 +337,15 @@ void xmpp_start_html(void *data, const char *supplied_el, const char **attr)
        ++XMPP->html_tag_level;
 }
 
+
 void xmpp_xml_start(void *data, const char *supplied_el, const char **attr)
 {
-       HashList *ThisNamespace = NULL;
+       HashList *ThisNamespace;
        const char *pToken;
-       const char *pch;
-       const char *NS = NULL;
-       long NSLen;
        long len;
        void *pv;
        
-       /* Axe the namespace, we don't care about it */
-       pToken = supplied_el;
-       pch = strchr(pToken, ':');
-       while (pch != NULL)
-       {
-               pToken = pch;
-               pch = strchr(pToken  + 1, ':');
-       }
-
-       if (*pToken == ':')
-       {
-               NS = supplied_el;
-               NSLen = pToken - supplied_el;
-               if (GetHash(XMPP_NameSpaces, NS, NSLen, &pv))
-               {
-                       ThisNamespace = pv;
-
-               }
-               
-               pToken ++;
-       }
-
-       len = strlen(pToken);
-
+       separate_namespace(supplied_el, &pToken, &len, &ThisNamespace);
 
        if (ThisNamespace != NULL)
        {
@@ -396,7 +409,7 @@ void xmpp_end_resource(void *data, const char *supplied_el, const char **attr)
 
 void xmpp_end_username(void *data, const char *supplied_el, const char **attr)
 {
-       /* NON SASL ONLY */
+       /* NON SASL OY */
        if (XMPP->chardata_len > 0) {
                safestrncpy(XMPP->iq_client_username, XMPP->chardata,
                            sizeof XMPP->iq_client_username);
@@ -608,24 +621,51 @@ void xmpp_end_stream(void *data, const char *supplied_el, const char **attr)
 
 void xmpp_xml_end(void *data, const char *supplied_el)
 {
+       HashList *ThisNamespace;
        const char *pToken;
-       const char *pch;
        long len;
        void *pv;
+       
+       separate_namespace(supplied_el, &pToken, &len, &ThisNamespace);
 
-       /* Axe the namespace, we don't care about it */
-       pToken = supplied_el;
-       pch = strchr(pToken, ':');
-       while (pch != NULL)
+       if (ThisNamespace != NULL)
        {
-               pToken = pch;
-               pch = strchr(pToken  + 1, ':');
-       }
+               if (GetHash(XMPP_EndToken, pToken, len, &pv))
+               {
+                       TokenHandler *th;
+                       void *value;
+                       long i = 0;
 
-       if (*pToken == ':')
-               pToken ++;
+                       th = (TokenHandler*) pv;
+                       value = th->GetToken();
+/*
+                       while (attr[i] != NULL)
+                       {
+
+                               if (GetHash(th->Properties, attr[i], strlen(attr[i]), &pv))
+                               {
+                                       PropertyHandler* ph = pv;
+                                       char *val;
+                                       StrBuf **pVal;
+                                       long len;
+
+                                       len = strlen(attr[i+1]);
+                                       val = value;
+                                       val += ph->offset;
+                                       pVal = (StrBuf**) val;
+                                       if (*pVal != NULL)
+                                               StrBufPlain(*pVal, attr[i+1], len);
+                                       else
+                                               *pVal = NewStrBufPlain(attr[i+1], len);
+                               }
+                               i+=2;
+                       }
+*/
+
+                       return;
+               }
 
-       len = strlen(pToken);
+       }
 
        /*
        XMPP_syslog(LOG_DEBUG, "XMPP ELEMENT END  : <%s>\n", el);
@@ -832,6 +872,7 @@ void HDeleteTokenHandler(void *FreeMe)
 void XMPP_RegisterTokenProperty(const char *NS, long NSLen,
                                const char *Token, long TLen,
                                const char *Property, long PLen,
+                               const char *PayloadSubToken, long pslen,
                                GetTokenDataFunc GetToken,
                                long offset)
 {
@@ -840,6 +881,17 @@ void XMPP_RegisterTokenProperty(const char *NS, long NSLen,
        PropertyHandler *h;
        TokenHandler *th;
 
+       const char *pNS, *pToken, *pProperty, *pPayloadSubToken;
+
+       pToken = (Token)?Token:"";
+       pNS = (NS)?NS:"";
+       pProperty = (Property)?Property:"";
+       pPayloadSubToken = (PayloadSubToken)?PayloadSubToken:"";
+
+       XMPP_syslog(LOG_DEBUG,
+                   "New tag: Token <%s> Namespace <%s> Property <%s> PayloadSubToken <%s>\n",
+                   pToken, pNS, pProperty, pPayloadSubToken);
+               
        h = (PropertyHandler*) malloc(sizeof(PropertyHandler));
        h->NameSpace = NS;
        h->NameSpaceLen = NSLen;
@@ -848,6 +900,8 @@ void XMPP_RegisterTokenProperty(const char *NS, long NSLen,
        h->Property = Property;
        h->PropertyLen = PLen;
        h->offset = offset;
+       h->PayloadSubToken = PayloadSubToken;
+       h->pslen = pslen;
 
        if (!GetHash(XMPP_SupportedNamespaces, NS, NSLen, &pv))
        {
@@ -879,7 +933,14 @@ void XMPP_RegisterTokenProperty(const char *NS, long NSLen,
 
 
        if (PLen > 0)
+       {
                Put(th->Properties, Property, PLen, h, HFreePropertyHandler);
+       }
+       else
+       {
+               Put(XMPP_EndToken, PayloadSubToken, pslen, h, reference_free_handler);
+
+       }
        /*
        if (!GetHash(FlatToken, Token, TLen, &pv))
        {
@@ -901,6 +962,8 @@ void xmpp_cleanup(void)
 CTDL_MODULE_INIT(xmpp)
 {
        if (!threading) {
+               CtdlRegisterDebugFlagHook(HKEY("serv_xmpp"), LogXMPPSrvDebugEnable, &XMPPSrvDebugEnable);
+
                CtdlRegisterServiceHook(config.c_xmpp_c2s_port,
                                        NULL,
                                        xmpp_greeting,
@@ -935,7 +998,6 @@ CTDL_MODULE_INIT(xmpp)
                AddXMPPStartHandler(HKEY("html"),       xmpp_start_html, 0);
 
 
-               CtdlRegisterDebugFlagHook(HKEY("serv_xmpp"), LogXMPPSrvDebugEnable, &XMPPSrvDebugEnable);
                CtdlRegisterSessionHook(xmpp_cleanup_function, EVT_STOP, PRIO_STOP + 70);
                 CtdlRegisterSessionHook(xmpp_login_hook, EVT_LOGIN, PRIO_LOGIN + 90);
                 CtdlRegisterSessionHook(xmpp_logout_hook, EVT_LOGOUT, PRIO_LOGOUT + 90);
index 4d1881c6ba081e67968d2ca8f2d02d48506d4dbf..95909e7cdbc682414a33904520215c34b925cbb0 100644 (file)
@@ -2870,9 +2870,9 @@ long CtdlSubmitMsg(struct CtdlMessage *msg,       /* message to save */
 
        /* Bump this user's messages posted counter. */
        MSGM_syslog(LOG_DEBUG, "Updating user\n");
-       CtdlGetUserLock(&CCC->user, CCC->curr_user);
+       CtdlLockGetCurrentUser();
        CCC->user.posted = CCC->user.posted + 1;
-       CtdlPutUserLock(&CCC->user);
+       CtdlPutCurrentUserLock();
 
        /* Decide where bounces need to be delivered */
        if ((recps != NULL) && (recps->bounce_to == NULL))
index 270ca87dbe48590d1093f81e34cee0c5b226dec9..92cf99e24c8164c65cf316ac6ac59f60afbaa68e 100644 (file)
@@ -29,17 +29,6 @@ int chkpwd_write_pipe[2];
 int chkpwd_read_pipe[2];
 
 
-
-/*
- * getuser()  -  retrieve named user into supplied buffer.
- *            returns 0 on success
- */
-int getuser(struct ctdluser *usbuf, char name[])
-{
-       return CtdlGetUser(usbuf, name);
-}
-
-
 /*
  * CtdlGetUser()  -  retrieve named user into supplied buffer.
  *            returns 0 on success
@@ -76,6 +65,12 @@ int CtdlGetUser(struct ctdluser *usbuf, char *name)
        return CtdlGetUserLen(usbuf, name, cutuserkey(name));
 }
 
+int CtdlLockGetCurrentUser(void)
+{
+       CitContext *CCC = CC;
+
+       return CtdlGetUserLen(&CCC->user, CCC->curr_user, cutuserkey(CCC->curr_user));
+}
 
 /*
  * CtdlGetUserLock()  -  same as getuser() but locks the record
@@ -92,15 +87,6 @@ int CtdlGetUserLock(struct ctdluser *usbuf, char *name)
 }
 
 
-/*
- * lgetuser()  -  same as getuser() but locks the record
- */
-int lgetuser(struct ctdluser *usbuf, char *name)
-{
-       return CtdlGetUserLock(usbuf, name);
-}
-
-
 /*
  * CtdlPutUser()  -  write user buffer into the correct place on disk
  */
@@ -119,13 +105,9 @@ void CtdlPutUser(struct ctdluser *usbuf)
 
 }
 
-
-/*
- * putuser()  -  write user buffer into the correct place on disk
- */
-void putuser(struct ctdluser *usbuf)
+void CtdlPutCurrentUserLock()
 {
-       CtdlPutUser(usbuf);
+       CtdlPutUser(&CC->user);
 }
 
 
@@ -139,14 +121,6 @@ void CtdlPutUserLock(struct ctdluser *usbuf)
 }
 
 
-/*
- * lputuser()  -  same as putuser() but locks the record
- */
-void lputuser(struct ctdluser *usbuf)
-{
-       CtdlPutUserLock(usbuf);
-}
-
 
 /*
  * rename_user()  -  this is tricky because the user's display name is the database key
@@ -447,19 +421,6 @@ int CtdlGetUserByNumber(struct ctdluser *usbuf, long number)
        return(r);
 }
 
-/*
- * getuserbynumber() - get user by number
- *                     returns 0 if user was found
- *
- * Note: fetching a user this way requires one additional database operation.
- */
-int getuserbynumber(struct ctdluser *usbuf, long number)
-{
-       return CtdlGetUserByNumber(usbuf, number);
-}
-
-
-
 /*
  * Helper function for rebuild_usersbynumber()
  */
index 8c72de018f9e27956511270f6ea8f51dde829ade..9c15804942996ab9a06bbce703dbbc5437f38f78 100644 (file)
@@ -5,19 +5,9 @@
 #include <syslog.h>
 
 int hash (char *str);
-/* getuser is deprecated, use CtdlGetUser instead */
-int getuser (struct ctdluser *, char *) __attribute__ ((deprecated));
-/* lgetuser is deprecated, use CtdlGetUserLock instead */
-int lgetuser (struct ctdluser *, char *) __attribute__ ((deprecated));
-/* putuser is deprecated, use CtdlPutUser instead */
-void putuser (struct ctdluser *) __attribute__ ((deprecated));
-/* lputuser is deprecated, use CtdlPutUserLock instead */
-void lputuser (struct ctdluser *) __attribute__ ((deprecated));
 int is_aide (void);
 int is_room_aide (void);
 int CtdlCheckInternetMailPermission(struct ctdluser *who);
-/* getuserbynumber is deprecated, use CtdlGetUserByNumber instead */
-int getuserbynumber (struct ctdluser *usbuf, long int number) __attribute__ ((deprecated));
 void rebuild_usersbynumber(void);
 void session_startup (void);
 void logged_in_response(void);