public ParcelAccessEntry(ParcelAccessEntry src)
 {
     RegionID  = src.RegionID;
     ParcelID  = src.ParcelID;
     Accessor  = new UGUI(src.Accessor);
     ExpiresAt = src.ExpiresAt != null ? new Date(src.ExpiresAt) : null;
 }
Beispiel #2
0
        public object ParcelUnBan(string avatar, string token)
        {
            KeyValuePair <bool, string> tests = SetupCurrentParcel(token, "parcel", "ParcelUnBan");

            if (tests.Key == false)
            {
                return(Failure(tests.Value, "ParcelUnBan", new [] { avatar }));
            }
            ProcessAvatar(avatar);
            if (avataruuid == UUID.Zero)
            {
                return(Failure("Invaild avatar", "ParcelUnBan", new [] { avatar }));
            }
            bool alreadyBanned            = false;
            ParcelAccessEntry removeentry = new ParcelAccessEntry();

            foreach (ParcelAccessEntry E in targetparcel.AccessBlackList)
            {
                if (E.AgentID == avataruuid)
                {
                    alreadyBanned = true;
                    removeentry   = E;
                    break;
                }
            }
            if (alreadyBanned == false)
            {
                return(BasicReply("Avatar is already unbanned", "ParcelUnBan", new [] { avatar }));
            }
            targetparcel.AccessBlackList.Remove(removeentry);
            targetparcel.Update(bot.GetClient.Network.CurrentSim, false);
            return(BasicReply("ok", "ParcelUnBan", new [] { avatar }));
        }
Beispiel #3
0
        private bool CompareEntry(ParcelAccessEntry a, ParcelAccessEntry b)
        {
            var mismatches = new List <string>();

            if (!a.Accessor.EqualsGrid(b.Accessor))
            {
                mismatches.Add("Accessor");
            }
            if (a.RegionID != b.RegionID)
            {
                m_Log.InfoFormat("Mismatching RegionID {0} != {1}", a.RegionID, b.RegionID);
                mismatches.Add("RegionID");
            }
            if (a.ParcelID != b.ParcelID)
            {
                m_Log.InfoFormat("Mismatching ParcelID {0} != {1}", a.ParcelID, b.ParcelID);
                mismatches.Add("ParcelID");
            }

            if (a.ExpiresAt == null && b.ExpiresAt == null)
            {
                return(true);
            }
            else if (a.ExpiresAt == null || b.ExpiresAt == null ||
                     a.ExpiresAt.AsULong != b.ExpiresAt.AsULong)
            {
                mismatches.Add("ExpiresAt");
            }
            if (mismatches.Count != 0)
            {
                m_Log.InfoFormat("Detected mismatches {0}", string.Join(" ", mismatches));
            }
            return(mismatches.Count == 0);
        }
Beispiel #4
0
                public bool TryGetValue(UUID regionID, UUID parcelID, UGUI accessor, out ParcelAccessEntry e)
                {
                    bool res = m_StorageList.TryGetValue(regionID, parcelID, accessor, out e);

                    if (res)
                    {
                        m_ParcelManager.CheckAccess(accessor, parcelID);
                    }
                    return(res);
                }
Beispiel #5
0
        public bool TryGetValue(UUID regionID, UUID parcelID, UUI accessor, out ParcelAccessEntry e)
        {
            var result = new List <ParcelAccessEntry>();

            using (var connection = new MySqlConnection(m_ConnectionString))
            {
                connection.Open();
                using (var cmd = new MySqlCommand("DELETE FROM " + m_TableName + " WHERE ExpiresAt <= " + Date.GetUnixTime().ToString() + " AND ExpiresAt <> 0", connection))
                {
                    cmd.ExecuteNonQuery();
                }

                /* we use a specific implementation to reduce the result set here */
                using (var cmd = new MySqlCommand("SELECT * FROM " + m_TableName + " WHERE RegionID = '" + regionID.ToString() + "' AND ParcelID = '" + parcelID.ToString() + "' AND Accessor LIKE \"" + accessor.ID.ToString() + "%\"", connection))
                {
                    using (MySqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var entry = new ParcelAccessEntry()
                            {
                                RegionID = regionID,
                                ParcelID = reader.GetUUID("ParcelID"),
                                Accessor = reader.GetUUI("Accessor")
                            };
                            ulong val = reader.GetUInt64("ExpiresAt");
                            if (val != 0)
                            {
                                entry.ExpiresAt = Date.UnixTimeToDateTime(val);
                            }
                            result.Add(entry);
                        }
                    }
                }
            }

            /* the prefiltered set reduces the amount of checks we have to do here */
            IEnumerable <ParcelAccessEntry> en         = from entry in result where entry.Accessor.EqualsGrid(accessor) && (entry.ExpiresAt == null || entry.ExpiresAt.AsULong > Date.Now.AsULong) select entry;
            IEnumerator <ParcelAccessEntry> enumerator = en.GetEnumerator();

            if (!enumerator.MoveNext())
            {
                e = null;
                return(false);
            }
            e = enumerator.Current;
            return(true);
        }
