6a16763db5e8e5737b197b8c66bc5d6bdc0b3ce4
[sip-router] / etc / kamailio-oob.cfg
1 #!KAMAILIO
2 #
3 # Kamailio (OpenSER) SIP Server v4.3 - default configuration script
4 #     - web: http://www.kamailio.org
5 #     - git: http://sip-router.org
6 #
7 # Direct your questions about this file to: <sr-users@lists.sip-router.org>
8 #
9 # Refer to the Core CookBook at http://www.kamailio.org/wiki/
10 # for an explanation of possible statements, functions and parameters.
11 #
12 # Several features can be enabled using '#!define WITH_FEATURE' directives:
13 #
14 # *** To run in debug mode: 
15 #     - define WITH_DEBUG
16 #
17 # *** To enable mysql: 
18 #     - define WITH_MYSQL
19 #
20 # *** To enable authentication execute:
21 #     - enable mysql
22 #     - define WITH_AUTH
23 #     - add users using 'kamctl'
24 #
25 # *** To enable IP authentication execute:
26 #     - enable mysql
27 #     - enable authentication
28 #     - define WITH_IPAUTH
29 #     - add IP addresses with group id '1' to 'address' table
30 #
31 # *** To enable persistent user location execute:
32 #     - enable mysql
33 #     - define WITH_USRLOCDB
34 #
35 # *** To enable presence server execute:
36 #     - enable mysql
37 #     - define WITH_PRESENCE
38 #
39 # *** To enable nat traversal execute:
40 #     - define WITH_NAT
41 #     - install RTPProxy: http://www.rtpproxy.org
42 #     - start RTPProxy:
43 #        rtpproxy -l _your_public_ip_ -s udp:localhost:7722
44 #     - option for NAT SIP OPTIONS keepalives: WITH_NATSIPPING
45 #
46 # *** To enable PSTN gateway routing execute:
47 #     - define WITH_PSTN
48 #     - set the value of pstn.gw_ip
49 #     - check route[PSTN] for regexp routing condition
50 #
51 # *** To enable database aliases lookup execute:
52 #     - enable mysql
53 #     - define WITH_ALIASDB
54 #
55 # *** To enable speed dial lookup execute:
56 #     - enable mysql
57 #     - define WITH_SPEEDDIAL
58 #
59 # *** To enable multi-domain support execute:
60 #     - enable mysql
61 #     - define WITH_MULTIDOMAIN
62 #
63 # *** To enable TLS support execute:
64 #     - adjust CFGDIR/tls.cfg as needed
65 #     - define WITH_TLS
66 #
67 # *** To enable XMLRPC support execute:
68 #     - define WITH_XMLRPC
69 #     - adjust route[XMLRPC] for access policy
70 #
71 # *** To enable the embedded http server:
72 #     - define WITH_XHTTP
73 #
74 # *** To enable the RPC web interface execute:
75 #     - enable xhttp
76 #     - define WITH_XHTTP_RPC
77 #
78 # *** To enable the provisioning web interface execute:
79 #     - enable mysql
80 #     - enable xhttp
81 #     - define WITH_XHTTP_PI
82 #
83 # *** To enable anti-flood detection execute:
84 #     - adjust pike and htable=>ipban settings as needed (default is
85 #       block if more than 16 requests in 2 seconds and ban for 300 seconds)
86 #     - define WITH_ANTIFLOOD
87 #
88 # *** To block 3XX redirect replies execute:
89 #     - define WITH_BLOCK3XX
90 #
91 # *** To enable VoiceMail routing execute:
92 #     - define WITH_VOICEMAIL
93 #     - set the value of voicemail.srv_ip
94 #     - adjust the value of voicemail.srv_port
95 #
96 # *** To enhance accounting execute:
97 #     - enable mysql
98 #     - define WITH_ACCDB
99 #     - add following columns to database
100 #!ifdef ACCDB_COMMENT
101   ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
102   ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
103   ALTER TABLE acc ADD COLUMN src_ip varchar(64) NOT NULL default '';
104   ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
105   ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
106   ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
107   ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
108   ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
109   ALTER TABLE missed_calls ADD COLUMN src_ip varchar(64) NOT NULL default '';
110   ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
111   ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
112   ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
113 #!endif
114
115 ####### Include Local Config If Exists #########
116 import_file "kamailio-local.cfg"
117
118 ####### Defined Values #########
119
120 # *** Value defines - IDs used later in config
121 #!ifdef WITH_MYSQL
122 # - database URL - used to connect to database server by modules such
123 #       as: auth_db, acc, usrloc, a.s.o.
124 #!ifndef DBURL
125 #!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"
126 #!endif
127 #!endif
128 #!ifdef WITH_MULTIDOMAIN
129 # - the value for 'use_domain' parameters
130 #!define MULTIDOMAIN 1
131 #!else
132 #!define MULTIDOMAIN 0
133 #!endif
134
135 # - flags
136 #   FLT_ - per transaction (message) flags
137 #       FLB_ - per branch flags
138 #!define FLT_ACC 1
139 #!define FLT_ACCMISSED 2
140 #!define FLT_ACCFAILED 3
141 #!define FLT_NATS 5
142
143 #!define FLB_NATB 6
144 #!define FLB_NATSIPPING 7
145
146 ####### Global Parameters #########
147
148 #!ifdef WITH_DEBUG
149 debug=4
150 log_stderror=yes
151 #!else
152 debug=2
153 log_stderror=no
154 #!endif
155
156 memdbg=5
157 memlog=5
158
159 log_facility=LOG_LOCAL0
160
161 fork=yes
162 children=4
163
164 /* uncomment the next line to disable TCP (default on) */
165 #disable_tcp=yes
166
167 /* uncomment the next line to disable the auto discovery of local aliases
168    based on reverse DNS on IPs (default on) */
169 #auto_aliases=no
170
171 /* add local domain aliases */
172 #alias="sip.mydomain.com"
173
174 /* uncomment and configure the following line if you want Kamailio to 
175    bind on a specific interface/port/proto (default bind on all available) */
176 #listen=udp:10.0.0.10:5060
177
178 /* port to listen to
179  * - can be specified more than once if needed to listen on many ports */
180 port=5060
181
182 #!ifdef WITH_TLS
183 enable_tls=yes
184 #!endif
185
186 # life time of TCP connection when there is no traffic
187 # - a bit higher than registration expires to cope with UA behind NAT
188 tcp_connection_lifetime=3605
189
190 #!ifdef WITH_XHTTP
191 tcp_accept_no_cl=yes
192 #!endif
193
194 ####### Custom Parameters #########
195
196 # These parameters can be modified runtime via RPC interface
197 # - see the documentation of 'cfg_rpc' module.
198 #
199 # Format: group.id = value 'desc' description
200 # Access: $sel(cfg_get.group.id) or @cfg_get.group.id
201 #
202
203 #!ifdef WITH_PSTN
204 # PSTN GW Routing
205 #
206 # - pstn.gw_ip: valid IP or hostname as string value, example:
207 # pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
208 #
209 # - by default is empty to avoid misrouting
210 pstn.gw_ip = "" desc "PSTN GW Address"
211 pstn.gw_port = "" desc "PSTN GW Port"
212 #!endif
213
214 #!ifdef WITH_VOICEMAIL
215 # VoiceMail Routing on offline, busy or no answer
216 #
217 # - by default Voicemail server IP is empty to avoid misrouting
218 voicemail.srv_ip = "" desc "VoiceMail IP Address"
219 voicemail.srv_port = "5060" desc "VoiceMail Port"
220 #!endif
221
222 ####### Modules Section ########
223
224 # set paths to location of modules (to sources or installation folders)
225 #!ifdef WITH_SRCPATH
226 mpath="modules_k:modules"
227 #!else
228 mpath="/usr/local/lib/kamailio/modules_k/:/usr/local/lib/kamailio/modules/"
229 #!endif
230
231 #!ifdef WITH_MYSQL
232 loadmodule "db_mysql.so"
233 #!endif
234
235 loadmodule "mi_fifo.so"
236 loadmodule "kex.so"
237 loadmodule "corex.so"
238 loadmodule "tm.so"
239 loadmodule "tmx.so"
240 loadmodule "sl.so"
241 loadmodule "rr.so"
242 loadmodule "pv.so"
243 loadmodule "maxfwd.so"
244 loadmodule "usrloc.so"
245 loadmodule "registrar.so"
246 loadmodule "textops.so"
247 loadmodule "siputils.so"
248 loadmodule "xlog.so"
249 loadmodule "sanity.so"
250 loadmodule "ctl.so"
251 loadmodule "cfg_rpc.so"
252 loadmodule "mi_rpc.so"
253 loadmodule "acc.so"
254
255 #!ifdef WITH_AUTH
256 loadmodule "auth.so"
257 loadmodule "auth_db.so"
258 #!ifdef WITH_IPAUTH
259 loadmodule "permissions.so"
260 #!endif
261 #!endif
262
263 #!ifdef WITH_ALIASDB
264 loadmodule "alias_db.so"
265 #!endif
266
267 #!ifdef WITH_SPEEDDIAL
268 loadmodule "speeddial.so"
269 #!endif
270
271 #!ifdef WITH_MULTIDOMAIN
272 loadmodule "domain.so"
273 #!endif
274
275 #!ifdef WITH_PRESENCE
276 loadmodule "presence.so"
277 loadmodule "presence_xml.so"
278 #!endif
279
280 #!ifdef WITH_NAT
281 loadmodule "nathelper.so"
282 loadmodule "rtpproxy.so"
283 #!endif
284
285 #!ifdef WITH_TLS
286 loadmodule "tls.so"
287 #!endif
288
289 #!ifdef WITH_ANTIFLOOD
290 loadmodule "htable.so"
291 loadmodule "pike.so"
292 #!endif
293
294 #!ifdef WITH_XMLRPC
295 loadmodule "xmlrpc.so"
296 #!endif
297
298 #!ifdef WITH_DEBUG
299 loadmodule "debugger.so"
300 #!endif
301
302 #!ifdef WITH_XHTTP
303 loadmodule "xhttp.so"
304 #!endif
305
306 #!ifdef WITH_XHTTP_RPC
307 loadmodule "xhttp_rpc.so"
308 #!endif
309
310 #!ifdef WITH_XHTTP_PI
311 loadmodule "xhttp_pi.so"
312 #!endif
313
314 # ----------------- setting module-specific parameters ---------------
315
316
317 # ----- mi_fifo params -----
318 modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
319
320
321 # ----- tm params -----
322 # auto-discard branches from previous serial forking leg
323 modparam("tm", "failure_reply_mode", 3)
324 # default retransmission timeout: 30sec
325 modparam("tm", "fr_timer", 30000)
326 # default invite retransmission timeout after 1xx: 120sec
327 modparam("tm", "fr_inv_timer", 120000)
328
329
330 # ----- rr params -----
331 # add value to ;lr param to cope with most of the UAs
332 modparam("rr", "enable_full_lr", 1)
333 # do not append from tag to the RR (no need for this script)
334 modparam("rr", "append_fromtag", 0)
335
336
337 # ----- registrar params -----
338 modparam("registrar", "method_filtering", 1)
339 /* uncomment the next line to disable parallel forking via location */
340 # modparam("registrar", "append_branches", 0)
341 /* uncomment the next line not to allow more than 10 contacts per AOR */
342 #modparam("registrar", "max_contacts", 10)
343 # max value for expires of registrations
344 modparam("registrar", "max_expires", 3600)
345 # set it to 1 to enable GRUU
346 modparam("registrar", "gruu_enabled", 0)
347
348
349 # ----- acc params -----
350 /* what special events should be accounted ? */
351 modparam("acc", "early_media", 0)
352 modparam("acc", "report_ack", 0)
353 modparam("acc", "report_cancels", 0)
354 /* by default ww do not adjust the direct of the sequential requests.
355    if you enable this parameter, be sure the enable "append_fromtag"
356    in "rr" module */
357 modparam("acc", "detect_direction", 0)
358 /* account triggers (flags) */
359 modparam("acc", "log_flag", FLT_ACC)
360 modparam("acc", "log_missed_flag", FLT_ACCMISSED)
361 modparam("acc", "log_extra", 
362         "src_user=$fU;src_domain=$fd;src_ip=$si;"
363         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
364 modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
365 /* enhanced DB accounting */
366 #!ifdef WITH_ACCDB
367 modparam("acc", "db_flag", FLT_ACC)
368 modparam("acc", "db_missed_flag", FLT_ACCMISSED)
369 modparam("acc", "db_url", DBURL)
370 modparam("acc", "db_extra",
371         "src_user=$fU;src_domain=$fd;src_ip=$si;"
372         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
373 #!endif
374
375
376 # ----- usrloc params -----
377 /* enable DB persistency for location entries */
378 #!ifdef WITH_USRLOCDB
379 modparam("usrloc", "db_url", DBURL)
380 modparam("usrloc", "db_mode", 2)
381 modparam("usrloc", "use_domain", MULTIDOMAIN)
382 #!endif
383
384
385 # ----- auth_db params -----
386 #!ifdef WITH_AUTH
387 modparam("auth_db", "db_url", DBURL)
388 modparam("auth_db", "calculate_ha1", yes)
389 modparam("auth_db", "password_column", "password")
390 modparam("auth_db", "load_credentials", "")
391 modparam("auth_db", "use_domain", MULTIDOMAIN)
392
393 # ----- permissions params -----
394 #!ifdef WITH_IPAUTH
395 modparam("permissions", "db_url", DBURL)
396 modparam("permissions", "db_mode", 1)
397 #!endif
398
399 #!endif
400
401
402 # ----- alias_db params -----
403 #!ifdef WITH_ALIASDB
404 modparam("alias_db", "db_url", DBURL)
405 modparam("alias_db", "use_domain", MULTIDOMAIN)
406 #!endif
407
408
409 # ----- speeddial params -----
410 #!ifdef WITH_SPEEDDIAL
411 modparam("speeddial", "db_url", DBURL)
412 modparam("speeddial", "use_domain", MULTIDOMAIN)
413 #!endif
414
415
416 # ----- domain params -----
417 #!ifdef WITH_MULTIDOMAIN
418 modparam("domain", "db_url", DBURL)
419 # register callback to match myself condition with domains list
420 modparam("domain", "register_myself", 1)
421 #!endif
422
423
424 #!ifdef WITH_PRESENCE
425 # ----- presence params -----
426 modparam("presence", "db_url", DBURL)
427
428 # ----- presence_xml params -----
429 modparam("presence_xml", "db_url", DBURL)
430 modparam("presence_xml", "force_active", 1)
431 #!endif
432
433
434 #!ifdef WITH_NAT
435 # ----- rtpproxy params -----
436 modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
437
438 # ----- nathelper params -----
439 modparam("nathelper", "natping_interval", 30)
440 modparam("nathelper", "ping_nated_only", 1)
441 modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
442 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
443
444 # params needed for NAT traversal in other modules
445 modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
446 modparam("usrloc", "nat_bflag", FLB_NATB)
447 #!endif
448
449
450 #!ifdef WITH_TLS
451 # ----- tls params -----
452 modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
453 #!endif
454
455 #!ifdef WITH_ANTIFLOOD
456 # ----- pike params -----
457 modparam("pike", "sampling_time_unit", 2)
458 modparam("pike", "reqs_density_per_unit", 16)
459 modparam("pike", "remove_latency", 4)
460
461 # ----- htable params -----
462 # ip ban htable with autoexpire after 5 minutes
463 modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
464 #!endif
465
466 #!ifdef WITH_XMLRPC
467 # ----- xmlrpc params -----
468 modparam("xmlrpc", "route", "XMLRPC");
469 modparam("xmlrpc", "url_match", "^/RPC")
470 #!endif
471
472 #!ifdef WITH_DEBUG
473 # ----- debugger params -----
474 modparam("debugger", "cfgtrace", 1)
475 #!endif
476
477 #!ifdef WITH_XHTTP_RPC
478 modparam("xhttp_rpc", "xhttp_rpc_root", "http_rpc")
479 #!endif
480
481 #!ifdef WITH_XHTTP_PI
482 modparam("xhttp_pi", "xhttp_pi_root", "http_pi")
483 modparam("xhttp_pi", "framework", "/usr/local/etc/kamailio/pi_framework.xml")
484 #!endif
485
486 ####### Routing Logic ########
487
488
489 # Main SIP request routing logic
490 # - processing of any incoming SIP request starts with this route
491 # - note: this is the same as route { ... }
492 request_route {
493
494         # per request initial checks
495         route(REQINIT);
496
497         # NAT detection
498         route(NATDETECT);
499
500         # CANCEL processing
501         if (is_method("CANCEL")) {
502                 if (t_check_trans())
503                         t_relay();
504                 exit;
505         }
506
507         # handle requests within SIP dialogs
508         route(WITHINDLG);
509
510         ### only initial requests (no To tag)
511
512         # handle retransmissions
513         if(t_precheck_trans()) {
514                 t_check_trans();
515                 exit;
516         }
517         t_check_trans();
518
519         # authentication
520         route(AUTH);
521
522         # record routing for dialog forming requests (in case they are routed)
523         # - remove preloaded route headers
524         remove_hf("Route");
525         if (is_method("INVITE|SUBSCRIBE"))
526                 record_route();
527
528         # account only INVITEs
529         if (is_method("INVITE")) {
530                 setflag(FLT_ACC); # do accounting
531         }
532
533         # dispatch requests to foreign domains
534         route(SIPOUT);
535
536         ### requests for my local domains
537
538         # handle presence related requests
539         route(PRESENCE);
540
541         # handle registrations
542         route(REGISTRAR);
543
544         if ($rU==$null) {
545                 # request with no Username in RURI
546                 sl_send_reply("484", "Address Incomplete");
547                 exit;
548         }
549
550         # dispatch destinations to PSTN
551         route(PSTN);
552
553         # user location service
554         route(LOCATION);
555
556         route(RELAY);
557 }
558
559
560 route[RELAY] {
561
562         # enable additional event routes for forwarded requests
563         # - serial forking, RTP relaying handling, a.s.o.
564         if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
565                 if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
566         }
567         if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
568                 if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
569         }
570         if (is_method("INVITE")) {
571                 if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
572         }
573
574         if (!t_relay()) {
575                 sl_reply_error();
576         }
577         exit;
578 }
579
580 # Per SIP request initial checks
581 route[REQINIT] {
582 #!ifdef WITH_ANTIFLOOD
583         # flood dection from same IP and traffic ban for a while
584         # be sure you exclude checking trusted peers, such as pstn gateways
585         # - local host excluded (e.g., loop to self)
586         if(src_ip!=myself) {
587                 if($sht(ipban=>$si)!=$null) {
588                         # ip is already blocked
589                         xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
590                         exit;
591                 }
592                 if (!pike_check_req()) {
593                         xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
594                         $sht(ipban=>$si) = 1;
595                         exit;
596                 }
597         }
598         if($ua =~ "friendly-scanner") {
599                 sl_send_reply("200", "OK");
600                 exit;
601         }
602 #!endif
603
604         if (!mf_process_maxfwd_header("10")) {
605                 sl_send_reply("483","Too Many Hops");
606                 exit;
607         }
608
609         if(is_method("OPTIONS") && uri==myself && $rU==$null) {
610                 sl_send_reply("200","Keepalive");
611                 exit;
612         }
613
614         if(!sanity_check("1511", "7")) {
615                 xlog("Malformed SIP message from $si:$sp\n");
616                 exit;
617         }
618 }
619
620 # Handle requests within SIP dialogs
621 route[WITHINDLG] {
622         if (!has_totag()) return;
623
624         # sequential request withing a dialog should
625         # take the path determined by record-routing
626         if (loose_route()) {
627                 route(DLGURI);
628                 if (is_method("BYE")) {
629                         setflag(FLT_ACC); # do accounting ...
630                         setflag(FLT_ACCFAILED); # ... even if the transaction fails
631                 }
632                 else if ( is_method("ACK") ) {
633                         # ACK is forwarded statelessy
634                         route(NATMANAGE);
635                 }
636                 else if ( is_method("NOTIFY") ) {
637                         # Add Record-Route for in-dialog NOTIFY as per RFC 6665.
638                         record_route();
639                 }
640                 route(RELAY);
641                 exit;
642         }
643
644         if (is_method("SUBSCRIBE") && uri == myself) {
645                 # in-dialog subscribe requests
646                 route(PRESENCE);
647                 exit;
648         }
649         if ( is_method("ACK") ) {
650                 if ( t_check_trans() ) {
651                         # no loose-route, but stateful ACK;
652                         # must be an ACK after a 487
653                         # or e.g. 404 from upstream server
654                         t_relay();
655                         exit;
656                 } else {
657                         # ACK without matching transaction ... ignore and discard
658                         exit;
659                 }
660         }
661         sl_send_reply("404", "Not here");
662         exit;
663 }
664
665 # Handle SIP registrations
666 route[REGISTRAR] {
667         if (!is_method("REGISTER")) return;
668
669         if(isflagset(FLT_NATS)) {
670                 setbflag(FLB_NATB);
671 #!ifdef WITH_NATSIPPING
672                 # do SIP NAT pinging
673                 setbflag(FLB_NATSIPPING);
674 #!endif
675         }
676         if (!save("location"))
677                 sl_reply_error();
678
679         exit;
680 }
681
682 # User location service
683 route[LOCATION] {
684
685 #!ifdef WITH_SPEEDDIAL
686         # search for short dialing - 2-digit extension
687         if($rU=~"^[0-9][0-9]$")
688                 if(sd_lookup("speed_dial"))
689                         route(SIPOUT);
690 #!endif
691
692 #!ifdef WITH_ALIASDB
693         # search in DB-based aliases
694         if(alias_db_lookup("dbaliases"))
695                 route(SIPOUT);
696 #!endif
697
698         $avp(oexten) = $rU;
699         if (!lookup("location")) {
700                 $var(rc) = $rc;
701                 route(TOVOICEMAIL);
702                 t_newtran();
703                 switch ($var(rc)) {
704                         case -1:
705                         case -3:
706                                 send_reply("404", "Not Found");
707                                 exit;
708                         case -2:
709                                 send_reply("405", "Method Not Allowed");
710                                 exit;
711                 }
712         }
713
714         # when routing via usrloc, log the missed calls also
715         if (is_method("INVITE")) {
716                 setflag(FLT_ACCMISSED);
717         }
718 }
719
720 # Presence server route
721 route[PRESENCE] {
722         if(!is_method("PUBLISH|SUBSCRIBE"))
723                 return;
724
725 #!ifdef WITH_PRESENCE
726         if (!t_newtran()) {
727                 sl_reply_error();
728                 exit;
729         }
730
731         if(is_method("PUBLISH")) {
732                 handle_publish();
733                 t_release();
734         } else if( is_method("SUBSCRIBE")) {
735                 handle_subscribe();
736                 t_release();
737         }
738         exit;
739 #!endif
740         
741         # if presence enabled, this part will not be executed
742         if (is_method("PUBLISH") || $rU==$null) {
743                 sl_send_reply("404", "Not here");
744                 exit;
745         }
746         return;
747 }
748
749 # Authentication route
750 route[AUTH] {
751 #!ifdef WITH_AUTH
752
753 #!ifdef WITH_IPAUTH
754         if((!is_method("REGISTER")) && allow_source_address()) {
755                 # source IP allowed
756                 return;
757         }
758 #!endif
759
760         if (is_method("REGISTER") || from_uri==myself) {
761                 # authenticate requests
762                 if (!auth_check("$fd", "subscriber", "1")) {
763                         auth_challenge("$fd", "0");
764                         exit;
765                 }
766                 # user authenticated - remove auth header
767                 if(!is_method("REGISTER|PUBLISH"))
768                         consume_credentials();
769         }
770         # if caller is not local subscriber, then check if it calls
771         # a local destination, otherwise deny, not an open relay here
772         if (from_uri!=myself && uri!=myself) {
773                 sl_send_reply("403","Not relaying");
774                 exit;
775         }
776
777 #!endif
778         return;
779 }
780
781 # Caller NAT detection route
782 route[NATDETECT] {
783 #!ifdef WITH_NAT
784         force_rport();
785         if (nat_uac_test("19")) {
786                 if (is_method("REGISTER")) {
787                         fix_nated_register();
788                 } else {
789                         if(is_first_hop())
790                                 set_contact_alias();
791                 }
792                 setflag(FLT_NATS);
793         }
794 #!endif
795         return;
796 }
797
798 # RTPProxy control
799 route[NATMANAGE] {
800 #!ifdef WITH_NAT
801         if (is_request()) {
802                 if(has_totag()) {
803                         if(check_route_param("nat=yes")) {
804                                 setbflag(FLB_NATB);
805                         }
806                 }
807         }
808         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))
809                 return;
810
811         rtpproxy_manage("co");
812
813         if (is_request()) {
814                 if (!has_totag()) {
815                         if(t_is_branch_route()) {
816                                 add_rr_param(";nat=yes");
817                         }
818                 }
819         }
820         if (is_reply()) {
821                 if(isbflagset(FLB_NATB)) {
822                         if(is_first_hop())
823                                 set_contact_alias();
824                 }
825         }
826 #!endif
827         return;
828 }
829
830 # URI update for dialog requests
831 route[DLGURI] {
832 #!ifdef WITH_NAT
833         if(!isdsturiset()) {
834                 handle_ruri_alias();
835         }
836 #!endif
837         return;
838 }
839
840 # Routing to foreign domains
841 route[SIPOUT] {
842         if (uri==myself) return;
843
844         append_hf("P-hint: outbound\r\n");
845         route(RELAY);
846         exit;
847 }
848
849 # PSTN GW routing
850 route[PSTN] {
851 #!ifdef WITH_PSTN
852         # check if PSTN GW IP is defined
853         if (strempty($sel(cfg_get.pstn.gw_ip))) {
854                 xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
855                 return;
856         }
857
858         # route to PSTN dialed numbers starting with '+' or '00'
859         #     (international format)
860         # - update the condition to match your dialing rules for PSTN routing
861         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
862                 return;
863
864         # only local users allowed to call
865         if(from_uri!=myself) {
866                 sl_send_reply("403", "Not Allowed");
867                 exit;
868         }
869
870         if (strempty($sel(cfg_get.pstn.gw_port))) {
871                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
872         } else {
873                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
874                                         + $sel(cfg_get.pstn.gw_port);
875         }
876
877         route(RELAY);
878         exit;
879 #!endif
880
881         return;
882 }
883
884 # XMLRPC routing
885 #!ifdef WITH_XMLRPC
886 route[XMLRPC] {
887         # allow XMLRPC from localhost
888         if ((method=="POST" || method=="GET")
889                         && (src_ip==127.0.0.1)) {
890                 # close connection only for xmlrpclib user agents (there is a bug in
891                 # xmlrpclib: it waits for EOF before interpreting the response).
892                 if ($hdr(User-Agent) =~ "xmlrpclib")
893                         set_reply_close();
894                 set_reply_no_connect();
895                 dispatch_rpc();
896                 exit;
897         }
898         send_reply("403", "Forbidden");
899         exit;
900 }
901 #!endif
902
903 # Routing to voicemail server
904 route[TOVOICEMAIL] {
905 #!ifdef WITH_VOICEMAIL
906         if(!is_method("INVITE"))
907                 return;
908
909         # check if VoiceMail server IP is defined
910         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
911                 xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");
912                 return;
913         }
914         if($avp(oexten)==$null)
915                 return;
916
917         $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
918                                 + ":" + $sel(cfg_get.voicemail.srv_port);
919         route(RELAY);
920         exit;
921 #!endif
922
923         return;
924 }
925
926 # Manage outgoing branches
927 branch_route[MANAGE_BRANCH] {
928         xdbg("new branch [$T_branch_idx] to $ru\n");
929         route(NATMANAGE);
930 }
931
932 # Manage incoming replies
933 onreply_route[MANAGE_REPLY] {
934         xdbg("incoming reply\n");
935         if(status=~"[12][0-9][0-9]")
936                 route(NATMANAGE);
937 }
938
939 # Manage failure routing cases
940 failure_route[MANAGE_FAILURE] {
941         route(NATMANAGE);
942
943         if (t_is_canceled()) {
944                 exit;
945         }
946
947 #!ifdef WITH_BLOCK3XX
948         # block call redirect based on 3xx replies.
949         if (t_check_status("3[0-9][0-9]")) {
950                 t_reply("404","Not found");
951                 exit;
952         }
953 #!endif
954
955 #!ifdef WITH_VOICEMAIL
956         # serial forking
957         # - route to voicemail on busy or no answer (timeout)
958         if (t_check_status("486|408")) {
959                 route(TOVOICEMAIL);
960                 exit;
961         }
962 #!endif
963 }
964
965 # Handling HTTP events
966 #!ifdef WITH_XHTTP
967 event_route[xhttp:request] {
968 #!ifdef WITH_XHTTP_RPC
969         $var(xhttp_rpc_root) = $(hu{s.substr,0,9});
970         if ($var(xhttp_rpc_root) == "/http_rpc") {
971                 dispatch_xhttp_rpc();
972         }
973 #!endif
974 #!ifdef WITH_XHTTP_PI
975         $var(xhttp_rpc_root) = $(hu{s.substr,0,8});
976         if ($var(xhttp_rpc_root) == "/http_pi") {
977                 dispatch_xhttp_pi();
978         }
979 #!endif
980         xhttp_reply("200", "OK", "text/html",
981                 "<html><body>Wrong URL $hu</body></html>");
982 }
983 #!endif
984