examples, modules: fix common typo [skip ci]
[sip-router] / etc / kamailio-oob.cfg
1 #!KAMAILIO
2 #
3 # Kamailio (OpenSER) SIP Server v5.0 - 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"
227 #!else
228 mpath="/usr/local/lib/kamailio/modules/"
229 #!endif
230
231 #!ifdef WITH_MYSQL
232 loadmodule "db_mysql.so"
233 #!endif
234
235 loadmodule "jsonrpcs.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 "acc.so"
253 loadmodule "counters.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 # ----- jsonrpcs params -----
318 modparam("jsonrpcs", "pretty_format", 1)
319 /* set the path to RPC fifo control file */
320 # modparam("jsonrpcs", "fifo_name", "/var/run/kamailio/kamailio_rpc.fifo")
321 /* set the path to RPC unix socket control file */
322 # modparam("jsonrpcs", "dgram_socket", "/var/run/kamailio/kamailio_rpc.sock")
323
324
325 # ----- ctl params -----
326 #modparam("ctl", "binrpc", "unix:/var/run/kamailio/kamailio_ctl")
327
328
329 # ----- tm params -----
330 # auto-discard branches from previous serial forking leg
331 modparam("tm", "failure_reply_mode", 3)
332 # default retransmission timeout: 30sec
333 modparam("tm", "fr_timer", 30000)
334 # default invite retransmission timeout after 1xx: 120sec
335 modparam("tm", "fr_inv_timer", 120000)
336
337
338 # ----- rr params -----
339 # add value to ;lr param to cope with most of the UAs
340 modparam("rr", "enable_full_lr", 1)
341 # do not append from tag to the RR (no need for this script)
342 modparam("rr", "append_fromtag", 0)
343
344
345 # ----- registrar params -----
346 modparam("registrar", "method_filtering", 1)
347 /* uncomment the next line to disable parallel forking via location */
348 # modparam("registrar", "append_branches", 0)
349 /* uncomment the next line not to allow more than 10 contacts per AOR */
350 #modparam("registrar", "max_contacts", 10)
351 # max value for expires of registrations
352 modparam("registrar", "max_expires", 3600)
353 # set it to 1 to enable GRUU
354 modparam("registrar", "gruu_enabled", 0)
355
356
357 # ----- acc params -----
358 /* what special events should be accounted ? */
359 modparam("acc", "early_media", 0)
360 modparam("acc", "report_ack", 0)
361 modparam("acc", "report_cancels", 0)
362 /* by default ww do not adjust the direct of the sequential requests.
363    if you enable this parameter, be sure the enable "append_fromtag"
364    in "rr" module */
365 modparam("acc", "detect_direction", 0)
366 /* account triggers (flags) */
367 modparam("acc", "log_flag", FLT_ACC)
368 modparam("acc", "log_missed_flag", FLT_ACCMISSED)
369 modparam("acc", "log_extra", 
370         "src_user=$fU;src_domain=$fd;src_ip=$si;"
371         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
372 modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
373 /* enhanced DB accounting */
374 #!ifdef WITH_ACCDB
375 modparam("acc", "db_flag", FLT_ACC)
376 modparam("acc", "db_missed_flag", FLT_ACCMISSED)
377 modparam("acc", "db_url", DBURL)
378 modparam("acc", "db_extra",
379         "src_user=$fU;src_domain=$fd;src_ip=$si;"
380         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
381 #!endif
382
383
384 # ----- usrloc params -----
385 /* enable DB persistency for location entries */
386 #!ifdef WITH_USRLOCDB
387 modparam("usrloc", "db_url", DBURL)
388 modparam("usrloc", "db_mode", 2)
389 modparam("usrloc", "use_domain", MULTIDOMAIN)
390 #!endif
391
392
393 # ----- auth_db params -----
394 #!ifdef WITH_AUTH
395 modparam("auth_db", "db_url", DBURL)
396 modparam("auth_db", "calculate_ha1", yes)
397 modparam("auth_db", "password_column", "password")
398 modparam("auth_db", "load_credentials", "")
399 modparam("auth_db", "use_domain", MULTIDOMAIN)
400
401 # ----- permissions params -----
402 #!ifdef WITH_IPAUTH
403 modparam("permissions", "db_url", DBURL)
404 modparam("permissions", "db_mode", 1)
405 #!endif
406
407 #!endif
408
409
410 # ----- alias_db params -----
411 #!ifdef WITH_ALIASDB
412 modparam("alias_db", "db_url", DBURL)
413 modparam("alias_db", "use_domain", MULTIDOMAIN)
414 #!endif
415
416
417 # ----- speeddial params -----
418 #!ifdef WITH_SPEEDDIAL
419 modparam("speeddial", "db_url", DBURL)
420 modparam("speeddial", "use_domain", MULTIDOMAIN)
421 #!endif
422
423
424 # ----- domain params -----
425 #!ifdef WITH_MULTIDOMAIN
426 modparam("domain", "db_url", DBURL)
427 # register callback to match myself condition with domains list
428 modparam("domain", "register_myself", 1)
429 #!endif
430
431
432 #!ifdef WITH_PRESENCE
433 # ----- presence params -----
434 modparam("presence", "db_url", DBURL)
435
436 # ----- presence_xml params -----
437 modparam("presence_xml", "db_url", DBURL)
438 modparam("presence_xml", "force_active", 1)
439 #!endif
440
441
442 #!ifdef WITH_NAT
443 # ----- rtpproxy params -----
444 modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
445
446 # ----- nathelper params -----
447 modparam("nathelper", "natping_interval", 30)
448 modparam("nathelper", "ping_nated_only", 1)
449 modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
450 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
451
452 # params needed for NAT traversal in other modules
453 modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
454 modparam("usrloc", "nat_bflag", FLB_NATB)
455 #!endif
456
457
458 #!ifdef WITH_TLS
459 # ----- tls params -----
460 modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
461 #!endif
462
463 #!ifdef WITH_ANTIFLOOD
464 # ----- pike params -----
465 modparam("pike", "sampling_time_unit", 2)
466 modparam("pike", "reqs_density_per_unit", 16)
467 modparam("pike", "remove_latency", 4)
468
469 # ----- htable params -----
470 # ip ban htable with autoexpire after 5 minutes
471 modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
472 #!endif
473
474 #!ifdef WITH_XMLRPC
475 # ----- xmlrpc params -----
476 modparam("xmlrpc", "route", "XMLRPC");
477 modparam("xmlrpc", "url_match", "^/RPC")
478 #!endif
479
480 #!ifdef WITH_DEBUG
481 # ----- debugger params -----
482 modparam("debugger", "cfgtrace", 1)
483 #!endif
484
485 #!ifdef WITH_XHTTP_RPC
486 modparam("xhttp_rpc", "xhttp_rpc_root", "http_rpc")
487 #!endif
488
489 #!ifdef WITH_XHTTP_PI
490 modparam("xhttp_pi", "xhttp_pi_root", "http_pi")
491 modparam("xhttp_pi", "framework", "/usr/local/etc/kamailio/pi_framework.xml")
492 #!endif
493
494 ####### Routing Logic ########
495
496
497 # Main SIP request routing logic
498 # - processing of any incoming SIP request starts with this route
499 # - note: this is the same as route { ... }
500 request_route {
501
502         # per request initial checks
503         route(REQINIT);
504
505         # NAT detection
506         route(NATDETECT);
507
508         # CANCEL processing
509         if (is_method("CANCEL")) {
510                 if (t_check_trans())
511                         t_relay();
512                 exit;
513         }
514
515         # handle requests within SIP dialogs
516         route(WITHINDLG);
517
518         ### only initial requests (no To tag)
519
520         # handle retransmissions
521         if(t_precheck_trans()) {
522                 t_check_trans();
523                 exit;
524         }
525         t_check_trans();
526
527         # authentication
528         route(AUTH);
529
530         # record routing for dialog forming requests (in case they are routed)
531         # - remove preloaded route headers
532         remove_hf("Route");
533         if (is_method("INVITE|SUBSCRIBE"))
534                 record_route();
535
536         # account only INVITEs
537         if (is_method("INVITE")) {
538                 setflag(FLT_ACC); # do accounting
539         }
540
541         # dispatch requests to foreign domains
542         route(SIPOUT);
543
544         ### requests for my local domains
545
546         # handle presence related requests
547         route(PRESENCE);
548
549         # handle registrations
550         route(REGISTRAR);
551
552         if ($rU==$null) {
553                 # request with no Username in RURI
554                 sl_send_reply("484", "Address Incomplete");
555                 exit;
556         }
557
558         # dispatch destinations to PSTN
559         route(PSTN);
560
561         # user location service
562         route(LOCATION);
563
564         route(RELAY);
565 }
566
567
568 route[RELAY] {
569
570         # enable additional event routes for forwarded requests
571         # - serial forking, RTP relaying handling, a.s.o.
572         if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
573                 if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
574         }
575         if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
576                 if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
577         }
578         if (is_method("INVITE")) {
579                 if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
580         }
581
582         if (!t_relay()) {
583                 sl_reply_error();
584         }
585         exit;
586 }
587
588 # Per SIP request initial checks
589 route[REQINIT] {
590 #!ifdef WITH_ANTIFLOOD
591         # flood dection from same IP and traffic ban for a while
592         # be sure you exclude checking trusted peers, such as pstn gateways
593         # - local host excluded (e.g., loop to self)
594         if(src_ip!=myself) {
595                 if($sht(ipban=>$si)!=$null) {
596                         # ip is already blocked
597                         xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
598                         exit;
599                 }
600                 if (!pike_check_req()) {
601                         xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
602                         $sht(ipban=>$si) = 1;
603                         exit;
604                 }
605         }
606         if($ua =~ "friendly-scanner") {
607                 sl_send_reply("200", "OK");
608                 exit;
609         }
610 #!endif
611
612         if (!mf_process_maxfwd_header("10")) {
613                 sl_send_reply("483","Too Many Hops");
614                 exit;
615         }
616
617         if(is_method("OPTIONS") && uri==myself && $rU==$null) {
618                 sl_send_reply("200","Keepalive");
619                 exit;
620         }
621
622         if(!sanity_check("1511", "7")) {
623                 xlog("Malformed SIP message from $si:$sp\n");
624                 exit;
625         }
626 }
627
628 # Handle requests within SIP dialogs
629 route[WITHINDLG] {
630         if (!has_totag()) return;
631
632         # sequential request withing a dialog should
633         # take the path determined by record-routing
634         if (loose_route()) {
635                 route(DLGURI);
636                 if (is_method("BYE")) {
637                         setflag(FLT_ACC); # do accounting ...
638                         setflag(FLT_ACCFAILED); # ... even if the transaction fails
639                 }
640                 else if ( is_method("ACK") ) {
641                         # ACK is forwarded statelessly
642                         route(NATMANAGE);
643                 }
644                 else if ( is_method("NOTIFY") ) {
645                         # Add Record-Route for in-dialog NOTIFY as per RFC 6665.
646                         record_route();
647                 }
648                 route(RELAY);
649                 exit;
650         }
651
652         if (is_method("SUBSCRIBE") && uri == myself) {
653                 # in-dialog subscribe requests
654                 route(PRESENCE);
655                 exit;
656         }
657         if ( is_method("ACK") ) {
658                 if ( t_check_trans() ) {
659                         # no loose-route, but stateful ACK;
660                         # must be an ACK after a 487
661                         # or e.g. 404 from upstream server
662                         t_relay();
663                         exit;
664                 } else {
665                         # ACK without matching transaction ... ignore and discard
666                         exit;
667                 }
668         }
669         sl_send_reply("404", "Not here");
670         exit;
671 }
672
673 # Handle SIP registrations
674 route[REGISTRAR] {
675         if (!is_method("REGISTER")) return;
676
677         if(isflagset(FLT_NATS)) {
678                 setbflag(FLB_NATB);
679 #!ifdef WITH_NATSIPPING
680                 # do SIP NAT pinging
681                 setbflag(FLB_NATSIPPING);
682 #!endif
683         }
684         if (!save("location"))
685                 sl_reply_error();
686
687         exit;
688 }
689
690 # User location service
691 route[LOCATION] {
692
693 #!ifdef WITH_SPEEDDIAL
694         # search for short dialing - 2-digit extension
695         if($rU=~"^[0-9][0-9]$")
696                 if(sd_lookup("speed_dial"))
697                         route(SIPOUT);
698 #!endif
699
700 #!ifdef WITH_ALIASDB
701         # search in DB-based aliases
702         if(alias_db_lookup("dbaliases"))
703                 route(SIPOUT);
704 #!endif
705
706         $avp(oexten) = $rU;
707         if (!lookup("location")) {
708                 $var(rc) = $rc;
709                 route(TOVOICEMAIL);
710                 t_newtran();
711                 switch ($var(rc)) {
712                         case -1:
713                         case -3:
714                                 send_reply("404", "Not Found");
715                                 exit;
716                         case -2:
717                                 send_reply("405", "Method Not Allowed");
718                                 exit;
719                 }
720         }
721
722         # when routing via usrloc, log the missed calls also
723         if (is_method("INVITE")) {
724                 setflag(FLT_ACCMISSED);
725         }
726 }
727
728 # Presence server route
729 route[PRESENCE] {
730         if(!is_method("PUBLISH|SUBSCRIBE"))
731                 return;
732
733 #!ifdef WITH_PRESENCE
734         if (!t_newtran()) {
735                 sl_reply_error();
736                 exit;
737         }
738
739         if(is_method("PUBLISH")) {
740                 handle_publish();
741                 t_release();
742         } else if( is_method("SUBSCRIBE")) {
743                 handle_subscribe();
744                 t_release();
745         }
746         exit;
747 #!endif
748         
749         # if presence enabled, this part will not be executed
750         if (is_method("PUBLISH") || $rU==$null) {
751                 sl_send_reply("404", "Not here");
752                 exit;
753         }
754         return;
755 }
756
757 # Authentication route
758 route[AUTH] {
759 #!ifdef WITH_AUTH
760
761 #!ifdef WITH_IPAUTH
762         if((!is_method("REGISTER")) && allow_source_address()) {
763                 # source IP allowed
764                 return;
765         }
766 #!endif
767
768         if (is_method("REGISTER") || from_uri==myself) {
769                 # authenticate requests
770                 if (!auth_check("$fd", "subscriber", "1")) {
771                         auth_challenge("$fd", "0");
772                         exit;
773                 }
774                 # user authenticated - remove auth header
775                 if(!is_method("REGISTER|PUBLISH"))
776                         consume_credentials();
777         }
778         # if caller is not local subscriber, then check if it calls
779         # a local destination, otherwise deny, not an open relay here
780         if (from_uri!=myself && uri!=myself) {
781                 sl_send_reply("403","Not relaying");
782                 exit;
783         }
784
785 #!endif
786         return;
787 }
788
789 # Caller NAT detection route
790 route[NATDETECT] {
791 #!ifdef WITH_NAT
792         force_rport();
793         if (nat_uac_test("19")) {
794                 if (is_method("REGISTER")) {
795                         fix_nated_register();
796                 } else {
797                         if(is_first_hop())
798                                 set_contact_alias();
799                 }
800                 setflag(FLT_NATS);
801         }
802 #!endif
803         return;
804 }
805
806 # RTPProxy control
807 route[NATMANAGE] {
808 #!ifdef WITH_NAT
809         if (is_request()) {
810                 if(has_totag()) {
811                         if(check_route_param("nat=yes")) {
812                                 setbflag(FLB_NATB);
813                         }
814                 }
815         }
816         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))
817                 return;
818
819         rtpproxy_manage("co");
820
821         if (is_request()) {
822                 if (!has_totag()) {
823                         if(t_is_branch_route()) {
824                                 add_rr_param(";nat=yes");
825                         }
826                 }
827         }
828         if (is_reply()) {
829                 if(isbflagset(FLB_NATB)) {
830                         if(is_first_hop())
831                                 set_contact_alias();
832                 }
833         }
834 #!endif
835         return;
836 }
837
838 # URI update for dialog requests
839 route[DLGURI] {
840 #!ifdef WITH_NAT
841         if(!isdsturiset()) {
842                 handle_ruri_alias();
843         }
844 #!endif
845         return;
846 }
847
848 # Routing to foreign domains
849 route[SIPOUT] {
850         if (uri==myself) return;
851
852         append_hf("P-hint: outbound\r\n");
853         route(RELAY);
854         exit;
855 }
856
857 # PSTN GW routing
858 route[PSTN] {
859 #!ifdef WITH_PSTN
860         # check if PSTN GW IP is defined
861         if (strempty($sel(cfg_get.pstn.gw_ip))) {
862                 xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
863                 return;
864         }
865
866         # route to PSTN dialed numbers starting with '+' or '00'
867         #     (international format)
868         # - update the condition to match your dialing rules for PSTN routing
869         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
870                 return;
871
872         # only local users allowed to call
873         if(from_uri!=myself) {
874                 sl_send_reply("403", "Not Allowed");
875                 exit;
876         }
877
878         if (strempty($sel(cfg_get.pstn.gw_port))) {
879                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
880         } else {
881                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
882                                         + $sel(cfg_get.pstn.gw_port);
883         }
884
885         route(RELAY);
886         exit;
887 #!endif
888
889         return;
890 }
891
892 # XMLRPC routing
893 #!ifdef WITH_XMLRPC
894 route[XMLRPC] {
895         # allow XMLRPC from localhost
896         if ((method=="POST" || method=="GET")
897                         && (src_ip==127.0.0.1)) {
898                 # close connection only for xmlrpclib user agents (there is a bug in
899                 # xmlrpclib: it waits for EOF before interpreting the response).
900                 if ($hdr(User-Agent) =~ "xmlrpclib")
901                         set_reply_close();
902                 set_reply_no_connect();
903                 dispatch_rpc();
904                 exit;
905         }
906         send_reply("403", "Forbidden");
907         exit;
908 }
909 #!endif
910
911 # Routing to voicemail server
912 route[TOVOICEMAIL] {
913 #!ifdef WITH_VOICEMAIL
914         if(!is_method("INVITE"))
915                 return;
916
917         # check if VoiceMail server IP is defined
918         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
919                 xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");
920                 return;
921         }
922         if($avp(oexten)==$null)
923                 return;
924
925         $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
926                                 + ":" + $sel(cfg_get.voicemail.srv_port);
927         route(RELAY);
928         exit;
929 #!endif
930
931         return;
932 }
933
934 # Manage outgoing branches
935 branch_route[MANAGE_BRANCH] {
936         xdbg("new branch [$T_branch_idx] to $ru\n");
937         route(NATMANAGE);
938 }
939
940 # Manage incoming replies
941 onreply_route[MANAGE_REPLY] {
942         xdbg("incoming reply\n");
943         if(status=~"[12][0-9][0-9]")
944                 route(NATMANAGE);
945 }
946
947 # Manage failure routing cases
948 failure_route[MANAGE_FAILURE] {
949         route(NATMANAGE);
950
951         if (t_is_canceled()) {
952                 exit;
953         }
954
955 #!ifdef WITH_BLOCK3XX
956         # block call redirect based on 3xx replies.
957         if (t_check_status("3[0-9][0-9]")) {
958                 t_reply("404","Not found");
959                 exit;
960         }
961 #!endif
962
963 #!ifdef WITH_VOICEMAIL
964         # serial forking
965         # - route to voicemail on busy or no answer (timeout)
966         if (t_check_status("486|408")) {
967                 route(TOVOICEMAIL);
968                 exit;
969         }
970 #!endif
971 }
972
973 # Handling HTTP events
974 #!ifdef WITH_XHTTP
975 event_route[xhttp:request] {
976 #!ifdef WITH_XHTTP_RPC
977         $var(xhttp_rpc_root) = $(hu{s.substr,0,9});
978         if ($var(xhttp_rpc_root) == "/http_rpc") {
979                 dispatch_xhttp_rpc();
980         }
981 #!endif
982 #!ifdef WITH_XHTTP_PI
983         $var(xhttp_rpc_root) = $(hu{s.substr,0,8});
984         if ($var(xhttp_rpc_root) == "/http_pi") {
985                 dispatch_xhttp_pi();
986         }
987 #!endif
988         xhttp_reply("200", "OK", "text/html",
989                 "<html><body>Wrong URL $hu</body></html>");
990 }
991 #!endif
992