Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?
- if (!\Bitrix\Main\Loader::includeModule("iblock")) return;
- Class BCustomUser {
- // fields
- var $inputs = [
- "action"=>"bcu_action",
- "session"=>"bcu_session",
- "email"=>"form_input_1",
- "password"=>"form_input_2",
- "password-confirm"=>"form_input_3",
- "password-new"=>"form_input_4",
- "password-new-confirm"=>"form_input_5",
- "name"=>"form_input_6"
- ];
- // setup
- var $iblockID = 1;
- var $authCookieName = "tricolor_blog";
- var $authCookieExp = 30;
- var $sessionName = "tricolor_blog";
- var $saltA = 'VbKCnQ0zna8jSNndkN-8JM';
- var $saltB = '8JM-jxPDIIxfD';
- // status
- var $user = false;
- var $message = "";
- public function __construct(){
- // status
- $this->userStatus();
- // action
- if($this->getRequest("action") === "signUp") { $this->signUp(); }
- if($this->getRequest("action") === "signIn") { $this->signIn(); }
- if($this->getRequest("action") === "signOut") { $this->signOut(); }
- if($this->getRequest("action") === "updateProfile") { $this->updateProfile(); }
- if($this->getRequest("action") === "changePassword") { $this->changePassword(); }
- if($this->getRequest("action") === "restorePassword") { $this->restorePassword(); }
- // session
- $_SESSION[$this->sessionName] = $this->getHash(16);
- }
- private function signUp(){
- // проверка на сессию
- if ($this->getRequest("session") !== $this->getSessionID()){
- $this->message .= "Ошибка: ошибка сессии.<br/>";
- return false;
- }
- // проверка на регистрацию уже авторизированным пользователем
- if ($this->isAuth()) {
- $this->message .= "Ошибка: попытка регистрации авторизованным пользователем.<br/>";
- return false;
- }
- $errorStatus = false;
- $fields = [
- "IBLOCK_ID"=>$this->iblockID,
- "PROPERTY_VALUES"=>[
- "USER_IP_LAST"=>$_SERVER["REMOTE_ADDR"],
- "USER_HASH_AUTH"=>$this->getHash()
- ]
- ];
- // email
- if (filter_var($this->getRequest("email"), FILTER_VALIDATE_EMAIL)) {
- $fields["NAME"] = $this->getRequest("email");
- } else {
- $errorStatus = true;
- $this->message .= "Ошибка: некорректное поле E-mail.<br/>";
- }
- // username
- if (!empty($this->getRequest("name"))) {
- $fields["PROPERTY_VALUES"]["USER_NAMES"] = $this->getRequest("name");
- } else {
- $errorStatus = true;
- $this->message .= "Ошибка: некорректное имя пользователя.<br/>";
- }
- // password
- if ($this->getRequest("password") === $this->getRequest("password-confirm")) {
- } else {
- $errorStatus = true;
- $this->message .= "Ошибка: пароли не совпадают.<br/>";
- }
- if (strlen($this->getRequest("password")) > 5) {
- $fields["PROPERTY_VALUES"]["USER_HASH_PASSWORD"] = md5($this->saltA . $this->getRequest("password") . $this->saltB);
- } else {
- $errorStatus = true;
- $this->message .= "Ошибка: длинна пароля меньше 6 символов.<br/>";
- }
- // any filter
- //
- // if (!!preg_match("/script/", $this->getRequest("field-name"))) {
- // $fields["FIELD_NAME"] = $this->getRequest("field-name");
- // } else {
- // $errorStatus = true;
- // $this->message .= "Ошибка: некорректное заполнено поле.<br/>";
- // }
- if (!$errorStatus) {
- $this->addNewUser($fields);
- } else {
- $this->message .= "Ошибка: регистрация отменена.<br/>";
- }
- }
- private function signIn(){
- // проверка на сессию
- if ($this->getRequest("session") !== $this->getSessionID()){
- $this->message .= "Ошибка: ошибка сессии.<br/>";
- return false;
- }
- // проверка на авторизацию уже авторизированным пользователем
- if ($this->isAuth()) {
- $this->message .= "Ошибка: попытка авторизации авторизованным пользователем.<br/>";
- return false;
- }
- $query = \Bitrix\Iblock\ElementTable::getList(array(
- 'select'=>['ID','NAME'],
- 'filter'=>[
- 'IBLOCK_ID'=>$this->iblockID,
- "ACTIVE"=>"Y",
- "NAME"=>$this->getRequest("email")
- ]
- ));
- if($arUser = $query->fetch()){
- $arUserProps = CIBlockElement::getProperty(
- $this->iblockID,
- $arUser['ID']
- );
- while ($thisProp = $arUserProps->Fetch()) {
- $arUser[$thisProp["CODE"]] = $thisProp["VALUE"];
- }
- }
- if(!empty($arUser) && !empty($arUser["ID"]) && $arUser["USER_HASH_PASSWORD"] === md5($this->saltA . $this->getRequest("password") . $this->saltB)){
- $this->setAuthCookie($arUser["ID"], $arUser["USER_HASH_AUTH"]);
- $arUser["USER_HASH_PASSWORD"] = "PROTECTED";
- $this->user = $arUser;
- $this->message .= "Успешно: пользователь " . $arUser["NAME"] . " авторизован.<br/>";
- return true;
- } else {
- $this->message .= "Ошибка: неверный логин или пароль.<br/>";
- return false;
- }
- }
- private function signOut(){
- setcookie($this->authCookieName, "", 0);
- $this->user = false;
- }
- private function updateProfile(){
- // проверка на сессию
- if ($this->getRequest("session") !== $this->getSessionID()){
- $this->message .= "Ошибка: ошибка сессии.<br/>";
- return false;
- }
- // проверка на авторизацию уже авторизированным пользователем
- if (!$this->isAuth()) {
- $this->message .= "Ошибка: попытка обновить профиль неавторизированным пользователем.<br/>";
- return false;
- }
- // field list
- $fields = [
- "USER_NAMES" => $this->getRequest("name")
- ];
- // обновляем
- $thisUser = new CIBlockElement;
- $thisUser->SetPropertyValuesEx($this->user["ID"], $this->iblockID, $fields);
- $this->message .= "Успешно: профиль обновлен.<br/>";
- // получаем новый статус с обновленными данными
- $this->userStatus();
- return true;
- }
- private function changePassword(){
- // проверка на сессию
- if ($this->getRequest("session") !== $this->getSessionID()){
- $this->message .= "Ошибка: ошибка сессии.<br/>";
- return false;
- }
- // проверка на авторизацию пользователя
- if (!$this->isAuth()) {
- $this->message .= "Ошибка: попытка изменить пароль неавторизированным пользователем.<br/>";
- return false;
- }
- $errorStatus = false;
- // совпадение новых паролей
- if ($this->getRequest("password-new") !== $this->getRequest("password-new-confirm")) {
- $errorStatus = true;
- $this->message .= "Ошибка: новые пароли не совпадают.<br/>";
- }
- // корректность нового пароля
- if (strlen($this->getRequest("password-new")) < 6) {
- $errorStatus = true;
- $this->message .= "Ошибка: длинна пароля меньше 6 символов.<br/>";
- }
- // проверка ошибок
- if ($errorStatus) {
- return false;
- }
- // проверка старого пароля
- $query = \Bitrix\Iblock\ElementTable::getList(array(
- 'select'=>['ID','NAME'],
- 'filter'=>[
- 'IBLOCK_ID'=>$this->iblockID,
- "ACTIVE"=>"Y"
- ]
- ));
- if($arUser = $query->fetch()){
- $arUserProps = CIBlockElement::getProperty(
- $this->iblockID,
- $arUser['ID']
- );
- while ($thisProp = $arUserProps->Fetch()) {
- $arUser[$thisProp["CODE"]] = $thisProp["VALUE"];
- }
- }
- if(!empty($arUser) && !empty($arUser["ID"]) && $arUser["USER_HASH_PASSWORD"] === md5($this->saltA . $this->getRequest("password") . $this->saltB)){
- $fields = [
- "USER_HASH_PASSWORD" => md5($this->saltA . $this->getRequest("password-new") . $this->saltB)
- ];
- // обновляем
- $thisUser = new CIBlockElement;
- $thisUser->SetPropertyValuesEx($this->user["ID"], $this->iblockID, $fields);
- $this->message .= "Успешно: пароль успешно изменён.<br/>";
- return true;
- } else {
- $this->message .= "Ошибка: неверный старый пароль.<br/>";
- return false;
- }
- }
- private function restorePassword(){
- // проверка на сессию
- if ($this->getRequest("session") !== $this->getSessionID()){
- $this->message .= "Ошибка: ошибка сессии.<br/>";
- return false;
- }
- // проверка на авторизацию
- if ($this->isAuth()) {
- $this->message .= "Ошибка: попытка восстановить пароль авторизованным пользователем.<br/>";
- return false;
- }
- $query = \Bitrix\Iblock\ElementTable::getList(array(
- 'select'=>['ID','NAME'],
- 'filter'=>[
- 'IBLOCK_ID'=>$this->iblockID,
- "ACTIVE"=>"Y",
- "NAME"=>$this->getRequest("email")
- ]
- ));
- if($arUser = $query->fetch()){
- $arUserProps = CIBlockElement::getProperty(
- $this->iblockID,
- $arUser['ID']
- );
- while ($thisProp = $arUserProps->Fetch()) {
- $arUser[$thisProp["CODE"]] = $thisProp["VALUE"];
- }
- }
- // проверка на существование пользователя
- if(empty($arUser) && empty($arUser["ID"])){
- $this->message .= "Ошибка: пользователь (" . $this->getRequest("email") . ") не найден.<br/>";
- return false;
- }
- // если пустой рестор - создаём код
- if(empty($arUser["USER_HASH_RESTORE"])){
- $fields = [
- "USER_HASH_RESTORE" => json_encode([
- "HASH"=>$this->getHash(32),
- "TIMESTAMP"=>time()
- ])
- ];
- $thisUser = new CIBlockElement;
- $thisUser->SetPropertyValuesEx($arUser["ID"], $this->iblockID, $fields);
- $arUser["USER_HASH_RESTORE"] = $fields["USER_HASH_RESTORE"];
- }
- // получаем параметры рестора
- $arRest = json_decode($arUser["USER_HASH_RESTORE"], 1);
- d($arRest);
- // if(!empty($arUser) && !empty($arUser["ID"]) && $arUser["USER_HASH_PASSWORD"] === md5($this->saltA . $this->getRequest("password") . $this->saltB)){
- // $this->setAuthCookie($arUser["ID"], $arUser["USER_HASH_AUTH"]);
- // $arUser["USER_HASH_PASSWORD"] = "PROTECTED";
- // $this->user = $arUser;
- // $this->message .= "Успешно: пользователь " . $arUser["NAME"] . " авторизован.<br/>";
- // return true;
- // } else {
- // $this->message .= "Ошибка: неверный логин или пароль.<br/>";
- // return false;
- // }
- }
- private function addNewUser($fields){
- // проверка на уникальность емейла
- $query = \Bitrix\Iblock\ElementTable::getList(array(
- 'select'=>['ID','NAME'],
- 'filter'=>['IBLOCK_ID'=>$this->iblockID,"ACTIVE"=>"Y","NAME"=>$fields["NAME"]]
- ));
- if($arUser = $query->fetch()){
- $arUserProps = CIBlockElement::getProperty(
- $this->iblockID,
- $arUser['ID']
- );
- while ($thisProp = $arUserProps->Fetch()) {
- $arUser[$thisProp["CODE"]] = $thisProp["VALUE"];
- }
- }
- if(!empty($arUser) && !empty($arUser["ID"])){
- $this->message .= "Ошибка: пользователь с таким емейл (" . $fields["NAME"] . ") уже существует.<br/>";
- return false;
- }
- $newUser = new CIBlockElement;
- if ($query = $newUser->Add($fields)){
- $this->setAuthCookie($query, $fields["PROPERTY_VALUES"]["USER_HASH_AUTH"]);
- $newUserData = [
- "ID"=>$query,
- "NAME"=>$fields["NAME"]
- ];
- foreach($fields["PROPERTY_VALUES"] as $key => $value){
- $newUserData[$key] = $value;
- }
- $newUserData["USER_HASH_PASSWORD"] = "PROTECTED";
- $this->user = $newUserData;
- $this->message .= "Успешно: пользователь зарегистрирован.<br/>";
- return true;
- } else {
- $this->message .= "Ошибка: не удалось зарегистрировать пользователя.<br/>";
- return false;
- }
- }
- private function setAuthCookie($userID,$authHash){
- $userData = [
- "ID"=>$userID,
- "USER_HASH_AUTH"=>$authHash
- ];
- $userDataComplete = base64_encode(json_encode($userData));
- $cookieExpComplete = time() + ($this->authCookieExp * 86400);
- setcookie($this->authCookieName, $userDataComplete, $cookieExpComplete);
- $_COOKIE[$this->authCookieName] = $userDataComplete;
- }
- private function userStatus(){
- $authCookie = $_COOKIE[$this->authCookieName];
- if (empty($authCookie)) { return false; }
- $userData = json_decode(base64_decode($authCookie), 1);
- $userData["USER_IP"] = $_SERVER["REMOTE_ADDR"];
- $query = \Bitrix\Iblock\ElementTable::getList(array(
- 'select'=>['ID','NAME'],
- 'filter'=>['IBLOCK_ID'=>$this->iblockID,"ACTIVE"=>"Y","ID"=>$userData["ID"]]
- ));
- if($arUser = $query->fetch()){
- $arUserProps = CIBlockElement::getProperty(
- $this->iblockID,
- $arUser['ID']
- );
- while ($thisProp = $arUserProps->Fetch()) {
- $arUser[$thisProp["CODE"]] = $thisProp["VALUE"];
- }
- }
- $arUser["USER_HASH_PASSWORD"] = "PROTECTED";
- if($arUser["USER_IP_LAST"] === $userData["USER_IP"] && $arUser["USER_HASH_AUTH"] === $userData["USER_HASH_AUTH"]){
- $this->user = $arUser;
- return true;
- } else {
- return false;
- }
- }
- private function getRequest($name){
- return $_REQUEST[$this->inputs[$name]];
- }
- public function getHash($length = 32){
- $mask = "abcdefghijklmnopqrstvuwxyzABCDEFGHIJKLMNOPQRSTVUWXYZ1234567890-";
- $maskMax = strlen($mask) - 1;
- $s = '';
- for($i=0;$i<$length;$i++){
- $s .= $mask[rand(0,$maskMax)];
- }
- return $s;
- }
- public function isAuth(){
- return !empty($this->user);
- }
- public function getSessionID(){
- $thisSession = $_SESSION[$this->sessionName];
- if (empty($thisSession)) { $thisSession = ""; }
- return $thisSession;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement