aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Client/Linden/LLProxyLoginModule.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Client/Linden/LLProxyLoginModule.cs184
1 files changed, 103 insertions, 81 deletions
diff --git a/OpenSim/Client/Linden/LLProxyLoginModule.cs b/OpenSim/Client/Linden/LLProxyLoginModule.cs
index ccd38d4..f9cb3a9 100644
--- a/OpenSim/Client/Linden/LLProxyLoginModule.cs
+++ b/OpenSim/Client/Linden/LLProxyLoginModule.cs
@@ -148,8 +148,8 @@ namespace OpenSim.Client.Linden
148 protected void AddHttpHandlers() 148 protected void AddHttpHandlers()
149 { 149 {
150 //we will add our handlers to the first scene we received, as all scenes share a http server. But will this ever change? 150 //we will add our handlers to the first scene we received, as all scenes share a http server. But will this ever change?
151 MainServer.Instance.AddXmlRPCHandler("expect_user", ExpectUser); 151 MainServer.Instance.AddXmlRPCHandler("expect_user", ExpectUser, false);
152 MainServer.Instance.AddXmlRPCHandler("logoff_user", LogOffUser); 152 MainServer.Instance.AddXmlRPCHandler("logoff_user", LogOffUser, false);
153 } 153 }
154 154
155 protected void AddScene(Scene scene) 155 protected void AddScene(Scene scene)
@@ -182,104 +182,126 @@ namespace OpenSim.Client.Linden
182 /// <returns></returns> 182 /// <returns></returns>
183 public XmlRpcResponse ExpectUser(XmlRpcRequest request, IPEndPoint remoteClient) 183 public XmlRpcResponse ExpectUser(XmlRpcRequest request, IPEndPoint remoteClient)
184 { 184 {
185 Hashtable requestData = (Hashtable)request.Params[0];
186 AgentCircuitData agentData = new AgentCircuitData();
187 agentData.SessionID = new UUID((string)requestData["session_id"]);
188 agentData.SecureSessionID = new UUID((string)requestData["secure_session_id"]);
189 agentData.firstname = (string)requestData["firstname"];
190 agentData.lastname = (string)requestData["lastname"];
191 agentData.AgentID = new UUID((string)requestData["agent_id"]);
192 agentData.circuitcode = Convert.ToUInt32(requestData["circuit_code"]);
193 agentData.CapsPath = (string)requestData["caps_path"];
194 ulong regionHandle = Convert.ToUInt64((string)requestData["regionhandle"]);
195
196 // Appearance
197 if (requestData["appearance"] != null)
198 agentData.Appearance = new AvatarAppearance((Hashtable)requestData["appearance"]);
199
200 m_log.DebugFormat(
201 "[CLIENT]: Told by user service to prepare for a connection from {0} {1} {2}, circuit {3}",
202 agentData.firstname, agentData.lastname, agentData.AgentID, agentData.circuitcode);
203
204 if (requestData.ContainsKey("child_agent") && requestData["child_agent"].Equals("1"))
205 {
206 //m_log.Debug("[CLIENT]: Child agent detected");
207 agentData.child = true;
208 }
209 else
210 {
211 //m_log.Debug("[CLIENT]: Main agent detected");
212 agentData.startpos =
213 new Vector3((float)Convert.ToDecimal((string)requestData["startpos_x"]),
214 (float)Convert.ToDecimal((string)requestData["startpos_y"]),
215 (float)Convert.ToDecimal((string)requestData["startpos_z"]));
216 agentData.child = false;
217 }
218
219 XmlRpcResponse resp = new XmlRpcResponse(); 185 XmlRpcResponse resp = new XmlRpcResponse();
220 186
221 if (!RegionLoginsEnabled) 187 try
222 { 188 {
223 m_log.InfoFormat( 189 ulong regionHandle = 0;
224 "[CLIENT]: Denying access for user {0} {1} because region login is currently disabled", 190 Hashtable requestData = (Hashtable)request.Params[0];
225 agentData.firstname, agentData.lastname); 191 AgentCircuitData agentData = new AgentCircuitData();
192 if (requestData.ContainsKey("session_id"))
193 agentData.SessionID = new UUID((string)requestData["session_id"]);
194 if (requestData.ContainsKey("secure_session_id"))
195 agentData.SecureSessionID = new UUID((string)requestData["secure_session_id"]);
196 if (requestData.ContainsKey("firstname"))
197 agentData.firstname = (string)requestData["firstname"];
198 if (requestData.ContainsKey("lastname"))
199 agentData.lastname = (string)requestData["lastname"];
200 if (requestData.ContainsKey("agent_id"))
201 agentData.AgentID = new UUID((string)requestData["agent_id"]);
202 if (requestData.ContainsKey("circuit_code"))
203 agentData.circuitcode = Convert.ToUInt32(requestData["circuit_code"]);
204 if (requestData.ContainsKey("caps_path"))
205 agentData.CapsPath = (string)requestData["caps_path"];
206 if (requestData.ContainsKey("regionhandle"))
207 regionHandle = Convert.ToUInt64((string)requestData["regionhandle"]);
208 else
209 m_log.Warn("[CLIENT]: request from login server did not contain regionhandle");
226 210
227 Hashtable respdata = new Hashtable(); 211 // Appearance
228 respdata["success"] = "FALSE"; 212 if (requestData.ContainsKey("appearance"))
229 respdata["reason"] = "region login currently disabled"; 213 agentData.Appearance = new AvatarAppearance((Hashtable)requestData["appearance"]);
230 resp.Value = respdata;
231 }
232 else
233 {
234 bool success = false;
235 string denyMess = "";
236 214
237 Scene scene; 215 m_log.DebugFormat(
238 if (TryGetRegion(regionHandle, out scene)) 216 "[CLIENT]: Told by user service to prepare for a connection from {0} {1} {2}, circuit {3}",
239 { 217 agentData.firstname, agentData.lastname, agentData.AgentID, agentData.circuitcode);
240 if (scene.RegionInfo.EstateSettings.IsBanned(agentData.AgentID))
241 {
242 denyMess = "User is banned from this region";
243 m_log.InfoFormat(
244 "[CLIENT]: Denying access for user {0} {1} because user is banned",
245 agentData.firstname, agentData.lastname);
246 }
247 else
248 {
249 string reason;
250 if (scene.NewUserConnection(agentData, out reason))
251 {
252 success = true;
253 }
254 else
255 {
256 denyMess = String.Format("Login refused by region: {0}", reason);
257 m_log.InfoFormat(
258 "[CLIENT]: Denying access for user {0} {1} because user connection was refused by the region",
259 agentData.firstname, agentData.lastname);
260 }
261 }
262 218
219 if (requestData.ContainsKey("child_agent") && requestData["child_agent"].Equals("1"))
220 {
221 //m_log.Debug("[CLIENT]: Child agent detected");
222 agentData.child = true;
263 } 223 }
264 else 224 else
265 { 225 {
266 denyMess = "Region not found"; 226 //m_log.Debug("[CLIENT]: Main agent detected");
227 agentData.startpos =
228 new Vector3((float)Convert.ToDecimal((string)requestData["startpos_x"]),
229 (float)Convert.ToDecimal((string)requestData["startpos_y"]),
230 (float)Convert.ToDecimal((string)requestData["startpos_z"]));
231 agentData.child = false;
267 } 232 }
268 233
269 if (success) 234 if (!RegionLoginsEnabled)
270 { 235 {
236 m_log.InfoFormat(
237 "[CLIENT]: Denying access for user {0} {1} because region login is currently disabled",
238 agentData.firstname, agentData.lastname);
239
271 Hashtable respdata = new Hashtable(); 240 Hashtable respdata = new Hashtable();
272 respdata["success"] = "TRUE"; 241 respdata["success"] = "FALSE";
242 respdata["reason"] = "region login currently disabled";
273 resp.Value = respdata; 243 resp.Value = respdata;
274 } 244 }
275 else 245 else
276 { 246 {
277 Hashtable respdata = new Hashtable(); 247 bool success = false;
278 respdata["success"] = "FALSE"; 248 string denyMess = "";
279 respdata["reason"] = denyMess; 249
280 resp.Value = respdata; 250 Scene scene;
251 if (TryGetRegion(regionHandle, out scene))
252 {
253 if (scene.RegionInfo.EstateSettings.IsBanned(agentData.AgentID))
254 {
255 denyMess = "User is banned from this region";
256 m_log.InfoFormat(
257 "[CLIENT]: Denying access for user {0} {1} because user is banned",
258 agentData.firstname, agentData.lastname);
259 }
260 else
261 {
262 string reason;
263 if (scene.NewUserConnection(agentData, out reason))
264 {
265 success = true;
266 }
267 else
268 {
269 denyMess = String.Format("Login refused by region: {0}", reason);
270 m_log.InfoFormat(
271 "[CLIENT]: Denying access for user {0} {1} because user connection was refused by the region",
272 agentData.firstname, agentData.lastname);
273 }
274 }
275
276 }
277 else
278 {
279 denyMess = "Region not found";
280 }
281
282 if (success)
283 {
284 Hashtable respdata = new Hashtable();
285 respdata["success"] = "TRUE";
286 resp.Value = respdata;
287 }
288 else
289 {
290 Hashtable respdata = new Hashtable();
291 respdata["success"] = "FALSE";
292 respdata["reason"] = denyMess;
293 resp.Value = respdata;
294 }
281 } 295 }
282 } 296 }
297 catch (Exception e)
298 {
299 m_log.WarnFormat("[CLIENT]: Unable to receive user. Reason: {0}", e);
300 Hashtable respdata = new Hashtable();
301 respdata["success"] = "FALSE";
302 respdata["reason"] = "Exception occurred";
303 resp.Value = respdata;
304 }
283 305
284 return resp; 306 return resp;
285 } 307 }