Merge branch 'master' into careminster-presence-refactor

avinationmerge
Melanie 2010-04-27 03:57:36 +01:00
commit 89a003c6fc
6 changed files with 442 additions and 18 deletions

View File

@ -0,0 +1,324 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* 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
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using log4net;
using System;
using System.Collections.Generic;
using System.Reflection;
using Nini.Config;
using OpenSim.Framework;
using OpenSim.Framework.Statistics;
using OpenSim.Services.Connectors;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces;
using OpenMetaverse;
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
{
public class RemoteXInventoryServicesConnector : BaseInventoryConnector, ISharedRegionModule, IInventoryService
{
private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private bool m_Enabled = false;
private bool m_Initialized = false;
private Scene m_Scene;
private XInventoryServicesConnector m_RemoteConnector;
public Type ReplaceableInterface
{
get { return null; }
}
public string Name
{
get { return "RemoteXInventoryServicesConnector"; }
}
public RemoteXInventoryServicesConnector()
{
}
public RemoteXInventoryServicesConnector(IConfigSource source)
{
Init(source);
}
protected override void Init(IConfigSource source)
{
m_RemoteConnector = new XInventoryServicesConnector(source);
base.Init(source);
}
#region ISharedRegionModule
public void Initialise(IConfigSource source)
{
IConfig moduleConfig = source.Configs["Modules"];
if (moduleConfig != null)
{
string name = moduleConfig.GetString("InventoryServices", "");
if (name == Name)
{
Init(source);
m_Enabled = true;
m_log.Info("[XINVENTORY CONNECTOR]: Remote XInventory enabled");
}
}
}
public void PostInitialise()
{
}
public void Close()
{
}
public void AddRegion(Scene scene)
{
m_Scene = scene;
//m_log.Debug("[XXXX] Adding scene " + m_Scene.RegionInfo.RegionName);
if (!m_Enabled)
return;
if (!m_Initialized)
{
m_Initialized = true;
}
scene.RegisterModuleInterface<IInventoryService>(this);
m_cache.AddRegion(scene);
}
public void RemoveRegion(Scene scene)
{
if (!m_Enabled)
return;
m_cache.RemoveRegion(scene);
}
public void RegionLoaded(Scene scene)
{
if (!m_Enabled)
return;
m_log.InfoFormat("[XINVENTORY CONNECTOR]: Enabled remote XInventory for region {0}", scene.RegionInfo.RegionName);
}
#endregion ISharedRegionModule
#region IInventoryService
public override bool CreateUserInventory(UUID user)
{
return false;
}
public override List<InventoryFolderBase> GetInventorySkeleton(UUID userId)
{
return new List<InventoryFolderBase>();
}
public override InventoryCollection GetUserInventory(UUID userID)
{
return null;
}
public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
{
try
{
m_RemoteConnector.GetUserInventory(userID, callback);
}
catch (Exception e)
{
if (StatsManager.SimExtraStats != null)
StatsManager.SimExtraStats.AddInventoryServiceRetrievalFailure();
m_log.ErrorFormat("[XINVENTORY CONNECTOR]: Request inventory operation failed, {0} {1}",
e.Source, e.Message);
}
}
// inherited. See base class
// public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
public override Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID)
{
return m_RemoteConnector.GetSystemFolders(userID);
}
public override InventoryCollection GetFolderContent(UUID userID, UUID folderID)
{
try
{
return m_RemoteConnector.GetFolderContent(userID, folderID);
}
catch (Exception e)
{
m_log.ErrorFormat("[XINVENTORY CONNECTOR]: GetFolderContent operation failed, {0} {1}",
e.Source, e.Message);
}
InventoryCollection nullCollection = new InventoryCollection();
nullCollection.Folders = new List<InventoryFolderBase>();
nullCollection.Items = new List<InventoryItemBase>();
nullCollection.UserID = userID;
return nullCollection;
}
public override List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID)
{
return m_RemoteConnector.GetFolderItems(userID, folderID);
}
public override bool AddFolder(InventoryFolderBase folder)
{
if (folder == null)
return false;
return m_RemoteConnector.AddFolder(folder);
}
public override bool UpdateFolder(InventoryFolderBase folder)
{
if (folder == null)
return false;
return m_RemoteConnector.UpdateFolder(folder);
}
public override bool MoveFolder(InventoryFolderBase folder)
{
if (folder == null)
return false;
return m_RemoteConnector.MoveFolder(folder);
}
public override bool DeleteFolders(UUID ownerID, List<UUID> folderIDs)
{
if (folderIDs == null)
return false;
if (folderIDs.Count == 0)
return false;
return m_RemoteConnector.DeleteFolders(ownerID, folderIDs);
}
public override bool PurgeFolder(InventoryFolderBase folder)
{
if (folder == null)
return false;
return m_RemoteConnector.PurgeFolder(folder);
}
// public bool AddItem(InventoryItemBase item) inherited
// Uses AddItemPlain
protected override bool AddItemPlain(InventoryItemBase item)
{
if (item == null)
return false;
return m_RemoteConnector.AddItem(item);
}
public override bool UpdateItem(InventoryItemBase item)
{
if (item == null)
return false;
return m_RemoteConnector.UpdateItem(item);
}
public override bool MoveItems(UUID ownerID, List<InventoryItemBase> items)
{
if (items == null)
return false;
return m_RemoteConnector.MoveItems(ownerID, items);
}
public override bool DeleteItems(UUID ownerID, List<UUID> itemIDs)
{
if (itemIDs == null)
return false;
if (itemIDs.Count == 0)
return true;
return m_RemoteConnector.DeleteItems(ownerID, itemIDs);
}
public override InventoryItemBase GetItem(InventoryItemBase item)
{
if (item == null)
return null;
return m_RemoteConnector.GetItem(item);
}
public override InventoryFolderBase GetFolder(InventoryFolderBase folder)
{
if (folder == null)
return null;
return m_RemoteConnector.GetFolder(folder);
}
public override bool HasInventoryForUser(UUID userID)
{
return false;
}
public override List<InventoryItemBase> GetActiveGestures(UUID userId)
{
return new List<InventoryItemBase>();
}
public override int GetAssetPermissions(UUID userID, UUID assetID)
{
return m_RemoteConnector.GetAssetPermissions(userID, assetID);
}
#endregion
}
}

