瀏覽代碼

move some sharable items out of Xmute to Framework; add another test mutelistmodule, ignore it

UbitUmarov 6 年之前
父節點
當前提交
1e3cb82756

+ 139 - 0
OpenSim/Framework/Crc32.cs

@@ -0,0 +1,139 @@
+/*
+ * 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.Security.Cryptography;
+
+namespace OpenSim.Framework
+{
+    // this is more generic than openmetaverse CRC32
+
+    public class Crc32 : HashAlgorithm
+    {
+        public const UInt32 DefaultPolynomial = 0xedb88320;
+        public const UInt32 DefaultSeed = 0xffffffff;
+
+        private UInt32 hash;
+        private UInt32 seed;
+        private UInt32[] table;
+        private static UInt32[] defaultTable;
+
+        public Crc32()
+        {
+            table = InitializeTable(DefaultPolynomial);
+            seed = DefaultSeed;
+            Initialize();
+        }
+
+        public Crc32(UInt32 polynomial, UInt32 seed)
+        {
+            table = InitializeTable(polynomial);
+            this.seed = seed;
+            Initialize();
+        }
+
+        public override void Initialize()
+        {
+            hash = seed;
+        }
+
+        protected override void HashCore(byte[] buffer, int start, int length)
+        {
+            hash = CalculateHash(table, hash, buffer, start, length);
+        }
+
+        protected override byte[] HashFinal()
+        {
+            byte[] hashBuffer = UInt32ToBigEndianBytes(~hash);
+            this.HashValue = hashBuffer;
+            return hashBuffer;
+        }
+
+        public override int HashSize
+        {
+            get { return 32; }
+        }
+
+        public static UInt32 Compute(byte[] buffer)
+        {
+            return ~CalculateHash(InitializeTable(DefaultPolynomial), DefaultSeed, buffer, 0, buffer.Length);
+        }
+
+        public static UInt32 Compute(UInt32 seed, byte[] buffer)
+        {
+            return ~CalculateHash(InitializeTable(DefaultPolynomial), seed, buffer, 0, buffer.Length);
+        }
+
+        public static UInt32 Compute(UInt32 polynomial, UInt32 seed, byte[] buffer)
+        {
+            return ~CalculateHash(InitializeTable(polynomial), seed, buffer, 0, buffer.Length);
+        }
+
+        private static UInt32[] InitializeTable(UInt32 polynomial)
+        {
+            if (polynomial == DefaultPolynomial && defaultTable != null)
+                return defaultTable;
+
+            UInt32[] createTable = new UInt32[256];
+            for (int i = 0; i < 256; i++)
+            {
+                UInt32 entry = (UInt32)i;
+                for (int j = 0; j < 8; j++)
+                    if ((entry & 1) == 1)
+                        entry = (entry >> 1) ^ polynomial;
+                    else
+                        entry = entry >> 1;
+                createTable[i] = entry;
+            }
+
+            if (polynomial == DefaultPolynomial)
+                defaultTable = createTable;
+
+            return createTable;
+        }
+
+        private static UInt32 CalculateHash(UInt32[] table, UInt32 seed, byte[] buffer, int start, int size)
+        {
+            UInt32 crc = seed;
+            for (int i = start; i < size; i++)
+                unchecked
+                {
+                    crc = (crc >> 8) ^ table[buffer[i] ^ crc & 0xff];
+                }
+            return crc;
+        }
+
+        private byte[] UInt32ToBigEndianBytes(UInt32 x)
+        {
+            return new byte[] {
+                    (byte)((x >> 24) & 0xff),
+                    (byte)((x >> 16) & 0xff),
+                    (byte)((x >> 8) & 0xff),
+                    (byte)(x & 0xff) };
+        }
+    }
+}

+ 41 - 0
OpenSim/Framework/MuteData.cs

@@ -0,0 +1,41 @@
+/*
+ * 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 OpenMetaverse;
+
+namespace OpenSim.Framework
+{
+    public class MuteData
+    {
+        public UUID AgentID;
+        public UUID MuteID;
+        public string MuteName;
+        public int MuteType;
+        public int MuteFlags;
+        public int Stamp;
+    }
+}

+ 224 - 0
OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModuleTst.cs

@@ -0,0 +1,224 @@
+/*
+ * 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 System.Text;
+using log4net;
+using Nini.Config;
+using OpenMetaverse;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers;
+using OpenSim.Framework.Client;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using Mono.Addins;
+using OpenSim.Data;
+using OpenSim.Data.MySQL;
+using MySql.Data.MySqlClient;
+using System.Security.Cryptography;
+
+namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
+{
+    [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "MuteListModuleTst")]
+    public class MuteModuleTst : ISharedRegionModule
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(
+                MethodBase.GetCurrentMethod().DeclaringType);
+
+        protected bool m_Enabled = false;
+        protected List<Scene> m_SceneList = new List<Scene>();
+        protected MuteTableHandler m_MuteTable;
+        protected string m_DatabaseConnect;
+
+        public void Initialise(IConfigSource config)
+        {
+            IConfig cnf = config.Configs["Messaging"];
+            if (cnf == null)
+                return;
+
+            if (cnf.GetString("MuteListModule", "None") != "MuteListModuleTst")
+                return;
+
+            m_DatabaseConnect = cnf.GetString("MuteDatabaseConnect", String.Empty);
+            if (m_DatabaseConnect == String.Empty)
+            {
+                m_log.Debug("[MuteModuleTst]: MuteDatabaseConnect missing or empty");
+                return;
+            }
+           
+            try
+            {
+                m_MuteTable = new MuteTableHandler(m_DatabaseConnect, "XMute", String.Empty);
+            }
+            catch
+            {
+                m_log.Error("[MuteListModuleTst]: Failed to open/create database table");
+                return;
+            }
+
+            m_Enabled = true;
+        }
+
+        public void AddRegion(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            lock (m_SceneList)
+            {
+                m_SceneList.Add(scene);
+
+                scene.EventManager.OnNewClient += OnNewClient;
+            }
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            IXfer xfer = scene.RequestModuleInterface<IXfer>();
+            if (xfer == null)
+                m_log.ErrorFormat("[MuteListModuleTst]: Xfer not availble in region {0}", scene.Name);
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            lock (m_SceneList)
+            {
+                m_SceneList.Remove(scene);
+            }
+        }
+
+        public void PostInitialise()
+        {
+            if (!m_Enabled)
+                return;
+
+            m_log.Debug("[MuteListModuleTst]: Mute list enabled");
+        }
+
+        public string Name
+        {
+            get { return "MuteListModuleTst"; }
+        }
+
+        public Type ReplaceableInterface
+        {
+            get { return null; }
+        }
+        
+        public void Close()
+        {
+        }
+       
+        private void OnNewClient(IClientAPI client)
+        {
+            client.OnMuteListRequest += OnMuteListRequest;
+            client.OnUpdateMuteListEntry += OnUpdateMuteListEntry;
+            client.OnRemoveMuteListEntry += OnRemoveMuteListEntry;
+        }
+
+        private void OnMuteListRequest(IClientAPI client, uint crc)
+        {
+            IXfer xfer = client.Scene.RequestModuleInterface<IXfer>();
+            if (xfer == null)
+            {
+                if(crc == 0)
+                    client.SendEmpytMuteList();
+                else
+                    client.SendUseCachedMuteList();
+                return;
+            }
+
+            MuteData[] data = m_MuteTable.Get("AgentID", client.AgentId.ToString());
+            if (data == null || data.Length == 0)
+            {
+                if(crc == 0)
+                    client.SendEmpytMuteList();
+                else
+                    client.SendUseCachedMuteList();
+                return;
+            }
+
+            StringBuilder sb = new StringBuilder(16384);
+
+            foreach (MuteData d in data)
+                sb.AppendFormat("{0} {1} {2}|{3}\n",
+                        d.MuteType,
+                        d.MuteID.ToString(),
+                        d.MuteName,
+                        d.MuteFlags);
+
+            Byte[] filedata = Util.UTF8.GetBytes(sb.ToString());
+
+            uint dataCrc = Crc32.Compute(filedata);
+
+            if (dataCrc == crc)
+            {
+                if(crc == 0)
+                    client.SendEmpytMuteList();
+                else
+                    client.SendUseCachedMuteList();
+                return;
+            }
+
+            string filename = "mutes"+client.AgentId.ToString();
+            xfer.AddNewFile(filename, filedata);
+            client.SendMuteListUpdate(filename);
+        }
+
+        private void OnUpdateMuteListEntry(IClientAPI client, UUID muteID, string muteName, int muteType, uint muteFlags)
+        {
+            MuteData mute = new MuteData();
+
+            mute.AgentID = client.AgentId;
+            mute.MuteID = muteID;
+            mute.MuteName = muteName;
+            mute.MuteType = muteType;
+            mute.MuteFlags = (int)muteFlags;
+            mute.Stamp = Util.UnixTimeSinceEpoch();
+
+            m_MuteTable.Store(mute);
+        }
+
+        private void OnRemoveMuteListEntry(IClientAPI client, UUID muteID, string muteName)
+        {
+            m_MuteTable.Delete(new string[] { "AgentID",
+                                              "MuteID",
+                                              "MuteName" },
+                               new string[] { client.AgentId.ToString(),
+                                              muteID.ToString(),
+                                              muteName });
+        }
+    }
+}
+

+ 5 - 120
OpenSim/Region/CoreModules/Avatar/InstantMessage/XMuteModule.cs

@@ -27,6 +27,7 @@
 using System;
 using System.Collections.Generic;
 using System.Reflection;
+using System.Text;
 using log4net;
 using Nini.Config;
 using OpenMetaverse;
@@ -43,16 +44,6 @@ using System.Security.Cryptography;
 
 namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
 {
-    public class MuteData
-    {
-        public UUID AgentID;
-        public UUID MuteID;
-        public string MuteName;
-        public int MuteType;
-        public int MuteFlags;
-        public int Stamp;
-    }
-
     [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "XMute")]
     public class XMuteModule : ISharedRegionModule
     {
@@ -163,17 +154,16 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
                 }
                 else
                 {
-                    List<string> mutes = new List<string>();
+                    StringBuilder sb = new StringBuilder(1024);
 
                     foreach (MuteData d in data)
-                        mutes.Add(String.Format("{0} {1} {2}|{3}",
+                        sb.AppendFormat("{0} {1} {2}|{3}\n",
                                 d.MuteType,
                                 d.MuteID.ToString(),
                                 d.MuteName,
-                                d.MuteFlags));
+                                d.MuteFlags);
 
-                    Byte[] filedata = Util.UTF8.GetBytes(String.Join("\n",
-                            mutes.ToArray()) + "\n");
+                    Byte[] filedata = Util.UTF8.GetBytes(sb.ToString());
 
                     uint dataCrc = Crc32.Compute(filedata);
 
@@ -248,110 +238,5 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
             }
         }
     }
-
-    public class Crc32 : HashAlgorithm
-    {
-        public const UInt32 DefaultPolynomial = 0xedb88320;
-        public const UInt32 DefaultSeed = 0xffffffff;
-
-        private UInt32 hash;
-        private UInt32 seed;
-        private UInt32[] table;
-        private static UInt32[] defaultTable;
-
-        public Crc32()
-        {
-            table = InitializeTable(DefaultPolynomial);
-            seed = DefaultSeed;
-            Initialize();
-        }
-
-        public Crc32(UInt32 polynomial, UInt32 seed)
-        {
-            table = InitializeTable(polynomial);
-            this.seed = seed;
-            Initialize();
-        }
-
-        public override void Initialize()
-        {
-            hash = seed;
-        }
-
-        protected override void HashCore(byte[] buffer, int start, int length)
-        {
-            hash = CalculateHash(table, hash, buffer, start, length);
-        }
-
-        protected override byte[] HashFinal()
-        {
-            byte[] hashBuffer = UInt32ToBigEndianBytes(~hash);
-            this.HashValue = hashBuffer;
-            return hashBuffer;
-        }
-
-        public override int HashSize
-        {
-            get { return 32; }
-        }
-
-        public static UInt32 Compute(byte[] buffer)
-        {
-            return ~CalculateHash(InitializeTable(DefaultPolynomial), DefaultSeed, buffer, 0, buffer.Length);
-        }
-
-        public static UInt32 Compute(UInt32 seed, byte[] buffer)
-        {
-            return ~CalculateHash(InitializeTable(DefaultPolynomial), seed, buffer, 0, buffer.Length);
-        }
-
-        public static UInt32 Compute(UInt32 polynomial, UInt32 seed, byte[] buffer)
-        {
-            return ~CalculateHash(InitializeTable(polynomial), seed, buffer, 0, buffer.Length);
-        }
-
-        private static UInt32[] InitializeTable(UInt32 polynomial)
-        {
-            if (polynomial == DefaultPolynomial && defaultTable != null)
-                return defaultTable;
-
-            UInt32[] createTable = new UInt32[256];
-            for (int i = 0; i < 256; i++)
-            {
-                UInt32 entry = (UInt32)i;
-                for (int j = 0; j < 8; j++)
-                    if ((entry & 1) == 1)
-                        entry = (entry >> 1) ^ polynomial;
-                    else
-                        entry = entry >> 1;
-                createTable[i] = entry;
-            }
-
-            if (polynomial == DefaultPolynomial)
-                defaultTable = createTable;
-
-            return createTable;
-        }
-
-        private static UInt32 CalculateHash(UInt32[] table, UInt32 seed, byte[] buffer, int start, int size)
-        {
-            UInt32 crc = seed;
-            for (int i = start; i < size; i++)
-                unchecked
-                {
-                    crc = (crc >> 8) ^ table[buffer[i] ^ crc & 0xff];
-                }
-            return crc;
-        }
-
-        private byte[] UInt32ToBigEndianBytes(UInt32 x)
-        {
-            return new byte[] {
-                    (byte)((x >> 24) & 0xff),
-                    (byte)((x >> 16) & 0xff),
-                    (byte)((x >> 8) & 0xff),
-                    (byte)(x & 0xff) };
-        }
-    }
 }
 

+ 2 - 0
prebuild.xml

@@ -97,6 +97,8 @@
       <Reference name="System.Data"/>
       <Reference name="System.Drawing"/>
       <Reference name="System.Web"/>
+      <Reference name="System.Security"/>
+      <Reference name="System.Security.Cryptography"/>
       <Reference name="OpenMetaverseTypes" path="../../bin/"/>
       <Reference name="OpenMetaverse" path="../../bin/"/>
       <Reference name="OpenMetaverse.StructuredData" path="../../bin/"/>