static LLFailedLoginResponse() { AuthenticationProblem = new LLFailedLoginResponse(LoginResponseEnum.PasswordIncorrect, "Could not authenticate your avatar. Please check your username and password, and check the grid if problems persist.", false); AccountProblem = new LLFailedLoginResponse(LoginResponseEnum.PasswordIncorrect, "Could not find an account for your avatar. Please check that your username is correct or make a new account.", false); PermanentBannedProblem = new LLFailedLoginResponse(LoginResponseEnum.PasswordIncorrect, "You have been blocked from using this service.", false); GridProblem = new LLFailedLoginResponse(LoginResponseEnum.InternalError, "Error connecting to the desired location. Try connecting to another region.", false); InventoryProblem = new LLFailedLoginResponse(LoginResponseEnum.InternalError, "The inventory service is not responding. Please notify your login region operator.", false); DeadRegionProblem = new LLFailedLoginResponse(LoginResponseEnum.InternalError, "The region you are attempting to log into is not responding. Please select another region and try again.", false); LoginBlockedProblem = new LLFailedLoginResponse(LoginResponseEnum.InternalError, "Logins are currently restricted. Please try again later.", false); AlreadyLoggedInProblem = new LLFailedLoginResponse(LoginResponseEnum.PresenceIssue, "You appear to be already logged in. " + "If this is not the case please wait for your session to timeout. " + "If this takes longer than a few minutes please contact the grid owner. " + "Please wait 5 minutes if you are going to connect to a region nearby to the region you were at previously.", false); InternalError = new LLFailedLoginResponse(LoginResponseEnum.InternalError, "Error generating Login Response", false); }
static LLFailedLoginResponse() { UserProblem = new LLFailedLoginResponse("key", "Could not authenticate your avatar. Please check your username and password, and check the grid if problems persist.", "false"); GridProblem = new LLFailedLoginResponse("key", "Error connecting to the desired location. Try connecting to another region.", "false"); InventoryProblem = new LLFailedLoginResponse("key", "The inventory service is not responding. Please notify your login region operator.", "false"); DeadRegionProblem = new LLFailedLoginResponse("key", "The region you are attempting to log into is not responding. Please select another region and try again.", "false"); LoginBlockedProblem = new LLFailedLoginResponse("presence", "Logins are currently restricted. Please try again later.", "false"); AlreadyLoggedInProblem = new LLFailedLoginResponse("presence", "You appear to be already logged in. " + "If this is not the case please wait for your session to timeout. " + "If this takes longer than a few minutes please contact the grid owner. " + "Please wait 5 minutes if you are going to connect to a region nearby to the region you were at previously.", "false"); InternalError = new LLFailedLoginResponse("Internal Error", "Error generating Login Response", "false"); }
static LLFailedLoginResponse() { UserProblem = new LLFailedLoginResponse("key", "Could not authenticate your avatar. Please check your username and password, and check the grid if problems persist.", "false"); GridProblem = new LLFailedLoginResponse("key", "Error connecting to the desired location. Try connecting to another region.", "false"); InventoryProblem = new LLFailedLoginResponse("key", "The inventory service is not responding. Please notify your login region operator.", "false"); DeadRegionProblem = new LLFailedLoginResponse("key", "The region you are attempting to log into is not responding. Please select another region and try again.", "false"); LoginBlockedProblem = new LLFailedLoginResponse("presence", "Logins are currently restricted. Please try again later.", "false"); UnverifiedAccountProblem = new LLFailedLoginResponse("presence", "Your account has not yet been verified. Please check " + "your email and click the provided link.", "false"); AlreadyLoggedInProblem = new LLFailedLoginResponse("presence", "You appear to be already logged in. " + "Please wait a a minute or two and retry. " + "If this takes longer than a few minutes please contact the grid owner. ", "false"); InternalError = new LLFailedLoginResponse("Internal Error", "Error generating Login Response", "false"); RSALoginOnly = new LLFailedLoginResponse("key", "This account requires an RSA login.", "false"); NoRSALogin = new LLFailedLoginResponse("key", "This account does not allow RSA logins.", "false"); }
public LoginResponse Login(string Name, string passwd, string startLocation, UUID scopeID, string clientVersion, string channel, string mac, string id0, IPEndPoint clientIP, Hashtable requestData, UUID secureSession) { UUID session = UUID.Random(); m_log.InfoFormat("[LLOGIN SERVICE]: Login request for {0} from {1} with user agent {2} starting in {3}", Name, clientIP.Address.ToString(), clientVersion, startLocation); UserAccount account = m_UserAccountService.GetUserAccount (scopeID, Name); try { string DisplayName = account.Name; IAgentInfo agent = null; IAgentConnector agentData = DataManager.RequestPlugin<IAgentConnector>(); IProfileConnector profileData = DataManager.RequestPlugin<IProfileConnector>(); if (agentData != null) agent = agentData.GetAgent(account.PrincipalID); requestData["ip"] = clientIP.ToString(); foreach (ILoginModule module in LoginModules) { string message; if (!module.Login(requestData, account.PrincipalID, out message)) { 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_InventoryService.CreateUserInventory(account.PrincipalID, m_DefaultUserAvatarArchive == ""); 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; } } if (m_InventoryService.CreateUserRootFolder (account.PrincipalID)) ///Gotta refetch... since something went wrong inventorySkel = m_InventoryService.GetInventorySkeleton (account.PrincipalID); 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; UPI.IsNewUser = true; //profileData.UpdateUserProfile(UPI); //It gets hit later by the next thing } //Find which is set, if any string archiveName = (UPI.AArchiveName != "" && UPI.AArchiveName != " ") ? UPI.AArchiveName : m_DefaultUserAvatarArchive; if (UPI.IsNewUser && archiveName != "") { archiver.LoadAvatarArchive(archiveName, account.Name); UPI.AArchiveName = ""; } if (UPI.IsNewUser) { UPI.IsNewUser = false; profileData.UpdateUserProfile(UPI); } if(UPI.DisplayName != "") DisplayName = UPI.DisplayName; } // Get active gestures List<InventoryItemBase> gestures = m_InventoryService.GetActiveGestures(account.PrincipalID); //m_log.DebugFormat("[LLOGIN SERVICE]: {0} active gestures", gestures.Count); //Reset logged in to true if the user was crashed, but don't fire the logged in event yet m_agentInfoService.SetLoggedIn (account.PrincipalID.ToString (), true, false, UUID.Zero); //Lock it as well m_agentInfoService.LockLoggedInStatus (account.PrincipalID.ToString (), true); //Now get the logged in status, then below make sure to kill the previous agent if we crashed before UserInfo guinfo = m_agentInfoService.GetUserInfo (account.PrincipalID.ToString ()); // // Clear out any existing CAPS the user may have // if (m_CapsService != null) { IAgentProcessing agentProcessor = m_registry.RequestModuleInterface<IAgentProcessing>(); if (agentProcessor != null) { IClientCapsService clientCaps = m_CapsService.GetClientCapsService(account.PrincipalID); if (clientCaps != null) { IRegionClientCapsService rootRegionCaps = clientCaps.GetRootCapsService(); if (rootRegionCaps != null) agentProcessor.LogoutAgent(rootRegionCaps, !m_AllowDuplicateLogin); } } else m_CapsService.RemoveCAPS(account.PrincipalID); } // // Change Online status and get the home region // GridRegion home = null; 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 UserInfo(); guinfo.UserID = account.PrincipalID.ToString(); guinfo.CurrentPosition = guinfo.HomePosition = new Vector3(128, 128, 30); } // // Find the destination region/grid // string where = string.Empty; Vector3 position = Vector3.Zero; Vector3 lookAt = Vector3.Zero; TeleportFlags tpFlags = TeleportFlags.ViaLogin; GridRegion destination = FindDestination (account, scopeID, guinfo, session, startLocation, home, out tpFlags, out where, out position, out lookAt); if (destination == null) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: destination not found"); return LLFailedLoginResponse.DeadRegionProblem; } if (!GridUserInfoFound || guinfo.HomeRegionID == UUID.Zero) //Give them a default home and last { List<GridRegion> DefaultRegions = m_GridService.GetDefaultRegions(account.ScopeID); 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(account.ScopeID, m_DefaultHomeRegion); if (newHomeRegion == null) guinfo.HomeRegionID = guinfo.CurrentRegionID = DefaultRegion.RegionID; else guinfo.HomeRegionID = guinfo.CurrentRegionID = newHomeRegion.RegionID; } else if (guinfo.HomeRegionID == UUID.Zero) guinfo.HomeRegionID = guinfo.CurrentRegionID = DefaultRegion.RegionID; //Z = 0 so that it fixes it on the region server and puts it on the ground guinfo.CurrentPosition = guinfo.HomePosition = new Vector3(128, 128, 25); guinfo.HomeLookAt = guinfo.CurrentLookAt = new Vector3(0, 0, 0); m_agentInfoService.SetLastPosition(guinfo.UserID, guinfo.CurrentRegionID, guinfo.CurrentPosition, guinfo.CurrentLookAt); m_agentInfoService.SetHomePosition(guinfo.UserID, guinfo.HomeRegionID, guinfo.HomePosition, guinfo.HomeLookAt); } // // Get the avatar // AvatarAppearance avappearance = new AvatarAppearance(account.PrincipalID); if (m_AvatarService != null) { avappearance = m_AvatarService.GetAppearance(account.PrincipalID); if (avappearance == null) { //Create an appearance for the user if one doesn't exist if (m_DefaultUserAvatarArchive != "") { m_log.Error("[LLoginService]: Cannot find an appearance for user " + account.Name + ", loading the default avatar from " + m_DefaultUserAvatarArchive + "."); archiver.LoadAvatarArchive(m_DefaultUserAvatarArchive, account.Name); } else { m_log.Error("[LLoginService]: Cannot find an appearance for user " + account.Name + ", setting to the default avatar."); AvatarAppearance appearance = new AvatarAppearance(account.PrincipalID); m_AvatarService.SetAvatar(account.PrincipalID, new AvatarData(appearance)); } avappearance = m_AvatarService.GetAppearance(account.PrincipalID); } else { //Verify that all assets exist now for (int i = 0; i < avappearance.Wearables.Length; i++) { bool messedUp = false; foreach (KeyValuePair<UUID, UUID> item in avappearance.Wearables[i].GetItems()) { AssetBase asset = m_AssetService.Get(item.Value.ToString()); if (asset == null) { InventoryItemBase invItem = m_InventoryService.GetItem (new InventoryItemBase (item.Value)); if (invItem == null) { m_log.Warn ("Missing avatar appearance asset for user " + account.Name + " for item " + item.Value + ", asset should be " + item.Key + "!"); messedUp = true; } } } if (messedUp) avappearance.Wearables[i] = AvatarWearable.DefaultWearables[i]; } //Also verify that all baked texture indices exist foreach (byte BakedTextureIndex in AvatarAppearance.BAKE_INDICES) { if (BakedTextureIndex == 19) //Skirt isn't used unless you have a skirt continue; if (avappearance.Texture.GetFace(BakedTextureIndex).TextureID == AppearanceManager.DEFAULT_AVATAR_TEXTURE) { m_log.Warn("Bad texture index for user " + account.Name + " for " + BakedTextureIndex + "!"); avappearance = new AvatarAppearance(account.PrincipalID); m_AvatarService.SetAvatar(account.PrincipalID, new AvatarData(avappearance)); break; } } } } // // Instantiate/get the simulation interface and launch an agent at the destination // string reason = string.Empty; AgentCircuitData aCircuit = LaunchAgentAtGrid (destination, tpFlags, account, avappearance, session, secureSession, position, where, clientIP, out where, out reason, out destination); if (aCircuit == null) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: {0}", reason); return new LLFailedLoginResponse (LoginResponseEnum.InternalError, 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); } //Set them as logged in now, they are ready, and fire the logged in event now, as we're all done m_agentInfoService.SetLastPosition (account.PrincipalID.ToString (), destination.RegionID, position, lookAt); m_agentInfoService.LockLoggedInStatus (account.PrincipalID.ToString (), false); //Unlock it now m_agentInfoService.SetLoggedIn(account.PrincipalID.ToString(), true, true, destination.RegionID); // // 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_InventoryService, m_LibraryService, where, startLocation, position, lookAt, gestures, home, clientIP, MaxMaturity, MaturityRating, eventCategories, classifiedCategories, FillOutSeedCap (aCircuit, destination, clientIP, account.PrincipalID), m_config, DisplayName, m_registry); m_log.InfoFormat("[LLOGIN SERVICE]: All clear. Sending login response to client to login to region " + destination.RegionName + ", tried to login to " + startLocation + " at " + position.ToString() + "."); return response; } catch (Exception e) { m_log.WarnFormat ("[LLOGIN SERVICE]: Exception processing login for {0} : {1}", Name, e.ToString ()); if (account != null) { //Revert their logged in status if we got that far m_agentInfoService.LockLoggedInStatus (account.PrincipalID.ToString (), false); //Unlock it now m_agentInfoService.SetLoggedIn (account.PrincipalID.ToString (), false, false, UUID.Zero); } return LLFailedLoginResponse.InternalError; } }
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 LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, UUID scopeID, string clientVersion, string channel, string mac, string id0, IPEndPoint clientIP, Hashtable requestData, UUID secureSession) { 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 { UserAccount account = m_UserAccountService.GetUserAccount(scopeID, firstName, lastName); IAgentInfo agent = null; IAgentConnector agentData = DataManager.RequestPlugin<IAgentConnector>(); IProfileConnector profileData = DataManager.RequestPlugin<IProfileConnector>(); if (agentData != null) agent = agentData.GetAgent(account.PrincipalID); requestData["ip"] = clientIP.ToString(); 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; } } 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; UPI.IsNewUser = true; //profileData.UpdateUserProfile(UPI); //It gets hit later by the next thing } //Find which is set, if any string archiveName = (UPI.AArchiveName != "" && UPI.AArchiveName != " ") ? UPI.AArchiveName : m_DefaultUserAvatarArchive; if (UPI.IsNewUser && archiveName != "") { archiver.LoadAvatarArchive(archiveName, account.FirstName, account.LastName); UPI.AArchiveName = ""; } if (UPI.IsNewUser) { UPI.IsNewUser = false; profileData.UpdateUserProfile(UPI); } } // // 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; } } // // Clear out any existing CAPS the user may have // if (m_CapsService != null) { m_CapsService.RemoveCAPS(account.PrincipalID); } // // 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 destination = FindDestination(account, scopeID, guinfo, session, startLocation, home, 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(account.ScopeID); 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(account.ScopeID, 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; //Z = 0 so that it fixes it on the region server and puts it on the ground guinfo.LastPosition = guinfo.HomePosition = new Vector3(128, 128, 25); 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 // AvatarAppearance avappearance = new AvatarAppearance(account.PrincipalID); if (m_AvatarService != null) { avappearance = m_AvatarService.GetAppearance(account.PrincipalID); if (avappearance == null) { //Create an appearance for the user if one doesn't exist if (m_DefaultUserAvatarArchive != "") { m_log.Error("[LLoginService]: Cannot find an appearance for user " + account.Name + ", loading the default avatar from " + m_DefaultUserAvatarArchive + "."); archiver.LoadAvatarArchive(m_DefaultUserAvatarArchive, firstName, lastName); } else { m_log.Error("[LLoginService]: Cannot find an appearance for user " + account.Name + ", setting to the default avatar."); AvatarAppearance appearance = new AvatarAppearance(account.PrincipalID); m_AvatarService.SetAvatar(account.PrincipalID, new AvatarData(appearance)); } avappearance = m_AvatarService.GetAppearance(account.PrincipalID); } else { //Verify that all assets exist now for (int i = 0; i < avappearance.Wearables.Length; i++) { bool messedUp = false; foreach (KeyValuePair<UUID, UUID> item in avappearance.Wearables[i].GetItems()) { AssetBase asset = m_AssetService.Get(item.Value.ToString()); if (asset == null) { m_log.Warn("Missing avatar appearance asset for user " + account.Name + " for item " + item.Value + ", asset should be " + item.Key + "!"); messedUp = true; } } if (messedUp) avappearance.Wearables[i] = AvatarWearable.DefaultWearables[i]; } //Also verify that all baked texture indices exist foreach (byte BakedTextureIndex in AvatarAppearance.BAKE_INDICES) { if (BakedTextureIndex == 19) //Skirt isn't used unless you have a skirt continue; if (avappearance.Texture.GetFace(BakedTextureIndex).TextureID == AppearanceManager.DEFAULT_AVATAR_TEXTURE) { m_log.Warn("Bad texture index for user " + account.Name + " for " + BakedTextureIndex + "!"); avappearance.Texture.FaceTextures[BakedTextureIndex] = avappearance.Texture.CreateFace(BakedTextureIndex); avappearance.Texture.FaceTextures[BakedTextureIndex].TextureID = AppearanceManager.DEFAULT_AVATAR_TEXTURE; m_AvatarService.SetAppearance(account.PrincipalID, avappearance); } } } } // // Instantiate/get the simulation interface and launch an agent at the destination // string reason = string.Empty; AgentCircuitData aCircuit = LaunchAgentAtGrid(destination, account, avappearance, session, secureSession, position, where, clientIP, out where, out reason, out destination); 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"; } if (m_WelcomeMessage == string.Empty) { LLLoginResponse response = new LLLoginResponse(account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService, where, startLocation, position, lookAt, gestures, m_CustomizedMessageURL, home, clientIP, MaxMaturity, MaturityRating, m_MapTileURL, m_SearchURL, m_AllowFirstLife ? "Y" : "N", m_TutorialURL, eventCategories, classifiedCategories, FillOutSeedCap(aCircuit, destination, clientIP, account.PrincipalID), allowExportPermission, m_config); m_log.InfoFormat("[LLOGIN SERVICE]: All clear. Sending login response to client to login to region " + destination.RegionName + ", tried to login to " + startLocation + " at " + position.ToString() + "."); return response; } else { 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, FillOutSeedCap(aCircuit, destination, clientIP, account.PrincipalID), allowExportPermission, m_config); m_log.InfoFormat("[LLOGIN SERVICE]: All clear. Sending login response to client to login to region " + destination.RegionName + ", tried to login to " + startLocation + " at " + position.ToString() + "."); return response; } } catch (Exception e) { m_log.WarnFormat("[LLOGIN SERVICE]: Exception processing login for {0} {1}: {2} {3}", firstName, lastName, e.ToString()); if (m_PresenceService != null) m_PresenceService.LogoutAgent(session); return LLFailedLoginResponse.InternalError; } }