clockwerk-opensim-stable – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 vero 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 HGGroupsServiceRobustConnector : ServiceConnector
46 {
47 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
48  
49 private HGGroupsService m_GroupsService;
50 private string m_ConfigName = "Groups";
51  
52 // Called by Robust shell
53 public HGGroupsServiceRobustConnector(IConfigSource config, IHttpServer server, string configName) :
54 this(config, server, configName, null, null)
55 {
56 }
57  
58 // Called by the sim-bound module
59 public HGGroupsServiceRobustConnector(IConfigSource config, IHttpServer server, string configName, IOfflineIMService im, IUserAccountService users) :
60 base(config, server, configName)
61 {
62 if (configName != String.Empty)
63 m_ConfigName = configName;
64  
65 m_log.DebugFormat("[Groups.RobustHGConnector]: Starting with config name {0}", m_ConfigName);
66  
67 string homeURI = Util.GetConfigVarFromSections<string>(config, "HomeURI",
68 new string[] { "Startup", "Hypergrid", m_ConfigName}, string.Empty);
69 if (homeURI == string.Empty)
70 throw new Exception(String.Format("[Groups.RobustHGConnector]: please provide the HomeURI [Startup] or in section {0}", m_ConfigName));
71  
72 IConfig cnf = config.Configs[m_ConfigName];
73 if (cnf == null)
74 throw new Exception(String.Format("[Groups.RobustHGConnector]: {0} section does not exist", m_ConfigName));
75  
76 if (im == null)
77 {
78 string imDll = cnf.GetString("OfflineIMService", string.Empty);
79 if (imDll == string.Empty)
80 throw new Exception(String.Format("[Groups.RobustHGConnector]: please provide OfflineIMService in section {0}", m_ConfigName));
81  
82 Object[] args = new Object[] { config };
83 im = ServerUtils.LoadPlugin<IOfflineIMService>(imDll, args);
84 }
85  
86 if (users == null)
87 {
88 string usersDll = cnf.GetString("UserAccountService", string.Empty);
89 if (usersDll == string.Empty)
90 throw new Exception(String.Format("[Groups.RobustHGConnector]: please provide UserAccountService in section {0}", m_ConfigName));
91  
92 Object[] args = new Object[] { config };
93 users = ServerUtils.LoadPlugin<IUserAccountService>(usersDll, args);
94 }
95  
96 m_GroupsService = new HGGroupsService(config, im, users, homeURI);
97  
98 server.AddStreamHandler(new HGGroupsServicePostHandler(m_GroupsService));
99 }
100  
101 }
102  
103 public class HGGroupsServicePostHandler : BaseStreamHandler
104 {
105 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
106  
107 private HGGroupsService m_GroupsService;
108  
109 public HGGroupsServicePostHandler(HGGroupsService service) :
110 base("POST", "/hg-groups")
111 {
112 m_GroupsService = service;
113 }
114  
115 protected override byte[] ProcessRequest(string path, Stream requestData,
116 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
117 {
118 StreamReader sr = new StreamReader(requestData);
119 string body = sr.ReadToEnd();
120 sr.Close();
121 body = body.Trim();
122  
123 //m_log.DebugFormat("[XXX]: query String: {0}", body);
124  
125 try
126 {
127 Dictionary<string, object> request =
128 ServerUtils.ParseQueryString(body);
129  
130 if (!request.ContainsKey("METHOD"))
131 return FailureResult();
132  
133 string method = request["METHOD"].ToString();
134 request.Remove("METHOD");
135  
136 m_log.DebugFormat("[Groups.RobustHGConnector]: {0}", method);
137 switch (method)
138 {
139 case "POSTGROUP":
140 return HandleAddGroupProxy(request);
141 case "REMOVEAGENTFROMGROUP":
142 return HandleRemoveAgentFromGroup(request);
143 case "GETGROUP":
144 return HandleGetGroup(request);
145 case "ADDNOTICE":
146 return HandleAddNotice(request);
147 case "VERIFYNOTICE":
148 return HandleVerifyNotice(request);
149 case "GETGROUPMEMBERS":
150 return HandleGetGroupMembers(request);
151 case "GETGROUPROLES":
152 return HandleGetGroupRoles(request);
153 case "GETROLEMEMBERS":
154 return HandleGetRoleMembers(request);
155  
156 }
157 m_log.DebugFormat("[Groups.RobustHGConnector]: unknown method request: {0}", method);
158 }
159 catch (Exception e)
160 {
161 m_log.DebugFormat("[Groups.RobustHGConnector]: Exception {0}", e.StackTrace);
162 }
163  
164 return FailureResult();
165 }
166  
167 byte[] HandleAddGroupProxy(Dictionary<string, object> request)
168 {
169 Dictionary<string, object> result = new Dictionary<string, object>();
170  
171 if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID")
172 || !request.ContainsKey("AgentID")
173 || !request.ContainsKey("AccessToken") || !request.ContainsKey("Location"))
174 NullResult(result, "Bad network data");
175  
176 else
177 {
178 string RequestingAgentID = request["RequestingAgentID"].ToString();
179 string agentID = request["AgentID"].ToString();
180 UUID groupID = new UUID(request["GroupID"].ToString());
181 string accessToken = request["AccessToken"].ToString();
182 string location = request["Location"].ToString();
183 string name = string.Empty;
184 if (request.ContainsKey("Name"))
185 name = request["Name"].ToString();
186  
187 string reason = string.Empty;
188 bool success = m_GroupsService.CreateGroupProxy(RequestingAgentID, agentID, accessToken, groupID, location, name, out reason);
189 result["REASON"] = reason;
190 result["RESULT"] = success.ToString();
191 }
192  
193 string xmlString = ServerUtils.BuildXmlResponse(result);
194  
195 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
196 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
197 }
198  
199 byte[] HandleRemoveAgentFromGroup(Dictionary<string, object> request)
200 {
201 Dictionary<string, object> result = new Dictionary<string, object>();
202  
203 if (!request.ContainsKey("AccessToken") || !request.ContainsKey("AgentID") ||
204 !request.ContainsKey("GroupID"))
205 NullResult(result, "Bad network data");
206 else
207 {
208 UUID groupID = new UUID(request["GroupID"].ToString());
209 string agentID = request["AgentID"].ToString();
210 string token = request["AccessToken"].ToString();
211  
212 m_GroupsService.RemoveAgentFromGroup(agentID, agentID, groupID, token);
213 }
214  
215 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
216 result["RESULT"] = "true";
217 return Util.UTF8NoBomEncoding.GetBytes(ServerUtils.BuildXmlResponse(result));
218 }
219  
220 byte[] HandleGetGroup(Dictionary<string, object> request)
221 {
222 Dictionary<string, object> result = new Dictionary<string, object>();
223  
224 if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("AccessToken"))
225 NullResult(result, "Bad network data");
226 else
227 {
228 string RequestingAgentID = request["RequestingAgentID"].ToString();
229 string token = request["AccessToken"].ToString();
230  
231 UUID groupID = UUID.Zero;
232 string groupName = string.Empty;
233  
234 if (request.ContainsKey("GroupID"))
235 groupID = new UUID(request["GroupID"].ToString());
236 if (request.ContainsKey("Name"))
237 groupName = request["Name"].ToString();
238  
239 ExtendedGroupRecord grec = m_GroupsService.GetGroupRecord(RequestingAgentID, groupID, groupName, token);
240 if (grec == null)
241 NullResult(result, "Group not found");
242 else
243 result["RESULT"] = GroupsDataUtils.GroupRecord(grec);
244 }
245  
246 string xmlString = ServerUtils.BuildXmlResponse(result);
247  
248 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
249 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
250 }
251  
252 byte[] HandleGetGroupMembers(Dictionary<string, object> request)
253 {
254 Dictionary<string, object> result = new Dictionary<string, object>();
255  
256 if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID") || !request.ContainsKey("AccessToken"))
257 NullResult(result, "Bad network data");
258 else
259 {
260 UUID groupID = new UUID(request["GroupID"].ToString());
261 string requestingAgentID = request["RequestingAgentID"].ToString();
262 string token = request["AccessToken"].ToString();
263  
264 List<ExtendedGroupMembersData> members = m_GroupsService.GetGroupMembers(requestingAgentID, groupID, token);
265 if (members == null || (members != null && members.Count == 0))
266 {
267 NullResult(result, "No members");
268 }
269 else
270 {
271 Dictionary<string, object> dict = new Dictionary<string, object>();
272 int i = 0;
273 foreach (ExtendedGroupMembersData m in members)
274 {
275 dict["m-" + i++] = GroupsDataUtils.GroupMembersData(m);
276 }
277  
278 result["RESULT"] = dict;
279 }
280 }
281  
282 string xmlString = ServerUtils.BuildXmlResponse(result);
283  
284 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
285 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
286 }
287  
288 byte[] HandleGetGroupRoles(Dictionary<string, object> request)
289 {
290 Dictionary<string, object> result = new Dictionary<string, object>();
291  
292 if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID") || !request.ContainsKey("AccessToken"))
293 NullResult(result, "Bad network data");
294 else
295 {
296 UUID groupID = new UUID(request["GroupID"].ToString());
297 string requestingAgentID = request["RequestingAgentID"].ToString();
298 string token = request["AccessToken"].ToString();
299  
300 List<GroupRolesData> roles = m_GroupsService.GetGroupRoles(requestingAgentID, groupID, token);
301 if (roles == null || (roles != null && roles.Count == 0))
302 {
303 NullResult(result, "No members");
304 }
305 else
306 {
307 Dictionary<string, object> dict = new Dictionary<string, object>();
308 int i = 0;
309 foreach (GroupRolesData r in roles)
310 dict["r-" + i++] = GroupsDataUtils.GroupRolesData(r);
311  
312 result["RESULT"] = dict;
313 }
314 }
315  
316 string xmlString = ServerUtils.BuildXmlResponse(result);
317  
318 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
319 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
320 }
321  
322 byte[] HandleGetRoleMembers(Dictionary<string, object> request)
323 {
324 Dictionary<string, object> result = new Dictionary<string, object>();
325  
326 if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID") || !request.ContainsKey("AccessToken"))
327 NullResult(result, "Bad network data");
328 else
329 {
330 UUID groupID = new UUID(request["GroupID"].ToString());
331 string requestingAgentID = request["RequestingAgentID"].ToString();
332 string token = request["AccessToken"].ToString();
333  
334 List<ExtendedGroupRoleMembersData> rmembers = m_GroupsService.GetGroupRoleMembers(requestingAgentID, groupID, token);
335 if (rmembers == null || (rmembers != null && rmembers.Count == 0))
336 {
337 NullResult(result, "No members");
338 }
339 else
340 {
341 Dictionary<string, object> dict = new Dictionary<string, object>();
342 int i = 0;
343 foreach (ExtendedGroupRoleMembersData rm in rmembers)
344 dict["rm-" + i++] = GroupsDataUtils.GroupRoleMembersData(rm);
345  
346 result["RESULT"] = dict;
347 }
348 }
349  
350 string xmlString = ServerUtils.BuildXmlResponse(result);
351  
352 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
353 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
354 }
355  
356 byte[] HandleAddNotice(Dictionary<string, object> request)
357 {
358 Dictionary<string, object> result = new Dictionary<string, object>();
359  
360 if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID") || !request.ContainsKey("NoticeID") ||
361 !request.ContainsKey("FromName") || !request.ContainsKey("Subject") || !request.ContainsKey("Message") ||
362 !request.ContainsKey("HasAttachment"))
363 NullResult(result, "Bad network data");
364  
365 else
366 {
367  
368 bool hasAtt = bool.Parse(request["HasAttachment"].ToString());
369 byte attType = 0;
370 string attName = string.Empty;
371 string attOwner = string.Empty;
372 UUID attItem = UUID.Zero;
373 if (request.ContainsKey("AttachmentType"))
374 attType = byte.Parse(request["AttachmentType"].ToString());
375 if (request.ContainsKey("AttachmentName"))
376 attName = request["AttachmentType"].ToString();
377 if (request.ContainsKey("AttachmentItemID"))
378 attItem = new UUID(request["AttachmentItemID"].ToString());
379 if (request.ContainsKey("AttachmentOwnerID"))
380 attOwner = request["AttachmentOwnerID"].ToString();
381  
382 bool success = m_GroupsService.AddNotice(request["RequestingAgentID"].ToString(), new UUID(request["GroupID"].ToString()),
383 new UUID(request["NoticeID"].ToString()), request["FromName"].ToString(), request["Subject"].ToString(),
384 request["Message"].ToString(), hasAtt, attType, attName, attItem, attOwner);
385  
386 result["RESULT"] = success.ToString();
387 }
388  
389 string xmlString = ServerUtils.BuildXmlResponse(result);
390  
391 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
392 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
393 }
394  
395 byte[] HandleVerifyNotice(Dictionary<string, object> request)
396 {
397 Dictionary<string, object> result = new Dictionary<string, object>();
398  
399 if (!request.ContainsKey("NoticeID") || !request.ContainsKey("GroupID"))
400 NullResult(result, "Bad network data");
401  
402 else
403 {
404 UUID noticeID = new UUID(request["NoticeID"].ToString());
405 UUID groupID = new UUID(request["GroupID"].ToString());
406  
407 bool success = m_GroupsService.VerifyNotice(noticeID, groupID);
408 //m_log.DebugFormat("[XXX]: VerifyNotice returned {0}", success);
409 result["RESULT"] = success.ToString();
410 }
411  
412 string xmlString = ServerUtils.BuildXmlResponse(result);
413  
414 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
415 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
416 }
417  
418 //
419 //
420 //
421 //
422 //
423  
424 #region Helpers
425  
426 private void NullResult(Dictionary<string, object> result, string reason)
427 {
428 result["RESULT"] = "NULL";
429 result["REASON"] = reason;
430 }
431  
432 private byte[] FailureResult()
433 {
434 Dictionary<string, object> result = new Dictionary<string, object>();
435 NullResult(result, "Unknown method");
436 string xmlString = ServerUtils.BuildXmlResponse(result);
437 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
438 }
439  
440 #endregion
441 }
442 }