public LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, UUID scopeID, string clientVersion, string channel, string mac, string id0, IPEndPoint clientIP, Hashtable requestData) { bool success = false; UUID session = UUID.Random(); m_log.InfoFormat("[LLOGIN SERVICE]: Login request for {0} {1} from {2} with user agent {3} starting in {4}", firstName, lastName, clientIP.Address.ToString(), clientVersion, startLocation); try { // // Get the account and check that it exists // UserAccount account = m_UserAccountService.GetUserAccount(scopeID, firstName, lastName); if (account == null) { if (!m_AllowAnonymousLogin) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: user not found"); return LLFailedLoginResponse.UserProblem; } else { account = new UserAccount(UUID.Zero, firstName, lastName, ""); m_UserAccountService.StoreUserAccount(account); m_AuthenticationService.SetPasswordHashed(account.PrincipalID, passwd); m_InventoryService.CreateUserInventory(account.PrincipalID); } } UUID secureSession = UUID.Zero; if (m_AuthenticateUsers) { // // Authenticate this user // if (!passwd.StartsWith("$1$")) passwd = "$1$" + Util.Md5Hash(passwd); passwd = passwd.Remove(0, 3); //remove $1$ string token = m_AuthenticationService.Authenticate(account.PrincipalID, passwd, 30); if ((token == string.Empty) || (token != string.Empty && !UUID.TryParse(token, out secureSession))) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: authentication failed"); return LLFailedLoginResponse.UserProblem; } } else { string token = m_AuthenticationService.GetToken(account.PrincipalID, 30); UUID.TryParse(token, out secureSession); } IAgentInfo agent = null; IAgentConnector agentData = DataManager.RequestPlugin<IAgentConnector>(); IProfileConnector profileData = DataManager.RequestPlugin<IProfileConnector>(); //Already tried to find it before this, so its not there at all. if (agentData != null) { agent = agentData.GetAgent(account.PrincipalID); if (agent == null) { agentData.CreateNewAgent(account.PrincipalID); agent = agentData.GetAgent(account.PrincipalID); } bool AcceptedNewTOS = false; //This gets if the viewer has accepted the new TOS if(requestData.ContainsKey("agree_to_tos")) { if (requestData["agree_to_tos"].ToString() == "0") AcceptedNewTOS = false; else if (requestData["agree_to_tos"].ToString() == "1") AcceptedNewTOS = true; else AcceptedNewTOS = bool.Parse(requestData["agree_to_tos"].ToString()); agent.AcceptTOS = AcceptedNewTOS; agentData.UpdateAgent(agent); } if (!AcceptedNewTOS && !agent.AcceptTOS && m_UseTOS) { StreamReader reader = new StreamReader(Path.Combine(Environment.CurrentDirectory, m_TOSLocation)); string TOS = reader.ReadToEnd(); reader.Close(); reader.Dispose(); return new LLFailedLoginResponse(LoginResponseEnum.ToSNeedsSent, TOS, "false"); } if ((agent.Flags & IAgentFlags.PermBan) == IAgentFlags.PermBan || (agent.Flags & IAgentFlags.TempBan) == IAgentFlags.TempBan) { m_log.Info("[LLOGIN SERVICE]: Login failed, reason: user is banned."); return new LLFailedLoginResponse(LoginResponseEnum.MessagePopup, "You are blocked from connecting to this service.", "false"); } if (account.UserLevel < m_MinLoginLevel) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: login is blocked for user level {0}", account.UserLevel); return LLFailedLoginResponse.LoginBlockedProblem; } } if (profileData != null) { IUserProfileInfo UPI = profileData.GetUserProfile(account.PrincipalID); if (UPI == null) { profileData.CreateNewProfile(account.PrincipalID); UPI = profileData.GetUserProfile(account.PrincipalID); UPI.AArchiveName = m_DefaultUserAvatarArchive; //profileData.UpdateUserProfile(UPI); //It gets hit later by the next thing } if (UPI.IsNewUser && UPI.AArchiveName != "" && UPI.AArchiveName != " ") { GridAvatarArchiver archiver = new GridAvatarArchiver(m_UserAccountService, m_AvatarService, m_InventoryService); archiver.LoadAvatarArchive(UPI.AArchiveName, account.FirstName, account.LastName); UPI.AArchiveName = ""; } if (UPI.IsNewUser) { UPI.IsNewUser = false; profileData.UpdateUserProfile(UPI); } } foreach (ILoginModule module in LoginModules) { string message; if (module.Login(requestData, account.PrincipalID, out message) == false) { LLFailedLoginResponse resp = new LLFailedLoginResponse(LoginResponseEnum.PasswordIncorrect, message, "false"); return resp; } } // // Get the user's inventory // if (m_RequireInventory && m_InventoryService == null) { m_log.WarnFormat("[LLOGIN SERVICE]: Login failed, reason: inventory service not set up"); return LLFailedLoginResponse.InventoryProblem; } List<InventoryFolderBase> inventorySkel = m_InventoryService.GetInventorySkeleton(account.PrincipalID); if (m_RequireInventory && ((inventorySkel == null) || (inventorySkel != null && inventorySkel.Count == 0))) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: unable to retrieve user inventory"); return LLFailedLoginResponse.InventoryProblem; } // Get active gestures List<InventoryItemBase> gestures = m_InventoryService.GetActiveGestures(account.PrincipalID); m_log.DebugFormat("[LLOGIN SERVICE]: {0} active gestures", gestures.Count); // // Login the presence // if (m_PresenceService != null) { success = m_PresenceService.LoginAgent(account.PrincipalID.ToString(), session, secureSession); if (!success) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: could not login presence"); return LLFailedLoginResponse.GridProblem; } } // // Change Online status and get the home region // GridRegion home = null; GridUserInfo guinfo = m_GridUserService.LoggedIn(account.PrincipalID.ToString()); if (guinfo != null && (guinfo.HomeRegionID != UUID.Zero) && m_GridService != null) { home = m_GridService.GetRegionByUUID(scopeID, guinfo.HomeRegionID); } bool GridUserInfoFound = true; if (guinfo == null) { GridUserInfoFound = false; // something went wrong, make something up, so that we don't have to test this anywhere else guinfo = new GridUserInfo(); guinfo.LastPosition = guinfo.HomePosition = new Vector3(128, 128, 30); } // // Find the destination region/grid // string where = string.Empty; Vector3 position = Vector3.Zero; Vector3 lookAt = Vector3.Zero; GridRegion gatekeeper = null; GridRegion destination = FindDestination(account, scopeID, guinfo, session, startLocation, home, out gatekeeper, out where, out position, out lookAt); if (destination == null) { m_PresenceService.LogoutAgent(session); m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: destination not found"); return LLFailedLoginResponse.GridProblem; } if (!GridUserInfoFound || guinfo.HomeRegionID == UUID.Zero) //Give them a default home and last { List<GridRegion> DefaultRegions = m_GridService.GetDefaultRegions(UUID.Zero); GridRegion DefaultRegion = null; if (DefaultRegions.Count == 0) DefaultRegion = destination; else DefaultRegion = DefaultRegions[0]; if (m_DefaultHomeRegion != "" && guinfo.HomeRegionID == UUID.Zero) { GridRegion newHomeRegion = m_GridService.GetRegionByName(UUID.Zero, m_DefaultHomeRegion); if (newHomeRegion == null) guinfo.HomeRegionID = guinfo.LastRegionID = DefaultRegion.RegionID; else guinfo.HomeRegionID = guinfo.LastRegionID = newHomeRegion.RegionID; } else if (guinfo.HomeRegionID == UUID.Zero) guinfo.HomeRegionID = guinfo.LastRegionID = DefaultRegion.RegionID; guinfo.LastPosition = guinfo.HomePosition = new Vector3(128, 128, 128); guinfo.HomeLookAt = guinfo.LastLookAt = new Vector3(0, 0, 0); m_GridUserService.SetLastPosition(guinfo.UserID, UUID.Zero, guinfo.LastRegionID, guinfo.LastPosition, guinfo.LastLookAt); m_GridUserService.SetHome(guinfo.UserID, guinfo.HomeRegionID, guinfo.HomePosition, guinfo.HomeLookAt); } // // Get the avatar // AvatarData avatar = null; if (m_AvatarService != null) { avatar = m_AvatarService.GetAvatar(account.PrincipalID); if (avatar == null) { m_log.Error("[LLLOGINSERVICE]: CANNOT FIND AVATAR APPEARANCE " + account.FirstName + " " + account.LastName); } } // // Instantiate/get the simulation interface and launch an agent at the destination // string reason = string.Empty; GridRegion dest; AgentCircuitData aCircuit = LaunchAgentAtGrid(gatekeeper, destination, account, avatar, session, secureSession, position, where, clientVersion, channel, mac, id0, clientIP, out where, out reason, out dest); destination = dest; if(requestData.ContainsKey("id0")) id0 = (string)requestData["id0"]; string platform = ""; if(requestData.ContainsKey("platform")) platform = (string)requestData["platform"]; if (aCircuit == null) { m_PresenceService.LogoutAgent(session); m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: {0}", reason); return new LLFailedLoginResponse(LoginResponseEnum.PasswordIncorrect, reason, "false"); } // Get Friends list FriendInfo[] friendsList = new FriendInfo[0]; if (m_FriendsService != null) { friendsList = m_FriendsService.GetFriends(account.PrincipalID); m_log.DebugFormat("[LLOGIN SERVICE]: Retrieved {0} friends", friendsList.Length); } // // Finally, fill out the response and return it // string MaturityRating = "A"; string MaxMaturity = "A"; if (agent != null) { if (agent.MaturityRating == 0) MaturityRating = "P"; else if (agent.MaturityRating == 1) MaturityRating = "M"; else if (agent.MaturityRating == 2) MaturityRating = "A"; if (agent.MaxMaturity == 0) MaxMaturity = "P"; else if (agent.MaxMaturity == 1) MaxMaturity = "M"; else if (agent.MaxMaturity == 2) MaxMaturity = "A"; } LLLoginResponse response = new LLLoginResponse(account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService, where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP, MaxMaturity, MaturityRating, m_MapTileURL, m_SearchURL, m_AllowFirstLife ? "Y" : "N", m_TutorialURL, eventCategories, classifiedCategories, CAPSServerURL, CAPSServicePassword, m_config); m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to client."); return response; } catch (Exception e) { m_log.WarnFormat("[LLOGIN SERVICE]: Exception processing login for {0} {1}: {2} {3}", firstName, lastName, e.ToString(), e.StackTrace); if (m_PresenceService != null) m_PresenceService.LogoutAgent(session); return LLFailedLoginResponse.InternalError; } }
public LLLoginService(IConfigSource config, ISimulationService simService, ILibraryService libraryService) { m_config = config; m_AuroraLoginConfig = config.Configs["AuroraLoginService"]; if (m_AuroraLoginConfig != null) { m_UseTOS = m_AuroraLoginConfig.GetBoolean("UseTermsOfServiceOnFirstLogin", false); m_DefaultHomeRegion = m_AuroraLoginConfig.GetString("DefaultHomeRegion", ""); m_DefaultUserAvatarArchive = m_AuroraLoginConfig.GetString("DefaultAvatarArchiveForNewUser", ""); m_AllowAnonymousLogin = m_AuroraLoginConfig.GetBoolean("AllowAnonymousLogin", false); m_AuthenticateUsers = m_AuroraLoginConfig.GetBoolean("AuthenticateUsers", true); m_TOSLocation = m_AuroraLoginConfig.GetString("FileNameOfTOS", ""); m_AllowFirstLife = m_AuroraLoginConfig.GetBoolean("AllowFirstLifeInProfile", true); m_TutorialURL = m_AuroraLoginConfig.GetString("TutorialURL", m_TutorialURL); ReadEventValues(m_AuroraLoginConfig); ReadClassifiedValues(m_AuroraLoginConfig); CAPSServerURL = m_AuroraLoginConfig.GetString("CAPSServiceURL", ""); CAPSServicePassword = m_AuroraLoginConfig.GetString("CAPSServicePassword", ""); } m_LoginServerConfig = config.Configs["LoginService"]; if (m_LoginServerConfig == null) throw new Exception(String.Format("No section LoginService in config file")); string accountService = m_LoginServerConfig.GetString("UserAccountService", String.Empty); string gridUserService = m_LoginServerConfig.GetString("GridUserService", String.Empty); string agentService = m_LoginServerConfig.GetString("UserAgentService", String.Empty); string authService = m_LoginServerConfig.GetString("AuthenticationService", String.Empty); string invService = m_LoginServerConfig.GetString("InventoryService", String.Empty); string gridService = m_LoginServerConfig.GetString("GridService", String.Empty); string presenceService = m_LoginServerConfig.GetString("PresenceService", String.Empty); string libService = m_LoginServerConfig.GetString("LibraryService", String.Empty); string friendsService = m_LoginServerConfig.GetString("FriendsService", String.Empty); string avatarService = m_LoginServerConfig.GetString("AvatarService", String.Empty); string simulationService = m_LoginServerConfig.GetString("SimulationService", String.Empty); m_DefaultRegionName = m_LoginServerConfig.GetString("DefaultRegion", String.Empty); m_WelcomeMessage = m_LoginServerConfig.GetString("WelcomeMessage", "Welcome to OpenSim!"); m_RequireInventory = m_LoginServerConfig.GetBoolean("RequireInventory", true); m_AllowRemoteSetLoginLevel = m_LoginServerConfig.GetBoolean("AllowRemoteSetLoginLevel", false); m_MinLoginLevel = m_LoginServerConfig.GetInt("MinLoginLevel", 0); m_GatekeeperURL = m_LoginServerConfig.GetString("GatekeeperURI", string.Empty); m_MapTileURL = m_LoginServerConfig.GetString("MapTileURL", string.Empty); m_SearchURL = m_LoginServerConfig.GetString("SearchURL", string.Empty); // These are required; the others aren't if (accountService == string.Empty || authService == string.Empty) throw new Exception("LoginService is missing service specifications"); Object[] args = new Object[] { config }; m_UserAccountService = ServerUtils.LoadPlugin<IUserAccountService>(accountService, args); m_GridUserService = ServerUtils.LoadPlugin<IGridUserService>(gridUserService, args); m_AuthenticationService = ServerUtils.LoadPlugin<IAuthenticationService>(authService, args); m_InventoryService = ServerUtils.LoadPlugin<IInventoryService>(invService, args); if (gridService != string.Empty) m_GridService = ServerUtils.LoadPlugin<IGridService>(gridService, args); if (presenceService != string.Empty) m_PresenceService = ServerUtils.LoadPlugin<IPresenceService>(presenceService, args); if (avatarService != string.Empty) m_AvatarService = ServerUtils.LoadPlugin<IAvatarService>(avatarService, args); if (friendsService != string.Empty) m_FriendsService = ServerUtils.LoadPlugin<IFriendsService>(friendsService, args); if (simulationService != string.Empty) m_RemoteSimulationService = ServerUtils.LoadPlugin<ISimulationService>(simulationService, args); if (agentService != string.Empty) m_UserAgentService = ServerUtils.LoadPlugin<IUserAgentService>(agentService, args); // // deal with the services given as argument // m_LocalSimulationService = simService; if (libraryService != null) { m_log.DebugFormat("[LLOGIN SERVICE]: Using LibraryService given as argument"); m_LibraryService = libraryService; } else if (libService != string.Empty) { m_log.DebugFormat("[LLOGIN SERVICE]: Using instantiated LibraryService"); m_LibraryService = ServerUtils.LoadPlugin<ILibraryService>(libService, args); } m_GatekeeperConnector = new GatekeeperServiceConnector(); if (!Initialized) { Initialized = true; RegisterCommands(); } //Start the grid profile archiver. new GridAvatarProfileArchiver(m_UserAccountService); archiver = new GridAvatarArchiver(m_UserAccountService, m_AvatarService, m_InventoryService); LoginModules = Aurora.Framework.AuroraModuleLoader.PickupModules<ILoginModule>(); foreach (ILoginModule module in LoginModules) { module.Initialize(this, config, m_UserAccountService); } m_log.DebugFormat("[LLOGIN SERVICE]: Starting..."); }