Merge branch 'master' of ssh://git.sip-router.org/sip-router into carstenbock/db_cass...
[sip-router] / etc / kamailio.cfg
1 #!KAMAILIO
2 #
3 # Kamailio (OpenSER) SIP Server v4.2 - 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 #
45 # *** To enable PSTN gateway routing execute:
46 #     - define WITH_PSTN
47 #     - set the value of pstn.gw_ip
48 #     - check route[PSTN] for regexp routing condition
49 #
50 # *** To enable database aliases lookup execute:
51 #     - enable mysql
52 #     - define WITH_ALIASDB
53 #
54 # *** To enable speed dial lookup execute:
55 #     - enable mysql
56 #     - define WITH_SPEEDDIAL
57 #
58 # *** To enable multi-domain support execute:
59 #     - enable mysql
60 #     - define WITH_MULTIDOMAIN
61 #
62 # *** To enable TLS support execute:
63 #     - adjust CFGDIR/tls.cfg as needed
64 #     - define WITH_TLS
65 #
66 # *** To enable XMLRPC support execute:
67 #     - define WITH_XMLRPC
68 #     - adjust route[XMLRPC] for access policy
69 #
70 # *** To enable anti-flood detection execute:
71 #     - adjust pike and htable=>ipban settings as needed (default is
72 #       block if more than 16 requests in 2 seconds and ban for 300 seconds)
73 #     - define WITH_ANTIFLOOD
74 #
75 # *** To block 3XX redirect replies execute:
76 #     - define WITH_BLOCK3XX
77 #
78 # *** To enable VoiceMail routing execute:
79 #     - define WITH_VOICEMAIL
80 #     - set the value of voicemail.srv_ip
81 #     - adjust the value of voicemail.srv_port
82 #
83 # *** To enhance accounting execute:
84 #     - enable mysql
85 #     - define WITH_ACCDB
86 #     - add following columns to database
87 #!ifdef ACCDB_COMMENT
88   ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
89   ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
90   ALTER TABLE acc ADD COLUMN src_ip varchar(64) NOT NULL default '';
91   ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
92   ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
93   ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
94   ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
95   ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
96   ALTER TABLE missed_calls ADD COLUMN src_ip varchar(64) NOT NULL default '';
97   ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
98   ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
99   ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
100 #!endif
101
102 ####### Include Local Config If Exists #########
103 import_file "kamailio-local.cfg"
104
105 ####### Defined Values #########
106
107 # *** Value defines - IDs used later in config
108 #!ifdef WITH_MYSQL
109 # - database URL - used to connect to database server by modules such
110 #       as: auth_db, acc, usrloc, a.s.o.
111 #!ifndef DBURL
112 #!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"
113 #!endif
114 #!endif
115 #!ifdef WITH_MULTIDOMAIN
116 # - the value for 'use_domain' parameters
117 #!define MULTIDOMAIN 1
118 #!else
119 #!define MULTIDOMAIN 0
120 #!endif
121
122 # - flags
123 #   FLT_ - per transaction (message) flags
124 #       FLB_ - per branch flags
125 #!define FLT_ACC 1
126 #!define FLT_ACCMISSED 2
127 #!define FLT_ACCFAILED 3
128 #!define FLT_NATS 5
129
130 #!define FLB_NATB 6
131 #!define FLB_NATSIPPING 7
132
133 ####### Global Parameters #########
134
135 ### LOG Levels: 3=DBG, 2=INFO, 1=NOTICE, 0=WARN, -1=ERR
136 #!ifdef WITH_DEBUG
137 debug=4
138 log_stderror=yes
139 #!else
140 debug=2
141 log_stderror=no
142 #!endif
143
144 memdbg=5
145 memlog=5
146
147 log_facility=LOG_LOCAL0
148
149 fork=yes
150 children=4
151
152 /* uncomment the next line to disable TCP (default on) */
153 #disable_tcp=yes
154
155 /* uncomment the next line to disable the auto discovery of local aliases
156    based on reverse DNS on IPs (default on) */
157 #auto_aliases=no
158
159 /* add local domain aliases */
160 #alias="sip.mydomain.com"
161
162 /* uncomment and configure the following line if you want Kamailio to 
163    bind on a specific interface/port/proto (default bind on all available) */
164 #listen=udp:10.0.0.10:5060
165
166 /* port to listen to
167  * - can be specified more than once if needed to listen on many ports */
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", "/tmp/kamailio_fifo")
291
292
293 # ----- tm params -----
294 # auto-discard branches from previous serial forking leg
295 modparam("tm", "failure_reply_mode", 3)
296 # default retransmission timeout: 30sec
297 modparam("tm", "fr_timer", 30000)
298 # default invite retransmission timeout after 1xx: 120sec
299 modparam("tm", "fr_inv_timer", 120000)
300
301
302 # ----- rr params -----
303 # set next param to 1 to add value to ;lr param (helps with some UAs)
304 modparam("rr", "enable_full_lr", 0)
305 # do not append from tag to the RR (no need for this script)
306 modparam("rr", "append_fromtag", 0)
307
308
309 # ----- registrar params -----
310 modparam("registrar", "method_filtering", 1)
311 /* uncomment the next line to disable parallel forking via location */
312 # modparam("registrar", "append_branches", 0)
313 /* uncomment the next line not to allow more than 10 contacts per AOR */
314 #modparam("registrar", "max_contacts", 10)
315 # max value for expires of registrations
316 modparam("registrar", "max_expires", 3600)
317 # set it to 1 to enable GRUU
318 modparam("registrar", "gruu_enabled", 0)
319
320
321 # ----- acc params -----
322 /* what special events should be accounted ? */
323 modparam("acc", "early_media", 0)
324 modparam("acc", "report_ack", 0)
325 modparam("acc", "report_cancels", 0)
326 /* by default ww do not adjust the direct of the sequential requests.
327    if you enable this parameter, be sure the enable "append_fromtag"
328    in "rr" module */
329 modparam("acc", "detect_direction", 0)
330 /* account triggers (flags) */
331 modparam("acc", "log_flag", FLT_ACC)
332 modparam("acc", "log_missed_flag", FLT_ACCMISSED)
333 modparam("acc", "log_extra", 
334         "src_user=$fU;src_domain=$fd;src_ip=$si;"
335         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
336 modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
337 /* enhanced DB accounting */
338 #!ifdef WITH_ACCDB
339 modparam("acc", "db_flag", FLT_ACC)
340 modparam("acc", "db_missed_flag", FLT_ACCMISSED)
341 modparam("acc", "db_url", DBURL)
342 modparam("acc", "db_extra",
343         "src_user=$fU;src_domain=$fd;src_ip=$si;"
344         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
345 #!endif
346
347
348 # ----- usrloc params -----
349 /* enable DB persistency for location entries */
350 #!ifdef WITH_USRLOCDB
351 modparam("usrloc", "db_url", DBURL)
352 modparam("usrloc", "db_mode", 2)
353 modparam("usrloc", "use_domain", MULTIDOMAIN)
354 #!endif
355
356
357 # ----- auth_db params -----
358 #!ifdef WITH_AUTH
359 modparam("auth_db", "db_url", DBURL)
360 modparam("auth_db", "calculate_ha1", yes)
361 modparam("auth_db", "password_column", "password")
362 modparam("auth_db", "load_credentials", "")
363 modparam("auth_db", "use_domain", MULTIDOMAIN)
364
365 # ----- permissions params -----
366 #!ifdef WITH_IPAUTH
367 modparam("permissions", "db_url", DBURL)
368 modparam("permissions", "db_mode", 1)
369 #!endif
370
371 #!endif
372
373
374 # ----- alias_db params -----
375 #!ifdef WITH_ALIASDB
376 modparam("alias_db", "db_url", DBURL)
377 modparam("alias_db", "use_domain", MULTIDOMAIN)
378 #!endif
379
380
381 # ----- speeddial params -----
382 #!ifdef WITH_SPEEDDIAL
383 modparam("speeddial", "db_url", DBURL)
384 modparam("speeddial", "use_domain", MULTIDOMAIN)
385 #!endif
386
387
388 # ----- domain params -----
389 #!ifdef WITH_MULTIDOMAIN
390 modparam("domain", "db_url", DBURL)
391 # register callback to match myself condition with domains list
392 modparam("domain", "register_myself", 1)
393 #!endif
394
395
396 #!ifdef WITH_PRESENCE
397 # ----- presence params -----
398 modparam("presence", "db_url", DBURL)
399
400 # ----- presence_xml params -----
401 modparam("presence_xml", "db_url", DBURL)
402 modparam("presence_xml", "force_active", 1)
403 #!endif
404
405
406 #!ifdef WITH_NAT
407 # ----- rtpproxy params -----
408 modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
409
410 # ----- nathelper params -----
411 modparam("nathelper", "natping_interval", 30)
412 modparam("nathelper", "ping_nated_only", 1)
413 modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
414 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
415
416 # params needed for NAT traversal in other modules
417 modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
418 modparam("usrloc", "nat_bflag", FLB_NATB)
419 #!endif
420
421
422 #!ifdef WITH_TLS
423 # ----- tls params -----
424 modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
425 #!endif
426
427 #!ifdef WITH_ANTIFLOOD
428 # ----- pike params -----
429 modparam("pike", "sampling_time_unit", 2)
430 modparam("pike", "reqs_density_per_unit", 16)
431 modparam("pike", "remove_latency", 4)
432
433 # ----- htable params -----
434 # ip ban htable with autoexpire after 5 minutes
435 modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
436 #!endif
437
438 #!ifdef WITH_XMLRPC
439 # ----- xmlrpc params -----
440 modparam("xmlrpc", "route", "XMLRPC");
441 modparam("xmlrpc", "url_match", "^/RPC")
442 #!endif
443
444 #!ifdef WITH_DEBUG
445 # ----- debugger params -----
446 modparam("debugger", "cfgtrace", 1)
447 #!endif
448
449 ####### Routing Logic ########
450
451
452 # Main SIP request routing logic
453 # - processing of any incoming SIP request starts with this route
454 # - note: this is the same as route { ... }
455 request_route {
456
457         # per request initial checks
458         route(REQINIT);
459
460         # NAT detection
461         route(NATDETECT);
462
463         # CANCEL processing
464         if (is_method("CANCEL"))
465         {
466                 if (t_check_trans()) {
467                         route(RELAY);
468                 }
469                 exit;
470         }
471
472         # handle requests within SIP dialogs
473         route(WITHINDLG);
474
475         ### only initial requests (no To tag)
476
477         # handle retransmissions
478         if(t_precheck_trans()) {
479                 t_check_trans();
480                 exit;
481         }
482         t_check_trans();
483
484         # authentication
485         route(AUTH);
486
487         # record routing for dialog forming requests (in case they are routed)
488         # - remove preloaded route headers
489         remove_hf("Route");
490         if (is_method("INVITE|SUBSCRIBE"))
491                 record_route();
492
493         # account only INVITEs
494         if (is_method("INVITE"))
495         {
496                 setflag(FLT_ACC); # do accounting
497         }
498
499         # dispatch requests to foreign domains
500         route(SIPOUT);
501
502         ### requests for my local domains
503
504         # handle presence related requests
505         route(PRESENCE);
506
507         # handle registrations
508         route(REGISTRAR);
509
510         if ($rU==$null)
511         {
512                 # request with no Username in RURI
513                 sl_send_reply("484","Address Incomplete");
514                 exit;
515         }
516
517         # dispatch destinations to PSTN
518         route(PSTN);
519
520         # user location service
521         route(LOCATION);
522 }
523
524
525 route[RELAY] {
526
527         # enable additional event routes for forwarded requests
528         # - serial forking, RTP relaying handling, a.s.o.
529         if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
530                 if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
531         }
532         if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
533                 if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
534         }
535         if (is_method("INVITE")) {
536                 if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
537         }
538
539         if (!t_relay()) {
540                 sl_reply_error();
541         }
542         exit;
543 }
544
545 # Per SIP request initial checks
546 route[REQINIT] {
547 #!ifdef WITH_ANTIFLOOD
548         # flood dection from same IP and traffic ban for a while
549         # be sure you exclude checking trusted peers, such as pstn gateways
550         # - local host excluded (e.g., loop to self)
551         if(src_ip!=myself) {
552                 if($sht(ipban=>$si)!=$null) {
553                         # ip is already blocked
554                         xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
555                         exit;
556                 }
557                 if (!pike_check_req()) {
558                         xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
559                         $sht(ipban=>$si) = 1;
560                         exit;
561                 }
562         }
563         if($ua =~ "friendly-scanner") {
564                 sl_send_reply("200", "OK");
565                 exit;
566         }
567 #!endif
568
569         if (!mf_process_maxfwd_header("10")) {
570                 sl_send_reply("483","Too Many Hops");
571                 exit;
572         }
573
574         if(is_method("OPTIONS") && uri==myself && $rU==$null) {
575                 sl_send_reply("200","Keepalive");
576                 exit;
577         }
578
579         if(!sanity_check("1511", "7")) {
580                 xlog("Malformed SIP message from $si:$sp\n");
581                 exit;
582         }
583 }
584
585 # Handle requests within SIP dialogs
586 route[WITHINDLG] {
587         if (has_totag()) {
588                 # sequential request withing a dialog should
589                 # take the path determined by record-routing
590                 if (loose_route()) {
591                         route(DLGURI);
592                         if (is_method("BYE")) {
593                                 setflag(FLT_ACC); # do accounting ...
594                                 setflag(FLT_ACCFAILED); # ... even if the transaction fails
595                         }
596                         else if ( is_method("ACK") ) {
597                                 # ACK is forwarded statelessy
598                                 route(NATMANAGE);
599                         }
600                         else if ( is_method("NOTIFY") ) {
601                                 # Add Record-Route for in-dialog NOTIFY as per RFC 6665.
602                                 record_route();
603                         }
604                         route(RELAY);
605                 } else {
606                         if (is_method("SUBSCRIBE") && uri == myself) {
607                                 # in-dialog subscribe requests
608                                 route(PRESENCE);
609                                 exit;
610                         }
611                         if ( is_method("ACK") ) {
612                                 if ( t_check_trans() ) {
613                                         # no loose-route, but stateful ACK;
614                                         # must be an ACK after a 487
615                                         # or e.g. 404 from upstream server
616                                         route(RELAY);
617                                         exit;
618                                 } else {
619                                         # ACK without matching transaction ... ignore and discard
620                                         exit;
621                                 }
622                         }
623                         sl_send_reply("404","Not here");
624                 }
625                 exit;
626         }
627 }
628
629 # Handle SIP registrations
630 route[REGISTRAR] {
631         if (is_method("REGISTER"))
632         {
633                 if(isflagset(FLT_NATS))
634                 {
635                         setbflag(FLB_NATB);
636                         # uncomment next line to do SIP NAT pinging 
637                         ## setbflag(FLB_NATSIPPING);
638                 }
639                 if (!save("location"))
640                         sl_reply_error();
641
642                 exit;
643         }
644 }
645
646 # USER location service
647 route[LOCATION] {
648
649 #!ifdef WITH_SPEEDDIAL
650         # search for short dialing - 2-digit extension
651         if($rU=~"^[0-9][0-9]$")
652                 if(sd_lookup("speed_dial"))
653                         route(SIPOUT);
654 #!endif
655
656 #!ifdef WITH_ALIASDB
657         # search in DB-based aliases
658         if(alias_db_lookup("dbaliases"))
659                 route(SIPOUT);
660 #!endif
661
662         $avp(oexten) = $rU;
663         if (!lookup("location")) {
664                 $var(rc) = $rc;
665                 route(TOVOICEMAIL);
666                 t_newtran();
667                 switch ($var(rc)) {
668                         case -1:
669                         case -3:
670                                 send_reply("404", "Not Found");
671                                 exit;
672                         case -2:
673                                 send_reply("405", "Method Not Allowed");
674                                 exit;
675                 }
676         }
677
678         # when routing via usrloc, log the missed calls also
679         if (is_method("INVITE"))
680         {
681                 setflag(FLT_ACCMISSED);
682         }
683
684         route(RELAY);
685         exit;
686 }
687
688 # Presence server route
689 route[PRESENCE] {
690         if(!is_method("PUBLISH|SUBSCRIBE"))
691                 return;
692
693         if(is_method("SUBSCRIBE") && $hdr(Event)=="message-summary") {
694                 route(TOVOICEMAIL);
695                 # returns here if no voicemail server is configured
696                 sl_send_reply("404", "No voicemail service");
697                 exit;
698         }
699
700 #!ifdef WITH_PRESENCE
701         if (!t_newtran())
702         {
703                 sl_reply_error();
704                 exit;
705         }
706
707         if(is_method("PUBLISH"))
708         {
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         {
721                 sl_send_reply("404", "Not here");
722                 exit;
723         }
724         return;
725 }
726
727 # Authentication route
728 route[AUTH] {
729 #!ifdef WITH_AUTH
730
731 #!ifdef WITH_IPAUTH
732         if((!is_method("REGISTER")) && allow_source_address())
733         {
734                 # source IP allowed
735                 return;
736         }
737 #!endif
738
739         if (is_method("REGISTER") || from_uri==myself)
740         {
741                 # authenticate requests
742                 if (!auth_check("$fd", "subscriber", "1")) {
743                         auth_challenge("$fd", "0");
744                         exit;
745                 }
746                 # user authenticated - remove auth header
747                 if(!is_method("REGISTER|PUBLISH"))
748                         consume_credentials();
749         }
750         # if caller is not local subscriber, then check if it calls
751         # a local destination, otherwise deny, not an open relay here
752         if (from_uri!=myself && uri!=myself)
753         {
754                 sl_send_reply("403","Not relaying");
755                 exit;
756         }
757
758 #!endif
759         return;
760 }
761
762 # Caller NAT detection route
763 route[NATDETECT] {
764 #!ifdef WITH_NAT
765         force_rport();
766         if (nat_uac_test("19")) {
767                 if (is_method("REGISTER")) {
768                         fix_nated_register();
769                 } else {
770                         if(is_first_hop())
771                                 set_contact_alias();
772                 }
773                 setflag(FLT_NATS);
774         }
775 #!endif
776         return;
777 }
778
779 # RTPProxy control
780 route[NATMANAGE] {
781 #!ifdef WITH_NAT
782         if (is_request()) {
783                 if(has_totag()) {
784                         if(check_route_param("nat=yes")) {
785                                 setbflag(FLB_NATB);
786                         }
787                 }
788         }
789         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))
790                 return;
791
792         rtpproxy_manage("co");
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)
824         {
825                 append_hf("P-hint: outbound\r\n");
826                 route(RELAY);
827         }
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 rotuing 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}$"))
843                 return;
844
845         # only local users allowed to call
846         if(from_uri!=myself) {
847                 sl_send_reply("403", "Not Allowed");
848                 exit;
849         }
850
851         if (strempty($sel(cfg_get.pstn.gw_port))) {
852                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
853         } else {
854                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
855                                         + $sel(cfg_get.pstn.gw_port);
856         }
857
858         route(RELAY);
859         exit;
860 #!endif
861
862         return;
863 }
864
865 # XMLRPC routing
866 #!ifdef WITH_XMLRPC
867 route[XMLRPC] {
868         # allow XMLRPC from localhost
869         if ((method=="POST" || method=="GET")
870                         && (src_ip==127.0.0.1)) {
871                 # close connection only for xmlrpclib user agents (there is a bug in
872                 # xmlrpclib: it waits for EOF before interpreting the response).
873                 if ($hdr(User-Agent) =~ "xmlrpclib")
874                         set_reply_close();
875                 set_reply_no_connect();
876                 dispatch_rpc();
877                 exit;
878         }
879         send_reply("403", "Forbidden");
880         exit;
881 }
882 #!endif
883
884 # route to voicemail server
885 route[TOVOICEMAIL] {
886 #!ifdef WITH_VOICEMAIL
887         if(!is_method("INVITE|SUBSCRIBE"))
888                 return;
889
890         # check if VoiceMail server IP is defined
891         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
892                 xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");
893                 return;
894         }
895         if(is_method("INVITE")) {
896                 if($avp(oexten)==$null)
897                         return;
898                 $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
899                                 + ":" + $sel(cfg_get.voicemail.srv_port);
900         } else {
901                 if($rU==$null)
902                         return;
903                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.voicemail.srv_ip)
904                                 + ":" + $sel(cfg_get.voicemail.srv_port);
905         }
906         route(RELAY);
907         exit;
908 #!endif
909
910         return;
911 }
912
913 # manage outgoing branches
914 branch_route[MANAGE_BRANCH] {
915         xdbg("new branch [$T_branch_idx] to $ru\n");
916         route(NATMANAGE);
917 }
918
919 # manage incoming replies
920 onreply_route[MANAGE_REPLY] {
921         xdbg("incoming reply\n");
922         if(status=~"[12][0-9][0-9]")
923                 route(NATMANAGE);
924 }
925
926 # manage failure routing cases
927 failure_route[MANAGE_FAILURE] {
928         route(NATMANAGE);
929
930         if (t_is_canceled()) {
931                 exit;
932         }
933
934 #!ifdef WITH_BLOCK3XX
935         # block call redirect based on 3xx replies.
936         if (t_check_status("3[0-9][0-9]")) {
937                 t_reply("404","Not found");
938                 exit;
939         }
940 #!endif
941
942 #!ifdef WITH_VOICEMAIL
943         # serial forking
944         # - route to voicemail on busy or no answer (timeout)
945         if (t_check_status("486|408")) {
946                 $du = $null;
947                 route(TOVOICEMAIL);
948                 exit;
949         }
950 #!endif
951 }