From: Wilfried Goesgens Date: Sat, 8 Nov 2014 14:13:16 +0000 (+0100) Subject: add function to lock the current user. X-Git-Tag: v9.01~90 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=b11aa21e7968de3591f30d7af1ba561fab7bc53f add function to lock the current user. --- diff --git a/citadel/include/ctdl_module.h b/citadel/include/ctdl_module.h index 7005c1c38..86255e2f3 100644 --- a/citadel/include/ctdl_module.h +++ b/citadel/include/ctdl_module.h @@ -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, diff --git a/citadel/modules/ctdlproto/serv_user.c b/citadel/modules/ctdlproto/serv_user.c index eee6516b8..5a7162977 100644 --- a/citadel/modules/ctdlproto/serv_user.c +++ b/citadel/modules/ctdlproto/serv_user.c @@ -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); } diff --git a/citadel/modules/pop3/serv_pop3.c b/citadel/modules/pop3/serv_pop3.c index fcc194cca..d49f7deb7 100644 --- a/citadel/modules/pop3/serv_pop3.c +++ b/citadel/modules/pop3/serv_pop3.c @@ -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(); } } diff --git a/citadel/modules/vcard/serv_vcard.c b/citadel/modules/vcard/serv_vcard.c index 2bd58bd1a..dad28b8dd 100644 --- a/citadel/modules/vcard/serv_vcard.c +++ b/citadel/modules/vcard/serv_vcard.c @@ -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); } diff --git a/citadel/modules/xmpp/serv_xmpp.c b/citadel/modules/xmpp/serv_xmpp.c index ea58e3b62..ea2de1024 100644 --- a/citadel/modules/xmpp/serv_xmpp.c +++ b/citadel/modules/xmpp/serv_xmpp.c @@ -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); diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 4d1881c6b..95909e7cd 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -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)) diff --git a/citadel/user_ops.c b/citadel/user_ops.c index 270ca87db..92cf99e24 100644 --- a/citadel/user_ops.c +++ b/citadel/user_ops.c @@ -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() */ diff --git a/citadel/user_ops.h b/citadel/user_ops.h index 8c72de018..9c1580494 100644 --- a/citadel/user_ops.h +++ b/citadel/user_ops.h @@ -5,19 +5,9 @@ #include 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);