cf8df43ae9247aff2455ea780893d992ff8d602e
[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 requests within SIP dialogs
474         route(WITHINDLG);
475
476         ### only initial requests (no To tag)
477
478         # handle retransmissions
479         if(t_precheck_trans()) {
480                 t_check_trans();
481                 exit;
482         }
483         t_check_trans();
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         if($ua =~ "friendly-scanner|sipcli") {
564                 # silent drop for scanners - uncomment next line if want to reply
565                 # sl_send_reply("200", "OK");
566                 exit;
567         }
568 #!endif
569
570         if (!mf_process_maxfwd_header("10")) {
571                 sl_send_reply("483","Too Many Hops");
572                 exit;
573         }
574
575         if(is_method("OPTIONS") && uri==myself && $rU==$null) {
576                 sl_send_reply("200","Keepalive");
577                 exit;
578         }
579
580         if(!sanity_check("1511", "7")) {
581                 xlog("Malformed SIP message from $si:$sp\n");
582                 exit;
583         }
584 }
585
586 # Handle requests within SIP dialogs
587 route[WITHINDLG] {
588         if (!has_totag()) return;
589
590         # sequential request withing a dialog should
591         # take the path determined by record-routing
592         if (loose_route()) {
593                 route(DLGURI);
594                 if (is_method("BYE")) {
595                         setflag(FLT_ACC); # do accounting ...
596                         setflag(FLT_ACCFAILED); # ... even if the transaction fails
597                 } else if ( is_method("ACK") ) {
598                         # ACK is forwarded statelessy
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 #!endif
754         return;
755 }
756
757 # Caller NAT detection
758 route[NATDETECT] {
759 #!ifdef WITH_NAT
760         force_rport();
761         if (nat_uac_test("19")) {
762                 if (is_method("REGISTER")) {
763                         fix_nated_register();
764                 } else {
765                         if(is_first_hop()) {
766                                 set_contact_alias();
767                         }
768                 }
769                 setflag(FLT_NATS);
770         }
771 #!endif
772         return;
773 }
774
775 # RTPProxy control and signaling updates for NAT traversal
776 route[NATMANAGE] {
777 #!ifdef WITH_NAT
778         if (is_request()) {
779                 if(has_totag()) {
780                         if(check_route_param("nat=yes")) {
781                                 setbflag(FLB_NATB);
782                         }
783                 }
784         }
785         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB))) return;
786
787         if(nat_uac_test("8")) {
788                 rtpproxy_manage("co");
789         } else {
790                 rtpproxy_manage("cor");
791         }
792
793         if (is_request()) {
794                 if (!has_totag()) {
795                         if(t_is_branch_route()) {
796                                 add_rr_param(";nat=yes");
797                         }
798                 }
799         }
800         if (is_reply()) {
801                 if(isbflagset(FLB_NATB)) {
802                         if(is_first_hop())
803                                 set_contact_alias();
804                 }
805         }
806 #!endif
807         return;
808 }
809
810 # URI update for dialog requests
811 route[DLGURI] {
812 #!ifdef WITH_NAT
813         if(!isdsturiset()) {
814                 handle_ruri_alias();
815         }
816 #!endif
817         return;
818 }
819
820 # Routing to foreign domains
821 route[SIPOUT] {
822         if (uri==myself) return;
823
824         append_hf("P-hint: outbound\r\n");
825         route(RELAY);
826         exit;
827 }
828
829 # PSTN GW routing
830 route[PSTN] {
831 #!ifdef WITH_PSTN
832         # check if PSTN GW IP is defined
833         if (strempty($sel(cfg_get.pstn.gw_ip))) {
834                 xlog("SCRIPT: PSTN routing enabled but pstn.gw_ip not defined\n");
835                 return;
836         }
837
838         # route to PSTN dialed numbers starting with '+' or '00'
839         #     (international format)
840         # - update the condition to match your dialing rules for PSTN routing
841         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$")) return;
842
843         # only local users allowed to call
844         if(from_uri!=myself) {
845                 sl_send_reply("403", "Not Allowed");
846                 exit;
847         }
848
849         if (strempty($sel(cfg_get.pstn.gw_port))) {
850                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
851         } else {
852                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
853                                         + $sel(cfg_get.pstn.gw_port);
854         }
855
856         route(RELAY);
857         exit;
858 #!endif
859
860         return;
861 }
862
863 # XMLRPC routing
864 #!ifdef WITH_XMLRPC
865 route[XMLRPC] {
866         # allow XMLRPC from localhost
867         if ((method=="POST" || method=="GET")
868                         && (src_ip==127.0.0.1)) {
869                 # close connection only for xmlrpclib user agents (there is a bug in
870                 # xmlrpclib: it waits for EOF before interpreting the response).
871                 if ($hdr(User-Agent) =~ "xmlrpclib")
872                         set_reply_close();
873                 set_reply_no_connect();
874                 dispatch_rpc();
875                 exit;
876         }
877         send_reply("403", "Forbidden");
878         exit;
879 }
880 #!endif
881
882 # Routing to voicemail server
883 route[TOVOICEMAIL] {
884 #!ifdef WITH_VOICEMAIL
885         if(!is_method("INVITE|SUBSCRIBE")) return;
886
887         # check if VoiceMail server IP is defined
888         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
889                 xlog("SCRIPT: VoiceMail routing enabled but IP not defined\n");
890                 return;
891         }
892         if(is_method("INVITE")) {
893                 if($avp(oexten)==$null) return;
894
895                 $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
896                                 + ":" + $sel(cfg_get.voicemail.srv_port);
897         } else {
898                 if($rU==$null) return;
899
900                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.voicemail.srv_ip)
901                                 + ":" + $sel(cfg_get.voicemail.srv_port);
902         }
903         route(RELAY);
904         exit;
905 #!endif
906
907         return;
908 }
909
910 # Manage outgoing branches
911 branch_route[MANAGE_BRANCH] {
912         xdbg("new branch [$T_branch_idx] to $ru\n");
913         route(NATMANAGE);
914 }
915
916 # Manage incoming replies
917 onreply_route[MANAGE_REPLY] {
918         xdbg("incoming reply\n");
919         if(status=~"[12][0-9][0-9]") {
920                 route(NATMANAGE);
921         }
922 }
923
924 # Manage failure routing cases
925 failure_route[MANAGE_FAILURE] {
926         route(NATMANAGE);
927
928         if (t_is_canceled()) exit;
929
930 #!ifdef WITH_BLOCK3XX
931         # block call redirect based on 3xx replies.
932         if (t_check_status("3[0-9][0-9]")) {
933                 t_reply("404","Not found");
934                 exit;
935         }
936 #!endif
937
938 #!ifdef WITH_BLOCK401407
939         # block call redirect based on 401, 407 replies.
940         if (t_check_status("401|407")) {
941                 t_reply("404","Not found");
942                 exit;
943         }
944 #!endif
945
946 #!ifdef WITH_VOICEMAIL
947         # serial forking
948         # - route to voicemail on busy or no answer (timeout)
949         if (t_check_status("486|408")) {
950                 $du = $null;
951                 route(TOVOICEMAIL);
952                 exit;
953         }
954 #!endif
955 }