Advertisement
acobzew

modules/users/users.php

Nov 21st, 2017
510
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 19.04 KB | None | 0 0
  1. <?php
  2. /**
  3.  * @project Astra.CMS
  4.  * @link http://a-cms.ru/
  5.  * @copyright 2011 "Астра Вебтехнологии"
  6.  * @author Vitaly Hohlov <admin@a-cms.ru>
  7.  * @package Modules
  8.  */
  9. /**************************************************************************/
  10.  
  11. /**
  12.  * Модуль "Пользователи".
  13.  *
  14.  * <a href="http://wiki.a-cms.ru/modules/users">Руководство</a>.
  15.  */
  16. class UsersModule extends A_MainFrame
  17. {
  18.     /**
  19.      * Идентификатор пользователя.
  20.      */
  21.  
  22.     public $iduser = 0;
  23.  
  24.     /**
  25.      * Маршрутизатор URL.
  26.      *
  27.      * @param array $uri Элементы полного пути URL.
  28.      */
  29.  
  30.     function Router($uri)
  31.     {
  32.         if (count($uri) == 1) {
  33.             if (preg_match("/([^.]+)\.html$/", reset($uri), $match)) {
  34.                 switch ($match[1]) {
  35.                     case "register":
  36.                     case "anketa":
  37.                     case "balance":
  38.                     case "remember":
  39.                     case "newpassword":
  40.                         $this->page = $match[1];
  41.                         return;
  42.                     case "register_ok":
  43.                     case "register_activate":
  44.                     case "register_wait":
  45.                     case "activate_ok":
  46.                     case "activate_error":
  47.                     case "remember_ok":
  48.                     case "remember_link_ok":
  49.                     case "remember_newpassword_ok":
  50.                         $this->page = "message";
  51.                         $this->Assign("message", $match[1]);
  52.                         return;
  53.                     default:
  54.                         A::NotFound();
  55.                 }
  56.             } elseif ($id = A::$DB->getOne("SELECT id FROM " . SECTION . " WHERE login=? AND active='Y'", reset($uri))) {
  57.                 $this->iduser = $id;
  58.                 $this->page = "page";
  59.                 return;
  60.             } else
  61.                 A::NotFound();
  62.         } elseif (count($uri) == 0)
  63.             $this->page = "main";
  64.         else
  65.             A::NotFound();
  66.     }
  67.  
  68.     /**
  69.      * Маршрутизатор действий.
  70.      */
  71.  
  72.     function Action($action)
  73.     {
  74.         switch ($action) {
  75.             case "register":
  76.                 $this->Register();
  77.                 break;
  78.             case "save":
  79.                 $this->Save();
  80.                 break;
  81.             case "activate":
  82.                 $this->Activate();
  83.                 break;
  84.             case "remember":
  85.                 $this->Remember();
  86.                 break;
  87.         }
  88.     }
  89.  
  90.     /**
  91.      * Обработчик действия: Регистрация.
  92.      */
  93.  
  94.     function Register()
  95.     {
  96.         if (empty($_REQUEST['captcha']) || md5(mb_strtolower($_REQUEST['captcha'])) != A_Session::get('captcha')) {
  97.             $this->errors['captcha'] = true;
  98.             return false;
  99.         }
  100.         A_Session::unregister('captcha');
  101.  
  102.         if (empty($_REQUEST['email'])) {
  103.             $this->errors['emptyemail'] = true;
  104.             return false;
  105.         }
  106.  
  107.         if (!preg_match("/^[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9]+$/i", $_REQUEST['email'])) {
  108.             $this->errors['invalidemail'] = true;
  109.             return false;
  110.         }
  111.  
  112.         if (empty($_REQUEST['login']))
  113.             $_REQUEST['login'] = $_REQUEST['email'];
  114.         else
  115.             $_REQUEST['login'] = trim($_REQUEST['login']);
  116.  
  117.         if (empty($_REQUEST['name']))
  118.             $_REQUEST['name'] = "-";
  119.  
  120.         if (empty($_REQUEST['password']))
  121.             $_REQUEST['password'] = mb_substr(md5(time()), 0, 8);
  122.  
  123.         if (empty($_REQUEST['login']) || A::$DB->existsRow("SELECT id FROM " . SECTION . " WHERE login=?", $_REQUEST['login'])) {
  124.             $this->errors['doublelogin'] = true;
  125.             return false;
  126.         }
  127.  
  128.         if (empty($_REQUEST['email']) || A::$DB->existsRow("SELECT id FROM " . SECTION . " WHERE email=?", $_REQUEST['email'])) {
  129.             $this->errors['doublemail'] = true;
  130.             return false;
  131.         }
  132.  
  133.         $_REQUEST['date'] = time();
  134.         $_REQUEST['active'] = A::$OPTIONS['activatemode'] == 0 ? 'Y' : 'N';
  135.  
  136.         if (empty($_REQUEST['name'])) {
  137.             $_REQUEST['name'] = "";
  138.             if (!empty($_REQUEST["name1"]))
  139.                 $_REQUEST['name'] .= $_REQUEST["name1"];
  140.             if (!empty($_REQUEST["name2"]))
  141.                 $_REQUEST['name'] .= " " . $_REQUEST["name2"];
  142.             if (!empty($_REQUEST["name3"]))
  143.                 $_REQUEST['name'] .= " " . $_REQUEST["name3"];
  144.         }
  145.  
  146.         $_REQUEST['name'] = strip_tags(trim($_REQUEST['name']));
  147.         $_REQUEST['login'] = strip_tags(trim($_REQUEST['login']));
  148.         $_REQUEST['email'] = strip_tags(trim($_REQUEST['email']));
  149.  
  150.         if (getSectionByModule('forum')) {
  151.             if (!empty($_REQUEST['name']) && A::$DB->existsRow("SELECT id FROM " . SECTION . " WHERE name=?", $_REQUEST['name'])) {
  152.                 $this->errors['doublename'] = true;
  153.                 return false;
  154.             }
  155.         }
  156.  
  157.         $password = $_REQUEST['password'];
  158.  
  159.         switch (A::$OPTIONS['activatemode']) {
  160.             case 0:
  161.             case 1:
  162.                 $_REQUEST['password'] = md5($_REQUEST['password']);
  163.                 break;
  164.             case 2:
  165.                 $_REQUEST['password'] = '?[' . $_REQUEST['password'] . ']';
  166.                 break;
  167.         }
  168.  
  169.         $dataset = new A_DataSet(SECTION, true);
  170.         $dataset->fields = array("date", "name", "login", "password", "email", "active");
  171.  
  172.         if ($structure = getStructureByPlugin("groups")) {
  173.             $groups = A::$DB->getAssoc("SELECT id,name FROM {$structure} WHERE idsec=" . SECTION_ID . " ORDER BY sort");
  174.             $_REQUEST['idgroup'] = key($groups);
  175.             $dataset->fields[] = "idgroup";
  176.         }
  177.  
  178.         if ($id = $dataset->Insert()) {
  179.             if ($idimg = UploadImage("image", $_REQUEST['name']))
  180.                 A::$DB->execute("UPDATE " . SECTION . " SET idimg=$idimg WHERE id=$id");
  181.  
  182.             $_REQUEST['password'] = $password;
  183.  
  184.             if (!empty(A::$OPTIONS['sendmessage'])) {
  185.                 if (!empty(A::$OPTIONS['mail_regnew'])) {
  186.                     $mail = new A_Mail(A::$OPTIONS['mail_regnew']);
  187.                     $mail->Assign("data", $_REQUEST);
  188.                     $mail->send(A::$OPTIONS['sendmessage']);
  189.                 }
  190.             }
  191.  
  192.             if (A::$OPTIONS['usebalance'] && A::$OPTIONS['startbalance'] > 0)
  193.                 A::$OBSERVER->Event('UsersTransaction', SECTION,
  194.                     array('id' => $id, 'in' => A::$OPTIONS['startbalance'], 'out' => 0, 'description' => "Зачисление базовых средств при регистрации."));
  195.  
  196.             switch (A::$OPTIONS['activatemode']) {
  197.                 case 0:
  198.                     if (!empty(A::$OPTIONS['mail_register'])) {
  199.                         $mail = new A_Mail(A::$OPTIONS['mail_register']);
  200.                         $mail->Assign("data", $_REQUEST);
  201.                         $mail->send("{$_REQUEST['name']}<{$_REQUEST['email']}>");
  202.                     }
  203. //                    if (isset($_REQUEST['autologin'])) {
  204.                         $A_AUTHCODE = md5(time());
  205.                         A_Session::set(SECTION . "_auth_id", $id);
  206.                         A_Session::set(SECTION . "_auth_pass", md5($A_AUTHCODE . md5($_REQUEST['password'])));
  207.                         setcookie(SECTION . "_auth_id", A_Session::get(SECTION . "_auth_id"), time() + 31104000, "/");
  208.                         setcookie(SECTION . "_auth_pass", A_Session::get(SECTION . "_auth_pass"), time() + 31104000, "/");
  209.                         A::$DB->execute("UPDATE " . SECTION . " SET cauth=cauth+1,authcode='$A_AUTHCODE' WHERE id=" . $id);
  210. //                    }
  211.                     if (!empty($_REQUEST['url']))
  212.                         A::goUrl($_REQUEST['url']);
  213.                     else
  214.                         A::goUrl(getSectionLink(SECTION) . "register_ok.html");
  215.                     break;
  216.                 case 1:
  217.                     if (!empty(A::$OPTIONS['mail_activate'])) {
  218.                         $mail = new A_Mail(A::$OPTIONS['mail_activate']);
  219.                         $mail->Assign("data", $_REQUEST);
  220.                         $mail->Assign("activatelink", "http://" . HOSTNAME . getSectionLink(SECTION) . "register.html?action=activate&id={$id}&code=" . md5(SECTION . $_REQUEST['date']));
  221.                         $mail->send("{$_REQUEST['name']}<{$_REQUEST['email']}>");
  222.                     }
  223.                     A::goUrl(getSectionLink(SECTION) . "register_activate.html");
  224.                     break;
  225.                 case 2:
  226.                     A::goUrl(getSectionLink(SECTION) . "register_wait.html");
  227.                     break;
  228.             }
  229.         } else
  230.             return false;
  231.     }
  232.  
  233.     /**
  234.      * Обработчик действия: Активация.
  235.      */
  236.  
  237.     function Activate()
  238.     {
  239.         if (!empty($_REQUEST['id']) && !empty($_REQUEST['code'])) {
  240.             if ($row = A::$DB->getRowById($_REQUEST['id'], SECTION)) {
  241.                 if ($_REQUEST['code'] == md5(SECTION . $row['date'])) {
  242.                     A::$DB->execute("UPDATE " . SECTION . " SET active='Y' WHERE id=" . $row['id']);
  243.  
  244.                     // Сразу же авторизуем пользователя
  245.                     $A_AUTHCODE = md5(time());
  246.                     A_Session::set(SECTION . "_auth_id", $_REQUEST['id']);
  247.                     A_Session::set(SECTION . "_auth_pass", md5($A_AUTHCODE . $row['password']));
  248.                     setcookie(SECTION . "_auth_id", A_Session::get(SECTION . "_auth_id"), time() + 31104000, "/");
  249.                     setcookie(SECTION . "_auth_pass", A_Session::get(SECTION . "_auth_pass"), time() + 31104000, "/");
  250.                     A::$DB->execute("UPDATE " . SECTION . " SET cauth=cauth+1,authcode='$A_AUTHCODE' WHERE id=" . $_REQUEST['id']);
  251.  
  252.                     A::goUrl(getSectionLink(SECTION) . "activate_ok.html");
  253.                 }
  254.             }
  255.         }
  256.         A::goUrl(getSectionLink(SECTION) . "activate_error.html");
  257.     }
  258.  
  259.     /**
  260.      * Обработчик действия: Восстановление пароля.
  261.      */
  262.  
  263.     function Remember()
  264.     {
  265.         if (empty($_REQUEST['login'])) {
  266.             $this->errors['remember'] = true;
  267.             return false;
  268.         }
  269.  
  270.         if ($row = A::$DB->getRow("SELECT * FROM " . SECTION . " WHERE login=? OR email=?", array($_REQUEST['login'], $_REQUEST['login']))) {
  271.  
  272.             if (A::$OPTIONS['remembermode'] == 1) { // Ссылка на восстановление пароля
  273.  
  274.                 if (!empty(A::$OPTIONS['mail_remember_link'])) {
  275.                     $mail = new A_Mail(A::$OPTIONS['mail_remember_link']);
  276.                     $mail->Assign("data", $row);
  277.                     $rememberLink = "http://" . HOSTNAME . getSectionLink(SECTION) . "newpassword.html?login={$_REQUEST['login']}&code=" . md5(SECTION . $row['date'] . $row['password']);
  278.                     $mail->Assign("remember_link", $rememberLink);
  279.                     $mail->send($row['email']);
  280.  
  281.                     A::goUrl(getSectionLink(SECTION) . "remember_link_ok.html");
  282.                 }
  283.  
  284.             } else { // Новый пароль на почту
  285.  
  286.                 $row['password'] = mb_substr(md5(time()), 0, 8);
  287.  
  288.                 if (!empty(A::$OPTIONS['mail_remember'])) {
  289.                     $mail = new A_Mail(A::$OPTIONS['mail_remember']);
  290.                     $mail->Assign("data", $row);
  291.                     $mail->send($row['email']);
  292.  
  293.                     A::$DB->Update(SECTION, array('password' => md5($row['password'])), "id=" . $row['id']);
  294.  
  295.                     A::goUrl(getSectionLink(SECTION) . "remember_ok.html");
  296.                 }
  297.             }
  298.         } else {
  299.             $this->errors['remember'] = true;
  300.             return false;
  301.         }
  302.     }
  303.  
  304.     /**
  305.      * Обработчик действия: Изменение личных данных.
  306.      */
  307.  
  308.     function Save()
  309.     {
  310.         if (!A::$AUTH->isLogin()) return false;
  311.  
  312.         $_REQUEST['id'] = A::$AUTH->id;
  313.  
  314.         if (empty($_REQUEST['name'])) {
  315.             $_REQUEST['name'] = "";
  316.             if (!empty($_REQUEST["name1"]))
  317.                 $_REQUEST['name'] .= $_REQUEST["name1"];
  318.             if (!empty($_REQUEST["name2"]))
  319.                 $_REQUEST['name'] .= " " . $_REQUEST["name2"];
  320.             if (!empty($_REQUEST["name3"]))
  321.                 $_REQUEST['name'] .= " " . $_REQUEST["name3"];
  322.         }
  323.  
  324.         $_REQUEST['name'] = strip_tags($_REQUEST['name']);
  325.         $_REQUEST['email'] = strip_tags($_REQUEST['email']);
  326.  
  327.         $dataset = new A_DataSet(SECTION, true);
  328.         $dataset->fields = array("name", "email");
  329.  
  330.         if (!empty($_REQUEST['password'])) {
  331.             $_REQUEST['password'] = md5($_REQUEST['password']);
  332.             $dataset->fields[] = "password";
  333.         }
  334.  
  335.         if ($row = $dataset->Update()) {
  336.             if ($idimg = UploadImage("image", $_REQUEST['name'], $row['idimg']))
  337.                 A::$DB->execute("UPDATE " . SECTION . " SET idimg=$idimg WHERE id=" . $row['id']);
  338.             if (isset($_REQUEST['imagedel'])) {
  339.                 DelRegImage($row['idimg']);
  340.                 A::$DB->execute("UPDATE " . SECTION . " SET idimg=0 WHERE id=" . $row['id']);
  341.             }
  342.  
  343.             A::goUrl(getSectionLink(SECTION) . "anketa.html");
  344.         } else
  345.             return false;
  346.     }
  347.  
  348.     /**
  349.      * Формирование данных доступных в шаблоне активного типа.
  350.      */
  351.  
  352.     function createData()
  353.     {
  354.         switch ($this->page) {
  355.             case "main":
  356.                 break;
  357.             case "register":
  358.                 $this->RegisterPage();
  359.                 break;
  360.             case "anketa":
  361.                 $this->AnketaPage();
  362.                 break;
  363.             case "balance":
  364.                 $this->BalancePage();
  365.                 break;
  366.             case "page":
  367.                 $this->UserPage();
  368.                 break;
  369.             case "newpassword":
  370.                 $this->NewPasswordPage();
  371.                 break;
  372.         }
  373.     }
  374.  
  375.     /**
  376.      * Формирование данных доступных в шаблоне страницы регистрации.
  377.      */
  378.  
  379.     function RegisterPage()
  380.     {
  381.         $this->Assign("form", $_POST);
  382.         $this->prepareAddForm();
  383.         $this->Assign("captcha", $captcha = substr(time(), rand(0, 6), 4));
  384.         A_Session::set("captcha", md5($captcha));
  385.     }
  386.  
  387.     /**
  388.      * Формирование данных доступных в шаблоне страницы изменения личных данных.
  389.      */
  390.  
  391.     function AnketaPage()
  392.     {
  393.         if (!A::$AUTH->isLogin())
  394.             A::goUrl(getSectionLink(SECTION));
  395.         $data = A::$DB->getRowById(A::$AUTH->id, SECTION);
  396.         $this->prepareEditForm($data);
  397.         $this->Assign("form", $data);
  398.     }
  399.  
  400.     /**
  401.      * Формирование данных доступных в шаблоне страницы пользователя.
  402.      */
  403.  
  404.     function UserPage()
  405.     {
  406.         $urow = A::$DB->getRowById($this->iduser, SECTION);
  407.         prepareValues(SECTION, $urow);
  408.         $this->Assign("user", $urow);
  409.     }
  410.  
  411.     /**
  412.      * Формирование данных доступных в шаблоне страницы денежного баланса.
  413.      */
  414.  
  415.     function BalancePage()
  416.     {
  417.         if (!A::$AUTH->isLogin())
  418.             A::goUrl(getSectionLink(SECTION));
  419.  
  420.         if (!A::$OPTIONS['usebalance'])
  421.             A::NotFound();
  422.  
  423.         $urow = A::$AUTH->data;
  424.         prepareValues(SECTION, $urow);
  425.  
  426.         $this->Assign("user", $urow);
  427.         $this->Assign("valute", A::$OPTIONS['valute']);
  428.  
  429.         $in = array();
  430.         $pager1 = new A_Pager(20);
  431.         $pager1->query("SELECT * FROM " . SECTION . "_transactions WHERE iduser=" . A::$AUTH->id . " AND `in`>0 ORDER BY date DESC");
  432.         while ($row = $pager1->fetchRow()) {
  433.             $row['sum'] = $row['in'];
  434.             $in[] = $row;
  435.         }
  436.         $pager1->free();
  437.  
  438.         $this->Assign("in", $in);
  439.         $this->Assign("in_pager", $pager1);
  440.  
  441.         $this->Assign("sumin", A::$DB->getOne("SELECT SUM(`in`) FROM " . SECTION . "_transactions WHERE iduser=" . A::$AUTH->id . " AND `in`>0"));
  442.  
  443.         $out = array();
  444.         $pager2 = new A_Pager(20);
  445.         $pager2->query("SELECT * FROM " . SECTION . "_transactions WHERE iduser=" . A::$AUTH->id . " AND `out`>0 ORDER BY date DESC");
  446.         while ($row = $pager2->fetchRow()) {
  447.             $row['sum'] = $row['out'];
  448.             $out[] = $row;
  449.         }
  450.         $pager2->free();
  451.  
  452.         $this->Assign("out", $out);
  453.         $this->Assign("out_pager", $pager2);
  454.  
  455.         $this->Assign("sumout", A::$DB->getOne("SELECT SUM(`out`) FROM " . SECTION . "_transactions WHERE iduser=" . A::$AUTH->id . " AND `out`>0"));
  456.     }
  457.  
  458.     /**
  459.      * Страница изменения пароля по ссылке
  460.      */
  461.  
  462.     function NewPasswordPage()
  463.     {
  464.         if (A::$OPTIONS['remembermode'] != 1) {
  465.             A::goUrl(getSectionLink(SECTION) . "remember.html");
  466.         }
  467.  
  468.         if (empty($_REQUEST['login']) || empty($_REQUEST['code'])) {
  469.             $this->errors['remember'] = true;
  470.         }
  471.  
  472.         if ($row = A::$DB->getRow("SELECT * FROM " . SECTION . " WHERE login=? OR email=?", array($_REQUEST['login'], $_REQUEST['login']))) {
  473.  
  474.             if ($_REQUEST['code'] == md5(SECTION . $row['date'] . $row['password'])) {
  475.  
  476.                 if (!empty($_POST['new_password'])) {
  477.                     if ($_POST['new_password'] == $_POST['new_password_confirmation']) {
  478.  
  479.                         A::$DB->Update(SECTION, array('password' => md5($_POST['new_password'])), "id=" . $row['id']);
  480.  
  481.                         // Сразу же авторизуем пользователя
  482.                         $A_AUTHCODE = md5(time());
  483.                         A_Session::set(SECTION . "_auth_id", $row['id']);
  484.                         A_Session::set(SECTION . "_auth_pass", md5($A_AUTHCODE . md5($_POST['new_password'])));
  485.                         setcookie(SECTION . "_auth_id", A_Session::get(SECTION . "_auth_id"), time() + 31104000, "/");
  486.                         setcookie(SECTION . "_auth_pass", A_Session::get(SECTION . "_auth_pass"), time() + 31104000, "/");
  487.                         A::$DB->execute("UPDATE " . SECTION . " SET cauth=cauth+1,authcode='$A_AUTHCODE' WHERE id=" . $row['id']);
  488.  
  489.                         A::goUrl(getSectionLink(SECTION) . "remember_newpassword_ok.html");
  490.  
  491.                     } else {
  492.                         $this->errors['remember_password'] = true;
  493.                     }
  494.                 }
  495.  
  496.             } else {
  497.                 $this->errors['remember_link'] = true;
  498.             }
  499.  
  500.         } else {
  501.             $this->errors['remember'] = true;
  502.         }
  503.  
  504.         $this->Assign("login", $_REQUEST['login']);
  505.         $this->Assign("code", $_REQUEST['code']);
  506.     }
  507. }
  508.  
  509. A::$MAINFRAME = new UsersModule;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement