Dudley Carr wrote:
Robert Norris wrote:
On Wed, Jan 07, 2004 at 01:17:49PM +0300, Alexey Nezhdanov wrote:
Testing privacy lists handling with xmpppy and jabberd2s1:
It seems that server return "all info at once" with lists list
request and ingnores a particular info request:
mod_privacy isn't in great shape just now. I'm trying to get it fixed
for 2.0s2.
Rob.
Below is a patch for mod_privacy. The previously mentioned issues have
been resolved in addition to some other problems. Here's the list of
problems fixed:
1. mod_privacy wasn't the producing list of privacy lists
2. No replies for individual privacy list requests
3. Renamed errors according to draft-ietf-xmpp-im-20 that were
supposed to be ITEM_NOT_FOUND but instead were BAD_REQUEST
4. Error packets were using an incorrect namespace
(jabber:iq:privacy:error) and so were being dropped by sm's mod_validate
5. Corrected copy-paste accident: Outbound packets were looking at the
recipient's privacy policy instead of the sender's privacy policy.
Regards,
Dudley
Since my mailer corrupted the patch, I'm attaching a restored version.
P.S. Don't tested it yet.
--
Respectfully
Alexey Nezhdanov
diff -ur jabberd-2.0s1/sm/mod_privacy.c jabberd-2.0s1-dev/sm/mod_privacy.c
--- jabberd-2.0s1/sm/mod_privacy.c 2003-12-12 02:47:22.000000000 +0300
+++ jabberd-2.0s1-dev/sm/mod_privacy.c 2004-01-18 10:24:30.000000000 +0300
@@ -473,8 +473,8 @@
z = (zebra_t) user->module_data[mod->index];
/* find a session */
- if(*pkt->to->resource != '\0')
- sess = sess_match(user, pkt->to->resource);
+ if(*pkt->from->resource != '\0')
+ sess = sess_match(user, pkt->from->resource);
/* get the active list for the session */
if(sess != NULL)
@@ -489,7 +489,7 @@
return mod_PASS;
/* figure out the action */
- if(_privacy_action(user, zlist, pkt->from, pkt->type, 0) == 0)
+ if(_privacy_action(user, zlist, pkt->to, pkt->type, 0) == 0)
return mod_PASS;
/* deny */
@@ -568,6 +568,22 @@
}
}
+/** add a list to the return packet */
+static void _privacy_lists_result_builder(xht zhash, const char *name, void *val,
void *arg) {
+ zebra_list_t zlist = (zebra_list_t) val;
+ pkt_t pkt = (pkt_t) arg;
+ int ns, query, list, item;
+ zebra_item_t zitem;
+ char order[14];
+
+ ns = nad_find_scoped_namespace(pkt->nad, uri_PRIVACY, NULL);
+ query = nad_find_elem(pkt->nad, 1, ns, "query", 1);
+
+ list = nad_insert_elem(pkt->nad, query, ns, "list", NULL);
+ nad_set_attr(pkt->nad, list, -1, "name", zlist->name, 0);
+
+}
+
/** list management requests */
static mod_ret_t _privacy_in_sess(mod_instance_t mi, sess_t sess, pkt_t pkt) {
module_t mod = mi->mod;
@@ -617,11 +633,6 @@
if(nad_find_elem(pkt->nad, list, ns, "list", 0) >= 0) {
/* hack the error in */
pkt_error(pkt, stanza_err_BAD_REQUEST);
- ns = nad_find_scoped_namespace(pkt->nad, uri_CLIENT, NULL);
- query = nad_find_elem(pkt->nad, 1, ns, "error", 1);
- query = nad_find_elem(pkt->nad, query, ns, "bad-request", 1);
- ns = nad_add_namespace(pkt->nad, uri_PRIVACY ":error", NULL);
- nad_insert_elem(pkt->nad, query, ns, "too-many-lists", NULL);
pkt_sess(pkt, sess);
return mod_HANDLED;
@@ -885,12 +896,7 @@
log_debug(ZONE, "request to make list '%s' active, but there's no
such list");
/* hack the error in */
- pkt_error(pkt, stanza_err_BAD_REQUEST);
- ns = nad_find_scoped_namespace(pkt->nad, uri_CLIENT, NULL);
- query = nad_find_elem(pkt->nad, 1, ns, "error", 1);
- query = nad_find_elem(pkt->nad, query, ns, "bad-request", 1);
- ns = nad_add_namespace(pkt->nad, uri_PRIVACY ":error", NULL);
- nad_insert_elem(pkt->nad, query, ns, "no-such-list", NULL);
+ pkt_error(pkt, stanza_err_ITEM_NOT_FOUND);
pkt_sess(pkt, sess);
return mod_HANDLED;
@@ -920,12 +926,7 @@
log_debug(ZONE, "request to make list '%s' default, but there's
no such list");
/* hack the error in */
- pkt_error(pkt, stanza_err_BAD_REQUEST);
- ns = nad_find_scoped_namespace(pkt->nad, uri_CLIENT, NULL);
- query = nad_find_elem(pkt->nad, 1, ns, "error", 1);
- query = nad_find_elem(pkt->nad, query, ns, "bad-request", 1);
- ns = nad_add_namespace(pkt->nad, uri_PRIVACY ":error", NULL);
- nad_insert_elem(pkt->nad, query, ns, "no-such-list", NULL);
+ pkt_error(pkt, stanza_err_ITEM_NOT_FOUND);
pkt_sess(pkt, sess);
return mod_HANDLED;
@@ -968,11 +969,6 @@
if(list >= 0 && nad_find_elem(pkt->nad, list, ns, "list", 0) >= 0) {
/* hack the error in */
pkt_error(pkt, stanza_err_BAD_REQUEST);
- ns = nad_find_scoped_namespace(pkt->nad, uri_CLIENT, NULL);
- query = nad_find_elem(pkt->nad, 1, ns, "error", 1);
- query = nad_find_elem(pkt->nad, query, ns, "bad-request", 1);
- ns = nad_add_namespace(pkt->nad, uri_PRIVACY ":error", NULL);
- nad_insert_elem(pkt->nad, query, ns, "too-many-lists", NULL);
pkt_sess(pkt, sess);
return mod_HANDLED;
@@ -987,15 +983,12 @@
/* just do one */
if(list >= 0) {
- zlist = xhash_getx(z->lists, NAD_AVAL(pkt->nad, list), NAD_AVAL_L(pkt->nad,
list));
- if(zlist == NULL) {
+ name = nad_find_attr(pkt->nad, list, -1, "name", NULL);
+
+ zlist = xhash_getx(z->lists, NAD_AVAL(pkt->nad, name), NAD_AVAL_L(pkt->nad,
name));
+ if(zlist == NULL) {
/* hack the error in */
- pkt_error(pkt, stanza_err_BAD_REQUEST);
- ns = nad_find_scoped_namespace(pkt->nad, uri_CLIENT, NULL);
- query = nad_find_elem(pkt->nad, 1, ns, "error", 1);
- query = nad_find_elem(pkt->nad, query, ns, "bad-request", 1);
- ns = nad_add_namespace(pkt->nad, uri_PRIVACY ":error", NULL);
- nad_insert_elem(pkt->nad, query, ns, "no-such-list", NULL);
+ pkt_error(pkt, stanza_err_ITEM_NOT_FOUND);
pkt_sess(pkt, sess);
return mod_HANDLED;
@@ -1006,7 +999,7 @@
else {
/* walk the list hash and add the lists in */
- xhash_walk(z->lists, _privacy_result_builder, (void *) result);
+ xhash_walk(z->lists, _privacy_lists_result_builder, (void *) result);
}
/* tell them about current active and default list if they asked for everything */