Allow a client to pass a scope id to log into in the login XML / LLSD

slimupdates
Melanie 2010-04-27 03:48:49 +01:00
parent edde0be0a0
commit 1e743eab6d
3 changed files with 42 additions and 17 deletions

View File

@ -72,6 +72,9 @@ namespace OpenSim.Server.Handlers.Login
string last = requestData["last"].ToString(); string last = requestData["last"].ToString();
string passwd = requestData["passwd"].ToString(); string passwd = requestData["passwd"].ToString();
string startLocation = string.Empty; string startLocation = string.Empty;
UUID scopeID = UUID.Zero;
if (requestData["scope_id"] != null)
scopeID = new UUID(requestData["scope_id"].ToString());
if (requestData.ContainsKey("start")) if (requestData.ContainsKey("start"))
startLocation = requestData["start"].ToString(); startLocation = requestData["start"].ToString();
@ -83,7 +86,7 @@ namespace OpenSim.Server.Handlers.Login
m_log.InfoFormat("[LOGIN]: XMLRPC Login Requested for {0} {1}, starting in {2}, using {3}", first, last, startLocation, clientVersion); m_log.InfoFormat("[LOGIN]: XMLRPC Login Requested for {0} {1}, starting in {2}, using {3}", first, last, startLocation, clientVersion);
LoginResponse reply = null; LoginResponse reply = null;
reply = m_LocalService.Login(first, last, passwd, startLocation, remoteClient); reply = m_LocalService.Login(first, last, passwd, startLocation, scopeID, remoteClient);
XmlRpcResponse response = new XmlRpcResponse(); XmlRpcResponse response = new XmlRpcResponse();
response.Value = reply.ToHashtable(); response.Value = reply.ToHashtable();
@ -109,10 +112,15 @@ namespace OpenSim.Server.Handlers.Login
if (map.ContainsKey("start")) if (map.ContainsKey("start"))
startLocation = map["start"].AsString(); startLocation = map["start"].AsString();
UUID scopeID = UUID.Zero;
if (map.ContainsKey("scope_id"))
scopeID = new UUID(map["scope_id"].AsString());
m_log.Info("[LOGIN]: LLSD Login Requested for: '" + map["first"].AsString() + "' '" + map["last"].AsString() + "' / " + startLocation); m_log.Info("[LOGIN]: LLSD Login Requested for: '" + map["first"].AsString() + "' '" + map["last"].AsString() + "' / " + startLocation);
LoginResponse reply = null; LoginResponse reply = null;
reply = m_LocalService.Login(map["first"].AsString(), map["last"].AsString(), map["passwd"].AsString(), startLocation, remoteClient); reply = m_LocalService.Login(map["first"].AsString(), map["last"].AsString(), map["passwd"].AsString(), startLocation, scopeID, remoteClient);
return reply.ToOSDMap(); return reply.ToOSDMap();
} }

View File

@ -31,6 +31,7 @@ using System.Collections.Generic;
using System.Net; using System.Net;
using OpenMetaverse.StructuredData; using OpenMetaverse.StructuredData;
using OpenMetaverse;
namespace OpenSim.Services.Interfaces namespace OpenSim.Services.Interfaces
{ {
@ -46,7 +47,7 @@ namespace OpenSim.Services.Interfaces
public interface ILoginService public interface ILoginService
{ {
LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, IPEndPoint clientIP); LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, UUID scopeID, IPEndPoint clientIP);
} }

View File

