I am trying to set up XCAP support for SIP SIMPLE, and using jitsi as the sample client. The kamailio database was previously configured using ODBC and kamailio-4.1.3 and was apparently working correctly. I was following the guide at http://nil.uniza.sk/instant-messaging/simple/configuring-xcap-support-im-and-presence-over-kamailio-31-debian-lenny as well as the standard documentation at http://kamailio.org/docs/modules/4.1.x/modules/xcap_server.html . However, the rls support is currently disabled. When I use jitsi to connect, and add one contact to the empty contact list, I see the database being populated (mysql backend):

mysql> select * from xcap;
+----+-------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------+-----------------------+--------+-----------------------------------------------------------------------+------+
| id | username    | domain          | doc | doc_type | etag                  | 
source | doc_uri | port |
+----+-------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------+-----------------------+--------+-----------------------------------------------------------------------+------+
| 3 | avillacisIM | pbx.elastix.com | <?xml version="1.0" encoding="UTF-8" standalone="no"?><resource-lists xmlns="urn:ietf:params:xml:ns:resource-lists"><list name="RootGroup"><entry uri="sip:bmac...@pbx.elastix.com"><display-name>bmacias</display-name></entry></list></resource-lists> | 4 | sr-1401316328-31413-1 | 0 | /xcap-root/resource-lists/users/sip:avillaci...@pbx.elastix.com/index | 0 | | 4 | avillacisIM | pbx.elastix.com | <?xml version="1.0" encoding="UTF-8" standalone="no"?><ruleset xmlns="urn:ietf:params:xml:ns:common-policy"><rule id="presence_allow"><conditions><identity><one id="sip:bmac...@pbx.elastix.com"/></identity></conditions><actions><sub-handling xmlns="urn:ietf:params:xml:ns:pres-rules">allow</sub-handling></actions><transformations><provide-devices xmlns="urn:ietf:params:xml:ns:pres-rules"><all-devices/></provide-devices><provide-persons xmlns="urn:ietf:params:xml:ns:pres-rules"><all-persons/></provide-persons><provide-services xmlns="urn:ietf:params:xml:ns:pres-rules"><all-services/></provide-services></transformations></rule></ruleset> | 2 | sr-1401316328-31416-1 | 0 | /xcap-root/pres-rules/users/sip:avillaci...@pbx.elastix.com/presrules | 0 |
+----+-------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------+-----------------------+--------+-----------------------------------------------------------------------+------+
2 rows in set (0.00 sec)

As far as I can see, both XML documents are well formed.

However, if I shutdown and then restart jitsi, I see (with wireshark) that the 
server returned a 500 Server Error when trying to fetch resource-lists . At the 
same time, the following appears on the log:

May 28 17:39:12 elx /usr/sbin/kamailio[31421]: ALERT: <script>: ===== xhttp: 
request [HTTP/1.1] GET => /xcap-root/xcap-caps/global/index
May 28 17:39:12 elx /usr/sbin/kamailio[31421]: ALERT: <script>: ===== xhttp: 
request [HTTP/1.1] GET => /xcap-root/xcap-caps/global/index
May 28 17:39:12 elx /usr/sbin/kamailio[31421]: ALERT: <script>: ===== xhttp: 
xcap-caps : <null>
May 28 17:39:12 elx /usr/sbin/kamailio[31413]: ALERT: <script>: ===== xhttp: 
request [HTTP/1.1] GET => 
/xcap-root/resource-lists/users/sip:avillaci...@pbx.elastix.com/index
May 28 17:39:12 elx /usr/sbin/kamailio[31413]: ALERT: <script>: ===== xhttp: 
request [HTTP/1.1] GET => 
/xcap-root/resource-lists/users/sip:avillaci...@pbx.elastix.com/index
May 28 17:39:12 elx /usr/sbin/kamailio[31413]: ALERT: <script>: ===== xhttp: 
resource-lists : sip:avillaci...@pbx.elastix.com
May 28 17:39:12 elx /usr/sbin/kamailio[31413]: ERROR: xcap_server 
[xcap_server.c:758]: xcaps_get_db_doc(): invalid xml doc retrieved from database
May 28 17:39:12 elx /usr/sbin/kamailio[31413]: ERROR: xcap_server 
[xcap_server.c:1171]: w_xcaps_get(): could not fetch xcap document

