Advertisement
Guest User

Untitled

a guest
Dec 17th, 2018
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 16.60 KB | None | 0 0
  1. <?
  2.  
  3. if (!\Bitrix\Main\Loader::includeModule("iblock")) return;
  4.  
  5.  
  6.  
  7. Class BCustomUser {
  8.  
  9.     // fields
  10.     var $inputs = [
  11.         "action"=>"bcu_action",
  12.         "session"=>"bcu_session",
  13.         "email"=>"form_input_1",
  14.         "password"=>"form_input_2",
  15.         "password-confirm"=>"form_input_3",
  16.         "password-new"=>"form_input_4",
  17.         "password-new-confirm"=>"form_input_5",
  18.         "name"=>"form_input_6"
  19.     ];
  20.  
  21.     // setup
  22.     var $iblockID = 1;
  23.     var $authCookieName = "tricolor_blog";
  24.     var $authCookieExp = 30;
  25.     var $sessionName = "tricolor_blog";
  26.     var $saltA = 'VbKCnQ0zna8jSNndkN-8JM';
  27.     var $saltB = '8JM-jxPDIIxfD';
  28.  
  29.     // status
  30.     var $user = false;
  31.     var $message = "";
  32.  
  33.     public function __construct(){
  34.  
  35.  
  36.         // status
  37.         $this->userStatus();
  38.  
  39.         // action
  40.         if($this->getRequest("action") === "signUp") { $this->signUp(); }
  41.         if($this->getRequest("action") === "signIn") { $this->signIn(); }
  42.         if($this->getRequest("action") === "signOut") { $this->signOut(); }
  43.         if($this->getRequest("action") === "updateProfile") { $this->updateProfile(); }
  44.         if($this->getRequest("action") === "changePassword") { $this->changePassword(); }
  45.         if($this->getRequest("action") === "restorePassword") { $this->restorePassword(); }
  46.  
  47.         // session
  48.         $_SESSION[$this->sessionName] = $this->getHash(16);
  49.  
  50.  
  51.     }
  52.  
  53.     private function signUp(){
  54.         // проверка на сессию
  55.         if ($this->getRequest("session") !== $this->getSessionID()){
  56.             $this->message .= "Ошибка: ошибка сессии.<br/>";
  57.             return false;
  58.         }
  59.  
  60.         // проверка на регистрацию уже авторизированным пользователем
  61.         if ($this->isAuth()) {
  62.             $this->message .= "Ошибка: попытка регистрации авторизованным пользователем.<br/>";
  63.             return false;
  64.         }
  65.  
  66.         $errorStatus = false;
  67.         $fields = [
  68.             "IBLOCK_ID"=>$this->iblockID,
  69.             "PROPERTY_VALUES"=>[
  70.                 "USER_IP_LAST"=>$_SERVER["REMOTE_ADDR"],
  71.                 "USER_HASH_AUTH"=>$this->getHash()
  72.             ]
  73.         ];
  74.  
  75.         // email
  76.         if (filter_var($this->getRequest("email"), FILTER_VALIDATE_EMAIL)) {
  77.             $fields["NAME"] = $this->getRequest("email");
  78.         } else {
  79.             $errorStatus = true;
  80.             $this->message .= "Ошибка: некорректное поле E-mail.<br/>";
  81.         }
  82.  
  83.         // username
  84.         if (!empty($this->getRequest("name"))) {
  85.             $fields["PROPERTY_VALUES"]["USER_NAMES"] = $this->getRequest("name");
  86.         } else {
  87.             $errorStatus = true;
  88.             $this->message .= "Ошибка: некорректное имя пользователя.<br/>";
  89.         }
  90.  
  91.         // password
  92.         if ($this->getRequest("password") === $this->getRequest("password-confirm")) {
  93.  
  94.         } else {
  95.             $errorStatus = true;
  96.             $this->message .= "Ошибка: пароли не совпадают.<br/>";
  97.         }
  98.  
  99.         if (strlen($this->getRequest("password")) > 5) {
  100.             $fields["PROPERTY_VALUES"]["USER_HASH_PASSWORD"] = md5($this->saltA . $this->getRequest("password") . $this->saltB);
  101.         } else {
  102.             $errorStatus = true;
  103.             $this->message .= "Ошибка: длинна пароля меньше 6 символов.<br/>";
  104.         }
  105.  
  106.  
  107.         // any filter
  108.         //
  109.         // if (!!preg_match("/script/", $this->getRequest("field-name"))) {
  110.         //     $fields["FIELD_NAME"] = $this->getRequest("field-name");
  111.         // } else {
  112.         //     $errorStatus = true;
  113.         //     $this->message .= "Ошибка: некорректное заполнено поле.<br/>";
  114.         // }
  115.  
  116.  
  117.         if (!$errorStatus) {
  118.             $this->addNewUser($fields);
  119.         } else {
  120.             $this->message .= "Ошибка: регистрация отменена.<br/>";
  121.         }
  122.  
  123.  
  124.     }
  125.  
  126.     private function signIn(){
  127.         // проверка на сессию
  128.         if ($this->getRequest("session") !== $this->getSessionID()){
  129.             $this->message .= "Ошибка: ошибка сессии.<br/>";
  130.             return false;
  131.         }
  132.  
  133.         // проверка на авторизацию уже авторизированным пользователем
  134.         if ($this->isAuth()) {
  135.             $this->message .= "Ошибка: попытка авторизации авторизованным пользователем.<br/>";
  136.             return false;
  137.         }
  138.  
  139.         $query = \Bitrix\Iblock\ElementTable::getList(array(
  140.             'select'=>['ID','NAME'],
  141.             'filter'=>[
  142.                 'IBLOCK_ID'=>$this->iblockID,
  143.                 "ACTIVE"=>"Y",
  144.                 "NAME"=>$this->getRequest("email")
  145.             ]
  146.         ));
  147.  
  148.         if($arUser = $query->fetch()){
  149.             $arUserProps = CIBlockElement::getProperty(
  150.                 $this->iblockID,
  151.                 $arUser['ID']
  152.             );
  153.  
  154.             while ($thisProp = $arUserProps->Fetch()) {
  155.                 $arUser[$thisProp["CODE"]] = $thisProp["VALUE"];
  156.             }
  157.         }
  158.  
  159.         if(!empty($arUser) && !empty($arUser["ID"]) && $arUser["USER_HASH_PASSWORD"] === md5($this->saltA . $this->getRequest("password") . $this->saltB)){
  160.             $this->setAuthCookie($arUser["ID"], $arUser["USER_HASH_AUTH"]);
  161.             $arUser["USER_HASH_PASSWORD"] = "PROTECTED";
  162.             $this->user = $arUser;
  163.             $this->message .= "Успешно: пользователь " . $arUser["NAME"] . " авторизован.<br/>";
  164.             return true;
  165.         } else {
  166.             $this->message .= "Ошибка: неверный логин или пароль.<br/>";
  167.             return false;
  168.         }
  169.     }
  170.  
  171.     private function signOut(){
  172.         setcookie($this->authCookieName, "", 0);
  173.         $this->user = false;
  174.     }
  175.  
  176.     private function updateProfile(){
  177.         // проверка на сессию
  178.         if ($this->getRequest("session") !== $this->getSessionID()){
  179.             $this->message .= "Ошибка: ошибка сессии.<br/>";
  180.             return false;
  181.         }
  182.  
  183.         // проверка на авторизацию уже авторизированным пользователем
  184.         if (!$this->isAuth()) {
  185.             $this->message .= "Ошибка: попытка обновить профиль неавторизированным пользователем.<br/>";
  186.             return false;
  187.         }
  188.  
  189.  
  190.         // field list
  191.         $fields = [
  192.             "USER_NAMES" => $this->getRequest("name")
  193.         ];
  194.  
  195.         // обновляем
  196.         $thisUser = new CIBlockElement;
  197.         $thisUser->SetPropertyValuesEx($this->user["ID"], $this->iblockID, $fields);
  198.  
  199.         $this->message .= "Успешно: профиль обновлен.<br/>";
  200.  
  201.  
  202.         // получаем новый статус с обновленными данными
  203.  
  204.         $this->userStatus();
  205.  
  206.         return true;
  207.  
  208.  
  209.     }
  210.  
  211.     private function changePassword(){
  212.         // проверка на сессию
  213.         if ($this->getRequest("session") !== $this->getSessionID()){
  214.             $this->message .= "Ошибка: ошибка сессии.<br/>";
  215.             return false;
  216.         }
  217.  
  218.         // проверка на авторизацию пользователя
  219.         if (!$this->isAuth()) {
  220.             $this->message .= "Ошибка: попытка изменить пароль неавторизированным пользователем.<br/>";
  221.             return false;
  222.         }
  223.  
  224.         $errorStatus = false;
  225.  
  226.         // совпадение новых паролей
  227.         if ($this->getRequest("password-new") !== $this->getRequest("password-new-confirm")) {
  228.             $errorStatus = true;
  229.             $this->message .= "Ошибка: новые пароли не совпадают.<br/>";
  230.         }
  231.  
  232.         // корректность нового пароля
  233.         if (strlen($this->getRequest("password-new")) < 6) {
  234.             $errorStatus = true;
  235.             $this->message .= "Ошибка: длинна пароля меньше 6 символов.<br/>";
  236.         }
  237.  
  238.         // проверка ошибок
  239.         if ($errorStatus) {
  240.             return false;
  241.         }
  242.  
  243.         // проверка старого пароля
  244.         $query = \Bitrix\Iblock\ElementTable::getList(array(
  245.             'select'=>['ID','NAME'],
  246.             'filter'=>[
  247.                 'IBLOCK_ID'=>$this->iblockID,
  248.                 "ACTIVE"=>"Y"
  249.             ]
  250.         ));
  251.  
  252.         if($arUser = $query->fetch()){
  253.             $arUserProps = CIBlockElement::getProperty(
  254.                 $this->iblockID,
  255.                 $arUser['ID']
  256.             );
  257.             while ($thisProp = $arUserProps->Fetch()) {
  258.                 $arUser[$thisProp["CODE"]] = $thisProp["VALUE"];
  259.             }
  260.         }
  261.  
  262.         if(!empty($arUser) && !empty($arUser["ID"]) && $arUser["USER_HASH_PASSWORD"] === md5($this->saltA . $this->getRequest("password") . $this->saltB)){
  263.  
  264.  
  265.             $fields = [
  266.                 "USER_HASH_PASSWORD" => md5($this->saltA . $this->getRequest("password-new") . $this->saltB)
  267.             ];
  268.  
  269.             // обновляем
  270.             $thisUser = new CIBlockElement;
  271.             $thisUser->SetPropertyValuesEx($this->user["ID"], $this->iblockID, $fields);
  272.  
  273.             $this->message .= "Успешно: пароль успешно изменён.<br/>";
  274.             return true;
  275.         } else {
  276.             $this->message .= "Ошибка: неверный старый пароль.<br/>";
  277.             return false;
  278.         }
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.     }
  286.  
  287.     private function restorePassword(){
  288.  
  289.         // проверка на сессию
  290.         if ($this->getRequest("session") !== $this->getSessionID()){
  291.             $this->message .= "Ошибка: ошибка сессии.<br/>";
  292.             return false;
  293.         }
  294.  
  295.         // проверка на авторизацию
  296.         if ($this->isAuth()) {
  297.             $this->message .= "Ошибка: попытка восстановить пароль авторизованным пользователем.<br/>";
  298.             return false;
  299.         }
  300.  
  301.         $query = \Bitrix\Iblock\ElementTable::getList(array(
  302.             'select'=>['ID','NAME'],
  303.             'filter'=>[
  304.                 'IBLOCK_ID'=>$this->iblockID,
  305.                 "ACTIVE"=>"Y",
  306.                 "NAME"=>$this->getRequest("email")
  307.             ]
  308.         ));
  309.  
  310.         if($arUser = $query->fetch()){
  311.             $arUserProps = CIBlockElement::getProperty(
  312.                 $this->iblockID,
  313.                 $arUser['ID']
  314.             );
  315.  
  316.             while ($thisProp = $arUserProps->Fetch()) {
  317.                 $arUser[$thisProp["CODE"]] = $thisProp["VALUE"];
  318.             }
  319.         }
  320.  
  321.         // проверка на существование пользователя
  322.         if(empty($arUser) && empty($arUser["ID"])){
  323.             $this->message .= "Ошибка: пользователь (" . $this->getRequest("email") . ") не найден.<br/>";
  324.             return false;
  325.         }
  326.  
  327.  
  328.         // если пустой рестор - создаём код
  329.         if(empty($arUser["USER_HASH_RESTORE"])){
  330.             $fields = [
  331.                 "USER_HASH_RESTORE" => json_encode([
  332.                     "HASH"=>$this->getHash(32),
  333.                     "TIMESTAMP"=>time()
  334.                 ])
  335.             ];
  336.             $thisUser = new CIBlockElement;
  337.             $thisUser->SetPropertyValuesEx($arUser["ID"], $this->iblockID, $fields);
  338.             $arUser["USER_HASH_RESTORE"] = $fields["USER_HASH_RESTORE"];
  339.         }
  340.  
  341.         // получаем параметры рестора
  342.         $arRest = json_decode($arUser["USER_HASH_RESTORE"], 1);
  343.  
  344.         d($arRest);
  345.  
  346.  
  347. //        if(!empty($arUser) && !empty($arUser["ID"]) && $arUser["USER_HASH_PASSWORD"] === md5($this->saltA . $this->getRequest("password") . $this->saltB)){
  348. //            $this->setAuthCookie($arUser["ID"], $arUser["USER_HASH_AUTH"]);
  349. //            $arUser["USER_HASH_PASSWORD"] = "PROTECTED";
  350. //            $this->user = $arUser;
  351. //            $this->message .= "Успешно: пользователь " . $arUser["NAME"] . " авторизован.<br/>";
  352. //            return true;
  353. //        } else {
  354. //            $this->message .= "Ошибка: неверный логин или пароль.<br/>";
  355. //            return false;
  356. //        }
  357.  
  358.  
  359.     }
  360.  
  361.     private function addNewUser($fields){
  362.  
  363.         // проверка на уникальность емейла
  364.         $query = \Bitrix\Iblock\ElementTable::getList(array(
  365.             'select'=>['ID','NAME'],
  366.             'filter'=>['IBLOCK_ID'=>$this->iblockID,"ACTIVE"=>"Y","NAME"=>$fields["NAME"]]
  367.         ));
  368.  
  369.  
  370.         if($arUser = $query->fetch()){
  371.             $arUserProps = CIBlockElement::getProperty(
  372.                 $this->iblockID,
  373.                 $arUser['ID']
  374.             );
  375.  
  376.             while ($thisProp = $arUserProps->Fetch()) {
  377.                 $arUser[$thisProp["CODE"]] = $thisProp["VALUE"];
  378.             }
  379.         }
  380.  
  381.         if(!empty($arUser) && !empty($arUser["ID"])){
  382.             $this->message .= "Ошибка: пользователь с таким емейл (" . $fields["NAME"] . ") уже существует.<br/>";
  383.             return false;
  384.         }
  385.  
  386.         $newUser = new CIBlockElement;
  387.  
  388.         if ($query = $newUser->Add($fields)){
  389.             $this->setAuthCookie($query, $fields["PROPERTY_VALUES"]["USER_HASH_AUTH"]);
  390.  
  391.             $newUserData = [
  392.                 "ID"=>$query,
  393.                 "NAME"=>$fields["NAME"]
  394.             ];
  395.  
  396.             foreach($fields["PROPERTY_VALUES"] as $key => $value){
  397.                 $newUserData[$key] = $value;
  398.             }
  399.  
  400.             $newUserData["USER_HASH_PASSWORD"] = "PROTECTED";
  401.             $this->user = $newUserData;
  402.  
  403.             $this->message .= "Успешно: пользователь зарегистрирован.<br/>";
  404.             return true;
  405.         } else {
  406.             $this->message .= "Ошибка: не удалось зарегистрировать пользователя.<br/>";
  407.             return false;
  408.         }
  409.  
  410.     }
  411.  
  412.     private function setAuthCookie($userID,$authHash){
  413.         $userData = [
  414.             "ID"=>$userID,
  415.             "USER_HASH_AUTH"=>$authHash
  416.         ];
  417.  
  418.         $userDataComplete = base64_encode(json_encode($userData));
  419.         $cookieExpComplete = time() + ($this->authCookieExp * 86400);
  420.         setcookie($this->authCookieName, $userDataComplete, $cookieExpComplete);
  421.         $_COOKIE[$this->authCookieName] = $userDataComplete;
  422.     }
  423.  
  424.     private function userStatus(){
  425.         $authCookie = $_COOKIE[$this->authCookieName];
  426.         if (empty($authCookie)) { return false; }
  427.  
  428.         $userData = json_decode(base64_decode($authCookie), 1);
  429.         $userData["USER_IP"] = $_SERVER["REMOTE_ADDR"];
  430.  
  431.         $query = \Bitrix\Iblock\ElementTable::getList(array(
  432.             'select'=>['ID','NAME'],
  433.             'filter'=>['IBLOCK_ID'=>$this->iblockID,"ACTIVE"=>"Y","ID"=>$userData["ID"]]
  434.         ));
  435.  
  436.         if($arUser = $query->fetch()){
  437.             $arUserProps = CIBlockElement::getProperty(
  438.                 $this->iblockID,
  439.                 $arUser['ID']
  440.             );
  441.  
  442.             while ($thisProp = $arUserProps->Fetch()) {
  443.                 $arUser[$thisProp["CODE"]] = $thisProp["VALUE"];
  444.             }
  445.         }
  446.  
  447.         $arUser["USER_HASH_PASSWORD"] = "PROTECTED";
  448.  
  449.         if($arUser["USER_IP_LAST"] === $userData["USER_IP"] && $arUser["USER_HASH_AUTH"] === $userData["USER_HASH_AUTH"]){
  450.             $this->user = $arUser;
  451.             return true;
  452.         } else {
  453.             return false;
  454.         }
  455.  
  456.     }
  457.  
  458.     private function getRequest($name){
  459.         return $_REQUEST[$this->inputs[$name]];
  460.     }
  461.  
  462.     public function getHash($length = 32){
  463.         $mask = "abcdefghijklmnopqrstvuwxyzABCDEFGHIJKLMNOPQRSTVUWXYZ1234567890-";
  464.         $maskMax = strlen($mask) - 1;
  465.         $s = '';
  466.         for($i=0;$i<$length;$i++){
  467.             $s .= $mask[rand(0,$maskMax)];
  468.         }
  469.         return $s;
  470.     }
  471.  
  472.     public function isAuth(){
  473.         return !empty($this->user);
  474.     }
  475.  
  476.     public function getSessionID(){
  477.         $thisSession = $_SESSION[$this->sessionName];
  478.         if (empty($thisSession)) { $thisSession = ""; }
  479.  
  480.         return $thisSession;
  481.     }
  482.  
  483.  
  484. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement