public function ajaxSubmitAction() { $username = Request::getPOST('username'); $password = Request::getPOST('password'); $verify = Request::getPOST('verify'); if (!Regex::match($username, RegexVars::USERNAME)) { $this->renderAjax(1, '用户名格式不正确!'); } // 校验密码格式 if (!Regex::match($password, RegexVars::PASSWORD)) { $this->renderAjax(1, '密码长度为6-20位!'); } // 校验验证码 $code = Session::get('check_code'); if (strtolower($verify) != $code) { $this->renderAjax(1, '验证码错误,请重试!'); } // 过滤用户名 if (false !== strpos(strtolower($username), 'admin')) { $this->renderAjax(1, '用户已经存在!'); } // 校验用户是否存在 $userInfo = UcUserInterface::getByLoginName(array('login_name' => $username)); if (!empty($userInfo)) { $this->renderAjax(1, '用户名已经被占用!'); } // 保存 $data = array('username' => $username, 'password' => $password, 'reg_ip' => Http::getClientIp()); UcUserInterface::save($data); $this->renderAjax(0); }
private static function makeCode() { $ip = Http::getClientIp(); $ip = $ip % 1000000; $code = rand(100000, 999999); $code = ($code + $ip) % 1000000; return sprintf('%06d', $code); }
private static function insert($tag, $level, $msg) { // 是否需要Logger if (!GlobalConfig::$LOGGER_ENABLE) { return; } // 临时关闭Logger $tmpEnable = GlobalConfig::$LOGGER_ENABLE; GlobalConfig::$LOGGER_ENABLE = false; // 校验tag $tags = LoggerKeys::$allTags; if (!in_array($tag, $tags)) { throw new LibraryException("TAG:{$tag} 需要在LoggerKeys中定义!"); } // 获取错误信息 if (is_subclass_of($msg, 'Exception')) { $traceList = $msg->getTrace(); $message = $msg->getMessage(); $traceInfo = $traceList[0]; $loc = $traceInfo['file'] . ':' . $traceInfo['line']; } else { $traceList = debug_backtrace(); $message = $msg; $traceInfo = $traceList[1]; $loc = $traceInfo['file'] . ':' . $traceInfo['line']; } $now = time(); $data = array('create_time' => $now, 'update_time' => $now, 'tag' => $tag, 'level' => $level, 'client_ip' => Http::getClientIp(), 'client_port' => Http::getClientPort(), 'server_ip' => Http::getServerIp(), 'server_port' => Http::getServerPort(), 'url' => Url::getCurrentUrl(), 'post' => json_encode($_POST), 'loc' => $loc, 'message' => $message, 'trace' => json_encode($traceList)); if (GlobalConfig::$LOGGER_ASYNC) { $gearman = GearmanPool::getClient(GearmanConfig::$SERVER_COMMON); $gearman->doBackground('logger_async', json_encode($data)); } else { LoggerInterface::save($data); } GlobalConfig::$LOGGER_ENABLE = $tmpEnable; }
private static function makeTicket() { $ticket = md5(Http::getClientIp() . Time::ms() . uniqid()); return $ticket; }
public static function save($data, $id = 0, $trans = null) { if (0 == $id) { $globalId = $data['global_id']; $language = $data['language']; $userId = $data['user_id']; $source = $data['source']; $contestId = Arr::get('contest_id', $data, 0); // 设置默认语言 Cookie::set('default_language', $language, time() + 365 * 86400); $problemInfo = OjProblemInterface::getById(array('id' => $globalId)); if (empty($problemInfo)) { throw new InterfaceException('题目不存在!'); } if (!array_key_exists($data['language'], StatusVars::$LANGUAGE_SUPPORT[$problemInfo['remote']])) { throw new InterfaceException('编译器不支持!'); } // 连续提交判断 if (self::submitAlready($userId)) { throw new InterfaceException('提交频繁!'); } // 非法字符判断 if ($problemInfo['remote'] == StatusVars::REMOTE_HDU) { if (false === iconv('UTF-8', 'GBK', $source)) { throw new InterfaceException('代码中存在非法字符!'); } } // 开始事务 $innerTrans = $trans; if (null == $trans) { $innerTrans = new Trans(DbConfig::$SERVER_TRANS); $innerTrans->begin(); } $solutionModel = new OjSolutionModel($innerTrans); $submitTime = time(); $data = array('problem_global_id' => $globalId, 'remote' => $problemInfo['remote'], 'problem_id' => $problemInfo['problem_id'], 'problem_code' => $problemInfo['problem_code'], 'user_id' => $userId, 'submit_time' => $submitTime, 'submit_ip' => Http::getClientIp(), 'language' => $language, 'result' => StatusVars::QUEUE, 'code_length' => strlen($source), 'remote_uid' => -1); $userInfo = UserCommonInterface::getById(array('id' => $userId)); if (0 == $contestId) { $solutionId = $solutionModel->insert($data); UserCommonInterface::save(array('trans' => $innerTrans, 'id' => $userId, 'submit_all' => $userInfo['submit_all'] + 1)); OjProblemInterface::save(array('trans' => $innerTrans, 'id' => $problemInfo['id'], 'submit' => $problemInfo['submit'])); } else { $contestInfo = OjContestInterface::getDetail(array('id' => $contestId)); if (empty($contestInfo)) { throw new InterfaceException('竞赛不存在!'); } if ($submitTime > $contestInfo['end_time']) { throw new InterfaceException('比赛已经结束!'); } if ($submitTime < $contestInfo['begin_time']) { throw new InterfaceException('比赛未开始!'); } // 获取当前的submit_order $lastRow = OjSolutionInterface::getRow(array('where' => array(array('contest_id', '=', $contestId)), 'order' => array('id' => 'DESC'))); $data['contest_id'] = $contestId; $data['contest_submit_order'] = empty($lastRow) ? 1 : intval($lastRow['contest_submit_order']) + 1; $data['contest_submit_second'] = $submitTime - $contestInfo['begin_time']; $data['contest_end_time'] = $contestInfo['end_time']; $solutionId = $solutionModel->insert($data); // 激活比赛 if (!$contestInfo['is_active']) { OjContestInterface::save(array('id' => $contestId, 'trans' => $innerTrans, 'is_active' => 1)); } } // 如果是HQU题库,加入队列 if ($problemInfo['remote'] == StatusVars::REMOTE_HQU) { OjJudgeInterface::save(array('trans' => $innerTrans, 'problem_id' => $problemInfo['problem_id'], 'language' => $language, 'source' => $source, 'user_id' => $userId, 'solution_id' => $solutionId)); } // 保存代码 OjSolutionCodeInterface::save(array('trans' => $innerTrans, 'solution_id' => $solutionId, 'source' => $source)); if (null == $trans && null != $innerTrans) { // 没有外部事务,并且存在内部事务 $innerTrans->commit(); } // 设置重复提交缓存 $memcached = MemcachedPool::getMemcached(MemcachedConfig::$SERVER_COMMON); $key = MemcachedKeys::OJ_SECOND_SUBMIT_ . $userId; $memcached->set($key, true, time() + 5); return $solutionId; } else { // 开始事务 $innerTrans = $trans; if (null == $trans && array_key_exists('result', $data)) { // 开启内部事务条件 $innerTrans = new Trans(DbConfig::$SERVER_TRANS); $innerTrans->begin(); } $model = new OjSolutionModel($innerTrans); if (array_key_exists('result', $data)) { self::updateResult($id, $data['result'], $innerTrans); unset($data['result']); } // 对某些字段特殊处理 $updateData = $data; $affects = $model->updateById($id, $updateData); if (null == $trans && null != $innerTrans) { // 没有外部事务,并且存在内部事务 $innerTrans->commit(); } return $affects; } }