Beispiel #6
0
        public void Store(ParcelAccessEntry entry)
        {
            using (var connection = new MySqlConnection(m_ConnectionString))
            {
                connection.Open();
                using (var cmd = new MySqlCommand("DELETE FROM " + m_TableName + " WHERE ExpiresAt <= " + Date.GetUnixTime().ToString() + " AND ExpiresAt > 0", connection))
                {
                    cmd.ExecuteNonQuery();
                }

                var data = new Dictionary <string, object>
                {
                    ["RegionID"]  = entry.RegionID,
                    ["ParcelID"]  = entry.ParcelID,
                    ["Accessor"]  = entry.Accessor,
                    ["ExpiresAt"] = entry.ExpiresAt != null ? entry.ExpiresAt.AsULong : (ulong)0
                };
                connection.ReplaceInto(m_TableName, data);
            }
        }
        bool IParcelAccessList.TryGetValue(UUID regionID, UUID parcelID, UGUI accessor, out ParcelAccessEntry e)
        {
            RwLockedDictionary <UGUI, ParcelAccessEntry> list;

            if (m_Data.TryGetValue(GenParcelAccessListKey(regionID, parcelID), out list))
            {
                IEnumerable <ParcelAccessEntry> en         = from entry in list.Values where entry.Accessor.EqualsGrid(accessor) select entry;
                IEnumerator <ParcelAccessEntry> enumerator = en.GetEnumerator();
                if (enumerator.MoveNext())
                {
                    e = new ParcelAccessEntry(enumerator.Current);
                    if (e.ExpiresAt != null && e.ExpiresAt.AsULong <= Date.Now.AsULong && list.RemoveIf(e.Accessor, (entry) => entry.ExpiresAt.AsULong <= Date.Now.AsULong))
                    {
                        e = null;
                        return(false);
                    }
                    return(true);
                }
            }
            e = null;
            return(false);
        }
Beispiel #8
0
        public List <ParcelAccessEntry> this[UUID regionID, UUID parcelID]
        {
            get
            {
                var result = new List <ParcelAccessEntry>();
                using (var connection = new MySqlConnection(m_ConnectionString))
                {
                    connection.Open();
                    using (var cmd = new MySqlCommand("DELETE FROM " + m_TableName + " WHERE ExpiresAt <= " + Date.GetUnixTime().ToString() + " AND ExpiresAt > 0", connection))
                    {
                        cmd.ExecuteNonQuery();
                    }

                    using (var cmd = new MySqlCommand("SELECT * FROM " + m_TableName + " WHERE RegionID = '" + regionID.ToString() + "' AND ParcelID = '" + parcelID.ToString() + "'", connection))
                    {
                        using (MySqlDataReader reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                var entry = new ParcelAccessEntry()
                                {
                                    RegionID = reader.GetUUID("RegionID"),
                                    ParcelID = reader.GetUUID("ParcelID"),
                                    Accessor = reader.GetUUI("Accessor")
                                };
                                ulong val = reader.GetUInt64("ExpiresAt");
                                if (val != 0)
                                {
                                    entry.ExpiresAt = Date.UnixTimeToDateTime(val);
                                }
                                result.Add(entry);
                            }
                        }
                    }
                }
                return(result);
            }
        }
