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