From 0fa94f222df8ed7f308730c3692bf2a774138718 Mon Sep 17 00:00:00 2001 From: Cinder Date: Fri, 12 Jun 2015 18:48:07 -0600 Subject: Refactor AgentPreferences so that database operations happen centrally. the opensim way. Signed-off-by: Diva Canto --- .../AgentPreferences/AgentPreferencesConnector.cs | 230 +++++++++++++++++++++ .../Interfaces/IAgentPreferencesService.cs | 115 +++++++++++ .../UserAccountService/AgentPreferencesService.cs | 80 +++++++ .../AgentPreferencesServiceBase.cs | 73 +++++++ 4 files changed, 498 insertions(+) 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 (limited to 'OpenSim/Services') diff --git a/OpenSim/Services/Connectors/AgentPreferences/AgentPreferencesConnector.cs b/OpenSim/Services/Connectors/AgentPreferences/AgentPreferencesConnector.cs new file mode 100644 index 0000000..1dbc0c8 --- /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 0000000..b74b580 --- /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 0000000..f8d2e29 --- /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 0000000..5974349 --- /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"); + } + } +} -- cgit v1.1