Beispiel #9
0
 private void ParcelAccessListUpdateManage(UUID parcelID, Dictionary <UUID, ParcelAccessListUpdate.Data> entries, IParcelAccessList accessList)
 {
     foreach (var listed in accessList[Scene.ID, parcelID])
     {
         if (!entries.ContainsKey(listed.Accessor.ID))
         {
             accessList.Remove(Scene.ID, parcelID, listed.Accessor);
         }
     }
     foreach (var upd in entries.Values)
     {
         UGUIWithName uui;
         if (Scene.AvatarNameService.TryGetValue(upd.ID, out uui))
         {
             var pae = new ParcelAccessEntry
             {
                 RegionID = Scene.ID,
                 Accessor = uui,
                 ParcelID = parcelID
             };
             accessList.Store(pae);
         }
     }
 }
Beispiel #10
0
        public object ParcelBan(string avatar, string token)
        {
            KeyValuePair <bool, string> tests = SetupCurrentParcel(token, "parcel", "ParcelBan");

            if (tests.Key == false)
            {
                return(Failure(tests.Value, "ParcelBan", new [] { avatar }));
            }
            ProcessAvatar(avatar);
            if (avataruuid == UUID.Zero)
            {
                return(Failure("Invaild avatar", "ParcelBan", new [] { avatar }));
            }
            bool alreadyBanned = false;

            foreach (ParcelAccessEntry E in targetparcel.AccessBlackList)
            {
                if (E.AgentID == avataruuid)
                {
                    alreadyBanned = true;
                    break;
                }
            }
            if (alreadyBanned == true)
            {
                return(BasicReply("Avatar is in the blacklist", "ParcelBan", new [] { avatar }));
            }
            ParcelAccessEntry entry = new ParcelAccessEntry();

            entry.AgentID = avataruuid;
            entry.Flags   = AccessList.Ban;
            entry.Time    = new System.DateTime(3030, 03, 03);
            targetparcel.AccessBlackList.Add(entry);
            targetparcel.Update(bot.GetClient.Network.CurrentSim, false);
            return(BasicReply("ok", "ParcelBan", new [] { avatar }));
        }
Beispiel #11
0
 public void Store(ParcelAccessEntry entry)
 {
     m_StorageList.Store(entry);
     m_ParcelManager.CheckAccess(entry.Accessor, entry.ParcelID);
 }
Beispiel #12
0
        /// <summary>Process an incoming packet and raise the appropriate events</summary>
        /// <param name="sender">The sender</param>
        /// <param name="e">The EventArgs object containing the packet data</param>
        /// <remarks>Raises the <see cref="ParcelAccessListReply"/> event</remarks>
        protected void ParcelAccessListReplyHandler(object sender, PacketReceivedEventArgs e)
        {
            if (m_ParcelACL != null || Client.Settings.ALWAYS_REQUEST_PARCEL_ACL == true)
            {
                Packet packet = e.Packet;
                Simulator simulator = e.Simulator;

                ParcelAccessListReplyPacket reply = (ParcelAccessListReplyPacket)packet;

                List<ParcelAccessEntry> accessList = new List<ParcelAccessEntry>(reply.List.Length);
                   
                    for (int i = 0; i < reply.List.Length; i++)
                    {
                        ParcelAccessEntry pae = new ParcelAccessEntry();
                        pae.AgentID = reply.List[i].ID;
                        pae.Time = Utils.UnixTimeToDateTime((uint)reply.List[i].Time);
                        pae.Flags = (AccessList)reply.List[i].Flags;

                        accessList.Add(pae);
                    }

                    lock (simulator.Parcels.Dictionary)
                    {
                        if (simulator.Parcels.Dictionary.ContainsKey(reply.Data.LocalID))
                        {
                            Parcel parcel = simulator.Parcels.Dictionary[reply.Data.LocalID];
                            if ((AccessList)reply.Data.Flags == AccessList.Ban)
                                parcel.AccessBlackList = accessList;
                            else
                                parcel.AccessWhiteList = accessList;

                            simulator.Parcels.Dictionary[reply.Data.LocalID] = parcel;
                        }
                    }
                

                if (m_ParcelACL != null)
                {
                    OnParcelAccessListReply(new ParcelAccessListReplyEventArgs(simulator, reply.Data.SequenceID, reply.Data.LocalID, 
                        reply.Data.Flags, accessList));                    
                }
            }
        }
