From f35ea56510fe047051bca17fb91df360fd4db291 Mon Sep 17 00:00:00 2001 From: CyberLeo Date: Sun, 21 Apr 2024 04:52:26 -0500 Subject: [PATCH] net-im/mu-conference: new port --- cdn/ports/net-im/mu-conference/Makefile | 114 +++ cdn/ports/net-im/mu-conference/distinfo | 2 + .../files/README.FreeBSD.external.in | 14 + .../files/README.FreeBSD.jabberd14.in | 38 + .../files/README.FreeBSD.jabberd2.in | 11 + .../mu-conference/files/mu-conference.in | 45 ++ .../mu-conference/files/patch-svn-67-77 | 678 ++++++++++++++++++ .../net-im/mu-conference/files/pkg-message.in | 25 + cdn/ports/net-im/mu-conference/pkg-descr | 4 + cdn/ports/net-im/mu-conference/pkg-plist | 2 + 10 files changed, 933 insertions(+) create mode 100644 cdn/ports/net-im/mu-conference/Makefile create mode 100644 cdn/ports/net-im/mu-conference/distinfo create mode 100644 cdn/ports/net-im/mu-conference/files/README.FreeBSD.external.in create mode 100644 cdn/ports/net-im/mu-conference/files/README.FreeBSD.jabberd14.in create mode 100644 cdn/ports/net-im/mu-conference/files/README.FreeBSD.jabberd2.in create mode 100644 cdn/ports/net-im/mu-conference/files/mu-conference.in create mode 100644 cdn/ports/net-im/mu-conference/files/patch-svn-67-77 create mode 100644 cdn/ports/net-im/mu-conference/files/pkg-message.in create mode 100644 cdn/ports/net-im/mu-conference/pkg-descr create mode 100644 cdn/ports/net-im/mu-conference/pkg-plist diff --git a/cdn/ports/net-im/mu-conference/Makefile b/cdn/ports/net-im/mu-conference/Makefile new file mode 100644 index 0000000..24ffaa9 --- /dev/null +++ b/cdn/ports/net-im/mu-conference/Makefile @@ -0,0 +1,114 @@ +# Created by: Denis Shaposhnikov +# $FreeBSD$ + +PORTNAME= mu-conference +PORTVERSION= 0.8 +PORTREVISION= 7 +CATEGORIES= net-im +MASTER_SITES= http://download.gna.org/mu-conference/ \ + https://pkg.cyberleo.net/distfiles/ +DISTNAME= ${PORTNAME}_${PORTVERSION} + +MAINTAINER= mm@FreeBSD.org +COMMENT= Multi-User Conferencing component for Jabber + +BROKEN= unfetchable +DEPRECATED= Broken for more than 6 months +EXPIRATION_DATE= 2020-05-05 + +LICENSE= GPLv2 +LICENSE_FILE= ${WRKSRC}/COPYING + +LIB_DEPENDS= libexpat.so:textproc/expat2 \ + libidn.so:dns/libidn + +USES= gnome pkgconfig shebangfix +SHEBANG_FILES= scripts/roommaker.pl scripts/roomname.pl +USE_GNOME= glib20 +USE_RC_SUBR= ${PORTNAME} + +OPTIONS_DEFINE= MYSQL DOCS +OPTIONS_DEFAULT=DAEMON +OPTIONS_SINGLE= SERVER +OPTIONS_SINGLE_SERVER= JABBERD EJABBERD DAEMON + +JABBERD_DESC= Use with jabberd 2.x (net-im/jabberd) +EJABBERD_DESC= Use with ejabberd (net-im/ejabberd) +DAEMON_DESC= Use builtin daemon + +SUB_FILES+= pkg-message README.FreeBSD.jabberd14 \ + README.FreeBSD.jabberd2 README.FreeBSD.external + +DOCFILES= AUTHORS ChangeLog FAQ LICENSE README TODO \ + XEP0045_SUPPORT muc-default.xml style.css + +PORTDOCS= * + +MAKE_JOBS_UNSAFE= yes + +.include + +.if ${PORT_OPTIONS:MMYSQL} +USES+= mysql +CFLAGS+= -DHAVE_MYSQL +LIBS+= `${LOCALBASE}/bin/mysql_config --libs` +DOCFILES+= README.sql mu-conference.sql +.endif + +MUC_LOGDIR?= /var/log/mu-conference + +.if ${PORT_OPTIONS:MJABBERD} +JABBER_REQUIRE?= jabberd +JABBER_USER?= jabber +JABBER_PIDDIR?= /var/jabberd/pid +JABBER_SPOOLDIR?= /var/spool/jabber +RUN_DEPENDS+= jabberd:net-im/jabberd +.elif ${PORT_OPTIONS:MEJABBERD} +JABBER_REQUIRE?= ejabberd +JABBER_USER?= ejabberd +JABBER_PIDDIR?= /var/jabberd/pid +JABBER_SPOOLDIR?= /var/spool/jabber +RUN_DEPENDS+= ejabberdctl:net-im/ejabberd +.elif ${PORT_OPTIONS:MDAEMON} +JABBER_REQUIRE?= DAEMON +JABBER_USER?= nobody +JABBER_PIDDIR?= /var/run/mu-conference +JABBER_SPOOLDIR?= /var/spool/mu-conference +.endif + +SUB_LIST+= JABBER_REQUIRE="${JABBER_REQUIRE}" \ + JABBER_PIDDIR="${JABBER_PIDDIR}" \ + JABBER_SPOOLDIR="${JABBER_SPOOLDIR}" \ + JABBER_USER=${JABBER_USER} \ + MUC_LOGDIR=${MUC_LOGDIR} + +post-patch: + @${REINPLACE_CMD} -e 's/=$$(CFLAGS)/=/g;s/^CFLAGS[:]*=/CFLAGS+=/g' \ + -e 's/^CC:*=/CC?=/g;s|gcc |$$(CC) |;s|-O2||g' \ + -e 's#`pkg-config#-I${LOCALBASE}/include `${LOCALBASE}/bin/pkg-config#g' \ + ${WRKSRC}/Makefile ${WRKSRC}/*/Makefile \ + ${WRKSRC}/*/*/Makefile + @${REINPLACE_CMD} -e 's#\./spool/chat.localhost#${JABBER_SPOOLDIR}/conference.localhost#g' \ + -e 's#\./syslogs#${LOGDIR}#g' \ + -e 's#\./logs#${JABBER_SPOOLDIR}/conference.localhost/logs#g' \ + -e 's#\.#${JABBER_PIDDIR}#g' \ + ${WRKSRC}/muc-default.xml + +do-install: + ${INSTALL_PROGRAM} ${WRKSRC}/src/mu-conference ${STAGEDIR}${PREFIX}/bin + ${INSTALL_DATA} ${WRKSRC}/muc-default.xml ${STAGEDIR}${PREFIX}/etc/muc.xml.sample +.if ${PORT_OPTIONS:MDOCS} + @${MKDIR} ${STAGEDIR}${DOCSDIR}/scripts +.for FILE in README.FreeBSD.jabberd14 README.FreeBSD.jabberd2 README.FreeBSD.external + @${INSTALL_DATA} ${WRKDIR}/${FILE} ${STAGEDIR}${DOCSDIR} +.endfor +.for FILE in ${DOCFILES} + @${INSTALL_DATA} ${WRKSRC}/${FILE} ${STAGEDIR}${DOCSDIR} +.endfor + ${INSTALL_DATA} ${WRKSRC}/scripts/README ${STAGEDIR}${DOCSDIR}/scripts +.for FILE in roommaker.pl roomname.pl + ${INSTALL_SCRIPT} ${WRKSRC}/scripts/${FILE} ${STAGEDIR}${DOCSDIR}/scripts +.endfor +.endif + +.include diff --git a/cdn/ports/net-im/mu-conference/distinfo b/cdn/ports/net-im/mu-conference/distinfo new file mode 100644 index 0000000..49769b9 --- /dev/null +++ b/cdn/ports/net-im/mu-conference/distinfo @@ -0,0 +1,2 @@ +SHA256 (mu-conference_0.8.tar.gz) = d9f4399573a83f20c84af55cb56b405c706a943898cb14a5d220d35b89db429b +SIZE (mu-conference_0.8.tar.gz) = 110356 diff --git a/cdn/ports/net-im/mu-conference/files/README.FreeBSD.external.in b/cdn/ports/net-im/mu-conference/files/README.FreeBSD.external.in new file mode 100644 index 0000000..4b83ff1 --- /dev/null +++ b/cdn/ports/net-im/mu-conference/files/README.FreeBSD.external.in @@ -0,0 +1,14 @@ +# MU-Conference and external jabber servers on FreeBSD +# README by Martin Matuska + +If you did not select WITH_JABBER, WITH_JABBERD or WITH_EJABBERD, you may want +to use another or external jabber server. To run the transport locally, you may +need to create the pid and spool directories manually. + +Default pahts of the current installation are: +%%JABBER_PIDDIR%% +%%JABBER_SPOOLDIR%% + +You should make these paths writable for the service user. +Default service user for this installation: +%%JABBER_USER%% diff --git a/cdn/ports/net-im/mu-conference/files/README.FreeBSD.jabberd14.in b/cdn/ports/net-im/mu-conference/files/README.FreeBSD.jabberd14.in new file mode 100644 index 0000000..34fbc12 --- /dev/null +++ b/cdn/ports/net-im/mu-conference/files/README.FreeBSD.jabberd14.in @@ -0,0 +1,38 @@ +# MU-Conference and jabberd14 (net-im/jabber) on FreeBSD +# README by Martin Matuska + +The sample configuration file for jabberd14 may be located in: +%%TARGETDIR%%/etc/jabber.xml.sample + +Please make all necessary changes to your configuration file which may be: +%%TARGETDIR%%/etc/jabber.xml + +NOTE: if you want this service to be accessible from other servers, + change any 'conference.localhost' listed below to a fully qualified + domain name! Please make sure that your directives are _NOT_ in an XML + comment: there are many multi-line comments. + +To activate MU-Conference for your Jabber server, +add the following to your configuration file and adjust to your settings +(around line 921 in the sample configuration file): +------------------------------------------------------------------------------- + + + + 127.0.0.1 + 7009 + password + + + +------------------------------------------------------------------------------- +Add this section to the browse area of the jsm to advertise it to +your users (around line 382 of the sample config): +------------------------------------------------------------------------------- + + + jabber:iq:conference + + +------------------------------------------------------------------------------- +Be sure to restart your server after reconfiguring. diff --git a/cdn/ports/net-im/mu-conference/files/README.FreeBSD.jabberd2.in b/cdn/ports/net-im/mu-conference/files/README.FreeBSD.jabberd2.in new file mode 100644 index 0000000..cc53442 --- /dev/null +++ b/cdn/ports/net-im/mu-conference/files/README.FreeBSD.jabberd2.in @@ -0,0 +1,11 @@ +# MU-Conference and jabberd2 (net-im/jabberd) on FreeBSD +# README by Martin Matuska + +The configuration for jabberd2 is located in: +%%TARGETDIR%%/etc/jabberd + +If you are using Jabberd2 then you shouldn't have to do much configuration. +Make sure the 'mainServer' setting is the IP or hostname of your Jabber server, +and set 'port' to 5347. Double-check that the secret for legacy components +in router.xml (for Jabberd2) is the same as the secret setting in config.py. +That should be all. You don't even need to restart Jabberd2. diff --git a/cdn/ports/net-im/mu-conference/files/mu-conference.in b/cdn/ports/net-im/mu-conference/files/mu-conference.in new file mode 100644 index 0000000..433182e --- /dev/null +++ b/cdn/ports/net-im/mu-conference/files/mu-conference.in @@ -0,0 +1,45 @@ +#!/bin/sh +# +# $FreeBSD$ + +# PROVIDE: mu_conference +# REQUIRE: %%JABBER_REQUIRE%% +# KEYWORD: shutdown + +# Define these mu_conference_* variables in one of these files: +# /etc/rc.conf +# /etc/rc.conf.local +# +# DO NOT CHANGE THESE DEFAULT VALUES HERE +# +# mu_conference_config : path +# Path to the configuration file ("%%PREFIX%%/etc/muc.xml", the default). +# +# mu_conference_enable : bool +# Enable ("YES") or disable ("NO", the default) this startup script. +# + +. /etc/rc.subr + +name="mu_conference" +rcvar=mu_conference_enable + +command="%%PREFIX%%/bin/mu-conference" + +stop_postcmd="mu_conference_stop_post" + +mu_conference_stop_post () { + rm -f ${pidfile} +} + +load_rc_config $name + +: ${mu_conference_config="%%PREFIX%%/etc/muc.xml"} +: ${mu_conference_enable="NO"} +: ${mu_conference_user="%%JABBER_USER%%"} +: ${mu_conference_pidfile="%%JABBER_PIDDIR%%/mu-conference.pid"} + +pidfile=${mu_conference_pidfile} +command_args="-c ${mu_conference_config} -B >/dev/null 2>&1" + +run_rc_command "$1" diff --git a/cdn/ports/net-im/mu-conference/files/patch-svn-67-77 b/cdn/ports/net-im/mu-conference/files/patch-svn-67-77 new file mode 100644 index 0000000..262956a --- /dev/null +++ b/cdn/ports/net-im/mu-conference/files/patch-svn-67-77 @@ -0,0 +1,678 @@ +Index: include/lib.h +=================================================================== +--- include/lib.h (revision 67) ++++ include/lib.h (revision 77) +@@ -1,6 +1,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -101,6 +102,7 @@ + char *j_strdup(const char *str); /* provides NULL safe strdup wrapper */ + char *j_strcat(char *dest, char *txt); /* strcpy() clone */ + int j_strcmp(const char *a, const char *b); /* provides NULL safe strcmp wrapper */ ++int j_strcasecmp(const char *a, const char *b); /* provides NULL safe strcasecmp wrapper */ + int j_strncmp(const char *a, const char *b, int i); /* provides NULL safe strncmp wrapper */ + int j_strncasecmp(const char *a, const char *b, int i); /* provides NULL safe strncasecmp wrapper */ + int j_strlen(const char *a); /* provides NULL safe strlen wrapper */ +@@ -299,10 +301,10 @@ + + + typedef struct { +- unsigned long H[5]; +- unsigned long W[80]; ++ uint32_t H[5]; ++ uint32_t W[80]; + int lenW; +- unsigned long sizeHi,sizeLo; ++ uint32_t sizeHi,sizeLo; + } j_SHA_CTX; + + +Index: include/conference.h +=================================================================== +--- include/conference.h (revision 67) ++++ include/conference.h (revision 77) +@@ -258,6 +258,7 @@ + /* Adds extended presence info to a presence packet */ + void add_status_code(xmlnode presence, char *status); /* add a muc status code to a presence stanza */ + void add_room_status_codes(xmlnode presence, cnr room); /* add room specific status codes (logging, anonymous, ...) */ ++int check_affiliation(GHashTable * ght, jid user, char * affiliation_name); /* Check if user as a particular affiliation */ + int is_sadmin(cni master, jid user); /* Check if user is server admin */ + int is_owner(cnr room, jid user); /* Check if user is room owner */ + int is_admin(cnr room, jid user); /* Check if user is room admin */ +Index: src/utils.c +=================================================================== +--- src/utils.c (revision 67) ++++ src/utils.c (revision 77) +@@ -136,6 +136,45 @@ + } + } + ++/* Generic function to check if an user as a particular affiliation */ ++int check_affiliation(GHashTable * ght, jid user, char * affiliation_name) ++{ ++ char ujid[3072]; ++ ++ snprintf(ujid, sizeof(ujid), "%s@%s", user->user, user->server); ++ ++ if(g_hash_table_lookup(ght, ujid) != NULL ) ++ { ++ log_debug(NAME, "[%s] Is %s? >%s< - Yes (case 1)", FZONE, affiliation_name, jid_full(user)); ++ return 1; ++ } ++ ++ if(g_hash_table_lookup(ght, user->server) != NULL ) ++ { ++ log_debug(NAME, "[%s] Is %s? >%s< - Yes (case 2)", FZONE, affiliation_name, jid_full(user)); ++ return 1; ++ } ++ ++ snprintf(ujid, sizeof(ujid), "%s@%s/%s", user->user, user->server, user->resource); ++ ++ if(g_hash_table_lookup(ght, ujid) != NULL ) ++ { ++ log_debug(NAME, "[%s] Is %s? >%s< - Yes (case 3)", FZONE, affiliation_name, jid_full(user)); ++ return 1; ++ } ++ ++ snprintf(ujid, sizeof(ujid), "%s/%s", user->server, user->resource); ++ ++ if(g_hash_table_lookup(ght, ujid) != NULL ) ++ { ++ log_debug(NAME, "[%s] Is %s? >%s< - Yes (case 4)", FZONE, affiliation_name, jid_full(user)); ++ return 1; ++ } ++ ++ log_debug(NAME, "[%s] Is %s? >%s< - No", FZONE, affiliation_name, jid_full(user)); ++ return 0; ++} ++ + /* Is the user a Service Admin? */ + int is_sadmin(cni master, jid user) + { +@@ -159,62 +198,46 @@ + /* Is the user an owner for that room */ + int is_owner(cnr room, jid user) + { +- char ujid[2048]; +- char cjid[2048]; +- + if(room == NULL || user == NULL) + { + log_warn(NAME, "[%s] ERR: Missing variable in is_owner", FZONE); + return 0; + } + +- snprintf(ujid, sizeof(ujid), "%s@%s", user->user, user->server); +- if(room->creator) +- { +- snprintf(cjid, sizeof(cjid), "%s@%s", room->creator->user, room->creator->server); +- } +- else +- { +- snprintf(cjid, sizeof(cjid), "@"); +- } +- + log_debug(NAME, "[%s] Is Owner? >%s<", FZONE, jid_full(user)); + + /* Server admin can override */ + if(is_sadmin(room->master, user)) ++ { ++ log_debug(NAME, "[%s] Is Owner? >%s< - Yes (service admin)", FZONE, jid_full(user)); + return 2; +- else if(j_strcmp(cjid, ujid) == 0) ++ } ++ ++ if(room->creator && j_strcmp(user->user, room->creator->user) == 0 && j_strcmp(user->server, room->creator->server) == 0) ++ { ++ log_debug(NAME, "[%s] Is Owner? >%s< - Yes (creator)", FZONE, jid_full(user)); + return 1; +- else if(g_hash_table_lookup(room->owner, ujid) != NULL ) +- return 1; +- else +- return 0; ++ } + ++ return check_affiliation(room->owner, user, "Owner"); + } + + /* Is the user in the admin affiliation list for that room */ + int is_admin(cnr room, jid user) + { +- char ujid[2048]; +- + if(room == NULL || user == NULL) + { + log_warn(NAME, "[%s] ERR: Missing variable in is_admin", FZONE); + return 0; + } + +- snprintf(ujid, sizeof(ujid), "%s@%s", user->user, user->server); +- log_debug(NAME, "[%s] Is Admin? >%s<", FZONE, jid_full(user)); +- + if(is_owner(room, user)) ++ { ++ log_debug(NAME, "[%s] Is Admin? >%s< - Yes (owner)", FZONE, jid_full(user)); + return 2; ++ } + +- if(g_hash_table_lookup(room->admin, ujid) != NULL ) +- return 1; +- else if(g_hash_table_lookup(room->admin, user->server) != NULL ) +- return 1; +- else +- return 0; ++ return check_affiliation(room->admin, user, "Admin"); + } + + /* Is the user in the moderator role list for that room */ +@@ -271,16 +294,12 @@ + /* Is the user in the member affiliation list for that room */ + int is_member(cnr room, jid user) + { +- char ujid[2048]; +- + if(room == NULL || user == NULL) + { + log_warn(NAME, "[%s] ERR: Missing variable in is_member", FZONE); + return 0; + } + +- snprintf(ujid, sizeof(ujid), "%s@%s", user->user, user->server); +- + /* Owner is automatically a member */ + if(is_owner(room, user)) + { +@@ -295,42 +314,19 @@ + return 1; + } + +- if(g_hash_table_lookup(room->member, ujid) != NULL ) +- { +- log_debug(NAME, "[%s] Is Member? >%s< - Yes (case 1)", FZONE, jid_full(user)); +- return 1; +- } +- else if(g_hash_table_lookup(room->member, user->server) != NULL ) +- { +- log_debug(NAME, "[%s] Is Member? >%s< - Yes (case 2)", FZONE, jid_full(user)); +- return 1; +- } +- else +- { +- log_debug(NAME, "[%s] Is Member? >%s< - No", FZONE, jid_full(user)); +- return 0; +- } ++ return check_affiliation(room->member, user, "Member"); + } + + /* Is the user in the outcast affiliation list for that room */ + int is_outcast(cnr room, jid user) + { +- char ujid[2048]; +- + if(room == NULL || user == NULL) + { + log_warn(NAME, "[%s] ERR: Missing variable in is_outcast", FZONE); + return 0; + } + +- snprintf(ujid, sizeof(ujid), "%s@%s", user->user, user->server); +- +- if(g_hash_table_lookup(room->outcast, ujid) != NULL ) +- return 1; +- else if(g_hash_table_lookup(room->outcast, user->server) != NULL ) +- return 1; +- else +- return 0; ++ return check_affiliation(room->outcast, user, "Outcast"); + } + + /* Only return 1 if visitor */ +Index: src/conference_room.c +=================================================================== +--- src/conference_room.c (revision 67) ++++ src/conference_room.c (revision 77) +@@ -1018,7 +1018,7 @@ + + if( nick == NULL) + { +- log_debug(NAME, "[%s] No receipient, returning error", FZONE); ++ log_debug(NAME, "[%s] No recipient, returning error", FZONE); + + jutil_error(jp->x,TERROR_BAD); + deliver(dpacket_new(jp->x),NULL); +@@ -1031,6 +1031,15 @@ + { + id = jid_new(xmlnode_pool(item), nick); + ++ if (id == NULL) ++ { ++ log_debug(NAME, "[%s] Bad recipient, returning error", FZONE); ++ jutil_error(jp->x,TERROR_BAD); ++ deliver(dpacket_new(jp->x),NULL); ++ ++ xmlnode_free(item); ++ return; ++ } + key = j_strdup(jid_full(jid_user(jid_fix(id)))); + g_hash_table_insert(room->member, key, (void*)item); + } +@@ -1143,7 +1152,8 @@ + if (cont == 0) + jutil_delay(node, jid_full(room->id)); + +- if(room->master->history > 0) ++ /* check if stanza contains a body tag and if history is activated */ ++ if(xmlnode_get_tag_data(node,"body")!=NULL && room->master->history > 0) + { + + hist_p = pool_new(); +@@ -1426,7 +1436,7 @@ + /* Create pool for room struct */ + p = pool_new(); + room = pmalloco(p, sizeof(_cnr)); +- log_debug(NAME, "[%s] Malloc: _cnr = %d", FZONE, sizeof(_cnr)); ++ log_debug(NAME, "[%s] Malloc: _cnr = %lu", FZONE, sizeof(_cnr)); + room->p = p; + room->master = master; + +@@ -1448,7 +1458,7 @@ + + /* Initialise room history */ + room->history = pmalloco(p, sizeof(_cnh) * master->history); /* make array of xmlnodes */ +- log_debug(NAME, "[%s] Malloc: history = %d", FZONE, sizeof(_cnh) * master->history); ++ log_debug(NAME, "[%s] Malloc: history = %lu", FZONE, sizeof(_cnh) * master->history); + + /* Room time */ + room->start = now; +@@ -1498,7 +1508,7 @@ + + room->creator = jid_new(room->p, jid_full(jid_user(admin->realid))); + +- add_affiliate(room->owner, admin->realid, NULL); ++ add_affiliate(room->owner, jid_user(admin->realid), NULL); + + log_debug(NAME, "[%s] Added new admin: %s to room %s", FZONE, jid_full(jid_fix(owner)), jid_full(room->id)); + } +Index: src/roles.c +=================================================================== +--- src/roles.c (revision 67) ++++ src/roles.c (revision 77) +@@ -73,14 +73,37 @@ + xmlnode old; + xmlnode store; + xmlnode node; +- char ujid[2048]; ++ char ujid[3072]; + + if(userid == NULL) + { + return -1; + } + +- snprintf(ujid, sizeof(ujid), "%s@%s", userid->user, userid->server); ++ ++ if(userid->user == NULL) ++ { ++ if(userid->resource == NULL) ++ { ++ snprintf(ujid, sizeof(ujid), "%s", userid->server); ++ } ++ else ++ { ++ snprintf(ujid, sizeof(ujid), "%s/%s", userid->server, userid->resource); ++ } ++ } ++ else ++ { ++ if(userid->resource == NULL) ++ { ++ snprintf(ujid, sizeof(ujid), "%s@%s", userid->user, userid->server); ++ } ++ else ++ { ++ snprintf(ujid, sizeof(ujid), "%s@%s/%s", userid->user, userid->server, userid->resource); ++ ++ } ++ } + old = g_hash_table_lookup(hash, ujid); + + /* User not previously registered. Set up */ +@@ -121,18 +144,42 @@ + xmlnode old; + xmlnode store; + xmlnode node; +- char ujid[2048]; ++ char ujid[3072]; + + if(userid == NULL) + { + return -1; + } + +- snprintf(ujid, sizeof(ujid), "%s@%s", userid->user, userid->server); ++ if(userid->user == NULL) ++ { ++ if(userid->resource == NULL) ++ { ++ snprintf(ujid, sizeof(ujid), "%s", userid->server); ++ } ++ else ++ { ++ snprintf(ujid, sizeof(ujid), "%s/%s", userid->server, userid->resource); ++ } ++ } ++ else ++ { ++ if(userid->resource == NULL) ++ { ++ snprintf(ujid, sizeof(ujid), "%s@%s", userid->user, userid->server); ++ } ++ else ++ { ++ snprintf(ujid, sizeof(ujid), "%s@%s/%s", userid->user, userid->server, userid->resource); ++ ++ } ++ } + old = g_hash_table_lookup(hash, ujid); + + if(old == NULL) ++ { + return 1; ++ } + + store = xmlnode_dup(old); + +@@ -158,14 +205,36 @@ + xmlnode store; + xmlnode current; + char *userjid; +- char ujid[2048]; ++ char ujid[3072]; + + if(userid == NULL) + { + return; + } + +- snprintf(ujid, sizeof(ujid), "%s@%s", userid->user, userid->server); ++ if(userid->user == NULL) ++ { ++ if(userid->resource == NULL) ++ { ++ snprintf(ujid, sizeof(ujid), "%s", userid->server); ++ } ++ else ++ { ++ snprintf(ujid, sizeof(ujid), "%s/%s", userid->server, userid->resource); ++ } ++ } ++ else ++ { ++ if(userid->resource == NULL) ++ { ++ snprintf(ujid, sizeof(ujid), "%s@%s", userid->user, userid->server); ++ } ++ else ++ { ++ snprintf(ujid, sizeof(ujid), "%s@%s/%s", userid->user, userid->server, userid->resource); ++ ++ } ++ } + store = g_hash_table_lookup(hash, ujid); + + if(store == NULL) +Index: src/conference.c +=================================================================== +--- src/conference.c (revision 67) ++++ src/conference.c (revision 77) +@@ -538,6 +538,15 @@ + xmlnode_hide_attrib(jp->x, "type"); + } + ++ // clean the packet from any x muc#user tag ++ for( node = xmlnode_get_firstchild(jp->x); node != NULL; node = xmlnode_get_nextsibling(node)) { ++ if (xmlnode_get_name(node)==NULL || strcmp("x",xmlnode_get_name(node))!=0) continue; // check if the node is a "x" node ++ if(NSCHECK(node, NS_MUC_USER)) ++ { ++ xmlnode_hide(node); ++ } ++ } ++ + priority = jutil_priority(jp->x); + } + +@@ -578,7 +587,7 @@ + } + + /* Don't allow user if locknicks is set and resource != JID user */ +- if ( ((master->locknicks || room->locknicks) && (j_strcmp(jp->to->resource, jp->from->user) != 0)) && !is_sadmin(master, jp->from) ) { ++ if ( ((master->locknicks || room->locknicks) && (j_strcasecmp(jp->to->resource, jp->from->user) != 0)) && !is_sadmin(master, jp->from) ) { + log_debug(NAME, "[%s] Nicknames locked - Requested nick %s doesn't match required username %s", + FZONE, jp->to->resource, jp->from->user); + +@@ -1079,7 +1088,7 @@ + tp = pool_new(); + + /* Allocate space for cni struct and link to instance */ +- log_debug(NAME, "[%s] Malloc: _cni=%d", FZONE, sizeof(_cni)); ++ log_debug(NAME, "[%s] Malloc: _cni=%lu", FZONE, sizeof(_cni)); + master = pmalloco(i->p, sizeof(_cni)); + + master->i = i; +Index: src/jcomp/jcr_log.c +=================================================================== +--- src/jcomp/jcr_log.c (revision 67) ++++ src/jcomp/jcr_log.c (revision 77) +@@ -79,8 +79,8 @@ + g_static_mutex_lock(&_jcr_log_lock); + va_start(ap, fmt); + vsnprintf(logmsg, 512, fmt, ap); ++ va_end(ap); + g_log(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, "%s: %s", zone, logmsg); +- va_end(ap); + g_static_mutex_unlock(&_jcr_log_lock); + } + +@@ -92,8 +92,8 @@ + g_static_mutex_lock(&_jcr_log_lock); + va_start(ap, fmt); + vsnprintf(logmsg, 512, fmt, ap); ++ va_end(ap); + g_log(G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, "%s: %s", zone, logmsg); +- va_end(ap); + g_static_mutex_unlock(&_jcr_log_lock); + } + +@@ -105,8 +105,8 @@ + g_static_mutex_lock(&_jcr_log_lock); + va_start(ap, fmt); + vsnprintf(logmsg, 512, fmt, ap); ++ va_end(ap); + g_log(G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, "%s: %s", zone, logmsg); +- va_end(ap); + g_static_mutex_unlock(&_jcr_log_lock); + } + +@@ -118,8 +118,8 @@ + g_static_mutex_lock(&_jcr_log_lock); + va_start(ap, fmt); + vsnprintf(logmsg, 512, fmt, ap); ++ va_end(ap); + g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "%s: %s", zone, logmsg); +- va_end(ap); + g_static_mutex_unlock(&_jcr_log_lock); + } + +@@ -131,7 +131,7 @@ + g_static_mutex_lock(&_jcr_log_lock); + va_start(ap, fmt); + vsnprintf(logmsg, 512, fmt, ap); ++ va_end(ap); + g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "%s: %s", zone, logmsg); +- va_end(ap); + g_static_mutex_unlock(&_jcr_log_lock); + } +Index: src/jcomp/jcr_base_connect.c +=================================================================== +--- src/jcomp/jcr_base_connect.c (revision 67) ++++ src/jcomp/jcr_base_connect.c (revision 77) +@@ -84,7 +84,7 @@ + if (rc != G_IO_STATUS_NORMAL) { + log_warn(JDBG, "Opening XML stream failed, rc=%d", rc); + } else { +- log_debug(JDBG, "Opening XML stream: sent %d bytes", bytes); ++ log_debug(JDBG, "Opening XML stream: sent %lu bytes", bytes); + } + + } +Index: src/jcomp/jcr_main_stream_error.c +=================================================================== +--- src/jcomp/jcr_main_stream_error.c (revision 67) ++++ src/jcomp/jcr_main_stream_error.c (revision 77) +@@ -31,6 +31,7 @@ + + jcr->stream_state = _STREAM_INIT_STATE; + jcr->parser = XML_ParserCreate(NULL); ++ XML_SetDefaultHandler(jcr->parser, NULL); + XML_SetElementHandler(jcr->parser, (void *)jcr_start_element, (void *)jcr_end_element); + XML_SetCharacterDataHandler(jcr->parser, (void *)jcr_cdata); + XML_SetUserData(jcr->parser, NULL); +@@ -60,7 +61,6 @@ + g_source_remove(jcr->gmain_watch_source); + g_io_channel_shutdown(jcr->gio, TRUE, NULL); + g_io_channel_unref(jcr->gio); +- g_io_channel_unref(jcr->gio); + close(jcr->fd); + + +Index: src/jcomp/jcr_deliver.c +=================================================================== +--- src/jcomp/jcr_deliver.c (revision 67) ++++ src/jcomp/jcr_deliver.c (revision 77) +@@ -33,7 +33,7 @@ + sleep(1); + } + +- log_debug(JDBG, "queued %d bytes : >>> %s <<<", strlen(xmlnode2str(d->x)), xmlnode2str(d->x)); ++ log_debug(JDBG, "queued %lu bytes : >>> %s <<<", strlen(xmlnode2str(d->x)), xmlnode2str(d->x)); + g_async_queue_push(jcr->dqueue, d); + } + +@@ -90,7 +90,7 @@ + log_warn(JDBG, "Send packet failed, dropping packet"); + } + +- log_debug(JDBG, "wrote %d packets of %d bytes", pkts, bytes); ++ log_debug(JDBG, "wrote %d packets of %lu bytes", pkts, bytes); + // fprintf(stderr, "wrote %d packets of %d bytes\n", pkts, bytes); + if (left==0){ + //queue is empty, flushing the socket +@@ -99,7 +99,7 @@ + } + } + log_warn(JDBG, "packet delivery thread exiting."); +- log_warn(JDBG, " Last DvryQ Buffer='%.*s'", buffer->len, buffer->str); ++ log_warn(JDBG, " Last DvryQ Buffer='%.*s'", (int)buffer->len, buffer->str); + g_string_free(buffer, TRUE); + } + +Index: src/jcomp/jcr_elements.c +=================================================================== +--- src/jcomp/jcr_elements.c (revision 67) ++++ src/jcomp/jcr_elements.c (revision 77) +@@ -172,7 +172,7 @@ + if (rc != G_IO_STATUS_NORMAL) { + if (gerr != NULL) { + log_warn(JDBG, "Main Channel Error: rc=%d, %d '%s' '%s'", rc, +- gerr->code, gerr->domain, gerr->message); ++ gerr->code, g_quark_to_string(gerr->domain), gerr->message); + g_error_free(gerr); + } else { + log_warn(JDBG, "Main Channel Error: rc=%d", rc); +@@ -186,7 +186,7 @@ + + if (XML_Parse(jcr->parser, jcr->recv_buffer, bytes_read, 0) == 0) { + log_warn(JDBG, "XML Parsing Error: '%s'", (char *)XML_ErrorString(XML_GetErrorCode(jcr->parser))); +- log_warn(JDBG, " Last Rcvd Buffer='%.*s'", bytes_read, jcr->recv_buffer); ++ log_warn(JDBG, " Last Rcvd Buffer='%.*s'", (int)bytes_read, jcr->recv_buffer); + jcr_main_close_stream(); + return FALSE; + } +Index: src/jabberd/expat.c +=================================================================== +--- src/jabberd/expat.c (revision 67) ++++ src/jabberd/expat.c (revision 77) +@@ -95,6 +95,7 @@ + + *x = NULL; /* pointer to NULL */ + p = XML_ParserCreate(NULL); ++ XML_SetDefaultHandler(p, NULL); + XML_SetUserData(p, x); + XML_SetElementHandler(p, expat_startElement, expat_endElement); + XML_SetCharacterDataHandler(p, expat_charData); +@@ -128,6 +129,7 @@ + + *x = NULL; /* pointer to NULL */ + p = XML_ParserCreate(NULL); ++ XML_SetDefaultHandler(p, NULL); + XML_SetUserData(p, x); + XML_SetElementHandler(p, expat_startElement, expat_endElement); + XML_SetCharacterDataHandler(p, expat_charData); +@@ -165,6 +167,7 @@ + return "unable to open file"; + + p = XML_ParserCreate(NULL); ++ XML_SetDefaultHandler(p, NULL); + while(1) + { + len = read(fd, buf, BUFSIZ); +Index: src/jabberd/str.c +=================================================================== +--- src/jabberd/str.c (revision 67) ++++ src/jabberd/str.c (revision 77) +@@ -65,11 +65,15 @@ + if(a == NULL || b == NULL) + return -1; + +- while(*a == *b && *a != '\0' && *b != '\0'){ a++; b++; } ++ return strcmp(a, b); ++} + +- if(*a == *b) return 0; ++int j_strcasecmp(const char *a, const char *b) ++{ ++ if(a == NULL || b == NULL) ++ return -1; + +- return -1; ++ return strcasecmp(a, b); + } + + int j_strncmp(const char *a, const char *b, int i) +Index: src/jabberd/sha.c +=================================================================== +--- src/jabberd/sha.c (revision 67) ++++ src/jabberd/sha.c (revision 77) +@@ -50,7 +50,7 @@ + */ + for (i = 0; i < len; i++) { + ctx->W[ctx->lenW / 4] <<= 8; +- ctx->W[ctx->lenW / 4] |= (unsigned long)dataIn[i]; ++ ctx->W[ctx->lenW / 4] |= (uint32_t)dataIn[i]; + if ((++ctx->lenW) % 64 == 0) { + shaHashBlock(ctx); + ctx->lenW = 0; +@@ -109,7 +109,7 @@ + + static void shaHashBlock(j_SHA_CTX *ctx) { + int t; +- unsigned long A,B,C,D,E,TEMP; ++ uint32_t A,B,C,D,E,TEMP; + + for (t = 16; t <= 79; t++) + ctx->W[t] = diff --git a/cdn/ports/net-im/mu-conference/files/pkg-message.in b/cdn/ports/net-im/mu-conference/files/pkg-message.in new file mode 100644 index 0000000..202c77a --- /dev/null +++ b/cdn/ports/net-im/mu-conference/files/pkg-message.in @@ -0,0 +1,25 @@ +[ +{ type: install + message: <