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);