Example #1
0
        public ActionResult Show()
        {
            // 检查 URL 查询参数。
            if (string.IsNullOrEmpty(Request.QueryString["id"]))
            {
                return(Redirect("~/Contest"));
            }

            int id;

            if (!int.TryParse(Request.QueryString["id"], out id))
            {
                return(Redirect("~/Contest"));
            }
            ViewBag.ContestId = id;

            // 检查用户权限。
            ContestHandle contest = new ContestHandle(id);
            UserHandle    user    = UserSession.GetUserHandle(Session);

            switch (ContestAuthorization.GetUserAuthorizationState(contest, user).RegisterState)
            {
            case ContestRegisterState.IndividualRegistered:
            case ContestRegisterState.TeamRegistered:
                return(View());

            case ContestRegisterState.PasswordRequired:
                return(Redirect($"~/Contest/Verify?id={id}"));

            case ContestRegisterState.NotRegistered:
            default:
                return(Redirect("~/Contest"));
            }
        }
Example #2
0
        public ActionResult Delete()
        {
            string contestIdString = Request.QueryString["id"];

            if (string.IsNullOrEmpty(contestIdString))
            {
                return(new ContentResult());
            }

            int contestId;

            if (!int.TryParse(contestIdString, out contestId))
            {
                return(new ContentResult());
            }

            ContestHandle contest = new ContestHandle(contestId);
            UserHandle    user    = UserSession.GetUserHandle(Session);

            // 检查用户操作权限。
            if (!ContestAuthorization.GetUserAccess(contest, user).HasFlag(DataAccess.Write))
            {
                // 用户对该比赛没有写权限。
                return(new ContentResult());
            }

            ContestManager.Default.RemoveContest(contestId);
            return(new ContentResult());
        }
        public ActionResult ContestRegisterIdentity()
        {
            string contestIdString = Request.QueryString["id"];

            if (string.IsNullOrEmpty(contestIdString))
            {
                return(QueryResult(1, "Contest ID is required."));
            }

            int contestId;

            if (!int.TryParse(contestIdString, out contestId))
            {
                return(QueryResult(2, "Invalid contest ID."));
            }

            ContestHandle contest = new ContestHandle(contestId);
            UserHandle    user    = UserSession.GetUserHandle(Session);

            if (user == null)
            {
                // 当前会话中不存在任何活动的登录用户。
                return(QueryResult(3, "User session not exist."));
            }

            ContestAuthorizationState authState = ContestAuthorization.GetUserAuthorizationState(contest, user);

            if (authState.RegisterState == ContestRegisterState.NotRegistered ||
                authState.RegisterState == ContestRegisterState.PasswordRequired)
            {
                return(QueryResult(string.Empty));
            }
            else
            {
                if (authState.RegisterState == ContestRegisterState.IndividualRegistered)
                {
                    return(QueryResult(user.Username));
                }
                else
                {
                    TeamHandle registeredTeam = new TeamHandle(authState.TeamId);
                    using (TeamDataProvider teamData = TeamDataProvider.Create(registeredTeam, true))
                    {
                        return(QueryResult(teamData.Name));
                    }
                }
            }
        }
        public ActionResult ContestDetail()
        {
            string contestIdString = Request.QueryString["id"];

            if (string.IsNullOrEmpty(contestIdString))
            {
                return(QueryResult(1, "Contest ID required."));
            }

            int contestId;

            if (!int.TryParse(contestIdString, out contestId))
            {
                return(QueryResult(2, "Invalid contest ID."));
            }

            // 检查用户权限。
            ContestHandle contest = new ContestHandle(contestId);
            DataAccess    access  = ContestAuthorization.GetUserAccess(contest, UserSession.GetUserHandle(Session));

            if (access == DataAccess.None)
            {
                return(QueryResult(3, "Access denied."));
            }
            else if (access == DataAccess.Read)
            {
                // 用户对于该场比赛处于只读状态。检查比赛的执行状态。
                bool loadProblems = true;
                using (ContestDataProvider contestData = ContestDataProvider.Create(contest, true))
                {
                    if (contestData.Status == ContestStatus.Pending)
                    {
                        loadProblems = false;
                    }
                }

                return(QueryResult(ContestDisplayModel.FromContestHandle(contest, loadProblems)));
            }
            else
            {
                return(QueryResult(ContestDisplayModel.FromContestHandle(contest, true)));
            }
        }
        /// <summary>
        /// 将当前数据模型中的内容保存至给定的比赛。
        /// </summary>
        /// <param name="handle">比赛句柄。</param>
        /// <exception cref="ArgumentNullException"/>
        public void SaveTo(ContestHandle handle)
        {
            if (handle == null)
            {
                throw new ArgumentNullException(nameof(handle));
            }

            using (ContestDataProvider data = ContestDataProvider.Create(handle, false))
            {
                data.Title              = Title;
                data.Creator            = Creator;
                data.AuthorizationGroup = UsergroupConvert.ConvertFromString(UsergroupName);
                data.StartTime          = DateTime.ParseExact(StartTimeString, "yyyy-MM-dd HH:mm:ss", new CultureInfo("en-US"));
                data.EndTime            = DateTime.ParseExact(EndTimeString, "yyyy-MM-dd HH:mm:ss", new CultureInfo("en-US"));
                data.ParticipationMode  = ContestParticipationModeConvert.ConvertFromString(ParticipationModeName);
                data.AuthorizationMode  = ContestAuthorizationModeConvert.ConvertFromString(AuthorizationModeName);
            }

            ContestAuthorization.UpdateContestPassword(handle, Password ?? string.Empty);
        }
        public ActionResult ContestAccess()
        {
            string contestIdString = Request.QueryString["id"];

            if (string.IsNullOrEmpty(contestIdString))
            {
                return(QueryResult(1, "Contest ID is required."));
            }

            int contestId;

            if (!int.TryParse(contestIdString, out contestId))
            {
                return(QueryResult(2, "Invalid contest ID."));
            }

            ContestHandle contest = new ContestHandle(contestId);
            UserHandle    user    = UserSession.GetUserHandle(Session);

            return(QueryResult(ContestAuthorization.GetUserAccess(contest, user)));
        }
