コード例 #1
0
        public List <GroupRolesData> GetGroupRoles(GroupRequestID requestID, UUID GroupID)
        {
            Hashtable param = new Hashtable();

            param["GroupID"] = GroupID.ToString();

            Hashtable respData = XmlRpcCall(requestID, "groups.getGroupRoles", param);

            List <GroupRolesData> Roles = new List <GroupRolesData>();

            if (respData.Contains("error"))
            {
                return(Roles);
            }

            foreach (Hashtable role in respData.Values)
            {
                GroupRolesData data = new GroupRolesData();
                data.Description = (string)role["Description"];
                data.Members     = int.Parse((string)role["Members"]);
                data.Name        = (string)role["Name"];
                data.Powers      = ulong.Parse((string)role["Powers"]);
                data.RoleID      = new UUID((string)role["RoleID"]);
                data.Title       = (string)role["Title"];

                Roles.Add(data);
            }

            return(Roles);
        }
コード例 #2
0
        // Returns null on error, empty list if not in any groups.
        public List <UUID> GetAgentGroupList(GroupRequestID requestID, UUID AgentID)
        {
            Hashtable param = new Hashtable();

            param["AgentID"] = AgentID.ToString();

            Hashtable respData = XmlRpcCall(requestID, "groups.getAgentGroupMemberships", param);

            if (respData.Contains("error"))
            {
                return(null);
            }

            List <UUID> groups = new List <UUID>();

            foreach (object membership in respData.Values)
            {
                Hashtable data    = (Hashtable)membership;
                UUID      groupID = new UUID((string)data["GroupID"]);

                groups.Add(groupID);
            }

            return(groups);
        }
コード例 #3
0
        public List <GroupMembersData> GetGroupMembers(GroupRequestID requestID, UUID GroupID, bool ownersOnly)
        {
            Hashtable param = new Hashtable();

            param["GroupID"] = GroupID.ToString();

            Hashtable respData = XmlRpcCall(requestID, "groups.getGroupMembers", param);

            List <GroupMembersData> members = new List <GroupMembersData>();

            if (respData.Contains("error"))
            {
                return(members);
            }

            foreach (Hashtable membership in respData.Values)
            {
                GroupMembersData data = new GroupMembersData();

                data.AcceptNotices = ((string)membership["AcceptNotices"]) == "1";
                data.AgentID       = new UUID((string)membership["AgentID"]);
                data.Contribution  = int.Parse((string)membership["Contribution"]);
                data.IsOwner       = ((string)membership["IsOwner"]) == "1";
                data.ListInProfile = ((string)membership["ListInProfile"]) == "1";
                data.AgentPowers   = ulong.Parse((string)membership["AgentPowers"]);
                data.Title         = (string)membership["Title"];

                if (data.IsOwner)
                {
                    members.Add(data);
                }
            }

            return(members);
        }
コード例 #4
0
        public List <GroupNoticeData> GetGroupNotices(GroupRequestID requestID, UUID GroupID)
        {
            Hashtable param = new Hashtable();

            param["GroupID"] = GroupID.ToString();

            Hashtable respData = XmlRpcCall(requestID, "groups.getGroupNotices", param);

            List <GroupNoticeData> values = new List <GroupNoticeData>();

            if (!respData.Contains("error"))
            {
                foreach (Hashtable value in respData.Values)
                {
                    GroupNoticeData data = new GroupNoticeData();
                    data.NoticeID      = UUID.Parse((string)value["NoticeID"]);
                    data.Timestamp     = uint.Parse((string)value["Timestamp"]);
                    data.FromName      = (string)value["FromName"];
                    data.Subject       = (string)value["Subject"];
                    data.HasAttachment = false;
                    data.AssetType     = 0;

                    values.Add(data);
                }
            }
            return(values);
        }
コード例 #5
0
        public GroupNoticeInfo GetGroupNotice(GroupRequestID requestID, UUID noticeID)
        {
            Hashtable param = new Hashtable();

            param["NoticeID"] = noticeID.ToString();

            Hashtable respData = XmlRpcCall(requestID, "groups.getGroupNotice", param);


            if (respData.Contains("error"))
            {
                return(null);
            }

            GroupNoticeInfo data = new GroupNoticeInfo();

            data.GroupID                  = UUID.Parse((string)respData["GroupID"]);
            data.Message                  = (string)respData["Message"];
            data.BinaryBucket             = Utils.HexStringToBytes((string)respData["BinaryBucket"], true);
            data.noticeData.NoticeID      = UUID.Parse((string)respData["NoticeID"]);
            data.noticeData.Timestamp     = uint.Parse((string)respData["Timestamp"]);
            data.noticeData.FromName      = (string)respData["FromName"];
            data.noticeData.Subject       = (string)respData["Subject"];
            data.noticeData.HasAttachment = false;
            data.noticeData.AssetType     = 0;

            if (data.Message == null)
            {
                data.Message = String.Empty;
            }

            return(data);
        }
コード例 #6
0
        public List <DirGroupsReplyData> FindGroups(GroupRequestID requestID, string search)
        {
            Hashtable param = new Hashtable();

            param["Search"] = search;

            Hashtable respData = XmlRpcCall(requestID, "groups.findGroups", param);

            List <DirGroupsReplyData> findings = new List <DirGroupsReplyData>();

            if (!respData.Contains("error"))
            {
                Hashtable results = (Hashtable)respData["results"];
                foreach (Hashtable groupFind in results.Values)
                {
                    DirGroupsReplyData data = new DirGroupsReplyData();
                    data.groupID   = new UUID((string)groupFind["GroupID"]);;
                    data.groupName = (string)groupFind["Name"];
                    data.members   = int.Parse((string)groupFind["Members"]);
                    // data.searchOrder = order;

                    findings.Add(data);
                }
            }

            return(findings);
        }
コード例 #7
0
        public void RemoveAgentToGroupInvite(GroupRequestID requestID, UUID inviteID)
        {
            Hashtable param = new Hashtable();

            param["InviteID"] = inviteID.ToString();

            XmlRpcCall(requestID, "groups.removeAgentToGroupInvite", param);
        }
コード例 #8
0
        public void SetAgentActiveGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID)
        {
            Hashtable param = new Hashtable();

            param["AgentID"] = AgentID.ToString();
            param["GroupID"] = GroupID.ToString();

            XmlRpcCall(requestID, "groups.setAgentActiveGroup", param);
        }
コード例 #9
0
        public void RemoveGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID)
        {
            Hashtable param = new Hashtable();

            param["GroupID"] = groupID.ToString();
            param["RoleID"]  = roleID.ToString();

            XmlRpcCall(requestID, "groups.removeRoleFromGroup", param);
        }
コード例 #10
0
        public void RemoveAgentFromGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID)
        {
            Hashtable param = new Hashtable();

            param["AgentID"] = AgentID.ToString();
            param["GroupID"] = GroupID.ToString();
            param["RoleID"]  = RoleID.ToString();

            XmlRpcCall(requestID, "groups.removeAgentFromGroupRole", param);
        }
コード例 #11
0
        public void AddAgentToGroupRole(GroupRequestID requestID, UUID RequesterID, UUID AgentID, UUID GroupID, UUID RoleID, bool bypassChecks)
        {
            Hashtable param = new Hashtable();

            param["RequesterID"] = RequesterID.ToString();
            param["AgentID"]     = AgentID.ToString();
            param["GroupID"]     = GroupID.ToString();
            param["RoleID"]      = RoleID.ToString();

            XmlRpcCall(requestID, "groups.addAgentToGroupRole", param);
        }
コード例 #12
0
        public void SetAgentGroupInfo(GroupRequestID requestID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile)
        {
            Hashtable param = new Hashtable();

            param["AgentID"]       = AgentID.ToString();
            param["GroupID"]       = GroupID.ToString();
            param["AcceptNotices"] = AcceptNotices ? "1" : "0";
            param["ListInProfile"] = ListInProfile ? "1" : "0";

            XmlRpcCall(requestID, "groups.setAgentGroupInfo", param);
        }
