Model.php
См. документацию.
1 <?php
2 
3 /**
4  * @file
5  * @brief проверка создания моделей
6  *
7  */
8 
9 namespace Wrong\Check;
10 
14 
15 /**
16  * @brief Model отвечает за проверку создания моделей
17  *
18  */
19 
20 class Model
21 {
22  /**
23  * проверка возможности создания новой модели
24  *
25  * @param array $arr массив данных
26  * @param string $table имя таблицы в базе данных
27  * @param array $replace_path массив путей для замены в файлах и полях запроса.
28  */
29  public static function create($arr, $table, $replace_path = [])
30  {
31  global $user;
32 
33  if ($replace_path) {
34  $arr['file'] = strtr($arr['file'], $replace_path);
35  $arr['request'] = strtr($arr['request'], $replace_path);
36  }
37 
38  if ($table == 'modals') {
39  $arr['template_id'] = $arr['template_id'] ?? 4;
40  if (!($arr['template_filename'] = Templates::all_available($arr['template_id'])[0]->file) || !file_exists($_SERVER['DOCUMENT_ROOT'] . $arr['template_filename'])) {
41  exit(json_encode(['error' => 'Файл шаблона с таким именем не существует!']));
42  }
43  }
44 
47 
48  if (empty($arr['owner_group']) || !in_array($arr['owner_group'], $user->subordinate_groups)) {
49  exit(json_encode(['error' => '"Группа владелец" не найдена среди подчиненных групп']));
50  }
51 
52  if (($models_limit = Controller::find($arr['owner_group'], 'id', 'groups')->models_limit) && $models_limit <= Group::count_all_owner_models($arr['owner_group'])) {
53  exit(json_encode(['error' => 'Лимит моделей для данной группы исчерпан']));
54  }
55  }
56 
57  /**
58  * проверяет, возможность создания файла обработчика
59  *
60  * @param array $arr массив данных
61  * @param string $table имя таблицы в базе данных
62  * @param bool $format_only если true, то функция будет проверять только формат, а не существование файла
63  * и наличие файла в базе.
64  */
65  public static function file($arr, $table, $format_only = false)
66  {
67 
68  $path = self::pattern($table)->file;
69 
70  $rx = '#^' . $path . '/([/a-z0-9\_\-\.]+)\.php$#';
71 
72  if (!preg_match($rx, $arr['file'], $matches) || preg_match('#//#', $matches[2]) || preg_match('#^/#', $matches[2]) || preg_match('#/$#', $matches[2])) {
73  exit(json_encode(['error' => 'Неверный формат для "Файл обработчик"']));
74  }
75 
76  if (!$format_only && $table != 'pages') {
77  if (file_exists($_SERVER['DOCUMENT_ROOT'] . $arr['file'])) {
78  exit(json_encode(['error' => 'Файл обработчик с таким именем уже существует!']));
79  }
80 
81  if (Controller::find($arr['file'], 'file', $table)) {
82  exit(json_encode(['error' => 'Файл обработчик с таким именем уже зарегистрирован в БД!']));
83  }
84  }
85  }
86 
87  /**
88  * проверяет формат запроса для создания модели
89  *
90  * @param array $arr массив данных
91  * @param string $table имя таблицы в базе данных
92  */
93  public static function request($arr, $table)
94  {
95 
96  if ($table == 'templates') return;
97 
98  $path = self::pattern($table)->request;
99 
100  if (in_array($table, ['pages', 'actions'])) {
101  $rx = '#^' . $path . '/([/a-z0-9\_\-\.]*)$#i';
102  } else if ($table == 'crontabs') {
103  $rx = '#^' . $path . '/([a-z0-9]*)#i';
104  } else {
105  $rx = '#^' . $path . '/([a-z0-9\_\-]+)$#i';
106  }
107 
108  if (!preg_match($rx, $arr['request'], $matches) || preg_match('#//#', $matches[1]) || preg_match('#^/#', $matches[1]) || preg_match('#/$#', $matches[1])) {
109  exit(json_encode(['error' => 'Неверный формат для "Запрос"']));
110  }
111  }
112 
113  /**
114  * возвращает объект с двумя свойствами: паттерн формата файла и запроса для таблицы модели.
115  *
116  * @param string $table имя таблицы в базе данных
117  *
118  * @return object Объект с двумя свойствами: паттерн файла и запроса.
119  */
120  public static function pattern($table)
121  {
122  global $user;
123 
124  switch ($table) {
125  case 'actions':
126  return (object) ['file' => '/api/action/(' . implode('|', $user->writeble_paths) . ')', 'request' => '/api/action'];
127  break;
128  case 'modals':
129  return (object) ['file' => '/api/modal/(' . implode('|', $user->writeble_paths) . ')', 'request' => '/api/modal'];
130  break;
131  case 'selects':
132  return (object) ['file' => '/api/select/(' . implode('|', $user->writeble_paths) . ')', 'request' => '/api/select'];
133  break;
134  case 'pages':
135  return (object) ['file' => '/page/(' . implode('|', $user->writeble_paths) . ')', 'request' => ''];
136  case 'templates':
137  return (object) ['file' => '/\.\./templates/(page|modal|action|incode|select)', 'request' => ''];
138  break;
139  case 'crontabs':
140  return (object) ['file' => '', 'request' => ''];
141  break;
142  }
143  }
144 }
if(!in_array($_POST['table'], Wrong\Database\Controller::$tables)) $table
Definition: filter.php:20
Model отвечает за проверку создания моделей
Definition: Model.php:21
static file($arr, $table, $format_only=false)
Definition: Model.php:65
static create($arr, $table, $replace_path=[])
Definition: Model.php:29
static pattern($table)
Definition: Model.php:120
static request($arr, $table)
Definition: Model.php:93
Controller контроллер для запросов к БД
Definition: Controller.php:17
static find($value, $column='id', $table='')
Definition: Controller.php:31
Templates контроллер управления моделями выборок, расширяет Controller.
Definition: Templates.php:22
static all_available($value='', $column='id', $table='')
Definition: Templates.php:68
Group класс, содержащий статические методы, используемые для управления группами пользователей.
Definition: Group.php:25
static count_all_owner_models($id, $is_active=false)
Definition: Group.php:352
$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
$arr
Definition: actions.php:25