Exemple #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"));
            }
        }
Exemple #2
0
        public ActionResult Edit(ContestDetailModel model)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            // 验证数据模型。
            if (!ValidateContestDetailModel(model))
            {
                return(View(model));
            }

            // 执行用户身份验证。
            ContestHandle handle = new ContestHandle(model.ContestId);

            using (ContestDataProvider data = ContestDataProvider.Create(handle, true))
            {
                if (!UserSession.IsAuthorized(Session) ||
                    string.Compare(data.Creator, UserSession.GetUsername(Session), false) != 0)
                {
                    return(Redirect("~/Error/AccessDenied"));
                }
            }

            model.SaveTo(handle);
            return(Redirect($"~/Contest/Show?id={model.ContestId}"));
        }
Exemple #3
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());
        }
Exemple #4
0
        public ActionResult AddProblem(ProblemDetailModel model)
        {
            // 检查参数。
            if (string.IsNullOrEmpty(Request.QueryString["id"]))
            {
                return(Redirect("~/Contest"));
            }

            int contestId;

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

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

            // 验证数据模型。
            if (!TryValidateModel(model))
            {
                ViewBag.TitleErrorMessage = ModelStateHelper.GetFirstError(ModelState, "Title");
                return(View(model));
            }

            ContestHandle contestHandle = new ContestHandle(contestId);

            using (ContestDataProvider contestData = ContestDataProvider.Create(contestHandle, false))
            {
                // 验证用户操作权限。
                if (!UserSession.IsAuthorized(Session) ||
                    string.Compare(contestData.Creator, UserSession.GetUsername(Session), false) != 0)
                {
                    return(Redirect("~/Error/AccessDenied"));
                }

                // 在题目库中创建题目。
                ProblemHandle problemHandle = ProblemArchieveManager.Default.CreateProblem(
                    contestData.PeekNextProblemId());

                model.ResetNullStrings();
                model.SaveTo(problemHandle);            // 为避免死锁,该句不应放置在下面的 using 块中。

                using (ProblemDataProvider problemData = ProblemDataProvider.Create(problemHandle, false))
                {
                    problemData.ContestId          = contestId;
                    problemData.AuthorizationGroup = UserGroup.Guests;
                }

                // 将创建的题目添加至当前比赛中。
                contestData.AddProblem(problemHandle);
            }

            return(Redirect($"~/Contest/Show?id={contestId}"));
        }
        /// <summary>
        /// 检查给定的用户能否访问给定的题目。
        /// </summary>
        /// <param name="problemHandle">题目句柄。</param>
        /// <param name="userHandle">用户句柄。若当前会话尚未活动登录用户,传入 null。</param>
        /// <returns>一个值,该值只是给定身份权限的用户能否访问给定的题目。</returns>
        /// <exception cref="ArgumentNullException"/>
        public static DataAccess GetUserAccess(ProblemHandle problemHandle, UserHandle userHandle)
        {
            if (problemHandle == null)
            {
                throw new ArgumentNullException(nameof(problemHandle));
            }

            /*
             * 检查顺序如下:
             * 1. 用户为管理员;
             * 2. 题目为比赛题目;
             * 3. 用户用户组权限低于题目要求的最低用户组权限。
             *
             */

            // 检查用户是否为管理员身份。
            if (userHandle != null && UserAuthorization.CheckAccessRights(UserGroup.Administrators,
                                                                          UserAuthorization.GetUserGroup(userHandle)))
            {
                return(DataAccess.ReadWrite);
            }

            using (ProblemDataProvider problemData = ProblemDataProvider.Create(problemHandle, true))
            {
                if (problemData.ContestId != -1)
                {
                    // 比赛题目。
                    if (userHandle == null)
                    {
                        return(DataAccess.None);
                    }

                    ContestHandle contestHandle = ContestManager.Default.QueryContestById(problemData.ContestId);
                    return(ContestAuthorization.GetUserAccess(contestHandle, userHandle));
                }
                else
                {
                    // 主题目库题目
                    UserGroup usergroup = (userHandle == null)
                        ? UserGroup.Guests : UserAuthorization.GetUserGroup(userHandle);

                    if (UserAuthorization.CheckAccessRights(problemData.AuthorizationGroup, usergroup))
                    {
                        return(DataAccess.Read);
                    }
                    else
                    {
                        return(DataAccess.None);
                    }
                }
            }
        }
        // GET: Archieve/TestSet?id={ProblemID}
        public ActionResult TestSet()
        {
            // 执行用户身份验证。
            if (!UserSession.IsAuthorized(Session))
            {
                return(Redirect("~/Error/AccessDenied"));
            }

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

            string        problemId     = Request.QueryString["id"];
            ProblemHandle problemHandle = ProblemArchieveManager.Default.GetProblemById(problemId);

            if (problemHandle == null)
            {
                // 给定的题目不存在。
                return(Redirect("~/Archieve"));
            }

            using (ProblemDataProvider problemData = ProblemDataProvider.Create(problemHandle, true))
            {
                // 执行进一步身份验证。
                if (problemData.ContestId == -1)
                {
                    if (!UserAuthorization.CheckAccessRights(UserGroup.Administrators, UserSession.GetUserGroup(Session)))
                    {
                        return(Redirect("~/Error/AccessDenied"));
                    }
                }
                else
                {
                    ContestHandle contestHandle = new ContestHandle(problemData.ContestId);
                    using (ContestDataProvider contestData = ContestDataProvider.Create(contestHandle, true))
                    {
                        if (string.Compare(contestData.Creator, UserSession.GetUsername(Session), false) != 0)
                        {
                            return(Redirect("~/Error/AccessDenied"));
                        }
                    }
                }
            }

            // TODO: 完成 Archieve/TestSet 控制器逻辑。
            return(View());
        }
        /// <summary>
        /// 获取给定用户对给定比赛的数据操作权限。
        /// </summary>
        /// <param name="contest">比赛句柄。</param>
        /// <param name="user">用户句柄。若当前活动会话中不存在活动的登录用户,传入 null。</param>
        /// <returns>一个 DataAccess 枚举,表示给定用户对于给定比赛的数据操作权限。</returns>
        /// <exception cref="ArgumentNullException"/>
        public static DataAccess GetUserAccess(ContestHandle contest, UserHandle user)
        {
            if (contest == null)
            {
                throw new ArgumentNullException(nameof(contest));
            }

            /*
             * 检查顺序如下:
             * 1. 当前活动会话中无活动登录用户。
             * 2. 用户为管理员身份;
             * 3. 用户为比赛创建者;
             * 4. 用户为比赛注册用户。
             *
             */

            if (user == null)
            {
                return(DataAccess.None);
            }

            // 检查用户是否为管理员身份。
            if (UserAuthorization.CheckAccessRights(UserGroup.Administrators, UserAuthorization.GetUserGroup(user)))
            {
                return(DataAccess.ReadWrite);
            }

            // 检查用户是否为比赛创建者。
            using (ContestDataProvider contestData = ContestDataProvider.Create(contest, true))
            {
                if (string.Compare(contestData.Creator, user.Username, false) == 0)
                {
                    return(DataAccess.ReadWrite);
                }
            }

            // 检查用户是否已经注册。
            if (GetUserAuthorizationState(contest, user).RegisterState == ContestRegisterState.NotRegistered)
            {
                // 未注册用户。不具备数据访问及操作权限。
                return(DataAccess.None);
            }
            else
            {
                // 注册用户。具有读权限。
                return(DataAccess.Read);
            }
        }
        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));
                    }
                }
            }
        }
        /// <summary>
        /// 将给定的队伍添加至给定的比赛的注册队伍列表中。
        /// </summary>
        /// <param name="contest">比赛句柄。</param>
        /// <param name="team">要添加的队伍句柄。</param>
        /// <exception cref="ArgumentNullException"/>
        public static void Register(ContestHandle contest, TeamHandle team)
        {
            if (contest == null)
            {
                throw new ArgumentNullException(nameof(contest));
            }
            if (team == null)
            {
                throw new ArgumentNullException(nameof(team));
            }

            using (ContestDataProvider contestData = ContestDataProvider.Create(contest, false))
            {
                contestData.AddTeamToAuthorizedList(team);
            }
        }
        /// <summary>
        /// 将给定的用户添加至给定的比赛的注册用户列表中。
        /// </summary>
        /// <param name="contest">比赛句柄。</param>
        /// <param name="user">要添加的用户句柄。</param>
        /// <exception cref="ArgumentNullException"/>
        public static void Register(ContestHandle contest, UserHandle user)
        {
            if (contest == null)
            {
                throw new ArgumentNullException(nameof(contest));
            }
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            using (ContestDataProvider contestData = ContestDataProvider.Create(contest, false))
            {
                contestData.AddUserToAuthorizedList(user);
            }
        }
