Merge branch 'master' of git://git.evergreen-ils.org/OpenSRF
authorEquinox <info@esilibrary.com>
Fri, 21 Sep 2018 15:30:01 +0000 (11:30 -0400)
committerEquinox <info@esilibrary.com>
Fri, 21 Sep 2018 15:30:01 +0000 (11:30 -0400)
src/java/org/opensrf/net/xmpp/XMPPReader.java
src/libopensrf/transport_message.c
src/libopensrf/transport_session.c
src/perl/lib/OpenSRF/Transport/SlimJabber/XMPPMessage.pm
src/perl/lib/OpenSRF/Transport/SlimJabber/XMPPReader.pm
tests/check_transport_message.c

index 406298a..cd620a6 100644 (file)
@@ -248,6 +248,14 @@ public class XMPPReader implements Runnable {
             return;
         }
 
+        if("opensrf".equals(name)) {
+            /** add a special case for the opensrf "router_from" attribute */
+            String rf = reader.getAttributeValue(null, "router_from");
+            if( rf != null )
+                msgFrom = rf;
+            return;
+        }
+
         if("body".equals(name)) {
             xmlState = XMLState.IN_BODY;
             return;
index dfe83d1..332b622 100644 (file)
@@ -120,24 +120,16 @@ transport_message* new_message_from_xml( const char* msg_xml ) {
        xmlChar* recipient      = xmlGetProp( root, BAD_CAST "to");
        xmlChar* subject        = xmlGetProp( root, BAD_CAST "subject");
        xmlChar* thread         = xmlGetProp( root, BAD_CAST "thread" );
-       xmlChar* router_from    = xmlGetProp( root, BAD_CAST "router_from" );
-       xmlChar* router_to      = xmlGetProp( root, BAD_CAST "router_to" );
-       xmlChar* router_class   = xmlGetProp( root, BAD_CAST "router_class" );
-       xmlChar* broadcast      = xmlGetProp( root, BAD_CAST "broadcast" );
-       xmlChar* osrf_xid       = xmlGetProp( root, BAD_CAST "osrf_xid" );
-
-       if( osrf_xid ) {
-               message_set_osrf_xid( new_msg, (char*) osrf_xid);
-               xmlFree(osrf_xid);
-       }
-
-       if( router_from ) {
-               new_msg->sender     = strdup((const char*)router_from);
-       } else {
-               if( sender ) {
-                       new_msg->sender = strdup((const char*)sender);
-                       xmlFree(sender);
-               }
+       xmlChar* router_from    = NULL;
+       xmlChar* router_to      = NULL;
+       xmlChar* router_class   = NULL;
+       xmlChar* router_command = NULL;
+       xmlChar* broadcast      = NULL;
+       xmlChar* osrf_xid       = NULL;
+
+       if( sender ) {
+               new_msg->sender = strdup((const char*)sender);
+               xmlFree(sender);
        }
 
        if( recipient ) {
@@ -155,29 +147,8 @@ transport_message* new_message_from_xml( const char* msg_xml ) {
                xmlFree(thread);
        }
 
-       if(router_from) {
-               new_msg->router_from = strdup((const char*)router_from);
-               xmlFree(router_from);
-       }
-
-       if(router_to) {
-               new_msg->router_to  = strdup((const char*)router_to);
-               xmlFree(router_to);
-       }
-
-       if(router_class) {
-               new_msg->router_class = strdup((const char*)router_class);
-               xmlFree(router_class);
-       }
-
-       if(broadcast) {
-               if(strcmp((const char*) broadcast,"0") )
-                       new_msg->broadcast = 1;
-               xmlFree(broadcast);
-       }
-
-       /* Within the message element, find the child nodes for "thread", "subject", and */
-       /* "body".  Extract their textual content into the corresponding members. */
+       /* Within the message element, find the child nodes for "thread", "subject" */
+       /* "body", and "opensrf".  Extract their textual content into the corresponding members. */
        xmlNodePtr search_node = root->children;
        while( search_node != NULL ) {
 
@@ -191,6 +162,53 @@ transport_message* new_message_from_xml( const char* msg_xml ) {
                                new_msg->subject = strdup( (const char*) search_node->children->content );
                }
 
+               if( ! strcmp( (const char*) search_node->name, "opensrf" ) ) {
+                       router_from    = xmlGetProp( search_node, BAD_CAST "router_from" );
+                       router_to      = xmlGetProp( search_node, BAD_CAST "router_to" );
+                       router_class   = xmlGetProp( search_node, BAD_CAST "router_class" );
+                       router_command = xmlGetProp( search_node, BAD_CAST "router_command" );
+                       broadcast      = xmlGetProp( search_node, BAD_CAST "broadcast" );
+                       osrf_xid       = xmlGetProp( search_node, BAD_CAST "osrf_xid" );
+
+                       if( osrf_xid ) {
+                               message_set_osrf_xid( new_msg, (char*) osrf_xid);
+                               xmlFree(osrf_xid);
+                       }
+
+                       if( router_from ) {
+                               if (new_msg->sender) {
+                                       // Sender value applied above.  Clear it and
+                                       // use the router value instead.
+                                       free(new_msg->sender);
+                               }
+
+                               new_msg->sender = strdup((const char*)router_from);
+                               new_msg->router_from = strdup((const char*)router_from);
+                               xmlFree(router_from);
+                       }
+
+                       if(router_to) {
+                               new_msg->router_to  = strdup((const char*)router_to);
+                               xmlFree(router_to);
+                       }
+
+                       if(router_class) {
+                               new_msg->router_class = strdup((const char*)router_class);
+                               xmlFree(router_class);
+                       }
+
+                       if(router_command) {
+                               new_msg->router_command = strdup((const char*)router_command);
+                               xmlFree(router_command);
+                       }
+
+                       if(broadcast) {
+                               if(strcmp((const char*) broadcast,"0") )
+                                       new_msg->broadcast = 1;
+                               xmlFree(broadcast);
+                       }
+               }
+
                if( ! strcmp( (const char*) search_node->name, "body" ) ) {
                        if( search_node->children && search_node->children->content )
                                new_msg->body = strdup((const char*) search_node->children->content );
@@ -317,6 +335,7 @@ int message_prepare_xml( transport_message* msg ) {
        xmlNodePtr  message_node;
        xmlNodePtr  body_node;
        xmlNodePtr  thread_node;
+       xmlNodePtr  opensrf_node;
        xmlNodePtr  subject_node;
        xmlNodePtr  error_node;
 
@@ -340,14 +359,20 @@ int message_prepare_xml( transport_message* msg ) {
        /* set from and to */
        xmlNewProp( message_node, BAD_CAST "to", BAD_CAST msg->recipient );
        xmlNewProp( message_node, BAD_CAST "from", BAD_CAST msg->sender );
-       xmlNewProp( message_node, BAD_CAST "router_from", BAD_CAST msg->router_from );
-       xmlNewProp( message_node, BAD_CAST "router_to", BAD_CAST msg->router_to );
-       xmlNewProp( message_node, BAD_CAST "router_class", BAD_CAST msg->router_class );
-       xmlNewProp( message_node, BAD_CAST "router_command", BAD_CAST msg->router_command );
-       xmlNewProp( message_node, BAD_CAST "osrf_xid", BAD_CAST msg->osrf_xid );
-
-       if( msg->broadcast )
-               xmlNewProp( message_node, BAD_CAST "broadcast", BAD_CAST "1" );
+
+       /* set from and to on a new node, also */
+       opensrf_node = xmlNewChild(message_node, NULL, (xmlChar*) "opensrf", NULL );
+       xmlNewProp( opensrf_node, BAD_CAST "router_from", BAD_CAST msg->router_from );
+       xmlNewProp( opensrf_node, BAD_CAST "router_to", BAD_CAST msg->router_to );
+       xmlNewProp( opensrf_node, BAD_CAST "router_class", BAD_CAST msg->router_class );
+       xmlNewProp( opensrf_node, BAD_CAST "router_command", BAD_CAST msg->router_command );
+       xmlNewProp( opensrf_node, BAD_CAST "osrf_xid", BAD_CAST msg->osrf_xid );
+
+       xmlAddChild(message_node, opensrf_node);
+
+       if( msg->broadcast ) {
+               xmlNewProp( opensrf_node, BAD_CAST "broadcast", BAD_CAST "1" );
+       }
 
        /* Now add nodes where appropriate */
        char* body      = msg->body;
index 4d2f7f6..7ea15d5 100644 (file)
@@ -573,20 +573,25 @@ static void startElementHandler(
                ses->state_machine->in_message = 1;
                buffer_add( ses->from_buffer, get_xml_attr( atts, "from" ) );
                buffer_add( ses->recipient_buffer, get_xml_attr( atts, "to" ) );
-               buffer_add( ses->router_from_buffer, get_xml_attr( atts, "router_from" ) );
-               buffer_add( ses->osrf_xid_buffer, get_xml_attr( atts, "osrf_xid" ) );
-               buffer_add( ses->router_to_buffer, get_xml_attr( atts, "router_to" ) );
-               buffer_add( ses->router_class_buffer, get_xml_attr( atts, "router_class" ) );
-               buffer_add( ses->router_command_buffer, get_xml_attr( atts, "router_command" ) );
-               const char* broadcast = get_xml_attr( atts, "broadcast" );
-               if( broadcast )
-                       ses->router_broadcast = atoi( broadcast );
 
                return;
        }
 
        if( ses->state_machine->in_message ) {
 
+               if( strcmp( (char*) name, "opensrf" ) == 0 ) {
+                       buffer_add( ses->router_from_buffer, get_xml_attr( atts, "router_from" ) );
+                       buffer_add( ses->osrf_xid_buffer, get_xml_attr( atts, "osrf_xid" ) );
+                       buffer_add( ses->router_to_buffer, get_xml_attr( atts, "router_to" ) );
+                       buffer_add( ses->router_class_buffer, get_xml_attr( atts, "router_class" ) );
+                       buffer_add( ses->router_command_buffer, get_xml_attr( atts, "router_command" ) );
+                       const char* broadcast = get_xml_attr( atts, "broadcast" );
+                       if( broadcast )
+                               ses->router_broadcast = atoi( broadcast );
+
+                       return;
+               }
+
                if( strcmp( (char*) name, "body" ) == 0 ) {
                        ses->state_machine->in_message_body = 1;
                        return;
index 9bd5328..0fc4124 100644 (file)
@@ -6,7 +6,8 @@ use strict; use warnings;
 use XML::LibXML;
 
 use constant JABBER_MESSAGE =>
-    "<message to='%s' from='%s' router_command='%s' router_class='%s' osrf_xid='%s'>".
+    "<message to='%s' from='%s'>".
+    "<opensrf router_command='%s' router_class='%s' osrf_xid='%s'/>".
     "<thread>%s</thread><body>%s</body></message>";
 
 sub new {
@@ -120,14 +121,18 @@ sub parse_xml {
     throw $err if $err;
 
     my $root = $doc->documentElement;
+    my $osrf_node = $root->findnodes('/message/opensrf')->shift;
 
     $self->{body} = $root->findnodes('/message/body').'';
     $self->{thread} = $root->findnodes('/message/thread').'';
-    $self->{from} = $root->getAttribute('router_from');
+
+    $self->{from} = $osrf_node->getAttribute('router_from');
     $self->{from} = $root->getAttribute('from') unless $self->{from};
+
     $self->{to} = $root->getAttribute('to');
+
     $self->{type} = $root->getAttribute('type');
-    $self->{osrf_xid} = $root->getAttribute('osrf_xid');
+    $self->{osrf_xid} = $osrf_node->getAttribute('osrf_xid');
 }
 
 
index 9e15ecd..0a84ae1 100644 (file)
@@ -306,10 +306,15 @@ sub start_element {
 
         my $msg = $self->{message};
         $msg->{to} = $attrs{'to'};
+        $msg->{from} = $attrs{from};
+        $msg->{type} = $attrs{type};
+
+    } elsif($name eq 'opensrf') {
+
+        # These will be authoritative if they exist
+        my $msg = $self->{message};
         $msg->{from} = $attrs{router_from} if $attrs{router_from};
-        $msg->{from} = $attrs{from} unless $msg->{from};
         $msg->{osrf_xid} = $attrs{'osrf_xid'};
-        $msg->{type} = $attrs{type};
 
     } elsif($name eq 'body') {
         $self->{xml_state} = IN_BODY;
index 293ba5d..4ecbfd3 100644 (file)
@@ -111,7 +111,7 @@ END_TEST
 
 START_TEST(test_transport_message_new_message_from_xml_populated)
   const char* xml_jabber_msg =
-    "<message from=\"sender\" to=\"receiver\" router_from=\"routerfrom\" router_to=\"routerto\" router_class=\"class\" broadcast=\"1\" osrf_xid=\"xid\"><thread>thread_value</thread><subject>subject_value</subject><body>body_value</body></message>";
+    "<message from=\"sender\" to=\"receiver\"><opensrf router_from=\"routerfrom\" router_to=\"routerto\" router_class=\"class\" broadcast=\"1\" osrf_xid=\"xid\"/><thread>thread_value</thread><subject>subject_value</subject><body>body_value</body></message>";
 
   transport_message *my_msg = new_message_from_xml(xml_jabber_msg);
   fail_if(my_msg == NULL, "new_message_from_xml failed to create a transport_message");
@@ -199,7 +199,8 @@ START_TEST(test_transport_message_prepare_xml)
       "message_prepare_xml should return 1 upon success");
   fail_if(a_message->msg_xml == NULL,
       "message_prepare_xml should store the returned xml in msg->msg_xml");
-  fail_unless(strcmp(a_message->msg_xml, "<message to=\"recipient\" from=\"sender\" router_from=\"routerfrom\" router_to=\"routerto\" router_class=\"routerclass\" router_command=\"routercommand\" osrf_xid=\"osrfxid\" broadcast=\"1\"><error type=\"errortype\" code=\"123\"/><thread>thread</thread><subject>subject</subject><body>body</body></message>") == 0,
+
+  fail_unless(strcmp(a_message->msg_xml, "<message to=\"recipient\" from=\"sender\"><error type=\"errortype\" code=\"123\"/><opensrf router_from=\"routerfrom\" router_to=\"routerto\" router_class=\"routerclass\" router_command=\"routercommand\" osrf_xid=\"osrfxid\" broadcast=\"1\"/><thread>thread</thread><subject>subject</subject><body>body</body></message>") == 0,
       "message_prepare_xml should store the correct xml in msg->msg_xml");
 END_TEST