/* * @brief AgentPreferences capability module * * Copyright (C) 2015, Cinder Roxley * * Permission is hereby granted, free of charge, to any person or organization * obtaining a copy of the software and accompanying documentation covered by * this license (the "Software") to use, reproduce, display, distribute, * execute, and transmit the Software, and to prepare derivative works of the * Software, and to permit third-parties to whom the Software is furnished to * do so, all subject to the following: * * The copyright notices in the Software and this entire statement, including * the above license grant, this restriction and the following disclaimer, * must be included in all copies of the Software, in whole or in part, and * all derivative works of the Software, unless such copies or derivative * works are solely in the form of machine-executable object code generated by * a source language processor. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ using System; using System.Reflection; using System.IO; using log4net; 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; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Services.Interfaces; using Caps = OpenSim.Framework.Capabilities.Caps; using OpenSim.Capabilities.Handlers; namespace OpenSim.Region.ClientStack.LindenCaps { [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "AgentPreferencesModule")] public class AgentPreferencesModule : ISharedRegionModule, IAgentPreferencesModule { 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; 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 RemoveRegion(Scene s) { if (!m_enabled) return; m_Scene.UnregisterModuleInterface(this); m_Scene.EventManager.OnRegisterCaps -= RegisterCaps; m_Scene = null; } public void RegionLoaded(Scene s) { if (!m_enabled) return; m_Scene.EventManager.OnRegisterCaps += delegate(UUID agentID, OpenSim.Framework.Capabilities.Caps caps) { RegisterCaps(agentID, caps); }; } public void PostInitialise() {} public void Close() {} public string Name { get { return "AgentPreferencesModule"; } } public Type ReplaceableInterface { get { return null; } } public void RegisterCaps(UUID agent, Caps caps) { UUID capId = UUID.Random(); caps.RegisterHandler("AgentPreferences", new RestStreamHandler("POST", "/CAPS/" + capId, delegate(string request, string path, string param, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) { return UpdateAgentPreferences(request, path, param, agent); })); caps.RegisterHandler("UpdateAgentLanguage", new RestStreamHandler("POST", "/CAPS/" + capId, delegate(string request, string path, string param, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) { return UpdateAgentPreferences(request, path, param, agent); })); caps.RegisterHandler("UpdateAgentInformation", new RestStreamHandler("POST", "/CAPS/" + capId, delegate(string request, string path, string param, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) { return UpdateAgentPreferences(request, path, param, agent); })); } public string UpdateAgentPreferences(string request, string path, string param, UUID agent) { m_log.DebugFormat("[AgentPrefs] UpdateAgentPreferences for {0}", agent.ToString()); OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request); AgentPreferencesData data = m_Database.GetPrefs(agent); if (data == null) { data = new AgentPreferencesData(); data.PrincipalID = agent; } if (req.ContainsKey("access_prefs")) { OSDMap accessPrefs = (OSDMap)req["access_prefs"]; // We could check with ContainsKey... data.AccessPrefs = accessPrefs["max"].AsString(); } if (req.ContainsKey("default_object_perm_masks")) { OSDMap permsMap = (OSDMap)req["default_object_perm_masks"]; data.PermEveryone = permsMap["Everyone"].AsInteger(); data.PermGroup = permsMap["Group"].AsInteger(); data.PermNextOwner = permsMap["NextOwner"].AsInteger(); } if (req.ContainsKey("hover_height")) { data.HoverHeight = req["hover_height"].AsReal(); } if (req.ContainsKey("language")) { data.Language = req["language"].AsString(); } if (req.ContainsKey("language_is_public")) { data.LanguageIsPublic = req["language_is_public"].AsBoolean(); } m_Database.StorePrefs(data); OSDMap resp = new OSDMap(); OSDMap respAccessPrefs = new OSDMap(); respAccessPrefs["max"] = data.AccessPrefs; resp["access_prefs"] = respAccessPrefs; OSDMap respDefaultPerms = new OSDMap(); respDefaultPerms["Everyone"] = data.PermEveryone; respDefaultPerms["Group"] = data.PermGroup; respDefaultPerms["NextOwner"] = data.PermNextOwner; resp["default_object_perm_masks"] = respDefaultPerms; resp["god_level"] = 0; // *TODO: Add this resp["hover_height"] = data.HoverHeight; resp["language"] = data.Language; resp["language_is_public"] = data.LanguageIsPublic; 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 } }