コード例 #13
0
        public bool AddAgentToGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID, bool skipPermissionChecks)
        {
            Hashtable param = new Hashtable();

            param["AgentID"] = AgentID.ToString();
            param["GroupID"] = GroupID.ToString();
            param["RoleID"]  = RoleID.ToString();

            XmlRpcCall(requestID, "groups.addAgentToGroup", param);

            return(true);
        }
コード例 #14
0
        public int RemoveAgentFromGroup(GroupRequestID requestID, UUID RequesterID, UUID AgentID, UUID GroupID)
        {
            Hashtable param = new Hashtable();

            param["RequesterID"] = RequesterID.ToString();
            param["AgentID"]     = AgentID.ToString();
            param["GroupID"]     = GroupID.ToString();

            XmlRpcCall(requestID, "groups.removeAgentFromGroup", param);

            return((int)Constants.GenericReturnCodes.SUCCESS);
        }
コード例 #15
0
        public int AddAgentToGroupInvite(GroupRequestID requestID, UUID inviterID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID, out string reason)
        {
            Hashtable param = new Hashtable();

            param["InviterID"] = inviterID.ToString();
            param["InviteID"]  = inviteID.ToString();
            param["AgentID"]   = agentID.ToString();
            param["RoleID"]    = roleID.ToString();
            param["GroupID"]   = groupID.ToString();

            XmlRpcCall(requestID, "groups.addAgentToGroupInvite", param);
            reason = "The user has been invited into the group.";
            return((int)Constants.GenericReturnCodes.SUCCESS);
        }
コード例 #16
0
        public void AddGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description,
                                 string title, ulong powers, bool skipPermissionChecks)
        {
            Hashtable param = new Hashtable();

            param["GroupID"]     = groupID.ToString();
            param["RoleID"]      = roleID.ToString();
            param["Name"]        = name;
            param["Description"] = description;
            param["Title"]       = title;
            param["Powers"]      = powers.ToString();

            XmlRpcCall(requestID, "groups.addRoleToGroup", param);
        }
コード例 #17
0
        public GroupMembershipData GetAgentActiveMembership(GroupRequestID requestID, UUID AgentID)
        {
            Hashtable param = new Hashtable();

            param["AgentID"] = AgentID.ToString();

            Hashtable respData = XmlRpcCall(requestID, "groups.getAgentActiveMembership", param);

            if (respData.Contains("error"))
            {
                return(null);
            }

            return(HashTableToGroupMembershipData(respData));
        }
コード例 #18
0
        public void UpdateGroup(GroupRequestID requestID, UUID groupID, string charter, bool showInList,
                                UUID insigniaID, int membershipFee, bool openEnrollment,
                                bool allowPublish, bool maturePublish)
        {
            Hashtable param = new Hashtable();

            param["GroupID"]        = groupID.ToString();
            param["Charter"]        = charter;
            param["ShowInList"]     = showInList == true ? 1 : 0;
            param["InsigniaID"]     = insigniaID.ToString();
            param["MembershipFee"]  = membershipFee;
            param["OpenEnrollment"] = openEnrollment == true ? 1 : 0;
            param["AllowPublish"]   = allowPublish == true ? 1 : 0;
            param["MaturePublish"]  = maturePublish == true ? 1 : 0;

            XmlRpcCall(requestID, "groups.updateGroup", param);
        }
コード例 #19
0
        public bool AddGroupNotice(GroupRequestID requestID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket)
        {
            string binBucket = OpenMetaverse.Utils.BytesToHexString(binaryBucket, String.Empty);

            Hashtable param = new Hashtable();

            param["GroupID"]      = groupID.ToString();
            param["NoticeID"]     = noticeID.ToString();
            param["FromName"]     = fromName;
            param["Subject"]      = subject;
            param["Message"]      = message;
            param["BinaryBucket"] = binBucket;
            param["TimeStamp"]    = ((uint)Util.UnixTimeSinceEpoch()).ToString();

            XmlRpcCall(requestID, "groups.addGroupNotice", param);

            return(true);
        }
コード例 #20
0
        public OpenMetaverse.UUID CreateGroup(GroupRequestID requestID, string name, string charter, bool showInList, OpenMetaverse.UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish, OpenMetaverse.UUID founderID)
        {
            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return UUID.Zero;

                UUID groupID = UUID.Random();
                UUID ownerRoleID = UUID.Random();
                
                // Would this be cleaner as (GroupPowers)ulong.MaxValue;
                GroupPowers ownerPowers = (GroupPowers)ulong.MaxValue;

                string query
                    =   "INSERT INTO osgroup " +
                            "(GroupID, Name, Charter, InsigniaID, FounderID, MembershipFee, OpenEnrollment, " +
                                "ShowInList, AllowPublish, MaturePublish, OwnerRoleID) " +
                        "VALUES(?groupid, ?name, ?charter, ?insigniaID, ?founderID, ?membershipFee, " +
                            "?openEnrollment, ?showInList, ?allowPublish, ?maturePublish, ?ownerRoleID)";
                
                Dictionary<string, object> parms = new Dictionary<string,object>();
                parms.Add("?groupid", groupID);
                parms.Add("?name", name);
                parms.Add("?charter", charter);
                parms.Add("?insigniaID", insigniaID);
                parms.Add("?founderID", founderID);
                parms.Add("?membershipFee", membershipFee.ToString());
                parms.Add("?openEnrollment", openEnrollment);
                parms.Add("?showInList", showInList);
                parms.Add("?allowPublish", allowPublish);
                parms.Add("?maturePublish", maturePublish);
                parms.Add("?ownerRoleID", ownerRoleID);

                db.QueryNoResults(query, parms);

                this.AddGroupRole(requestID, groupID, EVERYONE_ROLEID, "Everyone", "Everyone in the group is in the everyone role.", "Member of " + name, (ulong)Constants.DefaultEveryonePowers, true);
                this.AddGroupRole(requestID, groupID, ownerRoleID, "Owners", "Owners of " + name, "Owner of " + name, (ulong) ownerPowers, true);
                this.AddAgentToGroup(requestID, founderID, groupID, ownerRoleID, true);
                this.SetAgentGroupSelectedRole(db, founderID, groupID, ownerRoleID);
                this.SetAgentActiveGroup(requestID, founderID, groupID);

                return groupID;
            }
        }
コード例 #21
0
        public List <GroupMembershipData> GetAgentGroupMemberships(GroupRequestID requestID, UUID AgentID)
        {
            Hashtable param = new Hashtable();

            param["AgentID"] = AgentID.ToString();

            Hashtable respData = XmlRpcCall(requestID, "groups.getAgentGroupMemberships", param);

            List <GroupMembershipData> memberships = new List <GroupMembershipData>();

            if (!respData.Contains("error"))
            {
                foreach (object membership in respData.Values)
                {
                    memberships.Add(HashTableToGroupMembershipData((Hashtable)membership));
                }
            }

            return(memberships);
        }
コード例 #22
0
        /// <summary>
        /// Create a Group, including Everyone and Owners Role, place FounderID in both groups, select Owner as selected role, and newly created group as agent's active role.
        /// </summary>
        public UUID CreateGroup(GroupRequestID requestID, string name, string charter, bool showInList, UUID insigniaID,
                                int membershipFee, bool openEnrollment, bool allowPublish,
                                bool maturePublish, UUID founderID)
        {
            UUID GroupID     = UUID.Random();
            UUID OwnerRoleID = UUID.Random();

            Hashtable param = new Hashtable();

            param["GroupID"]        = GroupID.ToString();
            param["Name"]           = name;
            param["Charter"]        = charter;
            param["ShowInList"]     = showInList == true ? 1 : 0;
            param["InsigniaID"]     = insigniaID.ToString();
            param["MembershipFee"]  = 0;
            param["OpenEnrollment"] = openEnrollment == true ? 1 : 0;
            param["AllowPublish"]   = allowPublish == true ? 1 : 0;
            param["MaturePublish"]  = maturePublish == true ? 1 : 0;
            param["FounderID"]      = founderID.ToString();
            param["EveryonePowers"] = ((ulong)Constants.DefaultEveryonePowers).ToString();
            param["OwnerRoleID"]    = OwnerRoleID.ToString();

            // Would this be cleaner as (GroupPowers)ulong.MaxValue;
            GroupPowers OwnerPowers = (GroupPowers)ulong.MaxValue;

            param["OwnersPowers"] = ((ulong)OwnerPowers).ToString();



            Hashtable respData = XmlRpcCall(requestID, "groups.createGroup", param);

            if (respData.Contains("error"))
            {
                // UUID is not nullable

                return(UUID.Zero);
            }

            return(UUID.Parse((string)respData["GroupID"]));
        }
