* Adds Region ban capability to Regions. You access this by going to World->Region/Estate. Then on the Estate tab, at the lower right hand corner, clicking the 'Add' button and picking an avatar.

* It only persists across reboots for the mySQL datastore currently.
* Currently have stubs in the other datastores.
This commit is contained in:
Teravus Ovares
2008-06-21 03:29:08 +00:00
parent 17fd6cf661
commit a5860ad438
18 changed files with 557 additions and 17 deletions

View File

@@ -515,6 +515,7 @@ namespace OpenSim
//moved these here as the terrain texture has to be created after the modules are initialized
// and has to happen before the region is registered with the grid.
scene.CreateTerrainTexture(false);
scene.LoadRegionBanlist();
try
{

View File

@@ -2570,6 +2570,51 @@ namespace OpenSim.Region.ClientStack.LindenUDP
this.OutPacket(packet, ThrottleOutPacketType.Task);
}
public void sendBannedUserList(LLUUID invoice, List<RegionBanListItem> banlist, uint estateID)
{
RegionBanListItem[] bl = banlist.ToArray();
LLUUID[] BannedUsers = new LLUUID[bl.Length];
for (int i = 0; i < bl.Length; i++)
{
if (bl[i] == null)
continue;
BannedUsers[i] = bl[i].bannedUUID;
}
EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
packet.AgentData.TransactionID = LLUUID.Random();
packet.AgentData.AgentID = this.AgentId;
packet.AgentData.SessionID = this.SessionId;
packet.MethodData.Invoice = invoice;
packet.MethodData.Method = Helpers.StringToField("setaccess");
EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[6 + BannedUsers.Length];
for (int i = 0; i < (6 + BannedUsers.Length); i++)
{
returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
}
int j = 0;
returnblock[j].Parameter = Helpers.StringToField(estateID.ToString()); j++;
returnblock[j].Parameter = Helpers.StringToField(((int)Constants.EstateAccessCodex.EstateBans).ToString()); j++;
returnblock[j].Parameter = Helpers.StringToField("0"); j++;
returnblock[j].Parameter = Helpers.StringToField("0"); j++;
returnblock[j].Parameter = Helpers.StringToField(BannedUsers.Length.ToString()); j++;
returnblock[j].Parameter = Helpers.StringToField("0"); j++;
for (int i = 0; i < BannedUsers.Length; i++)
{
returnblock[j].Parameter = BannedUsers[i].GetBytes(); j++;
}
packet.ParamList = returnblock;
packet.Header.Reliable = false;
this.OutPacket(packet, ThrottleOutPacketType.Task);
}
public void sendRegionInfoToEstateMenu(RegionInfoForEstateMenuArgs args)
{
RegionInfoPacket rinfopack = new RegionInfoPacket();

View File

@@ -55,10 +55,14 @@ namespace OpenSim.Region.Communications.OGS1
private List<SimpleRegionInfo> m_knownRegions = new List<SimpleRegionInfo>();
private Dictionary<ulong, int> m_deadRegionCache = new Dictionary<ulong, int>();
private Dictionary<string, string> m_queuedGridSettings = new Dictionary<string, string>();
private List<RegionInfo> m_regionsOnInstance = new List<RegionInfo>();
public BaseHttpServer httpListener;
public NetworkServersInfo serversInfo;
public BaseHttpServer httpServer;
public string _gdebugRegionName = String.Empty;
public string gdebugRegionName
@@ -95,6 +99,8 @@ namespace OpenSim.Region.Communications.OGS1
// see IGridServices
public RegionCommsListener RegisterRegion(RegionInfo regionInfo)
{
m_regionsOnInstance.Add(regionInfo);
m_log.InfoFormat(
"[OGS1 GRID SERVICES]: Attempting to register region {0} with grid at {1}",
regionInfo.RegionName, serversInfo.GridURL);
@@ -606,12 +612,47 @@ namespace OpenSim.Region.Communications.OGS1
ulong regionHandle = Convert.ToUInt64((string) requestData["regionhandle"]);
m_log.Debug("[CONNECTION DEBUGGING]: Triggering welcome for " + agentData.AgentID.ToString() + " into " + regionHandle.ToString());
m_localBackend.TriggerExpectUser(regionHandle, agentData);
m_log.Info("[OGS1 GRID SERVICES]: Welcoming new user...");
RegionInfo[] regions = m_regionsOnInstance.ToArray();
bool banned = false;
return new XmlRpcResponse();
for (int i = 0; i < regions.Length; i++)
{
if (regions[i] != null)
{
if (regions[i].RegionHandle == regionHandle)
{
if (regions[i].CheckIfUserBanned(agentData.AgentID))
{
banned = true;
break;
}
}
}
}
XmlRpcResponse resp = new XmlRpcResponse();
if (banned)
{
m_log.InfoFormat("[OGS1 GRID SERVICES]: Denying access for user {0} {1} because user is banned",agentData.firstname,agentData.lastname);
Hashtable respdata = new Hashtable();
respdata["success"] = "FALSE";
respdata["reason"] = "banned";
resp.Value = respdata;
}
else
{
m_log.Debug("[CONNECTION DEBUGGING]: Triggering welcome for " + agentData.AgentID.ToString() + " into " + regionHandle.ToString());
m_localBackend.TriggerExpectUser(regionHandle, agentData);
m_log.Info("[OGS1 GRID SERVICES]: Welcoming new user...");
Hashtable respdata = new Hashtable();
respdata["success"] = "TRUE";
resp.Value = respdata;
}
return resp;
}
// Grid Request Processing
/// <summary>
@@ -1107,6 +1148,27 @@ namespace OpenSim.Region.Communications.OGS1
/// <returns></returns>
public bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying)
{
RegionInfo[] regions = m_regionsOnInstance.ToArray();
bool banned = false;
for (int i = 0; i < regions.Length; i++)
{
if (regions[i] != null)
{
if (regions[i].RegionHandle == regionHandle)
{
if (regions[i].CheckIfUserBanned(agentID))
{
banned = true;
break;
}
}
}
}
if (banned)
return false;
RegionInfo regInfo = null;
try
{

View File

@@ -72,6 +72,12 @@ namespace OpenSim.Region.Environment.Interfaces
void RemoveLandObject(LLUUID globalID);
List<LandData> LoadLandObjects(LLUUID regionUUID);
List<RegionBanListItem> LoadRegionBanList(LLUUID regionUUID);
void AddToRegionBanlist(RegionBanListItem item);
void RemoveFromRegionBanlist(RegionBanListItem item);
void Shutdown();
}
}

