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