diff options
author | Charles Krinke | 2009-04-29 22:31:00 +0000 |
---|---|---|
committer | Charles Krinke | 2009-04-29 22:31:00 +0000 |
commit | 8944ab910cc8f62dc6ce567046a92e50b1e2813f (patch) | |
tree | b8042c6ff8bd2598280368cf87d535f8a22af362 | |
parent | Catch another j2k decode exception that can be caused by a bad asset (diff) | |
download | opensim-SC-8944ab910cc8f62dc6ce567046a92e50b1e2813f.zip opensim-SC-8944ab910cc8f62dc6ce567046a92e50b1e2813f.tar.gz opensim-SC-8944ab910cc8f62dc6ce567046a92e50b1e2813f.tar.bz2 opensim-SC-8944ab910cc8f62dc6ce567046a92e50b1e2813f.tar.xz |
Thank you kindly, MCortez for a patch that:
The attached patch provides the necessary infrastructure to support
security and authentication features of the xmlrpc server.
* Read/Write keys for accessing a Group's xmlrpc service.
* Requiring user session verification for write operations.
4 files changed, 285 insertions, 157 deletions
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupDataProvider.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupDataProvider.cs index 3fd6116..43cccf4 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupDataProvider.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupDataProvider.cs | |||
@@ -36,42 +36,42 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
36 | { | 36 | { |
37 | interface IGroupDataProvider | 37 | interface IGroupDataProvider |
38 | { | 38 | { |
39 | UUID CreateGroup(string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish, UUID founderID); | 39 | UUID CreateGroup(GroupRequestID requestID, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish, UUID founderID); |
40 | void UpdateGroup(UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish); | 40 | void UpdateGroup(GroupRequestID requestID, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish); |
41 | GroupRecord GetGroupRecord(UUID GroupID, string GroupName); | 41 | GroupRecord GetGroupRecord(GroupRequestID requestID, UUID GroupID, string GroupName); |
42 | List<DirGroupsReplyData> FindGroups(string search); | 42 | List<DirGroupsReplyData> FindGroups(GroupRequestID requestID, string search); |
43 | List<GroupMembersData> GetGroupMembers(UUID GroupID); | 43 | List<GroupMembersData> GetGroupMembers(GroupRequestID requestID, UUID GroupID); |
44 | 44 | ||
45 | void AddGroupRole(UUID groupID, UUID roleID, string name, string description, string title, ulong powers); | 45 | void AddGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers); |
46 | void UpdateGroupRole(UUID groupID, UUID roleID, string name, string description, string title, ulong powers); | 46 | void UpdateGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers); |
47 | void RemoveGroupRole(UUID groupID, UUID roleID); | 47 | void RemoveGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID); |
48 | List<GroupRolesData> GetGroupRoles(UUID GroupID); | 48 | List<GroupRolesData> GetGroupRoles(GroupRequestID requestID, UUID GroupID); |
49 | List<GroupRoleMembersData> GetGroupRoleMembers(UUID GroupID); | 49 | List<GroupRoleMembersData> GetGroupRoleMembers(GroupRequestID requestID, UUID GroupID); |
50 | 50 | ||
51 | void AddAgentToGroup(UUID AgentID, UUID GroupID, UUID RoleID); | 51 | void AddAgentToGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID); |
52 | void RemoveAgentFromGroup(UUID AgentID, UUID GroupID); | 52 | void RemoveAgentFromGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID); |
53 | 53 | ||
54 | void AddAgentToGroupInvite(UUID inviteID, UUID groupID, UUID roleID, UUID agentID); | 54 | void AddAgentToGroupInvite(GroupRequestID requestID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID); |
55 | GroupInviteInfo GetAgentToGroupInvite(UUID inviteID); | 55 | GroupInviteInfo GetAgentToGroupInvite(GroupRequestID requestID, UUID inviteID); |
56 | void RemoveAgentToGroupInvite(UUID inviteID); | 56 | void RemoveAgentToGroupInvite(GroupRequestID requestID, UUID inviteID); |
57 | 57 | ||
58 | 58 | ||
59 | void AddAgentToGroupRole(UUID AgentID, UUID GroupID, UUID RoleID); | 59 | void AddAgentToGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID); |
60 | void RemoveAgentFromGroupRole(UUID AgentID, UUID GroupID, UUID RoleID); | 60 | void RemoveAgentFromGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID); |
61 | List<GroupRolesData> GetAgentGroupRoles(UUID AgentID, UUID GroupID); | 61 | List<GroupRolesData> GetAgentGroupRoles(GroupRequestID requestID, UUID AgentID, UUID GroupID); |
62 | 62 | ||
63 | void SetAgentActiveGroup(UUID AgentID, UUID GroupID); | 63 | void SetAgentActiveGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID); |
64 | GroupMembershipData GetAgentActiveMembership(UUID AgentID); | 64 | GroupMembershipData GetAgentActiveMembership(GroupRequestID requestID, UUID AgentID); |
65 | 65 | ||
66 | void SetAgentActiveGroupRole(UUID AgentID, UUID GroupID, UUID RoleID); | 66 | void SetAgentActiveGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID); |
67 | void SetAgentGroupInfo(UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile); | 67 | void SetAgentGroupInfo(GroupRequestID requestID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile); |
68 | 68 | ||
69 | GroupMembershipData GetAgentGroupMembership(UUID AgentID, UUID GroupID); | 69 | GroupMembershipData GetAgentGroupMembership(GroupRequestID requestID, UUID AgentID, UUID GroupID); |
70 | List<GroupMembershipData> GetAgentGroupMemberships(UUID AgentID); | 70 | List<GroupMembershipData> GetAgentGroupMemberships(GroupRequestID requestID, UUID AgentID); |
71 | 71 | ||
72 | void AddGroupNotice(UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket); | 72 | void AddGroupNotice(GroupRequestID requestID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket); |
73 | GroupNoticeInfo GetGroupNotice(UUID noticeID); | 73 | GroupNoticeInfo GetGroupNotice(GroupRequestID requestID, UUID noticeID); |
74 | List<GroupNoticeData> GetGroupNotices(UUID GroupID); | 74 | List<GroupNoticeData> GetGroupNotices(GroupRequestID requestID, UUID GroupID); |
75 | } | 75 | } |
76 | 76 | ||
77 | public class GroupInviteInfo | 77 | public class GroupInviteInfo |
@@ -82,4 +82,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
82 | public UUID InviteID = UUID.Zero; | 82 | public UUID InviteID = UUID.Zero; |
83 | } | 83 | } |
84 | 84 | ||
85 | public class GroupRequestID | ||
86 | { | ||
87 | public UUID AgentID = UUID.Zero; | ||
88 | public string UserServiceURL = string.Empty; | ||
89 | public UUID SessionID = UUID.Zero; | ||
90 | } | ||
85 | } | 91 | } |
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs index d941118..a7ef40a 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs | |||
@@ -61,7 +61,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
61 | 61 | ||
62 | private bool m_disableKeepAlive = false; | 62 | private bool m_disableKeepAlive = false; |
63 | 63 | ||
64 | public XmlRpcGroupDataProvider(string serviceURL, bool disableKeepAlive) | 64 | private string m_groupReadKey = string.Empty; |
65 | private string m_groupWriteKey = string.Empty; | ||
66 | |||
67 | public XmlRpcGroupDataProvider(string serviceURL, bool disableKeepAlive, string groupReadKey, string groupWriteKey) | ||
65 | { | 68 | { |
66 | m_serviceURL = serviceURL.Trim(); | 69 | m_serviceURL = serviceURL.Trim(); |
67 | m_disableKeepAlive = disableKeepAlive; | 70 | m_disableKeepAlive = disableKeepAlive; |
@@ -71,12 +74,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
71 | { | 74 | { |
72 | throw new Exception("Please specify a valid ServiceURL for XmlRpcGroupDataProvider in OpenSim.ini, [Groups], XmlRpcServiceURL"); | 75 | throw new Exception("Please specify a valid ServiceURL for XmlRpcGroupDataProvider in OpenSim.ini, [Groups], XmlRpcServiceURL"); |
73 | } | 76 | } |
77 | |||
78 | m_groupReadKey = groupReadKey; | ||
79 | m_groupWriteKey = groupWriteKey; | ||
74 | } | 80 | } |
75 | 81 | ||
76 | /// <summary> | 82 | /// <summary> |
77 | /// 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. | 83 | /// 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. |
78 | /// </summary> | 84 | /// </summary> |
79 | public UUID CreateGroup(string name, string charter, bool showInList, UUID insigniaID, | 85 | public UUID CreateGroup(GroupRequestID requestID, string name, string charter, bool showInList, UUID insigniaID, |
80 | int membershipFee, bool openEnrollment, bool allowPublish, | 86 | int membershipFee, bool openEnrollment, bool allowPublish, |
81 | bool maturePublish, UUID founderID) | 87 | bool maturePublish, UUID founderID) |
82 | { | 88 | { |
@@ -145,7 +151,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
145 | | GroupPowers.VoteOnProposal; | 151 | | GroupPowers.VoteOnProposal; |
146 | param["OwnersPowers"] = ((ulong)OwnerPowers).ToString(); | 152 | param["OwnersPowers"] = ((ulong)OwnerPowers).ToString(); |
147 | 153 | ||
148 | Hashtable respData = XmlRpcCall("groups.createGroup", param); | 154 | |
155 | |||
156 | |||
157 | Hashtable respData = XmlRpcCall(requestID, "groups.createGroup", param); | ||
149 | 158 | ||
150 | if (respData.Contains("error")) | 159 | if (respData.Contains("error")) |
151 | { | 160 | { |
@@ -157,7 +166,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
157 | return UUID.Parse((string)respData["GroupID"]); | 166 | return UUID.Parse((string)respData["GroupID"]); |
158 | } | 167 | } |
159 | 168 | ||
160 | public void UpdateGroup(UUID groupID, string charter, bool showInList, | 169 | public void UpdateGroup(GroupRequestID requestID, UUID groupID, string charter, bool showInList, |
161 | UUID insigniaID, int membershipFee, bool openEnrollment, | 170 | UUID insigniaID, int membershipFee, bool openEnrollment, |
162 | bool allowPublish, bool maturePublish) | 171 | bool allowPublish, bool maturePublish) |
163 | { | 172 | { |
@@ -171,10 +180,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
171 | param["AllowPublish"] = allowPublish == true ? 1 : 0; | 180 | param["AllowPublish"] = allowPublish == true ? 1 : 0; |
172 | param["MaturePublish"] = maturePublish == true ? 1 : 0; | 181 | param["MaturePublish"] = maturePublish == true ? 1 : 0; |
173 | 182 | ||
174 | XmlRpcCall("groups.updateGroup", param); | 183 | XmlRpcCall(requestID, "groups.updateGroup", param); |
175 | } | 184 | } |
176 | 185 | ||
177 | public void AddGroupRole(UUID groupID, UUID roleID, string name, string description, | 186 | public void AddGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description, |
178 | string title, ulong powers) | 187 | string title, ulong powers) |
179 | { | 188 | { |
180 | Hashtable param = new Hashtable(); | 189 | Hashtable param = new Hashtable(); |
@@ -185,19 +194,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
185 | param["Title"] = title; | 194 | param["Title"] = title; |
186 | param["Powers"] = powers.ToString(); | 195 | param["Powers"] = powers.ToString(); |
187 | 196 | ||
188 | XmlRpcCall("groups.addRoleToGroup", param); | 197 | XmlRpcCall(requestID, "groups.addRoleToGroup", param); |
189 | } | 198 | } |
190 | 199 | ||
191 | public void RemoveGroupRole(UUID groupID, UUID roleID) | 200 | public void RemoveGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID) |
192 | { | 201 | { |
193 | Hashtable param = new Hashtable(); | 202 | Hashtable param = new Hashtable(); |
194 | param["GroupID"] = groupID.ToString(); | 203 | param["GroupID"] = groupID.ToString(); |
195 | param["RoleID"] = roleID.ToString(); | 204 | param["RoleID"] = roleID.ToString(); |
196 | 205 | ||
197 | XmlRpcCall("groups.removeRoleFromGroup", param); | 206 | XmlRpcCall(requestID, "groups.removeRoleFromGroup", param); |
198 | } | 207 | } |
199 | 208 | ||
200 | public void UpdateGroupRole(UUID groupID, UUID roleID, string name, string description, | 209 | public void UpdateGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description, |
201 | string title, ulong powers) | 210 | string title, ulong powers) |
202 | { | 211 | { |
203 | Hashtable param = new Hashtable(); | 212 | Hashtable param = new Hashtable(); |
@@ -217,10 +226,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
217 | } | 226 | } |
218 | param["Powers"] = powers.ToString(); | 227 | param["Powers"] = powers.ToString(); |
219 | 228 | ||
220 | XmlRpcCall("groups.updateGroupRole", param); | 229 | XmlRpcCall(requestID, "groups.updateGroupRole", param); |
221 | } | 230 | } |
222 | 231 | ||
223 | public GroupRecord GetGroupRecord(UUID GroupID, string GroupName) | 232 | public GroupRecord GetGroupRecord(GroupRequestID requestID, UUID GroupID, string GroupName) |
224 | { | 233 | { |
225 | Hashtable param = new Hashtable(); | 234 | Hashtable param = new Hashtable(); |
226 | if (GroupID != UUID.Zero) | 235 | if (GroupID != UUID.Zero) |
@@ -232,8 +241,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
232 | param["Name"] = GroupName.ToString(); | 241 | param["Name"] = GroupName.ToString(); |
233 | } | 242 | } |
234 | 243 | ||
235 | 244 | Hashtable respData = XmlRpcCall(requestID, "groups.getGroup", param); | |
236 | Hashtable respData = XmlRpcCall("groups.getGroup", param); | ||
237 | 245 | ||
238 | if (respData.Contains("error")) | 246 | if (respData.Contains("error")) |
239 | { | 247 | { |
@@ -241,15 +249,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
241 | } | 249 | } |
242 | 250 | ||
243 | return GroupProfileHashtableToGroupRecord(respData); | 251 | return GroupProfileHashtableToGroupRecord(respData); |
252 | |||
244 | } | 253 | } |
245 | 254 | ||
246 | public GroupProfileData GetMemberGroupProfile(UUID GroupID, UUID AgentID) | 255 | public GroupProfileData GetMemberGroupProfile(GroupRequestID requestID, UUID GroupID, UUID AgentID) |
247 | { | 256 | { |
248 | Hashtable param = new Hashtable(); | 257 | Hashtable param = new Hashtable(); |
249 | param["GroupID"] = GroupID.ToString(); | 258 | param["GroupID"] = GroupID.ToString(); |
250 | 259 | ||
251 | 260 | Hashtable respData = XmlRpcCall(requestID, "groups.getGroup", param); | |
252 | Hashtable respData = XmlRpcCall("groups.getGroup", param); | ||
253 | 261 | ||
254 | if (respData.Contains("error")) | 262 | if (respData.Contains("error")) |
255 | { | 263 | { |
@@ -257,13 +265,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
257 | return new GroupProfileData(); | 265 | return new GroupProfileData(); |
258 | } | 266 | } |
259 | 267 | ||
260 | GroupMembershipData MemberInfo = GetAgentGroupMembership(AgentID, GroupID); | 268 | GroupMembershipData MemberInfo = GetAgentGroupMembership(requestID, AgentID, GroupID); |
261 | GroupProfileData MemberGroupProfile = GroupProfileHashtableToGroupProfileData(respData); | 269 | GroupProfileData MemberGroupProfile = GroupProfileHashtableToGroupProfileData(respData); |
262 | 270 | ||
263 | MemberGroupProfile.MemberTitle = MemberInfo.GroupTitle; | 271 | MemberGroupProfile.MemberTitle = MemberInfo.GroupTitle; |
264 | MemberGroupProfile.PowersMask = MemberInfo.GroupPowers; | 272 | MemberGroupProfile.PowersMask = MemberInfo.GroupPowers; |
265 | 273 | ||
266 | return MemberGroupProfile; | 274 | return MemberGroupProfile; |
275 | |||
267 | } | 276 | } |
268 | 277 | ||
269 | private GroupProfileData GroupProfileHashtableToGroupProfileData(Hashtable groupProfile) | 278 | private GroupProfileData GroupProfileHashtableToGroupProfileData(Hashtable groupProfile) |
@@ -314,26 +323,26 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
314 | return group; | 323 | return group; |
315 | } | 324 | } |
316 | 325 | ||
317 | public void SetAgentActiveGroup(UUID AgentID, UUID GroupID) | 326 | public void SetAgentActiveGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID) |
318 | { | 327 | { |
319 | Hashtable param = new Hashtable(); | 328 | Hashtable param = new Hashtable(); |
320 | param["AgentID"] = AgentID.ToString(); | 329 | param["AgentID"] = AgentID.ToString(); |
321 | param["GroupID"] = GroupID.ToString(); | 330 | param["GroupID"] = GroupID.ToString(); |
322 | 331 | ||
323 | XmlRpcCall("groups.setAgentActiveGroup", param); | 332 | XmlRpcCall(requestID, "groups.setAgentActiveGroup", param); |
324 | } | 333 | } |
325 | 334 | ||
326 | public void SetAgentActiveGroupRole(UUID AgentID, UUID GroupID, UUID RoleID) | 335 | public void SetAgentActiveGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID) |
327 | { | 336 | { |
328 | Hashtable param = new Hashtable(); | 337 | Hashtable param = new Hashtable(); |
329 | param["AgentID"] = AgentID.ToString(); | 338 | param["AgentID"] = AgentID.ToString(); |
330 | param["GroupID"] = GroupID.ToString(); | 339 | param["GroupID"] = GroupID.ToString(); |
331 | param["SelectedRoleID"] = RoleID.ToString(); | 340 | param["SelectedRoleID"] = RoleID.ToString(); |
332 | 341 | ||
333 | XmlRpcCall("groups.setAgentGroupInfo", param); | 342 | XmlRpcCall(requestID, "groups.setAgentGroupInfo", param); |
334 | } | 343 | } |
335 | 344 | ||
336 | public void SetAgentGroupInfo(UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile) | 345 | public void SetAgentGroupInfo(GroupRequestID requestID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile) |
337 | { | 346 | { |
338 | Hashtable param = new Hashtable(); | 347 | Hashtable param = new Hashtable(); |
339 | param["AgentID"] = AgentID.ToString(); | 348 | param["AgentID"] = AgentID.ToString(); |
@@ -341,10 +350,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
341 | param["AcceptNotices"] = AcceptNotices ? "1" : "0"; | 350 | param["AcceptNotices"] = AcceptNotices ? "1" : "0"; |
342 | param["ListInProfile"] = ListInProfile ? "1" : "0"; | 351 | param["ListInProfile"] = ListInProfile ? "1" : "0"; |
343 | 352 | ||
344 | XmlRpcCall("groups.setAgentGroupInfo", param); | 353 | XmlRpcCall(requestID, "groups.setAgentGroupInfo", param); |
354 | |||
345 | } | 355 | } |
346 | 356 | ||
347 | public void AddAgentToGroupInvite(UUID inviteID, UUID groupID, UUID roleID, UUID agentID) | 357 | public void AddAgentToGroupInvite(GroupRequestID requestID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID) |
348 | { | 358 | { |
349 | Hashtable param = new Hashtable(); | 359 | Hashtable param = new Hashtable(); |
350 | param["InviteID"] = inviteID.ToString(); | 360 | param["InviteID"] = inviteID.ToString(); |
@@ -352,15 +362,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
352 | param["RoleID"] = roleID.ToString(); | 362 | param["RoleID"] = roleID.ToString(); |
353 | param["GroupID"] = groupID.ToString(); | 363 | param["GroupID"] = groupID.ToString(); |
354 | 364 | ||
355 | XmlRpcCall("groups.addAgentToGroupInvite", param); | 365 | XmlRpcCall(requestID, "groups.addAgentToGroupInvite", param); |
366 | |||
356 | } | 367 | } |
357 | 368 | ||
358 | public GroupInviteInfo GetAgentToGroupInvite(UUID inviteID) | 369 | public GroupInviteInfo GetAgentToGroupInvite(GroupRequestID requestID, UUID inviteID) |
359 | { | 370 | { |
360 | Hashtable param = new Hashtable(); | 371 | Hashtable param = new Hashtable(); |
361 | param["InviteID"] = inviteID.ToString(); | 372 | param["InviteID"] = inviteID.ToString(); |
362 | 373 | ||
363 | Hashtable respData = XmlRpcCall("groups.getAgentToGroupInvite", param); | 374 | Hashtable respData = XmlRpcCall(requestID, "groups.getAgentToGroupInvite", param); |
364 | 375 | ||
365 | if (respData.Contains("error")) | 376 | if (respData.Contains("error")) |
366 | { | 377 | { |
@@ -376,59 +387,60 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
376 | return inviteInfo; | 387 | return inviteInfo; |
377 | } | 388 | } |
378 | 389 | ||
379 | public void RemoveAgentToGroupInvite(UUID inviteID) | 390 | public void RemoveAgentToGroupInvite(GroupRequestID requestID, UUID inviteID) |
380 | { | 391 | { |
381 | Hashtable param = new Hashtable(); | 392 | Hashtable param = new Hashtable(); |
382 | param["InviteID"] = inviteID.ToString(); | 393 | param["InviteID"] = inviteID.ToString(); |
383 | 394 | ||
384 | XmlRpcCall("groups.removeAgentToGroupInvite", param); | 395 | XmlRpcCall(requestID, "groups.removeAgentToGroupInvite", param); |
385 | } | 396 | } |
386 | 397 | ||
387 | public void AddAgentToGroup(UUID AgentID, UUID GroupID, UUID RoleID) | 398 | public void AddAgentToGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID) |
388 | { | 399 | { |
389 | Hashtable param = new Hashtable(); | 400 | Hashtable param = new Hashtable(); |
390 | param["AgentID"] = AgentID.ToString(); | 401 | param["AgentID"] = AgentID.ToString(); |
391 | param["GroupID"] = GroupID.ToString(); | 402 | param["GroupID"] = GroupID.ToString(); |
392 | param["RoleID"] = RoleID.ToString(); | 403 | param["RoleID"] = RoleID.ToString(); |
393 | 404 | ||
394 | XmlRpcCall("groups.addAgentToGroup", param); | 405 | XmlRpcCall(requestID, "groups.addAgentToGroup", param); |
395 | } | 406 | } |
396 | 407 | ||
397 | public void RemoveAgentFromGroup(UUID AgentID, UUID GroupID) | 408 | public void RemoveAgentFromGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID) |
398 | { | 409 | { |
399 | Hashtable param = new Hashtable(); | 410 | Hashtable param = new Hashtable(); |
400 | param["AgentID"] = AgentID.ToString(); | 411 | param["AgentID"] = AgentID.ToString(); |
401 | param["GroupID"] = GroupID.ToString(); | 412 | param["GroupID"] = GroupID.ToString(); |
402 | 413 | ||
403 | XmlRpcCall("groups.removeAgentFromGroup", param); | 414 | XmlRpcCall(requestID, "groups.removeAgentFromGroup", param); |
404 | } | 415 | } |
405 | 416 | ||
406 | public void AddAgentToGroupRole(UUID AgentID, UUID GroupID, UUID RoleID) | 417 | public void AddAgentToGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID) |
407 | { | 418 | { |
408 | Hashtable param = new Hashtable(); | 419 | Hashtable param = new Hashtable(); |
409 | param["AgentID"] = AgentID.ToString(); | 420 | param["AgentID"] = AgentID.ToString(); |
410 | param["GroupID"] = GroupID.ToString(); | 421 | param["GroupID"] = GroupID.ToString(); |
411 | param["RoleID"] = RoleID.ToString(); | 422 | param["RoleID"] = RoleID.ToString(); |
412 | 423 | ||
413 | XmlRpcCall("groups.addAgentToGroupRole", param); | 424 | XmlRpcCall(requestID, "groups.addAgentToGroupRole", param); |
414 | } | 425 | } |
415 | 426 | ||
416 | public void RemoveAgentFromGroupRole(UUID AgentID, UUID GroupID, UUID RoleID) | 427 | public void RemoveAgentFromGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID) |
417 | { | 428 | { |
418 | Hashtable param = new Hashtable(); | 429 | Hashtable param = new Hashtable(); |
419 | param["AgentID"] = AgentID.ToString(); | 430 | param["AgentID"] = AgentID.ToString(); |
420 | param["GroupID"] = GroupID.ToString(); | 431 | param["GroupID"] = GroupID.ToString(); |
421 | param["RoleID"] = RoleID.ToString(); | 432 | param["RoleID"] = RoleID.ToString(); |
422 | 433 | ||
423 | XmlRpcCall("groups.removeAgentFromGroupRole", param); | 434 | XmlRpcCall(requestID, "groups.removeAgentFromGroupRole", param); |
424 | } | 435 | } |
425 | 436 | ||
426 | public List<DirGroupsReplyData> FindGroups(string search) | 437 | |
438 | public List<DirGroupsReplyData> FindGroups(GroupRequestID requestID, string search) | ||
427 | { | 439 | { |
428 | Hashtable param = new Hashtable(); | 440 | Hashtable param = new Hashtable(); |
429 | param["Search"] = search; | 441 | param["Search"] = search; |
430 | 442 | ||
431 | Hashtable respData = XmlRpcCall("groups.findGroups", param); | 443 | Hashtable respData = XmlRpcCall(requestID, "groups.findGroups", param); |
432 | 444 | ||
433 | List<DirGroupsReplyData> findings = new List<DirGroupsReplyData>(); | 445 | List<DirGroupsReplyData> findings = new List<DirGroupsReplyData>(); |
434 | 446 | ||
@@ -450,13 +462,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
450 | return findings; | 462 | return findings; |
451 | } | 463 | } |
452 | 464 | ||
453 | public GroupMembershipData GetAgentGroupMembership(UUID AgentID, UUID GroupID) | 465 | public GroupMembershipData GetAgentGroupMembership(GroupRequestID requestID, UUID AgentID, UUID GroupID) |
454 | { | 466 | { |
455 | Hashtable param = new Hashtable(); | 467 | Hashtable param = new Hashtable(); |
456 | param["AgentID"] = AgentID.ToString(); | 468 | param["AgentID"] = AgentID.ToString(); |
457 | param["GroupID"] = GroupID.ToString(); | 469 | param["GroupID"] = GroupID.ToString(); |
458 | 470 | ||
459 | Hashtable respData = XmlRpcCall("groups.getAgentGroupMembership", param); | 471 | Hashtable respData = XmlRpcCall(requestID, "groups.getAgentGroupMembership", param); |
460 | 472 | ||
461 | if (respData.Contains("error")) | 473 | if (respData.Contains("error")) |
462 | { | 474 | { |
@@ -468,12 +480,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
468 | return data; | 480 | return data; |
469 | } | 481 | } |
470 | 482 | ||
471 | public GroupMembershipData GetAgentActiveMembership(UUID AgentID) | 483 | public GroupMembershipData GetAgentActiveMembership(GroupRequestID requestID, UUID AgentID) |
472 | { | 484 | { |
473 | Hashtable param = new Hashtable(); | 485 | Hashtable param = new Hashtable(); |
474 | param["AgentID"] = AgentID.ToString(); | 486 | param["AgentID"] = AgentID.ToString(); |
475 | 487 | ||
476 | Hashtable respData = XmlRpcCall("groups.getAgentActiveMembership", param); | 488 | Hashtable respData = XmlRpcCall(requestID, "groups.getAgentActiveMembership", param); |
477 | 489 | ||
478 | if (respData.Contains("error")) | 490 | if (respData.Contains("error")) |
479 | { | 491 | { |
@@ -483,12 +495,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
483 | return HashTableToGroupMembershipData(respData); | 495 | return HashTableToGroupMembershipData(respData); |
484 | } | 496 | } |
485 | 497 | ||
486 | public List<GroupMembershipData> GetAgentGroupMemberships(UUID AgentID) | 498 | |
499 | public List<GroupMembershipData> GetAgentGroupMemberships(GroupRequestID requestID, UUID AgentID) | ||
487 | { | 500 | { |
488 | Hashtable param = new Hashtable(); | 501 | Hashtable param = new Hashtable(); |
489 | param["AgentID"] = AgentID.ToString(); | 502 | param["AgentID"] = AgentID.ToString(); |
490 | 503 | ||
491 | Hashtable respData = XmlRpcCall("groups.getAgentGroupMemberships", param); | 504 | Hashtable respData = XmlRpcCall(requestID, "groups.getAgentGroupMemberships", param); |
492 | 505 | ||
493 | List<GroupMembershipData> memberships = new List<GroupMembershipData>(); | 506 | List<GroupMembershipData> memberships = new List<GroupMembershipData>(); |
494 | 507 | ||
@@ -503,13 +516,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
503 | return memberships; | 516 | return memberships; |
504 | } | 517 | } |
505 | 518 | ||
506 | public List<GroupRolesData> GetAgentGroupRoles(UUID AgentID, UUID GroupID) | 519 | public List<GroupRolesData> GetAgentGroupRoles(GroupRequestID requestID, UUID AgentID, UUID GroupID) |
507 | { | 520 | { |
508 | Hashtable param = new Hashtable(); | 521 | Hashtable param = new Hashtable(); |
509 | param["AgentID"] = AgentID.ToString(); | 522 | param["AgentID"] = AgentID.ToString(); |
510 | param["GroupID"] = GroupID.ToString(); | 523 | param["GroupID"] = GroupID.ToString(); |
511 | 524 | ||
512 | Hashtable respData = XmlRpcCall("groups.getAgentRoles", param); | 525 | Hashtable respData = XmlRpcCall(requestID, "groups.getAgentRoles", param); |
513 | 526 | ||
514 | List<GroupRolesData> Roles = new List<GroupRolesData>(); | 527 | List<GroupRolesData> Roles = new List<GroupRolesData>(); |
515 | 528 | ||
@@ -531,14 +544,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
531 | } | 544 | } |
532 | 545 | ||
533 | return Roles; | 546 | return Roles; |
547 | |||
548 | |||
534 | } | 549 | } |
535 | 550 | ||
536 | public List<GroupRolesData> GetGroupRoles(UUID GroupID) | 551 | public List<GroupRolesData> GetGroupRoles(GroupRequestID requestID, UUID GroupID) |
537 | { | 552 | { |
538 | Hashtable param = new Hashtable(); | 553 | Hashtable param = new Hashtable(); |
539 | param["GroupID"] = GroupID.ToString(); | 554 | param["GroupID"] = GroupID.ToString(); |
540 | 555 | ||
541 | Hashtable respData = XmlRpcCall("groups.getGroupRoles", param); | 556 | Hashtable respData = XmlRpcCall(requestID, "groups.getGroupRoles", param); |
542 | 557 | ||
543 | List<GroupRolesData> Roles = new List<GroupRolesData>(); | 558 | List<GroupRolesData> Roles = new List<GroupRolesData>(); |
544 | 559 | ||
@@ -561,6 +576,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
561 | } | 576 | } |
562 | 577 | ||
563 | return Roles; | 578 | return Roles; |
579 | |||
564 | } | 580 | } |
565 | 581 | ||
566 | private static GroupMembershipData HashTableToGroupMembershipData(Hashtable respData) | 582 | private static GroupMembershipData HashTableToGroupMembershipData(Hashtable respData) |
@@ -598,12 +614,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
598 | return data; | 614 | return data; |
599 | } | 615 | } |
600 | 616 | ||
601 | public List<GroupMembersData> GetGroupMembers(UUID GroupID) | 617 | public List<GroupMembersData> GetGroupMembers(GroupRequestID requestID, UUID GroupID) |
602 | { | 618 | { |
603 | Hashtable param = new Hashtable(); | 619 | Hashtable param = new Hashtable(); |
604 | param["GroupID"] = GroupID.ToString(); | 620 | param["GroupID"] = GroupID.ToString(); |
605 | 621 | ||
606 | Hashtable respData = XmlRpcCall("groups.getGroupMembers", param); | 622 | Hashtable respData = XmlRpcCall(requestID, "groups.getGroupMembers", param); |
607 | 623 | ||
608 | List<GroupMembersData> members = new List<GroupMembersData>(); | 624 | List<GroupMembersData> members = new List<GroupMembersData>(); |
609 | 625 | ||
@@ -628,14 +644,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
628 | } | 644 | } |
629 | 645 | ||
630 | return members; | 646 | return members; |
647 | |||
631 | } | 648 | } |
632 | 649 | ||
633 | public List<GroupRoleMembersData> GetGroupRoleMembers(UUID GroupID) | 650 | public List<GroupRoleMembersData> GetGroupRoleMembers(GroupRequestID requestID, UUID GroupID) |
634 | { | 651 | { |
635 | Hashtable param = new Hashtable(); | 652 | Hashtable param = new Hashtable(); |
636 | param["GroupID"] = GroupID.ToString(); | 653 | param["GroupID"] = GroupID.ToString(); |
637 | 654 | ||
638 | Hashtable respData = XmlRpcCall("groups.getGroupRoleMembers", param); | 655 | Hashtable respData = XmlRpcCall(requestID, "groups.getGroupRoleMembers", param); |
639 | 656 | ||
640 | List<GroupRoleMembersData> members = new List<GroupRoleMembersData>(); | 657 | List<GroupRoleMembersData> members = new List<GroupRoleMembersData>(); |
641 | 658 | ||
@@ -651,16 +668,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
651 | members.Add(data); | 668 | members.Add(data); |
652 | } | 669 | } |
653 | } | 670 | } |
654 | |||
655 | return members; | 671 | return members; |
656 | } | 672 | } |
657 | 673 | ||
658 | public List<GroupNoticeData> GetGroupNotices(UUID GroupID) | 674 | public List<GroupNoticeData> GetGroupNotices(GroupRequestID requestID, UUID GroupID) |
659 | { | 675 | { |
660 | Hashtable param = new Hashtable(); | 676 | Hashtable param = new Hashtable(); |
661 | param["GroupID"] = GroupID.ToString(); | 677 | param["GroupID"] = GroupID.ToString(); |
662 | 678 | ||
663 | Hashtable respData = XmlRpcCall("groups.getGroupNotices", param); | 679 | Hashtable respData = XmlRpcCall(requestID, "groups.getGroupNotices", param); |
664 | 680 | ||
665 | List<GroupNoticeData> values = new List<GroupNoticeData>(); | 681 | List<GroupNoticeData> values = new List<GroupNoticeData>(); |
666 | 682 | ||
@@ -679,16 +695,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
679 | values.Add(data); | 695 | values.Add(data); |
680 | } | 696 | } |
681 | } | 697 | } |
682 | |||
683 | return values; | 698 | return values; |
699 | |||
684 | } | 700 | } |
685 | 701 | public GroupNoticeInfo GetGroupNotice(GroupRequestID requestID, UUID noticeID) | |
686 | public GroupNoticeInfo GetGroupNotice(UUID noticeID) | ||
687 | { | 702 | { |
688 | Hashtable param = new Hashtable(); | 703 | Hashtable param = new Hashtable(); |
689 | param["NoticeID"] = noticeID.ToString(); | 704 | param["NoticeID"] = noticeID.ToString(); |
690 | 705 | ||
691 | Hashtable respData = XmlRpcCall("groups.getGroupNotice", param); | 706 | Hashtable respData = XmlRpcCall(requestID, "groups.getGroupNotice", param); |
692 | 707 | ||
693 | 708 | ||
694 | if (respData.Contains("error")) | 709 | if (respData.Contains("error")) |
@@ -714,8 +729,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
714 | 729 | ||
715 | return data; | 730 | return data; |
716 | } | 731 | } |
717 | 732 | public void AddGroupNotice(GroupRequestID requestID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket) | |
718 | public void AddGroupNotice(UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket) | ||
719 | { | 733 | { |
720 | string binBucket = OpenMetaverse.Utils.BytesToHexString(binaryBucket, ""); | 734 | string binBucket = OpenMetaverse.Utils.BytesToHexString(binaryBucket, ""); |
721 | 735 | ||
@@ -728,11 +742,24 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
728 | param["BinaryBucket"] = binBucket; | 742 | param["BinaryBucket"] = binBucket; |
729 | param["TimeStamp"] = ((uint)Util.UnixTimeSinceEpoch()).ToString(); | 743 | param["TimeStamp"] = ((uint)Util.UnixTimeSinceEpoch()).ToString(); |
730 | 744 | ||
731 | XmlRpcCall("groups.addGroupNotice", param); | 745 | XmlRpcCall(requestID, "groups.addGroupNotice", param); |
732 | } | 746 | } |
733 | 747 | ||
734 | private Hashtable XmlRpcCall(string function, Hashtable param) | 748 | private Hashtable XmlRpcCall(GroupRequestID requestID, string function, Hashtable param) |
735 | { | 749 | { |
750 | if (requestID == null) | ||
751 | { | ||
752 | requestID = new GroupRequestID(); | ||
753 | } | ||
754 | param.Add("RequestingAgentID", requestID.AgentID.ToString()); | ||
755 | param.Add("RequestingAgentUserService", requestID.UserServiceURL); | ||
756 | param.Add("RequestingSessionID", requestID.SessionID.ToString()); | ||
757 | |||
758 | |||
759 | param.Add("ReadKey", m_groupReadKey); | ||
760 | param.Add("WriteKey", m_groupWriteKey); | ||
761 | |||
762 | |||
736 | IList parameters = new ArrayList(); | 763 | IList parameters = new ArrayList(); |
737 | parameters.Add(param); | 764 | parameters.Add(param); |
738 | 765 | ||
@@ -758,9 +785,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
758 | m_log.ErrorFormat("[XMLRPCGROUPDATA]: An error has occured while attempting to access the XmlRpcGroups server method: {0}", function); | 785 | m_log.ErrorFormat("[XMLRPCGROUPDATA]: An error has occured while attempting to access the XmlRpcGroups server method: {0}", function); |
759 | m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} ", e.ToString()); | 786 | m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} ", e.ToString()); |
760 | 787 | ||
761 | foreach (KeyValuePair<object, object> kvp in param) | 788 | |
789 | foreach (string key in param.Keys) | ||
762 | { | 790 | { |
763 | m_log.WarnFormat("[XMLRPCGROUPDATA]: {0} :: {1}", kvp.Key.ToString(), kvp.Value.ToString()); | 791 | m_log.WarnFormat("[XMLRPCGROUPDATA]: {0} :: {1}", key, param[key].ToString()); |
764 | } | 792 | } |
765 | 793 | ||
766 | Hashtable respData = new Hashtable(); | 794 | Hashtable respData = new Hashtable(); |
@@ -817,6 +845,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
817 | 845 | ||
818 | } | 846 | } |
819 | } | 847 | } |
848 | |||
820 | } | 849 | } |
821 | 850 | ||
822 | public class GroupNoticeInfo | 851 | public class GroupNoticeInfo |
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs index 3337ccd..5ba7eff 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs | |||
@@ -28,8 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Reflection; | 30 | using System.Reflection; |
31 | 31 | using System.Timers; | |
32 | using System.Collections; | ||
33 | 32 | ||
34 | using log4net; | 33 | using log4net; |
35 | using Nini.Config; | 34 | using Nini.Config; |
@@ -61,6 +60,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
61 | /// XmlRpcMessagingEnabled = true | 60 | /// XmlRpcMessagingEnabled = true |
62 | /// XmlRpcNoticesEnabled = true | 61 | /// XmlRpcNoticesEnabled = true |
63 | /// XmlRpcDebugEnabled = true | 62 | /// XmlRpcDebugEnabled = true |
63 | /// XmlRpcServiceReadKey = 1234 | ||
64 | /// XmlRpcServiceWriteKey = 1234 | ||
64 | /// | 65 | /// |
65 | /// ; Disables HTTP Keep-Alive for Groups Module HTTP Requests, work around for | 66 | /// ; Disables HTTP Keep-Alive for Groups Module HTTP Requests, work around for |
66 | /// ; a problem discovered on some Windows based region servers. Only disable | 67 | /// ; a problem discovered on some Windows based region servers. Only disable |
@@ -79,6 +80,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
79 | 80 | ||
80 | private IGroupDataProvider m_groupData = null; | 81 | private IGroupDataProvider m_groupData = null; |
81 | 82 | ||
83 | class GroupRequestIDInfo | ||
84 | { | ||
85 | public GroupRequestID RequestID = new GroupRequestID(); | ||
86 | public DateTime LastUsedTMStamp = DateTime.MinValue; | ||
87 | } | ||
88 | private Dictionary<UUID, GroupRequestIDInfo> m_clientRequestIDInfo = new Dictionary<UUID, GroupRequestIDInfo>(); | ||
89 | private const int m_clientRequestIDFlushTimeOut = 300000; // Every 5 minutes | ||
90 | private Timer m_clientRequestIDFlushTimer = new Timer(); | ||
91 | |||
92 | |||
82 | // Configuration settings | 93 | // Configuration settings |
83 | private const string m_defaultXmlRpcServiceURL = "http://osflotsam.org/xmlrpc.php"; | 94 | private const string m_defaultXmlRpcServiceURL = "http://osflotsam.org/xmlrpc.php"; |
84 | private bool m_groupsEnabled = false; | 95 | private bool m_groupsEnabled = false; |
@@ -119,12 +130,34 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
119 | string ServiceURL = groupsConfig.GetString("XmlRpcServiceURL", m_defaultXmlRpcServiceURL); | 130 | string ServiceURL = groupsConfig.GetString("XmlRpcServiceURL", m_defaultXmlRpcServiceURL); |
120 | bool DisableKeepAlive = groupsConfig.GetBoolean("XmlRpcDisableKeepAlive", false); | 131 | bool DisableKeepAlive = groupsConfig.GetBoolean("XmlRpcDisableKeepAlive", false); |
121 | 132 | ||
122 | m_groupData = new XmlRpcGroupDataProvider(ServiceURL, DisableKeepAlive); | 133 | string ServiceReadKey = groupsConfig.GetString("XmlRpcServiceReadKey", string.Empty); |
134 | string ServiceWriteKey = groupsConfig.GetString("XmlRpcServiceWriteKey", string.Empty); | ||
135 | |||
136 | m_groupData = new XmlRpcGroupDataProvider(ServiceURL, DisableKeepAlive, ServiceReadKey, ServiceWriteKey); | ||
123 | m_log.InfoFormat("[GROUPS]: XmlRpc Service URL set to: {0}", ServiceURL); | 137 | m_log.InfoFormat("[GROUPS]: XmlRpc Service URL set to: {0}", ServiceURL); |
124 | 138 | ||
125 | m_groupNoticesEnabled = groupsConfig.GetBoolean("XmlRpcNoticesEnabled", true); | 139 | m_groupNoticesEnabled = groupsConfig.GetBoolean("XmlRpcNoticesEnabled", true); |
126 | m_debugEnabled = groupsConfig.GetBoolean("XmlRpcDebugEnabled", true); | 140 | m_debugEnabled = groupsConfig.GetBoolean("XmlRpcDebugEnabled", true); |
127 | 141 | ||
142 | m_clientRequestIDFlushTimer.Interval = m_clientRequestIDFlushTimeOut; | ||
143 | m_clientRequestIDFlushTimer.Elapsed += FlushClientRequestIDInfoCache; | ||
144 | m_clientRequestIDFlushTimer.Start(); | ||
145 | } | ||
146 | } | ||
147 | |||
148 | void FlushClientRequestIDInfoCache(object sender, ElapsedEventArgs e) | ||
149 | { | ||
150 | lock (m_clientRequestIDInfo) | ||
151 | { | ||
152 | TimeSpan cacheTimeout = new TimeSpan(0,0, m_clientRequestIDFlushTimeOut / 1000); | ||
153 | UUID[] CurrentKeys = new UUID[m_clientRequestIDInfo.Count]; | ||
154 | foreach (UUID key in CurrentKeys) | ||
155 | { | ||
156 | if (DateTime.Now - m_clientRequestIDInfo[key].LastUsedTMStamp > cacheTimeout) | ||
157 | { | ||
158 | m_clientRequestIDInfo.Remove(key); | ||
159 | } | ||
160 | } | ||
128 | } | 161 | } |
129 | } | 162 | } |
130 | 163 | ||
@@ -188,6 +221,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
188 | return; | 221 | return; |
189 | 222 | ||
190 | if (m_debugEnabled) m_log.Debug("[GROUPS]: Shutting down XmlRpcGroups module."); | 223 | if (m_debugEnabled) m_log.Debug("[GROUPS]: Shutting down XmlRpcGroups module."); |
224 | |||
225 | m_clientRequestIDFlushTimer.Stop(); | ||
191 | } | 226 | } |
192 | 227 | ||
193 | public string Name | 228 | public string Name |
@@ -218,13 +253,21 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
218 | 253 | ||
219 | // Used for Notices and Group Invites/Accept/Reject | 254 | // Used for Notices and Group Invites/Accept/Reject |
220 | client.OnInstantMessage += OnInstantMessage; | 255 | client.OnInstantMessage += OnInstantMessage; |
221 | 256 | ||
257 | lock (m_clientRequestIDInfo) | ||
258 | { | ||
259 | if (m_clientRequestIDInfo.ContainsKey(client.AgentId)) | ||
260 | { | ||
261 | // flush any old RequestID information | ||
262 | m_clientRequestIDInfo.Remove(client.AgentId); | ||
263 | } | ||
264 | } | ||
222 | SendAgentGroupDataUpdate(client, client.AgentId); | 265 | SendAgentGroupDataUpdate(client, client.AgentId); |
223 | } | 266 | } |
224 | 267 | ||
225 | private void OnRequestAvatarProperties(IClientAPI remoteClient, UUID avatarID) | 268 | private void OnRequestAvatarProperties(IClientAPI remoteClient, UUID avatarID) |
226 | { | 269 | { |
227 | GroupMembershipData[] avatarGroups = m_groupData.GetAgentGroupMemberships(avatarID).ToArray(); | 270 | GroupMembershipData[] avatarGroups = m_groupData.GetAgentGroupMemberships(GetClientGroupRequestID(remoteClient), avatarID).ToArray(); |
228 | remoteClient.SendAvatarGroupsReply(avatarID, avatarGroups); | 271 | remoteClient.SendAvatarGroupsReply(avatarID, avatarGroups); |
229 | } | 272 | } |
230 | 273 | ||
@@ -270,7 +313,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
270 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called with queryText({1}) queryFlags({2}) queryStart({3})", System.Reflection.MethodBase.GetCurrentMethod().Name, queryText, (DirFindFlags)queryFlags, queryStart); | 313 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called with queryText({1}) queryFlags({2}) queryStart({3})", System.Reflection.MethodBase.GetCurrentMethod().Name, queryText, (DirFindFlags)queryFlags, queryStart); |
271 | 314 | ||
272 | // TODO: This currently ignores pretty much all the query flags including Mature and sort order | 315 | // TODO: This currently ignores pretty much all the query flags including Mature and sort order |
273 | remoteClient.SendDirGroupsReply(queryID, m_groupData.FindGroups(queryText).ToArray()); | 316 | remoteClient.SendDirGroupsReply(queryID, m_groupData.FindGroups(GetClientGroupRequestID(remoteClient), queryText).ToArray()); |
274 | } | 317 | } |
275 | 318 | ||
276 | } | 319 | } |
@@ -284,7 +327,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
284 | string activeGroupName = string.Empty; | 327 | string activeGroupName = string.Empty; |
285 | ulong activeGroupPowers = (ulong)GroupPowers.None; | 328 | ulong activeGroupPowers = (ulong)GroupPowers.None; |
286 | 329 | ||
287 | GroupMembershipData membership = m_groupData.GetAgentActiveMembership(dataForAgentID); | 330 | GroupMembershipData membership = m_groupData.GetAgentActiveMembership(GetClientGroupRequestID(remoteClient), dataForAgentID); |
288 | if (membership != null) | 331 | if (membership != null) |
289 | { | 332 | { |
290 | activeGroupID = membership.GroupID; | 333 | activeGroupID = membership.GroupID; |
@@ -297,13 +340,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
297 | SendScenePresenceUpdate(dataForAgentID, activeGroupTitle); | 340 | SendScenePresenceUpdate(dataForAgentID, activeGroupTitle); |
298 | } | 341 | } |
299 | 342 | ||
300 | private void HandleUUIDGroupNameRequest(UUID GroupID,IClientAPI remote_client) | 343 | private void HandleUUIDGroupNameRequest(UUID GroupID,IClientAPI remoteClient) |
301 | { | 344 | { |
302 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 345 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
303 | 346 | ||
304 | string GroupName; | 347 | string GroupName; |
305 | 348 | ||
306 | GroupRecord group = m_groupData.GetGroupRecord(GroupID, null); | 349 | GroupRecord group = m_groupData.GetGroupRecord(GetClientGroupRequestID(remoteClient), GroupID, null); |
307 | if (group != null) | 350 | if (group != null) |
308 | { | 351 | { |
309 | GroupName = group.GroupName; | 352 | GroupName = group.GroupName; |
@@ -313,7 +356,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
313 | GroupName = "Unknown"; | 356 | GroupName = "Unknown"; |
314 | } | 357 | } |
315 | 358 | ||
316 | remote_client.SendGroupNameReply(GroupID, GroupName); | 359 | remoteClient.SendGroupNameReply(GroupID, GroupName); |
317 | } | 360 | } |
318 | 361 | ||
319 | private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im) | 362 | private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im) |
@@ -324,7 +367,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
324 | if ((im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept) || (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline)) | 367 | if ((im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept) || (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline)) |
325 | { | 368 | { |
326 | UUID inviteID = new UUID(im.imSessionID); | 369 | UUID inviteID = new UUID(im.imSessionID); |
327 | GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(inviteID); | 370 | GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetClientGroupRequestID(remoteClient), inviteID); |
328 | 371 | ||
329 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Invite is for Agent {0} to Group {1}.", inviteInfo.AgentID, inviteInfo.GroupID); | 372 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Invite is for Agent {0} to Group {1}.", inviteInfo.AgentID, inviteInfo.GroupID); |
330 | 373 | ||
@@ -337,7 +380,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
337 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received an accept invite notice."); | 380 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received an accept invite notice."); |
338 | 381 | ||
339 | // and the sessionid is the role | 382 | // and the sessionid is the role |
340 | m_groupData.AddAgentToGroup(inviteInfo.AgentID, inviteInfo.GroupID, inviteInfo.RoleID); | 383 | m_groupData.AddAgentToGroup(GetClientGroupRequestID(remoteClient), inviteInfo.AgentID, inviteInfo.GroupID, inviteInfo.RoleID); |
341 | 384 | ||
342 | GridInstantMessage msg = new GridInstantMessage(); | 385 | GridInstantMessage msg = new GridInstantMessage(); |
343 | msg.imSessionID = UUID.Zero.Guid; | 386 | msg.imSessionID = UUID.Zero.Guid; |
@@ -361,14 +404,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
361 | // TODO: If the inviter is still online, they need an agent dataupdate | 404 | // TODO: If the inviter is still online, they need an agent dataupdate |
362 | // and maybe group membership updates for the invitee | 405 | // and maybe group membership updates for the invitee |
363 | 406 | ||
364 | m_groupData.RemoveAgentToGroupInvite(inviteID); | 407 | m_groupData.RemoveAgentToGroupInvite(GetClientGroupRequestID(remoteClient), inviteID); |
365 | } | 408 | } |
366 | 409 | ||
367 | // Reject | 410 | // Reject |
368 | if (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline) | 411 | if (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline) |
369 | { | 412 | { |
370 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received a reject invite notice."); | 413 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received a reject invite notice."); |
371 | m_groupData.RemoveAgentToGroupInvite(inviteID); | 414 | m_groupData.RemoveAgentToGroupInvite(GetClientGroupRequestID(remoteClient), inviteID); |
372 | } | 415 | } |
373 | } | 416 | } |
374 | } | 417 | } |
@@ -382,7 +425,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
382 | } | 425 | } |
383 | 426 | ||
384 | UUID GroupID = new UUID(im.toAgentID); | 427 | UUID GroupID = new UUID(im.toAgentID); |
385 | if (m_groupData.GetGroupRecord(GroupID, null) != null) | 428 | if (m_groupData.GetGroupRecord(GetClientGroupRequestID(remoteClient), GroupID, null) != null) |
386 | { | 429 | { |
387 | UUID NoticeID = UUID.Random(); | 430 | UUID NoticeID = UUID.Random(); |
388 | string Subject = im.message.Substring(0, im.message.IndexOf('|')); | 431 | string Subject = im.message.Substring(0, im.message.IndexOf('|')); |
@@ -422,14 +465,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
422 | bucket[18] = 0; //dunno | 465 | bucket[18] = 0; //dunno |
423 | } | 466 | } |
424 | 467 | ||
425 | m_groupData.AddGroupNotice(GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket); | 468 | m_groupData.AddGroupNotice(GetClientGroupRequestID(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket); |
426 | if (OnNewGroupNotice != null) | 469 | if (OnNewGroupNotice != null) |
427 | { | 470 | { |
428 | OnNewGroupNotice(GroupID, NoticeID); | 471 | OnNewGroupNotice(GroupID, NoticeID); |
429 | } | 472 | } |
430 | 473 | ||
431 | // Send notice out to everyone that wants notices | 474 | // Send notice out to everyone that wants notices |
432 | foreach (GroupMembersData member in m_groupData.GetGroupMembers(GroupID)) | 475 | foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetClientGroupRequestID(remoteClient), GroupID)) |
433 | { | 476 | { |
434 | if (member.AcceptNotices) | 477 | if (member.AcceptNotices) |
435 | { | 478 | { |
@@ -501,14 +544,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
501 | 544 | ||
502 | public GroupRecord GetGroupRecord(UUID GroupID) | 545 | public GroupRecord GetGroupRecord(UUID GroupID) |
503 | { | 546 | { |
504 | return m_groupData.GetGroupRecord(GroupID, null); | 547 | return m_groupData.GetGroupRecord(null, GroupID, null); |
505 | } | 548 | } |
506 | 549 | ||
507 | public void ActivateGroup(IClientAPI remoteClient, UUID groupID) | 550 | public void ActivateGroup(IClientAPI remoteClient, UUID groupID) |
508 | { | 551 | { |
509 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 552 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
510 | 553 | ||
511 | m_groupData.SetAgentActiveGroup(remoteClient.AgentId, groupID); | 554 | m_groupData.SetAgentActiveGroup(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID); |
512 | 555 | ||
513 | // Changing active group changes title, active powers, all kinds of things | 556 | // Changing active group changes title, active powers, all kinds of things |
514 | // anyone who is in any region that can see this client, should probably be | 557 | // anyone who is in any region that can see this client, should probably be |
@@ -524,8 +567,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
524 | { | 567 | { |
525 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 568 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
526 | 569 | ||
527 | List<GroupRolesData> agentRoles = m_groupData.GetAgentGroupRoles(remoteClient.AgentId, groupID); | 570 | GroupRequestID grID = GetClientGroupRequestID(remoteClient); |
528 | GroupMembershipData agentMembership = m_groupData.GetAgentGroupMembership(remoteClient.AgentId, groupID); | 571 | |
572 | List<GroupRolesData> agentRoles = m_groupData.GetAgentGroupRoles(grID, remoteClient.AgentId, groupID); | ||
573 | GroupMembershipData agentMembership = m_groupData.GetAgentGroupMembership(grID, remoteClient.AgentId, groupID); | ||
529 | 574 | ||
530 | List<GroupTitlesData> titles = new List<GroupTitlesData>(); | 575 | List<GroupTitlesData> titles = new List<GroupTitlesData>(); |
531 | foreach (GroupRolesData role in agentRoles) | 576 | foreach (GroupRolesData role in agentRoles) |
@@ -548,7 +593,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
548 | { | 593 | { |
549 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 594 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
550 | 595 | ||
551 | List<GroupMembersData> data = m_groupData.GetGroupMembers(groupID); | 596 | List<GroupMembersData> data = m_groupData.GetGroupMembers(GetClientGroupRequestID(remoteClient), groupID); |
552 | if (m_debugEnabled) | 597 | if (m_debugEnabled) |
553 | { | 598 | { |
554 | foreach (GroupMembersData member in data) | 599 | foreach (GroupMembersData member in data) |
@@ -565,7 +610,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
565 | { | 610 | { |
566 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 611 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
567 | 612 | ||
568 | List<GroupRolesData> data = m_groupData.GetGroupRoles(groupID); | 613 | List<GroupRolesData> data = m_groupData.GetGroupRoles(GetClientGroupRequestID(remoteClient), groupID); |
569 | 614 | ||
570 | if (m_debugEnabled) | 615 | if (m_debugEnabled) |
571 | { | 616 | { |
@@ -583,7 +628,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
583 | { | 628 | { |
584 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 629 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
585 | 630 | ||
586 | List<GroupRoleMembersData> data = m_groupData.GetGroupRoleMembers(groupID); | 631 | List<GroupRoleMembersData> data = m_groupData.GetGroupRoleMembers(GetClientGroupRequestID(remoteClient), groupID); |
587 | 632 | ||
588 | if (m_debugEnabled) | 633 | if (m_debugEnabled) |
589 | { | 634 | { |
@@ -604,15 +649,17 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
604 | 649 | ||
605 | GroupProfileData profile = new GroupProfileData(); | 650 | GroupProfileData profile = new GroupProfileData(); |
606 | 651 | ||
607 | GroupRecord groupInfo = m_groupData.GetGroupRecord(groupID, null); | 652 | GroupRequestID grID = GetClientGroupRequestID(remoteClient); |
653 | |||
654 | GroupRecord groupInfo = m_groupData.GetGroupRecord(GetClientGroupRequestID(remoteClient), groupID, null); | ||
608 | if (groupInfo != null) | 655 | if (groupInfo != null) |
609 | { | 656 | { |
610 | profile.AllowPublish = groupInfo.AllowPublish; | 657 | profile.AllowPublish = groupInfo.AllowPublish; |
611 | profile.Charter = groupInfo.Charter; | 658 | profile.Charter = groupInfo.Charter; |
612 | profile.FounderID = groupInfo.FounderID; | 659 | profile.FounderID = groupInfo.FounderID; |
613 | profile.GroupID = groupID; | 660 | profile.GroupID = groupID; |
614 | profile.GroupMembershipCount = m_groupData.GetGroupMembers(groupID).Count; | 661 | profile.GroupMembershipCount = m_groupData.GetGroupMembers(grID, groupID).Count; |
615 | profile.GroupRolesCount = m_groupData.GetGroupRoles(groupID).Count; | 662 | profile.GroupRolesCount = m_groupData.GetGroupRoles(grID, groupID).Count; |
616 | profile.InsigniaID = groupInfo.GroupPicture; | 663 | profile.InsigniaID = groupInfo.GroupPicture; |
617 | profile.MaturePublish = groupInfo.MaturePublish; | 664 | profile.MaturePublish = groupInfo.MaturePublish; |
618 | profile.MembershipFee = groupInfo.MembershipFee; | 665 | profile.MembershipFee = groupInfo.MembershipFee; |
@@ -623,7 +670,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
623 | profile.ShowInList = groupInfo.ShowInList; | 670 | profile.ShowInList = groupInfo.ShowInList; |
624 | } | 671 | } |
625 | 672 | ||
626 | GroupMembershipData memberInfo = m_groupData.GetAgentGroupMembership(remoteClient.AgentId, groupID); | 673 | GroupMembershipData memberInfo = m_groupData.GetAgentGroupMembership(grID, remoteClient.AgentId, groupID); |
627 | if (memberInfo != null) | 674 | if (memberInfo != null) |
628 | { | 675 | { |
629 | profile.MemberTitle = memberInfo.GroupTitle; | 676 | profile.MemberTitle = memberInfo.GroupTitle; |
@@ -637,14 +684,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
637 | { | 684 | { |
638 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 685 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
639 | 686 | ||
640 | return m_groupData.GetAgentGroupMemberships(agentID).ToArray(); | 687 | return m_groupData.GetAgentGroupMemberships(null, agentID).ToArray(); |
641 | } | 688 | } |
642 | 689 | ||
643 | public GroupMembershipData GetMembershipData(UUID groupID, UUID agentID) | 690 | public GroupMembershipData GetMembershipData(UUID groupID, UUID agentID) |
644 | { | 691 | { |
645 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 692 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
646 | 693 | ||
647 | return m_groupData.GetAgentGroupMembership(agentID, groupID); | 694 | return m_groupData.GetAgentGroupMembership(null, agentID, groupID); |
648 | } | 695 | } |
649 | 696 | ||
650 | public void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish) | 697 | public void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish) |
@@ -653,7 +700,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
653 | 700 | ||
654 | // TODO: Security Check? | 701 | // TODO: Security Check? |
655 | 702 | ||
656 | m_groupData.UpdateGroup(groupID, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish); | 703 | m_groupData.UpdateGroup(GetClientGroupRequestID(remoteClient), groupID, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish); |
657 | } | 704 | } |
658 | 705 | ||
659 | public void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile) | 706 | public void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile) |
@@ -661,20 +708,22 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
661 | // TODO: Security Check? | 708 | // TODO: Security Check? |
662 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 709 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
663 | 710 | ||
664 | m_groupData.SetAgentGroupInfo(remoteClient.AgentId, groupID, acceptNotices, listInProfile); | 711 | m_groupData.SetAgentGroupInfo(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID, acceptNotices, listInProfile); |
665 | } | 712 | } |
666 | 713 | ||
667 | public UUID CreateGroup(IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish) | 714 | public UUID CreateGroup(IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish) |
668 | { | 715 | { |
669 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 716 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
670 | 717 | ||
671 | if (m_groupData.GetGroupRecord(UUID.Zero, name) != null) | 718 | GroupRequestID grID = GetClientGroupRequestID(remoteClient); |
719 | |||
720 | if (m_groupData.GetGroupRecord(grID, UUID.Zero, name) != null) | ||
672 | { | 721 | { |
673 | remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists."); | 722 | remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists."); |
674 | return UUID.Zero; | 723 | return UUID.Zero; |
675 | } | 724 | } |
676 | 725 | ||
677 | UUID groupID = m_groupData.CreateGroup(name, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish, remoteClient.AgentId); | 726 | UUID groupID = m_groupData.CreateGroup(grID, name, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish, remoteClient.AgentId); |
678 | 727 | ||
679 | remoteClient.SendCreateGroupReply(groupID, true, "Group created successfullly"); | 728 | remoteClient.SendCreateGroupReply(groupID, true, "Group created successfullly"); |
680 | 729 | ||
@@ -689,8 +738,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
689 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 738 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
690 | 739 | ||
691 | // ToDo: check if agent is a member of group and is allowed to see notices? | 740 | // ToDo: check if agent is a member of group and is allowed to see notices? |
692 | 741 | ||
693 | return m_groupData.GetGroupNotices(groupID).ToArray(); | 742 | return m_groupData.GetGroupNotices(GetClientGroupRequestID(remoteClient), groupID).ToArray(); |
694 | } | 743 | } |
695 | 744 | ||
696 | /// <summary> | 745 | /// <summary> |
@@ -700,7 +749,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
700 | { | 749 | { |
701 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 750 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
702 | 751 | ||
703 | GroupMembershipData membership = m_groupData.GetAgentActiveMembership(avatarID); | 752 | GroupMembershipData membership = m_groupData.GetAgentActiveMembership(null, avatarID); |
704 | if (membership != null) | 753 | if (membership != null) |
705 | { | 754 | { |
706 | return membership.GroupTitle; | 755 | return membership.GroupTitle; |
@@ -715,7 +764,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
715 | { | 764 | { |
716 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 765 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
717 | 766 | ||
718 | m_groupData.SetAgentActiveGroupRole(remoteClient.AgentId, groupID, titleRoleID); | 767 | m_groupData.SetAgentActiveGroupRole(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID, titleRoleID); |
719 | 768 | ||
720 | // TODO: Not sure what all is needed here, but if the active group role change is for the group | 769 | // TODO: Not sure what all is needed here, but if the active group role change is for the group |
721 | // the client currently has set active, then we need to do a scene presence update too | 770 | // the client currently has set active, then we need to do a scene presence update too |
@@ -731,20 +780,22 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
731 | 780 | ||
732 | // TODO: Security Checks? | 781 | // TODO: Security Checks? |
733 | 782 | ||
783 | GroupRequestID grID = GetClientGroupRequestID(remoteClient); | ||
784 | |||
734 | switch ((OpenMetaverse.GroupRoleUpdate)updateType) | 785 | switch ((OpenMetaverse.GroupRoleUpdate)updateType) |
735 | { | 786 | { |
736 | case OpenMetaverse.GroupRoleUpdate.Create: | 787 | case OpenMetaverse.GroupRoleUpdate.Create: |
737 | m_groupData.AddGroupRole(groupID, UUID.Random(), name, description, title, powers); | 788 | m_groupData.AddGroupRole(grID, groupID, UUID.Random(), name, description, title, powers); |
738 | break; | 789 | break; |
739 | 790 | ||
740 | case OpenMetaverse.GroupRoleUpdate.Delete: | 791 | case OpenMetaverse.GroupRoleUpdate.Delete: |
741 | m_groupData.RemoveGroupRole(groupID, roleID); | 792 | m_groupData.RemoveGroupRole(grID, groupID, roleID); |
742 | break; | 793 | break; |
743 | 794 | ||
744 | case OpenMetaverse.GroupRoleUpdate.UpdateAll: | 795 | case OpenMetaverse.GroupRoleUpdate.UpdateAll: |
745 | case OpenMetaverse.GroupRoleUpdate.UpdateData: | 796 | case OpenMetaverse.GroupRoleUpdate.UpdateData: |
746 | case OpenMetaverse.GroupRoleUpdate.UpdatePowers: | 797 | case OpenMetaverse.GroupRoleUpdate.UpdatePowers: |
747 | m_groupData.UpdateGroupRole(groupID, roleID, name, description, title, powers); | 798 | m_groupData.UpdateGroupRole(grID, groupID, roleID, name, description, title, powers); |
748 | break; | 799 | break; |
749 | 800 | ||
750 | case OpenMetaverse.GroupRoleUpdate.NoUpdate: | 801 | case OpenMetaverse.GroupRoleUpdate.NoUpdate: |
@@ -763,16 +814,18 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
763 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 814 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
764 | // Todo: Security check | 815 | // Todo: Security check |
765 | 816 | ||
817 | GroupRequestID grID = GetClientGroupRequestID(remoteClient); | ||
818 | |||
766 | switch (changes) | 819 | switch (changes) |
767 | { | 820 | { |
768 | case 0: | 821 | case 0: |
769 | // Add | 822 | // Add |
770 | m_groupData.AddAgentToGroupRole(memberID, groupID, roleID); | 823 | m_groupData.AddAgentToGroupRole(grID, memberID, groupID, roleID); |
771 | 824 | ||
772 | break; | 825 | break; |
773 | case 1: | 826 | case 1: |
774 | // Remove | 827 | // Remove |
775 | m_groupData.RemoveAgentFromGroupRole(memberID, groupID, roleID); | 828 | m_groupData.RemoveAgentFromGroupRole(grID, memberID, groupID, roleID); |
776 | 829 | ||
777 | break; | 830 | break; |
778 | default: | 831 | default: |
@@ -788,12 +841,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
788 | { | 841 | { |
789 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 842 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
790 | 843 | ||
791 | 844 | GroupRequestID grID = GetClientGroupRequestID(remoteClient); | |
792 | GroupNoticeInfo data = m_groupData.GetGroupNotice(groupNoticeID); | 845 | |
846 | GroupNoticeInfo data = m_groupData.GetGroupNotice(grID, groupNoticeID); | ||
793 | 847 | ||
794 | if (data != null) | 848 | if (data != null) |
795 | { | 849 | { |
796 | GroupRecord groupInfo = m_groupData.GetGroupRecord(data.GroupID, null); | 850 | GroupRecord groupInfo = m_groupData.GetGroupRecord(grID, data.GroupID, null); |
797 | 851 | ||
798 | GridInstantMessage msg = new GridInstantMessage(); | 852 | GridInstantMessage msg = new GridInstantMessage(); |
799 | msg.imSessionID = UUID.Zero.Guid; | 853 | msg.imSessionID = UUID.Zero.Guid; |
@@ -825,12 +879,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
825 | msg.dialog = dialog; | 879 | msg.dialog = dialog; |
826 | // msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupNotice; | 880 | // msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupNotice; |
827 | msg.fromGroup = true; | 881 | msg.fromGroup = true; |
828 | msg.offline = (byte)0; | 882 | msg.offline = (byte)1; // Allow this message to be stored for offline use |
829 | msg.ParentEstateID = 0; | 883 | msg.ParentEstateID = 0; |
830 | msg.Position = Vector3.Zero; | 884 | msg.Position = Vector3.Zero; |
831 | msg.RegionID = UUID.Zero.Guid; | 885 | msg.RegionID = UUID.Zero.Guid; |
832 | 886 | ||
833 | GroupNoticeInfo info = m_groupData.GetGroupNotice(groupNoticeID); | 887 | GroupNoticeInfo info = m_groupData.GetGroupNotice(null, groupNoticeID); |
834 | if (info != null) | 888 | if (info != null) |
835 | { | 889 | { |
836 | msg.fromAgentID = info.GroupID.Guid; | 890 | msg.fromAgentID = info.GroupID.Guid; |
@@ -865,7 +919,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
865 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 919 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
866 | 920 | ||
867 | // Should check to see if OpenEnrollment, or if there's an outstanding invitation | 921 | // Should check to see if OpenEnrollment, or if there's an outstanding invitation |
868 | m_groupData.AddAgentToGroup(remoteClient.AgentId, groupID, UUID.Zero); | 922 | m_groupData.AddAgentToGroup(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID, UUID.Zero); |
869 | 923 | ||
870 | remoteClient.SendJoinGroupReply(groupID, true); | 924 | remoteClient.SendJoinGroupReply(groupID, true); |
871 | 925 | ||
@@ -877,7 +931,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
877 | { | 931 | { |
878 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 932 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
879 | 933 | ||
880 | m_groupData.RemoveAgentFromGroup(remoteClient.AgentId, groupID); | 934 | m_groupData.RemoveAgentFromGroup(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID); |
881 | 935 | ||
882 | remoteClient.SendLeaveGroupReply(groupID, true); | 936 | remoteClient.SendLeaveGroupReply(groupID, true); |
883 | 937 | ||
@@ -892,12 +946,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
892 | { | 946 | { |
893 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 947 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
894 | 948 | ||
949 | GroupRequestID grID = GetClientGroupRequestID(remoteClient); | ||
950 | |||
895 | // Todo: Security check? | 951 | // Todo: Security check? |
896 | m_groupData.RemoveAgentFromGroup(ejecteeID, groupID); | 952 | m_groupData.RemoveAgentFromGroup(grID, ejecteeID, groupID); |
897 | 953 | ||
898 | remoteClient.SendEjectGroupMemberReply(remoteClient.AgentId, groupID, true); | 954 | remoteClient.SendEjectGroupMemberReply(remoteClient.AgentId, groupID, true); |
899 | 955 | ||
900 | GroupRecord groupInfo = m_groupData.GetGroupRecord(groupID, null); | 956 | GroupRecord groupInfo = m_groupData.GetGroupRecord(grID, groupID, null); |
901 | UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(ejecteeID); | 957 | UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(ejecteeID); |
902 | 958 | ||
903 | if ((groupInfo == null) || (userProfile == null)) | 959 | if ((groupInfo == null) || (userProfile == null)) |
@@ -969,7 +1025,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
969 | 1025 | ||
970 | // Todo: Security check, probably also want to send some kind of notification | 1026 | // Todo: Security check, probably also want to send some kind of notification |
971 | UUID InviteID = UUID.Random(); | 1027 | UUID InviteID = UUID.Random(); |
972 | m_groupData.AddAgentToGroupInvite(InviteID, groupID, roleID, invitedAgentID); | 1028 | m_groupData.AddAgentToGroupInvite(GetClientGroupRequestID(remoteClient), InviteID, groupID, roleID, invitedAgentID); |
973 | 1029 | ||
974 | if (m_msgTransferModule != null) | 1030 | if (m_msgTransferModule != null) |
975 | { | 1031 | { |
@@ -1031,6 +1087,37 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1031 | return child; | 1087 | return child; |
1032 | } | 1088 | } |
1033 | 1089 | ||
1090 | private GroupRequestID GetClientGroupRequestID(IClientAPI client) | ||
1091 | { | ||
1092 | lock (m_clientRequestIDInfo) | ||
1093 | { | ||
1094 | if (!m_clientRequestIDInfo.ContainsKey(client.AgentId)) | ||
1095 | { | ||
1096 | GroupRequestIDInfo info = new GroupRequestIDInfo(); | ||
1097 | info.RequestID.AgentID = client.AgentId; | ||
1098 | info.RequestID.SessionID = client.SessionId; | ||
1099 | |||
1100 | UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(client.AgentId); | ||
1101 | if (userProfile is ForeignUserProfileData) | ||
1102 | { | ||
1103 | // They aren't from around here | ||
1104 | ForeignUserProfileData fupd = (ForeignUserProfileData)userProfile; | ||
1105 | info.RequestID.UserServiceURL = fupd.UserServerURI; | ||
1106 | } | ||
1107 | else | ||
1108 | { | ||
1109 | // They're a local user, use this: | ||
1110 | info.RequestID.UserServiceURL = m_sceneList[0].CommsManager.NetworkServersInfo.UserURL; | ||
1111 | } | ||
1112 | |||
1113 | m_clientRequestIDInfo.Add(client.AgentId, info); | ||
1114 | } | ||
1115 | |||
1116 | m_clientRequestIDInfo[client.AgentId].LastUsedTMStamp = DateTime.Now; | ||
1117 | } | ||
1118 | return m_clientRequestIDInfo[client.AgentId].RequestID; | ||
1119 | } | ||
1120 | |||
1034 | /// <summary> | 1121 | /// <summary> |
1035 | /// Send 'remoteClient' the group membership 'data' for agent 'dataForAgentID'. | 1122 | /// Send 'remoteClient' the group membership 'data' for agent 'dataForAgentID'. |
1036 | /// </summary> | 1123 | /// </summary> |
@@ -1120,23 +1207,25 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1120 | /// <summary> | 1207 | /// <summary> |
1121 | /// Update remoteClient with group information about dataForAgentID | 1208 | /// Update remoteClient with group information about dataForAgentID |
1122 | /// </summary> | 1209 | /// </summary> |
1123 | private void SendAgentGroupDataUpdate(IClientAPI client, UUID dataForAgentID) | 1210 | private void SendAgentGroupDataUpdate(IClientAPI remoteClient, UUID dataForAgentID) |
1124 | { | 1211 | { |
1125 | if (m_debugEnabled) m_log.InfoFormat("[GROUPS]: {0} called for {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, client.Name); | 1212 | if (m_debugEnabled) m_log.InfoFormat("[GROUPS]: {0} called for {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, remoteClient.Name); |
1126 | 1213 | ||
1127 | // TODO: All the client update functions need to be reexamined because most do too much and send too much stuff | 1214 | // TODO: All the client update functions need to be reexamined because most do too much and send too much stuff |
1128 | 1215 | ||
1129 | OnAgentDataUpdateRequest(client, dataForAgentID, UUID.Zero); | 1216 | OnAgentDataUpdateRequest(remoteClient, dataForAgentID, UUID.Zero); |
1130 | 1217 | ||
1131 | 1218 | ||
1132 | // Need to send a group membership update to the client | 1219 | // Need to send a group membership update to the client |
1133 | // UDP version doesn't seem to behave nicely | 1220 | // UDP version doesn't seem to behave nicely. But we're going to send it out here |
1134 | // client.SendGroupMembership(GetMembershipData(client.AgentId)); | 1221 | // with an empty group membership to hopefully remove groups being displayed due |
1222 | // to the core Groups Stub | ||
1223 | remoteClient.SendGroupMembership( new GroupMembershipData[0] ); | ||
1135 | 1224 | ||
1136 | GroupMembershipData[] membershipData = m_groupData.GetAgentGroupMemberships(dataForAgentID).ToArray(); | 1225 | GroupMembershipData[] membershipData = m_groupData.GetAgentGroupMemberships(GetClientGroupRequestID(remoteClient), dataForAgentID).ToArray(); |
1137 | 1226 | ||
1138 | SendGroupMembershipInfoViaCaps(client, dataForAgentID, membershipData); | 1227 | SendGroupMembershipInfoViaCaps(remoteClient, dataForAgentID, membershipData); |
1139 | client.SendAvatarGroupsReply(dataForAgentID, membershipData); | 1228 | remoteClient.SendAvatarGroupsReply(dataForAgentID, membershipData); |
1140 | 1229 | ||
1141 | } | 1230 | } |
1142 | 1231 | ||
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index f0e7679..506265d 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example | |||
@@ -1245,11 +1245,15 @@ | |||
1245 | ; The XmlRpcGroups implementation can be used against the publically available service | 1245 | ; The XmlRpcGroups implementation can be used against the publically available service |
1246 | ; that I have made available for testing. Your group data is not guarenteed safe | 1246 | ; that I have made available for testing. Your group data is not guarenteed safe |
1247 | ; or available if you use this service, but it's available now and seems to work. | 1247 | ; or available if you use this service, but it's available now and seems to work. |
1248 | ; The PHP code for the service is available for you to deploy to your own server. | 1248 | ; The PHP code for the service is available from the Flotsam project for you to deploy |
1249 | ; to your own server. The Flotsam project is located at http://code.google.com/p/flotsam/ | ||
1249 | ; | 1250 | ; |
1250 | ;Module = XmlRpcGroups | 1251 | ;Module = XmlRpcGroups |
1251 | 1252 | ||
1252 | ;XmlRpcServiceURL = http://osflotsam.org/xmlrpc.php | 1253 | ;XmlRpcServiceURL = http://osflotsam.org/xmlrpc.php |
1254 | ;XmlRpcServiceReadKey = 1234 | ||
1255 | ;XmlRpcServiceWriteKey = 1234 | ||
1256 | |||
1253 | ;XmlRpcMessagingEnabled = true | 1257 | ;XmlRpcMessagingEnabled = true |
1254 | ;XmlRpcNoticesEnabled = true | 1258 | ;XmlRpcNoticesEnabled = true |
1255 | 1259 | ||