diff options
Diffstat (limited to 'OpenSim.RegionServer/UserServer/LoginServer.cs')
-rw-r--r-- | OpenSim.RegionServer/UserServer/LoginServer.cs | 303 |
1 files changed, 161 insertions, 142 deletions
diff --git a/OpenSim.RegionServer/UserServer/LoginServer.cs b/OpenSim.RegionServer/UserServer/LoginServer.cs index 7b4c1f0..a68e013 100644 --- a/OpenSim.RegionServer/UserServer/LoginServer.cs +++ b/OpenSim.RegionServer/UserServer/LoginServer.cs | |||
@@ -50,7 +50,7 @@ namespace OpenSim.UserServer | |||
50 | /// <summary> | 50 | /// <summary> |
51 | /// When running in local (default) mode , handles client logins. | 51 | /// When running in local (default) mode , handles client logins. |
52 | /// </summary> | 52 | /// </summary> |
53 | public class LoginServer : LoginService , IUserServer | 53 | public class LoginServer : LoginService, IUserServer |
54 | { | 54 | { |
55 | private IGridServer m_gridServer; | 55 | private IGridServer m_gridServer; |
56 | private ushort _loginPort = 8080; | 56 | private ushort _loginPort = 8080; |
@@ -66,7 +66,15 @@ namespace OpenSim.UserServer | |||
66 | private int m_simPort; | 66 | private int m_simPort; |
67 | private string m_simAddr; | 67 | private string m_simAddr; |
68 | 68 | ||
69 | public LoginServer(IGridServer gridServer, string simAddr, int simPort , bool useAccounts) | 69 | public LocalUserProfileManager LocalUserManager |
70 | { | ||
71 | get | ||
72 | { | ||
73 | return userManager; | ||
74 | } | ||
75 | } | ||
76 | |||
77 | public LoginServer(IGridServer gridServer, string simAddr, int simPort, bool useAccounts) | ||
70 | { | 78 | { |
71 | m_gridServer = gridServer; | 79 | m_gridServer = gridServer; |
72 | m_simPort = simPort; | 80 | m_simPort = simPort; |
@@ -74,6 +82,14 @@ namespace OpenSim.UserServer | |||
74 | this.userAccounts = useAccounts; | 82 | this.userAccounts = useAccounts; |
75 | } | 83 | } |
76 | 84 | ||
85 | public void Startup() | ||
86 | { | ||
87 | this.InitializeLogin(); | ||
88 | //Thread runLoginProxy = new Thread(new ThreadStart(RunLogin)); | ||
89 | //runLoginProxy.IsBackground = true; | ||
90 | //runLoginProxy.Start(); | ||
91 | } | ||
92 | |||
77 | // InitializeLogin: initialize the login | 93 | // InitializeLogin: initialize the login |
78 | private void InitializeLogin() | 94 | private void InitializeLogin() |
79 | { | 95 | { |
@@ -94,129 +110,124 @@ namespace OpenSim.UserServer | |||
94 | SR.Close(); | 110 | SR.Close(); |
95 | this._mpasswd = EncodePassword("testpass"); | 111 | this._mpasswd = EncodePassword("testpass"); |
96 | 112 | ||
97 | userManager = new LocalUserProfileManager(this.m_gridServer, m_simPort, m_simAddr ); | 113 | userManager = new LocalUserProfileManager(this.m_gridServer, m_simPort, m_simAddr); |
98 | userManager.InitUserProfiles(); | 114 | userManager.InitUserProfiles(); |
99 | userManager.SetKeys("", "", "", "Welcome to OpenSim"); | 115 | userManager.SetKeys("", "", "", "Welcome to OpenSim"); |
100 | 116 | ||
101 | loginServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | 117 | //loginServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); |
102 | loginServer.Bind(new IPEndPoint(remoteAddress, _loginPort)); | 118 | // loginServer.Bind(new IPEndPoint(remoteAddress, _loginPort)); |
103 | loginServer.Listen(1); | 119 | //loginServer.Listen(1); |
104 | } | ||
105 | |||
106 | public void Startup() | ||
107 | { | ||
108 | this.InitializeLogin(); | ||
109 | Thread runLoginProxy = new Thread(new ThreadStart(RunLogin)); | ||
110 | runLoginProxy.IsBackground = true; | ||
111 | runLoginProxy.Start(); | ||
112 | } | ||
113 | |||
114 | private void RunLogin() | ||
115 | { | ||
116 | Console.WriteLine("Starting Login Server"); | ||
117 | try | ||
118 | { | ||
119 | for (; ; ) | ||
120 | { | ||
121 | Socket client = loginServer.Accept(); | ||
122 | IPEndPoint clientEndPoint = (IPEndPoint)client.RemoteEndPoint; | ||
123 | |||
124 | |||
125 | NetworkStream networkStream = new NetworkStream(client); | ||
126 | StreamReader networkReader = new StreamReader(networkStream); | ||
127 | StreamWriter networkWriter = new StreamWriter(networkStream); | ||
128 | |||
129 | try | ||
130 | { | ||
131 | LoginRequest(networkReader, networkWriter); | ||
132 | } | ||
133 | catch (Exception e) | ||
134 | { | ||
135 | Console.WriteLine(e.Message); | ||
136 | } | ||
137 | |||
138 | networkWriter.Close(); | ||
139 | networkReader.Close(); | ||
140 | networkStream.Close(); | ||
141 | |||
142 | client.Close(); | ||
143 | |||
144 | // send any packets queued for injection | ||
145 | |||
146 | } | ||
147 | } | ||
148 | catch (Exception e) | ||
149 | { | ||
150 | Console.WriteLine(e.Message); | ||
151 | Console.WriteLine(e.StackTrace); | ||
152 | } | ||
153 | } | ||
154 | |||
155 | // ProxyLogin: proxy a login request | ||
156 | private void LoginRequest(StreamReader reader, StreamWriter writer) | ||
157 | { | ||
158 | lock (this) | ||
159 | { | ||
160 | string line; | ||
161 | int contentLength = 0; | ||
162 | // read HTTP header | ||
163 | do | ||
164 | { | ||
165 | // read one line of the header | ||
166 | line = reader.ReadLine(); | ||
167 | |||
168 | // check for premature EOF | ||
169 | if (line == null) | ||
170 | throw new Exception("EOF in client HTTP header"); | ||
171 | |||
172 | // look for Content-Length | ||
173 | Match match = (new Regex(@"Content-Length: (\d+)$")).Match(line); | ||
174 | if (match.Success) | ||
175 | contentLength = Convert.ToInt32(match.Groups[1].Captures[0].ToString()); | ||
176 | } while (line != ""); | ||
177 | |||
178 | // read the HTTP body into a buffer | ||
179 | char[] content = new char[contentLength]; | ||
180 | reader.Read(content, 0, contentLength); | ||
181 | |||
182 | if (this.userAccounts) | ||
183 | { | ||
184 | //ask the UserProfile Manager to process the request | ||
185 | string reply = this.userManager.ParseXMLRPC(new String(content)); | ||
186 | // forward the XML-RPC response to the client | ||
187 | writer.WriteLine("HTTP/1.0 200 OK"); | ||
188 | writer.WriteLine("Content-type: text/xml"); | ||
189 | writer.WriteLine(); | ||
190 | writer.WriteLine(reply); | ||
191 | } | ||
192 | else | ||
193 | { | ||
194 | //handle ourselves | ||
195 | XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(new String(content)); | ||
196 | if (request.MethodName == "login_to_simulator") | ||
197 | { | ||
198 | this.ProcessXmlRequest(request, writer); | ||
199 | } | ||
200 | else | ||
201 | { | ||
202 | XmlRpcResponse PresenceErrorResp = new XmlRpcResponse(); | ||
203 | Hashtable PresenceErrorRespData = new Hashtable(); | ||
204 | PresenceErrorRespData["reason"] = "XmlRequest"; ; | ||
205 | PresenceErrorRespData["message"] = "Unknown Rpc request"; | ||
206 | PresenceErrorRespData["login"] = "false"; | ||
207 | PresenceErrorResp.Value = PresenceErrorRespData; | ||
208 | string reply = Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(PresenceErrorResp), " encoding=\"utf-16\"", ""); | ||
209 | writer.WriteLine("HTTP/1.0 200 OK"); | ||
210 | writer.WriteLine("Content-type: text/xml"); | ||
211 | writer.WriteLine(); | ||
212 | writer.WriteLine(reply); | ||
213 | } | ||
214 | } | ||
215 | } | ||
216 | } | 120 | } |
217 | 121 | ||
218 | public bool ProcessXmlRequest(XmlRpcRequest request, StreamWriter writer) | 122 | /* private void RunLogin() |
123 | { | ||
124 | Console.WriteLine("Starting Login Server"); | ||
125 | try | ||
126 | { | ||
127 | for (; ; ) | ||
128 | { | ||
129 | Socket client = loginServer.Accept(); | ||
130 | IPEndPoint clientEndPoint = (IPEndPoint)client.RemoteEndPoint; | ||
131 | |||
132 | |||
133 | NetworkStream networkStream = new NetworkStream(client); | ||
134 | StreamReader networkReader = new StreamReader(networkStream); | ||
135 | StreamWriter networkWriter = new StreamWriter(networkStream); | ||
136 | |||
137 | try | ||
138 | { | ||
139 | LoginRequest(networkReader, networkWriter); | ||
140 | } | ||
141 | catch (Exception e) | ||
142 | { | ||
143 | Console.WriteLine(e.Message); | ||
144 | } | ||
145 | |||
146 | networkWriter.Close(); | ||
147 | networkReader.Close(); | ||
148 | networkStream.Close(); | ||
149 | |||
150 | client.Close(); | ||
151 | |||
152 | // send any packets queued for injection | ||
153 | |||
154 | } | ||
155 | } | ||
156 | catch (Exception e) | ||
157 | { | ||
158 | Console.WriteLine(e.Message); | ||
159 | Console.WriteLine(e.StackTrace); | ||
160 | } | ||
161 | } | ||
162 | |||
163 | // ProxyLogin: proxy a login request | ||
164 | private void LoginRequest(StreamReader reader, StreamWriter writer) | ||
165 | { | ||
166 | lock (this) | ||
167 | { | ||
168 | string line; | ||
169 | int contentLength = 0; | ||
170 | // read HTTP header | ||
171 | do | ||
172 | { | ||
173 | // read one line of the header | ||
174 | line = reader.ReadLine(); | ||
175 | |||
176 | // check for premature EOF | ||
177 | if (line == null) | ||
178 | throw new Exception("EOF in client HTTP header"); | ||
179 | |||
180 | // look for Content-Length | ||
181 | Match match = (new Regex(@"Content-Length: (\d+)$")).Match(line); | ||
182 | if (match.Success) | ||
183 | contentLength = Convert.ToInt32(match.Groups[1].Captures[0].ToString()); | ||
184 | } while (line != ""); | ||
185 | |||
186 | // read the HTTP body into a buffer | ||
187 | char[] content = new char[contentLength]; | ||
188 | reader.Read(content, 0, contentLength); | ||
189 | |||
190 | if (this.userAccounts) | ||
191 | { | ||
192 | //ask the UserProfile Manager to process the request | ||
193 | string reply = this.userManager.ParseXMLRPC(new String(content)); | ||
194 | // forward the XML-RPC response to the client | ||
195 | writer.WriteLine("HTTP/1.0 200 OK"); | ||
196 | writer.WriteLine("Content-type: text/xml"); | ||
197 | writer.WriteLine(); | ||
198 | writer.WriteLine(reply); | ||
199 | } | ||
200 | else | ||
201 | { | ||
202 | //handle ourselves | ||
203 | XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(new String(content)); | ||
204 | if (request.MethodName == "login_to_simulator") | ||
205 | { | ||
206 | this.ProcessXmlRequest(request, writer); | ||
207 | } | ||
208 | else | ||
209 | { | ||
210 | XmlRpcResponse PresenceErrorResp = new XmlRpcResponse(); | ||
211 | Hashtable PresenceErrorRespData = new Hashtable(); | ||
212 | PresenceErrorRespData["reason"] = "XmlRequest"; ; | ||
213 | PresenceErrorRespData["message"] = "Unknown Rpc request"; | ||
214 | PresenceErrorRespData["login"] = "false"; | ||
215 | PresenceErrorResp.Value = PresenceErrorRespData; | ||
216 | string reply = Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(PresenceErrorResp), " encoding=\"utf-16\"", ""); | ||
217 | writer.WriteLine("HTTP/1.0 200 OK"); | ||
218 | writer.WriteLine("Content-type: text/xml"); | ||
219 | writer.WriteLine(); | ||
220 | writer.WriteLine(reply); | ||
221 | } | ||
222 | } | ||
223 | } | ||
224 | } | ||
225 | */ | ||
226 | //public bool ProcessXmlRequest(XmlRpcRequest request, StreamWriter writer) | ||
227 | |||
228 | public XmlRpcResponse XmlRpcLoginMethod(XmlRpcRequest request) | ||
219 | { | 229 | { |
230 | Console.WriteLine("login attempt"); | ||
220 | Hashtable requestData = (Hashtable)request.Params[0]; | 231 | Hashtable requestData = (Hashtable)request.Params[0]; |
221 | string first; | 232 | string first; |
222 | string last; | 233 | string last; |
@@ -224,6 +235,8 @@ namespace OpenSim.UserServer | |||
224 | LLUUID Agent; | 235 | LLUUID Agent; |
225 | LLUUID Session; | 236 | LLUUID Session; |
226 | 237 | ||
238 | XmlRpcResponse response = new XmlRpcResponse(); | ||
239 | |||
227 | //get login name | 240 | //get login name |
228 | if (requestData.Contains("first")) | 241 | if (requestData.Contains("first")) |
229 | { | 242 | { |
@@ -254,18 +267,24 @@ namespace OpenSim.UserServer | |||
254 | 267 | ||
255 | if (!Authenticate(first, last, passwd)) | 268 | if (!Authenticate(first, last, passwd)) |
256 | { | 269 | { |
257 | XmlRpcResponse PresenceErrorResp = new XmlRpcResponse(); | 270 | /* XmlRpcResponse PresenceErrorResp = new XmlRpcResponse(); |
258 | Hashtable PresenceErrorRespData = new Hashtable(); | 271 | Hashtable PresenceErrorRespData = new Hashtable(); |
259 | PresenceErrorRespData["reason"] = "key"; ; | 272 | PresenceErrorRespData["reason"] = "key"; ; |
260 | PresenceErrorRespData["message"] = "You have entered an invalid name/password combination. Check Caps/lock."; | 273 | PresenceErrorRespData["message"] = "You have entered an invalid name/password combination. Check Caps/lock."; |
261 | PresenceErrorRespData["login"] = "false"; | 274 | PresenceErrorRespData["login"] = "false"; |
262 | PresenceErrorResp.Value = PresenceErrorRespData; | 275 | PresenceErrorResp.Value = PresenceErrorRespData; |
263 | string reply = Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(PresenceErrorResp), " encoding=\"utf-16\"", ""); | 276 | string reply = Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(PresenceErrorResp), " encoding=\"utf-16\"", ""); |
264 | writer.WriteLine("HTTP/1.0 200 OK"); | 277 | writer.WriteLine("HTTP/1.0 200 OK"); |
265 | writer.WriteLine("Content-type: text/xml"); | 278 | writer.WriteLine("Content-type: text/xml"); |
266 | writer.WriteLine(); | 279 | writer.WriteLine(); |
267 | writer.WriteLine(reply); | 280 | writer.WriteLine(reply); |
268 | return false; | 281 | return false;*/ |
282 | |||
283 | Hashtable loginError = new Hashtable(); | ||
284 | loginError["reason"] = "key"; ; | ||
285 | loginError["message"] = "You have entered an invalid name/password combination. Check Caps/lock."; | ||
286 | loginError["login"] = "false"; | ||
287 | response.Value = loginError; | ||
269 | } | 288 | } |
270 | 289 | ||
271 | NumClients++; | 290 | NumClients++; |
@@ -291,15 +310,15 @@ namespace OpenSim.UserServer | |||
291 | ArrayList GlobalTextures = new ArrayList(); | 310 | ArrayList GlobalTextures = new ArrayList(); |
292 | GlobalTextures.Add(GlobalT); | 311 | GlobalTextures.Add(GlobalT); |
293 | 312 | ||
294 | XmlRpcResponse response = (XmlRpcResponse)(new XmlRpcResponseDeserializer()).Deserialize(this._defaultResponse); | 313 | response = (XmlRpcResponse)(new XmlRpcResponseDeserializer()).Deserialize(this._defaultResponse); |
295 | Hashtable responseData = (Hashtable)response.Value; | 314 | Hashtable responseData = (Hashtable)response.Value; |
296 | 315 | ||
297 | responseData["sim_port"] = m_simPort; | 316 | responseData["sim_port"] = m_simPort; |
298 | responseData["sim_ip"] = m_simAddr; | 317 | responseData["sim_ip"] = m_simAddr; |
299 | responseData["agent_id"] = Agent.ToStringHyphenated(); | 318 | responseData["agent_id"] = Agent.ToStringHyphenated(); |
300 | responseData["session_id"] = Session.ToStringHyphenated(); | 319 | responseData["session_id"] = Session.ToStringHyphenated(); |
301 | responseData["secure_session_id"]= secureSess.ToStringHyphenated(); | 320 | responseData["secure_session_id"] = secureSess.ToStringHyphenated(); |
302 | responseData["circuit_code"] = (Int32)(Util.RandomClass.Next()); | 321 | responseData["circuit_code"] = (Int32)(Util.RandomClass.Next()); |
303 | responseData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; | 322 | responseData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; |
304 | responseData["login-flags"] = LoginFlags; | 323 | responseData["login-flags"] = LoginFlags; |
305 | responseData["global-textures"] = GlobalTextures; | 324 | responseData["global-textures"] = GlobalTextures; |
@@ -337,16 +356,16 @@ namespace OpenSim.UserServer | |||
337 | ((LocalGridBase)m_gridServer).AddNewSession(_login); | 356 | ((LocalGridBase)m_gridServer).AddNewSession(_login); |
338 | } | 357 | } |
339 | 358 | ||
340 | // forward the XML-RPC response to the client | 359 | /* // forward the XML-RPC response to the client |
341 | writer.WriteLine("HTTP/1.0 200 OK"); | 360 | writer.WriteLine("HTTP/1.0 200 OK"); |
342 | writer.WriteLine("Content-type: text/xml"); | 361 | writer.WriteLine("Content-type: text/xml"); |
343 | writer.WriteLine(); | 362 | writer.WriteLine(); |
344 | 363 | ||
345 | XmlTextWriter responseWriter = new XmlTextWriter(writer); | 364 | XmlTextWriter responseWriter = new XmlTextWriter(writer); |
346 | XmlRpcResponseSerializer.Singleton.Serialize(responseWriter, response); | 365 | XmlRpcResponseSerializer.Singleton.Serialize(responseWriter, response); |
347 | responseWriter.Close(); | 366 | responseWriter.Close();*/ |
348 | 367 | ||
349 | return true; | 368 | return response; |
350 | } | 369 | } |
351 | 370 | ||
352 | protected virtual void CustomiseLoginResponse(Hashtable responseData, string first, string last) | 371 | protected virtual void CustomiseLoginResponse(Hashtable responseData, string first, string last) |