Exemple #1
0
        public async Task <IActionResult> Get(
            [FromServices] JoyOIUC UC,
            int?page,
            string username,
            CancellationToken token)
        {
            IQueryable <User> ret = DB.Users;

            if (!string.IsNullOrWhiteSpace(username))
            {
                ret = ret.Where(x => x.UserName.Contains(username) || username.Contains(x.UserName));
            }

            var result = await DoPaging(ret, page ?? 1, 50, token);

            var type = typeof(IdentityUser <Guid>);

            foreach (var x in result.data.result)
            {
                foreach (var y in type.GetProperties().Where(y => y.Name != nameof(IdentityUser.Id) && y.Name != nameof(IdentityUser.UserName)))
                {
                    y.SetValue(x, y.PropertyType.IsValueType ? Activator.CreateInstance(y.PropertyType) : null);
                }
            }

            return(Json(result));
        }
Exemple #2
0
        public async Task <IActionResult> Get(
            [FromServices] JoyOIUC UC,
            int?page,
            string username,
            CancellationToken token)
        {
            IQueryable <User> ret = DB.Users;

            if (!string.IsNullOrWhiteSpace(username))
            {
                ret = ret.Where(x => x.UserName.Contains(username));
            }

            if (IsGroupRequest())
            {
                var subQuery = DB.GroupMembers.Where(x => x.GroupId == CurrentGroup.Id).Select(x => x.UserId);
                ret = ret.Where(x => subQuery.Contains(x.Id));
            }

            var result = await DoPaging(ret.Select(x => new UserListViewModel
            {
                Id        = x.Id,
                UserName  = x.UserName,
                AvatarUrl = x.AvatarUrl
            }), page ?? 1, 50, token);

            FilterResult(result.data.result);
            return(Json(result));
        }
        public IActionResult Sign([FromServices] JoyOIUC UC, CancellationToken token)
        {
            if (string.IsNullOrEmpty(HttpContext.Session.GetString("user")))
            {
                return(Content("Failed"));
            }

            var openId = Guid.Parse(HttpContext.Session.GetString("user"));
            var today  = DateTime.UtcNow.Date;

            lock (rand)
            {
                if (DB.Records.Any(x => x.UserId == openId && x.Time >= today))
                {
                    return(Content("Signed"));
                }

                var rec = new Record
                {
                    Coins  = rand.Next(10, 50),
                    Time   = DateTime.UtcNow,
                    UserId = openId
                };

                DB.Records.Add(rec);
                UC.IncreaseExtensionCoinAsync(openId, HttpContext.Session.GetString("token"), "Coin", rec.Coins).Wait();
                DB.SaveChanges();

                return(Content(rec.Coins.ToString()));
            }
        }
Exemple #4
0
 public async Task <IActionResult> Message([FromServices] JoyOIUC UC, CancellationToken token)
 {
     if (User.IsSignedIn())
     {
         return(Result(await UC.HasUnreadMessageAsync(User.Current.OpenId)));
     }
     return(Result(false));
 }
Exemple #5
0
 public async Task <IActionResult> GetSessionCoin([FromServices] JoyOIUC UC, CancellationToken token)
 {
     if (User.IsSignedIn())
     {
         return(Result((await UC.GetExtensionCoinAsync(User.Current.OpenId, null, "coin")).data));
     }
     else
     {
         return(Result(401, "No Login"));
     }
 }
        public async Task <IActionResult> Login([FromServices] JoyOIUC UC, string username, string password, CancellationToken token)
        {
            var result = await UC.TrustedAuthorizeAsync(username, password);

            if (result.succeeded)
            {
                HttpContext.Session.Clear();
                HttpContext.Session.SetString("user", result.data.open_id.ToString());
                HttpContext.Session.SetString("token", result.data.access_token.ToString());
                return(Redirect("/"));
            }
            else
            {
                return(View("InvalidPwd"));
            }
        }
Exemple #7
0
        public async Task <IActionResult> GetSessionInfo([FromServices] JoyOIUC UC, CancellationToken token)
        {
            var ret = new Dictionary <string, object>();

            ret.Add("isSignedIn", User.Current != null);
            if (User.Current != null)
            {
                var roles = await User.Manager.GetRolesAsync(User.Current);

                ret.Add("id", User.Current.Id);
                ret.Add("username", User.Current.UserName);
                ret.Add("email", User.Current.Email);
                ret.Add("role", roles.Count > 0 ? roles.First() : "Member");
                ret.Add("tried", User.Current.TriedProblems.Object);
                ret.Add("passed", User.Current.PassedProblems.Object);
                ret.Add("chat", UC.GenerateChatWindowUrl(User.Current.OpenId));
            }
            return(Result <dynamic>(ret));
        }
Exemple #8
0
        public async Task <IActionResult> Login([FromServices] JoyOIUC UC, string username, string password)
        {
            var result = await UC.TrustedAuthorizeAsync(username, password);

            if (result.succeeded)
            {
                HttpContext.Session.SetInt32("login", 1);
                return(RedirectToAction("Index", "Home"));
            }
            else
            {
                return(Prompt(x =>
                {
                    x.Title = "登录失败";
                    x.Details = result.msg;
                    x.StatusCode = 400;
                }));
            }
        }
