$grp) if (hasProblemPermissionGroup(queryUser($grp), $problem)) return true; return false; } function hasProblemCtrlPermission($user, $problem) { if (!hasProblemViewPermission($user, $problem)) return false; if (isSuperUser($user)) return true; $grp = $problem['ctrl']; if ($grp == '') return false; $grp = queryUser($grp); if (!$grp) return false; if (in_array($user['username'], explode(',', $grp['ctrls']))) return true; return false; } function giveGroupPermission($user, $group) { if ($user == null || $group == null) return; $q = explode(',', $group['ctrls']); if (in_array($user['username'], $q)) return; $q[] = $user['username']; $s = join(',', $q); $groupname = $group['username']; DB::update("update user_info set ctrls = '$s' where username = '$groupname'"); } function removeGroupPermission($user, $group) { if ($user == null || $group == null) return; $q = explode(',', $group['ctrls']); $p = array(); foreach ($q as $i => $k) if ($k != $user['username']) $p[] = $k; $s = join(',', $p); $groupname = $group['username']; DB::update("update user_info set ctrls = '$s' where username = '$groupname'"); } function attachProblemToGroup($problem, $group) { if ($problem == null || $group == null) return; if (in_array($problem['id'], explode(',', $group['privs']))) return; if ($group['privs'] == '') $privs = $problem['id']; else $privs = $group['privs'] . ',' . $problem['id']; $name = $group['username']; DB::update("update user_info set privs = '$privs' where username = '$name'"); } function attachUserToGroup($user, $group) { if ($user == null || $group == null) return; if (in_array($group['username'], explode(',', $user['extgroups']))) return; if ($user['extgroups'] == '') $extgrps = $group['username']; else $extgrps = $user['extgroups'] . ',' . $group['username']; $name = $user['username']; DB::update("update user_info set extgroups = '$extgrps' where username = '$name'"); } function deattachUserFromGroup($user, $group) { if ($user == null || $group == null) return; removeGroupPermission($user, $group); $q = explode(',', $user['extgroups']); if (!in_array($group['username'], $q)) return; $p = array(); foreach ($q as $i => $k) if ($k != $group['username']) $p[] = $k; $s = join(',', $p); $name = $user['username']; DB::update("update user_info set extgroups = '$s' where username = '$name'"); } function queryUserExtgroups($user) { if ($user == null) return; return explode(',', $user['extgroups']); } function queryGroupControllers($grp) { if ($grp == null) return; return explode(',', $grp['ctrls']); } function queryGroupMembers($grp) { $grpname = $grp['username']; return DB::selectAll("select username from user_info where find_in_set('$grpname', extgroups)"); } function queryGroupProblems($grp) { $p = $grp['privs']; if ($p == '') return array (); return explode(',', $grp['privs']); } function queryProblemSize($pid) { return filesize("/var/uoj_data/$pid.zip"); } function queryGroupTotalSize($grp) { $size = 0; foreach (queryGroupProblems($grp) as $i => $pid) if (queryProblemBrief($pid)['ctrl'] == $grp['username']) $size += queryProblemSize($pid); return $size; } function queryGroupCtrlProblems($grp) { $q = array(); foreach (queryGroupProblems($grp) as $i => $pid) if (queryProblemBrief($pid)['ctrl'] == $grp['username']) $q[] = $pid; return $q; } function queryGroupQuota($grp) { return $grp['ac_num'] * 1048576; } function queryGroupProblemQuota($grp) { return 20; } function queryUserCtrlgroups($user) { if ($user == null) return; if (isSuperUser($user)) { $q = array(); foreach (DB::selectAll("select username from user_info where username like 'group_%'") as $i => $k) $q[] = $k['username']; return $q; } $res = array(); foreach (queryUserExtgroups($user) as $i => $grp) { if (in_array($user['username'], queryGroupControllers(queryUser($grp)))) $res[] = $grp; } return $res; } function hasGroupCtrlPermission($user, $grp) { if ($user == null) return false; if (isSuperUser($user)) return true; if (in_array($user['username'], explode(',', $grp['ctrls']))) return true; else return false; } function hasViewPermission($str,$user,$problem,$submission) { if ($str=='ALL') { return true; } if ($str=='ALL_AFTER_AC') { return hasAC($user,$problem); } if ($str=='SELF') { return $submission['submitter']==$user['username']; } return false; } function hasContestPermission($user, $contest) { if ($user == null) { return false; } if (isSuperUser($user)) { return true; } return DB::selectFirst("select * from contests_permissions where username = '{$user['username']}' and contest_id = {$contest['id']}") != null; } function hasRegistered($user, $contest) { return DB::selectFirst("select * from contests_registrants where username = '${user['username']}' and contest_id = ${contest['id']}") != null; } function hasAC($user, $problem) { return DB::selectFirst("select * from best_ac_submissions where submitter = '${user['username']}' and problem_id = ${problem['id']}") != null; } function queryUser($username) { if (!validateUsername($username)) { return null; } return DB::selectFirst("select * from user_info where username='$username'", MYSQLI_ASSOC); } function queryProblemContent($id) { return DB::selectFirst("select * from problems_contents where id = $id", MYSQLI_ASSOC); } function queryProblemBrief($id) { return DB::selectFirst("select * from problems where id = $id", MYSQLI_ASSOC); } function queryRemoteProblemBrief($pid) { return DB::selectFirst("select pid, title from rp where pid = '$pid'", MYSQLI_ASSOC); } function queryRemoteProblemFull($pid) { return DB::selectFirst("select pid, title, statement from rp where pid = '$pid'", MYSQLI_ASSOC); } function queryProblemTags($id) { $tags = array(); $result = DB::query("select tag from problems_tags where problem_id = $id order by id"); while ($row = DB::fetch($result, MYSQLI_NUM)) { $tags[] = $row[0]; } return $tags; } function queryContestProblemRank($contest, $problem) { if (!DB::selectFirst("select * from contests_problems where contest_id = {$contest['id']} and problem_id = {$problem['id']}")) { return null; } return DB::selectCount("select count(*) from contests_problems where contest_id = {$contest['id']} and problem_id <= {$problem['id']}"); } function queryDatumStream($id) { return DB::selectFirst("select * from datum_streams where id = $id", MYSQLI_ASSOC); } function querySubmission($id) { return DB::selectFirst("select * from submissions where id = $id", MYSQLI_ASSOC); } function queryHack($id) { return DB::selectFirst("select * from hacks where id = $id", MYSQLI_ASSOC); } function queryContest($id) { return DB::selectFirst("select * from contests where id = $id", MYSQLI_ASSOC); } function queryContestProblem($id) { return DB::selectFirst("select * from contest_problems where contest_id = $id", MYSQLI_ASSOC); } function queryDatumBrief($id) { return DB::selectFirst("select id, pid, status from datum_requests where id = $id", MYSQLI_ASSOC); } function queryDatum($id) { return DB::selectFirst("select * from datum_requests where id = $id", MYSQLI_ASSOC); } function queryZanVal($id, $type, $user) { if ($user == null) { return 0; } $esc_type = DB::escape($type); $row = DB::selectFirst("select val from click_zans where username='{$user['username']}' and type='$esc_type' and target_id='$id'"); if ($row == null) { return 0; } return $row['val']; } function queryBlog($id) { return DB::selectFirst("select * from blogs where id='$id'", MYSQLI_ASSOC); } function queryBlogTags($id) { $tags = array(); $result = DB::select("select tag from blogs_tags where blog_id = $id order by id"); while ($row = DB::fetch($result, MYSQLI_NUM)) { $tags[] = $row[0]; } return $tags; } function queryBlogComment($id) { return DB::selectFirst("select * from blogs_comments where id='$id'", MYSQLI_ASSOC); } function isProblemVisibleToUser($problem, $user) { return !$problem['is_hidden'] || hasProblemViewPermission($user, $problem); } function isContestProblemVisibleToUser($problem, $contest, $user) { if (isProblemVisibleToUser($problem, $user)) { return true; } if ($contest['cur_progress'] >= CONTEST_PENDING_FINAL_TEST) { return true; } if ($contest['cur_progress'] == CONTEST_NOT_STARTED) { return false; } return hasRegistered($user, $contest); } function isSubmissionVisibleToUser($submission, $problem, $user) { if (isSuperUser($user)) { return true; } elseif (!$submission['is_hidden']) { return true; } else { return hasProblemViewPermission($user, $problem); } } function isHackVisibleToUser($hack, $problem, $user) { if (isSuperUser($user)) { return true; } elseif (!$hack['is_hidden']) { return true; } else { return hasProblemViewPermission($user, $problem); } } function isSubmissionFullVisibleToUser($submission, $contest, $problem, $user) { if (isSuperUser($user)) { return true; } elseif (!$contest) { return true; } elseif ($contest['cur_progress'] > CONTEST_IN_PROGRESS) { return true; } elseif ($submission['submitter'] == $user['username']) { return true; } else { return hasProblemCtrlPermission($user, $problem); } } function isHackFullVisibleToUser($hack, $contest, $problem, $user) { if (isSuperUser($user)) { return true; } elseif (!$contest) { return true; } elseif ($contest['cur_progress'] > CONTEST_IN_PROGRESS) { return true; } elseif ($hack['hacker'] == $user['username']) { return true; } else { return hasProblemCtrlPermission($user, $problem); } } function deleteBlog($id) { if (!validateUInt($id)) { return; } DB::delete("delete from click_zans where type = 'B' and target_id = $id"); DB::delete("delete from click_zans where type = 'BC' and target_id in (select id from blogs_comments where blog_id = $id)"); DB::delete("delete from blogs where id = $id"); DB::delete("delete from blogs_comments where blog_id = $id"); DB::delete("delete from important_blogs where blog_id = $id"); DB::delete("delete from blogs_tags where blog_id = $id"); }