View File

@ -144,6 +144,8 @@ namespace OpenSim.Server.Handlers.Asset
return HandleGetActiveGestures(request);
case "GETASSETPERMISSIONS":
return HandleGetAssetPermissions(request);
case "GETSYSTEMFOLDERS":
return HandleGetSystemFolders(request);
}
m_log.DebugFormat("[XINVENTORY HANDLER]: unknown method request: {0}", method);
}
@ -197,7 +199,7 @@ namespace OpenSim.Server.Handlers.Asset
return ms.ToArray();
}
byte[] HandleCreateUserInventory(Dictionary<string,object> request)
{
Dictionary<string,object> result = new Dictionary<string,object>();
@ -540,6 +542,24 @@ namespace OpenSim.Server.Handlers.Asset
return encoding.GetBytes(xmlString);
}
byte[] HandleGetSystemFolders(Dictionary<string, object> request)
{
Dictionary<string, object> result = new Dictionary<string, object>();
UUID principal = UUID.Zero;
UUID.TryParse(request["PRINCIPAL"].ToString(), out principal);
Dictionary<AssetType, InventoryFolderBase> sfolders = GetSystemFolders(principal);
if (sfolders != null)
foreach (KeyValuePair<AssetType, InventoryFolderBase> kvp in sfolders)
result[kvp.Key.ToString()] = EncodeFolder(kvp.Value);
string xmlString = ServerUtils.BuildXmlResponse(result);
m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
UTF8Encoding encoding = new UTF8Encoding();
return encoding.GetBytes(xmlString);
}
private Dictionary<string, object> EncodeFolder(InventoryFolderBase f)
{
Dictionary<string, object> ret = new Dictionary<string, object>();
@ -623,5 +643,31 @@ namespace OpenSim.Server.Handlers.Asset
return item;
}
#region Extra
private Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID)
{
InventoryFolderBase root = m_InventoryService.GetRootFolder(userID);
if (root != null)
{
InventoryCollection content = m_InventoryService.GetFolderContent(userID, root.ID);
if (content != null)
{
Dictionary<AssetType, InventoryFolderBase> folders = new Dictionary<AssetType, InventoryFolderBase>();
foreach (InventoryFolderBase folder in content.Folders)
{
if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
folders[(AssetType)folder.Type] = folder;
}
// Put the root folder there, as type Folder
folders[AssetType.Folder] = root;
return folders;
}
}
m_log.WarnFormat("[INVENTORY SERVICE]: System folders for {0} not found", userID);
return new Dictionary<AssetType, InventoryFolderBase>();
}
#endregion
}
}

