Using mod_groups you can add groups which are forced into everyone's
rosters from the server-side. As an admin, you can send <iq> packets
which add users to groups in the xdb backend. The problem was that
there was no equivalent remove capability. This patch adds the ability
to remove users with a slightly modified <iq>. Note that this has no
effect on users "registering" and "unregistering" themselves from public
groups, only on <required> groups which the admin maintains.
The IQ to add a user looks more or less like:
<iq type="set" to="domain.com/groups/MyGroup" from="[EMAIL PROTECTED]">
<query xmlns="jabber:iq:browse">
<user jid='[EMAIL PROTECTED]' name='UserAlias' />
</query>
</iq>
And to remove add an action='remove' to the <user> tag:
<iq type="set" to="domain.com/groups/MyGroup" from="[EMAIL PROTECTED]">
<query xmlns="jabber:iq:browse">
<user action="remove" jid='[EMAIL PROTECTED]' name='UserAlias' />
</query>
</iq>
Note that this patch includes a patch I found somewhere a while back
which fixes a bug w/ the admin <iq>s. This patch should be applied
against the 1.4.2 jabberd server.
Nathan
--
Nathan P Sharp
Phoenix Integration
1715 Pratt Dr
Suite 2000
540-961-7215
540-961-5831 (fax)
*** ../../../tmp/jabber-1.4.2/jsm/modules/mod_groups.c Fri Feb 8 02:39:28 2002
--- mod_groups.c Thu May 9 17:22:33 2002
***************
*** 572,593 ****
pool p = jp->p;
grouptab gt;
xmlnode info, user;
jid uid;
! char *gid, *gn, *un;
log_debug(ZONE,"Setting");
gid = strchr(jp->to->resource,'/');
! if (gid == NULL || ++gid == NULL);
{
js_bounce(m->si,jp->x,TERROR_NOTACCEPTABLE);
return;
}
user = xmlnode_get_tag(jp->iq,"user");
uid = jid_new(p,xmlnode_get_attrib(user,"jid"));
un = xmlnode_get_attrib(user,"name");
if (uid == NULL || un == NULL)
{
js_bounce(m->si,jp->x,TERROR_NOTACCEPTABLE);
--- 572,596 ----
pool p = jp->p;
grouptab gt;
xmlnode info, user;
jid uid;
! char *gid, *gn, *un, *host, *action;
! int add;
log_debug(ZONE,"Setting");
gid = strchr(jp->to->resource,'/');
! if (gid == NULL || ++gid == NULL)
{
js_bounce(m->si,jp->x,TERROR_NOTACCEPTABLE);
return;
}
user = xmlnode_get_tag(jp->iq,"user");
uid = jid_new(p,xmlnode_get_attrib(user,"jid"));
un = xmlnode_get_attrib(user,"name");
+ action = xmlnode_get_attrib(user, "action");
+ add = ( ( action == NULL ) || j_strcmp(action, "remove") );
if (uid == NULL || un == NULL)
{
js_bounce(m->si,jp->x,TERROR_NOTACCEPTABLE);
***************
*** 595,620 ****
return;
}
info = mod_groups_get_info(mi,p,jp->to->server,gid);
! if (info == NULL ||
xmlnode_get_tag(info,spools(p,"edit/user=",jp->from->user,p)) == NULL)
{
js_bounce(m->si,jp->x,TERROR_NOTALLOWED);
return;
}
gn = xmlnode_get_tag_data(info,"name");
if (mod_groups_xdb_add(mi,p,uid,un,gid,gn,1))
{
js_bounce(m->si,jp->x,TERROR_UNAVAIL);
xmlnode_free(info);
return;
}
gt = GROUP_GET(mi,gid);
/* push the new user to the other members */
! mod_groups_update_rosters(gt,uid,un,gn,1);
/* XXX how can we push the roster to the new user and send their presence?
lookup their session? */
xmlnode_free(info);
--- 598,638 ----
return;
}
info = mod_groups_get_info(mi,p,jp->to->server,gid);
! if (info == NULL ||
xmlnode_get_tag(info,spools(p,"edit/user=",jid_full(jp->from),p)) == NULL)
{
js_bounce(m->si,jp->x,TERROR_NOTALLOWED);
return;
}
gn = xmlnode_get_tag_data(info,"name");
+ log_debug("mod_groups","Yada");
+ if ( add )
+ {
if (mod_groups_xdb_add(mi,p,uid,un,gid,gn,1))
{
js_bounce(m->si,jp->x,TERROR_UNAVAIL);
xmlnode_free(info);
return;
}
+ }
+ else
+ {
+ log_debug("mod_groups", "Removing");
+ host = jp->from->server;
+ if (mod_groups_xdb_remove(mi,p,uid,host,gid))
+ {
+ js_bounce(m->si,jp->x,TERROR_UNAVAIL);
+ xmlnode_free(info);
+ return;
+ }
+ }
gt = GROUP_GET(mi,gid);
/* push the new user to the other members */
! mod_groups_update_rosters(gt,uid,un,gn,add);
/* XXX how can we push the roster to the new user and send their presence?
lookup their session? */
xmlnode_free(info);
***************
*** 940,948 ****
js_bounce(m->si,jp->x,TERROR_NOTFOUND);
return M_HANDLED;
}
! if (xmlnode_get_tag(info,spools(jp->p,"write/user=",jp->from->user,jp->p)) !=
NULL)
mod_groups_message_online(mi,jp->x,gid);
else
js_bounce(m->si,jp->x,TERROR_NOTALLOWED);
--- 958,966 ----
js_bounce(m->si,jp->x,TERROR_NOTFOUND);
return M_HANDLED;
}
! if (xmlnode_get_tag(info,spools(jp->p,"write/user=",jid_full(jp->from),jp->p))
!= NULL)
mod_groups_message_online(mi,jp->x,gid);
else
js_bounce(m->si,jp->x,TERROR_NOTALLOWED);