session.php
См. документацию.
1 <?php
2 
3 /**
4  * @file
5  * @brief файл стартующий логику авторизации в системе и старт сессии, внедрение дополнительных js и html кодов в страницу
6  *
7  * подключение к бд, установка дополнительных переменных среды, старт сессии
8  */
9 
10 use Wrong\Auth\User;
14 use Wrong\Start\Env;
17 
18 /** подключение к бд */
19 $dbh = Connect::getInstance()->dbh;
20 
21 try {
22  Env::add($dbh->query("SELECT `name`, `value` FROM `settings`")->fetchAll(\PDO::FETCH_KEY_PAIR));
23 } catch (\Throwable $th) {
24  dd($dbh->errorInfo(), 'Возможно система не установлена и в index.php не включен файл install/install.php');
25 }
26 
27 /** Строка path запроса */
28 $request = strtok($_SERVER['REQUEST_URI'], '?');
29 
30 ob_start();
31 session_start();
32 /** Установка адреса сервера, хоста и порта в переменные среды в случае изменения. */
33 Env::$e->set('SERVER_ADDR', $_SERVER['SERVER_ADDR']);
34 Env::$e->set('HTTP_HOST', $_SERVER['HTTP_HOST']);
35 Env::$e->set('SERVER_PORT', $_SERVER['SERVER_PORT']);
36 Env::add(['CSRF' => md5(session_id())]);
37 
38 register_shutdown_function(function () {
39  $out = ob_get_contents();
40  if (stripos($out, '</body>') === false) return; // значит это не html страница, а api запрос
41  ob_clean();
42  $script = '<script>window.CSRF = "' . Env::$e->CSRF . '";' . Stackjs::execute() . '</script>';
43  $out = str_replace('</body>', '<div class="position-fixed" id="toast" style="top:0;left:0;z-index:1051;"></div>' . $script . '</body>', $out);
44  if (!empty($_COOKIE['FROM_UID'])) {
45  $out = str_replace('</body>', '<div class="position-fixed" style="bottom:10px;right:10px;z-index:1051;"><a title="Вернуться в свой аккаунт" class="btn btn-secondary border-0 rounded-circle" href="/?FROM_UID"><i class="fa fa-user"></i></a></div></body>', $out);
46  }
47  $out = Hideout::hide($out);
48  echo $out;
49 });
50 
51 header("Cache-Control: no-cache");
52 header("Expires: Thu, 01 Jan 1970 00:00:01 GMT");
53 
54 /** Это статический метод, который загружает все группы из базы данных и сохраняет их в массиве `Group::`. */
55 Group::groups();
56 
57 if (!empty($_SERVER['HTTP_X_AUTH_TOKEN'])) { /// Авторизация по токену апи
58  if (!Env::$e->API) {
59  exit(json_encode(['error' => 'API is disabled']));
60  }
61  $sth = $dbh->prepare("SELECT `id` FROM `users` WHERE `api_act` = 1 AND `x_auth_token` = :x_auth_token");
62  $sth->bindValue(':x_auth_token', $_SERVER['HTTP_X_AUTH_TOKEN']);
63  $sth->execute();
64  if ($id = $sth->fetchColumn()) {
65  $user = new User($id);
66  $user->is_api = true;
67  } else {
68  exit(json_encode(['error' => 'Wrong token or API is disabled']));
69  }
70 } else { /// авторизация по сессии или кукам
71  $user = new User(User::session());
72 }
73 
74 
75 /** защита от CSRF-атаки для POST/PUT/DELETE запросов. */
76 if ($user->id && !$user->is_api && ($_SERVER['REQUEST_METHOD'] == 'POST' || $_SERVER['REQUEST_METHOD'] == 'PUT' || $_SERVER['REQUEST_METHOD'] == 'DELETE') && (empty($_REQUEST['CSRF']) || $_REQUEST['CSRF'] != Env::$e->CSRF)) {
77  exit('Invalid CSRF!');
78 }
79 
80 /** Метод, обновляющий время последней активности пользователя в базе данных. */
81 $user->set_online();
82 /** записывает действия пользователя в базу данных. */
83 Write::action();
84 
85 if (Wrong\Start\Env::$e->CRON_ACT && (!file_exists($_SERVER['DOCUMENT_ROOT'] . '/../temp/lock-cron.lock') || filemtime($_SERVER['DOCUMENT_ROOT'] . '/../temp/lock-cron.lock') + 100 < time())) {
86  Wrong\Task\Stackjs::add('(function(){let im=new Image();im.src="/cron.php?"+Math.random();})();', 0, 'cron'); /// активация самозапускающегося скрипта выполнения крон задач
87 }
if(!($row=Wrong\Models\Crontabs::find($_POST['id']))) if(! $user->access() ->write($row)) $sth
Definition: edit-cli.php:20
User отвечает за работу с данными пользователя
Definition: User.php:21
Connect создает подключение к базе данных
Definition: Connect.php:19
Hideout используется для скрытия элементов в HTML.
Definition: Hideout.php:21
Write класс отвечает за запись логов действий
Definition: Write.php:20
Group класс, содержащий статические методы, используемые для управления группами пользователей.
Definition: Group.php:25
Env класс управляющий, добавляющий или записывающий переменные среды
Definition: Env.php:17
Stackjs класс добавляющий и вызывающий javascript стеки
Definition: Stackjs.php:17
static add($code, $timeout=0, $key='')
Definition: Stackjs.php:25
dd(... $vars)
Definition: debug.php:15
setcookie('FROM_UID', $uid, [ 'expires'=> time()+31536000, 'path'=> '/', 'domain'=> $_SERVER['HTTP_HOST'], 'secure'=> Wrong\Start\Env::$e->IS_SECURE, 'httponly'=> false, 'samesite'=> Wrong\Start\Env::$e->IS_SECURE ? 'None' :'Lax']) or setcookie('FROM_UID' time()+31536000
Definition: from-user.php:36
$user
Definition: from-user.php:38
setcookie('FROM_UID', $uid, [ 'expires'=> time()+31536000, 'path'=> '/', 'domain'=> $_SERVER['HTTP_HOST'], 'secure'=> Wrong\Start\Env::$e->IS_SECURE, 'httponly'=> false, 'samesite'=> Wrong\Start\Env::$e->IS_SECURE ? 'None' :'Lax']) or setcookie('FROM_UID' $_SERVER['HTTP_HOST']
Definition: from-user.php:36
if(($dbh=Connect::getInstance(true) ->dbh) && $dbh->query("SHOW TABLES") ->fetchAll() && $dbh->query("SELECT COUNT(*) FROM `users`") ->fetchColumn()) if(!empty($_POST)) exit
Definition: install.php:198
catch(\Throwable $th) $request
Definition: session.php:28
$dbh
Definition: session.php:19