What can I do to solve this issue. This is preventing contacts from being 
retrieved or added once the first contact is stored.

My event-route looks like this (WITH_XCAPSRV is defined elsewhere in the 
configuration):

#!ifdef WITH_XHTTP
event_route[xhttp:request] {
#!ifdef WITH_XHTTP_RPC
       $var(xhttp_rpc_root) = $(hu{s.substr,0,9});
       if ($var(xhttp_rpc_root) == "/http_rpc") {
               dispatch_xhttp_rpc();
       }
#!endif
#!ifdef WITH_XHTTP_PI
       $var(xhttp_rpc_root) = $(hu{s.substr,0,8});
       if ($var(xhttp_rpc_root) == "/http_pi") {
               dispatch_xhttp_pi();
       }
#!endif
#!ifdef WITH_XCAPSRV
    if ($hu =~ "^/xcap-root/") {
        route(XCAPSRV);
    }
#!endif

        set_reply_close();
        set_reply_no_connect();

#        if ($Rp != 80
##!ifdef WITH_TLS
#            && $Rp != 443
##!endif
#        ) {
#
#                xlog("L_WARN", "HTTP request received on $Rp\n");
#                xhttp_reply("403", "Forbidden", "text/html", "Forbidden");
#                exit;
#        }

        xlog("L_DBG", "HTTP Request Received\n");

        if ($hdr(Upgrade)=~"websocket"
                        && $hdr(Connection)=~"Upgrade"
                        && $rm=~"GET") {

                # Validate Host - make sure the client is using the correct
                # alias for WebSockets
                if ($hdr(Host) == $null || !is_myself("sip:" + $hdr(Host))) {
                        xlog("L_WARN", "Bad host $hdr(Host)\n");
                        xhttp_reply("403", "Forbidden", "", "");
                        exit;
                }

                # Optional... validate Origin - make sure the client is from an
                # authorised website.  For example,
                #
                # if ($hdr(Origin) != "http://communicator.MY_DOMAIN";
                #     && $hdr(Origin) != "https://communicator.MY_DOMAIN";) {
                #       xlog("L_WARN", "Unauthorised client $hdr(Origin)\n");
                #       xhttp_reply("403", "Forbidden", "", "");
                #       exit;
                # }

                # Optional... perform HTTP authentication

                # ws_handle_handshake() exits (no further configuration file
                # processing of the request) when complete.
                if (ws_handle_handshake())
        {
            # Optional... cache some information about the
            # successful connection
            exit;
        }
        }



       xhttp_reply("200", "OK", "text/html",
               "<html><body>Wrong URL $hu</body></html>");
}
#!endif

