aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Services/HypergridService/UserAgentService.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Services/HypergridService/UserAgentService.cs244
1 files changed, 244 insertions, 0 deletions
diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs
new file mode 100644
index 0000000..26f211b
--- /dev/null
+++ b/OpenSim/Services/HypergridService/UserAgentService.cs
@@ -0,0 +1,244 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Net;
31using System.Reflection;
32
33using OpenSim.Framework;
34using OpenSim.Services.Connectors.Hypergrid;
35using OpenSim.Services.Interfaces;
36using GridRegion = OpenSim.Services.Interfaces.GridRegion;
37using OpenSim.Server.Base;
38
39using OpenMetaverse;
40using log4net;
41using Nini.Config;
42
43namespace OpenSim.Services.HypergridService
44{
45 /// <summary>
46 /// This service is for HG1.5 only, to make up for the fact that clients don't
47 /// keep any private information in themselves, and that their 'home service'
48 /// needs to do it for them.
49 /// Once we have better clients, this shouldn't be needed.
50 /// </summary>
51 public class UserAgentService : IUserAgentService
52 {
53 private static readonly ILog m_log =
54 LogManager.GetLogger(
55 MethodBase.GetCurrentMethod().DeclaringType);
56
57 // This will need to go into a DB table
58 static Dictionary<UUID, TravelingAgentInfo> m_TravelingAgents = new Dictionary<UUID, TravelingAgentInfo>();
59
60 static bool m_Initialized = false;
61
62 protected static IPresenceService m_PresenceService;
63 protected static IGridService m_GridService;
64 protected static GatekeeperServiceConnector m_GatekeeperConnector;
65
66 public UserAgentService(IConfigSource config)
67 {
68 if (!m_Initialized)
69 {
70 m_log.DebugFormat("[HOME USERS SECURITY]: Starting...");
71
72 IConfig serverConfig = config.Configs["UserAgentService"];
73 if (serverConfig == null)
74 throw new Exception(String.Format("No section UserAgentService in config file"));
75
76 string gridService = serverConfig.GetString("GridService", String.Empty);
77 string presenceService = serverConfig.GetString("PresenceService", String.Empty);
78
79 if (gridService == string.Empty || presenceService == string.Empty)
80 throw new Exception(String.Format("Incomplete specifications, UserAgent Service cannot function."));
81
82 Object[] args = new Object[] { config };
83 m_GridService = ServerUtils.LoadPlugin<IGridService>(gridService, args);
84 m_PresenceService = ServerUtils.LoadPlugin<IPresenceService>(presenceService, args);
85 m_GatekeeperConnector = new GatekeeperServiceConnector();
86
87 m_Initialized = true;
88 }
89 }
90
91 public GridRegion GetHomeRegion(UUID userID, out Vector3 position, out Vector3 lookAt)
92 {
93 position = new Vector3(128, 128, 0); lookAt = Vector3.UnitY;
94
95 m_log.DebugFormat("[USER AGENT SERVICE]: Request to get home region of user {0}", userID);
96
97 GridRegion home = null;
98 PresenceInfo[] presences = m_PresenceService.GetAgents(new string[] { userID.ToString() });
99 if (presences != null && presences.Length > 0)
100 {
101 UUID homeID = presences[0].HomeRegionID;
102 if (homeID != UUID.Zero)
103 {
104 home = m_GridService.GetRegionByUUID(UUID.Zero, homeID);
105 position = presences[0].HomePosition;
106 lookAt = presences[0].HomeLookAt;
107 }
108 if (home == null)
109 {
110 List<GridRegion> defs = m_GridService.GetDefaultRegions(UUID.Zero);
111 if (defs != null && defs.Count > 0)
112 home = defs[0];
113 }
114 }
115
116 return home;
117 }
118
119 public bool LoginAgentToGrid(AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, out string reason)
120 {
121 m_log.DebugFormat("[USER AGENT SERVICE]: Request to login user {0} {1} to grid {2}",
122 agentCircuit.firstname, agentCircuit.lastname, gatekeeper.ExternalHostName +":"+ gatekeeper.HttpPort);
123
124 // Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination
125 GridRegion region = new GridRegion(gatekeeper);
126 region.RegionName = finalDestination.RegionName;
127 region.RegionID = finalDestination.RegionID;
128 region.RegionLocX = finalDestination.RegionLocX;
129 region.RegionLocY = finalDestination.RegionLocY;
130
131 // Generate a new service session
132 agentCircuit.ServiceSessionID = "http://" + region.ExternalHostName + ":" + region.HttpPort + ";" + UUID.Random();
133 TravelingAgentInfo old = UpdateTravelInfo(agentCircuit, region);
134
135 bool success = m_GatekeeperConnector.CreateAgent(region, agentCircuit, (uint)Constants.TeleportFlags.ViaLogin, out reason);
136
137 if (!success)
138 {
139 m_log.DebugFormat("[USER AGENT SERVICE]: Unable to login user {0} {1} to grid {2}, reason: {3}",
140 agentCircuit.firstname, agentCircuit.lastname, region.ExternalHostName + ":" + region.HttpPort, reason);
141
142 // restore the old travel info
143 lock (m_TravelingAgents)
144 m_TravelingAgents[agentCircuit.SessionID] = old;
145
146 return false;
147 }
148
149 return true;
150 }
151
152 TravelingAgentInfo UpdateTravelInfo(AgentCircuitData agentCircuit, GridRegion region)
153 {
154 TravelingAgentInfo travel = new TravelingAgentInfo();
155 TravelingAgentInfo old = null;
156 lock (m_TravelingAgents)
157 {
158 if (m_TravelingAgents.ContainsKey(agentCircuit.SessionID))
159 {
160 old = m_TravelingAgents[agentCircuit.SessionID];
161 }
162
163 m_TravelingAgents[agentCircuit.SessionID] = travel;
164 }
165 travel.UserID = agentCircuit.AgentID;
166 travel.GridExternalName = region.ExternalHostName + ":" + region.HttpPort;
167 travel.ServiceToken = agentCircuit.ServiceSessionID;
168 if (old != null)
169 travel.ClientToken = old.ClientToken;
170
171 return old;
172 }
173
174 public void LogoutAgent(UUID userID, UUID sessionID)
175 {
176 m_log.DebugFormat("[USER AGENT SERVICE]: User {0} logged out", userID);
177
178 lock (m_TravelingAgents)
179 {
180 List<UUID> travels = new List<UUID>();
181 foreach (KeyValuePair<UUID, TravelingAgentInfo> kvp in m_TravelingAgents)
182 if (kvp.Value == null) // do some clean up
183 travels.Add(kvp.Key);
184 else if (kvp.Value.UserID == userID)
185 travels.Add(kvp.Key);
186 foreach (UUID session in travels)
187 m_TravelingAgents.Remove(session);
188 }
189 }
190
191 // We need to prevent foreign users with the same UUID as a local user
192 public bool AgentIsComingHome(UUID sessionID, string thisGridExternalName)
193 {
194 if (!m_TravelingAgents.ContainsKey(sessionID))
195 return false;
196
197 TravelingAgentInfo travel = m_TravelingAgents[sessionID];
198 return travel.GridExternalName == thisGridExternalName;
199 }
200
201 public bool VerifyClient(UUID sessionID, string token)
202 {
203 return true;
204
205 // Commenting this for now until I understand better what part of a sender's
206 // info stays unchanged throughout a session
207 //
208 //if (m_TravelingAgents.ContainsKey(sessionID))
209 //{
210 // // Aquiles heel. Must trust the first grid upon login
211 // if (m_TravelingAgents[sessionID].ClientToken == string.Empty)
212 // {
213 // m_TravelingAgents[sessionID].ClientToken = token;
214 // return true;
215 // }
216 // return m_TravelingAgents[sessionID].ClientToken == token;
217 //}
218 //return false;
219 }
220
221 public bool VerifyAgent(UUID sessionID, string token)
222 {
223 if (m_TravelingAgents.ContainsKey(sessionID))
224 {
225 m_log.DebugFormat("[USER AGENT SERVICE]: Verifying agent token {0} against {1}", token, m_TravelingAgents[sessionID].ServiceToken);
226 return m_TravelingAgents[sessionID].ServiceToken == token;
227 }
228
229 m_log.DebugFormat("[USER AGENT SERVICE]: Token verification for session {0}: no such session", sessionID);
230
231 return false;
232 }
233
234 }
235
236 class TravelingAgentInfo
237 {
238 public UUID UserID;
239 public string GridExternalName = string.Empty;
240 public string ServiceToken = string.Empty;
241 public string ClientToken = string.Empty;
242 }
243
244}