aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs31
-rw-r--r--OpenSim/Client/Linden/LLProxyLoginModule.cs364
-rw-r--r--OpenSim/Client/Linden/LLStandaloneLoginModule.cs305
-rw-r--r--OpenSim/Client/Linden/LLStandaloneLoginService.cs245
-rw-r--r--OpenSim/Client/Linden/Resources/LindenModules.addin.xml4
-rw-r--r--OpenSim/Framework/Communications/CommunicationsManager.cs55
-rw-r--r--OpenSim/Framework/Communications/Tests/LoginServiceTests.cs461
-rw-r--r--OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs1
-rw-r--r--OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs4
-rw-r--r--OpenSim/Region/Communications/Local/CommunicationsLocal.cs1
-rw-r--r--OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs29
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs19
13 files changed, 20 insertions, 1500 deletions
diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
index d6d5700..a82d25a 100644
--- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
+++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
@@ -591,24 +591,30 @@ namespace OpenSim.ApplicationPlugins.RemoteController
591 if (masterFirst != String.Empty && masterLast != String.Empty) // User requests a master avatar 591 if (masterFirst != String.Empty && masterLast != String.Empty) // User requests a master avatar
592 { 592 {
593 // no client supplied UUID: look it up... 593 // no client supplied UUID: look it up...
594 CachedUserInfo userInfo 594 UUID scopeID = m_app.SceneManager.CurrentOrFirstScene.RegionInfo.ScopeID;
595 = m_app.CommunicationsManager.UserProfileCacheService.GetUserDetails( 595 UserAccount account = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.GetUserAccount(scopeID, masterFirst, masterLast);
596 masterFirst, masterLast); 596 if (null == account)
597
598 if (null == userInfo)
599 { 597 {
600 m_log.InfoFormat("master avatar does not exist, creating it"); 598 m_log.InfoFormat("master avatar does not exist, creating it");
601 // ...or create new user 599 // ...or create new user
602 userID = m_app.CommunicationsManager.UserAdminService.AddUser(
603 masterFirst, masterLast, masterPassword, "", region.RegionLocX, region.RegionLocY);
604 600
605 if (userID == UUID.Zero) 601 account = new UserAccount(scopeID, masterFirst, masterLast, "");
602 bool success = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.StoreUserAccount(account);
603 if (success)
604 {
605 GridRegion home = m_app.SceneManager.CurrentOrFirstScene.GridService.GetRegionByPosition(scopeID,
606 (int)(region.RegionLocX * Constants.RegionSize), (int)(region.RegionLocY * Constants.RegionSize));
607
608 m_app.SceneManager.CurrentOrFirstScene.PresenceService.SetHomeLocation(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0));
609 }
610 else
606 throw new Exception(String.Format("failed to create new user {0} {1}", 611 throw new Exception(String.Format("failed to create new user {0} {1}",
607 masterFirst, masterLast)); 612 masterFirst, masterLast));
613
608 } 614 }
609 else 615 else
610 { 616 {
611 userID = userInfo.UserProfile.ID; 617 userID = account.PrincipalID;
612 } 618 }
613 } 619 }
614 } 620 }
@@ -2591,10 +2597,11 @@ namespace OpenSim.ApplicationPlugins.RemoteController
2591 2597
2592 foreach (UUID user in acl) 2598 foreach (UUID user in acl)
2593 { 2599 {
2594 CachedUserInfo udata = m_app.CommunicationsManager.UserProfileCacheService.GetUserDetails(user); 2600 UUID scopeID = m_app.SceneManager.CurrentOrFirstScene.RegionInfo.ScopeID;
2595 if (udata != null) 2601 UserAccount account = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.GetUserAccount(scopeID, user);
2602 if (account != null)
2596 { 2603 {
2597 users[user.ToString()] = udata.UserProfile.Name; 2604 users[user.ToString()] = account.FirstName + " " + account.LastName;
2598 } 2605 }
2599 } 2606 }
2600 2607
diff --git a/OpenSim/Client/Linden/LLProxyLoginModule.cs b/OpenSim/Client/Linden/LLProxyLoginModule.cs
deleted file mode 100644
index 9075f15..0000000
--- a/OpenSim/Client/Linden/LLProxyLoginModule.cs
+++ /dev/null
@@ -1,364 +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.Text;
32using Nwc.XmlRpc;
33using System.Net;
34using System.Net.Sockets;
35using System.Reflection;
36using System.Security.Authentication;
37using log4net;
38using Nini.Config;
39using OpenMetaverse;
40using OpenSim.Framework;
41using OpenSim.Framework.Communications;
42using OpenSim.Framework.Servers;
43using OpenSim.Region.Framework.Interfaces;
44using OpenSim.Region.Framework.Scenes;
45
46namespace OpenSim.Client.Linden
47{
48 /// <summary>
49 /// Handles login user (expect user) and logoff user messages from the remote LL login server
50 /// </summary>
51 public class LLProxyLoginModule : ISharedRegionModule
52 {
53 private uint m_port = 0;
54
55 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
56
57 public LLProxyLoginModule(uint port)
58 {
59 m_log.DebugFormat("[CLIENT]: LLProxyLoginModule port {0}", port);
60 m_port = port;
61 }
62
63 protected bool RegionLoginsEnabled
64 {
65 get
66 {
67 if (m_firstScene != null)
68 {
69 return m_firstScene.SceneGridService.RegionLoginsEnabled;
70 }
71 else
72 {
73 return false;
74 }
75 }
76 }
77
78 protected List<Scene> m_scenes = new List<Scene>();
79 protected Scene m_firstScene;
80
81 protected bool m_enabled = false; // Module is only enabled if running in grid mode
82
83 #region IRegionModule Members
84
85 public void Initialise(IConfigSource source)
86 {
87 IConfig startupConfig = source.Configs["Modules"];
88 if (startupConfig != null)
89 {
90 m_enabled = startupConfig.GetBoolean("LLProxyLoginModule", false);
91 }
92 }
93
94 public void AddRegion(Scene scene)
95 {
96 if (m_firstScene == null)
97 {
98 m_firstScene = scene;
99
100 if (m_enabled)
101 {
102 AddHttpHandlers();
103 }
104 }
105
106 if (m_enabled)
107 {
108 AddScene(scene);
109 }
110
111 }
112
113 public void RemoveRegion(Scene scene)
114 {
115 if (m_enabled)
116 {
117 RemoveScene(scene);
118 }
119 }
120
121 public void PostInitialise()
122 {
123
124 }
125
126 public void Close()
127 {
128
129 }
130
131 public void RegionLoaded(Scene scene)
132 {
133
134 }
135
136 public Type ReplaceableInterface
137 {
138 get { return null; }
139 }
140
141 public string Name
142 {
143 get { return "LLProxyLoginModule"; }
144 }
145
146 public bool IsSharedModule
147 {
148 get { return true; }
149 }
150
151 #endregion
152
153 /// <summary>
154 /// Adds "expect_user" and "logoff_user" xmlrpc method handlers
155 /// </summary>
156 protected void AddHttpHandlers()
157 {
158 //we will add our handlers to the first scene we received, as all scenes share a http server. But will this ever change?
159 MainServer.GetHttpServer(m_port).AddXmlRPCHandler("expect_user", ExpectUser, false);
160 MainServer.GetHttpServer(m_port).AddXmlRPCHandler("logoff_user", LogOffUser, false);
161 }
162
163 protected void AddScene(Scene scene)
164 {
165 lock (m_scenes)
166 {
167 if (!m_scenes.Contains(scene))
168 {
169 m_scenes.Add(scene);
170 }
171 }
172 }
173
174 protected void RemoveScene(Scene scene)
175 {
176 lock (m_scenes)
177 {
178 if (m_scenes.Contains(scene))
179 {
180 m_scenes.Remove(scene);
181 }
182 }
183 }
184 /// <summary>
185 /// Received from the user server when a user starts logging in. This call allows
186 /// the region to prepare for direct communication from the client. Sends back an empty
187 /// xmlrpc response on completion.
188 /// </summary>
189 /// <param name="request"></param>
190 /// <returns></returns>
191 public XmlRpcResponse ExpectUser(XmlRpcRequest request, IPEndPoint remoteClient)
192 {
193 XmlRpcResponse resp = new XmlRpcResponse();
194
195 try
196 {
197 ulong regionHandle = 0;
198 Hashtable requestData = (Hashtable)request.Params[0];
199 AgentCircuitData agentData = new AgentCircuitData();
200 if (requestData.ContainsKey("session_id"))
201 agentData.SessionID = new UUID((string)requestData["session_id"]);
202 if (requestData.ContainsKey("secure_session_id"))
203 agentData.SecureSessionID = new UUID((string)requestData["secure_session_id"]);
204 if (requestData.ContainsKey("firstname"))
205 agentData.firstname = (string)requestData["firstname"];
206 if (requestData.ContainsKey("lastname"))
207 agentData.lastname = (string)requestData["lastname"];
208 if (requestData.ContainsKey("agent_id"))
209 agentData.AgentID = new UUID((string)requestData["agent_id"]);
210 if (requestData.ContainsKey("circuit_code"))
211 agentData.circuitcode = Convert.ToUInt32(requestData["circuit_code"]);
212 if (requestData.ContainsKey("caps_path"))
213 agentData.CapsPath = (string)requestData["caps_path"];
214 if (requestData.ContainsKey("regionhandle"))
215 regionHandle = Convert.ToUInt64((string)requestData["regionhandle"]);
216 else
217 m_log.Warn("[CLIENT]: request from login server did not contain regionhandle");
218
219 // Appearance
220 if (requestData.ContainsKey("appearance"))
221 agentData.Appearance = new AvatarAppearance((Hashtable)requestData["appearance"]);
222
223 m_log.DebugFormat(
224 "[CLIENT]: Told by user service to prepare for a connection from {0} {1} {2}, circuit {3}",
225 agentData.firstname, agentData.lastname, agentData.AgentID, agentData.circuitcode);
226
227 if (requestData.ContainsKey("child_agent") && requestData["child_agent"].Equals("1"))
228 {
229 //m_log.Debug("[CLIENT]: Child agent detected");
230 agentData.child = true;
231 }
232 else
233 {
234 //m_log.Debug("[CLIENT]: Main agent detected");
235 agentData.startpos =
236 new Vector3((float)Convert.ToDecimal((string)requestData["startpos_x"]),
237 (float)Convert.ToDecimal((string)requestData["startpos_y"]),
238 (float)Convert.ToDecimal((string)requestData["startpos_z"]));
239 agentData.child = false;
240 }
241
242 if (!RegionLoginsEnabled)
243 {
244 m_log.InfoFormat(
245 "[CLIENT]: Denying access for user {0} {1} because region login is currently disabled",
246 agentData.firstname, agentData.lastname);
247
248 Hashtable respdata = new Hashtable();
249 respdata["success"] = "FALSE";
250 respdata["reason"] = "region login currently disabled";
251 resp.Value = respdata;
252 }
253 else
254 {
255 bool success = false;
256 string denyMess = "";
257
258 Scene scene;
259 if (TryGetRegion(regionHandle, out scene))
260 {
261 if (scene.RegionInfo.EstateSettings.IsBanned(agentData.AgentID))
262 {
263 denyMess = "User is banned from this region";
264 m_log.InfoFormat(
265 "[CLIENT]: Denying access for user {0} {1} because user is banned",
266 agentData.firstname, agentData.lastname);
267 }
268 else
269 {
270 string reason;
271 if (scene.NewUserConnection(agentData, (uint)TeleportFlags.ViaLogin, out reason))
272 {
273 success = true;
274 }
275 else
276 {
277 denyMess = String.Format("Login refused by region: {0}", reason);
278 m_log.InfoFormat(
279 "[CLIENT]: Denying access for user {0} {1} because user connection was refused by the region",
280 agentData.firstname, agentData.lastname);
281 }
282 }
283
284 }
285 else
286 {
287 denyMess = "Region not found";
288 }
289
290 if (success)
291 {
292 Hashtable respdata = new Hashtable();
293 respdata["success"] = "TRUE";
294 resp.Value = respdata;
295 }
296 else
297 {
298 Hashtable respdata = new Hashtable();
299 respdata["success"] = "FALSE";
300 respdata["reason"] = denyMess;
301 resp.Value = respdata;
302 }
303 }
304 }
305 catch (Exception e)
306 {
307 m_log.WarnFormat("[CLIENT]: Unable to receive user. Reason: {0} ({1})", e, e.StackTrace);
308 Hashtable respdata = new Hashtable();
309 respdata["success"] = "FALSE";
310 respdata["reason"] = "Exception occurred";
311 resp.Value = respdata;
312 }
313
314 return resp;
315 }
316
317 // Grid Request Processing
318 /// <summary>
319 /// Ooops, our Agent must be dead if we're getting this request!
320 /// </summary>
321 /// <param name="request"></param>
322 /// <returns></returns>
323 public XmlRpcResponse LogOffUser(XmlRpcRequest request, IPEndPoint remoteClient)
324 {
325 m_log.Debug("[CONNECTION DEBUGGING]: LogOff User Called");
326
327 Hashtable requestData = (Hashtable)request.Params[0];
328 string message = (string)requestData["message"];
329 UUID agentID = UUID.Zero;
330 UUID RegionSecret = UUID.Zero;
331 UUID.TryParse((string)requestData["agent_id"], out agentID);
332 UUID.TryParse((string)requestData["region_secret"], out RegionSecret);
333
334 ulong regionHandle = Convert.ToUInt64((string)requestData["regionhandle"]);
335
336 Scene scene;
337 if (TryGetRegion(regionHandle, out scene))
338 {
339 scene.HandleLogOffUserFromGrid(agentID, RegionSecret, message);
340 }
341
342 return new XmlRpcResponse();
343 }
344
345 protected bool TryGetRegion(ulong regionHandle, out Scene scene)
346 {
347 lock (m_scenes)
348 {
349 foreach (Scene nextScene in m_scenes)
350 {
351 if (nextScene.RegionInfo.RegionHandle == regionHandle)
352 {
353 scene = nextScene;
354 return true;
355 }
356 }
357 }
358
359 scene = null;
360 return false;
361 }
362
363 }
364}
diff --git a/OpenSim/Client/Linden/LLStandaloneLoginModule.cs b/OpenSim/Client/Linden/LLStandaloneLoginModule.cs
deleted file mode 100644
index 8047f74..0000000
--- a/OpenSim/Client/Linden/LLStandaloneLoginModule.cs
+++ /dev/null
@@ -1,305 +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 Nini.Config;
36using OpenMetaverse;
37using OpenSim.Framework;
38using OpenSim.Framework.Communications;
39using OpenSim.Framework.Communications.Cache;
40using OpenSim.Framework.Capabilities;
41using OpenSim.Framework.Servers.HttpServer;
42using OpenSim.Region.Framework.Scenes;
43using OpenSim.Region.Framework.Interfaces;
44
45namespace OpenSim.Client.Linden
46{
47 public class LLStandaloneLoginModule : ISharedRegionModule, ILoginServiceToRegionsConnector
48 {
49 //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
50
51 protected List<Scene> m_scenes = new List<Scene>();
52 protected Scene m_firstScene;
53
54 protected bool m_enabled = false; // Module is only enabled if running in standalone mode
55
56 protected bool authenticate;
57 protected string welcomeMessage;
58
59 public bool RegionLoginsEnabled
60 {
61 get
62 {
63 if (m_firstScene != null)
64 {
65 return m_firstScene.SceneGridService.RegionLoginsEnabled;
66 }
67 else
68 {
69 return false;
70 }
71 }
72 }
73
74 protected LLStandaloneLoginService m_loginService;
75
76 #region IRegionModule Members
77
78 public void Initialise(IConfigSource source)
79 {
80 IConfig startupConfig = source.Configs["Startup"];
81 if (startupConfig != null)
82 {
83 m_enabled = !startupConfig.GetBoolean("gridmode", false);
84 }
85
86 if (m_enabled)
87 {
88 authenticate = true;
89 welcomeMessage = "Welcome to OpenSim";
90 IConfig standaloneConfig = source.Configs["StandAlone"];
91 if (standaloneConfig != null)
92 {
93 authenticate = standaloneConfig.GetBoolean("accounts_authenticate", true);
94 welcomeMessage = standaloneConfig.GetString("welcome_message");
95 }
96 }
97 }
98
99 public void AddRegion(Scene scene)
100 {
101 }
102
103 public void RemoveRegion(Scene scene)
104 {
105 if (m_enabled)
106 {
107 RemoveScene(scene);
108 }
109 }
110
111 public void PostInitialise()
112 {
113
114 }
115
116 public void Close()
117 {
118
119 }
120
121 public void RegionLoaded(Scene scene)
122 {
123 if (m_firstScene == null)
124 {
125 m_firstScene = scene;
126
127 if (m_enabled)
128 {
129 //TODO: fix casting.
130 LibraryRootFolder rootFolder
131 = m_firstScene.CommsManager.UserProfileCacheService.LibraryRoot as LibraryRootFolder;
132
133 IHttpServer httpServer = MainServer.Instance;
134
135 //TODO: fix the casting of the user service, maybe by registering the userManagerBase with scenes, or refactoring so we just need a IUserService reference
136 m_loginService
137 = new LLStandaloneLoginService(
138 (UserManagerBase)m_firstScene.CommsManager.UserAdminService, welcomeMessage,
139 m_firstScene.InventoryService, m_firstScene.CommsManager.NetworkServersInfo, authenticate,
140 rootFolder, this);
141
142 httpServer.AddXmlRPCHandler("login_to_simulator", m_loginService.XmlRpcLoginMethod);
143
144 // provides the web form login
145 httpServer.AddHTTPHandler("login", m_loginService.ProcessHTMLLogin);
146
147 // Provides the LLSD login
148 httpServer.SetDefaultLLSDHandler(m_loginService.LLSDLoginMethod);
149 }
150 }
151
152 if (m_enabled)
153 {
154 AddScene(scene);
155 }
156 }
157
158 public Type ReplaceableInterface
159 {
160 get { return null; }
161 }
162
163 public string Name
164 {
165 get { return "LLStandaloneLoginModule"; }
166 }
167
168 public bool IsSharedModule
169 {
170 get { return true; }
171 }
172
173 #endregion
174
175 protected void AddScene(Scene scene)
176 {
177 lock (m_scenes)
178 {
179 if (!m_scenes.Contains(scene))
180 {
181 m_scenes.Add(scene);
182 }
183 }
184 }
185
186 protected void RemoveScene(Scene scene)
187 {
188 lock (m_scenes)
189 {
190 if (m_scenes.Contains(scene))
191 {
192 m_scenes.Remove(scene);
193 }
194 }
195 }
196
197 public bool NewUserConnection(ulong regionHandle, AgentCircuitData agent, out string reason)
198 {
199 Scene scene;
200 if (TryGetRegion(regionHandle, out scene))
201 {
202 return scene.NewUserConnection(agent, (uint)TeleportFlags.ViaLogin, out reason);
203 }
204 reason = "Region not found.";
205 return false;
206 }
207
208 public void LogOffUserFromGrid(ulong regionHandle, UUID AvatarID, UUID RegionSecret, string message)
209 {
210 Scene scene;
211 if (TryGetRegion(regionHandle, out scene))
212 {
213 scene.HandleLogOffUserFromGrid(AvatarID, RegionSecret, message);
214 }
215 }
216
217 public RegionInfo RequestNeighbourInfo(ulong regionhandle)
218 {
219 Scene scene;
220 if (TryGetRegion(regionhandle, out scene))
221 {
222 return scene.RegionInfo;
223 }
224 return null;
225 }
226
227 public RegionInfo RequestClosestRegion(string region)
228 {
229 Scene scene;
230 if (TryGetRegion(region, out scene))
231 {
232 return scene.RegionInfo;
233 }
234 else if (m_scenes.Count > 0)
235 {
236 return m_scenes[0].RegionInfo;
237 }
238 return null;
239 }
240
241 public RegionInfo RequestNeighbourInfo(UUID regionID)
242 {
243 Scene scene;
244 if (TryGetRegion(regionID, out scene))
245 {
246 return scene.RegionInfo;
247 }
248 return null;
249 }
250
251 protected bool TryGetRegion(ulong regionHandle, out Scene scene)
252 {
253 lock (m_scenes)
254 {
255 foreach (Scene nextScene in m_scenes)
256 {
257 if (nextScene.RegionInfo.RegionHandle == regionHandle)
258 {
259 scene = nextScene;
260 return true;
261 }
262 }
263 }
264
265 scene = null;
266 return false;
267 }
268
269 protected bool TryGetRegion(UUID regionID, out Scene scene)
270 {
271 lock (m_scenes)
272 {
273 foreach (Scene nextScene in m_scenes)
274 {
275 if (nextScene.RegionInfo.RegionID == regionID)
276 {
277 scene = nextScene;
278 return true;
279 }
280 }
281 }
282
283 scene = null;
284 return false;
285 }
286
287 protected bool TryGetRegion(string regionName, out Scene scene)
288 {
289 lock (m_scenes)
290 {
291 foreach (Scene nextScene in m_scenes)
292 {
293 if (nextScene.RegionInfo.RegionName.Equals(regionName, StringComparison.InvariantCultureIgnoreCase))
294 {
295 scene = nextScene;
296 return true;
297 }
298 }
299 }
300
301 scene = null;
302 return false;
303 }
304 }
305}
diff --git a/OpenSim/Client/Linden/LLStandaloneLoginService.cs b/OpenSim/Client/Linden/LLStandaloneLoginService.cs
deleted file mode 100644
index a975fa2..0000000
--- a/OpenSim/Client/Linden/LLStandaloneLoginService.cs
+++ /dev/null
@@ -1,245 +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 Nini.Config;
36using OpenMetaverse;
37using OpenSim.Framework;
38using OpenSim.Framework.Communications;
39using OpenSim.Framework.Communications.Services;
40using LoginResponse = OpenSim.Framework.Communications.Services.LoginResponse;
41using OpenSim.Framework.Communications.Cache;
42using OpenSim.Framework.Capabilities;
43using OpenSim.Framework.Servers;
44using OpenSim.Region.Framework.Scenes;
45using OpenSim.Region.Framework.Interfaces;
46using OpenSim.Services.Interfaces;
47
48namespace OpenSim.Client.Linden
49{
50 public class LLStandaloneLoginService : LoginService
51 {
52 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
53
54 protected NetworkServersInfo m_serversInfo;
55 protected bool m_authUsers = false;
56
57 /// <summary>
58 /// Used to make requests to the local regions.
59 /// </summary>
60 protected ILoginServiceToRegionsConnector m_regionsConnector;
61
62 public LLStandaloneLoginService(
63 UserManagerBase userManager, string welcomeMess,
64 IInventoryService interServiceInventoryService,
65 NetworkServersInfo serversInfo,
66 bool authenticate, LibraryRootFolder libraryRootFolder, ILoginServiceToRegionsConnector regionsConnector)
67 : base(userManager, libraryRootFolder, welcomeMess)
68 {
69 this.m_serversInfo = serversInfo;
70 m_defaultHomeX = this.m_serversInfo.DefaultHomeLocX;
71 m_defaultHomeY = this.m_serversInfo.DefaultHomeLocY;
72 m_authUsers = authenticate;
73
74 m_InventoryService = interServiceInventoryService;
75 m_regionsConnector = regionsConnector;
76 // Standard behavior: In StandAlone, silent logout of last hung session
77 m_warn_already_logged = false;
78 }
79
80 public override UserProfileData GetTheUser(string firstname, string lastname)
81 {
82 UserProfileData profile = m_userManager.GetUserProfile(firstname, lastname);
83 if (profile != null)
84 {
85 return profile;
86 }
87
88 if (!m_authUsers)
89 {
90 //no current user account so make one
91 m_log.Info("[LOGIN]: No user account found so creating a new one.");
92
93 m_userManager.AddUser(firstname, lastname, "test", "", m_defaultHomeX, m_defaultHomeY);
94
95 return m_userManager.GetUserProfile(firstname, lastname);
96 }
97
98 return null;
99 }
100
101 public override bool AuthenticateUser(UserProfileData profile, string password)
102 {
103 if (!m_authUsers)
104 {
105 //for now we will accept any password in sandbox mode
106 m_log.Info("[LOGIN]: Authorising user (no actual password check)");
107
108 return true;
109 }
110 else
111 {
112 m_log.Info(
113 "[LOGIN]: Authenticating " + profile.FirstName + " " + profile.SurName);
114
115 if (!password.StartsWith("$1$"))
116 password = "$1$" + Util.Md5Hash(password);
117
118 password = password.Remove(0, 3); //remove $1$
119
120 string s = Util.Md5Hash(password + ":" + profile.PasswordSalt);
121
122 bool loginresult = (profile.PasswordHash.Equals(s.ToString(), StringComparison.InvariantCultureIgnoreCase)
123 || profile.PasswordHash.Equals(password, StringComparison.InvariantCulture));
124 return loginresult;
125 }
126 }
127
128 protected override RegionInfo RequestClosestRegion(string region)
129 {
130 return m_regionsConnector.RequestClosestRegion(region);
131 }
132
133 protected override RegionInfo GetRegionInfo(ulong homeRegionHandle)
134 {
135 return m_regionsConnector.RequestNeighbourInfo(homeRegionHandle);
136 }
137
138 protected override RegionInfo GetRegionInfo(UUID homeRegionId)
139 {
140 return m_regionsConnector.RequestNeighbourInfo(homeRegionId);
141 }
142
143 protected override bool PrepareLoginToRegion(
144 RegionInfo regionInfo, UserProfileData user, LoginResponse response, IPEndPoint remoteClient)
145 {
146 IPEndPoint endPoint = regionInfo.ExternalEndPoint;
147 response.SimAddress = endPoint.Address.ToString();
148 response.SimPort = (uint)endPoint.Port;
149 response.RegionX = regionInfo.RegionLocX;
150 response.RegionY = regionInfo.RegionLocY;
151
152 string capsPath = CapsUtil.GetRandomCapsObjectPath();
153 string capsSeedPath = CapsUtil.GetCapsSeedPath(capsPath);
154
155 // Don't use the following! It Fails for logging into any region not on the same port as the http server!
156 // Kept here so it doesn't happen again!
157 // response.SeedCapability = regionInfo.ServerURI + capsSeedPath;
158
159 string seedcap = "http://";
160
161 if (m_serversInfo.HttpUsesSSL)
162 {
163 // For NAT
164 string host = NetworkUtil.GetHostFor(remoteClient.Address, m_serversInfo.HttpSSLCN);
165
166 seedcap = "https://" + host + ":" + m_serversInfo.httpSSLPort + capsSeedPath;
167 }
168 else
169 {
170 // For NAT
171 string host = NetworkUtil.GetHostFor(remoteClient.Address, regionInfo.ExternalHostName);
172
173 seedcap = "http://" + host + ":" + m_serversInfo.HttpListenerPort + capsSeedPath;
174 }
175
176 response.SeedCapability = seedcap;
177
178 // Notify the target of an incoming user
179 m_log.InfoFormat(
180 "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection",
181 regionInfo.RegionName, response.RegionX, response.RegionY, regionInfo.ServerURI);
182
183 // Update agent with target sim
184 user.CurrentAgent.Region = regionInfo.RegionID;
185 user.CurrentAgent.Handle = regionInfo.RegionHandle;
186
187 AgentCircuitData agent = new AgentCircuitData();
188 agent.AgentID = user.ID;
189 agent.firstname = user.FirstName;
190 agent.lastname = user.SurName;
191 agent.SessionID = user.CurrentAgent.SessionID;
192 agent.SecureSessionID = user.CurrentAgent.SecureSessionID;
193 agent.circuitcode = Convert.ToUInt32(response.CircuitCode);
194 agent.BaseFolder = UUID.Zero;
195 agent.InventoryFolder = UUID.Zero;
196 agent.startpos = user.CurrentAgent.Position;
197 agent.CapsPath = capsPath;
198 agent.Appearance = m_userManager.GetUserAppearance(user.ID);
199 if (agent.Appearance == null)
200 {
201 m_log.WarnFormat(
202 "[INTER]: Appearance not found for {0} {1}. Creating default.", agent.firstname, agent.lastname);
203 agent.Appearance = new AvatarAppearance(agent.AgentID);
204 }
205
206 if (m_regionsConnector.RegionLoginsEnabled)
207 {
208 string reason;
209 bool success = m_regionsConnector.NewUserConnection(regionInfo.RegionHandle, agent, out reason);
210 if (!success)
211 {
212 response.ErrorReason = "key";
213 response.ErrorMessage = reason;
214 }
215 return success;
216 // return m_regionsConnector.NewUserConnection(regionInfo.RegionHandle, agent, out reason);
217 }
218
219 return false;
220 }
221
222 public override void LogOffUser(UserProfileData theUser, string message)
223 {
224 RegionInfo SimInfo;
225 try
226 {
227 SimInfo = this.m_regionsConnector.RequestNeighbourInfo(theUser.CurrentAgent.Handle);
228
229 if (SimInfo == null)
230 {
231 m_log.Error("[LOCAL LOGIN]: Region user was in isn't currently logged in");
232 return;
233 }
234 }
235 catch (Exception)
236 {
237 m_log.Error("[LOCAL LOGIN]: Unable to look up region to log user off");
238 return;
239 }
240
241 m_regionsConnector.LogOffUserFromGrid(
242 SimInfo.RegionHandle, theUser.ID, theUser.CurrentAgent.SecureSessionID, "Logging you off");
243 }
244 }
245}
diff --git a/OpenSim/Client/Linden/Resources/LindenModules.addin.xml b/OpenSim/Client/Linden/Resources/LindenModules.addin.xml
index a07a00f..af41e98 100644
--- a/OpenSim/Client/Linden/Resources/LindenModules.addin.xml
+++ b/OpenSim/Client/Linden/Resources/LindenModules.addin.xml
@@ -8,10 +8,6 @@
8 </Dependencies> 8 </Dependencies>
9 9
10 <Extension path = "/OpenSim/RegionModules"> 10 <Extension path = "/OpenSim/RegionModules">
11 <!--
12 <RegionModule id="LLStandaloneLoginModule" type="OpenSim.Client.Linden.LLStandaloneLoginModule" />
13 <RegionModule id="LLProxyLoginModule" type="OpenSim.Client.Linden.LLProxyLoginModule" />
14 -->
15 <RegionModule id="LLClientStackModule" type="OpenSim.Client.Linden.LLClientStackModule" /> 11 <RegionModule id="LLClientStackModule" type="OpenSim.Client.Linden.LLClientStackModule" />
16 </Extension> 12 </Extension>
17</Addin> 13</Addin>
diff --git a/OpenSim/Framework/Communications/CommunicationsManager.cs b/OpenSim/Framework/Communications/CommunicationsManager.cs
index 4bf9018..52f6202 100644
--- a/OpenSim/Framework/Communications/CommunicationsManager.cs
+++ b/OpenSim/Framework/Communications/CommunicationsManager.cs
@@ -53,13 +53,6 @@ namespace OpenSim.Framework.Communications
53 } 53 }
54 protected IUserService m_userService; 54 protected IUserService m_userService;
55 55
56 public IMessagingService MessageService
57 {
58 get { return m_messageService; }
59 }
60 protected IMessagingService m_messageService;
61
62
63 public UserProfileCacheService UserProfileCacheService 56 public UserProfileCacheService UserProfileCacheService
64 { 57 {
65 get { return m_userProfileCacheService; } 58 get { return m_userProfileCacheService; }
@@ -105,18 +98,6 @@ namespace OpenSim.Framework.Communications
105 } 98 }
106 99
107 100
108 #region Friend Methods
109
110 /// <summary>
111 /// Adds a new friend to the database for XUser
112 /// </summary>
113 /// <param name="friendlistowner">The agent that who's friends list is being added to</param>
114 /// <param name="friend">The agent that being added to the friends list of the friends list owner</param>
115 /// <param name="perms">A uint bit vector for set perms that the friend being added has; 0 = none, 1=This friend can see when they sign on, 2 = map, 4 edit objects </param>
116 public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms)
117 {
118 m_userService.AddNewUserFriend(friendlistowner, friend, perms);
119 }
120 101
121 /// <summary> 102 /// <summary>
122 /// Logs off a user and does the appropriate communications 103 /// Logs off a user and does the appropriate communications
@@ -145,42 +126,6 @@ namespace OpenSim.Framework.Communications
145 m_userService.LogOffUser(userid, regionid, regionhandle, posx, posy, posz); 126 m_userService.LogOffUser(userid, regionid, regionhandle, posx, posy, posz);
146 } 127 }
147 128
148 /// <summary>
149 /// Delete friend on friendlistowner's friendlist.
150 /// </summary>
151 /// <param name="friendlistowner">The agent that who's friends list is being updated</param>
152 /// <param name="friend">The Ex-friend agent</param>
153 public void RemoveUserFriend(UUID friendlistowner, UUID friend)
154 {
155 m_userService.RemoveUserFriend(friendlistowner, friend);
156 }
157
158 /// <summary>
159 /// Update permissions for friend on friendlistowner's friendlist.
160 /// </summary>
161 /// <param name="friendlistowner">The agent that who's friends list is being updated</param>
162 /// <param name="friend">The agent that is getting or loosing permissions</param>
163 /// <param name="perms">A uint bit vector for set perms that the friend being added has; 0 = none, 1=This friend can see when they sign on, 2 = map, 4 edit objects </param>
164 public void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms)
165 {
166 m_userService.UpdateUserFriendPerms(friendlistowner, friend, perms);
167 }
168
169 /// <summary>
170 /// Returns a list of FriendsListItems that describe the friends and permissions in the friend relationship for UUID friendslistowner
171 /// </summary>
172 /// <param name="friendlistowner">The agent that we're retreiving the friends Data.</param>
173 public List<FriendListItem> GetUserFriendList(UUID friendlistowner)
174 {
175 return m_userService.GetUserFriendList(friendlistowner);
176 }
177
178 public Dictionary<UUID, FriendRegionInfo> GetFriendRegionInfos(List<UUID> uuids)
179 {
180 return m_messageService.GetFriendRegionInfos(uuids);
181 }
182
183 #endregion
184 129
185 #region Packet Handlers 130 #region Packet Handlers
186 131
diff --git a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs
deleted file mode 100644
index 60f0ba8..0000000
--- a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs
+++ /dev/null
@@ -1,461 +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.Text.RegularExpressions;
33using NUnit.Framework;
34using NUnit.Framework.SyntaxHelpers;
35using Nwc.XmlRpc;
36using OpenSim.Framework.Communications.Cache;
37using OpenSim.Framework.Communications.Services;
38using OpenSim.Region.Communications.Local;
39using OpenSim.Tests.Common.Setup;
40using OpenSim.Tests.Common.Mock;
41using OpenSim.Client.Linden;
42using OpenSim.Tests.Common;
43using OpenSim.Services.Interfaces;
44using OpenMetaverse;
45
46namespace OpenSim.Framework.Communications.Tests
47{
48 /// <summary>
49 /// Test the login service. For now, most of this will be done through the LocalLoginService as LoginService
50 /// is abstract
51 /// </summary>
52
53 [TestFixture]
54 public class LoginServiceTests
55 {
56 private string m_firstName = "Adam";
57 private string m_lastName = "West";
58 private string m_regionExternalName = "localhost";
59
60 private IPEndPoint m_capsEndPoint;
61 private TestCommunicationsManager m_commsManager;
62 private TestLoginToRegionConnector m_regionConnector;
63 private LocalUserServices m_localUserServices;
64 private LoginService m_loginService;
65 private UserProfileData m_userProfileData;
66 private TestScene m_testScene;
67
68 [SetUp]
69 public void SetUpLoginEnviroment()
70 {
71 m_capsEndPoint = new IPEndPoint(IPAddress.Loopback, 9123);
72 m_commsManager = new TestCommunicationsManager(new NetworkServersInfo(42, 43));
73 m_regionConnector = new TestLoginToRegionConnector();
74 m_testScene = SceneSetupHelpers.SetupScene(m_commsManager, "");
75
76 m_regionConnector.AddRegion(new RegionInfo(42, 43, m_capsEndPoint, m_regionExternalName));
77
78 //IInventoryService m_inventoryService = new MockInventoryService();
79
80 m_localUserServices = (LocalUserServices) m_commsManager.UserService;
81 m_localUserServices.AddUser(m_firstName,m_lastName,"boingboing","abc@ftw.com",42,43);
82
83 m_loginService = new LLStandaloneLoginService((UserManagerBase) m_localUserServices, "Hello folks", m_testScene.InventoryService,
84 m_commsManager.NetworkServersInfo, true, new LibraryRootFolder(String.Empty), m_regionConnector);
85
86 m_userProfileData = m_localUserServices.GetUserProfile(m_firstName, m_lastName);
87 }
88
89 /// <summary>
90 /// Test the normal response to a login. Does not test authentication.
91 /// </summary>
92 [Test]
93 public void T010_TestUnauthenticatedLogin()
94 {
95 TestHelper.InMethod();
96 // We want to use our own LoginService for this test, one that
97 // doesn't require authentication.
98 new LLStandaloneLoginService(
99 (UserManagerBase)m_commsManager.UserService, "Hello folks", new MockInventoryService(),
100 m_commsManager.NetworkServersInfo, false, new LibraryRootFolder(String.Empty), m_regionConnector);
101
102 Hashtable loginParams = new Hashtable();
103 loginParams["first"] = m_firstName;
104 loginParams["last"] = m_lastName;
105 loginParams["passwd"] = "boingboing";
106
107 ArrayList sendParams = new ArrayList();
108 sendParams.Add(loginParams);
109 sendParams.Add(m_capsEndPoint); // is this parameter correct?
110 sendParams.Add(new Uri("http://localhost:8002/")); // is this parameter correct?
111
112 XmlRpcRequest request = new XmlRpcRequest("login_to_simulator", sendParams);
113
114 IPAddress tmpLocal = Util.GetLocalHost();
115 IPEndPoint tmpEnd = new IPEndPoint(tmpLocal, 80);
116 XmlRpcResponse response = m_loginService.XmlRpcLoginMethod(request, tmpEnd);
117
118 Hashtable responseData = (Hashtable)response.Value;
119
120 Assert.That(responseData["first_name"], Is.EqualTo(m_firstName));
121 Assert.That(responseData["last_name"], Is.EqualTo(m_lastName));
122 Assert.That(
123 responseData["circuit_code"], Is.GreaterThanOrEqualTo(0) & Is.LessThanOrEqualTo(Int32.MaxValue));
124
125 Regex capsSeedPattern
126 = new Regex("^http://"
127 + NetworkUtil.GetHostFor(tmpLocal, m_regionExternalName)
128 + ":9000/CAPS/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}0000/$");
129
130 Assert.That(capsSeedPattern.IsMatch((string)responseData["seed_capability"]), Is.True);
131 }
132
133 [Test]
134 public void T011_TestAuthenticatedLoginSuccess()
135 {
136 TestHelper.InMethod();
137 // TODO: Not check inventory part of response yet.
138 // TODO: Not checking all of login response thoroughly yet.
139
140 // 1) Test for positive authentication
141
142 Hashtable loginParams = new Hashtable();
143 loginParams["first"] = m_firstName;
144 loginParams["last"] = m_lastName;
145 loginParams["passwd"] = "boingboing";
146
147 ArrayList sendParams = new ArrayList();
148 sendParams.Add(loginParams);
149 sendParams.Add(m_capsEndPoint); // is this parameter correct?
150 sendParams.Add(new Uri("http://localhost:8002/")); // is this parameter correct?
151
152 XmlRpcRequest request = new XmlRpcRequest("login_to_simulator", sendParams);
153
154 IPAddress tmpLocal = Util.GetLocalHost();
155 IPEndPoint tmpEnd = new IPEndPoint(tmpLocal, 80);
156 XmlRpcResponse response = m_loginService.XmlRpcLoginMethod(request, tmpEnd);
157
158 Hashtable responseData = (Hashtable)response.Value;
159
160 UserAgentData uagent = m_userProfileData.CurrentAgent;
161 Assert.That(uagent,Is.Not.Null);
162
163 Assert.That(responseData["first_name"], Is.Not.Null);
164 Assert.That(responseData["first_name"], Is.EqualTo(m_firstName));
165 Assert.That(responseData["last_name"], Is.EqualTo(m_lastName));
166 Assert.That(responseData["agent_id"], Is.EqualTo(uagent.ProfileID.ToString()));
167 Assert.That(responseData["session_id"], Is.EqualTo(uagent.SessionID.ToString()));
168 Assert.That(responseData["secure_session_id"], Is.EqualTo(uagent.SecureSessionID.ToString()));
169 ArrayList invlibroot = (ArrayList) responseData["inventory-lib-root"];
170 Hashtable invlibroothash = (Hashtable) invlibroot[0];
171 Assert.That(invlibroothash["folder_id"],Is.EqualTo("00000112-000f-0000-0000-000100bba000"));
172 Assert.That(
173 responseData["circuit_code"], Is.GreaterThanOrEqualTo(0) & Is.LessThanOrEqualTo(Int32.MaxValue));
174 Assert.That(responseData["message"], Is.EqualTo("Hello folks"));
175 Assert.That(responseData["buddy-list"], Is.Empty);
176 Assert.That(responseData["start_location"], Is.EqualTo("last"));
177
178 Regex capsSeedPattern
179 = new Regex("^http://"
180 + NetworkUtil.GetHostFor(tmpLocal, m_regionExternalName)
181 + ":9000/CAPS/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}0000/$");
182
183 Assert.That(capsSeedPattern.IsMatch((string)responseData["seed_capability"]), Is.True);
184 }
185
186 [Test]
187 public void T012_TestAuthenticatedLoginForBuddies()
188 {
189 TestHelper.InMethod();
190 // 1.1) Test for budddies!
191 m_localUserServices.AddUser("Friend","Number1","boingboing","abc@ftw.com",42,43);
192 m_localUserServices.AddUser("Friend","Number2","boingboing","abc@ftw.com",42,43);
193
194 UserProfileData friend1 = m_localUserServices.GetUserProfile("Friend","Number1");
195 UserProfileData friend2 = m_localUserServices.GetUserProfile("Friend","Number2");
196 m_localUserServices.AddNewUserFriend(friend1.ID,m_userProfileData.ID,1);
197 m_localUserServices.AddNewUserFriend(friend1.ID,friend2.ID,2);
198
199 Hashtable loginParams = new Hashtable();
200 loginParams["first"] = "Friend";
201 loginParams["last"] = "Number1";
202 loginParams["passwd"] = "boingboing";
203
204 ArrayList sendParams = new ArrayList();
205 sendParams.Add(loginParams);
206 sendParams.Add(m_capsEndPoint); // is this parameter correct?
207 sendParams.Add(new Uri("http://localhost:8002/")); // is this parameter correct?
208
209 XmlRpcRequest request = new XmlRpcRequest("login_to_simulator", sendParams);
210
211 IPAddress tmpLocal = Util.GetLocalHost();
212 IPEndPoint tmpEnd = new IPEndPoint(tmpLocal, 80);
213 XmlRpcResponse response = m_loginService.XmlRpcLoginMethod(request, tmpEnd);
214
215 Hashtable responseData = (Hashtable)response.Value;
216
217 ArrayList friendslist = (ArrayList) responseData["buddy-list"];
218
219 Assert.That(friendslist,Is.Not.Null);
220
221 Hashtable buddy1 = (Hashtable) friendslist[0];
222 Hashtable buddy2 = (Hashtable) friendslist[1];
223 Assert.That(friendslist.Count, Is.EqualTo(2));
224 Assert.That(m_userProfileData.ID.ToString(), Is.EqualTo(buddy1["buddy_id"]) | Is.EqualTo(buddy2["buddy_id"]));
225 Assert.That(friend2.ID.ToString(), Is.EqualTo(buddy1["buddy_id"]) | Is.EqualTo(buddy2["buddy_id"]));
226 }
227
228 [Test]
229 public void T020_TestAuthenticatedLoginBadUsername()
230 {
231 TestHelper.InMethod();
232
233 // 2) Test for negative authentication
234 //
235 string error_auth_message = "Could not authenticate your avatar. Please check your username and password, and check the grid if problems persist.";
236 //string error_region_unavailable = "The region you are attempting to log into is not responding. Please select another region and try again.";
237 // 2.1) Test for wrong user name
238 Hashtable loginParams = new Hashtable();
239 loginParams["first"] = m_lastName;
240 loginParams["last"] = m_firstName;
241 loginParams["passwd"] = "boingboing";
242
243 ArrayList sendParams = new ArrayList();
244 sendParams.Add(loginParams);
245 sendParams.Add(m_capsEndPoint); // is this parameter correct?
246 sendParams.Add(new Uri("http://localhost:8002/")); // is this parameter correct?
247
248 XmlRpcRequest request = new XmlRpcRequest("login_to_simulator", sendParams);
249
250 IPAddress tmpLocal = Util.GetLocalHost();
251 IPEndPoint tmpEnd = new IPEndPoint(tmpLocal, 80);
252 XmlRpcResponse response = m_loginService.XmlRpcLoginMethod(request, tmpEnd);
253
254 Hashtable responseData = (Hashtable)response.Value;
255 Assert.That(responseData["message"], Is.EqualTo(error_auth_message));
256
257 }
258
259 [Test]
260 public void T021_TestAuthenticatedLoginBadPassword()
261 {
262 TestHelper.InMethod();
263
264 string error_auth_message = "Could not authenticate your avatar. Please check your username and password, and check the grid if problems persist.";
265 // 2.2) Test for wrong password
266 Hashtable loginParams = new Hashtable();
267 loginParams["first"] = "Friend";
268 loginParams["last"] = "Number2";
269 loginParams["passwd"] = "boing";
270
271 ArrayList sendParams = new ArrayList();
272 sendParams.Add(loginParams);
273 sendParams.Add(m_capsEndPoint); // is this parameter correct?
274 sendParams.Add(new Uri("http://localhost:8002/")); // is this parameter correct?
275
276 XmlRpcRequest request = new XmlRpcRequest("login_to_simulator", sendParams);
277
278 IPAddress tmpLocal = Util.GetLocalHost();
279 IPEndPoint tmpEnd = new IPEndPoint(tmpLocal, 80);
280 XmlRpcResponse response = m_loginService.XmlRpcLoginMethod(request, tmpEnd);
281
282 Hashtable responseData = (Hashtable)response.Value;
283 Assert.That(responseData["message"], Is.EqualTo(error_auth_message));
284
285 }
286
287 [Test]
288 public void T022_TestAuthenticatedLoginBadXml()
289 {
290 TestHelper.InMethod();
291
292 string error_xml_message = "Error connecting to grid. Could not percieve credentials from login XML.";
293 // 2.3) Bad XML
294 Hashtable loginParams = new Hashtable();
295 loginParams["first"] = "Friend";
296 loginParams["banana"] = "Banana";
297 loginParams["passwd"] = "boingboing";
298
299 ArrayList sendParams = new ArrayList();
300 sendParams.Add(loginParams);
301 sendParams.Add(m_capsEndPoint); // is this parameter correct?
302 sendParams.Add(new Uri("http://localhost:8002/")); // is this parameter correct?
303
304 XmlRpcRequest request = new XmlRpcRequest("login_to_simulator", sendParams);
305
306 IPAddress tmpLocal = Util.GetLocalHost();
307 IPEndPoint tmpEnd = new IPEndPoint(tmpLocal, 80);
308 XmlRpcResponse response = m_loginService.XmlRpcLoginMethod(request, tmpEnd);
309
310 Hashtable responseData = (Hashtable)response.Value;
311 Assert.That(responseData["message"], Is.EqualTo(error_xml_message));
312
313 }
314
315 // [Test]
316 // Commenting out test now that LLStandAloneLoginService no longer replies with message in this case.
317 // Kept the code for future test with grid mode, which will keep this behavior.
318 public void T023_TestAuthenticatedLoginAlreadyLoggedIn()
319 {
320 TestHelper.InMethod();
321
322 //Console.WriteLine("Starting T023_TestAuthenticatedLoginAlreadyLoggedIn()");
323 //log4net.Config.XmlConfigurator.Configure();
324
325 string error_already_logged = "You appear to be already logged in. " +
326 "If this is not the case please wait for your session to timeout. " +
327 "If this takes longer than a few minutes please contact the grid owner. " +
328 "Please wait 5 minutes if you are going to connect to a region nearby to the region you were at previously.";
329 // 2.4) Already logged in and sucessfull post login
330 Hashtable loginParams = new Hashtable();
331 loginParams["first"] = "Adam";
332 loginParams["last"] = "West";
333 loginParams["passwd"] = "boingboing";
334
335 ArrayList sendParams = new ArrayList();
336 sendParams.Add(loginParams);
337 sendParams.Add(m_capsEndPoint); // is this parameter correct?
338 sendParams.Add(new Uri("http://localhost:8002/")); // is this parameter correct?
339
340 // First we log in.
341 XmlRpcRequest request = new XmlRpcRequest("login_to_simulator", sendParams);
342
343 IPAddress tmpLocal = Util.GetLocalHost();
344 IPEndPoint tmpEnd = new IPEndPoint(tmpLocal, 80);
345 XmlRpcResponse response = m_loginService.XmlRpcLoginMethod(request, tmpEnd);
346
347 Hashtable responseData = (Hashtable)response.Value;
348 Assert.That(responseData["message"], Is.EqualTo("Hello folks"));
349
350 // Then we try again, this time expecting failure.
351 request = new XmlRpcRequest("login_to_simulator", sendParams);
352 response = m_loginService.XmlRpcLoginMethod(request, tmpEnd);
353 responseData = (Hashtable)response.Value;
354 Assert.That(responseData["message"], Is.EqualTo(error_already_logged));
355
356 // Finally the third time we should be able to get right back in.
357 request = new XmlRpcRequest("login_to_simulator", sendParams);
358
359 response = m_loginService.XmlRpcLoginMethod(request, tmpEnd);
360 responseData = (Hashtable)response.Value;
361 Assert.That(responseData["message"], Is.EqualTo("Hello folks"));
362
363 //Console.WriteLine("Finished T023_TestAuthenticatedLoginAlreadyLoggedIn()");
364 }
365
366 [TearDown]
367 public void TearDown()
368 {
369 try
370 {
371 if (MainServer.Instance != null) MainServer.Instance.Stop();
372 } catch (NullReferenceException)
373 {}
374 }
375
376 public class TestLoginToRegionConnector : ILoginServiceToRegionsConnector
377 {
378 private List<RegionInfo> m_regionsList = new List<RegionInfo>();
379
380 public void AddRegion(RegionInfo regionInfo)
381 {
382 lock (m_regionsList)
383 {
384 if (!m_regionsList.Contains(regionInfo))
385 {
386 m_regionsList.Add(regionInfo);
387 }
388 }
389 }
390
391 #region ILoginRegionsConnector Members
392 public bool RegionLoginsEnabled
393 {
394 get { return true; }
395 }
396
397 public void LogOffUserFromGrid(ulong regionHandle, OpenMetaverse.UUID AvatarID, OpenMetaverse.UUID RegionSecret, string message)
398 {
399 }
400
401 public bool NewUserConnection(ulong regionHandle, AgentCircuitData agent, out string reason)
402 {
403 reason = String.Empty;
404 lock (m_regionsList)
405 {
406 foreach (RegionInfo regInfo in m_regionsList)
407 {
408 if (regInfo.RegionHandle == regionHandle)
409 return true;
410 }
411 }
412 reason = "Region not found";
413 return false;
414 }
415
416 public RegionInfo RequestClosestRegion(string region)
417 {
418 lock (m_regionsList)
419 {
420 foreach (RegionInfo regInfo in m_regionsList)
421 {
422 if (regInfo.RegionName == region)
423 return regInfo;
424 }
425 }
426
427 return null;
428 }
429
430 public RegionInfo RequestNeighbourInfo(OpenMetaverse.UUID regionID)
431 {
432 lock (m_regionsList)
433 {
434 foreach (RegionInfo regInfo in m_regionsList)
435 {
436 if (regInfo.RegionID == regionID)
437 return regInfo;
438 }
439 }
440
441 return null;
442 }
443
444 public RegionInfo RequestNeighbourInfo(ulong regionHandle)
445 {
446 lock (m_regionsList)
447 {
448 foreach (RegionInfo regInfo in m_regionsList)
449 {
450 if (regInfo.RegionHandle == regionHandle)
451 return regInfo;
452 }
453 }
454
455 return null;
456 }
457
458 #endregion
459 }
460 }
461} \ No newline at end of file
diff --git a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs
index e80f6ab..3486c8b 100644
--- a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs
+++ b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs
@@ -53,7 +53,6 @@ namespace OpenSim.Region.Communications.Hypergrid
53 userServices.AddPlugin(new HGUserDataPlugin(this, userServices)); 53 userServices.AddPlugin(new HGUserDataPlugin(this, userServices));
54 54
55 m_userService = userServices; 55 m_userService = userServices;
56 m_messageService = userServices;
57 m_avatarService = userServices; 56 m_avatarService = userServices;
58 } 57 }
59 } 58 }
diff --git a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs
index 4e3f5a1..d979a01 100644
--- a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs
+++ b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs
@@ -60,9 +60,7 @@ namespace OpenSim.Region.Communications.Hypergrid
60 60
61 m_userService = hgUserService; 61 m_userService = hgUserService;
62 m_userAdminService = hgUserService; 62 m_userAdminService = hgUserService;
63 m_avatarService = hgUserService; 63 m_avatarService = hgUserService;
64 m_messageService = hgUserService;
65
66 } 64 }
67 } 65 }
68} 66}
diff --git a/OpenSim/Region/Communications/Local/CommunicationsLocal.cs b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs
index eaf996d..4f83fdb 100644
--- a/OpenSim/Region/Communications/Local/CommunicationsLocal.cs
+++ b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs
@@ -51,7 +51,6 @@ namespace OpenSim.Region.Communications.Local
51 m_userService = lus; 51 m_userService = lus;
52 m_userAdminService = lus; 52 m_userAdminService = lus;
53 m_avatarService = lus; 53 m_avatarService = lus;
54 m_messageService = lus;
55 54
56 //LocalLoginService loginService = CreateLoginService(libraryRootFolder, inventoryService, userService, backendService); 55 //LocalLoginService loginService = CreateLoginService(libraryRootFolder, inventoryService, userService, backendService);
57 } 56 }
diff --git a/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs b/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs
index 94e4ed2..111b7c0 100644
--- a/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs
+++ b/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs
@@ -46,7 +46,6 @@ namespace OpenSim.Region.Communications.OGS1
46 userServices.AddPlugin(new OGS1UserDataPlugin(this)); 46 userServices.AddPlugin(new OGS1UserDataPlugin(this));
47 47
48 m_userService = userServices; 48 m_userService = userServices;
49 m_messageService = userServices;
50 m_avatarService = (IAvatarService)m_userService; 49 m_avatarService = (IAvatarService)m_userService;
51 } 50 }
52 51
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index e22dd2d..ef62b79 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3979,35 +3979,6 @@ namespace OpenSim.Region.Framework.Scenes
3979 objectCapacity = objects; 3979 objectCapacity = objects;
3980 } 3980 }
3981 3981
3982 public List<FriendListItem> GetFriendList(string id)
3983 {
3984 UUID avatarID;
3985 if (!UUID.TryParse(id, out avatarID))
3986 return new List<FriendListItem>();
3987
3988 return CommsManager.GetUserFriendList(avatarID);
3989 }
3990
3991 public Dictionary<UUID, FriendRegionInfo> GetFriendRegionInfos(List<UUID> uuids)
3992 {
3993 return CommsManager.GetFriendRegionInfos(uuids);
3994 }
3995
3996 public virtual void StoreAddFriendship(UUID ownerID, UUID friendID, uint perms)
3997 {
3998 m_sceneGridService.AddNewUserFriend(ownerID, friendID, perms);
3999 }
4000
4001 public virtual void StoreUpdateFriendship(UUID ownerID, UUID friendID, uint perms)
4002 {
4003 m_sceneGridService.UpdateUserFriendPerms(ownerID, friendID, perms);
4004 }
4005
4006 public virtual void StoreRemoveFriendship(UUID ownerID, UUID ExfriendID)
4007 {
4008 m_sceneGridService.RemoveUserFriend(ownerID, ExfriendID);
4009 }
4010
4011 #endregion 3982 #endregion
4012 3983
4013 public void HandleObjectPermissionsUpdate(IClientAPI controller, UUID agentID, UUID sessionID, byte field, uint localId, uint mask, byte set) 3984 public void HandleObjectPermissionsUpdate(IClientAPI controller, UUID agentID, UUID sessionID, byte field, uint localId, uint mask, byte set)
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 53693e4..8b14f61 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -1455,25 +1455,6 @@ namespace OpenSim.Region.Framework.Scenes
1455 m_commsProvider.LogOffUser(userid, regionid, regionhandle, posx, posy, posz); 1455 m_commsProvider.LogOffUser(userid, regionid, regionhandle, posx, posy, posz);
1456 } 1456 }
1457 1457
1458 public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms)
1459 {
1460 m_commsProvider.AddNewUserFriend(friendlistowner, friend, perms);
1461 }
1462
1463 public void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms)
1464 {
1465 m_commsProvider.UpdateUserFriendPerms(friendlistowner, friend, perms);
1466 }
1467
1468 public void RemoveUserFriend(UUID friendlistowner, UUID friend)
1469 {
1470 m_commsProvider.RemoveUserFriend(friendlistowner, friend);
1471 }
1472
1473 public List<FriendListItem> GetUserFriendList(UUID friendlistowner)
1474 {
1475 return m_commsProvider.GetUserFriendList(friendlistowner);
1476 }
1477 1458
1478 public List<AvatarPickerAvatar> GenerateAgentPickerRequestResponse(UUID queryID, string query) 1459 public List<AvatarPickerAvatar> GenerateAgentPickerRequestResponse(UUID queryID, string query)
1479 { 1460 {