コード例 #23
0
ファイル: XmlRpcGroupData.cs プロジェクト: BogusCurry/halcyon
        /// <summary>
        /// Create a Group, including Everyone and Owners Role, place FounderID in both groups, select Owner as selected role, and newly created group as agent's active role.
        /// </summary>
        public UUID CreateGroup(GroupRequestID requestID, string name, string charter, bool showInList, UUID insigniaID, 
                                int membershipFee, bool openEnrollment, bool allowPublish, 
                                bool maturePublish, UUID founderID)
        {
            UUID GroupID = UUID.Random();
            UUID OwnerRoleID = UUID.Random();

            Hashtable param = new Hashtable();
            param["GroupID"] = GroupID.ToString();
            param["Name"] = name;
            param["Charter"] = charter;
            param["ShowInList"] = showInList == true ? 1 : 0;
            param["InsigniaID"] = insigniaID.ToString();
            param["MembershipFee"] = 0;
            param["OpenEnrollment"] = openEnrollment == true ? 1 : 0;
            param["AllowPublish"] = allowPublish == true ? 1 : 0;
            param["MaturePublish"] = maturePublish == true ? 1 : 0;
            param["FounderID"] = founderID.ToString();
            param["EveryonePowers"] = ((ulong)Constants.DefaultEveryonePowers).ToString();
            param["OwnerRoleID"] = OwnerRoleID.ToString();

            // Would this be cleaner as (GroupPowers)ulong.MaxValue;
            GroupPowers OwnerPowers = (GroupPowers)ulong.MaxValue;
            param["OwnersPowers"] = ((ulong)OwnerPowers).ToString();




            Hashtable respData = XmlRpcCall(requestID, "groups.createGroup", param);

            if (respData.Contains("error"))
            {
                // UUID is not nullable

                return UUID.Zero;
            }

            return UUID.Parse((string)respData["GroupID"]);
        }
コード例 #24
0
        public GroupProfileData GetMemberGroupProfile(GroupRequestID requestID, UUID GroupID, UUID AgentID)
        {
            Hashtable param = new Hashtable();

            param["GroupID"] = GroupID.ToString();

            Hashtable respData = XmlRpcCall(requestID, "groups.getGroup", param);

            if (respData.Contains("error"))
            {
                // GroupProfileData is not nullable
                return(new GroupProfileData());
            }

            GroupMembershipData MemberInfo         = GetAgentGroupMembership(requestID, AgentID, GroupID);
            GroupProfileData    MemberGroupProfile = GroupProfileHashtableToGroupProfileData(respData);

            MemberGroupProfile.MemberTitle = MemberInfo.GroupTitle;
            MemberGroupProfile.PowersMask  = MemberInfo.GroupPowers;

            return(MemberGroupProfile);
        }
コード例 #25
0
        public GroupInviteInfo GetAgentToGroupInvite(GroupRequestID requestID, UUID inviteID)
        {
            Hashtable param = new Hashtable();

            param["InviteID"] = inviteID.ToString();

            Hashtable respData = XmlRpcCall(requestID, "groups.getAgentToGroupInvite", param);

            if (respData.Contains("error"))
            {
                return(null);
            }

            GroupInviteInfo inviteInfo = new GroupInviteInfo();

            inviteInfo.InviteID = inviteID;
            inviteInfo.GroupID  = UUID.Parse((string)respData["GroupID"]);
            inviteInfo.RoleID   = UUID.Parse((string)respData["RoleID"]);
            inviteInfo.AgentID  = UUID.Parse((string)respData["AgentID"]);

            return(inviteInfo);
        }
コード例 #26
0
        public GroupRecord GetGroupRecord(GroupRequestID requestID, UUID GroupID, string GroupName)
        {
            Hashtable param = new Hashtable();

            if (GroupID != UUID.Zero)
            {
                param["GroupID"] = GroupID.ToString();
            }
            if (!String.IsNullOrEmpty(GroupName))
            {
                param["Name"] = GroupName.ToString();
            }

            Hashtable respData = XmlRpcCall(requestID, "groups.getGroup", param);

            if (respData.Contains("error"))
            {
                return(null);
            }

            return(GroupProfileHashtableToGroupRecord(respData));
        }
コード例 #27
0
        public void UpdateGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description,
                                    string title, ulong powers)
        {
            Hashtable param = new Hashtable();

            param["GroupID"] = groupID.ToString();
            param["RoleID"]  = roleID.ToString();
            if (name != null)
            {
                param["Name"] = name;
            }
            if (description != null)
            {
                param["Description"] = description;
            }
            if (title != null)
            {
                param["Title"] = title;
            }
            param["Powers"] = powers.ToString();

            XmlRpcCall(requestID, "groups.updateGroupRole", param);
        }
コード例 #28
0
        public List <GroupRoleMembersData> GetGroupRoleMembers(GroupRequestID requestID, UUID GroupID)
        {
            Hashtable param = new Hashtable();

            param["GroupID"] = GroupID.ToString();

            Hashtable respData = XmlRpcCall(requestID, "groups.getGroupRoleMembers", param);

            List <GroupRoleMembersData> members = new List <GroupRoleMembersData>();

            if (!respData.Contains("error"))
            {
                foreach (Hashtable membership in respData.Values)
                {
                    GroupRoleMembersData data = new GroupRoleMembersData();

                    data.MemberID = new UUID((string)membership["AgentID"]);
                    data.RoleID   = new UUID((string)membership["RoleID"]);

                    members.Add(data);
                }
            }
            return(members);
        }
コード例 #29
0
        public List<OpenSim.Framework.DirGroupsReplyData> FindGroups(GroupRequestID requestID, string search)
        {
            List<OpenSim.Framework.DirGroupsReplyData> replyData = new List<OpenSim.Framework.DirGroupsReplyData>();

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return replyData;

                string query = " SELECT osgroup.GroupID, osgroup.Name, count(osgroupmembership.AgentID) as Members " +
                                " FROM osgroup " +
                                    "LEFT JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID) " +
                                /*" WHERE MATCH (osgroup.name) AGAINST (?search IN BOOLEAN MODE) " +*/
                                " WHERE osgroup.name LIKE ?likeSearch " +
                                " OR osgroup.name REGEXP ?search " +
                                " OR osgroup.charter LIKE ?likeSearch " +
                                " OR osgroup.charter REGEXP ?search " +
                                " GROUP BY osgroup.GroupID, osgroup.Name ";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?search", search);
                parms.Add("?likeSearch", "%" + search + "%");

                List<Dictionary<string, string>> results = db.QueryWithResults(query, parms);
                foreach (Dictionary<string, string> result in results)
                {
                    replyData.Add(MapGroupReplyDataFromResult(result));
                }
            }

            return replyData;
        }