Beispiel #13
0
        protected void ParcelAccessListReplyHandler(Packet packet, Simulator simulator)
        {
            if (OnAccessListReply != null)
            {
                ParcelAccessListReplyPacket reply = (ParcelAccessListReplyPacket)packet;
                List<ParcelAccessEntry> accessList = new List<ParcelAccessEntry>(reply.List.Length);

                for (int i = 0; i < reply.List.Length; i++)
                {
                    ParcelAccessEntry pae = new ParcelAccessEntry();
                    pae.AgentID = reply.List[i].ID;
                    pae.Flags = (AccessList)reply.List[i].Flags;
                    pae.Time = Helpers.UnixTimeToDateTime((uint)reply.List[i].Time);

                    accessList.Add(pae);
                }

                try { OnAccessListReply(simulator, reply.Data.SequenceID, reply.Data.LocalID, reply.Data.Flags, 
                    accessList); }
                catch (Exception e) { Client.Log(e.ToString(), Helpers.LogLevel.Error); }
            }
        }
Beispiel #14
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="simulator"></param>
        protected void ParcelAccessListReplyHandler(Packet packet, Simulator simulator)
        {
            if (OnAccessListReply != null || Client.Settings.ALWAYS_REQUEST_PARCEL_ACL == true)
            {
                ParcelAccessListReplyPacket reply = (ParcelAccessListReplyPacket)packet;
                List<ParcelAccessEntry> accessList = new List<ParcelAccessEntry>(reply.List.Length);

                for (int i = 0; i < reply.List.Length; i++)
                {
                    ParcelAccessEntry pae = new ParcelAccessEntry();
                    pae.AgentID = reply.List[i].ID;
                    pae.Flags = (AccessList)reply.List[i].Flags;
                    pae.Time = Helpers.UnixTimeToDateTime((uint)reply.List[i].Time);

                    accessList.Add(pae);
                }

                lock (simulator.Parcels.Dictionary)
                {
                    if (simulator.Parcels.Dictionary.ContainsKey(reply.Data.LocalID))
                    {
                        Parcel parcel = simulator.Parcels.Dictionary[reply.Data.LocalID];
                        parcel.AccessList = accessList;
                        simulator.Parcels.Dictionary[reply.Data.LocalID] = parcel;
                    }
                }

                if (OnAccessListReply != null)
                {
                    try
                    {
                        OnAccessListReply(simulator, reply.Data.SequenceID, reply.Data.LocalID, reply.Data.Flags,
                      accessList);
                    }
                    catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); }
                }
            }
        }
