示例#1
0
        public void Login(string username, string password, LoginCompleteHandler handler)
        {
            Dictionary<string, string> postData = new Dictionary<string, string>();
            postData["Username"] = username;
            postData["Password"] = password;

            WebService.Post(Url, postData, delegate(bool success, string result)
                                               {
                                                   if (result == "\"Login failed.\"")
                                                   {
                                                       handler(this, new LoginCompleteEventArgs(false, null));
                                                   }
                                                   else
                                                   {
                                                       User user = Serializer.Get<User>(result);
                                                       handler(this, new LoginCompleteEventArgs(success, user));
                                                   }
                                               });
        }
示例#2
0
文件: Main.cs 项目: Glought/MultiMC
        /// <summary>
        /// Opens a dialog that allows users to log in.
        /// </summary>
        /// <remarks>
        /// If the user fails to log in, this method will reopen the login dialog
        /// with an error message. The done delegate is not called until the user
        /// either logs in successfully or clicks cancel.
        /// </remarks>
        /// <param name="done">Delegate that is invoked when the user logs in
        /// successfully.</param>
        /// <param name="inst">The instance that is being launched.</param>
        /// <param name="message">An error message to be displayed on the login dialog.</param>
        /// <param name="canplayOffline">True if the user can play this instance offline.</param>
        private void DoLogin(LoginCompleteHandler done,
							 Instance inst,
							 string message = "",
							 bool canplayOffline = false)
        {
            string username = "";
            string password = "";
            ReadUserInfo(out username, out password);

            ILoginDialog loginDlg = GUIManager.Main.LoginDialog(message);
            loginDlg.Parent = (DirectLaunch ? null : MainWindow);
            loginDlg.DefaultPosition = DefWindowPosition.CenterParent;
            loginDlg.ShowInTaskbar = DirectLaunch;

            if (!string.IsNullOrEmpty(username))
            {
                loginDlg.RememberUsername = true;
                loginDlg.Username = username;
            }
            if (!string.IsNullOrEmpty(password))
            {
                loginDlg.RememberPassword = true;
                loginDlg.Password = password;
            }
            loginDlg.Response += (o, args) =>
            {
                if (args.Response == DialogResponse.OK)
                {
                    string parameters = string.Format(
                        "user={0}&password={1}&version=1337",
                        Uri.EscapeDataString(loginDlg.Username),
                        Uri.EscapeDataString(loginDlg.Password), 13);

                    WriteUserInfo((loginDlg.RememberUsername ? loginDlg.Username : ""),
                                  (loginDlg.RememberPassword ? loginDlg.Password : ""));

                    // Start a new thread and post the login info to login.minecraft.net
                    SimpleTask loginTask = new SimpleTask(() =>
                    {
                        string reply = "";
                        bool postFailed = false;
                        try
                        {
                            if (loggingIn)
                                return;
                            loggingIn = true;
                            reply = AppUtils.ExecutePost("https://login.minecraft.net/",
                                    parameters);
                        }
                        catch (System.Net.WebException e)
                        {
                            postFailed = true;
                            reply = e.Message;
                        }
                        finally
                        {
                            loggingIn = false;
                        }

                        // If the login failed
                        if (!reply.Contains(":") || postFailed)
                        {
                            // Translate the error message to a more user friendly wording
                            string errorMessage = reply;
                            switch (reply.ToLower())
                            {
                            case "bad login":
                                errorMessage = "Invalid username or password.";
                                break;
                            case "old version":
                                errorMessage = "Invalid launcher version.";
                                break;
                            default:
                                errorMessage = "Login failed: " + reply;
                                break;
                            }

                            // Unable to resolve hostname.
                            if (reply.ToLower().Contains("name could not be resolved"))
                            {
                                errorMessage = string.Format(
                                    "Couldn't connect to login.minecraft.net, " +
                                    "please connect to the internet or use offline mode.");
                            }

                            // Error
                            MainWindow.Invoke((sender, e) =>
                                DoLogin(done, inst, errorMessage));
                        }

                        // If the login succeeded
                        else
                        {
                            string[] responseValues = reply.Split(':');

                            // The response must have 4 values or it's invalid
                            if (responseValues.Length != 4)
                            {
                                // Error
                                MainWindow.Invoke((sender, e) =>
                                    DoLogin(done, inst,
                                        "Got an invalid response from server", canplayOffline));
                            }
                            // Now we can finally return our login info.
                            else
                            {
                                LoginInfo info = new LoginInfo(responseValues,
                                                               loginDlg.ForceUpdate);
                                done(info, inst);
                            }
                        }
                    }, "Logging in...");

                    if (!loggingIn)
                    {
                        MainWindow.Invoke((o2, args2) =>
                            StartModalTask(loginTask));
                    }
                }
                else if (args.Response == DialogResponse.No)
                {
                    // Play offline
                    done(new LoginInfo(null, false, false), inst);
                }
                else
                {
                    // Login cancelled
                    done(new LoginInfo(), inst);
                }
            };
            loginDlg.Run();
        }
