13bef88de1527c099fcb47672c8e4494fece0fd6
[sip-router] / etc / kamailio.cfg
1 #!KAMAILIO
2 #
3 # Kamailio (OpenSER) SIP Server v5.2 - default configuration script
4 #     - web: https://www.kamailio.org
5 #     - git: https://github.com/kamailio/kamailio
6 #
7 # Direct your questions about this file to: <sr-users@lists.kamailio.org>
8 #
9 # Refer to the Core CookBook at https://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 log_prefix="{$mt $hdr(CSeq) $ci} "
160
161 /* number of SIP routing processes */
162 children=8
163
164 /* uncomment the next line to disable TCP (default on) */
165 # disable_tcp=yes
166
167 /* uncomment the next line to disable the auto discovery of local aliases
168  * based on reverse DNS on IPs (default on) */
169 # auto_aliases=no
170
171 /* add local domain aliases */
172 # alias="sip.mydomain.com"
173
174 /* uncomment and configure the following line if you want Kamailio to
175  * bind on a specific interface/port/proto (default bind on all available) */
176 # listen=udp:10.0.0.10:5060
177
178 #!ifdef WITH_TLS
179 enable_tls=yes
180 #!endif
181
182 /* life time of TCP connection when there is no traffic
183  * - a bit higher than registration expires to cope with UA behind NAT */
184 tcp_connection_lifetime=3605
185
186 ####### Custom Parameters #########
187
188 /* These parameters can be modified runtime via RPC interface
189  * - see the documentation of 'cfg_rpc' module.
190  *
191  * Format: group.id = value 'desc' description
192  * Access: $sel(cfg_get.group.id) or @cfg_get.group.id */
193
194 #!ifdef WITH_PSTN
195 /* PSTN GW Routing
196  *
197  * - pstn.gw_ip: valid IP or hostname as string value, example:
198  * pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
199  *
200  * - by default is empty to avoid misrouting */
201 pstn.gw_ip = "" desc "PSTN GW Address"
202 pstn.gw_port = "" desc "PSTN GW Port"
203 #!endif
204
205 #!ifdef WITH_VOICEMAIL
206 /* VoiceMail Routing on offline, busy or no answer
207  *
208  * - by default Voicemail server IP is empty to avoid misrouting */
209 voicemail.srv_ip = "" desc "VoiceMail IP Address"
210 voicemail.srv_port = "5060" desc "VoiceMail Port"
211 #!endif
212
213 ####### Modules Section ########
214
215 /* set paths to location of modules */
216 # mpath="/usr/local/lib/kamailio/modules/"
217
218 #!ifdef WITH_MYSQL
219 loadmodule "db_mysql.so"
220 #!endif
221
222 loadmodule "jsonrpcs.so"
223 loadmodule "kex.so"
224 loadmodule "corex.so"
225 loadmodule "tm.so"
226 loadmodule "tmx.so"
227 loadmodule "sl.so"
228 loadmodule "rr.so"
229 loadmodule "pv.so"
230 loadmodule "maxfwd.so"
231 loadmodule "usrloc.so"
232 loadmodule "registrar.so"
233 loadmodule "textops.so"
234 loadmodule "siputils.so"
235 loadmodule "xlog.so"
236 loadmodule "sanity.so"
237 loadmodule "ctl.so"
238 loadmodule "cfg_rpc.so"
239 loadmodule "acc.so"
240 loadmodule "counters.so"
241
242 #!ifdef WITH_AUTH
243 loadmodule "auth.so"
244 loadmodule "auth_db.so"
245 #!ifdef WITH_IPAUTH
246 loadmodule "permissions.so"
247 #!endif
248 #!endif
249
250 #!ifdef WITH_ALIASDB
251 loadmodule "alias_db.so"
252 #!endif
253
254 #!ifdef WITH_SPEEDDIAL
255 loadmodule "speeddial.so"
256 #!endif
257
258 #!ifdef WITH_MULTIDOMAIN
259 loadmodule "domain.so"
260 #!endif
261
262 #!ifdef WITH_PRESENCE
263 loadmodule "presence.so"
264 loadmodule "presence_xml.so"
265 #!endif
266
267 #!ifdef WITH_NAT
268 loadmodule "nathelper.so"
269 loadmodule "rtpproxy.so"
270 #!endif
271
272 #!ifdef WITH_TLS
273 loadmodule "tls.so"
274 #!endif
275
276 #!ifdef WITH_ANTIFLOOD
277 loadmodule "htable.so"
278 loadmodule "pike.so"
279 #!endif
280
281 #!ifdef WITH_XMLRPC
282 loadmodule "xmlrpc.so"
283 #!endif
284
285 #!ifdef WITH_DEBUG
286 loadmodule "debugger.so"
287 #!endif
288
289 # ----------------- setting module-specific parameters ---------------
290
291
292 # ----- jsonrpcs params -----
293 modparam("jsonrpcs", "pretty_format", 1)
294 /* set the path to RPC fifo control file */
295 # modparam("jsonrpcs", "fifo_name", "/var/run/kamailio/kamailio_rpc.fifo")
296 /* set the path to RPC unix socket control file */
297 # modparam("jsonrpcs", "dgram_socket", "/var/run/kamailio/kamailio_rpc.sock")
298
299 # ----- ctl params -----
300 /* set the path to RPC unix socket control file */
301 # modparam("ctl", "binrpc", "unix:/var/run/kamailio/kamailio_ctl")
302
303 # ----- tm params -----
304 # auto-discard branches from previous serial forking leg
305 modparam("tm", "failure_reply_mode", 3)
306 # default retransmission timeout: 30sec
307 modparam("tm", "fr_timer", 30000)
308 # default invite retransmission timeout after 1xx: 120sec
309 modparam("tm", "fr_inv_timer", 120000)
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 # ----- registrar params -----
318 modparam("registrar", "method_filtering", 1)
319 /* uncomment the next line to disable parallel forking via location */
320 # modparam("registrar", "append_branches", 0)
321 /* uncomment the next line not to allow more than 10 contacts per AOR */
322 # modparam("registrar", "max_contacts", 10)
323 /* max value for expires of registrations */
324 modparam("registrar", "max_expires", 3600)
325 /* set it to 1 to enable GRUU */
326 modparam("registrar", "gruu_enabled", 0)
327
328 # ----- acc params -----
329 /* what special events should be accounted ? */
330 modparam("acc", "early_media", 0)
331 modparam("acc", "report_ack", 0)
332 modparam("acc", "report_cancels", 0)
333 /* by default ww do not adjust the direct of the sequential requests.
334  * if you enable this parameter, be sure the enable "append_fromtag"
335  * in "rr" module */
336 modparam("acc", "detect_direction", 0)
337 /* account triggers (flags) */
338 modparam("acc", "log_flag", FLT_ACC)
339 modparam("acc", "log_missed_flag", FLT_ACCMISSED)
340 modparam("acc", "log_extra",
341         "src_user=$fU;src_domain=$fd;src_ip=$si;"
342         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
343 modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
344 /* enhanced DB accounting */
345 #!ifdef WITH_ACCDB
346 modparam("acc", "db_flag", FLT_ACC)
347 modparam("acc", "db_missed_flag", FLT_ACCMISSED)
348 modparam("acc", "db_url", DBURL)
349 modparam("acc", "db_extra",
350         "src_user=$fU;src_domain=$fd;src_ip=$si;"
351         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
352 #!endif
353
354 # ----- usrloc params -----
355 /* enable DB persistency for location entries */
356 #!ifdef WITH_USRLOCDB
357 modparam("usrloc", "db_url", DBURL)
358 modparam("usrloc", "db_mode", 2)
359 modparam("usrloc", "use_domain", MULTIDOMAIN)
360 #!endif
361
362 # ----- auth_db params -----
363 #!ifdef WITH_AUTH
364 modparam("auth_db", "db_url", DBURL)
365 modparam("auth_db", "calculate_ha1", yes)
366 modparam("auth_db", "password_column", "password")
367 modparam("auth_db", "load_credentials", "")
368 modparam("auth_db", "use_domain", MULTIDOMAIN)
369
370 # ----- permissions params -----
371 #!ifdef WITH_IPAUTH
372 modparam("permissions", "db_url", DBURL)
373 modparam("permissions", "db_mode", 1)
374 #!endif
375
376 #!endif
377
378 # ----- alias_db params -----
379 #!ifdef WITH_ALIASDB
380 modparam("alias_db", "db_url", DBURL)
381 modparam("alias_db", "use_domain", MULTIDOMAIN)
382 #!endif
383
384 # ----- speeddial params -----
385 #!ifdef WITH_SPEEDDIAL
386 modparam("speeddial", "db_url", DBURL)
387 modparam("speeddial", "use_domain", MULTIDOMAIN)
388 #!endif
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 #!ifdef WITH_PRESENCE
398 # ----- presence params -----
399 modparam("presence", "db_url", DBURL)
400
401 # ----- presence_xml params -----
402 modparam("presence_xml", "db_url", DBURL)
403 modparam("presence_xml", "force_active", 1)
404 #!endif
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 #!ifdef WITH_TLS
422 # ----- tls params -----
423 modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
424 #!endif
425
426 #!ifdef WITH_ANTIFLOOD
427 # ----- pike params -----
428 modparam("pike", "sampling_time_unit", 2)
429 modparam("pike", "reqs_density_per_unit", 16)
430 modparam("pike", "remove_latency", 4)
431
432 # ----- htable params -----
433 /* ip ban htable with autoexpire after 5 minutes */
434 modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
435 #!endif
436
437 #!ifdef WITH_XMLRPC
438 # ----- xmlrpc params -----
439 modparam("xmlrpc", "route", "XMLRPC");
440 modparam("xmlrpc", "url_match", "^/RPC")
441 #!endif
442
443 #!ifdef WITH_DEBUG
444 # ----- debugger params -----
445 modparam("debugger", "cfgtrace", 1)
446 modparam("debugger", "log_level_name", "exec")
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                 if (t_check_trans()) {
466                         route(RELAY);
467                 }
468                 exit;
469         }
470
471         # handle retransmissions
472         if (!is_method("ACK")) {
473                 if(t_precheck_trans()) {
474                         t_check_trans();
475                         exit;
476                 }
477                 t_check_trans();
478         }
479
480         # handle requests within SIP dialogs
481         route(WITHINDLG);
482
483         ### only initial requests (no To tag)
484
485         # authentication
486         route(AUTH);
487
488         # record routing for dialog forming requests (in case they are routed)
489         # - remove preloaded route headers
490         remove_hf("Route");
491         if (is_method("INVITE|SUBSCRIBE")) {
492                 record_route();
493         }
494
495         # account only INVITEs
496         if (is_method("INVITE")) {
497                 setflag(FLT_ACC); # do accounting
498         }
499
500         # dispatch requests to foreign domains
501         route(SIPOUT);
502
503         ### requests for my local domains
504
505         # handle presence related requests
506         route(PRESENCE);
507
508         # handle registrations
509         route(REGISTRAR);
510
511         if ($rU==$null) {
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 # Wrapper for relaying requests
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 detection 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 #!endif
564         if($ua =~ "friendly-scanner|sipcli|VaxSIPUserAgent") {
565                 # silent drop for scanners - uncomment next line if want to reply
566                 # sl_send_reply("200", "OK");
567                 exit;
568         }
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                 } else if ( is_method("ACK") ) {
598                         # ACK is forwarded statelessly
599                         route(NATMANAGE);
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                 exit;
606         }
607
608         if (is_method("SUBSCRIBE") && uri == myself) {
609                 # in-dialog subscribe requests
610                 route(PRESENCE);
611                 exit;
612         }
613         if ( is_method("ACK") ) {
614                 if ( t_check_trans() ) {
615                         # no loose-route, but stateful ACK;
616                         # must be an ACK after a 487
617                         # or e.g. 404 from upstream server
618                         route(RELAY);
619                         exit;
620                 } else {
621                         # ACK without matching transaction ... ignore and discard
622                         exit;
623                 }
624         }
625         sl_send_reply("404","Not here");
626         exit;
627 }
628
629 # Handle SIP registrations
630 route[REGISTRAR] {
631         if (!is_method("REGISTER")) return;
632
633         if(isflagset(FLT_NATS)) {
634                 setbflag(FLB_NATB);
635 #!ifdef WITH_NATSIPPING
636                 # do SIP NAT pinging
637                 setbflag(FLB_NATSIPPING);
638 #!endif
639         }
640         if (!save("location")) {
641                 sl_reply_error();
642         }
643         exit;
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                 }
655         }
656 #!endif
657
658 #!ifdef WITH_ALIASDB
659         # search in DB-based aliases
660         if(alias_db_lookup("dbaliases")) {
661                 route(SIPOUT);
662         }
663 #!endif
664
665         $avp(oexten) = $rU;
666         if (!lookup("location")) {
667                 $var(rc) = $rc;
668                 route(TOVOICEMAIL);
669                 t_newtran();
670                 switch ($var(rc)) {
671                         case -1:
672                         case -3:
673                                 send_reply("404", "Not Found");
674                                 exit;
675                         case -2:
676                                 send_reply("405", "Method Not Allowed");
677                                 exit;
678                 }
679         }
680
681         # when routing via usrloc, log the missed calls also
682         if (is_method("INVITE")) {
683                 setflag(FLT_ACCMISSED);
684         }
685
686         route(RELAY);
687         exit;
688 }
689
690 # Presence server processing
691 route[PRESENCE] {
692         if(!is_method("PUBLISH|SUBSCRIBE")) return;
693
694         if(is_method("SUBSCRIBE") && $hdr(Event)=="message-summary") {
695                 route(TOVOICEMAIL);
696                 # returns here if no voicemail server is configured
697                 sl_send_reply("404", "No voicemail service");
698                 exit;
699         }
700
701 #!ifdef WITH_PRESENCE
702         if (!t_newtran()) {
703                 sl_reply_error();
704                 exit;
705         }
706
707         if(is_method("PUBLISH")) {
708                 handle_publish();
709                 t_release();
710         } else if(is_method("SUBSCRIBE")) {
711                 handle_subscribe();
712                 t_release();
713         }
714         exit;
715 #!endif
716
717         # if presence enabled, this part will not be executed
718         if (is_method("PUBLISH") || $rU==$null) {
719                 sl_send_reply("404", "Not here");
720                 exit;
721         }
722         return;
723 }
724
725 # IP authorization and user authentication
726 route[AUTH] {
727 #!ifdef WITH_AUTH
728
729 #!ifdef WITH_IPAUTH
730         if((!is_method("REGISTER")) && allow_source_address()) {
731                 # source IP allowed
732                 return;
733         }
734 #!endif
735
736         if (is_method("REGISTER") || from_uri==myself) {
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 #!else
754
755         # authentication not enabled - do not relay at all to foreign networks
756         if(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         # normalize target number for pstn gateway
858         # - convert leading 00 to +
859         if (starts_with("$rU", "00")) {
860                 strip(2);
861                 prefix("+");
862         }
863
864         if (strempty($sel(cfg_get.pstn.gw_port))) {
865                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
866         } else {
867                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
868                                         + $sel(cfg_get.pstn.gw_port);
869         }
870
871         route(RELAY);
872         exit;
873 #!endif
874
875         return;
876 }
877
878 # XMLRPC routing
879 #!ifdef WITH_XMLRPC
880 route[XMLRPC] {
881         # allow XMLRPC from localhost
882         if ((method=="POST" || method=="GET")
883                         && (src_ip==127.0.0.1)) {
884                 # close connection only for xmlrpclib user agents (there is a bug in
885                 # xmlrpclib: it waits for EOF before interpreting the response).
886                 if ($hdr(User-Agent) =~ "xmlrpclib")
887                         set_reply_close();
888                 set_reply_no_connect();
889                 dispatch_rpc();
890                 exit;
891         }
892         send_reply("403", "Forbidden");
893         exit;
894 }
895 #!endif
896
897 # Routing to voicemail server
898 route[TOVOICEMAIL] {
899 #!ifdef WITH_VOICEMAIL
900         if(!is_method("INVITE|SUBSCRIBE")) return;
901
902         # check if VoiceMail server IP is defined
903         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
904                 xlog("SCRIPT: VoiceMail routing enabled but IP not defined\n");
905                 return;
906         }
907         if(is_method("INVITE")) {
908                 if($avp(oexten)==$null) return;
909
910                 $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
911                                 + ":" + $sel(cfg_get.voicemail.srv_port);
912         } else {
913                 if($rU==$null) return;
914
915                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.voicemail.srv_ip)
916                                 + ":" + $sel(cfg_get.voicemail.srv_port);
917         }
918         route(RELAY);
919         exit;
920 #!endif
921
922         return;
923 }
924
925 # Manage outgoing branches
926 branch_route[MANAGE_BRANCH] {
927         xdbg("new branch [$T_branch_idx] to $ru\n");
928         route(NATMANAGE);
929 }
930
931 # Manage incoming replies
932 onreply_route[MANAGE_REPLY] {
933         xdbg("incoming reply\n");
934         if(status=~"[12][0-9][0-9]") {
935                 route(NATMANAGE);
936         }
937 }
938
939 # Manage failure routing cases
940 failure_route[MANAGE_FAILURE] {
941         route(NATMANAGE);
942
943         if (t_is_canceled()) exit;
944
945 #!ifdef WITH_BLOCK3XX
946         # block call redirect based on 3xx replies.
947         if (t_check_status("3[0-9][0-9]")) {
948                 t_reply("404","Not found");
949                 exit;
950         }
951 #!endif
952
953 #!ifdef WITH_BLOCK401407
954         # block call redirect based on 401, 407 replies.
955         if (t_check_status("401|407")) {
956                 t_reply("404","Not found");
957                 exit;
958         }
959 #!endif
960
961 #!ifdef WITH_VOICEMAIL
962         # serial forking
963         # - route to voicemail on busy or no answer (timeout)
964         if (t_check_status("486|408")) {
965                 $du = $null;
966                 route(TOVOICEMAIL);
967                 exit;
968         }
969 #!endif
970 }