View File

@@ -51,6 +51,7 @@ namespace OpenSim.Region.Environment.Modules.World.Estate
{
remote_client.sendDetailedEstateData(invoice,m_scene.RegionInfo.EstateSettings.estateName,m_scene.RegionInfo.EstateSettings.estateID);
remote_client.sendEstateManagersList(invoice,m_scene.RegionInfo.EstateSettings.estateManagers,m_scene.RegionInfo.EstateSettings.estateID);
remote_client.sendBannedUserList(invoice, m_scene.RegionInfo.regionBanlist, m_scene.RegionInfo.EstateSettings.estateID);
}
private void estateSetRegionInfoHandler(bool blockTerraform, bool noFly, bool allowDamage, bool blockLandResell, int maxAgents, float objectBonusFactor,
@@ -206,6 +207,89 @@ namespace OpenSim.Region.Environment.Modules.World.Estate
switch (estateAccessType)
{
case 64:
if (m_scene.ExternalChecks.ExternalChecksCanIssueEstateCommand(remote_client.AgentId) || m_scene.ExternalChecks.ExternalChecksBypassPermissions())
{
RegionBanListItem[] banlistcheck = m_scene.RegionInfo.regionBanlist.ToArray();
bool alreadyInList = false;
for (int i = 0; i < banlistcheck.Length; i++)
{
if (user == banlistcheck[i].bannedUUID)
{
alreadyInList = true;
break;
}
}
if (!alreadyInList)
{
RegionBanListItem item = new RegionBanListItem();
item.bannedUUID = user;
item.regionUUID = m_scene.RegionInfo.RegionID;
item.bannedIP = "0.0.0.0";
item.bannedIPHostMask = "0.0.0.0";
m_scene.RegionInfo.regionBanlist.Add(item);
m_scene.AddToRegionBanlist(item);
ScenePresence s = m_scene.GetScenePresence(user);
if (s != null)
{
m_scene.TeleportClientHome(user, s.ControllingClient);
}
}
else
{
remote_client.SendAlertMessage("User is already on the region ban list");
}
//m_scene.RegionInfo.regionBanlist.Add(Manager(user);
remote_client.sendBannedUserList(invoice, m_scene.RegionInfo.regionBanlist, m_scene.RegionInfo.EstateSettings.estateID);
}
else
{
remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
}
break;
case 128:
if (m_scene.ExternalChecks.ExternalChecksCanIssueEstateCommand(remote_client.AgentId) || m_scene.ExternalChecks.ExternalChecksBypassPermissions())
{
RegionBanListItem[] banlistcheck = m_scene.RegionInfo.regionBanlist.ToArray();
bool alreadyInList = false;
RegionBanListItem listitem = null;
for (int i = 0; i < banlistcheck.Length; i++)
{
if (user == banlistcheck[i].bannedUUID)
{
alreadyInList = true;
listitem = banlistcheck[i];
break;
}
}
if (alreadyInList && listitem != null)
{
m_scene.RegionInfo.regionBanlist.Remove(listitem);
m_scene.RemoveFromRegionBanlist(listitem);
}
else
{
remote_client.SendAlertMessage("User is not on the region ban list");
}
//m_scene.RegionInfo.regionBanlist.Add(Manager(user);
remote_client.sendBannedUserList(invoice, m_scene.RegionInfo.regionBanlist, m_scene.RegionInfo.EstateSettings.estateID);
}
else
{
remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
}
break;
case 256:
// This needs to be updated for SuperEstateOwnerUser.. a non existing user in the estatesettings.xml
@@ -237,7 +321,7 @@ namespace OpenSim.Region.Environment.Modules.World.Estate
default:
m_log.Error("EstateOwnerMessage: Unknown EstateAccessType requested in estateAccessDelta");
m_log.ErrorFormat("EstateOwnerMessage: Unknown EstateAccessType requested in estateAccessDelta: {0}", estateAccessType.ToString());
break;
}
}