Exemple #11
0
        /// <summary>
        /// 从给定的题目句柄创建 ContestDataProvider 类的新实例。
        /// </summary>
        /// <param name="handle">比赛句柄。</param>
        /// <param name="isReadonly">一个值,该值指示当前对象是否为只读对象。</param>
        /// <returns>从给定的题目句柄创建的 ContestDataProvider 对象。</returns>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="ContestNotFoundException"/>
        public static ContestDataProvider Create(ContestHandle handle, bool isReadonly)
        {
            if (handle == null)
            {
                throw new ArgumentNullException(nameof(handle));
            }

            ContestDataContext context = new ContestDataContextFactory().CreateContext();
            ContestEntity      entity  = context.QueryContestById(handle.ContestId);

            if (entity == null)
            {
                context.Dispose();
                throw new ContestNotFoundException(handle);
            }

            return(new ContestDataProvider(context, entity, isReadonly));
        }
Exemple #12
0
        // GET: /Status/ShowSubmission?id={SubmissionID}
        public ActionResult ShowSubmission()
        {
            // 检查查询参数。
            if (string.IsNullOrEmpty(Request.QueryString["id"]))
            {
                return(Redirect("~/Status"));
            }

            int submissionId;

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

            SubmissionHandle submissionHandle = SubmissionManager.Default.QuerySubmissionById(submissionId);

            if (submissionHandle == null)
            {
                // 给定的用户提交不存在。
                return(Redirect("~/Status"));
            }

            // 验证操作权限。
            using (SubmissionDataProvider submissionData = SubmissionDataProvider.Create(submissionHandle, true))
            {
                if (submissionData.ContestId != -1)
                {
                    ContestHandle contestHandle = new ContestHandle(submissionData.ContestId);
                    using (ContestDataProvider contestData = ContestDataProvider.Create(contestHandle, true))
                    {
                        if (contestData.Status != ContestStatus.Ended &&
                            string.Compare(submissionData.Username, UserSession.GetUsername(Session)) != 0)
                        {
                            return(Redirect(Request.UrlReferrer.ToString()));
                        }
                    }
                }
            }

            SubmissionDetailModel model = SubmissionDetailModel.FromSubmissionHandle(submissionHandle);

            return(View(model));
        }
        /// <summary>
        /// 检查给定的密码是否与给定比赛的密码匹配。
        /// </summary>
        /// <param name="contest">比赛句柄。</param>
        /// <param name="password">密码。</param>
        /// <returns>一个值,该值指示给定的密码是否与给定比赛的密码匹配。</returns>
        /// <exception cref="ArgumentNullException"/>
        public static bool CheckContestPassword(ContestHandle contest, string password)
        {
            if (contest == null)
            {
                throw new ArgumentNullException(nameof(contest));
            }
            if (password == null)
            {
                throw new ArgumentNullException(nameof(password));
            }

            byte[] hash = PasswordHashAlgorithm.ComputeHash(PasswordEncoding.GetBytes(password));

            // 比较密码哈希值是否相同。
            using (ContestDataProvider contestData = ContestDataProvider.Create(contest, true))
            {
                return(Buffer.IsByteArraysEqual(hash, contestData.PasswordHash));
            }
        }
        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="contest">比赛句柄。</param>
        /// <param name="password">更新后的密码。</param>
        /// <exception cref="ArgumentNullException"/>
        public static void UpdateContestPassword(ContestHandle contest, string password)
        {
            if (contest == null)
            {
                throw new ArgumentNullException(nameof(contest));
            }
            if (password == null)
            {
                throw new ArgumentNullException(nameof(password));
            }

            // 计算密码哈希值。
            byte[] hash = PasswordHashAlgorithm.ComputeHash(PasswordEncoding.GetBytes(password));

            using (ContestDataProvider contestData = ContestDataProvider.Create(contest, false))
            {
                contestData.PasswordHash = hash;
            }
        }
        /// <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)));
        }
