HGInventoryService now uses the actual authority portion of the user's key to verify the key.

0.6.5-rc1
diva 2009-03-30 19:26:25 +00:00
parent 2914bfe7b0
commit 4cbf963354
3 changed files with 1160 additions and 1159 deletions

View File

@ -1,116 +1,118 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Nwc.XmlRpc; using Nwc.XmlRpc;
using OpenMetaverse; using OpenMetaverse;
namespace OpenSim.Framework.Communications.Clients namespace OpenSim.Framework.Communications.Clients
{ {
public class AuthClient public class AuthClient
{ {
public static string GetNewKey(string authurl, UUID userID, UUID authToken) public static string GetNewKey(string authurl, UUID userID, UUID authToken)
{ {
//Hashtable keyParams = new Hashtable(); //Hashtable keyParams = new Hashtable();
//keyParams["user_id"] = userID; //keyParams["user_id"] = userID;
//keyParams["auth_token"] = authKey; //keyParams["auth_token"] = authKey;
List<string> SendParams = new List<string>(); List<string> SendParams = new List<string>();
SendParams.Add(userID.ToString()); SendParams.Add(userID.ToString());
SendParams.Add(authToken.ToString()); SendParams.Add(authToken.ToString());
XmlRpcRequest request = new XmlRpcRequest("hg_new_auth_key", SendParams); XmlRpcRequest request = new XmlRpcRequest("hg_new_auth_key", SendParams);
XmlRpcResponse reply; XmlRpcResponse reply;
try try
{ {
reply = request.Send(authurl, 6000); reply = request.Send(authurl, 6000);
} }
catch (Exception e) catch (Exception e)
{ {
System.Console.WriteLine("[HGrid]: Failed to get new key. Reason: " + e.Message); System.Console.WriteLine("[HGrid]: Failed to get new key. Reason: " + e.Message);
return string.Empty; return string.Empty;
} }
if (!reply.IsFault) if (!reply.IsFault)
{ {
string newKey = string.Empty; string newKey = string.Empty;
if (reply.Value != null) if (reply.Value != null)
newKey = (string)reply.Value; newKey = (string)reply.Value;
return newKey; return newKey;
} }
else else
{ {
System.Console.WriteLine("[HGrid]: XmlRpc request to get auth key failed with message {0}" + reply.FaultString + ", code " + reply.FaultCode); System.Console.WriteLine("[HGrid]: XmlRpc request to get auth key failed with message {0}" + reply.FaultString + ", code " + reply.FaultCode);
return string.Empty; return string.Empty;
} }
} }
public static bool VerifyKey(string authurl, UUID userID, string authKey) public static bool VerifyKey(string authurl, UUID userID, string authKey)
{ {
List<string> SendParams = new List<string>(); List<string> SendParams = new List<string>();
SendParams.Add(userID.ToString()); SendParams.Add(userID.ToString());
SendParams.Add(authKey); SendParams.Add(authKey);
XmlRpcRequest request = new XmlRpcRequest("hg_verify_auth_key", SendParams); System.Console.WriteLine("[HGrid]: Verifying user key with authority " + authurl);
XmlRpcResponse reply;
try XmlRpcRequest request = new XmlRpcRequest("hg_verify_auth_key", SendParams);
{ XmlRpcResponse reply;
reply = request.Send(authurl, 10000); try
} {
catch (Exception e) reply = request.Send(authurl, 10000);
{ }
System.Console.WriteLine("[HGrid]: Failed to verify key. Reason: " + e.Message); catch (Exception e)
return false; {
} System.Console.WriteLine("[HGrid]: Failed to verify key. Reason: " + e.Message);
return false;
if (reply != null) }
{
if (!reply.IsFault) if (reply != null)
{ {
bool success = false; if (!reply.IsFault)
if (reply.Value != null) {
success = (bool)reply.Value; bool success = false;
if (reply.Value != null)
return success; success = (bool)reply.Value;
}
else return success;
{ }
System.Console.WriteLine("[HGrid]: XmlRpc request to verify key failed with message {0}" + reply.FaultString + ", code " + reply.FaultCode); else
return false; {
} System.Console.WriteLine("[HGrid]: XmlRpc request to verify key failed with message {0}" + reply.FaultString + ", code " + reply.FaultCode);
} return false;
else }
{ }
System.Console.WriteLine("[HGrid]: XmlRpc request to verify key returned null reply"); else
return false; {
} System.Console.WriteLine("[HGrid]: XmlRpc request to verify key returned null reply");
} return false;
} }
} }
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,328 +1,328 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the * * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Net; using System.Net;
using System.Reflection; using System.Reflection;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Communications.Capabilities; using OpenSim.Framework.Communications.Capabilities;
using OpenSim.Framework.Servers; using OpenSim.Framework.Servers;
using OpenMetaverse; using OpenMetaverse;
using log4net; using log4net;
using Nini.Config; using Nini.Config;
using Nwc.XmlRpc; using Nwc.XmlRpc;
namespace OpenSim.Framework.Communications.Services namespace OpenSim.Framework.Communications.Services
{ {
public class HGLoginAuthService : LoginService public class HGLoginAuthService : LoginService
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
protected NetworkServersInfo m_serversInfo; protected NetworkServersInfo m_serversInfo;
protected bool m_authUsers = false; protected bool m_authUsers = false;
/// <summary> /// <summary>
/// Used by the login service to make requests to the inventory service. /// Used by the login service to make requests to the inventory service.
/// </summary> /// </summary>
protected IInterServiceInventoryServices m_interServiceInventoryService; protected IInterServiceInventoryServices m_interServiceInventoryService;
/// <summary> /// <summary>
/// Used to make requests to the local regions. /// Used to make requests to the local regions.
/// </summary> /// </summary>
protected ILoginServiceToRegionsConnector m_regionsConnector; protected ILoginServiceToRegionsConnector m_regionsConnector;
public HGLoginAuthService( public HGLoginAuthService(
UserManagerBase userManager, string welcomeMess, UserManagerBase userManager, string welcomeMess,
IInterServiceInventoryServices interServiceInventoryService, IInterServiceInventoryServices interServiceInventoryService,
NetworkServersInfo serversInfo, NetworkServersInfo serversInfo,
bool authenticate, LibraryRootFolder libraryRootFolder, ILoginServiceToRegionsConnector regionsConnector) bool authenticate, LibraryRootFolder libraryRootFolder, ILoginServiceToRegionsConnector regionsConnector)
: base(userManager, libraryRootFolder, welcomeMess) : base(userManager, libraryRootFolder, welcomeMess)
{ {
this.m_serversInfo = serversInfo; this.m_serversInfo = serversInfo;
if (m_serversInfo != null) if (m_serversInfo != null)
{ {
m_defaultHomeX = this.m_serversInfo.DefaultHomeLocX; m_defaultHomeX = this.m_serversInfo.DefaultHomeLocX;
m_defaultHomeY = this.m_serversInfo.DefaultHomeLocY; m_defaultHomeY = this.m_serversInfo.DefaultHomeLocY;
} }
m_authUsers = authenticate; m_authUsers = authenticate;
m_interServiceInventoryService = interServiceInventoryService; m_interServiceInventoryService = interServiceInventoryService;
m_regionsConnector = regionsConnector; m_regionsConnector = regionsConnector;
m_inventoryService = interServiceInventoryService; m_inventoryService = interServiceInventoryService;
} }
public void SetServersInfo(NetworkServersInfo sinfo) public void SetServersInfo(NetworkServersInfo sinfo)
{ {
m_serversInfo = sinfo; m_serversInfo = sinfo;
} }
public override XmlRpcResponse XmlRpcLoginMethod(XmlRpcRequest request) public override XmlRpcResponse XmlRpcLoginMethod(XmlRpcRequest request)
{ {
m_log.Info("[HGLOGIN] HGLogin called " + request.MethodName); m_log.Info("[HGLOGIN] HGLogin called " + request.MethodName);
XmlRpcResponse response = base.XmlRpcLoginMethod(request); XmlRpcResponse response = base.XmlRpcLoginMethod(request);
Hashtable responseData = (Hashtable)response.Value; Hashtable responseData = (Hashtable)response.Value;
responseData["grid_service"] = m_serversInfo.GridURL; responseData["grid_service"] = m_serversInfo.GridURL;
responseData["grid_service_send_key"] = m_serversInfo.GridSendKey; responseData["grid_service_send_key"] = m_serversInfo.GridSendKey;
responseData["inventory_service"] = m_serversInfo.InventoryURL; responseData["inventory_service"] = m_serversInfo.InventoryURL;
responseData["asset_service"] = m_serversInfo.AssetURL; responseData["asset_service"] = m_serversInfo.AssetURL;
responseData["asset_service_send_key"] = m_serversInfo.AssetSendKey; responseData["asset_service_send_key"] = m_serversInfo.AssetSendKey;
int x = (Int32)responseData["region_x"]; int x = (Int32)responseData["region_x"];
int y = (Int32)responseData["region_y"]; int y = (Int32)responseData["region_y"];
uint ux = (uint)(x / Constants.RegionSize); uint ux = (uint)(x / Constants.RegionSize);
uint uy = (uint)(y / Constants.RegionSize); uint uy = (uint)(y / Constants.RegionSize);
ulong regionHandle = Util.UIntsToLong(ux, uy); ulong regionHandle = Util.UIntsToLong(ux, uy);
responseData["region_handle"] = regionHandle.ToString(); responseData["region_handle"] = regionHandle.ToString();
// Let's remove the seed cap from the login // Let's remove the seed cap from the login
//responseData.Remove("seed_capability"); //responseData.Remove("seed_capability");
// Let's add the appearance // Let's add the appearance
UUID userID = UUID.Zero; UUID userID = UUID.Zero;
UUID.TryParse((string)responseData["agent_id"], out userID); UUID.TryParse((string)responseData["agent_id"], out userID);
AvatarAppearance appearance = m_userManager.GetUserAppearance(userID); AvatarAppearance appearance = m_userManager.GetUserAppearance(userID);
if (appearance == null) if (appearance == null)
{ {
m_log.WarnFormat("[INTER]: Appearance not found for {0}. Creating default.", userID); m_log.WarnFormat("[INTER]: Appearance not found for {0}. Creating default.", userID);
appearance = new AvatarAppearance(); appearance = new AvatarAppearance();
} }
responseData["appearance"] = appearance.ToHashTable(); responseData["appearance"] = appearance.ToHashTable();
// Let's also send the auth token // Let's also send the auth token
UUID token = UUID.Random(); UUID token = UUID.Random();
responseData["auth_token"] = token.ToString(); responseData["auth_token"] = token.ToString();
UserProfileData userProfile = m_userManager.GetUserProfile(userID); UserProfileData userProfile = m_userManager.GetUserProfile(userID);
if (userProfile != null) if (userProfile != null)
{ {
userProfile.WebLoginKey = token; userProfile.WebLoginKey = token;
m_userManager.CommitAgent(ref userProfile); m_userManager.CommitAgent(ref userProfile);
} }
return response; return response;
} }
public XmlRpcResponse XmlRpcGenerateKeyMethod(XmlRpcRequest request) public XmlRpcResponse XmlRpcGenerateKeyMethod(XmlRpcRequest request)
{ {
// Verify the key of who's calling // Verify the key of who's calling
UUID userID = UUID.Zero; UUID userID = UUID.Zero;
UUID authKey = UUID.Zero; UUID authKey = UUID.Zero;
UUID.TryParse((string)request.Params[0], out userID); UUID.TryParse((string)request.Params[0], out userID);
UUID.TryParse((string)request.Params[1], out authKey); UUID.TryParse((string)request.Params[1], out authKey);
m_log.InfoFormat("[HGLOGIN] HGGenerateKey called with authToken ", authKey); m_log.InfoFormat("[HGLOGIN] HGGenerateKey called with authToken ", authKey);
string newKey = string.Empty; string newKey = string.Empty;
if (!(m_userManager is IAuthentication)) if (!(m_userManager is IAuthentication))
{ {
m_log.Debug("[HGLOGIN]: UserManager is not IAuthentication service. Returning empty key."); m_log.Debug("[HGLOGIN]: UserManager is not IAuthentication service. Returning empty key.");
} }
else else
{ {
newKey = ((IAuthentication)m_userManager).GetNewKey(m_serversInfo.UserURL, userID, authKey); newKey = ((IAuthentication)m_userManager).GetNewKey(m_serversInfo.UserURL, userID, authKey);
} }
XmlRpcResponse response = new XmlRpcResponse(); XmlRpcResponse response = new XmlRpcResponse();
response.Value = (string) newKey; response.Value = (string) newKey;
return response; return response;
} }
public XmlRpcResponse XmlRpcVerifyKeyMethod(XmlRpcRequest request) public XmlRpcResponse XmlRpcVerifyKeyMethod(XmlRpcRequest request)
{ {
bool success = false; bool success = false;
if (request.Params.Count >= 2) if (request.Params.Count >= 2)
{ {
// Verify the key of who's calling // Verify the key of who's calling
UUID userID = UUID.Zero; UUID userID = UUID.Zero;
string authKey = string.Empty; string authKey = string.Empty;
if (UUID.TryParse((string)request.Params[0], out userID)) if (UUID.TryParse((string)request.Params[0], out userID))
{ {
authKey = (string)request.Params[1]; authKey = (string)request.Params[1];
m_log.InfoFormat("[HGLOGIN] HGVerifyKey called with key {0}", authKey); m_log.InfoFormat("[HGLOGIN] HGVerifyKey called with key {0}", authKey);
if (!(m_userManager is IAuthentication)) if (!(m_userManager is IAuthentication))
{ {
m_log.Debug("[HGLOGIN]: UserManager is not IAuthentication service. Denying."); m_log.Debug("[HGLOGIN]: UserManager is not IAuthentication service. Denying.");
} }
else else
{ {
success = ((IAuthentication)m_userManager).VerifyKey(userID, authKey); success = ((IAuthentication)m_userManager).VerifyKey(userID, authKey);
} }
} }
} }
m_log.DebugFormat("[HGLOGIN]: Response to VerifyKey is {0}", success); m_log.DebugFormat("[HGLOGIN]: Response to VerifyKey is {0}", success);
XmlRpcResponse response = new XmlRpcResponse(); XmlRpcResponse response = new XmlRpcResponse();
response.Value = success; response.Value = success;
return response; return response;
} }
public override UserProfileData GetTheUser(string firstname, string lastname) public override UserProfileData GetTheUser(string firstname, string lastname)
{ {
UserProfileData profile = m_userManager.GetUserProfile(firstname, lastname); UserProfileData profile = m_userManager.GetUserProfile(firstname, lastname);
if (profile != null) if (profile != null)
{ {
return profile; return profile;
} }
if (!m_authUsers) if (!m_authUsers)
{ {
//no current user account so make one //no current user account so make one
m_log.Info("[LOGIN]: No user account found so creating a new one."); m_log.Info("[LOGIN]: No user account found so creating a new one.");
m_userManager.AddUser(firstname, lastname, "test", "", m_defaultHomeX, m_defaultHomeY); m_userManager.AddUser(firstname, lastname, "test", "", m_defaultHomeX, m_defaultHomeY);
return m_userManager.GetUserProfile(firstname, lastname); return m_userManager.GetUserProfile(firstname, lastname);
} }
return null; return null;
} }
public override bool AuthenticateUser(UserProfileData profile, string password) public override bool AuthenticateUser(UserProfileData profile, string password)
{ {
if (!m_authUsers) if (!m_authUsers)
{ {
//for now we will accept any password in sandbox mode //for now we will accept any password in sandbox mode
m_log.Info("[LOGIN]: Authorising user (no actual password check)"); m_log.Info("[LOGIN]: Authorising user (no actual password check)");
return true; return true;
} }
else else
{ {
m_log.Info( m_log.Info(
"[LOGIN]: Authenticating " + profile.FirstName + " " + profile.SurName); "[LOGIN]: Authenticating " + profile.FirstName + " " + profile.SurName);
if (!password.StartsWith("$1$")) if (!password.StartsWith("$1$"))
password = "$1$" + Util.Md5Hash(password); password = "$1$" + Util.Md5Hash(password);
password = password.Remove(0, 3); //remove $1$ password = password.Remove(0, 3); //remove $1$
string s = Util.Md5Hash(password + ":" + profile.PasswordSalt); string s = Util.Md5Hash(password + ":" + profile.PasswordSalt);
bool loginresult = (profile.PasswordHash.Equals(s.ToString(), StringComparison.InvariantCultureIgnoreCase) bool loginresult = (profile.PasswordHash.Equals(s.ToString(), StringComparison.InvariantCultureIgnoreCase)
|| profile.PasswordHash.Equals(password, StringComparison.InvariantCultureIgnoreCase)); || profile.PasswordHash.Equals(password, StringComparison.InvariantCultureIgnoreCase));
return loginresult; return loginresult;
} }
} }
protected override RegionInfo RequestClosestRegion(string region) protected override RegionInfo RequestClosestRegion(string region)
{ {
return m_regionsConnector.RequestClosestRegion(region); return m_regionsConnector.RequestClosestRegion(region);
} }
protected override RegionInfo GetRegionInfo(ulong homeRegionHandle) protected override RegionInfo GetRegionInfo(ulong homeRegionHandle)
{ {
return m_regionsConnector.RequestNeighbourInfo(homeRegionHandle); return m_regionsConnector.RequestNeighbourInfo(homeRegionHandle);
} }
protected override RegionInfo GetRegionInfo(UUID homeRegionId) protected override RegionInfo GetRegionInfo(UUID homeRegionId)
{ {
return m_regionsConnector.RequestNeighbourInfo(homeRegionId); return m_regionsConnector.RequestNeighbourInfo(homeRegionId);
} }
/// <summary> /// <summary>
/// Not really informing the region. Just filling out the response fields related to the region. /// Not really informing the region. Just filling out the response fields related to the region.
/// </summary> /// </summary>
/// <param name="sim"></param> /// <param name="sim"></param>
/// <param name="user"></param> /// <param name="user"></param>
/// <param name="response"></param> /// <param name="response"></param>
/// <returns>true if the region was successfully contacted, false otherwise</returns> /// <returns>true if the region was successfully contacted, false otherwise</returns>
protected override bool PrepareLoginToRegion(RegionInfo regionInfo, UserProfileData user, LoginResponse response) protected override bool PrepareLoginToRegion(RegionInfo regionInfo, UserProfileData user, LoginResponse response)
{ {
IPEndPoint endPoint = regionInfo.ExternalEndPoint; IPEndPoint endPoint = regionInfo.ExternalEndPoint;
response.SimAddress = endPoint.Address.ToString(); response.SimAddress = endPoint.Address.ToString();
response.SimPort = (uint)endPoint.Port; response.SimPort = (uint)endPoint.Port;
response.RegionX = regionInfo.RegionLocX; response.RegionX = regionInfo.RegionLocX;
response.RegionY = regionInfo.RegionLocY; response.RegionY = regionInfo.RegionLocY;
response.SimHttpPort = regionInfo.HttpPort; response.SimHttpPort = regionInfo.HttpPort;
string capsPath = CapsUtil.GetRandomCapsObjectPath(); string capsPath = CapsUtil.GetRandomCapsObjectPath();
string capsSeedPath = CapsUtil.GetCapsSeedPath(capsPath); string capsSeedPath = CapsUtil.GetCapsSeedPath(capsPath);
// Don't use the following! It Fails for logging into any region not on the same port as the http server! // Don't use the following! It Fails for logging into any region not on the same port as the http server!
// Kept here so it doesn't happen again! // Kept here so it doesn't happen again!
// response.SeedCapability = regionInfo.ServerURI + capsSeedPath; // response.SeedCapability = regionInfo.ServerURI + capsSeedPath;
string seedcap = "http://"; string seedcap = "http://";
if (m_serversInfo.HttpUsesSSL) if (m_serversInfo.HttpUsesSSL)
{ {
seedcap = "https://" + m_serversInfo.HttpSSLCN + ":" + regionInfo.HttpPort + capsSeedPath; seedcap = "https://" + m_serversInfo.HttpSSLCN + ":" + regionInfo.HttpPort + capsSeedPath;
} }
else else
{ {
seedcap = "http://" + regionInfo.ExternalHostName + ":" + regionInfo.HttpPort + capsSeedPath; seedcap = "http://" + regionInfo.ExternalHostName + ":" + regionInfo.HttpPort + capsSeedPath;
} }
response.SeedCapability = seedcap; response.SeedCapability = seedcap;
// Notify the target of an incoming user // Notify the target of an incoming user
m_log.InfoFormat( m_log.InfoFormat(
"[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection", "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection",
regionInfo.RegionName, response.RegionX, response.RegionY, regionInfo.ServerURI); regionInfo.RegionName, response.RegionX, response.RegionY, regionInfo.ServerURI);
// Update agent with target sim // Update agent with target sim
user.CurrentAgent.Region = regionInfo.RegionID; user.CurrentAgent.Region = regionInfo.RegionID;
user.CurrentAgent.Handle = regionInfo.RegionHandle; user.CurrentAgent.Handle = regionInfo.RegionHandle;
return true; return true;
} }
public override void LogOffUser(UserProfileData theUser, string message) public override void LogOffUser(UserProfileData theUser, string message)
{ {
RegionInfo SimInfo; RegionInfo SimInfo;
try try
{ {
SimInfo = this.m_regionsConnector.RequestNeighbourInfo(theUser.CurrentAgent.Handle); SimInfo = this.m_regionsConnector.RequestNeighbourInfo(theUser.CurrentAgent.Handle);
if (SimInfo == null) if (SimInfo == null)
{ {
m_log.Error("[LOCAL LOGIN]: Region user was in isn't currently logged in"); m_log.Error("[LOCAL LOGIN]: Region user was in isn't currently logged in");
return; return;
} }
} }
catch (Exception) catch (Exception)
{ {
m_log.Error("[LOCAL LOGIN]: Unable to look up region to log user off"); m_log.Error("[LOCAL LOGIN]: Unable to look up region to log user off");
return; return;
} }
m_regionsConnector.LogOffUserFromGrid(SimInfo.RegionHandle, theUser.ID, theUser.CurrentAgent.SecureSessionID, "Logging you off"); m_regionsConnector.LogOffUserFromGrid(SimInfo.RegionHandle, theUser.ID, theUser.CurrentAgent.SecureSessionID, "Logging you off");
} }
} }
} }