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

--- jabberd-2.0s1/sm/mod_privacy.c      Thu Dec 11 18:47:22 2003
+++ jabberd-2.0s1-dev/sm/mod_privacy.c  Sat Jan 17 14:14:58 2004
@@ -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;
@@ -1005,8 +998,9 @@
     }

     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 */
@@ -1056,3 +1050,5 @@


     return 0;
 }
+
+

_______________________________________________
jdev mailing list
[EMAIL PROTECTED]
http://mailman.jabber.org/listinfo/jdev

Reply via email to