2 ===================================================================
3 --- include/lib.h (revision 67)
4 +++ include/lib.h (revision 77)
10 #include <sys/types.h>
14 char *j_strdup(const char *str); /* provides NULL safe strdup wrapper */
15 char *j_strcat(char *dest, char *txt); /* strcpy() clone */
16 int j_strcmp(const char *a, const char *b); /* provides NULL safe strcmp wrapper */
17 +int j_strcasecmp(const char *a, const char *b); /* provides NULL safe strcasecmp wrapper */
18 int j_strncmp(const char *a, const char *b, int i); /* provides NULL safe strncmp wrapper */
19 int j_strncasecmp(const char *a, const char *b, int i); /* provides NULL safe strncasecmp wrapper */
20 int j_strlen(const char *a); /* provides NULL safe strlen wrapper */
26 - unsigned long W[80];
30 - unsigned long sizeHi,sizeLo;
31 + uint32_t sizeHi,sizeLo;
35 Index: include/conference.h
36 ===================================================================
37 --- include/conference.h (revision 67)
38 +++ include/conference.h (revision 77)
40 /* Adds extended presence info to a presence packet */
41 void add_status_code(xmlnode presence, char *status); /* add a muc status code to a presence stanza */
42 void add_room_status_codes(xmlnode presence, cnr room); /* add room specific status codes (logging, anonymous, ...) */
43 +int check_affiliation(GHashTable * ght, jid user, char * affiliation_name); /* Check if user as a particular affiliation */
44 int is_sadmin(cni master, jid user); /* Check if user is server admin */
45 int is_owner(cnr room, jid user); /* Check if user is room owner */
46 int is_admin(cnr room, jid user); /* Check if user is room admin */
48 ===================================================================
49 --- src/utils.c (revision 67)
50 +++ src/utils.c (revision 77)
55 +/* Generic function to check if an user as a particular affiliation */
56 +int check_affiliation(GHashTable * ght, jid user, char * affiliation_name)
60 + snprintf(ujid, sizeof(ujid), "%s@%s", user->user, user->server);
62 + if(g_hash_table_lookup(ght, ujid) != NULL )
64 + log_debug(NAME, "[%s] Is %s? >%s< - Yes (case 1)", FZONE, affiliation_name, jid_full(user));
68 + if(g_hash_table_lookup(ght, user->server) != NULL )
70 + log_debug(NAME, "[%s] Is %s? >%s< - Yes (case 2)", FZONE, affiliation_name, jid_full(user));
74 + snprintf(ujid, sizeof(ujid), "%s@%s/%s", user->user, user->server, user->resource);
76 + if(g_hash_table_lookup(ght, ujid) != NULL )
78 + log_debug(NAME, "[%s] Is %s? >%s< - Yes (case 3)", FZONE, affiliation_name, jid_full(user));
82 + snprintf(ujid, sizeof(ujid), "%s/%s", user->server, user->resource);
84 + if(g_hash_table_lookup(ght, ujid) != NULL )
86 + log_debug(NAME, "[%s] Is %s? >%s< - Yes (case 4)", FZONE, affiliation_name, jid_full(user));
90 + log_debug(NAME, "[%s] Is %s? >%s< - No", FZONE, affiliation_name, jid_full(user));
94 /* Is the user a Service Admin? */
95 int is_sadmin(cni master, jid user)
98 /* Is the user an owner for that room */
99 int is_owner(cnr room, jid user)
104 if(room == NULL || user == NULL)
106 log_warn(NAME, "[%s] ERR: Missing variable in is_owner", FZONE);
110 - snprintf(ujid, sizeof(ujid), "%s@%s", user->user, user->server);
113 - snprintf(cjid, sizeof(cjid), "%s@%s", room->creator->user, room->creator->server);
117 - snprintf(cjid, sizeof(cjid), "@");
120 log_debug(NAME, "[%s] Is Owner? >%s<", FZONE, jid_full(user));
122 /* Server admin can override */
123 if(is_sadmin(room->master, user))
125 + log_debug(NAME, "[%s] Is Owner? >%s< - Yes (service admin)", FZONE, jid_full(user));
127 - else if(j_strcmp(cjid, ujid) == 0)
130 + if(room->creator && j_strcmp(user->user, room->creator->user) == 0 && j_strcmp(user->server, room->creator->server) == 0)
132 + log_debug(NAME, "[%s] Is Owner? >%s< - Yes (creator)", FZONE, jid_full(user));
134 - else if(g_hash_table_lookup(room->owner, ujid) != NULL )
140 + return check_affiliation(room->owner, user, "Owner");
143 /* Is the user in the admin affiliation list for that room */
144 int is_admin(cnr room, jid user)
148 if(room == NULL || user == NULL)
150 log_warn(NAME, "[%s] ERR: Missing variable in is_admin", FZONE);
154 - snprintf(ujid, sizeof(ujid), "%s@%s", user->user, user->server);
155 - log_debug(NAME, "[%s] Is Admin? >%s<", FZONE, jid_full(user));
157 if(is_owner(room, user))
159 + log_debug(NAME, "[%s] Is Admin? >%s< - Yes (owner)", FZONE, jid_full(user));
163 - if(g_hash_table_lookup(room->admin, ujid) != NULL )
165 - else if(g_hash_table_lookup(room->admin, user->server) != NULL )
169 + return check_affiliation(room->admin, user, "Admin");
172 /* Is the user in the moderator role list for that room */
173 @@ -271,16 +294,12 @@
174 /* Is the user in the member affiliation list for that room */
175 int is_member(cnr room, jid user)
179 if(room == NULL || user == NULL)
181 log_warn(NAME, "[%s] ERR: Missing variable in is_member", FZONE);
185 - snprintf(ujid, sizeof(ujid), "%s@%s", user->user, user->server);
187 /* Owner is automatically a member */
188 if(is_owner(room, user))
190 @@ -295,42 +314,19 @@
194 - if(g_hash_table_lookup(room->member, ujid) != NULL )
196 - log_debug(NAME, "[%s] Is Member? >%s< - Yes (case 1)", FZONE, jid_full(user));
199 - else if(g_hash_table_lookup(room->member, user->server) != NULL )
201 - log_debug(NAME, "[%s] Is Member? >%s< - Yes (case 2)", FZONE, jid_full(user));
206 - log_debug(NAME, "[%s] Is Member? >%s< - No", FZONE, jid_full(user));
209 + return check_affiliation(room->member, user, "Member");
212 /* Is the user in the outcast affiliation list for that room */
213 int is_outcast(cnr room, jid user)
217 if(room == NULL || user == NULL)
219 log_warn(NAME, "[%s] ERR: Missing variable in is_outcast", FZONE);
223 - snprintf(ujid, sizeof(ujid), "%s@%s", user->user, user->server);
225 - if(g_hash_table_lookup(room->outcast, ujid) != NULL )
227 - else if(g_hash_table_lookup(room->outcast, user->server) != NULL )
231 + return check_affiliation(room->outcast, user, "Outcast");
234 /* Only return 1 if visitor */
235 Index: src/conference_room.c
236 ===================================================================
237 --- src/conference_room.c (revision 67)
238 +++ src/conference_room.c (revision 77)
239 @@ -1018,7 +1018,7 @@
243 - log_debug(NAME, "[%s] No receipient, returning error", FZONE);
244 + log_debug(NAME, "[%s] No recipient, returning error", FZONE);
246 jutil_error(jp->x,TERROR_BAD);
247 deliver(dpacket_new(jp->x),NULL);
248 @@ -1031,6 +1031,15 @@
250 id = jid_new(xmlnode_pool(item), nick);
254 + log_debug(NAME, "[%s] Bad recipient, returning error", FZONE);
255 + jutil_error(jp->x,TERROR_BAD);
256 + deliver(dpacket_new(jp->x),NULL);
258 + xmlnode_free(item);
261 key = j_strdup(jid_full(jid_user(jid_fix(id))));
262 g_hash_table_insert(room->member, key, (void*)item);
264 @@ -1143,7 +1152,8 @@
266 jutil_delay(node, jid_full(room->id));
268 - if(room->master->history > 0)
269 + /* check if stanza contains a body tag and if history is activated */
270 + if(xmlnode_get_tag_data(node,"body")!=NULL && room->master->history > 0)
274 @@ -1426,7 +1436,7 @@
275 /* Create pool for room struct */
277 room = pmalloco(p, sizeof(_cnr));
278 - log_debug(NAME, "[%s] Malloc: _cnr = %d", FZONE, sizeof(_cnr));
279 + log_debug(NAME, "[%s] Malloc: _cnr = %lu", FZONE, sizeof(_cnr));
281 room->master = master;
283 @@ -1448,7 +1458,7 @@
285 /* Initialise room history */
286 room->history = pmalloco(p, sizeof(_cnh) * master->history); /* make array of xmlnodes */
287 - log_debug(NAME, "[%s] Malloc: history = %d", FZONE, sizeof(_cnh) * master->history);
288 + log_debug(NAME, "[%s] Malloc: history = %lu", FZONE, sizeof(_cnh) * master->history);
292 @@ -1498,7 +1508,7 @@
294 room->creator = jid_new(room->p, jid_full(jid_user(admin->realid)));
296 - add_affiliate(room->owner, admin->realid, NULL);
297 + add_affiliate(room->owner, jid_user(admin->realid), NULL);
299 log_debug(NAME, "[%s] Added new admin: %s to room %s", FZONE, jid_full(jid_fix(owner)), jid_full(room->id));
302 ===================================================================
303 --- src/roles.c (revision 67)
304 +++ src/roles.c (revision 77)
317 - snprintf(ujid, sizeof(ujid), "%s@%s", userid->user, userid->server);
319 + if(userid->user == NULL)
321 + if(userid->resource == NULL)
323 + snprintf(ujid, sizeof(ujid), "%s", userid->server);
327 + snprintf(ujid, sizeof(ujid), "%s/%s", userid->server, userid->resource);
332 + if(userid->resource == NULL)
334 + snprintf(ujid, sizeof(ujid), "%s@%s", userid->user, userid->server);
338 + snprintf(ujid, sizeof(ujid), "%s@%s/%s", userid->user, userid->server, userid->resource);
342 old = g_hash_table_lookup(hash, ujid);
344 /* User not previously registered. Set up */
345 @@ -121,18 +144,42 @@
357 - snprintf(ujid, sizeof(ujid), "%s@%s", userid->user, userid->server);
358 + if(userid->user == NULL)
360 + if(userid->resource == NULL)
362 + snprintf(ujid, sizeof(ujid), "%s", userid->server);
366 + snprintf(ujid, sizeof(ujid), "%s/%s", userid->server, userid->resource);
371 + if(userid->resource == NULL)
373 + snprintf(ujid, sizeof(ujid), "%s@%s", userid->user, userid->server);
377 + snprintf(ujid, sizeof(ujid), "%s@%s/%s", userid->user, userid->server, userid->resource);
381 old = g_hash_table_lookup(hash, ujid);
388 store = xmlnode_dup(old);
390 @@ -158,14 +205,36 @@
402 - snprintf(ujid, sizeof(ujid), "%s@%s", userid->user, userid->server);
403 + if(userid->user == NULL)
405 + if(userid->resource == NULL)
407 + snprintf(ujid, sizeof(ujid), "%s", userid->server);
411 + snprintf(ujid, sizeof(ujid), "%s/%s", userid->server, userid->resource);
416 + if(userid->resource == NULL)
418 + snprintf(ujid, sizeof(ujid), "%s@%s", userid->user, userid->server);
422 + snprintf(ujid, sizeof(ujid), "%s@%s/%s", userid->user, userid->server, userid->resource);
426 store = g_hash_table_lookup(hash, ujid);
429 Index: src/conference.c
430 ===================================================================
431 --- src/conference.c (revision 67)
432 +++ src/conference.c (revision 77)
434 xmlnode_hide_attrib(jp->x, "type");
437 + // clean the packet from any x muc#user tag
438 + for( node = xmlnode_get_firstchild(jp->x); node != NULL; node = xmlnode_get_nextsibling(node)) {
439 + if (xmlnode_get_name(node)==NULL || strcmp("x",xmlnode_get_name(node))!=0) continue; // check if the node is a "x" node
440 + if(NSCHECK(node, NS_MUC_USER))
442 + xmlnode_hide(node);
446 priority = jutil_priority(jp->x);
452 /* Don't allow user if locknicks is set and resource != JID user */
453 - if ( ((master->locknicks || room->locknicks) && (j_strcmp(jp->to->resource, jp->from->user) != 0)) && !is_sadmin(master, jp->from) ) {
454 + if ( ((master->locknicks || room->locknicks) && (j_strcasecmp(jp->to->resource, jp->from->user) != 0)) && !is_sadmin(master, jp->from) ) {
455 log_debug(NAME, "[%s] Nicknames locked - Requested nick %s doesn't match required username %s",
456 FZONE, jp->to->resource, jp->from->user);
458 @@ -1079,7 +1088,7 @@
461 /* Allocate space for cni struct and link to instance */
462 - log_debug(NAME, "[%s] Malloc: _cni=%d", FZONE, sizeof(_cni));
463 + log_debug(NAME, "[%s] Malloc: _cni=%lu", FZONE, sizeof(_cni));
464 master = pmalloco(i->p, sizeof(_cni));
467 Index: src/jcomp/jcr_log.c
468 ===================================================================
469 --- src/jcomp/jcr_log.c (revision 67)
470 +++ src/jcomp/jcr_log.c (revision 77)
472 g_static_mutex_lock(&_jcr_log_lock);
474 vsnprintf(logmsg, 512, fmt, ap);
476 g_log(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, "%s: %s", zone, logmsg);
478 g_static_mutex_unlock(&_jcr_log_lock);
482 g_static_mutex_lock(&_jcr_log_lock);
484 vsnprintf(logmsg, 512, fmt, ap);
486 g_log(G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, "%s: %s", zone, logmsg);
488 g_static_mutex_unlock(&_jcr_log_lock);
492 g_static_mutex_lock(&_jcr_log_lock);
494 vsnprintf(logmsg, 512, fmt, ap);
496 g_log(G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, "%s: %s", zone, logmsg);
498 g_static_mutex_unlock(&_jcr_log_lock);
502 g_static_mutex_lock(&_jcr_log_lock);
504 vsnprintf(logmsg, 512, fmt, ap);
506 g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "%s: %s", zone, logmsg);
508 g_static_mutex_unlock(&_jcr_log_lock);
512 g_static_mutex_lock(&_jcr_log_lock);
514 vsnprintf(logmsg, 512, fmt, ap);
516 g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "%s: %s", zone, logmsg);
518 g_static_mutex_unlock(&_jcr_log_lock);
520 Index: src/jcomp/jcr_base_connect.c
521 ===================================================================
522 --- src/jcomp/jcr_base_connect.c (revision 67)
523 +++ src/jcomp/jcr_base_connect.c (revision 77)
525 if (rc != G_IO_STATUS_NORMAL) {
526 log_warn(JDBG, "Opening XML stream failed, rc=%d", rc);
528 - log_debug(JDBG, "Opening XML stream: sent %d bytes", bytes);
529 + log_debug(JDBG, "Opening XML stream: sent %lu bytes", bytes);
533 Index: src/jcomp/jcr_main_stream_error.c
534 ===================================================================
535 --- src/jcomp/jcr_main_stream_error.c (revision 67)
536 +++ src/jcomp/jcr_main_stream_error.c (revision 77)
539 jcr->stream_state = _STREAM_INIT_STATE;
540 jcr->parser = XML_ParserCreate(NULL);
541 + XML_SetDefaultHandler(jcr->parser, NULL);
542 XML_SetElementHandler(jcr->parser, (void *)jcr_start_element, (void *)jcr_end_element);
543 XML_SetCharacterDataHandler(jcr->parser, (void *)jcr_cdata);
544 XML_SetUserData(jcr->parser, NULL);
546 g_source_remove(jcr->gmain_watch_source);
547 g_io_channel_shutdown(jcr->gio, TRUE, NULL);
548 g_io_channel_unref(jcr->gio);
549 - g_io_channel_unref(jcr->gio);
553 Index: src/jcomp/jcr_deliver.c
554 ===================================================================
555 --- src/jcomp/jcr_deliver.c (revision 67)
556 +++ src/jcomp/jcr_deliver.c (revision 77)
561 - log_debug(JDBG, "queued %d bytes : >>> %s <<<", strlen(xmlnode2str(d->x)), xmlnode2str(d->x));
562 + log_debug(JDBG, "queued %lu bytes : >>> %s <<<", strlen(xmlnode2str(d->x)), xmlnode2str(d->x));
563 g_async_queue_push(jcr->dqueue, d);
567 log_warn(JDBG, "Send packet failed, dropping packet");
570 - log_debug(JDBG, "wrote %d packets of %d bytes", pkts, bytes);
571 + log_debug(JDBG, "wrote %d packets of %lu bytes", pkts, bytes);
572 // fprintf(stderr, "wrote %d packets of %d bytes\n", pkts, bytes);
574 //queue is empty, flushing the socket
578 log_warn(JDBG, "packet delivery thread exiting.");
579 - log_warn(JDBG, " Last DvryQ Buffer='%.*s'", buffer->len, buffer->str);
580 + log_warn(JDBG, " Last DvryQ Buffer='%.*s'", (int)buffer->len, buffer->str);
581 g_string_free(buffer, TRUE);
584 Index: src/jcomp/jcr_elements.c
585 ===================================================================
586 --- src/jcomp/jcr_elements.c (revision 67)
587 +++ src/jcomp/jcr_elements.c (revision 77)
589 if (rc != G_IO_STATUS_NORMAL) {
591 log_warn(JDBG, "Main Channel Error: rc=%d, %d '%s' '%s'", rc,
592 - gerr->code, gerr->domain, gerr->message);
593 + gerr->code, g_quark_to_string(gerr->domain), gerr->message);
596 log_warn(JDBG, "Main Channel Error: rc=%d", rc);
599 if (XML_Parse(jcr->parser, jcr->recv_buffer, bytes_read, 0) == 0) {
600 log_warn(JDBG, "XML Parsing Error: '%s'", (char *)XML_ErrorString(XML_GetErrorCode(jcr->parser)));
601 - log_warn(JDBG, " Last Rcvd Buffer='%.*s'", bytes_read, jcr->recv_buffer);
602 + log_warn(JDBG, " Last Rcvd Buffer='%.*s'", (int)bytes_read, jcr->recv_buffer);
603 jcr_main_close_stream();
606 Index: src/jabberd/expat.c
607 ===================================================================
608 --- src/jabberd/expat.c (revision 67)
609 +++ src/jabberd/expat.c (revision 77)
612 *x = NULL; /* pointer to NULL */
613 p = XML_ParserCreate(NULL);
614 + XML_SetDefaultHandler(p, NULL);
615 XML_SetUserData(p, x);
616 XML_SetElementHandler(p, expat_startElement, expat_endElement);
617 XML_SetCharacterDataHandler(p, expat_charData);
620 *x = NULL; /* pointer to NULL */
621 p = XML_ParserCreate(NULL);
622 + XML_SetDefaultHandler(p, NULL);
623 XML_SetUserData(p, x);
624 XML_SetElementHandler(p, expat_startElement, expat_endElement);
625 XML_SetCharacterDataHandler(p, expat_charData);
627 return "unable to open file";
629 p = XML_ParserCreate(NULL);
630 + XML_SetDefaultHandler(p, NULL);
633 len = read(fd, buf, BUFSIZ);
634 Index: src/jabberd/str.c
635 ===================================================================
636 --- src/jabberd/str.c (revision 67)
637 +++ src/jabberd/str.c (revision 77)
639 if(a == NULL || b == NULL)
642 - while(*a == *b && *a != '\0' && *b != '\0'){ a++; b++; }
643 + return strcmp(a, b);
646 - if(*a == *b) return 0;
647 +int j_strcasecmp(const char *a, const char *b)
649 + if(a == NULL || b == NULL)
653 + return strcasecmp(a, b);
656 int j_strncmp(const char *a, const char *b, int i)
657 Index: src/jabberd/sha.c
658 ===================================================================
659 --- src/jabberd/sha.c (revision 67)
660 +++ src/jabberd/sha.c (revision 77)
663 for (i = 0; i < len; i++) {
664 ctx->W[ctx->lenW / 4] <<= 8;
665 - ctx->W[ctx->lenW / 4] |= (unsigned long)dataIn[i];
666 + ctx->W[ctx->lenW / 4] |= (uint32_t)dataIn[i];
667 if ((++ctx->lenW) % 64 == 0) {
672 static void shaHashBlock(j_SHA_CTX *ctx) {
674 - unsigned long A,B,C,D,E,TEMP;
675 + uint32_t A,B,C,D,E,TEMP;
677 for (t = 16; t <= 79; t++)