View File

@ -72,6 +72,9 @@ namespace OpenSim.Server.Handlers.Login
string last = requestData["last"].ToString();
string passwd = requestData["passwd"].ToString();
string startLocation = string.Empty;
UUID scopeID = UUID.Zero;
if (requestData["scope_id"] != null)
scopeID = new UUID(requestData["scope_id"].ToString());
if (requestData.ContainsKey("start"))
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);
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();
response.Value = reply.ToHashtable();
@ -109,10 +112,15 @@ namespace OpenSim.Server.Handlers.Login
if (map.ContainsKey("start"))
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);
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();
}

View File

@ -455,6 +455,35 @@ namespace OpenSim.Services.Connectors
return int.Parse(ret["RESULT"].ToString());
}
public Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID)
{
Dictionary<string, object> ret = MakeRequest("GETSYSTEMFOLDERS",
new Dictionary<string, object> {
{ "PRINCIPAL", userID.ToString() },
});
if (ret == null)
return new Dictionary<AssetType,InventoryFolderBase>();
Dictionary<AssetType, InventoryFolderBase> sfolders = new Dictionary<AssetType, InventoryFolderBase>();
try
{
foreach (KeyValuePair<string, object> kvp in ret)
{
InventoryFolderBase folder = BuildFolder((Dictionary<string, object>)(kvp.Value));
short type = 0;
if (Int16.TryParse(kvp.Key, out type))
sfolders.Add((AssetType)type, folder);
}
}
catch (Exception e)
{
m_log.DebugFormat("[XINVENTORY CONNECTOR STUB]: exception {0}", e.Message);
}
return sfolders;
}
// These are either obsolete or unused
//

View File

@ -31,6 +31,7 @@ using System.Collections.Generic;
using System.Net;
using OpenMetaverse.StructuredData;
using OpenMetaverse;
namespace OpenSim.Services.Interfaces
{
@ -46,7 +47,7 @@ namespace OpenSim.Services.Interfaces
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;
UUID session = UUID.Random();
@ -157,7 +157,7 @@ namespace OpenSim.Services.LLLoginService
//
// 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)
{
m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: user not found");
@ -170,6 +170,22 @@ namespace OpenSim.Services.LLLoginService
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
//
@ -219,7 +235,7 @@ namespace OpenSim.Services.LLLoginService
// Get the home region
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 lookAt = Vector3.Zero;
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)
{
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);
@ -318,7 +334,7 @@ namespace OpenSim.Services.LLLoginService
}
else
{
region = m_GridService.GetRegionByUUID(account.ScopeID, pinfo.HomeRegionID);
region = m_GridService.GetRegionByUUID(scopeID, pinfo.HomeRegionID);
if (null == region)
{
@ -332,7 +348,7 @@ namespace OpenSim.Services.LLLoginService
if (tryDefaults)
{
List<GridRegion> defaults = m_GridService.GetDefaultRegions(account.ScopeID);
List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID);
if (defaults != null && defaults.Count > 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",
account.FirstName, account.LastName);
defaults = m_GridService.GetRegionsByName(account.ScopeID, "", 1);
defaults = m_GridService.GetRegionsByName(scopeID, "", 1);
if (defaults != null && defaults.Count > 0)
{
region = defaults[0];
@ -363,9 +379,9 @@ namespace OpenSim.Services.LLLoginService
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)
{
region = defaults[0];
@ -374,7 +390,7 @@ namespace OpenSim.Services.LLLoginService
else
{
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)
{
region = defaults[0];
@ -414,11 +430,11 @@ namespace OpenSim.Services.LLLoginService
{
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))
{
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)
{
where = "safe";
@ -461,7 +477,7 @@ namespace OpenSim.Services.LLLoginService
}
else
{
List<GridRegion> defaults = m_GridService.GetDefaultRegions(account.ScopeID);
List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID);
if (defaults != null && defaults.Count > 0)
{
where = "safe";