コード例 #30
0
        public int RemoveAgentFromGroup(GroupRequestID requestID, OpenMetaverse.UUID RequesterID, OpenMetaverse.UUID AgentID, OpenMetaverse.UUID GroupID)
        {
            // Extra check needed for group owner removals - cannot remove the Owner role unless you are the user
            GroupRecord groupRec = GetGroupRecord(requestID, GroupID, null);
            if (groupRec == null) return (int)Constants.GenericReturnCodes.PARAMETER;

            // Is this the last owner in a group? Don't let group managers shoot themselves in the foot.
            List<UUID> groupOwners = GetGroupMembersWithRole(requestID, GroupID, groupRec.OwnerRoleID);
            if (groupOwners.Contains(AgentID))
            {
                // Sorry Dave, I can't allow you to remove yourself if you are the only owner.
                if (groupOwners.Count < 2)
                {
                    m_log.WarnFormat("[GROUPS]: {0} Cannot remove the only owner {1} in group {2}", RequesterID, AgentID, GroupID);
                    return (int)Constants.GenericReturnCodes.PERMISSION;
                }
                // An owner can only be removed by themselves...
                if (RequesterID != AgentID)
                {
                    m_log.WarnFormat("[GROUPS]: {0} Cannot remove owner {1} of group {2}", RequesterID, AgentID, GroupID);
                    return (int)Constants.GenericReturnCodes.PERMISSION;
                }
            }

            //user can always remove themselves from a group so skip tests in that case
            if (RequesterID != AgentID)
            {
                if (!this.TestForPower(requestID, RequesterID, GroupID, (ulong)GroupPowers.Eject))
                {
                    m_log.WarnFormat("[GROUPS]: {0} No permission to remove {1} from group {2}", RequesterID, AgentID, GroupID);
                    return (int)Constants.GenericReturnCodes.PERMISSION;
                }
            }

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return (int)Constants.GenericReturnCodes.ERROR;

                if (!IsAgentMemberOfGroup(db, AgentID, GroupID))
                {
                    m_log.WarnFormat("[GROUPS]: {0} Cannot remove non-member {1} from group {2}", requestID.AgentID, AgentID, GroupID);
                    return (int)Constants.GenericReturnCodes.PERMISSION;
                }

                string query =  " UPDATE osagent " +
                                " SET ActiveGroupID = '" + UUID.Zero.ToString() + "' " +
                                " WHERE AgentID = ?agentID AND ActiveGroupID = ?groupID";

                Dictionary<string, object> parms = new Dictionary<string,object>();
                parms.Add("?agentID", AgentID);
                parms.Add("?groupID", GroupID);


                db.QueryNoResults(query, parms);
                
                query = " DELETE FROM osgroupmembership " +
                        " WHERE AgentID = ?agentID AND GroupID = ?groupID";
              
                db.QueryNoResults(query, parms);
               
                query = " DELETE FROM osgrouprolemembership " +
                        " WHERE AgentID = ?agentID AND GroupID = ?groupID";

                db.QueryNoResults(query, parms);
            }

            return (int)Constants.GenericReturnCodes.SUCCESS;
        }
コード例 #31
0
        public void SetAgentActiveGroup(GroupRequestID requestID, OpenMetaverse.UUID AgentID, OpenMetaverse.UUID GroupID)
        {
            //only the agent making the call can change their own group
            if (requestID.AgentID != AgentID)
            {
                m_log.WarnFormat("[GROUPS]: User {0} No permission to change the active group for {1}", requestID.AgentID, AgentID);
                return;
            }

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return;

                //test to see if the user even exists in osagent
                if (AgentHasActiveGroup(db, AgentID))
                {
                    string query
                        = "UPDATE osagent " +
                            "SET ActiveGroupID = ?activeGroupID " +
                            "WHERE AgentID = ?agentID";

                    Dictionary<string, object> parms = new Dictionary<string, object>();
                    parms.Add("?activeGroupID", GroupID);
                    parms.Add("?agentID", AgentID);

                    db.QueryNoResults(query, parms);
                }
                else
                {
                    string query
                        =   "INSERT INTO osagent (ActiveGroupID, AgentID) " +
                            "VALUES(?groupID, ?agentID)";

                    Dictionary<string, object> parms = new Dictionary<string, object>();
                    parms.Add("?groupID", GroupID);
                    parms.Add("?agentID", AgentID);

                    db.QueryNoResults(query, parms);
                }
            }
        }
コード例 #32
0
        public int AddAgentToGroupInvite(GroupRequestID requestID, OpenMetaverse.UUID inviterID, OpenMetaverse.UUID inviteID, OpenMetaverse.UUID groupID, 
            OpenMetaverse.UUID roleID, OpenMetaverse.UUID agentID, out string reason)
        {
            if (!this.TestForPower(requestID, inviterID, groupID, (ulong)GroupPowers.Invite))
            {
                m_log.WarnFormat("[GROUPS]: {0} No permission to invite {1} to group {2}", inviterID, agentID, groupID);
                reason = "You do not have permission to invite others into that group.";
                return (int)Constants.GenericReturnCodes.PERMISSION;
            }

            if (roleID != EVERYONE_ROLEID)
            {
                if (!CanAddAgentToRole(requestID, inviterID, agentID, groupID, roleID, false))
                {
                    m_log.WarnFormat("[GROUPS]: {0} No permission to assign new role for user {1} in group {2}.", inviterID, agentID, groupID);
                    reason = "You do not have permission to invite others into that group role.";
                    return (int)Constants.GenericReturnCodes.PERMISSION;
                }
            }

            // In case they didn't get the IM or just closed it, offer them the invite again even if it's redundant.
            // if (AgentHasBeenInvitedToGroup(agentID, groupID, roleID))
            //    return (int)Constants.GenericReturnCodes.NOCHANGE;  // redundant request

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                {
                    reason = "MySQL connection failed";
                    return (int)Constants.GenericReturnCodes.ERROR;
                }

                if (IsAgentMemberOfGroup(db, agentID, groupID))
                {
                    // The target user is already a member of the group. See if they are already in that role.
                    if (roleID == EVERYONE_ROLEID)
                    {
                        reason = "That user is already a member of the group.";
                        return (int)Constants.GenericReturnCodes.NOCHANGE;   // redundant request
                    }
                    // See if they are already in that role.
                    if (IsAgentInRole(db, agentID, groupID, roleID))
                    {
                        reason = "The user is already in that group with that role.";
                        return (int)Constants.GenericReturnCodes.NOCHANGE;   // redundant request
                    }

                    // Otherwise, add the specified role.
                    AddAgentToGroupRole(requestID, inviterID, agentID, groupID, roleID, true);
                    reason = "The user has been assigned an additional new group role.";
                    return (int)Constants.GenericReturnCodes.SUCCESS;   // agent's group membership updated with specified role
                }

                // Remove any existing invites for this agent to this group
                string query =  " DELETE FROM osgroupinvite" +
                                " WHERE osgroupinvite.AgentID = ?agentID AND osgroupinvite.GroupID = ?groupID";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?agentID", agentID);
                parms.Add("?groupID", groupID);

                db.QueryNoResults(query, parms);
               
                // Add new invite for this agent to this group for the specifide role
                query =     " INSERT INTO osgroupinvite (InviteID, GroupID, RoleID, AgentID) " +
                            " VALUES (?inviteID, ?groupID, ?roleID, ?agentID)";

                parms.Add("?inviteID", inviteID);
                parms.Add("?roleID", roleID);

                db.QueryNoResults(query, parms);
            }

            reason = "The user has been invited into the group.";
            return (int)Constants.GenericReturnCodes.SUCCESS;
        }
コード例 #33
0
        public bool AddGroupNotice(GroupRequestID requestID, OpenMetaverse.UUID groupID, OpenMetaverse.UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket)
        {
            if (!this.TestForPower(requestID, requestID.AgentID, groupID, (ulong)GroupPowers.SendNotices))
            {
                m_log.WarnFormat("[GROUPS]: {0} No permission to send notices for group {1}", requestID.AgentID, groupID);
                return false;
            }

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return false;

                string binBucketString = OpenMetaverse.Utils.BytesToHexString(binaryBucket, "");

                string query = " INSERT INTO osgroupnotice" +
                                " (GroupID, NoticeID, Timestamp, FromName, Subject, Message, BinaryBucket)" +
                                " VALUES " +
                                " (?groupID, ?noticeID, ?timeStamp, ?fromName, ?subject, ?message, ?binaryBucket)";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?groupID", groupID);
                parms.Add("?noticeID", noticeID);
                parms.Add("?timeStamp", ((uint)Util.UnixTimeSinceEpoch()).ToString());
                parms.Add("?fromName", fromName);
                parms.Add("?subject", subject);
                parms.Add("?message", message);
                parms.Add("?binaryBucket", binBucketString);

                db.QueryNoResults(query, parms);
            }

            return true;
        }