示例#3
0
        /// <summary>
        /// Opens a dialog that allows users to log in.
        /// </summary>
        /// <remarks>
        /// If the user fails to log in, this method will reopen the login dialog
        /// with an error message. The done delegate is not called until the user
        /// either logs in successfully or clicks cancel.
        /// </remarks>
        /// <param name="done">Delegate that is invoked when the user logs in
        /// successfully.</param>
        /// <param name="inst">The instance that is being launched.</param>
        /// <param name="message">An error message to be displayed on the login dialog.</param>
        /// <param name="canplayOffline">True if the user can play this instance offline.</param>
        private void DoLogin(LoginCompleteHandler done,
                             Instance inst,
                             string message      = "",
                             bool canplayOffline = false)
        {
            string username = "";
            string password = "";

            ReadUserInfo(out username, out password);

            ILoginDialog loginDlg = GUIManager.Main.LoginDialog(message);

            loginDlg.Parent          = (DirectLaunch ? null : MainWindow);
            loginDlg.DefaultPosition = DefWindowPosition.CenterParent;
            loginDlg.ShowInTaskbar   = DirectLaunch;

            if (!string.IsNullOrEmpty(username))
            {
                loginDlg.RememberUsername = true;
                loginDlg.Username         = username;
            }
            if (!string.IsNullOrEmpty(password))
            {
                loginDlg.RememberPassword = true;
                loginDlg.Password         = password;
            }
            loginDlg.Response += (o, args) =>
            {
                if (args.Response == DialogResponse.OK)
                {
                    string parameters = string.Format(
                        "user={0}&password={1}&version=1337",
                        Uri.EscapeDataString(loginDlg.Username),
                        Uri.EscapeDataString(loginDlg.Password), 13);

                    WriteUserInfo((loginDlg.RememberUsername ? loginDlg.Username : ""),
                                  (loginDlg.RememberPassword ? loginDlg.Password : ""));

                    // Start a new thread and post the login info to login.minecraft.net
                    SimpleTask loginTask = new SimpleTask(() =>
                    {
                        string reply    = "";
                        bool postFailed = false;
                        try
                        {
                            if (loggingIn)
                            {
                                return;
                            }
                            loggingIn = true;
                            reply     = AppUtils.ExecutePost("https://login.minecraft.net/",
                                                             parameters);
                        }
                        catch (System.Net.WebException e)
                        {
                            postFailed = true;
                            reply      = e.Message;
                        }
                        finally
                        {
                            loggingIn = false;
                        }

                        // If the login failed
                        if (!reply.Contains(":") || postFailed)
                        {
                            // Translate the error message to a more user friendly wording
                            string errorMessage = reply;
                            switch (reply.ToLower())
                            {
                            case "bad login":
                                errorMessage = "Invalid username or password.";
                                break;

                            case "old version":
                                errorMessage = "Invalid launcher version.";
                                break;

                            default:
                                errorMessage = "Login failed: " + reply;
                                break;
                            }

                            // Unable to resolve hostname.
                            if (reply.ToLower().Contains("name could not be resolved"))
                            {
                                errorMessage = string.Format(
                                    "Couldn't connect to login.minecraft.net, " +
                                    "please connect to the internet or use offline mode.");
                            }

                            // Error
                            MainWindow.Invoke((sender, e) =>
                                              DoLogin(done, inst, errorMessage));
                        }

                        // If the login succeeded
                        else
                        {
                            string[] responseValues = reply.Split(':');

                            // The response must have at least 4 values or it's invalid
                            if (responseValues.Length < 4)
                            {
                                // Error
                                MainWindow.Invoke((sender, e) =>
                                                  DoLogin(done, inst,
                                                          "Got an invalid response from server", canplayOffline));
                            }
                            // Now we can finally return our login info.
                            else
                            {
                                LoginInfo info = new LoginInfo(responseValues,
                                                               loginDlg.ForceUpdate);
                                done(info, inst);
                            }
                        }
                    }, "Logging in...");

                    if (!loggingIn)
                    {
                        MainWindow.Invoke((o2, args2) =>
                                          StartModalTask(loginTask));
                    }
                }
                else if (args.Response == DialogResponse.No)
                {
                    // Play offline
                    done(new LoginInfo(null, false, false), inst);
                }
                else
                {
                    // Login cancelled
                    done(new LoginInfo(), inst);
                }
            };
            loginDlg.Run();
        }
