b176b546431d6138a4a60a2bcf0463e863a35ecf
[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 "jsonrpcs.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 "acc.so"
242 loadmodule "counters.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 # ----- jsonrpcs params -----
295 modparam("jsonrpcs", "pretty_format", 1)
296 /* set the path to RPC fifo control file */
297 # modparam("jsonrpcs", "fifo_name", "/var/run/kamailio/kamailio_rpc.fifo")
298 /* set the path to RPC unix socket control file */
299 # modparam("jsonrpcs", "dgram_socket", "/var/run/kamailio/kamailio_rpc.sock")
300
301 # ----- ctl params -----
302 /* set the path to RPC unix socket control file */
303 # modparam("ctl", "binrpc", "unix:/var/run/kamailio/kamailio_ctl")
304
305 # ----- tm params -----
306 # auto-discard branches from previous serial forking leg
307 modparam("tm", "failure_reply_mode", 3)
308 # default retransmission timeout: 30sec
309 modparam("tm", "fr_timer", 30000)
310 # default invite retransmission timeout after 1xx: 120sec
311 modparam("tm", "fr_inv_timer", 120000)
312
313 # ----- rr params -----
314 # set next param to 1 to add value to ;lr param (helps with some UAs)
315 modparam("rr", "enable_full_lr", 0)
316 # do not append from tag to the RR (no need for this script)
317 modparam("rr", "append_fromtag", 0)
318
319 # ----- registrar params -----
320 modparam("registrar", "method_filtering", 1)
321 /* uncomment the next line to disable parallel forking via location */
322 # modparam("registrar", "append_branches", 0)
323 /* uncomment the next line not to allow more than 10 contacts per AOR */
324 # modparam("registrar", "max_contacts", 10)
325 /* max value for expires of registrations */
326 modparam("registrar", "max_expires", 3600)
327 /* set it to 1 to enable GRUU */
328 modparam("registrar", "gruu_enabled", 0)
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 # ----- usrloc params -----
357 /* enable DB persistency for location entries */
358 #!ifdef WITH_USRLOCDB
359 modparam("usrloc", "db_url", DBURL)
360 modparam("usrloc", "db_mode", 2)
361 modparam("usrloc", "use_domain", MULTIDOMAIN)
362 #!endif
363
364 # ----- auth_db params -----
365 #!ifdef WITH_AUTH
366 modparam("auth_db", "db_url", DBURL)
367 modparam("auth_db", "calculate_ha1", yes)
368 modparam("auth_db", "password_column", "password")
369 modparam("auth_db", "load_credentials", "")
370 modparam("auth_db", "use_domain", MULTIDOMAIN)
371
372 # ----- permissions params -----
373 #!ifdef WITH_IPAUTH
374 modparam("permissions", "db_url", DBURL)
375 modparam("permissions", "db_mode", 1)
376 #!endif
377
378 #!endif
379
380 # ----- alias_db params -----
381 #!ifdef WITH_ALIASDB
382 modparam("alias_db", "db_url", DBURL)
383 modparam("alias_db", "use_domain", MULTIDOMAIN)
384 #!endif
385
386 # ----- speeddial params -----
387 #!ifdef WITH_SPEEDDIAL
388 modparam("speeddial", "db_url", DBURL)
389 modparam("speeddial", "use_domain", MULTIDOMAIN)
390 #!endif
391
392 # ----- domain params -----
393 #!ifdef WITH_MULTIDOMAIN
394 modparam("domain", "db_url", DBURL)
395 /* register callback to match myself condition with domains list */
396 modparam("domain", "register_myself", 1)
397 #!endif
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 #!ifdef WITH_NAT
409 # ----- rtpproxy params -----
410 modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
411
412 # ----- nathelper params -----
413 modparam("nathelper", "natping_interval", 30)
414 modparam("nathelper", "ping_nated_only", 1)
415 modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
416 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
417
418 # params needed for NAT traversal in other modules
419 modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
420 modparam("usrloc", "nat_bflag", FLB_NATB)
421 #!endif
422
423 #!ifdef WITH_TLS
424 # ----- tls params -----
425 modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
426 #!endif
427
428 #!ifdef WITH_ANTIFLOOD
429 # ----- pike params -----
430 modparam("pike", "sampling_time_unit", 2)
431 modparam("pike", "reqs_density_per_unit", 16)
432 modparam("pike", "remove_latency", 4)
433
434 # ----- htable params -----
435 /* ip ban htable with autoexpire after 5 minutes */
436 modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
437 #!endif
438
439 #!ifdef WITH_XMLRPC
440 # ----- xmlrpc params -----
441 modparam("xmlrpc", "route", "XMLRPC");
442 modparam("xmlrpc", "url_match", "^/RPC")
443 #!endif
444
445 #!ifdef WITH_DEBUG
446 # ----- debugger params -----
447 modparam("debugger", "cfgtrace", 1)
448 modparam("debugger", "log_level_name", "exec")
449 #!endif
450
451 ####### Routing Logic ########
452
453
454 /* Main SIP request routing logic
455  * - processing of any incoming SIP request starts with this route
456  * - note: this is the same as route { ... } */
457 request_route {
458
459         # per request initial checks
460         route(REQINIT);
461
462         # NAT detection
463         route(NATDETECT);
464
465         # CANCEL processing
466         if (is_method("CANCEL")) {
467                 if (t_check_trans()) {
468                         route(RELAY);
469                 }
470                 exit;
471         }
472
473         # handle retransmissions
474         if (!is_method("ACK")) {
475                 if(t_precheck_trans()) {
476                         t_check_trans();
477                         exit;
478                 }
479                 t_check_trans();
480         }
481
482         # handle requests within SIP dialogs
483         route(WITHINDLG);
484
485         ### only initial requests (no To tag)
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
497         # account only INVITEs
498         if (is_method("INVITE")) {
499                 setflag(FLT_ACC); # do accounting
500         }
501
502         # dispatch requests to foreign domains
503         route(SIPOUT);
504
505         ### requests for my local domains
506
507         # handle presence related requests
508         route(PRESENCE);
509
510         # handle registrations
511         route(REGISTRAR);
512
513         if ($rU==$null) {
514                 # request with no Username in RURI
515                 sl_send_reply("484","Address Incomplete");
516                 exit;
517         }
518
519         # dispatch destinations to PSTN
520         route(PSTN);
521
522         # user location service
523         route(LOCATION);
524 }
525
526 # Wrapper for relaying requests
527 route[RELAY] {
528
529         # enable additional event routes for forwarded requests
530         # - serial forking, RTP relaying handling, a.s.o.
531         if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
532                 if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
533         }
534         if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
535                 if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
536         }
537         if (is_method("INVITE")) {
538                 if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
539         }
540
541         if (!t_relay()) {
542                 sl_reply_error();
543         }
544         exit;
545 }
546
547 # Per SIP request initial checks
548 route[REQINIT] {
549 #!ifdef WITH_ANTIFLOOD
550         # flood detection from same IP and traffic ban for a while
551         # be sure you exclude checking trusted peers, such as pstn gateways
552         # - local host excluded (e.g., loop to self)
553         if(src_ip!=myself) {
554                 if($sht(ipban=>$si)!=$null) {
555                         # ip is already blocked
556                         xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
557                         exit;
558                 }
559                 if (!pike_check_req()) {
560                         xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
561                         $sht(ipban=>$si) = 1;
562                         exit;
563                 }
564         }
565         if($ua =~ "friendly-scanner|sipcli") {
566                 # silent drop for scanners - uncomment next line if want to reply
567                 # sl_send_reply("200", "OK");
568                 exit;
569         }
570 #!endif
571
572         if (!mf_process_maxfwd_header("10")) {
573                 sl_send_reply("483","Too Many Hops");
574                 exit;
575         }
576
577         if(is_method("OPTIONS") && uri==myself && $rU==$null) {
578                 sl_send_reply("200","Keepalive");
579                 exit;
580         }
581
582         if(!sanity_check("1511", "7")) {
583                 xlog("Malformed SIP message from $si:$sp\n");
584                 exit;
585         }
586 }
587
588 # Handle requests within SIP dialogs
589 route[WITHINDLG] {
590         if (!has_totag()) return;
591
592         # sequential request withing a dialog should
593         # take the path determined by record-routing
594         if (loose_route()) {
595                 route(DLGURI);
596                 if (is_method("BYE")) {
597                         setflag(FLT_ACC); # do accounting ...
598                         setflag(FLT_ACCFAILED); # ... even if the transaction fails
599                 } else if ( is_method("ACK") ) {
600                         # ACK is forwarded statelessy
601                         route(NATMANAGE);
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         }
645         exit;
646 }
647
648 # User location service
649 route[LOCATION] {
650
651 #!ifdef WITH_SPEEDDIAL
652         # search for short dialing - 2-digit extension
653         if($rU=~"^[0-9][0-9]$") {
654                 if(sd_lookup("speed_dial")) {
655                         route(SIPOUT);
656                 }
657         }
658 #!endif
659
660 #!ifdef WITH_ALIASDB
661         # search in DB-based aliases
662         if(alias_db_lookup("dbaliases")) {
663                 route(SIPOUT);
664         }
665 #!endif
666
667         $avp(oexten) = $rU;
668         if (!lookup("location")) {
669                 $var(rc) = $rc;
670                 route(TOVOICEMAIL);
671                 t_newtran();
672                 switch ($var(rc)) {
673                         case -1:
674                         case -3:
675                                 send_reply("404", "Not Found");
676                                 exit;
677                         case -2:
678                                 send_reply("405", "Method Not Allowed");
679                                 exit;
680                 }
681         }
682
683         # when routing via usrloc, log the missed calls also
684         if (is_method("INVITE")) {
685                 setflag(FLT_ACCMISSED);
686         }
687
688         route(RELAY);
689         exit;
690 }
691
692 # Presence server processing
693 route[PRESENCE] {
694         if(!is_method("PUBLISH|SUBSCRIBE")) return;
695
696         if(is_method("SUBSCRIBE") && $hdr(Event)=="message-summary") {
697                 route(TOVOICEMAIL);
698                 # returns here if no voicemail server is configured
699                 sl_send_reply("404", "No voicemail service");
700                 exit;
701         }
702
703 #!ifdef WITH_PRESENCE
704         if (!t_newtran()) {
705                 sl_reply_error();
706                 exit;
707         }
708
709         if(is_method("PUBLISH")) {
710                 handle_publish();
711                 t_release();
712         } else if(is_method("SUBSCRIBE")) {
713                 handle_subscribe();
714                 t_release();
715         }
716         exit;
717 #!endif
718
719         # if presence enabled, this part will not be executed
720         if (is_method("PUBLISH") || $rU==$null) {
721                 sl_send_reply("404", "Not here");
722                 exit;
723         }
724         return;
725 }
726
727 # IP authorization and user authentication
728 route[AUTH] {
729 #!ifdef WITH_AUTH
730
731 #!ifdef WITH_IPAUTH
732         if((!is_method("REGISTER")) && allow_source_address()) {
733                 # source IP allowed
734                 return;
735         }
736 #!endif
737
738         if (is_method("REGISTER") || from_uri==myself) {
739                 # authenticate requests
740                 if (!auth_check("$fd", "subscriber", "1")) {
741                         auth_challenge("$fd", "0");
742                         exit;
743                 }
744                 # user authenticated - remove auth header
745                 if(!is_method("REGISTER|PUBLISH"))
746                         consume_credentials();
747         }
748         # if caller is not local subscriber, then check if it calls
749         # a local destination, otherwise deny, not an open relay here
750         if (from_uri!=myself && uri!=myself) {
751                 sl_send_reply("403","Not relaying");
752                 exit;
753         }
754
755 #!endif
756         return;
757 }
758
759 # Caller NAT detection
760 route[NATDETECT] {
761 #!ifdef WITH_NAT
762         force_rport();
763         if (nat_uac_test("19")) {
764                 if (is_method("REGISTER")) {
765                         fix_nated_register();
766                 } else {
767                         if(is_first_hop()) {
768                                 set_contact_alias();
769                         }
770                 }
771                 setflag(FLT_NATS);
772         }
773 #!endif
774         return;
775 }
776
777 # RTPProxy control and signaling updates for NAT traversal
778 route[NATMANAGE] {
779 #!ifdef WITH_NAT
780         if (is_request()) {
781                 if(has_totag()) {
782                         if(check_route_param("nat=yes")) {
783                                 setbflag(FLB_NATB);
784                         }
785                 }
786         }
787         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB))) return;
788
789         if(nat_uac_test("8")) {
790                 rtpproxy_manage("co");
791         } else {
792                 rtpproxy_manage("cor");
793         }
794
795         if (is_request()) {
796                 if (!has_totag()) {
797                         if(t_is_branch_route()) {
798                                 add_rr_param(";nat=yes");
799                         }
800                 }
801         }
802         if (is_reply()) {
803                 if(isbflagset(FLB_NATB)) {
804                         if(is_first_hop())
805                                 set_contact_alias();
806                 }
807         }
808 #!endif
809         return;
810 }
811
812 # URI update for dialog requests
813 route[DLGURI] {
814 #!ifdef WITH_NAT
815         if(!isdsturiset()) {
816                 handle_ruri_alias();
817         }
818 #!endif
819         return;
820 }
821
822 # Routing to foreign domains
823 route[SIPOUT] {
824         if (uri==myself) return;
825
826         append_hf("P-hint: outbound\r\n");
827         route(RELAY);
828         exit;
829 }
830
831 # PSTN GW routing
832 route[PSTN] {
833 #!ifdef WITH_PSTN
834         # check if PSTN GW IP is defined
835         if (strempty($sel(cfg_get.pstn.gw_ip))) {
836                 xlog("SCRIPT: PSTN routing enabled but pstn.gw_ip not defined\n");
837                 return;
838         }
839
840         # route to PSTN dialed numbers starting with '+' or '00'
841         #     (international format)
842         # - update the condition to match your dialing rules for PSTN routing
843         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$")) 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 # Routing to voicemail server
885 route[TOVOICEMAIL] {
886 #!ifdef WITH_VOICEMAIL
887         if(!is_method("INVITE|SUBSCRIBE")) return;
888
889         # check if VoiceMail server IP is defined
890         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
891                 xlog("SCRIPT: VoiceMail routing enabled but IP not defined\n");
892                 return;
893         }
894         if(is_method("INVITE")) {
895                 if($avp(oexten)==$null) return;
896
897                 $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
898                                 + ":" + $sel(cfg_get.voicemail.srv_port);
899         } else {
900                 if($rU==$null) return;
901
902                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.voicemail.srv_ip)
903                                 + ":" + $sel(cfg_get.voicemail.srv_port);
904         }
905         route(RELAY);
906         exit;
907 #!endif
908
909         return;
910 }
911
912 # Manage outgoing branches
913 branch_route[MANAGE_BRANCH] {
914         xdbg("new branch [$T_branch_idx] to $ru\n");
915         route(NATMANAGE);
916 }
917
918 # Manage incoming replies
919 onreply_route[MANAGE_REPLY] {
920         xdbg("incoming reply\n");
921         if(status=~"[12][0-9][0-9]") {
922                 route(NATMANAGE);
923         }
924 }
925
926 # Manage failure routing cases
927 failure_route[MANAGE_FAILURE] {
928         route(NATMANAGE);
929
930         if (t_is_canceled()) exit;
931
932 #!ifdef WITH_BLOCK3XX
933         # block call redirect based on 3xx replies.
934         if (t_check_status("3[0-9][0-9]")) {
935                 t_reply("404","Not found");
936                 exit;
937         }
938 #!endif
939
940 #!ifdef WITH_BLOCK401407
941         # block call redirect based on 401, 407 replies.
942         if (t_check_status("401|407")) {
943                 t_reply("404","Not found");
944                 exit;
945         }
946 #!endif
947
948 #!ifdef WITH_VOICEMAIL
949         # serial forking
950         # - route to voicemail on busy or no answer (timeout)
951         if (t_check_status("486|408")) {
952                 $du = $null;
953                 route(TOVOICEMAIL);
954                 exit;
955         }
956 #!endif
957 }