View File

@@ -743,6 +743,11 @@ namespace OpenSim.Region.Environment.Modules.World.NPC
public void sendEstateManagersList(LLUUID invoice, LLUUID[] EstateManagers, uint estateID)
{
}
public void sendBannedUserList(LLUUID invoice, List<RegionBanListItem> banlist, uint estateID)
{
}
public void sendRegionInfoToEstateMenu(RegionInfoForEstateMenuArgs args)
{
}

View File

@@ -1437,6 +1437,20 @@ namespace OpenSim.Region.Environment.Scenes
}
}
public void LoadRegionBanlist()
{
List<RegionBanListItem> regionbanlist = m_storageManager.DataStore.LoadRegionBanList(m_regInfo.RegionID);
m_regInfo.regionBanlist = regionbanlist;
}
public void AddToRegionBanlist(RegionBanListItem item)
{
m_storageManager.DataStore.AddToRegionBanlist(item);
}
public void RemoveFromRegionBanlist(RegionBanListItem item)
{
m_storageManager.DataStore.RemoveFromRegionBanlist(item);
}
#endregion
#region Primitives Methods
@@ -1854,6 +1868,18 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectPart RootPrim = GetSceneObjectPart(primID);
if (RootPrim != null)
{
if (m_regInfo.CheckIfUserBanned(RootPrim.OwnerID))
{
SceneObjectGroup grp = RootPrim.ParentGroup;
if (grp != null)
{
DeleteSceneObject(grp);
}
m_log.Info("[INTERREGION]: Denied prim crossing for banned avatar");
return false;
}
if (RootPrim.Shape.PCode == (byte)PCode.Prim)
{
SceneObjectGroup grp = RootPrim.ParentGroup;
@@ -2333,6 +2359,13 @@ namespace OpenSim.Region.Environment.Scenes
{
if (regionHandle == m_regInfo.RegionHandle)
{
if (m_regInfo.CheckIfUserBanned(agent.AgentID))
{
m_log.WarnFormat(
"[CONNECTION DEBUGGING]: Denied access to: {0} [{1}] at {2} because the user is on the region banlist",
agent.AgentID, regionHandle, RegionInfo.RegionName);
}
capsPaths[agent.AgentID] = agent.CapsPath;
if (!agent.child)
@@ -3599,5 +3632,9 @@ namespace OpenSim.Region.Environment.Scenes
}
#endregion
}
}

View File

@@ -736,6 +736,11 @@ namespace OpenSim.Region.Examples.SimpleModule
public void sendEstateManagersList(LLUUID invoice, LLUUID[] EstateManagers, uint estateID)
{
}
public void sendBannedUserList(LLUUID invoice, List<RegionBanListItem> banlist, uint estateID)
{
}
public void sendRegionInfoToEstateMenu(RegionInfoForEstateMenuArgs args)
{
}

View File

@@ -313,6 +313,23 @@ namespace OpenSim.DataStore.MSSQL
return new List<LandData>();
}
public List<RegionBanListItem> LoadRegionBanList(LLUUID regionUUID)
{
List<RegionBanListItem> regionbanlist = new List<RegionBanListItem>();
return regionbanlist;
}
public void AddToRegionBanlist(RegionBanListItem item)
{
}
public void RemoveFromRegionBanlist(RegionBanListItem item)
{
}
public void Commit()
{
lock (ds)