示例#4
0
        /// <summary>
        /// Opens a login dialog to allow the user to login.
        /// </summary>
        /// 
        private void DoLogin(LoginCompleteHandler done, string message = "",
            bool canplayOffline = false)
        {
            string username = "";
            string password = "";
            ReadUserInfo(out username, out password);

            LoginDialog loginDlg = new LoginDialog(this, message, canplayOffline);
            if (!string.IsNullOrEmpty(username))
            {
                loginDlg.RememberUsername = true;
                loginDlg.Username = username;
            }
            if (!string.IsNullOrEmpty(password))
            {
                loginDlg.RememberPassword = true;
                loginDlg.Password = password;
            }
            loginDlg.Response += (object o, ResponseArgs args) =>
            {
                if (args.ResponseId == ResponseType.Ok)
                {
                    string parameters = string.Format(
                        "user={0}&password={1}&version=13",
                        Uri.EscapeDataString(loginDlg.Username),
                        Uri.EscapeDataString(loginDlg.Password), 13);

                    // Start a new thread and post the login info to login.minecraft.net
                    Thread loginThread = new Thread(
                        () =>
                        {
                            WriteUserInfo((loginDlg.RememberUsername ? loginDlg.Username : ""),
                                              (loginDlg.RememberPassword ? loginDlg.Password : ""));

                            string reply = "";
                            bool postFailed = false;
                            try
                            {
                                reply = AppUtils.ExecutePost("https://login.minecraft.net/",
                                        parameters);
                            }
                            catch (System.Net.WebException e)
                            {
                                postFailed = true;
                                reply = e.Message;
                            }

                            // If the login failed
                            if (!reply.Contains(":") || postFailed)
                            {
                                // Translate the error message to a more user friendly wording
                                string errorMessage = reply;
                                switch (reply.ToLower())
                                {
                                case "bad login":
                                    errorMessage = "Invalid username or password.";
                                    break;
                                case "old version":
                                    errorMessage = "Please update.";
                                    break;
                                default:
                                    errorMessage = "Login failed: " + reply;
                                    break;
                                }

                                // Error
                                Application.Invoke((sender, e) => DoLogin(done, errorMessage));
                            }

                                // If the login succeeded
                            else
                            {
                                string[] responseValues = reply.Split(':');

                                // The response must have 4 values or it's invalid
                                if (responseValues.Length != 4)
                                {
                                    // Error
                                    Application.Invoke(
                                            (sender, e) =>
                                            DoLogin(done, "Got an invalid response from server"));
                                }
                                // Now we can finally return our login info.
                                else
                                {
                                    LoginInfo info = new LoginInfo(responseValues,
                                                                       loginDlg.ForceUpdate);
                                    done(info);
                                }
                            }
                        });
                    loginThread.Start();
                }
                else if (args.ResponseId == ResponseType.Reject)
                {
                    // Play offline
                    done(new LoginInfo(null, false, false));
                }
                else
                {
                    // Login cancelled
                    done(new LoginInfo());
                }
                loginDlg.Destroy();
            };
            loginDlg.Run();
        }
示例#5
0
        /// <summary>
        /// Opens a login dialog to allow the user to login.
        /// </summary>
        private void DoLogin(LoginCompleteHandler done, string message = "")
        {
            LoginDialog loginDlg = new LoginDialog(this, message);
            loginDlg.Response += (object o, ResponseArgs args) =>
            {
                if (args.ResponseId == ResponseType.Ok)
                {
                    Console.WriteLine("OK Clicked");
                    string parameters = Uri.EscapeUriString(string.Format(
                        "user={0}&password={1}&version={2}",
                        loginDlg.Username, loginDlg.Password, 13));

                    // Start a new thread and post the login info to login.minecraft.net
                    Thread loginThread = new Thread(
                        () =>
                    {
                        string reply = AppUtils.ExecutePost("https://login.minecraft.net",
                                                            parameters);

                        // If the login failed
                        if (!reply.Contains(":"))
                        {
                            // Translate the error message to a more user friendly wording
                            string errorMessage = reply;
                            switch (reply.ToLower())
                            {
                            case "bad login":
                                errorMessage = "Invalid username or password";
                                break;
                            // TODO add more error messages
                            default:
                                errorMessage = "Login failed: " + reply;
                                break;
                            }

                            // Error
                            Application.Invoke((sender, e) => DoLogin(done, errorMessage));
                        }

                        // If the login succeeded
                        else
                        {
                            string[] responseValues = reply.Split(':');

                            // The response must have 4 values or it's invalid
                            if (responseValues.Length != 4)
                            {
                                // Error
                                Application.Invoke(
                                    (sender, e) =>
                                    DoLogin(done, "Got an invalid response from server"));
                            }
                            // Now we can finally return our login info.
                            else
                            {
                                LoginInfo info = new LoginInfo(responseValues,
                                                               loginDlg.ForceUpdate);
                                done(info);
                            }
                        }
                    });
                    loginThread.Start();
                }
                else
                {
                    // Login cancelled
                    done(new LoginInfo());
                }
                loginDlg.Destroy();
            };
            loginDlg.Run();
        }