ARI Adminer – WordPress Database Manager - Version 1.1.2

Version Description

  • Update Adminer to v. 4.3.1
  • Check installed PHP extensions for PostgreSQL
Download this release

Release Info

Developer arisoft
Plugin Icon 128x128 ARI Adminer – WordPress Database Manager
Version 1.1.2
Comparing to
See all releases

Code changes from version 1.1.1 to 1.1.2

adminer/adminer/adminer/drivers/pgsql.inc.php CHANGED
@@ -186,12 +186,20 @@ if (isset($_GET["pgsql"])) {
186
  }
187
 
188
  function connect() {
189
- global $adminer;
190
  $connection = new Min_DB;
191
  $credentials = $adminer->credentials();
192
  if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
193
  if ($connection->server_info >= 9) {
194
  $connection->query("SET application_name = 'Adminer'");
 
 
 
 
 
 
 
 
195
  }
196
  return $connection;
197
  }
@@ -244,11 +252,11 @@ ORDER BY 1";
244
 
245
  function table_status($name = "") {
246
  $return = array();
247
- foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_relation_size(c.oid) AS \"Data_length\", pg_indexes_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", c.relhasoids::int AS \"Oid\", c.reltuples as \"Rows\", n.nspname
248
  FROM pg_class c
249
  JOIN pg_namespace n ON(n.nspname = current_schema() AND n.oid = c.relnamespace)
250
  WHERE relkind IN ('r', 'm', 'v')
251
- " . ($name != "" ? "AND relname = " . q($name) : "ORDER BY relname")
252
  ) as $row) { //! Index_length, Auto_increment
253
  $return[$row["Name"]] = $row;
254
  }
@@ -638,7 +646,7 @@ AND typelem = 0"
638
  foreach ($fields as $field_name => $field) {
639
  $part = idf_escape($field['field']) . ' ' . $field['full_type']
640
  . (is_null($field['default']) ? "" : " DEFAULT $field[default]")
641
- . ($field['attnotnull'] ? "" : " NOT NULL");
642
  $return_parts[] = $part;
643
 
644
  // sequences for fields
186
  }
187
 
188
  function connect() {
189
+ global $adminer, $types, $structured_types;
190
  $connection = new Min_DB;
191
  $credentials = $adminer->credentials();
192
  if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
193
  if ($connection->server_info >= 9) {
194
  $connection->query("SET application_name = 'Adminer'");
195
+ if ($connection->server_info >= 9.2) {
196
+ $structured_types[lang('Strings')][] = "json";
197
+ $types["json"] = 4294967295;
198
+ if ($connection->server_info >= 9.4) {
199
+ $structured_types[lang('Strings')][] = "jsonb";
200
+ $types["jsonb"] = 4294967295;
201
+ }
202
+ }
203
  }
204
  return $connection;
205
  }
252
 
253
  function table_status($name = "") {
254
  $return = array();
255
+ foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_relation_size(c.oid) AS \"Data_length\", pg_total_relation_size(c.oid) - pg_relation_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", c.relhasoids::int AS \"Oid\", c.reltuples as \"Rows\", n.nspname
256
  FROM pg_class c
257
  JOIN pg_namespace n ON(n.nspname = current_schema() AND n.oid = c.relnamespace)
258
  WHERE relkind IN ('r', 'm', 'v')
259
+ " . ($name != "" ? "AND relname = " . q($name) : "ORDER BY c.oid")
260
  ) as $row) { //! Index_length, Auto_increment
261
  $return[$row["Name"]] = $row;
262
  }
646
  foreach ($fields as $field_name => $field) {
647
  $part = idf_escape($field['field']) . ' ' . $field['full_type']
648
  . (is_null($field['default']) ? "" : " DEFAULT $field[default]")
649
+ . ($field['attnotnull'] ? " NOT NULL" : "");
650
  $return_parts[] = $part;
651
 
652
  // sequences for fields
adminer/adminer/adminer/include/functions.inc.php CHANGED
@@ -481,8 +481,8 @@ function cookie($name, $value, $lifetime = 2592000) { // 2592000 - 30 days
481
  . ($lifetime ? "; expires=" . gmdate("D, d M Y H:i:s", time() + $lifetime) . " GMT" : "")
482
  . "; path=" . preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"])
483
  . ($HTTPS ? "; secure" : "")
484
- . "; HttpOnly; SameSite=lax"
485
- );
486
  }
487
 
