diff options
author | Diva Canto | 2010-01-10 20:29:09 -0800 |
---|---|---|
committer | Diva Canto | 2010-01-10 20:29:09 -0800 |
commit | dc4bbf6065ad4cb914c9d44f2e6496a2e3d99814 (patch) | |
tree | f4cf3aa9f25ca879b87e14941ca4c19197e7c942 /OpenSim/Framework/Communications/Services/HGLoginAuthService.cs | |
parent | All grid servers deleted, including user server. They served us well. (diff) | |
download | opensim-SC_OLD-dc4bbf6065ad4cb914c9d44f2e6496a2e3d99814.zip opensim-SC_OLD-dc4bbf6065ad4cb914c9d44f2e6496a2e3d99814.tar.gz opensim-SC_OLD-dc4bbf6065ad4cb914c9d44f2e6496a2e3d99814.tar.bz2 opensim-SC_OLD-dc4bbf6065ad4cb914c9d44f2e6496a2e3d99814.tar.xz |
All Framework.Communications.Clients and Framework.Communications.Services deleted, including old LoginService.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Framework/Communications/Services/HGLoginAuthService.cs | 339 |
1 files changed, 0 insertions, 339 deletions
diff --git a/OpenSim/Framework/Communications/Services/HGLoginAuthService.cs b/OpenSim/Framework/Communications/Services/HGLoginAuthService.cs deleted file mode 100644 index d3f813e..0000000 --- a/OpenSim/Framework/Communications/Services/HGLoginAuthService.cs +++ /dev/null | |||
@@ -1,339 +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 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using System.Text.RegularExpressions; | ||
34 | using OpenSim.Framework; | ||
35 | using OpenSim.Framework.Communications.Cache; | ||
36 | using OpenSim.Framework.Capabilities; | ||
37 | using OpenSim.Framework.Servers; | ||
38 | |||
39 | using OpenMetaverse; | ||
40 | |||
41 | using log4net; | ||
42 | using Nini.Config; | ||
43 | using Nwc.XmlRpc; | ||
44 | |||
45 | namespace OpenSim.Framework.Communications.Services | ||
46 | { | ||
47 | public class HGLoginAuthService : LoginService | ||
48 | { | ||
49 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
50 | |||
51 | protected NetworkServersInfo m_serversInfo; | ||
52 | protected bool m_authUsers = false; | ||
53 | |||
54 | /// <summary> | ||
55 | /// Used by the login service to make requests to the inventory service. | ||
56 | /// </summary> | ||
57 | protected IInterServiceInventoryServices m_interServiceInventoryService; | ||
58 | |||
59 | /// <summary> | ||
60 | /// Used to make requests to the local regions. | ||
61 | /// </summary> | ||
62 | protected ILoginServiceToRegionsConnector m_regionsConnector; | ||
63 | |||
64 | public HGLoginAuthService( | ||
65 | UserManagerBase userManager, string welcomeMess, | ||
66 | IInterServiceInventoryServices interServiceInventoryService, | ||
67 | NetworkServersInfo serversInfo, | ||
68 | bool authenticate, LibraryRootFolder libraryRootFolder, ILoginServiceToRegionsConnector regionsConnector) | ||
69 | : base(userManager, libraryRootFolder, welcomeMess) | ||
70 | { | ||
71 | this.m_serversInfo = serversInfo; | ||
72 | if (m_serversInfo != null) | ||
73 | { | ||
74 | m_defaultHomeX = this.m_serversInfo.DefaultHomeLocX; | ||
75 | m_defaultHomeY = this.m_serversInfo.DefaultHomeLocY; | ||
76 | } | ||
77 | m_authUsers = authenticate; | ||
78 | |||
79 | m_interServiceInventoryService = interServiceInventoryService; | ||
80 | m_regionsConnector = regionsConnector; | ||
81 | m_interInventoryService = interServiceInventoryService; | ||
82 | } | ||
83 | |||
84 | public void SetServersInfo(NetworkServersInfo sinfo) | ||
85 | { | ||
86 | m_serversInfo = sinfo; | ||
87 | } | ||
88 | |||
89 | public override XmlRpcResponse XmlRpcLoginMethod(XmlRpcRequest request, IPEndPoint remoteClient) | ||
90 | { | ||
91 | m_log.Info("[HGLOGIN]: HGLogin called " + request.MethodName); | ||
92 | XmlRpcResponse response = base.XmlRpcLoginMethod(request, remoteClient); | ||
93 | Hashtable responseData = (Hashtable)response.Value; | ||
94 | |||
95 | responseData["grid_service"] = m_serversInfo.GridURL; | ||
96 | responseData["grid_service_send_key"] = m_serversInfo.GridSendKey; | ||
97 | responseData["inventory_service"] = m_serversInfo.InventoryURL; | ||
98 | responseData["asset_service"] = m_serversInfo.AssetURL; | ||
99 | responseData["asset_service_send_key"] = m_serversInfo.AssetSendKey; | ||
100 | int x = (Int32)responseData["region_x"]; | ||
101 | int y = (Int32)responseData["region_y"]; | ||
102 | uint ux = (uint)(x / Constants.RegionSize); | ||
103 | uint uy = (uint)(y / Constants.RegionSize); | ||
104 | ulong regionHandle = Util.UIntsToLong(ux, uy); | ||
105 | responseData["region_handle"] = regionHandle.ToString(); | ||
106 | |||
107 | // Let's remove the seed cap from the login | ||
108 | //responseData.Remove("seed_capability"); | ||
109 | |||
110 | // Let's add the appearance | ||
111 | UUID userID = UUID.Zero; | ||
112 | UUID.TryParse((string)responseData["agent_id"], out userID); | ||
113 | AvatarAppearance appearance = m_userManager.GetUserAppearance(userID); | ||
114 | if (appearance == null) | ||
115 | { | ||
116 | m_log.WarnFormat("[INTER]: Appearance not found for {0}. Creating default.", userID); | ||
117 | appearance = new AvatarAppearance(); | ||
118 | } | ||
119 | |||
120 | responseData["appearance"] = appearance.ToHashTable(); | ||
121 | |||
122 | // Let's also send the auth token | ||
123 | UUID token = UUID.Random(); | ||
124 | responseData["auth_token"] = token.ToString(); | ||
125 | UserProfileData userProfile = m_userManager.GetUserProfile(userID); | ||
126 | if (userProfile != null) | ||
127 | { | ||
128 | userProfile.WebLoginKey = token; | ||
129 | m_userManager.CommitAgent(ref userProfile); | ||
130 | } | ||
131 | m_log.Warn("[HGLOGIN]: Auth token: " + token); | ||
132 | |||
133 | |||
134 | return response; | ||
135 | } | ||
136 | |||
137 | public XmlRpcResponse XmlRpcGenerateKeyMethod(XmlRpcRequest request, IPEndPoint remoteClient) | ||
138 | { | ||
139 | // Verify the key of who's calling | ||
140 | UUID userID = UUID.Zero; | ||
141 | UUID authKey = UUID.Zero; | ||
142 | UUID.TryParse((string)request.Params[0], out userID); | ||
143 | UUID.TryParse((string)request.Params[1], out authKey); | ||
144 | |||
145 | m_log.InfoFormat("[HGLOGIN] HGGenerateKey called with authToken ", authKey); | ||
146 | string newKey = string.Empty; | ||
147 | |||
148 | if (!(m_userManager is IAuthentication)) | ||
149 | { | ||
150 | m_log.Debug("[HGLOGIN]: UserManager is not IAuthentication service. Returning empty key."); | ||
151 | } | ||
152 | else | ||
153 | { | ||
154 | newKey = ((IAuthentication)m_userManager).GetNewKey(m_serversInfo.UserURL, userID, authKey); | ||
155 | } | ||
156 | |||
157 | XmlRpcResponse response = new XmlRpcResponse(); | ||
158 | response.Value = (string) newKey; | ||
159 | return response; | ||
160 | } | ||
161 | |||
162 | public XmlRpcResponse XmlRpcVerifyKeyMethod(XmlRpcRequest request, IPEndPoint remoteClient) | ||
163 | { | ||
164 | bool success = false; | ||
165 | |||
166 | if (request.Params.Count >= 2) | ||
167 | { | ||
168 | // Verify the key of who's calling | ||
169 | UUID userID = UUID.Zero; | ||
170 | string authKey = string.Empty; | ||
171 | if (UUID.TryParse((string)request.Params[0], out userID)) | ||
172 | { | ||
173 | authKey = (string)request.Params[1]; | ||
174 | |||
175 | m_log.InfoFormat("[HGLOGIN] HGVerifyKey called with key {0}", authKey); | ||
176 | |||
177 | if (!(m_userManager is IAuthentication)) | ||
178 | { | ||
179 | m_log.Debug("[HGLOGIN]: UserManager is not IAuthentication service. Denying."); | ||
180 | } | ||
181 | else | ||
182 | { | ||
183 | success = ((IAuthentication)m_userManager).VerifyKey(userID, authKey); | ||
184 | } | ||
185 | } | ||
186 | } | ||
187 | |||
188 | m_log.DebugFormat("[HGLOGIN]: Response to VerifyKey is {0}", success); | ||
189 | XmlRpcResponse response = new XmlRpcResponse(); | ||
190 | response.Value = success; | ||
191 | return response; | ||
192 | } | ||
193 | |||
194 | public override UserProfileData GetTheUser(string firstname, string lastname) | ||
195 | { | ||
196 | UserProfileData profile = m_userManager.GetUserProfile(firstname, lastname); | ||
197 | if (profile != null) | ||
198 | { | ||
199 | return profile; | ||
200 | } | ||
201 | |||
202 | if (!m_authUsers) | ||
203 | { | ||
204 | //no current user account so make one | ||
205 | m_log.Info("[LOGIN]: No user account found so creating a new one."); | ||
206 | |||
207 | m_userManager.AddUser(firstname, lastname, "test", "", m_defaultHomeX, m_defaultHomeY); | ||
208 | |||
209 | return m_userManager.GetUserProfile(firstname, lastname); | ||
210 | } | ||
211 | |||
212 | return null; | ||
213 | } | ||
214 | |||
215 | public override bool AuthenticateUser(UserProfileData profile, string password) | ||
216 | { | ||
217 | if (!m_authUsers) | ||
218 | { | ||
219 | //for now we will accept any password in sandbox mode | ||
220 | m_log.Info("[LOGIN]: Authorising user (no actual password check)"); | ||
221 | |||
222 | return true; | ||
223 | } | ||
224 | else | ||
225 | { | ||
226 | m_log.Info( | ||
227 | "[LOGIN]: Authenticating " + profile.FirstName + " " + profile.SurName); | ||
228 | |||
229 | if (!password.StartsWith("$1$")) | ||
230 | password = "$1$" + Util.Md5Hash(password); | ||
231 | |||
232 | password = password.Remove(0, 3); //remove $1$ | ||
233 | |||
234 | string s = Util.Md5Hash(password + ":" + profile.PasswordSalt); | ||
235 | |||
236 | bool loginresult = (profile.PasswordHash.Equals(s.ToString(), StringComparison.InvariantCultureIgnoreCase) | ||
237 | || profile.PasswordHash.Equals(password, StringComparison.InvariantCulture)); | ||
238 | return loginresult; | ||
239 | } | ||
240 | } | ||
241 | |||
242 | protected override RegionInfo RequestClosestRegion(string region) | ||
243 | { | ||
244 | return m_regionsConnector.RequestClosestRegion(region); | ||
245 | } | ||
246 | |||
247 | protected override RegionInfo GetRegionInfo(ulong homeRegionHandle) | ||
248 | { | ||
249 | return m_regionsConnector.RequestNeighbourInfo(homeRegionHandle); | ||
250 | } | ||
251 | |||
252 | protected override RegionInfo GetRegionInfo(UUID homeRegionId) | ||
253 | { | ||
254 | return m_regionsConnector.RequestNeighbourInfo(homeRegionId); | ||
255 | } | ||
256 | |||
257 | /// <summary> | ||
258 | /// Not really informing the region. Just filling out the response fields related to the region. | ||
259 | /// </summary> | ||
260 | /// <param name="sim"></param> | ||
261 | /// <param name="user"></param> | ||
262 | /// <param name="response"></param> | ||
263 | /// <returns>true if the region was successfully contacted, false otherwise</returns> | ||
264 | protected override bool PrepareLoginToRegion(RegionInfo regionInfo, UserProfileData user, LoginResponse response, IPEndPoint remoteClient) | ||
265 | { | ||
266 | IPEndPoint endPoint = regionInfo.ExternalEndPoint; | ||
267 | response.SimAddress = endPoint.Address.ToString(); | ||
268 | response.SimPort = (uint)endPoint.Port; | ||
269 | response.RegionX = regionInfo.RegionLocX; | ||
270 | response.RegionY = regionInfo.RegionLocY; | ||
271 | response.SimHttpPort = regionInfo.HttpPort; | ||
272 | |||
273 | string capsPath = CapsUtil.GetRandomCapsObjectPath(); | ||
274 | string capsSeedPath = CapsUtil.GetCapsSeedPath(capsPath); | ||
275 | |||
276 | // Don't use the following! It Fails for logging into any region not on the same port as the http server! | ||
277 | // Kept here so it doesn't happen again! | ||
278 | // response.SeedCapability = regionInfo.ServerURI + capsSeedPath; | ||
279 | |||
280 | string seedcap = "http://"; | ||
281 | |||
282 | if (m_serversInfo.HttpUsesSSL) | ||
283 | { | ||
284 | // For NAT | ||
285 | string host = NetworkUtil.GetHostFor(remoteClient.Address, m_serversInfo.HttpSSLCN); | ||
286 | |||
287 | seedcap = "https://" + host + ":" + m_serversInfo.httpSSLPort + capsSeedPath; | ||
288 | } | ||
289 | else | ||
290 | { | ||
291 | // For NAT | ||
292 | string host = NetworkUtil.GetHostFor(remoteClient.Address, regionInfo.ExternalHostName); | ||
293 | |||
294 | seedcap = "http://" + host + ":" + m_serversInfo.HttpListenerPort + capsSeedPath; | ||
295 | } | ||
296 | |||
297 | response.SeedCapability = seedcap; | ||
298 | |||
299 | // Notify the target of an incoming user | ||
300 | m_log.InfoFormat( | ||
301 | "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection", | ||
302 | regionInfo.RegionName, response.RegionX, response.RegionY, regionInfo.ServerURI); | ||
303 | |||
304 | // Update agent with target sim | ||
305 | user.CurrentAgent.Region = regionInfo.RegionID; | ||
306 | user.CurrentAgent.Handle = regionInfo.RegionHandle; | ||
307 | |||
308 | return true; | ||
309 | } | ||
310 | |||
311 | public override void LogOffUser(UserProfileData theUser, string message) | ||
312 | { | ||
313 | RegionInfo SimInfo; | ||
314 | try | ||
315 | { | ||
316 | SimInfo = this.m_regionsConnector.RequestNeighbourInfo(theUser.CurrentAgent.Handle); | ||
317 | |||
318 | if (SimInfo == null) | ||
319 | { | ||
320 | m_log.Error("[LOCAL LOGIN]: Region user was in isn't currently logged in"); | ||
321 | return; | ||
322 | } | ||
323 | } | ||
324 | catch (Exception) | ||
325 | { | ||
326 | m_log.Error("[LOCAL LOGIN]: Unable to look up region to log user off"); | ||
327 | return; | ||
328 | } | ||
329 | |||
330 | m_regionsConnector.LogOffUserFromGrid(SimInfo.RegionHandle, theUser.ID, theUser.CurrentAgent.SecureSessionID, "Logging you off"); | ||
331 | } | ||
332 | |||
333 | protected override bool AllowLoginWithoutInventory() | ||
334 | { | ||
335 | return true; | ||
336 | } | ||
337 | |||
338 | } | ||
339 | } | ||