@ -147,7 +147,7 @@ namespace OpenSim.Services.LLLoginService
{ {
} }
public LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, IPEndPoint clientIP) public LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, UUID scopeID, IPEndPoint clientIP)
{ {
bool success = false; bool success = false;
UUID session = UUID.Random(); UUID session = UUID.Random();
@ -157,7 +157,7 @@ namespace OpenSim.Services.LLLoginService
// //
// Get the account and check that it exists // Get the account and check that it exists
// //
UserAccount account = m_UserAccountService.GetUserAccount(UUID.Zero, firstName, lastName); UserAccount account = m_UserAccountService.GetUserAccount(scopeID, firstName, lastName);
if (account == null) if (account == null)
{ {
m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: user not found"); m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: user not found");
@ -170,6 +170,22 @@ namespace OpenSim.Services.LLLoginService
return LLFailedLoginResponse.LoginBlockedProblem; return LLFailedLoginResponse.LoginBlockedProblem;
} }
// If a scope id is requested, check that the account is in
// that scope, or unscoped.
//
if (scopeID != UUID.Zero)
{
if (account.ScopeID != scopeID && account.ScopeID != UUID.Zero)
{
m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: user not found");
return LLFailedLoginResponse.UserProblem;
}
}
else
{
scopeID = account.ScopeID;
}
// //
// Authenticate this user // Authenticate this user
// //
@ -219,7 +235,7 @@ namespace OpenSim.Services.LLLoginService
// Get the home region // Get the home region
if ((presence.HomeRegionID != UUID.Zero) && m_GridService != null) if ((presence.HomeRegionID != UUID.Zero) && m_GridService != null)
{ {
home = m_GridService.GetRegionByUUID(account.ScopeID, presence.HomeRegionID); home = m_GridService.GetRegionByUUID(scopeID, presence.HomeRegionID);
} }
} }
@ -230,7 +246,7 @@ namespace OpenSim.Services.LLLoginService
Vector3 position = Vector3.Zero; Vector3 position = Vector3.Zero;
Vector3 lookAt = Vector3.Zero; Vector3 lookAt = Vector3.Zero;
GridRegion gatekeeper = null; GridRegion gatekeeper = null;
GridRegion destination = FindDestination(account, presence, session, startLocation, out gatekeeper, out where, out position, out lookAt); GridRegion destination = FindDestination(account, scopeID, presence, session, startLocation, out gatekeeper, out where, out position, out lookAt);
if (destination == null) if (destination == null)
{ {
m_PresenceService.LogoutAgent(session, presence.Position, presence.LookAt); m_PresenceService.LogoutAgent(session, presence.Position, presence.LookAt);
@ -286,7 +302,7 @@ namespace OpenSim.Services.LLLoginService
} }
} }
protected GridRegion FindDestination(UserAccount account, PresenceInfo pinfo, UUID sessionID, string startLocation, out GridRegion gatekeeper, out string where, out Vector3 position, out Vector3 lookAt) protected GridRegion FindDestination(UserAccount account, UUID scopeID, PresenceInfo pinfo, UUID sessionID, string startLocation, out GridRegion gatekeeper, out string where, out Vector3 position, out Vector3 lookAt)
{ {
m_log.DebugFormat("[LLOGIN SERVICE]: FindDestination for start location {0}", startLocation); m_log.DebugFormat("[LLOGIN SERVICE]: FindDestination for start location {0}", startLocation);
@ -318,7 +334,7 @@ namespace OpenSim.Services.LLLoginService
} }
else else
{ {
region = m_GridService.GetRegionByUUID(account.ScopeID, pinfo.HomeRegionID); region = m_GridService.GetRegionByUUID(scopeID, pinfo.HomeRegionID);
if (null == region) if (null == region)
{ {
@ -332,7 +348,7 @@ namespace OpenSim.Services.LLLoginService
if (tryDefaults) if (tryDefaults)
{ {
List<GridRegion> defaults = m_GridService.GetDefaultRegions(account.ScopeID); List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID);
if (defaults != null && defaults.Count > 0) if (defaults != null && defaults.Count > 0)
{ {
region = defaults[0]; region = defaults[0];
@ -342,7 +358,7 @@ namespace OpenSim.Services.LLLoginService
{ {
m_log.WarnFormat("[LLOGIN SERVICE]: User {0} {1} does not have a valid home and this grid does not have default locations. Attempting to find random region", m_log.WarnFormat("[LLOGIN SERVICE]: User {0} {1} does not have a valid home and this grid does not have default locations. Attempting to find random region",
account.FirstName, account.LastName); account.FirstName, account.LastName);
defaults = m_GridService.GetRegionsByName(account.ScopeID, "", 1); defaults = m_GridService.GetRegionsByName(scopeID, "", 1);
if (defaults != null && defaults.Count > 0) if (defaults != null && defaults.Count > 0)
{ {
region = defaults[0]; region = defaults[0];
@ -363,9 +379,9 @@ namespace OpenSim.Services.LLLoginService
GridRegion region = null; GridRegion region = null;
if (pinfo.RegionID.Equals(UUID.Zero) || (region = m_GridService.GetRegionByUUID(account.ScopeID, pinfo.RegionID)) == null) if (pinfo.RegionID.Equals(UUID.Zero) || (region = m_GridService.GetRegionByUUID(scopeID, pinfo.RegionID)) == null)
{ {
List<GridRegion> defaults = m_GridService.GetDefaultRegions(account.ScopeID); List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID);
if (defaults != null && defaults.Count > 0) if (defaults != null && defaults.Count > 0)
{ {
region = defaults[0]; region = defaults[0];
@ -374,7 +390,7 @@ namespace OpenSim.Services.LLLoginService
else else
{ {
m_log.Info("[LLOGIN SERVICE]: Last Region Not Found Attempting to find random region"); m_log.Info("[LLOGIN SERVICE]: Last Region Not Found Attempting to find random region");
defaults = m_GridService.GetRegionsByName(account.ScopeID, "", 1); defaults = m_GridService.GetRegionsByName(scopeID, "", 1);
if (defaults != null && defaults.Count > 0) if (defaults != null && defaults.Count > 0)
{ {
region = defaults[0]; region = defaults[0];
@ -414,11 +430,11 @@ namespace OpenSim.Services.LLLoginService
{ {
if (!regionName.Contains("@")) if (!regionName.Contains("@"))
{ {
List<GridRegion> regions = m_GridService.GetRegionsByName(account.ScopeID, regionName, 1); List<GridRegion> regions = m_GridService.GetRegionsByName(scopeID, regionName, 1);
if ((regions == null) || (regions != null && regions.Count == 0)) if ((regions == null) || (regions != null && regions.Count == 0))
{ {
m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, can't locate region {1}. Trying defaults.", startLocation, regionName); m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, can't locate region {1}. Trying defaults.", startLocation, regionName);
regions = m_GridService.GetDefaultRegions(UUID.Zero); regions = m_GridService.GetDefaultRegions(scopeID);
if (regions != null && regions.Count > 0) if (regions != null && regions.Count > 0)
{ {
where = "safe"; where = "safe";
@ -461,7 +477,7 @@ namespace OpenSim.Services.LLLoginService
} }
else else
{ {
List<GridRegion> defaults = m_GridService.GetDefaultRegions(account.ScopeID); List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID);
if (defaults != null && defaults.Count > 0) if (defaults != null && defaults.Count > 0)
{ {
where = "safe"; where = "safe";