<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri","sans-serif";
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri","sans-serif";}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Hello Kamailio Community,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am struggle to make presence service work on my system.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Currently I have PUA list, RLS Watchers List and RLS Presentity List empty.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">What should I do to see anything there?<o:p></o:p></p>
<p class="MsoNormal">I am using Media5-RCS android app and Orange Labs’ Android RCS IMS stack as my client.<o:p></o:p></p>
<p class="MsoNormal"><br>
Basically I want to use Kamailio as an RCS server<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This is my configuration file:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!KAMAILIO<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef ACCDB_COMMENT<o:p></o:p></p>
<p class="MsoNormal">ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';<o:p></o:p></p>
<p class="MsoNormal">ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';<o:p></o:p></p>
<p class="MsoNormal">ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';<o:p></o:p></p>
<p class="MsoNormal">ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';<o:p></o:p></p>
<p class="MsoNormal">ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';<o:p></o:p></p>
<p class="MsoNormal">ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL<o:p></o:p></p>
<p class="MsoNormal">DEFAULT '';<o:p></o:p></p>
<p class="MsoNormal">ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL<o:p></o:p></p>
<p class="MsoNormal">DEFAULT '';<o:p></o:p></p>
<p class="MsoNormal">ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL<o:p></o:p></p>
<p class="MsoNormal">DEFAULT '';<o:p></o:p></p>
<p class="MsoNormal">ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL<o:p></o:p></p>
<p class="MsoNormal">DEFAULT '';<o:p></o:p></p>
<p class="MsoNormal">ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL<o:p></o:p></p>
<p class="MsoNormal">DEFAULT '';<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">####### Defined Values #########<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!define WITH_DEBUG<o:p></o:p></p>
<p class="MsoNormal">#!define WITH_AUTH<o:p></o:p></p>
<p class="MsoNormal">#!define WITH_MYSQL<o:p></o:p></p>
<p class="MsoNormal">#!define WITH_USRLOCDB<o:p></o:p></p>
<p class="MsoNormal">#!define WITH_PRESENCE<o:p></o:p></p>
<p class="MsoNormal">#!define WITH_XCAPSRV<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># *** Value defines - IDs used later in config<o:p></o:p></p>
<p class="MsoNormal">#!ifdef WITH_MYSQL<o:p></o:p></p>
<p class="MsoNormal"># - database URL - used to connect to database server by modules such<o:p></o:p></p>
<p class="MsoNormal"># as: auth_db, acc, usrloc, a.s.o.<o:p></o:p></p>
<p class="MsoNormal">#!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal">#!ifdef WITH_MULTIDOMAIN<o:p></o:p></p>
<p class="MsoNormal"># - the value for 'use_domain' parameters<o:p></o:p></p>
<p class="MsoNormal">#!define MULTIDOMAIN 1<o:p></o:p></p>
<p class="MsoNormal">#!else<o:p></o:p></p>
<p class="MsoNormal">#!define MULTIDOMAIN 0<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># - flags<o:p></o:p></p>
<p class="MsoNormal"># FLT_ - per transaction (message) flags<o:p></o:p></p>
<p class="MsoNormal"># FLB_ - per branch flags<o:p></o:p></p>
<p class="MsoNormal">#!define FLT_ACC 1<o:p></o:p></p>
<p class="MsoNormal">#!define FLT_ACCMISSED 2<o:p></o:p></p>
<p class="MsoNormal">#!define FLT_ACCFAILED 3<o:p></o:p></p>
<p class="MsoNormal">#!define FLT_NATS 5<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!define FLB_NATB 6<o:p></o:p></p>
<p class="MsoNormal">#!define FLB_NATSIPPING 7:5060"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">####### Global Parameters #########<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_DEBUG<o:p></o:p></p>
<p class="MsoNormal">debug=4<o:p></o:p></p>
<p class="MsoNormal">log_stderror=yes<o:p></o:p></p>
<p class="MsoNormal">#!else<o:p></o:p></p>
<p class="MsoNormal">debug=2<o:p></o:p></p>
<p class="MsoNormal">log_stderror=no<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">memdbg=5<o:p></o:p></p>
<p class="MsoNormal">memlog=5<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">log_facility=LOG_LOCAL0<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">fork=yes<o:p></o:p></p>
<p class="MsoNormal">children=4<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">/* uncomment the next line to disable TCP (default on) */<o:p></o:p></p>
<p class="MsoNormal">#disable_tcp=yes<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">/* uncomment the next line to disable the auto discovery of local aliases<o:p></o:p></p>
<p class="MsoNormal">based on reverse DNS on IPs (default on) */<o:p></o:p></p>
<p class="MsoNormal">#auto_aliases=no<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">/* add local domain aliases */<o:p></o:p></p>
<p class="MsoNormal">alias="192.168.1.120"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">/* uncomment and configure the following line if you want Kamailio to<o:p></o:p></p>
<p class="MsoNormal">bind on a specific interface/port/proto (default bind on all available) */<o:p></o:p></p>
<p class="MsoNormal">#listen=udp:10.0.0.10:5060<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">/* port to listen to<o:p></o:p></p>
<p class="MsoNormal">* - can be specified more than once if needed to listen on many ports */<o:p></o:p></p>
<p class="MsoNormal">port=5060<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_TLS<o:p></o:p></p>
<p class="MsoNormal">enable_tls=yes<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_XCAPSRV<o:p></o:p></p>
<p class="MsoNormal">tcp_accept_no_cl=yes<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">####### Custom Parameters #########<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># These parameters can be modified runtime via RPC interface<o:p></o:p></p>
<p class="MsoNormal"># - see the documentation of 'cfg_rpc' module.<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal"># Format: group.id = value 'desc' description<o:p></o:p></p>
<p class="MsoNormal"># Access: $sel(cfg_get.group.id) or @cfg_get.group.id<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_PSTN<o:p></o:p></p>
<p class="MsoNormal"># PSTN GW Routing<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal"># - pstn.gw_ip: valid IP or hostname as string value, example:<o:p></o:p></p>
<p class="MsoNormal"># pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal"># - by default is empty to avoid misrouting<o:p></o:p></p>
<p class="MsoNormal">pstn.gw_ip = "" desc "PSTN GW Address"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">####### Modules Section ########<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># set paths to location of modules<o:p></o:p></p>
<p class="MsoNormal">#!ifdef LOCAL_TEST_RUN<o:p></o:p></p>
<p class="MsoNormal">mpath="modules_k:modules"<o:p></o:p></p>
<p class="MsoNormal">#!else<o:p></o:p></p>
<p class="MsoNormal">mpath="/usr/local/lib/kamailio/modules_k/:/home/user/git/sip-router/modules/"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_MYSQL<o:p></o:p></p>
<p class="MsoNormal">loadmodule "db_mysql.so"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">loadmodule "mi_fifo.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "kex.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "tm.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "tmx.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "sl.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "rr.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "pv.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "maxfwd.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "usrloc.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "registrar.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "textops.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "siputils.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "xlog.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "sanity.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "ctl.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "mi_rpc.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "acc.so"<o:p></o:p></p>
<p class="MsoNormal"># loadmodule "pua_mi.so"<o:p></o:p></p>
<p class="MsoNormal"># loadmodule "pua_usrloc.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "outbound.so"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_AUTH<o:p></o:p></p>
<p class="MsoNormal">loadmodule "auth.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "auth_db.so"<o:p></o:p></p>
<p class="MsoNormal">#!ifdef WITH_IPAUTH<o:p></o:p></p>
<p class="MsoNormal">loadmodule "permissions.so"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_ALIASDB<o:p></o:p></p>
<p class="MsoNormal">loadmodule "alias_db.so"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_MULTIDOMAIN<o:p></o:p></p>
<p class="MsoNormal">loadmodule "domain.so"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_PRESENCE<o:p></o:p></p>
<p class="MsoNormal">loadmodule "presence.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "presence_xml.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "pua.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "rls.so"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_NAT<o:p></o:p></p>
<p class="MsoNormal">loadmodule "nathelper.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "rtpproxy.so"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_TLS<o:p></o:p></p>
<p class="MsoNormal">loadmodule "tls.so"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_ANTIFLOOD<o:p></o:p></p>
<p class="MsoNormal">loadmodule "htable.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "pike.so"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_XMLRPC<o:p></o:p></p>
<p class="MsoNormal">loadmodule "xmlrpc.so"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_XCAPSRV<o:p></o:p></p>
<p class="MsoNormal">loadmodule "xhttp.so"<o:p></o:p></p>
<p class="MsoNormal">loadmodule "xcap_server.so"<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----------------- setting module-specific parameters ---------------<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- mi_fifo params -----<o:p></o:p></p>
<p class="MsoNormal">modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- tm params -----<o:p></o:p></p>
<p class="MsoNormal"># auto-discard branches from previous serial forking leg<o:p></o:p></p>
<p class="MsoNormal">modparam("tm", "failure_reply_mode", 3)<o:p></o:p></p>
<p class="MsoNormal"># default retransmission timeout: 30sec<o:p></o:p></p>
<p class="MsoNormal">modparam("tm", "fr_timer", 30000)<o:p></o:p></p>
<p class="MsoNormal"># default invite retransmission timeout after 1xx: 120sec<o:p></o:p></p>
<p class="MsoNormal">modparam("tm", "fr_inv_timer", 120000)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- rr params -----<o:p></o:p></p>
<p class="MsoNormal"># add value to ;lr param to cope with most of the UAs<o:p></o:p></p>
<p class="MsoNormal">modparam("rr", "enable_full_lr", 1)<o:p></o:p></p>
<p class="MsoNormal"># do not append from tag to the RR (no need for this script)<o:p></o:p></p>
<p class="MsoNormal">modparam("rr", "append_fromtag", 0)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- registrar params -----<o:p></o:p></p>
<p class="MsoNormal">modparam("registrar", "method_filtering", 1)<o:p></o:p></p>
<p class="MsoNormal">/* uncomment the next line to disable parallel forking via location */<o:p></o:p></p>
<p class="MsoNormal"># modparam("registrar", "append_branches", 0)<o:p></o:p></p>
<p class="MsoNormal">/* uncomment the next line not to allow more than 10 contacts per AOR */<o:p></o:p></p>
<p class="MsoNormal">#modparam("registrar", "max_contacts", 10)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- acc params -----<o:p></o:p></p>
<p class="MsoNormal">/* what special events should be accounted ? */<o:p></o:p></p>
<p class="MsoNormal">modparam("acc", "early_media", 0)<o:p></o:p></p>
<p class="MsoNormal">modparam("acc", "report_ack", 0)<o:p></o:p></p>
<p class="MsoNormal">modparam("acc", "report_cancels", 0)<o:p></o:p></p>
<p class="MsoNormal">/* by default ww do not adjust the direct of the sequential requests.<o:p></o:p></p>
<p class="MsoNormal">if you enable this parameter, be sure the enable "append_fromtag"<o:p></o:p></p>
<p class="MsoNormal">in "rr" module */<o:p></o:p></p>
<p class="MsoNormal">modparam("acc", "detect_direction", 0)<o:p></o:p></p>
<p class="MsoNormal">/* account triggers (flags) */<o:p></o:p></p>
<p class="MsoNormal">modparam("acc", "log_flag", FLT_ACC)<o:p></o:p></p>
<p class="MsoNormal">modparam("acc", "log_missed_flag", FLT_ACCMISSED)<o:p></o:p></p>
<p class="MsoNormal">modparam("acc", "log_extra",<o:p></o:p></p>
<p class="MsoNormal">"src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")<o:p></o:p></p>
<p class="MsoNormal">modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)<o:p></o:p></p>
<p class="MsoNormal">/* enhanced DB accounting */<o:p></o:p></p>
<p class="MsoNormal">#!ifdef WITH_ACCDB<o:p></o:p></p>
<p class="MsoNormal">modparam("acc", "db_flag", FLT_ACC)<o:p></o:p></p>
<p class="MsoNormal">modparam("acc", "db_missed_flag", FLT_ACCMISSED)<o:p></o:p></p>
<p class="MsoNormal">modparam("acc", "db_url", DBURL)<o:p></o:p></p>
<p class="MsoNormal">modparam("acc", "db_extra",<o:p></o:p></p>
<p class="MsoNormal">"src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- usrloc params -----<o:p></o:p></p>
<p class="MsoNormal">/* enable DB persistency for location entries */<o:p></o:p></p>
<p class="MsoNormal">#!ifdef WITH_USRLOCDB<o:p></o:p></p>
<p class="MsoNormal">modparam("usrloc", "db_url", DBURL)<o:p></o:p></p>
<p class="MsoNormal">modparam("usrloc", "db_mode", 2)<o:p></o:p></p>
<p class="MsoNormal">modparam("usrloc", "use_domain", MULTIDOMAIN)<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- auth_db params -----<o:p></o:p></p>
<p class="MsoNormal">#!ifdef WITH_AUTH<o:p></o:p></p>
<p class="MsoNormal">modparam("auth_db", "db_url", DBURL)<o:p></o:p></p>
<p class="MsoNormal">modparam("auth_db", "calculate_ha1", yes)<o:p></o:p></p>
<p class="MsoNormal">modparam("auth_db", "password_column", "password")<o:p></o:p></p>
<p class="MsoNormal">modparam("auth_db", "load_credentials", "")<o:p></o:p></p>
<p class="MsoNormal">modparam("auth_db", "use_domain", MULTIDOMAIN)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- permissions params -----<o:p></o:p></p>
<p class="MsoNormal">#!ifdef WITH_IPAUTH<o:p></o:p></p>
<p class="MsoNormal">modparam("permissions", "db_url", DBURL)<o:p></o:p></p>
<p class="MsoNormal">modparam("permissions", "db_mode", 1)<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- alias_db params -----<o:p></o:p></p>
<p class="MsoNormal">#!ifdef WITH_ALIASDB<o:p></o:p></p>
<p class="MsoNormal">modparam("alias_db", "db_url", DBURL)<o:p></o:p></p>
<p class="MsoNormal">modparam("alias_db", "use_domain", MULTIDOMAIN)<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- domain params -----<o:p></o:p></p>
<p class="MsoNormal">#!ifdef WITH_MULTIDOMAIN<o:p></o:p></p>
<p class="MsoNormal">modparam("domain", "db_url", DBURL)<o:p></o:p></p>
<p class="MsoNormal"># use caching<o:p></o:p></p>
<p class="MsoNormal">modparam("domain", "db_mode", 1)<o:p></o:p></p>
<p class="MsoNormal"># register callback to match myself condition with domains list<o:p></o:p></p>
<p class="MsoNormal">modparam("domain", "register_myself", 1)<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_PRESENCE<o:p></o:p></p>
<p class="MsoNormal"># ----- presence params -----<o:p></o:p></p>
<p class="MsoNormal">modparam("presence", "db_url", DBURL)<o:p></o:p></p>
<p class="MsoNormal">#modparam("presence", "server_address", "sip:presence@192.168.1.120:5060")<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- presence_xml params -----<o:p></o:p></p>
<p class="MsoNormal">modparam("pua", "db_url", DBURL)<o:p></o:p></p>
<p class="MsoNormal">modparam("pua", "db_table", "pua")<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">modparam("presence_xml", "db_url", DBURL)<o:p></o:p></p>
<p class="MsoNormal">modparam("presence_xml", "force_active", 1)<o:p></o:p></p>
<p class="MsoNormal">#modparam("presence_xml", "pidf_manipulation", 1)<o:p></o:p></p>
<p class="MsoNormal">modparam("presence_xml", "integrated_xcap_server", 1)<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "db_url", DBURL)<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "xcap_table", "xcap")<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "rlsubs_table", "rls_watchers")<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "rlpres_table", "rls_presentity")<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "clean_period", 100)<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "waitn_time", 50)<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "max_expires", 10800)<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "hash_size", 9)<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "xcap_root", "http://192.168.1.120/xcap-root:5060")<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "integrated_xcap_server", 1)<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "to_presence_code", 10)<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "rls_event", "presence")<o:p></o:p></p>
<p class="MsoNormal">modparam("rls", "server_address", "sip:rls@192.168.1.120:5060")<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_NAT<o:p></o:p></p>
<p class="MsoNormal"># ----- rtpproxy params -----<o:p></o:p></p>
<p class="MsoNormal">modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- nathelper params -----<o:p></o:p></p>
<p class="MsoNormal">modparam("nathelper", "natping_interval", 30)<o:p></o:p></p>
<p class="MsoNormal">modparam("nathelper", "ping_nated_only", 1)<o:p></o:p></p>
<p class="MsoNormal">modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)<o:p></o:p></p>
<p class="MsoNormal">modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># params needed for NAT traversal in other modules<o:p></o:p></p>
<p class="MsoNormal">modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")<o:p></o:p></p>
<p class="MsoNormal">modparam("usrloc", "nat_bflag", FLB_NATB)<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_TLS<o:p></o:p></p>
<p class="MsoNormal"># ----- tls params -----<o:p></o:p></p>
<p class="MsoNormal">modparam("tls", "config", "/etc/kamailio/tls.cfg")<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_ANTIFLOOD<o:p></o:p></p>
<p class="MsoNormal"># ----- pike params -----<o:p></o:p></p>
<p class="MsoNormal">modparam("pike", "sampling_time_unit", 2)<o:p></o:p></p>
<p class="MsoNormal">modparam("pike", "reqs_density_per_unit", 16)<o:p></o:p></p>
<p class="MsoNormal">modparam("pike", "remove_latency", 4)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># ----- htable params -----<o:p></o:p></p>
<p class="MsoNormal"># ip ban htable with autoexpire after 5 minutes<o:p></o:p></p>
<p class="MsoNormal">modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_XMLRPC<o:p></o:p></p>
<p class="MsoNormal"># ----- xmlrpc params -----<o:p></o:p></p>
<p class="MsoNormal">modparam("xmlrpc", "route", "XMLRPC");<o:p></o:p></p>
<p class="MsoNormal">modparam("xmlrpc", "url_match", "^/RPC")<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_XCAPSRV<o:p></o:p></p>
<p class="MsoNormal"># ----- xcap_server params -----<o:p></o:p></p>
<p class="MsoNormal">modparam("xcap_server", "db_url", DBURL)<o:p></o:p></p>
<p class="MsoNormal"># modparam("rls", "integrated_xcap_server", 1)<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">####### Routing Logic ########<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Main SIP request routing logic<o:p></o:p></p>
<p class="MsoNormal"># - processing of any incoming SIP request starts with this route<o:p></o:p></p>
<p class="MsoNormal">route {<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # per request initial checks<o:p></o:p></p>
<p class="MsoNormal"> route(REQINIT);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # NAT detection<o:p></o:p></p>
<p class="MsoNormal"> route(NAT);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # handle requests within SIP dialogs<o:p></o:p></p>
<p class="MsoNormal"> route(WITHINDLG);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> ### only initial requests (no To tag)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # CANCEL processing<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("CANCEL"))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> if (t_check_trans())<o:p></o:p></p>
<p class="MsoNormal"> t_relay();<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> t_check_trans();<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # authentication<o:p></o:p></p>
<p class="MsoNormal"> route(AUTH);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # record routing for dialog forming requests (in case they are routed)<o:p></o:p></p>
<p class="MsoNormal"> # - remove preloaded route headers<o:p></o:p></p>
<p class="MsoNormal"> remove_hf("Route");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if(is_method("NOTIFY"))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> xlog(" pua_update_contact $rm from $fu (IP:$si:$sp) \n");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if(!pua_update_contact())<o:p></o:p></p>
<p class="MsoNormal"> xlog("pua update failed \n");<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if (is_method("INVITE|SUBSCRIBE"))<o:p></o:p></p>
<p class="MsoNormal"> record_route();<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # account only INVITEs<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("INVITE"))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> setflag(FLT_ACC); # do accounting<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # dispatch requests to foreign domains<o:p></o:p></p>
<p class="MsoNormal"> route(SIPOUT);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> ### requests for my local domains<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # handle presence related requests<o:p></o:p></p>
<p class="MsoNormal"> route(PRESENCE);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # handle registrations<o:p></o:p></p>
<p class="MsoNormal"> route(REGISTRAR);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if ($rU==$null)<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> # request with no Username in RURI<o:p></o:p></p>
<p class="MsoNormal"> sl_send_reply("484","Address Incomplete");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # dispatch destinations to PSTN<o:p></o:p></p>
<p class="MsoNormal"> route(PSTN);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # user location service<o:p></o:p></p>
<p class="MsoNormal"> route(LOCATION);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> route(RELAY);<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">route[RELAY] {<o:p></o:p></p>
<p class="MsoNormal"> #!ifdef WITH_NAT<o:p></o:p></p>
<p class="MsoNormal"> if (check_route_param("nat=yes")) {<o:p></o:p></p>
<p class="MsoNormal"> setbflag(FLB_NATB);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> if (isflagset(FLT_NATS) || isbflagset(FLB_NATB)) {<o:p></o:p></p>
<p class="MsoNormal"> route(RTPPROXY);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> /* example how to enable some additional event routes */<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("INVITE")) {<o:p></o:p></p>
<p class="MsoNormal"> #t_on_branch("BRANCH_ONE");<o:p></o:p></p>
<p class="MsoNormal"> t_on_reply("REPLY_ONE");<o:p></o:p></p>
<p class="MsoNormal"> t_on_failure("FAIL_ONE");<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if (!t_relay()) {<o:p></o:p></p>
<p class="MsoNormal"> sl_reply_error();<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Per SIP request initial checks<o:p></o:p></p>
<p class="MsoNormal">route[REQINIT] {<o:p></o:p></p>
<p class="MsoNormal"> #!ifdef WITH_ANTIFLOOD<o:p></o:p></p>
<p class="MsoNormal"> # flood dection from same IP and traffic ban for a while<o:p></o:p></p>
<p class="MsoNormal"> # be sure you exclude checking trusted peers, such as pstn gateways<o:p></o:p></p>
<p class="MsoNormal"> # - local host excluded (e.g., loop to self)<o:p></o:p></p>
<p class="MsoNormal"> if(src_ip!=myself)<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> if($sht(ipban=>$si)!=$null)<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> # ip is already blocked<o:p></o:p></p>
<p class="MsoNormal"> xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> if (!pike_check_req())<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");<o:p></o:p></p>
<p class="MsoNormal"> $sht(ipban=>$si) = 1;<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if (!mf_process_maxfwd_header("10")) {<o:p></o:p></p>
<p class="MsoNormal"> sl_send_reply("483","Too Many Hops");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if(!sanity_check("1511", "7"))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> xlog("Malformed SIP message from $si:$sp\n");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Handle requests within SIP dialogs<o:p></o:p></p>
<p class="MsoNormal">route[WITHINDLG] {<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if (has_totag()) {<o:p></o:p></p>
<p class="MsoNormal"> # sequential request withing a dialog should<o:p></o:p></p>
<p class="MsoNormal"> # take the path determined by record-routing<o:p></o:p></p>
<p class="MsoNormal"> if (loose_route()) {<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("BYE")) {<o:p></o:p></p>
<p class="MsoNormal"> setflag(FLT_ACC); # do accounting ...<o:p></o:p></p>
<p class="MsoNormal"> setflag(FLT_ACCFAILED); # ... even if the transaction fails<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> route(RELAY);<o:p></o:p></p>
<p class="MsoNormal"> } else {<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("SUBSCRIBE") && uri == myself) {<o:p></o:p></p>
<p class="MsoNormal"> # in-dialog subscribe requests<o:p></o:p></p>
<p class="MsoNormal"> route(PRESENCE);<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if ( is_method("ACK") ) {<o:p></o:p></p>
<p class="MsoNormal"> if ( t_check_trans() ) {<o:p></o:p></p>
<p class="MsoNormal"> # no loose-route, but stateful ACK;<o:p></o:p></p>
<p class="MsoNormal"> # must be an ACK after a 487<o:p></o:p></p>
<p class="MsoNormal"> # or e.g. 404 from upstream server<o:p></o:p></p>
<p class="MsoNormal"> t_relay();<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> } else {<o:p></o:p></p>
<p class="MsoNormal"> # ACK without matching transaction ... ignore and discard<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> sl_send_reply("404","Not here");<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Handle SIP registrations<o:p></o:p></p>
<p class="MsoNormal">route[REGISTRAR] {<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("REGISTER"))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> if(isflagset(FLT_NATS))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> setbflag(FLB_NATB);<o:p></o:p></p>
<p class="MsoNormal"> # uncomment next line to do SIP NAT pinging<o:p></o:p></p>
<p class="MsoNormal"> ## setbflag(FLB_NATSIPPING);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> if (!save("location"))<o:p></o:p></p>
<p class="MsoNormal"> sl_reply_error();<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># USER location service<o:p></o:p></p>
<p class="MsoNormal">route[LOCATION] {<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> #!ifdef WITH_ALIASDB<o:p></o:p></p>
<p class="MsoNormal"> # search in DB-based aliases<o:p></o:p></p>
<p class="MsoNormal"> alias_db_lookup("dbaliases");<o:p></o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if (!lookup("location")) {<o:p></o:p></p>
<p class="MsoNormal"> switch ($rc) {<o:p></o:p></p>
<p class="MsoNormal"> case -1:<o:p></o:p></p>
<p class="MsoNormal"> case -3:<o:p></o:p></p>
<p class="MsoNormal"> t_newtran();<o:p></o:p></p>
<p class="MsoNormal"> t_reply("404", "Not Found");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> case -2:<o:p></o:p></p>
<p class="MsoNormal"> sl_send_reply("405", "Method Not Allowed");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # when routing via usrloc, log the missed calls also<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("INVITE"))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> setflag(FLT_ACCMISSED);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Presence server route<o:p></o:p></p>
<p class="MsoNormal">route[PRESENCE] {<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if(!is_method("PUBLISH|SUBSCRIBE"))<o:p></o:p></p>
<p class="MsoNormal"> return;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> #!ifdef WITH_PRESENCE<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if (!t_newtran())<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> sl_reply_error();<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> };<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if(is_method("PUBLISH"))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> handle_publish();<o:p></o:p></p>
<p class="MsoNormal"> t_release();<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> else if( is_method("SUBSCRIBE"))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> $var(ret_code)= rls_handle_subscribe();<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if($var(ret_code)== 10) {<o:p></o:p></p>
<p class="MsoNormal"> handle_subscribe();<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> t_release();<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> }else if(method=="NOTIFY") {<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> rls_handle_notify();<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal"> # if presence enabled, this part will not be executed<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("PUBLISH") || $rU==$null)<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> sl_send_reply("404", "Not here");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> return;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Authentication route<o:p></o:p></p>
<p class="MsoNormal">route[AUTH] {<o:p></o:p></p>
<p class="MsoNormal"> return;<o:p></o:p></p>
<p class="MsoNormal"> #!ifdef WITH_AUTH<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("REGISTER"))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> # authenticate the REGISTER requests (uncomment to enable auth)<o:p></o:p></p>
<p class="MsoNormal"> if (!www_authorize("$td", "subscriber"))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> www_challenge("$td", "0");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if ($au!=$tU)<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> sl_send_reply("403","Forbidden auth ID");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> } else {<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> #!ifdef WITH_IPAUTH<o:p></o:p></p>
<p class="MsoNormal"> if(allow_source_address())<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> # source IP allowed<o:p></o:p></p>
<p class="MsoNormal"> return;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal"> # authenticate if from local subscriber<o:p></o:p></p>
<p class="MsoNormal"> if (from_uri==myself)<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> if (!proxy_authorize("$fd", "subscriber")) {<o:p></o:p></p>
<p class="MsoNormal"> proxy_challenge("$fd", "0");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("PUBLISH"))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> if ($au!=$tU) {<o:p></o:p></p>
<p class="MsoNormal"> sl_send_reply("403","Forbidden auth ID");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> } else {<o:p></o:p></p>
<p class="MsoNormal"> if ($au!=$fU) {<o:p></o:p></p>
<p class="MsoNormal"> sl_send_reply("403","Forbidden auth ID");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> consume_credentials();<o:p></o:p></p>
<p class="MsoNormal"> # caller authenticated<o:p></o:p></p>
<p class="MsoNormal"> } else {<o:p></o:p></p>
<p class="MsoNormal"> # caller is not local subscriber, then check if it calls<o:p></o:p></p>
<p class="MsoNormal"> # a local destination, otherwise deny, not an open relay here<o:p></o:p></p>
<p class="MsoNormal"> if (!uri==myself)<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> sl_send_reply("403","Not relaying");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal"> return;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # Caller NAT detection route<o:p></o:p></p>
<p class="MsoNormal">route[NAT] {<o:p></o:p></p>
<p class="MsoNormal"> #!ifdef WITH_NAT<o:p></o:p></p>
<p class="MsoNormal"> force_rport();<o:p></o:p></p>
<p class="MsoNormal"> if (nat_uac_test("19")) {<o:p></o:p></p>
<p class="MsoNormal"> if (method=="REGISTER") {<o:p></o:p></p>
<p class="MsoNormal"> fix_nated_register();<o:p></o:p></p>
<p class="MsoNormal"> } else {<o:p></o:p></p>
<p class="MsoNormal"> fix_nated_contact();<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> setflag(FLT_NATS);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal"> return;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># RTPProxy control<o:p></o:p></p>
<p class="MsoNormal">route[RTPPROXY] {<o:p></o:p></p>
<p class="MsoNormal"> #!ifdef WITH_NAT<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("BYE")) {<o:p></o:p></p>
<p class="MsoNormal"> unforce_rtp_proxy();<o:p></o:p></p>
<p class="MsoNormal"> } else if (is_method("INVITE")){<o:p></o:p></p>
<p class="MsoNormal"> force_rtp_proxy();<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> if (!has_totag()) add_rr_param(";nat=yes");<o:p></o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal"> return;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Routing to foreign domains<o:p></o:p></p>
<p class="MsoNormal">route[SIPOUT] {<o:p></o:p></p>
<p class="MsoNormal"> if (!uri==myself)<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> append_hf("P-hint: outbound\r\n");<o:p></o:p></p>
<p class="MsoNormal"> route(RELAY);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># PSTN GW routing<o:p></o:p></p>
<p class="MsoNormal">route[PSTN] {<o:p></o:p></p>
<p class="MsoNormal"> #!ifdef WITH_PSTN<o:p></o:p></p>
<p class="MsoNormal"> # check if PSTN GW IP is defined<o:p></o:p></p>
<p class="MsoNormal"> if (strempty($sel(cfg_get.pstn.gw_ip))) {<o:p></o:p></p>
<p class="MsoNormal"> xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");<o:p></o:p></p>
<p class="MsoNormal"> return;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # route to PSTN dialed numbers starting with '+' or '00'<o:p></o:p></p>
<p class="MsoNormal"> # (international format)<o:p></o:p></p>
<p class="MsoNormal"> # - update the condition to match your dialing rules for PSTN routing<o:p></o:p></p>
<p class="MsoNormal"> if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))<o:p></o:p></p>
<p class="MsoNormal"> return;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # only local users allowed to call<o:p></o:p></p>
<p class="MsoNormal"> if(from_uri!=myself) {<o:p></o:p></p>
<p class="MsoNormal"> sl_send_reply("403", "Not Allowed");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> route(RELAY);<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> return;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># XMLRPC routing<o:p></o:p></p>
<p class="MsoNormal">#!ifdef WITH_XMLRPC<o:p></o:p></p>
<p class="MsoNormal">route[XMLRPC]<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal"> # allow XMLRPC from localhost<o:p></o:p></p>
<p class="MsoNormal"> if ((method=="POST" || method=="GET")<o:p></o:p></p>
<p class="MsoNormal"> && (src_ip==127.0.0.1)) {<o:p></o:p></p>
<p class="MsoNormal"> # close connection only for xmlrpclib user agents (there is a bug in<o:p></o:p></p>
<p class="MsoNormal"> # xmlrpclib: it waits for EOF before interpreting the response).<o:p></o:p></p>
<p class="MsoNormal"> if ($hdr(User-Agent) =~ "xmlrpclib")<o:p></o:p></p>
<p class="MsoNormal"> set_reply_close();<o:p></o:p></p>
<p class="MsoNormal"> set_reply_no_connect();<o:p></o:p></p>
<p class="MsoNormal"> dispatch_rpc();<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> send_reply("403", "Forbidden");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Sample branch router<o:p></o:p></p>
<p class="MsoNormal">branch_route[BRANCH_ONE] {<o:p></o:p></p>
<p class="MsoNormal"> xdbg("new branch at $ru\n");<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Sample onreply route<o:p></o:p></p>
<p class="MsoNormal">onreply_route[REPLY_ONE] {<o:p></o:p></p>
<p class="MsoNormal"> xdbg("incoming reply\n");<o:p></o:p></p>
<p class="MsoNormal"> #!ifdef WITH_NAT<o:p></o:p></p>
<p class="MsoNormal"> if ((isflagset(FLT_NATS) || isbflagset(FLB_NATB))<o:p></o:p></p>
<p class="MsoNormal"> && status=~"(183)|(2[0-9][0-9])") {<o:p></o:p></p>
<p class="MsoNormal"> force_rtp_proxy();<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> if (isbflagset("6")) {<o:p></o:p></p>
<p class="MsoNormal"> fix_nated_contact();<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Sample failure route<o:p></o:p></p>
<p class="MsoNormal">failure_route[FAIL_ONE] {<o:p></o:p></p>
<p class="MsoNormal"> #!ifdef WITH_NAT<o:p></o:p></p>
<p class="MsoNormal"> if (is_method("INVITE")<o:p></o:p></p>
<p class="MsoNormal"> && (isbflagset(FLB_NATB) || isflagset(FLT_NATS))) {<o:p></o:p></p>
<p class="MsoNormal"> unforce_rtp_proxy();<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> if (t_is_canceled()) {<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # uncomment the following lines if you want to block client<o:p></o:p></p>
<p class="MsoNormal"> # redirect based on 3xx replies.<o:p></o:p></p>
<p class="MsoNormal"> ##if (t_check_status("3[0-9][0-9]")) {<o:p></o:p></p>
<p class="MsoNormal"> ##t_reply("404","Not found");<o:p></o:p></p>
<p class="MsoNormal"> ## exit;<o:p></o:p></p>
<p class="MsoNormal"> ##}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # uncomment the following lines if you want to redirect the failed<o:p></o:p></p>
<p class="MsoNormal"> # calls to a different new destination<o:p></o:p></p>
<p class="MsoNormal"> ##if (t_check_status("486|408")) {<o:p></o:p></p>
<p class="MsoNormal"> ## sethostport("192.168.2.100:5060");<o:p></o:p></p>
<p class="MsoNormal"> ## append_branch();<o:p></o:p></p>
<p class="MsoNormal"> ## # do not set the missed call flag again<o:p></o:p></p>
<p class="MsoNormal"> ## t_relay();<o:p></o:p></p>
<p class="MsoNormal"> ##}<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!ifdef WITH_XCAPSRV<o:p></o:p></p>
<p class="MsoNormal"># #!define WITH_XHTTPAUTH<o:p></o:p></p>
<p class="MsoNormal">event_route[xhttp:request] {<o:p></o:p></p>
<p class="MsoNormal"> xdbg("===== xhttp: request [$rv] $rm => $hu\n");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> #!ifdef WITH_XHTTPAUTH<o:p></o:p></p>
<p class="MsoNormal"> if (!www_authorize("xcap", "subscriber"))<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> www_challenge("xcap", "0");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal"> xdbg("===== xhttp: Antes del if de $hu\n");<o:p></o:p></p>
<p class="MsoNormal"> if($hu=~"^/xcap-root/")<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> xdbg("===== xhttp: Dentro del if de $hu\n");<o:p></o:p></p>
<p class="MsoNormal"> set_reply_close();<o:p></o:p></p>
<p class="MsoNormal"> set_reply_no_connect();<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # xcap ops<o:p></o:p></p>
<p class="MsoNormal"> $xcapuri(u=>data) = $hu;<o:p></o:p></p>
<p class="MsoNormal"> if($xcapuri(u=>xuid)=~"^sip:.+@.+")<o:p></o:p></p>
<p class="MsoNormal"> $var(uri) = $xcapuri(u=>xuid);<o:p></o:p></p>
<p class="MsoNormal"> else if($xcapuri(u=>xuid)=~".+@.+")<o:p></o:p></p>
<p class="MsoNormal"> $var(uri) = "sip:" + $xcapuri(u=>xuid);<o:p></o:p></p>
<p class="MsoNormal"> else<o:p></o:p></p>
<p class="MsoNormal"> $var(uri) = "sip:"+ $xcapuri(u=>xuid) + "@" + $Ri;<o:p></o:p></p>
<p class="MsoNormal">xdbg("===== xhttp: Evgeny check var uri $var(uri)\n");<o:p></o:p></p>
<p class="MsoNormal"> xlog("L_NOTICE", "===== xhttp: $xcapuri(u=>auid) : $xcapuri(u=>xuid)\n");<o:p></o:p></p>
<p class="MsoNormal"> if($xcapuri(u=>auid)=="xcap-caps")<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> $var(xbody) =<o:p></o:p></p>
<p class="MsoNormal"> "<?xml version='1.0' encoding='UTF-8'?><o:p></o:p></p>
<p class="MsoNormal"> <xcap-caps xmlns='urn:ietf:params:xml:ns:xcap-caps'><o:p></o:p></p>
<p class="MsoNormal"> <auids><o:p></o:p></p>
<p class="MsoNormal"> <auid>rls-services</auid><o:p></o:p></p>
<p class="MsoNormal"> <auid>pidf-manipulation</auid><o:p></o:p></p>
<p class="MsoNormal"> <auid>xcap-caps</auid><o:p></o:p></p>
<p class="MsoNormal"> <auid>resource-lists</auid><o:p></o:p></p>
<p class="MsoNormal"> <auid>pres-rules</auid><o:p></o:p></p>
<p class="MsoNormal"> <auid>org.openmobilealliance.pres-rules</auid><o:p></o:p></p>
<p class="MsoNormal"> </auids><o:p></o:p></p>
<p class="MsoNormal"> <extensions><o:p></o:p></p>
<p class="MsoNormal"> </extensions><o:p></o:p></p>
<p class="MsoNormal"> <namespaces><o:p></o:p></p>
<p class="MsoNormal"> <namespace>urn:ietf:params:xml:ns:rls-services</namespace><o:p></o:p></p>
<p class="MsoNormal"> <namespace>urn:ietf:params:xml:ns:pidf</namespace><o:p></o:p></p>
<p class="MsoNormal"> <namespace>urn:ietf:params:xml:ns:xcap-caps</namespace><o:p></o:p></p>
<p class="MsoNormal"> <namespace>urn:ietf:params:xml:ns:resource-lists</namespace><o:p></o:p></p>
<p class="MsoNormal"> <namespace>urn:ietf:params:xml:ns:pres-rules</namespace><o:p></o:p></p>
<p class="MsoNormal"> </namespaces><o:p></o:p></p>
<p class="MsoNormal"> </xcap-caps>";<o:p></o:p></p>
<p class="MsoNormal"> xhttp_reply("200", "ok", "application/xcap-caps+xml",<o:p></o:p></p>
<p class="MsoNormal"> "$var(xbody)");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> #!ifdef WITH_XHTTPAUTH<o:p></o:p></p>
<p class="MsoNormal"> # be sure auth user access only its documents<o:p></o:p></p>
<p class="MsoNormal"> if ($au!=$(var(uri){uri.user})) {<o:p></o:p></p>
<p class="MsoNormal"> xhttp_reply("403", "Forbidden", "text/html",<o:p></o:p></p>
<p class="MsoNormal"> "<html><body>$si:$sp</body></html>");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> #!endif<o:p></o:p></p>
<p class="MsoNormal"> xdbg("===== xhttp: Antes del switch $rm => $hu\n");<o:p></o:p></p>
<p class="MsoNormal"> switch($rm) {<o:p></o:p></p>
<p class="MsoNormal"> case "PUT":<o:p></o:p></p>
<p class="MsoNormal">xdbg("===== xhttp: Evgeny something will happen after that $var(uri)\n");<o:p></o:p></p>
<p class="MsoNormal"> xcaps_put("$var(uri)", "$hu", "$rb");<o:p></o:p></p>
<p class="MsoNormal">xdbg("===== xhttp: Evgeny something before that\n");<o:p></o:p></p>
<p class="MsoNormal"> if($xcapuri(u=>auid)=~"pres-rules") {<o:p></o:p></p>
<p class="MsoNormal"> pres_update_watchers("$var(uri)", "presence");<o:p></o:p></p>
<p class="MsoNormal"> pres_refresh_watchers("$var(uri)", "presence", 1);<o:p></o:p></p>
<p class="MsoNormal"> } else if ($xcapuri(u=>auid)=~"resource-lists"<o:p></o:p></p>
<p class="MsoNormal"> || $xcapuri(u=>auid)=~"rls-services") {<o:p></o:p></p>
<p class="MsoNormal"> rls_update_subs("$var(uri)", "presence");<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> case "GET":<o:p></o:p></p>
<p class="MsoNormal"> xlog("L_NOTICE", "===== xhttp: get $var(uri) => $hu\n");<o:p></o:p></p>
<p class="MsoNormal"> xcaps_get("$var(uri)", "$hu");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> case "DELETE":<o:p></o:p></p>
<p class="MsoNormal"> xcaps_del("$var(uri)", "$hu");<o:p></o:p></p>
<p class="MsoNormal"> if($xcapuri(u=>auid)=~"pres-rules")<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal"> xlog("L_NOTICE", "===== xhttp del: refreshing watchers for $var(uri)\n");<o:p></o:p></p>
<p class="MsoNormal"> pres_update_watchers("$var(uri)", "presence");<o:p></o:p></p>
<p class="MsoNormal"> pres_refresh_watchers("$var(uri)", "presence", 1);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> # http ops<o:p></o:p></p>
<p class="MsoNormal"> xhttp_reply("200", "ok", "text/html",<o:p></o:p></p>
<p class="MsoNormal"> "<html><body>OK: $si:$sp</body></html>");<o:p></o:p></p>
<p class="MsoNormal"> exit;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">#!endif<o:p></o:p></p>
</div>
</body>
</html>