Example #7
0
        public ActionResult SetAnnouncement(FormCollection form)
        {
            string contestIdString = Request.QueryString["id"];

            if (string.IsNullOrEmpty(contestIdString))
            {
                return(new ContentResult());
            }

            int contestId;

            if (!int.TryParse(contestIdString, out contestId))
            {
                return(new ContentResult());
            }

            string announcement = form["announcementContent"];

            if (string.IsNullOrEmpty(announcement))
            {
                return(new ContentResult());
            }

            // 检查用户身份权限。
            ContestHandle contest = new ContestHandle(contestId);
            UserHandle    user    = UserSession.GetUserHandle(Session);

            if (!ContestAuthorization.GetUserAccess(contest, user).HasFlag(DataAccess.Write))
            {
                // 用户对当前的比赛没有写权限。
                return(new ContentResult());
            }

            using (ContestDataProvider contestData = ContestDataProvider.Create(contest, false))
            {
                contestData.Announcement = announcement;
            }

            return(new ContentResult());
        }
Example #8
0
        public ActionResult Verify()
        {
            // 检查用户操作权限。
            if (!UserSession.IsAuthorized(Session))
            {
                return(LoginController.RequestForLogin(this));
            }

            // 检查 URL 查询参数。
            if (string.IsNullOrEmpty(Request.QueryString["id"]))
            {
                return(Redirect("~/Contest"));
            }

            int id;

            if (!int.TryParse(Request.QueryString["id"], out id))
            {
                return(Redirect("~/Contest"));
            }

            ContestHandle             contest = new ContestHandle(id);
            UserHandle                user    = new UserHandle(UserSession.GetUsername(Session));
            ContestAuthorizationState state   = ContestAuthorization.GetUserAuthorizationState(contest, user);

            switch (state.RegisterState)
            {
            case ContestRegisterState.IndividualRegistered:
            case ContestRegisterState.TeamRegistered:
                return(Redirect($"~/Contest/Show?id={id}"));

            case ContestRegisterState.PasswordRequired:
                return(View());

            case ContestRegisterState.NotRegistered:
            default:
                ViewBag.Failed = true;
                return(View());
            }
        }
Example #9
0
        public ActionResult Verify(FormCollection form)
        {
            string contestIdString = Request.QueryString["id"];

            if (string.IsNullOrEmpty(contestIdString))
            {
                return(Redirect("~/Contest"));
            }

            int contestId;

            if (!int.TryParse(Request.QueryString["id"], out contestId))
            {
                return(Redirect("~/Contest"));
            }

            if (!ContestManager.Default.IsContestExist(contestId))
            {
                return(Redirect("~/Contest"));
            }

            ContestHandle contest = new ContestHandle(contestId);

            if (!ContestAuthorization.CheckContestPassword(contest, form["Password"]))
            {
                ViewBag.PasswordError = true;
                return(View());
            }
            else
            {
                // 检查注册参赛者身份。
                string participant = form["Participant"];
                if (string.IsNullOrEmpty(participant))
                {
                    ViewBag.ParticipantError = true;
                    return(View());
                }

                if (participant.StartsWith("(Individual)", StringComparison.CurrentCultureIgnoreCase))
                {
                    string username = participant.Substring("(Individual)".Length);
                    if (!UserManager.Default.IsUserExist(username))
                    {
                        ViewBag.ParticipantError = true;
                        return(View());
                    }

                    ContestAuthorization.Register(contest, new UserHandle(username));
                }
                else if (participant.StartsWith("(Teamwork)", StringComparison.CurrentCultureIgnoreCase))
                {
                    int teamId;
                    if (!int.TryParse(participant.Substring("(Teamwork)".Length), out teamId))
                    {
                        ViewBag.ParticipantError = true;
                        return(View());
                    }

                    if (!UserManager.Default.IsTeamExist(teamId))
                    {
                        ViewBag.ParticipantError = true;
                        return(View());
                    }

                    ContestAuthorization.Register(contest, new TeamHandle(teamId));
                }
                else
                {
                    ViewBag.ParticipantError = true;
                    return(View());
                }

                return(Redirect(string.Format("~/Contest/Show?id={0}", contestId)));
            }
        }