Beispiel #1
0
        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);
        }
Beispiel #2
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);
        }
Beispiel #3
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);
        }
Beispiel #4
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());
            }
        }
Beispiel #5
0
        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;
        }
Beispiel #6
0
        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);
        }
Beispiel #7
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 });
            }
        }
Beispiel #8
0
        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);
        }
Beispiel #9
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);
        }