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,
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);
}
newlr = atol(new_ptr);
}
- CtdlGetUserLock(&CC->user, CC->curr_user);
+ CtdlLockGetCurrentUser();
CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
memcpy(&original_vbuf, &vbuf, sizeof(visit));
CtdlSetRelationship(&vbuf, &CC->user, &CC->room);
}
- CtdlPutUserLock(&CC->user);
+ CtdlPutCurrentUserLock();
cprintf("%d %ld\n", CIT_OK, newlr);
}
/* 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();
}
}
* 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);
}
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)
{
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,
++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)
{
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);
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);
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)
{
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;
h->Property = Property;
h->PropertyLen = PLen;
h->offset = offset;
+ h->PayloadSubToken = PayloadSubToken;
+ h->pslen = pslen;
if (!GetHash(XMPP_SupportedNamespaces, NS, NSLen, &pv))
{
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))
{
CTDL_MODULE_INIT(xmpp)
{
if (!threading) {
+ CtdlRegisterDebugFlagHook(HKEY("serv_xmpp"), LogXMPPSrvDebugEnable, &XMPPSrvDebugEnable);
+
CtdlRegisterServiceHook(config.c_xmpp_c2s_port,
NULL,
xmpp_greeting,
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);
/* 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))
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
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
}
-/*
- * 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
*/
}
-
-/*
- * putuser() - write user buffer into the correct place on disk
- */
-void putuser(struct ctdluser *usbuf)
+void CtdlPutCurrentUserLock()
{
- CtdlPutUser(usbuf);
+ CtdlPutUser(&CC->user);
}
}
-/*
- * 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
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()
*/
#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);