コード例 #34
0
        // This fetches a summary list of all notices in the group.
        public List<OpenSim.Framework.GroupNoticeData> GetGroupNotices(GroupRequestID requestID, OpenMetaverse.UUID GroupID)
        {
            List<OpenSim.Framework.GroupNoticeData> foundNotices = new List<OpenSim.Framework.GroupNoticeData>();

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return foundNotices;

                string query
                    = " SELECT GroupID, NoticeID, Timestamp, FromName, Subject, Message, BinaryBucket" +
                        " FROM osgroupnotice" +
                        " WHERE osgroupnotice.GroupID = ?groupID";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?groupID", GroupID);

                List<Dictionary<string, string>> results = db.QueryWithResults(query, parms);
                foreach (Dictionary<string, string> result in results)
                {
                    foundNotices.Add(this.MapGroupNoticeDataFromResult(result));
                }
            }

            return foundNotices;
        }
コード例 #35
0
        public void RemoveGroupRole(GroupRequestID requestID, OpenMetaverse.UUID groupID, OpenMetaverse.UUID roleID)
        {
            if (!TestForPower(requestID, requestID.AgentID, groupID, (ulong)GroupPowers.DeleteRole))
            {
                m_log.WarnFormat("[GROUPS]: {0} No permission to remove group roles", requestID.AgentID);
                return;
            }

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return;

                Dictionary<string, object> parms = new Dictionary<string,object>();
                parms.Add("?groupID", groupID);
                parms.Add("?roleID", roleID);

                string query = "DELETE FROM osgrouprolemembership WHERE GroupID = ?groupID AND RoleID = ?roleID";
                db.QueryNoResults(query, parms);

                query = "UPDATE osgroupmembership SET SelectedRoleID = '" +
                    EVERYONE_ROLEID.ToString() + "' WHERE GroupID = ?groupID AND SelectedRoleID = ?roleID";
                db.QueryNoResults(query, parms);

                query = "DELETE FROM osrole WHERE GroupID = ?groupID AND RoleID = ?roleID";
                db.QueryNoResults(query, parms);
            }
        }
コード例 #36
0
        public List<OpenSim.Framework.GroupRolesData> GetGroupRoles(GroupRequestID requestID, OpenMetaverse.UUID GroupID)
        {
            List<OpenSim.Framework.GroupRolesData> foundRoles = new List<OpenSim.Framework.GroupRolesData>();

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return foundRoles;

                string query 
                    =   " SELECT osrole.RoleID, osrole.Name, osrole.Title, osrole.Description, osrole.Powers, " +
                            " count(osgrouprolemembership.AgentID) as Members " +
                        " FROM osrole " +
                            " LEFT JOIN osgrouprolemembership ON (osrole.GroupID = osgrouprolemembership.GroupID " +
                                " AND osrole.RoleID = osgrouprolemembership.RoleID) " +
                        " WHERE osrole.GroupID = ?groupID " +
                        " GROUP BY osrole.RoleID, osrole.Name, osrole.Title, osrole.Description, osrole.Powers ";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?groupID", GroupID);

                List<Dictionary<string, string>> results = db.QueryWithResults(query, parms);
                foreach (Dictionary<string, string> result in results)
                {
                    foundRoles.Add(this.MapGroupRolesDataFromResult(result));
                }

            }

            return foundRoles;
        }
コード例 #37
0
        public List<UUID> GetGroupMembersWithRole(GroupRequestID requestID, UUID GroupID, UUID RoleID)
        {
            string query = " SELECT * FROM osgrouprolemembership WHERE GroupID = ?groupID AND RoleID = ?roleID";

            Dictionary<string, object> parms = new Dictionary<string, object>();
            parms.Add("?groupID", GroupID);
            parms.Add("?roleID", RoleID);

            List<UUID> roleMembersData = new List<UUID>();
            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return roleMembersData;

                List<Dictionary<string, string>> results = db.QueryWithResults(query, parms);
                foreach (Dictionary<string, string> result in results)
                    roleMembersData.Add(new UUID(result["AgentID"]));
            }
            return roleMembersData;
        }
コード例 #38
0
        public bool AgentHasOwnerRole(ISimpleDB db, GroupRequestID requestID, OpenMetaverse.UUID AgentID, OpenMetaverse.UUID GroupID)
        {
            GroupRecord groupInfo = GetGroupRecord(requestID, GroupID, null);
            if (groupInfo == null) return false;

            return IsAgentInRole(db, AgentID, GroupID, groupInfo.OwnerRoleID);
        }
コード例 #39
0
        public List<OpenSim.Framework.GroupRolesData> GetAgentGroupRoles(GroupRequestID requestID, OpenMetaverse.UUID AgentID, OpenMetaverse.UUID GroupID)
        {
            List<OpenSim.Framework.GroupRolesData> foundGroupRoles = new List<OpenSim.Framework.GroupRolesData>();

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return foundGroupRoles;

                string query
                    =   " SELECT osrole.RoleID, osrole.GroupID, osrole.Title, osrole.Name, osrole.Description, osrole.Powers" +
                            " , CASE WHEN osgroupmembership.SelectedRoleID = osrole.RoleID THEN 1 ELSE 0 END AS Selected" +
                        " FROM osgroupmembership " +
                            " JOIN osgrouprolemembership  ON (osgroupmembership.GroupID = osgrouprolemembership.GroupID AND osgroupmembership.AgentID = osgrouprolemembership.AgentID)" +
                            " JOIN osrole ON ( osgrouprolemembership.RoleID = osrole.RoleID AND osgrouprolemembership.GroupID = osrole.GroupID)" +
                            "                   LEFT JOIN osagent ON (osagent.AgentID = osgroupmembership.AgentID)" +
                        " WHERE osgroupmembership.AgentID = ?agentID ";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?agentID", AgentID);

				if (GroupID != UUID.Zero)
                {
                    query += " AND osgroupmembership.GroupID = ?groupID ";
                    parms.Add("?groupID", GroupID);
                }

                List<Dictionary<string, string>> results = db.QueryWithResults(query, parms);
                foreach (Dictionary<string, string> result in results)
                {
                    foundGroupRoles.Add(this.MapGroupRolesDataFromResult(result));
                }

            }

            return foundGroupRoles;
        }
コード例 #40
0
        public List<OpenSim.Framework.GroupRoleMembersData> GetGroupRoleMembers(GroupRequestID requestID, OpenMetaverse.UUID GroupID)
        {
            string query
                =   " SELECT osrole.RoleID, osgrouprolemembership.AgentID " +
                    " FROM osrole " +
                        " INNER JOIN osgrouprolemembership ON (osrole.GroupID = osgrouprolemembership.GroupID " +
                            " AND osrole.RoleID = osgrouprolemembership.RoleID)" +
                    " WHERE osrole.GroupID = ?groupID";

            Dictionary<string, object> parms = new Dictionary<string, object>();
            parms.Add("?groupID", GroupID);
            List<OpenSim.Framework.GroupRoleMembersData> foundMembersData = new List<OpenSim.Framework.GroupRoleMembersData>();

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return foundMembersData;

                List<Dictionary<string, string>> results = db.QueryWithResults(query, parms);
                foreach (Dictionary<string, string> result in results)
                {
                    foundMembersData.Add(this.MapFoundMembersDataFromResult(result));
                }
            }

            return foundMembersData;
        }
