etc: removed mi modules from config files
[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
243 #!ifdef WITH_AUTH
244 loadmodule "auth.so"
245 loadmodule "auth_db.so"
246 #!ifdef WITH_IPAUTH
247 loadmodule "permissions.so"
248 #!endif
249 #!endif
250
251 #!ifdef WITH_ALIASDB
252 loadmodule "alias_db.so"
253 #!endif
254
255 #!ifdef WITH_SPEEDDIAL
256 loadmodule "speeddial.so"
257 #!endif
258
259 #!ifdef WITH_MULTIDOMAIN
260 loadmodule "domain.so"
261 #!endif
262
263 #!ifdef WITH_PRESENCE
264 loadmodule "presence.so"
265 loadmodule "presence_xml.so"
266 #!endif
267
268 #!ifdef WITH_NAT
269 loadmodule "nathelper.so"
270 loadmodule "rtpproxy.so"
271 #!endif
272
273 #!ifdef WITH_TLS
274 loadmodule "tls.so"
275 #!endif
276
277 #!ifdef WITH_ANTIFLOOD
278 loadmodule "htable.so"
279 loadmodule "pike.so"
280 #!endif
281
282 #!ifdef WITH_XMLRPC
283 loadmodule "xmlrpc.so"
284 #!endif
285
286 #!ifdef WITH_DEBUG
287 loadmodule "debugger.so"
288 #!endif
289
290 # ----------------- setting module-specific parameters ---------------
291
292
293 # ----- jsonrpcs params -----
294 modparam("jsonrpcs", "pretty_format", 1)
295 /* set the path to RPC fifo control file */
296 # modparam("jsonrpcs", "fifo_name", "/var/run/kamailio/kamailio_rpc.fifo")
297 /* set the path to RPC unix socket control file */
298 # modparam("jsonrpcs", "dgram_socket", "/var/run/kamailio/kamailio_rpc.sock")
299
300 # ----- ctl params -----
301 /* set the path to RPC unix socket control file */
302 # modparam("ctl", "binrpc", "unix:/var/run/kamailio/kamailio_ctl")
303
304 # ----- tm params -----
305 # auto-discard branches from previous serial forking leg
306 modparam("tm", "failure_reply_mode", 3)
307 # default retransmission timeout: 30sec
308 modparam("tm", "fr_timer", 30000)
309 # default invite retransmission timeout after 1xx: 120sec
310 modparam("tm", "fr_inv_timer", 120000)
311
312 # ----- rr params -----
313 # set next param to 1 to add value to ;lr param (helps with some UAs)
314 modparam("rr", "enable_full_lr", 0)
315 # do not append from tag to the RR (no need for this script)
316 modparam("rr", "append_fromtag", 0)
317
318 # ----- registrar params -----
319 modparam("registrar", "method_filtering", 1)
320 /* uncomment the next line to disable parallel forking via location */
321 # modparam("registrar", "append_branches", 0)
322 /* uncomment the next line not to allow more than 10 contacts per AOR */
323 # modparam("registrar", "max_contacts", 10)
324 /* max value for expires of registrations */
325 modparam("registrar", "max_expires", 3600)
326 /* set it to 1 to enable GRUU */
327 modparam("registrar", "gruu_enabled", 0)
328
329 # ----- acc params -----
330 /* what special events should be accounted ? */
331 modparam("acc", "early_media", 0)
332 modparam("acc", "report_ack", 0)
333 modparam("acc", "report_cancels", 0)
334 /* by default ww do not adjust the direct of the sequential requests.
335  * if you enable this parameter, be sure the enable "append_fromtag"
336  * in "rr" module */
337 modparam("acc", "detect_direction", 0)
338 /* account triggers (flags) */
339 modparam("acc", "log_flag", FLT_ACC)
340 modparam("acc", "log_missed_flag", FLT_ACCMISSED)
341 modparam("acc", "log_extra",
342         "src_user=$fU;src_domain=$fd;src_ip=$si;"
343         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
344 modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
345 /* enhanced DB accounting */
346 #!ifdef WITH_ACCDB
347 modparam("acc", "db_flag", FLT_ACC)
348 modparam("acc", "db_missed_flag", FLT_ACCMISSED)
349 modparam("acc", "db_url", DBURL)
350 modparam("acc", "db_extra",
351         "src_user=$fU;src_domain=$fd;src_ip=$si;"
352         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
353 #!endif
354
355 # ----- usrloc params -----
356 /* enable DB persistency for location entries */
357 #!ifdef WITH_USRLOCDB
358 modparam("usrloc", "db_url", DBURL)
359 modparam("usrloc", "db_mode", 2)
360 modparam("usrloc", "use_domain", MULTIDOMAIN)
361 #!endif
362
363 # ----- auth_db params -----
364 #!ifdef WITH_AUTH
365 modparam("auth_db", "db_url", DBURL)
366 modparam("auth_db", "calculate_ha1", yes)
367 modparam("auth_db", "password_column", "password")
368 modparam("auth_db", "load_credentials", "")
369 modparam("auth_db", "use_domain", MULTIDOMAIN)
370
371 # ----- permissions params -----
372 #!ifdef WITH_IPAUTH
373 modparam("permissions", "db_url", DBURL)
374 modparam("permissions", "db_mode", 1)
375 #!endif
376
377 #!endif
378
379 # ----- alias_db params -----
380 #!ifdef WITH_ALIASDB
381 modparam("alias_db", "db_url", DBURL)
382 modparam("alias_db", "use_domain", MULTIDOMAIN)
383 #!endif
384
385 # ----- speeddial params -----
386 #!ifdef WITH_SPEEDDIAL
387 modparam("speeddial", "db_url", DBURL)
388 modparam("speeddial", "use_domain", MULTIDOMAIN)
389 #!endif
390
391 # ----- domain params -----
392 #!ifdef WITH_MULTIDOMAIN
393 modparam("domain", "db_url", DBURL)
394 /* register callback to match myself condition with domains list */
395 modparam("domain", "register_myself", 1)
396 #!endif
397
398 #!ifdef WITH_PRESENCE
399 # ----- presence params -----
400 modparam("presence", "db_url", DBURL)
401
402 # ----- presence_xml params -----
403 modparam("presence_xml", "db_url", DBURL)
404 modparam("presence_xml", "force_active", 1)
405 #!endif
406
407 #!ifdef WITH_NAT
408 # ----- rtpproxy params -----
409 modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
410
411 # ----- nathelper params -----
412 modparam("nathelper", "natping_interval", 30)
413 modparam("nathelper", "ping_nated_only", 1)
414 modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
415 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
416
417 # params needed for NAT traversal in other modules
418 modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
419 modparam("usrloc", "nat_bflag", FLB_NATB)
420 #!endif
421
422 #!ifdef WITH_TLS
423 # ----- tls params -----
424 modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
425 #!endif
426
427 #!ifdef WITH_ANTIFLOOD
428 # ----- pike params -----
429 modparam("pike", "sampling_time_unit", 2)
430 modparam("pike", "reqs_density_per_unit", 16)
431 modparam("pike", "remove_latency", 4)
432
433 # ----- htable params -----
434 /* ip ban htable with autoexpire after 5 minutes */
435 modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
436 #!endif
437
438 #!ifdef WITH_XMLRPC
439 # ----- xmlrpc params -----
440 modparam("xmlrpc", "route", "XMLRPC");
441 modparam("xmlrpc", "url_match", "^/RPC")
442 #!endif
443
444 #!ifdef WITH_DEBUG
445 # ----- debugger params -----
446 modparam("debugger", "cfgtrace", 1)
447 modparam("debugger", "log_level_name", "exec")
448 #!endif
449
450 ####### Routing Logic ########
451
452
453 /* Main SIP request routing logic
454  * - processing of any incoming SIP request starts with this route
455  * - note: this is the same as route { ... } */
456 request_route {
457
458         # per request initial checks
459         route(REQINIT);
460
461         # NAT detection
462         route(NATDETECT);
463
464         # CANCEL processing
465         if (is_method("CANCEL")) {
466                 if (t_check_trans()) {
467                         route(RELAY);
468                 }
469                 exit;
470         }
471
472         # handle requests within SIP dialogs
473         route(WITHINDLG);
474
475         ### only initial requests (no To tag)
476
477         # handle retransmissions
478         if(t_precheck_trans()) {
479                 t_check_trans();
480                 exit;
481         }
482         t_check_trans();
483
484         # authentication
485         route(AUTH);
486
487         # record routing for dialog forming requests (in case they are routed)
488         # - remove preloaded route headers
489         remove_hf("Route");
490         if (is_method("INVITE|SUBSCRIBE")) {
491                 record_route();
492         }
493
494         # account only INVITEs
495         if (is_method("INVITE")) {
496                 setflag(FLT_ACC); # do accounting
497         }
498
499         # dispatch requests to foreign domains
500         route(SIPOUT);
501
502         ### requests for my local domains
503
504         # handle presence related requests
505         route(PRESENCE);
506
507         # handle registrations
508         route(REGISTRAR);
509
510         if ($rU==$null) {
511                 # request with no Username in RURI
512                 sl_send_reply("484","Address Incomplete");
513                 exit;
514         }
515
516         # dispatch destinations to PSTN
517         route(PSTN);
518
519         # user location service
520         route(LOCATION);
521 }
522
523 # Wrapper for relaying requests
524 route[RELAY] {
525
526         # enable additional event routes for forwarded requests
527         # - serial forking, RTP relaying handling, a.s.o.
528         if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
529                 if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
530         }
531         if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
532                 if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
533         }
534         if (is_method("INVITE")) {
535                 if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
536         }
537
538         if (!t_relay()) {
539                 sl_reply_error();
540         }
541         exit;
542 }
543
544 # Per SIP request initial checks
545 route[REQINIT] {
546 #!ifdef WITH_ANTIFLOOD
547         # flood detection from same IP and traffic ban for a while
548         # be sure you exclude checking trusted peers, such as pstn gateways
549         # - local host excluded (e.g., loop to self)
550         if(src_ip!=myself) {
551                 if($sht(ipban=>$si)!=$null) {
552                         # ip is already blocked
553                         xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
554                         exit;
555                 }
556                 if (!pike_check_req()) {
557                         xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
558                         $sht(ipban=>$si) = 1;
559                         exit;
560                 }
561         }
562         if($ua =~ "friendly-scanner|sipcli") {
563                 # silent drop for scanners - uncomment next line if want to reply
564                 # sl_send_reply("200", "OK");
565                 exit;
566         }
567 #!endif
568
569         if (!mf_process_maxfwd_header("10")) {
570                 sl_send_reply("483","Too Many Hops");
571                 exit;
572         }
573
574         if(is_method("OPTIONS") && uri==myself && $rU==$null) {
575                 sl_send_reply("200","Keepalive");
576                 exit;
577         }
578
579         if(!sanity_check("1511", "7")) {
580                 xlog("Malformed SIP message from $si:$sp\n");
581                 exit;
582         }
583 }
584
585 # Handle requests within SIP dialogs
586 route[WITHINDLG] {
587         if (!has_totag()) return;
588
589         # sequential request withing a dialog should
590         # take the path determined by record-routing
591         if (loose_route()) {
592                 route(DLGURI);
593                 if (is_method("BYE")) {
594                         setflag(FLT_ACC); # do accounting ...
595                         setflag(FLT_ACCFAILED); # ... even if the transaction fails
596                 } else if ( is_method("ACK") ) {
597                         # ACK is forwarded statelessy
598                         route(NATMANAGE);
599                 } else if ( is_method("NOTIFY") ) {
600                         # Add Record-Route for in-dialog NOTIFY as per RFC 6665.
601                         record_route();
602                 }
603                 route(RELAY);
604                 exit;
605         }
606
607         if (is_method("SUBSCRIBE") && uri == myself) {
608                 # in-dialog subscribe requests
609                 route(PRESENCE);
610                 exit;
611         }
612         if ( is_method("ACK") ) {
613                 if ( t_check_trans() ) {
614                         # no loose-route, but stateful ACK;
615                         # must be an ACK after a 487
616                         # or e.g. 404 from upstream server
617                         route(RELAY);
618                         exit;
619                 } else {
620                         # ACK without matching transaction ... ignore and discard
621                         exit;
622                 }
623         }
624         sl_send_reply("404","Not here");
625         exit;
626 }
627
628 # Handle SIP registrations
629 route[REGISTRAR] {
630         if (!is_method("REGISTER")) return;
631
632         if(isflagset(FLT_NATS)) {
633                 setbflag(FLB_NATB);
634 #!ifdef WITH_NATSIPPING
635                 # do SIP NAT pinging
636                 setbflag(FLB_NATSIPPING);
637 #!endif
638         }
639         if (!save("location")) {
640                 sl_reply_error();
641         }
642         exit;
643 }
644
645 # User location service
646 route[LOCATION] {
647
648 #!ifdef WITH_SPEEDDIAL
649         # search for short dialing - 2-digit extension
650         if($rU=~"^[0-9][0-9]$") {
651                 if(sd_lookup("speed_dial")) {
652                         route(SIPOUT);
653                 }
654         }
655 #!endif
656
657 #!ifdef WITH_ALIASDB
658         # search in DB-based aliases
659         if(alias_db_lookup("dbaliases")) {
660                 route(SIPOUT);
661         }
662 #!endif
663
664         $avp(oexten) = $rU;
665         if (!lookup("location")) {
666                 $var(rc) = $rc;
667                 route(TOVOICEMAIL);
668                 t_newtran();
669                 switch ($var(rc)) {
670                         case -1:
671                         case -3:
672                                 send_reply("404", "Not Found");
673                                 exit;
674                         case -2:
675                                 send_reply("405", "Method Not Allowed");
676                                 exit;
677                 }
678         }
679
680         # when routing via usrloc, log the missed calls also
681         if (is_method("INVITE")) {
682                 setflag(FLT_ACCMISSED);
683         }
684
685         route(RELAY);
686         exit;
687 }
688
689 # Presence server processing
690 route[PRESENCE] {
691         if(!is_method("PUBLISH|SUBSCRIBE")) return;
692
693         if(is_method("SUBSCRIBE") && $hdr(Event)=="message-summary") {
694                 route(TOVOICEMAIL);
695                 # returns here if no voicemail server is configured
696                 sl_send_reply("404", "No voicemail service");
697                 exit;
698         }
699
700 #!ifdef WITH_PRESENCE
701         if (!t_newtran()) {
702                 sl_reply_error();
703                 exit;
704         }
705
706         if(is_method("PUBLISH")) {
707                 handle_publish();
708                 t_release();
709         } else if(is_method("SUBSCRIBE")) {
710                 handle_subscribe();
711                 t_release();
712         }
713         exit;
714 #!endif
715
716         # if presence enabled, this part will not be executed
717         if (is_method("PUBLISH") || $rU==$null) {
718                 sl_send_reply("404", "Not here");
719                 exit;
720         }
721         return;
722 }
723
724 # IP authorization and user authentication
725 route[AUTH] {
726 #!ifdef WITH_AUTH
727
728 #!ifdef WITH_IPAUTH
729         if((!is_method("REGISTER")) && allow_source_address()) {
730                 # source IP allowed
731                 return;
732         }
733 #!endif
734
735         if (is_method("REGISTER") || from_uri==myself) {
736                 # authenticate requests
737                 if (!auth_check("$fd", "subscriber", "1")) {
738                         auth_challenge("$fd", "0");
739                         exit;
740                 }
741                 # user authenticated - remove auth header
742                 if(!is_method("REGISTER|PUBLISH"))
743                         consume_credentials();
744         }
745         # if caller is not local subscriber, then check if it calls
746         # a local destination, otherwise deny, not an open relay here
747         if (from_uri!=myself && uri!=myself) {
748                 sl_send_reply("403","Not relaying");
749                 exit;
750         }
751
752 #!endif
753         return;
754 }
755
756 # Caller NAT detection
757 route[NATDETECT] {
758 #!ifdef WITH_NAT
759         force_rport();
760         if (nat_uac_test("19")) {
761                 if (is_method("REGISTER")) {
762                         fix_nated_register();
763                 } else {
764                         if(is_first_hop()) {
765                                 set_contact_alias();
766                         }
767                 }
768                 setflag(FLT_NATS);
769         }
770 #!endif
771         return;
772 }
773
774 # RTPProxy control and signaling updates for NAT traversal
775 route[NATMANAGE] {
776 #!ifdef WITH_NAT
777         if (is_request()) {
778                 if(has_totag()) {
779                         if(check_route_param("nat=yes")) {
780                                 setbflag(FLB_NATB);
781                         }
782                 }
783         }
784         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB))) return;
785
786         if(nat_uac_test("8")) {
787                 rtpproxy_manage("co");
788         } else {
789                 rtpproxy_manage("cor");
790         }
791
792         if (is_request()) {
793                 if (!has_totag()) {
794                         if(t_is_branch_route()) {
795                                 add_rr_param(";nat=yes");
796                         }
797                 }
798         }
799         if (is_reply()) {
800                 if(isbflagset(FLB_NATB)) {
801                         if(is_first_hop())
802                                 set_contact_alias();
803                 }
804         }
805 #!endif
806         return;
807 }
808
809 # URI update for dialog requests
810 route[DLGURI] {
811 #!ifdef WITH_NAT
812         if(!isdsturiset()) {
813                 handle_ruri_alias();
814         }
815 #!endif
816         return;
817 }
818
819 # Routing to foreign domains
820 route[SIPOUT] {
821         if (uri==myself) return;
822
823         append_hf("P-hint: outbound\r\n");
824         route(RELAY);
825         exit;
826 }
827
828 # PSTN GW routing
829 route[PSTN] {
830 #!ifdef WITH_PSTN
831         # check if PSTN GW IP is defined
832         if (strempty($sel(cfg_get.pstn.gw_ip))) {
833                 xlog("SCRIPT: PSTN routing enabled but pstn.gw_ip not defined\n");
834                 return;
835         }
836
837         # route to PSTN dialed numbers starting with '+' or '00'
838         #     (international format)
839         # - update the condition to match your dialing rules for PSTN routing
840         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$")) return;
841
842         # only local users allowed to call
843         if(from_uri!=myself) {
844                 sl_send_reply("403", "Not Allowed");
845                 exit;
846         }
847
848         if (strempty($sel(cfg_get.pstn.gw_port))) {
849                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
850         } else {
851                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
852                                         + $sel(cfg_get.pstn.gw_port);
853         }
854
855         route(RELAY);
856         exit;
857 #!endif
858
859         return;
860 }
861
862 # XMLRPC routing
863 #!ifdef WITH_XMLRPC
864 route[XMLRPC] {
865         # allow XMLRPC from localhost
866         if ((method=="POST" || method=="GET")
867                         && (src_ip==127.0.0.1)) {
868                 # close connection only for xmlrpclib user agents (there is a bug in
869                 # xmlrpclib: it waits for EOF before interpreting the response).
870                 if ($hdr(User-Agent) =~ "xmlrpclib")
871                         set_reply_close();
872                 set_reply_no_connect();
873                 dispatch_rpc();
874                 exit;
875         }
876         send_reply("403", "Forbidden");
877         exit;
878 }
879 #!endif
880
881 # Routing to voicemail server
882 route[TOVOICEMAIL] {
883 #!ifdef WITH_VOICEMAIL
884         if(!is_method("INVITE|SUBSCRIBE")) return;
885
886         # check if VoiceMail server IP is defined
887         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
888                 xlog("SCRIPT: VoiceMail routing enabled but IP not defined\n");
889                 return;
890         }
891         if(is_method("INVITE")) {
892                 if($avp(oexten)==$null) return;
893
894                 $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
895                                 + ":" + $sel(cfg_get.voicemail.srv_port);
896         } else {
897                 if($rU==$null) return;
898
899                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.voicemail.srv_ip)
900                                 + ":" + $sel(cfg_get.voicemail.srv_port);
901         }
902         route(RELAY);
903         exit;
904 #!endif
905
906         return;
907 }
908
909 # Manage outgoing branches
910 branch_route[MANAGE_BRANCH] {
911         xdbg("new branch [$T_branch_idx] to $ru\n");
912         route(NATMANAGE);
913 }
914
915 # Manage incoming replies
916 onreply_route[MANAGE_REPLY] {
917         xdbg("incoming reply\n");
918         if(status=~"[12][0-9][0-9]") {
919                 route(NATMANAGE);
920         }
921 }
922
923 # Manage failure routing cases
924 failure_route[MANAGE_FAILURE] {
925         route(NATMANAGE);
926
927         if (t_is_canceled()) exit;
928
929 #!ifdef WITH_BLOCK3XX
930         # block call redirect based on 3xx replies.
931         if (t_check_status("3[0-9][0-9]")) {
932                 t_reply("404","Not found");
933                 exit;
934         }
935 #!endif
936
937 #!ifdef WITH_BLOCK401407
938         # block call redirect based on 401, 407 replies.
939         if (t_check_status("401|407")) {
940                 t_reply("404","Not found");
941                 exit;
942         }
943 #!endif
944
945 #!ifdef WITH_VOICEMAIL
946         # serial forking
947         # - route to voicemail on busy or no answer (timeout)
948         if (t_check_status("486|408")) {
949                 $du = $null;
950                 route(TOVOICEMAIL);
951                 exit;
952         }
953 #!endif
954 }