aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Services/HypergridService/UserAgentService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Services/HypergridService/UserAgentService.cs')
-rw-r--r--OpenSim/Services/HypergridService/UserAgentService.cs250
1 files changed, 250 insertions, 0 deletions
diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs
new file mode 100644
index 0000000..2f1fed4
--- /dev/null
+++ b/OpenSim/Services/HypergridService/UserAgentService.cs
@@ -0,0 +1,250 @@
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 IGridUserService m_GridUserService;
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 gridUserService = serverConfig.GetString("GridUserService", String.Empty);
78
79 if (gridService == string.Empty || gridUserService == 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_GridUserService = ServerUtils.LoadPlugin<IGridUserService>(gridUserService, 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 GridUserInfo uinfo = m_GridUserService.GetGridUserInfo(userID.ToString());
99 if (uinfo != null)
100 {
101 if (uinfo.HomeRegionID != UUID.Zero)
102 {
103 home = m_GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID);
104 position = uinfo.HomePosition;
105 lookAt = uinfo.HomeLookAt;
106 }
107 if (home == null)
108 {
109 List<GridRegion> defs = m_GridService.GetDefaultRegions(UUID.Zero);
110 if (defs != null && defs.Count > 0)
111 home = defs[0];
112 }
113 }
114
115 return home;
116 }
117
118 public bool LoginAgentToGrid(AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, out string reason)
119 {
120 m_log.DebugFormat("[USER AGENT SERVICE]: Request to login user {0} {1} to grid {2}",
121 agentCircuit.firstname, agentCircuit.lastname, gatekeeper.ExternalHostName +":"+ gatekeeper.HttpPort);
122
123 // Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination
124 GridRegion region = new GridRegion(gatekeeper);
125 region.RegionName = finalDestination.RegionName;
126 region.RegionID = finalDestination.RegionID;
127 region.RegionLocX = finalDestination.RegionLocX;
128 region.RegionLocY = finalDestination.RegionLocY;
129
130 // Generate a new service session
131 agentCircuit.ServiceSessionID = "http://" + region.ExternalHostName + ":" + region.HttpPort + ";" + UUID.Random();
132 TravelingAgentInfo old = UpdateTravelInfo(agentCircuit, region);
133
134 bool success = m_GatekeeperConnector.CreateAgent(region, agentCircuit, (uint)Constants.TeleportFlags.ViaLogin, out reason);
135
136 if (!success)
137 {
138 m_log.DebugFormat("[USER AGENT SERVICE]: Unable to login user {0} {1} to grid {2}, reason: {3}",
139 agentCircuit.firstname, agentCircuit.lastname, region.ExternalHostName + ":" + region.HttpPort, reason);
140
141 // restore the old travel info
142 lock (m_TravelingAgents)
143 m_TravelingAgents[agentCircuit.SessionID] = old;
144
145 return false;
146 }
147
148 return true;
149 }
150
151 public void SetClientToken(UUID sessionID, string token)
152 {
153 if (m_TravelingAgents.ContainsKey(sessionID))
154 {
155 m_log.DebugFormat("[USER AGENT SERVICE]: Setting token {0} for session {1}", token, sessionID);
156 m_TravelingAgents[sessionID].ClientToken = token;
157 }
158 }
159
160 TravelingAgentInfo UpdateTravelInfo(AgentCircuitData agentCircuit, GridRegion region)
161 {
162 TravelingAgentInfo travel = new TravelingAgentInfo();
163 TravelingAgentInfo old = null;
164 lock (m_TravelingAgents)
165 {
166 if (m_TravelingAgents.ContainsKey(agentCircuit.SessionID))
167 {
168 old = m_TravelingAgents[agentCircuit.SessionID];
169 }
170
171 m_TravelingAgents[agentCircuit.SessionID] = travel;
172 }
173 travel.UserID = agentCircuit.AgentID;
174 travel.GridExternalName = region.ExternalHostName + ":" + region.HttpPort;
175 travel.ServiceToken = agentCircuit.ServiceSessionID;
176 if (old != null)
177 travel.ClientToken = old.ClientToken;
178
179 return old;
180 }
181
182 public void LogoutAgent(UUID userID, UUID sessionID)
183 {
184 m_log.DebugFormat("[USER AGENT SERVICE]: User {0} logged out", userID);
185
186 lock (m_TravelingAgents)
187 {
188 List<UUID> travels = new List<UUID>();
189 foreach (KeyValuePair<UUID, TravelingAgentInfo> kvp in m_TravelingAgents)
190 if (kvp.Value == null) // do some clean up
191 travels.Add(kvp.Key);
192 else if (kvp.Value.UserID == userID)
193 travels.Add(kvp.Key);
194 foreach (UUID session in travels)
195 m_TravelingAgents.Remove(session);
196 }
197
198 GridUserInfo guinfo = m_GridUserService.GetGridUserInfo(userID.ToString());
199 if (guinfo != null)
200 m_GridUserService.LoggedOut(userID.ToString(), guinfo.LastRegionID, guinfo.LastPosition, guinfo.LastLookAt);
201 }
202
203 // We need to prevent foreign users with the same UUID as a local user
204 public bool AgentIsComingHome(UUID sessionID, string thisGridExternalName)
205 {
206 if (!m_TravelingAgents.ContainsKey(sessionID))
207 return false;
208
209 TravelingAgentInfo travel = m_TravelingAgents[sessionID];
210 return travel.GridExternalName == thisGridExternalName;
211 }
212
213 public bool VerifyClient(UUID sessionID, string token)
214 {
215 m_log.DebugFormat("[USER AGENT SERVICE]: Verifying Client session {0} with token {1}", sessionID, token);
216 //return true;
217
218 // Commenting this for now until I understand better what part of a sender's
219 // info stays unchanged throughout a session
220
221 if (m_TravelingAgents.ContainsKey(sessionID))
222 return m_TravelingAgents[sessionID].ClientToken == token;
223
224 return false;
225 }
226
227 public bool VerifyAgent(UUID sessionID, string token)
228 {
229 if (m_TravelingAgents.ContainsKey(sessionID))
230 {
231 m_log.DebugFormat("[USER AGENT SERVICE]: Verifying agent token {0} against {1}", token, m_TravelingAgents[sessionID].ServiceToken);
232 return m_TravelingAgents[sessionID].ServiceToken == token;
233 }
234
235 m_log.DebugFormat("[USER AGENT SERVICE]: Token verification for session {0}: no such session", sessionID);
236
237 return false;
238 }
239
240 }
241
242 class TravelingAgentInfo
243 {
244 public UUID UserID;
245 public string GridExternalName = string.Empty;
246 public string ServiceToken = string.Empty;
247 public string ClientToken = string.Empty;
248 }
249
250}