aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules')
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandObject.cs49
1 files changed, 47 insertions, 2 deletions
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
index a0ed5a5..ced7b52 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
@@ -56,6 +56,9 @@ namespace OpenSim.Region.CoreModules.World.Land
56 protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>(); 56 protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>();
57 protected Dictionary<uint, UUID> m_listTransactions = new Dictionary<uint, UUID>(); 57 protected Dictionary<uint, UUID> m_listTransactions = new Dictionary<uint, UUID>();
58 58
59 protected ExpiringCache<UUID, bool> m_groupMemberCache = new ExpiringCache<UUID, bool>();
60 protected TimeSpan m_groupMemberCacheTimeout = TimeSpan.FromSeconds(30); // cache invalidation after 30 seconds
61
59 public bool[,] LandBitmap 62 public bool[,] LandBitmap
60 { 63 {
61 get { return m_landBitmap; } 64 get { return m_landBitmap; }
@@ -417,6 +420,45 @@ namespace OpenSim.Region.CoreModules.World.Land
417 return false; 420 return false;
418 } 421 }
419 422
423 public bool HasGroupAccess(UUID avatar)
424 {
425 if (LandData.GroupID != UUID.Zero && (LandData.Flags & (uint)ParcelFlags.UseAccessGroup) == (uint)ParcelFlags.UseAccessGroup)
426 {
427 ScenePresence sp;
428 if (!m_scene.TryGetScenePresence(avatar, out sp))
429 {
430 bool isMember;
431 if (m_groupMemberCache.TryGetValue(avatar, out isMember))
432 return isMember;
433
434 IGroupsModule groupsModule = m_scene.RequestModuleInterface<IGroupsModule>();
435 if (groupsModule == null)
436 return false;
437
438 GroupMembershipData[] membership = groupsModule.GetMembershipData(avatar);
439 if (membership == null || membership.Length == 0)
440 {
441 m_groupMemberCache.Add(avatar, false, m_groupMemberCacheTimeout);
442 return false;
443 }
444
445 foreach (GroupMembershipData d in membership)
446 {
447 if (d.GroupID == LandData.GroupID)
448 {
449 m_groupMemberCache.Add(avatar, true, m_groupMemberCacheTimeout);
450 return true;
451 }
452 }
453 m_groupMemberCache.Add(avatar, false, m_groupMemberCacheTimeout);
454 return false;
455 }
456
457 return sp.ControllingClient.IsGroupMember(LandData.GroupID);
458 }
459 return false;
460 }
461
420 public bool IsBannedFromLand(UUID avatar) 462 public bool IsBannedFromLand(UUID avatar)
421 { 463 {
422 ExpireAccessList(); 464 ExpireAccessList();
@@ -448,6 +490,9 @@ namespace OpenSim.Region.CoreModules.World.Land
448 490
449 public bool IsRestrictedFromLand(UUID avatar) 491 public bool IsRestrictedFromLand(UUID avatar)
450 { 492 {
493 if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) == 0)
494 return false;
495
451 if (m_scene.Permissions.IsAdministrator(avatar)) 496 if (m_scene.Permissions.IsAdministrator(avatar))
452 return false; 497 return false;
453 498
@@ -457,10 +502,10 @@ namespace OpenSim.Region.CoreModules.World.Land
457 if (avatar == LandData.OwnerID) 502 if (avatar == LandData.OwnerID)
458 return false; 503 return false;
459 504
460 if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) == 0) 505 if (HasGroupAccess(avatar))
461 return false; 506 return false;
462 507
463 return (!IsInLandAccessList(avatar)); 508 return !IsInLandAccessList(avatar);
464 } 509 }
465 510
466 public bool IsInLandAccessList(UUID avatar) 511 public bool IsInLandAccessList(UUID avatar)