public ParcelAccessEntry(ParcelAccessEntry src) { RegionID = src.RegionID; ParcelID = src.ParcelID; Accessor = new UGUI(src.Accessor); ExpiresAt = src.ExpiresAt != null ? new Date(src.ExpiresAt) : null; }
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 })); }
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); }
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); }
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); }
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); }
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); } }
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); } } }
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 })); }
public void Store(ParcelAccessEntry entry) { m_StorageList.Store(entry); m_ParcelManager.CheckAccess(entry.Accessor, entry.ParcelID); }
/// <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)); } } }
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); } } }
/// <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); } } } }
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; } } }
/// <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); }