aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Grid/UserServer.Modules
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Grid/UserServer.Modules')
-rw-r--r--OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs550
-rw-r--r--OpenSim/Grid/UserServer.Modules/GridInfoServiceModule.cs79
-rw-r--r--OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs514
-rw-r--r--OpenSim/Grid/UserServer.Modules/OpenIdService.cs338
-rw-r--r--OpenSim/Grid/UserServer.Modules/UserDataBaseService.cs100
-rw-r--r--OpenSim/Grid/UserServer.Modules/UserLoginAuthService.cs225
-rw-r--r--OpenSim/Grid/UserServer.Modules/UserLoginService.cs423
-rw-r--r--OpenSim/Grid/UserServer.Modules/UserManager.cs718
-rw-r--r--OpenSim/Grid/UserServer.Modules/UserServerAvatarAppearanceModule.cs132
-rw-r--r--OpenSim/Grid/UserServer.Modules/UserServerFriendsModule.cs176
10 files changed, 0 insertions, 3255 deletions
diff --git a/OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs b/OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs
deleted file mode 100644
index 923b06c..0000000
--- a/OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs
+++ /dev/null
@@ -1,550 +0,0 @@
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;
30using System.Collections.Generic;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using Nwc.XmlRpc;
35using OpenMetaverse;
36using OpenSim.Framework;
37using OpenSim.Framework.Console;
38using OpenSim.Framework.Communications;
39using OpenSim.Framework.Servers;
40using OpenSim.Framework.Servers.HttpServer;
41using OpenSim.Grid.Framework;
42
43
44namespace OpenSim.Grid.UserServer.Modules
45{
46 public class AvatarCreationModule
47 {
48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
49
50 private UserDataBaseService m_userDataBaseService;
51 // private BaseHttpServer m_httpServer;
52 // TODO: unused: private UserConfig m_config;
53
54 private string m_inventoryServerUrl;
55 private IInterServiceInventoryServices m_inventoryService;
56
57 public AvatarCreationModule(UserDataBaseService userDataBaseService, UserConfig config, IInterServiceInventoryServices inventoryService)
58 {
59 // TODO: unused: m_config = config;
60 m_userDataBaseService = userDataBaseService;
61 m_inventoryService = inventoryService;
62 m_inventoryServerUrl = config.InventoryUrl.OriginalString;
63 }
64
65 public void Initialise(IGridServiceCore core)
66 {
67 CommandConsole console;
68 if (core.TryGet<CommandConsole>(out console))
69 {
70 console.Commands.AddCommand("userserver", false, "clone avatar",
71 "clone avatar <TemplateAvatarFirstName> <TemplateAvatarLastName> <TargetAvatarFirstName> <TargetAvatarLastName>",
72 "Clone the template avatar's inventory into a target avatar", RunCommand);
73 }
74 }
75
76 public void PostInitialise()
77 {
78
79 }
80
81 public void RegisterHandlers(BaseHttpServer httpServer)
82 {
83 }
84
85 public void RunCommand(string module, string[] cmd)
86 {
87 if ((cmd.Length == 6) && (cmd[0] == "clone") && (cmd[1] == "avatar"))
88 {
89 try
90 {
91 string tFirst = cmd[2];
92 string tLast = cmd[3];
93
94 string nFirst = cmd[4];
95 string nLast = cmd[5];
96
97 UserProfileData templateAvatar = m_userDataBaseService.GetUserProfile(tFirst, tLast);
98 UserProfileData newAvatar = m_userDataBaseService.GetUserProfile(nFirst, nLast);
99
100 if (templateAvatar == null)
101 {
102 m_log.ErrorFormat("[AvatarAppearance] Clone Avatar: Could not find template avatar {0} , {1}", tFirst, tLast);
103 return;
104 }
105
106 if (newAvatar == null)
107 {
108 m_log.ErrorFormat("[AvatarAppearance] Clone Avatar: Could not find target avatar {0} , {1}", nFirst, nLast);
109 return;
110 }
111 Guid avatar = newAvatar.ID.Guid;
112 Guid template = templateAvatar.ID.Guid;
113 CloneAvatar(avatar, template, true, true);
114
115 }
116 catch (Exception e)
117 {
118 m_log.Error("Error: " + e.ToString());
119 }
120 }
121 }
122 #region Avatar Appearance Creation
123
124 public bool CloneAvatar(Guid avatarID, Guid templateID, bool modifyPermissions, bool removeTargetsClothes)
125 {
126 m_log.InfoFormat("[AvatarAppearance] Starting to clone avatar {0} inventory to avatar {1}", templateID.ToString(), avatarID.ToString());
127 // TODO: unused: Guid bodyFolder = Guid.Empty;
128 // TODO: unused: Guid clothesFolder = Guid.Empty;
129 bool success = false;
130
131 UUID avID = new UUID(avatarID);
132 List<InventoryFolderBase> avatarInventory = m_inventoryService.GetInventorySkeleton(avID);
133 if ((avatarInventory == null) || (avatarInventory.Count == 0))
134 {
135 m_log.InfoFormat("[AvatarAppearance] No inventory found for user {0} , so creating it", avID.ToString());
136 m_inventoryService.CreateNewUserInventory(avID);
137 Thread.Sleep(5000);
138 avatarInventory = m_inventoryService.GetInventorySkeleton(avID);
139 }
140
141 if ((avatarInventory != null) && (avatarInventory.Count > 0))
142 {
143 UUID tempOwnID = new UUID(templateID);
144 AvatarAppearance appearance = m_userDataBaseService.GetUserAppearance(tempOwnID);
145
146 if (removeTargetsClothes)
147 {
148 //remove clothes and attachments from target avatar so that the end result isn't a merger of its existing clothes
149 // and the clothes from the template avatar.
150 RemoveClothesAndAttachments(avID);
151 }
152
153 List<InventoryFolderBase> templateInventory = m_inventoryService.GetInventorySkeleton(tempOwnID);
154 if ((templateInventory != null) && (templateInventory.Count != 0))
155 {
156 for (int i = 0; i < templateInventory.Count; i++)
157 {
158 if (templateInventory[i].ParentID == UUID.Zero)
159 {
160 success = CloneFolder(avatarInventory, avID, UUID.Zero, appearance, templateInventory[i], templateInventory, modifyPermissions);
161 break;
162 }
163 }
164 }
165 else
166 {
167 m_log.InfoFormat("[AvatarAppearance] Failed to find the template owner's {0} inventory", tempOwnID);
168 }
169 }
170 m_log.InfoFormat("[AvatarAppearance] finished cloning avatar with result: {0}", success);
171 return success;
172 }
173
174 private bool CloneFolder(List<InventoryFolderBase> avatarInventory, UUID avID, UUID parentFolder, AvatarAppearance appearance, InventoryFolderBase templateFolder, List<InventoryFolderBase> templateFolders, bool modifyPermissions)
175 {
176 bool success = false;
177 UUID templateFolderId = templateFolder.ID;
178 if (templateFolderId != UUID.Zero)
179 {
180 InventoryFolderBase toFolder = FindFolder(templateFolder.Name, parentFolder.Guid, avatarInventory);
181 if (toFolder == null)
182 {
183 //create new folder
184 toFolder = new InventoryFolderBase();
185 toFolder.ID = UUID.Random();
186 toFolder.Name = templateFolder.Name;
187 toFolder.Owner = avID;
188 toFolder.Type = templateFolder.Type;
189 toFolder.Version = 1;
190 toFolder.ParentID = parentFolder;
191 if (!SynchronousRestObjectRequester.MakeRequest<InventoryFolderBase, bool>(
192 "POST", m_inventoryServerUrl + "CreateFolder/", toFolder))
193 {
194 m_log.InfoFormat("[AvatarApperance] Couldn't make new folder {0} in users inventory", toFolder.Name);
195 return false;
196 }
197 else
198 {
199 // m_log.InfoFormat("made new folder {0} in users inventory", toFolder.Name);
200 }
201 }
202
203 List<InventoryItemBase> templateItems = SynchronousRestObjectRequester.MakeRequest<Guid, List<InventoryItemBase>>(
204 "POST", m_inventoryServerUrl + "GetItems/", templateFolderId.Guid);
205 if ((templateItems != null) && (templateItems.Count > 0))
206 {
207 List<ClothesAttachment> wornClothes = new List<ClothesAttachment>();
208 List<ClothesAttachment> attachedItems = new List<ClothesAttachment>();
209
210 foreach (InventoryItemBase item in templateItems)
211 {
212
213 UUID clonedItemId = CloneInventoryItem(avID, toFolder.ID, item, modifyPermissions);
214 if (clonedItemId != UUID.Zero)
215 {
216 int appearanceType = ItemIsPartOfAppearance(item, appearance);
217 if (appearanceType >= 0)
218 {
219 // UpdateAvatarAppearance(avID, appearanceType, clonedItemId, item.AssetID);
220 wornClothes.Add(new ClothesAttachment(appearanceType, clonedItemId, item.AssetID));
221 }
222
223 if (appearance != null)
224 {
225 int attachment = appearance.GetAttachpoint(item.ID);
226 if (attachment > 0)
227 {
228 //UpdateAvatarAttachment(avID, attachment, clonedItemId, item.AssetID);
229 attachedItems.Add(new ClothesAttachment(attachment, clonedItemId, item.AssetID));
230 }
231 }
232 success = true;
233 }
234 }
235
236 if ((wornClothes.Count > 0) || (attachedItems.Count > 0))
237 {
238 //Update the worn clothes and attachments
239 AvatarAppearance targetAppearance = GetAppearance(avID);
240 if (targetAppearance != null)
241 {
242 foreach (ClothesAttachment wornItem in wornClothes)
243 {
244 targetAppearance.Wearables[wornItem.Type].AssetID = wornItem.AssetID;
245 targetAppearance.Wearables[wornItem.Type].ItemID = wornItem.ItemID;
246 }
247
248 foreach (ClothesAttachment wornItem in attachedItems)
249 {
250 targetAppearance.SetAttachment(wornItem.Type, wornItem.ItemID, wornItem.AssetID);
251 }
252
253 m_userDataBaseService.UpdateUserAppearance(avID, targetAppearance);
254 wornClothes.Clear();
255 attachedItems.Clear();
256 }
257 }
258 }
259 else if ((templateItems != null) && (templateItems.Count == 0))
260 {
261 // m_log.Info("[AvatarAppearance]Folder being cloned was empty");
262 success = true;
263 }
264
265 List<InventoryFolderBase> subFolders = FindSubFolders(templateFolder.ID.Guid, templateFolders);
266 foreach (InventoryFolderBase subFolder in subFolders)
267 {
268 if (subFolder.Name.ToLower() != "trash")
269 {
270 success = CloneFolder(avatarInventory, avID, toFolder.ID, appearance, subFolder, templateFolders, modifyPermissions);
271 }
272 }
273 }
274 else
275 {
276 m_log.Info("[AvatarAppearance] Failed to find the template folder");
277 }
278 return success;
279 }
280
281 private UUID CloneInventoryItem(UUID avatarID, UUID avatarFolder, InventoryItemBase item, bool modifyPerms)
282 {
283 if (avatarFolder != UUID.Zero)
284 {
285 InventoryItemBase clonedItem = new InventoryItemBase();
286 clonedItem.Owner = avatarID;
287 clonedItem.AssetID = item.AssetID;
288 clonedItem.AssetType = item.AssetType;
289 clonedItem.BasePermissions = item.BasePermissions;
290 clonedItem.CreationDate = item.CreationDate;
291 clonedItem.CreatorId = item.CreatorId;
292 clonedItem.CreatorIdAsUuid = item.CreatorIdAsUuid;
293 clonedItem.CurrentPermissions = item.CurrentPermissions;
294 clonedItem.Description = item.Description;
295 clonedItem.EveryOnePermissions = item.EveryOnePermissions;
296 clonedItem.Flags = item.Flags;
297 clonedItem.Folder = avatarFolder;
298 clonedItem.GroupID = item.GroupID;
299 clonedItem.GroupOwned = item.GroupOwned;
300 clonedItem.GroupPermissions = item.GroupPermissions;
301 clonedItem.ID = UUID.Random();
302 clonedItem.InvType = item.InvType;
303 clonedItem.Name = item.Name;
304 clonedItem.NextPermissions = item.NextPermissions;
305 clonedItem.SalePrice = item.SalePrice;
306 clonedItem.SaleType = item.SaleType;
307
308 if (modifyPerms)
309 {
310 ModifyPermissions(ref clonedItem);
311 }
312
313 SynchronousRestObjectRequester.MakeRequest<InventoryItemBase, bool>(
314 "POST", m_inventoryServerUrl + "AddNewItem/", clonedItem);
315
316 return clonedItem.ID;
317 }
318
319 return UUID.Zero;
320 }
321
322 // TODO: unused
323 // private void UpdateAvatarAppearance(UUID avatarID, int wearableType, UUID itemID, UUID assetID)
324 // {
325 // AvatarAppearance appearance = GetAppearance(avatarID);
326 // appearance.Wearables[wearableType].AssetID = assetID;
327 // appearance.Wearables[wearableType].ItemID = itemID;
328 // m_userDataBaseService.UpdateUserAppearance(avatarID, appearance);
329 // }
330
331 // TODO: unused
332 // private void UpdateAvatarAttachment(UUID avatarID, int attachmentPoint, UUID itemID, UUID assetID)
333 // {
334 // AvatarAppearance appearance = GetAppearance(avatarID);
335 // appearance.SetAttachment(attachmentPoint, itemID, assetID);
336 // m_userDataBaseService.UpdateUserAppearance(avatarID, appearance);
337 // }
338
339 private void RemoveClothesAndAttachments(UUID avatarID)
340 {
341 AvatarAppearance appearance = GetAppearance(avatarID);
342
343 appearance.ClearWearables();
344 appearance.ClearAttachments();
345 m_userDataBaseService.UpdateUserAppearance(avatarID, appearance);
346
347 }
348
349 private AvatarAppearance GetAppearance(UUID avatarID)
350 {
351 AvatarAppearance appearance = m_userDataBaseService.GetUserAppearance(avatarID);
352 if (appearance == null)
353 {
354 appearance = CreateDefaultAppearance(avatarID);
355 }
356 return appearance;
357 }
358
359 // TODO: unused
360 // private UUID FindFolderID(string name, List<InventoryFolderBase> folders)
361 // {
362 // foreach (InventoryFolderBase folder in folders)
363 // {
364 // if (folder.Name == name)
365 // {
366 // return folder.ID;
367 // }
368 // }
369 // return UUID.Zero;
370 // }
371
372 // TODO: unused
373 // private InventoryFolderBase FindFolder(string name, List<InventoryFolderBase> folders)
374 // {
375 // foreach (InventoryFolderBase folder in folders)
376 // {
377 // if (folder.Name == name)
378 // {
379 // return folder;
380 // }
381 // }
382 // return null;
383 // }
384
385 private InventoryFolderBase FindFolder(string name, Guid parentFolderID, List<InventoryFolderBase> folders)
386 {
387 foreach (InventoryFolderBase folder in folders)
388 {
389 if ((folder.Name == name) && (folder.ParentID.Guid == parentFolderID))
390 {
391 return folder;
392 }
393 }
394 return null;
395 }
396
397 // TODO: unused
398 // private InventoryItemBase GetItem(string itemName, List<InventoryItemBase> items)
399 // {
400 // foreach (InventoryItemBase item in items)
401 // {
402 // if (item.Name.ToLower() == itemName.ToLower())
403 // {
404 // return item;
405 // }
406 // }
407 // return null;
408 // }
409
410 private List<InventoryFolderBase> FindSubFolders(Guid parentFolderID, List<InventoryFolderBase> folders)
411 {
412 List<InventoryFolderBase> subFolders = new List<InventoryFolderBase>();
413 foreach (InventoryFolderBase folder in folders)
414 {
415 if (folder.ParentID.Guid == parentFolderID)
416 {
417 subFolders.Add(folder);
418 }
419 }
420 return subFolders;
421 }
422
423 protected virtual void ModifyPermissions(ref InventoryItemBase item)
424 {
425 // Propagate Permissions
426 item.BasePermissions = item.BasePermissions & item.NextPermissions;
427 item.CurrentPermissions = item.BasePermissions;
428 item.EveryOnePermissions = item.EveryOnePermissions & item.NextPermissions;
429 item.GroupPermissions = item.GroupPermissions & item.NextPermissions;
430
431 }
432
433 private AvatarAppearance CreateDefaultAppearance(UUID avatarId)
434 {
435 AvatarAppearance appearance = null;
436 AvatarWearable[] wearables;
437 byte[] visualParams;
438 GetDefaultAvatarAppearance(out wearables, out visualParams);
439 appearance = new AvatarAppearance(avatarId, wearables, visualParams);
440
441 return appearance;
442 }
443
444 private static void GetDefaultAvatarAppearance(out AvatarWearable[] wearables, out byte[] visualParams)
445 {
446 visualParams = GetDefaultVisualParams();
447 wearables = AvatarWearable.DefaultWearables;
448 }
449
450 private static byte[] GetDefaultVisualParams()
451 {
452 byte[] visualParams;
453 visualParams = new byte[218];
454 for (int i = 0; i < 218; i++)
455 {
456 visualParams[i] = 100;
457 }
458 return visualParams;
459 }
460
461 private int ItemIsPartOfAppearance(InventoryItemBase item, AvatarAppearance appearance)
462 {
463 if (appearance != null)
464 {
465 if (appearance.BodyItem == item.ID)
466 return (int)WearableType.Shape;
467
468 if (appearance.EyesItem == item.ID)
469 return (int)WearableType.Eyes;
470
471 if (appearance.GlovesItem == item.ID)
472 return (int)WearableType.Gloves;
473
474 if (appearance.HairItem == item.ID)
475 return (int)WearableType.Hair;
476
477 if (appearance.JacketItem == item.ID)
478 return (int)WearableType.Jacket;
479
480 if (appearance.PantsItem == item.ID)
481 return (int)WearableType.Pants;
482
483 if (appearance.ShirtItem == item.ID)
484 return (int)WearableType.Shirt;
485
486 if (appearance.ShoesItem == item.ID)
487 return (int)WearableType.Shoes;
488
489 if (appearance.SkinItem == item.ID)
490 return (int)WearableType.Skin;
491
492 if (appearance.SkirtItem == item.ID)
493 return (int)WearableType.Skirt;
494
495 if (appearance.SocksItem == item.ID)
496 return (int)WearableType.Socks;
497
498 if (appearance.UnderPantsItem == item.ID)
499 return (int)WearableType.Underpants;
500
501 if (appearance.UnderShirtItem == item.ID)
502 return (int)WearableType.Undershirt;
503 }
504 return -1;
505 }
506 #endregion
507
508 public enum PermissionMask
509 {
510 None = 0,
511 Transfer = 8192,
512 Modify = 16384,
513 Copy = 32768,
514 Move = 524288,
515 Damage = 1048576,
516 All = 2147483647,
517 }
518
519 public enum WearableType
520 {
521 Shape = 0,
522 Skin = 1,
523 Hair = 2,
524 Eyes = 3,
525 Shirt = 4,
526 Pants = 5,
527 Shoes = 6,
528 Socks = 7,
529 Jacket = 8,
530 Gloves = 9,
531 Undershirt = 10,
532 Underpants = 11,
533 Skirt = 12,
534 }
535
536 public class ClothesAttachment
537 {
538 public int Type;
539 public UUID ItemID;
540 public UUID AssetID;
541
542 public ClothesAttachment(int type, UUID itemID, UUID assetID)
543 {
544 Type = type;
545 ItemID = itemID;
546 AssetID = assetID;
547 }
548 }
549 }
550} \ No newline at end of file
diff --git a/OpenSim/Grid/UserServer.Modules/GridInfoServiceModule.cs b/OpenSim/Grid/UserServer.Modules/GridInfoServiceModule.cs
deleted file mode 100644
index 0c84348..0000000
--- a/OpenSim/Grid/UserServer.Modules/GridInfoServiceModule.cs
+++ /dev/null
@@ -1,79 +0,0 @@
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 log4net;
33using log4net.Config;
34using OpenMetaverse;
35using OpenSim.Framework;
36using OpenSim.Framework.Communications;
37using OpenSim.Framework.Communications.Services;
38using OpenSim.Framework.Communications.Cache;
39using OpenSim.Framework.Servers;
40using OpenSim.Framework.Servers.HttpServer;
41using OpenSim.Grid.Communications.OGS1;
42using OpenSim.Grid.Framework;
43
44namespace OpenSim.Grid.UserServer.Modules
45{
46 public class GridInfoServiceModule
47 {
48 protected IGridServiceCore m_core;
49 protected GridInfoService m_gridInfoService;
50 protected BaseHttpServer m_httpServer;
51
52 public GridInfoServiceModule()
53 {
54 }
55
56 public void Initialise(IGridServiceCore core)
57 {
58 m_core = core;
59 m_gridInfoService = new GridInfoService();
60 }
61
62 public void PostInitialise()
63 {
64
65 }
66
67 public void RegisterHandlers(BaseHttpServer httpServer)
68 {
69 m_httpServer = httpServer;
70 m_httpServer.AddStreamHandler(new RestStreamHandler("GET", "/get_grid_info",
71 m_gridInfoService.RestGetGridInfoMethod));
72 m_httpServer.AddXmlRPCHandler("get_grid_info", m_gridInfoService.XmlRpcGridInfoMethod);
73 }
74
75 public void Close()
76 {
77 }
78 }
79}
diff --git a/OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs b/OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs
deleted file mode 100644
index 3384952..0000000
--- a/OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs
+++ /dev/null
@@ -1,514 +0,0 @@
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.Collections;
29using System.Collections.Generic;
30using System.Net;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using Nwc.XmlRpc;
35using OpenMetaverse;
36using OpenSim.Framework;
37using OpenSim.Framework.Servers;
38using OpenSim.Framework.Servers.HttpServer;
39using OpenSim.Grid.Framework;
40
41namespace OpenSim.Grid.UserServer.Modules
42{
43 public enum NotificationRequest : int
44 {
45 Login = 0,
46 Logout = 1,
47 Shutdown = 2
48 }
49
50 public struct PresenceNotification
51 {
52 public NotificationRequest request;
53 public UUID agentID;
54 public UUID sessionID;
55 public UUID RegionID;
56 public ulong regionhandle;
57 public float positionX;
58 public float positionY;
59 public float positionZ;
60 public string firstname;
61 public string lastname;
62 }
63
64 public delegate void AgentLocationDelegate(UUID agentID, UUID regionID, ulong regionHandle);
65 public delegate void AgentLeavingDelegate(UUID agentID, UUID regionID, ulong regionHandle);
66 public delegate void RegionStartupDelegate(UUID regionID);
67 public delegate void RegionShutdownDelegate(UUID regionID);
68
69
70 public class MessageServersConnector
71 {
72 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
73
74 public Dictionary<string, MessageServerInfo> MessageServers;
75
76 private BaseHttpServer m_httpServer;
77
78 private OpenSim.Framework.BlockingQueue<PresenceNotification> m_NotifyQueue =
79 new OpenSim.Framework.BlockingQueue<PresenceNotification>();
80
81 private IGridServiceCore m_core;
82
83 public event AgentLocationDelegate OnAgentLocation;
84 public event AgentLeavingDelegate OnAgentLeaving;
85 public event RegionStartupDelegate OnRegionStartup;
86 public event RegionShutdownDelegate OnRegionShutdown;
87
88 public MessageServersConnector()
89 {
90 MessageServers = new Dictionary<string, MessageServerInfo>();
91 }
92
93 public void Initialise(IGridServiceCore core)
94 {
95 m_core = core;
96 m_core.RegisterInterface<MessageServersConnector>(this);
97
98 Watchdog.StartThread(NotifyQueueRunner, "NotifyQueueRunner", ThreadPriority.Normal, true);
99 }
100
101 public void PostInitialise()
102 {
103 }
104
105 public void RegisterHandlers(BaseHttpServer httpServer)
106 {
107 m_httpServer = httpServer;
108
109 m_httpServer.AddXmlRPCHandler("region_startup", RegionStartup);
110 m_httpServer.AddXmlRPCHandler("region_shutdown", RegionShutdown);
111 m_httpServer.AddXmlRPCHandler("agent_location", AgentLocation);
112 m_httpServer.AddXmlRPCHandler("agent_leaving", AgentLeaving);
113 // Message Server ---> User Server
114 m_httpServer.AddXmlRPCHandler("register_messageserver", XmlRPCRegisterMessageServer);
115 m_httpServer.AddXmlRPCHandler("agent_change_region", XmlRPCUserMovedtoRegion);
116 m_httpServer.AddXmlRPCHandler("deregister_messageserver", XmlRPCDeRegisterMessageServer);
117 }
118
119 public void RegisterMessageServer(string URI, MessageServerInfo serverData)
120 {
121 lock (MessageServers)
122 {
123 if (!MessageServers.ContainsKey(URI))
124 MessageServers.Add(URI, serverData);
125 }
126 }
127
128 public void DeRegisterMessageServer(string URI)
129 {
130 lock (MessageServers)
131 {
132 if (MessageServers.ContainsKey(URI))
133 MessageServers.Remove(URI);
134 }
135 }
136
137 public void AddResponsibleRegion(string URI, ulong regionhandle)
138 {
139 if (!MessageServers.ContainsKey(URI))
140 {
141 m_log.Warn("[MSGSERVER]: Got addResponsibleRegion Request for a MessageServer that isn't registered");
142 }
143 else
144 {
145 MessageServerInfo msginfo = MessageServers["URI"];
146 msginfo.responsibleForRegions.Add(regionhandle);
147 MessageServers["URI"] = msginfo;
148 }
149 }
150 public void RemoveResponsibleRegion(string URI, ulong regionhandle)
151 {
152 if (!MessageServers.ContainsKey(URI))
153 {
154 m_log.Warn("[MSGSERVER]: Got RemoveResponsibleRegion Request for a MessageServer that isn't registered");
155 }
156 else
157 {
158 MessageServerInfo msginfo = MessageServers["URI"];
159 if (msginfo.responsibleForRegions.Contains(regionhandle))
160 {
161 msginfo.responsibleForRegions.Remove(regionhandle);
162 MessageServers["URI"] = msginfo;
163 }
164 }
165
166 }
167 public XmlRpcResponse XmlRPCRegisterMessageServer(XmlRpcRequest request, IPEndPoint remoteClient)
168 {
169 XmlRpcResponse response = new XmlRpcResponse();
170 Hashtable requestData = (Hashtable)request.Params[0];
171 Hashtable responseData = new Hashtable();
172
173 if (requestData.Contains("uri"))
174 {
175 string URI = (string)requestData["uri"];
176 string sendkey=(string)requestData["sendkey"];
177 string recvkey=(string)requestData["recvkey"];
178 MessageServerInfo m = new MessageServerInfo();
179 m.URI = URI;
180 m.sendkey = sendkey;
181 m.recvkey = recvkey;
182 RegisterMessageServer(URI, m);
183 responseData["responsestring"] = "TRUE";
184 response.Value = responseData;
185 }
186 return response;
187 }
188 public XmlRpcResponse XmlRPCDeRegisterMessageServer(XmlRpcRequest request, IPEndPoint remoteClient)
189 {
190 XmlRpcResponse response = new XmlRpcResponse();
191 Hashtable requestData = (Hashtable)request.Params[0];
192 Hashtable responseData = new Hashtable();
193
194 if (requestData.Contains("uri"))
195 {
196 string URI = (string)requestData["uri"];
197
198 DeRegisterMessageServer(URI);
199 responseData["responsestring"] = "TRUE";
200 response.Value = responseData;
201 }
202 return response;
203 }
204
205 public XmlRpcResponse XmlRPCUserMovedtoRegion(XmlRpcRequest request, IPEndPoint remoteClient)
206 {
207 XmlRpcResponse response = new XmlRpcResponse();
208 Hashtable requestData = (Hashtable)request.Params[0];
209 Hashtable responseData = new Hashtable();
210
211 if (requestData.Contains("fromuri"))
212 {
213 // string sURI = (string)requestData["fromuri"];
214 // string sagentID = (string)requestData["agentid"];
215 // string ssessionID = (string)requestData["sessionid"];
216 // string scurrentRegionID = (string)requestData["regionid"];
217 // string sregionhandle = (string)requestData["regionhandle"];
218 // string scurrentpos = (string)requestData["currentpos"];
219 //Vector3.TryParse((string)reader["currentPos"], out retval.currentPos);
220 // TODO: Okay now raise event so the user server can pass this data to the Usermanager
221
222 responseData["responsestring"] = "TRUE";
223 response.Value = responseData;
224 }
225 return response;
226 }
227
228 public void TellMessageServersAboutUser(UUID agentID, UUID sessionID, UUID RegionID,
229 ulong regionhandle, float positionX, float positionY,
230 float positionZ, string firstname, string lastname)
231 {
232 PresenceNotification notification = new PresenceNotification();
233
234 notification.request = NotificationRequest.Login;
235 notification.agentID = agentID;
236 notification.sessionID = sessionID;
237 notification.RegionID = RegionID;
238 notification.regionhandle = regionhandle;
239 notification.positionX = positionX;
240 notification.positionY = positionY;
241 notification.positionZ = positionZ;
242 notification.firstname = firstname;
243 notification.lastname = lastname;
244
245 m_NotifyQueue.Enqueue(notification);
246 }
247
248 private void TellMessageServersAboutUserInternal(UUID agentID, UUID sessionID, UUID RegionID,
249 ulong regionhandle, float positionX, float positionY,
250 float positionZ, string firstname, string lastname)
251 {
252 // Loop over registered Message Servers (AND THERE WILL BE MORE THEN ONE :D)
253 lock (MessageServers)
254 {
255 if (MessageServers.Count > 0)
256 {
257 m_log.Info("[MSGCONNECTOR]: Sending login notice to registered message servers");
258 }
259// else
260// {
261// m_log.Debug("[MSGCONNECTOR]: No Message Servers registered, ignoring");
262// }
263 foreach (MessageServerInfo serv in MessageServers.Values)
264 {
265 NotifyMessageServerAboutUser(serv, agentID, sessionID, RegionID,
266 regionhandle, positionX, positionY, positionZ,
267 firstname, lastname);
268 }
269 }
270 }
271
272 private void TellMessageServersAboutUserLogoffInternal(UUID agentID)
273 {
274 lock (MessageServers)
275 {
276 if (MessageServers.Count > 0)
277 {
278 m_log.Info("[MSGCONNECTOR]: Sending logoff notice to registered message servers");
279 }
280 else
281 {
282// m_log.Debug("[MSGCONNECTOR]: No Message Servers registered, ignoring");
283 }
284 foreach (MessageServerInfo serv in MessageServers.Values)
285 {
286 NotifyMessageServerAboutUserLogoff(serv,agentID);
287 }
288 }
289 }
290
291 private void TellMessageServersAboutRegionShutdownInternal(UUID regionID)
292 {
293 lock (MessageServers)
294 {
295 if (MessageServers.Count > 0)
296 {
297 m_log.Info("[MSGCONNECTOR]: Sending region down notice to registered message servers");
298 }
299 else
300 {
301// m_log.Debug("[MSGCONNECTOR]: No Message Servers registered, ignoring");
302 }
303 foreach (MessageServerInfo serv in MessageServers.Values)
304 {
305 NotifyMessageServerAboutRegionShutdown(serv,regionID);
306 }
307 }
308 }
309
310 public void TellMessageServersAboutUserLogoff(UUID agentID)
311 {
312 PresenceNotification notification = new PresenceNotification();
313
314 notification.request = NotificationRequest.Logout;
315 notification.agentID = agentID;
316
317 m_NotifyQueue.Enqueue(notification);
318 }
319
320 public void TellMessageServersAboutRegionShutdown(UUID regionID)
321 {
322 PresenceNotification notification = new PresenceNotification();
323
324 notification.request = NotificationRequest.Shutdown;
325 notification.RegionID = regionID;
326
327 m_NotifyQueue.Enqueue(notification);
328 }
329
330 private void NotifyMessageServerAboutUserLogoff(MessageServerInfo serv, UUID agentID)
331 {
332 Hashtable reqparams = new Hashtable();
333 reqparams["sendkey"] = serv.sendkey;
334 reqparams["agentid"] = agentID.ToString();
335 ArrayList SendParams = new ArrayList();
336 SendParams.Add(reqparams);
337
338 XmlRpcRequest GridReq = new XmlRpcRequest("logout_of_simulator", SendParams);
339 try
340 {
341 GridReq.Send(serv.URI, 6000);
342 }
343 catch (WebException)
344 {
345 m_log.Warn("[MSGCONNECTOR]: Unable to notify Message Server about log out. Other users might still think this user is online");
346 }
347 m_log.Info("[LOGOUT]: Notified : " + serv.URI + " about user logout");
348 }
349
350 private void NotifyMessageServerAboutRegionShutdown(MessageServerInfo serv, UUID regionID)
351 {
352 Hashtable reqparams = new Hashtable();
353 reqparams["sendkey"] = serv.sendkey;
354 reqparams["regionid"] = regionID.ToString();
355 ArrayList SendParams = new ArrayList();
356 SendParams.Add(reqparams);
357
358 XmlRpcRequest GridReq = new XmlRpcRequest("process_region_shutdown", SendParams);
359 try
360 {
361 GridReq.Send(serv.URI, 6000);
362 }
363 catch (WebException)
364 {
365 m_log.Warn("[MSGCONNECTOR]: Unable to notify Message Server about region shutdown.");
366 }
367 m_log.Info("[REGION UPDOWN]: Notified : " + serv.URI + " about region state change");
368 }
369
370 private void NotifyMessageServerAboutUser(MessageServerInfo serv,
371 UUID agentID, UUID sessionID, UUID RegionID,
372 ulong regionhandle, float positionX, float positionY, float positionZ,
373 string firstname, string lastname)
374 {
375 Hashtable reqparams = new Hashtable();
376 reqparams["sendkey"] = serv.sendkey;
377 reqparams["agentid"] = agentID.ToString();
378 reqparams["sessionid"] = sessionID.ToString();
379 reqparams["regionid"] = RegionID.ToString();
380 reqparams["regionhandle"] = regionhandle.ToString();
381 reqparams["positionx"] = positionX.ToString();
382 reqparams["positiony"] = positionY.ToString();
383 reqparams["positionz"] = positionZ.ToString();
384 reqparams["firstname"] = firstname;
385 reqparams["lastname"] = lastname;
386
387 //reqparams["position"] = Position.ToString();
388
389 ArrayList SendParams = new ArrayList();
390 SendParams.Add(reqparams);
391
392 XmlRpcRequest GridReq = new XmlRpcRequest("login_to_simulator", SendParams);
393 try
394 {
395 GridReq.Send(serv.URI, 6000);
396 m_log.Info("[LOGIN]: Notified : " + serv.URI + " about user login");
397 }
398 catch (WebException)
399 {
400 m_log.Warn("[MSGCONNECTOR]: Unable to notify Message Server about login. Presence might be borked for this user");
401 }
402
403 }
404
405 private void NotifyQueueRunner()
406 {
407 while (true)
408 {
409 PresenceNotification presence = m_NotifyQueue.Dequeue();
410
411 if (presence.request == NotificationRequest.Shutdown)
412 {
413 TellMessageServersAboutRegionShutdownInternal(presence.RegionID);
414 }
415
416 if (presence.request == NotificationRequest.Login)
417 {
418 TellMessageServersAboutUserInternal(presence.agentID,
419 presence.sessionID, presence.RegionID,
420 presence.regionhandle, presence.positionX,
421 presence.positionY, presence.positionZ,
422 presence.firstname, presence.lastname);
423 }
424
425 if (presence.request == NotificationRequest.Logout)
426 {
427 TellMessageServersAboutUserLogoffInternal(presence.agentID);
428 }
429
430 Watchdog.UpdateThread();
431 }
432 }
433
434 public XmlRpcResponse RegionStartup(XmlRpcRequest request, IPEndPoint remoteClient)
435 {
436 Hashtable requestData = (Hashtable)request.Params[0];
437 Hashtable result = new Hashtable();
438
439 UUID regionID;
440 if (UUID.TryParse((string)requestData["RegionUUID"], out regionID))
441 {
442 if (OnRegionStartup != null)
443 OnRegionStartup(regionID);
444
445 result["responsestring"] = "TRUE";
446 }
447
448 XmlRpcResponse response = new XmlRpcResponse();
449 response.Value = result;
450 return response;
451 }
452
453 public XmlRpcResponse RegionShutdown(XmlRpcRequest request, IPEndPoint remoteClient)
454 {
455 Hashtable requestData = (Hashtable)request.Params[0];
456 Hashtable result = new Hashtable();
457
458 UUID regionID;
459 if (UUID.TryParse((string)requestData["RegionUUID"], out regionID))
460 {
461 if (OnRegionShutdown != null)
462 OnRegionShutdown(regionID);
463
464 result["responsestring"] = "TRUE";
465 }
466
467 XmlRpcResponse response = new XmlRpcResponse();
468 response.Value = result;
469 return response;
470 }
471
472 public XmlRpcResponse AgentLocation(XmlRpcRequest request, IPEndPoint remoteClient)
473 {
474 Hashtable requestData = (Hashtable)request.Params[0];
475 Hashtable result = new Hashtable();
476
477 UUID agentID;
478 UUID regionID;
479 ulong regionHandle;
480 if (UUID.TryParse((string)requestData["AgentID"], out agentID) && UUID.TryParse((string)requestData["RegionUUID"], out regionID) && ulong.TryParse((string)requestData["RegionHandle"], out regionHandle))
481 {
482 if (OnAgentLocation != null)
483 OnAgentLocation(agentID, regionID, regionHandle);
484
485 result["responsestring"] = "TRUE";
486 }
487
488 XmlRpcResponse response = new XmlRpcResponse();
489 response.Value = result;
490 return response;
491 }
492
493 public XmlRpcResponse AgentLeaving(XmlRpcRequest request, IPEndPoint remoteClient)
494 {
495 Hashtable requestData = (Hashtable)request.Params[0];
496 Hashtable result = new Hashtable();
497
498 UUID agentID;
499 UUID regionID;
500 ulong regionHandle;
501 if (UUID.TryParse((string)requestData["AgentID"], out agentID) && UUID.TryParse((string)requestData["RegionUUID"], out regionID) && ulong.TryParse((string)requestData["RegionHandle"], out regionHandle))
502 {
503 if (OnAgentLeaving != null)
504 OnAgentLeaving(agentID, regionID, regionHandle);
505
506 result["responsestring"] = "TRUE";
507 }
508
509 XmlRpcResponse response = new XmlRpcResponse();
510 response.Value = result;
511 return response;
512 }
513 }
514}
diff --git a/OpenSim/Grid/UserServer.Modules/OpenIdService.cs b/OpenSim/Grid/UserServer.Modules/OpenIdService.cs
deleted file mode 100644
index 49dfd86..0000000
--- a/OpenSim/Grid/UserServer.Modules/OpenIdService.cs
+++ /dev/null
@@ -1,338 +0,0 @@
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.Collections.Specialized;
31using System.IO;
32using System.Net;
33using System.Web;
34using DotNetOpenId;
35using DotNetOpenId.Provider;
36using OpenSim.Framework;
37using OpenSim.Framework.Servers;
38using OpenSim.Framework.Servers.HttpServer;
39
40namespace OpenSim.Grid.UserServer.Modules
41{
42 /// <summary>
43 /// Temporary, in-memory store for OpenID associations
44 /// </summary>
45 public class ProviderMemoryStore : IAssociationStore<AssociationRelyingPartyType>
46 {
47 private class AssociationItem
48 {
49 public AssociationRelyingPartyType DistinguishingFactor;
50 public string Handle;
51 public DateTime Expires;
52 public byte[] PrivateData;
53 }
54
55 Dictionary<string, AssociationItem> m_store = new Dictionary<string, AssociationItem>();
56 SortedList<DateTime, AssociationItem> m_sortedStore = new SortedList<DateTime, AssociationItem>();
57 object m_syncRoot = new object();
58
59 #region IAssociationStore<AssociationRelyingPartyType> Members
60
61 public void StoreAssociation(AssociationRelyingPartyType distinguishingFactor, Association assoc)
62 {
63 AssociationItem item = new AssociationItem();
64 item.DistinguishingFactor = distinguishingFactor;
65 item.Handle = assoc.Handle;
66 item.Expires = assoc.Expires.ToLocalTime();
67 item.PrivateData = assoc.SerializePrivateData();
68
69 lock (m_syncRoot)
70 {
71 m_store[item.Handle] = item;
72 m_sortedStore[item.Expires] = item;
73 }
74 }
75
76 public Association GetAssociation(AssociationRelyingPartyType distinguishingFactor)
77 {
78 lock (m_syncRoot)
79 {
80 if (m_sortedStore.Count > 0)
81 {
82 AssociationItem item = m_sortedStore.Values[m_sortedStore.Count - 1];
83 return Association.Deserialize(item.Handle, item.Expires.ToUniversalTime(), item.PrivateData);
84 }
85 else
86 {
87 return null;
88 }
89 }
90 }
91
92 public Association GetAssociation(AssociationRelyingPartyType distinguishingFactor, string handle)
93 {
94 AssociationItem item;
95 bool success = false;
96 lock (m_syncRoot)
97 success = m_store.TryGetValue(handle, out item);
98
99 if (success)
100 return Association.Deserialize(item.Handle, item.Expires.ToUniversalTime(), item.PrivateData);
101 else
102 return null;
103 }
104
105 public bool RemoveAssociation(AssociationRelyingPartyType distinguishingFactor, string handle)
106 {
107 lock (m_syncRoot)
108 {
109 for (int i = 0; i < m_sortedStore.Values.Count; i++)
110 {
111 AssociationItem item = m_sortedStore.Values[i];
112 if (item.Handle == handle)
113 {
114 m_sortedStore.RemoveAt(i);
115 break;
116 }
117 }
118
119 return m_store.Remove(handle);
120 }
121 }
122
123 public void ClearExpiredAssociations()
124 {
125 lock (m_syncRoot)
126 {
127 List<AssociationItem> itemsCopy = new List<AssociationItem>(m_sortedStore.Values);
128 DateTime now = DateTime.Now;
129
130 for (int i = 0; i < itemsCopy.Count; i++)
131 {
132 AssociationItem item = itemsCopy[i];
133
134 if (item.Expires <= now)
135 {
136 m_sortedStore.RemoveAt(i);
137 m_store.Remove(item.Handle);
138 }
139 }
140 }
141 }
142
143 #endregion
144 }
145
146 public class OpenIdStreamHandler : IStreamHandler
147 {
148 #region HTML
149
150 /// <summary>Login form used to authenticate OpenID requests</summary>
151 const string LOGIN_PAGE =
152@"<html>
153<head><title>OpenSim OpenID Login</title></head>
154<body>
155<h3>OpenSim Login</h3>
156<form method=""post"">
157<label for=""first"">First Name:</label> <input readonly type=""text"" name=""first"" id=""first"" value=""{0}""/>
158<label for=""last"">Last Name:</label> <input readonly type=""text"" name=""last"" id=""last"" value=""{1}""/>
159<label for=""pass"">Password:</label> <input type=""password"" name=""pass"" id=""pass""/>
160<input type=""submit"" value=""Login"">
161</form>
162</body>
163</html>";
164
165 /// <summary>Page shown for a valid OpenID identity</summary>
166 const string OPENID_PAGE =
167@"<html>
168<head>
169<title>{2} {3}</title>
170<link rel=""openid2.provider openid.server"" href=""{0}://{1}/openid/server/""/>
171</head>
172<body>OpenID identifier for {2} {3}</body>
173</html>
174";
175
176 /// <summary>Page shown for an invalid OpenID identity</summary>
177 const string INVALID_OPENID_PAGE =
178@"<html><head><title>Identity not found</title></head>
179<body>Invalid OpenID identity</body></html>";
180
181 /// <summary>Page shown if the OpenID endpoint is requested directly</summary>
182 const string ENDPOINT_PAGE =
183@"<html><head><title>OpenID Endpoint</title></head><body>
184This is an OpenID server endpoint, not a human-readable resource.
185For more information, see <a href='http://openid.net/'>http://openid.net/</a>.
186</body></html>";
187
188 #endregion HTML
189
190 public string ContentType { get { return m_contentType; } }
191 public string HttpMethod { get { return m_httpMethod; } }
192 public string Path { get { return m_path; } }
193
194 string m_contentType;
195 string m_httpMethod;
196 string m_path;
197 UserLoginService m_loginService;
198 ProviderMemoryStore m_openidStore = new ProviderMemoryStore();
199
200 /// <summary>
201 /// Constructor
202 /// </summary>
203 public OpenIdStreamHandler(string httpMethod, string path, UserLoginService loginService)
204 {
205 m_loginService = loginService;
206 m_httpMethod = httpMethod;
207 m_path = path;
208
209 m_contentType = "text/html";
210 }
211
212 /// <summary>
213 /// Handles all GET and POST requests for OpenID identifier pages and endpoint
214 /// server communication
215 /// </summary>
216 public void Handle(string path, Stream request, Stream response, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
217 {
218 Uri providerEndpoint = new Uri(String.Format("{0}://{1}{2}", httpRequest.Url.Scheme, httpRequest.Url.Authority, httpRequest.Url.AbsolutePath));
219
220 // Defult to returning HTML content
221 m_contentType = "text/html";
222
223 try
224 {
225 NameValueCollection postQuery = HttpUtility.ParseQueryString(new StreamReader(httpRequest.InputStream).ReadToEnd());
226 NameValueCollection getQuery = HttpUtility.ParseQueryString(httpRequest.Url.Query);
227 NameValueCollection openIdQuery = (postQuery.GetValues("openid.mode") != null ? postQuery : getQuery);
228
229 OpenIdProvider provider = new OpenIdProvider(m_openidStore, providerEndpoint, httpRequest.Url, openIdQuery);
230
231 if (provider.Request != null)
232 {
233 if (!provider.Request.IsResponseReady && provider.Request is IAuthenticationRequest)
234 {
235 IAuthenticationRequest authRequest = (IAuthenticationRequest)provider.Request;
236 string[] passwordValues = postQuery.GetValues("pass");
237
238 UserProfileData profile;
239 if (TryGetProfile(new Uri(authRequest.ClaimedIdentifier.ToString()), out profile))
240 {
241 // Check for form POST data
242 if (passwordValues != null && passwordValues.Length == 1)
243 {
244 if (profile != null && m_loginService.AuthenticateUser(profile, passwordValues[0]))
245 authRequest.IsAuthenticated = true;
246 else
247 authRequest.IsAuthenticated = false;
248 }
249 else
250 {
251 // Authentication was requested, send the client a login form
252 using (StreamWriter writer = new StreamWriter(response))
253 writer.Write(String.Format(LOGIN_PAGE, profile.FirstName, profile.SurName));
254 return;
255 }
256 }
257 else
258 {
259 // Cannot find an avatar matching the claimed identifier
260 authRequest.IsAuthenticated = false;
261 }
262 }
263
264 // Add OpenID headers to the response
265 foreach (string key in provider.Request.Response.Headers.Keys)
266 httpResponse.AddHeader(key, provider.Request.Response.Headers[key]);
267
268 string[] contentTypeValues = provider.Request.Response.Headers.GetValues("Content-Type");
269 if (contentTypeValues != null && contentTypeValues.Length == 1)
270 m_contentType = contentTypeValues[0];
271
272 // Set the response code and document body based on the OpenID result
273 httpResponse.StatusCode = (int)provider.Request.Response.Code;
274 response.Write(provider.Request.Response.Body, 0, provider.Request.Response.Body.Length);
275 response.Close();
276 }
277 else if (httpRequest.Url.AbsolutePath.Contains("/openid/server"))
278 {
279 // Standard HTTP GET was made on the OpenID endpoint, send the client the default error page
280 using (StreamWriter writer = new StreamWriter(response))
281 writer.Write(ENDPOINT_PAGE);
282 }
283 else
284 {
285 // Try and lookup this avatar
286 UserProfileData profile;
287 if (TryGetProfile(httpRequest.Url, out profile))
288 {
289 using (StreamWriter writer = new StreamWriter(response))
290 {
291 // TODO: Print out a full profile page for this avatar
292 writer.Write(String.Format(OPENID_PAGE, httpRequest.Url.Scheme,
293 httpRequest.Url.Authority, profile.FirstName, profile.SurName));
294 }
295 }
296 else
297 {
298 // Couldn't parse an avatar name, or couldn't find the avatar in the user server
299 using (StreamWriter writer = new StreamWriter(response))
300 writer.Write(INVALID_OPENID_PAGE);
301 }
302 }
303 }
304 catch (Exception ex)
305 {
306 httpResponse.StatusCode = (int)HttpStatusCode.InternalServerError;
307 using (StreamWriter writer = new StreamWriter(response))
308 writer.Write(ex.Message);
309 }
310 }
311
312 /// <summary>
313 /// Parse a URL with a relative path of the form /users/First_Last and try to
314 /// retrieve the profile matching that avatar name
315 /// </summary>
316 /// <param name="requestUrl">URL to parse for an avatar name</param>
317 /// <param name="profile">Profile data for the avatar</param>
318 /// <returns>True if the parse and lookup were successful, otherwise false</returns>
319 bool TryGetProfile(Uri requestUrl, out UserProfileData profile)
320 {
321 if (requestUrl.Segments.Length == 3 && requestUrl.Segments[1] == "users/")
322 {
323 // Parse the avatar name from the path
324 string username = requestUrl.Segments[requestUrl.Segments.Length - 1];
325 string[] name = username.Split('_');
326
327 if (name.Length == 2)
328 {
329 profile = m_loginService.GetTheUser(name[0], name[1]);
330 return (profile != null);
331 }
332 }
333
334 profile = null;
335 return false;
336 }
337 }
338}
diff --git a/OpenSim/Grid/UserServer.Modules/UserDataBaseService.cs b/OpenSim/Grid/UserServer.Modules/UserDataBaseService.cs
deleted file mode 100644
index 10d6f80..0000000
--- a/OpenSim/Grid/UserServer.Modules/UserDataBaseService.cs
+++ /dev/null
@@ -1,100 +0,0 @@
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;
30using System.Collections.Generic;
31using System.Reflection;
32using log4net;
33using Nwc.XmlRpc;
34using OpenMetaverse;
35using OpenSim.Framework;
36using OpenSim.Framework.Communications;
37using OpenSim.Framework.Servers;
38using OpenSim.Framework.Servers.HttpServer;
39using OpenSim.Grid.Framework;
40
41namespace OpenSim.Grid.UserServer.Modules
42{
43 public class UserDataBaseService : UserManagerBase
44 {
45 protected IGridServiceCore m_core;
46
47 public UserDataBaseService(CommunicationsManager commsManager)
48 : base(commsManager)
49 {
50 }
51
52 public void Initialise(IGridServiceCore core)
53 {
54 m_core = core;
55
56 UserConfig cfg;
57 if (m_core.TryGet<UserConfig>(out cfg))
58 {
59 AddPlugin(cfg.DatabaseProvider, cfg.DatabaseConnect);
60 }
61
62 m_core.RegisterInterface<UserDataBaseService>(this);
63 }
64
65 public void PostInitialise()
66 {
67 }
68
69 public void RegisterHandlers(BaseHttpServer httpServer)
70 {
71 }
72
73 public UserAgentData GetUserAgentData(UUID AgentID)
74 {
75 UserProfileData userProfile = GetUserProfile(AgentID);
76
77 if (userProfile != null)
78 {
79 return userProfile.CurrentAgent;
80 }
81
82 return null;
83 }
84
85 public override UserProfileData SetupMasterUser(string firstName, string lastName)
86 {
87 throw new Exception("The method or operation is not implemented.");
88 }
89
90 public override UserProfileData SetupMasterUser(string firstName, string lastName, string password)
91 {
92 throw new Exception("The method or operation is not implemented.");
93 }
94
95 public override UserProfileData SetupMasterUser(UUID uuid)
96 {
97 throw new Exception("The method or operation is not implemented.");
98 }
99 }
100}
diff --git a/OpenSim/Grid/UserServer.Modules/UserLoginAuthService.cs b/OpenSim/Grid/UserServer.Modules/UserLoginAuthService.cs
deleted file mode 100644
index 77caf47..0000000
--- a/OpenSim/Grid/UserServer.Modules/UserLoginAuthService.cs
+++ /dev/null
@@ -1,225 +0,0 @@
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;
30using System.Collections.Generic;
31using System.Reflection;
32using System.Text.RegularExpressions;
33using log4net;
34using Nwc.XmlRpc;
35using OpenMetaverse;
36using OpenSim.Data;
37using OpenSim.Framework;
38using OpenSim.Framework.Communications;
39using OpenSim.Framework.Communications.Services;
40using OpenSim.Framework.Communications.Cache;
41using OpenSim.Framework.Capabilities;
42using OpenSim.Framework.Servers;
43using OpenSim.Framework.Servers.HttpServer;
44
45namespace OpenSim.Grid.UserServer.Modules
46{
47
48 /// <summary>
49 /// Hypergrid login service used in grid mode.
50 /// </summary>
51 public class UserLoginAuthService : HGLoginAuthService
52 {
53 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
54
55 public UserConfig m_config;
56 private readonly IRegionProfileRouter m_regionProfileService;
57
58 protected BaseHttpServer m_httpServer;
59
60 public UserLoginAuthService(
61 UserManagerBase userManager, IInterServiceInventoryServices inventoryService,
62 LibraryRootFolder libraryRootFolder,
63 UserConfig config, string welcomeMess, IRegionProfileRouter regionProfileService)
64 : base(userManager, welcomeMess, inventoryService, null, true, libraryRootFolder, null)
65 {
66 m_config = config;
67 m_defaultHomeX = m_config.DefaultX;
68 m_defaultHomeY = m_config.DefaultY;
69 m_interInventoryService = inventoryService;
70 m_regionProfileService = regionProfileService;
71
72 NetworkServersInfo serversinfo = new NetworkServersInfo(1000, 1000);
73 serversinfo.GridRecvKey = m_config.GridRecvKey;
74 serversinfo.GridSendKey = m_config.GridSendKey;
75 serversinfo.GridURL = m_config.GridServerURL.ToString();
76 serversinfo.InventoryURL = m_config.InventoryUrl.ToString();
77 serversinfo.UserURL = m_config.AuthUrl.ToString();
78 SetServersInfo(serversinfo);
79 }
80
81 public void RegisterHandlers(BaseHttpServer httpServer)
82 {
83 m_httpServer = httpServer;
84
85 httpServer.AddXmlRPCHandler("hg_login", XmlRpcLoginMethod);
86 httpServer.AddXmlRPCHandler("hg_new_auth_key", XmlRpcGenerateKeyMethod);
87 httpServer.AddXmlRPCHandler("hg_verify_auth_key", XmlRpcVerifyKeyMethod);
88 }
89
90
91 public override void LogOffUser(UserProfileData theUser, string message)
92 {
93 RegionProfileData SimInfo;
94 try
95 {
96 SimInfo = m_regionProfileService.RequestSimProfileData(
97 theUser.CurrentAgent.Handle, m_config.GridServerURL,
98 m_config.GridSendKey, m_config.GridRecvKey);
99
100 if (SimInfo == null)
101 {
102 m_log.Error("[GRID]: Region user was in isn't currently logged in");
103 return;
104 }
105 }
106 catch (Exception)
107 {
108 m_log.Error("[GRID]: Unable to look up region to log user off");
109 return;
110 }
111
112 // Prepare notification
113 Hashtable SimParams = new Hashtable();
114 SimParams["agent_id"] = theUser.ID.ToString();
115 SimParams["region_secret"] = theUser.CurrentAgent.SecureSessionID.ToString();
116 SimParams["region_secret2"] = SimInfo.regionSecret;
117 //m_log.Info(SimInfo.regionSecret);
118 SimParams["regionhandle"] = theUser.CurrentAgent.Handle.ToString();
119 SimParams["message"] = message;
120 ArrayList SendParams = new ArrayList();
121 SendParams.Add(SimParams);
122
123 m_log.InfoFormat(
124 "[ASSUMED CRASH]: Telling region {0} @ {1},{2} ({3}) that their agent is dead: {4}",
125 SimInfo.regionName, SimInfo.regionLocX, SimInfo.regionLocY, SimInfo.httpServerURI,
126 theUser.FirstName + " " + theUser.SurName);
127
128 try
129 {
130 XmlRpcRequest GridReq = new XmlRpcRequest("logoff_user", SendParams);
131 XmlRpcResponse GridResp = GridReq.Send(SimInfo.httpServerURI, 6000);
132
133 if (GridResp.IsFault)
134 {
135 m_log.ErrorFormat(
136 "[LOGIN]: XMLRPC request for {0} failed, fault code: {1}, reason: {2}, This is likely an old region revision.",
137 SimInfo.httpServerURI, GridResp.FaultCode, GridResp.FaultString);
138 }
139 }
140 catch (Exception)
141 {
142 m_log.Error("[LOGIN]: Error telling region to logout user!");
143 }
144
145 // Prepare notification
146 SimParams = new Hashtable();
147 SimParams["agent_id"] = theUser.ID.ToString();
148 SimParams["region_secret"] = SimInfo.regionSecret;
149 //m_log.Info(SimInfo.regionSecret);
150 SimParams["regionhandle"] = theUser.CurrentAgent.Handle.ToString();
151 SimParams["message"] = message;
152 SendParams = new ArrayList();
153 SendParams.Add(SimParams);
154
155 m_log.InfoFormat(
156 "[ASSUMED CRASH]: Telling region {0} @ {1},{2} ({3}) that their agent is dead: {4}",
157 SimInfo.regionName, SimInfo.regionLocX, SimInfo.regionLocY, SimInfo.httpServerURI,
158 theUser.FirstName + " " + theUser.SurName);
159
160 try
161 {
162 XmlRpcRequest GridReq = new XmlRpcRequest("logoff_user", SendParams);
163 XmlRpcResponse GridResp = GridReq.Send(SimInfo.httpServerURI, 6000);
164
165 if (GridResp.IsFault)
166 {
167 m_log.ErrorFormat(
168 "[LOGIN]: XMLRPC request for {0} failed, fault code: {1}, reason: {2}, This is likely an old region revision.",
169 SimInfo.httpServerURI, GridResp.FaultCode, GridResp.FaultString);
170 }
171 }
172 catch (Exception)
173 {
174 m_log.Error("[LOGIN]: Error telling region to logout user!");
175 }
176 //base.LogOffUser(theUser);
177 }
178
179 protected override RegionInfo RequestClosestRegion(string region)
180 {
181 RegionProfileData profileData = m_regionProfileService.RequestSimProfileData(region,
182 m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey);
183
184 if (profileData != null)
185 {
186 return profileData.ToRegionInfo();
187 }
188 else
189 {
190 return null;
191 }
192 }
193
194 protected override RegionInfo GetRegionInfo(ulong homeRegionHandle)
195 {
196 RegionProfileData profileData = m_regionProfileService.RequestSimProfileData(homeRegionHandle,
197 m_config.GridServerURL, m_config.GridSendKey,
198 m_config.GridRecvKey);
199 if (profileData != null)
200 {
201 return profileData.ToRegionInfo();
202 }
203 else
204 {
205 return null;
206 }
207 }
208
209 protected override RegionInfo GetRegionInfo(UUID homeRegionId)
210 {
211 RegionProfileData profileData = m_regionProfileService.RequestSimProfileData(homeRegionId,
212 m_config.GridServerURL, m_config.GridSendKey,
213 m_config.GridRecvKey);
214 if (profileData != null)
215 {
216 return profileData.ToRegionInfo();
217 }
218 else
219 {
220 return null;
221 }
222 }
223
224 }
225}
diff --git a/OpenSim/Grid/UserServer.Modules/UserLoginService.cs b/OpenSim/Grid/UserServer.Modules/UserLoginService.cs
deleted file mode 100644
index d46ff9b..0000000
--- a/OpenSim/Grid/UserServer.Modules/UserLoginService.cs
+++ /dev/null
@@ -1,423 +0,0 @@
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;
30using System.Collections.Generic;
31using System.Net;
32using System.Reflection;
33using System.Text.RegularExpressions;
34using log4net;
35using Nwc.XmlRpc;
36using OpenMetaverse;
37using Nini.Config;
38using OpenSim.Data;
39using OpenSim.Framework;
40using OpenSim.Framework.Communications;
41using OpenSim.Framework.Communications.Services;
42using OpenSim.Framework.Communications.Cache;
43using OpenSim.Framework.Capabilities;
44using OpenSim.Framework.Servers;
45using OpenSim.Framework.Servers.HttpServer;
46using OpenSim.Services.Interfaces;
47using OpenSim.Services.Connectors;
48using GridRegion = OpenSim.Services.Interfaces.GridRegion;
49
50namespace OpenSim.Grid.UserServer.Modules
51{
52 public delegate void UserLoggedInAtLocation(UUID agentID, UUID sessionID, UUID RegionID,
53 ulong regionhandle, float positionX, float positionY, float positionZ,
54 string firstname, string lastname);
55
56 /// <summary>
57 /// Login service used in grid mode.
58 /// </summary>
59 public class UserLoginService : LoginService
60 {
61 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
62
63 public event UserLoggedInAtLocation OnUserLoggedInAtLocation;
64
65 private UserLoggedInAtLocation handlerUserLoggedInAtLocation;
66
67 public UserConfig m_config;
68 private readonly IRegionProfileRouter m_regionProfileService;
69
70 private IGridService m_GridService;
71
72 protected BaseHttpServer m_httpServer;
73
74 public UserLoginService(
75 UserManagerBase userManager, IInterServiceInventoryServices inventoryService,
76 LibraryRootFolder libraryRootFolder,
77 UserConfig config, string welcomeMess, IRegionProfileRouter regionProfileService)
78 : base(userManager, libraryRootFolder, welcomeMess)
79 {
80 m_config = config;
81 m_defaultHomeX = m_config.DefaultX;
82 m_defaultHomeY = m_config.DefaultY;
83 m_interInventoryService = inventoryService;
84 m_regionProfileService = regionProfileService;
85
86 m_GridService = new GridServicesConnector(config.GridServerURL.ToString());
87 }
88
89 public void RegisterHandlers(BaseHttpServer httpServer, bool registerLLSDHandler, bool registerOpenIDHandlers)
90 {
91 m_httpServer = httpServer;
92
93 m_httpServer.AddXmlRPCHandler("login_to_simulator", XmlRpcLoginMethod);
94 m_httpServer.AddHTTPHandler("login", ProcessHTMLLogin);
95 m_httpServer.AddXmlRPCHandler("set_login_params", XmlRPCSetLoginParams);
96 m_httpServer.AddXmlRPCHandler("check_auth_session", XmlRPCCheckAuthSession, false);
97
98 if (registerLLSDHandler)
99 {
100 m_httpServer.SetDefaultLLSDHandler(LLSDLoginMethod);
101 }
102
103 if (registerOpenIDHandlers)
104 {
105 // Handler for OpenID avatar identity pages
106 m_httpServer.AddStreamHandler(new OpenIdStreamHandler("GET", "/users/", this));
107 // Handlers for the OpenID endpoint server
108 m_httpServer.AddStreamHandler(new OpenIdStreamHandler("POST", "/openid/server/", this));
109 m_httpServer.AddStreamHandler(new OpenIdStreamHandler("GET", "/openid/server/", this));
110 }
111 }
112
113 public void setloginlevel(int level)
114 {
115 m_minLoginLevel = level;
116 m_log.InfoFormat("[GRID]: Login Level set to {0} ", level);
117 }
118 public void setwelcometext(string text)
119 {
120 m_welcomeMessage = text;
121 m_log.InfoFormat("[GRID]: Login text set to {0} ", text);
122 }
123
124 public override void LogOffUser(UserProfileData theUser, string message)
125 {
126 RegionProfileData SimInfo;
127 try
128 {
129 SimInfo = m_regionProfileService.RequestSimProfileData(
130 theUser.CurrentAgent.Handle, m_config.GridServerURL,
131 m_config.GridSendKey, m_config.GridRecvKey);
132
133 if (SimInfo == null)
134 {
135 m_log.Error("[GRID]: Region user was in isn't currently logged in");
136 return;
137 }
138 }
139 catch (Exception)
140 {
141 m_log.Error("[GRID]: Unable to look up region to log user off");
142 return;
143 }
144
145 // Prepare notification
146 Hashtable SimParams = new Hashtable();
147 SimParams["agent_id"] = theUser.ID.ToString();
148 SimParams["region_secret"] = theUser.CurrentAgent.SecureSessionID.ToString();
149 SimParams["region_secret2"] = SimInfo.regionSecret;
150 //m_log.Info(SimInfo.regionSecret);
151 SimParams["regionhandle"] = theUser.CurrentAgent.Handle.ToString();
152 SimParams["message"] = message;
153 ArrayList SendParams = new ArrayList();
154 SendParams.Add(SimParams);
155
156 m_log.InfoFormat(
157 "[ASSUMED CRASH]: Telling region {0} @ {1},{2} ({3}) that their agent is dead: {4}",
158 SimInfo.regionName, SimInfo.regionLocX, SimInfo.regionLocY, SimInfo.httpServerURI,
159 theUser.FirstName + " " + theUser.SurName);
160
161 try
162 {
163 XmlRpcRequest GridReq = new XmlRpcRequest("logoff_user", SendParams);
164 XmlRpcResponse GridResp = GridReq.Send(SimInfo.httpServerURI, 6000);
165
166 if (GridResp.IsFault)
167 {
168 m_log.ErrorFormat(
169 "[LOGIN]: XMLRPC request for {0} failed, fault code: {1}, reason: {2}, This is likely an old region revision.",
170 SimInfo.httpServerURI, GridResp.FaultCode, GridResp.FaultString);
171 }
172 }
173 catch (Exception)
174 {
175 m_log.Error("[LOGIN]: Error telling region to logout user!");
176 }
177
178 // Prepare notification
179 SimParams = new Hashtable();
180 SimParams["agent_id"] = theUser.ID.ToString();
181 SimParams["region_secret"] = SimInfo.regionSecret;
182 //m_log.Info(SimInfo.regionSecret);
183 SimParams["regionhandle"] = theUser.CurrentAgent.Handle.ToString();
184 SimParams["message"] = message;
185 SendParams = new ArrayList();
186 SendParams.Add(SimParams);
187
188 m_log.InfoFormat(
189 "[ASSUMED CRASH]: Telling region {0} @ {1},{2} ({3}) that their agent is dead: {4}",
190 SimInfo.regionName, SimInfo.regionLocX, SimInfo.regionLocY, SimInfo.httpServerURI,
191 theUser.FirstName + " " + theUser.SurName);
192
193 try
194 {
195 XmlRpcRequest GridReq = new XmlRpcRequest("logoff_user", SendParams);
196 XmlRpcResponse GridResp = GridReq.Send(SimInfo.httpServerURI, 6000);
197
198 if (GridResp.IsFault)
199 {
200 m_log.ErrorFormat(
201 "[LOGIN]: XMLRPC request for {0} failed, fault code: {1}, reason: {2}, This is likely an old region revision.",
202 SimInfo.httpServerURI, GridResp.FaultCode, GridResp.FaultString);
203 }
204 }
205 catch (Exception)
206 {
207 m_log.Error("[LOGIN]: Error telling region to logout user!");
208 }
209 //base.LogOffUser(theUser);
210 }
211
212 protected override RegionInfo RequestClosestRegion(string region)
213 {
214 return GridRegionToRegionInfo(m_GridService.GetRegionByName(UUID.Zero, region));
215 }
216
217 protected override RegionInfo GetRegionInfo(ulong homeRegionHandle)
218 {
219 uint x = 0, y = 0;
220 Utils.LongToUInts(homeRegionHandle, out x, out y);
221 return GridRegionToRegionInfo(m_GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y));
222 }
223
224 protected override RegionInfo GetRegionInfo(UUID homeRegionId)
225 {
226 return GridRegionToRegionInfo(m_GridService.GetRegionByUUID(UUID.Zero, homeRegionId));
227 }
228
229 private RegionInfo GridRegionToRegionInfo(GridRegion gregion)
230 {
231 if (gregion == null)
232 return null;
233
234 RegionInfo rinfo = new RegionInfo();
235 rinfo.ExternalHostName = gregion.ExternalHostName;
236 rinfo.HttpPort = gregion.HttpPort;
237 rinfo.InternalEndPoint = gregion.InternalEndPoint;
238 rinfo.RegionID = gregion.RegionID;
239 rinfo.RegionLocX = (uint)(gregion.RegionLocX / Constants.RegionSize);
240 rinfo.RegionLocY = (uint)(gregion.RegionLocY / Constants.RegionSize);
241 rinfo.RegionName = gregion.RegionName;
242 rinfo.ScopeID = gregion.ScopeID;
243 rinfo.ServerURI = gregion.ServerURI;
244
245 return rinfo;
246 }
247
248 protected override bool PrepareLoginToRegion(RegionInfo regionInfo, UserProfileData user, LoginResponse response, IPEndPoint remoteClient)
249 {
250 return PrepareLoginToRegion(RegionProfileData.FromRegionInfo(regionInfo), user, response, remoteClient);
251 }
252
253 /// <summary>
254 /// Prepare a login to the given region. This involves both telling the region to expect a connection
255 /// and appropriately customising the response to the user.
256 /// </summary>
257 /// <param name="regionInfo"></param>
258 /// <param name="user"></param>
259 /// <param name="response"></param>
260 /// <returns>true if the region was successfully contacted, false otherwise</returns>
261 private bool PrepareLoginToRegion(RegionProfileData regionInfo, UserProfileData user, LoginResponse response, IPEndPoint remoteClient)
262 {
263 try
264 {
265 response.SimAddress = Util.GetHostFromURL(regionInfo.serverURI).ToString();
266 response.SimPort = uint.Parse(regionInfo.serverURI.Split(new char[] { '/', ':' })[4]);
267 response.RegionX = regionInfo.regionLocX;
268 response.RegionY = regionInfo.regionLocY;
269
270 string capsPath = CapsUtil.GetRandomCapsObjectPath();
271
272 // Adam's working code commented for now -- Diva 5/25/2009
273 //// For NAT
274 ////string host = NetworkUtil.GetHostFor(remoteClient.Address, regionInfo.ServerIP);
275 //string host = response.SimAddress;
276 //// TODO: This doesnt support SSL. -Adam
277 //string serverURI = "http://" + host + ":" + regionInfo.ServerPort;
278
279 //response.SeedCapability = serverURI + CapsUtil.GetCapsSeedPath(capsPath);
280
281 // Take off trailing / so that the caps path isn't //CAPS/someUUID
282 string uri = regionInfo.httpServerURI.Trim(new char[] { '/' });
283 response.SeedCapability = uri + CapsUtil.GetCapsSeedPath(capsPath);
284
285
286 // Notify the target of an incoming user
287 m_log.InfoFormat(
288 "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection",
289 regionInfo.regionName, response.RegionX, response.RegionY, regionInfo.httpServerURI);
290
291 // Update agent with target sim
292 user.CurrentAgent.Region = regionInfo.UUID;
293 user.CurrentAgent.Handle = regionInfo.regionHandle;
294
295 // Prepare notification
296 Hashtable loginParams = new Hashtable();
297 loginParams["session_id"] = user.CurrentAgent.SessionID.ToString();
298 loginParams["secure_session_id"] = user.CurrentAgent.SecureSessionID.ToString();
299 loginParams["firstname"] = user.FirstName;
300 loginParams["lastname"] = user.SurName;
301 loginParams["agent_id"] = user.ID.ToString();
302 loginParams["circuit_code"] = (Int32)Convert.ToUInt32(response.CircuitCode);
303 loginParams["startpos_x"] = user.CurrentAgent.Position.X.ToString();
304 loginParams["startpos_y"] = user.CurrentAgent.Position.Y.ToString();
305 loginParams["startpos_z"] = user.CurrentAgent.Position.Z.ToString();
306 loginParams["regionhandle"] = user.CurrentAgent.Handle.ToString();
307 loginParams["caps_path"] = capsPath;
308
309 // Get appearance
310 AvatarAppearance appearance = m_userManager.GetUserAppearance(user.ID);
311 if (appearance != null)
312 {
313 loginParams["appearance"] = appearance.ToHashTable();
314 m_log.DebugFormat("[LOGIN]: Found appearance for {0} {1}", user.FirstName, user.SurName);
315 }
316 else
317 {
318 m_log.DebugFormat("[LOGIN]: Appearance not for {0} {1}. Creating default.", user.FirstName, user.SurName);
319 appearance = new AvatarAppearance(user.ID);
320 loginParams["appearance"] = appearance.ToHashTable();
321 }
322
323 ArrayList SendParams = new ArrayList();
324 SendParams.Add(loginParams);
325
326 // Send
327 XmlRpcRequest GridReq = new XmlRpcRequest("expect_user", SendParams);
328 XmlRpcResponse GridResp = GridReq.Send(regionInfo.httpServerURI, 6000);
329
330 if (!GridResp.IsFault)
331 {
332 bool responseSuccess = true;
333
334 if (GridResp.Value != null)
335 {
336 Hashtable resp = (Hashtable)GridResp.Value;
337 if (resp.ContainsKey("success"))
338 {
339 if ((string)resp["success"] == "FALSE")
340 {
341 responseSuccess = false;
342 }
343 }
344 }
345
346 if (responseSuccess)
347 {
348 handlerUserLoggedInAtLocation = OnUserLoggedInAtLocation;
349 if (handlerUserLoggedInAtLocation != null)
350 {
351 handlerUserLoggedInAtLocation(user.ID, user.CurrentAgent.SessionID,
352 user.CurrentAgent.Region,
353 user.CurrentAgent.Handle,
354 user.CurrentAgent.Position.X,
355 user.CurrentAgent.Position.Y,
356 user.CurrentAgent.Position.Z,
357 user.FirstName, user.SurName);
358 }
359 }
360 else
361 {
362 m_log.ErrorFormat("[LOGIN]: Region responded that it is not available to receive clients");
363 return false;
364 }
365 }
366 else
367 {
368 m_log.ErrorFormat("[LOGIN]: XmlRpc request to region failed with message {0}, code {1} ", GridResp.FaultString, GridResp.FaultCode);
369 return false;
370 }
371 }
372 catch (Exception e)
373 {
374 m_log.ErrorFormat("[LOGIN]: Region not available for login, {0}", e);
375 return false;
376 }
377
378 return true;
379 }
380
381 public XmlRpcResponse XmlRPCSetLoginParams(XmlRpcRequest request, IPEndPoint remoteClient)
382 {
383 XmlRpcResponse response = new XmlRpcResponse();
384 Hashtable requestData = (Hashtable)request.Params[0];
385 UserProfileData userProfile;
386 Hashtable responseData = new Hashtable();
387
388 UUID uid;
389 string pass = requestData["password"].ToString();
390
391 if (!UUID.TryParse((string)requestData["avatar_uuid"], out uid))
392 {
393 responseData["error"] = "No authorization";
394 response.Value = responseData;
395 return response;
396 }
397
398 userProfile = m_userManager.GetUserProfile(uid);
399
400 if (userProfile == null ||
401 (!AuthenticateUser(userProfile, pass)) ||
402 userProfile.GodLevel < 200)
403 {
404 responseData["error"] = "No authorization";
405 response.Value = responseData;
406 return response;
407 }
408
409 if (requestData.ContainsKey("login_level"))
410 {
411 m_minLoginLevel = Convert.ToInt32(requestData["login_level"]);
412 }
413
414 if (requestData.ContainsKey("login_motd"))
415 {
416 m_welcomeMessage = requestData["login_motd"].ToString();
417 }
418
419 response.Value = responseData;
420 return response;
421 }
422 }
423}
diff --git a/OpenSim/Grid/UserServer.Modules/UserManager.cs b/OpenSim/Grid/UserServer.Modules/UserManager.cs
deleted file mode 100644
index a2032dc..0000000
--- a/OpenSim/Grid/UserServer.Modules/UserManager.cs
+++ /dev/null
@@ -1,718 +0,0 @@
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;
30using System.Collections.Generic;
31using System.Net;
32using System.Reflection;
33using log4net;
34using Nwc.XmlRpc;
35using OpenMetaverse;
36using OpenSim.Framework;
37using OpenSim.Framework.Communications;
38using OpenSim.Framework.Servers;
39using OpenSim.Framework.Servers.HttpServer;
40using OpenSim.Grid.Framework;
41
42namespace OpenSim.Grid.UserServer.Modules
43{
44 public delegate void logOffUser(UUID AgentID);
45
46 public class UserManager
47 {
48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
49
50 public event logOffUser OnLogOffUser;
51 private logOffUser handlerLogOffUser;
52
53 private UserDataBaseService m_userDataBaseService;
54 private BaseHttpServer m_httpServer;
55
56 /// <summary>
57 ///
58 /// </summary>
59 /// <param name="userDataBaseService"></param>
60 public UserManager(UserDataBaseService userDataBaseService)
61 {
62 m_userDataBaseService = userDataBaseService;
63 }
64
65 public void Initialise(IGridServiceCore core)
66 {
67
68 }
69
70 public void PostInitialise()
71 {
72
73 }
74
75 private string RESTGetUserProfile(string request, string path, string param, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
76 {
77 UUID id;
78 UserProfileData userProfile;
79
80 try
81 {
82 id = new UUID(param);
83 }
84 catch (Exception)
85 {
86 httpResponse.StatusCode = 500;
87 return "Malformed Param [" + param + "]";
88 }
89
90 userProfile = m_userDataBaseService.GetUserProfile(id);
91
92 if (userProfile == null)
93 {
94 httpResponse.StatusCode = 404;
95 return "Not Found.";
96 }
97
98 return ProfileToXmlRPCResponse(userProfile).ToString();
99 }
100
101 public void RegisterHandlers(BaseHttpServer httpServer)
102 {
103 m_httpServer = httpServer;
104
105 m_httpServer.AddStreamHandler(new RestStreamHandler("GET", "/users/", RESTGetUserProfile));
106
107 m_httpServer.AddXmlRPCHandler("get_user_by_name", XmlRPCGetUserMethodName);
108 m_httpServer.AddXmlRPCHandler("get_user_by_uuid", XmlRPCGetUserMethodUUID);
109 m_httpServer.AddXmlRPCHandler("get_avatar_picker_avatar", XmlRPCGetAvatarPickerAvatar);
110
111 // Used by IAR module to do password checks
112 m_httpServer.AddXmlRPCHandler("authenticate_user_by_password", XmlRPCAuthenticateUserMethodPassword);
113
114 m_httpServer.AddXmlRPCHandler("update_user_current_region", XmlRPCAtRegion);
115 m_httpServer.AddXmlRPCHandler("logout_of_simulator", XmlRPCLogOffUserMethodUUID);
116 m_httpServer.AddXmlRPCHandler("get_agent_by_uuid", XmlRPCGetAgentMethodUUID);
117
118 m_httpServer.AddXmlRPCHandler("update_user_profile", XmlRpcResponseXmlRPCUpdateUserProfile);
119
120 m_httpServer.AddStreamHandler(new RestStreamHandler("DELETE", "/usersessions/", RestDeleteUserSessionMethod));
121 }
122
123 /// <summary>
124 /// Deletes an active agent session
125 /// </summary>
126 /// <param name="request">The request</param>
127 /// <param name="path">The path (eg /bork/narf/test)</param>
128 /// <param name="param">Parameters sent</param>
129 /// <param name="httpRequest">HTTP request header object</param>
130 /// <param name="httpResponse">HTTP response header object</param>
131 /// <returns>Success "OK" else error</returns>
132 public string RestDeleteUserSessionMethod(string request, string path, string param,
133 OSHttpRequest httpRequest, OSHttpResponse httpResponse)
134 {
135 // TODO! Important!
136
137 return "OK";
138 }
139
140 public XmlRpcResponse AvatarPickerListtoXmlRPCResponse(UUID queryID, List<AvatarPickerAvatar> returnUsers)
141 {
142 XmlRpcResponse response = new XmlRpcResponse();
143 Hashtable responseData = new Hashtable();
144 // Query Result Information
145 responseData["queryid"] = queryID.ToString();
146 responseData["avcount"] = returnUsers.Count.ToString();
147
148 for (int i = 0; i < returnUsers.Count; i++)
149 {
150 responseData["avatarid" + i] = returnUsers[i].AvatarID.ToString();
151 responseData["firstname" + i] = returnUsers[i].firstName;
152 responseData["lastname" + i] = returnUsers[i].lastName;
153 }
154 response.Value = responseData;
155
156 return response;
157 }
158
159 /// <summary>
160 /// Converts a user profile to an XML element which can be returned
161 /// </summary>
162 /// <param name="profile">The user profile</param>
163 /// <returns>A string containing an XML Document of the user profile</returns>
164 public XmlRpcResponse ProfileToXmlRPCResponse(UserProfileData profile)
165 {
166 XmlRpcResponse response = new XmlRpcResponse();
167 Hashtable responseData = new Hashtable();
168
169 // Account information
170 responseData["firstname"] = profile.FirstName;
171 responseData["lastname"] = profile.SurName;
172 responseData["email"] = profile.Email;
173 responseData["uuid"] = profile.ID.ToString();
174 // Server Information
175 responseData["server_inventory"] = profile.UserInventoryURI;
176 responseData["server_asset"] = profile.UserAssetURI;
177 // Profile Information
178 responseData["profile_about"] = profile.AboutText;
179 responseData["profile_firstlife_about"] = profile.FirstLifeAboutText;
180 responseData["profile_firstlife_image"] = profile.FirstLifeImage.ToString();
181 responseData["profile_can_do"] = profile.CanDoMask.ToString();
182 responseData["profile_want_do"] = profile.WantDoMask.ToString();
183 responseData["profile_image"] = profile.Image.ToString();
184 responseData["profile_created"] = profile.Created.ToString();
185 responseData["profile_lastlogin"] = profile.LastLogin.ToString();
186 // Home region information
187 responseData["home_coordinates_x"] = profile.HomeLocation.X.ToString();
188 responseData["home_coordinates_y"] = profile.HomeLocation.Y.ToString();
189 responseData["home_coordinates_z"] = profile.HomeLocation.Z.ToString();
190
191 responseData["home_region"] = profile.HomeRegion.ToString();
192 responseData["home_region_id"] = profile.HomeRegionID.ToString();
193
194 responseData["home_look_x"] = profile.HomeLookAt.X.ToString();
195 responseData["home_look_y"] = profile.HomeLookAt.Y.ToString();
196 responseData["home_look_z"] = profile.HomeLookAt.Z.ToString();
197
198 responseData["user_flags"] = profile.UserFlags.ToString();
199 responseData["god_level"] = profile.GodLevel.ToString();
200 responseData["custom_type"] = profile.CustomType;
201 responseData["partner"] = profile.Partner.ToString();
202 response.Value = responseData;
203
204 return response;
205 }
206
207 #region XMLRPC User Methods
208
209 /// <summary>
210 /// Authenticate a user using their password
211 /// </summary>
212 /// <param name="request">Must contain values for "user_uuid" and "password" keys</param>
213 /// <param name="remoteClient"></param>
214 /// <returns></returns>
215 public XmlRpcResponse XmlRPCAuthenticateUserMethodPassword(XmlRpcRequest request, IPEndPoint remoteClient)
216 {
217// m_log.DebugFormat("[USER MANAGER]: Received authenticated user by password request from {0}", remoteClient);
218
219 Hashtable requestData = (Hashtable)request.Params[0];
220 string userUuidRaw = (string)requestData["user_uuid"];
221 string password = (string)requestData["password"];
222
223 if (null == userUuidRaw)
224 return Util.CreateUnknownUserErrorResponse();
225
226 UUID userUuid;
227 if (!UUID.TryParse(userUuidRaw, out userUuid))
228 return Util.CreateUnknownUserErrorResponse();
229
230 UserProfileData userProfile = m_userDataBaseService.GetUserProfile(userUuid);
231 if (null == userProfile)
232 return Util.CreateUnknownUserErrorResponse();
233
234 string authed;
235
236 if (null == password)
237 {
238 authed = "FALSE";
239 }
240 else
241 {
242 if (m_userDataBaseService.AuthenticateUserByPassword(userUuid, password))
243 authed = "TRUE";
244 else
245 authed = "FALSE";
246 }
247
248// m_log.DebugFormat(
249// "[USER MANAGER]: Authentication by password result from {0} for {1} is {2}",
250// remoteClient, userUuid, authed);
251
252 XmlRpcResponse response = new XmlRpcResponse();
253 Hashtable responseData = new Hashtable();
254 responseData["auth_user"] = authed;
255 response.Value = responseData;
256
257 return response;
258 }
259
260 public XmlRpcResponse XmlRPCGetAvatarPickerAvatar(XmlRpcRequest request, IPEndPoint remoteClient)
261 {
262 // XmlRpcResponse response = new XmlRpcResponse();
263 Hashtable requestData = (Hashtable)request.Params[0];
264 List<AvatarPickerAvatar> returnAvatar = new List<AvatarPickerAvatar>();
265 UUID queryID = new UUID(UUID.Zero.ToString());
266
267 if (requestData.Contains("avquery") && requestData.Contains("queryid"))
268 {
269 queryID = new UUID((string)requestData["queryid"]);
270 returnAvatar = m_userDataBaseService.GenerateAgentPickerRequestResponse(queryID, (string)requestData["avquery"]);
271 }
272
273 m_log.InfoFormat("[AVATARINFO]: Servicing Avatar Query: " + (string)requestData["avquery"]);
274 return AvatarPickerListtoXmlRPCResponse(queryID, returnAvatar);
275 }
276
277 public XmlRpcResponse XmlRPCAtRegion(XmlRpcRequest request, IPEndPoint remoteClient)
278 {
279 XmlRpcResponse response = new XmlRpcResponse();
280 Hashtable requestData = (Hashtable)request.Params[0];
281 Hashtable responseData = new Hashtable();
282 string returnstring = "FALSE";
283
284 if (requestData.Contains("avatar_id") && requestData.Contains("region_handle") &&
285 requestData.Contains("region_uuid"))
286 {
287 // ulong cregionhandle = 0;
288 UUID regionUUID;
289 UUID avatarUUID;
290
291 UUID.TryParse((string)requestData["avatar_id"], out avatarUUID);
292 UUID.TryParse((string)requestData["region_uuid"], out regionUUID);
293
294 if (avatarUUID != UUID.Zero)
295 {
296 UserProfileData userProfile = m_userDataBaseService.GetUserProfile(avatarUUID);
297 userProfile.CurrentAgent.Region = regionUUID;
298 userProfile.CurrentAgent.Handle = (ulong)Convert.ToInt64((string)requestData["region_handle"]);
299 //userProfile.CurrentAgent.
300 m_userDataBaseService.CommitAgent(ref userProfile);
301 //setUserProfile(userProfile);
302
303 returnstring = "TRUE";
304 }
305 }
306
307 responseData.Add("returnString", returnstring);
308 response.Value = responseData;
309 return response;
310 }
311
312 public XmlRpcResponse XmlRPCGetUserMethodName(XmlRpcRequest request, IPEndPoint remoteClient)
313 {
314 // XmlRpcResponse response = new XmlRpcResponse();
315 Hashtable requestData = (Hashtable)request.Params[0];
316 UserProfileData userProfile;
317 if (requestData.Contains("avatar_name"))
318 {
319 string query = (string)requestData["avatar_name"];
320
321 if (null == query)
322 return Util.CreateUnknownUserErrorResponse();
323
324 // Regex objAlphaNumericPattern = new Regex("[^a-zA-Z0-9]");
325
326 string[] querysplit = query.Split(' ');
327
328 if (querysplit.Length == 2)
329 {
330 userProfile = m_userDataBaseService.GetUserProfile(querysplit[0], querysplit[1]);
331 if (userProfile == null)
332 {
333 return Util.CreateUnknownUserErrorResponse();
334 }
335 }
336 else
337 {
338 return Util.CreateUnknownUserErrorResponse();
339 }
340 }
341 else
342 {
343 return Util.CreateUnknownUserErrorResponse();
344 }
345
346 return ProfileToXmlRPCResponse(userProfile);
347 }
348
349 public XmlRpcResponse XmlRPCGetUserMethodUUID(XmlRpcRequest request, IPEndPoint remoteClient)
350 {
351 // XmlRpcResponse response = new XmlRpcResponse();
352 Hashtable requestData = (Hashtable)request.Params[0];
353 UserProfileData userProfile;
354 //CFK: this clogs the UserServer log and is not necessary at this time.
355 //CFK: m_log.Debug("METHOD BY UUID CALLED");
356 if (requestData.Contains("avatar_uuid"))
357 {
358 try
359 {
360 UUID guess = new UUID((string)requestData["avatar_uuid"]);
361
362 userProfile = m_userDataBaseService.GetUserProfile(guess);
363 }
364 catch (FormatException)
365 {
366 return Util.CreateUnknownUserErrorResponse();
367 }
368
369 if (userProfile == null)
370 {
371 return Util.CreateUnknownUserErrorResponse();
372 }
373 }
374 else
375 {
376 return Util.CreateUnknownUserErrorResponse();
377 }
378
379 return ProfileToXmlRPCResponse(userProfile);
380 }
381
382 public XmlRpcResponse XmlRPCGetAgentMethodUUID(XmlRpcRequest request, IPEndPoint remoteClient)
383 {
384 XmlRpcResponse response = new XmlRpcResponse();
385 Hashtable requestData = (Hashtable)request.Params[0];
386 UserProfileData userProfile;
387 //CFK: this clogs the UserServer log and is not necessary at this time.
388 //CFK: m_log.Debug("METHOD BY UUID CALLED");
389 if (requestData.Contains("avatar_uuid"))
390 {
391 UUID guess;
392
393 UUID.TryParse((string)requestData["avatar_uuid"], out guess);
394
395 if (guess == UUID.Zero)
396 {
397 return Util.CreateUnknownUserErrorResponse();
398 }
399
400 userProfile = m_userDataBaseService.GetUserProfile(guess);
401
402 if (userProfile == null)
403 {
404 return Util.CreateUnknownUserErrorResponse();
405 }
406
407 // no agent???
408 if (userProfile.CurrentAgent == null)
409 {
410 return Util.CreateUnknownUserErrorResponse();
411 }
412 Hashtable responseData = new Hashtable();
413
414 responseData["handle"] = userProfile.CurrentAgent.Handle.ToString();
415 responseData["session"] = userProfile.CurrentAgent.SessionID.ToString();
416 if (userProfile.CurrentAgent.AgentOnline)
417 responseData["agent_online"] = "TRUE";
418 else
419 responseData["agent_online"] = "FALSE";
420
421 response.Value = responseData;
422 }
423 else
424 {
425 return Util.CreateUnknownUserErrorResponse();
426 }
427
428 return response;
429 }
430
431 public XmlRpcResponse XmlRpcResponseXmlRPCUpdateUserProfile(XmlRpcRequest request, IPEndPoint remoteClient)
432 {
433 m_log.Debug("[UserManager]: Got request to update user profile");
434 XmlRpcResponse response = new XmlRpcResponse();
435 Hashtable requestData = (Hashtable)request.Params[0];
436 Hashtable responseData = new Hashtable();
437
438 if (!requestData.Contains("avatar_uuid"))
439 {
440 return Util.CreateUnknownUserErrorResponse();
441 }
442
443 UUID UserUUID = new UUID((string)requestData["avatar_uuid"]);
444 UserProfileData userProfile = m_userDataBaseService.GetUserProfile(UserUUID);
445 if (null == userProfile)
446 {
447 return Util.CreateUnknownUserErrorResponse();
448 }
449 // don't know how yet.
450 if (requestData.Contains("AllowPublish"))
451 {
452 }
453 if (requestData.Contains("FLImageID"))
454 {
455 userProfile.FirstLifeImage = new UUID((string)requestData["FLImageID"]);
456 }
457 if (requestData.Contains("ImageID"))
458 {
459 userProfile.Image = new UUID((string)requestData["ImageID"]);
460 }
461 // dont' know how yet
462 if (requestData.Contains("MaturePublish"))
463 {
464 }
465 if (requestData.Contains("AboutText"))
466 {
467 userProfile.AboutText = (string)requestData["AboutText"];
468 }
469 if (requestData.Contains("FLAboutText"))
470 {
471 userProfile.FirstLifeAboutText = (string)requestData["FLAboutText"];
472 }
473 // not in DB yet.
474 if (requestData.Contains("ProfileURL"))
475 {
476 }
477 if (requestData.Contains("home_region"))
478 {
479 try
480 {
481 userProfile.HomeRegion = Convert.ToUInt64((string)requestData["home_region"]);
482 }
483 catch (ArgumentException)
484 {
485 m_log.Error("[PROFILE]:Failed to set home region, Invalid Argument");
486 }
487 catch (FormatException)
488 {
489 m_log.Error("[PROFILE]:Failed to set home region, Invalid Format");
490 }
491 catch (OverflowException)
492 {
493 m_log.Error("[PROFILE]:Failed to set home region, Value was too large");
494 }
495 }
496 if (requestData.Contains("home_region_id"))
497 {
498 UUID regionID;
499 UUID.TryParse((string)requestData["home_region_id"], out regionID);
500 userProfile.HomeRegionID = regionID;
501 }
502 if (requestData.Contains("home_pos_x"))
503 {
504 try
505 {
506 userProfile.HomeLocationX = (float)Convert.ToDecimal((string)requestData["home_pos_x"], Culture.NumberFormatInfo);
507 }
508 catch (InvalidCastException)
509 {
510 m_log.Error("[PROFILE]:Failed to set home postion x");
511 }
512 }
513 if (requestData.Contains("home_pos_y"))
514 {
515 try
516 {
517 userProfile.HomeLocationY = (float)Convert.ToDecimal((string)requestData["home_pos_y"], Culture.NumberFormatInfo);
518 }
519 catch (InvalidCastException)
520 {
521 m_log.Error("[PROFILE]:Failed to set home postion y");
522 }
523 }
524 if (requestData.Contains("home_pos_z"))
525 {
526 try
527 {
528 userProfile.HomeLocationZ = (float)Convert.ToDecimal((string)requestData["home_pos_z"], Culture.NumberFormatInfo);
529 }
530 catch (InvalidCastException)
531 {
532 m_log.Error("[PROFILE]:Failed to set home postion z");
533 }
534 }
535 if (requestData.Contains("home_look_x"))
536 {
537 try
538 {
539 userProfile.HomeLookAtX = (float)Convert.ToDecimal((string)requestData["home_look_x"], Culture.NumberFormatInfo);
540 }
541 catch (InvalidCastException)
542 {
543 m_log.Error("[PROFILE]:Failed to set home lookat x");
544 }
545 }
546 if (requestData.Contains("home_look_y"))
547 {
548 try
549 {
550 userProfile.HomeLookAtY = (float)Convert.ToDecimal((string)requestData["home_look_y"], Culture.NumberFormatInfo);
551 }
552 catch (InvalidCastException)
553 {
554 m_log.Error("[PROFILE]:Failed to set home lookat y");
555 }
556 }
557 if (requestData.Contains("home_look_z"))
558 {
559 try
560 {
561 userProfile.HomeLookAtZ = (float)Convert.ToDecimal((string)requestData["home_look_z"], Culture.NumberFormatInfo);
562 }
563 catch (InvalidCastException)
564 {
565 m_log.Error("[PROFILE]:Failed to set home lookat z");
566 }
567 }
568 if (requestData.Contains("user_flags"))
569 {
570 try
571 {
572 userProfile.UserFlags = Convert.ToInt32((string)requestData["user_flags"]);
573 }
574 catch (InvalidCastException)
575 {
576 m_log.Error("[PROFILE]:Failed to set user flags");
577 }
578 }
579 if (requestData.Contains("god_level"))
580 {
581 try
582 {
583 userProfile.GodLevel = Convert.ToInt32((string)requestData["god_level"]);
584 }
585 catch (InvalidCastException)
586 {
587 m_log.Error("[PROFILE]:Failed to set god level");
588 }
589 }
590 if (requestData.Contains("custom_type"))
591 {
592 try
593 {
594 userProfile.CustomType = (string)requestData["custom_type"];
595 }
596 catch (InvalidCastException)
597 {
598 m_log.Error("[PROFILE]:Failed to set custom type");
599 }
600 }
601 if (requestData.Contains("partner"))
602 {
603 try
604 {
605 userProfile.Partner = new UUID((string)requestData["partner"]);
606 }
607 catch (InvalidCastException)
608 {
609 m_log.Error("[PROFILE]:Failed to set partner");
610 }
611 }
612 else
613 {
614 userProfile.Partner = UUID.Zero;
615 }
616
617 // call plugin!
618 bool ret = m_userDataBaseService.UpdateUserProfile(userProfile);
619 responseData["returnString"] = ret.ToString();
620 response.Value = responseData;
621 return response;
622 }
623
624 public XmlRpcResponse XmlRPCLogOffUserMethodUUID(XmlRpcRequest request, IPEndPoint remoteClient)
625 {
626 XmlRpcResponse response = new XmlRpcResponse();
627 Hashtable requestData = (Hashtable)request.Params[0];
628
629 if (requestData.Contains("avatar_uuid"))
630 {
631 try
632 {
633 UUID userUUID = new UUID((string)requestData["avatar_uuid"]);
634 UUID RegionID = new UUID((string)requestData["region_uuid"]);
635 ulong regionhandle = (ulong)Convert.ToInt64((string)requestData["region_handle"]);
636 Vector3 position = new Vector3(
637 (float)Convert.ToDecimal((string)requestData["region_pos_x"], Culture.NumberFormatInfo),
638 (float)Convert.ToDecimal((string)requestData["region_pos_y"], Culture.NumberFormatInfo),
639 (float)Convert.ToDecimal((string)requestData["region_pos_z"], Culture.NumberFormatInfo));
640 Vector3 lookat = new Vector3(
641 (float)Convert.ToDecimal((string)requestData["lookat_x"], Culture.NumberFormatInfo),
642 (float)Convert.ToDecimal((string)requestData["lookat_y"], Culture.NumberFormatInfo),
643 (float)Convert.ToDecimal((string)requestData["lookat_z"], Culture.NumberFormatInfo));
644
645 handlerLogOffUser = OnLogOffUser;
646 if (handlerLogOffUser != null)
647 handlerLogOffUser(userUUID);
648
649 m_userDataBaseService.LogOffUser(userUUID, RegionID, regionhandle, position, lookat);
650 }
651 catch (FormatException)
652 {
653 m_log.Warn("[LOGOUT]: Error in Logout XMLRPC Params");
654 return response;
655 }
656 }
657 else
658 {
659 return Util.CreateUnknownUserErrorResponse();
660 }
661
662 return response;
663 }
664
665 #endregion
666
667
668 public void HandleAgentLocation(UUID agentID, UUID regionID, ulong regionHandle)
669 {
670 UserProfileData userProfile = m_userDataBaseService.GetUserProfile(agentID);
671 if (userProfile != null)
672 {
673 userProfile.CurrentAgent.Region = regionID;
674 userProfile.CurrentAgent.Handle = regionHandle;
675 m_userDataBaseService.CommitAgent(ref userProfile);
676 }
677 }
678
679 public void HandleAgentLeaving(UUID agentID, UUID regionID, ulong regionHandle)
680 {
681 UserProfileData userProfile = m_userDataBaseService.GetUserProfile(agentID);
682 if (userProfile != null)
683 {
684 if (userProfile.CurrentAgent.Region == regionID)
685 {
686 UserAgentData userAgent = userProfile.CurrentAgent;
687 if (userAgent != null && userAgent.AgentOnline)
688 {
689 userAgent.AgentOnline = false;
690 userAgent.LogoutTime = Util.UnixTimeSinceEpoch();
691 if (regionID != UUID.Zero)
692 {
693 userAgent.Region = regionID;
694 }
695 userAgent.Handle = regionHandle;
696 userProfile.LastLogin = userAgent.LogoutTime;
697
698 m_userDataBaseService.CommitAgent(ref userProfile);
699
700 handlerLogOffUser = OnLogOffUser;
701 if (handlerLogOffUser != null)
702 handlerLogOffUser(agentID);
703 }
704 }
705 }
706 }
707
708 public void HandleRegionStartup(UUID regionID)
709 {
710 m_userDataBaseService.LogoutUsers(regionID);
711 }
712
713 public void HandleRegionShutdown(UUID regionID)
714 {
715 m_userDataBaseService.LogoutUsers(regionID);
716 }
717 }
718}
diff --git a/OpenSim/Grid/UserServer.Modules/UserServerAvatarAppearanceModule.cs b/OpenSim/Grid/UserServer.Modules/UserServerAvatarAppearanceModule.cs
deleted file mode 100644
index 88918d1..0000000
--- a/OpenSim/Grid/UserServer.Modules/UserServerAvatarAppearanceModule.cs
+++ /dev/null
@@ -1,132 +0,0 @@
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;
30using System.Collections.Generic;
31using System.Net;
32using System.Reflection;
33using log4net;
34using Nwc.XmlRpc;
35using OpenMetaverse;
36using OpenSim.Framework;
37using OpenSim.Framework.Communications;
38using OpenSim.Framework.Servers;
39using OpenSim.Framework.Servers.HttpServer;
40using OpenSim.Grid.Framework;
41
42namespace OpenSim.Grid.UserServer.Modules
43{
44 public class UserServerAvatarAppearanceModule
45 {
46 //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47
48 private UserDataBaseService m_userDataBaseService;
49 private BaseHttpServer m_httpServer;
50
51 public UserServerAvatarAppearanceModule(UserDataBaseService userDataBaseService)
52 {
53 m_userDataBaseService = userDataBaseService;
54 }
55
56 public void Initialise(IGridServiceCore core)
57 {
58
59 }
60
61 public void PostInitialise()
62 {
63
64 }
65
66 public void RegisterHandlers(BaseHttpServer httpServer)
67 {
68 m_httpServer = httpServer;
69
70 m_httpServer.AddXmlRPCHandler("get_avatar_appearance", XmlRPCGetAvatarAppearance);
71 m_httpServer.AddXmlRPCHandler("update_avatar_appearance", XmlRPCUpdateAvatarAppearance);
72 }
73
74 public XmlRpcResponse XmlRPCGetAvatarAppearance(XmlRpcRequest request, IPEndPoint remoteClient)
75 {
76 XmlRpcResponse response = new XmlRpcResponse();
77 Hashtable requestData = (Hashtable)request.Params[0];
78 AvatarAppearance appearance;
79 Hashtable responseData;
80 if (requestData.Contains("owner"))
81 {
82 appearance = m_userDataBaseService.GetUserAppearance(new UUID((string)requestData["owner"]));
83 if (appearance == null)
84 {
85 responseData = new Hashtable();
86 responseData["error_type"] = "no appearance";
87 responseData["error_desc"] = "There was no appearance found for this avatar";
88 }
89 else
90 {
91 responseData = appearance.ToHashTable();
92 }
93 }
94 else
95 {
96 responseData = new Hashtable();
97 responseData["error_type"] = "unknown_avatar";
98 responseData["error_desc"] = "The avatar appearance requested is not in the database";
99 }
100
101 response.Value = responseData;
102 return response;
103 }
104
105 public XmlRpcResponse XmlRPCUpdateAvatarAppearance(XmlRpcRequest request, IPEndPoint remoteClient)
106 {
107 XmlRpcResponse response = new XmlRpcResponse();
108 Hashtable requestData = (Hashtable)request.Params[0];
109 Hashtable responseData;
110 if (requestData.Contains("owner"))
111 {
112 AvatarAppearance appearance = new AvatarAppearance(requestData);
113
114 // TODO: Sometime in the future we may have a database layer that is capable of updating appearance when
115 // the TextureEntry is null. When that happens, this check can be removed
116 if (appearance.Texture != null)
117 m_userDataBaseService.UpdateUserAppearance(new UUID((string)requestData["owner"]), appearance);
118
119 responseData = new Hashtable();
120 responseData["returnString"] = "TRUE";
121 }
122 else
123 {
124 responseData = new Hashtable();
125 responseData["error_type"] = "unknown_avatar";
126 responseData["error_desc"] = "The avatar appearance requested is not in the database";
127 }
128 response.Value = responseData;
129 return response;
130 }
131 }
132}
diff --git a/OpenSim/Grid/UserServer.Modules/UserServerFriendsModule.cs b/OpenSim/Grid/UserServer.Modules/UserServerFriendsModule.cs
deleted file mode 100644
index 56e52a0..0000000
--- a/OpenSim/Grid/UserServer.Modules/UserServerFriendsModule.cs
+++ /dev/null
@@ -1,176 +0,0 @@
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;
30using System.Collections.Generic;
31using System.Net;
32using System.Reflection;
33using log4net;
34using Nwc.XmlRpc;
35using OpenMetaverse;
36using OpenSim.Framework;
37using OpenSim.Framework.Communications;
38using OpenSim.Framework.Servers;
39using OpenSim.Framework.Servers.HttpServer;
40using OpenSim.Grid.Framework;
41
42namespace OpenSim.Grid.UserServer.Modules
43{
44 public class UserServerFriendsModule
45 {
46 //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47
48 private UserDataBaseService m_userDataBaseService;
49
50 private BaseHttpServer m_httpServer;
51
52 public UserServerFriendsModule(UserDataBaseService userDataBaseService)
53 {
54 m_userDataBaseService = userDataBaseService;
55 }
56
57 public void Initialise(IGridServiceCore core)
58 {
59
60 }
61
62 public void PostInitialise()
63 {
64
65 }
66
67 public void RegisterHandlers(BaseHttpServer httpServer)
68 {
69 m_httpServer = httpServer;
70
71 m_httpServer.AddXmlRPCHandler("add_new_user_friend", XmlRpcResponseXmlRPCAddUserFriend);
72 m_httpServer.AddXmlRPCHandler("remove_user_friend", XmlRpcResponseXmlRPCRemoveUserFriend);
73 m_httpServer.AddXmlRPCHandler("update_user_friend_perms", XmlRpcResponseXmlRPCUpdateUserFriendPerms);
74 m_httpServer.AddXmlRPCHandler("get_user_friend_list", XmlRpcResponseXmlRPCGetUserFriendList);
75 }
76
77 public XmlRpcResponse FriendListItemListtoXmlRPCResponse(List<FriendListItem> returnUsers)
78 {
79 XmlRpcResponse response = new XmlRpcResponse();
80 Hashtable responseData = new Hashtable();
81 // Query Result Information
82
83 responseData["avcount"] = returnUsers.Count.ToString();
84
85 for (int i = 0; i < returnUsers.Count; i++)
86 {
87 responseData["ownerID" + i] = returnUsers[i].FriendListOwner.ToString();
88 responseData["friendID" + i] = returnUsers[i].Friend.ToString();
89 responseData["ownerPerms" + i] = returnUsers[i].FriendListOwnerPerms.ToString();
90 responseData["friendPerms" + i] = returnUsers[i].FriendPerms.ToString();
91 }
92 response.Value = responseData;
93
94 return response;
95 }
96
97 public XmlRpcResponse XmlRpcResponseXmlRPCAddUserFriend(XmlRpcRequest request, IPEndPoint remoteClient)
98 {
99 XmlRpcResponse response = new XmlRpcResponse();
100 Hashtable requestData = (Hashtable)request.Params[0];
101 Hashtable responseData = new Hashtable();
102 string returnString = "FALSE";
103 // Query Result Information
104
105 if (requestData.Contains("ownerID") && requestData.Contains("friendID") &&
106 requestData.Contains("friendPerms"))
107 {
108 // UserManagerBase.AddNewuserFriend
109 m_userDataBaseService.AddNewUserFriend(new UUID((string)requestData["ownerID"]),
110 new UUID((string)requestData["friendID"]),
111 (uint)Convert.ToInt32((string)requestData["friendPerms"]));
112 returnString = "TRUE";
113 }
114 responseData["returnString"] = returnString;
115 response.Value = responseData;
116 return response;
117 }
118
119 public XmlRpcResponse XmlRpcResponseXmlRPCRemoveUserFriend(XmlRpcRequest request, IPEndPoint remoteClient)
120 {
121 XmlRpcResponse response = new XmlRpcResponse();
122 Hashtable requestData = (Hashtable)request.Params[0];
123 Hashtable responseData = new Hashtable();
124 string returnString = "FALSE";
125 // Query Result Information
126
127 if (requestData.Contains("ownerID") && requestData.Contains("friendID"))
128 {
129 // UserManagerBase.AddNewuserFriend
130 m_userDataBaseService.RemoveUserFriend(new UUID((string)requestData["ownerID"]),
131 new UUID((string)requestData["friendID"]));
132 returnString = "TRUE";
133 }
134 responseData["returnString"] = returnString;
135 response.Value = responseData;
136 return response;
137 }
138
139 public XmlRpcResponse XmlRpcResponseXmlRPCUpdateUserFriendPerms(XmlRpcRequest request, IPEndPoint remoteClient)
140 {
141 XmlRpcResponse response = new XmlRpcResponse();
142 Hashtable requestData = (Hashtable)request.Params[0];
143 Hashtable responseData = new Hashtable();
144 string returnString = "FALSE";
145
146 if (requestData.Contains("ownerID") && requestData.Contains("friendID") &&
147 requestData.Contains("friendPerms"))
148 {
149 m_userDataBaseService.UpdateUserFriendPerms(new UUID((string)requestData["ownerID"]),
150 new UUID((string)requestData["friendID"]),
151 (uint)Convert.ToInt32((string)requestData["friendPerms"]));
152 // UserManagerBase.
153 returnString = "TRUE";
154 }
155 responseData["returnString"] = returnString;
156 response.Value = responseData;
157 return response;
158 }
159
160 public XmlRpcResponse XmlRpcResponseXmlRPCGetUserFriendList(XmlRpcRequest request, IPEndPoint remoteClient)
161 {
162 // XmlRpcResponse response = new XmlRpcResponse();
163 Hashtable requestData = (Hashtable)request.Params[0];
164 // Hashtable responseData = new Hashtable();
165
166 List<FriendListItem> returndata = new List<FriendListItem>();
167
168 if (requestData.Contains("ownerID"))
169 {
170 returndata = m_userDataBaseService.GetUserFriendList(new UUID((string)requestData["ownerID"]));
171 }
172
173 return FriendListItemListtoXmlRPCResponse(returndata);
174 }
175 }
176}