#!ifdef WITH_XCAPSRV
route[XCAPSRV] {
    xlog("L_ALERT", "===== xhttp: request [$rv] $rm => $hu\n");

    # Remove port specification from Host header and use as authentication 
domain
    $var(http_domain) = $(hdr(Host){s.select,0,:});
    if (!www_authorize("$var(http_domain)", "subscriber")) {
        www_challenge("$var(http_domain)", "0");
        exit;
    }

    set_reply_close();
    set_reply_no_connect();

    if ($hu=~"^/xcap-root/oma_status-icon/users/.*/.*$")
        $var(doc_uri) = 
$(hu{re.subst,/(^\/xcap-root\/)oma_status-icon(\/users\/.*\/).*$/\1org.openmobilealliance.pres-content\2oma_status-icon\/preseImage/});
    else
        $var(doc_uri) = $hu;

    # xcap ops
    $xcapuri(u=>data) = $var(doc_uri);
    if($xcapuri(u=>xuid)=~"^sip:.+@.+")
        $var(uri) = $xcapuri(u=>xuid);
    else if($xcapuri(u=>xuid)=~".+@.+")
        $var(uri) = "sip:" + $xcapuri(u=>xuid);
    else
        $var(uri) = "sip:"+ $xcapuri(u=>xuid) + "@" + $Ri;
    xlog("L_ALERT", "===== xhttp: $xcapuri(u=>auid) : $xcapuri(u=>xuid)\n");

    if ($xcapuri(u=>auid) == "xcap-caps") {
        if ($rm == "GET") {
            $var(xbody) =
"<?xml version='1.0' encoding='UTF-8'?>
<xcap-caps xmlns='urn:ietf:params:xml:ns:xcap-caps'>
    <auids>
        <auid>rls-services</auid>
        <auid>pidf-manipulation</auid>
        <auid>xcap-caps</auid>
        <auid>resource-lists</auid>
        <auid>pres-rules</auid>
        <auid>org.openmobilealliance.pres-rules</auid>
        <auid>org.openmobilealliance.user-profile</auid>
        <auid>org.openmobilealliance.pres-content</auid>
        <auid>org.openmobilealliance.search</auid>
<auid>org.openmobilealliance.xcap-directory</auid>
    </auids>
    <extensions></extensions>
    <namespaces>
<namespace>urn:ietf:params:xml:ns:rls-services</namespace>
<namespace>urn:ietf:params:xml:ns:pidf</namespace>
<namespace>urn:ietf:params:xml:ns:xcap-caps</namespace>
<namespace>urn:ietf:params:xml:ns:resource-lists</namespace>
<namespace>urn:ietf:params:xml:ns:pres-rules</namespace>
<namespace>urn:oma:xml:xdm:user-profile</namespace>
<namespace>urn:oma:xml:prs:pres-content</namespace>
        <namespace>urn:oma:xml:xdm:search</namespace>
<namespace>urn:oma:xml:xdm:xcap-directory</namespace>
    </namespaces>
</xcap-caps>";
            xhttp_reply("200", "OK", "application/xcap-caps+xml", 
"$var(xbody)");
        } else {
            append_to_reply("Allow: GET\r\n");
            xhttp_reply("405", "Method Not Allowed", "", "");
        }
        exit;
    }

    # be sure auth user access only its documents
    if ($au != $(var(uri){uri.user})) {
        xhttp_reply("403", "Forbidden", "text/html", 
"<html><body>$si:$sp</body></html>");
        exit;
    }

    switch($rm) {
    case "PUT":
        xcaps_put("$var(uri)", "$var(doc_uri)", "$rb");
        if ($xcapuri(u=>auid) =~ "pres-rules") {
            pres_update_watchers("$var(uri)", "presence");
            pres_refresh_watchers("$var(uri)", "presence", 1);
#        } else if ($xcapuri(u=>auid) =~ "rls-services" || $xcapuri(u=>auid) =~ 
"resource-lists") {
#            rls_update_subs("$var(uri)", "presence");
        } else if ($xcapuri(u=>auid) =~ "pidf-manipulation") {
            pres_refresh_watchers("$var(uri)", "presence", 2, "$xcapuri(u=>uri_adoc)", 
"$xcapuri(u=>file)");
        }
        exit;
        break;
    case "GET":
        xcaps_get("$var(uri)", "$var(doc_uri)");
        exit;
        break;
    case "DELETE":
        xcaps_del("$var(uri)", "$var(doc_uri)");
        if ($xcapuri(u=>auid) =~ "pres-rules") {
            pres_update_watchers("$var(uri)", "presence");
            pres_refresh_watchers("$var(uri)", "presence", 1);
#        } else if ($xcapuri(u=>auid) =~ "rls-services" || $xcapuri(u=>auid) =~ 
"resource-lists") {
#            rls_update_subs("$var(uri)", "presence");
        } else if ($xcapuri(u=>auid) =~ "pidf-manipulation") {
            pres_refresh_watchers("$var(uri)", "presence", 2, "$xcapuri(u=>uri_adoc)", 
"$xcapuri(u=>file)");
        }
        exit;
        break;
    case "POST":
        if ($xcapuri(u=>auid) =~ "search") {
            xhttp_reply("501", "Not Implemented", "", "");
        } else {
            if ($xcapuri(u=>auid) =~ "xcap-directory") {
                append_to_reply("Allow: GET\r\n");
            } else {
                append_to_reply("Allow: DELETE, GET, PUT\r\n");
            }
            xhttp_reply("405", "Method Not Allowed", "", "");
        }
        exit;
        break;
    }

    # other http requests
    xhttp_reply("404", "Not Found", "", "");
    exit;
}
#!endif


_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
sr-users@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users

Reply via email to