aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs293
1 files changed, 293 insertions, 0 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs
new file mode 100644
index 0000000..0883c5b
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs
@@ -0,0 +1,293 @@
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
28using System;
29using System.Collections.Generic;
30using System.IO;
31using System.Reflection;
32using System.Xml;
33
34using OpenSim.Framework;
35using OpenSim.Server.Base;
36using OpenSim.Framework.Servers.HttpServer;
37using FriendInfo = OpenSim.Services.Interfaces.FriendInfo;
38
39using OpenMetaverse;
40using log4net;
41
42namespace OpenSim.Region.CoreModules.Avatar.Friends
43{
44 public class FriendsRequestHandler : BaseStreamHandler
45 {
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47
48 private FriendsModule m_FriendsModule;
49
50 public FriendsRequestHandler(FriendsModule fmodule)
51 : base("POST", "/friends")
52 {
53 m_FriendsModule = fmodule;
54 }
55
56 public override byte[] Handle(string path, Stream requestData,
57 OSHttpRequest httpRequest, OSHttpResponse httpResponse)
58 {
59 StreamReader sr = new StreamReader(requestData);
60 string body = sr.ReadToEnd();
61 sr.Close();
62 body = body.Trim();
63
64 m_log.DebugFormat("[XXX]: query String: {0}", body);
65
66 try
67 {
68 Dictionary<string, object> request =
69 ServerUtils.ParseQueryString(body);
70
71 if (!request.ContainsKey("METHOD"))
72 return FailureResult();
73
74 string method = request["METHOD"].ToString();
75 request.Remove("METHOD");
76
77 switch (method)
78 {
79 case "friendship_offered":
80 return FriendshipOffered(request);
81 case "friendship_approved":
82 return FriendshipApproved(request);
83 case "friendship_denied":
84 return FriendshipDenied(request);
85 case "friendship_terminated":
86 return FriendshipTerminated(request);
87 case "grant_rights":
88 return GrantRights(request);
89 case "status":
90 return StatusNotification(request);
91 }
92 }
93 catch (Exception e)
94 {
95 m_log.Debug("[FRIENDS]: Exception {0}" + e.ToString());
96 }
97
98 return FailureResult();
99 }
100
101 byte[] FriendshipOffered(Dictionary<string, object> request)
102 {
103 UUID fromID = UUID.Zero;
104 UUID toID = UUID.Zero;
105 string message = string.Empty;
106
107 if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID"))
108 return FailureResult();
109
110 message = request["Message"].ToString();
111
112 if (!UUID.TryParse(request["FromID"].ToString(), out fromID))
113 return FailureResult();
114
115 if (!UUID.TryParse(request["ToID"].ToString(), out toID))
116 return FailureResult();
117
118 GridInstantMessage im = new GridInstantMessage(m_FriendsModule.Scene, fromID, "", toID,
119 (byte)InstantMessageDialog.FriendshipOffered, message, false, Vector3.Zero);
120
121 if (m_FriendsModule.LocalFriendshipOffered(toID, im))
122 return SuccessResult();
123
124 return FailureResult();
125 }
126
127 byte[] FriendshipApproved(Dictionary<string, object> request)
128 {
129 UUID fromID = UUID.Zero;
130 UUID toID = UUID.Zero;
131 string fromName = string.Empty;
132
133 if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID"))
134 return FailureResult();
135
136 if (!UUID.TryParse(request["FromID"].ToString(), out fromID))
137 return FailureResult();
138
139 if (!UUID.TryParse(request["ToID"].ToString(), out toID))
140 return FailureResult();
141
142 if (request.ContainsKey("FromName"))
143 fromName = request["FromName"].ToString();
144
145 if (m_FriendsModule.LocalFriendshipApproved(fromID, fromName, toID))
146 return SuccessResult();
147
148 return FailureResult();
149 }
150
151 byte[] FriendshipDenied(Dictionary<string, object> request)
152 {
153 UUID fromID = UUID.Zero;
154 UUID toID = UUID.Zero;
155 string fromName = string.Empty;
156
157 if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID"))
158 return FailureResult();
159
160 if (!UUID.TryParse(request["FromID"].ToString(), out fromID))
161 return FailureResult();
162
163 if (!UUID.TryParse(request["ToID"].ToString(), out toID))
164 return FailureResult();
165
166 if (request.ContainsKey("FromName"))
167 fromName = request["FromName"].ToString();
168
169 if (m_FriendsModule.LocalFriendshipDenied(fromID, fromName, toID))
170 return SuccessResult();
171
172 return FailureResult();
173 }
174
175 byte[] FriendshipTerminated(Dictionary<string, object> request)
176 {
177 UUID fromID = UUID.Zero;
178 UUID toID = UUID.Zero;
179
180 if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID"))
181 return FailureResult();
182
183 if (!UUID.TryParse(request["FromID"].ToString(), out fromID))
184 return FailureResult();
185
186 if (!UUID.TryParse(request["ToID"].ToString(), out toID))
187 return FailureResult();
188
189 if (m_FriendsModule.LocalFriendshipTerminated(toID))
190 return SuccessResult();
191
192 return FailureResult();
193 }
194
195 byte[] GrantRights(Dictionary<string, object> request)
196 {
197 UUID fromID = UUID.Zero;
198 UUID toID = UUID.Zero;
199 int rights = 0, userFlags = 0;
200
201 if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID"))
202 return FailureResult();
203
204 if (!UUID.TryParse(request["FromID"].ToString(), out fromID))
205 return FailureResult();
206
207 if (!UUID.TryParse(request["ToID"].ToString(), out toID))
208 return FailureResult();
209
210 if (!Int32.TryParse(request["UserFlags"].ToString(), out userFlags))
211 return FailureResult();
212
213 if (!Int32.TryParse(request["Rights"].ToString(), out rights))
214 return FailureResult();
215
216 if (m_FriendsModule.LocalGrantRights(UUID.Zero, UUID.Zero, userFlags, rights))
217 return SuccessResult();
218
219 return FailureResult();
220 }
221
222 byte[] StatusNotification(Dictionary<string, object> request)
223 {
224 UUID fromID = UUID.Zero;
225 UUID toID = UUID.Zero;
226 bool online = false;
227
228 if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID") || !request.ContainsKey("Online"))
229 return FailureResult();
230
231 if (!UUID.TryParse(request["FromID"].ToString(), out fromID))
232 return FailureResult();
233
234 if (!UUID.TryParse(request["ToID"].ToString(), out toID))
235 return FailureResult();
236
237 if (!Boolean.TryParse(request["Online"].ToString(), out online))
238 return FailureResult();
239
240 if (m_FriendsModule.LocalStatusNotification(fromID, toID, online))
241 return SuccessResult();
242
243 return FailureResult();
244 }
245
246 #region Misc
247
248 private byte[] FailureResult()
249 {
250 return BoolResult(false);
251 }
252
253 private byte[] SuccessResult()
254 {
255 return BoolResult(true);
256 }
257
258 private byte[] BoolResult(bool value)
259 {
260 XmlDocument doc = new XmlDocument();
261
262 XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration,
263 "", "");
264
265 doc.AppendChild(xmlnode);
266
267 XmlElement rootElement = doc.CreateElement("", "ServerResponse",
268 "");
269
270 doc.AppendChild(rootElement);
271
272 XmlElement result = doc.CreateElement("", "RESULT", "");
273 result.AppendChild(doc.CreateTextNode(value.ToString()));
274
275 rootElement.AppendChild(result);
276
277 return DocToBytes(doc);
278 }
279
280 private byte[] DocToBytes(XmlDocument doc)
281 {
282 MemoryStream ms = new MemoryStream();
283 XmlTextWriter xw = new XmlTextWriter(ms, null);
284 xw.Formatting = Formatting.Indented;
285 doc.WriteTo(xw);
286 xw.Flush();
287
288 return ms.ToArray();
289 }
290
291 #endregion
292 }
293}