private void SignupEmailInput(SessionBase session) { if (session.GetStatus() != EnumUserStatus.CR_TERMINATED_STRING_AVAILABLE) { return; } var inputValue = Encoding.ASCII.GetString(session.InputBuffer.ToArray()); var emailRegEx = new Regex( "^(?(\")(\".+?(?<!\\\\)\"@)|(([0-9a-z]((\\.(?!\\.))|[-!#\\$%&'\\*\\+/=\\?\\^`\\{\\}\\|~\\w])*)(?<=[0-9a-z])@))(?(\\[)(\\[(\\d{1,3}\\.){3}\\d{1,3}\\])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\\.)+[a-z0-9][\\-a-z0-9]{0,22}[a-z0-9]))$"); if (!emailRegEx.IsMatch(inputValue)) { session.SendToClient( "\r\n|RED||B|Please enter a valid e-Mail address.\r\n|RESET|".EncodeToANSIArray()); session.SessionState = EnumSessionState.SignupEmailDisplay; session.InputBuffer.SetLength(0); return; } session.Email = inputValue; session.SessionState = EnumSessionState.SignupGenderDisplay; session.InputBuffer.SetLength(0); }
private void SignupPasswordInput(SessionBase session) { if (session.GetStatus() != EnumUserStatus.CR_TERMINATED_STRING_AVAILABLE) { return; } var inputValue = Encoding.ASCII.GetString(session.InputBuffer.ToArray()); if (inputValue.Length <= 4 || inputValue.Length >= 10) { session.SendToClient( "\r\n|RED||B|Passwords must be between 5 and 9 characters long.\r\n|RESET|" .EncodeToANSIArray()); session.SessionState = EnumSessionState.SignupPasswordDisplay; session.InputBuffer.SetLength(0); return; } if (inputValue.ToUpper() == "PASSWORD") { session.SendToClient( "\r\n|RED||B|Please enter a better password. Seriously.\r\n|RESET|".EncodeToANSIArray()); session.SessionState = EnumSessionState.SignupPasswordDisplay; session.InputBuffer.SetLength(0); return; } session.Password = inputValue; session.SessionState = EnumSessionState.SignupPasswordConfirmDisplay; session.InputBuffer.SetLength(0); }
private void LogoffConfirmationInput(SessionBase session) { if (session.GetStatus() != EnumUserStatus.CR_TERMINATED_STRING_AVAILABLE) { return; } var inputValue = Encoding.ASCII.GetString(session.InputBuffer.ToArray()).TrimEnd('\0').ToUpper(); switch (inputValue) { case "Y": session.SessionState = EnumSessionState.LoggingOffDisplay; break; case "N": session.SessionState = EnumSessionState.MainMenuDisplay; break; case "R": session.SessionState = EnumSessionState.Unauthenticated; session.Username = string.Empty; session.Password = string.Empty; break; default: session.SessionState = EnumSessionState.ConfirmLogoffDisplay; break; } //Clear the Input Buffer session.InputBuffer.SetLength(0); }
private void LoginPasswordInput(SessionBase session) { //Only Process on CR if (session.GetStatus() != EnumUserStatus.CR_TERMINATED_STRING_AVAILABLE) { return; } //Get The Password session.Password = Encoding.ASCII.GetString(session.InputBuffer.ToArray()); session.InputBuffer.SetLength(0); session.SessionState = EnumSessionState.LoginPasswordDisplay; //See if the Account exists var account = _accountRepository.GetAccountByUsernameAndPassword(session.Username, session.Password); if (account == null) { session.SendToClient("\r\n|B||RED|Invalid Credentials|RESET|\r\n".EncodeToANSIArray()); session.Username = ""; session.EchoSecureEnabled = false; session.SessionState = EnumSessionState.LoginUsernameDisplay; return; } //Populate Session Variables from mbbsemu.db session.Username = account.userName; session.UsrAcc.credat = account.createDate.ToDosDate(); //Lookup User in BBSUSR.db var accountBtrieve = _globalCache.Get <BtrieveFileProcessor>("ACCBB-PROCESSOR"); var result = accountBtrieve.PerformOperation(0, new Span <byte>(new UserAccount { userid = Encoding.ASCII.GetBytes(session.Username.ToUpper()), psword = Encoding.ASCII.GetBytes("<<HASHED>>") }.Data).Slice(0, 55), EnumBtrieveOperationCodes.AcquireEqual); if (!result) { session.SendToClient("\r\n|B||RED|USER MISMATCH IN BBSUSR.DAT -- PLEASE NOTIFY SYSOP|RESET|\r\n".EncodeToANSIArray()); session.Username = ""; session.EchoSecureEnabled = false; session.SessionState = EnumSessionState.LoginUsernameDisplay; return; } //Populate Session Variables from BBSUSR.db session.UsrAcc.sex = accountBtrieve.GetRecord().ElementAt(213); //Start Session session.SessionState = EnumSessionState.LoginRoutines; session.EchoSecureEnabled = false; session.SessionTimer.Start(); if (_accountKeyRepository.GetAccountKeysByUsername(session.Username).Any(x => x.accountKey == "SYSOP")) { session.SendToClient("|RED||B|/SYS to access SYSOP commands\r\n".EncodeToANSIArray()); } }
private void LoginUsernameInput(SessionBase session) { //Only Process on CR if (session.GetStatus() != EnumUserStatus.CR_TERMINATED_STRING_AVAILABLE) { return; } var inputValue = Encoding.ASCII.GetString(session.InputBuffer.ToArray()); if (string.IsNullOrEmpty(inputValue)) { session.SessionState = EnumSessionState.LoginUsernameDisplay; return; } //Validation for username > 29 characters if (inputValue.Length > 29) { session.SendToClient( "\r\n|RED||B|Please enter a Username with less than 30 characters.\r\n|RESET|" .EncodeToANSIArray()); session.SessionState = EnumSessionState.LoginUsernameDisplay; session.InputBuffer.SetLength(0); return; } if (inputValue.ToUpper() == "NEW") { session.SessionState = EnumSessionState.SignupUsernameDisplay; session.InputBuffer.SetLength(0); session.SendToClient(new byte[] { 0x1B, 0x5B, 0x32, 0x4A }); session.SendToClient(new byte[] { 0x1B, 0x5B, 0x48 }); //Load File if specified in appsettings.json and display if it exists, else display default var ansiSignupFileName = _configuration.ANSISignup; session.SendToClient( File.Exists(ansiSignupFileName) ? File.ReadAllBytes(ansiSignupFileName).ToArray() : _resourceManager.GetResource("MBBSEmu.Assets.signup.ans").ToArray()); return; } //Check to see if user is already logged in if (_channelDictionary.Values.Any(s => string.Equals(s.Username, inputValue, StringComparison.CurrentCultureIgnoreCase))) { session.SendToClient($"\r\n|RED||B|{inputValue} is already logged in -- only 1 connection allowed per user.\r\n|RESET|".EncodeToANSIArray()); session.InputBuffer.SetLength(0); session.SessionState = EnumSessionState.LoginUsernameDisplay; return; } session.Username = inputValue; session.InputBuffer.SetLength(0); session.SessionState = EnumSessionState.LoginPasswordDisplay; }
private void SignupUsernameInput(SessionBase session) { if (session.GetStatus() != EnumUserStatus.CR_TERMINATED_STRING_AVAILABLE) { return; } var inputValue = Encoding.ASCII.GetString(session.InputBuffer.ToArray()); //Validation for the blank username if (string.IsNullOrEmpty(inputValue)) { session.SendToClient( "\r\n|RED||B|Please enter a valid Username.\r\n|RESET|" .EncodeToANSIArray()); session.SessionState = EnumSessionState.SignupUsernameDisplay; session.InputBuffer.SetLength(0); return; } //Validation for username > 29 characters if (inputValue.Length > 29) { session.SendToClient( "\r\n|RED||B|Please enter a Username with less than 30 characters.\r\n|RESET|" .EncodeToANSIArray()); session.SessionState = EnumSessionState.SignupUsernameDisplay; session.InputBuffer.SetLength(0); return; } //Validation for an existing username if (_accountRepository.GetAccountByUsername(inputValue) != null) { session.SendToClient( "\r\n|RED||B|That Username is unavailable, please choose another.\r\n|RESET|" .EncodeToANSIArray()); session.SessionState = EnumSessionState.SignupUsernameDisplay; session.InputBuffer.SetLength(0); return; } session.Username = inputValue; session.SessionState = EnumSessionState.SignupPasswordDisplay; session.InputBuffer.SetLength(0); }
private void MainMenuInput(SessionBase session, Dictionary <string, MbbsModule> modules) { if (session.GetStatus() != EnumUserStatus.CR_TERMINATED_STRING_AVAILABLE) { return; } if (session.InputBuffer.Length == 0) { session.SessionState = EnumSessionState.MainMenuDisplay; session.InputBuffer.SetLength(0); return; } var inputValue = Encoding.ASCII.GetString(session.InputBuffer.ToArray()); //convert to uppercase, trim var inputCommand = inputValue.ToUpper().TrimEnd('\0'); //User is Logging Off if (Equals(inputCommand, "X")) { session.SessionState = EnumSessionState.ConfirmLogoffDisplay; session.InputBuffer.SetLength(0); return; } var selectedMenuItem = modules.Values.FirstOrDefault(m => m.ModuleConfig.MenuOptionKey.Equals(inputCommand, StringComparison.InvariantCultureIgnoreCase) && (bool)m.ModuleConfig.ModuleEnabled); //Check to see if input matched a module, if not redisplay menu if (selectedMenuItem == null) { session.SessionState = EnumSessionState.MainMenuDisplay; session.InputBuffer.SetLength(0); } else { session.InputBuffer.SetLength(1); session.CurrentModule = selectedMenuItem; session.SessionState = EnumSessionState.EnteringModule; session.SendToClient(new byte[] { 0x1B, 0x5B, 0x32, 0x4A }); session.SendToClient(new byte[] { 0x1B, 0x5B, 0x48 }); } }
private void SignupPasswordConfirmInput(SessionBase session) { if (session.GetStatus() != EnumUserStatus.CR_TERMINATED_STRING_AVAILABLE) { return; } var inputValue = Encoding.ASCII.GetString(session.InputBuffer.ToArray()); if (inputValue != session.Password) { session.SendToClient( "\r\n|RED||B|The passwords you entered did not match, please try again.|RESET|\r\n" .EncodeToANSIArray()); session.SessionState = EnumSessionState.SignupPasswordDisplay; session.InputBuffer.SetLength(0); return; } session.SessionState = EnumSessionState.SignupEmailDisplay; session.InputBuffer.SetLength(0); }
private void SignupGenderInput(SessionBase session) { if (session.GetStatus() != EnumUserStatus.CR_TERMINATED_STRING_AVAILABLE) { return; } var inputValue = Encoding.ASCII.GetString(session.InputBuffer.ToArray()); if (inputValue.ToUpper() is not("M" or "F")) { session.SendToClient("\r\n|RED||B|Please enter a valid gender selection ('M' or 'F').\r\n|RESET|".EncodeToANSIArray()); session.SessionState = EnumSessionState.SignupGenderDisplay; session.InputBuffer.SetLength(0); return; } session.UsrAcc.sex = (byte)char.Parse(inputValue); //Create the user in the database var accountId = _accountRepository.InsertAccount(session.Username, session.Password, session.Email); foreach (var c in _configuration.DefaultKeys) { _accountKeyRepository.InsertAccountKey(accountId, c); } //Add The User to the BBS Btrieve User Database var _accountBtrieve = _globalCache.Get <BtrieveFileProcessor>("ACCBB-PROCESSOR"); _accountBtrieve.Insert(new UserAccount { userid = Encoding.ASCII.GetBytes(session.Username), psword = Encoding.ASCII.GetBytes("<<HASHED>>"), sex = session.UsrAcc.sex }.Data, LogLevel.Error); session.SessionState = EnumSessionState.LoginRoutines; session.InputBuffer.SetLength(0); }