download.php 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. <?php
  2. requirePHPLib('judger');
  3. switch ($_GET['type']) {
  4. case 'problem':
  5. if (!validateUInt($_GET['id']) || !($problem = queryProblemBrief($_GET['id']))) {
  6. become404Page();
  7. }
  8. $visible = isProblemVisibleToUser($problem, $myUser);
  9. if (!$visible && $myUser != null) {
  10. $result = DB::query("select contest_id from contests_problems where problem_id = {$_GET['id']}");
  11. while (list($contest_id) = DB::fetch($result, MYSQLI_NUM)) {
  12. $contest = queryContest($contest_id);
  13. genMoreContestInfo($contest);
  14. if ($contest['cur_progress'] != CONTEST_NOT_STARTED && hasRegistered($myUser, $contest) && queryContestProblemRank($contest, $problem)) {
  15. $visible = true;
  16. }
  17. }
  18. }
  19. if (!$visible) {
  20. become404Page();
  21. }
  22. if (!hasProblemCtrlPermission($myUser, $problem))
  23. become403Page();
  24. $id = $_GET['id'];
  25. $file_name = "/var/uoj_data/$id.zip";
  26. $download_name = "problem_$id.zip";
  27. break;
  28. case 'testlib.h':
  29. $file_name = "/opt/uoj/judger/uoj_judger/include/testlib.h";
  30. $download_name = "testlib.h";
  31. break;
  32. default:
  33. become404Page();
  34. }
  35. $finfo = finfo_open(FILEINFO_MIME);
  36. $mimetype = finfo_file($finfo, $file_name);
  37. if ($mimetype === false) {
  38. become404Page();
  39. }
  40. finfo_close($finfo);
  41. header("X-Sendfile: $file_name");
  42. header("Content-type: $mimetype");
  43. header("Content-Disposition: attachment; filename=$download_name");
  44. ?>