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