コード例 #41
0
        public OpenSim.Framework.GroupRecord GetGroupRecord(GroupRequestID requestID, OpenMetaverse.UUID GroupID, string GroupName)
        {
            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return null;

                string query =  " SELECT osgroup.GroupID, osgroup.Name, Charter, InsigniaID, FounderID, MembershipFee, " +
                                    "OpenEnrollment, ShowInList, AllowPublish, MaturePublish, OwnerRoleID " +
                                " , count(osrole.RoleID) as GroupRolesCount, count(osgroupmembership.AgentID) as GroupMembershipCount " + 
                                " FROM osgroup " +
                                " LEFT JOIN osrole ON (osgroup.GroupID = osrole.GroupID)" +
                                " LEFT JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID)" +
                                " WHERE ";

                Dictionary<string, object> parms = new Dictionary<string,object>();

                if (GroupID != UUID.Zero)
                {
                    query += " osgroup.GroupID = ?groupID ";
                    parms.Add("?groupID", GroupID);
                }
                else if ((GroupName != null) && (GroupName != string.Empty))
                {
                    query += " osgroup.Name = ?groupName ";
                    parms.Add("?groupName", GroupName);
                }
                else
                {
                    throw new InvalidOperationException("Group name, or group id must be specified");
                }

                query += " GROUP BY osgroup.GroupID, osgroup.name, charter, insigniaID, founderID, membershipFee, openEnrollment, showInList, allowPublish, maturePublish, ownerRoleID ";

                List<Dictionary<string, string>> results = db.QueryWithResults(query, parms);

                if (results.Count == 1 && results[0].ContainsKey("GroupID"))
                {
                    return this.MapGroupRecordFromResult(results[0]);
                }

                // string trace = Environment.StackTrace;
                // m_log.WarnFormat("[GROUPS]: GetGroupRecord: Could not find exact match for {0} '{1}':", GroupID, GroupName);
                // m_log.Warn(trace);
                return null;
            }
        }
コード例 #42
0
        public void UpdateGroup(GroupRequestID requestID, OpenMetaverse.UUID groupID, string charter, bool showInList, OpenMetaverse.UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish)
        {
            if (!TestForPower(requestID, requestID.AgentID, groupID, (ulong)GroupPowers.ChangeIdentity))
            {
                m_log.WarnFormat("[GROUPS]: {0} No permission to change group options", requestID.AgentID);
                return;
            }

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return;

                string query
                    = "UPDATE osgroup " +
                        "SET " +
                        "    Charter = ?charter" +
                        "    , InsigniaID = ?insigniaID" +
                        "    , MembershipFee = ?membershipFee" +
                        "    , OpenEnrollment= ?openEnrollment" +
                        "    , ShowInList    = ?showInList" +
                        "    , AllowPublish  = ?allowPublish" +
                        "    , MaturePublish = ?maturePublish" +
                        " WHERE " +
                        "    GroupID = ?groupID";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?charter", charter);
                parms.Add("?insigniaID", insigniaID);
                parms.Add("?membershipFee", membershipFee);
                parms.Add("?openEnrollment", openEnrollment);
                parms.Add("?showInList", showInList);
                parms.Add("?allowPublish", allowPublish);
                parms.Add("?maturePublish", maturePublish);
                parms.Add("?groupID", groupID);

                db.QueryNoResults(query, parms);
            }
            
        }
コード例 #43
0
        bool TestForPower(GroupRequestID requestID, OpenMetaverse.UUID agentID, OpenMetaverse.UUID groupID, ulong power)
        {
            GroupMembershipData membershipData = GetAgentGroupMembership(requestID, agentID, groupID);
            if (membershipData == null)
            {
                return false;
            }

            if ((membershipData.GroupPowers & power) == 0)
            {
                return false;
            }

            return true;
        }
コード例 #44
0
        // WARNING: This method does not initialize all notice fields, namely the fields stored in the binary bucket.
        // See FlexiGroups.cs method InitializeNoticeFromBucket() for an example.
        public GroupNoticeInfo GetGroupNotice(GroupRequestID requestID, OpenMetaverse.UUID noticeID)
        {
            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return null;

                string query 
                    =   " SELECT GroupID, NoticeID, Timestamp, FromName, Subject, Message, BinaryBucket" +
                        " FROM osgroupnotice" +
                        " WHERE osgroupnotice.NoticeID = ?noticeID";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?noticeID", noticeID);

                List<Dictionary<string, string>> results = db.QueryWithResults(query, parms);
                if (results.Count == 0)
                {
                    return null;
                }
                else
                {
                    return this.MapGroupNoticeFromResult(results[0]);
                }
            }
        }
コード例 #45
0
        public void SetAgentGroupInfo(GroupRequestID requestID, OpenMetaverse.UUID AgentID, OpenMetaverse.UUID GroupID, bool AcceptNotices, bool ListInProfile)
        {
            //the agent making the reuqest must be the target agent
            if (requestID.AgentID != AgentID)
            {
                m_log.WarnFormat("[GROUPS]: {0} No permission to change group info for {1}", requestID.AgentID, AgentID);
                return;
            }

            string query =
                "UPDATE osgroupmembership " +
                "SET AcceptNotices = ?acceptNotices, " +
                    "ListInProfile = ?listInProfile " +
                "WHERE osgroupmembership.GroupID = ?groupID " +
                    "AND osgroupmembership.AgentID = ?agentID ";

            Dictionary<string, object> parms = new Dictionary<string, object>();
            parms.Add("?acceptNotices", AcceptNotices);
            parms.Add("?listInProfile", ListInProfile);
            parms.Add("?groupID", GroupID);
            parms.Add("?agentID", AgentID);

            using (ISimpleDB db = GetConnection())
            {
                if (db != null)
                    db.QueryNoResults(query, parms);
            }
        }
コード例 #46
0
        public List<OpenSim.Framework.GroupMembershipData> GetAgentGroupMemberships(GroupRequestID requestID, OpenMetaverse.UUID AgentID)
        {
            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return new List<OpenSim.Framework.GroupMembershipData>();


                string query =  " SELECT osgroup.GroupID, osgroup.Name as GroupName, osgroup.Charter, osgroup.InsigniaID, osgroup.FounderID, osgroup.MembershipFee, osgroup.OpenEnrollment, osgroup.ShowInList, osgroup.AllowPublish, osgroup.MaturePublish" +
                                " , osgroupmembership.Contribution, osgroupmembership.ListInProfile, osgroupmembership.AcceptNotices" +
                                " , osgroupmembership.SelectedRoleID, osrole.Title" +
                                " , IFNULL(osagent.ActiveGroupID, '" + UUID.Zero + "') AS ActiveGroupID" +
                                " FROM osgroup JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID)" +
                                "              JOIN osrole ON (osgroupmembership.SelectedRoleID = osrole.RoleID AND osgroupmembership.GroupID = osrole.GroupID)" +
                                "         LEFT JOIN osagent ON (osagent.AgentID = osgroupmembership.AgentID)" +
                                " WHERE osgroupmembership.AgentID = ?agentID";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?agentID", AgentID);

                List<Dictionary<string, string>> results = db.QueryWithResults(query, parms);

                //map the group data first into a dict so that it'll be easy to search to fill
                //the group powers
                Dictionary<string, OpenSim.Framework.GroupMembershipData> membershipData = new Dictionary<string, OpenSim.Framework.GroupMembershipData>();
                foreach (Dictionary<string, string> result in results)
                {
                    membershipData.Add(result["GroupID"], this.MapGroupMembershipDataFromResult(result, null));
                }


                //now, assign the group powers returned
                query = " SELECT BIT_OR(osrole.Powers) AS GroupPowers, osgrouprolemembership.GroupID" +
                        " FROM osgrouprolemembership JOIN osrole ON (osgrouprolemembership.GroupID = osrole.GroupID AND osgrouprolemembership.RoleID = osrole.RoleID)" +
                        " WHERE osgrouprolemembership.AgentID = ?agentID " + 
                        " GROUP BY GroupID ";

                results = db.QueryWithResults(query, parms);
                foreach (Dictionary<string, string> result in results)
                {
                    if (result.ContainsKey("GroupID") && membershipData.ContainsKey(result["GroupID"]))
                    {
                        OpenSim.Framework.GroupMembershipData currMembershipData = membershipData[result["GroupID"]];
                        currMembershipData.GroupPowers = ulong.Parse(result["GroupPowers"]);
                    }
                }

                return new List<OpenSim.Framework.GroupMembershipData>(membershipData.Values);
            }
        }
