Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package adminer for openSUSE:Factory checked in at 2021-05-20 19:25:46 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/adminer (Old) and /work/SRC/openSUSE:Factory/.adminer.new.2988 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "adminer" Thu May 20 19:25:46 2021 rev:28 rq:894657 version:4.8.1 Changes: -------- --- /work/SRC/openSUSE:Factory/adminer/adminer.changes 2021-02-15 23:19:49.527711713 +0100 +++ /work/SRC/openSUSE:Factory/.adminer.new.2988/adminer.changes 2021-05-20 19:26:17.781638333 +0200 @@ -1,0 +2,15 @@ +Thu May 20 12:36:30 UTC 2021 - Ferdinand Thiessen <[email protected]> + +- Update to version 4.8.1 + * Fix XSS in doc_link + * MySQL: Allow moving views to other DB and renaming DB with views + * MariaDB: Do not treat sequences as views + * PostgreSQL: Support UPDATE OF triggers + * PostgreSQL: Support triggers with more events (OR) + * PostgreSQL: Fix parsing of foreign keys with non-ASCII column names + * PostgreSQL < 10 PDO: Avoid displaying GENERATED ALWAYS BY IDENTITY everywhere + * SQLite: Fix displayed types + * Avoid PHP warnings with PDO drivers + * Fix PHP 8 warnings + +------------------------------------------------------------------- Old: ---- adminer-4.8.0.tar.xz New: ---- adminer-4.8.1.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ adminer.spec ++++++ --- /var/tmp/diff_new_pack.PlBjdV/_old 2021-05-20 19:26:18.261636365 +0200 +++ /var/tmp/diff_new_pack.PlBjdV/_new 2021-05-20 19:26:18.265636348 +0200 @@ -22,7 +22,7 @@ %bcond_with mongodb %bcond_with mssql Name: adminer -Version: 4.8.0 +Version: 4.8.1 Release: 0 Summary: Database management in a single PHP file License: GPL-2.0-only OR Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.PlBjdV/_old 2021-05-20 19:26:18.293636233 +0200 +++ /var/tmp/diff_new_pack.PlBjdV/_new 2021-05-20 19:26:18.293636233 +0200 @@ -2,7 +2,7 @@ <service name="tar_scm" mode="disabled"> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> - <param name="revision">refs/tags/v4.8.0</param> + <param name="revision">refs/tags/v4.8.1</param> <param name="url">https://github.com/vrana/adminer.git</param> <param name="scm">git</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.PlBjdV/_old 2021-05-20 19:26:18.309636168 +0200 +++ /var/tmp/diff_new_pack.PlBjdV/_new 2021-05-20 19:26:18.309636168 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/vrana/adminer.git</param> - <param name="changesrevision">b83c61fca3f491073cd5f5888a2acbf6f044366b</param> + <param name="changesrevision">1f173e18bdf0be29182e0d67989df56eadea4754</param> </service> -</servicedata> +</servicedata> \ No newline at end of file ++++++ adminer-4.8.0.tar.xz -> adminer-4.8.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/.github/workflows/codeql-analysis.yml new/adminer-4.8.1/.github/workflows/codeql-analysis.yml --- old/adminer-4.8.0/.github/workflows/codeql-analysis.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/adminer-4.8.1/.github/workflows/codeql-analysis.yml 2021-05-14 07:39:59.000000000 +0200 @@ -0,0 +1,67 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ master ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ master ] + schedule: + - cron: '20 16 * * 0' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # ?????? Command-line programs to run using the OS shell. + # ???? https://git.io/JvXDl + + # ?????? If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/SECURITY.md new/adminer-4.8.1/SECURITY.md --- old/adminer-4.8.0/SECURITY.md 1970-01-01 01:00:00.000000000 +0100 +++ new/adminer-4.8.1/SECURITY.md 2021-05-14 07:39:59.000000000 +0200 @@ -0,0 +1,11 @@ +# Security Policy + +## Supported Versions + +I support only the last published version and the last development version (last commit). + +## Reporting a Vulnerability + +To report a vulnerability, create a private bug at https://sourceforge.net/p/adminer/bugs-and-features/new/?private=1. + +I handle security issues with top priority. If you don't hear from me in a week then please ping the bug. Once I accept the bug, the fix should be available and new version released within days. I will mark the bug as public after releasing a new version or declining the bug. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/db.inc.php new/adminer-4.8.1/adminer/db.inc.php --- old/adminer-4.8.0/adminer/db.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/db.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -83,7 +83,7 @@ $tables = 0; foreach ($tables_list as $name => $type) { - $view = ($type !== null && !preg_match('~table~i', $type)); + $view = ($type !== null && !preg_match('~table|sequence~i', $type)); $id = h("Table-" . $name); echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "", "", $id); echo '<th>' . (support("table") || support("indexes") ? "<a href='" . h(ME) . "table=" . urlencode($name) . "' title='" . lang('Show structure') . "' id='$id'>" . h($name) . '</a>' : h($name)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/drivers/mysql.inc.php new/adminer-4.8.1/adminer/drivers/mysql.inc.php --- old/adminer-4.8.0/adminer/drivers/mysql.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/drivers/mysql.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -266,7 +266,7 @@ } function query($query, $unbuffered = false) { - $this->pdo->setAttribute(1000, !$unbuffered); // 1000 - PDO::MYSQL_ATTR_USE_BUFFERED_QUERY + $this->pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, !$unbuffered); return parent::query($query, $unbuffered); } } @@ -678,17 +678,17 @@ function rename_database($name, $collation) { $return = false; if (create_database($name, $collation)) { - //! move triggers - $rename = array(); + $tables = array(); + $views = array(); foreach (tables_list() as $table => $type) { - $rename[] = table($table) . " TO " . idf_escape($name) . "." . table($table); - } - $return = (!$rename || queries("RENAME TABLE " . implode(", ", $rename))); - if ($return) { - queries("DROP DATABASE " . idf_escape(DB)); + if ($type == 'VIEW') { + $views[] = $table; + } else { + $tables[] = $table; + } } - restart_session(); - set_session("dbs", null); + $return = (!$tables && !$views) || move_tables($tables, $views, $name); + drop_databases($return ? array(DB) : array()); } return $return; } @@ -797,12 +797,27 @@ * @return bool */ function move_tables($tables, $views, $target) { + global $connection; $rename = array(); - foreach (array_merge($tables, $views) as $table) { // views will report SQL error + foreach ($tables as $table) { $rename[] = table($table) . " TO " . idf_escape($target) . "." . table($table); } - return queries("RENAME TABLE " . implode(", ", $rename)); + if (!$rename || queries("RENAME TABLE " . implode(", ", $rename))) { + $definitions = array(); + foreach ($views as $table) { + $definitions[table($table)] = view($table); + } + $connection->select_db($target); + $db = idf_escape(DB); + foreach ($definitions as $name => $view) { + if (!queries("CREATE VIEW $name AS " . str_replace(" $db.", " ", $view["select"])) || !queries("DROP VIEW $db.$name")) { + return false; + } + } + return true; + } //! move triggers + return false; } /** Copy tables to other schema diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/drivers/oracle.inc.php new/adminer-4.8.1/adminer/drivers/oracle.inc.php --- old/adminer-4.8.0/adminer/drivers/oracle.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/drivers/oracle.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -308,16 +308,19 @@ function indexes($table, $connection2 = null) { $return = array(); $owner = where_owner(" AND ", "aic.table_owner"); - foreach (get_rows("SELECT aic.*, ac.constraint_type + foreach (get_rows("SELECT aic.*, ac.constraint_type, atc.data_default FROM all_ind_columns aic LEFT JOIN all_constraints ac ON aic.index_name = ac.constraint_name AND aic.table_name = ac.table_name AND aic.index_owner = ac.owner +LEFT JOIN all_tab_cols atc ON aic.column_name = atc.column_name AND aic.table_name = atc.table_name AND aic.index_owner = atc.owner WHERE aic.table_name = " . q($table) . "$owner ORDER BY ac.constraint_type, aic.column_position", $connection2) as $row) { $index_name = $row["INDEX_NAME"]; + $column_name = $row["DATA_DEFAULT"]; + $column_name = ($column_name ? trim($column_name, '"') : $row["COLUMN_NAME"]); // trim - possibly wrapped in quotes but never contains quotes inside $return[$index_name]["type"] = ($row["CONSTRAINT_TYPE"] == "P" ? "PRIMARY" : ($row["CONSTRAINT_TYPE"] == "U" ? "UNIQUE" : "INDEX")); - $return[$index_name]["columns"][] = $row["COLUMN_NAME"]; + $return[$index_name]["columns"][] = $column_name; $return[$index_name]["lengths"][] = ($row["CHAR_LENGTH"] && $row["CHAR_LENGTH"] != $row["COLUMN_LENGTH"] ? $row["CHAR_LENGTH"] : null); - $return[$index_name]["descs"][] = ($row["DESCEND"] ? '1' : null); + $return[$index_name]["descs"][] = ($row["DESCEND"] && $row["DESCEND"] == "DESC" ? '1' : null); } return $return; } @@ -384,26 +387,23 @@ } function alter_indexes($table, $alter) { - $create = array(); $drop = array(); $queries = array(); foreach ($alter as $val) { - $val[2] = preg_replace('~ DESC$~', '', $val[2]); if ($val[0] != "INDEX") { //! descending UNIQUE indexes results in syntax error - $create[] = ($val[2] == "DROP" + $val[2] = preg_replace('~ DESC$~', '', $val[2]); + $create = ($val[2] == "DROP" ? "\nDROP CONSTRAINT " . idf_escape($val[1]) : "\nADD" . ($val[1] != "" ? " CONSTRAINT " . idf_escape($val[1]) : "") . " $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . "(" . implode(", ", $val[2]) . ")" ); + array_unshift($queries, "ALTER TABLE " . table($table) . $create); } elseif ($val[2] == "DROP") { $drop[] = idf_escape($val[1]); } else { $queries[] = "CREATE INDEX " . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table) . " (" . implode(", ", $val[2]) . ")"; } } - if ($create) { - array_unshift($queries, "ALTER TABLE " . table($table) . implode(",", $create)); - } if ($drop) { array_unshift($queries, "DROP INDEX " . implode(", ", $drop)); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/drivers/pgsql.inc.php new/adminer-4.8.1/adminer/drivers/pgsql.inc.php --- old/adminer-4.8.0/adminer/drivers/pgsql.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/drivers/pgsql.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -304,7 +304,7 @@ function tables_list() { $query = "SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = current_schema()"; - if (support('materializedview')) { + if (support('materializedview')) { // ' - support("materializedview") could be removed by compile.php $query .= " UNION ALL SELECT matviewname, 'MATERIALIZED VIEW' @@ -348,9 +348,7 @@ 'timestamp with time zone' => 'timestamptz', ); - $identity_column = min_version(10) ? 'a.attidentity' : '0'; - - foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, pg_get_expr(d.adbin, d.adrelid) AS default, a.attnotnull::int, col_description(c.oid, a.attnum) AS comment, $identity_column AS identity + foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, pg_get_expr(d.adbin, d.adrelid) AS default, a.attnotnull::int, col_description(c.oid, a.attnum) AS comment" . (min_version(10) ? ", a.attidentity" : "") . " FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_attribute a ON c.oid = a.attrelid @@ -373,14 +371,14 @@ $row["type"] = $type; $row["full_type"] = $row["type"] . $length . $addon . $array; } - if (in_array($row['identity'], array('a', 'd'))) { - $row['default'] = 'GENERATED ' . ($row['identity'] == 'd' ? 'BY DEFAULT' : 'ALWAYS') . ' AS IDENTITY'; + if (in_array($row['attidentity'], array('a', 'd'))) { + $row['default'] = 'GENERATED ' . ($row['attidentity'] == 'd' ? 'BY DEFAULT' : 'ALWAYS') . ' AS IDENTITY'; } $row["null"] = !$row["attnotnull"]; - $row["auto_increment"] = $row['identity'] || preg_match('~^nextval\(~i', $row["default"]); + $row["auto_increment"] = $row['attidentity'] || preg_match('~^nextval\(~i', $row["default"]); $row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1); if (preg_match('~(.+)::[^,)]+(.*)~', $row["default"], $match)) { - $row["default"] = ($match[1] == "NULL" ? null : (($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]) . $match[2])); + $row["default"] = ($match[1] == "NULL" ? null : idf_unescape($match[1]) . $match[2]); } $return[$row["field"]] = $row; } @@ -420,12 +418,12 @@ AND contype = 'f'::char ORDER BY conkey, conname") as $row) { if (preg_match('~FOREIGN KEY\s*\((.+)\)\s*REFERENCES (.+)\((.+)\)(.*)$~iA', $row['definition'], $match)) { - $row['source'] = array_map('trim', explode(',', $match[1])); + $row['source'] = array_map('idf_unescape', array_map('trim', explode(',', $match[1]))); if (preg_match('~^(("([^"]|"")+"|[^"]+)\.)?"?("([^"]|"")+"|[^"]+)$~', $match[2], $match2)) { - $row['ns'] = str_replace('""', '"', preg_replace('~^"(.+)"$~', '\1', $match2[2])); - $row['table'] = str_replace('""', '"', preg_replace('~^"(.+)"$~', '\1', $match2[4])); + $row['ns'] = idf_unescape($match2[2]); + $row['table'] = idf_unescape($match2[4]); } - $row['target'] = array_map('trim', explode(',', $match[3])); + $row['target'] = array_map('idf_unescape', array_map('trim', explode(',', $match[3]))); $row['on_delete'] = (preg_match("~ON DELETE ($on_actions)~", $match[4], $match2) ? $match2[1] : 'NO ACTION'); $row['on_update'] = (preg_match("~ON UPDATE ($on_actions)~", $match[4], $match2) ? $match2[1] : 'NO ACTION'); $return[$row['conname']] = $row; @@ -610,21 +608,34 @@ return true; } - function trigger($name, $table = null) { + function trigger($name, $table) { if ($name == "") { return array("Statement" => "EXECUTE PROCEDURE ()"); } - if ($table === null) { - $table = $_GET['trigger']; + $columns = array(); + $where = "WHERE trigger_schema = current_schema() AND event_object_table = " . q($table) . " AND trigger_name = " . q($name); + foreach (get_rows("SELECT * FROM information_schema.triggered_update_columns $where") as $row) { + $columns[] = $row["event_object_column"]; } - $rows = get_rows('SELECT t.trigger_name AS "Trigger", t.action_timing AS "Timing", (SELECT STRING_AGG(event_manipulation, \' OR \') FROM information_schema.triggers WHERE event_object_table = t.event_object_table AND trigger_name = t.trigger_name ) AS "Events", t.event_manipulation AS "Event", \'FOR EACH \' || t.action_orientation AS "Type", t.action_statement AS "Statement" FROM information_schema.triggers t WHERE t.event_object_table = ' . q($table) . ' AND t.trigger_name = ' . q($name)); - return reset($rows); + $return = array(); + foreach (get_rows('SELECT trigger_name AS "Trigger", action_timing AS "Timing", event_manipulation AS "Event", \'FOR EACH \' || action_orientation AS "Type", action_statement AS "Statement" FROM information_schema.triggers ' . "$where ORDER BY event_manipulation DESC") as $row) { + if ($columns && $row["Event"] == "UPDATE") { + $row["Event"] .= " OF"; + } + $row["Of"] = implode(", ", $columns); + if ($return) { + $row["Event"] .= " OR $return[Event]"; + } + $return = $row; + } + return $return; } function triggers($table) { $return = array(); foreach (get_rows("SELECT * FROM information_schema.triggers WHERE trigger_schema = current_schema() AND event_object_table = " . q($table)) as $row) { - $return[$row["trigger_name"]] = array($row["action_timing"], $row["event_manipulation"]); + $trigger = trigger($row["trigger_name"], $table); + $return[$trigger["Trigger"]] = array($trigger["Timing"], $trigger["Event"]); } return $return; } @@ -632,7 +643,7 @@ function trigger_options() { return array( "Timing" => array("BEFORE", "AFTER"), - "Event" => array("INSERT", "UPDATE", "DELETE"), + "Event" => array("INSERT", "UPDATE", "UPDATE OF", "DELETE", "INSERT OR UPDATE", "INSERT OR UPDATE OF", "DELETE OR INSERT", "DELETE OR UPDATE", "DELETE OR UPDATE OF", "DELETE OR INSERT OR UPDATE", "DELETE OR INSERT OR UPDATE OF"), "Type" => array("FOR EACH ROW", "FOR EACH STATEMENT"), ); } @@ -833,7 +844,7 @@ $return = ""; foreach (triggers($table) as $trg_id => $trg) { $trigger = trigger($trg_id, $status['Name']); - $return .= "\nCREATE TRIGGER " . idf_escape($trigger['Trigger']) . " $trigger[Timing] $trigger[Events] ON " . idf_escape($status["nspname"]) . "." . idf_escape($status['Name']) . " $trigger[Type] $trigger[Statement];;\n"; + $return .= "\nCREATE TRIGGER " . idf_escape($trigger['Trigger']) . " $trigger[Timing] $trigger[Event] ON " . idf_escape($status["nspname"]) . "." . idf_escape($status['Name']) . " $trigger[Type] $trigger[Statement];;\n"; } return $return; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/drivers/sqlite.inc.php new/adminer-4.8.1/adminer/drivers/sqlite.inc.php --- old/adminer-4.8.0/adminer/drivers/sqlite.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/drivers/sqlite.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -140,7 +140,7 @@ } $return = array(); foreach ($row as $key => $val) { - $return[($key[0] == '"' ? idf_unescape($key) : $key)] = $val; + $return[idf_unescape($key)] = $val; } return $return; } @@ -676,7 +676,7 @@ return array( "Timing" => strtoupper($match[1]), "Event" => strtoupper($match[2]) . ($of ? " OF" : ""), - "Of" => ($of[0] == '`' || $of[0] == '"' ? idf_unescape($of) : $of), + "Of" => idf_unescape($of), "Trigger" => $name, "Statement" => $match[4], ); @@ -785,10 +785,11 @@ } function driver_config() { + $types = array("integer" => 0, "real" => 0, "numeric" => 0, "text" => 0, "blob" => 0); return array( 'possible_drivers' => array((isset($_GET["sqlite"]) ? "SQLite3" : "SQLite"), "PDO_SQLite"), 'jush' => "sqlite", - 'types' => array("integer" => 0, "real" => 0, "numeric" => 0, "text" => 0, "blob" => 0), + 'types' => $types, 'structured_types' => array_keys($types), 'unsigned' => array(), 'operators' => array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL"), // REGEXP can be user defined function diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/include/adminer.inc.php new/adminer-4.8.1/adminer/include/adminer.inc.php --- old/adminer-4.8.0/adminer/include/adminer.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/include/adminer.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -956,6 +956,7 @@ echo "<ul id='logins'>\n$output</ul>\n" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});"); } } else { + $tables = array(); if ($_GET["ns"] !== "" && !$missing && DB != "") { $connection->select_db(DB); $tables = table_status('', true); @@ -1024,8 +1025,8 @@ : "<input name='db' value='" . h(DB) . "' autocapitalize='off'>\n" ); echo "<input type='submit' value='" . lang('Use') . "'" . ($databases ? " class='hidden'" : "") . ">\n"; - if ($missing != "db" && DB != "" && $connection->select_db(DB)) { - if (support("scheme")) { + if (support("scheme")) { + if ($missing != "db" && DB != "" && $connection->select_db(DB)) { echo "<br>" . lang('Schema') . ": <select name='ns'>" . optionlist(array("" => "") + $adminer->schemas(), $_GET["ns"]) . "</select>$db_events"; if ($_GET["ns"] != "") { set_schema($_GET["ns"]); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/include/auth.inc.php new/adminer-4.8.1/adminer/include/auth.inc.php --- old/adminer-4.8.0/adminer/include/auth.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/include/auth.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -41,7 +41,7 @@ function check_invalid_login() { global $adminer; $invalids = unserialize(@file_get_contents(get_temp_dir() . "/adminer.invalid")); // @ - may not exist - $invalid = $invalids[$adminer->bruteForceKey()]; + $invalid = ($invalids ? $invalids[$adminer->bruteForceKey()] : array()); $next_attempt = ($invalid[1] > 29 ? $invalid[0] - time() : 0); // allow 30 invalid attempts if ($next_attempt > 0) { //! do the same with permanent login auth_error(lang('Too many unsuccessful logins, try again in %d minute(s).', ceil($next_attempt / 60))); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/include/bootstrap.inc.php new/adminer-4.8.1/adminer/include/bootstrap.inc.php --- old/adminer-4.8.0/adminer/include/bootstrap.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/include/bootstrap.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -4,7 +4,7 @@ } error_reporting(6135); // errors and warnings -set_error_handler('adminer_errors', 2); // 2 - E_WARNING +set_error_handler('adminer_errors', E_WARNING); include "../adminer/include/coverage.inc.php"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/include/connect.inc.php new/adminer-4.8.1/adminer/include/connect.inc.php --- old/adminer-4.8.0/adminer/include/connect.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/include/connect.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -89,14 +89,16 @@ exit; } -if (support("scheme") && DB != "" && $_GET["ns"] !== "") { - if (!isset($_GET["ns"])) { - redirect(preg_replace('~ns=[^&]*&~', '', ME) . "ns=" . get_schema()); - } - if (!set_schema($_GET["ns"])) { - header("HTTP/1.1 404 Not Found"); - page_header(lang('Schema') . ": " . h($_GET["ns"]), lang('Invalid schema.'), true); - page_footer("ns"); - exit; +if (support("scheme")) { + if (DB != "" && $_GET["ns"] !== "") { + if (!isset($_GET["ns"])) { + redirect(preg_replace('~ns=[^&]*&~', '', ME) . "ns=" . get_schema()); + } + if (!set_schema($_GET["ns"])) { + header("HTTP/1.1 404 Not Found"); + page_header(lang('Schema') . ": " . h($_GET["ns"]), lang('Invalid schema.'), true); + page_footer("ns"); + exit; + } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/include/editing.inc.php new/adminer-4.8.1/adminer/include/editing.inc.php --- old/adminer-4.8.0/adminer/include/editing.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/include/editing.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -430,7 +430,7 @@ */ function create_trigger($on, $row) { global $jush; - $timing_event = " $row[Timing] $row[Event]" . ($row["Event"] == "UPDATE OF" ? " " . idf_escape($row["Of"]) : ""); + $timing_event = " $row[Timing] $row[Event]" . (preg_match('~ OF~', $row["Event"]) ? " $row[Of]" : ""); // SQL injection return "CREATE TRIGGER " . idf_escape($row["Trigger"]) . ($jush == "mssql" ? $on . $timing_event : $timing_event . $on) @@ -542,7 +542,7 @@ $urls['sql'] = "https://mariadb.com/kb/en/library/"; $paths['sql'] = (isset($paths['mariadb']) ? $paths['mariadb'] : str_replace(".html", "/", $paths['sql'])); } - return ($paths[$jush] ? "<a href='$urls[$jush]$paths[$jush]'" . target_blank() . ">$text</a>" : ""); + return ($paths[$jush] ? "<a href='" . h($urls[$jush] . $paths[$jush]) . "'" . target_blank() . ">$text</a>" : ""); } /** Wrap gzencode() for usage in ob_start() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/include/functions.inc.php new/adminer-4.8.1/adminer/include/functions.inc.php --- old/adminer-4.8.0/adminer/include/functions.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/include/functions.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -29,6 +29,9 @@ * @return string */ function idf_unescape($idf) { + if (!preg_match('~^[`\'"]~', $idf)) { + return $idf; + } $last = substr($idf, -1); return str_replace($last . $last, $last, substr($idf, 1, -1)); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/include/pdo.inc.php new/adminer-4.8.1/adminer/include/pdo.inc.php --- old/adminer-4.8.0/adminer/include/pdo.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/include/pdo.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -13,14 +13,14 @@ } function dsn($dsn, $username, $password, $options = array()) { + $options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_SILENT; + $options[PDO::ATTR_STATEMENT_CLASS] = array('Min_PDOStatement'); try { $this->pdo = new PDO($dsn, $username, $password, $options); } catch (Exception $ex) { auth_error(h($ex->getMessage())); } - $this->pdo->setAttribute(3, 1); // 3 - PDO::ATTR_ERRMODE, 1 - PDO::ERRMODE_WARNING - $this->pdo->setAttribute(13, array('Min_PDOStatement')); // 13 - PDO::ATTR_STATEMENT_CLASS - $this->server_info = @$this->pdo->getAttribute(4); // 4 - PDO::ATTR_SERVER_VERSION + $this->server_info = @$this->pdo->getAttribute(PDO::ATTR_SERVER_VERSION); } /*abstract function select_db($database);*/ @@ -84,11 +84,11 @@ var $_offset = 0, $num_rows; function fetch_assoc() { - return $this->fetch(2); // PDO::FETCH_ASSOC + return $this->fetch(PDO::FETCH_ASSOC); } function fetch_row() { - return $this->fetch(3); // PDO::FETCH_NUM + return $this->fetch(PDO::FETCH_NUM); } function fetch_field() { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/include/version.inc.php new/adminer-4.8.1/adminer/include/version.inc.php --- old/adminer-4.8.0/adminer/include/version.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/include/version.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -1,2 +1,2 @@ <?php -$VERSION = "4.8.0"; +$VERSION = "4.8.1"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/lang/ca.inc.php new/adminer-4.8.1/adminer/lang/ca.inc.php --- old/adminer-4.8.0/adminer/lang/ca.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/lang/ca.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -2,7 +2,7 @@ $translations = array( 'Login' => 'Inicia la sessi??', 'Logout successful.' => 'Desconnexi?? correcta.', - 'Invalid credentials.' => 'Credencials inv??lids.', + 'Invalid credentials.' => 'Credencials inv??lides.', 'Server' => 'Servidor', 'Username' => 'Nom d\'usuari', 'Password' => 'Contrasenya', @@ -35,7 +35,7 @@ 'Use' => 'Utilitza', 'No tables.' => 'No hi ha cap taula.', 'select' => 'registres', - 'Item has been deleted.' => 'S\'ha suprmit l\'element.', + 'Item has been deleted.' => 'S\'ha suprimit l\'element.', 'Item has been updated.' => 'S\'ha actualitzat l\'element.', 'Item%s has been inserted.' => 'S\'ha insertat l\'element%s.', 'Edit' => 'Edita', @@ -44,9 +44,9 @@ 'Delete' => 'Suprimeix', 'Database' => 'Base de dades', 'Routines' => 'Rutines', - 'Indexes have been altered.' => 'S\'han modificat els ??ndexs.', + 'Indexes have been altered.' => 'S\'han modificat els ??ndex.', 'Indexes' => '??ndexs', - 'Alter indexes' => 'Modifica els ??ndexs', + 'Alter indexes' => 'Modifica els ??ndex', 'Add next' => 'Afegeix el seg??ent', 'Language' => 'Idioma', 'Select' => 'Selecciona', @@ -74,11 +74,11 @@ 'No commands to execute.' => 'Cap comanda per executar.', 'Unable to upload a file.' => 'Impossible adjuntar el fitxer.', 'File upload' => 'Adjunta un fitxer', - 'File uploads are disabled.' => 'L\'ddjunci?? de fitxers est?? desactivada.', + 'File uploads are disabled.' => 'La pujada de fitxers est?? desactivada.', 'Routine has been called, %d row(s) affected.' => array('S\'ha cridat la rutina, %d registre modificat.', 'S\'ha cridat la rutina, %d registres modificats.'), 'Call' => 'Crida', 'No extension' => 'Cap extensi??', - 'None of the supported PHP extensions (%s) are available.' => 'No hi ha cap de les extensions PHP soporatades (%s) disponible.', + 'None of the supported PHP extensions (%s) are available.' => 'No hi ha cap de les extensions PHP suportades (%s) disponible.', 'Session support must be enabled.' => 'Cal que estigui perm??s l\'us de sessions.', 'Session expired, please login again.' => 'La sessi?? ha expirat, torna a iniciar-ne una.', 'Text length' => 'Longitud del text', @@ -86,7 +86,7 @@ 'Foreign key has been altered.' => 'S\'ha modificat la clau forana.', 'Foreign key has been created.' => 'S\'ha creat la clau forana.', 'Foreign key' => 'Clau forana', - 'Target table' => 'Taula de dest??', + 'Target table' => 'Taula de destinaci??', 'Change' => 'Canvi', 'Source' => 'Font', 'Target' => 'Dest??', @@ -139,7 +139,7 @@ 'Grant' => 'Grant', 'Revoke' => 'Revoke', 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Les dades POST s??n massa grans. Redueix les dades o incrementa la directiva de configuraci?? %s.', - 'Logged as: %s' => 'Connectat com: %s', + 'Logged as: %s' => 'Connectat com a: %s', 'Move up' => 'Mou a dalt', 'Move down' => 'Mou a baix', 'Functions' => 'Funcions', @@ -204,7 +204,7 @@ '[yyyy]-mm-dd' => 'dd/mm/[aaaa]', 'History' => 'Hist??ria', 'Variables' => 'Variables', - 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Les columnes origen i dest?? han de ser del mateix tipus, la columna dest?? ha d\'estar indexada i les dades referenciades han d\'existir.', + 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Les columnes d\'origen i de destinaci?? han de ser del mateix tipus, la columna de destinaci?? ha d\'estar indexada i les dades referenciades han d\'existir.', 'E-mail' => 'Correu electr??nic', 'From' => 'De', 'Subject' => 'Assumpte', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/lang/el.inc.php new/adminer-4.8.1/adminer/lang/el.inc.php --- old/adminer-4.8.0/adminer/lang/el.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/lang/el.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -11,12 +11,12 @@ 'Logged as: %s' => '?????????????????????? ???? %s', 'Logout successful.' => '???????????????????????????? ???? ????????????????.', 'Invalid credentials.' => '?????????????????? ????????????????????????????.', - 'Too many unsuccessful logins, try again in %d minute(s).' => array('?????????????????????????? ?????????????????????? ?????????????????????? ????????????????, ?????????????????? ???????? ???? %s ??????????.', '?????????????????????????? ?????????????????????? ?????????????????????? ????????????????, ?????????????????? ???????? ???? %s ??????????.'), - 'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '???????????? ?? ???????????? ??????????????. <a href="https://www.adminer.org/en/extension/"%s>??????????????????????????</a> ???? ???????????? %s ?????? ???? ?????? ???????????? ????????????.', + 'Too many unsuccessful logins, try again in %d minute(s).' => array('???????????????????????????? ?????????????????????? ?????????????????????? ????????????????, ?????????????????? ???????? ???? %s ??????????.', '???????????????????????????? ?????????????????????? ?????????????????????? ????????????????, ?????????????????? ???????? ???? %s ??????????.'), + 'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '?????????? ?? ???????????? ??????????????. <a href="https://www.adminer.org/en/extension/"%s>??????????????????????????</a> ???? ???????????? %s ?????? ???? ?????? ???????????? ????????????.', 'Language' => '????????????', 'Invalid CSRF token. Send the form again.' => '?????????? ?????????????? CSRF. ?????????????? ???? ?????????? ????????.', 'If you did not send this request from Adminer then close this page.' => '???? ???? ???????????????? ???????? ???? ???????????? ?????? ???? Adminer, ???????? ?????????????? ???????? ???? ????????????.', - 'No extension' => '?????????? ????????????????????', + 'No extension' => '?????????? ????????????????', 'None of the supported PHP extensions (%s) are available.' => '?????????? ?????? ?????? ?????????????????????????????? ???????????????????? PHP (%s) ?????? ?????????? ??????????????????.', 'Session support must be enabled.' => '???????????? ???? ?????????? ???????????????????????????? ?? ???????????????????? ??????????????????.', 'Session expired, please login again.' => '?? ???????????????? ??????????, ???????????????? ???????????????????? ????????.', @@ -26,7 +26,7 @@ // text direction - 'ltr' or 'rtl' 'ltr' => 'ltr', - 'Privileges' => '????????????????', + 'Privileges' => '????????????????????', 'Create user' => '???????????????????? ????????????', 'User has been dropped.' => '?? ?????????????? ????????????????????.', 'User has been altered.' => '?? ?????????????? ??????????????????????????.', @@ -38,7 +38,7 @@ 'Revoke' => '????????????????', 'Process list' => '?????????? ????????????????????', - '%d process(es) have been killed.' => array('?????????????????????????? %d ??????????????????.', '?????????????????????????? %d ????????????????????.'), + '%d process(es) have been killed.' => array('???????????????????????? %d ??????????????????.', '?????????????????????????? %d ????????????????????.'), 'Kill' => '??????????????????????', 'Variables' => '????????????????????', @@ -46,8 +46,8 @@ 'SQL command' => '???????????? SQL', '%d query(s) executed OK.' => array('???? ?????????????? %d ?????????????????????? ????.', '???? ?????????????????? %d ???????????????????????? ????.'), - 'Query executed OK, %d row(s) affected.' => array('???? ?????????????? ?????????????????????? ????, ???????????????????????? %d ??????????.', '???? ?????????????? ?????????????????????? ????, ?????????????????????????? %d ????????????.'), - 'No commands to execute.' => '?????? ?????????????? ???????????? ???? ????????????????????.', + 'Query executed OK, %d row(s) affected.' => array('???? ?????????????? ?????????????????????? ????, ?????????????????????? %d ??????????.', '???? ?????????????? ?????????????????????? ????, ???????????????????????? %d ????????????.'), + 'No commands to execute.' => '?????? ???????????????? ?????????????? ???? ??????????????????????.', 'Error in query' => '???????????? ?????? ??????????????', 'Execute' => '????????????????', 'Stop on error' => '?????????????? ???????? ?????????????? ????????????', @@ -58,16 +58,16 @@ 'Clear' => '????????????????????', 'Edit all' => '?????????????????????? ????????', - 'File upload' => '???????????????? ??????????????', + 'File upload' => '?????????????????????? ??????????????', 'From server' => '?????? ????????????????????', 'Webserver file %s' => '???????????? %s ?????? ???????????????????? web', 'Run file' => '???????????????? ??????????????', 'File does not exist.' => '???? ???????????? ?????? ??????????????.', - 'File uploads are disabled.' => '???????? ?????????????????????????????? ???? ???????????????? ??????????????.', - 'Unable to upload a file.' => '?????? ?????????? ?????????????? ???? ???????????? ???? ????????????.', - 'Maximum allowed file size is %sB.' => '???? ?????????????? ???????????????????????? ?????????????? ???????????? ?????? ???????????????? ?????????? %sB.', + 'File uploads are disabled.' => '???????? ?????????????????????????????? ?? ?????????????????????? ??????????????.', + 'Unable to upload a file.' => '???????????????? ???????????????????????? ??????????????.', + 'Maximum allowed file size is %sB.' => '???? ?????????????? ???????????????????????? ?????????????? ?????????????? ?????????? %sB.', 'Too big POST data. Reduce the data or increase the %s configuration directive.' => '?????????? ???????????????? POST. ?????????????? ???? ?????????????????????? ?? ?????????????? ?????? ?????????????? ?????????????? %s.', - 'You can upload a big SQL file via FTP and import it from server.' => '???????????????? ???? ?????????????????? ?????? ???????????? ???????????? SQL ???????? FTP ?????? ???? ???? ???????????????? ?????? ???? ????????????????????.', + 'You can upload a big SQL file via FTP and import it from server.' => '???????????????? ???? ?????????????????????????? ?????? ???????????? ???????????? SQL ???????? FTP ?????? ???? ???? ???????????????? ?????? ???? ????????????????????.', 'You are offline.' => '?????????????????? ?????????? ????????????????.', 'Export' => '??????????????', @@ -82,7 +82,7 @@ 'database' => '??. ??????????????????', 'Use' => '??????????', 'Select database' => '???????????????? ??.??.', - 'Invalid database.' => '?????????? ??.??.', + 'Invalid database.' => '???????????????????? ??.??.', 'Database has been dropped.' => '?? ??.??. ????????????????????.', 'Databases have been dropped.' => '???? ??.??. ??????????????????????.', 'Database has been created.' => '?? ??.??. ??????????????????????????.', @@ -111,7 +111,7 @@ 'Check' => '??????????????', 'Repair' => '??????????????????????', 'Truncate' => '????????????????', - 'Tables have been truncated.' => '???? ?????????????? ????????????????????????.', + 'Tables have been truncated.' => '???? ?????????????? ??????????????????????.', 'Move to other database' => '???????????????? ???? ???????? ??.??.', 'Move' => '????????????????', 'Tables have been moved.' => '???? ?????????????? ????????????????????????.', @@ -119,11 +119,11 @@ 'Tables have been copied.' => '???? ?????????????? ????????????????????????.', 'Routines' => '????????????????', - 'Routine has been called, %d row(s) affected.' => array('?? ?????????????? ??????????????????????, ???????????????????????? %d ??????????.', '?? ?????????????? ??????????????????????, ?????????????????????????? %d ????????????.'), + 'Routine has been called, %d row(s) affected.' => array('?? ?????????????? ??????????????????????, ?????????????????????? %d ??????????.', '?? ?????????????? ??????????????????????, ???????????????????????? %d ????????????.'), 'Call' => '????????????????', 'Parameter name' => '?????????? ????????????????????', 'Create procedure' => '???????????????????? ??????????????????????', - 'Create function' => '???????????????????? ??????????????????????', + 'Create function' => '???????????????????? ????????????????????', 'Routine has been dropped.' => '?? ?????????????? ????????????????????.', 'Routine has been altered.' => '?? ?????????????? ??????????????????????????.', 'Routine has been created.' => '?? ?????????????? ??????????????????????????.', @@ -151,7 +151,7 @@ 'Alter table' => '?????????????????????? ????????????', 'Create table' => '???????????????????? ????????????', 'Table has been dropped.' => '?? ?????????????? ????????????????????.', - 'Tables have been dropped.' => '???? ?????????????? ??????????????????????.', + 'Tables have been dropped.' => '???? ?????????????? ??????????????????????.', 'Tables have been optimized.' => '???? ?????????????? ??????????????????????????????????.', 'Table has been altered.' => '?? ?????????????? ??????????????????????????.', 'Table has been created.' => '?? ?????????????? ??????????????????????????.', @@ -210,7 +210,7 @@ 'Add foreign key' => '???????????????? ?????????????????????? ????????????????', 'ON DELETE' => '???????? ???? ????????????????', 'ON UPDATE' => '???????? ?????? ????????????', - 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '???? ???????????? ?????? ???????? ?????? ???? ?????????? ???????????? ???? ?????????? ?????? ???????? ????????, ???????????? ???? ?????????????? ?????????????? ?????? ?????????? ?????????? ?????? ???? ???????????????? ???????????????????? ????????????????.', + 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '???? ???????????? ???????? ???????? ?????? ???? ?????????? ???????????? ???? ?????????? ?????? ???????? ????????, ???????????? ???? ?????????????? ?????????????? ?????? ?????????? ?????????? ?????? ???? ???????????????? ???????????????????? ????????????????.', 'Triggers' => '??????????????????', 'Add trigger' => '???????????????? ????????????????????', @@ -262,7 +262,7 @@ 'Item%s has been inserted.' => '?? ??????????????%s ??????????????.', 'Item has been deleted.' => '?? ?????????????? ????????????????????.', 'Item has been updated.' => '?? ?????????????? ??????????????????????.', - '%d item(s) have been affected.' => array('???????????????????????? %d ??????????????.', '?????????????????????????? %d ????????????????.'), + '%d item(s) have been affected.' => array('?????????????????????? %d ??????????????.', '???????????????????????? %d ????????????????.'), 'New item' => '?????? ??????????????', 'original' => '??????????????????', // label for value '' in enum data type @@ -274,7 +274,7 @@ 'Save and continue edit' => '???????????????????? ?????? ???????????????? ????????????????????????', 'Save and insert next' => '???????????????????? ?????? ???????????????? ????????????????', 'Selected' => '????????????????????', - 'Clone' => '??????????????????????', + 'Clone' => '??????????????????????', 'Delete' => '????????????????', 'You have no privileges to update this table.' => '?????? ?????????? ???????????????? ???? ?????????????????????????? ???????? ?????? ????????????.', @@ -283,7 +283,7 @@ 'Subject' => '????????', 'Attachments' => '??????????????????', 'Send' => '????????????????', - '%d e-mail(s) have been sent.' => array('%d e-mail ????????????????????.', '%d e-mail ????????????????????????.'), + '%d e-mail(s) have been sent.' => array('%d e-mail ????????????????.', '%d e-mail ??????????????????????.'), // data type descriptions 'Numbers' => '??????????????', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/processlist.inc.php new/adminer-4.8.1/adminer/processlist.inc.php --- old/adminer-4.8.0/adminer/processlist.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/processlist.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -1,12 +1,14 @@ <?php -if (support("kill") && $_POST && !$error) { - $killed = 0; - foreach ((array) $_POST["kill"] as $val) { - if (kill_process($val)) { - $killed++; +if (support("kill")) { + if ($_POST && !$error) { + $killed = 0; + foreach ((array) $_POST["kill"] as $val) { + if (kill_process($val)) { + $killed++; + } } + queries_redirect(ME . "processlist=", lang('%d process(es) have been killed.', $killed), $killed || !$_POST["kill"]); } - queries_redirect(ME . "processlist=", lang('%d process(es) have been killed.', $killed), $killed || !$_POST["kill"]); } page_header(lang('Process list'), $error); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/static/editing.js new/adminer-4.8.1/adminer/static/editing.js --- old/adminer-4.8.0/adminer/static/editing.js 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/static/editing.js 2021-05-14 07:39:59.000000000 +0200 @@ -658,7 +658,7 @@ if (tableRe.test(form['Trigger'].value)) { form['Trigger'].value = table + '_' + (selectValue(form['Timing']).charAt(0) + formEvent.charAt(0)).toLowerCase(); } - alterClass(form['Of'], 'hidden', formEvent != 'UPDATE OF'); + alterClass(form['Of'], 'hidden', !/ OF/.test(formEvent)); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/adminer/trigger.inc.php new/adminer-4.8.1/adminer/trigger.inc.php --- old/adminer-4.8.0/adminer/trigger.inc.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/adminer/trigger.inc.php 2021-05-14 07:39:59.000000000 +0200 @@ -2,7 +2,7 @@ $TABLE = $_GET["trigger"]; $name = $_GET["name"]; $trigger_options = trigger_options(); -$row = (array) trigger($name) + array("Trigger" => $TABLE . "_bi"); +$row = (array) trigger($name, $TABLE) + array("Trigger" => $TABLE . "_bi"); if ($_POST) { if (!$error && in_array($_POST["Timing"], $trigger_options["Timing"]) && in_array($_POST["Event"], $trigger_options["Event"]) && in_array($_POST["Type"], $trigger_options["Type"])) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/changes.txt new/adminer-4.8.1/changes.txt --- old/adminer-4.8.0/changes.txt 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/changes.txt 2021-05-14 07:39:59.000000000 +0200 @@ -1,3 +1,15 @@ +Adminer 4.8.1 (released 2021-05-14): +Internet Explorer or PDO in Adminer 4.7.8-4.8.0: Fix XSS in doc_link (bug #797) +Fix more PHP 8 warnings (bug #781) +Avoid PHP warnings with PDO drivers (bug #786, regression from 4.7.8) +MySQL: Allow moving views to other DB and renaming DB with views (bug #783) +MariaDB: Do not treat sequences as views (PR #416) +PostgreSQL: Support UPDATE OF triggers (bug #789) +PostgreSQL: Support triggers with more events (OR) +PostgreSQL: Fix parsing of foreign keys with non-ASCII column names +PostgreSQL < 10 PDO: Avoid displaying GENERATED ALWAYS BY IDENTITY everywhere (bug #785, regression from 4.7.9) +SQLite: Fix displayed types (bug #784, regression from 4.8.0) + Adminer 4.8.0 (released 2021-02-10): Support function default values in insert (bug #713) Allow SQL pseudo-function in insert @@ -798,7 +810,7 @@ phpMinAdmin 1.10.1 (released 2009-05-07): Highlight odd and hover rows -Partition editing comfort (bug #2783446) +Partition editing comfort (bug #12) Allow full length in limited int phpMinAdmin 1.10.0 (released 2009-04-28): @@ -885,7 +897,7 @@ Privileges New design Dutch translation -Use NULL for auto_increment (bug #1768966) +Use NULL for auto_increment (bug #1) Fix dropping procedure parameters phpMinAdmin 1.3.2 (released 2007-08-06): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/compile.php new/adminer-4.8.1/compile.php --- old/adminer-4.8.0/compile.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/compile.php 2021-05-14 07:39:59.000000000 +0200 @@ -5,7 +5,7 @@ } error_reporting(6135); // errors and warnings -set_error_handler('adminer_errors', 2); // 2 - E_WARNING +set_error_handler('adminer_errors', E_WARNING); include dirname(__FILE__) . "/adminer/include/version.inc.php"; include dirname(__FILE__) . "/externals/JsShrink/jsShrink.php"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/designs/dracula/adminer.css new/adminer-4.8.1/designs/dracula/adminer.css --- old/adminer-4.8.0/designs/dracula/adminer.css 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/designs/dracula/adminer.css 2021-05-14 07:39:59.000000000 +0200 @@ -393,7 +393,7 @@ float: none; } - #tables a[title] { + #tables .structure, #tables .view { float: none; display: block; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/designs/galkaev/adminer.css new/adminer-4.8.1/designs/galkaev/adminer.css --- old/adminer-4.8.0/designs/galkaev/adminer.css 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/designs/galkaev/adminer.css 2021-05-14 07:39:59.000000000 +0200 @@ -752,7 +752,7 @@ font-size: 13px; } -#tables a[title] { +#tables .structure, #tables .view { float: none; display: block; color: inherit; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/designs/mancave/adminer.css new/adminer-4.8.1/designs/mancave/adminer.css --- old/adminer-4.8.0/designs/mancave/adminer.css 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/designs/mancave/adminer.css 2021-05-14 07:39:59.000000000 +0200 @@ -819,7 +819,7 @@ font-size: 13px; } -#tables a[title] { +#tables .structure, #tables .view { float: none; display: block; color: #F1E5B3; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/designs/pepa-linha/adminer.css new/adminer-4.8.1/designs/pepa-linha/adminer.css --- old/adminer-4.8.0/designs/pepa-linha/adminer.css 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/designs/pepa-linha/adminer.css 2021-05-14 07:39:59.000000000 +0200 @@ -1,7 +1,6 @@ /* * Theme by Pepa Linha [http://webdream.cz] * JUSH color syntax inspired by NetBeans - * @version 0.2 (February 2014) */ html, @@ -360,7 +359,7 @@ float: none; } -#tables a[title] { +#tables .structure, #tables .view { float: none; display: block; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/plugins/drivers/README new/adminer-4.8.1/plugins/drivers/README --- old/adminer-4.8.0/plugins/drivers/README 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/plugins/drivers/README 1970-01-01 01:00:00.000000000 +0100 @@ -1,11 +0,0 @@ -Enable drivers in this directory like this: - -<?php -function adminer_object() { - include "./plugins/drivers/simpledb.php"; // the driver is enabled just by including - return new Adminer; // or return AdminerPlugin if you want to use other plugins -} - -// include original Adminer -include "./adminer.php"; -?> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/plugins/drivers/readme.txt new/adminer-4.8.1/plugins/drivers/readme.txt --- old/adminer-4.8.0/plugins/drivers/readme.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/adminer-4.8.1/plugins/drivers/readme.txt 2021-05-14 07:39:59.000000000 +0200 @@ -0,0 +1,11 @@ +Enable drivers in this directory like this: + +<?php +function adminer_object() { + include "./plugins/drivers/simpledb.php"; // the driver is enabled just by including + return new Adminer; // or return AdminerPlugin if you want to use other plugins +} + +// include original Adminer +include "./adminer.php"; +?> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/plugins/login-otp.php new/adminer-4.8.1/plugins/login-otp.php --- old/adminer-4.8.0/plugins/login-otp.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/plugins/login-otp.php 2021-05-14 07:39:59.000000000 +0200 @@ -1,8 +1,7 @@ <?php /** Require One-Time Password at login -* You can generate the secret and install it into Google Authenticator e.g. with https://github.com/sonata-project/GoogleAuthenticator or https://php.vrana.cz/jednorazove-heslo.php -* @link https://www.adminer.org/plugins/#use +* @link https://www.adminer.org/plugins/otp/ * @author Jakub Vrana, https://www.vrana.cz/ * @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license https://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/plugins/plugin.php new/adminer-4.8.1/plugins/plugin.php --- old/adminer-4.8.0/plugins/plugin.php 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/plugins/plugin.php 2021-05-14 07:39:59.000000000 +0200 @@ -84,6 +84,8 @@ } function editRowPrint($table, $fields, $row, $update) { + $args = func_get_args(); + return $this->_appendPlugin(__FUNCTION__, $args); } function editFunctions($field) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/readme.txt new/adminer-4.8.1/readme.txt --- old/adminer-4.8.0/readme.txt 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/readme.txt 2021-05-14 07:39:59.000000000 +0200 @@ -2,7 +2,7 @@ Adminer Editor - Data manipulation for end-users https://www.adminer.org/ -Supports: MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, SimpleDB, Elasticsearch, MongoDB, Firebird +Supports: MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, Elasticsearch, MongoDB, SimpleDB (plugin), Firebird (plugin), ClickHouse (plugin) Requirements: PHP 5+ Apache License 2.0 or GPL 2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/adminer-4.8.0/todo.txt new/adminer-4.8.1/todo.txt --- old/adminer-4.8.0/todo.txt 2021-02-10 17:21:55.000000000 +0100 +++ new/adminer-4.8.1/todo.txt 2021-05-14 07:39:59.000000000 +0200 @@ -2,7 +2,7 @@ Create view and routine options Variables editation Blob download and image display in edit form (important for Editor with hidden fields in select and SQL command) -Add title to Logout, edit (in select) and select (in menu) for style "hever" +Add title to Logout and edit (in select) for style "hever" Export by GET parameters Draggable columns in alter table (thanks to Michal Manak) <option class> for system databases and schemas - information_schema and driver-specific (thanks to Vaclav Novotny)
