* Patch from otakup0pe to help freeswitch play nice with complex existing freeswitch configurations.
* Thanks! fixes mantis #3899trunk
parent
05c24a648d
commit
eb1a6e9b87
|
@ -98,6 +98,7 @@ what it is today.
|
|||
* nornalbion
|
||||
* Omar Vera Ustariz (IBM)
|
||||
* openlifegrid.com
|
||||
* otakup0pe
|
||||
* ralphos
|
||||
* RemedyTomm
|
||||
* Richard Alimi (IBM)
|
||||
|
|
|
@ -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"] = @"<?xml version=""1.0"" encoding=""utf-8""?>
|
||||
<document type=""freeswitch/xml"">
|
||||
<section name=""dialplan"">
|
||||
<context name=""default"">
|
||||
|
||||
<!-- dial via SIP uri -->
|
||||
<extension name=""sip_uri"">
|
||||
<condition field=""destination_number"" expression=""^sip:(.*)$"">
|
||||
<action application=""bridge"" data=""sofia/${use_profile}/$1""/>
|
||||
<!--<action application=""bridge"" data=""$1""/>-->
|
||||
</condition>
|
||||
</extension>
|
||||
|
||||
<extension name=""opensim_conferences"">
|
||||
<condition field=""destination_number"" expression=""^confctl-(.*)$"">
|
||||
<action application=""answer""/>
|
||||
<action application=""conference"" data=""$1-${domain_name}@default""/>
|
||||
</condition>
|
||||
</extension>
|
||||
|
||||
<extension name=""opensim_conf"">
|
||||
<condition field=""destination_number"" expression=""^conf-(.*)$"">
|
||||
<action application=""answer""/>
|
||||
<action application=""conference"" data=""$1-${domain_name}@default""/>
|
||||
</condition>
|
||||
</extension>
|
||||
|
||||
<extension name=""avatar"">
|
||||
<condition field=""destination_number"" expression=""^(x.*)$"">
|
||||
<action application=""bridge"" data=""user/$1""/>
|
||||
</condition>
|
||||
</extension>
|
||||
|
||||
</context>
|
||||
</section>
|
||||
</document>";
|
||||
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(@"<?xml version=""1.0"" encoding=""utf-8""?>
|
||||
<document type=""freeswitch/xml"">
|
||||
<section name=""dialplan"">
|
||||
<context name=""{0}"">" +
|
||||
|
||||
/* <!-- dial via SIP uri -->
|
||||
<extension name=""sip_uri"">
|
||||
<condition field=""destination_number"" expression=""^sip:(.*)$"">
|
||||
<action application=""bridge"" data=""sofia/${use_profile}/$1""/>
|
||||
<!--<action application=""bridge"" data=""$1""/>-->
|
||||
</condition>
|
||||
</extension>*/
|
||||
|
||||
@"<extension name=""opensim_conferences"">
|
||||
<condition field=""destination_number"" expression=""^confctl-(.*)$"">
|
||||
<action application=""answer""/>
|
||||
<action application=""conference"" data=""$1-{1}@grid""/>
|
||||
</condition>
|
||||
</extension>
|
||||
|
||||
<extension name=""opensim_conf"">
|
||||
<condition field=""destination_number"" expression=""^conf-(.*)$"">
|
||||
<action application=""answer""/>
|
||||
<action application=""conference"" data=""$1-${domain_name}@default""/>
|
||||
</condition>
|
||||
</extension>
|
||||
|
||||
<extension name=""avatar"">
|
||||
<condition field=""destination_number"" expression=""^(x.*)$"">
|
||||
<action application=""bridge"" data=""user/$1""/>
|
||||
</condition>
|
||||
</extension>
|
||||
|
||||
</context>
|
||||
</section>
|
||||
</document>", Context, Realm);
|
||||
}
|
||||
|
||||
return response;
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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(
|
||||
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" +
|
||||
"<document type=\"freeswitch/xml\">\r\n" +
|
||||
"<section name=\"directory\" description=\"User Directory\">\r\n" +
|
||||
|
@ -158,19 +167,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
|
|||
"<param name=\"dial-string\" value=\"{{sip_contact_user={1}}}{{presence_id=${{dialed_user}}@${{dialed_domain}}}}${{sofia_contact(${{dialed_user}}@${{dialed_domain}})}}\"/>\r\n" +
|
||||
"</params>\r\n" +
|
||||
"<variables>\r\n" +
|
||||
"<variable name=\"user_context\" value=\"default\" />\r\n" +
|
||||
"<variable name=\"user_context\" value=\"{3}\" />\r\n" +
|
||||
"<variable name=\"presence_id\" value=\"{1}@{0}\"/>"+
|
||||
"</variables>\r\n" +
|
||||
"</user>\r\n" +
|
||||
"</domain>\r\n" +
|
||||
"</section>\r\n" +
|
||||
"</document>\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
|
|||
"<param name=\"dial-string\" value=\"{{sip_contact_user={1}}}{{presence_id=${1}@${{dialed_domain}}}}${{sofia_contact(${1}@${{dialed_domain}})}}\"/>\r\n" +
|
||||
"</params>\r\n" +
|
||||
"<variables>\r\n" +
|
||||
"<variable name=\"user_context\" value=\"default\" />\r\n" +
|
||||
"<variable name=\"user_context\" value=\"{4}\" />\r\n" +
|
||||
"<variable name=\"presence_id\" value=\"{1}@$${{domain}}\"/>"+
|
||||
"</variables>\r\n" +
|
||||
"</user>\r\n" +
|
||||
|
@ -205,20 +214,20 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
|
|||
"<param name=\"dial-string\" value=\"{{sip_contact_user={1}}}{{presence_id=${3}@${{dialed_domain}}}}${{sofia_contact(${3}@${{dialed_domain}})}}\"/>\r\n" +
|
||||
"</params>\r\n" +
|
||||
"<variables>\r\n" +
|
||||
"<variable name=\"user_context\" value=\"default\" />\r\n" +
|
||||
"<variable name=\"user_context\" value=\"{4}\" />\r\n" +
|
||||
"<variable name=\"presence_id\" value=\"{3}@$${{domain}}\"/>"+
|
||||
"</variables>\r\n" +
|
||||
"</user>\r\n" +
|
||||
"</domain>\r\n" +
|
||||
"</section>\r\n" +
|
||||
"</document>\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
|
|||
"<param name=\"retry-seconds\" value=\"30\"/>\r\n"+
|
||||
"<param name=\"extension\" value=\"$${{default_provider_contact}}\"/>\r\n"+
|
||||
"<param name=\"contact-params\" value=\"domain_name=$${{domain}}\"/>\r\n"+
|
||||
"<param name=\"context\" value=\"public\"/>\r\n"+
|
||||
"<param name=\"context\" value=\"{1}\"/>\r\n"+
|
||||
"</gateway>\r\n"+
|
||||
"</gateways>\r\n"+
|
||||
"<params>\r\n"+
|
||||
|
@ -300,7 +309,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
|
|||
"</domain>\r\n" +
|
||||
"</section>\r\n" +
|
||||
"</document>\r\n",
|
||||
domain);
|
||||
domain, Context);
|
||||
|
||||
return response;
|
||||
}
|
||||
|
|
|
@ -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
|
|||
"<App.NoBottomLogo>false</App.NoBottomLogo>\r\n"+
|
||||
"</VCConfiguration>",
|
||||
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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue