1
0
mirror of https://github.com/vrana/adminer.git synced 2025-09-05 04:01:48 +02:00

Compare commits

..

18 Commits
v4.13 ... v4.14

Author SHA1 Message Date
Peter Knut
2993ee4ea7 Release 4.14 2025-02-02 23:37:23 +01:00
Peter Knut
27ae5e7895 Switch JsShrink library to a custom fork (issue #17) 2025-02-02 00:52:54 +01:00
Peter Knut
c54e6fb589 Fix link to language files in README.md (issue #18) 2025-02-02 00:24:26 +01:00
Peter Knut
f8bff19898 PostgreSQL: Fix renaming database 2025-01-31 17:05:58 +01:00
Peter Knut
3195023248 PostgreSQL: Fix starting value of exported autoincrement
Thanks to @OmlineEditor (https://github.com/adminerevo/adminerevo/issues/113)
2025-01-30 20:50:57 +01:00
Peter Knut
4a65703334 MariaDB: Fix missing uca1400 collations
Since MariaDB 10.10, one collation can be compatible with more character sets, so collations no longer have unique IDs.

Thanks to @shionryuu (https://github.com/adminerevo/adminerevo/issues/50)
2025-01-30 20:50:57 +01:00
Peter Knut
5c9e0f6d5a Modify naming of new foreign rows
Regexp is used to unify implementation with other similar situations. This also prevents false detection in CodeQL security scanning.
2025-01-29 12:21:56 +01:00
Peter Knut
8e2745ab4f Reconfigure CodeQL analysis 2025-01-29 10:12:20 +01:00
Adrian Jones
f4d06b50fc A few changes from pematon/adminer to adminerneo/adminerneo as well as from master to main 2025-01-29 09:22:38 +01:00
Lucas Sandery
1abaa642ae Update lucas-sandery theme
::file-selector-button got standardised.
2025-01-29 00:09:15 +01:00
Peter Knut
cad67e2c68 Add support for page scrolling while dragging sortable rows (issue #11) 2025-01-29 00:09:15 +01:00
Peter Knut
d53c966ef7 Add a screenshot to readme file 2025-01-29 00:09:15 +01:00
Peter Knut
5490c1654c Change project's name to AdminerNeo 2025-01-29 00:09:15 +01:00
Peter Knut
e69f0afc2a Remove unused git modules 2025-01-27 23:26:39 +01:00
Peter Knut
3380f3aaea Bump version to 4.14-dev 2025-01-27 19:57:38 +01:00
Peter Knut
ddb7dedfa4 Fix warnings in language detection 2025-01-25 23:02:29 +01:00
Peter Knut
0590d7d3ef Compile adminer to "export" directory 2025-01-25 00:21:46 +01:00
Peter Knut
44e59cd698 Referencing contributors in changelog file 2025-01-23 11:18:05 +01:00
24 changed files with 201 additions and 200 deletions

View File

@@ -1,67 +0,0 @@
# 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

2
.gitignore vendored
View File

@@ -4,4 +4,4 @@
/**/compiled /**/compiled
/vendor/ /vendor/
/composer.lock /composer.lock
/temp /export/

6
.gitmodules vendored
View File

@@ -1,6 +0,0 @@
[submodule "designs/hydra"]
path = designs/hydra
url = https://github.com/Niyko/Hydra-Dark-Theme-for-Adminer
[submodule "designs/pepa-linha-dark"]
path = designs/pepa-linha-dark
url = https://github.com/pepa-linha/Adminer-Design-Dark/

View File

@@ -1,8 +1,30 @@
Changelog Changelog
========= =========
Adminer 4.13 (2025-01-23) AdminerNeo 4.14 (2025-02-02)
------------------------- ----------------------------
### Changes
- Change project's name to AdminerNeo
- Add support for page scrolling while dragging sortable rows (issue #11)
- Update lucas-sandery theme (by @lucas-sandery)
- Switch JsShrink library to a custom fork (issue #17)
- Compile adminer into the "export" directory
- Small JS tuning for better CodeQL analysis
### Bugfixes
- MariaDB: Fix missing uca1400 collations
- PostgreSQL: Fix initial value of exported autoincrement
- PostgreSQL: Fix renaming a database
- Fix warnings in language detection
- Fix link to language files in README.md (issue #18)
Thanks for help with invalid links: @adrianbj.
AdminerNeo 4.13 (2025-01-23)
----------------------------
### Changes ### Changes
@@ -16,13 +38,13 @@ Adminer 4.13 (2025-01-23)
- SQLite: Fix exporting and recreating tables with UNIQUE column constraint - SQLite: Fix exporting and recreating tables with UNIQUE column constraint
- Fix main visual glitches in designs - Fix main visual glitches in designs
Adminer 4.12 (2024-11-21) AdminerNeo 4.12 (2024-11-21)
------------------------- ----------------------------
### New features ### New features
- MySQL: Print comments of stored procedures and functions - MySQL: Print comments of stored procedures and functions
- MariaDB: Add support for UUID data type (by vukbgit) - MariaDB: Add support for UUID data type (by @vukbgit)
- MS SQL: Allow to set Encrypt and TrustServerCertificate with AdminerLoginSsl plugin (issue #5) - MS SQL: Allow to set Encrypt and TrustServerCertificate with AdminerLoginSsl plugin (issue #5)
- MS SQL, MongoDB: Connect to localhost with default port if server is not specified - MS SQL, MongoDB: Connect to localhost with default port if server is not specified
- Compiler: Allow to compile only selected drivers and languages - Compiler: Allow to compile only selected drivers and languages
@@ -34,7 +56,7 @@ Adminer 4.12 (2024-11-21)
- Update project URL and info - Update project URL and info
- Rename 'server' driver to 'mysql' - Rename 'server' driver to 'mysql'
- Compiler: MySQL driver is no longer the required default - Compiler: MySQL driver is no longer the required default
- Update Spanish translations (by isaacpolaino) - Update Spanish translations (by @isaacpolaino)
### Bugfixes ### Bugfixes
@@ -46,8 +68,8 @@ Adminer 4.12 (2024-11-21)
- Compiler: Fix translations in plugins - Compiler: Fix translations in plugins
- Compiler: Fix compiled SQLite single-driver Adminer - Compiler: Fix compiled SQLite single-driver Adminer
Adminer 4.11 (2024-10-30) AdminerNeo 4.11 (2024-10-30)
------------------------- ----------------------------
### New features ### New features
@@ -69,24 +91,24 @@ Adminer 4.11 (2024-10-30)
- MS SQL: Prefix Unicode strings with 'N' so they are treated correctly - MS SQL: Prefix Unicode strings with 'N' so they are treated correctly
- Fix printing error message while validating server URL - Fix printing error message while validating server URL
Adminer 4.10 (2024-10-22) AdminerNeo 4.10 (2024-10-22)
------------------------- ----------------------------
### New features ### New features
- Add drag-n-drop moving of rows in table selection filter - Add drag-n-drop moving of rows in table selection filter
- Add drag-n-drop moving of rows in table editing - Add drag-n-drop moving of rows in table editing
- Add removal buttons to table selection filter (by Roy Orbitson) - Add removal buttons to table selection filter (by @Roy-Orbison)
- Enable regular expressions when searching data in all tables (by Roy Orbitson) - Enable regular expressions when searching data in all tables (by @Roy-Orbison)
- Integrate tables-filter plugin into the base code - Integrate tables-filter plugin into the base code
- Plugin to auto-include adminer.js when present (by Roy Orbitson) - Plugin to auto-include adminer.js when present (by @Roy-Orbison)
- Print username next to the logout button - Print username next to the logout button
- Show partitioning info in table structure page - Show partitioning info in table structure page
- Show second link for editing a table under the table view - Show second link for editing a table under the table view
### Changes ### Changes
- Check new version against GitHub pages (by Adrian Jones) - Check new version against GitHub pages (by @adrianbj)
- Add 'Home' to breadcrumb navigation - Add 'Home' to breadcrumb navigation
- Full width design for database select box - Full width design for database select box
- Add table head to the list of indexes - Add table head to the list of indexes
@@ -102,8 +124,8 @@ Adminer 4.10 (2024-10-22)
- Fix missing SQL statement if warnings are printed (regression from 4.9) - Fix missing SQL statement if warnings are printed (regression from 4.9)
Adminer 4.9.4 (2024-10-09) AdminerNeo 4.9.4 (2024-10-09)
-------------------------- -----------------------------
- Fix the width of inline edit field - Fix the width of inline edit field
- Unify displaying of 'New item' action based on privileges - Unify displaying of 'New item' action based on privileges
@@ -115,56 +137,56 @@ Adminer 4.9.4 (2024-10-09)
- Editor: Fix building links with array parameters - Editor: Fix building links with array parameters
- Clean up the code for PHP < 5.6 - Clean up the code for PHP < 5.6
Adminer 4.9.3 (2024-10-02) AdminerNeo 4.9.3 (2024-10-02)
-------------------------- -----------------------------
- MySQL, PostgreSQL: Fix queries splitting and string constants - MySQL, PostgreSQL: Fix queries splitting and string constants
- MySQL: Fix where clause for `JSON` column (by SeaEagle) - MySQL: Fix where clause for `JSON` column (by @SeaEagle)
- MySQL: Fix editing user's proxy privilege, refactoring - MySQL: Fix editing user's proxy privilege, refactoring
- MariaDB: Fix comparing `CURRENT_TIMESTAMP` definition while altering a table - MariaDB: Fix comparing `CURRENT_TIMESTAMP` definition while altering a table
- PostgreSQL: Fix editing record that contains a field with `GENERATED ALWAYS` default value - PostgreSQL: Fix editing record that contains a field with `GENERATED ALWAYS` default value
- Fix using undefined Min_DB::info property - Fix using undefined Min_DB::info property
- Do not include unchanged `PARTITION BY` definition into `ALTER TABLE` query - Do not include unchanged `PARTITION BY` definition into `ALTER TABLE` query
- Do not limit unlimited memory while executing queries (by Michael Graß) - Do not limit unlimited memory while executing queries (by @oksiquatzel)
- Fix number conversion warning while reading INI settings - Fix number conversion warning while reading INI settings
- Hide invalid edit form if table record is not found - Hide invalid edit form if table record is not found
- CSS: Fix background color of `<pre>` used as edit field - CSS: Fix background color of `<pre>` used as edit field
- CSS: Bigger font size for code blocks - CSS: Bigger font size for code blocks
Adminer 4.9.2 (2024-09-18) AdminerNeo 4.9.2 (2024-09-18)
-------------------------- -----------------------------
- Fix textarea height for single-line inputs (used typically for SQLite text field) - Fix textarea height for single-line inputs (used typically for SQLite text field)
- Fix undefined property in error message if driver does not support error number (e.g. PostgreSQL) - Fix undefined property in error message if driver does not support error number (e.g. PostgreSQL)
- PostgreSQL: Fix search fields configuration (regression from 4.9) - PostgreSQL: Fix search fields configuration (regression from 4.9)
- PostgreSQL: Fix search condition for network address types, add macaddr8 type - PostgreSQL: Fix search condition for network address types, add macaddr8 type
- PostgreSQL: Fix exporting `CREATE TABLE` query with `GENERATED` default values - PostgreSQL: Fix exporting `CREATE TABLE` query with `GENERATED` default values
- PostgreSQL: Fix exporting `CREATE TABLE` query with sequence default value (by khoazero123) - PostgreSQL: Fix exporting `CREATE TABLE` query with sequence default value (by @khoazero123)
- PostgreSQL: Allow to set connection's sslmode with AdminerLoginSsl plugin - PostgreSQL: Allow to set connection's sslmode with AdminerLoginSsl plugin
- MySQL: Do not show `empty` enum value in strict mode - MySQL: Do not show `empty` enum value in strict mode
- Editor: Fix searching in tables - Editor: Fix searching in tables
- Add function to retrieve driver name that can be used in plugins (by Roy Orbison) - Add function to retrieve driver name that can be used in plugins (by @Roy-Orbison)
Adminer 4.9.1 (2024-09-09) AdminerNeo 4.9.1 (2024-09-09)
-------------------------- -----------------------------
- Compatibility with PHP 8.3 (by Sneda8) - Compatibility with PHP 8.3 (by @Sneda8)
- Fix compiling jush external files - Fix compiling jush external files
- Improved displaying of long table names in menu - Improved displaying of long table names in menu
- Replace deprecated `<acronym>` with `<abbr>` - Replace deprecated `<acronym>` with `<abbr>`
- Add support for translations in plugins - Add support for translations in plugins
- Add .editorconfig file - Add .editorconfig file
- MySQL: Add `unix_timestamp` to functions (by Michal Paulovic) - MySQL: Add `unix_timestamp` to functions (by @bbaronSVK)
- PostgreSQL: Show only accessible databases (by Thomas Daniels) - PostgreSQL: Show only accessible databases (by @thomas-daniels)
- PostgreSQL: Make data length calculation more accurate (by caltong) - PostgreSQL: Make data length calculation more accurate (by @caltong)
- PostgreSQL: Fix documentation link for `SERIAL` type - PostgreSQL: Fix documentation link for `SERIAL` type
- PostgreSQL: Fix undefined properties on PHP 8 - PostgreSQL: Fix undefined properties on PHP 8
- Elasticsearch: Fix field selection - Elasticsearch: Fix field selection
- AdminerEditForeign: Refactor and fix the plugin - AdminerEditForeign: Refactor and fix the plugin
- AdminerLoginOtp: Autocomplete hints for OTP input field, code refactoring - AdminerLoginOtp: Autocomplete hints for OTP input field, code refactoring
Adminer 4.9 (2024-08-19) AdminerNeo 4.9 (2024-08-19)
------------------------ ---------------------------
- Validate server input in login form - Validate server input in login form
- Validate connection to server in HTTP based drivers - Validate connection to server in HTTP based drivers
@@ -174,22 +196,22 @@ Adminer 4.9 (2024-08-19)
- Add new Elasticsearch 7 driver - Add new Elasticsearch 7 driver
- Set saving to file as a default export option - Set saving to file as a default export option
- Improve URL and email detection - Improve URL and email detection
- Fix AdminerVersionNoverify plugin blocking other plugins to modify HTML head (by Roy Orbitson) - Fix AdminerVersionNoverify plugin blocking other plugins to modify HTML head (by @Roy-Orbison)
- Fix several bugs and security issues in AdminerFileUpload plugin - Fix several bugs and security issues in AdminerFileUpload plugin
- Skip dump of generated columns (by Denitz) - Skip dump of generated columns (by @Denitz)
- Fix uninitialized string offset (by Adrian Jones) - Fix uninitialized string offset (by @adrianbj)
- Update composer.json - Update composer.json
- Add script for exporting compiled adminer variants - Add script for exporting compiled adminer variants
Adminer 4.8.2 (2024-03-16) AdminerNeo 4.8.2 (2024-03-16)
-------------------------- -----------------------------
- Support multi-line table comments - Support multi-line table comments
- MySQL: Use `ST_SRID()` instead of `SRID()` for MySQL 8 (PR #418) - MySQL: Use `ST_SRID()` instead of `SRID()` for MySQL 8 (PR #418)
- PostgreSQL: Don't reset table comments (regression from 4.2.0) - PostgreSQL: Don't reset table comments (regression from 4.2.0)
- PostgreSQL PDO: Allow editing rows identified by boolean column (PR #380) - PostgreSQL PDO: Allow editing rows identified by boolean column (PR #380)
- Update several translations: lv, bn, fr, it, nl, ru, cs, sk - Update several translations: lv, bn, fr, it, nl, ru, cs, sk
- Allow responsive styles on larger devices - Allow responsive styles on larger devices (by @lucas-sandery)
Adminer 4.8.1 (2021-05-14) Adminer 4.8.1 (2021-05-14)
-------------------------- --------------------------

View File

@@ -1,7 +1,7 @@
Licenses Licenses
======== ========
You may use Adminer under the terms of either the Apache License Version 2.0 You may use AdminerNeo under the terms of either the Apache License Version 2.0
or the GNU General Public License (GPL) version 2. or the GNU General Public License (GPL) version 2.
- [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) - [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)

View File

@@ -1,20 +1,24 @@
Adminer AdminerNeo
======= ==========
**Adminer** is a full-featured database management tool written in PHP. It consists of a single file ready to deploy to **AdminerNeo** is a full-featured database management tool written in PHP. It consists of a single file ready to deploy
the target server. As a companion, **Adminer Editor** offers data manipulation for end-users. to the target server. As a companion, **AdminerNeo Editor** offers data manipulation for end-users.
Supported database drivers: Supported database drivers:
- MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, MongoDB - MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, MongoDB
- With plugin: SimpleDB, Elasticsearch (beta), Firebird (alpha), ClickHouse (alpha) - With plugin: SimpleDB, Elasticsearch (beta), Firebird (alpha), ClickHouse (alpha)
AdminerNeo is based on the [Adminer](https://www.adminer.org/) project by Jakub Vrána.
<img src="docs/images/screenshot.webp" width="830px" alt="Screenshot"/>
Requirements Requirements
------------ ------------
- PHP 5.6+ with enabled sessions. - PHP 5.6+ with enabled sessions.
Migration from original Adminer Migration from Adminer
------------------------------- ----------------------
- Remove plugin AdminerTablesFilter (plugins/tables-filter.php). - Remove plugin AdminerTablesFilter (plugins/tables-filter.php).
- If you use complex custom theme, you will probably need to adjust a thing or two. - If you use complex custom theme, you will probably need to adjust a thing or two.
@@ -26,19 +30,19 @@ Please, read also 👉 **[What to expect](#what-to-expect)** section before you
Usage Usage
----- -----
Download one for the latest [release files](https://github.com/pematon/adminer/releases), upload to the HTTP server Download one for the latest [release files](https://github.com/adminerneo/adminerneo/releases), upload to the HTTP server
with PHP and enjoy 😉 If you are not satisfied with any combination of the database driver and language, you can with PHP and enjoy 😉 If you are not satisfied with any combination of the database driver and language, you can
download the source code and compile your own Adminer: download the source code and compile your own AdminerNeo:
- Download the source code. - Download the source code.
- Run `composer install` to install dependencies. - Run `composer install` to install dependencies.
- Run compile.php: - Run compile.php:
```shell ```shell
# Adminer # AdminerNeo
php compile.php <drivers> <languages> php compile.php <drivers> <languages>
# Editor # AdminerNeo Editor
php compile.php editor <drivers> <languages> php compile.php editor <drivers> <languages>
``` ```
@@ -48,14 +52,14 @@ php compile.php pgsql cs
php compile.php mysql,pgsql en,de,cs,sk php compile.php mysql,pgsql en,de,cs,sk
``` ```
[Available drivers](https://github.com/pematon/adminer/tree/master/adminer/drivers), [Available drivers](https://github.com/adminerneo/adminerneo/tree/main/adminer/drivers),
[languages](https://github.com/pematon/adminer/tree/master/adminer/lang). [languages](https://github.com/adminerneo/adminerneo/tree/main/adminer/lang).
Security Security
-------- --------
Adminer does not allow connecting to databases without a password and it rate-limits the connection attempts to protect AdminerNeo does not allow connecting to databases without a password and it rate-limits the connection attempts to protect
against brute-force attacks. Still, it is highly recommended to 🔒 **restrict access to Adminer** 🔒 by whitelisting IP against brute-force attacks. Still, it is highly recommended to 🔒 **restrict access to AdminerNeo** 🔒 by whitelisting IP
addresses allowed to connect to it, by password-protecting the access in your web server or by enabling security plugins addresses allowed to connect to it, by password-protecting the access in your web server or by enabling security plugins
(e.g. to require an OTP). (e.g. to require an OTP).
@@ -114,19 +118,19 @@ function adminer_object() {
include "./adminer.php"; include "./adminer.php";
``` ```
[Available plugins](https://github.com/pematon/adminer/tree/master/plugins). [Available plugins](https://github.com/adminerneo/adminerneo/tree/main/plugins).
Main project files Main project files
------------------ ------------------
- adminer/index.php - Run development version of Adminer. - adminer/index.php - Run development version of AdminerNeo.
- editor/index.php - Run development version of Adminer Editor. - editor/index.php - Run development version of AdminerNeo Editor.
- editor/example.php - Example customization. - editor/example.php - Example customization.
- plugins/readme.txt - Plugins for Adminer and Adminer Editor. - plugins/readme.txt - Plugins for AdminerNeo and AdminerNeo Editor.
- adminer/plugin.php - Plugin demo. - adminer/plugin.php - Plugin demo.
- adminer/sqlite.php - Development version of Adminer with SQLite allowed. - adminer/sqlite.php - Development version of AdminerNeo with SQLite allowed.
- editor/sqlite.php - Development version of Editor with SQLite allowed. - editor/sqlite.php - Development version of Editor with SQLite allowed.
- adminer/designs.php - Development version of Adminer with adminer.css switcher. - adminer/designs.php - Development version of AdminerNeo with adminer.css switcher.
- compile.php - Create a single file version. - compile.php - Create a single file version.
- lang.php - Update translations. - lang.php - Update translations.
- tests/katalon.html - Katalon Automation Recorder test suite. - tests/katalon.html - Katalon Automation Recorder test suite.
@@ -134,7 +138,7 @@ Main project files
Project history Project history
--------------- ---------------
Adminer was originally developed by Jakub Vrana, and it can be still found on [official pages](https://www.adminer.org/). Adminer was originally developed by Jakub Vrána, and it can be still found on [official pages](https://www.adminer.org/).
Unfortunately, it is not maintained for several years. In the meantime, I (@peterpp) created for my company a set of Unfortunately, it is not maintained for several years. In the meantime, I (@peterpp) created for my company a set of
custom plugins, modern theme, fixed some bugs and practically rewrote the Elasticsearch driver. I also looked closely custom plugins, modern theme, fixed some bugs and practically rewrote the Elasticsearch driver. I also looked closely
and contributed to the [AdminerEvo](https://www.adminerevo.org/) project that looked promising. However, I finally and contributed to the [AdminerEvo](https://www.adminerevo.org/) project that looked promising. However, I finally
@@ -144,7 +148,7 @@ What to expect
-------------- --------------
Our top priority is fixing the security issues and reported bugs. But we really want to move forward and transform Our top priority is fixing the security issues and reported bugs. But we really want to move forward and transform
Adminer to a tool that will keep its simplicity, yet looks much better, is even easier to use and can be configured AdminerNeo to a tool that will keep its simplicity, yet looks much better, is even easier to use and can be configured
without requirement of additional plugins. without requirement of additional plugins.
### Version 4.x ### Version 4.x
@@ -154,7 +158,7 @@ UI improvements.
### Version 5 ### Version 5
Bridges will be burned 🔥🔥🔥. It's in development already, so you [can check](https://github.com/pematon/adminer/tree/version-5) Bridges will be burned 🔥🔥🔥. It's in development already, so you [can check](https://github.com/adminerneo/adminerneo/tree/version-5)
what's going on. Or you can become the early adopter and help us with testing 😉 what's going on. Or you can become the early adopter and help us with testing 😉
Our goals are: Our goals are:
@@ -165,6 +169,3 @@ support dark mode, configurable color variants for production/devel environment.
- **Plugins** - Integrate several basic plugins, enable them by optional configuration. - **Plugins** - Integrate several basic plugins, enable them by optional configuration.
- **Codebase** - Prefer code readability before minimalism, use PER coding style, add namespaces. - **Codebase** - Prefer code readability before minimalism, use PER coding style, add namespaces.
- **Compilation** - Allow to export selected drivers, themes, languages and plugins into a single adminer.php file. - **Compilation** - Allow to export selected drivers, themes, languages and plugins into a single adminer.php file.
We are also thinking to change the project's name, so people will clearly distinguish between original Adminer and
other forks. Any suggestions are welcome.

View File

@@ -1,7 +1,7 @@
Reporting security issues Reporting security issues
========================= =========================
To report a security issue, please [open a draft security advisory](https://github.com/pematon/adminer/security/advisories). To report a security issue, please [open a draft security advisory](https://github.com/adminerneo/adminerneo/security/advisories).
Security issues are handled with top priority. Once acknowledged, a fix should be available and new version released Security issues are handled with top priority. Once acknowledged, a fix should be available and new version released
as soon as possible. Security advisories will be made public after a fix and new version have been released, as soon as possible. Security advisories will be made public after a fix and new version have been released,

View File

@@ -642,8 +642,17 @@ if (isset($_GET["mysql"])) {
* @return array * @return array
*/ */
function collations() { function collations() {
global $connection;
$return = array(); $return = array();
foreach (get_rows("SHOW COLLATION") as $row) {
// Since MariaDB 10.10, one collation can be compatible with more character sets, so collations no longer have unique IDs.
// All combinations can be selected from information_schema.COLLATION_CHARACTER_SET_APPLICABILITY table.
$query = min_version('', '10.10', $connection) ?
"SELECT CHARACTER_SET_NAME AS Charset, FULL_COLLATION_NAME AS Collation, IS_DEFAULT AS `Default` FROM information_schema.COLLATION_CHARACTER_SET_APPLICABILITY" :
"SHOW COLLATION";
foreach (get_rows($query) as $row) {
if ($row["Default"]) { if ($row["Default"]) {
$return[$row["Charset"]][-1] = $row["Collation"]; $return[$row["Charset"]][-1] = $row["Collation"];
} else { } else {
@@ -651,9 +660,11 @@ if (isset($_GET["mysql"])) {
} }
} }
ksort($return); ksort($return);
foreach ($return as $key => $val) { foreach ($return as $key => $val) {
asort($return[$key]); asort($return[$key]);
} }
return $return; return $return;
} }

View File

@@ -71,6 +71,11 @@ if (isset($_GET["pgsql"])) {
} }
function query($query, $unbuffered = false) { function query($query, $unbuffered = false) {
if (!$this->_link) {
$this->error = "Invalid connection";
return false;
}
$result = @pg_query($this->_link, $query); $result = @pg_query($this->_link, $query);
$this->error = ""; $this->error = "";
if (!$result) { if (!$result) {
@@ -497,12 +502,17 @@ ORDER BY connamespace, conname") as $row) {
function drop_databases($databases) { function drop_databases($databases) {
global $connection; global $connection;
$connection->close(); $connection->close();
return apply_queries("DROP DATABASE", $databases, 'idf_escape'); return apply_queries("DROP DATABASE", $databases, 'idf_escape');
} }
function rename_database($name, $collation) { function rename_database($name, $collation) {
//! current database cannot be renamed global $connection;
$connection->close();
return queries("ALTER DATABASE " . idf_escape(DB) . " RENAME TO " . idf_escape($name)); return queries("ALTER DATABASE " . idf_escape(DB) . " RENAME TO " . idf_escape($name));
} }
@@ -776,8 +786,6 @@ AND typelem = 0"
} }
function create_sql($table, $auto_increment, $style) { function create_sql($table, $auto_increment, $style) {
global $connection;
$return = '';
$return_parts = array(); $return_parts = array();
$sequences = array(); $sequences = array();
@@ -812,8 +820,11 @@ AND typelem = 0"
: "SELECT * FROM $sequence_name" : "SELECT * FROM $sequence_name"
); );
$sq = reset($rows); $sq = reset($rows);
$sequences[] = ($style == "DROP+CREATE" ? "DROP SEQUENCE IF EXISTS $sequence_name;\n" : "")
. "CREATE SEQUENCE $sequence_name INCREMENT $sq[increment_by] MINVALUE $sq[min_value] MAXVALUE $sq[max_value]" . ($auto_increment && $sq['last_value'] ? " START $sq[last_value]" : "") . " CACHE $sq[cache_value];"; $sequences[] = ($style == "DROP+CREATE" ? "DROP SEQUENCE IF EXISTS $sequence_name;\n" : "") .
"CREATE SEQUENCE $sequence_name INCREMENT $sq[increment_by] MINVALUE $sq[min_value] MAXVALUE $sq[max_value]" .
($auto_increment && $sq['last_value'] ? " START " . ($sq["last_value"] + 1) : "") .
" CACHE $sq[cache_value];";
} }
} }

View File

@@ -13,7 +13,7 @@ class Adminer {
* @return string HTML code * @return string HTML code
*/ */
function name() { function name() {
return "<a id='h1' href='" . h(HOME_URL) . "'>Adminer</a>"; return "<a id='h1' href='" . h(HOME_URL) . "'>AdminerNeo</a>";
} }
/** Connection parameters /** Connection parameters
@@ -1046,7 +1046,7 @@ class Adminer {
<?php if ($missing != "auth"): ?> <?php if ($missing != "auth"): ?>
<span class="version"> <span class="version">
<?php echo $VERSION; ?> <?php echo $VERSION; ?>
<a href="https://github.com/pematon/adminer/releases"<?php echo target_blank(); ?> id="version"> <a href="https://github.com/adminerneo/adminerneo/releases"<?php echo target_blank(); ?> id="version">
<?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?> <?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?>
</a> </a>
</span> </span>

View File

@@ -143,7 +143,7 @@ function csp() {
[ [
// 'self' is a fallback for browsers not supporting 'strict-dynamic', 'unsafe-inline' is a fallback for browsers not supporting 'nonce-' // 'self' is a fallback for browsers not supporting 'strict-dynamic', 'unsafe-inline' is a fallback for browsers not supporting 'nonce-'
"script-src" => "'self' 'unsafe-inline' 'nonce-" . get_nonce() . "' 'strict-dynamic'", "script-src" => "'self' 'unsafe-inline' 'nonce-" . get_nonce() . "' 'strict-dynamic'",
"connect-src" => "'self' https://api.github.com/repos/pematon/adminer/releases/latest", "connect-src" => "'self' https://api.github.com/repos/adminerneo/adminerneo/releases/latest",
"frame-src" => "'self'", "frame-src" => "'self'",
"object-src" => "'none'", "object-src" => "'none'",
"base-uri" => "'none'", "base-uri" => "'none'",

View File

@@ -156,14 +156,14 @@ if (isset($_POST["lang"]) && verify_token()) { // $error not yet available
} }
$available_languages = get_available_languages(); $available_languages = get_available_languages();
$LANG = $available_languages[0]; $LANG = array_keys($available_languages)[0];
if (isset($available_languages[$_COOKIE["adminer_lang"]])) { if (isset($_COOKIE["adminer_lang"]) && isset($available_languages[$_COOKIE["adminer_lang"]])) {
cookie("adminer_lang", $_COOKIE["adminer_lang"]); cookie("adminer_lang", $_COOKIE["adminer_lang"]);
$LANG = $_COOKIE["adminer_lang"]; $LANG = $_COOKIE["adminer_lang"];
} elseif (isset($available_languages[$_SESSION["lang"]])) { } elseif (isset($available_languages[$_SESSION["lang"]])) {
$LANG = $_SESSION["lang"]; $LANG = $_SESSION["lang"];
} else { } elseif (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])) {
$accept_language = []; $accept_language = [];
preg_match_all('~([-a-z]+)(;q=([0-9.]+))?~', str_replace("_", "-", strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"])), $matches, PREG_SET_ORDER); preg_match_all('~([-a-z]+)(;q=([0-9.]+))?~', str_replace("_", "-", strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"])), $matches, PREG_SET_ORDER);
foreach ($matches as $match) { foreach ($matches as $match) {

View File

@@ -1,2 +1,2 @@
<?php <?php
$VERSION = "4.13"; $VERSION = "4.14";

View File

@@ -1,8 +1,8 @@
<?php <?php
/** /**
* Adminer - Database management in a single PHP file * AdminerNeo - Database management in a single PHP file
* *
* @link https://github.com/pematon/adminer * @link https://github.com/adminerneo/adminerneo
* @author Jakub Vrana (https://www.vrana.cz/) * @author Jakub Vrana (https://www.vrana.cz/)
* @author Peter Knut * @author Peter Knut
* @copyright 2007-2021 Jakub Vrana, 2024 Peter Knut * @copyright 2007-2021 Jakub Vrana, 2024 Peter Knut

View File

@@ -548,7 +548,7 @@ function foreignAddRow() {
this.onchange = function () { }; this.onchange = function () { };
var selects = qsa('select', row); var selects = qsa('select', row);
for (var i=0; i < selects.length; i++) { for (var i=0; i < selects.length; i++) {
selects[i].name = selects[i].name.replace(']', '1]'); selects[i].name = selects[i].name.replace(/\d+]/, '1$&');
selects[i].selectedIndex = 0; selects[i].selectedIndex = 0;
} }
parentTag(this, 'table').appendChild(row); parentTag(this, 'table').appendChild(row);

View File

@@ -106,7 +106,7 @@ function verifyVersion(baseUrl, token) {
// Dummy value to prevent repeated verifications after AJAX failure. // Dummy value to prevent repeated verifications after AJAX failure.
cookie('adminer_version=0', 1); cookie('adminer_version=0', 1);
ajax('https://api.github.com/repos/pematon/adminer/releases/latest', (request) => { ajax('https://api.github.com/repos/adminerneo/adminerneo/releases/latest', (request) => {
const response = JSON.parse(request.responseText); const response = JSON.parse(request.responseText);
const version = response.tag_name.replace(/^\D*/, ''); const version = response.tag_name.replace(/^\D*/, '');
@@ -528,7 +528,7 @@ function selectSearchSearch() {
// Sorting. // Sorting.
(function() { (function() {
let placeholderRow = null, nextRow = null, dragHelper = null; let placeholderRow = null, nextRow = null, dragHelper = null;
let startY, minY, maxY; let startScrollY, startY, minY, maxY, lastPointerY;
/** /**
* Initializes sortable list of DIV elements. * Initializes sortable list of DIV elements.
@@ -569,6 +569,7 @@ function selectSearchSearch() {
const pointerY = getPointerY(event); const pointerY = getPointerY(event);
const parent = row.parentNode; const parent = row.parentNode;
startScrollY = window.scrollY;
startY = pointerY - getOffsetTop(row); startY = pointerY - getOffsetTop(row);
minY = getOffsetTop(parent); minY = getOffsetTop(parent);
maxY = minY + parent.offsetHeight - row.offsetHeight; maxY = minY + parent.offsetHeight - row.offsetHeight;
@@ -612,6 +613,7 @@ function selectSearchSearch() {
window.addEventListener("mousemove", updateSorting); window.addEventListener("mousemove", updateSorting);
window.addEventListener("touchmove", updateSorting); window.addEventListener("touchmove", updateSorting);
window.addEventListener("scroll", updateSorting);
window.addEventListener("mouseup", finishSorting); window.addEventListener("mouseup", finishSorting);
window.addEventListener("touchend", finishSorting); window.addEventListener("touchend", finishSorting);
@@ -620,27 +622,51 @@ function selectSearchSearch() {
function updateSorting(event) { function updateSorting(event) {
const pointerY = getPointerY(event); const pointerY = getPointerY(event);
const scrollingBoundary = 30;
const speedCoefficient = 8;
let top = Math.min(Math.max(pointerY - startY, minY), maxY); // If mouse pointer is over the top boundary, scroll page down.
dragHelper.style.top = `${top}px`; let distance = pointerY - scrollingBoundary;
if (distance < 0 && window.scrollY > 0) {
const parent = placeholderRow.parentNode; window.scrollBy(0, distance / speedCoefficient);
top = top - minY + parent.offsetTop; return;
let sibling;
if (top > placeholderRow.offsetTop + placeholderRow.offsetHeight / 2) {
sibling = !nextRow.classList.contains("no-sort") ? nextRow.nextElementSibling : nextRow;
} else if (top + placeholderRow.offsetHeight < placeholderRow.offsetTop + placeholderRow.offsetHeight / 2) {
sibling = placeholderRow.previousElementSibling;
} else {
sibling = nextRow;
} }
if (sibling !== nextRow) { // If mouse pointer is under the bottom boundary, scroll page up.
const parent = placeholderRow.parentNode; distance = pointerY - window.innerHeight + scrollingBoundary;
if (distance > 0 && window.scrollY + window.innerHeight < document.documentElement.scrollHeight) {
window.scrollBy(0, distance / speedCoefficient);
return;
}
nextRow = sibling; // Move helper row to the pointer position.
if (sibling) { let top = Math.min(Math.max(pointerY - startY + window.scrollY - startScrollY, minY), maxY);
dragHelper.style.top = `${top}px`;
// Find a new position for the placeholder.
const parent = placeholderRow.parentNode;
let oldNextRow = nextRow;
top = top - minY + parent.offsetTop;
let testingRow = placeholderRow;
do {
if (top > testingRow.offsetTop + testingRow.offsetHeight / 2 + 1) {
if (!nextRow.classList.contains("no-sort")) {
testingRow = nextRow;
nextRow = nextRow.nextElementSibling;
} else {
break;
}
} else if (top + testingRow.offsetHeight < testingRow.offsetTop + testingRow.offsetHeight / 2 - 1) {
nextRow = testingRow = testingRow.previousElementSibling;
} else {
break;
}
} while (nextRow);
// Move the placeholder to a new position.
if (nextRow !== oldNextRow) {
if (nextRow) {
parent.insertBefore(placeholderRow, nextRow); parent.insertBefore(placeholderRow, nextRow);
} else { } else {
parent.appendChild(placeholderRow); parent.appendChild(placeholderRow);
@@ -661,6 +687,7 @@ function selectSearchSearch() {
window.removeEventListener("mousemove", updateSorting); window.removeEventListener("mousemove", updateSorting);
window.removeEventListener("touchmove", updateSorting); window.removeEventListener("touchmove", updateSorting);
window.removeEventListener("scroll", updateSorting);
window.removeEventListener("mouseup", finishSorting); window.removeEventListener("mouseup", finishSorting);
window.removeEventListener("touchend", finishSorting); window.removeEventListener("touchend", finishSorting);
@@ -670,10 +697,12 @@ function selectSearchSearch() {
function getPointerY(event) { function getPointerY(event) {
if (event.type.includes("touch")) { if (event.type.includes("touch")) {
const touch = event.touches[0] || event.changedTouches[0]; const touch = event.touches[0] || event.changedTouches[0];
return touch.clientY; lastPointerY = touch.clientY;
} else { } else if (event.clientY !== undefined) {
return event.clientY; lastPointerY = event.clientY;
} }
return lastPointerY;
} }
})(); })();

View File

@@ -520,8 +520,8 @@ $file = preg_replace('~"\.\./vendor/vrana/jush/modules/(jush\.js)"~', $replace,
$file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file); $file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file);
$file = php_shrink($file); $file = php_shrink($file);
@mkdir("temp", 0777, true); @mkdir("export", 0777, true);
$filename = "temp/$project" $filename = "export/$project"
. (is_dev_version() ? "" : "-$VERSION") . (is_dev_version() ? "" : "-$VERSION")
. ($single_driver ? "-$single_driver" : "") . ($single_driver ? "-$single_driver" : "")
. ($single_language ? "-$single_language" : "") . ($single_language ? "-$single_language" : "")

View File

@@ -1,22 +1,22 @@
{ {
"name": "pematon/adminer", "name": "adminerneo/adminerneo",
"description": "Database management in a single PHP file.", "description": "Database management in a single PHP file.",
"homepage": "https://github.com/pematon/adminer", "homepage": "https://github.com/adminerneo/adminerneo",
"keywords": [ "keywords": [
"database" "database"
], ],
"support": { "support": {
"issues": "https://github.com/pematon/adminer/issues", "issues": "https://github.com/adminerneo/adminerneo/issues",
"forum": "https://github.com/pematon/adminer/discussions", "forum": "https://github.com/adminerneo/adminerneo/discussions",
"source": "https://github.com/pematon/adminer" "source": "https://github.com/adminerneo/adminerneo"
}, },
"authors": [ "authors": [
{ {
"name": "Jakub Vrána", "name": "Peter Knut"
"homepage": "https://www.vrana.cz/"
}, },
{ {
"name": "Peter Knut" "name": "Jakub Vrána",
"homepage": "https://www.vrana.cz/"
} }
], ],
"autoload": { "autoload": {
@@ -61,11 +61,11 @@
"repositories": [ "repositories": [
{ {
"type": "vcs", "type": "vcs",
"url": "https://github.com/pematon/jush.git" "url": "https://github.com/peterpp/jush.git"
}, },
{ {
"type": "vcs", "type": "vcs",
"url": "https://github.com/vrana/jsshrink.git" "url": "https://github.com/peterpp/js-shrink.git"
} }
] ]
} }

View File

@@ -535,7 +535,7 @@ input[type="file"]::-ms-browse {
background: #4c3957; background: #4c3957;
color: #fff; color: #fff;
padding: 0.5em 0.8em 0.6em; padding: 0.5em 0.8em 0.6em;
margin: 0; margin: 0 0.5em;
border-style: none; border-style: none;
cursor: pointer; cursor: pointer;
} }
@@ -557,7 +557,7 @@ input[type="file"]::-webkit-file-upload-button {
background: #4c3957; background: #4c3957;
color: #fff; color: #fff;
padding: 0.5em 0.8em 0.6em; padding: 0.5em 0.8em 0.6em;
margin: 0; margin: 0 0.5em;
border-style: none; border-style: none;
cursor: pointer; cursor: pointer;
} }
@@ -571,24 +571,24 @@ input[type="file"]:disabled::-webkit-file-upload-button {
background-color: rgba(76, 57, 87, 0.35); background-color: rgba(76, 57, 87, 0.35);
cursor: not-allowed; cursor: not-allowed;
} }
input[type="file"]::-moz-file-upload-button { input[type="file"]::file-selector-button {
display: inline-block; display: inline-block;
font-size: 85%; font-size: 85%;
text-align: center; text-align: center;
background: #4c3957; background: #4c3957;
color: #fff; color: #fff;
padding: 0.5em 0.8em 0.6em; padding: 0.5em 0.8em 0.6em;
margin: 0; margin: 0 0.5em;
border-style: none; border-style: none;
cursor: pointer; cursor: pointer;
} }
input[type="file"]:hover::-moz-file-upload-button, input[type="file"]:hover::file-selector-button,
input[type="file"]:focus::-moz-file-upload-button { input[type="file"]:focus::file-selector-button {
color: #fff; color: #fff;
background: #ec5f12; background: #ec5f12;
text-decoration: none; text-decoration: none;
} }
input[type="file"]:disabled::-moz-file-upload-button { input[type="file"]:disabled::file-selector-button {
background-color: rgba(76, 57, 87, 0.35); background-color: rgba(76, 57, 87, 0.35);
cursor: not-allowed; cursor: not-allowed;
} }

BIN
docs/images/screenshot.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@@ -608,7 +608,7 @@ qsl('div').onclick = whisperClick;", "")
<?php if ($missing != "auth"): ?> <?php if ($missing != "auth"): ?>
<span class="version"> <span class="version">
<?php echo $VERSION; ?> <?php echo $VERSION; ?>
<a href="https://github.com/pematon/adminer/releases"<?php echo target_blank(); ?> id="version"> <a href="https://github.com/adminerneo/adminerneo/releases"<?php echo target_blank(); ?> id="version">
<?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?> <?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?>
</a> </a>
</span> </span>

View File

@@ -1,8 +1,8 @@
<?php <?php
/** /**
* Adminer Editor - Compact database editor for end-users * AdminerNeo Editor - Compact database editor for end-users
* *
* @link https://github.com/pematon/adminer * @link https://github.com/adminerneo/adminerneo
* @author Jakub Vrana (https://www.vrana.cz/) * @author Jakub Vrana (https://www.vrana.cz/)
* @author Peter Knut * @author Peter Knut
* @copyright 2009-2021 Jakub Vrana, 2024 Peter Knut * @copyright 2009-2021 Jakub Vrana, 2024 Peter Knut

BIN
logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB