diff -ru --exclude Makefile /usr/local/src/mu-conference-0.6.0/include/conference.h ./include/conference.h --- /usr/local/src/mu-conference-0.6.0/include/conference.h Sat Nov 15 06:19:43 2003 +++ ./include/conference.h Fri Oct 1 19:28:56 2004 @@ -62,6 +62,7 @@ #define TERROR_MUC_FULL (terror){408, "Room is full."} #define TERROR_MUC_NICK (terror){409, "Please choose a different nickname."} #define TERROR_MUC_NICKREG (terror){409, "Reserved Nick - Please choose a different nickname."} +#define TERROR_MUC_NICKLOCKED (terror){409, "Nicknames locked: please use your username instead."} #define SEND_ALL 0 #define SEND_LEGACY 1 @@ -101,6 +102,7 @@ int loader; /* Used to delay loading from xdb */ int roomlock; /* Stop dynamic room creation */ int dynamic; /* Only allows dynamic rooms to be created */ + int locknicks; /* All rooms have locked nicknames */ int shutdown; /* Service shutting down */ #ifndef _JCOMP pth_mutex_t lock; /* Used for hasGHashTable *locking */ @@ -136,6 +138,7 @@ int public; /* Is this room publicly searchable */ int subjectlock; /* Is changing subject locked to admins? */ int maxusers; /* Maximum allowed users, 0 = unlimited */ + int locknicks; /* Nicknames locked to JID usernames */ int persistent; /* Will this room avoid autocleanup */ int moderated; /* Is this room moderated */ int defaulttype; /* Do users default to members in moderated rooms? */ diff -ru --exclude Makefile /usr/local/src/mu-conference-0.6.0/src/conference.c ./src/conference.c --- /usr/local/src/mu-conference-0.6.0/src/conference.c Sat Nov 15 06:19:44 2003 +++ ./src/conference.c Thu Jan 20 12:11:39 2005 @@ -532,6 +532,22 @@ return; } + /* 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) ) { + log_debug(NAME, "[%s] Nicknames locked - Requested nick %s doesn't match required username %s", + FZONE, jp->to->resource, jp->from->user); + + /* Send a nickname refused error message */ + jutil_error(jp->x, TERROR_MUC_NICKLOCKED); +#ifndef _JCOMP + pth_mutex_release(&master->lock); +#else + g_mutex_unlock(master->lock); +#endif + deliver(dpacket_new(jp->x),NULL); + return; + } + /* User already exists, return conflict Error */ if(u2 != NULL) { @@ -1172,6 +1188,12 @@ /* If requested, stop any new rooms being created */ if(xmlnode_get_tag(cfg,"persistent")) master->dynamic = -1; + + /* If requested, make room nicknames locked by default */ + if(xmlnode_get_tag(cfg,"locknicks")) + master->locknicks = 1; + else + master->locknicks = 0; master->sadmin = g_hash_table_new_full(g_str_hash,g_str_equal, ght_remove_key, ght_remove_xmlnode); diff -ru --exclude Makefile /usr/local/src/mu-conference-0.6.0/src/conference_room.c ./src/conference_room.c --- /usr/local/src/mu-conference-0.6.0/src/conference_room.c Sat Nov 15 06:19:45 2003 +++ ./src/conference_room.c Fri Oct 1 19:28:56 2004 @@ -1246,6 +1246,9 @@ room->secret = j_strdup(secret); room->private = private; + /* lock nicknames - defaults to off (unless overridden by master setting) */ + room->locknicks = 0; + /* Initialise room history */ room->history = pmalloco(p, sizeof(xmlnode) * master->history); /* make array of xmlnodes */ log_debug(NAME, "[%s] Malloc: history = %d", FZONE, sizeof(xmlnode) * master->history); diff -ru --exclude Makefile /usr/local/src/mu-conference-0.6.0/src/xdata.c ./src/xdata.c --- /usr/local/src/mu-conference-0.6.0/src/xdata.c Sat Nov 15 06:19:45 2003 +++ ./src/xdata.c Fri Oct 1 19:28:56 2004 @@ -194,6 +194,11 @@ room->moderated = j_atoi(xmlnode_get_tag_data(xmlnode_get_tag(results,"?var=muc#owner_moderatedroom"),"value"),room->moderated); room->defaulttype = j_atoi(xmlnode_get_tag_data(xmlnode_get_tag(results,"?var=defaulttype"),"value"),room->defaulttype); room->privmsg = j_atoi(xmlnode_get_tag_data(xmlnode_get_tag(results,"?var=privmsg"),"value"),room->privmsg); + + /* Nicknames locked ? Allow owner to choose if master->locknicks != 0 */ + if (!room->master->locknicks) + room->locknicks = j_atoi(xmlnode_get_tag_data(xmlnode_get_tag(results,"?var=locknicks"),"value"),room->locknicks); + room->invitation = j_atoi(xmlnode_get_tag_data(xmlnode_get_tag(results,"?var=muc#owner_inviteonly"),"value"),room->invitation); room->invites = j_atoi(xmlnode_get_tag_data(xmlnode_get_tag(results,"?var=muc#owner_allowinvites"),"value"),room->invites); room->legacy = j_atoi(xmlnode_get_tag_data(xmlnode_get_tag(results,"?var=legacy"),"value"),room->legacy); @@ -460,6 +465,9 @@ element = xmlnode_insert_tag(field, "option"); xmlnode_put_attrib(element, "label", "None"); xmlnode_insert_cdata(xmlnode_insert_tag(element, "value"), "0", -1); + + if (!room->master->locknicks) + xmlnode_insert_node(x,add_xdata_boolean("Lock nicknames to JID usernames?", "locknicks", room->locknicks)); xmlnode_insert_node(x,add_xdata_boolean("Allow Occupants to query other Occupants?", "privacy", room->private)); xmlnode_insert_node(x,add_xdata_boolean("Allow Public Searching for Room", "muc#owner_publicroom", room->public)); diff -ru --exclude Makefile /usr/local/src/mu-conference-0.6.0/src/xdb.c ./src/xdb.c --- /usr/local/src/mu-conference-0.6.0/src/xdb.c Sat Nov 15 06:19:46 2003 +++ ./src/xdb.c Fri Oct 1 19:28:56 2004 @@ -71,6 +71,8 @@ xmlnode_insert_cdata(xmlnode_insert_tag(node, "visible"), itoa(room->visible, temp), -1); xmlnode_insert_cdata(xmlnode_insert_tag(node, "logformat"), itoa(room->logformat, temp), -1); + xmlnode_insert_cdata(xmlnode_insert_tag(node, "locknicks"), itoa(room->locknicks, temp), -1); + if(room->logfile) xmlnode_insert_cdata(xmlnode_insert_tag(node, "logging"), "1", -1); else @@ -368,6 +370,7 @@ room->privmsg = j_atoi(xmlnode_get_tag_data(result, "privmsg"), 0); room->invitation = j_atoi(xmlnode_get_tag_data(result, "invitation"), 0); room->invites = j_atoi(xmlnode_get_tag_data(result, "invites"), 0); + room->locknicks = j_atoi(xmlnode_get_tag_data(result, "locknicks"), 0); room->legacy = j_atoi(xmlnode_get_tag_data(result, "legacy"), 1); room->public = j_atoi(xmlnode_get_tag_data(result, "public"), room->master->public); room->visible = j_atoi(xmlnode_get_tag_data(result, "visible"), 0);