Beispiel #15
0
        private bool RunSection(ISimulationDataParcelAccessListStorageInterface lut, string listInfo)
        {
            m_Log.InfoFormat("Testing {0}", listInfo);

            var regionId = new UUID("11223344-1122-1122-1122-112233445566");
            var parcelId = new UUID("11223344-1122-1122-1122-112233445577");
            var user     = new UGUI("11223344-1122-1122-1122-112233445588;http://example.com/;Example Com");
            ParcelAccessEntry        entry;
            ParcelAccessEntry        testentry;
            List <ParcelAccessEntry> res;

            m_Log.InfoFormat("{0}: A: Testing non-existence 1", listInfo);
            if (lut[regionId, parcelId, user])
            {
                return(false);
            }
            m_Log.InfoFormat("{0}: A: Testing non-existence 2", listInfo);
            if (lut.TryGetValue(regionId, parcelId, user, out entry))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: A: Testing non-existence 3", listInfo);
            if (lut[regionId, parcelId].Count != 0)
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: Storing unlimited entry", listInfo);
            testentry = new ParcelAccessEntry
            {
                RegionID = regionId,
                ParcelID = parcelId,
                Accessor = user
            };

            lut.Store(testentry);

            m_Log.InfoFormat("{0}: A: Testing existence 1", listInfo);
            if (!lut[regionId, parcelId, user])
            {
                return(false);
            }
            m_Log.InfoFormat("{0}: A: Testing existence 2", listInfo);
            if (!lut.TryGetValue(regionId, parcelId, user, out entry))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: A: Comparing entry", listInfo);
            if (!CompareEntry(entry, testentry))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: A: Testing existence 3", listInfo);
            res = lut[regionId, parcelId];
            if (res.Count != 1)
            {
                m_Log.InfoFormat("{0}: A: Expecting=1 Got={1}", listInfo, res.Count);
                return(false);
            }

            m_Log.InfoFormat("{0}: A: Comparing entry", listInfo);
            if (!CompareEntry(res[0], testentry))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: A: Remove entry", listInfo);
            if (!lut.Remove(regionId, parcelId, user))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: A: Check if entry is gone", listInfo);
            if (lut.Remove(regionId, parcelId, user))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: B: Testing non-existence 1", listInfo);
            if (lut[regionId, parcelId, user])
            {
                return(false);
            }
            m_Log.InfoFormat("{0}: B: Testing non-existence 2", listInfo);
            if (lut.TryGetValue(regionId, parcelId, user, out entry))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: B: Testing non-existence 3", listInfo);
            if (lut[regionId, parcelId].Count != 0)
            {
                return(false);
            }


            m_Log.InfoFormat("{0}: B: Storing limited entry", listInfo);
            testentry = new ParcelAccessEntry
            {
                RegionID  = regionId,
                ParcelID  = parcelId,
                Accessor  = user,
                ExpiresAt = Date.UnixTimeToDateTime(Date.Now.AsULong + 1000000)
            };

            lut.Store(testentry);

            m_Log.InfoFormat("{0}: B: Testing existence 1", listInfo);
            if (!lut[regionId, parcelId, user])
            {
                return(false);
            }
            m_Log.InfoFormat("{0}: B: Testing existence 2", listInfo);
            if (!lut.TryGetValue(regionId, parcelId, user, out entry))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: B: Comparing entry", listInfo);
            if (!CompareEntry(entry, testentry))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: B: Testing existence 3", listInfo);
            res = lut[regionId, parcelId];
            if (res.Count != 1)
            {
                m_Log.InfoFormat("{0}: B: Expecting=1 Got={1}", listInfo, res.Count);
                return(false);
            }

            m_Log.InfoFormat("{0}: B: Comparing entry", listInfo);
            if (!CompareEntry(res[0], testentry))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: B: Remove entry", listInfo);
            if (!lut.Remove(regionId, parcelId, user))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: B: Check if entry is gone", listInfo);
            if (lut.Remove(regionId, parcelId, user))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: C: Testing non-existence 1", listInfo);
            if (lut[regionId, parcelId, user])
            {
                return(false);
            }
            m_Log.InfoFormat("{0}: C: Testing non-existence 2", listInfo);
            if (lut.TryGetValue(regionId, parcelId, user, out entry))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: C: Testing non-existence 3", listInfo);
            if (lut[regionId, parcelId].Count != 0)
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: D: Storing limited entry into past 1", listInfo);
            testentry = new ParcelAccessEntry
            {
                RegionID  = regionId,
                ParcelID  = parcelId,
                Accessor  = user,
                ExpiresAt = Date.UnixTimeToDateTime(Date.Now.AsULong - 1000000)
            };

            lut.Store(testentry);

            m_Log.InfoFormat("{0}: D: Testing non-existence 1", listInfo);
            if (lut[regionId, parcelId, user])
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: E: Storing limited entry into past 2", listInfo);
            lut.Store(testentry);

            m_Log.InfoFormat("{0}: E: Testing non-existence 2", listInfo);
            if (lut.TryGetValue(regionId, parcelId, user, out entry))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: F: Storing limited entry into past 3", listInfo);
            lut.Store(testentry);

            m_Log.InfoFormat("{0}: F: Testing non-existence 3", listInfo);
            if (lut[regionId, parcelId].Count != 0)
            {
                return(false);
            }

            testentry.ExpiresAt = null;
            m_Log.InfoFormat("{0}: G: Storing entry 1", listInfo);
            lut.Store(testentry);
            m_Log.InfoFormat("{0}: G: Storing entry 2", listInfo);
            testentry.Accessor = new UGUI("22334455-1122-1122-1122-112233445566;http://example.com/;Com Example");
            lut.Store(testentry);

            m_Log.InfoFormat("{0}: G: Removing entry 2", listInfo);
            if (!lut.Remove(regionId, parcelId, testentry.Accessor))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: G: Check entry 1", listInfo);
            if (!lut[regionId, parcelId, user])
            {
                m_Log.InfoFormat("{0}: G: Entry 1 should not have been deleted when deleting entry 2", listInfo);
                return(false);
            }

            m_Log.InfoFormat("{0}: G: Removing entry 1", listInfo);
            if (!lut.Remove(regionId, parcelId, user))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: H: Trying to use extend for expiry", listInfo);
            lut.ExtendExpiry(regionId, parcelId, user, 3600);

            m_Log.InfoFormat("{0}: H: Checking existence", listInfo);
            if (!lut.TryGetValue(regionId, parcelId, user, out entry))
            {
                return(false);
            }

            ulong oldval = entry.ExpiresAt.AsULong;

            m_Log.InfoFormat("{0}: H: Trying to use another extend for expiry", listInfo);
            lut.ExtendExpiry(regionId, parcelId, user, 3600);

            m_Log.InfoFormat("{0}: H: Checking existence", listInfo);
            if (!lut.TryGetValue(regionId, parcelId, user, out entry))
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: H: Check extension", listInfo);
            if (oldval >= entry.ExpiresAt.AsULong)
            {
                return(false);
            }

            m_Log.InfoFormat("{0}: H: Removing entry 1", listInfo);
            if (!lut.Remove(regionId, parcelId, user))
            {
                return(false);
            }
            return(true);
        }
            private static void LoadParcelAccessListEntry(XmlTextReader reader, List <ParcelAccessEntry> whiteList, List <ParcelAccessEntry> blackList)
            {
                var            pae   = new ParcelAccessEntry();
                OarAccessFlags flags = 0;

                for (;;)
                {
                    if (!reader.Read())
                    {
                        throw new OARFormatException();
                    }

                    switch (reader.NodeType)
                    {
                    case XmlNodeType.Element:
                        switch (reader.Name)
                        {
                        case "AgentID":
                            pae.Accessor.ID = UUID.Parse(reader.ReadElementValueAsString());
                            break;

                        case "AgentData":
                            pae.Accessor.CreatorData = reader.ReadElementValueAsString();
                            break;

                        case "Expires":
                            pae.ExpiresAt = Date.UnixTimeToDateTime(reader.ReadElementValueAsULong());
                            break;

                        case "AccessList":
                            flags = (OarAccessFlags)reader.ReadElementValueAsUInt();
                            break;

                        default:
                            if (!reader.IsEmptyElement)
                            {
                                reader.Skip();
                            }
                            break;
                        }
                        break;

                    case XmlNodeType.EndElement:
                        if (reader.Name != "ParcelAccessEntry")
                        {
                            throw new OARFormatException();
                        }
                        if ((flags & OarAccessFlags.Access) != 0)
                        {
                            whiteList.Add(pae);
                        }
                        if ((flags & OarAccessFlags.Ban) != 0)
                        {
                            blackList.Add(pae);
                        }
                        return;

                    default:
                        break;
                    }
                }
            }
