Ejemplo n.º 1
0
        private async void LoginButtonClicked(object sender, RoutedEventArgs e)
        {
            var mainPage = (App.Current as App).MainPage;

            string username = NameBox.Text, password = PasswordBox.Password;

            Logging     = true;
            LoggingStep = "测试网络连接……";
            ErrorReason = "";

            if (!await BaiduYun.Init())
            {
                Logging     = false;
                ErrorReason = "无法与百度获取联系";
                return;
            }

            var gid = Utils.GIDGenerator();

            LoggingStep = "获取登录 token……";

            var token = await BaiduYun.GetToken(gid);

            if (token == null)
            {
                Logging = false;
                return;
            }

            LoggingStep = "获取 RSA 密钥……";

            var rsa = await BaiduYun.GetRSA(token);

            if (rsa == null || rsa.errno != 0)
            {
                Logging     = false;
                ErrorReason = "获取 RSA 密钥失败";
                return;
            }

            //LoggingStep = "获取账户状态……";

            //var status = await BaiduYun.CheckAccountState(token, username);
            //if (status == null || status.errInfo.no != 0) {
            //    Logging = false;
            //    ErrorReason = "账户异常" + (status == null ? "" : String.Format("-异常代码:{0}", status.errInfo.no));
            //    return;
            //}

            string codestring = null, vcodetype = null, verifycode = null;

            LoggingStep = "正在登录……";

            for (;;)
            {
                if (!String.IsNullOrWhiteSpace(codestring))
                {
                    var dialog = new Pages.CaptchaDialog(token, codestring, vcodetype);
                    Tuple <string, string> tuple = await dialog.CaptchaAsync();

                    verifycode = tuple.Item1; codestring = tuple.Item2;
                    if (String.IsNullOrWhiteSpace(verifycode))
                    {
                        Logging     = false;
                        ErrorReason = "您中止了验证码输入";
                        return;
                    }
                    if (!await BaiduYun.CheckCaptcha(token, codestring, verifycode))
                    {
                        Logging     = false;
                        ErrorReason = "验证码错误";
                        return;
                    }
                }
                var result = await BaiduYun.Login(token, rsa, username, password, codestring, verifycode, gid);

                if (String.IsNullOrEmpty(result))
                {
                    Logging     = false;
                    ErrorReason = "网络异常,无法继续登录";
                    return;
                }
                var query = Utils.ParseQueryString(result);
                int error = Int32.Parse(query["err_no"]);

                switch (error)
                {
                case Errors.OK:
                    goto OK;

                case Errors.CAPTCHA_REQUIRED:
                case Errors.CAPTCHA:
                    codestring = query["codeString"];
                    vcodetype  = query["vcodetype"];
                    continue;

                case Errors.EXTERNAL_VERIFICATION_REQUIRED:
                    var auth_token = query["authtoken"];
                    var lstr       = query["lstr"];
                    var ltoken     = query["ltoken"];
                    var dialog     = new Pages.EmailVerifyDialog(auth_token);
                    if (!await dialog.VCodeAsync())
                    {
                        Logging     = false;
                        ErrorReason = "邮箱验证失败";
                        return;
                    }
                    if (!await BaiduYun.ReVerifyLogin(lstr, ltoken))
                    {
                        Logging     = false;
                        ErrorReason = "登录失败";
                        return;
                    }
                    goto OK;

                default:
                    Logging     = false;
                    ErrorReason = String.Format("登录异常,错误码{0}", error);
                    return;
                }
            }

OK:
            LoggingStep = "正在获取 BDSToken……";

            var bdstoken = await BaiduYun.GetBDSToken();

            var uk = await BaiduYun.GetUserUK();

            if (bdstoken == null || uk == null)
            {
                Logging     = false;
                ErrorReason = "网络异常";
                return;
            }

            LoggingStep = "正在获取用户名……";

            var realun = await BaiduYun.GetUserName(); // real username

            if (realun == null)
            {
                Logging     = false;
                ErrorReason = "网络异常";
                return;
            }

            var json = Globals.everything;

            var user = await BaiduYun.GetUserInfo(uk);

            if (user == null || user.errno != 0)
            {
                Logging     = false;
                ErrorReason = "无法获取账户信息";
                return;
            }

            var userinfo = user.user_info;

            json.SetNamedValue("currentUser", JsonValue.CreateStringValue(userinfo.uname));
            var u = new User()
            {
                UserName     = realun,
                AvatarUrl    = userinfo.avatar_url,
                UK           = uk,
                SavePassword = SavePassword.IsChecked ?? false,
                AutoLogin    = (SavePassword.IsChecked ?? false) && (AutoLogin.IsChecked ?? false),
            };

            LocalUtils.AddUser(u, password);
            Globals.bdstoken = bdstoken;

            Logging = false;
            mainPage.SetAsOnline(u);
            mainPage.RootFrame.Navigate(typeof(Files), u);
            mainPage.RootFrame.BackStack.Clear();
        }