From eb1a6e9b87ab7fedc035127b8224147deba2d5ab Mon Sep 17 00:00:00 2001
From: Teravus Ovares
Date: Fri, 17 Jul 2009 21:06:28 +0000
Subject: * Patch from otakup0pe to help freeswitch play nice with complex
existing freeswitch configurations. * Thanks! fixes mantis #3899
---
.../Voice/FreeSwitchVoice/FreeSwitchDialplan.cs | 91 +++++-----
.../Voice/FreeSwitchVoice/FreeSwitchDirectory.cs | 201 +++++++++++----------
.../Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs | 8 +-
3 files changed, 160 insertions(+), 140 deletions(-)
(limited to 'OpenSim/Region/OptionalModules')
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchDialplan.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchDialplan.cs
index ad2b7e4..d34b6f1 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchDialplan.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchDialplan.cs
@@ -26,18 +26,20 @@
*/
using log4net;
+using System;
using System.Reflection;
+using System.Text;
using System.Collections;
namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
{
public class FreeSwitchDialplan
{
- private static readonly ILog m_log =
- LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ private static readonly ILog m_log =
+ LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- public Hashtable HandleDialplanRequest(Hashtable request)
+ public Hashtable HandleDialplanRequest(string Context, string Realm, Hashtable request)
{
m_log.DebugFormat("[FreeSwitchVoice] HandleDialplanRequest called with {0}",request.ToString());
@@ -47,48 +49,55 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
{
m_log.InfoFormat("[FreeSwitchDirectory] requestBody item {0} {1}",item.Key, item.Value);
}
-
+
+ string requestcontext = (string) request["Hunt-Context"];
response["content_type"] = "text/xml";
response["keepalive"] = false;
response["int_response_code"] = 200;
- response["str_response_string"] = @"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ";
+ if ( Context != requestcontext )
+ {
+ m_log.Debug("[FreeSwitchDirectory] returning empty as it's for another context");
+ response["str_response_string"] = "";
+ } else {
+ response["str_response_string"] = String.Format(@"
+
+
+ " +
+
+/*
+
+
+
+
+
+ */
+
+ @"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ", Context, Realm);
+ }
- return response;
+ return response;
}
}
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchDirectory.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchDirectory.cs
index caec43d..af5692c 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchDirectory.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchDirectory.cs
@@ -38,103 +38,111 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- public Hashtable HandleDirectoryRequest(Hashtable request)
+ public Hashtable HandleDirectoryRequest(string Context, string Realm, Hashtable request)
{
- m_log.DebugFormat("[FreeSwitchDirectory] HandleDirectoryRequest called with {0}",request.ToString());
+ Hashtable response = new Hashtable();
+ string domain = (string) request["domain"];
+ if ( domain != Realm ) {
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+ response["str_response_string"] = "";
+ } else {
+ m_log.DebugFormat("[FreeSwitchDirectory] HandleDirectoryRequest called with {0}",request.ToString());
- Hashtable response = new Hashtable();
- // information in the request we might be interested in
+ // information in the request we might be interested in
- // Request 1 sip_auth for users account
+ // Request 1 sip_auth for users account
- //Event-Calling-Function=sofia_reg_parse_auth
- //Event-Calling-Line-Number=1494
- //action=sip_auth
- //sip_user_agent=Vivox-SDK-2.1.3010.6151-Mac%20(Feb-11-2009/16%3A42%3A41)
- //sip_auth_username=xhZuXKmRpECyr2AARJYyGgg%3D%3D (==)
- //sip_auth_realm=9.20.151.43
- //sip_contact_user=xhZuXKmRpECyr2AARJYyGgg%3D%3D (==)
- //sip_contact_host=192.168.0.3 // this shouldnt really be a local IP, investigate STUN servers
- //sip_to_user=xhZuXKmRpECyr2AARJYyGgg%3D%3D
- //sip_to_host=9.20.151.43
- //sip_auth_method=REGISTER
- //user=xhZuXKmRpECyr2AARJYyGgg%3D%3D
- //domain=9.20.151.43
- //ip=9.167.220.137 // this is the correct IP rather than sip_contact_host above when through a vpn or NAT setup
+ //Event-Calling-Function=sofia_reg_parse_auth
+ //Event-Calling-Line-Number=1494
+ //action=sip_auth
+ //sip_user_agent=Vivox-SDK-2.1.3010.6151-Mac%20(Feb-11-2009/16%3A42%3A41)
+ //sip_auth_username=xhZuXKmRpECyr2AARJYyGgg%3D%3D (==)
+ //sip_auth_realm=9.20.151.43
+ //sip_contact_user=xhZuXKmRpECyr2AARJYyGgg%3D%3D (==)
+ //sip_contact_host=192.168.0.3 // this shouldnt really be a local IP, investigate STUN servers
+ //sip_to_user=xhZuXKmRpECyr2AARJYyGgg%3D%3D
+ //sip_to_host=9.20.151.43
+ //sip_auth_method=REGISTER
+ //user=xhZuXKmRpECyr2AARJYyGgg%3D%3D
+ //domain=9.20.151.43
+ //ip=9.167.220.137 // this is the correct IP rather than sip_contact_host above when through a vpn or NAT setup
- foreach (DictionaryEntry item in request)
- {
- m_log.InfoFormat("[FreeSwitchDirectory] requestBody item {0} {1}", item.Key, item.Value);
- }
+ foreach (DictionaryEntry item in request)
+ {
+ m_log.InfoFormat("[FreeSwitchDirectory] requestBody item {0} {1}", item.Key, item.Value);
+ }
- string eventCallingFunction = (string) request["Event-Calling-Function"];
- if (eventCallingFunction == null)
- {
- eventCallingFunction = "sofia_reg_parse_auth";
- }
+ string eventCallingFunction = (string) request["Event-Calling-Function"];
+ if (eventCallingFunction == null)
+ {
+ eventCallingFunction = "sofia_reg_parse_auth";
+ }
- if (eventCallingFunction.Length == 0)
- {
- eventCallingFunction = "sofia_reg_parse_auth";
- }
+ if (eventCallingFunction.Length == 0)
+ {
+ eventCallingFunction = "sofia_reg_parse_auth";
+ }
- if (eventCallingFunction == "sofia_reg_parse_auth")
- {
- string sipAuthMethod = (string)request["sip_auth_method"];
+ if (eventCallingFunction == "sofia_reg_parse_auth")
+ {
+ string sipAuthMethod = (string)request["sip_auth_method"];
- if (sipAuthMethod == "REGISTER")
- {
- response = HandleRegister(request);
- }
- else if (sipAuthMethod == "INVITE")
- {
- response = HandleInvite(request);
- }
- else
- {
- m_log.ErrorFormat("[FreeSwitchVoice] HandleDirectoryRequest unknown sip_auth_method {0}",sipAuthMethod);
- response["int_response_code"] = 404;
- response["content_type"] = "text/xml";
- response["str_response_string"] = "";
- }
- }
- else if (eventCallingFunction == "switch_xml_locate_user")
- {
- response = HandleLocateUser(request);
- }
- else if (eventCallingFunction == "user_data_function") // gets called when an avatar to avatar call is made
- {
- response = HandleLocateUser(request);
- }
- else if (eventCallingFunction == "user_outgoing_channel")
- {
- response = HandleRegister(request);
- }
- else if (eventCallingFunction == "config_sofia") // happens once on freeswitch startup
- {
- response = HandleConfigSofia(request);
- }
- else if (eventCallingFunction == "switch_load_network_lists")
- {
- //response = HandleLoadNetworkLists(request);
- response["int_response_code"] = 404;
- response["keepalive"] = false;
- response["content_type"] = "text/xml";
- response["str_response_string"] = "";
- }
- else
- {
- m_log.ErrorFormat("[FreeSwitchVoice] HandleDirectoryRequest unknown Event-Calling-Function {0}",eventCallingFunction);
- response["int_response_code"] = 404;
- response["keepalive"] = false;
- response["content_type"] = "text/xml";
- response["str_response_string"] = "";
- }
- return response;
+ if (sipAuthMethod == "REGISTER")
+ {
+ response = HandleRegister(Context, Realm, request);
+ }
+ else if (sipAuthMethod == "INVITE")
+ {
+ response = HandleInvite(Context, Realm, request);
+ }
+ else
+ {
+ m_log.ErrorFormat("[FreeSwitchVoice] HandleDirectoryRequest unknown sip_auth_method {0}",sipAuthMethod);
+ response["int_response_code"] = 404;
+ response["content_type"] = "text/xml";
+ response["str_response_string"] = "";
+ }
+ }
+ else if (eventCallingFunction == "switch_xml_locate_user")
+ {
+ response = HandleLocateUser(Realm, request);
+ }
+ else if (eventCallingFunction == "user_data_function") // gets called when an avatar to avatar call is made
+ {
+ response = HandleLocateUser(Realm, request);
+ }
+ else if (eventCallingFunction == "user_outgoing_channel")
+ {
+ response = HandleRegister(Context, Realm, request);
+ }
+ else if (eventCallingFunction == "config_sofia") // happens once on freeswitch startup
+ {
+ response = HandleConfigSofia(Context, Realm, request);
+ }
+ else if (eventCallingFunction == "switch_load_network_lists")
+ {
+ //response = HandleLoadNetworkLists(request);
+ response["int_response_code"] = 404;
+ response["keepalive"] = false;
+ response["content_type"] = "text/xml";
+ response["str_response_string"] = "";
+ }
+ else
+ {
+ m_log.ErrorFormat("[FreeSwitchVoice] HandleDirectoryRequest unknown Event-Calling-Function {0}",eventCallingFunction);
+ response["int_response_code"] = 404;
+ response["keepalive"] = false;
+ response["content_type"] = "text/xml";
+ response["str_response_string"] = "";
+ }
+ }
+ return response;
}
- private Hashtable HandleRegister(Hashtable request)
+ private Hashtable HandleRegister(string Context, string Realm, Hashtable request)
{
m_log.Info("[FreeSwitchDirectory] HandleRegister called");
@@ -147,7 +155,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
response["content_type"] = "text/xml";
response["keepalive"] = false;
response["int_response_code"] = 200;
- response["str_response_string"] = String.Format(
+
+ response["str_response_string"] = String.Format(
"\r\n" +
"\r\n" +
"\r\n" +
@@ -158,19 +167,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
"\r\n" +
"\r\n" +
"\r\n" +
- "\r\n" +
+ "\r\n" +
""+
"\r\n" +
"\r\n" +
"\r\n" +
"\r\n" +
"\r\n",
- domain , user, password);
+ domain , user, password, Context);
return response;
}
- private Hashtable HandleInvite(Hashtable request)
+ private Hashtable HandleInvite(string Context, string Realm, Hashtable request)
{
m_log.Info("[FreeSwitchDirectory] HandleInvite called");
@@ -195,7 +204,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
"\r\n" +
"\r\n" +
"\r\n" +
- "\r\n" +
+ "\r\n" +
""+
"\r\n" +
"\r\n" +
@@ -205,20 +214,20 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
"\r\n" +
"\r\n" +
"\r\n" +
- "\r\n" +
+ "\r\n" +
""+
"\r\n" +
"\r\n" +
"\r\n" +
"\r\n" +
"\r\n",
- domain , user, password,sipRequestUser);
+ domain , user, password,sipRequestUser, Context);
return response;
}
- private Hashtable HandleLocateUser(Hashtable request)
+ private Hashtable HandleLocateUser(String Realm, Hashtable request)
{
m_log.Info("[FreeSwitchDirectory] HandleLocateUser called");
@@ -252,7 +261,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
return response;
}
- private Hashtable HandleConfigSofia(Hashtable request)
+ private Hashtable HandleConfigSofia(string Context, string Realm, Hashtable request)
{
m_log.Info("[FreeSwitchDirectory] HandleConfigSofia called");
@@ -285,7 +294,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
"\r\n"+
"\r\n"+
"\r\n"+
- "\r\n"+
+ "\r\n"+
"\r\n"+
"\r\n"+
"\r\n"+
@@ -300,7 +309,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
"\r\n" +
"\r\n" +
"\r\n",
- domain);
+ domain, Context);
return response;
}
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
index 5c562ac..3659299 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
@@ -95,6 +95,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
// private static IPEndPoint m_FreeSwitchServiceIP;
private int m_freeSwitchServicePort;
private string m_openSimWellKnownHTTPAddress;
+ private string m_freeSwitchContext;
private FreeSwitchDirectory m_FreeSwitchDirectory;
private FreeSwitchDialplan m_FreeSwitchDialplan;
@@ -151,6 +152,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
m_freeSwitchDefaultTimeout = m_config.GetInt("freeswitch_default_timeout", 5000);
// m_freeSwitchSubscribeRetry = m_config.GetInt("freeswitch_subscribe_retry", 120);
m_freeSwitchUrlResetPassword = m_config.GetString("freeswitch_password_reset_url", String.Empty);
+ m_freeSwitchContext = m_config.GetString("freeswitch_context", "public");
if (String.IsNullOrEmpty(m_freeSwitchServerUser) ||
String.IsNullOrEmpty(m_freeSwitchServerPass) ||
@@ -572,7 +574,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
"false\r\n"+
"",
m_freeSwitchRealm, m_freeSwitchSIPProxy, m_freeSwitchAttemptUseSTUN,
- m_freeSwitchSTUNServer, m_freeSwitchEchoServer, m_freeSwitchEchoPort,
+ m_freeSwitchEchoServer, m_freeSwitchEchoPort,
m_freeSwitchDefaultWellKnownIP, m_freeSwitchDefaultTimeout,
m_freeSwitchUrlResetPassword, "");
@@ -728,9 +730,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
string section = (string) requestBody["section"];
if (section == "directory")
- response = m_FreeSwitchDirectory.HandleDirectoryRequest(requestBody);
+ response = m_FreeSwitchDirectory.HandleDirectoryRequest(m_freeSwitchContext, m_freeSwitchRealm, requestBody);
else if (section == "dialplan")
- response = m_FreeSwitchDialplan.HandleDialplanRequest(requestBody);
+ response = m_FreeSwitchDialplan.HandleDialplanRequest(m_freeSwitchContext, m_freeSwitchRealm, requestBody);
else
m_log.WarnFormat("[FreeSwitchVoice]: section was {0}", section);
--
cgit v1.1