Beispiel #17
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="simulator"></param>
        protected void ParcelAccessListReplyHandler(Packet packet, Simulator simulator)
        {
            if (OnAccessListReply != null || AlwaysRequestParcelACL == true)
            {
                ParcelAccessListReplyPacket reply = (ParcelAccessListReplyPacket)packet;

                List<ParcelAccessEntry> accessList = new List<ParcelAccessEntry>(reply.List.Length);
                   
                    for (int i = 0; i < reply.List.Length; i++)
                    {
                        ParcelAccessEntry pae = new ParcelAccessEntry();
                        pae.AgentID = reply.List[i].ID;
                        pae.Time = Utils.UnixTimeToDateTime((uint)reply.List[i].Time);
                        pae.Flags = (AccessList)reply.List[i].Flags;

                        accessList.Add(pae);
                    }

                    lock (simulator.Parcels.Dictionary)
                    {
                        if (simulator.Parcels.Dictionary.ContainsKey(reply.Data.LocalID))
                        {
                            Parcel parcel = simulator.Parcels.Dictionary[reply.Data.LocalID];
                            if ((AccessList)reply.Data.Flags == AccessList.Ban)
                                parcel.AccessBlackList = accessList;
                            else
                                parcel.AccessWhiteList = accessList;

                            simulator.Parcels.Dictionary[reply.Data.LocalID] = parcel;
                        }
                    }
                

                if (OnAccessListReply != null)
                {
                    try
                    {
                        OnAccessListReply(simulator, reply.Data.SequenceID, reply.Data.LocalID, reply.Data.Flags,
                      accessList);
                    }
                    catch (Exception e) { Log.Log(e.Message, Helpers.LogLevel.Error, e); }
                }
            }
        }
        void IParcelAccessList.Store(ParcelAccessEntry entry)
        {
            string key = GenParcelAccessListKey(entry.RegionID, entry.ParcelID);

            m_Data[key][entry.Accessor] = new ParcelAccessEntry(entry);
        }