diff options
author | Justin Clarke Casey | 2008-10-24 21:22:54 +0000 |
---|---|---|
committer | Justin Clarke Casey | 2008-10-24 21:22:54 +0000 |
commit | 3340a579e72f1248bb092a705db068027e46ef75 (patch) | |
tree | de14319e2adc598dff0fd7557fc4f9d807ac55a2 /OpenSim/Region/ClientStack/LindenUDP/LLPacketServer.cs | |
parent | un-double-flipped some double-flipped normals in circular path prim end caps (diff) | |
download | opensim-SC-3340a579e72f1248bb092a705db068027e46ef75.zip opensim-SC-3340a579e72f1248bb092a705db068027e46ef75.tar.gz opensim-SC-3340a579e72f1248bb092a705db068027e46ef75.tar.bz2 opensim-SC-3340a579e72f1248bb092a705db068027e46ef75.tar.xz |
* Stop creating a circuit if the client fails authentication (i.e. the region server wasn't told that it was coming)
* This moves authentication from the client thread (where failure was difficult to detect) to the particular thread handling that packet
* I've kept the authentication outside of the crucial clientCircuits lock (though any delay here is probably swamped by the other delays associated with login)
* Also added more to the unit test to ensure this doesn't regress
Diffstat (limited to 'OpenSim/Region/ClientStack/LindenUDP/LLPacketServer.cs')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLPacketServer.cs | 72 |
1 files changed, 51 insertions, 21 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketServer.cs index 5d3dba0..e3a02bc 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketServer.cs | |||
@@ -27,6 +27,8 @@ | |||
27 | 27 | ||
28 | using System.Net; | 28 | using System.Net; |
29 | using System.Net.Sockets; | 29 | using System.Net.Sockets; |
30 | using System.Reflection; | ||
31 | using log4net; | ||
30 | using OpenMetaverse; | 32 | using OpenMetaverse; |
31 | using OpenMetaverse.Packets; | 33 | using OpenMetaverse.Packets; |
32 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
@@ -36,8 +38,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
36 | { | 38 | { |
37 | public class LLPacketServer | 39 | public class LLPacketServer |
38 | { | 40 | { |
39 | //private static readonly log4net.ILog m_log | 41 | private static readonly log4net.ILog m_log |
40 | // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 42 | = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
41 | 43 | ||
42 | protected readonly ILLClientStackNetworkHandler m_networkHandler; | 44 | protected readonly ILLClientStackNetworkHandler m_networkHandler; |
43 | protected IScene m_scene; | 45 | protected IScene m_scene; |
@@ -87,49 +89,77 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
87 | /// <returns></returns> | 89 | /// <returns></returns> |
88 | protected virtual IClientAPI CreateNewCircuit(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, | 90 | protected virtual IClientAPI CreateNewCircuit(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, |
89 | ClientManager clientManager, IScene scene, AssetCache assetCache, | 91 | ClientManager clientManager, IScene scene, AssetCache assetCache, |
90 | LLPacketServer packServer, AgentCircuitManager authenSessions, | 92 | LLPacketServer packServer, AuthenticateResponse sessionInfo, |
91 | UUID agentId, UUID sessionId, uint circuitCode, EndPoint proxyEP) | 93 | UUID agentId, UUID sessionId, uint circuitCode, EndPoint proxyEP) |
92 | { | 94 | { |
93 | return | 95 | return |
94 | new LLClientView( | 96 | new LLClientView( |
95 | remoteEP, scene, assetCache, packServer, authenSessions, agentId, sessionId, circuitCode, proxyEP, | 97 | remoteEP, scene, assetCache, packServer, sessionInfo, agentId, sessionId, circuitCode, proxyEP, |
96 | m_userSettings); | 98 | m_userSettings); |
97 | } | 99 | } |
98 | 100 | ||
99 | /// <summary> | 101 | /// <summary> |
102 | /// Check whether a given client is authorized to connect | ||
103 | /// </summary> | ||
104 | /// <param name="useCircuit"></param> | ||
105 | /// <param name="circuitManager"></param> | ||
106 | /// <returns></returns> | ||
107 | public virtual bool IsClientAuthorized( | ||
108 | UseCircuitCodePacket useCircuit, AgentCircuitManager circuitManager, out AuthenticateResponse sessionInfo) | ||
109 | { | ||
110 | UUID agentId = useCircuit.CircuitCode.ID; | ||
111 | UUID sessionId = useCircuit.CircuitCode.SessionID; | ||
112 | uint circuitCode = useCircuit.CircuitCode.Code; | ||
113 | |||
114 | sessionInfo = circuitManager.AuthenticateSession(sessionId, agentId, circuitCode); | ||
115 | |||
116 | if (!sessionInfo.Authorised) | ||
117 | return false; | ||
118 | |||
119 | return true; | ||
120 | } | ||
121 | |||
122 | /// <summary> | ||
100 | /// Add a new client circuit | 123 | /// Add a new client circuit |
101 | /// </summary> | 124 | /// </summary> |
102 | /// <param name="epSender"></param> | 125 | /// <param name="epSender"></param> |
103 | /// <param name="useCircuit"></param> | 126 | /// <param name="useCircuit"></param> |
104 | /// <param name="assetCache"></param> | 127 | /// <param name="assetCache"></param> |
105 | /// <param name="circuitManager"></param> | 128 | /// <param name="sessionInfo"></param> |
106 | /// <param name="proxyEP"></param> | 129 | /// <param name="proxyEP"></param> |
107 | /// <returns> | 130 | /// <returns> |
108 | /// true if a new circuit was created, false if a circuit with the given circuit code already existed | 131 | /// true if a new circuit was created, false if a circuit with the given circuit code already existed |
109 | /// </returns> | 132 | /// </returns> |
110 | public virtual bool AddNewClient(EndPoint epSender, UseCircuitCodePacket useCircuit, AssetCache assetCache, | 133 | public virtual bool AddNewClient( |
111 | AgentCircuitManager circuitManager, EndPoint proxyEP) | 134 | EndPoint epSender, UseCircuitCodePacket useCircuit, AssetCache assetCache, |
135 | AuthenticateResponse sessionInfo, EndPoint proxyEP) | ||
112 | { | 136 | { |
113 | IClientAPI newuser; | 137 | IClientAPI newuser; |
114 | 138 | uint circuitCode = useCircuit.CircuitCode.Code; | |
115 | if (m_scene.ClientManager.TryGetClient(useCircuit.CircuitCode.Code, out newuser)) | 139 | |
140 | if (m_scene.ClientManager.TryGetClient(circuitCode, out newuser)) | ||
116 | { | 141 | { |
142 | // The circuit is already known to the scene. This not actually a problem since this will currently | ||
143 | // occur if a client is crossing borders (hence upgrading its circuit). However, we shouldn't | ||
144 | // really by trying to add a new client if this is the case. | ||
117 | return false; | 145 | return false; |
118 | } | 146 | } |
119 | else | 147 | |
120 | { | 148 | UUID agentId = useCircuit.CircuitCode.ID; |
121 | newuser = CreateNewCircuit(epSender, useCircuit, m_scene.ClientManager, m_scene, assetCache, this, | 149 | UUID sessionId = useCircuit.CircuitCode.SessionID; |
122 | circuitManager, useCircuit.CircuitCode.ID, | 150 | |
123 | useCircuit.CircuitCode.SessionID, useCircuit.CircuitCode.Code, proxyEP); | 151 | newuser |
152 | = CreateNewCircuit( | ||
153 | epSender, useCircuit, m_scene.ClientManager, m_scene, assetCache, this, sessionInfo, | ||
154 | agentId, sessionId, circuitCode, proxyEP); | ||
124 | 155 | ||
125 | m_scene.ClientManager.Add(useCircuit.CircuitCode.Code, newuser); | 156 | m_scene.ClientManager.Add(circuitCode, newuser); |
126 | 157 | ||
127 | newuser.OnViewerEffect += m_scene.ClientManager.ViewerEffectHandler; | 158 | newuser.OnViewerEffect += m_scene.ClientManager.ViewerEffectHandler; |
128 | newuser.OnLogout += LogoutHandler; | 159 | newuser.OnLogout += LogoutHandler; |
129 | newuser.OnConnectionClosed += CloseClient; | 160 | newuser.OnConnectionClosed += CloseClient; |
130 | 161 | ||
131 | return true; | 162 | return true; |
132 | } | ||
133 | } | 163 | } |
134 | 164 | ||
135 | public void LogoutHandler(IClientAPI client) | 165 | public void LogoutHandler(IClientAPI client) |