Exemple #18
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());
            }
        }
Exemple #19
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());
        }
Exemple #20
0
        /// <summary>
        /// 从给定的比赛句柄创建 ContestDisplayMode 类的新实例。
        /// </summary>
        /// <param name="handle">比赛句柄。</param>
        /// <param name="loadProblems">一个值,该值指示是否加载题目列表。</param>
        /// <returns>从给定比赛创建的 ContestDisplayModel 对象。</returns>
        /// <exception cref="ArgumentNullException"/>
        public static ContestDisplayModel FromContestHandle(ContestHandle handle, bool loadProblems)
        {
            if (handle == null)
            {
                throw new ArgumentNullException(nameof(handle));
            }

            ContestDisplayModel model = new ContestDisplayModel();

            using (ContestDataProvider data = ContestDataProvider.Create(handle, true))
            {
                model.ContestId         = data.ContestId;
                model.Title             = data.Title;
                model.Creator           = data.Creator;
                model.Announcement      = new Markdown().Transform(data.Announcement);
                model.StartTime         = data.StartTime;
                model.EndTime           = data.EndTime;
                model.Status            = data.Status;
                model.AuthorizationMode = data.AuthorizationMode;
                model.ParticipationMode = data.ParticipationMode;

                if (loadProblems)
                {
                    ProblemHandle[] handles = data.GetProblems();
                    model.Problems = new ProblemBriefModel[handles.Length];

                    for (int i = 0; i < handles.Length; ++i)
                    {
                        model.Problems[i] = ProblemBriefModel.FromProblemHandle(handles[i]);
                    }
                }
                else
                {
                    model.Problems = new ProblemBriefModel[0];
                }
            }

            return(model);
        }
