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 */

Reply via email to