From 128e0be382e4ff541b47e753aebb8d77f7e5c848 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 9 Oct 2020 00:20:34 +0100 Subject: [PATCH] add GetFullGroupPowers(agentID, groupID) to groups modules. This returns the 'sum' of powers of all agent roles on that group, apply it to some OSSL (mantis 8777). It May be needed elsewhere --- OpenSim/Addons/Groups/GroupsModule.cs | 25 +++++++++++++++++++ .../Hypergrid/GroupsServiceHGConnector.cs | 11 ++++++-- .../Framework/Interfaces/IGroupsModule.cs | 3 +++ .../Avatar/XmlRpcGroups/GroupsModule.cs | 25 +++++++++++++++++++ .../Shared/Api/Implementation/OSSL_Api.cs | 12 ++++----- 5 files changed, 68 insertions(+), 8 deletions(-) diff --git a/OpenSim/Addons/Groups/GroupsModule.cs b/OpenSim/Addons/Groups/GroupsModule.cs index 9e552d2a83..401aea7a83 100755 --- a/OpenSim/Addons/Groups/GroupsModule.cs +++ b/OpenSim/Addons/Groups/GroupsModule.cs @@ -763,6 +763,31 @@ namespace OpenSim.Groups return data; } + public ulong GetFullGroupPowers(UUID agentID, UUID groupID) + { + if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); + + List data = m_groupData.GetGroupRoles(agentID.ToString(), groupID); + if (data == null || data.Count == 0) + return 0; + + ulong powers = 0; + for (int i = 0; i < data.Count; ++i) + { + powers |= data[i].Powers; + } + return powers; + } + + public List GroupRoleDataRequest(UUID agentID, UUID groupID) + { + if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); + + List data = m_groupData.GetGroupRoles(agentID.ToString(), groupID); + + return data; + } + public List GroupRoleDataRequest(IClientAPI remoteClient, UUID groupID) { if (m_debugEnabled) m_log.DebugFormat("[Groups]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); diff --git a/OpenSim/Addons/Groups/Hypergrid/GroupsServiceHGConnector.cs b/OpenSim/Addons/Groups/Hypergrid/GroupsServiceHGConnector.cs index 653dbac8bd..b1b646865a 100644 --- a/OpenSim/Addons/Groups/Hypergrid/GroupsServiceHGConnector.cs +++ b/OpenSim/Addons/Groups/Hypergrid/GroupsServiceHGConnector.cs @@ -268,10 +268,17 @@ namespace OpenSim.Groups sendData["METHOD"] = method; string reply = string.Empty; - lock (m_Lock) - reply = SynchronousRestFormsRequester.MakeRequest("POST", + try + { + lock (m_Lock) + reply = SynchronousRestFormsRequester.MakeRequest("POST", m_ServerURI + "hg-groups", ServerUtils.BuildQueryString(sendData)); + } + catch + { + return null; + } //m_log.DebugFormat("[XXX]: reply was {0}", reply); diff --git a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs index 0d1f4f4cfc..4c6a10bd8e 100644 --- a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs @@ -99,6 +99,9 @@ namespace OpenSim.Region.Framework.Interfaces void InviteGroup(IClientAPI remoteClient, UUID agentID, UUID GroupID, UUID InviteeID, UUID RoleID); void NotifyChange(UUID GroupID); + ulong GetFullGroupPowers(UUID agentID, UUID groupID); + List GroupRoleDataRequest(UUID agentID, UUID groupID); + List FindGroups(IClientAPI remoteClient, string query); } } \ No newline at end of file diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs index a38b1c79c6..32d6f1a1d7 100755 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs @@ -874,6 +874,31 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups return data; } + public ulong GetFullGroupPowers(UUID agentID, UUID groupID) + { + if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); + + List data = m_groupData.GetGroupRoles(agentID, groupID); + if (data == null || data.Count == 0) + return 0; + + ulong powers = 0; + for (int i = 0; i < data.Count; ++i) + { + powers |= data[i].Powers; + } + return powers; + } + + public List GroupRoleDataRequest(UUID agentID, UUID groupID) + { + if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); + + List data = m_groupData.GetGroupRoles(agentID, groupID); + + return data; + } + public List GroupRoleDataRequest(IClientAPI remoteClient, UUID groupID) { if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 5a906b4b69..3fc579bfa9 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -4101,9 +4101,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (sp.ControllingClient.IsGroupMember(m_host.GroupID)) return 2; - // object owner has to be in that group and required permissions - GroupMembershipData member = m_groupsModule.GetMembershipData(m_host.GroupID, m_host.OwnerID); - if (member == null || (member.GroupPowers & (ulong)GroupPowers.Invite) == 0) + // object owner needs invite power + ulong ownerPowers = m_groupsModule.GetFullGroupPowers(m_host.OwnerID, m_host.GroupID); + if ((ownerPowers & (ulong)GroupPowers.Invite) == 0) return ScriptBaseClass.FALSE; m_groupsModule.InviteGroup(null, m_host.OwnerID, m_host.GroupID, agent, UUID.Zero); @@ -4132,9 +4132,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (m_host.GroupID == UUID.Zero || m_host.GroupID == m_host.OwnerID) return ScriptBaseClass.FALSE; - // object owner has to be in that group and required permissions - GroupMembershipData member = m_groupsModule.GetMembershipData(m_host.GroupID, m_host.OwnerID); - if (member == null || (member.GroupPowers & (ulong)GroupPowers.Eject) == 0) + // object owner needs eject power + ulong ownerPowers = m_groupsModule.GetFullGroupPowers(m_host.OwnerID, m_host.GroupID); + if ((ownerPowers & (ulong)GroupPowers.Eject) == 0) return ScriptBaseClass.FALSE; m_groupsModule.EjectGroupMember(null, m_host.OwnerID, m_host.GroupID, agent);