Exemple #9
0
        public async Task <IActionResult> PutTestCasePurchase(
            [FromServices] JoyOIUC UC,
            string problemId,
            CancellationToken token)
        {
            // 判断是否已经购买
            if (await DB.TestCasePurchases.AnyAsync(x => x.ProblemId == problemId && x.UserId == User.Current.Id, token))
            {
                return(Result(400, "Already purchased"));
            }
            else if (!await ProblemIsVisiableAsync(problemId, token) && !IsMasterOrHigher && !await HasPermissionToProblemAsync(problemId, token))
            {
                return(Result(401, "No permission"));
            }
            else
            {
                var coins = (await UC.GetExtensionCoinAsync(User.Current.OpenId, null, Constants.CoinField)).data;
                if (coins < TestCasePurchase.Cost && !IsMasterOrHigher && !await HasPermissionToProblemAsync(problemId, token))
                {
                    return(Result(400, string.Format("You only have {0} coins, but the problem requires {1}", coins, TestCasePurchase.Cost)));
                }
                else
                {
                    await UC.DecreaseExtensionCoinAsync(User.Current.OpenId, null, Constants.CoinField, TestCasePurchase.Cost);

                    DB.TestCasePurchases.Add(new TestCasePurchase
                    {
                        ProblemId   = problemId,
                        CreatedTime = DateTime.UtcNow,
                        UserId      = User.Current.Id
                    });
                    await DB.SaveChangesAsync(token);

                    return(Result(200, "Succeeded"));
                }
            }
        }
Exemple #10
0
        public async Task <IActionResult> Login(
            string Username,
            string Password,
            string RedirectUrl,
            [FromServices] JoyOIUC UC)
        {
            var authorizeResult = await UC.TrustedAuthorizeAsync(Username, Password);

            if (authorizeResult.succeeded)
            {
                var profileResult = await UC.GetUserProfileAsync(authorizeResult.data.open_id, authorizeResult.data.access_token);

                User user = await UserManager.FindByNameAsync(Username);

                if (user == null)
                {
                    user = new User
                    {
                        Id          = authorizeResult.data.open_id,
                        UserName    = Username,
                        Email       = profileResult.data.email,
                        PhoneNumber = profileResult.data.phone,
                        SiteName    = profileResult.data.nickname,
                        Template    = "Default",
                        AccessToken = authorizeResult.data.access_token,
                        ExpireTime  = authorizeResult.data.expire_time,
                        OpenId      = authorizeResult.data.open_id,
                        AvatarUrl   = UC.GetAvatarUrl(authorizeResult.data.open_id)
                    };

                    await UserManager.CreateAsync(user, Password);
                }

                if (authorizeResult.data.is_root)
                {
                    await UserManager.AddToRoleAsync(user, "Root");
                }

                var username = (await UC.GetUsernameAsync(authorizeResult.data.open_id, authorizeResult.data.access_token)).data;
                var domain   = string.Format(Configuration["Host:DomainTemplate"], username);
                if (!DB.DomainBindings.Any(x => x.Domain == domain))
                {
                    DB.DomainBindings.Add(new DomainBinding
                    {
                        Domain = domain,
                        UserId = authorizeResult.data.open_id
                    });
                    DB.SaveChanges();
                }

                await SignInManager.SignInAsync(user, true);

                if (!string.IsNullOrWhiteSpace(RedirectUrl))
                {
                    return(Redirect(RedirectUrl));
                }
                else
                {
                    return(RedirectToAction("Index"));
                }
            }
            else
            {
                return(Prompt(x =>
                {
                    x.Title = SR["Sign in failed"];
                    x.Details = authorizeResult.msg;
                    x.StatusCode = authorizeResult.code;
                }));
            }
        }
Exemple #11
0
 public async Task <IActionResult> Message([FromServices] JoyOIUC UC, CancellationToken token)
 {
     return(Result(await UC.HasUnreadMessage(User.Current.OpenId)));
 }
Exemple #12
0
        public async Task <IActionResult> PutSession([FromServices] JoyOIUC UC, CancellationToken token)
        {
            var login           = JsonConvert.DeserializeObject <Login>(RequestBody);
            var authorizeResult = await UC.TrustedAuthorizeAsync(login.Username, login.Password);

            if (authorizeResult.succeeded)
            {
                var profileResult = await UC.GetUserProfileAsync(authorizeResult.data.open_id, authorizeResult.data.access_token);

                User user = await UserManager.FindByNameAsync(login.Username);

                if (user == null)
                {
                    user = new User
                    {
                        Id          = authorizeResult.data.open_id,
                        UserName    = login.Username,
                        Email       = profileResult.data.email,
                        PhoneNumber = profileResult.data.phone,
                        AccessToken = authorizeResult.data.access_token,
                        ExpireTime  = authorizeResult.data.expire_time,
                        OpenId      = authorizeResult.data.open_id,
                        AvatarUrl   = UC.GetAvatarUrl(authorizeResult.data.open_id)
                    };

                    await UserManager.CreateAsync(user, login.Password);
                }

                var roles = await UserManager.GetRolesAsync(user);

                if (authorizeResult.data.is_root)
                {
                    if (!roles.Any(x => x == "Root"))
                    {
                        await UserManager.AddToRoleAsync(user, "Root");
                    }
                }
                else
                {
                    if (roles.Any(x => x == "Root"))
                    {
                        await UserManager.RemoveFromRoleAsync(user, "Root");
                    }
                }

                await SignInManager.SignInAsync(user, true);

                user.LastLoginTime = DateTime.Now;
                DB.SaveChanges();

                var cookie = HttpContext.Response.Headers["Set-Cookie"].ToString();
                var expire = DateTime.Parse(CookieExpireRegex.Match(cookie).Value).ToTimeStamp();

                return(Result <dynamic>(new
                {
                    Cookie = cookie
                             .Replace(" httponly", "")
                             .Replace("samesite=lax", "")
                             .Replace("path=/;", ""),
                    Expire = expire
                }));
            }
            else
            {
                return(Result(400, authorizeResult.msg));
            }
        }