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