Hello,
there were several emails related to usage of embedded xcap server module, so I am pasting here relevant snippets from config file that should get people started.
Cheers, Daniel
#!define WITH_XHTTP #!define WITH_XCAPSRV
tcp_accept_no_cl=yes tcp_rd_buf_size=65536 pv_buffer_size=65536 sql_buffer_size=65536
#!define XHTTP_PORT 8080 #!define XHTTPS_PORT 8443
#!ifdef WITH_XHTTP loadmodule "xhttp.so" #!endif
#!ifdef WITH_XCAPSRV loadmodule "xcap_server.so" #!endif
#!ifdef WITH_XCAPSRV # ----- xcap_server params ----- modparam("xcap_server", "db_url", DBURL) modparam("xcap_server", "buf_size", 65536) #!endif
...
#!ifdef WITH_XHTTP event_route[xhttp:request] { xdbg("===== xhttp: request [$rv] $rm => $hu\n");
set_reply_no_connect();
if ($Rp != XHTTP_PORT #!ifdef WITH_TLS && $Rp != XHTTPS_PORT #!endif ) { set_reply_close(); xlog("L_WARN", "HTTP request received on $Rp\n"); xhttp_reply("403", "Forbidden", "", ""); exit; }
if (!www_authorize("mydomain.com", "subscriber")) { www_challenge("mydomain.com", "0"); exit; } set_reply_close();
route(XCAPSRV);
# other http access xhttp_reply("200", "ok", "text/html", "<html><body>OK: $si:$sp</body></html>"); exit; } #!endif
route[XCAPSRV] { #!ifdef WITH_XCAPSRV if(! ($hu=~"^/xcap-root/")) { return; } # xcap ops - break down http uri to get xcap user id route(XCAPURI); $xcapuri(u=>data) = $var(hu);
if($xcapuri(u=>uri)==$null) { xlog("==== xhttp failed uri => [$hu] ~ [$var(hu)]\n"); xhttp_reply("404", "Not Found", "text/html", "unsupported xcap uri"); exit; }
if($xcapuri(u=>xuid)=~"^sip:.+@.+") $var(uri) = $xcapuri(u=>xuid); else $var(uri) = "sip:"+ $xcapuri(u=>xuid) + "@" + $Ri;
# handle XCAP capability request 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> " + #!ifdef WITH_RLS " <auid>rls-services</auid> " + #!endif " <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> " + #!ifdef WITH_RLS " <namespace>urn:ietf:params:xml:ns:rls-services</namespace> " + #!endif " <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 ($rm!="GET" && $au!=$(var(uri){uri.user})) { xlog("==== xhttp forbidden => [$au] != [$(var(uri){uri.user})]\n"); xhttp_reply("403", "Forbidden", "text/html", "operation not allowed"); exit; }
xdbg("SCRIPT: xcap service $xcapuri(u=>auid) for $xcapuri(u=>xuid)\n"); switch($rm) { case "PUT": xcaps_put("$var(uri)", "$var(hu)", "$rb"); if($xcapuri(u=>auid)=~"pres-rules") { pres_update_watchers("$var(uri)", "presence"); pres_refresh_watchers("$var(uri)", "presence", 1); #!ifdef WITH_RLS } else if($xcapuri(u=>auid)=~"rls-services" || $xcapuri(u=>auid)=~"resource-lists") { rls_update_subs("$var(uri)", "presence"); #!endif } 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": $var(furi) = "sip:" + $au + "@" + $ar; if ($au!=$(var(uri){uri.user})) { # be sure only auth user gets its non-profile documents if (!($xcapuri(u=>auid)=~"user-profile" || $xcapuri(u=>auid)=~"pres-content")) { xhttp_reply("403", "Forbidden", "", ""); exit; } else { # be sure only permitted user gets others profile documents pres_auth_status("$var(furi)", "$var(uri)"); $var(rc) = $rc; if ($var(rc) != 1) { xhttp_reply("403", "Forbidden", "", ""); exit; } } } xcaps_get("$var(uri)", "$var(hu)"); exit; break; case "DELETE": xcaps_del("$var(uri)", "$var(hu)"); if($xcapuri(u=>auid)=~"pres-rules") { pres_update_watchers("$var(uri)", "presence"); pres_refresh_watchers("$var(uri)", "presence", 1); #!ifdef WITH_RLS } else if($xcapuri(u=>auid)=~"rls-services" || $xcapuri(u=>auid)=~"resource-lists") { rls_update_subs("$var(uri)", "presence"); #!endif } 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; } #!endif return; }
# Return fixed XCAP URI in $var(hu) route[XCAPURI] { #!ifdef WITH_XCAPSRV # Jitsi... if ($hu=~"^/xcap-root/resource-lists/users/.*/index$") { $var(hu) = $(hu{re.subst,!(^/xcap-root/resource-lists/users/.*/).*$!\1generallist.xml!}); } else if ($hu=~"^/xcap-root/pres-rules/users/.*/presrules$") { $var(hu) = $(hu{re.subst,!(^/xcap-root/)pres-rules(/users/.*/)presrules!\1org.openmobilealliance.pres-rules\2pres-rules!}); } else if ($hu=~"^/xcap-root/oma_status-icon/users/.*/.*$") { $var(hu) = $(hu{re.subst,!(^/xcap-root/)oma_status-icon(/users/.*/).*$!\1org.openmobilealliance.pres-content\2oma_status-icon/icon_document!});
# Bria... } else if ($hu=~"^/xcap-root/resource-lists/users/.*/contacts-resource-list.xml$") { $var(hu) = $(hu{re.subst,!(^/xcap-root/resource-lists/users/.*/).*$!\1generallist.xml!}); } else if ($hu=~"^/xcap-root/resource-lists/users/.*/resource-list.xml$") { $var(doc_uri) = $(hu{re.subst,!(^/xcap-root/resource-lists/users/.*/).*$!\1generallist.xml!});
# No modification required... } else { $var(hu) = $hu; } #!endif return; }