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