kamailio.cfg: route subscribe for event message-summary to voicemail server
[sip-router] / etc / kamailio.cfg
1 #!KAMAILIO
2 #
3 # Kamailio (OpenSER) SIP Server v4.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 # Several features can be enabled using '#!define WITH_FEATURE' directives:
13 #
14 # *** To run in debug mode: 
15 #     - define WITH_DEBUG
16 #
17 # *** To enable mysql: 
18 #     - define WITH_MYSQL
19 #
20 # *** To enable authentication execute:
21 #     - enable mysql
22 #     - define WITH_AUTH
23 #     - add users using 'kamctl'
24 #
25 # *** To enable IP authentication execute:
26 #     - enable mysql
27 #     - enable authentication
28 #     - define WITH_IPAUTH
29 #     - add IP addresses with group id '1' to 'address' table
30 #
31 # *** To enable persistent user location execute:
32 #     - enable mysql
33 #     - define WITH_USRLOCDB
34 #
35 # *** To enable presence server execute:
36 #     - enable mysql
37 #     - define WITH_PRESENCE
38 #
39 # *** To enable nat traversal execute:
40 #     - define WITH_NAT
41 #     - install RTPProxy: http://www.rtpproxy.org
42 #     - start RTPProxy:
43 #        rtpproxy -l _your_public_ip_ -s udp:localhost:7722
44 #
45 # *** To enable PSTN gateway routing execute:
46 #     - define WITH_PSTN
47 #     - set the value of pstn.gw_ip
48 #     - check route[PSTN] for regexp routing condition
49 #
50 # *** To enable database aliases lookup execute:
51 #     - enable mysql
52 #     - define WITH_ALIASDB
53 #
54 # *** To enable speed dial lookup execute:
55 #     - enable mysql
56 #     - define WITH_SPEEDDIAL
57 #
58 # *** To enable multi-domain support execute:
59 #     - enable mysql
60 #     - define WITH_MULTIDOMAIN
61 #
62 # *** To enable TLS support execute:
63 #     - adjust CFGDIR/tls.cfg as needed
64 #     - define WITH_TLS
65 #
66 # *** To enable XMLRPC support execute:
67 #     - define WITH_XMLRPC
68 #     - adjust route[XMLRPC] for access policy
69 #
70 # *** To enable anti-flood detection execute:
71 #     - adjust pike and htable=>ipban settings as needed (default is
72 #       block if more than 16 requests in 2 seconds and ban for 300 seconds)
73 #     - define WITH_ANTIFLOOD
74 #
75 # *** To block 3XX redirect replies execute:
76 #     - define WITH_BLOCK3XX
77 #
78 # *** To enable VoiceMail routing execute:
79 #     - define WITH_VOICEMAIL
80 #     - set the value of voicemail.srv_ip
81 #     - adjust the value of voicemail.srv_port
82 #
83 # *** To enhance accounting execute:
84 #     - enable mysql
85 #     - define WITH_ACCDB
86 #     - add following columns to database
87 #!ifdef ACCDB_COMMENT
88   ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
89   ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
90   ALTER TABLE acc ADD COLUMN src_ip varchar(64) NOT NULL default '';
91   ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
92   ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
93   ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
94   ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
95   ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
96   ALTER TABLE missed_calls ADD COLUMN src_ip varchar(64) NOT NULL default '';
97   ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
98   ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
99   ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
100 #!endif
101
102 ####### Include Local Config If Exists #########
103 import_file "kamailio-local.cfg"
104
105 ####### Defined Values #########
106
107 # *** Value defines - IDs used later in config
108 #!ifdef WITH_MYSQL
109 # - database URL - used to connect to database server by modules such
110 #       as: auth_db, acc, usrloc, a.s.o.
111 #!ifndef DBURL
112 #!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"
113 #!endif
114 #!endif
115 #!ifdef WITH_MULTIDOMAIN
116 # - the value for 'use_domain' parameters
117 #!define MULTIDOMAIN 1
118 #!else
119 #!define MULTIDOMAIN 0
120 #!endif
121
122 # - flags
123 #   FLT_ - per transaction (message) flags
124 #       FLB_ - per branch flags
125 #!define FLT_ACC 1
126 #!define FLT_ACCMISSED 2
127 #!define FLT_ACCFAILED 3
128 #!define FLT_NATS 5
129
130 #!define FLB_NATB 6
131 #!define FLB_NATSIPPING 7
132
133 ####### Global Parameters #########
134
135 ### LOG Levels: 3=DBG, 2=INFO, 1=NOTICE, 0=WARN, -1=ERR
136 #!ifdef WITH_DEBUG
137 debug=4
138 log_stderror=yes
139 #!else
140 debug=2
141 log_stderror=no
142 #!endif
143
144 memdbg=5
145 memlog=5
146
147 log_facility=LOG_LOCAL0
148
149 fork=yes
150 children=4
151
152 /* uncomment the next line to disable TCP (default on) */
153 #disable_tcp=yes
154
155 /* uncomment the next line to disable the auto discovery of local aliases
156    based on reverse DNS on IPs (default on) */
157 #auto_aliases=no
158
159 /* add local domain aliases */
160 #alias="sip.mydomain.com"
161
162 /* uncomment and configure the following line if you want Kamailio to 
163    bind on a specific interface/port/proto (default bind on all available) */
164 #listen=udp:10.0.0.10:5060
165
166 /* port to listen to
167  * - can be specified more than once if needed to listen on many ports */
168 port=5060
169
170 #!ifdef WITH_TLS
171 enable_tls=yes
172 #!endif
173
174 # life time of TCP connection when there is no traffic
175 # - a bit higher than registration expires to cope with UA behind NAT
176 tcp_connection_lifetime=3605
177
178 ####### Custom Parameters #########
179
180 # These parameters can be modified runtime via RPC interface
181 # - see the documentation of 'cfg_rpc' module.
182 #
183 # Format: group.id = value 'desc' description
184 # Access: $sel(cfg_get.group.id) or @cfg_get.group.id
185 #
186
187 #!ifdef WITH_PSTN
188 # PSTN GW Routing
189 #
190 # - pstn.gw_ip: valid IP or hostname as string value, example:
191 # pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
192 #
193 # - by default is empty to avoid misrouting
194 pstn.gw_ip = "" desc "PSTN GW Address"
195 pstn.gw_port = "" desc "PSTN GW Port"
196 #!endif
197
198 #!ifdef WITH_VOICEMAIL
199 # VoiceMail Routing on offline, busy or no answer
200 #
201 # - by default Voicemail server IP is empty to avoid misrouting
202 voicemail.srv_ip = "" desc "VoiceMail IP Address"
203 voicemail.srv_port = "5060" desc "VoiceMail Port"
204 #!endif
205
206 ####### Modules Section ########
207
208 # set paths to location of modules (to sources or installation folders)
209 #!ifdef WITH_SRCPATH
210 mpath="modules_k:modules"
211 #!else
212 mpath="/usr/local/lib/kamailio/modules_k/:/usr/local/lib/kamailio/modules/"
213 #!endif
214
215 #!ifdef WITH_MYSQL
216 loadmodule "db_mysql.so"
217 #!endif
218
219 loadmodule "mi_fifo.so"
220 loadmodule "kex.so"
221 loadmodule "corex.so"
222 loadmodule "tm.so"
223 loadmodule "tmx.so"
224 loadmodule "sl.so"
225 loadmodule "rr.so"
226 loadmodule "pv.so"
227 loadmodule "maxfwd.so"
228 loadmodule "usrloc.so"
229 loadmodule "registrar.so"
230 loadmodule "textops.so"
231 loadmodule "siputils.so"
232 loadmodule "xlog.so"
233 loadmodule "sanity.so"
234 loadmodule "ctl.so"
235 loadmodule "cfg_rpc.so"
236 loadmodule "mi_rpc.so"
237 loadmodule "acc.so"
238
239 #!ifdef WITH_AUTH
240 loadmodule "auth.so"
241 loadmodule "auth_db.so"
242 #!ifdef WITH_IPAUTH
243 loadmodule "permissions.so"
244 #!endif
245 #!endif
246
247 #!ifdef WITH_ALIASDB
248 loadmodule "alias_db.so"
249 #!endif
250
251 #!ifdef WITH_SPEEDDIAL
252 loadmodule "speeddial.so"
253 #!endif
254
255 #!ifdef WITH_MULTIDOMAIN
256 loadmodule "domain.so"
257 #!endif
258
259 #!ifdef WITH_PRESENCE
260 loadmodule "presence.so"
261 loadmodule "presence_xml.so"
262 #!endif
263
264 #!ifdef WITH_NAT
265 loadmodule "nathelper.so"
266 loadmodule "rtpproxy.so"
267 #!endif
268
269 #!ifdef WITH_TLS
270 loadmodule "tls.so"
271 #!endif
272
273 #!ifdef WITH_ANTIFLOOD
274 loadmodule "htable.so"
275 loadmodule "pike.so"
276 #!endif
277
278 #!ifdef WITH_XMLRPC
279 loadmodule "xmlrpc.so"
280 #!endif
281
282 #!ifdef WITH_DEBUG
283 loadmodule "debugger.so"
284 #!endif
285
286 # ----------------- setting module-specific parameters ---------------
287
288
289 # ----- mi_fifo params -----
290 modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
291
292
293 # ----- tm params -----
294 # auto-discard branches from previous serial forking leg
295 modparam("tm", "failure_reply_mode", 3)
296 # default retransmission timeout: 30sec
297 modparam("tm", "fr_timer", 30000)
298 # default invite retransmission timeout after 1xx: 120sec
299 modparam("tm", "fr_inv_timer", 120000)
300
301
302 # ----- rr params -----
303 # add value to ;lr param to cope with most of the UAs
304 modparam("rr", "enable_full_lr", 1)
305 # do not append from tag to the RR (no need for this script)
306 modparam("rr", "append_fromtag", 0)
307
308
309 # ----- registrar params -----
310 modparam("registrar", "method_filtering", 1)
311 /* uncomment the next line to disable parallel forking via location */
312 # modparam("registrar", "append_branches", 0)
313 /* uncomment the next line not to allow more than 10 contacts per AOR */
314 #modparam("registrar", "max_contacts", 10)
315 # max value for expires of registrations
316 modparam("registrar", "max_expires", 3600)
317 # set it to 1 to enable GRUU
318 modparam("registrar", "gruu_enabled", 0)
319
320
321 # ----- acc params -----
322 /* what special events should be accounted ? */
323 modparam("acc", "early_media", 0)
324 modparam("acc", "report_ack", 0)
325 modparam("acc", "report_cancels", 0)
326 /* by default ww do not adjust the direct of the sequential requests.
327    if you enable this parameter, be sure the enable "append_fromtag"
328    in "rr" module */
329 modparam("acc", "detect_direction", 0)
330 /* account triggers (flags) */
331 modparam("acc", "log_flag", FLT_ACC)
332 modparam("acc", "log_missed_flag", FLT_ACCMISSED)
333 modparam("acc", "log_extra", 
334         "src_user=$fU;src_domain=$fd;src_ip=$si;"
335         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
336 modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
337 /* enhanced DB accounting */
338 #!ifdef WITH_ACCDB
339 modparam("acc", "db_flag", FLT_ACC)
340 modparam("acc", "db_missed_flag", FLT_ACCMISSED)
341 modparam("acc", "db_url", DBURL)
342 modparam("acc", "db_extra",
343         "src_user=$fU;src_domain=$fd;src_ip=$si;"
344         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
345 #!endif
346
347
348 # ----- usrloc params -----
349 /* enable DB persistency for location entries */
350 #!ifdef WITH_USRLOCDB
351 modparam("usrloc", "db_url", DBURL)
352 modparam("usrloc", "db_mode", 2)
353 modparam("usrloc", "use_domain", MULTIDOMAIN)
354 #!endif
355
356
357 # ----- auth_db params -----
358 #!ifdef WITH_AUTH
359 modparam("auth_db", "db_url", DBURL)
360 modparam("auth_db", "calculate_ha1", yes)
361 modparam("auth_db", "password_column", "password")
362 modparam("auth_db", "load_credentials", "")
363 modparam("auth_db", "use_domain", MULTIDOMAIN)
364
365 # ----- permissions params -----
366 #!ifdef WITH_IPAUTH
367 modparam("permissions", "db_url", DBURL)
368 modparam("permissions", "db_mode", 1)
369 #!endif
370
371 #!endif
372
373
374 # ----- alias_db params -----
375 #!ifdef WITH_ALIASDB
376 modparam("alias_db", "db_url", DBURL)
377 modparam("alias_db", "use_domain", MULTIDOMAIN)
378 #!endif
379
380
381 # ----- speeddial params -----
382 #!ifdef WITH_SPEEDDIAL
383 modparam("speeddial", "db_url", DBURL)
384 modparam("speeddial", "use_domain", MULTIDOMAIN)
385 #!endif
386
387
388 # ----- domain params -----
389 #!ifdef WITH_MULTIDOMAIN
390 modparam("domain", "db_url", DBURL)
391 # register callback to match myself condition with domains list
392 modparam("domain", "register_myself", 1)
393 #!endif
394
395
396 #!ifdef WITH_PRESENCE
397 # ----- presence params -----
398 modparam("presence", "db_url", DBURL)
399
400 # ----- presence_xml params -----
401 modparam("presence_xml", "db_url", DBURL)
402 modparam("presence_xml", "force_active", 1)
403 #!endif
404
405
406 #!ifdef WITH_NAT
407 # ----- rtpproxy params -----
408 modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
409
410 # ----- nathelper params -----
411 modparam("nathelper", "natping_interval", 30)
412 modparam("nathelper", "ping_nated_only", 1)
413 modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
414 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
415
416 # params needed for NAT traversal in other modules
417 modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
418 modparam("usrloc", "nat_bflag", FLB_NATB)
419 #!endif
420
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 #!endif
448
449 ####### Routing Logic ########
450
451
452 # Main SIP request routing logic
453 # - processing of any incoming SIP request starts with this route
454 # - note: this is the same as route { ... }
455 request_route {
456
457         # per request initial checks
458         route(REQINIT);
459
460         # NAT detection
461         route(NATDETECT);
462
463         # CANCEL processing
464         if (is_method("CANCEL"))
465         {
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         t_check_trans();
478
479         # authentication
480         route(AUTH);
481
482         # record routing for dialog forming requests (in case they are routed)
483         # - remove preloaded route headers
484         remove_hf("Route");
485         if (is_method("INVITE|SUBSCRIBE"))
486                 record_route();
487
488         # account only INVITEs
489         if (is_method("INVITE"))
490         {
491                 setflag(FLT_ACC); # do accounting
492         }
493
494         # dispatch requests to foreign domains
495         route(SIPOUT);
496
497         ### requests for my local domains
498
499         # handle presence related requests
500         route(PRESENCE);
501
502         # handle registrations
503         route(REGISTRAR);
504
505         if ($rU==$null)
506         {
507                 # request with no Username in RURI
508                 sl_send_reply("484","Address Incomplete");
509                 exit;
510         }
511
512         # dispatch destinations to PSTN
513         route(PSTN);
514
515         # user location service
516         route(LOCATION);
517 }
518
519
520 route[RELAY] {
521
522         # enable additional event routes for forwarded requests
523         # - serial forking, RTP relaying handling, a.s.o.
524         if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
525                 if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
526         }
527         if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
528                 if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
529         }
530         if (is_method("INVITE")) {
531                 if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
532         }
533
534         if (!t_relay()) {
535                 sl_reply_error();
536         }
537         exit;
538 }
539
540 # Per SIP request initial checks
541 route[REQINIT] {
542 #!ifdef WITH_ANTIFLOOD
543         # flood dection from same IP and traffic ban for a while
544         # be sure you exclude checking trusted peers, such as pstn gateways
545         # - local host excluded (e.g., loop to self)
546         if(src_ip!=myself)
547         {
548                 if($sht(ipban=>$si)!=$null)
549                 {
550                         # ip is already blocked
551                         xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
552                         exit;
553                 }
554                 if (!pike_check_req())
555                 {
556                         xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
557                         $sht(ipban=>$si) = 1;
558                         exit;
559                 }
560         }
561 #!endif
562
563         if (!mf_process_maxfwd_header("10")) {
564                 sl_send_reply("483","Too Many Hops");
565                 exit;
566         }
567
568         if(!sanity_check("1511", "7"))
569         {
570                 xlog("Malformed SIP message from $si:$sp\n");
571                 exit;
572         }
573 }
574
575 # Handle requests within SIP dialogs
576 route[WITHINDLG] {
577         if (has_totag()) {
578                 # sequential request withing a dialog should
579                 # take the path determined by record-routing
580                 if (loose_route()) {
581                         route(DLGURI);
582                         if (is_method("BYE")) {
583                                 setflag(FLT_ACC); # do accounting ...
584                                 setflag(FLT_ACCFAILED); # ... even if the transaction fails
585                         }
586                         else if ( is_method("ACK") ) {
587                                 # ACK is forwarded statelessy
588                                 route(NATMANAGE);
589                         }
590                         else if ( is_method("NOTIFY") ) {
591                                 # Add Record-Route for in-dialog NOTIFY as per RFC 6665.
592                                 record_route();
593                         }
594                         route(RELAY);
595                 } else {
596                         if (is_method("SUBSCRIBE") && uri == myself) {
597                                 # in-dialog subscribe requests
598                                 route(PRESENCE);
599                                 exit;
600                         }
601                         if ( is_method("ACK") ) {
602                                 if ( t_check_trans() ) {
603                                         # no loose-route, but stateful ACK;
604                                         # must be an ACK after a 487
605                                         # or e.g. 404 from upstream server
606                                         route(RELAY);
607                                         exit;
608                                 } else {
609                                         # ACK without matching transaction ... ignore and discard
610                                         exit;
611                                 }
612                         }
613                         sl_send_reply("404","Not here");
614                 }
615                 exit;
616         }
617 }
618
619 # Handle SIP registrations
620 route[REGISTRAR] {
621         if (is_method("REGISTER"))
622         {
623                 if(isflagset(FLT_NATS))
624                 {
625                         setbflag(FLB_NATB);
626                         # uncomment next line to do SIP NAT pinging 
627                         ## setbflag(FLB_NATSIPPING);
628                 }
629                 if (!save("location"))
630                         sl_reply_error();
631
632                 exit;
633         }
634 }
635
636 # USER location service
637 route[LOCATION] {
638
639 #!ifdef WITH_SPEEDDIAL
640         # search for short dialing - 2-digit extension
641         if($rU=~"^[0-9][0-9]$")
642                 if(sd_lookup("speed_dial"))
643                         route(SIPOUT);
644 #!endif
645
646 #!ifdef WITH_ALIASDB
647         # search in DB-based aliases
648         if(alias_db_lookup("dbaliases"))
649                 route(SIPOUT);
650 #!endif
651
652         $avp(oexten) = $rU;
653         if (!lookup("location")) {
654                 $var(rc) = $rc;
655                 route(TOVOICEMAIL);
656                 t_newtran();
657                 switch ($var(rc)) {
658                         case -1:
659                         case -3:
660                                 send_reply("404", "Not Found");
661                                 exit;
662                         case -2:
663                                 send_reply("405", "Method Not Allowed");
664                                 exit;
665                 }
666         }
667
668         # when routing via usrloc, log the missed calls also
669         if (is_method("INVITE"))
670         {
671                 setflag(FLT_ACCMISSED);
672         }
673
674         route(RELAY);
675         exit;
676 }
677
678 # Presence server route
679 route[PRESENCE] {
680         if(!is_method("PUBLISH|SUBSCRIBE"))
681                 return;
682
683         if(is_method("SUBSCRIBE") && $hdr(Event)=="message-summary") {
684                 route(TOVOICEMAIL);
685                 # returns here if no voicemail server is configured
686                 sl_send_reply("404", "No voicemail service");
687                 exit;
688         }
689
690 #!ifdef WITH_PRESENCE
691         if (!t_newtran())
692         {
693                 sl_reply_error();
694                 exit;
695         }
696
697         if(is_method("PUBLISH"))
698         {
699                 handle_publish();
700                 t_release();
701         } else if(is_method("SUBSCRIBE")) {
702                 handle_subscribe();
703                 t_release();
704         }
705         exit;
706 #!endif
707         
708         # if presence enabled, this part will not be executed
709         if (is_method("PUBLISH") || $rU==$null)
710         {
711                 sl_send_reply("404", "Not here");
712                 exit;
713         }
714         return;
715 }
716
717 # Authentication route
718 route[AUTH] {
719 #!ifdef WITH_AUTH
720
721 #!ifdef WITH_IPAUTH
722         if((!is_method("REGISTER")) && allow_source_address())
723         {
724                 # source IP allowed
725                 return;
726         }
727 #!endif
728
729         if (is_method("REGISTER") || from_uri==myself)
730         {
731                 # authenticate requests
732                 if (!auth_check("$fd", "subscriber", "1")) {
733                         auth_challenge("$fd", "0");
734                         exit;
735                 }
736                 # user authenticated - remove auth header
737                 if(!is_method("REGISTER|PUBLISH"))
738                         consume_credentials();
739         }
740         # if caller is not local subscriber, then check if it calls
741         # a local destination, otherwise deny, not an open relay here
742         if (from_uri!=myself && uri!=myself)
743         {
744                 sl_send_reply("403","Not relaying");
745                 exit;
746         }
747
748 #!endif
749         return;
750 }
751
752 # Caller NAT detection route
753 route[NATDETECT] {
754 #!ifdef WITH_NAT
755         force_rport();
756         if (nat_uac_test("19")) {
757                 if (is_method("REGISTER")) {
758                         fix_nated_register();
759                 } else {
760                         add_contact_alias();
761                 }
762                 setflag(FLT_NATS);
763         }
764 #!endif
765         return;
766 }
767
768 # RTPProxy control
769 route[NATMANAGE] {
770 #!ifdef WITH_NAT
771         if (is_request()) {
772                 if(has_totag()) {
773                         if(check_route_param("nat=yes")) {
774                                 setbflag(FLB_NATB);
775                         }
776                 }
777         }
778         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))
779                 return;
780
781         rtpproxy_manage("co");
782
783         if (is_request()) {
784                 if (!has_totag()) {
785                         if(t_is_branch_route()) {
786                                 add_rr_param(";nat=yes");
787                         }
788                 }
789         }
790         if (is_reply()) {
791                 if(isbflagset(FLB_NATB)) {
792                         add_contact_alias();
793                 }
794         }
795 #!endif
796         return;
797 }
798
799 # URI update for dialog requests
800 route[DLGURI] {
801 #!ifdef WITH_NAT
802         if(!isdsturiset()) {
803                 handle_ruri_alias();
804         }
805 #!endif
806         return;
807 }
808
809 # Routing to foreign domains
810 route[SIPOUT] {
811         if (!uri==myself)
812         {
813                 append_hf("P-hint: outbound\r\n");
814                 route(RELAY);
815         }
816 }
817
818 # PSTN GW routing
819 route[PSTN] {
820 #!ifdef WITH_PSTN
821         # check if PSTN GW IP is defined
822         if (strempty($sel(cfg_get.pstn.gw_ip))) {
823                 xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
824                 return;
825         }
826
827         # route to PSTN dialed numbers starting with '+' or '00'
828         #     (international format)
829         # - update the condition to match your dialing rules for PSTN routing
830         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
831                 return;
832
833         # only local users allowed to call
834         if(from_uri!=myself) {
835                 sl_send_reply("403", "Not Allowed");
836                 exit;
837         }
838
839         if (strempty($sel(cfg_get.pstn.gw_port))) {
840                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
841         } else {
842                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
843                                         + $sel(cfg_get.pstn.gw_port);
844         }
845
846         route(RELAY);
847         exit;
848 #!endif
849
850         return;
851 }
852
853 # XMLRPC routing
854 #!ifdef WITH_XMLRPC
855 route[XMLRPC] {
856         # allow XMLRPC from localhost
857         if ((method=="POST" || method=="GET")
858                         && (src_ip==127.0.0.1)) {
859                 # close connection only for xmlrpclib user agents (there is a bug in
860                 # xmlrpclib: it waits for EOF before interpreting the response).
861                 if ($hdr(User-Agent) =~ "xmlrpclib")
862                         set_reply_close();
863                 set_reply_no_connect();
864                 dispatch_rpc();
865                 exit;
866         }
867         send_reply("403", "Forbidden");
868         exit;
869 }
870 #!endif
871
872 # route to voicemail server
873 route[TOVOICEMAIL] {
874 #!ifdef WITH_VOICEMAIL
875         if(!is_method("INVITE|SUBSCRIBE"))
876                 return;
877
878         # check if VoiceMail server IP is defined
879         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
880                 xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");
881                 return;
882         }
883         if(is_method("INVITE")) {
884                 if($avp(oexten)==$null)
885                         return;
886                 $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
887                                 + ":" + $sel(cfg_get.voicemail.srv_port);
888         } else {
889                 if($rU==$null)
890                         return;
891                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.voicemail.srv_ip)
892                                 + ":" + $sel(cfg_get.voicemail.srv_port);
893         }
894         route(RELAY);
895         exit;
896 #!endif
897
898         return;
899 }
900
901 # manage outgoing branches
902 branch_route[MANAGE_BRANCH] {
903         xdbg("new branch [$T_branch_idx] to $ru\n");
904         route(NATMANAGE);
905 }
906
907 # manage incoming replies
908 onreply_route[MANAGE_REPLY] {
909         xdbg("incoming reply\n");
910         if(status=~"[12][0-9][0-9]")
911                 route(NATMANAGE);
912 }
913
914 # manage failure routing cases
915 failure_route[MANAGE_FAILURE] {
916         route(NATMANAGE);
917
918         if (t_is_canceled()) {
919                 exit;
920         }
921
922 #!ifdef WITH_BLOCK3XX
923         # block call redirect based on 3xx replies.
924         if (t_check_status("3[0-9][0-9]")) {
925                 t_reply("404","Not found");
926                 exit;
927         }
928 #!endif
929
930 #!ifdef WITH_VOICEMAIL
931         # serial forking
932         # - route to voicemail on busy or no answer (timeout)
933         if (t_check_status("486|408")) {
934                 $du = $null;
935                 route(TOVOICEMAIL);
936                 exit;
937         }
938 #!endif
939 }