diff options
-rw-r--r-- | OpenSim/Data/IHGTravelingData.cs | 58 | ||||
-rw-r--r-- | OpenSim/Data/MySQL/MySQLHGTravelData.cs | 70 | ||||
-rw-r--r-- | OpenSim/Data/MySQL/Resources/HGTravelStore.migrations | 17 | ||||
-rw-r--r-- | OpenSim/Services/HypergridService/UserAgentService.cs | 205 | ||||
-rw-r--r-- | OpenSim/Services/HypergridService/UserAgentServiceBase.cs | 84 |
5 files changed, 344 insertions, 90 deletions
diff --git a/OpenSim/Data/IHGTravelingData.cs b/OpenSim/Data/IHGTravelingData.cs new file mode 100644 index 0000000..dd89935 --- /dev/null +++ b/OpenSim/Data/IHGTravelingData.cs | |||
@@ -0,0 +1,58 @@ | |||
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.Generic; | ||
30 | using OpenMetaverse; | ||
31 | using OpenSim.Framework; | ||
32 | |||
33 | namespace OpenSim.Data | ||
34 | { | ||
35 | // This MUST be a ref type! | ||
36 | public class HGTravelingData | ||
37 | { | ||
38 | public UUID SessionID; | ||
39 | public UUID UserID; | ||
40 | public Dictionary<string, string> Data; | ||
41 | |||
42 | public HGTravelingData() | ||
43 | { | ||
44 | Data = new Dictionary<string, string>(); | ||
45 | } | ||
46 | } | ||
47 | |||
48 | /// <summary> | ||
49 | /// An interface for connecting to the user grid datastore | ||
50 | /// </summary> | ||
51 | public interface IHGTravelingData | ||
52 | { | ||
53 | HGTravelingData Get(UUID sessionID); | ||
54 | HGTravelingData[] GetSessions(UUID userID); | ||
55 | bool Store(HGTravelingData data); | ||
56 | bool Delete(UUID sessionID); | ||
57 | } | ||
58 | } \ No newline at end of file | ||
diff --git a/OpenSim/Data/MySQL/MySQLHGTravelData.cs b/OpenSim/Data/MySQL/MySQLHGTravelData.cs new file mode 100644 index 0000000..1efbfc3 --- /dev/null +++ b/OpenSim/Data/MySQL/MySQLHGTravelData.cs | |||
@@ -0,0 +1,70 @@ | |||
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.Generic; | ||
30 | using System.Data; | ||
31 | using System.Reflection; | ||
32 | using System.Threading; | ||
33 | using log4net; | ||
34 | using OpenMetaverse; | ||
35 | using OpenSim.Framework; | ||
36 | using MySql.Data.MySqlClient; | ||
37 | |||
38 | namespace OpenSim.Data.MySQL | ||
39 | { | ||
40 | /// <summary> | ||
41 | /// A MySQL Interface for user grid data | ||
42 | /// </summary> | ||
43 | public class MySQLHGTravelData : MySQLGenericTableHandler<HGTravelingData>, IHGTravelingData | ||
44 | { | ||
45 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
46 | |||
47 | public MySQLHGTravelData(string connectionString, string realm) : base(connectionString, realm, "HGTravelStore") { } | ||
48 | |||
49 | public HGTravelingData Get(UUID sessionID) | ||
50 | { | ||
51 | HGTravelingData[] ret = Get("SessionID", sessionID.ToString()); | ||
52 | |||
53 | if (ret.Length == 0) | ||
54 | return null; | ||
55 | |||
56 | return ret[0]; | ||
57 | } | ||
58 | |||
59 | public HGTravelingData[] GetSessions(UUID userID) | ||
60 | { | ||
61 | return base.Get("UserID", userID.ToString()); | ||
62 | } | ||
63 | |||
64 | public bool Delete(UUID sessionID) | ||
65 | { | ||
66 | return Delete("SessionID", sessionID.ToString()); | ||
67 | } | ||
68 | |||
69 | } | ||
70 | } \ No newline at end of file | ||
diff --git a/OpenSim/Data/MySQL/Resources/HGTravelStore.migrations b/OpenSim/Data/MySQL/Resources/HGTravelStore.migrations new file mode 100644 index 0000000..a0c9ebe --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/HGTravelStore.migrations | |||
@@ -0,0 +1,17 @@ | |||
1 | :VERSION 1 # -------------------------- | ||
2 | |||
3 | BEGIN; | ||
4 | |||
5 | CREATE TABLE `hg_traveling_data` ( | ||
6 | `SessionID` VARCHAR(36) NOT NULL, | ||
7 | `UserID` VARCHAR(36) NOT NULL, | ||
8 | `GridExternalName` VARCHAR(255) NOT NULL DEFAULT '', | ||
9 | `ServiceToken` VARCHAR(255) NOT NULL DEFAULT '', | ||
10 | `ClientIPAddress` VARCHAR(16) NOT NULL DEFAULT '', | ||
11 | `MyIPAddress` VARCHAR(16) NOT NULL DEFAULT '', | ||
12 | PRIMARY KEY (`SessionID`), | ||
13 | KEY (`UserID`) | ||
14 | ) ENGINE=InnoDB; | ||
15 | |||
16 | COMMIT; | ||
17 | |||
diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs index 733993f..b597cb9 100644 --- a/OpenSim/Services/HypergridService/UserAgentService.cs +++ b/OpenSim/Services/HypergridService/UserAgentService.cs | |||
@@ -30,6 +30,7 @@ using System.Collections.Generic; | |||
30 | using System.Net; | 30 | using System.Net; |
31 | using System.Reflection; | 31 | using System.Reflection; |
32 | 32 | ||
33 | using OpenSim.Data; | ||
33 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
34 | using OpenSim.Services.Connectors.Friends; | 35 | using OpenSim.Services.Connectors.Friends; |
35 | using OpenSim.Services.Connectors.Hypergrid; | 36 | using OpenSim.Services.Connectors.Hypergrid; |
@@ -50,14 +51,14 @@ namespace OpenSim.Services.HypergridService | |||
50 | /// needs to do it for them. | 51 | /// needs to do it for them. |
51 | /// Once we have better clients, this shouldn't be needed. | 52 | /// Once we have better clients, this shouldn't be needed. |
52 | /// </summary> | 53 | /// </summary> |
53 | public class UserAgentService : IUserAgentService | 54 | public class UserAgentService : UserAgentServiceBase, IUserAgentService |
54 | { | 55 | { |
55 | private static readonly ILog m_log = | 56 | private static readonly ILog m_log = |
56 | LogManager.GetLogger( | 57 | LogManager.GetLogger( |
57 | MethodBase.GetCurrentMethod().DeclaringType); | 58 | MethodBase.GetCurrentMethod().DeclaringType); |
58 | 59 | ||
59 | // This will need to go into a DB table | 60 | // This will need to go into a DB table |
60 | static Dictionary<UUID, TravelingAgentInfo> m_TravelingAgents = new Dictionary<UUID, TravelingAgentInfo>(); | 61 | //static Dictionary<UUID, TravelingAgentInfo> m_Database = new Dictionary<UUID, TravelingAgentInfo>(); |
61 | 62 | ||
62 | static bool m_Initialized = false; | 63 | static bool m_Initialized = false; |
63 | 64 | ||
@@ -86,6 +87,7 @@ namespace OpenSim.Services.HypergridService | |||
86 | } | 87 | } |
87 | 88 | ||
88 | public UserAgentService(IConfigSource config, IFriendsSimConnector friendsConnector) | 89 | public UserAgentService(IConfigSource config, IFriendsSimConnector friendsConnector) |
90 | : base(config) | ||
89 | { | 91 | { |
90 | // Let's set this always, because we don't know the sequence | 92 | // Let's set this always, because we don't know the sequence |
91 | // of instantiations | 93 | // of instantiations |
@@ -260,7 +262,8 @@ namespace OpenSim.Services.HypergridService | |||
260 | 262 | ||
261 | // Generate a new service session | 263 | // Generate a new service session |
262 | agentCircuit.ServiceSessionID = region.ServerURI + ";" + UUID.Random(); | 264 | agentCircuit.ServiceSessionID = region.ServerURI + ";" + UUID.Random(); |
263 | TravelingAgentInfo old = UpdateTravelInfo(agentCircuit, region); | 265 | TravelingAgentInfo old = null; |
266 | TravelingAgentInfo travel = CreateTravelInfo(agentCircuit, region, fromLogin, out old); | ||
264 | 267 | ||
265 | bool success = false; | 268 | bool success = false; |
266 | string myExternalIP = string.Empty; | 269 | string myExternalIP = string.Empty; |
@@ -282,23 +285,21 @@ namespace OpenSim.Services.HypergridService | |||
282 | m_log.DebugFormat("[USER AGENT SERVICE]: Unable to login user {0} {1} to grid {2}, reason: {3}", | 285 | m_log.DebugFormat("[USER AGENT SERVICE]: Unable to login user {0} {1} to grid {2}, reason: {3}", |
283 | agentCircuit.firstname, agentCircuit.lastname, region.ServerURI, reason); | 286 | agentCircuit.firstname, agentCircuit.lastname, region.ServerURI, reason); |
284 | 287 | ||
285 | // restore the old travel info | 288 | if (old != null) |
286 | lock (m_TravelingAgents) | 289 | StoreTravelInfo(old); |
287 | { | 290 | else |
288 | if (old == null) | 291 | m_Database.Delete(agentCircuit.SessionID); |
289 | m_TravelingAgents.Remove(agentCircuit.SessionID); | ||
290 | else | ||
291 | m_TravelingAgents[agentCircuit.SessionID] = old; | ||
292 | } | ||
293 | 292 | ||
294 | return false; | 293 | return false; |
295 | } | 294 | } |
296 | 295 | ||
296 | // Everything is ok | ||
297 | |||
298 | // Update the perceived IP Address of our grid | ||
297 | m_log.DebugFormat("[USER AGENT SERVICE]: Gatekeeper sees me as {0}", myExternalIP); | 299 | m_log.DebugFormat("[USER AGENT SERVICE]: Gatekeeper sees me as {0}", myExternalIP); |
298 | // else set the IP addresses associated with this client | 300 | travel.MyIpAddress = myExternalIP; |
299 | if (fromLogin) | 301 | |
300 | m_TravelingAgents[agentCircuit.SessionID].ClientIPAddress = agentCircuit.IPAddress; | 302 | StoreTravelInfo(travel); |
301 | m_TravelingAgents[agentCircuit.SessionID].MyIpAddress = myExternalIP; | ||
302 | 303 | ||
303 | return true; | 304 | return true; |
304 | } | 305 | } |
@@ -309,57 +310,39 @@ namespace OpenSim.Services.HypergridService | |||
309 | return LoginAgentToGrid(agentCircuit, gatekeeper, finalDestination, false, out reason); | 310 | return LoginAgentToGrid(agentCircuit, gatekeeper, finalDestination, false, out reason); |
310 | } | 311 | } |
311 | 312 | ||
312 | private void SetClientIP(UUID sessionID, string ip) | 313 | TravelingAgentInfo CreateTravelInfo(AgentCircuitData agentCircuit, GridRegion region, bool fromLogin, out TravelingAgentInfo existing) |
313 | { | 314 | { |
314 | if (m_TravelingAgents.ContainsKey(sessionID)) | 315 | HGTravelingData hgt = m_Database.Get(agentCircuit.SessionID); |
315 | { | 316 | existing = null; |
316 | m_log.DebugFormat("[USER AGENT SERVICE]: Setting IP {0} for session {1}", ip, sessionID); | ||
317 | m_TravelingAgents[sessionID].ClientIPAddress = ip; | ||
318 | } | ||
319 | } | ||
320 | 317 | ||
321 | TravelingAgentInfo UpdateTravelInfo(AgentCircuitData agentCircuit, GridRegion region) | 318 | if (hgt != null) |
322 | { | ||
323 | TravelingAgentInfo travel = new TravelingAgentInfo(); | ||
324 | TravelingAgentInfo old = null; | ||
325 | lock (m_TravelingAgents) | ||
326 | { | 319 | { |
327 | if (m_TravelingAgents.ContainsKey(agentCircuit.SessionID)) | 320 | // Very important! Override whatever this agent comes with. |
328 | { | 321 | // UserAgentService always sets the IP for every new agent |
329 | // Very important! Override whatever this agent comes with. | 322 | // with the original IP address. |
330 | // UserAgentService always sets the IP for every new agent | 323 | existing = new TravelingAgentInfo(hgt); |
331 | // with the original IP address. | 324 | agentCircuit.IPAddress = existing.ClientIPAddress; |
332 | agentCircuit.IPAddress = m_TravelingAgents[agentCircuit.SessionID].ClientIPAddress; | ||
333 | |||
334 | old = m_TravelingAgents[agentCircuit.SessionID]; | ||
335 | } | ||
336 | |||
337 | m_TravelingAgents[agentCircuit.SessionID] = travel; | ||
338 | } | 325 | } |
326 | |||
327 | TravelingAgentInfo travel = new TravelingAgentInfo(existing); | ||
328 | travel.SessionID = agentCircuit.SessionID; | ||
339 | travel.UserID = agentCircuit.AgentID; | 329 | travel.UserID = agentCircuit.AgentID; |
340 | travel.GridExternalName = region.ServerURI; | 330 | travel.GridExternalName = region.ServerURI; |
341 | travel.ServiceToken = agentCircuit.ServiceSessionID; | 331 | travel.ServiceToken = agentCircuit.ServiceSessionID; |
342 | if (old != null) | ||
343 | travel.ClientIPAddress = old.ClientIPAddress; | ||
344 | 332 | ||
345 | return old; | 333 | if (fromLogin) |
334 | travel.ClientIPAddress = agentCircuit.IPAddress; | ||
335 | |||
336 | StoreTravelInfo(travel); | ||
337 | |||
338 | return travel; | ||
346 | } | 339 | } |
347 | 340 | ||
348 | public void LogoutAgent(UUID userID, UUID sessionID) | 341 | public void LogoutAgent(UUID userID, UUID sessionID) |
349 | { | 342 | { |
350 | m_log.DebugFormat("[USER AGENT SERVICE]: User {0} logged out", userID); | 343 | m_log.DebugFormat("[USER AGENT SERVICE]: User {0} logged out", userID); |
351 | 344 | ||
352 | lock (m_TravelingAgents) | 345 | m_Database.Delete(sessionID); |
353 | { | ||
354 | List<UUID> travels = new List<UUID>(); | ||
355 | foreach (KeyValuePair<UUID, TravelingAgentInfo> kvp in m_TravelingAgents) | ||
356 | if (kvp.Value == null) // do some clean up | ||
357 | travels.Add(kvp.Key); | ||
358 | else if (kvp.Value.UserID == userID) | ||
359 | travels.Add(kvp.Key); | ||
360 | foreach (UUID session in travels) | ||
361 | m_TravelingAgents.Remove(session); | ||
362 | } | ||
363 | 346 | ||
364 | GridUserInfo guinfo = m_GridUserService.GetGridUserInfo(userID.ToString()); | 347 | GridUserInfo guinfo = m_GridUserService.GetGridUserInfo(userID.ToString()); |
365 | if (guinfo != null) | 348 | if (guinfo != null) |
@@ -369,10 +352,11 @@ namespace OpenSim.Services.HypergridService | |||
369 | // We need to prevent foreign users with the same UUID as a local user | 352 | // We need to prevent foreign users with the same UUID as a local user |
370 | public bool IsAgentComingHome(UUID sessionID, string thisGridExternalName) | 353 | public bool IsAgentComingHome(UUID sessionID, string thisGridExternalName) |
371 | { | 354 | { |
372 | if (!m_TravelingAgents.ContainsKey(sessionID)) | 355 | HGTravelingData hgt = m_Database.Get(sessionID); |
356 | if (hgt == null) | ||
373 | return false; | 357 | return false; |
374 | 358 | ||
375 | TravelingAgentInfo travel = m_TravelingAgents[sessionID]; | 359 | TravelingAgentInfo travel = new TravelingAgentInfo(hgt); |
376 | 360 | ||
377 | return travel.GridExternalName.ToLower() == thisGridExternalName.ToLower(); | 361 | return travel.GridExternalName.ToLower() == thisGridExternalName.ToLower(); |
378 | } | 362 | } |
@@ -385,31 +369,32 @@ namespace OpenSim.Services.HypergridService | |||
385 | m_log.DebugFormat("[USER AGENT SERVICE]: Verifying Client session {0} with reported IP {1}.", | 369 | m_log.DebugFormat("[USER AGENT SERVICE]: Verifying Client session {0} with reported IP {1}.", |
386 | sessionID, reportedIP); | 370 | sessionID, reportedIP); |
387 | 371 | ||
388 | if (m_TravelingAgents.ContainsKey(sessionID)) | 372 | HGTravelingData hgt = m_Database.Get(sessionID); |
389 | { | 373 | if (hgt == null) |
390 | bool result = m_TravelingAgents[sessionID].ClientIPAddress == reportedIP || | 374 | return false; |
391 | m_TravelingAgents[sessionID].MyIpAddress == reportedIP; // NATed | ||
392 | 375 | ||
393 | m_log.DebugFormat("[USER AGENT SERVICE]: Comparing {0} with login IP {1} and MyIP {1}; result is {3}", | 376 | TravelingAgentInfo travel = new TravelingAgentInfo(hgt); |
394 | reportedIP, m_TravelingAgents[sessionID].ClientIPAddress, m_TravelingAgents[sessionID].MyIpAddress, result); | ||
395 | 377 | ||
396 | return result; | 378 | bool result = travel.ClientIPAddress == reportedIP || travel.MyIpAddress == reportedIP; // NATed |
397 | } | ||
398 | 379 | ||
399 | return false; | 380 | m_log.DebugFormat("[USER AGENT SERVICE]: Comparing {0} with login IP {1} and MyIP {1}; result is {3}", |
381 | reportedIP, travel.ClientIPAddress, travel.MyIpAddress, result); | ||
382 | |||
383 | return result; | ||
400 | } | 384 | } |
401 | 385 | ||
402 | public bool VerifyAgent(UUID sessionID, string token) | 386 | public bool VerifyAgent(UUID sessionID, string token) |
403 | { | 387 | { |
404 | if (m_TravelingAgents.ContainsKey(sessionID)) | 388 | HGTravelingData hgt = m_Database.Get(sessionID); |
389 | if (hgt == null) | ||
405 | { | 390 | { |
406 | m_log.DebugFormat("[USER AGENT SERVICE]: Verifying agent token {0} against {1}", token, m_TravelingAgents[sessionID].ServiceToken); | 391 | m_log.DebugFormat("[USER AGENT SERVICE]: Token verification for session {0}: no such session", sessionID); |
407 | return m_TravelingAgents[sessionID].ServiceToken == token; | 392 | return false; |
408 | } | 393 | } |
409 | 394 | ||
410 | m_log.DebugFormat("[USER AGENT SERVICE]: Token verification for session {0}: no such session", sessionID); | 395 | TravelingAgentInfo travel = new TravelingAgentInfo(hgt); |
411 | 396 | m_log.DebugFormat("[USER AGENT SERVICE]: Verifying agent token {0} against {1}", token, travel.ServiceToken); | |
412 | return false; | 397 | return travel.ServiceToken == token; |
413 | } | 398 | } |
414 | 399 | ||
415 | [Obsolete] | 400 | [Obsolete] |
@@ -472,17 +457,17 @@ namespace OpenSim.Services.HypergridService | |||
472 | } | 457 | } |
473 | } | 458 | } |
474 | 459 | ||
475 | // Lastly, let's notify the rest who may be online somewhere else | 460 | //// Lastly, let's notify the rest who may be online somewhere else |
476 | foreach (string user in usersToBeNotified) | 461 | //foreach (string user in usersToBeNotified) |
477 | { | 462 | //{ |
478 | UUID id = new UUID(user); | 463 | // UUID id = new UUID(user); |
479 | if (m_TravelingAgents.ContainsKey(id) && m_TravelingAgents[id].GridExternalName != m_GridName) | 464 | // if (m_Database.ContainsKey(id) && m_Database[id].GridExternalName != m_GridName) |
480 | { | 465 | // { |
481 | string url = m_TravelingAgents[id].GridExternalName; | 466 | // string url = m_Database[id].GridExternalName; |
482 | // forward | 467 | // // forward |
483 | m_log.WarnFormat("[USER AGENT SERVICE]: User {0} is visiting {1}. HG Status notifications still not implemented.", user, url); | 468 | // m_log.WarnFormat("[USER AGENT SERVICE]: User {0} is visiting {1}. HG Status notifications still not implemented.", user, url); |
484 | } | 469 | // } |
485 | } | 470 | //} |
486 | 471 | ||
487 | // and finally, let's send the online friends | 472 | // and finally, let's send the online friends |
488 | if (online) | 473 | if (online) |
@@ -609,16 +594,13 @@ namespace OpenSim.Services.HypergridService | |||
609 | 594 | ||
610 | public string LocateUser(UUID userID) | 595 | public string LocateUser(UUID userID) |
611 | { | 596 | { |
612 | foreach (TravelingAgentInfo t in m_TravelingAgents.Values) | 597 | HGTravelingData[] hgts = m_Database.GetSessions(userID); |
613 | { | 598 | if (hgts == null) |
614 | if (t == null) | 599 | return string.Empty; |
615 | { | 600 | |
616 | m_log.ErrorFormat("[USER AGENT SERVICE]: Oops! Null TravelingAgentInfo. Please report this on mantis"); | 601 | foreach (HGTravelingData t in hgts) |
617 | continue; | 602 | if (t.Data.ContainsKey("GridExternalName") && !m_GridName.Equals(t.Data["GridExternalName"])) |
618 | } | 603 | return t.Data["GridExternalName"]; |
619 | if (t.UserID == userID && !m_GridName.Equals(t.GridExternalName)) | ||
620 | return t.GridExternalName; | ||
621 | } | ||
622 | 604 | ||
623 | return string.Empty; | 605 | return string.Empty; |
624 | } | 606 | } |
@@ -689,17 +671,60 @@ namespace OpenSim.Services.HypergridService | |||
689 | return exception; | 671 | return exception; |
690 | } | 672 | } |
691 | 673 | ||
674 | private void StoreTravelInfo(TravelingAgentInfo travel) | ||
675 | { | ||
676 | if (travel == null) | ||
677 | return; | ||
678 | |||
679 | HGTravelingData hgt = new HGTravelingData(); | ||
680 | hgt.SessionID = travel.SessionID; | ||
681 | hgt.UserID = travel.UserID; | ||
682 | hgt.Data = new Dictionary<string, string>(); | ||
683 | hgt.Data["GridExternalName"] = travel.GridExternalName; | ||
684 | hgt.Data["ServiceToken"] = travel.ServiceToken; | ||
685 | hgt.Data["ClientIPAddress"] = travel.ClientIPAddress; | ||
686 | hgt.Data["MyIPAddress"] = travel.MyIpAddress; | ||
687 | |||
688 | m_Database.Store(hgt); | ||
689 | } | ||
692 | #endregion | 690 | #endregion |
693 | 691 | ||
694 | } | 692 | } |
695 | 693 | ||
696 | class TravelingAgentInfo | 694 | class TravelingAgentInfo |
697 | { | 695 | { |
696 | public UUID SessionID; | ||
698 | public UUID UserID; | 697 | public UUID UserID; |
699 | public string GridExternalName = string.Empty; | 698 | public string GridExternalName = string.Empty; |
700 | public string ServiceToken = string.Empty; | 699 | public string ServiceToken = string.Empty; |
701 | public string ClientIPAddress = string.Empty; // as seen from this user agent service | 700 | public string ClientIPAddress = string.Empty; // as seen from this user agent service |
702 | public string MyIpAddress = string.Empty; // the user agent service's external IP, as seen from the next gatekeeper | 701 | public string MyIpAddress = string.Empty; // the user agent service's external IP, as seen from the next gatekeeper |
702 | |||
703 | public TravelingAgentInfo(HGTravelingData t) | ||
704 | { | ||
705 | if (t.Data != null) | ||
706 | { | ||
707 | SessionID = new UUID(t.SessionID); | ||
708 | UserID = new UUID(t.UserID); | ||
709 | GridExternalName = t.Data["GridExternalName"]; | ||
710 | ServiceToken = t.Data["ServiceToken"]; | ||
711 | ClientIPAddress = t.Data["ClientIPAddress"]; | ||
712 | MyIpAddress = t.Data["MyIPAddress"]; | ||
713 | } | ||
714 | } | ||
715 | |||
716 | public TravelingAgentInfo(TravelingAgentInfo old) | ||
717 | { | ||
718 | if (old != null) | ||
719 | { | ||
720 | SessionID = old.SessionID; | ||
721 | UserID = old.UserID; | ||
722 | GridExternalName = old.GridExternalName; | ||
723 | ServiceToken = old.ServiceToken; | ||
724 | ClientIPAddress = old.ClientIPAddress; | ||
725 | MyIpAddress = old.MyIpAddress; | ||
726 | } | ||
727 | } | ||
703 | } | 728 | } |
704 | 729 | ||
705 | } | 730 | } |
diff --git a/OpenSim/Services/HypergridService/UserAgentServiceBase.cs b/OpenSim/Services/HypergridService/UserAgentServiceBase.cs new file mode 100644 index 0000000..a00e5a6 --- /dev/null +++ b/OpenSim/Services/HypergridService/UserAgentServiceBase.cs | |||
@@ -0,0 +1,84 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Reflection; | ||
30 | using Nini.Config; | ||
31 | using OpenSim.Framework; | ||
32 | using OpenSim.Data; | ||
33 | using OpenSim.Services.Interfaces; | ||
34 | using OpenSim.Services.Base; | ||
35 | |||
36 | namespace OpenSim.Services.HypergridService | ||
37 | { | ||
38 | public class UserAgentServiceBase : ServiceBase | ||
39 | { | ||
40 | protected IHGTravelingData m_Database = null; | ||
41 | |||
42 | public UserAgentServiceBase(IConfigSource config) | ||
43 | : base(config) | ||
44 | { | ||
45 | string dllName = String.Empty; | ||
46 | string connString = String.Empty; | ||
47 | string realm = "hg_traveling_data"; | ||
48 | |||
49 | // | ||
50 | // Try reading the [DatabaseService] section, if it exists | ||
51 | // | ||
52 | IConfig dbConfig = config.Configs["DatabaseService"]; | ||
53 | if (dbConfig != null) | ||
54 | { | ||
55 | if (dllName == String.Empty) | ||
56 | dllName = dbConfig.GetString("StorageProvider", String.Empty); | ||
57 | if (connString == String.Empty) | ||
58 | connString = dbConfig.GetString("ConnectionString", String.Empty); | ||
59 | } | ||
60 | |||
61 | // | ||
62 | // [UserAgentService] section overrides [DatabaseService], if it exists | ||
63 | // | ||
64 | IConfig gridConfig = config.Configs["UserAgentService"]; | ||
65 | if (gridConfig != null) | ||
66 | { | ||
67 | dllName = gridConfig.GetString("StorageProvider", dllName); | ||
68 | connString = gridConfig.GetString("ConnectionString", connString); | ||
69 | realm = gridConfig.GetString("Realm", realm); | ||
70 | } | ||
71 | |||
72 | // | ||
73 | // We tried, but this doesn't exist. We can't proceed. | ||
74 | // | ||
75 | if (dllName.Equals(String.Empty)) | ||
76 | throw new Exception("No StorageProvider configured"); | ||
77 | |||
78 | m_Database = LoadPlugin<IHGTravelingData>(dllName, new Object[] { connString, realm }); | ||
79 | if (m_Database == null) | ||
80 | throw new Exception("Could not find a storage interface in the given module"); | ||
81 | |||
82 | } | ||
83 | } | ||
84 | } | ||