From 32785921d0a4a074b92da0f4ec322cf451a4642f Mon Sep 17 00:00:00 2001 From: mingchen Date: Tue, 13 May 2008 16:22:57 +0000 Subject: *Complete redo of the permissions module *Removed hardcoded permissions checks *Added permissions checks where needed --- .../Environment/Modules/World/Land/LandChannel.cs | 17 ++++- .../Modules/World/Land/LandManagementModule.cs | 4 +- .../Environment/Modules/World/Land/LandObject.cs | 82 +++++++++++++--------- 3 files changed, 65 insertions(+), 38 deletions(-) (limited to 'OpenSim/Region/Environment/Modules/World/Land') diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs b/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs index 2a28283..b5d5e6e 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs @@ -400,7 +400,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land //If we are still here, then they are subdividing within one piece of land //Check owner - if (startLandObject.landData.ownerID != attempting_user_id) + if (!m_scene.ExternalChecks.ExternalChecksCanEditParcel(attempting_user_id,startLandObject)) { return; } @@ -469,7 +469,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land { return; } - if (masterLandObject.landData.ownerID != attempting_user_id) + if (!m_scene.ExternalChecks.ExternalChecksCanEditParcel(attempting_user_id, masterLandObject)) { return; } @@ -655,6 +655,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land public void handleParcelSelectObjectsRequest(int local_id, int request_type, IClientAPI remote_client) { + landList[local_id].sendForceObjectSelect(local_id, request_type, remote_client); } @@ -663,6 +664,18 @@ namespace OpenSim.Region.Environment.Modules.World.Land landList[local_id].sendLandObjectOwners(remote_client); } + public void handleParcelAbandonRequest(int local_id, IClientAPI remote_client) + { + if (landList.ContainsKey(local_id)) + { + if (m_scene.ExternalChecks.ExternalChecksCanAbandonParcel(remote_client.AgentId, landList[local_id])) + { + landList[local_id].landData.ownerID = m_scene.RegionInfo.MasterAvatarAssignedUUID; + m_scene.Broadcast(SendParcelOverlay); + } + } + + } #endregion #region ILandChannel Members diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs index a339ebf..2719a20 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs @@ -52,7 +52,6 @@ namespace OpenSim.Region.Environment.Modules.World.Land m_scene.EventManager.OnLandBuy += landChannel.handleLandBuyRequest; m_scene.EventManager.OnNewClient += new EventManager.OnNewClientDelegate(EventManager_OnNewClient); m_scene.EventManager.OnSignificantClientMovement += landChannel.handleSignificantClientMovement; - lock (m_scene) { m_scene.LandChannel = (ILandChannel) landChannel; @@ -70,8 +69,11 @@ namespace OpenSim.Region.Environment.Modules.World.Land client.OnParcelObjectOwnerRequest += new ParcelObjectOwnerRequest(landChannel.handleParcelObjectOwnersRequest); client.OnParcelAccessListRequest += new ParcelAccessListRequest(landChannel.handleParcelAccessRequest); client.OnParcelAccessListUpdateRequest += new ParcelAccessListUpdateRequest(landChannel.handleParcelAccessUpdateRequest); + client.OnParcelAbandonRequest += new ParcelAbandonRequest(landChannel.handleParcelAbandonRequest); } + + public void PostInitialise() { } diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs b/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs index 2d3359c..0236e5f 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs @@ -127,12 +127,19 @@ namespace OpenSim.Region.Environment.Modules.World.Land public void updateLandProperties(LandUpdateArgs args, IClientAPI remote_client) { - if (remote_client.AgentId == landData.ownerID) + if (m_scene.ExternalChecks.ExternalChecksCanEditParcel(remote_client.AgentId,this)) { //Needs later group support LandData newData = landData.Copy(); - newData.authBuyerID = args.AuthBuyerID; + if (args.AuthBuyerID != newData.authBuyerID || args.SalePrice != newData.salePrice) + { + if (m_scene.ExternalChecks.ExternalChecksCanSellParcel(remote_client.AgentId, this)) + { + newData.authBuyerID = args.AuthBuyerID; + newData.salePrice = args.SalePrice; + } + } newData.category = args.Category; newData.landDesc = args.Desc; newData.groupID = args.GroupID; @@ -145,7 +152,6 @@ namespace OpenSim.Region.Environment.Modules.World.Land newData.landFlags = args.ParcelFlags; newData.passHours = args.PassHours; newData.passPrice = args.PassPrice; - newData.salePrice = args.SalePrice; newData.snapshotID = args.SnapshotID; newData.userLocation = args.UserLocation; newData.userLookAt = args.UserLookAt; @@ -587,27 +593,30 @@ namespace OpenSim.Region.Environment.Modules.World.Land public void sendForceObjectSelect(int local_id, int request_type, IClientAPI remote_client) { - List resultLocalIDs = new List(); - foreach (SceneObjectGroup obj in primsOverMe) + if (m_scene.ExternalChecks.ExternalChecksCanEditParcel(remote_client.AgentId, this)) { - if (obj.LocalId > 0) + List resultLocalIDs = new List(); + foreach (SceneObjectGroup obj in primsOverMe) { - if (request_type == LandChannel.LAND_SELECT_OBJECTS_OWNER && obj.OwnerID == landData.ownerID) + if (obj.LocalId > 0) { - resultLocalIDs.Add(obj.LocalId); - } + if (request_type == LandChannel.LAND_SELECT_OBJECTS_OWNER && obj.OwnerID == landData.ownerID) + { + resultLocalIDs.Add(obj.LocalId); + } // else if (request_type == LandManager.LAND_SELECT_OBJECTS_GROUP && ...) // TODO: group support // { // } - else if (request_type == LandChannel.LAND_SELECT_OBJECTS_OTHER && - obj.OwnerID != remote_client.AgentId) - { - resultLocalIDs.Add(obj.LocalId); + else if (request_type == LandChannel.LAND_SELECT_OBJECTS_OTHER && + obj.OwnerID != remote_client.AgentId) + { + resultLocalIDs.Add(obj.LocalId); + } } } - } - remote_client.sendForceClientSelectObjects(resultLocalIDs); + remote_client.sendForceClientSelectObjects(resultLocalIDs); + } } /// @@ -620,32 +629,35 @@ namespace OpenSim.Region.Environment.Modules.World.Land /// public void sendLandObjectOwners(IClientAPI remote_client) { - Dictionary primCount = new Dictionary(); - - foreach (SceneObjectGroup obj in primsOverMe) + if (m_scene.ExternalChecks.ExternalChecksCanEditParcel(remote_client.AgentId, this)) { - try + Dictionary primCount = new Dictionary(); + + foreach (SceneObjectGroup obj in primsOverMe) { - if (!primCount.ContainsKey(obj.OwnerID)) + try { - primCount.Add(obj.OwnerID, 0); + if (!primCount.ContainsKey(obj.OwnerID)) + { + primCount.Add(obj.OwnerID, 0); + } + } + catch (NullReferenceException) + { + m_log.Info("[LAND]: " + "Got Null Reference when searching land owners from the parcel panel"); + } + try + { + primCount[obj.OwnerID] += obj.PrimCount; + } + catch (KeyNotFoundException) + { + m_log.Error("[LAND]: Unable to match a prim with it's owner."); } } - catch (NullReferenceException) - { - m_log.Info("[LAND]: " + "Got Null Reference when searching land owners from the parcel panel"); - } - try - { - primCount[obj.OwnerID] += obj.PrimCount; - } - catch (KeyNotFoundException) - { - m_log.Error("[LAND]: Unable to match a prim with it's owner."); - } - } - remote_client.sendLandObjectOwners(primCount); + remote_client.sendLandObjectOwners(primCount); + } } public Dictionary getLandObjectOwners() -- cgit v1.1