protected async Task <string> Login(string token, bool isAuto = false) { lock (UserInfo) { if (UserInfo.Status != UserStatus.NoLogin) { return(UserInfo.Status == UserStatus.Pending ? "操作进行中, 请稍候" : "用户已登录"); } if (token.Length != 16) { return("Token 无效"); } UserInfo.Status = UserStatus.Pending; PushUserInfo(); } LogManager.Log(1, "Service", "开始登录, Token: " + token.Substring(0, 4) + "********" + token.Substring(12)); try { Natfrp.Token = token; var user = await Natfrp.Request <Natfrp.GetUser>("get_user"); if (!user.Data.Login) { LogManager.Log(3, "Service", "服务器拒绝登录: " + user.Message); Logout(true); return(user.Message); } lock (UserInfo) { UserInfo.Id = user.Data.Id; UserInfo.Name = user.Data.Name; UserInfo.Meta = user.Data.Meta; UserInfo.Status = UserStatus.LoggedIn; AutoLogin = false; } Save(); NodeManager.Clear(); NodeManager.Start(); TunnelManager.Clear(); TunnelManager.Start(); PushUserInfo(); LogManager.Log(1, "Service", "用户登录成功"); RemoteManager.Start(); } catch (Exception e) { if (isAuto) { LogManager.Log(3, "Service", "自动登录失败, 将在稍后重试: " + e.ToString()); lock (UserInfo) { UserInfo.Status = UserStatus.NoLogin; } // Don't push here } else { LogManager.Log(3, "Service", "用户登录失败: " + e.ToString()); Logout(true); } return(e.ToString()); } return(null); }