488
  /** Restart stopped session
481
  . ($lifetime ? "; expires=" . gmdate("D, d M Y H:i:s", time() + $lifetime) . " GMT" : "")
482
  . "; path=" . preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"])
483
  . ($HTTPS ? "; secure" : "")
484
+ . "; HttpOnly; SameSite=lax",
485
+ false);
486
  }
487
 
488
  /** Restart stopped session
adminer/adminer/adminer/include/lang.inc.php CHANGED
@@ -30,7 +30,7 @@ $langs = array(
30
  'pt' => 'Português', // André Dias
31
  'pt-br' => 'Português (Brazil)', // Gian Live - gian@live.com, Davi Alexandre davi@davialexandre.com.br, RobertoPC - http://www.robertopc.com.br
32
  'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com
33
- 'ru' => 'Русский язык', // Maksim Izmaylov
34
  'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com, Juraj Krivda - http://www.jstudio.cz
35
  'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com
36
  'sr' => 'Српски', // Nikola Radovanović - cobisimo@gmail.com
30
  'pt' => 'Português', // André Dias
31
  'pt-br' => 'Português (Brazil)', // Gian Live - gian@live.com, Davi Alexandre davi@davialexandre.com.br, RobertoPC - http://www.robertopc.com.br
32
  'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com
33
+ 'ru' => 'Русский', // Maksim Izmaylov; Andre Polykanine - https://github.com/Oire/
34
  'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com, Juraj Krivda - http://www.jstudio.cz
35
  'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com
36
  'sr' => 'Српски', // Nikola Radovanović - cobisimo@gmail.com
adminer/adminer/adminer/include/version.inc.php CHANGED
@@ -1,2 +1,2 @@
1
  <?php
2
- $VERSION = "4.3.0";
1
  <?php
2
+ $VERSION = "4.3.1";
adminer/adminer/adminer/lang/ru.inc.php CHANGED
@@ -7,14 +7,14 @@ $translations = array(
7
  'Username' => 'Имя пользователя',
8
  'Password' => 'Пароль',
9
  'Select database' => 'Выбрать базу данных',
10
- 'Invalid database.' => 'Плохая база данных.',
11
  'Table has been dropped.' => 'Таблица была удалена.',
12
  'Table has been altered.' => 'Таблица была изменена.',
13
  'Table has been created.' => 'Таблица была создана.',
14
  'Alter table' => 'Изменить таблицу',
15
  'Create table' => 'Создать таблицу',
16
  'Table name' => 'Название таблицы',
17
- 'engine' => 'тип',
18
  'collation' => 'режим сопоставления',
19
  'Column name' => 'Название поля',
20
  'Type' => 'Тип',
@@ -29,7 +29,7 @@ $translations = array(
29
  'Database has been altered.' => 'База данных была изменена.',
30
  'Alter database' => 'Изменить базу данных',
31
  'Create database' => 'Создать базу данных',
32
- 'SQL command' => 'SQL запрос',
33
  'Logout' => 'Выйти',
34
  'database' => 'база данных',
35
  'Use' => 'Выбрать',
@@ -67,7 +67,7 @@ $translations = array(
67
  'Triggers' => 'Триггеры',
68
  'View' => 'Представление',
69
  'Unable to select the table' => 'Не удалось получить данные из таблицы',
70
- 'Invalid CSRF token. Send the form again.' => 'Недействительный CSRF токен. Отправите форму ещё раз.',
71
  'Comment' => 'Комментарий',
72
  'Default values' => 'Значения по умолчанию',
73
  '%d byte(s)' => array('%d байт', '%d байта', '%d байтов'),
@@ -90,13 +90,13 @@ $translations = array(
90
  'Change' => 'Изменить',
91
  'Source' => 'Источник',
92
  'Target' => 'Цель',
93
- 'Add column' => 'Добавить колонку',
94
  'Alter' => 'Изменить',
95
  'Add foreign key' => 'Добавить внешний ключ',
96
  'ON DELETE' => 'При стирании',
97
  'ON UPDATE' => 'При обновлении',
98
  'Index Type' => 'Тип индекса',
99
- 'Column (length)' => 'Колонка (длина)',
100
  'View has been dropped.' => 'Представление было удалено.',
101
  'View has been altered.' => 'Представление было изменено.',
102
  'View has been created.' => 'Представление было создано.',
@@ -134,11 +134,11 @@ $translations = array(
134
  'User has been altered.' => 'Пользователь был изменён.',
135
  'User has been created.' => 'Пользователь был создан.',
136
  'Hashed' => 'Хешировано',
137
- 'Column' => 'Колонка',
138
  'Routine' => 'Процедура',
139
  'Grant' => 'Позволить',
140
  'Revoke' => 'Запретить',
141
- 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Слишком большой объем POST-данных. Пошлите меньший объем данных или увеличьте параметр конфигурационной директивы %s.',
142
  'Logged as: %s' => 'Вы вошли как: %s',
143
  'Move up' => 'Переместить вверх',
144
  'Move down' => 'Переместить вниз',
@@ -181,7 +181,7 @@ $translations = array(
181
  'Tables have been moved.' => 'Таблицы были перемещены.',
182
  'Move to other database' => 'Переместить в другую базу данных',
183
  'Move' => 'Переместить',
184
- 'Engine' => 'Тип',
185
  'Save and continue edit' => 'Сохранить и продолжить редактирование',
186
  'original' => 'исходный',
187
  '%d item(s) have been affected.' => array('Была изменена %d запись.', 'Были изменены %d записи.', 'Было изменено %d записей.'),
@@ -202,20 +202,20 @@ $translations = array(
202
  '[yyyy]-mm-dd' => 'дд.мм.[гггг]',
203
  'History' => 'История',
204
  'Variables' => 'Переменные',
205
- 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Колонки должны иметь одинаковые типы данных, в результирующей колонке должен быть индекс, данные для импорта должны существовать.',
206
- 'Relations' => 'Реляции',
207
  'Run file' => 'Запустить файл',
208
  'Clear' => 'Очистить',
209
- 'Maximum allowed file size is %sB.' => 'Максимальный разрешённый размер файла - %sB.',
210
- 'Numbers' => 'Число',
211
  'Date and time' => 'Дата и время',
212
  'Strings' => 'Строки',
213
  'Binary' => 'Двоичный тип',
214
  'Lists' => 'Списки',
215
  'Editor' => 'Редактор',
216
- 'E-mail' => 'Электропочта',
217
  'From' => 'От',
218
- 'Subject' => 'Кому',
219
  'Send' => 'Послать',
220
  '%d e-mail(s) have been sent.' => array('Было отправлено %d письмо.', 'Было отправлено %d письма.', 'Было отправлено %d писем.'),
221
  'Webserver file %s' => 'Файл %s на вебсервере',
@@ -241,7 +241,7 @@ $translations = array(
241
  'Alter type' => 'Изменить тип',
242
  'Type has been dropped.' => 'Тип удален.',
243
  'Type has been created.' => 'Создан новый тип.',
244
- 'Ctrl+click on a value to modify it.' => 'Ctrl+кликни по значению, чтобы его изменить.',
245
  'Use edit link to modify this value.' => 'Изменить это значение можно с помощью ссылки «изменить».',
246
  'last' => 'последняя',
247
  'From server' => 'С сервера',
@@ -265,4 +265,32 @@ $translations = array(
265
  'Permanent link' => 'Постоянная ссылка',
266
  'Edit all' => 'Редактировать всё',
267
  'HH:MM:SS' => 'ЧЧ:ММ:СС',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
268
  );
7
  'Username' => 'Имя пользователя',
8
  'Password' => 'Пароль',
9
  'Select database' => 'Выбрать базу данных',
10
+ 'Invalid database.' => 'Неверная база данных.',
11
  'Table has been dropped.' => 'Таблица была удалена.',
12
  'Table has been altered.' => 'Таблица была изменена.',
13
  'Table has been created.' => 'Таблица была создана.',
14
  'Alter table' => 'Изменить таблицу',
15
  'Create table' => 'Создать таблицу',
16
  'Table name' => 'Название таблицы',
17
+ 'engine' => 'Тип таблицы',
18
  'collation' => 'режим сопоставления',
19
  'Column name' => 'Название поля',
20
  'Type' => 'Тип',
29
  'Database has been altered.' => 'База данных была изменена.',
30
  'Alter database' => 'Изменить базу данных',
31
  'Create database' => 'Создать базу данных',
32
+ 'SQL command' => 'SQL-запрос',
33
  'Logout' => 'Выйти',
34
  'database' => 'база данных',
35
  'Use' => 'Выбрать',
67
  'Triggers' => 'Триггеры',
68
  'View' => 'Представление',
69
  'Unable to select the table' => 'Не удалось получить данные из таблицы',
70
+ 'Invalid CSRF token. Send the form again.' => 'Недействительный CSRF-токен. Отправите форму ещё раз.',
71
  'Comment' => 'Комментарий',
72
  'Default values' => 'Значения по умолчанию',
73
  '%d byte(s)' => array('%d байт', '%d байта', '%d байтов'),
90
  'Change' => 'Изменить',
91
  'Source' => 'Источник',
92
  'Target' => 'Цель',
93
+ 'Add column' => 'Добавить поле',
94
  'Alter' => 'Изменить',
95
  'Add foreign key' => 'Добавить внешний ключ',
96
  'ON DELETE' => 'При стирании',
97
  'ON UPDATE' => 'При обновлении',
98
  'Index Type' => 'Тип индекса',
99
+ 'Column (length)' => 'Поле (длина)',
100
  'View has been dropped.' => 'Представление было удалено.',
101
  'View has been altered.' => 'Представление было изменено.',
102
  'View has been created.' => 'Представление было создано.',
134
  'User has been altered.' => 'Пользователь был изменён.',
135
  'User has been created.' => 'Пользователь был создан.',
136
  'Hashed' => 'Хешировано',
137
+ 'Column' => 'поле',
138
  'Routine' => 'Процедура',
139
  'Grant' => 'Позволить',
140
  'Revoke' => 'Запретить',
141
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Слишком большой объем POST-данных. Пошлите меньший объём данных или увеличьте параметр конфигурационной директивы %s.',
142
  'Logged as: %s' => 'Вы вошли как: %s',
143
  'Move up' => 'Переместить вверх',
144
  'Move down' => 'Переместить вниз',
181
  'Tables have been moved.' => 'Таблицы были перемещены.',
182
  'Move to other database' => 'Переместить в другую базу данных',
183
  'Move' => 'Переместить',
184
+ 'Engine' => 'Тип таблиц',
185
  'Save and continue edit' => 'Сохранить и продолжить редактирование',
186
  'original' => 'исходный',
187
  '%d item(s) have been affected.' => array('Была изменена %d запись.', 'Были изменены %d записи.', 'Было изменено %d записей.'),
202
  '[yyyy]-mm-dd' => 'дд.мм.[гггг]',
203
  'History' => 'История',
204
  'Variables' => 'Переменные',
205
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Поля должны иметь одинаковые типы данных, в результирующем поле должен быть индекс, данные для импорта должны существовать.',
206
+ 'Relations' => 'Отношения',
207
  'Run file' => 'Запустить файл',
208
  'Clear' => 'Очистить',
209
+ 'Maximum allowed file size is %sB.' => 'Максимальный разрешённый размер файла %sB.',
210
+ 'Numbers' => 'Числа',
211
  'Date and time' => 'Дата и время',
212
  'Strings' => 'Строки',
213
  'Binary' => 'Двоичный тип',
214
  'Lists' => 'Списки',
215
  'Editor' => 'Редактор',
216
+ 'E-mail' => 'Эл. почта',
217
  'From' => 'От',
218
+ 'Subject' => 'Тема',
219
  'Send' => 'Послать',
220
  '%d e-mail(s) have been sent.' => array('Было отправлено %d письмо.', 'Было отправлено %d письма.', 'Было отправлено %d писем.'),
221
  'Webserver file %s' => 'Файл %s на вебсервере',
241
  'Alter type' => 'Изменить тип',
242
  'Type has been dropped.' => 'Тип удален.',
243
  'Type has been created.' => 'Создан новый тип.',
244
+ 'Ctrl+click on a value to modify it.' => 'Выполните Ctrl+Щелчок мышью по значению, чтобы его изменить.',
245
  'Use edit link to modify this value.' => 'Изменить это значение можно с помощью ссылки «изменить».',
246
  'last' => 'последняя',
247
  'From server' => 'С сервера',
265
  'Permanent link' => 'Постоянная ссылка',
266
  'Edit all' => 'Редактировать всё',
267
  'HH:MM:SS' => 'ЧЧ:ММ:СС',
268
+ 'Tables have been optimized.' => 'Таблицы оптимизированы.',
269
+ 'Materialized view' => 'Материализованное представление',
270
+ 'Vacuum' => 'Вакуум',
271
+ 'Selected' => 'Выбранные',
272
+ 'Replication' => 'Репликация',
273
+ 'Master status' => 'состояние мастер-сервера',
274
+ 'Slave status' => 'состояние ведомого сервера',
275
+ 'File must be in UTF-8 encoding.' => 'Файл должен быть в кодировке UTF-8.',
276
+ 'Modify' => 'Изменить',
277
+ 'Loading' => 'Загрузка',
278
+ 'Load more data' => 'Загрузить ещё данные',
279
+ 'ATTACH queries are not supported.' => 'ATTACH-запросы не поддерживаются.',
280
+ '%d / ' => '%d / ',
281
+ 'Limit rows' => 'Лимит строк',
282
+ '<a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to use SQLite.' => '<a href="https://www.adminer.org/en/extension/" target="_blank">Реализуйте</a> метод %s, чтобы использовать SQLite.',
283
+ 'Default value' => 'Значение по умолчанию',
284
+ 'Full table scan' => 'Анализ полной таблицы',
285
+ 'Too many unsuccessful logins, try again in %d minute(s).' => array('Слишком много неудачных попыток входа. Попробуйте снова через %d минуту.', 'Слишком много неудачных попыток входа. Попробуйте снова через %d минуты.', 'Слишком много неудачных попыток входа. Попробуйте снова через %d минут.'),
286
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Мастер-пароль истёк. <a href="https://www.adminer.org/en/extension/" target="_blank">Реализуйте</a> метод %s, чтобы сделать его постоянным.',
287
+ 'If you did not send this request from Adminer then close this page.' => 'Если вы не посылали этот запрос из Adminer, закройте эту страницу.',
288
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Вы можете закачать большой SQL-файл по FTP и затем импортировать его с сервера.',
289
+ 'Size' => 'Размер',
290
+ 'Compute' => 'Вычислить',
291
+ 'You are offline.' => 'Вы не выполнили вход.',
292
+ 'You have no privileges to update this table.' => 'У вас нет прав на обновление этой таблицы.',
293
+ 'Saving' => 'Сохранение',
294
+ 'yes' => 'Да',
295
+ 'no' => 'Нет',
296
  );
adminer/adminer/adminer/sql.inc.php CHANGED
@@ -208,7 +208,7 @@ if (!isset($_GET["import"])) {
208
  }
209
  echo "<p>";
210
  textarea("query", $q, 20);
211
- echo ($_POST ? "" : "<script type='text/javascript'>focus(document.getElementsByTagName('textarea')[0]);</script>\n");
212
  echo "<p>$execute\n";
213
  echo lang('Limit rows') . ": <input type='number' name='limit' class='size' value='" . h($_POST ? $_POST["limit"] : $_GET["limit"]) . "'>\n";
214
 
208
  }
209
  echo "<p>";
210
  textarea("query", $q, 20);
211
+ echo ($_POST ? "" : "<script type='text/javascript'>document.getElementsByTagName('textarea')[0].focus();</script>\n");
212
  echo "<p>$execute\n";
213
  echo lang('Limit rows') . ": <input type='number' name='limit' class='size' value='" . h($_POST ? $_POST["limit"] : $_GET["limit"]) . "'>\n";
214
 
adminer/adminer/externals/jush/modules/jush-js.js CHANGED
@@ -1,5 +1,5 @@
1
  jush.tr.js = { php: jush.php, js_reg: /\s*\/(?![\/*])/, js_obj: /\s*\{/, js_code: /()/ };
2
- jush.tr.js_code = { php: jush.php, quo: /"/, apo: /'/, js_one: /\/\//, js_doc: /\/\*\*/, com: /\/\*/, num: jush.num, js_write: /(\b)(write(?:ln)?)(\()/, js_http: /(\.)(setRequestHeader|getResponseHeader)(\()/, _3: /(<)(\/script)(>)/i, _1: /[^\])}$\w\s]/ };
3
  jush.tr.js_write = { php: jush.php, js_reg: /\s*\/(?![\/*])/, js_write_code: /()/ };
4
  jush.tr.js_http = { php: jush.php, js_reg: /\s*\/(?![\/*])/, js_http_code: /()/ };
5
  jush.tr.js_write_code = { php: jush.php, quo: /"/, apo: /'/, js_one: /\/\//, com: /\/\*/, num: jush.num, js_write: /\(/, _2: /\)/, _1: /[^\])}$\w\s]/ };