コード例 #47
0
        private bool AgentCanJoinGroup(GroupRequestID requestID, OpenMetaverse.UUID AgentID, OpenMetaverse.UUID GroupID, OpenMetaverse.UUID RoleID)
        {
            GroupRecord record = GetGroupRecord(requestID, GroupID, null);
            if (record == null)
            {
                return false;
            }

            //is the group open enrollment?
            if (record.OpenEnrollment && RoleID == EVERYONE_ROLEID)
            {
                return true;
            }

            //has the agent been invited?
            if (this.AgentHasBeenInvitedToGroup(AgentID, GroupID, RoleID))
            {
                return true;
            }

            //no way, agent can't join
            return false;
        }
コード例 #48
0
        public OpenSim.Framework.GroupMembershipData GetAgentGroupMembership(GroupRequestID requestID, OpenMetaverse.UUID AgentID, OpenMetaverse.UUID GroupID)
        {
            //TODO?  Refactor?  This is very similar to another method, just different params and queries
            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return null;

                string query
                    =   " SELECT osgroup.GroupID, osgroup.Name as GroupName, osgroup.Charter, osgroup.InsigniaID, " +
                            "osgroup.FounderID, osgroup.MembershipFee, osgroup.OpenEnrollment, osgroup.ShowInList, " +
                            "osgroup.AllowPublish, osgroup.MaturePublish, osgroupmembership.Contribution, " +
                            "osgroupmembership.ListInProfile, osgroupmembership.AcceptNotices, " +
                            "osgroupmembership.SelectedRoleID, osrole.Title" +
                        " FROM osgroup JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID)" +
                        "              JOIN osrole ON (osgroupmembership.SelectedRoleID = osrole.RoleID AND osgroupmembership.GroupID = osrole.GroupID)" +
                        " WHERE osgroup.GroupID = ?groupID AND osgroupmembership.AgentID = ?agentID";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?groupID", GroupID);
                parms.Add("?agentID", AgentID);

                List<Dictionary<string, string>> groupResults = db.QueryWithResults(query, parms);
                if (groupResults.Count == 0)
                {
                    // no groups, etc?
                    return null;
                }

                Dictionary<string, string> powersResult = FindGroupPowersForAgent(db, GroupID, AgentID);

                OpenSim.Framework.GroupMembershipData foundMembership
                    = this.MapGroupMembershipDataFromResult(groupResults[0], powersResult);

                return foundMembership;
            }
        }
コード例 #49
0
        public void UpdateGroupRole(GroupRequestID requestID, OpenMetaverse.UUID groupID, OpenMetaverse.UUID roleID, 
            string name, string description, string title, ulong powers)
        {
            if (!TestForPower(requestID, requestID.AgentID, groupID, (ulong)GroupPowers.RoleProperties))
            {
                m_log.WarnFormat("[GROUPS]: {0} No permission to change group roles", requestID.AgentID);
                return;
            }

            string query = "UPDATE osrole SET RoleID = ?roleID ";

            Dictionary<string, object> parms = new Dictionary<string,object>();

            if (name != null)
            {
                query += ", Name = ?name ";
                parms.Add("?name", name);
            }

            if (description != null)
            {
                query += ", Description = ?description ";
                parms.Add("?description", description);
            }

            if (title != null)
            {
                query += ", Title = ?title ";
                parms.Add("?title", title);
            }

            query += ", Powers = ?powers ";
            parms.Add("?powers", powers);
            
            query += " WHERE GroupID = ?groupID AND RoleID = ?roleID";
            parms.Add("?groupID", groupID);
            parms.Add("?roleID", roleID);

            using (ISimpleDB db = GetConnection())
            {
                if (db != null)
                    db.QueryNoResults(query, parms);
            }
        }
コード例 #50
0
        public void SetAgentActiveGroupRole(GroupRequestID requestID, OpenMetaverse.UUID AgentID, OpenMetaverse.UUID GroupID, OpenMetaverse.UUID RoleID)
        {
            //make sure the agent actually has the role they want to activate
            List<GroupRolesData> roles = GetAgentGroupRoles(requestID, AgentID, GroupID);
            bool foundRole = false;
            foreach (GroupRolesData role in roles)
            {
                if (role.RoleID == RoleID)
                {
                    foundRole = true;
                }
            }

            if (!foundRole)
            {
                //they are not in the role they selected
                return;
            }

            string query =
                "UPDATE osgroupmembership " +
                "SET SelectedRoleID = ?roleID " +
                "WHERE osgroupmembership.GroupID = ?groupID " +
                    "AND osgroupmembership.AgentID = ?agentID ";

            Dictionary<string, object> parms = new Dictionary<string, object>();
            parms.Add("?roleID", RoleID);
            parms.Add("?groupID", GroupID);
            parms.Add("?agentID", AgentID);

            using (ISimpleDB db = GetConnection())
            {
                if (db != null)
                    db.QueryNoResults(query, parms);
            }
        }
コード例 #51
0
        public void AddGroupRole(GroupRequestID requestID, OpenMetaverse.UUID groupID, OpenMetaverse.UUID roleID, string name, 
            string description, string title, ulong powers, bool skipPermissionTests)
        {
            if (!skipPermissionTests)
            {
                if (!TestForPower(requestID, requestID.AgentID, groupID, (ulong)GroupPowers.CreateRole))
                {
                    m_log.WarnFormat("[GROUPS]: {0} No permission to add group roles", requestID.AgentID);
                    return;
                }
            }

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return;

                string query
                    =   "INSERT INTO osrole (GroupID, RoleID, Name, Description, Title, Powers) " +
                        "VALUES(?groupID, ?roleID, ?name, ?desc, ?title, ?powers)";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?groupID", groupID);
                parms.Add("?roleID", roleID);
                parms.Add("?name", name);
                parms.Add("?desc", description);
                parms.Add("?title", title);
                parms.Add("?powers", powers);

                db.QueryNoResults(query, parms);
            }
        }
コード例 #52
0
        public OpenSim.Framework.GroupMembershipData GetAgentActiveMembership(GroupRequestID requestID, OpenMetaverse.UUID AgentID)
        {
            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return null;

                string query
                    = " SELECT osgroup.GroupID, osgroup.Name as GroupName, osgroup.Charter, osgroup.InsigniaID, " +
                            "osgroup.FounderID, osgroup.MembershipFee, osgroup.OpenEnrollment, osgroup.ShowInList, " +
                            "osgroup.AllowPublish, osgroup.MaturePublish, osgroupmembership.Contribution, " +
                            "osgroupmembership.ListInProfile, osgroupmembership.AcceptNotices, osgroupmembership.SelectedRoleID, osrole.Title" +
                            " , osagent.ActiveGroupID " +
                        " FROM osagent JOIN osgroup ON (osgroup.GroupID = osagent.ActiveGroupID)" +
                        "              JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID AND osagent.AgentID = osgroupmembership.AgentID)" +
                        "              JOIN osrole ON (osgroupmembership.SelectedRoleID = osrole.RoleID AND osgroupmembership.GroupID = osrole.GroupID)" +
                        " WHERE osagent.AgentID = ?agentID";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?agentID", AgentID);

                List<Dictionary<string, string>> groupResults = db.QueryWithResults(query, parms);
                if (groupResults.Count == 0)
                {
                    //no active group? no groups, etc
                    return null;
                }

                UUID groupID = new UUID(groupResults[0]["GroupID"]);
                Dictionary<string, string> powersResult = FindGroupPowersForAgent(db, groupID, AgentID);

                OpenSim.Framework.GroupMembershipData foundMembership
                    = this.MapGroupMembershipDataFromResult(groupResults[0], powersResult);

                return foundMembership;
            }
        }
