[SR-Users] pua_xmpp questions

Daniel-Constantin Mierla miconda at gmail.com
Tue Aug 9 16:34:28 CEST 2011


Hi Laura,

thanks for the patches. I will apply them. Can you attach the patches as 
files instead of pasting them inline, so I can just download them from 
email and apply? The mail client breaks the withe-spacing and will take 
me some time to align them.

Cheers,
Daniel

On 8/8/11 6:00 PM, laura testi wrote:
> Thank you very much for your reply.
>
> Finally we have successfully configure the xmpp gateway to work (both
> presence and IM) with another kamailio server which provide SIP
> REGISTRAR/PROXY/PRESENCE (with integrated xcap function).
>
> The key points are to put the server address parameter of presence and
> pua_xmpp module to the gateway itself instead of the main Presence
> Server of the SIP/SIMPLE domains. But the outbound_proxy of the xmpp
> module must point to the main PROXY server of the SIP/SIMPLE domains.
> The outbound_proxy of pua is not specify, so it point itself.
>
> following are this part of the configuration:
> modparam("xmpp", "outbound_proxy", "<main_proxy_uri>")
> modparam("presence", "server_address", "sip:10.10.5.210:5060")
> modparam("pua_xmpp", "server_address", "sip:10.10.5.210:5060")
>
> Now it works fine withe some bugs:
> - xmpp add sip contact: ok
> - sip add xmpp contact: ok
> - xmpp see the sip contact presence: ok
> - sip see the xmpp contact presence: ok
> - sip IM to xmpp: ok
> - xmpp IM to sip: ok
>
> the bugs we found are following:
> - the online/offline status is ok in both direction (SIP<-->  XMPP)
> - other status (away/busy) is not ok from XMPP to SIP
> - busy status is not ok from SIP to XMPP
> - each time XMPP contact change the status, triger a new SUBSCRIBE in xmpp
>    gateway which generate multiple same subscriptions with different callid
>    in both active_watchers and pua tables. This also makes multiple
> multiple NOTIFY
>    generation from the main Presence Server to GW when the SIP contact change
>    it's status
>
> We have make the following patches in the pua_xmpp module that fix the
> above bugs. Hope it can help.
> -------------------------------------------------------------------------------------------------------------------------
> # diff -u simple2xmpp.c.orig simple2xmpp.c
> --- simple2xmpp.c.orig  2011-08-05 16:11:55.000000000 +0200
> +++ simple2xmpp.c       2011-08-08 14:57:25.000000000 +0200
> @@ -87,7 +87,7 @@
>          if(msg->to->parsed != NULL)
>          {
>                  pto = (struct to_body*)msg->to->parsed;
> -               LM_ERR("'To' header ALREADY
> PARSED:<%.*s>\n",pto->uri.len,pto->uri.s);
> +               LM_DBG("'To' header ALREADY
> PARSED:<%.*s>\n",pto->uri.len,pto->uri.s);
>          }
>          else
>          {
> @@ -415,7 +415,8 @@
>                  goto error;
>          }
>
> -       if(xmlStrcasecmp((unsigned char*)note, (unsigned char*)"away")== 0)
> +       if((xmlStrcasecmp((unsigned char*)note, (unsigned char*)"away")== 0)||
> +                       (xmlStrcasecmp((unsigned char*)note, (unsigned
> char*)"On the phone")== 0))
>          {
>                  new_node = xmlNewChild(xmpp_root, NULL, BAD_CAST "show",
>                                  BAD_CAST "away");
> @@ -456,12 +457,14 @@
>                                          LM_ERR("while adding node: idle\n");
>                                          goto error;
>                                  }
> -                       }
> -                       else */
> +                       }*/
> +                       else
>                                  if((xmlStrcasecmp((unsigned char*)note,
>                                          (unsigned char*)"dnd")== 0)||
>                                          (xmlStrcasecmp((unsigned char*)note,
> -                                               (unsigned char*)"do
> not disturb")== 0))
> +                                               (unsigned char*)"do
> not disturb")== 0)||
> +                                       (xmlStrcasecmp((unsigned char*)note,
> +                                       (unsigned char*)"Busy (DND)")== 0))
>                                  {
>                                          new_node =
> xmlNewChild(xmpp_root, NULL, BAD_CAST "show",
>                                                          BAD_CAST "dnd");
> @@ -471,6 +474,8 @@
>                                                  goto error;
>                                          }
>                                  }
> +                               else
> +                                       LM_DBG("Not Found Status\n");
>
>
>          /* adding status node */
>
>
>
> -------------------------------------------------------------------------------------------------------------------------
> # diff -u xmpp2simple.c.orig xmpp2simple.c
> --- xmpp2simple.c.orig  2011-08-05 12:37:48.000000000 +0200
> +++ xmpp2simple.c       2011-08-08 15:51:56.000000000 +0200
> @@ -76,13 +76,13 @@
>          {
>                  LM_DBG("type attribut not present\n");
>                  build_publish(pres_node, -1);
> -               if(presence_subscribe(pres_node, 3600, XMPP_SUBSCRIBE)<  0)
> +       /*      if(presence_subscribe(pres_node, 3600, XMPP_SUBSCRIBE)<  0)
>                  {
>                                  LM_ERR("when sending subscribe for presence");
>                                  xmlFree(pres_type);
>                                  goto error;
>                  }
> -
> +       */
>
>                  /* send subscribe after publish because in xmpp
> subscribe message
>                   * comes only when a new contact is inserted in buddy list */
> @@ -161,6 +161,8 @@
>          char* type= NULL;
>          char* status= NULL;
>
> +
> +
>          LM_DBG("start\n");
>
>          entity=(char*)pkg_malloc(7+ strlen(uri)*sizeof(char));
> @@ -243,13 +245,13 @@
>          if(show_cont)
>          {
>                  if(strcmp(show_cont, "xa")== 0)
> -                       status= "not available";
> +                       status= "Away";
>                  else
>                          if(strcmp(show_cont, "chat")== 0)
> -                               status= "free for chat";
> +                       status= "Online";
>                  else
>                          if(strcmp(show_cont, "dnd")== 0)
> -                               status= "do not disturb";
> +                       status= "Busy (DND)";
>                  else
>                          status= show_cont;
>          }
> @@ -264,8 +266,8 @@
>                          goto error;
>                  }
>                  */
> -               node = xmlNewChild(root_node, NULL, BAD_CAST "note",
> -                               BAD_CAST status_cont);
> +               node = xmlNewChild(tuple_node, NULL, BAD_CAST "note",
> +                               BAD_CAST status);
>                  if(node== NULL)
>                  {
>                          LM_ERR("while adding node\n");
> @@ -273,8 +275,8 @@
>                  }
>          }else
>                  if(show_cont)
> -               {
> -                       node = xmlNewChild(root_node, NULL, BAD_CAST "note",
> +               {
> +                       node = xmlNewChild(tuple_node, NULL, BAD_CAST "note",
>                                          BAD_CAST status);
>                          if(node== NULL)
>                          {
> @@ -295,23 +297,6 @@
>                                  goto error;
>                          }
>                  }
> -               node=  xmlNewChild(person_node, NULL, BAD_CAST "activities",
> -                               BAD_CAST 0);
> -               if(node== NULL)
> -               {
> -                       LM_ERR("while adding node\n");
> -                       goto error;
> -               }
> -
> -
> -               if( xmlNewChild(person_node, NULL, BAD_CAST "note",
> -                                       BAD_CAST status )== NULL)
> -               {
> -                       LM_ERR("while adding node\n");
> -                       goto error;
> -               }
> -
> -
>          }
>
>
>
>
>
>
>
>
>
>
>
>
> On Mon, Aug 1, 2011 at 12:10 PM, Daniel-Constantin Mierla
> <miconda at gmail.com>  wrote:
>> Hello,
>>
>> On 7/29/11 10:32 AM, laura testi wrote:
>>> Hi all,
>>> we are trying to setup a kamailio presence server in SIP/SIMPLE domain
>>> to interwork with XMPP domains including the GTalk (see the config
>>> below). The architecture is like this:
>>> - SIP/SIMPLE server: kamailio3.14 with full configuration with XCAP
>>> integration
>>> - XMPP Gateway: another kamailio server + ejabberd server
>>>      - component mode
>>>      - xmpp moduleL: outbound proxy to the Kamailio SIP/SIMPLE server
>>>      - pua_xmpp: no outbound proxy?
>>> - XMPP server: ejabberd
>>>
>>> The users from XMPP domain can add the SIP account and see the
>>> presence of the SIP users, but not vice versa. The chat from both
>>> directions works fine.
>>>
>>> in the Presence Server, we have configured the kamailio with XCAP
>>> integration. We have the following doubts:
>>> - does pua_xmpp/pua modules need the xcap integration for the presence
>>> integration with xmpp domains?
>> no, there is no requirement of xcap for sip-xmpp presence gatewaying.
>>>    because to use xcap for presence authorization rules, it needs the
>>> sip clients support the xcap
>>> - does pua_xmpp/pua support xcap? otherwise how to works?
>> This mechanism of auth rules in SIP is not compatible with XMPP, afaik. In
>> xmpp they have in-band (using XMPP) transfer of the buddy list, unlike in
>> SIMPLE where is XCAP over HTTP -- it is more like end-to-end presence model
>> from early sip specifications.
>>
>>
>>> - in case of multiple SIP/SIMPLE presence server, how we can configure
>>> the server_address of
>>>    pua_xmpp and presence parameter in xmpp gw?
>> Either use many instances or, as workaround, somehow route the traffic to
>> itself or other instance in order to re-write some headers.
>>
>> Cheers,
>> Daniel
>>
>>
>>> Can you help us to clarify the doubts please?
>>>
>>> Many thanks in advanced!
>>>
>>> Best Regards,
>>> Laura
>>>
>>>
>>> PS: following are the main configuration of the xmpp GW:
>>>
>>> ---------------------------------------------------------------------------------------------
>>> ...
>>> modparam("xmpp", "domain_separator", "*")
>>> modparam("xmpp", "backend", "component")
>>> modparam("xmpp", "gateway_domain", "<mygwdomain>")
>>> modparam("xmpp", "xmpp_domain", "<mygwdomain>")
>>> modparam("xmpp", "xmpp_host", "127.0.0.1")
>>> modparam("xmpp", "xmpp_password", "secret")
>>> modparam("xmpp", "outbound_proxy", "<my oubound proxy uri>")
>>> modparam("pua", "outbound_proxy", "<my outbound proxy uri>")
>>> modparam("pua", "update_period", 60)
>>> modparam("pua", "default_expires", 1200)
>>> modparam("presence", "server_address", "<my presence server uri>")
>>> modparam("pua_xmpp", "server_address", "<my presence server uri>")
>>>
>>>
>>>
>>> route{
>>>    route(REQINIT);
>>>    t_check_trans();
>>>
>>>   if (uri =~ "sip:.+ at .*<myxmppdomain>") {
>>>      route(PRESENCE);
>>>      if ($rU==$null)
>>>      {
>>>        # request with no Username in RURI
>>>        sl_send_reply("484","Address Incomplete");
>>>        exit;
>>>      }
>>>      route(CHAT);
>>>    }
>>>
>>>   xlog("L_INFO", "*** xmpp: unhandled message type\n");
>>>   t_reply("503", "Service unavailable");
>>>   return;
>>>
>>> }
>>>
>>> ...
>>>
>>> route[CHAT] {
>>>         if(!is_method("MESSAGE"))
>>>              return;
>>>
>>>         if (!t_newtran()) {
>>>            sl_reply_error();
>>>            exit;
>>>         }
>>>
>>>         xlog("L_INFO", "*** xmpp-handled MESSAGE message.");
>>>         if ($cT=~"^text/plain") {
>>>                 if (xmpp_send_message()) {
>>>                   t_reply("200", "Accepted");
>>>                 } else {
>>>                   t_reply("404", "Not found");
>>>                 }
>>>         } else {
>>>                 xlog("L_INFO", "*** xmpp-handled MESSAGE, ignoring not text
>>> messages");
>>>                 t_reply("200", "Accepted");
>>>         }
>>>
>>>         t_release();
>>>         exit;
>>> }
>>>
>>> route[PRESENCE] {
>>>    if(!is_method("PUBLISH|SUBSCRIBE|NOTIFY"))
>>>      return;
>>>
>>>    # create new transaction to catch retransmissions
>>>    if (!t_newtran())
>>>    {
>>>      sl_reply_error();
>>>      exit;
>>>    }
>>>
>>>    if( is_method("NOTIFY"))
>>>    {
>>>      xlog("L_INFO", "*** xmpp-handled NOTIFY message.");
>>>                 if(pua_xmpp_notify())
>>>                         t_reply("200", "OK");
>>>                 t_release();
>>>                 exit;
>>>    } else if( is_method("SUBSCRIBE"))
>>>         {
>>>                 xlog("L_INFO", "*** xmpp-handled SUBSCRIBE message.\n");
>>>                 handle_subscribe();
>>>                 if($(hdr(Event))== "presence")
>>>                 {
>>>                         pua_xmpp_req_winfo("$ruri", "$hdr(Expires)");
>>>                 }
>>>                 t_release();
>>>                 exit;
>>>   } else if(is_method("PUBLISH"))
>>>   {
>>>      handle_publish();
>>>      t_release();
>>>      exit;
>>>   }
>>> }
>>>
>>> ...
>>>
>>> _______________________________________________
>>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
>>> sr-users at lists.sip-router.org
>>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>> --
>> Daniel-Constantin Mierla -- http://www.asipto.com
>> Kamailio Advanced Training, Oct 10-13, Berlin: http://asipto.com/u/kat
>> http://linkedin.com/in/miconda -- http://twitter.com/miconda
>>
>>
> _______________________________________________
> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
> sr-users at lists.sip-router.org
> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users

-- 
Daniel-Constantin Mierla -- http://www.asipto.com
Kamailio Advanced Training, Oct 10-13, Berlin: http://asipto.com/u/kat
http://linkedin.com/in/miconda -- http://twitter.com/miconda




More information about the sr-users mailing list