Exemple #21
0
        public ActionResult Add(ContestDetailModel model)
        {
            // 执行用户身份验证。
            if (!UserSession.IsAuthorized(Session) || !UserAuthorization.CheckAccessRights(UserGroup.Insiders,
                                                                                           UserSession.GetUserGroup(Session)))
            {
                return(Redirect("~/Error/AccessDenied"));
            }

            // 验证数据模型。
            if (!ValidateContestDetailModel(model))
            {
                return(View(model));
            }

            // 创建比赛。
            ContestHandle handle = ContestManager.Default.CreateContest();

            model.SaveTo(handle);

            return(Redirect("~/Contest"));
        }
        /// <summary>
        /// 从给定的比赛句柄创建 ContestBriefModel 类的新实例。
        /// </summary>
        /// <param name="handle">比赛句柄。</param>
        /// <returns>从给定的比赛句柄创建的 ContestBriefModel 类对象。</returns>
        /// <exception cref="ArgumentNullException"/>
        public static ContestBriefModel FromContestHandle(ContestHandle handle)
        {
            if (handle == null)
            {
                throw new ArgumentNullException(nameof(handle));
            }

            ContestBriefModel model = new ContestBriefModel();

            using (ContestDataProvider data = ContestDataProvider.Create(handle, true))
            {
                model.ContestId         = data.ContestId;
                model.Title             = data.Title;
                model.Creator           = data.Creator;
                model.StartTime         = data.StartTime;
                model.EndTime           = data.EndTime;
                model.AuthorizationMode = data.AuthorizationMode;
                model.ParticipationMode = data.ParticipationMode;
                model.Status            = data.Status;
            }

            return(model);
        }
        /// <summary>
        /// 从给定的比赛句柄创建 ContestDetailModel 类的新实例。
        /// </summary>
        /// <param name="handle">比赛句柄。</param>
        /// <returns>从给定的比赛句柄创建的比赛详细信息数据模型对象。</returns>
        /// <exception cref="ArgumentNullException"/>
        public static ContestDetailModel FromContestHandle(ContestHandle handle)
        {
            if (handle == null)
            {
                throw new ArgumentNullException(nameof(handle));
            }

            ContestDetailModel model = new ContestDetailModel();

            using (ContestDataProvider data = ContestDataProvider.Create(handle, true))
            {
                model.ContestId             = data.ContestId;
                model.Title                 = data.Title;
                model.Creator               = data.Creator;
                model.UsergroupName         = UsergroupConvert.ConvertToString(data.AuthorizationGroup);
                model.CreationTime          = data.CreationTime;
                model.StartTimeString       = data.StartTime.ToString("yyyy-MM-dd HH:mm:ss");
                model.EndTimeString         = data.EndTime.ToString("yyyy-MM-dd HH:mm:ss");
                model.AuthorizationModeName = ContestAuthorizationModeConvert.ConvertToString(data.AuthorizationMode);
                model.ParticipationModeName = ContestParticipationModeConvert.ConvertToString(data.ParticipationMode);
            }

            return(model);
        }
