/// <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); } } } }
/// <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); } }
/// <summary> /// 使用给定的用户名和密码对给定的会话进行登录验证。 /// </summary> /// <param name="session">用户会话。</param> /// <param name="username">用户名。</param> /// <param name="password">密码。</param> /// <exception cref="ArgumentNullException"/> public static bool Authorize(HttpSessionStateBase session, string username, string password) { if (session == null) { throw new ArgumentNullException(nameof(session)); } if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) { return(false); } if (UserAuthorization.CheckAuthorization(username, password)) { // 登录验证成功。 session.Add(SessionUsername, username); RenewSession(session); return(true); } else { // 登录验证失败。 return(false); } }
/// <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)); }