Merge pull request #195 from mslehto/clang-warning
[sip-router] / etc / kamailio.cfg
1 #!KAMAILIO
2 #
3 # Kamailio (OpenSER) SIP Server v4.3 - default configuration script
4 #     - web: http://www.kamailio.org
5 #     - git: http://sip-router.org
6 #
7 # Direct your questions about this file to: <sr-users@lists.sip-router.org>
8 #
9 # Refer to the Core CookBook at http://www.kamailio.org/wiki/
10 # for an explanation of possible statements, functions and parameters.
11 #
12 # Several features can be enabled using '#!define WITH_FEATURE' directives:
13 #
14 # *** To run in debug mode: 
15 #     - define WITH_DEBUG
16 #
17 # *** To enable mysql: 
18 #     - define WITH_MYSQL
19 #
20 # *** To enable authentication execute:
21 #     - enable mysql
22 #     - define WITH_AUTH
23 #     - add users using 'kamctl'
24 #
25 # *** To enable IP authentication execute:
26 #     - enable mysql
27 #     - enable authentication
28 #     - define WITH_IPAUTH
29 #     - add IP addresses with group id '1' to 'address' table
30 #
31 # *** To enable persistent user location execute:
32 #     - enable mysql
33 #     - define WITH_USRLOCDB
34 #
35 # *** To enable presence server execute:
36 #     - enable mysql
37 #     - define WITH_PRESENCE
38 #
39 # *** To enable nat traversal execute:
40 #     - define WITH_NAT
41 #     - install RTPProxy: http://www.rtpproxy.org
42 #     - start RTPProxy:
43 #        rtpproxy -l _your_public_ip_ -s udp:localhost:7722
44 #     - option for NAT SIP OPTIONS keepalives: WITH_NATSIPPING
45 #
46 # *** To enable PSTN gateway routing execute:
47 #     - define WITH_PSTN
48 #     - set the value of pstn.gw_ip
49 #     - check route[PSTN] for regexp routing condition
50 #
51 # *** To enable database aliases lookup execute:
52 #     - enable mysql
53 #     - define WITH_ALIASDB
54 #
55 # *** To enable speed dial lookup execute:
56 #     - enable mysql
57 #     - define WITH_SPEEDDIAL
58 #
59 # *** To enable multi-domain support execute:
60 #     - enable mysql
61 #     - define WITH_MULTIDOMAIN
62 #
63 # *** To enable TLS support execute:
64 #     - adjust CFGDIR/tls.cfg as needed
65 #     - define WITH_TLS
66 #
67 # *** To enable XMLRPC support execute:
68 #     - define WITH_XMLRPC
69 #     - adjust route[XMLRPC] for access policy
70 #
71 # *** To enable 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 fork=yes
151 children=4
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  * - can be specified more than once if needed to listen on many ports */
169 port=5060
170
171 #!ifdef WITH_TLS
172 enable_tls=yes
173 #!endif
174
175 # life time of TCP connection when there is no traffic
176 # - a bit higher than registration expires to cope with UA behind NAT
177 tcp_connection_lifetime=3605
178
179 ####### Custom Parameters #########
180
181 # These parameters can be modified runtime via RPC interface
182 # - see the documentation of 'cfg_rpc' module.
183 #
184 # Format: group.id = value 'desc' description
185 # Access: $sel(cfg_get.group.id) or @cfg_get.group.id
186 #
187
188 #!ifdef WITH_PSTN
189 # PSTN GW Routing
190 #
191 # - pstn.gw_ip: valid IP or hostname as string value, example:
192 # pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
193 #
194 # - by default is empty to avoid misrouting
195 pstn.gw_ip = "" desc "PSTN GW Address"
196 pstn.gw_port = "" desc "PSTN GW Port"
197 #!endif
198
199 #!ifdef WITH_VOICEMAIL
200 # VoiceMail Routing on offline, busy or no answer
201 #
202 # - by default Voicemail server IP is empty to avoid misrouting
203 voicemail.srv_ip = "" desc "VoiceMail IP Address"
204 voicemail.srv_port = "5060" desc "VoiceMail Port"
205 #!endif
206
207 ####### Modules Section ########
208
209 # set paths to location of modules (to sources or installation folders)
210 #!ifdef WITH_SRCPATH
211 mpath="modules/"
212 #!else
213 mpath="/usr/local/lib/kamailio/modules/"
214 #!endif
215
216 #!ifdef WITH_MYSQL
217 loadmodule "db_mysql.so"
218 #!endif
219
220 loadmodule "mi_fifo.so"
221 loadmodule "kex.so"
222 loadmodule "corex.so"
223 loadmodule "tm.so"
224 loadmodule "tmx.so"
225 loadmodule "sl.so"
226 loadmodule "rr.so"
227 loadmodule "pv.so"
228 loadmodule "maxfwd.so"
229 loadmodule "usrloc.so"
230 loadmodule "registrar.so"
231 loadmodule "textops.so"
232 loadmodule "siputils.so"
233 loadmodule "xlog.so"
234 loadmodule "sanity.so"
235 loadmodule "ctl.so"
236 loadmodule "cfg_rpc.so"
237 loadmodule "mi_rpc.so"
238 loadmodule "acc.so"
239
240 #!ifdef WITH_AUTH
241 loadmodule "auth.so"
242 loadmodule "auth_db.so"
243 #!ifdef WITH_IPAUTH
244 loadmodule "permissions.so"
245 #!endif
246 #!endif
247
248 #!ifdef WITH_ALIASDB
249 loadmodule "alias_db.so"
250 #!endif
251
252 #!ifdef WITH_SPEEDDIAL
253 loadmodule "speeddial.so"
254 #!endif
255
256 #!ifdef WITH_MULTIDOMAIN
257 loadmodule "domain.so"
258 #!endif
259
260 #!ifdef WITH_PRESENCE
261 loadmodule "presence.so"
262 loadmodule "presence_xml.so"
263 #!endif
264
265 #!ifdef WITH_NAT
266 loadmodule "nathelper.so"
267 loadmodule "rtpproxy.so"
268 #!endif
269
270 #!ifdef WITH_TLS
271 loadmodule "tls.so"
272 #!endif
273
274 #!ifdef WITH_ANTIFLOOD
275 loadmodule "htable.so"
276 loadmodule "pike.so"
277 #!endif
278
279 #!ifdef WITH_XMLRPC
280 loadmodule "xmlrpc.so"
281 #!endif
282
283 #!ifdef WITH_DEBUG
284 loadmodule "debugger.so"
285 #!endif
286
287 # ----------------- setting module-specific parameters ---------------
288
289
290 # ----- mi_fifo params -----
291 #modparam("mi_fifo", "fifo_name", "/var/run/kamailio/kamailio_fifo")
292
293 # ----- ctl params -----
294 #modparam("ctl", "binrpc", "unix:/var/run/kamailio/kamailio_ctl")
295
296 # ----- tm params -----
297 # auto-discard branches from previous serial forking leg
298 modparam("tm", "failure_reply_mode", 3)
299 # default retransmission timeout: 30sec
300 modparam("tm", "fr_timer", 30000)
301 # default invite retransmission timeout after 1xx: 120sec
302 modparam("tm", "fr_inv_timer", 120000)
303
304
305 # ----- rr params -----
306 # set next param to 1 to add value to ;lr param (helps with some UAs)
307 modparam("rr", "enable_full_lr", 0)
308 # do not append from tag to the RR (no need for this script)
309 modparam("rr", "append_fromtag", 0)
310
311
312 # ----- registrar params -----
313 modparam("registrar", "method_filtering", 1)
314 /* uncomment the next line to disable parallel forking via location */
315 # modparam("registrar", "append_branches", 0)
316 /* uncomment the next line not to allow more than 10 contacts per AOR */
317 #modparam("registrar", "max_contacts", 10)
318 # max value for expires of registrations
319 modparam("registrar", "max_expires", 3600)
320 # set it to 1 to enable GRUU
321 modparam("registrar", "gruu_enabled", 0)
322
323
324 # ----- acc params -----
325 /* what special events should be accounted ? */
326 modparam("acc", "early_media", 0)
327 modparam("acc", "report_ack", 0)
328 modparam("acc", "report_cancels", 0)
329 /* by default ww do not adjust the direct of the sequential requests.
330    if you enable this parameter, be sure the enable "append_fromtag"
331    in "rr" module */
332 modparam("acc", "detect_direction", 0)
333 /* account triggers (flags) */
334 modparam("acc", "log_flag", FLT_ACC)
335 modparam("acc", "log_missed_flag", FLT_ACCMISSED)
336 modparam("acc", "log_extra", 
337         "src_user=$fU;src_domain=$fd;src_ip=$si;"
338         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
339 modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
340 /* enhanced DB accounting */
341 #!ifdef WITH_ACCDB
342 modparam("acc", "db_flag", FLT_ACC)
343 modparam("acc", "db_missed_flag", FLT_ACCMISSED)
344 modparam("acc", "db_url", DBURL)
345 modparam("acc", "db_extra",
346         "src_user=$fU;src_domain=$fd;src_ip=$si;"
347         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
348 #!endif
349
350
351 # ----- usrloc params -----
352 /* enable DB persistency for location entries */
353 #!ifdef WITH_USRLOCDB
354 modparam("usrloc", "db_url", DBURL)
355 modparam("usrloc", "db_mode", 2)
356 modparam("usrloc", "use_domain", MULTIDOMAIN)
357 #!endif
358
359
360 # ----- auth_db params -----
361 #!ifdef WITH_AUTH
362 modparam("auth_db", "db_url", DBURL)
363 modparam("auth_db", "calculate_ha1", yes)
364 modparam("auth_db", "password_column", "password")
365 modparam("auth_db", "load_credentials", "")
366 modparam("auth_db", "use_domain", MULTIDOMAIN)
367
368 # ----- permissions params -----
369 #!ifdef WITH_IPAUTH
370 modparam("permissions", "db_url", DBURL)
371 modparam("permissions", "db_mode", 1)
372 #!endif
373
374 #!endif
375
376
377 # ----- alias_db params -----
378 #!ifdef WITH_ALIASDB
379 modparam("alias_db", "db_url", DBURL)
380 modparam("alias_db", "use_domain", MULTIDOMAIN)
381 #!endif
382
383
384 # ----- speeddial params -----
385 #!ifdef WITH_SPEEDDIAL
386 modparam("speeddial", "db_url", DBURL)
387 modparam("speeddial", "use_domain", MULTIDOMAIN)
388 #!endif
389
390
391 # ----- domain params -----
392 #!ifdef WITH_MULTIDOMAIN
393 modparam("domain", "db_url", DBURL)
394 # register callback to match myself condition with domains list
395 modparam("domain", "register_myself", 1)
396 #!endif
397
398
399 #!ifdef WITH_PRESENCE
400 # ----- presence params -----
401 modparam("presence", "db_url", DBURL)
402
403 # ----- presence_xml params -----
404 modparam("presence_xml", "db_url", DBURL)
405 modparam("presence_xml", "force_active", 1)
406 #!endif
407
408
409 #!ifdef WITH_NAT
410 # ----- rtpproxy params -----
411 modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
412
413 # ----- nathelper params -----
414 modparam("nathelper", "natping_interval", 30)
415 modparam("nathelper", "ping_nated_only", 1)
416 modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
417 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
418
419 # params needed for NAT traversal in other modules
420 modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
421 modparam("usrloc", "nat_bflag", FLB_NATB)
422 #!endif
423
424
425 #!ifdef WITH_TLS
426 # ----- tls params -----
427 modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
428 #!endif
429
430 #!ifdef WITH_ANTIFLOOD
431 # ----- pike params -----
432 modparam("pike", "sampling_time_unit", 2)
433 modparam("pike", "reqs_density_per_unit", 16)
434 modparam("pike", "remove_latency", 4)
435
436 # ----- htable params -----
437 # ip ban htable with autoexpire after 5 minutes
438 modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
439 #!endif
440
441 #!ifdef WITH_XMLRPC
442 # ----- xmlrpc params -----
443 modparam("xmlrpc", "route", "XMLRPC");
444 modparam("xmlrpc", "url_match", "^/RPC")
445 #!endif
446
447 #!ifdef WITH_DEBUG
448 # ----- debugger params -----
449 modparam("debugger", "cfgtrace", 1)
450 modparam("debugger", "log_level_name", "exec")
451 #!endif
452
453 ####### Routing Logic ########
454
455
456 # Main SIP request routing logic
457 # - processing of any incoming SIP request starts with this route
458 # - note: this is the same as route { ... }
459 request_route {
460
461         # per request initial checks
462         route(REQINIT);
463
464         # NAT detection
465         route(NATDETECT);
466
467         # CANCEL processing
468         if (is_method("CANCEL")) {
469                 if (t_check_trans()) {
470                         route(RELAY);
471                 }
472                 exit;
473         }
474
475         # handle requests within SIP dialogs
476         route(WITHINDLG);
477
478         ### only initial requests (no To tag)
479
480         # handle retransmissions
481         if(t_precheck_trans()) {
482                 t_check_trans();
483                 exit;
484         }
485         t_check_trans();
486
487         # authentication
488         route(AUTH);
489
490         # record routing for dialog forming requests (in case they are routed)
491         # - remove preloaded route headers
492         remove_hf("Route");
493         if (is_method("INVITE|SUBSCRIBE"))
494                 record_route();
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 dection 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") {
565                 sl_send_reply("200", "OK");
566                 exit;
567         }
568 #!endif
569
570         if (!mf_process_maxfwd_header("10")) {
571                 sl_send_reply("483","Too Many Hops");
572                 exit;
573         }
574
575         if(is_method("OPTIONS") && uri==myself && $rU==$null) {
576                 sl_send_reply("200","Keepalive");
577                 exit;
578         }
579
580         if(!sanity_check("1511", "7")) {
581                 xlog("Malformed SIP message from $si:$sp\n");
582                 exit;
583         }
584 }
585
586 # Handle requests within SIP dialogs
587 route[WITHINDLG] {
588         if (!has_totag()) return;
589
590         # sequential request withing a dialog should
591         # take the path determined by record-routing
592         if (loose_route()) {
593                 route(DLGURI);
594                 if (is_method("BYE")) {
595                         setflag(FLT_ACC); # do accounting ...
596                         setflag(FLT_ACCFAILED); # ... even if the transaction fails
597                 }
598                 else if ( is_method("ACK") ) {
599                         # ACK is forwarded statelessy
600                         route(NATMANAGE);
601                 }
602                 else if ( is_method("NOTIFY") ) {
603                         # Add Record-Route for in-dialog NOTIFY as per RFC 6665.
604                         record_route();
605                 }
606                 route(RELAY);
607                 exit;
608         }
609
610         if (is_method("SUBSCRIBE") && uri == myself) {
611                 # in-dialog subscribe requests
612                 route(PRESENCE);
613                 exit;
614         }
615         if ( is_method("ACK") ) {
616                 if ( t_check_trans() ) {
617                         # no loose-route, but stateful ACK;
618                         # must be an ACK after a 487
619                         # or e.g. 404 from upstream server
620                         route(RELAY);
621                         exit;
622                 } else {
623                         # ACK without matching transaction ... ignore and discard
624                         exit;
625                 }
626         }
627         sl_send_reply("404","Not here");
628         exit;
629 }
630
631 # Handle SIP registrations
632 route[REGISTRAR] {
633         if (!is_method("REGISTER")) return;
634
635         if(isflagset(FLT_NATS)) {
636                 setbflag(FLB_NATB);
637 #!ifdef WITH_NATSIPPING
638                 # do SIP NAT pinging
639                 setbflag(FLB_NATSIPPING);
640 #!endif
641         }
642         if (!save("location"))
643                 sl_reply_error();
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 #!endif
656
657 #!ifdef WITH_ALIASDB
658         # search in DB-based aliases
659         if(alias_db_lookup("dbaliases"))
660                 route(SIPOUT);
661 #!endif
662
663         $avp(oexten) = $rU;
664         if (!lookup("location")) {
665                 $var(rc) = $rc;
666                 route(TOVOICEMAIL);
667                 t_newtran();
668                 switch ($var(rc)) {
669                         case -1:
670                         case -3:
671                                 send_reply("404", "Not Found");
672                                 exit;
673                         case -2:
674                                 send_reply("405", "Method Not Allowed");
675                                 exit;
676                 }
677         }
678
679         # when routing via usrloc, log the missed calls also
680         if (is_method("INVITE")) {
681                 setflag(FLT_ACCMISSED);
682         }
683
684         route(RELAY);
685         exit;
686 }
687
688 # Presence server processing
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                 sl_reply_error();
703                 exit;
704         }
705
706         if(is_method("PUBLISH")) {
707                 handle_publish();
708                 t_release();
709         } else if(is_method("SUBSCRIBE")) {
710                 handle_subscribe();
711                 t_release();
712         }
713         exit;
714 #!endif
715         
716         # if presence enabled, this part will not be executed
717         if (is_method("PUBLISH") || $rU==$null) {
718                 sl_send_reply("404", "Not here");
719                 exit;
720         }
721         return;
722 }
723
724 # IP authorization and user uthentication
725 route[AUTH] {
726 #!ifdef WITH_AUTH
727
728 #!ifdef WITH_IPAUTH
729         if((!is_method("REGISTER")) && allow_source_address()) {
730                 # source IP allowed
731                 return;
732         }
733 #!endif
734
735         if (is_method("REGISTER") || from_uri==myself)
736         {
737                 # authenticate requests
738                 if (!auth_check("$fd", "subscriber", "1")) {
739                         auth_challenge("$fd", "0");
740                         exit;
741                 }
742                 # user authenticated - remove auth header
743                 if(!is_method("REGISTER|PUBLISH"))
744                         consume_credentials();
745         }
746         # if caller is not local subscriber, then check if it calls
747         # a local destination, otherwise deny, not an open relay here
748         if (from_uri!=myself && uri!=myself) {
749                 sl_send_reply("403","Not relaying");
750                 exit;
751         }
752
753 #!endif
754         return;
755 }
756
757 # Caller NAT detection
758 route[NATDETECT] {
759 #!ifdef WITH_NAT
760         force_rport();
761         if (nat_uac_test("19")) {
762                 if (is_method("REGISTER")) {
763                         fix_nated_register();
764                 } else {
765                         if(is_first_hop())
766                                 set_contact_alias();
767                 }
768                 setflag(FLT_NATS);
769         }
770 #!endif
771         return;
772 }
773
774 # RTPProxy control and singaling updates for NAT traversal
775 route[NATMANAGE] {
776 #!ifdef WITH_NAT
777         if (is_request()) {
778                 if(has_totag()) {
779                         if(check_route_param("nat=yes")) {
780                                 setbflag(FLB_NATB);
781                         }
782                 }
783         }
784         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))
785                 return;
786
787         rtpproxy_manage("co");
788
789         if (is_request()) {
790                 if (!has_totag()) {
791                         if(t_is_branch_route()) {
792                                 add_rr_param(";nat=yes");
793                         }
794                 }
795         }
796         if (is_reply()) {
797                 if(isbflagset(FLB_NATB)) {
798                         if(is_first_hop())
799                                 set_contact_alias();
800                 }
801         }
802 #!endif
803         return;
804 }
805
806 # URI update for dialog requests
807 route[DLGURI] {
808 #!ifdef WITH_NAT
809         if(!isdsturiset()) {
810                 handle_ruri_alias();
811         }
812 #!endif
813         return;
814 }
815
816 # Routing to foreign domains
817 route[SIPOUT] {
818         if (uri==myself) return;
819
820         append_hf("P-hint: outbound\r\n");
821         route(RELAY);
822         exit;
823 }
824
825 # PSTN GW routing
826 route[PSTN] {
827 #!ifdef WITH_PSTN
828         # check if PSTN GW IP is defined
829         if (strempty($sel(cfg_get.pstn.gw_ip))) {
830                 xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
831                 return;
832         }
833
834         # route to PSTN dialed numbers starting with '+' or '00'
835         #     (international format)
836         # - update the condition to match your dialing rules for PSTN routing
837         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
838                 return;
839
840         # only local users allowed to call
841         if(from_uri!=myself) {
842                 sl_send_reply("403", "Not Allowed");
843                 exit;
844         }
845
846         if (strempty($sel(cfg_get.pstn.gw_port))) {
847                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
848         } else {
849                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
850                                         + $sel(cfg_get.pstn.gw_port);
851         }
852
853         route(RELAY);
854         exit;
855 #!endif
856
857         return;
858 }
859
860 # XMLRPC routing
861 #!ifdef WITH_XMLRPC
862 route[XMLRPC] {
863         # allow XMLRPC from localhost
864         if ((method=="POST" || method=="GET")
865                         && (src_ip==127.0.0.1)) {
866                 # close connection only for xmlrpclib user agents (there is a bug in
867                 # xmlrpclib: it waits for EOF before interpreting the response).
868                 if ($hdr(User-Agent) =~ "xmlrpclib")
869                         set_reply_close();
870                 set_reply_no_connect();
871                 dispatch_rpc();
872                 exit;
873         }
874         send_reply("403", "Forbidden");
875         exit;
876 }
877 #!endif
878
879 # Routing to voicemail server
880 route[TOVOICEMAIL] {
881 #!ifdef WITH_VOICEMAIL
882         if(!is_method("INVITE|SUBSCRIBE"))
883                 return;
884
885         # check if VoiceMail server IP is defined
886         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
887                 xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");
888                 return;
889         }
890         if(is_method("INVITE")) {
891                 if($avp(oexten)==$null)
892                         return;
893                 $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
894                                 + ":" + $sel(cfg_get.voicemail.srv_port);
895         } else {
896                 if($rU==$null)
897                         return;
898                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.voicemail.srv_ip)
899                                 + ":" + $sel(cfg_get.voicemail.srv_port);
900         }
901         route(RELAY);
902         exit;
903 #!endif
904
905         return;
906 }
907
908 # Manage outgoing branches
909 branch_route[MANAGE_BRANCH] {
910         xdbg("new branch [$T_branch_idx] to $ru\n");
911         route(NATMANAGE);
912 }
913
914 # Manage incoming replies
915 onreply_route[MANAGE_REPLY] {
916         xdbg("incoming reply\n");
917         if(status=~"[12][0-9][0-9]")
918                 route(NATMANAGE);
919 }
920
921 # Manage failure routing cases
922 failure_route[MANAGE_FAILURE] {
923         route(NATMANAGE);
924
925         if (t_is_canceled()) {
926                 exit;
927         }
928
929 #!ifdef WITH_BLOCK3XX
930         # block call redirect based on 3xx replies.
931         if (t_check_status("3[0-9][0-9]")) {
932                 t_reply("404","Not found");
933                 exit;
934         }
935 #!endif
936
937 #!ifdef WITH_VOICEMAIL
938         # serial forking
939         # - route to voicemail on busy or no answer (timeout)
940         if (t_check_status("486|408")) {
941                 $du = $null;
942                 route(TOVOICEMAIL);
943                 exit;
944         }
945 #!endif
946 }