kamailio.cfg: replaced mi_fifo with jsonrpcs in the default config file
[sip-router] / etc / kamailio.cfg
1 #!KAMAILIO
2 #
3 # Kamailio (OpenSER) SIP Server v5.0 - default configuration script
4 #     - web: http://www.kamailio.org
5 #     - git: http://sip-router.org
6 #
7 # Direct your questions about this file to: <sr-users@lists.sip-router.org>
8 #
9 # Refer to the Core CookBook at http://www.kamailio.org/wiki/
10 # for an explanation of possible statements, functions and parameters.
11 #
12 # Note: the comments can be:
13 #     - lines starting with #, but not the pre-processor directives,
14 #       which start with #!, like #!define, #!ifdef, #!endif, #!else, #!trydef,
15 #       #!subst, #!substdef, ...
16 #     - lines starting with //
17 #     - blocks enclosed in between /* */
18 #
19 # Several features can be enabled using '#!define WITH_FEATURE' directives:
20 #
21 # *** To run in debug mode:
22 #     - define WITH_DEBUG
23 #
24 # *** To enable mysql:
25 #     - define WITH_MYSQL
26 #
27 # *** To enable authentication execute:
28 #     - enable mysql
29 #     - define WITH_AUTH
30 #     - add users using 'kamctl'
31 #
32 # *** To enable IP authentication execute:
33 #     - enable mysql
34 #     - enable authentication
35 #     - define WITH_IPAUTH
36 #     - add IP addresses with group id '1' to 'address' table
37 #
38 # *** To enable persistent user location execute:
39 #     - enable mysql
40 #     - define WITH_USRLOCDB
41 #
42 # *** To enable presence server execute:
43 #     - enable mysql
44 #     - define WITH_PRESENCE
45 #
46 # *** To enable nat traversal execute:
47 #     - define WITH_NAT
48 #     - install RTPProxy: http://www.rtpproxy.org
49 #     - start RTPProxy:
50 #        rtpproxy -l _your_public_ip_ -s udp:localhost:7722
51 #     - option for NAT SIP OPTIONS keepalives: WITH_NATSIPPING
52 #
53 # *** To enable PSTN gateway routing execute:
54 #     - define WITH_PSTN
55 #     - set the value of pstn.gw_ip
56 #     - check route[PSTN] for regexp routing condition
57 #
58 # *** To enable database aliases lookup execute:
59 #     - enable mysql
60 #     - define WITH_ALIASDB
61 #
62 # *** To enable speed dial lookup execute:
63 #     - enable mysql
64 #     - define WITH_SPEEDDIAL
65 #
66 # *** To enable multi-domain support execute:
67 #     - enable mysql
68 #     - define WITH_MULTIDOMAIN
69 #
70 # *** To enable TLS support execute:
71 #     - adjust CFGDIR/tls.cfg as needed
72 #     - define WITH_TLS
73 #
74 # *** To enable XMLRPC support execute:
75 #     - define WITH_XMLRPC
76 #     - adjust route[XMLRPC] for access policy
77 #
78 # *** To enable anti-flood detection execute:
79 #     - adjust pike and htable=>ipban settings as needed (default is
80 #       block if more than 16 requests in 2 seconds and ban for 300 seconds)
81 #     - define WITH_ANTIFLOOD
82 #
83 # *** To block 3XX redirect replies execute:
84 #     - define WITH_BLOCK3XX
85 #
86 # *** To block 401 and 407 authentication replies execute:
87 #     - define WITH_BLOCK401407
88 #
89 # *** To enable VoiceMail routing execute:
90 #     - define WITH_VOICEMAIL
91 #     - set the value of voicemail.srv_ip
92 #     - adjust the value of voicemail.srv_port
93 #
94 # *** To enhance accounting execute:
95 #     - enable mysql
96 #     - define WITH_ACCDB
97 #     - add following columns to database
98 #!ifdef ACCDB_COMMENT
99   ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
100   ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
101   ALTER TABLE acc ADD COLUMN src_ip varchar(64) NOT NULL default '';
102   ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
103   ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
104   ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
105   ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
106   ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
107   ALTER TABLE missed_calls ADD COLUMN src_ip varchar(64) NOT NULL default '';
108   ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
109   ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
110   ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
111 #!endif
112
113 ####### Include Local Config If Exists #########
114 import_file "kamailio-local.cfg"
115
116 ####### Defined Values #########
117
118 # *** Value defines - IDs used later in config
119 #!ifdef WITH_MYSQL
120 # - database URL - used to connect to database server by modules such
121 #       as: auth_db, acc, usrloc, a.s.o.
122 #!ifndef DBURL
123 #!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"
124 #!endif
125 #!endif
126 #!ifdef WITH_MULTIDOMAIN
127 # - the value for 'use_domain' parameters
128 #!define MULTIDOMAIN 1
129 #!else
130 #!define MULTIDOMAIN 0
131 #!endif
132
133 # - flags
134 #   FLT_ - per transaction (message) flags
135 #       FLB_ - per branch flags
136 #!define FLT_ACC 1
137 #!define FLT_ACCMISSED 2
138 #!define FLT_ACCFAILED 3
139 #!define FLT_NATS 5
140
141 #!define FLB_NATB 6
142 #!define FLB_NATSIPPING 7
143
144 ####### Global Parameters #########
145
146 ### LOG Levels: 3=DBG, 2=INFO, 1=NOTICE, 0=WARN, -1=ERR
147 #!ifdef WITH_DEBUG
148 debug=4
149 log_stderror=yes
150 #!else
151 debug=2
152 log_stderror=no
153 #!endif
154
155 memdbg=5
156 memlog=5
157
158 log_facility=LOG_LOCAL0
159
160 /* number of SIP routing processes */
161 children=8
162
163 /* uncomment the next line to disable TCP (default on) */
164 # disable_tcp=yes
165
166 /* uncomment the next line to disable the auto discovery of local aliases
167  * based on reverse DNS on IPs (default on) */
168 # auto_aliases=no
169
170 /* add local domain aliases */
171 #alias="sip.mydomain.com"
172
173 /* uncomment and configure the following line if you want Kamailio to
174  * bind on a specific interface/port/proto (default bind on all available) */
175 # listen=udp:10.0.0.10:5060
176
177 /* port to listen to (default 5060 for udp, tcp, scrtp, or 5061 for tls)*/
178 # port=5060
179
180 #!ifdef WITH_TLS
181 enable_tls=yes
182 #!endif
183
184 /* life time of TCP connection when there is no traffic
185  * - a bit higher than registration expires to cope with UA behind NAT */
186 tcp_connection_lifetime=3605
187
188 ####### Custom Parameters #########
189
190 /* These parameters can be modified runtime via RPC interface
191  * - see the documentation of 'cfg_rpc' module.
192  *
193  * Format: group.id = value 'desc' description
194  * Access: $sel(cfg_get.group.id) or @cfg_get.group.id */
195
196 #!ifdef WITH_PSTN
197 /* PSTN GW Routing
198  *
199  * - pstn.gw_ip: valid IP or hostname as string value, example:
200  * pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
201  *
202  * - by default is empty to avoid misrouting */
203 pstn.gw_ip = "" desc "PSTN GW Address"
204 pstn.gw_port = "" desc "PSTN GW Port"
205 #!endif
206
207 #!ifdef WITH_VOICEMAIL
208 /* VoiceMail Routing on offline, busy or no answer
209  *
210  * - by default Voicemail server IP is empty to avoid misrouting */
211 voicemail.srv_ip = "" desc "VoiceMail IP Address"
212 voicemail.srv_port = "5060" desc "VoiceMail Port"
213 #!endif
214
215 ####### Modules Section ########
216
217 /* set paths to location of modules */
218 # mpath="/usr/local/lib/kamailio/modules/"
219
220 #!ifdef WITH_MYSQL
221 loadmodule "db_mysql.so"
222 #!endif
223
224 loadmodule "jsonrpcs.so"
225 loadmodule "kex.so"
226 loadmodule "corex.so"
227 loadmodule "tm.so"
228 loadmodule "tmx.so"
229 loadmodule "sl.so"
230 loadmodule "rr.so"
231 loadmodule "pv.so"
232 loadmodule "maxfwd.so"
233 loadmodule "usrloc.so"
234 loadmodule "registrar.so"
235 loadmodule "textops.so"
236 loadmodule "siputils.so"
237 loadmodule "xlog.so"
238 loadmodule "sanity.so"
239 loadmodule "ctl.so"
240 loadmodule "cfg_rpc.so"
241 loadmodule "mi_rpc.so"
242 loadmodule "acc.so"
243
244 #!ifdef WITH_AUTH
245 loadmodule "auth.so"
246 loadmodule "auth_db.so"
247 #!ifdef WITH_IPAUTH
248 loadmodule "permissions.so"
249 #!endif
250 #!endif
251
252 #!ifdef WITH_ALIASDB
253 loadmodule "alias_db.so"
254 #!endif
255
256 #!ifdef WITH_SPEEDDIAL
257 loadmodule "speeddial.so"
258 #!endif
259
260 #!ifdef WITH_MULTIDOMAIN
261 loadmodule "domain.so"
262 #!endif
263
264 #!ifdef WITH_PRESENCE
265 loadmodule "presence.so"
266 loadmodule "presence_xml.so"
267 #!endif
268
269 #!ifdef WITH_NAT
270 loadmodule "nathelper.so"
271 loadmodule "rtpproxy.so"
272 #!endif
273
274 #!ifdef WITH_TLS
275 loadmodule "tls.so"
276 #!endif
277
278 #!ifdef WITH_ANTIFLOOD
279 loadmodule "htable.so"
280 loadmodule "pike.so"
281 #!endif
282
283 #!ifdef WITH_XMLRPC
284 loadmodule "xmlrpc.so"
285 #!endif
286
287 #!ifdef WITH_DEBUG
288 loadmodule "debugger.so"
289 #!endif
290
291 # ----------------- setting module-specific parameters ---------------
292
293
294 # ----- jsonrpcs params -----
295 /* set the path to RPC fifo control file */
296 # modparam("jsonrpcs", "fifo_name", "/var/run/kamailio/kamailio_rpc.fifo")
297 /* set the path to RPC unix socket control file */
298 # modparam("jsonrpcs", "dgram_socket", "/var/run/kamailio/kamailio_rpc.sock")
299
300 # ----- ctl params -----
301 /* set the path to RPC unix socket control file */
302 # modparam("ctl", "binrpc", "unix:/var/run/kamailio/kamailio_ctl")
303
304 # ----- tm params -----
305 # auto-discard branches from previous serial forking leg
306 modparam("tm", "failure_reply_mode", 3)
307 # default retransmission timeout: 30sec
308 modparam("tm", "fr_timer", 30000)
309 # default invite retransmission timeout after 1xx: 120sec
310 modparam("tm", "fr_inv_timer", 120000)
311
312
313 # ----- rr params -----
314 # set next param to 1 to add value to ;lr param (helps with some UAs)
315 modparam("rr", "enable_full_lr", 0)
316 # do not append from tag to the RR (no need for this script)
317 modparam("rr", "append_fromtag", 0)
318
319
320 # ----- registrar params -----
321 modparam("registrar", "method_filtering", 1)
322 /* uncomment the next line to disable parallel forking via location */
323 # modparam("registrar", "append_branches", 0)
324 /* uncomment the next line not to allow more than 10 contacts per AOR */
325 # modparam("registrar", "max_contacts", 10)
326 /* max value for expires of registrations */
327 modparam("registrar", "max_expires", 3600)
328 /* set it to 1 to enable GRUU */
329 modparam("registrar", "gruu_enabled", 0)
330
331
332 # ----- acc params -----
333 /* what special events should be accounted ? */
334 modparam("acc", "early_media", 0)
335 modparam("acc", "report_ack", 0)
336 modparam("acc", "report_cancels", 0)
337 /* by default ww do not adjust the direct of the sequential requests.
338  * if you enable this parameter, be sure the enable "append_fromtag"
339  * in "rr" module */
340 modparam("acc", "detect_direction", 0)
341 /* account triggers (flags) */
342 modparam("acc", "log_flag", FLT_ACC)
343 modparam("acc", "log_missed_flag", FLT_ACCMISSED)
344 modparam("acc", "log_extra",
345         "src_user=$fU;src_domain=$fd;src_ip=$si;"
346         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
347 modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
348 /* enhanced DB accounting */
349 #!ifdef WITH_ACCDB
350 modparam("acc", "db_flag", FLT_ACC)
351 modparam("acc", "db_missed_flag", FLT_ACCMISSED)
352 modparam("acc", "db_url", DBURL)
353 modparam("acc", "db_extra",
354         "src_user=$fU;src_domain=$fd;src_ip=$si;"
355         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
356 #!endif
357
358
359 # ----- usrloc params -----
360 /* enable DB persistency for location entries */
361 #!ifdef WITH_USRLOCDB
362 modparam("usrloc", "db_url", DBURL)
363 modparam("usrloc", "db_mode", 2)
364 modparam("usrloc", "use_domain", MULTIDOMAIN)
365 #!endif
366
367
368 # ----- auth_db params -----
369 #!ifdef WITH_AUTH
370 modparam("auth_db", "db_url", DBURL)
371 modparam("auth_db", "calculate_ha1", yes)
372 modparam("auth_db", "password_column", "password")
373 modparam("auth_db", "load_credentials", "")
374 modparam("auth_db", "use_domain", MULTIDOMAIN)
375
376 # ----- permissions params -----
377 #!ifdef WITH_IPAUTH
378 modparam("permissions", "db_url", DBURL)
379 modparam("permissions", "db_mode", 1)
380 #!endif
381
382 #!endif
383
384
385 # ----- alias_db params -----
386 #!ifdef WITH_ALIASDB
387 modparam("alias_db", "db_url", DBURL)
388 modparam("alias_db", "use_domain", MULTIDOMAIN)
389 #!endif
390
391
392 # ----- speeddial params -----
393 #!ifdef WITH_SPEEDDIAL
394 modparam("speeddial", "db_url", DBURL)
395 modparam("speeddial", "use_domain", MULTIDOMAIN)
396 #!endif
397
398
399 # ----- domain params -----
400 #!ifdef WITH_MULTIDOMAIN
401 modparam("domain", "db_url", DBURL)
402 /* register callback to match myself condition with domains list */
403 modparam("domain", "register_myself", 1)
404 #!endif
405
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
417 #!ifdef WITH_NAT
418 # ----- rtpproxy params -----
419 modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
420
421 # ----- nathelper params -----
422 modparam("nathelper", "natping_interval", 30)
423 modparam("nathelper", "ping_nated_only", 1)
424 modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
425 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
426
427 # params needed for NAT traversal in other modules
428 modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
429 modparam("usrloc", "nat_bflag", FLB_NATB)
430 #!endif
431
432
433 #!ifdef WITH_TLS
434 # ----- tls params -----
435 modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
436 #!endif
437
438 #!ifdef WITH_ANTIFLOOD
439 # ----- pike params -----
440 modparam("pike", "sampling_time_unit", 2)
441 modparam("pike", "reqs_density_per_unit", 16)
442 modparam("pike", "remove_latency", 4)
443
444 # ----- htable params -----
445 /* ip ban htable with autoexpire after 5 minutes */
446 modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
447 #!endif
448
449 #!ifdef WITH_XMLRPC
450 # ----- xmlrpc params -----
451 modparam("xmlrpc", "route", "XMLRPC");
452 modparam("xmlrpc", "url_match", "^/RPC")
453 #!endif
454
455 #!ifdef WITH_DEBUG
456 # ----- debugger params -----
457 modparam("debugger", "cfgtrace", 1)
458 modparam("debugger", "log_level_name", "exec")
459 #!endif
460
461 ####### Routing Logic ########
462
463
464 /* Main SIP request routing logic
465  * - processing of any incoming SIP request starts with this route
466  * - note: this is the same as route { ... } */
467 request_route {
468
469         # per request initial checks
470         route(REQINIT);
471
472         # NAT detection
473         route(NATDETECT);
474
475         # CANCEL processing
476         if (is_method("CANCEL")) {
477                 if (t_check_trans()) {
478                         route(RELAY);
479                 }
480                 exit;
481         }
482
483         # handle requests within SIP dialogs
484         route(WITHINDLG);
485
486         ### only initial requests (no To tag)
487
488         # handle retransmissions
489         if(t_precheck_trans()) {
490                 t_check_trans();
491                 exit;
492         }
493         t_check_trans();
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         if($ua =~ "friendly-scanner|sipcli") {
574                 # silent drop for scanners - uncomment next line if want to reply
575                 # sl_send_reply("200", "OK");
576                 exit;
577         }
578 #!endif
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("1511", "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 statelessy
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 #!endif
764         return;
765 }
766
767 # Caller NAT detection
768 route[NATDETECT] {
769 #!ifdef WITH_NAT
770         force_rport();
771         if (nat_uac_test("19")) {
772                 if (is_method("REGISTER")) {
773                         fix_nated_register();
774                 } else {
775                         if(is_first_hop()) {
776                                 set_contact_alias();
777                         }
778                 }
779                 setflag(FLT_NATS);
780         }
781 #!endif
782         return;
783 }
784
785 # RTPProxy control and signaling updates for NAT traversal
786 route[NATMANAGE] {
787 #!ifdef WITH_NAT
788         if (is_request()) {
789                 if(has_totag()) {
790                         if(check_route_param("nat=yes")) {
791                                 setbflag(FLB_NATB);
792                         }
793                 }
794         }
795         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB))) return;
796
797         if(nat_uac_test("8")) {
798                 rtpproxy_manage("co");
799         } else {
800                 rtpproxy_manage("cor");
801         }
802
803         if (is_request()) {
804                 if (!has_totag()) {
805                         if(t_is_branch_route()) {
806                                 add_rr_param(";nat=yes");
807                         }
808                 }
809         }
810         if (is_reply()) {
811                 if(isbflagset(FLB_NATB)) {
812                         if(is_first_hop())
813                                 set_contact_alias();
814                 }
815         }
816 #!endif
817         return;
818 }
819
820 # URI update for dialog requests
821 route[DLGURI] {
822 #!ifdef WITH_NAT
823         if(!isdsturiset()) {
824                 handle_ruri_alias();
825         }
826 #!endif
827         return;
828 }
829
830 # Routing to foreign domains
831 route[SIPOUT] {
832         if (uri==myself) return;
833
834         append_hf("P-hint: outbound\r\n");
835         route(RELAY);
836         exit;
837 }
838
839 # PSTN GW routing
840 route[PSTN] {
841 #!ifdef WITH_PSTN
842         # check if PSTN GW IP is defined
843         if (strempty($sel(cfg_get.pstn.gw_ip))) {
844                 xlog("SCRIPT: PSTN routing enabled but pstn.gw_ip not defined\n");
845                 return;
846         }
847
848         # route to PSTN dialed numbers starting with '+' or '00'
849         #     (international format)
850         # - update the condition to match your dialing rules for PSTN routing
851         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$")) return;
852
853         # only local users allowed to call
854         if(from_uri!=myself) {
855                 sl_send_reply("403", "Not Allowed");
856                 exit;
857         }
858
859         if (strempty($sel(cfg_get.pstn.gw_port))) {
860                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
861         } else {
862                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
863                                         + $sel(cfg_get.pstn.gw_port);
864         }
865
866         route(RELAY);
867         exit;
868 #!endif
869
870         return;
871 }
872
873 # XMLRPC routing
874 #!ifdef WITH_XMLRPC
875 route[XMLRPC] {
876         # allow XMLRPC from localhost
877         if ((method=="POST" || method=="GET")
878                         && (src_ip==127.0.0.1)) {
879                 # close connection only for xmlrpclib user agents (there is a bug in
880                 # xmlrpclib: it waits for EOF before interpreting the response).
881                 if ($hdr(User-Agent) =~ "xmlrpclib")
882                         set_reply_close();
883                 set_reply_no_connect();
884                 dispatch_rpc();
885                 exit;
886         }
887         send_reply("403", "Forbidden");
888         exit;
889 }
890 #!endif
891
892 # Routing to voicemail server
893 route[TOVOICEMAIL] {
894 #!ifdef WITH_VOICEMAIL
895         if(!is_method("INVITE|SUBSCRIBE")) return;
896
897         # check if VoiceMail server IP is defined
898         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
899                 xlog("SCRIPT: VoiceMail routing enabled but IP not defined\n");
900                 return;
901         }
902         if(is_method("INVITE")) {
903                 if($avp(oexten)==$null) return;
904
905                 $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
906                                 + ":" + $sel(cfg_get.voicemail.srv_port);
907         } else {
908                 if($rU==$null) return;
909
910                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.voicemail.srv_ip)
911                                 + ":" + $sel(cfg_get.voicemail.srv_port);
912         }
913         route(RELAY);
914         exit;
915 #!endif
916
917         return;
918 }
919
920 # Manage outgoing branches
921 branch_route[MANAGE_BRANCH] {
922         xdbg("new branch [$T_branch_idx] to $ru\n");
923         route(NATMANAGE);
924 }
925
926 # Manage incoming replies
927 onreply_route[MANAGE_REPLY] {
928         xdbg("incoming reply\n");
929         if(status=~"[12][0-9][0-9]") {
930                 route(NATMANAGE);
931         }
932 }
933
934 # Manage failure routing cases
935 failure_route[MANAGE_FAILURE] {
936         route(NATMANAGE);
937
938         if (t_is_canceled()) exit;
939
940 #!ifdef WITH_BLOCK3XX
941         # block call redirect based on 3xx replies.
942         if (t_check_status("3[0-9][0-9]")) {
943                 t_reply("404","Not found");
944                 exit;
945         }
946 #!endif
947
948 #!ifdef WITH_BLOCK401407
949         # block call redirect based on 401, 407 replies.
950         if (t_check_status("401|407")) {
951                 t_reply("404","Not found");
952                 exit;
953         }
954 #!endif
955
956 #!ifdef WITH_VOICEMAIL
957         # serial forking
958         # - route to voicemail on busy or no answer (timeout)
959         if (t_check_status("486|408")) {
960                 $du = $null;
961                 route(TOVOICEMAIL);
962                 exit;
963         }
964 #!endif
965 }