From 9cd64931d6067155c0214c62673f4196e251e7f7 Mon Sep 17 00:00:00 2001
From: MW
Date: Mon, 13 Aug 2007 16:24:12 +0000
Subject: oops , guess I should include the new files next time
---
OpenSim/Framework/UserManager/LoginService.cs | 281 +++++++++++++++++++++
OpenSim/Grid/UserServer/UserLoginService.cs | 80 ++++++
.../ClientStack/ClientView.ProcessPackets.cs | 2 -
.../Communications/Local/LocalLoginService.cs | 113 +++++++++
4 files changed, 474 insertions(+), 2 deletions(-)
create mode 100644 OpenSim/Framework/UserManager/LoginService.cs
create mode 100644 OpenSim/Grid/UserServer/UserLoginService.cs
create mode 100644 OpenSim/Region/Communications/Local/LocalLoginService.cs
diff --git a/OpenSim/Framework/UserManager/LoginService.cs b/OpenSim/Framework/UserManager/LoginService.cs
new file mode 100644
index 0000000..a26a0c4
--- /dev/null
+++ b/OpenSim/Framework/UserManager/LoginService.cs
@@ -0,0 +1,281 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Security.Cryptography;
+using libsecondlife;
+using Nwc.XmlRpc;
+using OpenSim.Framework.Console;
+using OpenSim.Framework.Data;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Inventory;
+using OpenSim.Framework.Utilities;
+
+using OpenSim.Framework.Configuration;
+using InventoryFolder = OpenSim.Framework.Inventory.InventoryFolder;
+
+namespace OpenSim.Framework.UserManagement
+{
+ public class LoginService
+ {
+ protected string m_welcomeMessage = "Welcome to OpenSim";
+ protected UserManagerBase m_userManager = null;
+
+ public LoginService(UserManagerBase userManager, string welcomeMess)
+ {
+ m_userManager = userManager;
+ if (welcomeMess != "")
+ {
+ m_welcomeMessage = welcomeMess;
+ }
+ }
+
+ ///
+ /// Main user login function
+ ///
+ /// The XMLRPC request
+ /// The response to send
+ public XmlRpcResponse XmlRpcLoginMethod(XmlRpcRequest request)
+ {
+
+ System.Console.WriteLine("Attempting login now...");
+ XmlRpcResponse response = new XmlRpcResponse();
+ Hashtable requestData = (Hashtable)request.Params[0];
+
+ bool GoodXML = (requestData.Contains("first") && requestData.Contains("last") && requestData.Contains("passwd"));
+ bool GoodLogin = false;
+ string firstname = "";
+ string lastname = "";
+ string passwd = "";
+
+ UserProfileData userProfile;
+ LoginResponse logResponse = new LoginResponse();
+
+ if (GoodXML)
+ {
+ firstname = (string)requestData["first"];
+ lastname = (string)requestData["last"];
+ passwd = (string)requestData["passwd"];
+
+ userProfile = GetTheUser(firstname, lastname);
+ if (userProfile == null)
+ return logResponse.CreateLoginFailedResponse();
+
+ GoodLogin = AuthenticateUser(userProfile, passwd);
+ }
+ else
+ {
+ return logResponse.CreateGridErrorResponse();
+ }
+
+ if (!GoodLogin)
+ {
+ return logResponse.CreateLoginFailedResponse();
+ }
+ else
+ {
+ // If we already have a session...
+ if (userProfile.currentAgent != null && userProfile.currentAgent.agentOnline)
+ {
+ // Reject the login
+ return logResponse.CreateAlreadyLoggedInResponse();
+ }
+ // Otherwise...
+ // Create a new agent session
+ CreateAgent(userProfile, request);
+
+ try
+ {
+ LLUUID agentID = userProfile.UUID;
+
+ // Inventory Library Section
+ AgentInventory userInventory = this.GetUsersInventory(agentID);
+ ArrayList AgentInventoryArray = this.CreateInventoryArray(userInventory);
+
+ Hashtable InventoryRootHash = new Hashtable();
+ InventoryRootHash["folder_id"] = userInventory.InventoryRoot.FolderID.ToStringHyphenated();
+ ArrayList InventoryRoot = new ArrayList();
+ InventoryRoot.Add(InventoryRootHash);
+ userProfile.rootInventoryFolderID = userInventory.InventoryRoot.FolderID;
+
+ // Circuit Code
+ uint circode = (uint)(Util.RandomClass.Next());
+
+ logResponse.Lastname = userProfile.surname;
+ logResponse.Firstname = userProfile.username;
+ logResponse.AgentID = agentID.ToStringHyphenated();
+ logResponse.SessionID = userProfile.currentAgent.sessionID.ToStringHyphenated();
+ logResponse.SecureSessionID = userProfile.currentAgent.secureSessionID.ToStringHyphenated();
+ logResponse.InventoryRoot = InventoryRoot;
+ logResponse.InventorySkeleton = AgentInventoryArray;
+ logResponse.InventoryLibrary = this.GetInventoryLibrary();
+ logResponse.InventoryLibraryOwner = this.GetLibraryOwner();
+ logResponse.CircuitCode = (Int32)circode;
+ //logResponse.RegionX = 0; //overwritten
+ //logResponse.RegionY = 0; //overwritten
+ logResponse.Home = "!!null temporary value {home}!!"; // Overwritten
+ //logResponse.LookAt = "\n[r" + TheUser.homeLookAt.X.ToString() + ",r" + TheUser.homeLookAt.Y.ToString() + ",r" + TheUser.homeLookAt.Z.ToString() + "]\n";
+ //logResponse.SimAddress = "127.0.0.1"; //overwritten
+ //logResponse.SimPort = 0; //overwritten
+ logResponse.Message = this.GetMessage();
+
+ try
+ {
+ this.CustomiseResponse(logResponse, userProfile);
+ }
+ catch (Exception e)
+ {
+ System.Console.WriteLine(e.ToString());
+ return logResponse.CreateDeadRegionResponse();
+ //return logResponse.ToXmlRpcResponse();
+ }
+ CommitAgent(ref userProfile);
+ return logResponse.ToXmlRpcResponse();
+
+ }
+
+ catch (Exception E)
+ {
+ System.Console.WriteLine(E.ToString());
+ }
+ //}
+ }
+ return response;
+
+ }
+
+ ///
+ /// Customises the login response and fills in missing values.
+ ///
+ /// The existing response
+ /// The user profile
+ public virtual void CustomiseResponse(LoginResponse response, UserProfileData theUser)
+ {
+ }
+
+ ///
+ /// Saves a target agent to the database
+ ///
+ /// The users profile
+ /// Successful?
+ public bool CommitAgent(ref UserProfileData profile)
+ {
+ // Saves the agent to database
+ return true;
+ }
+
+
+ ///
+ /// Checks a user against it's password hash
+ ///
+ /// The users profile
+ /// The supplied password
+ /// Authenticated?
+ public virtual bool AuthenticateUser(UserProfileData profile, string password)
+ {
+ MainLog.Instance.Verbose(
+ "Authenticating " + profile.username + " " + profile.surname);
+
+ password = password.Remove(0, 3); //remove $1$
+
+ string s = Util.Md5Hash(password + ":" + profile.passwordSalt);
+
+ return profile.passwordHash.Equals(s.ToString(), StringComparison.InvariantCultureIgnoreCase);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void CreateAgent(UserProfileData profile, XmlRpcRequest request)
+ {
+ this.m_userManager.CreateAgent(profile, request);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public virtual UserProfileData GetTheUser(string firstname, string lastname)
+ {
+ return this.m_userManager.getUserProfile(firstname, lastname);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public virtual string GetMessage()
+ {
+ return m_welcomeMessage;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ protected virtual ArrayList GetInventoryLibrary()
+ {
+ //return new ArrayList();
+ Hashtable TempHash = new Hashtable();
+ TempHash["name"] = "OpenSim Library";
+ TempHash["parent_id"] = LLUUID.Zero.ToStringHyphenated();
+ TempHash["version"] = "1";
+ TempHash["type_default"] = "-1";
+ TempHash["folder_id"] = "00000112-000f-0000-0000-000100bba000";
+ ArrayList temp = new ArrayList();
+ temp.Add(TempHash);
+
+ TempHash = new Hashtable();
+ TempHash["name"] = "Texture Library";
+ TempHash["parent_id"] = "00000112-000f-0000-0000-000100bba000";
+ TempHash["version"] = "1";
+ TempHash["type_default"] = "-1";
+ TempHash["folder_id"] = "00000112-000f-0000-0000-000100bba001";
+ temp.Add(TempHash);
+ return temp;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ protected virtual ArrayList GetLibraryOwner()
+ {
+ //for now create random inventory library owner
+ Hashtable TempHash = new Hashtable();
+ TempHash["agent_id"] = "11111111-1111-0000-0000-000100bba000";
+ ArrayList inventoryLibOwner = new ArrayList();
+ inventoryLibOwner.Add(TempHash);
+ return inventoryLibOwner;
+ }
+
+ protected virtual AgentInventory GetUsersInventory(LLUUID agentID)
+ {
+ AgentInventory userInventory = new AgentInventory();
+ userInventory.CreateRootFolder(agentID, false);
+
+ return userInventory;
+ }
+
+ protected virtual ArrayList CreateInventoryArray(AgentInventory userInventory)
+ {
+ ArrayList AgentInventoryArray = new ArrayList();
+ Hashtable TempHash;
+ foreach (InventoryFolder InvFolder in userInventory.InventoryFolders.Values)
+ {
+ TempHash = new Hashtable();
+ TempHash["name"] = InvFolder.FolderName;
+ TempHash["parent_id"] = InvFolder.ParentID.ToStringHyphenated();
+ TempHash["version"] = (Int32)InvFolder.Version;
+ TempHash["type_default"] = (Int32)InvFolder.DefaultType;
+ TempHash["folder_id"] = InvFolder.FolderID.ToStringHyphenated();
+ AgentInventoryArray.Add(TempHash);
+ }
+ return AgentInventoryArray;
+ }
+ }
+}
diff --git a/OpenSim/Grid/UserServer/UserLoginService.cs b/OpenSim/Grid/UserServer/UserLoginService.cs
new file mode 100644
index 0000000..57652b0
--- /dev/null
+++ b/OpenSim/Grid/UserServer/UserLoginService.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Collections;
+using System.Net;
+using Nwc.XmlRpc;
+using OpenSim.Framework.Data;
+using OpenSim.Framework.UserManagement;
+using OpenSim.Framework.Utilities;
+using OpenSim.Framework.Configuration;
+
+namespace OpenSim.Grid.UserServer
+{
+ public class UserLoginService : LoginService
+ {
+ public UserConfig m_config;
+
+ public UserLoginService(UserManagerBase userManager, UserConfig config, string welcomeMess)
+ : base(userManager, welcomeMess)
+ {
+ m_config = config;
+ }
+
+ ///
+ /// Customises the login response and fills in missing values.
+ ///
+ /// The existing response
+ /// The user profile
+ public override void CustomiseResponse(LoginResponse response, UserProfileData theUser)
+ {
+ // Load information from the gridserver
+ SimProfileData SimInfo = new SimProfileData();
+ SimInfo = SimInfo.RequestSimProfileData(theUser.currentAgent.currentHandle, m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey);
+
+ // Customise the response
+ // Home Location
+ response.Home = "{'region_handle':[r" + (SimInfo.regionLocX * 256).ToString() + ",r" + (SimInfo.regionLocY * 256).ToString() + "], " +
+ "'position':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "], " +
+ "'look_at':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "]}";
+
+ // Destination
+ Console.WriteLine("CUSTOMISERESPONSE: Region X: " + SimInfo.regionLocX + "; Region Y: " + SimInfo.regionLocY);
+ response.SimAddress = Util.GetHostFromDNS(SimInfo.serverIP).ToString();
+ response.SimPort = (Int32)SimInfo.serverPort;
+ response.RegionX = SimInfo.regionLocX;
+ response.RegionY = SimInfo.regionLocY;
+
+ //Not sure if the + "/CAPS/" should in fact be +"CAPS/" depending if there is already a / as part of httpServerURI
+ string capsPath = Util.GetRandomCapsPath();
+ response.SeedCapability = SimInfo.httpServerURI + "CAPS/" + capsPath + "0000/";
+
+ // Notify the target of an incoming user
+ Console.WriteLine("Notifying " + SimInfo.regionName + " (" + SimInfo.serverURI + ")");
+
+ // Prepare notification
+ Hashtable SimParams = new Hashtable();
+ SimParams["session_id"] = theUser.currentAgent.sessionID.ToString();
+ SimParams["secure_session_id"] = theUser.currentAgent.secureSessionID.ToString();
+ SimParams["firstname"] = theUser.username;
+ SimParams["lastname"] = theUser.surname;
+ SimParams["agent_id"] = theUser.UUID.ToString();
+ SimParams["circuit_code"] = (Int32)Convert.ToUInt32(response.CircuitCode);
+ SimParams["startpos_x"] = theUser.currentAgent.currentPos.X.ToString();
+ SimParams["startpos_y"] = theUser.currentAgent.currentPos.Y.ToString();
+ SimParams["startpos_z"] = theUser.currentAgent.currentPos.Z.ToString();
+ SimParams["regionhandle"] = theUser.currentAgent.currentHandle.ToString();
+ SimParams["caps_path"] = capsPath;
+ ArrayList SendParams = new ArrayList();
+ SendParams.Add(SimParams);
+
+ // Update agent with target sim
+ theUser.currentAgent.currentRegion = SimInfo.UUID;
+ theUser.currentAgent.currentHandle = SimInfo.regionHandle;
+
+ System.Console.WriteLine("Informing region --> " + SimInfo.httpServerURI);
+ // Send
+ XmlRpcRequest GridReq = new XmlRpcRequest("expect_user", SendParams);
+ XmlRpcResponse GridResp = GridReq.Send(SimInfo.httpServerURI, 3000);
+ }
+ }
+}
+
diff --git a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
index 401f500..58d4cfe 100644
--- a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
+++ b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
@@ -443,8 +443,6 @@ namespace OpenSim.Region.ClientStack
case PacketType.UpdateTaskInventory:
// Console.WriteLine(Pack.ToString());
UpdateTaskInventoryPacket updatetask = (UpdateTaskInventoryPacket)Pack;
- AgentInventory myinventory = this.m_inventoryCache.GetAgentsInventory(this.AgentID);
-
break;
case PacketType.MapLayerRequest:
this.RequestMapLayer();
diff --git a/OpenSim/Region/Communications/Local/LocalLoginService.cs b/OpenSim/Region/Communications/Local/LocalLoginService.cs
new file mode 100644
index 0000000..19a1e8c
--- /dev/null
+++ b/OpenSim/Region/Communications/Local/LocalLoginService.cs
@@ -0,0 +1,113 @@
+using System;
+using libsecondlife;
+using OpenSim.Framework.Communications;
+using OpenSim.Framework.Data;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.UserManagement;
+using OpenSim.Framework.Utilities;
+
+namespace OpenSim.Region.Communications.Local
+{
+ public class LocalLoginService : LoginService
+ {
+ private CommunicationsLocal m_Parent;
+
+ private NetworkServersInfo serversInfo;
+ private uint defaultHomeX;
+ private uint defaultHomeY;
+ private bool authUsers = false;
+
+ public LocalLoginService(UserManagerBase userManager, string welcomeMess, CommunicationsLocal parent, NetworkServersInfo serversInfo, bool authenticate)
+ : base(userManager, welcomeMess)
+ {
+ m_Parent = parent;
+ this.serversInfo = serversInfo;
+ defaultHomeX = this.serversInfo.DefaultHomeLocX;
+ defaultHomeY = this.serversInfo.DefaultHomeLocY;
+ this.authUsers = authenticate;
+ }
+
+
+ public override UserProfileData GetTheUser(string firstname, string lastname)
+ {
+ UserProfileData profile = this.m_userManager.getUserProfile(firstname, lastname);
+ if (profile != null)
+ {
+
+ return profile;
+ }
+
+ if (!authUsers)
+ {
+ //no current user account so make one
+ Console.WriteLine("No User account found so creating a new one ");
+ this.m_userManager.AddUserProfile(firstname, lastname, "test", defaultHomeX, defaultHomeY);
+
+ profile = this.m_userManager.getUserProfile(firstname, lastname);
+
+ return profile;
+ }
+ return null;
+ }
+
+ public override bool AuthenticateUser(UserProfileData profile, string password)
+ {
+ if (!authUsers)
+ {
+ //for now we will accept any password in sandbox mode
+ Console.WriteLine("authorising user");
+ return true;
+ }
+ else
+ {
+ Console.WriteLine("Authenticating " + profile.username + " " + profile.surname);
+
+ password = password.Remove(0, 3); //remove $1$
+
+ string s = Util.Md5Hash(password + ":" + profile.passwordSalt);
+
+ return profile.passwordHash.Equals(s.ToString(), StringComparison.InvariantCultureIgnoreCase);
+ }
+ }
+
+ public override void CustomiseResponse(LoginResponse response, UserProfileData theUser)
+ {
+ ulong currentRegion = theUser.currentAgent.currentHandle;
+ RegionInfo reg = m_Parent.GridServer.RequestNeighbourInfo(currentRegion);
+
+ if (reg != null)
+ {
+ response.Home = "{'region_handle':[r" + (reg.RegionLocX * 256).ToString() + ",r" + (reg.RegionLocY * 256).ToString() + "], " +
+ "'position':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "], " +
+ "'look_at':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "]}";
+ string capsPath = Util.GetRandomCapsPath();
+ response.SimAddress = reg.ExternalEndPoint.Address.ToString();
+ response.SimPort = (Int32)reg.ExternalEndPoint.Port;
+ response.RegionX = reg.RegionLocX;
+ response.RegionY = reg.RegionLocY;
+
+ //following port needs changing as we don't want a http listener for every region (or do we?)
+ response.SeedCapability = "http://" + reg.ExternalHostName + ":" + this.serversInfo.HttpListenerPort.ToString() + "/CAPS/" + capsPath + "0000/";
+ theUser.currentAgent.currentRegion = reg.SimUUID;
+ theUser.currentAgent.currentHandle = reg.RegionHandle;
+
+ Login _login = new Login();
+ //copy data to login object
+ _login.First = response.Firstname;
+ _login.Last = response.Lastname;
+ _login.Agent = response.AgentID;
+ _login.Session = response.SessionID;
+ _login.SecureSession = response.SecureSessionID;
+ _login.CircuitCode = (uint)response.CircuitCode;
+ _login.CapsPath = capsPath;
+
+ m_Parent.InformRegionOfLogin(currentRegion, _login);
+ }
+ else
+ {
+ Console.WriteLine("not found region " + currentRegion);
+ }
+
+ }
+ }
+}
--
cgit v1.1