コード例 #53
0
        public List<OpenSim.Framework.GroupMembersData> GetGroupMembers(GroupRequestID requestID, OpenMetaverse.UUID GroupID, bool ownersOnly)
        {
            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return new List<OpenSim.Framework.GroupMembersData>();

                string query = " SELECT osgroupmembership.AgentID" +
                                " , osgroupmembership.Contribution, osgroupmembership.ListInProfile, osgroupmembership.AcceptNotices" +
                                " , osgroupmembership.SelectedRoleID, osrole.Title" +
                                " , CASE WHEN OwnerRoleMembership.AgentID IS NOT NULL THEN 1 ELSE 0 END AS IsOwner " +
                                " , agents.agentOnline AS OnlineStatus, agents.logoutTime as LastLogout " +
                                " FROM osgroup JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID)" +
                                "              JOIN osrole ON (osgroupmembership.SelectedRoleID = osrole.RoleID AND osgroupmembership.GroupID = osrole.GroupID)" +
                                "              JOIN osrole AS OwnerRole ON (osgroup.OwnerRoleID  = OwnerRole.RoleID AND osgroup.GroupID  = OwnerRole.GroupID)" +
                                "         LEFT JOIN osgrouprolemembership AS OwnerRoleMembership ON (osgroup.OwnerRoleID       = OwnerRoleMembership.RoleID " +
                                                                              " AND (osgroup.GroupID           = OwnerRoleMembership.GroupID) " +
                                                                              " AND (osgroupmembership.AgentID = OwnerRoleMembership.AgentID))" +
                                " INNER JOIN agents ON agents.uuid = osgroupmembership.AgentID " +
                                " WHERE osgroup.GroupID = ?groupID ";
                
                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?groupID", GroupID);

                List<Dictionary<string, string>> results = db.QueryWithResults(query, parms);

                //map the group member data first into a dict so that it'll be easy to search to fill
                //the agent powers
                Dictionary<string, OpenSim.Framework.GroupMembersData> memberData = new Dictionary<string, OpenSim.Framework.GroupMembersData>();
                foreach (Dictionary<string, string> result in results)
                {
                    GroupMembersData member = this.MapGroupMemberFromResult(result);
                    if (member.IsOwner || !ownersOnly)
                        memberData.Add(result["AgentID"], member);
                }


                //now, assign the agent powers returned
                query = " SELECT BIT_OR(osrole.Powers) AS AgentPowers, osgrouprolemembership.AgentID " +
                        " FROM osgrouprolemembership " +
                            "JOIN osrole ON (osgrouprolemembership.GroupID = osrole.GroupID AND osgrouprolemembership.RoleID = osrole.RoleID) " +
                        " WHERE osgrouprolemembership.GroupID = ?groupID " +
                        " GROUP BY osgrouprolemembership.AgentID ";

                results = db.QueryWithResults(query, parms);
                foreach (Dictionary<string, string> result in results)
                {
                    if (memberData.ContainsKey(result["AgentID"]))
                    {
                        OpenSim.Framework.GroupMembersData currMemberData = memberData[result["AgentID"]];
                        currMemberData.AgentPowers = ulong.Parse(result["AgentPowers"]);
                        memberData[result["AgentID"]] = currMemberData;
                    }
                }

                return new List<OpenSim.Framework.GroupMembersData>(memberData.Values);
            }
        }
コード例 #54
0
        public GroupInviteInfo GetAgentToGroupInvite(GroupRequestID requestID, OpenMetaverse.UUID inviteID)
        {
            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return null;

                string query =  " SELECT GroupID, RoleID, InviteID, AgentID FROM osgroupinvite" +
                                " WHERE osgroupinvite.InviteID = ?inviteID";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?inviteID", inviteID);

                List<Dictionary<string, string>> results = db.QueryWithResults(query, parms);
                if (results.Count == 1)
                {
                    return this.MapGroupInviteInfoFromResult(results[0]);
                }
                else
                {
                    return null;
                }
            }
        }
コード例 #55
0
        public bool AddAgentToGroup(GroupRequestID requestID, OpenMetaverse.UUID AgentID, OpenMetaverse.UUID GroupID, 
            OpenMetaverse.UUID RoleID, bool skipPermissionTests)
        {
            if (GroupID == UUID.Zero)
                return false;   // not a valid group

            if (!skipPermissionTests)
            {
                if (!AgentCanJoinGroup(requestID, AgentID, GroupID, RoleID))
                {
                    m_log.WarnFormat("[GROUPS]: {0} No permission to join group {1}", AgentID, GroupID);
                    return false;
                }
            }

            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return false;

                uint numGroups = GetAgentGroupCount(AgentID);
                if (numGroups >= Constants.MaxGroups)
                {
                    m_log.WarnFormat("[GROUPS]: {0} Already in {1} groups, cannot join group {2}", AgentID, numGroups, GroupID);
                    return false;
                }

                if (!IsAgentMemberOfGroup(db, AgentID, GroupID))
                {
                    this.DoInsertGroupMembership(db, AgentID, GroupID, RoleID);
                }

                //add to everyone role
                this.AddAgentToGroupRole(requestID, requestID.AgentID, AgentID, GroupID, EVERYONE_ROLEID, true);

                if (RoleID != EVERYONE_ROLEID)
                {
                    //specified role
                    this.AddAgentToGroupRole(requestID, requestID.AgentID, AgentID, GroupID, RoleID, true);
                }
            }

            return true;
        }
コード例 #56
0
        private Hashtable XmlRpcCall(GroupRequestID requestID, string function, Hashtable param)
        {
            if (requestID == null)
            {
                requestID = new GroupRequestID();
            }

            param.Add("RequestingAgentID", requestID.AgentID.ToString());
            param.Add("RequestingAgentUserService", requestID.UserServiceURL);
            param.Add("RequestingSessionID", requestID.SessionID.ToString());
            param.Add("ReadKey", m_groupReadKey);
            param.Add("WriteKey", m_groupWriteKey);

            IList parameters = new ArrayList();

            parameters.Add(param);
            XmlRpcResponse resp = null;

            try
            {
                XmlRpcRequest req;

/*
 *              if (!m_disableKeepAlive)
 *                  req = new XmlRpcRequest(function, parameters);
 *              else
 *                  // This seems to solve a major problem on some windows servers
 *                  req = new NoKeepAliveXmlRpcRequest(function, parameters);
 */
                req  = new XmlRpcRequest(function, parameters);
                resp = req.Send(Util.XmlRpcRequestURI(m_serviceURL, function), 10000);
            }
            catch (Exception e)
            {
                m_log.ErrorFormat("[XMLRPCGROUPDATA]: An error has occured while attempting to access the XmlRpcGroups server method: {0}", function);
                m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} ", e.ToString());


                foreach (string key in param.Keys)
                {
                    m_log.WarnFormat("[XMLRPCGROUPDATA]: {0} :: {1}", key, param[key].ToString());
                }

                Hashtable respData = new Hashtable();
                respData.Add("error", e.ToString());
                return(respData);
            }

            if (resp.Value is Hashtable)
            {
                Hashtable respData = (Hashtable)resp.Value;
                if (respData.Contains("error") && !respData.Contains("succeed"))
                {
                    LogRespDataToConsoleError(respData);
                }

                return(respData);
            }

            m_log.ErrorFormat("[XMLRPCGROUPDATA]: The XmlRpc server returned a {1} instead of a hashtable for {0}", function, resp.Value.GetType().ToString());

            if (resp.Value is ArrayList)
            {
                ArrayList al = (ArrayList)resp.Value;
                m_log.ErrorFormat("[XMLRPCGROUPDATA]: Contains {0} elements", al.Count);

                foreach (object o in al)
                {
                    m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} :: {1}", o.GetType().ToString(), o.ToString());
                }
            }
            else
            {
                m_log.ErrorFormat("[XMLRPCGROUPDATA]: Function returned: {0}", resp.Value.ToString());
            }

            Hashtable error = new Hashtable();

            error.Add("error", "invalid return value");
            return(error);
        }
コード例 #57
0
        public void RemoveAgentToGroupInvite(GroupRequestID requestID, OpenMetaverse.UUID inviteID)
        {
            using (ISimpleDB db = GetConnection())
            {
                if (db == null)
                    return;

                string query =  " DELETE FROM osgroupinvite " +
                                " WHERE osgroupinvite.InviteID = ?inviteID";

                Dictionary<string, object> parms = new Dictionary<string, object>();
                parms.Add("?inviteID", inviteID);

                db.QueryNoResults(query, parms);
            }
        }