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