Replace ParcelAccessEntry with a new struct, LandAccessEntry, which more

accurately reflects the data sent by the viewer. Add times bans and the
expiration of timed bans.
Warning: Contains a Migration (and nuts)
iar_mods
Melanie 2012-02-02 23:40:56 +00:00
parent dbf6381e34
commit 447a66d660
16 changed files with 197 additions and 108 deletions

View File

@ -681,7 +681,7 @@ VALUES
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
conn.Open();
foreach (ParcelManager.ParcelAccessEntry parcelAccessEntry in parcel.LandData.ParcelAccessList)
foreach (LandAccessEntry parcelAccessEntry in parcel.LandData.ParcelAccessList)
{
cmd.Parameters.AddRange(CreateLandAccessParameters(parcelAccessEntry, parcel.RegionUUID));
@ -1453,7 +1453,7 @@ VALUES
_Log.ErrorFormat("[PARCEL]: unable to get parcel telehub settings for {1}", newData.Name);
}
newData.ParcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
newData.ParcelAccessList = new List<LandAccessEntry>();
return newData;
}
@ -1463,12 +1463,12 @@ VALUES
/// </summary>
/// <param name="row">datarecord with landaccess data</param>
/// <returns></returns>
private static ParcelManager.ParcelAccessEntry BuildLandAccessData(IDataRecord row)
private static LandAccessEntry BuildLandAccessData(IDataRecord row)
{
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
LandAccessEntry entry = new LandAccessEntry();
entry.AgentID = new UUID((Guid)row["AccessUUID"]);
entry.Flags = (AccessList)Convert.ToInt32(row["Flags"]);
entry.Time = new DateTime();
entry.Expires = 0;
return entry;
}
@ -1851,7 +1851,7 @@ VALUES
/// <param name="parcelAccessEntry">parcel access entry.</param>
/// <param name="parcelID">parcel ID.</param>
/// <returns></returns>
private SqlParameter[] CreateLandAccessParameters(ParcelManager.ParcelAccessEntry parcelAccessEntry, UUID parcelID)
private SqlParameter[] CreateLandAccessParameters(LandAccessEntry parcelAccessEntry, UUID parcelID)
{
List<SqlParameter> parameters = new List<SqlParameter>();

View File

@ -700,10 +700,10 @@ namespace OpenSim.Data.MySQL
cmd.Parameters.Clear();
cmd.CommandText = "insert into landaccesslist (LandUUID, " +
"AccessUUID, Flags) values (?LandUUID, ?AccessUUID, " +
"?Flags)";
"AccessUUID, Flags, Expires) values (?LandUUID, ?AccessUUID, " +
"?Flags, ?Expires)";
foreach (ParcelManager.ParcelAccessEntry entry in parcel.LandData.ParcelAccessList)
foreach (LandAccessEntry entry in parcel.LandData.ParcelAccessList)
{
FillLandAccessCommand(cmd, entry, parcel.LandData.GlobalID);
ExecuteNonQuery(cmd);
@ -1377,7 +1377,7 @@ namespace OpenSim.Data.MySQL
newData.ObscureMusic = Convert.ToBoolean(row["ObscureMusic"]);
newData.ObscureMedia = Convert.ToBoolean(row["ObscureMedia"]);
newData.ParcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
newData.ParcelAccessList = new List<LandAccessEntry>();
return newData;
}
@ -1387,12 +1387,12 @@ namespace OpenSim.Data.MySQL
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
private static ParcelManager.ParcelAccessEntry BuildLandAccessData(IDataReader row)
private static LandAccessEntry BuildLandAccessData(IDataReader row)
{
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
LandAccessEntry entry = new LandAccessEntry();
entry.AgentID = DBGuid.FromDB(row["AccessUUID"]);
entry.Flags = (AccessList) Convert.ToInt32(row["Flags"]);
entry.Time = new DateTime();
entry.Expires = Convert.ToInt32(row["Expires"]);
return entry;
}
@ -1697,11 +1697,12 @@ namespace OpenSim.Data.MySQL
/// <param name="row"></param>
/// <param name="entry"></param>
/// <param name="parcelID"></param>
private static void FillLandAccessCommand(MySqlCommand cmd, ParcelManager.ParcelAccessEntry entry, UUID parcelID)
private static void FillLandAccessCommand(MySqlCommand cmd, LandAccessEntry entry, UUID parcelID)
{
cmd.Parameters.AddWithValue("LandUUID", parcelID.ToString());
cmd.Parameters.AddWithValue("AccessUUID", entry.AgentID.ToString());
cmd.Parameters.AddWithValue("Flags", entry.Flags);
cmd.Parameters.AddWithValue("Expires", entry.Expires.ToString());
}
/// <summary>

View File

@ -863,3 +863,9 @@ BEGIN;
ALTER TABLE `regionsettings` ADD COLUMN `parcel_tile_ID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
COMMIT;
:VERSION 41 #---------------- Timed bans/access
BEGIN;
ALTER TABLE `landaccesslist` ADD COLUMN `Expires` INTEGER NOT NULL DEFAULT 0;
COMMIT;

View File

@ -759,7 +759,7 @@ namespace OpenSim.Data.SQLite
landaccesslist.Rows.Remove(rowsToDelete[iter]);
}
rowsToDelete.Clear();
foreach (ParcelManager.ParcelAccessEntry entry in parcel.LandData.ParcelAccessList)
foreach (LandAccessEntry entry in parcel.LandData.ParcelAccessList)
{
DataRow newAccessRow = landaccesslist.NewRow();
fillLandAccessRow(newAccessRow, entry, parcel.LandData.GlobalID);
@ -1456,7 +1456,7 @@ namespace OpenSim.Data.SQLite
newData.UserLocation = Vector3.Zero;
newData.UserLookAt = Vector3.Zero;
}
newData.ParcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
newData.ParcelAccessList = new List<LandAccessEntry>();
UUID authBuyerID = UUID.Zero;
UUID.TryParse((string)row["AuthbuyerID"], out authBuyerID);
@ -1519,12 +1519,12 @@ namespace OpenSim.Data.SQLite
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
private static ParcelManager.ParcelAccessEntry buildLandAccessData(DataRow row)
private static LandAccessEntry buildLandAccessData(DataRow row)
{
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
LandAccessEntry entry = new LandAccessEntry();
entry.AgentID = new UUID((string) row["AccessUUID"]);
entry.Flags = (AccessList) row["Flags"];
entry.Time = new DateTime();
entry.Expires = 0;
return entry;
}
@ -1787,7 +1787,7 @@ namespace OpenSim.Data.SQLite
/// <param name="row"></param>
/// <param name="entry"></param>
/// <param name="parcelID"></param>
private static void fillLandAccessRow(DataRow row, ParcelManager.ParcelAccessEntry entry, UUID parcelID)
private static void fillLandAccessRow(DataRow row, LandAccessEntry entry, UUID parcelID)
{
row["LandUUID"] = parcelID.ToString();
row["AccessUUID"] = entry.AgentID.ToString();

View File

@ -177,7 +177,7 @@ namespace OpenSim.Framework
public delegate void ParcelAccessListUpdateRequest(UUID agentID, uint flags,
int landLocalID, UUID transactionID, int sequenceID,
int sections, List<ParcelManager.ParcelAccessEntry> entries,
int sections, List<LandAccessEntry> entries,
IClientAPI remote_client);
public delegate void ParcelPropertiesRequest(
@ -1251,7 +1251,7 @@ namespace OpenSim.Framework
float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity,
uint regionFlags);
void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID);
void SendLandAccessListData(List<LandAccessEntry> accessList, uint accessFlag, int localLandID);
void SendForceClientSelectObjects(List<uint> objectIDs);
void SendCameraConstraint(Vector4 ConstraintPlane);
void SendLandObjectOwners(LandData land, List<UUID> groups, Dictionary<UUID, int> ownersAndCount);

View File

@ -73,9 +73,9 @@ namespace OpenSim.Framework
bool IsRestrictedFromLand(UUID avatar);
void SendLandUpdateToClient(IClientAPI remote_client);
void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client);
List<UUID> CreateAccessListArrayByFlag(AccessList flag);
List<LandAccessEntry> CreateAccessListArrayByFlag(AccessList flag);
void SendAccessList(UUID agentID, UUID sessionID, uint flags, int sequenceID, IClientAPI remote_client);
void UpdateAccessList(uint flags, UUID transactionID, int sequenceID, int sections, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client);
void UpdateAccessList(uint flags, UUID transactionID, int sequenceID, int sections, List<LandAccessEntry> entries, IClientAPI remote_client);
void UpdateLandBitmapByteArray();
void SetLandBitmapFromByteArray();
bool[,] GetLandBitmap();

View File

@ -34,6 +34,13 @@ using OpenMetaverse;
namespace OpenSim.Framework
{
public struct LandAccessEntry
{
public UUID AgentID;
public int Expires;
public AccessList Flags;
}
/// <summary>
/// Details of a Parcel of land
/// </summary>
@ -73,7 +80,7 @@ namespace OpenSim.Framework
private string _mediaURL = String.Empty;
private string _musicURL = String.Empty;
private UUID _ownerID = UUID.Zero;
private List<ParcelManager.ParcelAccessEntry> _parcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
private List<LandAccessEntry> _parcelAccessList = new List<LandAccessEntry>();
private float _passHours = 0;
private int _passPrice = 0;
private int _salePrice = 0; //Unemeplemented. Parcels price.
@ -450,7 +457,7 @@ namespace OpenSim.Framework
/// <summary>
/// List of access data for the parcel. User data, some bitflags, and a time
/// </summary>
public List<ParcelManager.ParcelAccessEntry> ParcelAccessList {
public List<LandAccessEntry> ParcelAccessList {
get {
return _parcelAccessList;
}
@ -638,12 +645,12 @@ namespace OpenSim.Framework
landData._simwidePrims = _simwidePrims;
landData._parcelAccessList.Clear();
foreach (ParcelManager.ParcelAccessEntry entry in _parcelAccessList)
foreach (LandAccessEntry entry in _parcelAccessList)
{
ParcelManager.ParcelAccessEntry newEntry = new ParcelManager.ParcelAccessEntry();
LandAccessEntry newEntry = new LandAccessEntry();
newEntry.AgentID = entry.AgentID;
newEntry.Flags = entry.Flags;
newEntry.Time = entry.Time;
newEntry.Expires = entry.Expires;
landData._parcelAccessList.Add(newEntry);
}
@ -668,4 +675,4 @@ namespace OpenSim.Framework
return land;
}
}
}
}

View File

@ -90,7 +90,7 @@ namespace OpenSim.Framework.Serialization.External
landData.MusicURL = xtr.ReadElementString("MusicURL");
landData.OwnerID = UUID.Parse( xtr.ReadElementString("OwnerID"));
landData.ParcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
landData.ParcelAccessList = new List<LandAccessEntry>();
xtr.Read();
if (xtr.Name != "ParcelAccessList")
throw new XmlException(String.Format("Expected \"ParcelAccessList\" element but got \"{0}\"", xtr.Name));
@ -99,11 +99,13 @@ namespace OpenSim.Framework.Serialization.External
{
while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement)
{
ParcelManager.ParcelAccessEntry pae = new ParcelManager.ParcelAccessEntry();
LandAccessEntry pae = new LandAccessEntry();
xtr.ReadStartElement("ParcelAccessEntry");
pae.AgentID = UUID.Parse( xtr.ReadElementString("AgentID"));
pae.Time = Convert.ToDateTime( xtr.ReadElementString("Time"));
// We really don't care about temp vs perm here and this
// would break on old oars. Assume all bans are perm
pae.Expires = 0; // Convert.ToUint( xtr.ReadElementString("Time"));
pae.Flags = (AccessList)Convert.ToUInt32( xtr.ReadElementString("AccessList"));
xtr.ReadEndElement();
@ -162,11 +164,11 @@ namespace OpenSim.Framework.Serialization.External
xtw.WriteElementString("OwnerID", landData.OwnerID.ToString());
xtw.WriteStartElement("ParcelAccessList");
foreach (ParcelManager.ParcelAccessEntry pal in landData.ParcelAccessList)
foreach (LandAccessEntry pal in landData.ParcelAccessList)
{
xtw.WriteStartElement("ParcelAccessEntry");
xtw.WriteElementString("AgentID", pal.AgentID.ToString());
xtw.WriteElementString("Time", pal.Time.ToString("s"));
xtw.WriteElementString("Time", pal.Expires.ToString());
xtw.WriteElementString("AccessList", Convert.ToString((uint)pal.Flags));
xtw.WriteEndElement();
}

View File

@ -42,7 +42,7 @@ namespace OpenSim.Framework.Serialization.Tests
private LandData landWithParcelAccessList;
private static string preSerialized = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<LandData>\n <Area>128</Area>\n <AuctionID>0</AuctionID>\n <AuthBuyerID>00000000-0000-0000-0000-000000000000</AuthBuyerID>\n <Category>10</Category>\n <ClaimDate>0</ClaimDate>\n <ClaimPrice>0</ClaimPrice>\n <GlobalID>54ff9641-dd40-4a2c-b1f1-47dd3af24e50</GlobalID>\n <GroupID>d740204e-bbbf-44aa-949d-02c7d739f6a5</GroupID>\n <IsGroupOwned>False</IsGroupOwned>\n <Bitmap>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</Bitmap>\n <Description>land data to test LandDataSerializer</Description>\n <Flags>536870944</Flags>\n <LandingType>2</LandingType>\n <Name>LandDataSerializerTest Land</Name>\n <Status>0</Status>\n <LocalID>0</LocalID>\n <MediaAutoScale>1</MediaAutoScale>\n <MediaID>d4452578-2f25-4b97-a81b-819af559cfd7</MediaID>\n <MediaURL>http://videos.opensimulator.org/bumblebee.mp4</MediaURL>\n <MusicURL />\n <OwnerID>1b8eedf9-6d15-448b-8015-24286f1756bf</OwnerID>\n <ParcelAccessList />\n <PassHours>0</PassHours>\n <PassPrice>0</PassPrice>\n <SalePrice>0</SalePrice>\n <SnapshotID>00000000-0000-0000-0000-000000000000</SnapshotID>\n <UserLocation>&lt;0, 0, 0&gt;</UserLocation>\n <UserLookAt>&lt;0, 0, 0&gt;</UserLookAt>\n <Dwell>0</Dwell>\n <OtherCleanTime>0</OtherCleanTime>\n</LandData>";
private static string preSerializedWithParcelAccessList = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<LandData>\n <Area>128</Area>\n <AuctionID>0</AuctionID>\n <AuthBuyerID>00000000-0000-0000-0000-000000000000</AuthBuyerID>\n <Category>10</Category>\n <ClaimDate>0</ClaimDate>\n <ClaimPrice>0</ClaimPrice>\n <GlobalID>54ff9641-dd40-4a2c-b1f1-47dd3af24e50</GlobalID>\n <GroupID>d740204e-bbbf-44aa-949d-02c7d739f6a5</GroupID>\n <IsGroupOwned>False</IsGroupOwned>\n <Bitmap>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</Bitmap>\n <Description>land data to test LandDataSerializer</Description>\n <Flags>536870944</Flags>\n <LandingType>2</LandingType>\n <Name>LandDataSerializerTest Land</Name>\n <Status>0</Status>\n <LocalID>0</LocalID>\n <MediaAutoScale>1</MediaAutoScale>\n <MediaID>d4452578-2f25-4b97-a81b-819af559cfd7</MediaID>\n <MediaURL>http://videos.opensimulator.org/bumblebee.mp4</MediaURL>\n <MusicURL />\n <OwnerID>1b8eedf9-6d15-448b-8015-24286f1756bf</OwnerID>\n <ParcelAccessList>\n <ParcelAccessEntry>\n <AgentID>62d65d45-c91a-4f77-862c-46557d978b6c</AgentID>\n <Time>2009-10-01T00:00:00</Time>\n <AccessList>2</AccessList>\n </ParcelAccessEntry>\n <ParcelAccessEntry>\n <AgentID>ec2a8d18-2378-4fe0-8b68-2a31b57c481e</AgentID>\n <Time>2010-10-20T00:00:00</Time>\n <AccessList>1</AccessList>\n </ParcelAccessEntry>\n </ParcelAccessList>\n <PassHours>0</PassHours>\n <PassPrice>0</PassPrice>\n <SalePrice>0</SalePrice>\n <SnapshotID>00000000-0000-0000-0000-000000000000</SnapshotID>\n <UserLocation>&lt;0, 0, 0&gt;</UserLocation>\n <UserLookAt>&lt;0, 0, 0&gt;</UserLookAt>\n <Dwell>0</Dwell>\n <OtherCleanTime>0</OtherCleanTime>\n</LandData>";
private static string preSerializedWithParcelAccessList = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<LandData>\n <Area>128</Area>\n <AuctionID>0</AuctionID>\n <AuthBuyerID>00000000-0000-0000-0000-000000000000</AuthBuyerID>\n <Category>10</Category>\n <ClaimDate>0</ClaimDate>\n <ClaimPrice>0</ClaimPrice>\n <GlobalID>54ff9641-dd40-4a2c-b1f1-47dd3af24e50</GlobalID>\n <GroupID>d740204e-bbbf-44aa-949d-02c7d739f6a5</GroupID>\n <IsGroupOwned>False</IsGroupOwned>\n <Bitmap>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</Bitmap>\n <Description>land data to test LandDataSerializer</Description>\n <Flags>536870944</Flags>\n <LandingType>2</LandingType>\n <Name>LandDataSerializerTest Land</Name>\n <Status>0</Status>\n <LocalID>0</LocalID>\n <MediaAutoScale>1</MediaAutoScale>\n <MediaID>d4452578-2f25-4b97-a81b-819af559cfd7</MediaID>\n <MediaURL>http://videos.opensimulator.org/bumblebee.mp4</MediaURL>\n <MusicURL />\n <OwnerID>1b8eedf9-6d15-448b-8015-24286f1756bf</OwnerID>\n <ParcelAccessList>\n <ParcelAccessEntry>\n <AgentID>62d65d45-c91a-4f77-862c-46557d978b6c</AgentID>\n <Time>0</Time>\n <AccessList>2</AccessList>\n </ParcelAccessEntry>\n <ParcelAccessEntry>\n <AgentID>ec2a8d18-2378-4fe0-8b68-2a31b57c481e</AgentID>\n <Time>0</Time>\n <AccessList>1</AccessList>\n </ParcelAccessEntry>\n </ParcelAccessList>\n <PassHours>0</PassHours>\n <PassPrice>0</PassPrice>\n <SalePrice>0</SalePrice>\n <SnapshotID>00000000-0000-0000-0000-000000000000</SnapshotID>\n <UserLocation>&lt;0, 0, 0&gt;</UserLocation>\n <UserLookAt>&lt;0, 0, 0&gt;</UserLookAt>\n <Dwell>0</Dwell>\n <OtherCleanTime>0</OtherCleanTime>\n</LandData>";
[SetUp]
public void setup()
@ -73,16 +73,16 @@ namespace OpenSim.Framework.Serialization.Tests
this.landWithParcelAccessList = this.land.Copy();
this.landWithParcelAccessList.ParcelAccessList.Clear();
ParcelManager.ParcelAccessEntry pae0 = new ParcelManager.ParcelAccessEntry();
LandAccessEntry pae0 = new LandAccessEntry();
pae0.AgentID = new UUID("62d65d45-c91a-4f77-862c-46557d978b6c");
pae0.Flags = AccessList.Ban;
pae0.Time = new DateTime(2009, 10, 01);
pae0.Expires = 0;
this.landWithParcelAccessList.ParcelAccessList.Add(pae0);
ParcelManager.ParcelAccessEntry pae1 = new ParcelManager.ParcelAccessEntry();
LandAccessEntry pae1 = new LandAccessEntry();
pae1.AgentID = new UUID("ec2a8d18-2378-4fe0-8b68-2a31b57c481e");
pae1.Flags = AccessList.Access;
pae1.Time = new DateTime(2010, 10, 20);
pae1.Expires = 0;
this.landWithParcelAccessList.ParcelAccessList.Add(pae1);
}
@ -128,4 +128,4 @@ namespace OpenSim.Framework.Serialization.Tests
"Reified LandData.Name != original LandData.Name (pre-serialized with parcel access list)");
}
}
}
}

View File

@ -4623,7 +4623,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
}
public void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID)
public void SendLandAccessListData(List<LandAccessEntry> accessList, uint accessFlag, int localLandID)
{
ParcelAccessListReplyPacket replyPacket = (ParcelAccessListReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelAccessListReply);
replyPacket.Data.AgentID = AgentId;
@ -4632,12 +4632,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
replyPacket.Data.SequenceID = 0;
List<ParcelAccessListReplyPacket.ListBlock> list = new List<ParcelAccessListReplyPacket.ListBlock>();
foreach (UUID avatar in avatars)
foreach (LandAccessEntry entry in accessList)
{
ParcelAccessListReplyPacket.ListBlock block = new ParcelAccessListReplyPacket.ListBlock();
block.Flags = accessFlag;
block.ID = avatar;
block.Time = 0;
block.ID = entry.AgentID;
block.Time = entry.Expires;
list.Add(block);
}
@ -8577,13 +8577,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
#endregion
List<ParcelManager.ParcelAccessEntry> entries = new List<ParcelManager.ParcelAccessEntry>();
List<LandAccessEntry> entries = new List<LandAccessEntry>();
foreach (ParcelAccessListUpdatePacket.ListBlock block in updatePacket.List)
{
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
LandAccessEntry entry = new LandAccessEntry();
entry.AgentID = block.ID;
entry.Flags = (AccessList)block.Flags;
entry.Time = Util.ToDateTime(block.Time);
entry.Expires = block.Time;
entries.Add(entry);
}

View File

@ -550,7 +550,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void ClientOnParcelAccessListUpdateRequest(UUID agentID,
uint flags, int landLocalID, UUID transactionID, int sequenceID,
int sections, List<ParcelManager.ParcelAccessEntry> entries,
int sections, List<LandAccessEntry> entries,
IClientAPI remote_client)
{
// Flags is the list to update, it can mean either the ban or
@ -1712,4 +1712,4 @@ namespace OpenSim.Region.CoreModules.World.Land
MainConsole.Instance.Output(report.ToString());
}
}
}
}

View File

@ -418,13 +418,21 @@ namespace OpenSim.Region.CoreModules.World.Land
public bool IsBannedFromLand(UUID avatar)
{
if (m_scene.Permissions.CanEditParcelProperties(avatar, this, 0))
ExpireAccessList();
if (m_scene.Permissions.IsAdministrator(avatar))
return false;
if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar))
return false;
if (avatar == LandData.OwnerID)
return false;
if ((LandData.Flags & (uint) ParcelFlags.UseBanList) > 0)
{
if (LandData.ParcelAccessList.FindIndex(
delegate(ParcelManager.ParcelAccessEntry e)
delegate(LandAccessEntry e)
{
if (e.AgentID == avatar && e.Flags == AccessList.Ban)
return true;
@ -439,13 +447,21 @@ namespace OpenSim.Region.CoreModules.World.Land
public bool IsRestrictedFromLand(UUID avatar)
{
if (m_scene.Permissions.CanEditParcelProperties(avatar, this, 0))
ExpireAccessList();
if (m_scene.Permissions.IsAdministrator(avatar))
return false;
if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar))
return false;
if (avatar == LandData.OwnerID)
return false;
if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) > 0)
{
if (LandData.ParcelAccessList.FindIndex(
delegate(ParcelManager.ParcelAccessEntry e)
delegate(LandAccessEntry e)
{
if (e.AgentID == avatar && e.Flags == AccessList.Access)
return true;
@ -511,19 +527,24 @@ namespace OpenSim.Region.CoreModules.World.Land
#region AccessList Functions
public List<UUID> CreateAccessListArrayByFlag(AccessList flag)
public List<LandAccessEntry> CreateAccessListArrayByFlag(AccessList flag)
{
List<UUID> list = new List<UUID>();
foreach (ParcelManager.ParcelAccessEntry entry in LandData.ParcelAccessList)
ExpireAccessList();
List<LandAccessEntry> list = new List<LandAccessEntry>();
foreach (LandAccessEntry entry in LandData.ParcelAccessList)
{
if (entry.Flags == flag)
{
list.Add(entry.AgentID);
}
list.Add(entry);
}
if (list.Count == 0)
{
list.Add(UUID.Zero);
LandAccessEntry e = new LandAccessEntry();
e.AgentID = UUID.Zero;
e.Flags = 0;
e.Expires = 0;
list.Add(e);
}
return list;
@ -535,20 +556,20 @@ namespace OpenSim.Region.CoreModules.World.Land
if (flags == (uint) AccessList.Access || flags == (uint) AccessList.Both)
{
List<UUID> avatars = CreateAccessListArrayByFlag(AccessList.Access);
remote_client.SendLandAccessListData(avatars,(uint) AccessList.Access,LandData.LocalID);
List<LandAccessEntry> accessEntries = CreateAccessListArrayByFlag(AccessList.Access);
remote_client.SendLandAccessListData(accessEntries,(uint) AccessList.Access,LandData.LocalID);
}
if (flags == (uint) AccessList.Ban || flags == (uint) AccessList.Both)
{
List<UUID> avatars = CreateAccessListArrayByFlag(AccessList.Ban);
remote_client.SendLandAccessListData(avatars, (uint)AccessList.Ban, LandData.LocalID);
List<LandAccessEntry> accessEntries = CreateAccessListArrayByFlag(AccessList.Ban);
remote_client.SendLandAccessListData(accessEntries, (uint)AccessList.Ban, LandData.LocalID);
}
}
public void UpdateAccessList(uint flags, UUID transactionID,
int sequenceID, int sections,
List<ParcelManager.ParcelAccessEntry> entries,
List<LandAccessEntry> entries,
IClientAPI remote_client)
{
LandData newData = LandData.Copy();
@ -558,16 +579,16 @@ namespace OpenSim.Region.CoreModules.World.Land
{
m_listTransactions[flags] = transactionID;
List<ParcelManager.ParcelAccessEntry> toRemove =
new List<ParcelManager.ParcelAccessEntry>();
List<LandAccessEntry> toRemove =
new List<LandAccessEntry>();
foreach (ParcelManager.ParcelAccessEntry entry in newData.ParcelAccessList)
foreach (LandAccessEntry entry in newData.ParcelAccessList)
{
if (entry.Flags == (AccessList)flags)
toRemove.Add(entry);
}
foreach (ParcelManager.ParcelAccessEntry entry in toRemove)
foreach (LandAccessEntry entry in toRemove)
{
newData.ParcelAccessList.Remove(entry);
}
@ -582,13 +603,13 @@ namespace OpenSim.Region.CoreModules.World.Land
}
}
foreach (ParcelManager.ParcelAccessEntry entry in entries)
foreach (LandAccessEntry entry in entries)
{
ParcelManager.ParcelAccessEntry temp =
new ParcelManager.ParcelAccessEntry();
LandAccessEntry temp =
new LandAccessEntry();
temp.AgentID = entry.AgentID;
temp.Time = entry.Time;
temp.Expires = entry.Expires;
temp.Flags = (AccessList)flags;
newData.ParcelAccessList.Add(temp);
@ -1105,5 +1126,20 @@ namespace OpenSim.Region.CoreModules.World.Land
}
#endregion
private void ExpireAccessList()
{
List<LandAccessEntry> delete = new List<LandAccessEntry>();
foreach (LandAccessEntry entry in LandData.ParcelAccessList)
{
if (entry.Expires != 0 && entry.Expires < Util.UnixTimeSinceEpoch())
delete.Add(entry);
}
foreach (LandAccessEntry entry in delete)
LandData.ParcelAccessList.Remove(entry);
m_scene.EventManager.TriggerLandObjectUpdated((uint)LandData.LocalID, this);
}
}
}

View File

@ -1253,7 +1253,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
}
public void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID)
public void SendLandAccessListData(List<LandAccessEntry> accessList, uint accessFlag, int localLandID)
{
}

View File

@ -940,7 +940,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, ILandObject lo, float simObjectBonusFactor,int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
{
}
public void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID)
public void SendLandAccessListData(List<LandAccessEntry> accessList, uint accessFlag, int localLandID)
{
}
public void SendForceClientSelectObjects(List<uint> objectIDs)

View File

@ -5714,16 +5714,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llEjectFromLand(string pest)
{
m_host.AddScriptLPS(1);
UUID agentId = new UUID();
if (UUID.TryParse(pest, out agentId))
UUID agentID = new UUID();
if (UUID.TryParse(pest, out agentID))
{
ScenePresence presence = World.GetScenePresence(agentId);
ScenePresence presence = World.GetScenePresence(agentID);
if (presence != null)
{
// agent must be over the owners land
if (m_host.OwnerID == World.LandChannel.GetLandObject(
presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID)
World.TeleportClientHome(agentId, presence.ControllingClient);
ILandObject land = World.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y);
if (land == null)
return;
if (m_host.OwnerID == land.LandData.OwnerID)
{
World.TeleportClientHome(agentID, presence.ControllingClient);
}
}
}
ScriptSleep(5000);
@ -6408,24 +6413,37 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1);
UUID key;
ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageAllowed))
if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned))
{
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
int expires = 0;
if (hours != 0)
expires = Util.UnixTimeSinceEpoch() + (int)(3600.0 * hours);
if (UUID.TryParse(avatar, out key))
{
if (land.LandData.ParcelAccessList.FindIndex(
delegate(ParcelManager.ParcelAccessEntry e)
int idx = land.LandData.ParcelAccessList.FindIndex(
delegate(LandAccessEntry e)
{
if (e.AgentID == key && e.Flags == AccessList.Access)
return true;
return false;
}) == -1)
{
entry.AgentID = key;
entry.Flags = AccessList.Access;
entry.Time = DateTime.Now.AddHours(hours);
land.LandData.ParcelAccessList.Add(entry);
}
});
if (idx != -1 && (land.LandData.ParcelAccessList[idx].Expires == 0 || (expires != 0 && expires < land.LandData.ParcelAccessList[idx].Expires)))
return;
if (idx != -1)
land.LandData.ParcelAccessList.RemoveAt(idx);
LandAccessEntry entry = new LandAccessEntry();
entry.AgentID = key;
entry.Flags = AccessList.Access;
entry.Expires = expires;
land.LandData.ParcelAccessList.Add(entry);
World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land);
}
}
ScriptSleep(100);
@ -9679,22 +9697,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned))
{
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
int expires = 0;
if (hours != 0)
expires = Util.UnixTimeSinceEpoch() + (int)(3600.0 * hours);
if (UUID.TryParse(avatar, out key))
{
if (land.LandData.ParcelAccessList.FindIndex(
delegate(ParcelManager.ParcelAccessEntry e)
int idx = land.LandData.ParcelAccessList.FindIndex(
delegate(LandAccessEntry e)
{
if (e.AgentID == key && e.Flags == AccessList.Ban)
return true;
return false;
}) == -1)
{
entry.AgentID = key;
entry.Flags = AccessList.Ban;
entry.Time = DateTime.Now.AddHours(hours);
land.LandData.ParcelAccessList.Add(entry);
}
});
if (idx != -1 && (land.LandData.ParcelAccessList[idx].Expires == 0 || (expires != 0 && expires < land.LandData.ParcelAccessList[idx].Expires)))
return;
if (idx != -1)
land.LandData.ParcelAccessList.RemoveAt(idx);
LandAccessEntry entry = new LandAccessEntry();
entry.AgentID = key;
entry.Flags = AccessList.Ban;
entry.Expires = expires;
land.LandData.ParcelAccessList.Add(entry);
World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land);
}
}
ScriptSleep(100);
@ -9710,7 +9741,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (UUID.TryParse(avatar, out key))
{
int idx = land.LandData.ParcelAccessList.FindIndex(
delegate(ParcelManager.ParcelAccessEntry e)
delegate(LandAccessEntry e)
{
if (e.AgentID == key && e.Flags == AccessList.Access)
return true;
@ -9718,7 +9749,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
});
if (idx != -1)
{
land.LandData.ParcelAccessList.RemoveAt(idx);
World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land);
}
}
}
ScriptSleep(100);
@ -9734,7 +9768,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (UUID.TryParse(avatar, out key))
{
int idx = land.LandData.ParcelAccessList.FindIndex(
delegate(ParcelManager.ParcelAccessEntry e)
delegate(LandAccessEntry e)
{
if (e.AgentID == key && e.Flags == AccessList.Ban)
return true;
@ -9742,7 +9776,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
});
if (idx != -1)
{
land.LandData.ParcelAccessList.RemoveAt(idx);
World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land);
}
}
}
ScriptSleep(100);
@ -9997,7 +10034,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData;
if (land.OwnerID == m_host.OwnerID)
{
foreach (ParcelManager.ParcelAccessEntry entry in land.ParcelAccessList)
foreach (LandAccessEntry entry in land.ParcelAccessList)
{
if (entry.Flags == AccessList.Ban)
{
@ -10014,7 +10051,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData;
if (land.OwnerID == m_host.OwnerID)
{
foreach (ParcelManager.ParcelAccessEntry entry in land.ParcelAccessList)
foreach (LandAccessEntry entry in land.ParcelAccessList)
{
if (entry.Flags == AccessList.Access)
{

View File

@ -980,7 +980,7 @@ namespace OpenSim.Tests.Common.Mock
{
}
public void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID)
public void SendLandAccessListData(List<LandAccessEntry> accessList, uint accessFlag, int localLandID)
{
}