From 0fa94f222df8ed7f308730c3692bf2a774138718 Mon Sep 17 00:00:00 2001 From: Cinder Date: Fri, 12 Jun 2015 18:48:07 -0600 Subject: [PATCH] Refactor AgentPreferences so that database operations happen centrally. the opensim way. Signed-off-by: Diva Canto --- OpenSim/Data/IAgentPreferencesData.cs | 13 +- .../Data/MySQL/MySQLAgentPreferencesData.cs | 17 +- .../Linden/Caps/AgentPreferencesModule.cs | 81 ++---- .../LocalAgentPreferencesServiceConnector.cs | 153 ++++++++++++ .../RemoteAgentPreferencesServiceConnector.cs | 116 +++++++++ OpenSim/Region/Framework/Scenes/Scene.cs | 11 + .../Shared/Api/Implementation/LSL_Api.cs | 10 +- .../AgentPreferencesServerPostHandler.cs | 206 ++++++++++++++++ .../AgentPreferencesServiceConnector.cs} | 39 ++- .../AgentPreferencesConnector.cs | 230 ++++++++++++++++++ .../Interfaces/IAgentPreferencesService.cs | 115 +++++++++ .../AgentPreferencesService.cs | 80 ++++++ .../AgentPreferencesServiceBase.cs | 73 ++++++ bin/Robust.HG.ini.example | 6 + bin/Robust.ini.example | 6 + bin/config-include/Grid.ini | 1 + bin/config-include/GridCommon.ini.example | 6 + bin/config-include/GridHypergrid.ini | 1 + bin/config-include/Standalone.ini | 1 + bin/config-include/StandaloneHypergrid.ini | 1 + 20 files changed, 1062 insertions(+), 104 deletions(-) create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/AgentPreferences/LocalAgentPreferencesServiceConnector.cs create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/AgentPreferences/RemoteAgentPreferencesServiceConnector.cs create mode 100644 OpenSim/Server/Handlers/AgentPreferences/AgentPreferencesServerPostHandler.cs rename OpenSim/{Region/Framework/Interfaces/IAgentPreferencesModule.cs => Server/Handlers/AgentPreferences/AgentPreferencesServiceConnector.cs} (53%) create mode 100644 OpenSim/Services/Connectors/AgentPreferences/AgentPreferencesConnector.cs create mode 100644 OpenSim/Services/Interfaces/IAgentPreferencesService.cs create mode 100644 OpenSim/Services/UserAccountService/AgentPreferencesService.cs create mode 100644 OpenSim/Services/UserAccountService/AgentPreferencesServiceBase.cs diff --git a/OpenSim/Data/IAgentPreferencesData.cs b/OpenSim/Data/IAgentPreferencesData.cs index f8261e2202..87632990ac 100644 --- a/OpenSim/Data/IAgentPreferencesData.cs +++ b/OpenSim/Data/IAgentPreferencesData.cs @@ -34,22 +34,13 @@ namespace OpenSim.Data { public class AgentPreferencesData { - public UUID PrincipalID = UUID.Zero; - public string AccessPrefs = "M"; - //public int GodLevel; - public double HoverHeight = 0.0; - public string Language = "en-us"; - public bool LanguageIsPublic = true; - // DefaultObjectPermMasks - public int PermEveryone = 0; - public int PermGroup = 0; - public int PermNextOwner = 532480; + public Dictionary Data; } public interface IAgentPreferencesData { + bool Store(AgentPreferencesData data); AgentPreferencesData GetPrefs(UUID agentID); - void StorePrefs(AgentPreferencesData data); } } diff --git a/OpenSim/Data/MySQL/MySQLAgentPreferencesData.cs b/OpenSim/Data/MySQL/MySQLAgentPreferencesData.cs index cd9004a55d..bf188ee6b6 100644 --- a/OpenSim/Data/MySQL/MySQLAgentPreferencesData.cs +++ b/OpenSim/Data/MySQL/MySQLAgentPreferencesData.cs @@ -52,22 +52,9 @@ namespace OpenSim.Data.MySQL return ret[0]; } - public void StorePrefs(AgentPreferencesData data) + public void Store(AgentPreferencesData data) { - using (MySqlCommand cmd = new MySqlCommand()) - { - cmd.CommandText = String.Format("replace into `{0}` (`PrincipalID`, `AccessPrefs`, `HoverHeight`, `Language`, `LanguageIsPublic`, `PermEveryone`, `PermGroup`, `PermNextOwner`) VALUES (?Principal, ?AP, ?HH, ?Lang, ?LIP, ?PE, ?PG, ?PNO)", m_Realm); - cmd.Parameters.AddWithValue("?Principal", data.PrincipalID.ToString()); - cmd.Parameters.AddWithValue("?AP", data.AccessPrefs); - cmd.Parameters.AddWithValue("?HH", data.HoverHeight); - cmd.Parameters.AddWithValue("?Lang", data.Language); - cmd.Parameters.AddWithValue("?LIP", data.LanguageIsPublic); - cmd.Parameters.AddWithValue("?PE", data.PermEveryone); - cmd.Parameters.AddWithValue("?PG", data.PermGroup); - cmd.Parameters.AddWithValue("?PNO", data.PermNextOwner); - - ExecuteNonQuery(cmd); - } + base.Store(data); } } } diff --git a/OpenSim/Region/ClientStack/Linden/Caps/AgentPreferencesModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/AgentPreferencesModule.cs index 58d9f7d49e..509004da58 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/AgentPreferencesModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/AgentPreferencesModule.cs @@ -26,6 +26,7 @@ */ using System; +using System.Collections.Generic; using System.Reflection; using System.IO; using log4net; @@ -33,8 +34,6 @@ using Mono.Addins; using Nini.Config; using OpenMetaverse; using OpenMetaverse.StructuredData; -using OpenSim.Data; -using OpenSim.Data.MySQL; using OpenSim.Framework.Console; using OpenSim.Framework.Servers; using OpenSim.Framework.Servers.HttpServer; @@ -47,68 +46,34 @@ using OpenSim.Capabilities.Handlers; namespace OpenSim.Region.ClientStack.LindenCaps { [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "AgentPreferencesModule")] - public class AgentPreferencesModule : ISharedRegionModule, IAgentPreferencesModule + public class AgentPreferencesModule : ISharedRegionModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - public bool m_enabled { get; private set; } - private Scene m_Scene; - protected IAgentPreferencesData m_Database; + private List m_scenes = new List(); public void Initialise(IConfigSource source) { - IConfig dbConfig = source.Configs["DatabaseService"]; - if (dbConfig != null) - { - string dllName = String.Empty; - string connString = String.Empty; - dllName = dbConfig.GetString("StorageProvider", dllName); - connString = dbConfig.GetString("ConnectionString", connString); - - // We tried, but this doesn't exist. We can't proceed - if (dllName == String.Empty) - throw new Exception("No StorageProvider configured"); - - // *FIXME: This is a janky as hell, works for now. - if (dllName == "OpenSim.Data.MySQL.dll") - m_Database = new MySQLAgentPreferencesData(connString, "AgentPrefs"); - else - throw new Exception("Storage provider not supported!"); - - if (m_Database == null) - { - m_enabled = false; - throw new Exception("Could not find a storage interface in the given module"); - } - m_log.Debug("[AgentPrefs] AgentPrefs is enabled"); - m_enabled = true; - } } #region Region module - public void AddRegion(Scene s) - { - if (!m_enabled) return; - s.RegisterModuleInterface(this); - m_Scene = s; + public void AddRegion(Scene scene) + { + lock (m_scenes) m_scenes.Add(scene); } - public void RemoveRegion(Scene s) + public void RemoveRegion(Scene scene) { - if (!m_enabled) return; - - m_Scene.UnregisterModuleInterface(this); - m_Scene.EventManager.OnRegisterCaps -= RegisterCaps; - m_Scene = null; + lock (m_scenes) m_scenes.Remove(scene); + scene.EventManager.OnRegisterCaps -= RegisterCaps; + scene = null; } - public void RegionLoaded(Scene s) + public void RegionLoaded(Scene scene) { - if (!m_enabled) return; - - m_Scene.EventManager.OnRegisterCaps += delegate(UUID agentID, OpenSim.Framework.Capabilities.Caps caps) + scene.EventManager.OnRegisterCaps += delegate(UUID agentID, OpenSim.Framework.Capabilities.Caps caps) { RegisterCaps(agentID, caps); }; @@ -155,11 +120,10 @@ namespace OpenSim.Region.ClientStack.LindenCaps { m_log.DebugFormat("[AgentPrefs] UpdateAgentPreferences for {0}", agent.ToString()); OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request); - AgentPreferencesData data = m_Database.GetPrefs(agent); + AgentPrefs data = m_scenes[0].AgentPreferencesService.GetAgentPreferences(agent); if (data == null) { - data = new AgentPreferencesData(); - data.PrincipalID = agent; + data = new AgentPrefs(agent); } if (req.ContainsKey("access_prefs")) @@ -186,7 +150,7 @@ namespace OpenSim.Region.ClientStack.LindenCaps { data.LanguageIsPublic = req["language_is_public"].AsBoolean(); } - m_Database.StorePrefs(data); + m_scenes[0].AgentPreferencesService.StoreAgentPreferences(data); OSDMap resp = new OSDMap(); OSDMap respAccessPrefs = new OSDMap(); respAccessPrefs["max"] = data.AccessPrefs; @@ -204,21 +168,8 @@ namespace OpenSim.Region.ClientStack.LindenCaps string response = OSDParser.SerializeLLSDXmlString(resp); return response; } + #endregion Region module - - #region IAgentPreferences - public string GetLang(UUID agentID) - { - AgentPreferencesData data = m_Database.GetPrefs(agentID); - if (data != null) - { - if (data.LanguageIsPublic) - return data.Language; - } - return "en-us"; - - } - #endregion } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/AgentPreferences/LocalAgentPreferencesServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/AgentPreferences/LocalAgentPreferencesServiceConnector.cs new file mode 100644 index 0000000000..9d8367d9a4 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/AgentPreferences/LocalAgentPreferencesServiceConnector.cs @@ -0,0 +1,153 @@ +/* + * 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 System; +using System.Collections.Generic; +using System.Reflection; +using log4net; +using Mono.Addins; +using Nini.Config; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Server.Base; +using OpenSim.Services.Interfaces; + +using OpenMetaverse; + +namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.AgentPreferences +{ + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "LocalAgentPreferencesServicesConnector")] + public class LocalAgentPreferencesServicesConnector : ISharedRegionModule, IAgentPreferencesService + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private IAgentPreferencesService m_AgentPreferencesService; + private bool m_Enabled = false; + + #region ISharedRegionModule + + public Type ReplaceableInterface + { + get { return null; } + } + + public string Name + { + get { return "LocalAgentPreferencesServicesConnector"; } + } + + public void Initialise(IConfigSource source) + { + IConfig moduleConfig = source.Configs["Modules"]; + if (moduleConfig != null) + { + string name = moduleConfig.GetString("AgentPreferencesServices", ""); + if (name == Name) + { + IConfig userConfig = source.Configs["AgentPreferencesService"]; + if (userConfig == null) + { + m_log.Error("[AGENT PREFERENCES CONNECTOR]: AgentPreferencesService missing from OpenSim.ini"); + return; + } + + string serviceDll = userConfig.GetString("LocalServiceModule", String.Empty); + + if (String.IsNullOrEmpty(serviceDll)) + { + m_log.Error("[AGENT PREFERENCES CONNECTOR]: No AgentPreferencesModule named in section AgentPreferencesService"); + return; + } + + Object[] args = new Object[] { source }; + m_AgentPreferencesService = ServerUtils.LoadPlugin(serviceDll, args); + + if (m_AgentPreferencesService == null) + { + m_log.Error("[AGENT PREFERENCES CONNECTOR]: Can't load user account service"); + return; + } + m_Enabled = true; + m_log.Info("[AGENT PREFERENCES CONNECTOR]: Local agent preferences connector enabled"); + } + } + } + + public void PostInitialise() + { + if (!m_Enabled) + return; + } + + public void Close() + { + if (!m_Enabled) + return; + } + + public void AddRegion(Scene scene) + { + if (!m_Enabled) + return; + + scene.RegisterModuleInterface(this); + } + + public void RemoveRegion(Scene scene) + { + if (!m_Enabled) + return; + } + + public void RegionLoaded(Scene scene) + { + if (!m_Enabled) + return; + } + + #endregion ISharedRegionModule + + #region IAgentPreferencesService + + public AgentPrefs GetAgentPreferences(UUID principalID) + { + return m_AgentPreferencesService.GetAgentPreferences(principalID); + } + + public bool StoreAgentPreferences(AgentPrefs data) + { + return m_AgentPreferencesService.StoreAgentPreferences(data); + } + + public string GetLang(UUID principalID) + { + return m_AgentPreferencesService.GetLang(principalID); + } + + #endregion IAgentPreferencesService + } +} diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/AgentPreferences/RemoteAgentPreferencesServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/AgentPreferences/RemoteAgentPreferencesServiceConnector.cs new file mode 100644 index 0000000000..ad9544ad30 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/AgentPreferences/RemoteAgentPreferencesServiceConnector.cs @@ -0,0 +1,116 @@ +/* + * 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 System; +using System.Collections.Generic; +using System.Reflection; + +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Server.Base; +using OpenSim.Services.Interfaces; +using OpenSim.Services.Connectors; + +using OpenMetaverse; +using log4net; +using Mono.Addins; +using Nini.Config; + +namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.AgentPreferences +{ + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "RemoteAgentPreferencesServicesConnector")] + public class RemoteAgentPreferencesServicesConnector : AgentPreferencesServicesConnector, + ISharedRegionModule, IAgentPreferencesService + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private bool m_Enabled = false; + + public Type ReplaceableInterface + { + get { return null; } + } + + public string Name + { + get { return "RemoteAgentPreferencesServicesConnector"; } + } + + public override void Initialise(IConfigSource source) + { + IConfig moduleConfig = source.Configs["Modules"]; + if (moduleConfig != null) + { + string name = moduleConfig.GetString("AgentPreferencesServices", ""); + if (name == Name) + { + IConfig userConfig = source.Configs["AgentPreferencesService"]; + if (userConfig == null) + { + m_log.Error("[AGENT PREFERENCES CONNECTOR]: AgentPreferencesService missing from OpenSim.ini"); + return; + } + + m_Enabled = true; + + base.Initialise(source); + + m_log.Info("[AGENT PREFERENCES CONNECTOR]: Remote agent preferences enabled"); + } + } + } + + public void PostInitialise() + { + /* no op */ + } + + public void Close() + { + /* no op */ + } + + public void AddRegion(Scene scene) + { + if (!m_Enabled) + return; + + scene.RegisterModuleInterface(this); + } + + public void RemoveRegion(Scene scene) + { + /* no op */ + } + + public void RegionLoaded(Scene scene) + { + /* no op */ + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index c539f1f305..23b2e9050c 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -325,6 +325,7 @@ namespace OpenSim.Region.Framework.Scenes protected IUserAccountService m_UserAccountService; protected IAvatarService m_AvatarService; protected IGridUserService m_GridUserService; + protected IAgentPreferencesService m_AgentPreferencesService; protected IXMLRPC m_xmlrpcModule; protected IWorldComm m_worldCommModule; @@ -728,6 +729,16 @@ namespace OpenSim.Region.Framework.Scenes } } + public IAgentPreferencesService AgentPreferencesService + { + get + { + if (m_AgentPreferencesService == null) + m_AgentPreferencesService = RequestModuleInterface(); + return m_AgentPreferencesService; + } + } + public IAttachmentsModule AttachmentsModule { get; set; } public IEntityTransferModule EntityTransferModule { get; private set; } public IAgentAssetTransactions AgentTransactionsModule { get; private set; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index b50f429f02..75b40af229 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -6149,14 +6149,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { // This should only return a value if the avatar is in the same region, but eh. idc. m_host.AddScriptLPS(1); - IAgentPreferencesModule ap = World.RequestModuleInterface(); - if (ap != null) + UUID key = new UUID(); + if (UUID.TryParse(id, out key)) { - UUID key = new UUID(); - if (UUID.TryParse(id, out key)) - { - return ap.GetLang(key); - } + return new LSL_String(World.AgentPreferencesService.GetLang(key)); } return new LSL_String("en-us"); } diff --git a/OpenSim/Server/Handlers/AgentPreferences/AgentPreferencesServerPostHandler.cs b/OpenSim/Server/Handlers/AgentPreferences/AgentPreferencesServerPostHandler.cs new file mode 100644 index 0000000000..713b75551c --- /dev/null +++ b/OpenSim/Server/Handlers/AgentPreferences/AgentPreferencesServerPostHandler.cs @@ -0,0 +1,206 @@ +/* + * 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 Nini.Config; +using log4net; +using System; +using System.Reflection; +using System.IO; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; +using System.Collections.Generic; +using OpenSim.Server.Base; +using OpenSim.Services.Interfaces; +using OpenSim.Framework; +using OpenSim.Framework.ServiceAuth; +using OpenSim.Framework.Servers.HttpServer; +using OpenMetaverse; + +namespace OpenSim.Server.Handlers.AgentPreferences +{ + public class AgentPreferencesServerPostHandler : BaseStreamHandler + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private IAgentPreferencesService m_AgentPreferencesService; + + public AgentPreferencesServerPostHandler(IAgentPreferencesService service, IServiceAuth auth) : + base("POST", "/agentprefs", auth) + { + m_AgentPreferencesService = service; + } + + protected override byte[] ProcessRequest(string path, Stream requestData, + IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + { + StreamReader sr = new StreamReader(requestData); + string body = sr.ReadToEnd(); + sr.Close(); + body = body.Trim(); + + //m_log.DebugFormat("[XXX]: query String: {0}", body); + + try + { + Dictionary request = + ServerUtils.ParseQueryString(body); + + if (!request.ContainsKey("METHOD")) + return FailureResult(); + + string method = request["METHOD"].ToString(); + + switch (method) + { + case "getagentprefs": + return GetAgentPrefs(request); + case "setagentprefs": + return SetAgentPrefs(request); + case "getagentlang": + return GetAgentLang(request); + } + m_log.DebugFormat("[AGENT PREFERENCES HANDLER]: unknown method request: {0}", method); + } + catch (Exception e) + { + m_log.DebugFormat("[AGENT PREFERENCES HANDLER]: Exception {0}", e); + } + + return FailureResult(); + } + + byte[] GetAgentPrefs(Dictionary request) + { + if (!request.ContainsKey("UserID")) + return FailureResult(); + + UUID userID; + if (!UUID.TryParse(request["UserID"].ToString(), out userID)) + return FailureResult(); + AgentPrefs prefs = m_AgentPreferencesService.GetAgentPreferences(userID); + Dictionary result = new Dictionary(); + result = prefs.ToKeyValuePairs(); + + string xmlString = ServerUtils.BuildXmlResponse(result); + + return Util.UTF8NoBomEncoding.GetBytes(xmlString); + } + + byte[] SetAgentPrefs(Dictionary request) + { + if (!request.ContainsKey("PrincipalID") || !request.ContainsKey("AccessPrefs") || !request.ContainsKey("HoverHeight") + || !request.ContainsKey("Language") || !request.ContainsKey("LanguageIsPublic") || !request.ContainsKey("PermEveryone") + || !request.ContainsKey("PermGroup") || !request.ContainsKey("PermNextOwner")) + { + return FailureResult(); + } + + UUID userID; + if (!UUID.TryParse(request["PrincipalID"].ToString(), out userID)) + return FailureResult(); + + AgentPrefs data = new AgentPrefs(userID); + data.AccessPrefs = request["AccessPrefs"].ToString(); + data.HoverHeight = double.Parse(request["HoverHeight"].ToString()); + data.Language = request["Language"].ToString(); + data.LanguageIsPublic = bool.Parse(request["LanguageIsPublic"].ToString()); + data.PermEveryone = int.Parse(request["PermEveryone"].ToString()); + data.PermGroup = int.Parse(request["PermGroup"].ToString()); + data.PermNextOwner = int.Parse(request["PermNextOwner"].ToString()); + + return m_AgentPreferencesService.StoreAgentPreferences(data) ? SuccessResult() : FailureResult(); + } + + byte[] GetAgentLang(Dictionary request) + { + if (!request.ContainsKey("UserID")) + return FailureResult(); + UUID userID; + if (!UUID.TryParse(request["UserID"].ToString(), out userID)) + return FailureResult(); + + string lang = "en-us"; + AgentPrefs prefs = m_AgentPreferencesService.GetAgentPreferences(userID); + if (prefs != null) + { + if (prefs.LanguageIsPublic) + lang = prefs.Language; + } + Dictionary result = new Dictionary(); + result["Language"] = lang; + string xmlString = ServerUtils.BuildXmlResponse(result); + return Util.UTF8NoBomEncoding.GetBytes(xmlString); + } + + private byte[] SuccessResult() + { + XmlDocument doc = new XmlDocument(); + + XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration, + "", ""); + + doc.AppendChild(xmlnode); + + XmlElement rootElement = doc.CreateElement("", "ServerResponse", + ""); + + doc.AppendChild(rootElement); + + XmlElement result = doc.CreateElement("", "result", ""); + result.AppendChild(doc.CreateTextNode("Success")); + + rootElement.AppendChild(result); + + return Util.DocToBytes(doc); + } + + private byte[] FailureResult() + { + XmlDocument doc = new XmlDocument(); + + XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration, + "", ""); + + doc.AppendChild(xmlnode); + + XmlElement rootElement = doc.CreateElement("", "ServerResponse", + ""); + + doc.AppendChild(rootElement); + + XmlElement result = doc.CreateElement("", "result", ""); + result.AppendChild(doc.CreateTextNode("Failure")); + + rootElement.AppendChild(result); + + return Util.DocToBytes(doc); + } + } +} diff --git a/OpenSim/Region/Framework/Interfaces/IAgentPreferencesModule.cs b/OpenSim/Server/Handlers/AgentPreferences/AgentPreferencesServiceConnector.cs similarity index 53% rename from OpenSim/Region/Framework/Interfaces/IAgentPreferencesModule.cs rename to OpenSim/Server/Handlers/AgentPreferences/AgentPreferencesServiceConnector.cs index 4975b9655b..a581ea2d80 100644 --- a/OpenSim/Region/Framework/Interfaces/IAgentPreferencesModule.cs +++ b/OpenSim/Server/Handlers/AgentPreferences/AgentPreferencesServiceConnector.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -25,13 +25,40 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -using System; -using OpenMetaverse; -namespace OpenSim.Region.Framework.Interfaces +using System; +using Nini.Config; +using OpenSim.Server.Base; +using OpenSim.Services.Interfaces; +using OpenSim.Framework.ServiceAuth; +using OpenSim.Framework.Servers.HttpServer; +using OpenSim.Server.Handlers.Base; + +namespace OpenSim.Server.Handlers.AgentPreferences { - public interface IAgentPreferencesModule + public class AgentPreferencesServiceConnector : ServiceConnector { - string GetLang(UUID agentID); + private IAgentPreferencesService m_AgentPreferencesService; + private string m_ConfigName = "AgentPreferencesService"; + + public AgentPreferencesServiceConnector(IConfigSource config, IHttpServer server, string configName) : + base(config, server, configName) + { + IConfig serverConfig = config.Configs[m_ConfigName]; + if (serverConfig == null) + throw new Exception(String.Format("No section {0} in config file", m_ConfigName)); + + string service = serverConfig.GetString("LocalServiceModule", String.Empty); + + if (String.IsNullOrWhiteSpace(service)) + throw new Exception("No LocalServiceModule in config file"); + + Object[] args = new Object[] { config }; + m_AgentPreferencesService = ServerUtils.LoadPlugin(service, args); + + IServiceAuth auth = ServiceAuth.Create(config, m_ConfigName); ; + + server.AddStreamHandler(new AgentPreferencesServerPostHandler(m_AgentPreferencesService, auth)); + } } } diff --git a/OpenSim/Services/Connectors/AgentPreferences/AgentPreferencesConnector.cs b/OpenSim/Services/Connectors/AgentPreferences/AgentPreferencesConnector.cs new file mode 100644 index 0000000000..1dbc0c8fe2 --- /dev/null +++ b/OpenSim/Services/Connectors/AgentPreferences/AgentPreferencesConnector.cs @@ -0,0 +1,230 @@ +/* + * 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.IO; +using System.Reflection; +using Nini.Config; +using OpenSim.Framework; +using OpenSim.Framework.ServiceAuth; +using OpenSim.Services.Interfaces; +using GridRegion = OpenSim.Services.Interfaces.GridRegion; +using IAvatarService = OpenSim.Services.Interfaces.IAvatarService; +using OpenSim.Server.Base; +using OpenMetaverse; + +namespace OpenSim.Services.Connectors +{ + public class AgentPreferencesServicesConnector : BaseServiceConnector, IAgentPreferencesService + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private string m_ServerURI = String.Empty; + + public AgentPreferencesServicesConnector() + { + } + + public AgentPreferencesServicesConnector(string serverURI) + { + m_ServerURI = serverURI.TrimEnd('/'); + } + + public AgentPreferencesServicesConnector(IConfigSource source) + : base(source, "AgentPreferencesService") + { + Initialise(source); + } + + public virtual void Initialise(IConfigSource source) + { + IConfig gridConfig = source.Configs["AgentPreferencesService"]; + if (gridConfig == null) + { + m_log.Error("[AGENT PREFERENCES CONNECTOR]: AgentPreferencesService missing from OpenSim.ini"); + throw new Exception("Agent Preferences connector init error"); + } + + string serviceURI = gridConfig.GetString("AgentPreferencesServerURI", String.Empty); + + if (serviceURI == String.Empty) + { + m_log.Error("[AGENT PREFERENCES CONNECTOR]: No Server URI named in section AgentPreferences"); + throw new Exception("Agent Preferences connector init error"); + } + m_ServerURI = serviceURI; + + base.Initialise(source, "AgentPreferencesService"); + } + + #region IAgentPreferencesService + + public AgentPrefs GetAgentPreferences(UUID principalID) + { + Dictionary sendData = new Dictionary(); + + string reply = string.Empty; + string uri = String.Concat(m_ServerURI, "/agentprefs"); + + sendData["METHOD"] = "getagentprefs"; + sendData["UserID"] = principalID; + string reqString = ServerUtils.BuildQueryString(sendData); + // m_log.DebugFormat("[AGENT PREFS CONNECTOR]: queryString = {0}", reqString); + + try + { + reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString, m_Auth); + if (String.IsNullOrEmpty(reply)) + { + m_log.DebugFormat("[AGENT PREFERENCES CONNECTOR]: GetAgentPreferences received null or empty reply"); + return null; + } + } + catch (Exception e) + { + m_log.DebugFormat("[AGENT PREFERENCES CONNECTOR]: Exception when contacting agent preferences server at {0}: {1}", uri, e.Message); + } + + Dictionary replyData = ServerUtils.ParseXmlResponse(reply); + if (replyData != null) + { + if (replyData.ContainsKey("result") && + (replyData["result"].ToString() == "null" || replyData["result"].ToString() == "Failure")) + { + m_log.DebugFormat("[AGENT PREFERENCES CONNECTOR]: GetAgentPreferences received Failure response"); + return null; + } + } + else + { + m_log.DebugFormat("[AGENT PREFERENCES CONNECTOR]: GetAgentPreferences received null response"); + return null; + } + AgentPrefs prefs = new AgentPrefs(replyData); + return prefs; + } + + public bool StoreAgentPreferences(AgentPrefs data) + { + Dictionary sendData = new Dictionary(); + + sendData["METHOD"] = "setagentprefs"; + + sendData["PrincipalID"] = data.PrincipalID.ToString(); + sendData["AccessPrefs"] = data.AccessPrefs; + sendData["HoverHeight"] = data.HoverHeight.ToString(); + sendData["Language"] = data.Language; + sendData["LanguageIsPublic"] = data.LanguageIsPublic.ToString(); + sendData["PermEveryone"] = data.PermEveryone.ToString(); + sendData["PermGroup"] = data.PermGroup.ToString(); + sendData["PermNextOwner"] = data.PermNextOwner.ToString(); + + string uri = String.Concat(m_ServerURI, "/agentprefs"); + string reqString = ServerUtils.BuildQueryString(sendData); + // m_log.DebugFormat("[AGENT PREFS CONNECTOR]: queryString = {0}", reqString); + + try + { + string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString, m_Auth); + if (reply != string.Empty) + { + Dictionary replyData = ServerUtils.ParseXmlResponse(reply); + + if (replyData.ContainsKey("result")) + { + if (replyData["result"].ToString().ToLower() == "success") + return true; + else + return false; + } + else + { + m_log.DebugFormat("[AGENT PREFERENCES CONNECTOR]: StoreAgentPreferences reply data does not contain result field"); + } + + } + else + m_log.DebugFormat("[AGENT PREFERENCES CONNECTOR]: StoreAgentPreferences received empty reply"); + } + catch (Exception e) + { + m_log.DebugFormat("[AGENT PREFERENCES CONNECTOR]: Exception when contacting agent preferences server at {0}: {1}", uri, e.Message); + } + + return false; + } + + public string GetLang(UUID principalID) + { + Dictionary sendData = new Dictionary(); + string reply = string.Empty; + + sendData["METHOD"] = "getagentlang"; + sendData["UserID"] = principalID.ToString(); + + string uri = String.Concat(m_ServerURI, "/agentprefs"); + string reqString = ServerUtils.BuildQueryString(sendData); + + try + { + reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString, m_Auth); + if (String.IsNullOrEmpty(reply)) + { + m_log.DebugFormat("[AGENT PREFERENCES CONNECTOR]: GetLang received null or empty reply"); + return "en-us"; // I guess? Gotta return somethin'! + } + } + catch (Exception e) + { + m_log.DebugFormat("[AGENT PREFERENCES CONNECTOR]: Exception when contacting agent preferences server at {0}: {1}", uri, e.Message); + } + + Dictionary replyData = ServerUtils.ParseXmlResponse(reply); + if (replyData != null) + { + if (replyData.ContainsKey("result") && + (replyData["result"].ToString() == "null" || replyData["result"].ToString() == "Failure")) + { + m_log.DebugFormat("[AGENT PREFERENCES CONNECTOR]: GetLang received Failure response"); + return "en-us"; + } + if (replyData.ContainsKey("Language")) + return replyData["Language"].ToString(); + } + else + { + m_log.DebugFormat("[AGENT PREFERENCES CONNECTOR]: GetLang received null response"); + + } + return "en-us"; + } + + #endregion IAgentPreferencesService + } +} diff --git a/OpenSim/Services/Interfaces/IAgentPreferencesService.cs b/OpenSim/Services/Interfaces/IAgentPreferencesService.cs new file mode 100644 index 0000000000..b74b5804e5 --- /dev/null +++ b/OpenSim/Services/Interfaces/IAgentPreferencesService.cs @@ -0,0 +1,115 @@ +/* + * 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 System; +using System.Collections.Generic; +using OpenMetaverse; + +namespace OpenSim.Services.Interfaces +{ + public class AgentPrefs + { + public AgentPrefs(UUID principalID) + { + principalID = PrincipalID; + } + + public AgentPrefs(Dictionary kvp) + { + if (kvp.ContainsKey("PrincipalID")) + UUID.TryParse(kvp["PrincipalID"], out PrincipalID); + if (kvp.ContainsKey("AccessPrefs")) + AccessPrefs = kvp["AccessPrefs"]; + if (kvp.ContainsKey("HoverHeight")) + HoverHeight = double.Parse(kvp["HoverHeight"]); + if (kvp.ContainsKey("Language")) + Language = kvp["Language"]; + if (kvp.ContainsKey("LanguageIsPublic")) + LanguageIsPublic = bool.Parse(kvp["LanguageIsPublic"]); + if (kvp.ContainsKey("PermEveryone")) + PermEveryone = int.Parse(kvp["PermEveryone"]); + if (kvp.ContainsKey("PermGroup")) + PermGroup = int.Parse(kvp["PermGroup"]); + if (kvp.ContainsKey("PermNextOwner")) + PermNextOwner = int.Parse(kvp["PermNextOwner"]); + } + + public AgentPrefs(Dictionary kvp) + { + if (kvp.ContainsKey("PrincipalID")) + UUID.TryParse(kvp["PrincipalID"].ToString(), out PrincipalID); + if (kvp.ContainsKey("AccessPrefs")) + AccessPrefs = kvp["AccessPrefs"].ToString(); + if (kvp.ContainsKey("HoverHeight")) + HoverHeight = double.Parse(kvp["HoverHeight"].ToString()); + if (kvp.ContainsKey("Language")) + Language = kvp["Language"].ToString(); + if (kvp.ContainsKey("LanguageIsPublic")) + LanguageIsPublic = bool.Parse(kvp["LanguageIsPublic"].ToString()); + if (kvp.ContainsKey("PermEveryone")) + PermEveryone = int.Parse(kvp["PermEveryone"].ToString()); + if (kvp.ContainsKey("PermGroup")) + PermGroup = int.Parse(kvp["PermGroup"].ToString()); + if (kvp.ContainsKey("PermNextOwner")) + PermNextOwner = int.Parse(kvp["PermNextOwner"].ToString()); + } + + public Dictionary ToKeyValuePairs() + { + Dictionary result = new Dictionary(); + result["PrincipalID"] = PrincipalID.ToString(); + result["AccessPrefs"] = AccessPrefs.ToString(); + result["HoverHeight"] = HoverHeight.ToString(); + result["Language"] = Language.ToString(); + result["LanguageIsPublic"] = LanguageIsPublic.ToString(); + result["PermEveryone"] = PermEveryone.ToString(); + result["PermGroup"] = PermGroup.ToString(); + result["PermNextOwner"] = PermNextOwner.ToString(); + return result; + } + + public UUID PrincipalID = UUID.Zero; + public string AccessPrefs = "M"; + //public int GodLevel; // *TODO: Implement GodLevel (Unused by the viewer, afaict - 6/11/2015) + public double HoverHeight = 0.0; + public string Language = "en-us"; + public bool LanguageIsPublic = true; + // DefaultObjectPermMasks + public int PermEveryone = 0; + public int PermGroup = 0; + public int PermNextOwner = 532480; + } + + public interface IAgentPreferencesService + { + AgentPrefs GetAgentPreferences(UUID principalID); + bool StoreAgentPreferences(AgentPrefs data); + + string GetLang(UUID principalID); + } +} + diff --git a/OpenSim/Services/UserAccountService/AgentPreferencesService.cs b/OpenSim/Services/UserAccountService/AgentPreferencesService.cs new file mode 100644 index 0000000000..f8d2e29209 --- /dev/null +++ b/OpenSim/Services/UserAccountService/AgentPreferencesService.cs @@ -0,0 +1,80 @@ +/* + * 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 System; +using System.Reflection; +using log4net; +using Nini.Config; +using OpenMetaverse; +using OpenSim.Data; +using OpenSim.Framework; +using OpenSim.Services.Interfaces; + +namespace OpenSim.Services.UserAccountService +{ + public class AgentPreferencesService : AgentPreferencesServiceBase, IAgentPreferencesService + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + public AgentPreferencesService(IConfigSource config) : base(config) + { + m_log.Debug("[AGENT PREFERENCES SERVICE]: Starting agent preferences service"); + } + + public AgentPrefs GetAgentPreferences(UUID principalID) + { + AgentPreferencesData d = m_Database.GetPrefs(principalID); + AgentPrefs prefs = (d == null) ? new AgentPrefs(principalID) : new AgentPrefs(d.Data); + return prefs; + } + + public bool StoreAgentPreferences(AgentPrefs data) + { + AgentPreferencesData d = new AgentPreferencesData(); + d.Data["PrincipalID"] = data.PrincipalID.ToString(); + d.Data["AccessPrefs"] = data.AccessPrefs; + d.Data["HoverHeight"] = data.HoverHeight.ToString(); + d.Data["Language"] = data.Language; + d.Data["LanguageIsPublic"] = data.LanguageIsPublic.ToString(); + d.Data["PermEveryone"] = data.PermEveryone.ToString(); + d.Data["PermGroup"] = data.PermGroup.ToString(); + d.Data["PermNextOwner"] = data.PermNextOwner.ToString(); + return m_Database.Store(d); + } + + public string GetLang(UUID principalID) + { + AgentPrefs data = GetAgentPreferences(principalID); + if (data != null) + { + if (data.LanguageIsPublic) + return data.Language; + } + return "en-us"; + } + } +} diff --git a/OpenSim/Services/UserAccountService/AgentPreferencesServiceBase.cs b/OpenSim/Services/UserAccountService/AgentPreferencesServiceBase.cs new file mode 100644 index 0000000000..597434903a --- /dev/null +++ b/OpenSim/Services/UserAccountService/AgentPreferencesServiceBase.cs @@ -0,0 +1,73 @@ +/* + * 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 System; +using System.Reflection; +using Nini.Config; +using OpenSim.Data; +using OpenSim.Services.Interfaces; +using OpenSim.Services.Base; + +namespace OpenSim.Services.UserAccountService +{ + public class AgentPreferencesServiceBase: ServiceBase + { + protected IAgentPreferencesData m_Database = null; + + public AgentPreferencesServiceBase(IConfigSource config) : base(config) + { + string dllName = String.Empty; + string connString = String.Empty; + string realm = "AgentPrefs"; + + IConfig dbConfig = config.Configs["DatabaseService"]; + if (dbConfig != null) + { + dllName = dbConfig.GetString("StorageProvider", String.Empty); + connString = dbConfig.GetString("ConnectionString", String.Empty); + } + + IConfig userConfig = config.Configs["AgentPreferencesService"]; + if (userConfig == null) + throw new Exception("No AgentPreferencesService configuration"); + + dllName = userConfig.GetString("StorageProvider", dllName); + + if (dllName == String.Empty) + throw new Exception("No StorageProvider configured"); + + connString = userConfig.GetString("ConnectionString", connString); + + realm = userConfig.GetString("Realm", realm); + + m_Database = LoadPlugin(dllName, new Object[] {connString, realm}); + + if (m_Database == null) + throw new Exception("Could not find a storage interface in the given module"); + } + } +} diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 8962afa702..18fe894817 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -85,6 +85,7 @@ PresenceServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:PresenceServiceConnector" UserAccountServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:UserAccountServiceConnector" GridUserServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:GridUserServiceConnector" + AgentPreferencesServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:AgentPreferencesServiceConnector" FriendsServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:FriendsServiceConnector" MapAddServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:MapAddServiceConnector" MapGetServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:MapGetServiceConnector" @@ -374,6 +375,11 @@ LocalServiceModule = "OpenSim.Services.UserAccountService.dll:GridUserService" +[AgentPreferencesService] + ; for the server connector + LocalServiceModule = "Opensim.Services.UserAccountService.dll:AgentPreferencesService" + + [PresenceService] ; for the server connector LocalServiceModule = "OpenSim.Services.PresenceService.dll:PresenceService" diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example index 48deeaeba5..60f07fc113 100644 --- a/bin/Robust.ini.example +++ b/bin/Robust.ini.example @@ -76,6 +76,7 @@ PresenceServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:PresenceServiceConnector" UserAccountServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:UserAccountServiceConnector" GridUserServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:GridUserServiceConnector" + AgentPreferencesServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:AgentPreferencesServiceConnector" FriendsServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:FriendsServiceConnector" MapAddServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:MapAddServiceConnector" MapGetServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:MapGetServiceConnector" @@ -332,6 +333,11 @@ LocalServiceModule = "OpenSim.Services.UserAccountService.dll:GridUserService" +[AgentPreferencesService] + ; for the server connector + LocalServiceModule = "Opensim.Services.UserAccountService.dll:AgentPreferencesService" + + [PresenceService] ; for the server connector LocalServiceModule = "OpenSim.Services.PresenceService.dll:PresenceService" diff --git a/bin/config-include/Grid.ini b/bin/config-include/Grid.ini index 4b01d8205b..3c61ee01fd 100644 --- a/bin/config-include/Grid.ini +++ b/bin/config-include/Grid.ini @@ -17,6 +17,7 @@ AuthorizationServices = "LocalAuthorizationServicesConnector" PresenceServices = "RemotePresenceServicesConnector" UserAccountServices = "RemoteUserAccountServicesConnector" + AgentPreferencesServices= "RemoteAgentPreferencesServicesConnector" GridUserServices = "RemoteGridUserServicesConnector" SimulationServices = "RemoteSimulationConnectorModule" EntityTransferModule = "BasicEntityTransferModule" diff --git a/bin/config-include/GridCommon.ini.example b/bin/config-include/GridCommon.ini.example index 4486f31cee..0922cf5a4a 100644 --- a/bin/config-include/GridCommon.ini.example +++ b/bin/config-include/GridCommon.ini.example @@ -131,6 +131,12 @@ ; AvatarServerURI = "${Const|BaseURL}:${Const|PrivatePort}" +[AgentPreferencesService] + ; + ; Change this to your grid-wide avatar prefs server + ; + AgentPreferencesServerURI = "${Const|BaseURL}:${Const|PrivatePort}" + [PresenceService] ; ; Change this to your grid-wide presence server diff --git a/bin/config-include/GridHypergrid.ini b/bin/config-include/GridHypergrid.ini index 21a5a22d8f..aa64c2af5a 100644 --- a/bin/config-include/GridHypergrid.ini +++ b/bin/config-include/GridHypergrid.ini @@ -20,6 +20,7 @@ AuthorizationServices = "LocalAuthorizationServicesConnector" PresenceServices = "RemotePresenceServicesConnector" UserAccountServices = "RemoteUserAccountServicesConnector" + AgentPreferencesServices= "RemoteAgentPreferencesServicesConnector" GridUserServices = "RemoteGridUserServicesConnector" SimulationServices = "RemoteSimulationConnectorModule" EntityTransferModule = "HGEntityTransferModule" diff --git a/bin/config-include/Standalone.ini b/bin/config-include/Standalone.ini index 6b91d9ad13..93a5437991 100644 --- a/bin/config-include/Standalone.ini +++ b/bin/config-include/Standalone.ini @@ -14,6 +14,7 @@ PresenceServices = "LocalPresenceServicesConnector" UserProfilesServices = "LocalUserProfilesServicesConnector" UserAccountServices = "LocalUserAccountServicesConnector" + AgentPreferencesServices= "LocalAgentPreferencesServicesConnector" GridUserServices = "LocalGridUserServicesConnector" SimulationServices = "LocalSimulationConnectorModule" AvatarServices = "LocalAvatarServicesConnector" diff --git a/bin/config-include/StandaloneHypergrid.ini b/bin/config-include/StandaloneHypergrid.ini index 1be67db6a8..43cb145351 100644 --- a/bin/config-include/StandaloneHypergrid.ini +++ b/bin/config-include/StandaloneHypergrid.ini @@ -16,6 +16,7 @@ GridServices = "LocalGridServicesConnector" PresenceServices = "LocalPresenceServicesConnector" UserAccountServices = "LocalUserAccountServicesConnector" + AgentPreferencesServices= "LocalAgentPreferencesServicesConnector" GridUserServices = "LocalGridUserServicesConnector" SimulationServices = "RemoteSimulationConnectorModule" AvatarServices = "LocalAvatarServicesConnector"