@@ -11,7 +11,7 @@ jush.tr.js_doc = { _1: /\*\// };
11
  jush.tr.js_arr = { php: jush.php, quo: /"/, apo: /'/, js_one: /\/\//, com: /\/\*/, num: jush.num, js_arr: /\[/, js_obj: /\{/, _1: /]/ };
12
  jush.tr.js_obj = { php: jush.php, js_one: /\s*\/\//, com: /\s*\/\*/, js_val: /:/, _1: /\s*}/, js_key: /()/ };
13
  jush.tr.js_val = { php: jush.php, quo: /"/, apo: /'/, js_one: /\/\//, com: /\/\*/, num: jush.num, js_arr: /\[/, js_obj: /\{/, _1: /,|(?=})/ };
14
- jush.tr.js_key = { php: jush.php, quo: /"/, apo: /'/, js_one: /\/\//, com: /\/\*/, num: jush.num, _1: /(?=:)/ };
15
 
16
  jush.urls.js_write = 'https://developer.mozilla.org/en/docs/DOM/$key.$val';
17
  jush.urls.js_http = 'http://www.w3.org/TR/XMLHttpRequest/#the-$val-$key';
@@ -24,12 +24,13 @@ jush.urls.js = ['https://developer.mozilla.org/en/$key',
24
  'JavaScript/Reference/Operators/Special/$1',
25
  'DOM/document.$1', 'DOM/element.$1', 'DOM/event.$1', 'DOM/form.$1', 'DOM/table.$1', 'DOM/window.$1',
26
  'http://www.w3.org/TR/XMLHttpRequest/',
27
- 'JavaScript/Reference/Global_Objects/Array/$1',
28
- 'JavaScript/Reference/Global_Objects/Date/$1',
29
- 'JavaScript/Reference/Global_Objects/Function/$1',
30
- 'JavaScript/Reference/Global_Objects/Number/$1',
31
- 'JavaScript/Reference/Global_Objects/RegExp/$1',
32
- 'JavaScript/Reference/Global_Objects/String/$1'
 
33
  ];
34
  jush.urls.js_doc = ['http://code.google.com/p/jsdoc-toolkit/wiki/Tag$key',
35
  '$1', 'Param', 'Augments', '$1'
@@ -38,5 +39,5 @@ jush.urls.js_doc = ['http://code.google.com/p/jsdoc-toolkit/wiki/Tag$key',
38
  jush.links.js_write = { 'document': /^(write|writeln)$/ };
39
  jush.links.js_http = { 'method': /^(setRequestHeader|getResponseHeader)$/ };
40
 
41
- jush.links2.js = /(\b)(String\.fromCharCode|Date\.(?:parse|UTC)|Math\.(?:E|LN2|LN10|LOG2E|LOG10E|PI|SQRT1_2|SQRT2|abs|acos|asin|atan|atan2|ceil|cos|exp|floor|log|max|min|pow|random|round|sin|sqrt|tan)|Array|Boolean|Date|Error|Function|JavaArray|JavaClass|JavaObject|JavaPackage|Math|Number|Object|Packages|RegExp|String|Infinity|JSON|NaN|undefined|Error|EvalError|RangeError|ReferenceError|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|(break|continue|for|function|return|switch|throw|var|while|with)|(do)|(if|else)|(try|catch|finally)|(delete|in|instanceof|new|this|typeof|void)|(alinkColor|anchors|applets|bgColor|body|characterSet|compatMode|contentType|cookie|defaultView|designMode|doctype|documentElement|domain|embeds|fgColor|forms|height|images|implementation|lastModified|linkColor|links|plugins|popupNode|referrer|styleSheets|title|tooltipNode|URL|vlinkColor|width|clear|createAttribute|createDocumentFragment|createElement|createElementNS|createEvent|createNSResolver|createRange|createTextNode|createTreeWalker|evaluate|execCommand|getElementById|getElementsByName|importNode|loadOverlay|queryCommandEnabled|queryCommandIndeterm|queryCommandState|queryCommandValue|write|writeln)|(attributes|childNodes|className|clientHeight|clientLeft|clientTop|clientWidth|dir|firstChild|id|innerHTML|lang|lastChild|length|localName|name|namespaceURI|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|ownerDocument|parentNode|prefix|previousSibling|scrollHeight|scrollLeft|scrollTop|scrollWidth|style|tabIndex|tagName|textContent|addEventListener|appendChild|blur|click|cloneNode|dispatchEvent|focus|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getElementsByTagName|getElementsByTagNameNS|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|insertBefore|item|normalize|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|scrollIntoView|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|supports|onblur|onchange|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onresize)|(altKey|bubbles|button|cancelBubble|cancelable|clientX|clientY|ctrlKey|currentTarget|detail|eventPhase|explicitOriginalTarget|isChar|layerX|layerY|metaKey|originalTarget|pageX|pageY|relatedTarget|screenX|screenY|shiftKey|target|timeStamp|type|view|which|initEvent|initKeyEvent|initMouseEvent|initUIEvent|stopPropagation|preventDefault)|(elements|length|name|acceptCharset|action|enctype|encoding|method|submit|reset)|(caption|tHead|tFoot|rows|tBodies|align|bgColor|border|cellPadding|cellSpacing|frame|rules|summary|width|createTHead|deleteTHead|createTFoot|deleteTFoot|createCaption|deleteCaption|insertRow|deleteRow)|(content|closed|controllers|crypto|defaultStatus|directories|document|frameElement|frames|history|innerHeight|innerWidth|length|location|locationbar|menubar|name|navigator|opener|outerHeight|outerWidth|pageXOffset|pageYOffset|parent|personalbar|pkcs11|screen|availTop|availLeft|availHeight|availWidth|colorDepth|height|left|pixelDepth|top|width|scrollbars|scrollMaxX|scrollMaxY|scrollX|scrollY|self|sidebar|status|statusbar|toolbar|window|alert|atob|back|btoa|captureEvents|clearInterval|clearTimeout|close|confirm|dump|escape|find|forward|getAttention|getComputedStyle|getSelection|home|moveBy|moveTo|open|openDialog|print|prompt|releaseEvents|resizeBy|resizeTo|scroll|scrollBy|scrollByLines|scrollByPages|scrollTo|setInterval|setTimeout|sizeToContent|stop|unescape|updateCommands|onabort|onclose|ondragdrop|onerror|onload|onpaint|onreset|onscroll|onselect|onsubmit|onunload)|(XMLHttpRequest))\b|\b(pop|push|reverse|shift|sort|splice|unshift|concat|join|slice|(getDate|getDay|getFullYear|getHours|getMilliseconds|getMinutes|getMonth|getSeconds|getTime|getTimezoneOffset|getUTCDate|getUTCDay|getUTCFullYear|getUTCHours|getUTCMilliseconds|getUTCMinutes|getUTCMonth|getUTCSeconds|setDate|setFullYear|setHours|setMilliseconds|setMinutes|setMonth|setSeconds|setTime|setUTCDate|setUTCFullYear|setUTCHours|setUTCMilliseconds|setUTCMinutes|setUTCMonth|setUTCSeconds|toDateString|toLocaleDateString|toLocaleTimeString|toTimeString|toUTCString)|(apply|call)|(toExponential|toFixed|toPrecision)|(exec|test)|(charAt|charCodeAt|concat|indexOf|lastIndexOf|localeCompare|match|replace|search|slice|split|substr|substring|toLocaleLowerCase|toLocaleUpperCase|toLowerCase|toUpperCase))(\s*\(|$)/g; // collisions: bgColor, height, width, length, name
42
  jush.links2.js_doc = /(^[ \t]*|\n\s*\*\s*|(?={))(@(?:augments|author|borrows|class|constant|constructor|constructs|default|deprecated|description|event|example|field|fileOverview|function|ignore|inner|lends|memberOf|name|namespace|param|private|property|public|requires|returns|see|since|static|throws|type|version)|(@argument)|(@extends)|(\{@link))(\b)/g;
1
  jush.tr.js = { php: jush.php, js_reg: /\s*\/(?![\/*])/, js_obj: /\s*\{/, js_code: /()/ };
2
+ jush.tr.js_code = { php: jush.php, quo: /"/, apo: /'/, js_one: /\/\//, js_doc: /\/\*\*/, com: /\/\*/, num: jush.num, js_write: /(\b)(write(?:ln)?)(\()/, js_http: /(\.)(setRequestHeader|getResponseHeader)(\()/, _3: /(<)(\/script)(>)/i, _1: /[^.\])}$\w\s]/ };
3
  jush.tr.js_write = { php: jush.php, js_reg: /\s*\/(?![\/*])/, js_write_code: /()/ };
4
  jush.tr.js_http = { php: jush.php, js_reg: /\s*\/(?![\/*])/, js_http_code: /()/ };
5
  jush.tr.js_write_code = { php: jush.php, quo: /"/, apo: /'/, js_one: /\/\//, com: /\/\*/, num: jush.num, js_write: /\(/, _2: /\)/, _1: /[^\])}$\w\s]/ };
11
  jush.tr.js_arr = { php: jush.php, quo: /"/, apo: /'/, js_one: /\/\//, com: /\/\*/, num: jush.num, js_arr: /\[/, js_obj: /\{/, _1: /]/ };
12
  jush.tr.js_obj = { php: jush.php, js_one: /\s*\/\//, com: /\s*\/\*/, js_val: /:/, _1: /\s*}/, js_key: /()/ };
13
  jush.tr.js_val = { php: jush.php, quo: /"/, apo: /'/, js_one: /\/\//, com: /\/\*/, num: jush.num, js_arr: /\[/, js_obj: /\{/, _1: /,|(?=})/ };
14
+ jush.tr.js_key = { php: jush.php, quo: /"/, apo: /'/, js_one: /\/\//, com: /\/\*/, num: jush.num, _1: /(?=[:}])/ };
15
 
16
  jush.urls.js_write = 'https://developer.mozilla.org/en/docs/DOM/$key.$val';
17
  jush.urls.js_http = 'http://www.w3.org/TR/XMLHttpRequest/#the-$val-$key';
24
  'JavaScript/Reference/Operators/Special/$1',
25
  'DOM/document.$1', 'DOM/element.$1', 'DOM/event.$1', 'DOM/form.$1', 'DOM/table.$1', 'DOM/window.$1',
26
  'http://www.w3.org/TR/XMLHttpRequest/',
27
+ 'JavaScript/Reference/Global_Objects/Array$1',
28
+ 'JavaScript/Reference/Global_Objects/Array$1',
29
+ 'JavaScript/Reference/Global_Objects/Date$1',
30
+ 'JavaScript/Reference/Global_Objects/Function$1',
31
+ 'JavaScript/Reference/Global_Objects/Number$1',
32
+ 'JavaScript/Reference/Global_Objects/RegExp$1',
33
+ 'JavaScript/Reference/Global_Objects/String$1'
34
  ];
35
  jush.urls.js_doc = ['http://code.google.com/p/jsdoc-toolkit/wiki/Tag$key',
36
  '$1', 'Param', 'Augments', '$1'
39
  jush.links.js_write = { 'document': /^(write|writeln)$/ };
40
  jush.links.js_http = { 'method': /^(setRequestHeader|getResponseHeader)$/ };
41
 
42
+ jush.links2.js = /(\b)(String\.fromCharCode|Date\.(?:parse|UTC)|Math\.(?:E|LN2|LN10|LOG2E|LOG10E|PI|SQRT1_2|SQRT2|abs|acos|asin|atan|atan2|ceil|cos|exp|floor|log|max|min|pow|random|round|sin|sqrt|tan)|Array|Boolean|Date|Error|Function|JavaArray|JavaClass|JavaObject|JavaPackage|Math|Number|Object|Packages|RegExp|String|Infinity|JSON|NaN|undefined|Error|EvalError|RangeError|ReferenceError|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|(break|continue|for|function|return|switch|throw|var|while|with)|(do)|(if|else)|(try|catch|finally)|(delete|in|instanceof|new|this|typeof|void)|(alinkColor|anchors|applets|bgColor|body|characterSet|compatMode|contentType|cookie|defaultView|designMode|doctype|documentElement|domain|embeds|fgColor|forms|height|images|implementation|lastModified|linkColor|links|plugins|popupNode|referrer|styleSheets|title|tooltipNode|URL|vlinkColor|width|clear|createAttribute|createDocumentFragment|createElement|createElementNS|createEvent|createNSResolver|createRange|createTextNode|createTreeWalker|evaluate|execCommand|getElementById|getElementsByName|importNode|loadOverlay|queryCommandEnabled|queryCommandIndeterm|queryCommandState|queryCommandValue|write|writeln)|(attributes|childNodes|className|clientHeight|clientLeft|clientTop|clientWidth|dir|firstChild|id|innerHTML|lang|lastChild|localName|name|namespaceURI|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|ownerDocument|parentNode|prefix|previousSibling|scrollHeight|scrollLeft|scrollTop|scrollWidth|style|tabIndex|tagName|textContent|addEventListener|appendChild|blur|click|cloneNode|dispatchEvent|focus|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getElementsByTagName|getElementsByTagNameNS|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|insertBefore|item|normalize|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|scrollIntoView|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|supports|onblur|onchange|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onresize)|(altKey|bubbles|button|cancelBubble|cancelable|clientX|clientY|ctrlKey|currentTarget|detail|eventPhase|explicitOriginalTarget|isChar|layerX|layerY|metaKey|originalTarget|pageX|pageY|relatedTarget|screenX|screenY|shiftKey|target|timeStamp|type|view|which|initEvent|initKeyEvent|initMouseEvent|initUIEvent|stopPropagation|preventDefault)|(elements|name|acceptCharset|action|enctype|encoding|method|submit|reset)|(caption|tHead|tFoot|rows|tBodies|align|bgColor|border|cellPadding|cellSpacing|frame|rules|summary|width|createTHead|deleteTHead|createTFoot|deleteTFoot|createCaption|deleteCaption|insertRow|deleteRow)|(content|closed|controllers|crypto|defaultStatus|directories|document|frameElement|frames|history|innerHeight|innerWidth|location|locationbar|menubar|name|navigator|opener|outerHeight|outerWidth|pageXOffset|pageYOffset|parent|personalbar|pkcs11|screen|availTop|availLeft|availHeight|availWidth|colorDepth|height|left|pixelDepth|top|width|scrollbars|scrollMaxX|scrollMaxY|scrollX|scrollY|self|sidebar|status|statusbar|toolbar|window|alert|atob|back|btoa|captureEvents|clearInterval|clearTimeout|close|confirm|dump|escape|find|forward|getAttention|getComputedStyle|getSelection|home|moveBy|moveTo|open|openDialog|print|prompt|releaseEvents|resizeBy|resizeTo|scroll|scrollBy|scrollByLines|scrollByPages|scrollTo|setInterval|setTimeout|sizeToContent|stop|unescape|updateCommands|onabort|onclose|ondragdrop|onerror|onload|onpaint|onreset|onscroll|onselect|onsubmit|onunload)|(XMLHttpRequest)|(length))\b|(\.(?:pop|push|reverse|shift|sort|splice|unshift|concat|join|slice)|(\.(?:getDate|getDay|getFullYear|getHours|getMilliseconds|getMinutes|getMonth|getSeconds|getTime|getTimezoneOffset|getUTCDate|getUTCDay|getUTCFullYear|getUTCHours|getUTCMilliseconds|getUTCMinutes|getUTCMonth|getUTCSeconds|setDate|setFullYear|setHours|setMilliseconds|setMinutes|setMonth|setSeconds|setTime|setUTCDate|setUTCFullYear|setUTCHours|setUTCMilliseconds|setUTCMinutes|setUTCMonth|setUTCSeconds|toDateString|toLocaleDateString|toLocaleTimeString|toTimeString|toUTCString))|(\.(?:apply|call))|(\.(?:toExponential|toFixed|toPrecision))|(\.(?:exec|test))|(\.(?:charAt|charCodeAt|concat|indexOf|lastIndexOf|localeCompare|match|replace|search|slice|split|substr|substring|toLocaleLowerCase|toLocaleUpperCase|toLowerCase|toUpperCase)))(\s*\(|$)/g; // collisions: bgColor, height, width, length, name
43
  jush.links2.js_doc = /(^[ \t]*|\n\s*\*\s*|(?={))(@(?:augments|author|borrows|class|constant|constructor|constructs|default|deprecated|description|event|example|field|fileOverview|function|ignore|inner|lends|memberOf|name|namespace|param|private|property|public|requires|returns|see|since|static|throws|type|version)|(@argument)|(@extends)|(\{@link))(\b)/g;
adminer/adminer/externals/jush/modules/jush-textarea.js CHANGED
@@ -94,7 +94,7 @@ jush.textarea = (function () {
94
  event = event || window.event;
95
  if ((event.ctrlKey || event.metaKey) && !event.altKey) {
96
  var isUndo = (event.keyCode == 90); // 90 - z
97
- var isRedo = (event.keyCode == 89); // 89 - y
98
  if (isUndo || isRedo) {
99
  if (isRedo) {
100
  if (this.jushUndoPos + 1 < this.jushUndo.length) {
94
  event = event || window.event;
95
  if ((event.ctrlKey || event.metaKey) && !event.altKey) {
96
  var isUndo = (event.keyCode == 90); // 90 - z
97
+ var isRedo = (event.keyCode == 89 || (event.keyCode == 90 && event.shiftKey)); // 89 - y
98
  if (isUndo || isRedo) {
99
  if (isRedo) {
100
  if (this.jushUndoPos + 1 < this.jushUndo.length) {
ari-adminer.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: ARI Adminer
4
  Plugin URI: http://wp-quiz.ari-soft.com/plugins/wordpress-adminer.html
5
  Description: Powerful, compact and easy to use database manager plugin for WordPress.
6
- Version: 1.1.1
7
  Author: ARI Soft
8
  Author URI: http://www.ari-soft.com
9
  Text Domain: ari-adminer
3
  Plugin Name: ARI Adminer
4
  Plugin URI: http://wp-quiz.ari-soft.com/plugins/wordpress-adminer.html
5
  Description: Powerful, compact and easy to use database manager plugin for WordPress.
6
+ Version: 1.1.2
7
  Author: ARI Soft
8
  Author URI: http://www.ari-soft.com
9
  Text Domain: ari-adminer
includes/defines.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- define( 'ARIADMINER_VERSION', '1.1.1' );
3
  define( 'ARIADMINER_SLUG', 'ari-adminer' );
4
  define( 'ARIADMINER_ASSETS_URL', ARIADMINER_URL . 'assets/' );
5
  define( 'ARIADMINER_VERSION_OPTION', 'ari_adminer' );
1
  <?php
2
+ define( 'ARIADMINER_VERSION', '1.1.2' );
3
  define( 'ARIADMINER_SLUG', 'ari-adminer' );
4
  define( 'ARIADMINER_ASSETS_URL', ARIADMINER_URL . 'assets/' );
5
  define( 'ARIADMINER_VERSION_OPTION', 'ari_adminer' );
includes/helpers/class-bridge.php CHANGED
@@ -62,6 +62,22 @@ class Bridge {
62
  $content
63
  );
64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  return $content;
66
  }
67
 
62
  $content
63
  );
64
 
65
+ $content = preg_replace_callback(
66
+ '/<input [^>]*>/i',
67
+ function( $matches ) {
68
+ return str_replace(
69
+ array(
70
+ '../adminer/static/',
71
+ ),
72
+ array(
73
+ 'adminer/adminer/static/',
74
+ ),
75
+ $matches[0]
76
+ );
77
+ },
78
+ $content
79
+ );
80
+
81
  return $content;
82
  }
83
 
includes/utils/dbcheck/drivers/class-pgsql.php CHANGED
@@ -55,6 +55,10 @@ class Pgsql extends Driver {
55
  if ( $conn ) {
56
  $result = true;
57
  }
 
 
 
 
58
  }
59
 
60
  return $result;
55
  if ( $conn ) {
56
  $result = true;
57
  }
58
+ } else {
59
+ $this->set_error(
60
+ 'The plugin requires PostgreSQL or PDO PostgreSQL PHP extension to connect to PostgreSQL databases. None of them is installed on your server.'
61
+ );
62
  }
63
 
64
  return $result;
includes/views/adminer-runner/tmpl/default.php CHANGED
@@ -40,6 +40,9 @@ $run_url = Helper::build_url(
40
  <li>
41
  <a href="http://wp-quiz.ari-soft.com" target="_blank" title="Viral Quiz Builder for WordPress"><strong>ARI Stream Quiz</strong><?php _e( ' is viral quiz builder', 'ari-adminer' ); ?></a>
42
  </li>
 
 
 
43
  </ul>
44
  </div>
45
  </div>
40
  <li>
41
  <a href="http://wp-quiz.ari-soft.com" target="_blank" title="Viral Quiz Builder for WordPress"><strong>ARI Stream Quiz</strong><?php _e( ' is viral quiz builder', 'ari-adminer' ); ?></a>
42
  </li>
43
+ <li>
44
+ <a href="https://wordpress.org/plugins/ari-cf7-connector/" target="_blank" title="Contact From 7 Connector"><strong>Contact Form 7 Connector</strong><?php _e( ' integrates CF7 with MailChimp', 'ari-adminer' ); ?></a>
45
+ </li>
46
  </ul>
47
  </div>
48
  </div>
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: arisoft
3
  Donate link: http://wp-quiz.ari-soft.com/plugins/wordpress-adminer.html
4
  Tags: adminer, sql, database, mysql, report, sqlite, table, postgresql, dump, backup, import, export, phpmyadmin
5
  Requires at least: 3.4
6
- Tested up to: 4.7.3
7
- Stable tag: 1.1.1
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -43,7 +43,12 @@ More information can be found in [user's guide](http://www.ari-soft.com/docs/wor
43
 
44
  **Do you like the plugin and want to say about it?** Write a review and get a rating [here](https://wordpress.org/support/plugin/ari-adminer/reviews/).
45
 
46
- **Are interested in other our WordPress plugins?** Check [ARI Fancy Lightbox](https://wordpress.org/plugins/ari-fancy-lightbox/) is the best lightbox plugin with social and viral features and [ARI Stream Quiz](https://wordpress.org/plugins/ari-stream-quiz/) is WordPress Viral Quiz Builder plugin.
 
 
 
 
 
47
 
48
 
49
  == Installation ==
@@ -69,6 +74,10 @@ Sure, it is available [here](http://www.ari-soft.com/docs/wordpress/ari-adminer/
69
 
70
  == Changelog ==
71
 
 
 
 
 
72
  = 1.1.1 =
73
  * Improve installer
74
 
@@ -105,6 +114,10 @@ Sure, it is available [here](http://www.ari-soft.com/docs/wordpress/ari-adminer/
105
 
106
  == Upgrade Notice ==
107
 
 
 
 
 
108
  = 1.1.1 =
109
  * Improve installer
110
 
3
  Donate link: http://wp-quiz.ari-soft.com/plugins/wordpress-adminer.html
4
  Tags: adminer, sql, database, mysql, report, sqlite, table, postgresql, dump, backup, import, export, phpmyadmin
5
  Requires at least: 3.4
6
+ Tested up to: 4.8.0
7
+ Stable tag: 1.1.2
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
43
 
44
  **Do you like the plugin and want to say about it?** Write a review and get a rating [here](https://wordpress.org/support/plugin/ari-adminer/reviews/).
45
 
46
+ **Are interested in other our WordPress plugins?**
47
+ Check [ARI Fancy Lightbox](https://wordpress.org/plugins/ari-fancy-lightbox/) is the best lightbox plugin with social and viral features.
48
+
49
+ [ARI Stream Quiz](https://wordpress.org/plugins/ari-stream-quiz/) is WordPress Viral Quiz Builder plugin.
50
+
51
+ [Contact Form 7 MailChimp Connector](https://wordpress.org/plugins/ari-cf7-connector/) integrates CF7 with MailChimp service.
52
 
53
 
54
  == Installation ==
74
 
75
  == Changelog ==
76
 
77
+ = 1.1.2 =
78
+ * Update Adminer to v. 4.3.1
79
+ * Check installed PHP extensions for PostgreSQL
80
+
81
  = 1.1.1 =
82
  * Improve installer
83
 
114
 
115
  == Upgrade Notice ==
116
 
117
+ = 1.1.2 =
118
+ * Update Adminer to v. 4.3.1
119
+ * Check installed PHP extensions for PostgreSQL
120
+
121
  = 1.1.1 =
122
  * Improve installer
123