diff options
Diffstat (limited to 'OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs')
-rw-r--r-- | OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs | 760 |
1 files changed, 760 insertions, 0 deletions
diff --git a/OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs b/OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs new file mode 100644 index 0000000..8c257ed --- /dev/null +++ b/OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs | |||
@@ -0,0 +1,760 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Reflection; | ||
30 | using System.Text; | ||
31 | using System.Xml; | ||
32 | using System.Collections.Generic; | ||
33 | using System.IO; | ||
34 | using Nini.Config; | ||
35 | using OpenSim.Framework; | ||
36 | using OpenSim.Server.Base; | ||
37 | using OpenSim.Services.Interfaces; | ||
38 | using OpenSim.Framework.Servers.HttpServer; | ||
39 | using OpenSim.Server.Handlers.Base; | ||
40 | using log4net; | ||
41 | using OpenMetaverse; | ||
42 | |||
43 | namespace OpenSim.Groups | ||
44 | { | ||
45 | public class GroupsServiceRobustConnector : ServiceConnector | ||
46 | { | ||
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
48 | |||
49 | private GroupsService m_GroupsService; | ||
50 | private string m_ConfigName = "Groups"; | ||
51 | |||
52 | public GroupsServiceRobustConnector(IConfigSource config, IHttpServer server, string configName) : | ||
53 | base(config, server, configName) | ||
54 | { | ||
55 | if (configName != String.Empty) | ||
56 | m_ConfigName = configName; | ||
57 | |||
58 | m_log.DebugFormat("[Groups.RobustConnector]: Starting with config name {0}", m_ConfigName); | ||
59 | |||
60 | m_GroupsService = new GroupsService(config); | ||
61 | |||
62 | server.AddStreamHandler(new GroupsServicePostHandler(m_GroupsService)); | ||
63 | } | ||
64 | } | ||
65 | |||
66 | public class GroupsServicePostHandler : BaseStreamHandler | ||
67 | { | ||
68 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
69 | |||
70 | private GroupsService m_GroupsService; | ||
71 | |||
72 | public GroupsServicePostHandler(GroupsService service) : | ||
73 | base("POST", "/groups") | ||
74 | { | ||
75 | m_GroupsService = service; | ||
76 | } | ||
77 | |||
78 | public override byte[] Handle(string path, Stream requestData, | ||
79 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | ||
80 | { | ||
81 | StreamReader sr = new StreamReader(requestData); | ||
82 | string body = sr.ReadToEnd(); | ||
83 | sr.Close(); | ||
84 | body = body.Trim(); | ||
85 | |||
86 | //m_log.DebugFormat("[XXX]: query String: {0}", body); | ||
87 | |||
88 | try | ||
89 | { | ||
90 | Dictionary<string, object> request = | ||
91 | ServerUtils.ParseQueryString(body); | ||
92 | |||
93 | if (!request.ContainsKey("METHOD")) | ||
94 | return FailureResult(); | ||
95 | |||
96 | string method = request["METHOD"].ToString(); | ||
97 | request.Remove("METHOD"); | ||
98 | |||
99 | m_log.DebugFormat("[Groups.Handler]: {0}", method); | ||
100 | switch (method) | ||
101 | { | ||
102 | case "PUTGROUP": | ||
103 | return HandleAddOrUpdateGroup(request); | ||
104 | case "GETGROUP": | ||
105 | return HandleGetGroup(request); | ||
106 | case "ADDAGENTTOGROUP": | ||
107 | return HandleAddAgentToGroup(request); | ||
108 | case "REMOVEAGENTFROMGROUP": | ||
109 | return HandleRemoveAgentFromGroup(request); | ||
110 | case "GETMEMBERSHIP": | ||
111 | return HandleGetMembership(request); | ||
112 | case "GETGROUPMEMBERS": | ||
113 | return HandleGetGroupMembers(request); | ||
114 | case "PUTROLE": | ||
115 | return HandlePutRole(request); | ||
116 | case "REMOVEROLE": | ||
117 | return HandleRemoveRole(request); | ||
118 | case "GETGROUPROLES": | ||
119 | return HandleGetGroupRoles(request); | ||
120 | case "GETROLEMEMBERS": | ||
121 | return HandleGetRoleMembers(request); | ||
122 | case "AGENTROLE": | ||
123 | return HandleAgentRole(request); | ||
124 | case "GETAGENTROLES": | ||
125 | return HandleGetAgentRoles(request); | ||
126 | case "SETACTIVE": | ||
127 | return HandleSetActive(request); | ||
128 | case "UPDATEMEMBERSHIP": | ||
129 | return HandleUpdateMembership(request); | ||
130 | case "INVITE": | ||
131 | return HandleInvite(request); | ||
132 | case "ADDNOTICE": | ||
133 | return HandleAddNotice(request); | ||
134 | case "GETNOTICES": | ||
135 | return HandleGetNotices(request); | ||
136 | } | ||
137 | m_log.DebugFormat("[GROUPS HANDLER]: unknown method request: {0}", method); | ||
138 | } | ||
139 | catch (Exception e) | ||
140 | { | ||
141 | m_log.DebugFormat("[GROUPS HANDLER]: Exception {0}", e.StackTrace); | ||
142 | } | ||
143 | |||
144 | return FailureResult(); | ||
145 | } | ||
146 | |||
147 | byte[] HandleAddOrUpdateGroup(Dictionary<string, object> request) | ||
148 | { | ||
149 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
150 | |||
151 | ExtendedGroupRecord grec = GroupsDataUtils.GroupRecord(request); | ||
152 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("OP")) | ||
153 | NullResult(result, "Bad network data"); | ||
154 | |||
155 | else | ||
156 | { | ||
157 | string RequestingAgentID = request["RequestingAgentID"].ToString(); | ||
158 | string reason = string.Empty; | ||
159 | string op = request["OP"].ToString(); | ||
160 | if (op == "ADD") | ||
161 | { | ||
162 | grec.GroupID = m_GroupsService.CreateGroup(RequestingAgentID, grec.GroupName, grec.Charter, grec.ShowInList, grec.GroupPicture, grec.MembershipFee, | ||
163 | grec.OpenEnrollment, grec.AllowPublish, grec.MaturePublish, grec.FounderID, out reason); | ||
164 | |||
165 | } | ||
166 | else if (op == "UPDATE") | ||
167 | { | ||
168 | m_GroupsService.UpdateGroup(RequestingAgentID, grec.GroupID, grec.Charter, grec.ShowInList, grec.GroupPicture, grec.MembershipFee, | ||
169 | grec.OpenEnrollment, grec.AllowPublish, grec.MaturePublish); | ||
170 | |||
171 | } | ||
172 | |||
173 | grec = m_GroupsService.GetGroupRecord(RequestingAgentID, grec.GroupID); | ||
174 | if (grec == null) | ||
175 | NullResult(result, "Internal Error"); | ||
176 | else | ||
177 | result["RESULT"] = GroupsDataUtils.GroupRecord(grec); | ||
178 | } | ||
179 | |||
180 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
181 | |||
182 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
183 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
184 | } | ||
185 | |||
186 | byte[] HandleGetGroup(Dictionary<string, object> request) | ||
187 | { | ||
188 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
189 | |||
190 | if (!request.ContainsKey("RequestingAgentID")) | ||
191 | NullResult(result, "Bad network data"); | ||
192 | else | ||
193 | { | ||
194 | string RequestingAgentID = request["RequestingAgentID"].ToString(); | ||
195 | ExtendedGroupRecord grec = null; | ||
196 | if (request.ContainsKey("GroupID")) | ||
197 | { | ||
198 | UUID groupID = new UUID(request["GroupID"].ToString()); | ||
199 | grec = m_GroupsService.GetGroupRecord(RequestingAgentID, groupID); | ||
200 | } | ||
201 | else if (request.ContainsKey("Name")) | ||
202 | { | ||
203 | string name = request["Name"].ToString(); | ||
204 | grec = m_GroupsService.GetGroupRecord(RequestingAgentID, name); | ||
205 | } | ||
206 | |||
207 | if (grec == null) | ||
208 | NullResult(result, "Group not found"); | ||
209 | else | ||
210 | result["RESULT"] = GroupsDataUtils.GroupRecord(grec); | ||
211 | } | ||
212 | |||
213 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
214 | |||
215 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
216 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
217 | } | ||
218 | |||
219 | byte[] HandleAddAgentToGroup(Dictionary<string, object> request) | ||
220 | { | ||
221 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
222 | |||
223 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("AgentID") || | ||
224 | !request.ContainsKey("GroupID") || !request.ContainsKey("RoleID")) | ||
225 | NullResult(result, "Bad network data"); | ||
226 | else | ||
227 | { | ||
228 | UUID groupID = new UUID(request["GroupID"].ToString()); | ||
229 | UUID roleID = new UUID(request["RoleID"].ToString()); | ||
230 | string agentID = request["AgentID"].ToString(); | ||
231 | string requestingAgentID = request["RequestingAgentID"].ToString(); | ||
232 | string token = string.Empty; | ||
233 | string reason = string.Empty; | ||
234 | |||
235 | if (request.ContainsKey("AccessToken")) | ||
236 | token = request["AccessToken"].ToString(); | ||
237 | |||
238 | if (!m_GroupsService.AddAgentToGroup(requestingAgentID, agentID, groupID, roleID, token, out reason)) | ||
239 | NullResult(result, reason); | ||
240 | else | ||
241 | { | ||
242 | GroupMembershipData membership = m_GroupsService.GetAgentGroupMembership(requestingAgentID, agentID, groupID); | ||
243 | if (membership == null) | ||
244 | NullResult(result, "Internal error"); | ||
245 | else | ||
246 | result["RESULT"] = GroupsDataUtils.GroupMembershipData((ExtendedGroupMembershipData)membership); | ||
247 | } | ||
248 | } | ||
249 | |||
250 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
251 | |||
252 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
253 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
254 | } | ||
255 | |||
256 | byte[] HandleRemoveAgentFromGroup(Dictionary<string, object> request) | ||
257 | { | ||
258 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
259 | |||
260 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("AgentID") || !request.ContainsKey("GroupID")) | ||
261 | NullResult(result, "Bad network data"); | ||
262 | else | ||
263 | { | ||
264 | UUID groupID = new UUID(request["GroupID"].ToString()); | ||
265 | string agentID = request["AgentID"].ToString(); | ||
266 | string requestingAgentID = request["RequestingAgentID"].ToString(); | ||
267 | string reason = string.Empty; | ||
268 | |||
269 | m_GroupsService.RemoveAgentFromGroup(requestingAgentID, agentID, groupID); | ||
270 | } | ||
271 | |||
272 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
273 | result["RESULT"] = "true"; | ||
274 | return Util.UTF8NoBomEncoding.GetBytes(ServerUtils.BuildXmlResponse(result)); | ||
275 | } | ||
276 | |||
277 | byte[] HandleGetMembership(Dictionary<string, object> request) | ||
278 | { | ||
279 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
280 | |||
281 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("AgentID")) | ||
282 | NullResult(result, "Bad network data"); | ||
283 | else | ||
284 | { | ||
285 | string agentID = request["AgentID"].ToString(); | ||
286 | UUID groupID = UUID.Zero; | ||
287 | if (request.ContainsKey("GroupID")) | ||
288 | groupID = new UUID(request["GroupID"].ToString()); | ||
289 | string requestingAgentID = request["RequestingAgentID"].ToString(); | ||
290 | bool all = request.ContainsKey("ALL"); | ||
291 | |||
292 | if (!all) | ||
293 | { | ||
294 | ExtendedGroupMembershipData membership = null; | ||
295 | if (groupID == UUID.Zero) | ||
296 | { | ||
297 | membership = m_GroupsService.GetAgentActiveMembership(requestingAgentID, agentID); | ||
298 | } | ||
299 | else | ||
300 | { | ||
301 | membership = m_GroupsService.GetAgentGroupMembership(requestingAgentID, agentID, groupID); | ||
302 | } | ||
303 | |||
304 | if (membership == null) | ||
305 | NullResult(result, "No such membership"); | ||
306 | else | ||
307 | result["RESULT"] = GroupsDataUtils.GroupMembershipData(membership); | ||
308 | } | ||
309 | else | ||
310 | { | ||
311 | List<GroupMembershipData> memberships = m_GroupsService.GetAgentGroupMemberships(requestingAgentID, agentID); | ||
312 | if (memberships == null || (memberships != null && memberships.Count == 0)) | ||
313 | { | ||
314 | NullResult(result, "No memberships"); | ||
315 | } | ||
316 | else | ||
317 | { | ||
318 | Dictionary<string, object> dict = new Dictionary<string, object>(); | ||
319 | int i = 0; | ||
320 | foreach (GroupMembershipData m in memberships) | ||
321 | dict["m-" + i++] = GroupsDataUtils.GroupMembershipData((ExtendedGroupMembershipData)m); | ||
322 | |||
323 | result["RESULT"] = dict; | ||
324 | } | ||
325 | } | ||
326 | } | ||
327 | |||
328 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
329 | |||
330 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
331 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
332 | } | ||
333 | |||
334 | byte[] HandleGetGroupMembers(Dictionary<string, object> request) | ||
335 | { | ||
336 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
337 | |||
338 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID")) | ||
339 | NullResult(result, "Bad network data"); | ||
340 | else | ||
341 | { | ||
342 | UUID groupID = new UUID(request["GroupID"].ToString()); | ||
343 | string requestingAgentID = request["RequestingAgentID"].ToString(); | ||
344 | |||
345 | List<ExtendedGroupMembersData> members = m_GroupsService.GetGroupMembers(requestingAgentID, groupID); | ||
346 | if (members == null || (members != null && members.Count == 0)) | ||
347 | { | ||
348 | NullResult(result, "No members"); | ||
349 | } | ||
350 | else | ||
351 | { | ||
352 | Dictionary<string, object> dict = new Dictionary<string, object>(); | ||
353 | int i = 0; | ||
354 | foreach (ExtendedGroupMembersData m in members) | ||
355 | { | ||
356 | dict["m-" + i++] = GroupsDataUtils.GroupMembersData(m); | ||
357 | } | ||
358 | |||
359 | result["RESULT"] = dict; | ||
360 | } | ||
361 | } | ||
362 | |||
363 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
364 | |||
365 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
366 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
367 | } | ||
368 | |||
369 | byte[] HandlePutRole(Dictionary<string, object> request) | ||
370 | { | ||
371 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
372 | |||
373 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID") || !request.ContainsKey("RoleID") || | ||
374 | !request.ContainsKey("Name") || !request.ContainsKey("Descrption") || !request.ContainsKey("Title") || | ||
375 | !request.ContainsKey("Powers") || !request.ContainsKey("OP")) | ||
376 | NullResult(result, "Bad network data"); | ||
377 | |||
378 | else | ||
379 | { | ||
380 | string op = request["OP"].ToString(); | ||
381 | string reason = string.Empty; | ||
382 | |||
383 | bool success = false; | ||
384 | if (op == "ADD") | ||
385 | success = m_GroupsService.AddGroupRole(request["RequestingAgentID"].ToString(), new UUID(request["GroupID"].ToString()), | ||
386 | new UUID(request["RoleID"].ToString()), request["Name"].ToString(), request["Description"].ToString(), | ||
387 | request["Title"].ToString(), UInt64.Parse(request["Powers"].ToString()), out reason); | ||
388 | |||
389 | else if (op == "UPDATE") | ||
390 | success = m_GroupsService.UpdateGroupRole(request["RequestingAgentID"].ToString(), new UUID(request["GroupID"].ToString()), | ||
391 | new UUID(request["RoleID"].ToString()), request["Name"].ToString(), request["Description"].ToString(), | ||
392 | request["Title"].ToString(), UInt64.Parse(request["Powers"].ToString())); | ||
393 | |||
394 | result["RESULT"] = success.ToString(); | ||
395 | } | ||
396 | |||
397 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
398 | |||
399 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
400 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
401 | } | ||
402 | |||
403 | byte[] HandleRemoveRole(Dictionary<string, object> request) | ||
404 | { | ||
405 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
406 | |||
407 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID") || !request.ContainsKey("RoleID")) | ||
408 | NullResult(result, "Bad network data"); | ||
409 | |||
410 | else | ||
411 | { | ||
412 | m_GroupsService.RemoveGroupRole(request["RequestingAgentID"].ToString(), new UUID(request["GroupID"].ToString()), | ||
413 | new UUID(request["RoleID"].ToString())); | ||
414 | result["RESULT"] = "true"; | ||
415 | } | ||
416 | |||
417 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
418 | return Util.UTF8NoBomEncoding.GetBytes(ServerUtils.BuildXmlResponse(result)); | ||
419 | } | ||
420 | |||
421 | byte[] HandleGetGroupRoles(Dictionary<string, object> request) | ||
422 | { | ||
423 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
424 | |||
425 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID")) | ||
426 | NullResult(result, "Bad network data"); | ||
427 | else | ||
428 | { | ||
429 | UUID groupID = new UUID(request["GroupID"].ToString()); | ||
430 | string requestingAgentID = request["RequestingAgentID"].ToString(); | ||
431 | |||
432 | List<GroupRolesData> roles = m_GroupsService.GetGroupRoles(requestingAgentID, groupID); | ||
433 | if (roles == null || (roles != null && roles.Count == 0)) | ||
434 | { | ||
435 | NullResult(result, "No members"); | ||
436 | } | ||
437 | else | ||
438 | { | ||
439 | Dictionary<string, object> dict = new Dictionary<string, object>(); | ||
440 | int i = 0; | ||
441 | foreach (GroupRolesData r in roles) | ||
442 | dict["r-" + i++] = GroupsDataUtils.GroupRolesData(r); | ||
443 | |||
444 | result["RESULT"] = dict; | ||
445 | } | ||
446 | } | ||
447 | |||
448 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
449 | |||
450 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
451 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
452 | } | ||
453 | |||
454 | byte[] HandleGetRoleMembers(Dictionary<string, object> request) | ||
455 | { | ||
456 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
457 | |||
458 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID")) | ||
459 | NullResult(result, "Bad network data"); | ||
460 | else | ||
461 | { | ||
462 | UUID groupID = new UUID(request["GroupID"].ToString()); | ||
463 | string requestingAgentID = request["RequestingAgentID"].ToString(); | ||
464 | |||
465 | List<ExtendedGroupRoleMembersData> rmembers = m_GroupsService.GetGroupRoleMembers(requestingAgentID, groupID); | ||
466 | if (rmembers == null || (rmembers != null && rmembers.Count == 0)) | ||
467 | { | ||
468 | NullResult(result, "No members"); | ||
469 | } | ||
470 | else | ||
471 | { | ||
472 | Dictionary<string, object> dict = new Dictionary<string, object>(); | ||
473 | int i = 0; | ||
474 | foreach (ExtendedGroupRoleMembersData rm in rmembers) | ||
475 | dict["rm-" + i++] = GroupsDataUtils.GroupRoleMembersData(rm); | ||
476 | |||
477 | result["RESULT"] = dict; | ||
478 | } | ||
479 | } | ||
480 | |||
481 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
482 | |||
483 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
484 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
485 | } | ||
486 | |||
487 | byte[] HandleAgentRole(Dictionary<string, object> request) | ||
488 | { | ||
489 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
490 | |||
491 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID") || !request.ContainsKey("RoleID") || | ||
492 | !request.ContainsKey("AgentID") || !request.ContainsKey("OP")) | ||
493 | NullResult(result, "Bad network data"); | ||
494 | |||
495 | else | ||
496 | { | ||
497 | string op = request["OP"].ToString(); | ||
498 | string reason = string.Empty; | ||
499 | |||
500 | bool success = false; | ||
501 | if (op == "ADD") | ||
502 | success = m_GroupsService.AddAgentToGroupRole(request["RequestingAgentID"].ToString(), request["AgentID"].ToString(), | ||
503 | new UUID(request["GroupID"].ToString()), new UUID(request["RoleID"].ToString())); | ||
504 | |||
505 | else if (op == "DELETE") | ||
506 | success = m_GroupsService.RemoveAgentFromGroupRole(request["RequestingAgentID"].ToString(), request["AgentID"].ToString(), | ||
507 | new UUID(request["GroupID"].ToString()), new UUID(request["RoleID"].ToString())); | ||
508 | |||
509 | result["RESULT"] = success.ToString(); | ||
510 | } | ||
511 | |||
512 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
513 | |||
514 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
515 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
516 | } | ||
517 | |||
518 | byte[] HandleGetAgentRoles(Dictionary<string, object> request) | ||
519 | { | ||
520 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
521 | |||
522 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID") || !request.ContainsKey("AgentID")) | ||
523 | NullResult(result, "Bad network data"); | ||
524 | else | ||
525 | { | ||
526 | UUID groupID = new UUID(request["GroupID"].ToString()); | ||
527 | string agentID = request["AgentID"].ToString(); | ||
528 | string requestingAgentID = request["RequestingAgentID"].ToString(); | ||
529 | |||
530 | List<GroupRolesData> roles = m_GroupsService.GetAgentGroupRoles(requestingAgentID, agentID, groupID); | ||
531 | if (roles == null || (roles != null && roles.Count == 0)) | ||
532 | { | ||
533 | NullResult(result, "No members"); | ||
534 | } | ||
535 | else | ||
536 | { | ||
537 | Dictionary<string, object> dict = new Dictionary<string, object>(); | ||
538 | int i = 0; | ||
539 | foreach (GroupRolesData r in roles) | ||
540 | dict["r-" + i++] = GroupsDataUtils.GroupRolesData(r); | ||
541 | |||
542 | result["RESULT"] = dict; | ||
543 | } | ||
544 | } | ||
545 | |||
546 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
547 | |||
548 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
549 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
550 | } | ||
551 | |||
552 | byte[] HandleSetActive(Dictionary<string, object> request) | ||
553 | { | ||
554 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
555 | |||
556 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID") || | ||
557 | !request.ContainsKey("AgentID") || !request.ContainsKey("OP")) | ||
558 | { | ||
559 | NullResult(result, "Bad network data"); | ||
560 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
561 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
562 | } | ||
563 | else | ||
564 | { | ||
565 | string op = request["OP"].ToString(); | ||
566 | string reason = string.Empty; | ||
567 | |||
568 | if (op == "GROUP") | ||
569 | { | ||
570 | ExtendedGroupMembershipData group = m_GroupsService.SetAgentActiveGroup(request["RequestingAgentID"].ToString(), | ||
571 | request["AgentID"].ToString(), new UUID(request["GroupID"].ToString())); | ||
572 | |||
573 | if (group == null) | ||
574 | NullResult(result, "Internal error"); | ||
575 | else | ||
576 | result["RESULT"] = GroupsDataUtils.GroupMembershipData(group); | ||
577 | |||
578 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
579 | |||
580 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
581 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
582 | |||
583 | } | ||
584 | else if (op == "ROLE" && request.ContainsKey("RoleID")) | ||
585 | { | ||
586 | m_GroupsService.SetAgentActiveGroupRole(request["RequestingAgentID"].ToString(), request["AgentID"].ToString(), | ||
587 | new UUID(request["GroupID"].ToString()), new UUID(request["RoleID"].ToString())); | ||
588 | result["RESULT"] = "true"; | ||
589 | } | ||
590 | |||
591 | return Util.UTF8NoBomEncoding.GetBytes(ServerUtils.BuildXmlResponse(result)); | ||
592 | } | ||
593 | |||
594 | } | ||
595 | |||
596 | byte[] HandleUpdateMembership(Dictionary<string, object> request) | ||
597 | { | ||
598 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
599 | |||
600 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("AgentID") || !request.ContainsKey("GroupID") || | ||
601 | !request.ContainsKey("AcceptNotices") || !request.ContainsKey("ListInProfile")) | ||
602 | NullResult(result, "Bad network data"); | ||
603 | |||
604 | else | ||
605 | { | ||
606 | m_GroupsService.UpdateMembership(request["RequestingAgentID"].ToString(), request["AgentID"].ToString(), new UUID(request["GroupID"].ToString()), | ||
607 | bool.Parse(request["AcceptNotices"].ToString()), bool.Parse(request["ListInProfile"].ToString())); | ||
608 | |||
609 | result["RESULT"] = "true"; | ||
610 | } | ||
611 | |||
612 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
613 | return Util.UTF8NoBomEncoding.GetBytes(ServerUtils.BuildXmlResponse(result)); | ||
614 | } | ||
615 | |||
616 | byte[] HandleInvite(Dictionary<string, object> request) | ||
617 | { | ||
618 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
619 | |||
620 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("InviteID")) | ||
621 | { | ||
622 | NullResult(result, "Bad network data"); | ||
623 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
624 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
625 | } | ||
626 | else | ||
627 | { | ||
628 | string op = request["OP"].ToString(); | ||
629 | string reason = string.Empty; | ||
630 | |||
631 | if (op == "ADD" && request.ContainsKey("GroupID") && request.ContainsKey("RoleID") && request.ContainsKey("AgentID")) | ||
632 | { | ||
633 | bool success = m_GroupsService.AddAgentToGroupInvite(request["RequestingAgentID"].ToString(), | ||
634 | new UUID(request["InviteID"].ToString()), new UUID(request["GroupID"].ToString()), | ||
635 | new UUID(request["RoleID"].ToString()), request["AgentID"].ToString()); | ||
636 | |||
637 | result["RESULT"] = success.ToString(); | ||
638 | return Util.UTF8NoBomEncoding.GetBytes(ServerUtils.BuildXmlResponse(result)); | ||
639 | |||
640 | } | ||
641 | else if (op == "DELETE") | ||
642 | { | ||
643 | m_GroupsService.RemoveAgentToGroupInvite(request["RequestingAgentID"].ToString(), new UUID(request["InviteID"].ToString())); | ||
644 | result["RESULT"] = "true"; | ||
645 | return Util.UTF8NoBomEncoding.GetBytes(ServerUtils.BuildXmlResponse(result)); | ||
646 | } | ||
647 | else if (op == "GET") | ||
648 | { | ||
649 | GroupInviteInfo invite = m_GroupsService.GetAgentToGroupInvite(request["RequestingAgentID"].ToString(), | ||
650 | new UUID(request["InviteID"].ToString())); | ||
651 | |||
652 | result["RESULT"] = GroupsDataUtils.GroupInviteInfo(invite); | ||
653 | return Util.UTF8NoBomEncoding.GetBytes(ServerUtils.BuildXmlResponse(result)); | ||
654 | } | ||
655 | |||
656 | NullResult(result, "Bad OP in request"); | ||
657 | return Util.UTF8NoBomEncoding.GetBytes(ServerUtils.BuildXmlResponse(result)); | ||
658 | } | ||
659 | |||
660 | } | ||
661 | |||
662 | byte[] HandleAddNotice(Dictionary<string, object> request) | ||
663 | { | ||
664 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
665 | |||
666 | if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID") || !request.ContainsKey("NoticeID") || | ||
667 | !request.ContainsKey("FromName") || !request.ContainsKey("Subject") || !request.ContainsKey("Message") || | ||
668 | !request.ContainsKey("HasAttachment")) | ||
669 | NullResult(result, "Bad network data"); | ||
670 | |||
671 | else | ||
672 | { | ||
673 | |||
674 | bool hasAtt = bool.Parse(request["HasAttachment"].ToString()); | ||
675 | byte attType = 0; | ||
676 | string attName = string.Empty; | ||
677 | string attOwner = string.Empty; | ||
678 | UUID attItem = UUID.Zero; | ||
679 | if (request.ContainsKey("AttachmentType")) | ||
680 | attType = byte.Parse(request["AttachmentType"].ToString()); | ||
681 | if (request.ContainsKey("AttachmentName")) | ||
682 | attName = request["AttachmentName"].ToString(); | ||
683 | if (request.ContainsKey("AttachmentItemID")) | ||
684 | attItem = new UUID(request["AttachmentItemID"].ToString()); | ||
685 | if (request.ContainsKey("AttachmentOwnerID")) | ||
686 | attOwner = request["AttachmentOwnerID"].ToString(); | ||
687 | |||
688 | bool success = m_GroupsService.AddGroupNotice(request["RequestingAgentID"].ToString(), new UUID(request["GroupID"].ToString()), | ||
689 | new UUID(request["NoticeID"].ToString()), request["FromName"].ToString(), request["Subject"].ToString(), | ||
690 | request["Message"].ToString(), hasAtt, attType, attName, attItem, attOwner); | ||
691 | |||
692 | result["RESULT"] = success.ToString(); | ||
693 | } | ||
694 | |||
695 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
696 | |||
697 | //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString); | ||
698 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
699 | } | ||
700 | |||
701 | byte[] HandleGetNotices(Dictionary<string, object> request) | ||
702 | { | ||
703 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
704 | |||
705 | if (!request.ContainsKey("RequestingAgentID")) | ||
706 | NullResult(result, "Bad network data"); | ||
707 | |||
708 | else if (request.ContainsKey("NoticeID")) // just one | ||
709 | { | ||
710 | GroupNoticeInfo notice = m_GroupsService.GetGroupNotice(request["RequestingAgentID"].ToString(), new UUID(request["NoticeID"].ToString())); | ||
711 | |||
712 | if (notice == null) | ||
713 | NullResult(result, "NO such notice"); | ||
714 | else | ||
715 | result["RESULT"] = GroupsDataUtils.GroupNoticeInfo(notice); | ||
716 | |||
717 | } | ||
718 | else if (request.ContainsKey("GroupID")) // all notices for group | ||
719 | { | ||
720 | List<ExtendedGroupNoticeData> notices = m_GroupsService.GetGroupNotices(request["RequestingAgentID"].ToString(), new UUID(request["GroupID"].ToString())); | ||
721 | |||
722 | if (notices == null || (notices != null && notices.Count == 0)) | ||
723 | NullResult(result, "No notices"); | ||
724 | else | ||
725 | { | ||
726 | Dictionary<string, object> dict = new Dictionary<string, object>(); | ||
727 | int i = 0; | ||
728 | foreach (ExtendedGroupNoticeData n in notices) | ||
729 | dict["n-" + i++] = GroupsDataUtils.GroupNoticeData(n); | ||
730 | |||
731 | result["RESULT"] = dict; | ||
732 | } | ||
733 | |||
734 | } | ||
735 | else | ||
736 | NullResult(result, "Bad OP in request"); | ||
737 | |||
738 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
739 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
740 | } | ||
741 | |||
742 | |||
743 | #region Helpers | ||
744 | |||
745 | private void NullResult(Dictionary<string, object> result, string reason) | ||
746 | { | ||
747 | result["RESULT"] = "NULL"; | ||
748 | result["REASON"] = reason; | ||
749 | } | ||
750 | |||
751 | private byte[] FailureResult() | ||
752 | { | ||
753 | Dictionary<string, object> result = new Dictionary<string, object>(); | ||
754 | NullResult(result, "Unknown method"); | ||
755 | string xmlString = ServerUtils.BuildXmlResponse(result); | ||
756 | return Util.UTF8NoBomEncoding.GetBytes(xmlString); | ||
757 | } | ||
758 | #endregion | ||
759 | } | ||
760 | } | ||