Ejemplo n.º 1
0
        static void Main()
        {
            Logger.Info("Process starting");

            /*DebugLog.AddListener((a, b) =>
             * {
             *  Console.WriteLine("{0} {1} {2}", DateTime.Now, a, b);
             * });
             *
             * DebugLog.Enabled = true;*/

            AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
            {
                Logger.Fatal("Unhandled exception: " + e.ExceptionObject);
                Logger.Info("Process exiting");
            };

            ThreadPool.SetMaxThreads(10, 1);

            LoadSettings();

            if (Settings == null)
            {
                Logger.Fatal("Failed to load settings!");
                return;
            }

            SessionManager      = new SessionManager();
            RoomManager         = new RoomManager();
            DelayManager        = new DelayManager();
            NotificationManager = new NotificationManager();
            BatchInserter       = new BatchInserter();
            Steam = new Steam();

            RoomManager.Update();
            SessionManager.Start();

            _taskScheduler = new TaskScheduler();
            _taskScheduler.Add(TimeSpan.FromSeconds(0.5), () =>
            {
                SessionManager.Update();
                RoomManager.Update();
                DelayManager.Update();
                Steam.Update();
            });

            _taskScheduler.Add(TimeSpan.FromSeconds(15), () => SessionManager.Ping());

            //_taskScheduler.Add(TimeSpan.FromMinutes(1), GC.Collect);

            _taskScheduler.Add(TimeSpan.FromHours(1), () =>
            {
                var t = Util.GetTimestamp(DateTime.UtcNow - TimeSpan.FromDays(30));
                LoginToken.RemoveOlderThan(t);
            });

            _taskScheduler.Add(TimeSpan.FromSeconds(10), () =>
            {
                if (!NotificationsDirty)
                {
                    return;
                }

                NotificationManager.InvalidateNotificationCache();
                NotificationsDirty = false;
            });

            _taskScheduler.Add(TimeSpan.FromMinutes(2.5), () =>
            {
                if (Steam.Status == Steam.ConnectionStatus.Connected)
                {
                    Steam.Bot.PersonaState = EPersonaState.Online;
                }
            });

            while (true)
            {
                _taskScheduler.Run();
                Thread.Sleep(10);
            }
        }
Ejemplo n.º 2
0
        public void Login(string username, string password, string token)
        {
            bool    loggedIn = false;
            Account account;
            string  message;

            do
            {
                account = Account.Get(username);
                if (account == null)
                {
                    message = "Invalid username or password.";
                    break;
                }

                if (Session != null)
                {
                    message = "You are already logged in.";
                    break;
                }

                if (!Util.IsValidUsername(username))
                {
                    message = Util.InvalidUsernameMessage;
                    break;
                }

                if (string.IsNullOrEmpty(password))
                {
                    if (string.IsNullOrEmpty(token))
                    {
                        message = "Missing password.";
                        break;
                    }

                    var loginToken = LoginToken.Find(account.Id, token);
                    if (loginToken == null)
                    {
                        message = "Automatic login failed. Login with your username and password.";
                        break;
                    }

                    loginToken.UpdateAccessed(UserAgent, Address);

                    IsTokenLogin = true;
                    loggedIn     = true;
                    message      = $"Logged in as {account.Name}.";
                }
                else
                {
                    if (!Util.IsValidPassword(password))
                    {
                        message = Util.InvalidPasswordMessage;
                        break;
                    }

                    var givenPassword = Convert.ToBase64String(Util.HashPassword(password, Convert.FromBase64String(account.Salt)));
                    if (givenPassword != account.Password)
                    {
                        account = null;
                        message = "Invalid username or password.";
                        break;
                    }

                    var newToken = new LoginToken
                    {
                        UserId    = account.Id,
                        Created   = Util.GetCurrentTimestamp(),
                        Accessed  = Util.GetCurrentTimestamp(),
                        UserAgent = UserAgent,
                        Address   = Address,
                        Token     = Util.GenerateLoginToken(),
                    };

                    newToken.Insert();

                    IsTokenLogin = false;
                    token        = newToken.Token;
                    loggedIn     = true;
                    message      = $"Logged in as {account.Name}.";
                }
            } while (false);

            if (loggedIn)
            {
                Send(new AuthenticateResponse
                {
                    Name    = account.Name,
                    Tokens  = token,
                    Success = true
                });

                var session = Program.SessionManager.GetOrCreate(account);
                session.Add(this);
            }

            SendSysMessage(message);
        }
Ejemplo n.º 3
0
        public void Login(string username, string password, List <string> tokens)
        {
            Account account = null;
            string  message;

            do
            {
                if (Session != null)
                {
                    message = "You are already logged in.";
                    break;
                }

                if (!Util.IsValidUsername(username))
                {
                    message = Util.InvalidUsernameMessage;
                    break;
                }

                var existingTokens = LoginToken.FindAll(username).ToList();

                if (String.IsNullOrEmpty(password))
                {
                    if (tokens.Count == 0)
                    {
                        message = "Missing password.";
                        break;
                    }

                    if (!existingTokens.Any(t => t.Address == Address && tokens.Contains(t.Token)))
                    {
                        message = "Automatic login failed. Login with your username and password.";
                        break;
                    }

                    account = Account.Get(username);
                    tokens  = existingTokens.Select(t => t.Token).ToList();
                    message = String.Format("Logged in as {0}.", account.Name);
                }
                else
                {
                    if (!Util.IsValidPassword(password))
                    {
                        message = Util.InvalidPasswordMessage;
                        break;
                    }

                    account = Account.Get(username);
                    if (account == null)
                    {
                        message = "Invalid username or password.";
                        break;
                    }

                    var givenPassword = Convert.ToBase64String(Util.HashPassword(password, Convert.FromBase64String(account.Salt)));
                    if (givenPassword != account.Password)
                    {
                        account = null;
                        message = "Invalid username or password.";
                        break;
                    }

                    LoginToken newToken = existingTokens.FirstOrDefault(t => t.Address == Address);
                    if (newToken == null)
                    {
                        newToken = new LoginToken
                        {
                            Name    = account.Name.ToLower(),
                            Address = Address,
                            Token   = Util.GenerateLoginToken(),
                            Created = Util.GetCurrentTimestamp()
                        };

                        newToken.Insert();
                        existingTokens.Add(newToken);
                    }

                    tokens  = existingTokens.Select(t => t.Token).ToList();
                    message = String.Format("Logged in as {0}.", account.Name);
                }
            } while (false);

            if (account != null)
            {
                Send(new AuthenticateResponse
                {
                    Name    = account.Name,
                    Tokens  = string.Join(",", tokens),
                    Success = true
                });

                var session = Program.SessionManager.GetOrCreate(account);
                session.Add(this);
            }

            SendSysMessage(message);
        }