Exemple #24
0
        public ActionResult Edit()
        {
            // 检查查询参数。
            if (string.IsNullOrEmpty(Request.QueryString["id"]))
            {
                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);

            using (ContestDataProvider data = ContestDataProvider.Create(contest, false))
            {
                // 验证用户身份权限。
                if (!UserSession.IsAuthorized(Session) ||
                    string.Compare(data.Creator, UserSession.GetUsername(Session), false) != 0)
                {
                    return(Redirect("~/Error/AccessDenied"));
                }
            }

            ContestDetailModel model = ContestDetailModel.FromContestHandle(contest);

            return(View(model));
        }
 /// <summary>
 /// 使用给定的比赛句柄创建 ContestNotFoundException 类的新实例。
 /// </summary>
 /// <param name="handle"></param>
 public ContestNotFoundException(ContestHandle handle) : base(handle, $"比赛 {handle.ContestId} 未找到。")
 {
 }
        /// <summary>
        /// 获取给定的用户在给定的比赛中的注册信息。
        /// </summary>
        /// <param name="contest">比赛句柄。</param>
        /// <param name="user">用户句柄。若当前登录会话中不存在活动用户,传入 null。</param>
        /// <returns>一个 ContestAuthorizationState 类实例对象,其中封装了给定的用户在给定的比赛中的注册信息。</returns>
        /// <exception cref="ArgumentNullException"/>
        public static ContestAuthorizationState GetUserAuthorizationState(ContestHandle contest, UserHandle user)
        {
            if (contest == null)
            {
                throw new ArgumentNullException(nameof(contest));
            }

            /*
             * 检查顺序如下:
             * 1. 当前会话中有活动的登录用户;
             * 2. 用户以个人名义注册了比赛;
             * 3. 用户以队伍名义注册了比赛;
             * 4. 用户为比赛创建者;
             * 5. 用户用户组权限低于比赛的最低访问用户组权限;
             * 5. 比赛为开放比赛;
             * 6. 比赛为密码保护比赛。
             *
             */

            // 检查当前会话中是否存在活动的登录用户。
            if (user == null)
            {
                return(new ContestAuthorizationState(ContestRegisterState.NotRegistered));
            }

            using (ContestDataProvider contestData = ContestDataProvider.Create(contest, true))
            {
                // 检查用户是否以个人名义参加比赛。
                if (contestData.ParticipationMode == ContestParticipationMode.IndividualOnly ||
                    contestData.ParticipationMode == ContestParticipationMode.Both)
                {
                    foreach (UserHandle registeredUser in contestData.GetAuthorizedUsers())
                    {
                        if (registeredUser == user)
                        {
                            return(new ContestAuthorizationState(ContestRegisterState.IndividualRegistered));
                        }
                    }
                }

                // 检查用户所在的队伍是否参加比赛。
                if (contestData.ParticipationMode == ContestParticipationMode.TeamworkOnly ||
                    contestData.ParticipationMode == ContestParticipationMode.Both)
                {
                    foreach (TeamHandle registeredTeam in contestData.GetAuthorizedTeams())
                    {
                        if (registeredTeam.IsUserIn(user))
                        {
                            return(new ContestAuthorizationState(ContestRegisterState.TeamRegistered)
                            {
                                TeamId = registeredTeam.TeamId
                            });
                        }
                    }
                }

                // 检查用户是否为比赛创建者。
                if (string.Compare(contestData.Creator, user.Username, false) == 0)
                {
                    return(new ContestAuthorizationState(ContestRegisterState.IndividualRegistered));
                }

                // 检查用户权限。
                if (!UserAuthorization.CheckAccessRights(contestData.AuthorizationGroup,
                                                         UserAuthorization.GetUserGroup(user)))
                {
                    return(new ContestAuthorizationState(ContestRegisterState.NotRegistered));
                }
                else if (UserAuthorization.CheckAccessRights(UserGroup.Administrators,
                                                             UserAuthorization.GetUserGroup(user)))
                {
                    return(new ContestAuthorizationState(ContestRegisterState.IndividualRegistered));
                }

                // 检查比赛是否为开放或者密码保护比赛。
                if (contestData.AuthorizationMode == ContestAuthorizationMode.Public)
                {
                    return(new ContestAuthorizationState(ContestRegisterState.IndividualRegistered));
                }
                else if (contestData.AuthorizationMode == ContestAuthorizationMode.Protected)
                {
                    return(new ContestAuthorizationState(ContestRegisterState.PasswordRequired));
                }
            }

            // 所有检查均不成立。
            return(new ContestAuthorizationState(ContestRegisterState.NotRegistered));
        }
Exemple #27
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)));
            }
        }
 /// <summary>
 /// 使用给定的比赛句柄以及异常消息创建 ContestNotFoundException 类的新实例。
 /// </summary>
 /// <param name="handle">比赛句柄。</param>
 /// <param name="message">异常消息。</param>
 public ContestNotFoundException(ContestHandle handle, string message) : base(handle, message)
 {
 }