submission.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <?php
  2. requirePHPLib('form');
  3. requirePHPLib('judger');
  4. if (!validateUInt($_GET['id']) || !($submission = querySubmission($_GET['id']))) {
  5. become404Page();
  6. }
  7. $submission_result = json_decode($submission['result'], true);
  8. $problem = queryProblemBrief($submission['problem_id']);
  9. $problem_extra_config = getProblemExtraConfig($problem);
  10. if ($submission['contest_id']) {
  11. $contest = queryContest($submission['contest_id']);
  12. genMoreContestInfo($contest);
  13. } else {
  14. $contest = null;
  15. }
  16. if (!isSubmissionVisibleToUser($submission, $problem, $myUser)) {
  17. become403Page();
  18. }
  19. if ($submission['status'] == 'Judged' && $submission['result_error'] == 'Need Captcha') {
  20. if ($submission['submitter'] == $myUser['username'] || isSuperUser($myUser)) {
  21. foreach (json_decode($submission['content'], true)['config'] as $k)
  22. if ($k[0] == 'captcha')
  23. $captcha = $k[1];
  24. $captcha_form = new UOJForm('rmj_captcha');
  25. $captcha_form->addInput('captcha_answer', 'text', '验证码', '',
  26. function ($x) {
  27. if (strlen($x) != 4)
  28. return '长度错误';
  29. return '';
  30. }, null);
  31. $captcha_form->handle = function() {
  32. global $submission;
  33. $content = json_decode($submission['content'], true);
  34. $capt = DB::escape($_POST['captcha_answer']);
  35. $content['config'][] = array('captcha_answer', $capt);
  36. $content = DB::escape(json_encode($content));
  37. $sid = $submission['id'];
  38. DB::update("update submissions set content = '{$content}' where id = {$sid}");
  39. DB::update("update submissions set status = 'Waiting remote' where id = {$sid}");
  40. };
  41. $captcha_form->runAtServer();
  42. $should_show_captcha = true;
  43. echo '<div id="rmj-captcha" data-captcha="' . $captcha . '"></div>';
  44. }
  45. }
  46. $out_status = explode(', ', $submission['status'])[0];
  47. if ($_GET['get'] == 'status-details' && Auth::check() && $submission['submitter'] === Auth::id()) {
  48. echo json_encode(array(
  49. 'judged' => $out_status == 'Judged',
  50. 'html' => getSubmissionStatusDetails($submission)
  51. ));
  52. die();
  53. }
  54. $hackable = $submission['score'] == 100 && $problem['hackable'] == 1;
  55. if ($hackable) {
  56. $hack_form = new UOJForm('hack');
  57. $hack_form->addTextFileInput('input', '输入数据');
  58. $hack_form->addCheckBox('use_formatter', '帮我整理文末回车、行末空格、换行符', true);
  59. $hack_form->handle = function(&$vdata) {
  60. global $myUser, $problem, $submission;
  61. if ($myUser == null) {
  62. redirectToLogin();
  63. }
  64. if ($_POST["input_upload_type"] == 'file') {
  65. $tmp_name = UOJForm::uploadedFileTmpName("input_file");
  66. if ($tmp_name == null) {
  67. becomeMsgPage('你在干啥……怎么什么都没交过来……?');
  68. }
  69. }
  70. $fileName = uojRandAvaiableTmpFileName();
  71. $fileFullName = UOJContext::storagePath().$fileName;
  72. if ($_POST["input_upload_type"] == 'editor') {
  73. file_put_contents($fileFullName, $_POST['input_editor']);
  74. } else {
  75. move_uploaded_file($_FILES["input_file"]['tmp_name'], $fileFullName);
  76. }
  77. $input_type = isset($_POST['use_formatter']) ? "USE_FORMATTER" : "DONT_USE_FORMATTER";
  78. DB::insert("insert into hacks (problem_id, submission_id, hacker, owner, input, input_type, submit_time, details, is_hidden) values ({$problem['id']}, {$submission['id']}, '{$myUser['username']}', '{$submission['submitter']}', '$fileName', '$input_type', now(), '', {$problem['is_hidden']})");
  79. };
  80. $hack_form->succ_href = "/hacks";
  81. $hack_form->runAtServer();
  82. }
  83. if ($submission['status'] == 'Judged' && hasProblemCtrlPermission($myUser, $problem)) {
  84. $rejudge_form = new UOJForm('rejudge');
  85. $rejudge_form->handle = function() {
  86. global $submission;
  87. rejudgeSubmission($submission);
  88. };
  89. $rejudge_form->submit_button_config['class_str'] = 'btn btn-primary';
  90. $rejudge_form->submit_button_config['text'] = '重新测试';
  91. $rejudge_form->submit_button_config['align'] = 'right';
  92. $rejudge_form->runAtServer();
  93. }
  94. if (isSuperUser($myUser)) {
  95. $delete_form = new UOJForm('delete');
  96. $delete_form->handle = function() {
  97. global $submission;
  98. $content = json_decode($submission['content'], true);
  99. unlink(UOJContext::storagePath().$content['file_name']);
  100. DB::delete("delete from submissions where id = {$submission['id']}");
  101. updateBestACSubmissions($submission['submitter'], $submission['problem_id']);
  102. };
  103. $delete_form->submit_button_config['class_str'] = 'btn btn-danger';
  104. $delete_form->submit_button_config['text'] = '删除此提交记录';
  105. $delete_form->submit_button_config['align'] = 'right';
  106. $delete_form->submit_button_config['smart_confirm'] = '';
  107. $delete_form->succ_href = "/submissions";
  108. $delete_form->runAtServer();
  109. }
  110. $should_show_content = hasViewPermission($problem_extra_config['view_content_type'], $myUser, $problem, $submission);
  111. $should_show_all_details = hasViewPermission($problem_extra_config['view_all_details_type'], $myUser, $problem, $submission);
  112. $should_show_details = hasViewPermission($problem_extra_config['view_details_type'], $myUser, $problem, $submission);
  113. $should_show_details_to_me = isSuperUser($myUser);
  114. if (explode(', ', $submission['status'])[0] != 'Judged') {
  115. $should_show_all_details = false;
  116. }
  117. if ($contest != null && $contest['cur_progress'] == CONTEST_IN_PROGRESS) {
  118. if ($contest['extra_config']["problem_{$submission['problem_id']}"] === 'no-details') {
  119. $should_show_details = false;
  120. }
  121. }
  122. if (!isSubmissionFullVisibleToUser($submission, $contest, $problem, $myUser)) {
  123. $should_show_content = $should_show_all_details = false;
  124. }
  125. if ($contest != null && hasContestPermission($myUser, $contest)) {
  126. $should_show_details_to_me = true;
  127. $should_show_content = true;
  128. $should_show_all_details = true;
  129. }
  130. if ($should_show_all_details) {
  131. $styler = new SubmissionDetailsStyler();
  132. if ((!$should_show_details || ($contest['extra_config']['contest_type']=='IOI' && $contest['cur_progress'] == CONTEST_IN_PROGRESS)) && !hasContestPermission($myUser, $contest)) {
  133. $styler->fade_all_details = true;
  134. $styler->show_small_tip = false;
  135. if ($contest['extra_config']['contest_type']=='IOI' && $contest['cur_progress'] == CONTEST_IN_PROGRESS) {
  136. $styler->ioi_contest_is_running = true;
  137. }
  138. }
  139. }
  140. ?>
  141. <?php
  142. $REQUIRE_LIB['hljs'] = "";
  143. ?>
  144. <?php echoUOJPageHeader(UOJLocale::get('problems::submission').' #'.$submission['id']) ?>
  145. <?php echoSubmissionsListOnlyOne($submission, array(), $myUser) ?>
  146. <?php if ($should_show_captcha): ?>
  147. <div class="card border-info mb-3">
  148. <div class="card-header bg-info"><h4>需要验证码</h4></div>
  149. <div class="card-body">
  150. <img id="captcha-img" />
  151. <?php $captcha_form->printHTML() ?>
  152. </div>
  153. </div>
  154. <script>
  155. (function () {
  156. const div = document.getElementById('rmj-captcha');
  157. const captcha = div.dataset.captcha;
  158. const img = document.getElementById('captcha-img');
  159. img.src = `data:image/jpeg;base64,${captcha}`;
  160. }) ();
  161. </script>
  162. <?php endif ?>
  163. <?php if ($should_show_content): ?>
  164. <?php
  165. if ($submission['problem_id'] == 260328) {
  166. echoSubmissionContent($submission, json_decode('[{"name":"answer","type":"source code","file_name":"answer.code"}]', true));
  167. }
  168. else
  169. echoSubmissionContent($submission, getProblemSubmissionRequirement($problem));
  170. ?>
  171. <?php if ($hackable): ?>
  172. <p class="text-center">
  173. 这程序好像有点Bug,我给组数据试试? <button id="button-display-hack" type="button" class="btn btn-danger btn-xs">Hack!</button>
  174. </p>
  175. <div id="div-form-hack" style="display:none" class="bot-buffer-md">
  176. <?php $hack_form->printHTML() ?>
  177. </div>
  178. <script type="text/javascript">
  179. $(document).ready(function() {
  180. $('#button-display-hack').click(function() {
  181. $('#div-form-hack').toggle('fast');
  182. });
  183. });
  184. </script>
  185. <?php endif ?>
  186. <?php endif ?>
  187. <?php if ($should_show_all_details): ?>
  188. <div class="card border-info mb-3">
  189. <div class="card-header bg-info">
  190. <h4 class="card-title"><?= UOJLocale::get('details') ?></h4>
  191. </div>
  192. <div class="card-body">
  193. <?php echoJudgementDetails($submission_result['details'], $styler, 'details') ?>
  194. <?php if ($should_show_details_to_me): ?>
  195. <?php if (isset($submission_result['final_result'])): ?>
  196. <hr />
  197. <?php echoSubmissionDetails($submission_result['final_result']['details'], 'final_details') ?>
  198. <?php endif ?>
  199. <?php if ($styler->fade_all_details): ?>
  200. <hr />
  201. <?php echoSubmissionDetails($submission_result['details'], 'final_details') ?>
  202. <?php endif ?>
  203. <?php endif ?>
  204. </div>
  205. </div>
  206. <?php endif ?>
  207. <?php if (isset($rejudge_form)): ?>
  208. <?php $rejudge_form->printHTML() ?>
  209. <?php endif ?>
  210. <?php if (isset($delete_form)): ?>
  211. <div class="top-buffer-sm">
  212. <?php $delete_form->printHTML() ?>
  213. </div>
  214. <?php endif ?>
  215. <?php echoUOJPageFooter() ?>