public function resume() { if (!$this->input->is_ajax_request()) { show_404(); } process_the_queue(); echo 'success'; }
public function rejudge_single() { if (!$this->input->is_ajax_request()) { show_404(); } $this->form_validation->set_rules('submit_id', 'submit id', 'required|integer'); $this->form_validation->set_rules('username', 'username', 'required|alpha_numeric'); $this->form_validation->set_rules('problem', 'problem', 'required|integer'); if ($this->form_validation->run()) { $this->load->model('queue_model'); $this->queue_model->rejudge_single(array('submit_id' => $this->input->post('submit_id'), 'username' => $this->input->post('username'), 'problem' => $this->input->post('problem'))); process_the_queue(); $json_result = array('done' => 1); } else { $json_result = array('done' => 0, 'message' => 'Input Error'); } $this->output->set_header('Content-Type: application/json; charset=utf-8'); echo json_encode($json_result); }
/** * Saves submitted code and adds it to queue for judging */ private function _upload() { $now = shj_now(); foreach ($this->problems as $item) { if ($item['id'] == $this->input->post('problem')) { $this->problem = $item; break; } } $this->filetype = $this->_language_to_type(strtolower(trim($this->input->post('language')))); $this->ext = substr(strrchr($_FILES['userfile']['name'], '.'), 1); // uploaded file extension $this->file_name = basename($_FILES['userfile']['name'], ".{$this->ext}"); // uploaded file name without extension if ($this->queue_model->in_queue($this->user->username, $this->problem['id'])) { show_error('You have already submitted for this problem. Your last submission is still in queue.'); } if ($this->user->level == 0 && !$this->problem['open']) { show_error('Selected problem has been closed.'); } $filetypes = explode(",", $this->problem['allowed_languages']); foreach ($filetypes as &$filetype) { $filetype = $this->_language_to_type(strtolower(trim($filetype))); } if ($_FILES['userfile']['error'] == 4) { show_error('No file chosen.'); } if (!in_array($this->filetype, $filetypes)) { show_error('This file type is not allowed for this problem.'); } if (!$this->_match($this->filetype, $this->ext)) { show_error('This file type does not match your selected language.'); } if (!preg_match('/^[a-zA-Z0-9_\\-()]+$/', $this->file_name)) { show_error('Invalid characters in file name.'); } $user_dir = rtrim($this->problem_root, '/') . '/p' . $this->problem['id'] . '/user/'; if (!file_exists($user_dir)) { mkdir($user_dir, 0700); } $user_dir = rtrim($this->problem_root, '/') . '/p' . $this->problem['id'] . '/user/' . $this->user->username; if (!file_exists($user_dir)) { mkdir($user_dir, 0700); } $config['upload_path'] = $user_dir; $config['allowed_types'] = '*'; $config['max_size'] = $this->settings_model->get_setting('file_size_limit'); $config['file_name'] = $this->file_name . "-" . ($this->problem['total_submits'] + 1) . "." . $this->ext; $config['max_file_name'] = 20; $config['remove_spaces'] = TRUE; $this->upload->initialize($config); if ($this->upload->do_upload('userfile')) { $result = $this->upload->data(); $this->load->model('submit_model'); $submit_info = array('submit_id' => $this->problem_model->increase_total_submits($this->problem['id']), 'username' => $this->user->username, 'problem' => $this->problem['id'], 'file_name' => $result['raw_name'], 'main_file_name' => $this->file_name, 'file_type' => $this->filetype, 'pre_score' => 0, 'time' => shj_now_str()); $this->probleminfo_model->update_last_submissions($this->problem['id'], $submit_info['time']); $this->probleminfo_model->update_total_submissions($problem_id, 1); if ($this->problem['is_upload_only'] == 0) { $this->queue_model->add_to_queue($submit_info); process_the_queue(); } else { $this->submit_model->add_upload_only($submit_info); } return TRUE; } return FALSE; }
/** * Saves submitted code and adds it to queue for judging */ private function _upload() { $now = shj_now(); foreach ($this->problems as $item) { if ($item['id'] == $this->input->post('problem')) { $this->problem = $item; break; } } $this->filetype = $this->_language_to_type(strtolower(trim($this->input->post('language')))); $submitcode = $this->input->post("submitcode"); $this->ext = substr(strrchr($_FILES['userfile']['name'], '.'), 1); // uploaded file extension $this->file_name = basename($_FILES['userfile']['name'], ".{$this->ext}"); // uploaded file name without extension if ($this->queue_model->in_queue($this->user->username, $this->user->selected_assignment['id'], $this->problem['id'])) { show_error('You have already submitted for this problem. Your last submission is still in queue.'); } if ($this->user->level == 0 && !$this->user->selected_assignment['open']) { show_error('Selected assignment has been closed.'); } if ($now < strtotime($this->user->selected_assignment['start_time'])) { show_error('Selected assignment has not started.'); } if ($now > strtotime($this->user->selected_assignment['finish_time']) + $this->user->selected_assignment['extra_time']) { show_error('Selected assignment has finished.'); } if (!$this->assignment_model->is_participant($this->user->selected_assignment['participants'], $this->user->username)) { show_error('You are not registered for submitting.'); } $filetypes = explode(",", $this->problem['allowed_languages']); foreach ($filetypes as &$filetype) { $filetype = $this->_language_to_type(strtolower(trim($filetype))); } $user_dir = rtrim($this->assignment_root, '/') . '/assignment_' . $this->user->selected_assignment['id'] . '/p' . $this->problem['id'] . '/' . $this->user->username; if (!file_exists($user_dir)) { mkdir($user_dir, 0700); } $done = false; if ($submitcode == "" || $this->filetype == 'zip' || $this->filetype == 'pdf') { if ($_FILES['userfile']['error'] == 4) { show_error('No file chosen.'); } if (!in_array($this->filetype, $filetypes)) { show_error('This file type is not allowed for this problem.'); } if (!$this->_match($this->filetype, $this->ext)) { show_error('This file type does not match your selected language.'); } if (!preg_match('/^[a-zA-Z0-9_\\-()]+$/', $this->file_name)) { show_error('Invalid characters in file name.'); } $config['upload_path'] = $user_dir; $config['allowed_types'] = '*'; $config['max_size'] = $this->settings_model->get_setting('file_size_limit'); $config['file_name'] = $this->file_name . "-" . ($this->user->selected_assignment['total_submits'] + 1) . "." . $this->ext; $config['max_file_name'] = 20; $config['remove_spaces'] = TRUE; $this->upload->initialize($config); if ($this->upload->do_upload('userfile')) { $result = $this->upload->data(); $done = true; } } else { $this->load->helper('file'); $this->ext = $this->_retext($this->filetype); $this->file_name = "code"; $file_name = "code-" . ($this->user->selected_assignment['total_submits'] + 1) . "." . $this->ext; $upload_path = $user_dir; $max_size = $this->settings_model->get_setting('file_size_limit'); $fp = fopen($upload_path . "/" . $file_name, 'w'); //show_error($max_size); $wr = fwrite($fp, $submitcode, $max_size * 1024); if (!$wr) { show_error("Code is too large"); } fclose($fp); $result['raw_name'] = "code-" . ($this->user->selected_assignment['total_submits'] + 1); $done = true; } if ($done) { $this->load->model('submit_model'); $submit_info = array('submit_id' => $this->assignment_model->increase_total_submits($this->user->selected_assignment['id']), 'username' => $this->user->username, 'assignment' => $this->user->selected_assignment['id'], 'problem' => $this->problem['id'], 'file_name' => $result['raw_name'], 'main_file_name' => $this->file_name, 'file_type' => $this->filetype, 'coefficient' => $this->coefficient, 'pre_score' => 0, 'time' => shj_now_str()); if ($this->problem['is_upload_only'] == 0) { $this->queue_model->add_to_queue($submit_info); process_the_queue(); } else { $this->submit_model->add_upload_only($submit_info); } $val = $submit_info; return $val; } return FALSE; }