public function __construct($name = false, $directCall = true) { if ($directCall) { trigger_error(Lang::getString('Lang.errors.noconstructor'), E_USER_ERROR); } parent::__construct($name); }
/** * Конструктор Singleton * @param type $name * @param type $directCall */ public function __construct($name = false, $directCall = true) { // Интернационализируем require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'i18n.php'; if ($directCall) { trigger_error(Lang::getString('Auth.errors.noconstructor'), E_USER_ERROR); } parent::__construct($name); }
/** * Действие по умолчанию * @return string Тест выводимый в страницу */ public function action_index() { if ($this->m->yes()) { if (Auth::getInstance()->getUser('id') == 1) // только админу Output::assign('adminlink', $this->actUri('userwin')->url()); Output::assign('users', ''); Output::assign('linktitle', Lang::getString('Adminhere')); return $this->fetch('adminhere.tpl'); } else return ""; }
/** * Инициализует форму в backend и разбирает входящие данные. */ function initBackend() { $req = array(); // Цепляем всю сессию из фронтенда, с описанием чекеров, обязательных полей и т.д. // Если такого нет — значит либо нас ломают, либо где-то ошибка. if (!$this->sessionGet()) $this->errorCritical("Не удалось найти сессию «{$this->name}»."); if (!$this->fields) $this->errorCritical("Пустой массив с определениями полей (\$form->fields)."); // в массив пишем только известные значения, никакой левой фигни foreach ($this->fields as $field) { if (@isset($_REQUEST[$this->name][$field[name]])) $req[$field[name]] = $_REQUEST[$this->name][$field[name]]; if ($field[type] == AJAXFORM_TYPE_CHECKBOXES) { foreach ($field[values] as $k => $v) if (@isset($_REQUEST[$this->name][$field[name] . "|" . $k])) $req[$field[name] . "|" . $k] = true; } if ($field[type] == AJAXFORM_TYPE_DATE) { $req[$field[name]] = $this->datepicker2date($_REQUEST[$this->name][$field[name]]); } } //$req = $_REQUEST[$this->name]; //$this->alert(print_r($req, true)); if (count($_FILES[$this->name][name])) { foreach ($_FILES[$this->name][name] as $file => $name) { $this->files[$file] = array( "name" => $_FILES[$this->name][name][$file], "error" => $_FILES[$this->name][errors][$file], "errors" => $_FILES[$this->name][errors][$file], // compatibility "type" => $_FILES[$this->name][type][$file], "size" => $_FILES[$this->name][size][$file], "tmp" => $_FILES[$this->name][tmp_name][$file], "tmp_name" => $_FILES[$this->name][tmp_name][$file], // compatibility "uploaded" => strlen($_FILES[$this->name][tmp_name][$file]) > 0 ? true : false, ); } } $this->uid = $this->checkString($req[uid], "id"); // Ошибки обнуляем, чтобы они не пришли из сессии, так, на всякий случай. // А также кладем все новое г в сессию. Если что-то провалится — // именно это г из сессии высплывет в случае не-аяксового интерфейса $this->session = $req; $this->errors = array(); // Проверяем длину foreach ($this->fields as $field) { if ($field[options][length] && mb_strlen($req[$field[name]]) > $field[options][length]) { $this->error(AJAXFORM_ERROR_FORMAT, $field[name], Lang::getString("Form.error.length") . ": " . $field[options][length]); $req[$field[name]] = mb_substr($req[$field[name]], 0, $field[options][length]); } } // Проверяем соответствие формату if (count($this->formats)) foreach ($this->formats as $format) { $res = $this->checkFormat($req[$format[name]], $format[type], $format[pregPattern]); //$this->alert("FORMAT: " . var_export($format, true) . "\nREQ: " . $req[$format[name]] . "\nSTATUS: " . var_export($res, true)); if ($res === false && $req[$format[name]]) { $html = ($format[type] == AJAXFORM_FORMAT_CUSTOM) ? $format[html] : Lang::getString("Form.error.format.{$format[type]}"); $this->error(AJAXFORM_ERROR_FORMAT, $format[name], $html); } elseif ($res === null) { $this->errorCritical("Для поля «{$format[name]}» не найден формат «{$format[type]}»."); } } // Проверяем весь $_REQUEST проверкой по-умолчанию $req = $this->checkField($req); // Проходим по массиву проверок и каждый элемент $_REQUEST проверяем // Нужно затем, чтобы потом безопасно использовать данные в сторонних проверках, выполняемых в бакенде if (count($this->checkers)) { // Проверяем должным образом foreach ($this->checkers as $checker) { $req[$checker[name]] = $this->checkField($req[$checker[name]], $checker[name], $checker[type], $checker[pregPattern], $checker[pregReplace]); } $errors = array(); // Второй проход — смотрим что стало отличаться foreach ($this->checkers as $checker) { $name = $checker[name]; $field = $this->fields[$name]; //$this->alert("Проверка значения: «mb_strtolower($req[$name]) . "» —> «" . mb_strtolower($this->session[$name]) . "»"); // после обработки чекером значение стало пустым, или в массиве элемента не нашлось сопоставления значению if (mb_strtolower($req[$name]) != mb_strtolower($this->session[$name])) { // || (($field[type] == AJAXFORM_TYPE_SELECT || $field[type] == AJAXFORM_TYPE_RADIO) && $this->value($name, $req[$name])) === null // НЕ ЗАПОЛНЕННОЕ ПОЛЕ ДЛЯ ЧЕКЕРА НЕ ВАЖНО — ЗДЕСЬ ГЛАВНОЕ, ЧТОБЫ НЕ ЧЕКЕР ЕГО ТАКИМ СДЕЛАЛ // если стало пустым после чекеров или не нашлось if ($checker[type] != AJAXFORM_CHECK_DEFAULT) $this->error(AJAXFORM_ERROR_CHECK, $name, ($checker[type] == AJAXFORM_CHECK_CUSTOM) ? $checker[html] : Lang::getString ("Form.error.checker." . $checker[type])); $errors[$name] = true; } } } //$this->alert(print_r($this->obligatory, 1)); //$this->alert(print_r($this->files, 1)); // Проверяем заполненность обязательных полей if (count($this->obligatory)) foreach ($this->obligatory as $name => $tmp) { $field = $this->fields[$name]; //$this->alert("Obligatory check: {$field[name]}, " . var_export($this->value($name, $req[$name]), 1)); // после обработки чекером значение стало пустым, или в массиве элемента не нашлось сопоставления значению if ($this->value($name, $req[$name]) === null) { $html = ($field[type] == AJAXFORM_TYPE_CHECKBOX || $field[type] == AJAXFORM_TYPE_RADIO || $field[type] == AJAXFORM_TYPE_SELECT || $field[type] == AJAXFORM_TYPE_FILE) ? Lang::getString("Form.error.obligatory." . $field[type]) : Lang::getString("Form.error.obligatory.empty"); // endif; // endif; $this->error(AJAXFORM_ERROR_OBLIGATORY, $name, $html); } // проверим массив, есть ли там вообще такое значение (достаточно проверить тип — // если СЕЛЕКТ или РАДИО, то null в условии только поэтому может появиться if (($field[type] == AJAXFORM_TYPE_SELECT || $field[type] == AJAXFORM_TYPE_RADIO) && $this->value($name, $req[$name]) === null && !empty($req[$name])) { // было выше в чекерах $this->error(AJAXFORM_ERROR_OBLIGATORY, $name, Lang::getString("Form.error.obligatory.not-found")); continue; // был break… само собой не работало } } // проверяем код, если таковой есть в массиве if ($this->fields[confirm]) { $req[confirm] = $this->confirmReplace($req[confirm]); if ($req[confirm] != $this->fields[confirm][value]) { $this->error(AJAXFORM_ERROR_CONFIRM, "confirm", Lang::getString("Form.error.code")); //$this->alert($req[confirm] . "|" . $this->fields[confirm][value]); } } //$this->alert($res, true); foreach ($this->fields as $field) { if (($field[type] == AJAXFORM_TYPE_TEXT || $field[type] == AJAXFORM_TYPE_TEXTAREA || $field[type] == AJAXFORM_TYPE_HIDDEN || $field[type] == AJAXFORM_TYPE_PASSWORD) && !$field[options][allowHTML]) { if (!$field[options][raw]) $req[$field[name]] = htmlSpecialChars($req[$field[name]]); //$this->alert($field[type] . " — " . $field[name] . " — " . $req[$field[name]]); } } //$this->alert(print_r($this->errors, 1)); $this->request = $req; $this->parseRequest(); }
/** * Проверка сессии получене данных о пользователе * @var string $sessionid Идентификатор сессии * @return array */ public function checksession($sessionid) { $rec = array(); $sql1 = "SELECT * FROM session " . "WHERE session ='{$sessionid}'"; $rs = sql::fetchOne($sql1); if (!empty($rs)) { // не бывает, в авторизации записываем 0 на неудаче if ($rs["u_id"] != 0) { $sql = "SELECT * FROM users " . "WHERE id='{$rs["u_id"]}'"; $rs = sql::fetchOne($sql); if (!empty($rs)) { $rec["user"]["username"] = $rs["nik"]; $rec["user"]["userid"] = $rs["id"]; $rec["user"]["user_id"] = $rs["id"]; $rec["user"]["u_id"] = $rs["id"]; $rec["user"]["id"] = $rs["id"]; $sql = "UPDATE session SET ts=NOW() WHERE session='{$sessionid}'"; sql::query($sql); // права if (empty($_SESSION["rights"])) { $sql = "SELECT rights.right,type,rtype FROM rights " . "JOIN (rtypes,rrtypes) " . "ON (rtypes.id=type_id " . "AND rrtypes.id=rtype_id) " . "WHERE u_id='{$rs["id"]}'"; $res = sql::fetchAll($sql); foreach ($res as $rs) { if ($rs["right"] == '1') { $_SESSION["rights"][$rs["type"]][$rs["rtype"]] = true; } } } $rec["rights"] = $_SESSION["rights"]; $rec["success"] = 'Auth.session.success'; // определимся с сессией окна Auth::$lss = !empty($_REQUEST["lss"]) ? $_REQUEST["lss"] : "lss"; } else { $rec["success"] = 'Auth.session.cantfinduser'; } } else { // нет пользователя $rec["success"] = 'Auth.session.wrongpassword'; } } else { // не оказалось сессии в базе $rec["success"] = 'Auth.session.nosession'; } $rec["mes"] .= Lang::getString($rec["success"]); return $rec; }