Compare commits

..

4 Commits

Author SHA1 Message Date
kim8ccf3a4116ec4691
36739aed39
Translated using Weblate (Korean)
Currently translated at 100.0% (3436 of 3436 strings)

[ci skip]

Translation: phpMyAdmin/5.2
Translate-URL: https://hosted.weblate.org/projects/phpmyadmin/5-2/ko/
Signed-off-by: kim8ccf3a4116ec4691 <kim@yong.biz>
2026-06-14 16:01:21 +00:00
ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝)
ef8709bb5e
Translated using Weblate (Latvian)
Currently translated at 30.7% (1055 of 3436 strings)

[ci skip]

Translation: phpMyAdmin/5.2
Translate-URL: https://hosted.weblate.org/projects/phpmyadmin/5-2/lv/
Signed-off-by: "ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝)" <coool@mail.lv>
2026-06-14 16:01:18 +00:00
Maurício Meneghini Fauth
df75f5a733
Merge pull request #20331 from MauricioFauth/twig-security
Allow twig/twig 3.27.0 to be installed by Composer
2026-06-12 20:12:37 -03:00
Maurício Meneghini Fauth
7aaf939b72
Allow twig/twig 3.27 to be installed by Composer
None of the advisories affects phpMyAdmin.

Signed-off-by: Maurício Meneghini Fauth <mauricio@mfauth.com.br>
2026-06-12 19:20:55 -03:00
4385 changed files with 2403377 additions and 2310652 deletions

View File

@ -13,12 +13,8 @@ indent_size = 4
[{*.{sql,scss,css,twig,yml},package.json}]
indent_size = 2
[*.svg]
[*.twig]
insert_final_newline = false
[tests/test_data/*]
[test/test_data/*]
insert_final_newline = false
[tests/unit/**/Fixtures/*.html]
insert_final_newline = false
trim_trailing_whitespace = false

View File

@ -1,4 +1,4 @@
public/js/
js/vendor/
js/dist/
tmp/
vendor/
webpack.config.cjs

View File

@ -1,28 +1,41 @@
{
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
"plugin:no-jquery/deprecated",
"plugin:compat/recommended"
],
"parser": "@typescript-eslint/parser",
"plugins": [ "@typescript-eslint", "no-jquery" ],
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module"
},
"plugins": ["no-jquery"],
"env": {
"browser": true,
"es6": true
"es6": true,
"jquery": true
},
"globals": {
"AJAX": "readonly",
"bootstrap": "readonly",
"CodeMirror": "readonly",
"CommonActions": "readonly",
"CommonParams": "readonly",
"Cookies": "readonly",
"Functions": "readonly",
"Messages": "readonly",
"Navigation": "readonly",
"OpenLayers": "readonly",
"Sql": "readonly"
},
"rules": {
"valid-jsdoc": ["error", {
"prefer": {
"returns": "return"
},
"requireReturn": false,
"requireParamType": false,
"requireReturnDescription": false,
"requireParamDescription": false
}],
"array-bracket-spacing": "error",
"array-bracket-newline": ["error", { "multiline": true }],
"array-element-newline": ["error", "consistent"],
"brace-style": "error",
"camelcase": "error",
"comma-dangle": ["error", "only-multiline"],
"comma-style": ["error", "last"],
"curly": "error",
"dot-notation": "error",
@ -30,7 +43,6 @@
"eqeqeq": "error",
"indent": ["error", 4],
"keyword-spacing": "error",
"lines-between-class-members": "error",
"new-cap": "error",
"no-array-constructor": "error",
"no-eval": "error",
@ -44,19 +56,9 @@
"no-trailing-spaces": "error",
"no-underscore-dangle": "error",
"no-unneeded-ternary": "error",
"no-var": "off",
"object-curly-spacing": ["error", "always"],
"one-var": ["error", "never"],
"padded-blocks": ["error", "never"],
"padding-line-between-statements": [
"error",
{ "blankLine": "always", "prev": "block-like", "next": "*" },
{ "blankLine": "always", "prev": "multiline-expression", "next": "*" },
{ "blankLine": "always", "prev": "*", "next": "return" }
],
"prefer-const": "off",
"prefer-rest-params": "off",
"prefer-spread": "off",
"quotes": ["error", "single"],
"semi": "error",
"space-before-blocks": "error",
@ -64,11 +66,6 @@
"space-in-parens": "error",
"space-infix-ops": "error",
"spaced-comment": ["error", "always"],
"wrap-iife": "error",
"@typescript-eslint/ban-ts-comment": "off",
"@typescript-eslint/no-empty-function": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/no-this-alias": "off"
"wrap-iife": "error"
}
}

21
.gitattributes vendored
View File

@ -3,7 +3,6 @@
.gitattributes export-ignore
.gitignore export-ignore
.github export-ignore
.phpstorm.meta.php export-ignore
.scrutinizer.yml export-ignore
.jshintrc export-ignore
.stylelintrc.json export-ignore
@ -11,7 +10,7 @@
.eslintignore export-ignore
.weblate export-ignore
codecov.yml export-ignore
infection.json5.dist export-ignore
infection.json.dist export-ignore
phpcs.xml.dist export-ignore
phpstan.neon.dist export-ignore
phpstan-baseline.neon export-ignore
@ -19,16 +18,16 @@ psalm.xml export-ignore
psalm-baseline.xml export-ignore
DCO export-ignore
.editorconfig export-ignore
# Exclude only the following files and not all files in tests/
# Exclude only the following files and not all files in test/
# This is because some packaging teams need our test files but not the CI related files
tests/doctum-config.php export-ignore
tests/bootstrap-static.php export-ignore
tests/config.e2e.inc.php export-ignore
tests/phpstan-constants.php export-ignore
tests/*-local-server export-ignore
tests/*.conf export-ignore
tests/*.ini export-ignore
tests/ci-phplint export-ignore
test/doctum-config.php export-ignore
test/bootstrap-static.php export-ignore
test/config.e2e.inc.php export-ignore
test/phpstan-constants.php export-ignore
test/*-local-server export-ignore
test/*.conf export-ignore
test/*.ini export-ignore
test/ci-phplint export-ignore
.browserslistrc export-ignore
CODE_OF_CONDUCT.md export-ignore
CONTRIBUTING.md export-ignore

View File

@ -14,7 +14,7 @@ build:
# Build documentation in the "doc/" directory with Sphinx
sphinx:
configuration: docs/conf.py
configuration: doc/conf.py
# Fail on all warnings to avoid broken references
# fail_on_warning: true

View File

@ -1,85 +0,0 @@
name: Daily snapshots
on:
pull_request:
paths:
- '.github/workflows/daily-snapshots.yml'
- 'bin/**'
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
permissions:
contents: read
jobs:
generate-snapshots:
name: Generate ${{ matrix.version }} snapshots
runs-on: ubuntu-latest
if: (github.event_name == 'schedule' && github.repository == 'phpmyadmin/phpmyadmin') || (github.event_name != 'schedule')
strategy:
fail-fast: false
matrix:
include:
- { version: '5.2', branch: 'QA_5_2', php-version: '7.2', node-version: '12', python-version: '3.11' }
- { version: '6.0', branch: 'master', php-version: '8.2', node-version: '20', python-version: '3.11' }
steps:
- name: Check out code
uses: actions/checkout@v6
with:
ref: ${{ matrix.branch }}
- name: Install Gettext
run: sudo apt-get install -y gettext
- name: Set up PHP ${{ matrix.php-version }}
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: mbstring, iconv, mysqli, zip, gd
coverage: none
- name: Set up Node ${{ matrix.node-version }}
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
cache: 'yarn'
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install Composer dependencies
uses: ramsey/composer-install@v3
- name: Install Yarn modules
run: yarn install --non-interactive
- name: Install Sphinx for the documentation build
run: pip install 'Sphinx'
- name: Build the release
if: matrix.branch == 'master'
run: ./bin/internal/create-release.sh --daily ${{ matrix.version }}+snapshot ${{ matrix.branch }}
- name: Build the release
if: matrix.branch != 'master'
run: ./scripts/create-release.sh --daily ${{ matrix.version }}+snapshot ${{ matrix.branch }}
- name: Check release excludes
if: matrix.branch == 'master'
run: ./bin/internal/check-release-excludes.sh release/phpMyAdmin-${{ matrix.version }}+snapshot-all-languages.tar.gz
continue-on-error: true
- name: Check release excludes
if: matrix.branch != 'master'
run: ./scripts/check-release-excludes.sh release/phpMyAdmin-${{ matrix.version }}+snapshot-all-languages.tar.gz
continue-on-error: true
- name: Upload snapshots
uses: actions/upload-artifact@v6
with:
name: phpMyAdmin-${{ matrix.version }}-snapshots
path: release/*
retention-days: 1

View File

@ -1,76 +0,0 @@
name: Frontend analysis and tests
on:
push:
pull_request:
paths:
- 'resources/js/**'
- '**.s?css'
- 'tests/javascript/**'
- '.browserslistrc'
- '.eslint*'
- '*.cjs'
- 'package.json'
- 'tsconfig.json'
- 'yarn.lock'
permissions:
contents: read
jobs:
javascript-test:
name: Test JavaScript files
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: '20'
cache: 'yarn'
- name: Install modules
run: yarn install --non-interactive
- name: Run tests
run: yarn test
javascript-lint:
name: Lint JavaScript files
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: '20'
cache: 'yarn'
- name: Install modules
run: yarn install --non-interactive
- name: Lint JavaScript files
run: yarn run js-lint --quiet
css-lint:
name: Lint CSS files
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: '20'
cache: 'yarn'
- name: Install modules
run: yarn install --non-interactive
- name: Lint CSS files
run: yarn run css-lint

View File

@ -12,11 +12,43 @@ permissions:
contents: read
jobs:
lint-node:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: 12
- name: Get Yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Cache Yarn dependencies
uses: actions/cache@v5
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install modules
run: yarn install --non-interactive
- name: Lint JavaScript files
run: yarn run js-lint --quiet
- name: Lint CSS files
run: yarn run css-lint
lint-php-files:
runs-on: ubuntu-latest
strategy:
matrix:
php-version: ["8.2"]
php-version: ["7.2"]
steps:
- name: Checkout code
uses: actions/checkout@v6
@ -34,6 +66,7 @@ jobs:
if: always()
uses: ramsey/composer-install@v3
with:
dependency-versions: highest
# Ignore zip for php-webdriver/webdriver
composer-options: "--ignore-platform-req=ext-zip"
@ -48,7 +81,7 @@ jobs:
- name: Lint PHP files
# Allow the previous check to fail but not abort
if: always()
run: ./tests/ci-phplint
run: ./test/ci-phplint
- name: Check coding-standard
# Allow the previous check to fail but not abort
@ -64,7 +97,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
php-version: ["8.2"]
php-version: ["7.2"]
steps:
- name: Checkout code
uses: actions/checkout@v6
@ -77,6 +110,8 @@ jobs:
- name: Install Composer dependencies
uses: ramsey/composer-install@v3
with:
dependency-versions: highest
- name: Analyse files with PHPStan
run: composer phpstan -- --memory-limit 2G

View File

@ -21,6 +21,6 @@ jobs:
- name: Lint phpdoc blocks
uses: sudo-bot/action-doctum@v5
with:
config-file: tests/doctum-config.php
config-file: test/doctum-config.php
method: "parse"
cli-args: "--output-format=github --no-ansi --no-progress -v --ignore-parse-errors"

View File

@ -1,76 +1,68 @@
# https://docs.github.com/en/actions
name: Mutation tests
on:
push:
branches:
- master
paths:
- 'src/**.php'
- 'tests/unit/**.php'
branches: [master]
pull_request:
branches:
- master
paths:
- 'src/**.php'
- 'tests/unit/**.php'
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
branches: [master]
permissions:
contents: read
jobs:
infection:
name: Infection
tests:
name: Mutation tests with PHP ${{ matrix.php-version }}
runs-on: ${{ matrix.operating-system }}
strategy:
matrix:
php-version:
- "8.2"
operating-system:
- ubuntu-latest
php-version: ["8.1"]
operating-system: [ubuntu-latest]
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 2
- name: Checkout base ref code
if: github.event_name == 'pull_request'
uses: actions/checkout@v6
with:
ref: ${{ github.base_ref }}
- name: Fetch github.base_ref (for diffing)
if: ${{ github.base_ref != '' }}
run: |
git fetch --depth=1 origin +refs/heads/${{ github.base_ref }}:refs/remotes/origin/${{ github.base_ref }}
- name: Install Gettext
run: sudo apt-get install -y gettext
run: |
sudo apt-get install -y gettext
- name: Generate mo files
run: ./bin/generate-mo --quiet
run: ./scripts/generate-mo --quiet
- name: Set up PHP ${{ matrix.php-version }}
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
coverage: pcov
tools: composer:v2, infection:0.27.11
ini-values: memory_limit=-1
tools: composer:v2, infection
- name: Install Composer dependencies
uses: ramsey/composer-install@v3
with:
dependency-versions: highest
- name: Run Infection for changed files only
if: github.event_name == 'push' || github.event_name == 'pull_request'
- name: Collect coverage report
run: |
if [ "$GITHUB_EVENT_NAME" = "push" ]; then \
INFECTION_GIT_DIFF_BASE="origin/$GITHUB_REF_NAME^"; else \
INFECTION_GIT_DIFF_BASE="origin/$GITHUB_BASE_REF"; fi
infection --threads=max --git-diff-lines --git-diff-base="$INFECTION_GIT_DIFF_BASE" \
--logger-github --ignore-msi-with-no-mutations --only-covered --no-interaction --no-progress
composer run phpunit -- --testsuite unit --stop-on-failure
- name: Run Infection for all files
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
- name: Infection
if: ${{ github.base_ref != '' }}
run: |
CHANGED_FILES=$(git diff origin/$GITHUB_BASE_REF --diff-filter=AM --name-only | grep libraries/classes/ | paste -sd "," -);
infection -j$(nproc) --skip-initial-tests --no-interaction --no-progress --coverage=build/logs \
--ignore-msi-with-no-mutations \
--filter=$CHANGED_FILES
env:
INFECTION_BADGE_API_KEY: ${{ secrets.INFECTION_BADGE_API_KEY }}
- name: Infection
if: ${{ github.base_ref == '' }}
run: |
infection -j$(nproc) --skip-initial-tests --no-interaction --no-progress --coverage=build/logs
env:
INFECTION_BADGE_API_KEY: ${{ secrets.INFECTION_BADGE_API_KEY }}
run: infection --threads=max --no-interaction --log-verbosity=none --logger-github=false

View File

@ -24,13 +24,13 @@ jobs:
sudo apt-get install -y sphinx-doc python3-sphinx
- name: Build the documentation
run: make -C docs html SPHINXOPTS='-n -W -a'
run: make -C doc html SPHINXOPTS='-n -W -a'
build-release:
runs-on: ubuntu-latest
strategy:
matrix:
php-version: ["8.2"]
php-version: ["7.2"]
steps:
- name: Checkout code
uses: actions/checkout@v6
@ -47,12 +47,25 @@ jobs:
- name: Install Composer dependencies
uses: ramsey/composer-install@v3
with:
dependency-versions: highest
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: '20'
cache: 'yarn'
node-version: 12
- name: Get Yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Cache Yarn dependencies
uses: actions/cache@v5
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Set up Python
uses: actions/setup-python@v6
@ -63,4 +76,4 @@ jobs:
run: pip install 'Sphinx'
- name: Build the release
run: ./bin/internal/create-release.sh --ci
run: ./scripts/create-release.sh --ci

View File

@ -1,27 +0,0 @@
name: ShellCheck
on:
push:
paths:
- 'bin/**'
pull_request:
paths:
- 'bin/**'
permissions:
contents: read
jobs:
shellcheck:
name: ShellCheck
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Run ShellCheck
uses: reviewdog/action-shellcheck@v1
with:
path: bin
check_all_files_with_shebangs: true
fail_on_error: true

View File

@ -1,24 +0,0 @@
name: "Manage stale PRs/issues"
permissions:
issues: write
on:
schedule:
- cron: "30 1 * * *"
jobs:
run-stale-check:
name: Check for stale PRs/issues
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- uses: actions/stale@v9
with:
days-before-stale: 15
days-before-close: -1
only-issue-labels: "Awaiting Author Updates"
close-issue-message: >
The phpMyAdmin team is awaiting an update on this issue.
Please check that all the questions have been answered.

View File

@ -12,8 +12,8 @@ permissions:
contents: read
env:
php-version: "8.2"
node-version: "20"
php-version: "7.2"
node-version: "12"
jobs:
generate-matrix:
@ -29,7 +29,7 @@ jobs:
name: Send test names to outputs
run: |
set -euo pipefail
TEST_NAMES="[$(find $PWD/tests/end-to-end/ -type f -name '*Test.php' -print |sed -E "s,$PWD/tests/end-to-end/(.*)Test.php,{\"test-name\": \"\1\"}," | paste -sd ",")]"
TEST_NAMES="[$(find $PWD/test/selenium/ -type f -name '*Test.php' -print |sed -E "s,$PWD/test/selenium/(.*)Test.php,{\"test-name\": \"\1\"}," | paste -sd ",")]"
echo "tests=$(printf "$TEST_NAMES")" >> $GITHUB_OUTPUT
selenium:
name: "Selenium"
@ -84,7 +84,7 @@ jobs:
run: sudo apt-get update && sudo apt-get install -y gettext
- name: Generate mo files
run: ./bin/generate-mo --quiet
run: ./scripts/generate-mo --quiet
- name: Set up PHP ${{ env.php-version }}
uses: shivammathur/setup-php@v2
@ -106,7 +106,7 @@ jobs:
run: yarn install --non-interactive --production
- name: Copy the config
run: cp tests/config.e2e.inc.php config.inc.php
run: cp test/config.e2e.inc.php config.inc.php
- name: Start server
env:
@ -116,7 +116,7 @@ jobs:
run: |
sudo chown -R runner:docker /var/lib/nginx/
sudo chown -R runner:docker /var/log/nginx/
./tests/start-local-server
./test/start-local-server
echo "SELENIUM_TEMPDIR=$(cat /tmp/last_temp_dir_phpMyAdminTests)" >> $GITHUB_OUTPUT
id: start-local-server
@ -126,12 +126,12 @@ jobs:
TESTSUITE_SELENIUM_BROWSER: chrome
TESTSUITE_USER: root
TESTSUITE_PASSWORD: testbench
# Port defined in tests/nginx.conf
# Port defined in test/nginx.conf
TESTSUITE_URL: http://docker-host-bridge:8000
TESTSUITE_DATABASE_PREFIX: "selenium"
TESTSUITE_SELENIUM_HOST: "127.0.0.1"
TESTSUITE_SELENIUM_PORT: "4444"
run: ./vendor/bin/phpunit --testsuite end-to-end --no-logging --no-coverage --stop-on-skipped --testdox tests/end-to-end/${{ matrix.test-name }}Test.php
run: ./vendor/bin/phpunit --testsuite selenium --no-logging --no-coverage --stop-on-skipped --testdox test/selenium/${{ matrix.test-name }}Test.php
- name: Output logs and stop server
env:
@ -141,7 +141,7 @@ jobs:
run: |
if [ -f "${SELENIUM_TEMPDIR}/php.log" ] ; then cat "${SELENIUM_TEMPDIR}/php.log" ; fi
if [ -f "${SELENIUM_TEMPDIR}/nginx-error.log" ] ; then cat "${SELENIUM_TEMPDIR}/nginx-error.log" ; fi
./tests/stop-local-server
./test/stop-local-server
- name: Upload screenshots
uses: actions/upload-artifact@v6

View File

@ -20,12 +20,13 @@ jobs:
fail-fast: false
matrix:
include:
- { php-version: '82', experimental: false, arch: 'amd64', exclude-phpunit-groups: '--exclude-group extension-iconv' }
- { php-version: '82', experimental: false, arch: 'arm64/v8', exclude-phpunit-groups: '--exclude-group extension-iconv' }
- { php-version: '82', experimental: false, arch: 'arm/v7', exclude-phpunit-groups: '--exclude-group extension-iconv --exclude-group 32bit-incompatible' }
- { php-version: '82', experimental: false, arch: 'i386', exclude-phpunit-groups: '--exclude-group extension-iconv --exclude-group 32bit-incompatible' }
- { php-version: '82', experimental: true, arch: 'ppc64le', exclude-phpunit-groups: '--exclude-group extension-iconv' }
- { php-version: '82', experimental: false, arch: 's390x', exclude-phpunit-groups: '--exclude-group extension-iconv --exclude-group 32bit-incompatible' }
- { php-version: '8', experimental: false, arch: 'amd64', exclude-phpunit-groups: 'extension-iconv' }
- { php-version: '8', experimental: false, arch: 'arm64v8', exclude-phpunit-groups: 'extension-iconv' }
- { php-version: '8', experimental: false, arch: 'arm32v7', exclude-phpunit-groups: 'extension-iconv,32bit-incompatible' }
- { php-version: '8', experimental: false, arch: 'arm32v6', exclude-phpunit-groups: 'extension-iconv,32bit-incompatible' }
- { php-version: '8', experimental: false, arch: 'i386', exclude-phpunit-groups: 'extension-iconv,32bit-incompatible' }
- { php-version: '8', experimental: true, arch: 'ppc64le', exclude-phpunit-groups: 'extension-iconv' }
- { php-version: '8', experimental: false, arch: 's390x', exclude-phpunit-groups: 'extension-iconv,32bit-incompatible' }
steps:
- name: Checkout code
uses: actions/checkout@v6
@ -40,40 +41,42 @@ jobs:
printf "set -exu && \
export V='%s' && \
apk add --update --no-cache \
php\$V-cli php\$V-mysqli php\$V-session php\$V-mbstring php\$V-ctype php\$V-sodium \
php\$V-cli php\$V-mysqli php\$V-session php\$V-mbstring php\$V-ctype \
php\$V-iconv php\$V-xml php\$V-tokenizer php\$V-xmlwriter php\$V-simplexml \
php\$V-dom php\$V-json php\$V-bz2 php\$V-curl php\$V-gd php\$V-zip php\$V-bcmath \
musl-locales musl-locales-lang \
gettext composer git && \
composer config version "$(php -r "define('VERSION_SUFFIX', ''); require_once('src/Version.php'); echo \PhpMyAdmin\Version::VERSION;")" && \
composer install && \
./bin/generate-mo && \
php\$V -d memory_limit=512M ./vendor/bin/phpunit --no-logging --no-coverage --testsuite unit %s" \
composer config version "$(php -r "define('VERSION_SUFFIX', ''); require_once('libraries/classes/Version.php'); echo \PhpMyAdmin\Version::VERSION;")" && \
composer update && \
./scripts/generate-mo && \
php\$V -d memory_limit=512M ./vendor/bin/phpunit --no-coverage --testsuite unit --exclude-group=%s" \
"${{ matrix.php-version }}" "${{ matrix.exclude-phpunit-groups }}" > ./do-tests.sh
- name: Set up multi arch support
run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- name: Print arch
run: docker run --rm --platform linux/${{ matrix.arch }} alpine:3.19 uname -a
run: docker run --rm ${{ matrix.arch }}/alpine:3.15 uname -a
- name: Run tests on php ${{ matrix.php-version }}
run: docker run -v $PWD:/app --workdir /app --rm --platform linux/${{ matrix.arch }} alpine:3.19 sh /app/do-tests.sh
run: docker run -v $PWD:/app --workdir /app --rm ${{ matrix.arch }}/alpine:3.15 sh /app/do-tests.sh
test-php:
name: Test on PHP ${{ matrix.php-version }}, ${{ matrix.composer-dependency }} and ${{ matrix.os }}
name: Test on PHP ${{ matrix.php-version }} and ${{ matrix.os }}
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.php-version == '8.5' }}
continue-on-error: ${{ matrix.experimental }}
strategy:
matrix:
php-version: ['8.2', '8.3', '8.4']
php-version: ['7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4']
experimental: [false]
os: [ubuntu-latest]
composer-dependency: [locked, highest]
phpunit-options: ['--testsuite unit']
php-extensions: ['mbstring, iconv, mysqli, zip, gd, bz2']
include:
- php-version: '8.5'
experimental: true
os: ubuntu-latest
composer-dependency: locked
phpunit-options: '--configuration test/phpunit-php-nightly.xml'
composer-options: '--ignore-platform-req=php+'
php-extensions: 'mbstring, iconv, mysqli, zip, bz2'
steps:
@ -87,7 +90,7 @@ jobs:
run: sudo apt-get install -y gettext
- name: Generate mo files
run: ./bin/generate-mo --quiet
run: ./scripts/generate-mo --quiet
- name: Set up PHP ${{ matrix.php-version }}
uses: shivammathur/setup-php@v2
@ -99,11 +102,11 @@ jobs:
- name: Install Composer dependencies
uses: ramsey/composer-install@v3
with:
dependency-versions: ${{ matrix.composer-dependency }}
dependency-versions: highest
composer-options: ${{ matrix.composer-options }}
- name: Run PHP tests
run: composer run phpunit -- --testsuite unit --display-deprecations --display-notices --display-warnings --display-errors
run: composer run phpunit -- ${{ matrix.phpunit-options }}
- name: Send coverage
uses: codecov/codecov-action@v3
@ -134,9 +137,9 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
php-version: ["8.2"]
php-version: ["7.2"]
os: [ubuntu-latest]
extension: ["dbase"]
extension: ["dbase", "recode"]
steps:
- name: Checkout code
uses: actions/checkout@v6
@ -148,7 +151,7 @@ jobs:
run: sudo apt-get install -y gettext
- name: Generate mo files
run: ./bin/generate-mo --quiet
run: ./scripts/generate-mo --quiet
- name: Set up PHP ${{ matrix.php-version }}
uses: shivammathur/setup-php@v2
@ -159,6 +162,8 @@ jobs:
- name: Install Composer dependencies
uses: ramsey/composer-install@v3
with:
dependency-versions: highest
- name: Run PHP tests
run: composer run phpunit -- --testsuite unit
@ -167,7 +172,7 @@ jobs:
uses: codecov/codecov-action@v3
with:
flags: ${{ matrix.extension }}-extension
name: php-${{ matrix.php-version }}-${{ matrix.extension }}-enabled
name: php-7.2-${{ matrix.extension }}-enabled
- name: Send coverage to Scrutinizer
uses: sudo-bot/action-scrutinizer@latest
@ -186,3 +191,103 @@ jobs:
with:
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
coverage-reports: build/logs/clover.xml
test-php-psr7-implementations:
name: Test on PHP ${{ matrix.php-version }} (+ psr7-${{ matrix.psr-7-library }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php-version: ['7.2']
php-extensions: ['mbstring, iconv, mysqli, zip, bz2']
psr-7-library: ['guzzlehttp/psr7', 'slim/psr7', 'nyholm/psr7']
include:
# See: https://github.com/laminas/laminas-diactoros/releases/tag/2.18.0
- {psr-7-library: 'laminas/laminas-diactoros', php-version: '8.0'}
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
# Fetch some commits for Scrutinizer coverage upload
fetch-depth: 15
- name: Install gettext
run: sudo apt-get install -y gettext
- name: Generate mo files
run: ./scripts/generate-mo --quiet
- name: Set up PHP ${{ matrix.php-version }}
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: ${{ matrix.php-extensions }}
coverage: pcov
- name: Install Composer dependencies
uses: ramsey/composer-install@v3
with:
dependency-versions: highest
- name: Remove default PSR-7 implementation
run: composer remove slim/psr7
- name: Add PSR-7 implementation
run: composer require ${{ matrix.psr-7-library }}
- name: Run PHP tests
run: composer run phpunit -- --testsuite unit
- name: Send coverage
uses: codecov/codecov-action@v3
with:
flags: ${{ matrix.psr-7-library }}-psr-7
name: php-7.2-psr-7
- name: Send coverage to Scrutinizer
uses: sudo-bot/action-scrutinizer@latest
# Do not run this step on forked versions of the main repository (example: contributor forks)
if: github.repository == 'phpmyadmin/phpmyadmin'
continue-on-error: true
with:
cli-args: "--format=php-clover build/logs/clover.xml --revision=${{ github.event.pull_request.head.sha || github.sha }}"
- name: Send coverage to Codacy
uses: codacy/codacy-coverage-reporter-action@v1
# Do not run this step on forked versions of the main repository (example: contributor forks)
if: github.repository == 'phpmyadmin/phpmyadmin'
# Upload can fail on forks or if the secret is missing
continue-on-error: true
with:
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
coverage-reports: build/logs/clover.xml
test-js:
name: Test javascript files
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: 12
- name: Get Yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Cache Yarn dependencies
uses: actions/cache@v5
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install modules
run: yarn install --non-interactive
- name: Run tests
run: yarn test

View File

@ -18,7 +18,7 @@ jobs:
if: (github.event_name == 'schedule' && github.repository == 'phpmyadmin/phpmyadmin') || (github.event_name != 'schedule')
strategy:
matrix:
php-version: ["8.2"]
php-version: ["8.1"]
steps:
- name: Checkout code
uses: actions/checkout@v6
@ -35,6 +35,8 @@ jobs:
- name: Install Composer dependencies
uses: ramsey/composer-install@v3
with:
dependency-versions: highest
- name: Set up git config
run: |
@ -43,7 +45,7 @@ jobs:
- name: Update PO files
run: |
./bin/update-po
./scripts/update-po
- name: Push changes
run: |

68
.gitignore vendored
View File

@ -1,22 +1,17 @@
# Directory for creating releases
/release/
# Configuration files
/config.inc.php
/config.header.inc.php
/config.footer.inc.php
# Upload/save dirs
/upload/
/save/
/tmp/
# For setup script
/config/
# ctags
tags
# Editor files
phpmyadmin.wpj
.projectOptions
@ -29,86 +24,47 @@ phpmyadmin.wpj
.netbeans
.vscode
*.sw[op]
# Web server files
web.config
.htaccess
# Locales
/locale/
/resources/locale/
# Temporary files to generate locales for Twig
/twig-templates/
# Backups
*~
# API documentation
/apidoc/
/docs/_build
/docs/doctrees
/docs/html
/docs/linkcheck/
/docs/locale
/docs/**/*.pyc
/doc/linkcheck/
# Demo server
revision-info.php
# PHP_CodeSniffer
phpcs.xml
.phpcs-cache
# PHPUnit
.phpunit.result.cache
phpunit.xml
/tests/bootstrap.php
/tests/gis/*-actual.json
/tests/gis/*-actual.pdf
/tests/gis/*-actual.png
/tests/gis/*-actual.svg
/test/bootstrap.php
.phpunit.result.cache
# Jenkins
/build/
# Netbeans ide stuff
/nbproject/
# Eclipse ide stuff
/.pydevproject
# Ant cache
cache.properties
# Composer
composer.lock
/vendor/
# NPM
/node_modules/
phpstan.neon
# Infection
infection.json5
/js/
/setup/
/themes/
# App
/app/cache/*
!/app/cache/.gitkeep
/app/language_stats_inc.php
# public
/public/js/*
!/public/js/.gitkeep
/public/setup/*.css
/public/setup/*.css.map
/public/themes/*
!/public/themes/dot.gif
!/public/themes/bootstrap/
!/public/themes/metro/
!/public/themes/original/
!/public/themes/pmahomme/
/public/themes/*/css/*.css
/public/themes/*/css/*.css.map
infection.json
infection.log
/js/vendor/js.cookie.min.js
/js/vendor/openlayers/OpenLayers.js.LICENSE.txt
/setup/styles.rtl.css
/test/test_data/gis/
/public/
/app/

View File

@ -1,6 +1,4 @@
{
"esversion" : 6,
// Show more errors
"maxerr" : 1000,

View File

@ -1,5 +0,0 @@
<?php
namespace PHPSTORM_META {
override(\Psr\Container\ContainerInterface::get(0), map(['@']));
}

3
.rtlcssrc.json Normal file
View File

@ -0,0 +1,3 @@
{
"map": true
}

View File

@ -5,11 +5,12 @@ imports:
filter:
excluded_paths:
- build/
- js/vendor/
- js/dist/
- node_modules/
- public/js/
- tmp/
- vendor/
- tests/doctum-config.php
- test/doctum-config.php
checks:
javascript: true
php: true
@ -18,14 +19,18 @@ tools:
runs: 4 # php 7.x versions
timeout: 900 # 15 min
build:
image: default-jammy # New NodeJS versions require newer versions of glibc (noble was not available on 12/09/2025)
image: default-bionic # Needed to make PHP 7.2 compile
nodes:
analysis:
environment:
php: 8.2
node: 20 # Scrutinizer uses nvm
php:
version: 7.2
compile_options: '--enable-zip --enable-gd --with-openssl --with-curl --with-mysqli'
node: 12 # Scrutinizer uses nvm
dependencies:
before:
- sudo /home/scrutinizer/.phpenv/shims/php -f /usr/bin/composer.phar self-update --2
- composer --version
- composer config --unset repositories.0
- composer install
- composer require tecnickcom/tcpdf pragmarx/google2fa-qrcode bacon/bacon-qr-code code-lts/u2f-php-server

View File

@ -4,20 +4,11 @@
"stylelint-config-recommended-scss"
],
"rules": {
"selector-class-pattern": null,
"import-notation": null,
"selector-attribute-quotes": null,
"shorthand-property-no-redundant-values": null,
"function-url-quotes": null,
"selector-id-pattern": null,
"alpha-value-notation": null,
"color-function-notation": null,
"scss/no-global-function-names": null,
"scss/function-quote-no-quoted-strings-inside": null,
"property-no-vendor-prefix": null,
"declaration-block-no-redundant-longhand-properties": null,
"no-descending-specificity": null,
"no-duplicate-selectors": null,
"block-closing-brace-newline-after": ["always", {
"ignoreAtRules": ["if", "else"]
}],
"at-rule-empty-line-before": ["always", {
"except": [
"blockless-after-same-name-blockless",

View File

@ -1,102 +0,0 @@
# Changes in phpMyAdmin 6.0
All notable changes of the phpMyAdmin 6.0 release series are documented in this file following the [Keep a Changelog](https://keepachangelog.com/) format.
## [6.0.0] - YYYY-MM-DD
### Added
* [#17029](https://github.com/phpmyadmin/phpmyadmin/pull/17029): Enable Twig's `strict_variables` option in development environment
* [#17361](https://github.com/phpmyadmin/phpmyadmin/pull/17361): Add webpack bundler
* [#16500](https://github.com/phpmyadmin/phpmyadmin/pull/16500): Add paging to Routines page
* [#17753](https://github.com/phpmyadmin/phpmyadmin/pull/17753): Adding `inputmode` numeric to integer fields
* [#17765](https://github.com/phpmyadmin/phpmyadmin/pull/17765): Make search input field types match columns types (integer and float)
* [#17809](https://github.com/phpmyadmin/phpmyadmin/pull/17809): Adds support for SHA2 function
* [#18098](https://github.com/phpmyadmin/phpmyadmin/pull/18098): Added reCaptcha example for Cloudflare Turnstile
* [#18223](https://github.com/phpmyadmin/phpmyadmin/pull/18223): Add a configuration option to (dis)allow shared bookmarks: `$cfg['AllowSharedBookmarks'] = true;`
* [#18225](https://github.com/phpmyadmin/phpmyadmin/pull/18225): Make database and web server info separately configurable on `$cfg['ShowServerInfo']`
* [#18257](https://github.com/phpmyadmin/phpmyadmin/pull/18257): Add support for theme color modes
* [#17009](https://github.com/phpmyadmin/phpmyadmin/issues/17009): Implement the security header `Permissions-Policy`
* [#18349](https://github.com/phpmyadmin/phpmyadmin/pull/18349): Allow rollbacking SET queries
* [#18589](https://github.com/phpmyadmin/phpmyadmin/pull/18589): Add support for PSR-15 middleware
* [#18649](https://github.com/phpmyadmin/phpmyadmin/pull/18649): Add color mode toggle at the top navigation bar
* [#18668](https://github.com/phpmyadmin/phpmyadmin/pull/18668): Add number formatting to Total on Browse
* [#18747](https://github.com/phpmyadmin/phpmyadmin/pull/18747): Add `composer.lock` to version control
* [#18799](https://github.com/phpmyadmin/phpmyadmin/pull/18799): Add an user account menu button at top right
* [#18812](https://github.com/phpmyadmin/phpmyadmin/pull/18812): Add role based auth for MySQL 8.x and compatibles
* [#18916](https://github.com/phpmyadmin/phpmyadmin/pull/18916): Add format button to routine, event and trigger
* [#18537](https://github.com/phpmyadmin/phpmyadmin/pull/18537): Add copy to clipboard for export as text
* [#19287](https://github.com/phpmyadmin/phpmyadmin/pull/19287): Add optional support for binary data in database search
* [#19308](https://github.com/phpmyadmin/phpmyadmin/pull/19308): Added an option in the SQL box to "Format as a single line"
* [#19352](https://github.com/phpmyadmin/phpmyadmin/pull/19352): Added support for `BETWEEN` and `NOT BETWEEN` on the query generator
* [#19525](https://github.com/phpmyadmin/phpmyadmin/pull/19525): Add support for `INSERT IGNORE` into for non table imports
* [#19555](https://github.com/phpmyadmin/phpmyadmin/pull/19555): Add button for Copy Query in Query Generator
* [#19691](https://github.com/phpmyadmin/phpmyadmin/pull/19691): Show hostname on main page
* [#19751](https://github.com/phpmyadmin/phpmyadmin/pull/19751): Add Go button at the top of the insert row table
* [#19812](https://github.com/phpmyadmin/phpmyadmin/pull/19812): Add show create table shortcuts when viewing tables
### Changed
* [#17116](https://github.com/phpmyadmin/phpmyadmin/pull/17116): Replace Change Password dialog to modal
* [#17125](https://github.com/phpmyadmin/phpmyadmin/pull/17125): Replace Add Index dialog with modal
* [#17127](https://github.com/phpmyadmin/phpmyadmin/pull/17127): Replace Page settings dialog with modal
* [#17278](https://github.com/phpmyadmin/phpmyadmin/pull/17278): Improve NULL div design
* [#17280](https://github.com/phpmyadmin/phpmyadmin/pull/17280): Improve theme card heights
* [#17399](https://github.com/phpmyadmin/phpmyadmin/pull/17399): Handle connection errors with Exception instead of warnings
* [#17515](https://github.com/phpmyadmin/phpmyadmin/pull/17515): Bump js-cookie version from 2.2.1 to 3.0.1
* [#17561](https://github.com/phpmyadmin/phpmyadmin/pull/17561): Improve Change Password modal UI
* [#17676](https://github.com/phpmyadmin/phpmyadmin/pull/17676): Extract `url.php` entry point into a route
* [#17677](https://github.com/phpmyadmin/phpmyadmin/pull/17677): Extract `js/messages.php` entry point into `/messages` route
* [#17801](https://github.com/phpmyadmin/phpmyadmin/pull/17801): Export page of Settings is not responsive
* [#17842](https://github.com/phpmyadmin/phpmyadmin/issues/17842): Change js.cookie.js to js.cookie.min.js
* [#17632](https://github.com/phpmyadmin/phpmyadmin/issues/17632): Improve tab keypress to text fields on the login form
* [#18124](https://github.com/phpmyadmin/phpmyadmin/pull/18124): Invert svg gis viewer mouse wheel zoom direction
* [#18136](https://github.com/phpmyadmin/phpmyadmin/pull/18136): Force a full page reload for top menu links
* [#18145](https://github.com/phpmyadmin/phpmyadmin/pull/18145): Move public files to the public directory
* [#18300](https://github.com/phpmyadmin/phpmyadmin/pull/18300): Convert JavaScript files to TypeScript
* [#18310](https://github.com/phpmyadmin/phpmyadmin/pull/18310): Minimize form label column width in Routine, Event and Trigger modals
* [#18311](https://github.com/phpmyadmin/phpmyadmin/pull/18311): Only allow resizing textarea vertically
* [#18365](https://github.com/phpmyadmin/phpmyadmin/pull/18365): Change 'reCaptcha' text to 'Captcha'
* [#18439](https://github.com/phpmyadmin/phpmyadmin/pull/18439): Redesign the SQL message card
* [#18576](https://github.com/phpmyadmin/phpmyadmin/pull/18576): Wrap the Application::run() code with an HTTP handler
* [#18652](https://github.com/phpmyadmin/phpmyadmin/pull/18652): Disable AJAX for navigation sidebar links
* [#18658](https://github.com/phpmyadmin/phpmyadmin/pull/18658): Update OpenLayers
* [#18703](https://github.com/phpmyadmin/phpmyadmin/pull/18703): Limit label width in create-view table
* [#18512](https://github.com/phpmyadmin/phpmyadmin/issues/18512): New directory structure
* [#18994](https://github.com/phpmyadmin/phpmyadmin/pull/18994): Refactor name generation of file imports
* [#19110](https://github.com/phpmyadmin/phpmyadmin/pull/19110): Refactor recent/favorite tables buttons
* [#19182](https://github.com/phpmyadmin/phpmyadmin/pull/19182): Refactor GIS editor modal
* [#19214](https://github.com/phpmyadmin/phpmyadmin/pull/19214): Replace jqPlot library with Chart.js library
* [#19294](https://github.com/phpmyadmin/phpmyadmin/pull/19294): Simplify IN, NOT IN criteria text in Query Generator
* [#19327](https://github.com/phpmyadmin/phpmyadmin/pull/19327): Prevent IN / NOT IN duplicates in Query Generator
* [835fc27](https://github.com/phpmyadmin/phpmyadmin/commit/835fc2715d6f7330fa5ed680e8315b98eaa96cec): Redesign the User Groups form page
* [624126e](https://github.com/phpmyadmin/phpmyadmin/commit/624126edc8ea629ebbb222496bb4dad6cac9c6dd): Redesign the database and table privileges pages
* [#19398](https://github.com/phpmyadmin/phpmyadmin/issues/19398): Use `application/json` instead of `text/plain` for JSON export
* [#19496](https://github.com/phpmyadmin/phpmyadmin/pull/19496): Update CODE_OF_CONDUCT.md
* [#19513](https://github.com/phpmyadmin/phpmyadmin/pull/19513): Hide unwanted input depending on chosen Op type in Query Generator
* [#19536](https://github.com/phpmyadmin/phpmyadmin/pull/19536): Disable Search input on unary operators
* [#19542](https://github.com/phpmyadmin/phpmyadmin/pull/19542): Made Search operators `= ''`/`!= ''` more obvious
* [#19651](https://github.com/phpmyadmin/phpmyadmin/pull/19651): Stay the on same page when deleting a foreign key
* [#19712](https://github.com/phpmyadmin/phpmyadmin/pull/19712): Import OpenLayers and Bootstrap directly using Webpack
* [#19794](https://github.com/phpmyadmin/phpmyadmin/pull/19794): Use `jquery-ui-timepicker-addon.min.js` instead of `jquery-ui-timepicker-addon.js`
* [#19795](https://github.com/phpmyadmin/phpmyadmin/pull/19795): Use `additional-methods.min.js` instead of `additional-methods.js`
* [#19564](https://github.com/phpmyadmin/phpmyadmin/pull/19564): Update the table comment field to a textarea
* [#19947](https://github.com/phpmyadmin/phpmyadmin/pull/19947): Export ODS column headers by default
### Removed
* [#17351](https://github.com/phpmyadmin/phpmyadmin/pull/17351): Drop `stripslashes`
* [#17516](https://github.com/phpmyadmin/phpmyadmin/pull/17516): Remove `jquery-debounce-throttle` JavaScript dependency
* [#17752](https://github.com/phpmyadmin/phpmyadmin/pull/17752): Remove Sodium polyfill and require the PHP sodium extension
* [#18430](https://github.com/phpmyadmin/phpmyadmin/pull/18430): Remove Query-By-Example feature
* [#18547](https://github.com/phpmyadmin/phpmyadmin/pull/18547): Remove support for the Recode extension
* [#18587](https://github.com/phpmyadmin/phpmyadmin/pull/18587): Remove the `public/show_config_errors.php` file
* [#19128](https://github.com/phpmyadmin/phpmyadmin/pull/19128): Remove the `phpmyadmin/twig-i18n-extension` package
* [#19243](https://github.com/phpmyadmin/phpmyadmin/pull/19243): Bump minimum PHP version to 8.2.0
* [#19408](https://github.com/phpmyadmin/phpmyadmin/pull/19408): Removed the popup that warned about having an auto-saved query
* [#19409](https://github.com/phpmyadmin/phpmyadmin/pull/19409): Drop Protocol version
* [#19550](https://github.com/phpmyadmin/phpmyadmin/pull/19550): Replace jQuery UI's tooltip with Bootstrap's Tooltip
* [#19852](https://github.com/phpmyadmin/phpmyadmin/pull/19852): Bump Node version to 20
* [#19854](https://github.com/phpmyadmin/phpmyadmin/pull/19854): Drop support for BaconQrCode v2
[6.0.0]: https://github.com/phpmyadmin/phpmyadmin/compare/QA_5_2...master

View File

@ -2,131 +2,45 @@
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
Examples of behavior that contributes to creating a positive environment include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
community
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior include:
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email address,
without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Enforcement Responsibilities
## Our Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official email address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
info@phpmyadmin.net.
All complaints will be reviewed and investigated promptly and fairly.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at info@phpmyadmin.net. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct/][version]
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
[homepage]: https://www.contributor-covenant.org/
[version]: https://www.contributor-covenant.org/version/1/4/code-of-conduct/

View File

@ -8,7 +8,7 @@ We appreciate your effort to improve phpMyAdmin by submitting a bug report. Befo
1. Check whether the bug you face **hasn't been already reported**. Duplicate reports take us time, that we could be used to fix other bugs or make improvements.
2. Please specify the phpMyAdmin, server, PHP, MySQL, and browser information that may be helpful in resolving the issue, especially the exact **version numbers**.
2. Specify the phpMyAdmin, server, PHP, MySQL and browser information that may be helpful to fix the problem, especially exact **version numbers**.
3. If you got some error, please **describe what happened** and add an error message. Reports like "I get an error when I clicked on some link" are useless.

335
ChangeLog Normal file
View File

@ -0,0 +1,335 @@
phpMyAdmin - ChangeLog
======================
5.2.4 (not yet released)
- issue #19976 Fix Bootstrap theme icons are not visible on bigger screens
- issue #19339 Re-apply JSON syntax highlighting after AJAX updates
- issue Improve table list access error messages when available
- issue #19964 Fix error when importing a CSV with more decimals than the column
- issue #19950 Fix tooltip doesn't disappear when searching on date type
5.2.3 (2025-10-07)
- issue #19548 Fix missing tooltip in status monitor log table
- issue #19619 Fix horizontal scrollbar in server status pages
- issue #17141 Fix table comment readability on original theme
- issue #19138 Adjusted the chart size in System Monitor
- issue #19351 Fixed paging with approximate number of rows
- issue #18170 Fixed `window.makeGrid is not a function` partially
- issue #17535 Fixed "Delete" button not asking for confirmation when deleting a row
- issue Fixed not needed table names conversion to htmlentities when renaming a table
- issue #18922 Remove the `maxlength` for routines names
- issue #19641 Allow optional precision parameter for `NOW()`
- issue Added size support for the CSV table type
- issue #18903 Fix error 500 when simulating a `SET` statement
- issue #19404 Fixed PHP 8.4 deprecations in `thecodingmachine/safe`
- issue #19133 Updated documentation about Y2K38 as is fixed in MariaDB 11.5
- issue #19685 Prevent "ol.css" being added multiple times
- issue Fixed some bugs in relations tab with foreign keys having special names
- issue #19715 Fix sorting with URL encryption enabled in results display
- issue Fix duplicate Set-Cookie
- issue Improved GIS visualization to work with huge tables
- issue Fix horizontal scrollbar in server status pages
- issue #19653 Fix body padding automatically using a MutationObserver
- issue Fix criteria form visibility toggle in a multi-table query
- issue #18807 Fixed range search on the search page
- issue #19744 Fixed checking that curl is enabled
- issue #19757 Fix move column with foreign key
- issue #16869 Fix query time not showing for `SELECT COUNT(*)` queries
- issue #19775 Fix copy to clipboard
- issue #19073 Fix both replicated and not replicated icons are shown
- issue #19772 Fix progress value in process list for multi-stage query
- issue Fixed some PHP 8.4 and PHP 8.5 deprecations
- issue #17329 Improve the handling of "The quota has been exceeded" when pasting multi megabytes queries
- issue Improve the detection of PHP GD2
- issue #19625 Fix special characters support in move columns
- issue #19643 Fix upload progress showing a SyntaxError
- issue #19593 Fix upload progress showing a SyntaxError
- issue #19504 Fix Advisor rules are throwing some errors with `--skip-innodb`
- issue #19760 Fixed `Variable 'lc_messages' can't be set to the value of 'fr_FR'` on misconfigured database servers
- issue #19371 Fixed tablename doesn't match with csv filename when importing it
- issue Fix `$http_response_header` deprecation for PHP 8.5
- issue #19701 Add "symfony/polyfill-iconv" in case users do not have PHP "iconv" extension installed
- issue #18066 Fixed "uncaught ReferenceError: u2f is not defined" on browsers that removed support for it
- issue #19822 Fix incorrect usage/placement of 'SQL_NO_CACHE'
- issue Add support for "bacon-qr-code" v3
- issue #19850 Fix undefined array key 4 in PDF structure export
- issue #19859 Fix deprecated null array offset
- issue #18437 Fix SQL editor's alignment in rtl
- issue #18472 Fix responsive table edit-box in rtl mode
- issue #19109 Do not enforce character encoding when checking roles
- issue #19611 Restore text operators order (`LIKE %...%` vs `LIKE` before)
5.2.2 (2025-01-21)
- issue [security] Fix for a path disclosure leak in the Monitoring tab
- issue Prevent the user from deleting system databases
- issue [security] Fix an XSS vulnerability when checking tables (PMASA-2025-1)
- issue [security] Fix an XSS vulnerability on the Insert tab (PMASA-2025-2)
- issue [security] Fix a possible glibc/iconv vulnerability (CVE-2024-2961, assigned PMASA-2025-3 but please note that phpMyAdmin is not vulnerable by default)
- issue Fix for sql-parser relating to quadratic complexity in certain queries, which could have caused long execution times.
- issue #17851 Fix total count of rows in not accurate
- issue #17766 Allow to open in a new tab copy and edit row actions
- issue #17599 Fix error when handling an user that is not in privileges table
- issue #17364 Fix error when trying to import a status monitor chart arrangement
- issue #18106 Fix renaming database with a view
- issue #18120 Fix bug with numerical tables during renaming database
- issue #16851 Fix ($cfg['Order']) default column order doesn't have have any effect since phpMyAdmin 4.2.0
- issue #18138 Fix some issues with numerical table names
- issue #18112 Fix open base dir warning on git version class
- issue #18211 Fix the themes route missing the server ID
- issue Do not show "Original length undefined" on binary hex columns
- issue Fix wrong time zone when handling Git information
- issue #18195 Fix warning on non-existent table for XML export
- issue #18196 Fix errors of import notification
- issue #18093 Fix JS errors around "new user account" in some edge cases
- issue #16451 Increase password characters limit to 2000 during login
- issue #18177 Fix "IS NULL" is shown for non-nullable columns on search page
- issue #16199 Fix dragging of tables in designer
- issue #18268 Fix UI issue the theme manager is disabled
- issue #18258 Speed improvements when exporting a database
- issue #17702 Fix performance issue when handling large number of tables in a single database
- issue #18324 Fix UI defect on tracking versions table first column
- issue #18266 Fix disabling features (like `$cfg['Servers'][$i]['tracking'] = false;`) did not work
- issue #18296 Fixed query time measurement - measure time only for user queries
- issue #18235 Fix columns are misaligned for the "sys" database
- issue #18249 Speed improvements when browsing a database with multiple tables
- issue #18060 Fix Console height "Not a non-negative number" error
- issue #18188 Fix issue when editing GIS data
- issue Fix width/height of create routines modal and width of routines/triggers/events modals
- issue Stop pmadb database detection when all features are disabled
- issue Upgrade slim/psr7 to 1.4.1 for CVE-2023-30536 - GHSA-q2qj-628g-vhfw
- issue #17654 Fix unprivileged user cannot change password on MySQL >= 5.7.37
- issue #18385 Add CVE MITRE link to allowed domains and use cve.org
- issue #18330 Fix TypeError when no-datetime field is modified
- issue #18212 Fix Query Builder doesn't replace a table name with it's alias in the `WHERE` block
- issue #18221 Keep the criteria box collapsed by the user when un-checking the criteria checkbox
- issue #18363 Fix colspan for actions column on database table list
- issue Fix double encoding on User Groups pages
- issue Fix list of users of an user group not showing up
- issue Fix duplicate query params in the SQL message card
- issue #18314 Fix dragged row in index form
- issue #17392 Fix the actions not being hidden in the Triggers, Routines, Events pages
- issue #18441 Fix execute routine page not working when not in a modal
- issue #18471 Fix SQL statement not being displayed correctly on RTL languages
- issue Fix state times not getting summed in the profiling table
- issue Fix a case where a fatal error message was not displayed
- issue #17420 Fix profiling chart not loading when profiling is activated
- issue #18159 Fix error when changing the number of chart columns in the monitor page
- issue #18403 Fix Uncaught SyntaxError: JSON.parse on makegrid conditions
- issue #17528 Fix double escaping of database group names in the navigation tree
- issue #18473 Fix the NULL not applied after clearing nullable field
- issue #18454 Fix date field calendar display when changing NULL state
- issue #18481 Fix missing pagination when using SELECT DISTINCT
- issue #18325 Allow hex representations for integers in the search box validation
- issue #14411 Fixed double tap to edit on mobile devices
- issue Update documentation to reflect that Node >= 12 is required to compile the JS and CSS files
- issue #18578 Fixed PDF export NULL values gives a type error
- issue #18605 Fixed issue when executing a stored procedure
- issue #18650 Fixed double escaping on foreign key relation link title
- issue #18533 Fixed wrong count for simulated queries
- issue #18611 Fixed an error when searching a table without conditions
- issue #18663 Fixed case where triggers are dropped when moving a table
- issue #17404 Fixed an error message after dropping a database
- issue #18714 Fixed incorrect formatting of the amount of table rows
- issue #18717 Fixed issue when deleting bookmarks
- issue #18713 Fixed some issues with the GIS editor
- issue #18722 Fixed generic error message in the home page
- issue #18693 Fixed enum/set value escaping
- issue #18769 Improved collations support for MariaDB 10.10
- issue #17381 Fixed JS errors when editing indexes on create table
- issue #14402 Fix the PRIMARY label still shown when using two columns for a PK on create table
- issue #17347 Fixed JS errors when changing index settings on create table
- issue #18762 Fixed truncating tables when a VIEW is included
- issue Fix BETWEEN search does not validate input because of spaces
- issue Fix JS number validation does not validate when the input is empty or emptied
- issue #18561 Fix issue when adding System Monitor charts
- issue #17363 Fix duplicate route parameter after logging in
- issue #15670 Fix case where the data is truncated after changing a longtext column's collation
- issue #18797 Fixed support for ampersand as a arg separator
- issue #18834 Fixed case where column hash is empty in table relation page
- issue #17538 Fixed error when renaming an index
- issue #18865 Fix missing text-nowrap for timestamps columns
- issue #18613 Fixed routine editor showing wrong parameter type
- issue #18890 Fixed wrong row count when query has UNION
- issue #18949 Fixed natural sorting for items in the navigation section
- issue #18930 Fixed import of empty tables from MediaWiki
- issue #18940 Fixed issue when creating an unique key
- issue #19022 Fix case where tables from wrong database is loaded in navigation tree
- issue #18782 Fixed issue with role based auth for MySQL 8
- issue #18593 Fix drop db line included in server export if exporting only data
- issue #18049 Also check that curl_exec is enabled for the new version check
- issue #19023 Fixed table size for ROCKSDB engine showing as unknown
- issue #18451 Fix when editing inline central column, Null is always preselected
- issue #18495 Fixed database export missing routines
- issue #19117 Allow changing the virtuality of a column without any other changes
- issue #18566 Fixed error when importing exported view with USE INDEX hint
- issue #17920 Fixed moving column with empty default value will replace it with ''
- issue #18006 Fixed moving columns causes the default uuid() value to get quotes around it
- issue #18962 Fixed move columns with ENUM() & DEFAULT causes invalid SQL
- issue #18276 Fix on update CURRENT_TIMESTAMP doesn't show as default in attributes
- issue #18240 Fix inserting value with UNIX_TIMESTAMP() without a parameter
- issue #19125 Fixed CodeMirror tooltip is below modals
- issue #18674 Fix formatted sql in browse table result has a linebreak after each token
- issue #18210 Fixed add replica replication user on MariaDB doesn't work (SQL syntax)
- issue #19041 Fix footer.twig gets printed to Binary File Download
- issue #19091 Fix to stop processing queries on error
- issue #18241 Fix copy SQL query button on error messages
- issue #17190 Fix an error with SELECT ... FOR UPDATE queries
- issue #19145 Remove duplicate server and lang parameters from links
- issue #19158 Fix an issue with backticks on the query generator
- issue #19174 Fix an issue with column alias with asterisk on the query generator
- issue #19146 Fix column sorting with limit subquery
- issue #19152 Fix the number of lines being ignored in GIS visualization after a search
- issue #19189 Fix issue with column sorting when using 'group by'
- issue #19188 Fix issue with simulated queries reporting syntax errors
- issue #19141 Add cookie prefix '-__Secure-' to cookies to help prevent cookie smuggling
- issue #19218 Fix textarea horizontal resizing with Bootstap theme
- issue #19199 Add support for fractional seconds to current_timestamp()
- issue #19221 Fix query statistics for queries with count(*)
- issue #19203 Fix single quotes and backslashes for the query generator
- issue #19163 Fix queries with IS NULL or IS NOT NULL for the query generator
- issue #19181 Fix query generator support for IN() and NOT IN()
- issue #19167 Fix criteria on column '*' for the query generator
- issue #19213 Fix possible issue when exporting a large data set
- issue #19217 Fix issue when editing a cell of a JSON column
- issue #19244 Add yarn 1.22 to the package.json's packageManager field
- issue #19185 Fix visual issue when a row has only empty cells
- issue #19257 Fix issue when adding an index with an invalid name
- issue #19276 Fix compatibility with Twig 3.12
- issue #19283 Fix issue when the server starts with skip-innodb option
- issue #19299 Fix charset in procedure's parameter type
- issue #19316 Fix input size for hexadecimal values
- issue #19321 Suppress deprecation message of E_STRICT constant
- issue Fix PHP 8.4 `str_getcsv` `$escape` parameter deprecation
- issue #19426 Fix PHP warnings when the column is a `COMPRESSED BLOB`
- issue Allow opening server breadcrumb links in new tab with Ctrl/Meta key
- issue #19500 Use `KILL` instead of `CALL mysql.rds_kill` for non super users
- issue Fix "copy to clipboard" was adding a blank row for each repeating header row
- issue Fix TCPDF translations
- issue Remove underline for links on Bootstrap theme
- issue Fix sql editor height on multi-table query
- issue #18852 Fix notification color scheme on the Bootstrap dark theme
- issue #14542 Show the query even if no results are found in the Table search
- issue #16936 Fixed import (e.g. ods) doesn't respect database default collation
- issue #19000 Disable autocomplete for the create table/db name inputs
5.2.1 (2023-02-07)
- issue #17522 Fix case where the routes cache file is invalid
- issue #17506 Fix error when configuring 2FA without XMLWriter or Imagick
- issue Fix blank page when some error occurs
- issue #17519 Fix Export pages not working in certain conditions
- issue #17496 Fix error in table operation page when partitions are broken
- issue #17386 Fix system memory and system swap values on Windows
- issue #17517 Fix Database Server panel not getting hidden by ShowServerInfo configuration directive
- issue #17271 Fix database names not showing on Processes tab
- issue #17424 Fix export limit size calculation
- issue #17366 Fix refresh rate popup on Monitor page
- issue #17577 Fix monitor charts size on RTL languages
- issue #17121 Fix password_hash function incorrectly adding single quotes to password before hashing
- issue #17586 Fix statistics not showing for empty databases
- issue #17592 Clicking on the New index link on the sidebar does not throw an error anymore
- issue #17584 It's now possible to browse a database that includes two % in its name
- issue Fix PHP 8.2 deprecated string interpolation syntax
- issue Some languages are now correctly detected from the HTTP header
- issue #17617 Sorting is correctly remembered when $cfg['RememberSorting'] is true
- issue #17593 Table filtering now works when action buttons are on the right side of the row
- issue #17388 Find and Replace using regex now makes a valid query if no matching result set found
- issue #17551 Enum/Set editor will not fail to open when creating a new column
- issue #17659 Fix error when a database group is named tables, views, functions, procedures or events
- issue #17673 Allow empty values to be inserted into columns
- issue #17620 Fix error handling at phpMyAdmin startup for the JS SQL console
- issue Fixed debug queries console broken UI for query time and group count
- issue Fixed escaping of SQL query and errors for the debug console
- issue Fix console toolbar UI when the bookmark feature is disabled and sql debug is enabled
- issue #17543 Fix JS error on saving a new designer page
- issue #17546 Fix JS error after using save as and open page operation on the designer
- issue Fix PHP warning on GIS visualization when there is only one GIS column
- issue #17728 Some select HTML tags will now have the correct UI style
- issue #17734 PHP deprecations will only be shown when in a development environment
- issue #17369 Fix server error when blowfish_secret is not exactly 32 bytes long
- issue #17736 Add utf8mb3 as an alias of utf8 on the charset description page
- issue #16418 Fix FAQ 1.44 about manually removing vendor folders
- issue #12359 Setup page now sends the Content-Security-Policy headers
- issue #17747 The Column Visibility Toggle will not be hidden by other elements
- issue #17756 Edit/Copy/Delete row now works when using GROUP BY
- issue #17248 Support the UUID data type for MariaDB >= 10.7
- issue #17656 Fix replace/change/set table prefix is not working
- issue Fix monitor page filter queries only filtering the first row
- issue Fix "Link not found!" on foreign columns for tables having no char column to show
- issue #17390 Fix "Create view" modal doesn't show on results and empty results
- issue #17772 Fix wrong styles for add button from central columns
- issue #17389 Fix HTML disappears when exporting settings to browser's storage
- issue #17166 Fix "Warning: #1287 'X' is deprecated [...] Please use ST_X instead." on search page
- issue Use jquery-migrate.min.js (14KB) instead of jquery-migrate.min.js (31KB)
- issue #17842 Use jquery.validate.min.js (24 KB) instead of jquery.validate.js (50 KB)
- issue #17281 Fix links to databases for information_schema.SCHEMATA
- issue #17553 Fix Metro theme unreadable links above navigation tree
- issue #17553 Metro theme UI fixes and improvements
- issue #17553 Fix Metro theme login form with
- issue #16042 Exported gzip file of database has first ~73 kB uncompressed and rest is gzip compressed in Firefox
- issue #17705 Fix inline SQL query edit FK checkbox preventing submit buttons from working
- issue #17777 Fix Uncaught TypeError: Cannot read properties of null (reading 'inline') on datepickers when re-opened
- issue Fix Original theme buttons style and login form width
- issue #17892 Fix closing index edit modal and reopening causes it to fire twice
- issue #17606 Fix preview SQL modal not working inside "Add Index" modal
- issue Fix PHP error on adding new column on create table form
- issue #17482 Default to "Full texts" when running explain statements
- issue Fixed Chrome scrolling performance issue on a textarea of an "export as text" page
- issue #17703 Fix datepicker appears on all fields, not just date
- issue Fix space in the tree line when a DB is expanded
- issue #17340 Fix "New Table" page -> "VIRTUAL" attribute is lost when adding a new column
- issue #17446 Fix missing option for STORED virtual column on MySQL and PERSISTENT is not supported on MySQL
- issue #17446 Lower the check for virtual columns to MySQL>=5.7.6 nothing is supported on 5.7.5
- issue Fix column names option for CSV Export
- issue #17177 Fix preview SQL when reordering columns doesn't work on move columns
- issue #15887 Fixed DROP TABLE errors ignored on multi table select for DROP
- issue #17944 Fix unable to create a view from tree view button
- issue #17927 Fix key navigation between select inputs (drop an old Firefox workaround)
- issue #17967 Fix missing icon for collapse all button
- issue #18006 Fixed UUID columns can't be moved
- issue Add `spellcheck="false"` to all password fields and some text fields to avoid spell-jacking data leaks
- issue Remove non working "Analyze Explain at MariaDB.org" button (MariaDB stopped this service)
- issue #17229 Add support for Web Authentication API because Chrome removed support for the U2F API
- issue #18019 Fix "Call to a member function fetchAssoc() on bool" with SQL mode ONLY_FULL_GROUP_BY on monitor search logs
- issue Add back UUID and UUID_SHORT to functions on MySQL and all MariaDB versions
- issue #17398 Fix clicking on JSON columns triggers update query
- issue Fix silent JSON parse error on upload progress
- issue #17833 Fix "Add Parameter" button not working for Add Routine Screen
- issue #17365 Fixed "Uncaught Error: regexp too big" on server status variables page
- issue [security] Fix an XSS attack through the drag-and-drop upload feature (PMASA-2023-01)
5.2.0 (2022-05-10)
- issue #16521 Upgrade Bootstrap to version 5
- issue #16521 Drop support for Internet Explorer and others
- issue Upgrade to shapefile 3
- issue #16555 Bump minimum PHP version to 7.2
- issue Remove the phpseclib dependency
- issue Upgrade Symfony components to version 5.2
- issue Upgrade to Motranslator 4
- issue #16005 Improve the performance of the Export logic
- issue #16829 Add "NOT LIKE %...%" operator to Table search
- issue #16845 Fixed some links not passing through url.php
- issue #16382 Remove apc upload progress method (all upload progress code was removed from the PHP extension)
- issue #16974 Replace zxcvbn by zxcvbn-ts
- issue #15691 Disable the last column checkbox in the column list dropdown instead of not allowing un-check
- issue #16138 Ignore the length of integer types and show a warning on MySQL >= 8.0.18
- issue Add support for the Mroonga engine
- issue Double click column name to directly copy to clipboard
- issue #16425 Add "DELETE FROM" table on table operations page
- issue #16482 Add a select all link for table-specific privileges
- issue #14276 Add support for account locking
- issue #17143 Use composer/ca-bundle to manage the CA cert file
- issue #17143 Require the openssl PHP extension
- issue #17171 Remove the printview.css file from themes
- issue #17203 Redesign the export and the import pages
- issue #16197 Replace the master/slave terminology
- issue #17257 Replace libraries/vendor_config.php constants with an array
- issue Add the Bootstrap theme
- issue #17499 Remove stickyfilljs JavaScript dependency
--- Older ChangeLogs can be found on our project website ---
https://www.phpmyadmin.net/old-stuff/ChangeLogs/
# vim: et ts=4 sw=4 sts=4
# vim: ft=changelog fenc=utf-8
# vim: fde=getline(v\:lnum-1)=~'^\\s*$'&&getline(v\:lnum)=~'\\S'?'>1'\:1&&v\:lnum>4&&getline(v\:lnum)!~'^#'
# vim: fdn=1 fdm=expr

6
README
View File

@ -1,7 +1,7 @@
phpMyAdmin - Readme
===================
Version 6.0.0-dev
Version 5.2.4-dev
A web interface for MySQL and MariaDB.
@ -12,7 +12,7 @@ Summary
phpMyAdmin is intended to handle the administration of MySQL over the web.
For a summary of features, list of requirements, and installation instructions,
please see the documentation in the ./docs/ folder or at https://docs.phpmyadmin.net/
please see the documentation in the ./doc/ folder or at https://docs.phpmyadmin.net/
Copyright
---------
@ -22,7 +22,7 @@ Copyright © 1998 onwards -- the phpMyAdmin team
Certain libraries are copyrighted by their respective authors;
see the full copyright list for details.
For full copyright information, please see ./docs/copyright.rst
For full copyright information, please see ./doc/copyright.rst
License
-------

View File

@ -54,19 +54,19 @@ If you prefer to follow the Git repository, the following branch and tag names m
* ``STABLE`` is the current stable release.
* ``master`` is the development branch.
* Releases are tagged; for example, version 5.0.1 was tagged as ``RELEASE_5_0_1``.
* Releases are tagged, for example version 5.0.1 was tagged as ``RELEASE_5_0_1``.
Note that phpMyAdmin uses `Composer <https://getcomposer.org/>`_ to manage library dependencies; when using Git
Note that phpMyAdmin uses `Composer <https://getcomposer.org/>`_ to manage library dependencies, when using Git
development versions, you must manually run Composer.
Please see `the documentation <https://docs.phpmyadmin.net/en/latest/setup.html#installing-from-git>`_ for details.
More Information
----------------
Please see https://docs.phpmyadmin.net/, or browse the documentation in the docs folder.
Please see https://docs.phpmyadmin.net/, or browse the documentation in the doc folder.
For `support <https://www.phpmyadmin.net/support/>`_ or `security issues, <https://www.phpmyadmin.net/security/>`_ you can visit https://www.phpmyadmin.net/
For `support <https://www.phpmyadmin.net/support/>`_ or `security issues <https://www.phpmyadmin.net/security/>`_ you can visit https://www.phpmyadmin.net/
Translations are welcome. You can `translate phpMyAdmin into your language <https://hosted.weblate.org/projects/phpmyadmin/>`_.
Translations are welcome, you can `translate phpMyAdmin to your language <https://hosted.weblate.org/projects/phpmyadmin/>`_.
If you would like to contribute to the phpMyAdmin's codebase, you can read the `code contribution file <CONTRIBUTING.md>`_ or browse our website's `contributing page <https://www.phpmyadmin.net/contribute/>`_.

0
app/cache/.gitkeep vendored
View File

View File

@ -1,416 +0,0 @@
<?php
declare(strict_types=1);
use PhpMyAdmin\Advisory\Advisor;
use PhpMyAdmin\Application;
use PhpMyAdmin\Bookmarks\BookmarkRepository;
use PhpMyAdmin\BrowseForeigners;
use PhpMyAdmin\Clock\Clock;
use PhpMyAdmin\Config;
use PhpMyAdmin\Config\UserPreferences;
use PhpMyAdmin\Config\UserPreferencesHandler;
use PhpMyAdmin\ConfigStorage\Relation;
use PhpMyAdmin\ConfigStorage\RelationCleanup;
use PhpMyAdmin\Console\Console;
use PhpMyAdmin\Console\History;
use PhpMyAdmin\CreateAddField;
use PhpMyAdmin\Database\CentralColumns;
use PhpMyAdmin\Database\Designer;
use PhpMyAdmin\Database\Designer\Common;
use PhpMyAdmin\Database\Events;
use PhpMyAdmin\Database\Routines;
use PhpMyAdmin\Dbal\DatabaseInterface;
use PhpMyAdmin\DbTableExists;
use PhpMyAdmin\Error\ErrorHandler;
use PhpMyAdmin\Error\ErrorReport;
use PhpMyAdmin\Export\Export;
use PhpMyAdmin\Export\Options;
use PhpMyAdmin\Export\OutputHandler;
use PhpMyAdmin\Export\TemplateModel;
use PhpMyAdmin\FileListing;
use PhpMyAdmin\FlashMessenger;
use PhpMyAdmin\Footer;
use PhpMyAdmin\Header;
use PhpMyAdmin\Http\Factory\ResponseFactory;
use PhpMyAdmin\Http\Middleware;
use PhpMyAdmin\I18n\LanguageManager;
use PhpMyAdmin\Import\Import;
use PhpMyAdmin\Import\SimulateDml;
use PhpMyAdmin\InsertEdit;
use PhpMyAdmin\Navigation\Navigation;
use PhpMyAdmin\Normalization;
use PhpMyAdmin\Operations;
use PhpMyAdmin\Partitioning\Maintenance;
use PhpMyAdmin\Plugins\AuthenticationPluginFactory;
use PhpMyAdmin\Replication\Replication;
use PhpMyAdmin\Replication\ReplicationGui;
use PhpMyAdmin\ResponseRenderer;
use PhpMyAdmin\Server\Plugins;
use PhpMyAdmin\Server\Privileges;
use PhpMyAdmin\Server\Privileges\AccountLocking;
use PhpMyAdmin\Server\Status\Data;
use PhpMyAdmin\Server\Status\Monitor;
use PhpMyAdmin\Server\Status\Processes;
use PhpMyAdmin\Sql;
use PhpMyAdmin\SqlQueryForm;
use PhpMyAdmin\Table\ColumnsDefinition;
use PhpMyAdmin\Table\Indexes;
use PhpMyAdmin\Table\Search;
use PhpMyAdmin\Table\TableMover;
use PhpMyAdmin\Template;
use PhpMyAdmin\Theme\ThemeManager;
use PhpMyAdmin\Tracking\Tracking;
use PhpMyAdmin\Tracking\TrackingChecker;
use PhpMyAdmin\Transformations;
use PhpMyAdmin\Triggers\Triggers;
use PhpMyAdmin\UrlRedirector;
use PhpMyAdmin\UserPassword;
use PhpMyAdmin\UserPrivilegesFactory;
use PhpMyAdmin\Utils\HttpRequest;
use PhpMyAdmin\VersionInformation;
use Psr\Clock\ClockInterface;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
return [
Advisor::class => ['class' => Advisor::class, 'arguments' => [DatabaseInterface::class, ExpressionLanguage::class]],
Application::class => [
'class' => Application::class,
'arguments' => [ResponseFactory::class, ResponseRenderer::class],
],
BrowseForeigners::class => [
'class' => BrowseForeigners::class,
'arguments' => [Template::class, Config::class, ThemeManager::class],
],
Config::class => ['class' => Config::class, 'factory' => [Config::class, 'getInstance']],
Config\PageSettings::class => [
'class' => Config\PageSettings::class,
'arguments' => [UserPreferences::class, ResponseRenderer::class],
],
CentralColumns::class => ['class' => CentralColumns::class, 'arguments' => [DatabaseInterface::class]],
CreateAddField::class => ['class' => CreateAddField::class, 'arguments' => [DatabaseInterface::class]],
DatabaseInterface::class => [
'class' => DatabaseInterface::class,
'factory' => [DatabaseInterface::class, 'getInstance'],
'arguments' => [Config::class],
],
DbTableExists::class => ['class' => DbTableExists::class, 'arguments' => [DatabaseInterface::class]],
Designer::class => [
'class' => Designer::class,
'arguments' => [DatabaseInterface::class, Relation::class, Template::class, Config::class],
],
Common::class => [
'class' => Common::class,
'arguments' => [DatabaseInterface::class, Relation::class, Config::class],
],
ErrorHandler::class => ['class' => ErrorHandler::class, 'factory' => [ErrorHandler::class, 'getInstance']],
ErrorReport::class => [
'class' => ErrorReport::class,
'arguments' => [HttpRequest::class, Relation::class, Template::class, Config::class],
],
Events::class => ['class' => Events::class, 'arguments' => [DatabaseInterface::class, Config::class]],
Export::class => ['class' => Export::class, 'arguments' => [DatabaseInterface::class, OutputHandler::class]],
Options::class => [
'class' => Options::class,
'arguments' => [Relation::class, TemplateModel::class, UserPreferencesHandler::class],
],
TemplateModel::class => ['class' => TemplateModel::class, 'arguments' => [DatabaseInterface::class]],
ExpressionLanguage::class => ['class' => ExpressionLanguage::class],
FileListing::class => ['class' => FileListing::class],
FlashMessenger::class => ['class' => FlashMessenger::class],
Header::class => [
'class' => Header::class,
'arguments' => [
Template::class,
Console::class,
Config::class,
DatabaseInterface::class,
Relation::class,
UserPreferences::class,
UserPreferencesHandler::class,
],
],
HttpRequest::class => ['class' => HttpRequest::class],
ResponseFactory::class => ['class' => ResponseFactory::class, 'factory' => [ResponseFactory::class, 'create']],
Import::class => [
'class' => Import::class,
'arguments' => [DatabaseInterface::class, ResponseRenderer::class, Config::class],
],
SimulateDml::class => ['class' => SimulateDml::class, 'arguments' => [DatabaseInterface::class]],
InsertEdit::class => [
'class' => InsertEdit::class,
'arguments' => [
DatabaseInterface::class,
Relation::class,
Transformations::class,
FileListing::class,
Template::class,
Config::class,
ResponseRenderer::class,
],
],
Middleware\ErrorHandling::class => [
'class' => Middleware\ErrorHandling::class,
'arguments' => [ErrorHandler::class],
],
Middleware\OutputBuffering::class => ['class' => Middleware\OutputBuffering::class],
Middleware\PhpExtensionsChecking::class => [
'class' => Middleware\PhpExtensionsChecking::class,
'arguments' => [Template::class, ResponseFactory::class],
],
Middleware\ServerConfigurationChecking::class => [
'class' => Middleware\ServerConfigurationChecking::class,
'arguments' => [Template::class, ResponseFactory::class],
],
Middleware\PhpSettingsConfiguration::class => ['class' => Middleware\PhpSettingsConfiguration::class],
Middleware\RouteParsing::class => ['class' => Middleware\RouteParsing::class],
Middleware\ConfigLoading::class => [
'class' => Middleware\ConfigLoading::class,
'arguments' => [Config::class, Template::class, ResponseFactory::class],
],
Middleware\UriSchemeUpdating::class => [
'class' => Middleware\UriSchemeUpdating::class,
'arguments' => [Config::class],
],
Middleware\SessionHandling::class => [
'class' => Middleware\SessionHandling::class,
'arguments' => [Config::class, ErrorHandler::class, Template::class, ResponseFactory::class],
],
Middleware\EncryptedQueryParamsHandling::class => ['class' => Middleware\EncryptedQueryParamsHandling::class],
Middleware\UrlParamsSetting::class => [
'class' => Middleware\UrlParamsSetting::class,
'arguments' => [Config::class],
],
Middleware\TokenRequestParamChecking::class => [
'class' => Middleware\TokenRequestParamChecking::class,
'arguments' => [ResponseRenderer::class],
],
Middleware\DatabaseAndTableSetting::class => ['class' => Middleware\DatabaseAndTableSetting::class],
Middleware\SqlQueryGlobalSetting::class => ['class' => Middleware\SqlQueryGlobalSetting::class],
Middleware\LanguageLoading::class => ['class' => Middleware\LanguageLoading::class],
Middleware\ConfigErrorAndPermissionChecking::class => [
'class' => Middleware\ConfigErrorAndPermissionChecking::class,
'arguments' => [Config::class, Template::class, ResponseFactory::class],
],
Middleware\RequestProblemChecking::class => [
'class' => Middleware\RequestProblemChecking::class,
'arguments' => [Template::class, ResponseFactory::class],
],
Middleware\CurrentServerGlobalSetting::class => [
'class' => Middleware\CurrentServerGlobalSetting::class,
'arguments' => [Config::class],
],
Middleware\ThemeInitialization::class => ['class' => Middleware\ThemeInitialization::class],
Middleware\UrlRedirection::class => [
'class' => Middleware\UrlRedirection::class,
'arguments' => [UrlRedirector::class, UserPreferencesHandler::class],
],
Middleware\SetupPageRedirection::class => [
'class' => Middleware\SetupPageRedirection::class,
'arguments' => [Config::class, ResponseFactory::class, UserPreferencesHandler::class, ResponseRenderer::class],
],
Middleware\MinimumCommonRedirection::class => [
'class' => Middleware\MinimumCommonRedirection::class,
'arguments' => [ResponseFactory::class, UserPreferencesHandler::class, ResponseRenderer::class],
],
Middleware\LanguageAndThemeCookieSaving::class => [
'class' => Middleware\LanguageAndThemeCookieSaving::class,
'arguments' => [Config::class],
],
Middleware\LoginCookieValiditySetting::class => [
'class' => Middleware\LoginCookieValiditySetting::class,
'arguments' => [Config::class, UserPreferencesHandler::class],
],
Middleware\Authentication::class => [
'class' => Middleware\Authentication::class,
'arguments' => [
Config::class,
Template::class,
ResponseFactory::class,
AuthenticationPluginFactory::class,
DatabaseInterface::class,
Relation::class,
ResponseRenderer::class,
],
],
Middleware\DatabaseServerVersionChecking::class => [
'class' => Middleware\DatabaseServerVersionChecking::class,
'arguments' => [Config::class, Template::class, ResponseFactory::class],
],
Middleware\SqlDelimiterSetting::class => [
'class' => Middleware\SqlDelimiterSetting::class,
'arguments' => [Config::class],
],
Middleware\ResponseRendererLoading::class => [
'class' => Middleware\ResponseRendererLoading::class,
'arguments' => [Config::class, ResponseRenderer::class],
],
Middleware\ProfilingChecking::class => [
'class' => Middleware\ProfilingChecking::class,
'arguments' => [ResponseRenderer::class, DatabaseInterface::class],
],
Middleware\UserPreferencesLoading::class => [
'class' => Middleware\UserPreferencesLoading::class,
'arguments' => [UserPreferencesHandler::class],
],
Middleware\RecentTableHandling::class => [
'class' => Middleware\RecentTableHandling::class,
'arguments' => [Config::class],
],
Middleware\StatementHistory::class => [
'class' => Middleware\StatementHistory::class,
'arguments' => [Config::class, History::class],
],
Navigation::class => [
'class' => Navigation::class,
'arguments' => [Template::class, Relation::class, DatabaseInterface::class, Config::class],
],
Normalization::class => [
'class' => Normalization::class,
'arguments' => [DatabaseInterface::class, Relation::class, Transformations::class, Template::class],
],
Operations::class => [
'class' => Operations::class,
'arguments' => [DatabaseInterface::class, Relation::class, TableMover::class],
],
OutputHandler::class => ['class' => OutputHandler::class],
Maintenance::class => ['class' => Maintenance::class, 'arguments' => [DatabaseInterface::class]],
AuthenticationPluginFactory::class => [
'class' => AuthenticationPluginFactory::class,
'arguments' => [ResponseRenderer::class],
],
Relation::class => ['class' => Relation::class, 'arguments' => [DatabaseInterface::class, Config::class]],
RelationCleanup::class => [
'class' => RelationCleanup::class,
'arguments' => [DatabaseInterface::class, Relation::class],
],
Replication::class => ['class' => Replication::class, 'arguments' => [DatabaseInterface::class]],
ReplicationGui::class => ['class' => ReplicationGui::class, 'arguments' => [Replication::class, Template::class]],
ResponseRenderer::class => [
'class' => ResponseRenderer::class,
'factory' => [ResponseRenderer::class, 'getInstance'],
'arguments' => [
Config::class,
Template::class,
Header::class,
Footer::class,
ErrorHandler::class,
DatabaseInterface::class,
ResponseFactory::class,
],
],
Routines::class => ['class' => Routines::class, 'arguments' => [DatabaseInterface::class, Config::class]],
Plugins::class => ['class' => Plugins::class, 'arguments' => [DatabaseInterface::class]],
Privileges::class => [
'class' => Privileges::class,
'arguments' => [
Template::class,
DatabaseInterface::class,
Relation::class,
RelationCleanup::class,
Plugins::class,
Config::class,
],
],
AccountLocking::class => ['class' => AccountLocking::class, 'arguments' => [DatabaseInterface::class]],
Sql::class => [
'class' => Sql::class,
'arguments' => [
DatabaseInterface::class,
Relation::class,
RelationCleanup::class,
Transformations::class,
Template::class,
BookmarkRepository::class,
Config::class,
ResponseRenderer::class,
],
],
SqlQueryForm::class => [
'class' => SqlQueryForm::class,
'arguments' => [Template::class, DatabaseInterface::class, BookmarkRepository::class],
],
Data::class => ['class' => Data::class, 'arguments' => [DatabaseInterface::class, Config::class]],
Monitor::class => ['class' => Monitor::class, 'arguments' => [DatabaseInterface::class]],
Processes::class => ['class' => Processes::class, 'arguments' => [DatabaseInterface::class]],
ColumnsDefinition::class => [
'class' => ColumnsDefinition::class,
'arguments' => [DatabaseInterface::class, Relation::class, Transformations::class],
],
Indexes::class => ['class' => Indexes::class, 'arguments' => [DatabaseInterface::class]],
\PhpMyAdmin\Table\Maintenance::class => [
'class' => \PhpMyAdmin\Table\Maintenance::class,
'arguments' => [DatabaseInterface::class],
],
Search::class => ['class' => Search::class, 'arguments' => [DatabaseInterface::class]],
Template::class => ['class' => Template::class, 'arguments' => [Config::class]],
ThemeManager::class => ['class' => ThemeManager::class],
Tracking::class => [
'class' => Tracking::class,
'arguments' => [
SqlQueryForm::class,
Template::class,
Relation::class,
DatabaseInterface::class,
TrackingChecker::class,
],
],
TrackingChecker::class => [
'class' => TrackingChecker::class,
'arguments' => [DatabaseInterface::class, Relation::class],
],
Transformations::class => [
'class' => Transformations::class,
'arguments' => [DatabaseInterface::class, Relation::class],
],
Triggers::class => ['class' => Triggers::class, 'arguments' => [DatabaseInterface::class]],
UserPassword::class => [
'class' => UserPassword::class,
'arguments' => [Privileges::class, AuthenticationPluginFactory::class, DatabaseInterface::class],
],
UserPreferences::class => [
'class' => UserPreferences::class,
'arguments' => [
DatabaseInterface::class,
Relation::class,
Template::class,
Config::class,
ClockInterface::class,
],
],
UserPrivilegesFactory::class => [
'class' => UserPrivilegesFactory::class,
'arguments' => [DatabaseInterface::class],
],
VersionInformation::class => ['class' => VersionInformation::class],
BookmarkRepository::class => [
'class' => BookmarkRepository::class,
'arguments' => [DatabaseInterface::class, Relation::class, Config::class],
],
Console::class => [
'class' => Console::class,
'arguments' => [Relation::class, Template::class, BookmarkRepository::class, History::class],
],
TableMover::class => ['class' => TableMover::class, 'arguments' => [DatabaseInterface::class, Relation::class]],
History::class => [
'class' => History::class,
'arguments' => [DatabaseInterface::class, Relation::class, Config::class],
],
UserPreferencesHandler::class => [
'class' => UserPreferencesHandler::class,
'arguments' => [
Config::class,
DatabaseInterface::class,
UserPreferences::class,
LanguageManager::class,
ThemeManager::class,
],
],
LanguageManager::class => ['class' => LanguageManager::class, 'factory' => [LanguageManager::class, 'getInstance']],
ClockInterface::class => ['class' => Clock::class],
Footer::class => ['class' => Footer::class, 'arguments' => [Template::class, Config::class]],
UrlRedirector::class => [
'class' => UrlRedirector::class,
'arguments' => [ResponseRenderer::class, Template::class, ResponseFactory::class],
],
];

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +0,0 @@
<?php
declare(strict_types=1);
use PhpMyAdmin\Container\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $configurator): void {
$services = $configurator->services();
/** @var array<string, array{class: string, arguments?: array<string>, factory?: callable}> $servicesFile */
$servicesFile = include ROOT_PATH . 'app/services.php';
ContainerBuilder::loadServices($servicesFile, $services);
/** @var array<string, array{class: string, arguments?: array<string>, factory?: callable}> $servicesFile */
$servicesFile = include ROOT_PATH . 'app/services_controllers.php';
ContainerBuilder::loadServices($servicesFile, $services);
};

View File

@ -1,13 +1,4 @@
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "current"
}
}
],
"@babel/preset-typescript"
]
"presets": ["@babel/preset-env"],
"sourceType": "script"
}

View File

@ -1,40 +0,0 @@
#!/bin/sh
# Do not run as CGI
if [ -n "$GATEWAY_INTERFACE" ] ; then
echo 'Can not invoke as CGI!'
exit 1
fi
if [ "$1" = --quiet ] ; then
stats=""
shift
else
stats="--statistics"
fi
compile() {
lang=$(echo "$1" | sed 's@resources/po/\(.*\)\.po@\1@')
if [ -n "$stats" ] ; then
printf "%s: " "$lang"
fi
mkdir -p resources/locale/"$lang"/LC_MESSAGES
msgfmt $stats --check -o resources/locale/"$lang"/LC_MESSAGES/phpmyadmin.mo "$1"
return $?
}
if [ -n "$1" ] ; then
compile resources/po/"$1".po
exit $?
fi
result=0
for x in resources/po/*.po ; do
compile "$x"
ret=$?
if [ $ret != 0 ] ; then
echo Error when compiling "$x" >&2
result=$ret
fi
done
exit $result

View File

@ -1,358 +0,0 @@
#!/bin/bash
set -e
FILE="$1"
if [ ! -f "${FILE}" ]; then
echo 'Please provide a file as a first argument.'
exit 1
fi
FILE_LIST="$(tar --list --file="${FILE}")"
found=0;
echo 'Searching for files'
foundFile() {
found=1
printf "Found: %s\n" "${filePath}"
}
foundFileExt() {
found=1
printf "Found unexpected file: %s with extension %s\n" "${pathWithoutFirst}" "${extension}"
}
validateExtension() {
if [ "${filePath: -1}" = "/" ]; then
return;
fi
pathWithoutFirst="$(echo "$filePath" | cut -d / -f 2-)"
filename=$(basename -- "$pathWithoutFirst")
extension="${filename##*.}"
case $pathWithoutFirst in
public/docs/*)
if [ "${extension}" != "png" ] && [ "${extension}" != "txt" ] &&
[ "${extension}" != "html" ] && [ "${extension}" != "js" ] &&
[ "${extension}" != "css" ] && [ "${extension}" != "gif" ]; then
foundFileExt
fi
;;
resources/js/global.d.ts)
;;
public/js/vendor/*)
if [ "${extension}" != "js" ] && [ "${extension}" != "map" ] &&
[ "${extension}" != "css" ] && [ "${filename}" != "LICENSE" ] &&
[ "${extension}" != "txt" ]; then
foundFileExt
fi
;;
public/js/*)
if [ "${extension}" != "js" ] && [ "${extension}" != "map" ]; then
foundFileExt
fi
;;
resources/js/*)
if [ "${extension}" != "ts" ]; then
foundFileExt
fi
;;
resources/sql/*)
if [ "${extension}" != "sql" ]; then
foundFileExt
fi
;;
examples/*)
if [ "${extension}" != "php" ]; then
foundFileExt
fi
;;
resources/locale/*)
if [ "${extension}" != "mo" ]; then
foundFileExt
fi
;;
public/setup/*)
if [ "${extension}" != "php" ] && [ "${extension}" != "twig" ] &&
[ "${extension}" != "css" ] && [ "${extension}" != "scss" ] &&
[ "${extension}" != "gif" ] && [ "${extension}" != "map" ]; then
foundFileExt
fi
;;
resources/templates/*)
if [ "${extension}" != "twig" ]; then
foundFileExt
fi
;;
app/*)
if [ "${extension}" != "php" ]; then
foundFileExt
fi
;;
src/*)
if [ "${extension}" != "php" ] && [ "${extension}" != "md" ] &&
[ "${filename}" != "README" ] && [ "${filename}" != "TEMPLATE" ] &&
[ "${filename}" != "TEMPLATE_ABSTRACT" ]; then
foundFileExt
fi
;;
public/themes/*)
if [ "${extension}" != "css" ] && [ "${extension}" != "png" ] &&
[ "${extension}" != "scss" ] && [ "${extension}" != "map" ] &&
[ "${extension}" != "svg" ] && [ "${extension}" != "ico" ] &&
[ "${extension}" != "gif" ] && [ "${extension}" != "json" ]; then
foundFileExt
fi
;;
vendor/phpmyadmin/sql-parser/locale/*)
if [ "${extension}" != "mo" ]; then
foundFileExt
fi
;;
vendor/composer/ca-bundle/res/cacert.pem)
;;
vendor/pragmarx/google2fa-qrcode/composer.lock)
;;
vendor/williamdes/mariadb-mysql-kbs/cliff.toml)
;;
vendor/williamdes/mariadb-mysql-kbs/dist/merged-ultraslim.json)
;;
vendor/composer/installed.json)
;;
vendor/tecnickcom/tcpdf/*)
if [ "${extension}" != "php" ] && [ "${filename}" != "LICENSE.TXT" ] &&
[ "${filename}" != "README.md" ] && [ "${filename}" != "CHANGELOG.TXT" ] &&
[ "${filename}" != "VERSION" ] && [ "${filename}" != "composer.json" ] &&
[ "${extension}" != "z" ]; then
foundFileExt
fi
;;
vendor/*)
if [ "${extension}" != "php" ] && [ "${filename}" != "LICENSE" ] &&
[ "${filename}" != "README" ] && [ "${filename}" != "CHANGELOG" ] &&
[ "${filename}" != "composer.json" ] && [ "${filename}" != "CHANGELOG.md" ] &&
[ "${filename}" != "README.md" ] && [ "${filename}" != "BACKERS.md" ] &&
[ "${filename}" != "LICENSE.md" ] && [ "${filename}" != "ARCHITECTURE.md" ] &&
[ "${filename}" != "LICENSE.txt" ] && [ "${filename}" != "AUTHORS" ] &&
[ "${filename}" != "LICENCE.md" ] && [ "${filename}" != "LICENCE" ] &&
[ "${filename}" != "COPYRIGHT.md" ]; then
foundFileExt
fi
;;
CHANGELOG-[5-9].[0-9].md)
;;
LICENSE)
;;
RELEASE-DATE-[1-9].[0-9].[0-9])
;;
RELEASE-DATE-[1-9].[0-9].[0-9]-dev)
;;
RELEASE-DATE-[1-9].[0-9]+snapshot)
;;
CONTRIBUTING.md)
;;
README)
;;
public/favicon.ico)
;;
tsconfig.json)
;;
webpack.config.cjs)
;;
babel.config.json)
;;
package.json)
;;
composer.json)
;;
composer.lock)
;;
yarn.lock)
;;
public/robots.txt)
;;
index.php)
;;
public/index.php)
;;
config.sample.inc.php)
;;
*)
foundFileExt
;;
esac
}
for filePath in ${FILE_LIST}; do
validateExtension
case $filePath in
*/composer-require-checker.json)
foundFile;;
*/CLAUDE.MD)
foundFile;;
*/Readme.php)
foundFile;;
*/rector*.php)
foundFile;;
*/.editorconfig)
foundFile;;
*/easy-coding-standard.neon)
foundFile;;
*/.travis.yml)
foundFile;;
*/psalm.xml.dist)
foundFile;;
*/phpdoc.xml)
foundFile;;
*/phpdoc.dist.xml)
foundFile;;
*/.coveralls.yml)
foundFile;;
*/.yamllint.yaml)
foundFile;;
*/appveyor.yml)
foundFile;;
*/phpunit.xml)
foundFile;;
*/phpunit.xml.dist)
foundFile;;
*/phive.xml)
foundFile;;
*/Makefile)
foundFile;;
*/splitsh.json)
foundFile;;
*/phpbench.json)
foundFile;;
*/phpbench.json.dist)
foundFile;;
*/.php-cs-fixer.dist.php)
foundFile;;
*/.php_cs)
foundFile;;
*/.php_cs.dist)
foundFile;;
*/.php_cs.cache)
foundFile;;
*/.php-cs-fixer.php)
foundFile;;
*/psalm.xml)
foundFile;;
*/phpcs.xml)
foundFile;;
*/phpcs.xml.dist)
foundFile;;
*/ecs.php)
foundFile;;
*/.scrutinizer.yml)
foundFile;;
*/.phpstorm.meta.php)
foundFile;;
*/codecov.yml)
foundFile;;
*/.gitattributes)
foundFile;;
*/.gitignore)
foundFile;;
*/.gitkeep)
foundFile;;
*/.mailmap)
foundFile;;
*/.env)
foundFile;;
*/infection.json.dist)
foundFile;;
*/infection.json)
foundFile;;
*/infection.json5.dist)
foundFile;;
*/infection.json5)
foundFile;;
*/makefile)
foundFile;;
*/.phpunit.result.cache)
foundFile;;
*/phpstan.neon)
foundFile;;
*/phpstan.neon.dist)
foundFile;;
*/phpstan-baseline.neon)
foundFile;;
*/phpmd.xml.dist)
foundFile;;
*/.travis.php.ini)
foundFile;;
*/vendor/*/tests/*)
foundFile;;
*/vendor/*/Tests/*)
foundFile;;
*/vendor/*/test/*)
foundFile;;
*/twig/twig/lib/Twig/Node/Expression/Test/*)
;;
*/twig/twig/lib/Twig/Test/*)
;;
*twig/twig/src/Node/Expression/Test/*)
;;
*/vendor/*/Test/*)
foundFile;;
*/.dependabot/*)
foundFile;;
*/.github/*)
foundFile;;
*/.circleci/*)
foundFile;;
*/vendor/examples/*)
foundFile;;
*/.git/*)
foundFile;;
*vendor/*.rst)
foundFile;;
*vendor/*.po)
foundFile;;
*vendor/*.pot)
foundFile;;
*vendor/*.m4)
foundFile;;
*vendor/*.c)
foundFile;;
*vendor/*.h)
foundFile;;
*vendor/*.sh)
foundFile;;
*vendor/*.w32)
foundFile;;
*.hhconfig)
foundFile;;
*.hhi)
foundFile;;
*.xsd)
foundFile;;
*.xml)
foundFile;;
*vendor/*CONTRIBUTING.md*)
foundFile;;
*CODE_OF_CONDUCT.md*)
foundFile;;
*PERFORMANCE.md*)
foundFile;;
*phar*)
foundFile;;
*) ;;
esac
done
if [ ${found} -gt 0 ]; then
echo 'Some new files to be excluded were found.'
echo 'Please update create-release.sh'
exit 1
else
echo 'Everything looks okay'
exit 0
fi

View File

@ -1,755 +0,0 @@
#!/bin/sh
#
# vim: expandtab sw=4 ts=4 sts=4:
#
# Do not run as CGI
if [ -n "$GATEWAY_INTERFACE" ] ; then
echo 'Can not invoke as CGI!'
exit 1
fi
# More documentation about making a release is available at:
# https://wiki.phpmyadmin.net/pma/Releasing
# Fail on undefined variables
set -u
# Fail on failure
set -e
KITS="all-languages english source"
COMPRESSIONS="zip-7z txz tgz"
# The version series this script is allowed to handle
VERSION_SERIES="6.0"
# Process parameters
version=""
branch=""
do_tag=0
do_stable=0
do_test=0
do_ci=0
do_sign=1
do_pull=0
do_daily=0
do_revision=0
while [ $# -gt 0 ] ; do
case "$1" in
--tag)
do_tag=1
;;
--stable)
do_stable=1
;;
--test)
do_test=1
;;
--revision-info)
do_revision=1
;;
--daily)
do_sign=0
do_pull=1
do_daily=1
do_test=1
;;
--ci)
do_test=1
do_ci=1
if [ -z "$branch" ] ; then
git branch ci
branch="ci"
fi
;;
--no-sign)
do_sign=0
;;
--kits)
KITS="$2"
# Skip one position, the value
shift
;;
--compressions)
COMPRESSIONS="$2"
# Skip one position, the value
shift
;;
--help)
echo "Usages:"
echo " create-release.sh <version> <from_branch> [--tag] [--stable] [--test] [--ci] [--daily] [--revision-info] [--compressions] [--kits] [--no-sign]"
echo ""
echo "If --tag is specified, release tag is automatically created (use this for all releases including pre-releases)"
echo "If --stable is specified, the STABLE branch is updated with this release"
echo "If --test is specified, the testsuite is executed before creating the release"
echo "If --ci is specified, the testsuite is executed and no actual release is created"
echo "If --no-sign is specified, the output files will not be signed"
echo "If --daily is specified, the output files will have snapshot information"
echo "If --revision-info is specified, the output files will contain git revision info"
echo "If --compressions is specified, it changes the compressions available. Space separated values. Valid values: $COMPRESSIONS"
echo "If --kits is specified, it changes the kits to be built. Space separated values. Valid values: $KITS"
echo ""
echo "Examples:"
echo " create-release.sh 5.2.2-dev QA_5_2"
echo " create-release.sh 5.2.2 QA_5_2 --tag --stable"
exit 65
;;
*)
do_test=1
if [ -z "$version" ] ; then
version=$(echo "$1" | tr -d -c '0-9a-z.+-')
if [ "x$version" != "x$1" ] ; then
echo "Invalid version: $1"
exit 1
fi
elif [ -z "$branch" ] ; then
branch=$(echo "$1" | tr -d -c '/0-9A-Za-z_-')
if [ "x$branch" != "x$1" ] ; then
echo "Invalid branch: $1"
exit 1
fi
else
echo "Unknown parameter: $1!"
echo "Use --help to check the syntax."
exit 1
fi
esac
shift
done
if [ -z "$version" ] && [ $do_ci -eq 0 ]; then
echo "Version must be specified!"
exit 1
fi
if [ -z "$branch" ]; then
echo "Branch must be specified!"
exit 1
fi
kit_prefix="phpMyAdmin-$version"
# Checks whether remote branch has local tracking branch
ensure_local_branch() {
if ! git branch | grep -q '^..'"$1"'$' ; then
git branch --track "$1" origin/"$1"
fi
}
# Marks current head of given branch as head of other branch
# Used for STABLE tracking
mark_as_release() {
branch=$1
rel_branch=$2
echo "* Marking release as $rel_branch"
ensure_local_branch "$rel_branch"
git checkout "$rel_branch"
git merge -s recursive -X theirs "$branch"
git checkout master
}
cleanup_composer_vendors() {
echo "* Cleanup of composer packages"
rm -r \
vendor/phpmyadmin/sql-parser/tests/ \
vendor/phpmyadmin/sql-parser/src/Tools/ \
vendor/phpmyadmin/sql-parser/locale/sqlparser.pot \
vendor/phpmyadmin/sql-parser/locale/*/LC_MESSAGES/sqlparser.po \
vendor/phpmyadmin/sql-parser/bin/ \
vendor/phpmyadmin/sql-parser/phpunit.xml.dist \
vendor/phpmyadmin/motranslator/phpunit.xml.dist \
vendor/phpmyadmin/motranslator/psalm-baseline.xml \
vendor/phpmyadmin/motranslator/psalm.xml \
vendor/phpmyadmin/motranslator/tests/ \
vendor/phpmyadmin/shapefile/phpunit.xml.dist \
vendor/phpmyadmin/shapefile/tests/ \
vendor/phpmyadmin/shapefile/examples/ \
vendor/phpmyadmin/shapefile/data/ \
vendor/symfony/service-contracts/Test/ \
vendor/symfony/expression-language/Resources/ \
vendor/symfony/dependency-injection/Loader/schema/services.schema.json \
vendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsd \
vendor/tecnickcom/tcpdf/tools/ \
vendor/tecnickcom/tcpdf/fonts/ae_fonts_*/ \
vendor/tecnickcom/tcpdf/fonts/dejavu-fonts-ttf-2.*/ \
vendor/tecnickcom/tcpdf/fonts/freefont-*/ \
vendor/tecnickcom/tcpdf/include/sRGB.icc \
vendor/williamdes/mariadb-mysql-kbs/schemas/ \
vendor/williamdes/mariadb-mysql-kbs/dist/merged-raw.json \
vendor/williamdes/mariadb-mysql-kbs/dist/merged-raw.md \
vendor/williamdes/mariadb-mysql-kbs/dist/merged-slim.json \
vendor/williamdes/mariadb-mysql-kbs/dist/merged-ultraslim.php \
vendor/google/recaptcha/app.yaml \
vendor/laminas/laminas-httphandlerrunner/.laminas-ci.json \
vendor/nikic/fast-route/.travis.yml \
vendor/nikic/fast-route/.hhconfig \
vendor/nikic/fast-route/FastRoute.hhi \
vendor/nikic/fast-route/phpunit.xml \
vendor/nikic/fast-route/psalm.xml \
vendor/nikic/fast-route/test/ \
vendor/twig/twig/README.rst \
vendor/webmozart/assert/.php-cs-fixer.php \
vendor/twig/twig/src/Test/ \
vendor/psr/event-dispatcher/.editorconfig \
vendor/psr/http-message/docs/ \
vendor/pragmarx/google2fa/.github/ \
vendor/pragmarx/google2fa-qrcode/.scrutinizer.yml \
vendor/pragmarx/google2fa-qrcode/.travis.yml \
vendor/pragmarx/google2fa-qrcode/phpunit.xml \
vendor/pragmarx/google2fa-qrcode/tests \
vendor/slim/psr7/phpunit.xml.dist \
vendor/slim/psr7/tests/
rm \
vendor/phpmyadmin/motranslator/CODE_OF_CONDUCT.md \
vendor/phpmyadmin/motranslator/CONTRIBUTING.md \
vendor/phpmyadmin/motranslator/PERFORMANCE.md \
vendor/phpmyadmin/shapefile/CONTRIBUTING.md \
vendor/spomky-labs/cbor-php/CODE_OF_CONDUCT.md \
vendor/spomky-labs/cbor-php/RELEASES.md \
vendor/spomky-labs/cbor-php/SECURITY.md \
vendor/spomky-labs/pki-framework/SECURITY.md \
vendor/web-auth/cose-lib/CODE_OF_CONDUCT.md \
vendor/web-auth/cose-lib/RELEASES.md \
vendor/web-auth/cose-lib/SECURITY.md
find vendor/tecnickcom/tcpdf/fonts/ -maxdepth 1 -type f \
-not -name 'dejavusans.*' \
-not -name 'dejavusansb.*' \
-not -name 'helvetica.php' \
-print0 | xargs -0 rm
}
backup_vendor_folder() {
TEMP_FOLDER="$(mktemp -d /tmp/phpMyAdmin.XXXXXXXXX)"
cp -rp ./vendor "${TEMP_FOLDER}"
}
restore_vendor_folder() {
if [ ! -d "${TEMP_FOLDER}" ]; then
echo 'No backup to restore'
exit 1;
fi
rm -r ./vendor
mv "${TEMP_FOLDER}/vendor" ./vendor
rmdir "${TEMP_FOLDER}"
}
get_composer_package_version() {
awk '/require-dev/ {printline = 1; print; next } printline' composer.json | grep "$1" | awk -F [\"] '{print $4}'
}
create_phpunit_sandbox() {
PHPUNIT_VERSION="$(get_composer_package_version 'phpunit/phpunit')"
TEMP_PHPUNIT_FOLDER="$(mktemp -d /tmp/phpMyAdmin-phpunit.XXXXXXXXX)"
cd "${TEMP_PHPUNIT_FOLDER}"
composer require --no-interaction --dev "phpunit/phpunit:${PHPUNIT_VERSION}"
cd -
}
delete_phpunit_sandbox() {
if [ ! -d "${TEMP_PHPUNIT_FOLDER}" ]; then
echo 'No phpunit sandbox to delete'
exit 1;
fi
rm -r "${TEMP_PHPUNIT_FOLDER}"
}
security_checkup() {
if [ ! -f vendor/tecnickcom/tcpdf/tcpdf.php ]; then
echo 'TCPDF should be installed, detection failed !'
exit 1;
fi
if [ ! -f vendor/web-auth/webauthn-lib/src/PublicKeyCredential.php ]; then
echo 'Webauthn-lib should be installed, detection failed !'
exit 1;
fi
if [ ! -f vendor/code-lts/u2f-php-server/src/U2FServer.php ]; then
echo 'U2F-server should be installed, detection failed !'
exit 1;
fi
if [ ! -f vendor/pragmarx/google2fa-qrcode/src/Google2FA.php ]; then
echo 'Google 2FA should be installed, detection failed !'
exit 1;
fi
}
autoload_checkup() {
php <<'CODE'
<?php
$classMapFiles = require __DIR__ . '/vendor/composer/autoload_classmap.php';
$foundFiles = 0;
$notFoundFiles = 0;
foreach ($classMapFiles as $classMapFile) {
if (! file_exists($classMapFile)) {
echo 'Does not exist: ' . $classMapFile . PHP_EOL;
$notFoundFiles++;
continue;
}
$foundFiles++;
}
echo '[autoload class map checkup] Found files: ' . $foundFiles . PHP_EOL;
echo '[autoload class map checkup] NOT found files: ' . $notFoundFiles . PHP_EOL;
$minFilesToHave = 1100;// An arbitrary value based on how many files the autoload has on average
if ($foundFiles < $minFilesToHave) {
echo '[autoload class map checkup] The project expects at least ' . $minFilesToHave . ' in the autoload class map' . PHP_EOL;
exit(1);
}
if ($notFoundFiles > 0) {
echo '[autoload class map checkup] There is some missing files documented in the class map' . PHP_EOL;
exit(1);
}
echo '[autoload class map checkup] The autoload class map seems okay' . PHP_EOL;
CODE
}
# Ensure we have tracking branch
ensure_local_branch "$branch"
VERSION_FILE=src/Version.php
# Keep in sync with update-po script
fetchReleaseFromFile() {
SUFFIX="${1:-}"
php -r "define('VERSION_SUFFIX', '$SUFFIX'); require_once('$VERSION_FILE'); echo \PhpMyAdmin\Version::VERSION;"
}
fetchVersionSeriesFromFile() {
php -r "define('VERSION_SUFFIX', ''); require_once('$VERSION_FILE'); echo \PhpMyAdmin\Version::SERIES;"
}
VERSION_FROM_FILE="$(fetchReleaseFromFile)"
VERSION_SERIES_FROM_FILE="$(fetchVersionSeriesFromFile)"
if [ $do_ci -eq 1 ]; then
VERSION_FROM_FILE="$(fetchReleaseFromFile '+ci')"
version="${VERSION_FROM_FILE}"
fi
if [ "${VERSION_SERIES_FROM_FILE}" != "${VERSION_SERIES}" ]; then
echo "This script can not handle ${VERSION_SERIES_FROM_FILE} version series."
echo "Only ${VERSION_SERIES} version series are allowed, please use your target branch directly or another branch."
echo "By changing branches you will have a release script that was designed for your version series."
exit 1;
fi
echo "The actual configured release is: $VERSION_FROM_FILE"
echo "The actual configured release series is: $VERSION_SERIES_FROM_FILE"
if [ $do_ci -eq 0 ] && [ $do_daily -eq 0 ] ; then
cat <<END
Please ensure you have incremented rc count or version in the repository :
- run ./bin/console set-version $version
- in $VERSION_FILE Version class:
- check that VERSION, MAJOR, MINOR and PATCH are correct.
- in docs/conf.py the line
" version = '$version' "
- in README the "Version" line
- in package.json the line
" "version": "$version", "
- set release date in ChangeLog
Continue (y/n)?
END
read -r do_release
if [ "$do_release" != 'y' ]; then
exit 100
fi
echo "The actual configured release is now: $(fetchReleaseFromFile)"
fi
# Create working copy
mkdir -p release
git worktree prune
workdir_name=phpMyAdmin-$version
workdir=release/$workdir_name
if [ -d "$workdir" ] ; then
echo "Working directory '$workdir' already exists, please move it out of the way"
exit 1
fi
# Add worktree with chosen branch
git worktree add --force "$workdir" "$branch"
cd "$workdir"
if [ $do_pull -eq 1 ] ; then
git pull -q
fi
if [ $do_daily -eq 1 ] ; then
git_head=$(git log -n 1 --format=%H)
git_head_short=$(git log -n 1 --format=%h)
today_date=$(date +'%Y%m%d' -u)
fi
if [ $do_daily -eq 1 ] ; then
echo '* setting the version suffix for the snapshot'
sed -i "s/'versionSuffix' => '.*'/'versionSuffix' => '+$today_date.$git_head_short'/" app/vendor_config.php
php -l app/vendor_config.php
# Fetch it back and refresh $version
VERSION_FROM_FILE="$(fetchReleaseFromFile "+$today_date.$git_head_short")"
version="${VERSION_FROM_FILE}"
echo "The actual configured release is: $VERSION_FROM_FILE"
fi
# Check release version
if [ $do_ci -eq 0 ] && [ -$do_daily -eq 0 ] ; then
if ! grep -q "VERSION = '$version'" $VERSION_FILE ; then
echo "There seems to be wrong version in $VERSION_FILE!"
exit 2
fi
if ! grep -q "version = '$version'" docs/conf.py ; then
echo "There seems to be wrong version in docs/conf.py"
exit 2
fi
if ! grep -q "Version $version\$" README ; then
echo "There seems to be wrong version in README"
exit 2
fi
if ! grep -q "\"version\": \"$version\"," package.json ; then
echo "There seems to be wrong version in package.json"
exit 2
fi
fi
# Save the build date
if [ $do_daily -eq 1 ] ; then
LC_ALL=C date -u > RELEASE-DATE-"$VERSION_SERIES_FROM_FILE"+snapshot
else
LC_ALL=C date -u > RELEASE-DATE-"$version"
fi
# Building documentation
echo "* Running sphinx-build (version: $(sphinx-build --version))"
echo "* Generating documentation"
LC_ALL=C make -C docs html
find docs -name '*.pyc' -print0 | xargs -0 -r rm -f
# Check for gettext support
if [ -d resources/po ] ; then
echo "* Generating mo files"
./bin/generate-mo
if [ -f ./bin/remove-incomplete-mo ] ; then
echo "* Removing incomplete translations"
./bin/remove-incomplete-mo
fi
fi
if [ -f ./bin/line-counts.sh ] ; then
echo "* Generating line counts"
./bin/line-counts.sh
fi
echo "* Removing unneeded files"
# Remove developer information
rm -r .github CODE_OF_CONDUCT.md DCO
# Testsuite setup
rm .scrutinizer.yml .weblate codecov.yml
# Remove Doctum config file
rm tests/doctum-config.php
# Remove readme for github
rm README.rst
if [ -f ./bin/console ]; then
# Update the vendors to have the dev vendors
composer install --no-interaction
# Warm up the routing cache for 5.1+ releases
./bin/console cache:warmup --routing
if [ $do_revision -eq 1 ] ; then
./bin/console write-revision-info
fi
fi
echo "* Writing the version to composer.json (version: $version)"
composer config version "$version"
# Okay, there is no way to tell composer to install
# suggested package. Let's require it and then revert
# composer.json to original state.
cp composer.json composer.json.backup
COMPOSER_VERSION="$(composer --version)"
echo "* Running composer (version: $COMPOSER_VERSION)"
composer install --no-interaction --no-dev
# Parse the required versions from composer.json
PACKAGE_LIST='tecnickcom/tcpdf pragmarx/google2fa-qrcode bacon/bacon-qr-code code-lts/u2f-php-server web-auth/webauthn-lib'
set --
for PACKAGES in $PACKAGE_LIST
do
PKG_VERSION="$(get_composer_package_version "$PACKAGES")"
set -- "$@" "$PACKAGES:$PKG_VERSION"
done
echo "* Installing composer packages '$*'"
# Allows word splitting
# shellcheck disable=SC2086
composer require --no-interaction --update-no-dev "$@"
echo "* Running a security checkup"
security_checkup
echo "* Cleaning up vendor folders"
mv composer.json.backup composer.json
cleanup_composer_vendors
echo "* Re-generating the autoload class map"
# https://getcomposer.org/doc/articles/autoloader-optimization.md#what-does-it-do-
# We removed some files, we also need that composer removes them from autoload class maps
# If the class is in the class map (as explained in the link above) then it is assumed to exist as a file
composer dump-autoload --no-interaction --optimize --dev
echo "* Running an autoload checkup"
autoload_checkup
echo "* Running a security checkup"
security_checkup
if [ -f package.json ] ; then
echo "* Running Yarn"
yarn install --production
fi
# Remove git metadata
rm .git
find . -name .gitignore -print0 | xargs -0 -r rm
find . -name .gitkeep -print0 | xargs -0 -r rm
find . -name .gitattributes -print0 | xargs -0 -r rm
if [ $do_test -eq 1 ] ; then
# Move the folder out and install dev vendors
create_phpunit_sandbox
# Backup the files because the new autoloader will change the composer vendor
backup_vendor_folder
# Generate an autoload for test class files (and include dev namespaces)
composer dump-autoload --dev || php -r "echo 'Requires: composer >= v2.1.2' . PHP_EOL; exit(1);"
"${TEMP_PHPUNIT_FOLDER}/vendor/bin/phpunit" --no-coverage --testsuite unit
test_ret=$?
if [ $do_ci -eq 1 ] ; then
cd ../..
rm -r "$workdir"
git worktree prune
if [ "$branch" = "ci" ] ; then
git branch -D ci
fi
exit $test_ret
fi
if [ $test_ret -ne 0 ] ; then
exit $test_ret
fi
# Remove PHPUnit cache file
rm -f .phpunit.result.cache
# Generate an normal autoload (this is just a security, because normally the vendor folder will be restored)
composer dump-autoload
# Remove libs installed for testing
rm -r build
delete_phpunit_sandbox
restore_vendor_folder
fi
security_checkup
cd ..
SIGN_FILES=""
# Prepare all kits
for kit in $KITS ; do
echo "* Building kit: $kit"
# Copy all files
name=$kit_prefix-$kit
cp -r "$workdir_name" "$name"
# Cleanup translations
cd "$name"
./bin/internal/lang-cleanup.sh "$kit"
# Remove tests, source code,...
if [ "$kit" != source ] ; then
echo "* Removing source files"
# Testsuite
rm -r tests/
# Template test files
rm -r resources/templates/test/
rm phpunit.xml.*
rm .editorconfig .browserslistrc .eslintignore .jshintrc .eslintrc.json .stylelintrc.json psalm.xml psalm-baseline.xml phpstan.neon.dist phpstan-baseline.neon phpcs.xml.dist jest.config.cjs infection.json5.dist .phpstorm.meta.php
# Gettext po files (if they were not removed by ./bin/internal/lang-cleanup.sh)
rm -rf resources/po
# Documentation source code
mv docs/html htmldoc
rm -r docs
mkdir public/docs
mv htmldoc public/docs/html
rm public/docs/html/.buildinfo public/docs/html/objects.inv
rm -r node_modules
# Remove bin files for non source version
# https://github.com/phpmyadmin/phpmyadmin/issues/16033
rm -r vendor/bin
# Remove developer scripts
rm -r bin
fi
# Remove possible tmp folder
rm -rf tmp
cd ..
# Remove tar file possibly left from previous run
rm -f "$name".tar
# Prepare distributions
for comp in $COMPRESSIONS ; do
case $comp in
tbz|tgz|txz)
if [ ! -f "$name".tar ] ; then
echo "* Creating $name.tar"
tar --owner=root --group=root --numeric-owner --sort=name -cf "$name".tar "$name"
fi
if [ "$comp" = txz ] ; then
echo "* Creating $name.tar.xz"
xz -9k "$name".tar
SIGN_FILES="$SIGN_FILES $name.tar.xz"
fi
if [ "$comp" = tgz ] ; then
echo "* Creating $name.tar.gz"
gzip -9c "$name".tar > "$name".tar.gz
SIGN_FILES="$SIGN_FILES $name.tar.gz"
fi
;;
zip-7z)
echo "* Creating $name.zip"
7za a -bd -tzip "$name".zip "$name" > /dev/null
SIGN_FILES="$SIGN_FILES $name.zip"
;;
*)
echo "WARNING: ignoring compression '$comp', not known!"
;;
esac
done
# Cleanup
rm -f "$name".tar
# Remove directory with current dist set
rm -r "$name"
done
# Cleanup
rm -r "$workdir_name"
git worktree prune
# Signing of files with default GPG key
if [ $do_sign -eq 1 ] ; then
echo "* Signing and making .sha{1,256} files"
else
echo "* Making .sha{1,256} files"
fi
for file in $SIGN_FILES; do
if [ $do_sign -eq 1 ] ; then
gpg --detach-sign --armor "$file"
fi
sha1sum "$file" > "$file".sha1
sha256sum "$file" > "$file".sha256
done
if [ $do_daily -eq 1 ] ; then
cat > "$kit_prefix".json << EOT
{
"date": "$(date --iso-8601=seconds)",
"commit": "$git_head"
}
EOT
exit 0
fi
echo ""
echo ""
echo ""
echo "Files:"
echo "------"
ls -la $SIGN_FILES
cd ..
# Tag as release
if [ $do_tag -eq 1 ] ; then
echo
echo "Additional tasks:"
tagname=RELEASE_$(echo "$version" | tr . _ | tr '[:lower:]' '[:upper:]' | tr -d -)
echo "* Tagging release as $tagname"
git tag -s -a -m "Released $version" "$tagname" "$branch"
echo " Dont forget to push tags using: git push --tags"
fi
# Mark as stable release
if [ $do_stable -eq 1 ] ; then
mark_as_release "$branch" STABLE
fi
cat <<END
Todo now:
---------
1. Push the new tag upstream, with a command like git push origin --tags
2. Push the new STABLE branch upstream
3. prepare a release/phpMyAdmin-$version-notes.html explaining in short the goal of
this release and paste into it the ChangeLog for this release, followed
by the notes of all previous incremental versions (i.e. 4.4.9 through 4.4.0)
4. upload the files to our file server, use bin/internal/upload-release, eg.:
./bin/internal/upload-release $version release
5. add a news item to our website; a good idea is to include a link to the release notes such as https://www.phpmyadmin.net/files/4.4.10/
6. send a short mail (with list of major changes) to
developers@phpmyadmin.net
news@phpmyadmin.net
Don't forget to update the Description section in the announcement,
based on documentation.
7. increment rc count or version in the repository :
- run ./bin/console set-version $version
- in $VERSION_FILE Version class:
- check that VERSION, MAJOR, MINOR and PATCH are correct.
- in README the "Version" line
" Version 2.7.1-dev "
- in package.json the line
" "version": " 2.7.1-dev", "
- in docs/conf.py (if it exists) the line
" version = '2.7.1-dev' "
8. on https://github.com/phpmyadmin/phpmyadmin/milestones close the milestone corresponding to the released version (if this is a stable release) and open a new one for the next minor release
9. for a major release, update demo/php/versions.ini in the scripts repository so that the demo server shows current versions
10. in case of a new major release ('y' in x.y.0), update the pmaweb/settings.py in website repository to include the new major releases
11. update the Dockerfile in the docker repository to reflect the new version and create a new annotated tag (such as with git tag -s -a 4.7.9-1 -m "Version 4.7.9-1"). Remember to push the tag with git push origin {tagName}
END

View File

@ -1,52 +0,0 @@
#!/bin/sh
#
# vim: expandtab sw=4 ts=4 sts=4:
#
# Script for removing language selection from phpMyAdmin
# Do not run as CGI
if [ -n "$GATEWAY_INTERFACE" ] ; then
echo 'Can not invoke as CGI!'
exit 1
fi
if [ $# -lt 1 ] ; then
echo "Usage: lang-cleanup.sh type"
echo "Type can be one of:"
echo " all-languages - nothing will be done"
echo " source - nothing will be done"
echo " english - no translations will be kept"
echo " langcode - keeps language"
echo
echo "Languages can be specified multiple times"
exit 1
fi
# Expression for find
match=""
for type in "$@" ; do
case $type in
all-languages|source)
exit 0
;;
english)
rm -rf resources/po
rm -rf resources/locale
rm -rf vendor/phpmyadmin/sql-parser/locale
exit 0
;;
*)
match="$match -and -not -name $type.po -and -not -path resources/locale/$type/LC_MESSAGES/phpmyadmin.mo -and -not -path vendor/phpmyadmin/sql-parser/locale/$type/LC_MESSAGES/sqlparser.mo"
;;
esac
done
# Delete unwanted languages
# shellcheck disable=SC2086
find resources/po resources/locale vendor/phpmyadmin/sql-parser/locale -type f $match -print0 | xargs -0r rm
# Delete empty directories
rmdir --ignore-fail-on-non-empty resources/locale/*/*
rmdir --ignore-fail-on-non-empty resources/locale/*
rmdir --ignore-fail-on-non-empty vendor/phpmyadmin/sql-parser/locale/*/*
rmdir --ignore-fail-on-non-empty vendor/phpmyadmin/sql-parser/locale/*

View File

@ -1,11 +0,0 @@
#!/bin/sh
# Do not run as CGI
if [ -n "$GATEWAY_INTERFACE" ] ; then
echo 'Can not invoke as CGI!'
exit 1
fi
for x in resources/po/*.po ; do
grep 'Team' "$x" | sed 's/.*: \(.*\)<.*/\1/'
git shortlog -sne --no-merges -- "$x" | grep '^ [ 0-9][0-9]\{3\}'
done

View File

@ -1,76 +0,0 @@
#!/bin/bash
#
# vim: expandtab sw=4 ts=4 sts=4:
#
# This requires Bash for the search and replace substitution to escape dots
# Do not run as CGI
if [ -n "$GATEWAY_INTERFACE" ] ; then
echo 'Can not invoke as CGI!'
exit 1
fi
# Fail on undefined variables
set -u
# Fail on failure
set -e
printHelp () {
echo
echo "Please pass the new version number as a command line argument such as"
echo "$0 -v 5.0.0-dev"
echo
}
if [ $# -eq 0 ]
then
printHelp
exit 1
fi
if [ "$1" = '-v' ]
then
newVersion=$2
else
printHelp
exit 2
fi
# If we're in the scripts directory, we need to do all our work up a directory level
if [ "$(basename "$(pwd)")" = 'bin' ]
then
dir='../'
else
dir=''
fi
# There are half a dozen ways to do this, including individually recreating the line of
# each file (search for 'version =' in conf.py and replace it with 'version = 5.0.0-dev'
# for instance), and while that's more precise this should work with less to fix if a line changes.
# This method wasn't selected for any particular strength.
oldVersion="$(grep 'version =' "${dir}"docs/conf.py | cut -d "'" -f2)"
echo "Changing from ${oldVersion} to ${newVersion}..."
# Escape the dot for sed
oldVersion=${oldVersion//./\.}
newVersion=${newVersion//./\.}
for f in README docs/conf.py package.json
do
if ! grep --quiet "${oldVersion}" "${dir}${f}"
then
# There may be a better way to test for a failure of the substitution itself, such as using the 'q' directive with sed
# See https://stackoverflow.com/questions/15965073/return-code-of-sed-for-no-match
echo "FAILED! Substitution string ${oldVersion} not found in ${dir}${f}"
fi
sed -i "s/${oldVersion}/${newVersion}/g" "${dir}${f}"
done
echo
echo "- Next, you need to manually edit ChangeLog to manually change the version number and set the release date, and verify the changes with 'git diff'."
echo "- You will probably want to call: \"./bin/console set-version ${newVersion}\" afterwards"
echo "- You should check if you need to change the composer.json file and the theme.json file for each bundled theme."
echo " To change the composer.json file you can call something like: \"composer config extra.branch-alias.dev-master \"5.2.x-dev\"\""
echo "- Suggested commit message: Prepare for version ${newVersion}"

View File

@ -1,75 +0,0 @@
#!/bin/sh
#
# Removes mo files for incomplete translations
#
# Do not run as CGI
if [ -n "$GATEWAY_INTERFACE" ] ; then
echo 'Can not invoke as CGI!'
exit 1
fi
set -e
#
# How many percent needs to be translated
#
THRESHOLD=40
#
# Generated output file
#
TMPOUTPUTFILE=app/language_stats.inc.php.tmp
OUTPUTFILE=app/language_stats.inc.php
if [ -n "$1" ] ; then
THRESHOLD=$1
fi
{
echo '<?php'
echo '/**'
echo ' * Automatically generated file, do not edit!'
echo ' * Generated by bin/remove-incomplete-mo'
echo ' */'
echo ''
echo "return ["
} > $TMPOUTPUTFILE
check() {
TMPOUTPUTFILE=$2
lang=$(echo "$1" | sed 's@resources/po/\(.*\)\.po@\1@')
STATS=$(LC_ALL=C msgfmt --statistics -o /dev/null "$1" 2>&1)
if echo "$STATS" | grep -q ' translated ' ; then
TRANSLATED=$(echo "$STATS" | sed 's/\(^\|.* \)\([0-9]*\) translated.*/\2/')
else
TRANSLATED=0
fi
if echo "$STATS" | grep -q ' fuzzy ' ; then
FUZZY=$(echo "$STATS" | sed 's/\(^\|.* \)\([0-9]*\) fuzzy.*/\2/')
else
FUZZY=0
fi
if echo "$STATS" | grep -q ' untranslated ' ; then
UNTRANSLATED=$(echo "$STATS" | sed 's/\(^\|.* \)\([0-9]*\) untranslated.*/\2/')
else
UNTRANSLATED=0
fi
PERCENT=$((100 * TRANSLATED / ( TRANSLATED + FUZZY + UNTRANSLATED )))
echo " '$lang' => $PERCENT," >> "$TMPOUTPUTFILE"
if [ "$PERCENT" -lt "$THRESHOLD" ] ; then
echo "Removing $lang, only $PERCENT%"
rm -f resources/locale/"$lang"/LC_MESSAGES/phpmyadmin.mo
rmdir resources/locale/"$lang"/LC_MESSAGES
rmdir resources/locale/"$lang"
fi
}
for x in resources/po/*.po ; do
check "$x" "$TMPOUTPUTFILE"
done
echo '];' >> "$TMPOUTPUTFILE"
mv "$TMPOUTPUTFILE" $OUTPUTFILE

View File

@ -1,63 +0,0 @@
#!/bin/bash
#
# Shell script that creates a new transformation plug-in (both main and
# abstract class) using a template.
#
# The 'description' parameter will add a new entry in the language file.
# Watch out for special escaping.
#
# $1: MIMEType
# $2: MIMESubtype
# $3: Transformation Name
# $4: (optional) Description
# Do not run as CGI
if [ -n "$GATEWAY_INTERFACE" ] ; then
echo 'Can not invoke as CGI!'
exit 1
fi
if [ $# -ne 3 ] && [ $# -ne 4 ]; then
echo -e "Usage: ./generator_plugin.sh MIMEType MIMESubtype TransformationName [Description]\n"
exit 65
fi
# make sure that the MIME Type, MIME Subtype and Transformation names
# are in the correct format
# make all names lowercase
MT="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
MS="$(echo "$2" | tr '[:upper:]' '[:lower:]')"
TN="$(echo "$3" | tr '[:upper:]' '[:lower:]')"
# make first letter uppercase
MT="${MT^}"
MS="${MS^}"
TN="${TN^}"
# make the first letter after each underscore uppercase
# define the name of the main class file and of its template
CLASS_NAME=$(echo "$MT"_"$MS"_"$TN" | sed -e 's/_./\U&\E/g')
BASE_DIR="./src/Plugins/Transformations"
ClassFile="$BASE_DIR"/"$CLASS_NAME".php
Template="$BASE_DIR"/TEMPLATE
# define the name of the abstract class file and its template
AbstractClassFile="$BASE_DIR"/Abs/"$TN"TransformationsPlugin.php
AbstractTemplate="$BASE_DIR"/TEMPLATE_ABSTRACT
# replace template names with argument names
sed "s/\[MIMEType]/$MT/; s/\[MIMESubtype\]/$MS/; s/\[TransformationName\]/$TN/;" < $Template > "$ClassFile"
echo "Created $ClassFile"
GenerateAbstractClass=1
if [ -n "$4" ]; then
if [ "$4" == "--generate_only_main_class" ]; then
if [ -e "$AbstractClassFile" ]; then
GenerateAbstractClass=0
fi
fi
fi
if [ $GenerateAbstractClass -eq 1 ]; then
# replace template names with argument names
sed "s/\[TransformationName\]/$TN/; s/Description of the transformation./$4/;" < $AbstractTemplate > "$AbstractClassFile"
echo "Created $AbstractClassFile"
fi

View File

@ -1,79 +0,0 @@
#!/bin/sh
# vim: expandtab sw=4 ts=4 sts=4:
export LC_ALL=C
# Do not run as CGI
if [ -n "$GATEWAY_INTERFACE" ] ; then
echo 'Can not invoke as CGI!'
exit 1
fi
# Exit on failure
set -e
# Generate Twig template cache in clean dir
rm -rf twig-templates/
php bin/console cache:warmup --twig-po --env development
# Update pot (template), ensure that advisor is at the end
LOCS=$(find resources/po -name '*.po' | sed 's@.*/\(.*\)\.po@\1@')
find . -name '*.php' -not -path './tests/*' -not -path './resources/po/*' -not -path './tmp/*' -not -path './release/*' -not -path './node_modules/*' -not -path './vendor/*' > twig-templates/filesList
php ./bin/match-twig-cache
sort --dictionary-order --ignore-case --output ./twig-templates/filesListTemp < ./twig-templates/filesList
mv ./twig-templates/filesListTemp ./twig-templates/filesList
php ./bin/match-twig-cache --reverse
# Allows word splitting for files list.
# shellcheck disable=SC2046
xgettext \
-d phpmyadmin \
--msgid-bugs-address=translators@phpmyadmin.net \
-o resources/po/phpmyadmin.pot \
--language=PHP \
--add-comments=l10n \
--add-location \
--debug \
--from-code=utf-8 \
--keyword=__ --keyword=_gettext --keyword=_pgettext:1c,2 --keyword=_ngettext:1,2 \
--copyright-holder="phpMyAdmin devel team" \
$(cat ./twig-templates/filesList)
# Fixup filenames for Twig templates
php bin/console fix-po-twig
# Remote twig templates
rm -rf twig-templates/
# Keep in sync with create-release.sh
fetchReleaseFromFile() {
php -r "define('VERSION_SUFFIX', ''); require_once('src/Version.php'); echo \PhpMyAdmin\Version::VERSION;"
}
ver="$(fetchReleaseFromFile)"
sed -i.~ '
s/SOME DESCRIPTIVE TITLE/phpMyAdmin translation/;
s/PACKAGE/phpMyAdmin/;
s/(C) YEAR/(C) 2003 - '"$(date +%Y)"'/;
s/VERSION/'"$ver"'/;
' resources/po/phpmyadmin.pot
# Update po files (translations)
for loc in $LOCS ; do
sed -i.~ '
s/SOME DESCRIPTIVE TITLE/phpMyAdmin translation/;
s/PACKAGE/phpMyAdmin/;
s/(C) YEAR/(C) 2003 - '"$(date +%Y)"'/;
s/VERSION/'"$ver"'/;
s/Project-Id-Version: phpMyAdmin .*/Project-Id-Version: phpMyAdmin '"$ver"'\\n"/;
' resources/po/"$loc".po
msgmerge --previous -U resources/po/"$loc".po resources/po/phpmyadmin.pot
done
# Commit changes
git add resources/po/*.po resources/po/phpmyadmin.pot
git commit -s -m 'Update po files
[ci skip]'

View File

@ -23,10 +23,11 @@
"non-feature-branches": ["RELEASE_.*"],
"autoload": {
"psr-4": {
"PhpMyAdmin\\": "src"
"PhpMyAdmin\\": "libraries/classes"
},
"files": ["vendor/phpmyadmin/motranslator/src/functions.php"],
"exclude-from-classmap": [
"/tests/",
"/test/",
"/vendor/tecnickcom/tcpdf/tcpdf_barcodes_*.php",
"/vendor/tecnickcom/tcpdf/tcpdf_import.php",
"/vendor/tecnickcom/tcpdf/tcpdf_parser.php",
@ -36,49 +37,50 @@
},
"autoload-dev": {
"psr-4": {
"PhpMyAdmin\\Tests\\": "tests/unit",
"PhpMyAdmin\\Tests\\Selenium\\": "tests/end-to-end/"
"PhpMyAdmin\\Tests\\": "test/classes",
"PhpMyAdmin\\Tests\\Selenium\\": "test/selenium/"
}
},
"repositories": [
{
"type": "composer",
"url": "https://www.phpmyadmin.net"
},
{
"type": "github",
"url": "https://github.com/MauricioFauth/thecodingmachine-safe.git",
"no-api": true
}
],
"require": {
"php": "^8.2",
"php": "^7.2.5 || ^8.0",
"ext-hash": "*",
"ext-iconv": "*",
"ext-json": "*",
"ext-mysqli": "*",
"ext-openssl": "*",
"ext-pcre": "*",
"ext-sodium": "*",
"ext-xml": "*",
"composer/ca-bundle": "^1.2",
"fig/http-message-util": "^1.1",
"google/recaptcha": "^1.3",
"laminas/laminas-httphandlerrunner": "^2.6",
"google/recaptcha": "^1.1",
"nikic/fast-route": "^1.3",
"phpmyadmin/motranslator": "^6.0",
"phpmyadmin/shapefile": "^4.0",
"phpmyadmin/sql-parser": "^6.0",
"psr/clock": "^1.0",
"psr/container": "^2.0",
"paragonie/sodium_compat": "^1.17",
"phpmyadmin/motranslator": "^5.0",
"phpmyadmin/shapefile": "^3.0.1",
"phpmyadmin/sql-parser": "^5.8",
"phpmyadmin/twig-i18n-extension": "^4.1.3 || ^5.0.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^2",
"psr/http-server-handler": "^1.0",
"psr/http-server-middleware": "^1.0",
"slim/psr7": "^1.6.1",
"symfony/config": "^7.1",
"symfony/dependency-injection": "^7.1",
"symfony/expression-language": "^7.1",
"symfony/polyfill-ctype": "^1.24",
"psr/http-message": "^1.0",
"slim/psr7": "^1.4.1",
"symfony/config": "^5.2.3",
"symfony/dependency-injection": "^5.2.3",
"symfony/expression-language": "^5.2.3",
"symfony/polyfill-ctype": "^1.17.0",
"symfony/polyfill-iconv": "^1.33",
"symfony/polyfill-mbstring": "^1.24",
"symfony/polyfill-mbstring": "^1.17.0",
"symfony/polyfill-php80": "^1.16",
"symfony/polyfill-php84": "^1.33",
"twig/twig": "^3.21",
"twig/twig": "^3.11.3",
"webmozart/assert": "^1.10",
"williamdes/mariadb-mysql-kbs": "^1.2"
},
@ -95,38 +97,36 @@
"ext-zip": "For zip import and export",
"ext-gd2": "For image transformations",
"ext-mbstring": "For best performance",
"ext-sodium": "Better encryption performance",
"tecnickcom/tcpdf": "For PDF support",
"pragmarx/google2fa-qrcode": "^2.1 or ^3.0 - For 2FA authentication",
"bacon/bacon-qr-code": "^3.0 - For 2FA authentication",
"pragmarx/google2fa-qrcode": "^2.1 - For 2FA authentication",
"bacon/bacon-qr-code": "^2.0 - For 2FA authentication",
"code-lts/u2f-php-server": "For FIDO U2F authentication",
"web-auth/webauthn-lib": "For better WebAuthn/FIDO2 authentication support"
},
"require-dev": {
"bacon/bacon-qr-code": "^3.0",
"bacon/bacon-qr-code": "^2.0 || ^3.0",
"code-lts/u2f-php-server": "^1.2",
"guzzlehttp/psr7": "^2.5",
"httpsoft/http-message": "^1.1",
"laminas/laminas-diactoros": "^3.0",
"nyholm/psr7": "^1.8",
"php-webdriver/webdriver": "^1.14",
"phpmyadmin/coding-standard": "^4.0",
"php-webdriver/webdriver": "^1.13",
"phpmyadmin/coding-standard": "^3.0.0",
"phpstan/extension-installer": "^1.4",
"phpstan/phpstan": "^2.0",
"phpstan/phpstan-deprecation-rules": "^2.0",
"phpstan/phpstan-phpunit": "^2.0",
"phpstan/phpstan-strict-rules": "^2.0",
"phpstan/phpstan-webmozart-assert": "^2.0",
"phpunit/phpunit": "^11.5",
"pragmarx/google2fa-qrcode": "^3.0",
"psalm/plugin-phpunit": "^0.19",
"symfony/console": "^7.1",
"phpstan/phpstan": "^1.12",
"phpstan/phpstan-deprecation-rules": "^1.2",
"phpstan/phpstan-phpunit": "^1.4",
"phpstan/phpstan-strict-rules": "^1.6",
"phpstan/phpstan-webmozart-assert": "^1.2",
"phpunit/phpunit": "^8.5.16 || ^9.6",
"pragmarx/google2fa-qrcode": "^2.1",
"psalm/plugin-phpunit": "^0.16.1",
"symfony/console": "^5.2.3",
"tecnickcom/tcpdf": "^6.4.4",
"vimeo/psalm": "^6.0",
"web-auth/webauthn-lib": "^4.9"
"thecodingmachine/safe": "1.3.3.1",
"vimeo/psalm": "^4.30",
"web-auth/webauthn-lib": "^3.3.2"
},
"extra": {
"branch-alias": {
"dev-master": "6.0.x-dev"
"dev-master": "5.2.x-dev"
}
},
"scripts": {
@ -145,7 +145,7 @@
"@php phpstan analyse --generate-baseline",
"@php psalm --no-cache --threads=max --set-baseline=psalm-baseline.xml"
],
"twig-lint": "@php bin/console lint:twig --ansi --show-deprecations"
"twig-lint": "@php scripts/console lint:twig --ansi --show-deprecations"
},
"config":{
"sort-packages": true,
@ -155,8 +155,23 @@
"phpstan/extension-installer": true,
"composer/package-versions-deprecated": true
},
"platform": {
"php": "8.2.99"
"audit": {
"ignore": [
"CVE-2026-24425",
"CVE-2026-46627",
"CVE-2026-46628",
"CVE-2026-46633",
"CVE-2026-46634",
"CVE-2026-46635",
"CVE-2026-46636",
"CVE-2026-46638",
"CVE-2026-47730",
"CVE-2026-47732",
"CVE-2026-48805",
"CVE-2026-48806",
"CVE-2026-48807",
"CVE-2026-48808"
]
}
}
}

8949
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
* phpMyAdmin sample configuration, you can use it as base for
* manual configuration. For easier setup you can use setup/
*
* All directives are explained in documentation in the docs/ folder
* All directives are explained in documentation in the doc/ folder
* or at <https://docs.phpmyadmin.net/>.
*/
@ -108,7 +108,7 @@ $cfg['SaveDir'] = '';
/**
* Default language to use, if not browser-defined or user-defined
* (you find all languages in the 'resources/locale' folder)
* (you find all languages in the locale folder)
* uncomment the desired line:
* default = 'en'
*/
@ -156,5 +156,5 @@ $cfg['SaveDir'] = '';
/**
* You can find more configuration options in the documentation
* in the docs/ folder or at <https://docs.phpmyadmin.net/>.
* in the doc/ folder or at <https://docs.phpmyadmin.net/>.
*/

6
doc/.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
*.swp
/_build
/doctrees
/html
/locale
*.pyc

View File

@ -24,7 +24,7 @@ A window layer "Display chart" is shown in which you can customize the chart wit
Chart implementation
--------------------
Charts in phpMyAdmin are drawn using the `Chart.js <https://www.chartjs.org/>`_ library.
Charts in phpMyAdmin are drawn using `jqPlot <http://www.jqplot.com/>`_ jQuery library.
Examples
--------

View File

@ -51,7 +51,7 @@ copyright = u'2012 - 2026, The phpMyAdmin devel team'
# built documents.
#
# The short X.Y version.
version = '6.0.0-dev'
version = '5.2.4-dev'
# The full version, including alpha/beta/rc tags.
release = version
@ -100,11 +100,15 @@ pygments_style = 'sphinx'
# a list of builtin themes.
html_theme = 'default'
try:
import sphinx_rtd_theme
html_theme = 'sphinx_rtd_theme'
except:
print('WARNING: The python module sphinx_rtd_theme was not found, using the default theme. Debian package: python3-sphinx-rtd-theme')
# See: https://docs.readthedocs.io/en/stable/reference/environment-variables.html#envvar-READTHEDOCS
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
if on_rtd: # only import and set the theme if we're building docs on readthedocs
try:
import sphinx_rtd_theme
html_theme = 'sphinx_rtd_theme'
except:
html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the

View File

@ -8,7 +8,8 @@ Configuration
All configurable data is placed in :file:`config.inc.php` in phpMyAdmin's
toplevel directory. If this file does not exist, please refer to the
:ref:`setup` section to create one. This file only needs to contain the
parameters you want to change from their corresponding default value.
parameters you want to change from their corresponding default value in
:file:`libraries/config.default.php` (this file is not intended for changes).
.. seealso::
@ -122,10 +123,6 @@ Basic settings
:type: boolean
:default: false
.. deprecated:: 6.0.0
This setting has been removed. The Suhosin extension is no longer supported.
A warning is displayed on the main page if Suhosin is detected.
You can set this parameter to ``true`` to stop this message from appearing.
@ -234,7 +231,9 @@ Server connection settings
added which contains the login information for the different servers. The
first :config:option:`$cfg['Servers'][$i]['host']` contains the hostname of
the first server, the second :config:option:`$cfg['Servers'][$i]['host']`
the hostname of the second server, etc. You can put as many sections for server definition as you need in
the hostname of the second server, etc. In
:file:`libraries/config.default.php`, there is only one section for server
definition, however you can put as many as you need in
:file:`config.inc.php`, copy that block or needed parts (you don't have to
define all settings, just those you need to change).
@ -598,10 +597,7 @@ Server connection settings
:config:option:`$cfg['Servers'][$i]['ssl_ca']`,
:config:option:`$cfg['Servers'][$i]['ssl_ca_path']`,
:config:option:`$cfg['Servers'][$i]['ssl_ciphers']`,
:config:option:`$cfg['Servers'][$i]['ssl_verify']`,
:config:option:`$cfg['Servers'][$i]['socket']`,
:config:option:`$cfg['Servers'][$i]['compress']`,
:config:option:`$cfg['Servers'][$i]['hide_connection_errors']`
:config:option:`$cfg['Servers'][$i]['ssl_verify']`
.. config:option:: $cfg['Servers'][$i]['auth_type']
@ -963,7 +959,7 @@ Server connection settings
transformation system to work. phpMyAdmin will upgrade it automatically
for you by analyzing your current ``column_info`` table structure.
However, if something goes wrong with the auto-upgrade then you can
use the SQL script found in ``./resources/sql/upgrade_column_info_4_3_0+.sql``
use the SQL script found in ``./sql/upgrade_column_info_4_3_0+.sql``
to upgrade it manually.
To allow the usage of this functionality:
@ -983,7 +979,7 @@ Server connection settings
ADD `transformation` VARCHAR( 255 ) NOT NULL,
ADD `transformation_options` VARCHAR( 255 ) NOT NULL;
* to update your PRE-4.3.0 ``column_info`` table manually use this
``./resources/sql/upgrade_column_info_4_3_0+.sql`` SQL script.
``./sql/upgrade_column_info_4_3_0+.sql`` SQL script.
This feature can be disabled by setting the configuration to ``false``.
@ -1668,14 +1664,6 @@ Generic settings
The maximum number of table names to be displayed in the main panel's
list (except on the Export page).
.. config:option:: $cfg['MaxRoutineList']
:type: integer
:default: 250
The maximum number of routine names to be displayed in the main panel's
routine list.
.. config:option:: $cfg['ShowHint']
:type: boolean
@ -1728,11 +1716,9 @@ Generic settings
.. config:option:: $cfg['MysqlSslWarningSafeHosts']
:type: array [list of non-empty strings]
:type: array
:default: ``['127.0.0.1', 'localhost']``
.. versionadded:: 5.1.0
This search is case-sensitive and will match the exact string only.
If your setup does not use SSL but is safe because you are using a
local connection or private network, you can add your hostname or :term:`IP` to the list.
@ -1740,11 +1726,14 @@ Generic settings
This check uses the value of :config:option:`$cfg['Servers'][$i]['host']`.
Example configuration:
.. versionadded:: 5.1.0
Example configuration
.. code-block:: php
$cfg['MysqlSslWarningSafeHosts'] = ['127.0.0.1', '::1', 'mariadb.local'];
$cfg['MysqlSslWarningSafeHosts'] = ['127.0.0.1', 'localhost', 'mariadb.local'];
.. config:option:: $cfg['ExecTimeLimit']
@ -2183,8 +2172,7 @@ Navigation panel setup
:type: boolean
:default: true
Defines whether to display databases in the navigation panel as a tree
instead of in a dropdown selector.
In the navigation panel, replaces the database tree with a selector
.. config:option:: $cfg['FirstLevelNavigationItems']
@ -2351,7 +2339,8 @@ Navigation panel setup
:default: ``'structure'``
Defines the tab displayed by default when clicking the small icon next
to each table name in the navigation panel. The possible values are:
to each table name in the navigation panel. The possible values are the
localized equivalent of:
* ``structure``
* ``sql``
@ -2365,7 +2354,8 @@ Navigation panel setup
:default: null
Defines the tab displayed by default when clicking the second small icon next
to each table name in the navigation panel. The possible values are:
to each table name in the navigation panel. The possible values are the
localized equivalent of:
* ``(empty)``
* ``structure``
@ -2439,27 +2429,19 @@ Main panel
:default: true
Defines whether or not to display space usage and statistics about
databases and tables.
databases and tables. Note that statistics requires at least MySQL
3.23.3 and that, at this date, MySQL doesn't return such information
for Berkeley DB tables.
.. config:option:: $cfg['ShowServerInfo']
:type: boolean|string
:type: boolean
:default: true
Defines whether to display detailed server information on main page.
Possible values are:
* ``true`` to show all server information
* ``false`` to hide server information
* ``'database-server'`` to show only database server information
* ``'web-server'`` to show only web server information
You can additionally hide more information by using
:config:option:`$cfg['Servers'][$i]['verbose']`.
.. versionchanged:: 6.0.0
Added ``'database-server'`` and ``'web-server'`` options.
.. config:option:: $cfg['ShowPhpInfo']
:type: boolean
@ -2904,7 +2886,7 @@ Tabs display settings
:default: ``'welcome'``
Defines the tab displayed by default on server view. The possible values
are:
are the localized equivalent of:
* ``welcome`` (recommended for multi-user setups)
* ``databases``,
@ -2918,7 +2900,7 @@ Tabs display settings
:default: ``'structure'``
Defines the tab displayed by default on database view. The possible values
are:
are the localized equivalent of:
* ``structure``
* ``sql``
@ -2931,7 +2913,7 @@ Tabs display settings
:default: ``'browse'``
Defines the tab displayed by default on table view. The possible values
are:
are the localized equivalent of:
* ``structure``
* ``sql``
@ -3006,21 +2988,18 @@ Languages
You can select here which functions will be used for character set
conversion. Possible values are:
* ``'auto'`` - automatically use available one (first is tested ``iconv``, then ``mbstring``)
* ``'iconv'`` - use iconv or ``libiconv`` functions
* ``'mb'`` - use :term:`mbstring` extension
* ``'none'`` - disable encoding conversion
* ``auto`` - automatically use available one (first is tested ``iconv``, then
``recode``)
* ``iconv`` - use ``iconv`` or ``libiconv`` functions
* ``recode`` - use ``recode_string`` function
* ``mb`` - use :term:`mbstring` extension
* ``none`` - disable encoding conversion
Enabled charset conversion activates a pull-down menu in the Export
and Import pages, to choose the character set when exporting a file.
The default value in this menu comes from
:config:option:`$cfg['Export']['charset']` and :config:option:`$cfg['Import']['charset']`.
.. versionchanged:: 6.0.0
Support for the Recode extension has been removed. The ``'recode'`` value is ignored and the
default value (``'auto'``) is used instead.
.. config:option:: $cfg['IconvExtraParams']
:type: string
@ -3034,20 +3013,14 @@ Languages
.. config:option:: $cfg['AvailableCharsets']
:type: array [list of strings]
:type: array
:default: ``[...]``
Available character sets for MySQL conversion. You can add your own
(any of supported by mbstring/iconv) or remove these which you don't
(any of supported by recode/iconv) or remove these which you don't
use. Character sets will be shown in same order as here listed, so if
you frequently use some of these move them to the top.
Example configuration:
.. code-block:: php
$cfg['AvailableCharsets'] = ['utf-8', 'iso-8859-1'];
Web server settings
-------------------
@ -3064,10 +3037,6 @@ Web server settings
a certain patch is known to cause data corruption when having enabled
buffering.
.. deprecated:: 6.0.0
This setting was removed.
.. config:option:: $cfg['TrustedProxies']
:type: array
@ -3570,15 +3539,6 @@ Various display setting
specify the amount of saved history items using
:config:option:`$cfg['QueryHistoryMax']`.
.. config:option:: $cfg['AllowSharedBookmarks']
:type: boolean
:default: true
.. versionadded:: 6.0.0
Allow users to create bookmarks that are available for all other users
.. config:option:: $cfg['BrowseMIME']
:type: boolean
@ -3622,9 +3582,9 @@ Various display setting
:type: boolean
:default: true
Sorts database, table names and foreign key constaint according to natural order (for
example, t1, t2, t10). Currently implemented in the navigation panel,
in Database view for the table list and Relation view while listing Foreign key constraints.
Sorts database and table names according to natural order (for
example, t1, t2, t10). Currently implemented in the navigation panel
and in Database view, for the table list.
.. config:option:: $cfg['InitialSlidersState']
@ -3642,7 +3602,7 @@ Various display setting
Contains names of configuration options (keys in ``$cfg`` array) that
users can't set through user preferences. For possible values, refer
to classes under :file:`src/Config/Forms/User/`.
to classes under :file:`libraries/classes/Config/Forms/User/`.
.. config:option:: $cfg['UserprefsDeveloperTab']
@ -3696,7 +3656,7 @@ Theme manager settings
:type: string
:default: ``'pmahomme'``
The default theme (a subdirectory under :file:`./public/themes/`).
The default theme (a subdirectory under :file:`./themes/`).
.. config:option:: $cfg['ThemePerServer']

View File

@ -34,9 +34,9 @@ Third party licenses
phpMyAdmin includes several third-party libraries which come under their
respective licenses.
jQuery's license, which is where we got the files under public/js/vendor/jquery/ is
jQuery's license, which is where we got the files under js/vendor/jquery/ is
(MIT|GPL), a copy of each license is available in this repository (GPL
is available as LICENSE, MIT as public/js/vendor/jquery/MIT-LICENSE.txt).
is available as LICENSE, MIT as js/vendor/jquery/MIT-LICENSE.txt).
The download kit additionally includes several composer libraries. See their
licensing information in the vendor/ directory.

View File

@ -825,7 +825,6 @@ Following people have contributed to translation of phpMyAdmin:
* Spanish
* Daniel Hinostroza, MD <phpmyadmin\_at\_cerebroperiferico.com>
* Luis García Sevillano <floss.dev\_at\_gmail.com>
* Franco <fulanodetal.github1\_at\_openaliasbox.org>
* Luis Ruiz <luisan00\_at\_hotmail.com>

View File

@ -63,7 +63,7 @@ Please use instead the cookie authentication mode.
This seems to be a PWS bug. Filippo Simoncini found a workaround (at
this time there is no better fix): remove or comment the ``DOCTYPE``
declarations (2 lines) from the scripts :file:`src/Header.php`
declarations (2 lines) from the scripts :file:`libraries/classes/Header.php`
and :file:`index.php`.
.. _faq1_7:
@ -436,7 +436,6 @@ HHVM is supported up to phpMyAdmin 4.8.
Since release 5.0, phpMyAdmin supports only PHP 7.1 and newer.
Since release 5.2, phpMyAdmin supports only PHP 7.2 and newer.
Since release 6.0, phpMyAdmin supports only PHP 8.2 and newer.
.. _faq1_32:
@ -532,8 +531,65 @@ extension which works fine in this case.
.. _faq1_38:
1.38 (withdrawn).
-----------------
1.38 Can I use phpMyAdmin on a server on which Suhosin is enabled?
------------------------------------------------------------------
Yes but the default configuration values of Suhosin are known to cause
problems with some operations, for example editing a table with many
columns and no :term:`primary key` or with textual :term:`primary key`.
Suhosin configuration might lead to malfunction in some cases and it
can not be fully avoided as phpMyAdmin is kind of application which
needs to transfer big amounts of columns in single HTTP request, what
is something what Suhosin tries to prevent. Generally all
``suhosin.request.*``, ``suhosin.post.*`` and ``suhosin.get.*``
directives can have negative effect on phpMyAdmin usability. You can
always find in your error logs which limit did cause dropping of
variable, so you can diagnose the problem and adjust matching
configuration variable.
The default values for most Suhosin configuration options will work in
most scenarios, however you might want to adjust at least following
parameters:
* `suhosin.request.max\_vars <https://suhosin5.suhosin.org/stories/configuration.html#suhosin-request-max-vars>`_ should
be increased (eg. 2048)
* `suhosin.post.max\_vars <https://suhosin5.suhosin.org/stories/configuration.html#suhosin-post-max-vars>`_ should be
increased (eg. 2048)
* `suhosin.request.max\_array\_index\_length <https://suhosin5.suhosin.org/stories/configuration.html#suhosin-request-max-array-index-length>`_
should be increased (eg. 256)
* `suhosin.post.max\_array\_index\_length <https://suhosin5.suhosin.org/stories/configuration.html#suhosin-post-max-array-index-length>`_
should be increased (eg. 256)
* `suhosin.request.max\_totalname\_length <https://suhosin5.suhosin.org/stories/configuration.html#suhosin-request-max-totalname-length>`_
should be increased (eg. 8192)
* `suhosin.post.max\_totalname\_length <https://suhosin5.suhosin.org/stories/configuration.html#suhosin-post-max-totalname-length>`_ should be
increased (eg. 8192)
* `suhosin.get.max\_value\_length <https://suhosin5.suhosin.org/stories/configuration.html#suhosin-get-max-value-length>`_
should be increased (eg. 1024)
* `suhosin.sql.bailout\_on\_error <https://suhosin5.suhosin.org/stories/configuration.html#suhosin-sql-bailout-on-error>`_
needs to be disabled (the default)
* `suhosin.log.\* <https://suhosin5.suhosin.org/stories/configuration.html#logging-configuration>`_ should not
include :term:`SQL`, otherwise you get big
slowdown
* `suhosin.sql.union <https://suhosin5.suhosin.org/stories/configuration.html#suhosin-
sql-union>`_ must be disabled (which is the default).
* `suhosin.sql.multiselect <https://suhosin5.suhosin.org/stories/configuration.html#
suhosin-sql-multiselect>`_ must be disabled (which is the default).
* `suhosin.sql.comment <https://suhosin5.suhosin.org/stories/configuration.html#suhosin-
sql-comment>`_ must be disabled (which is the default).
To further improve security, we also recommend these modifications:
* `suhosin.executor.include.max\_traversal <https://suhosin5.suhosin.org/stories/
configuration.html#suhosin-executor-include-max-traversal>`_ should be
enabled as a mitigation against local file inclusion attacks. We suggest
setting this to 2 as ``../`` is used with the ReCaptcha library.
* `suhosin.cookie.encrypt <https://suhosin5.suhosin.org/stories/configuration.html#
suhosin-cookie-encrypt>`_ should be enabled.
* `suhosin.executor.disable_emodifier <https://suhosin5.suhosin.org/stories/config
uration.html#suhosin-executor-disable-emodifier>`_ should be enabled.
You can also disable the warning using the :config:option:`$cfg['SuhosinDisableWarning']`.
.. _faq1_39:
@ -630,14 +686,15 @@ Some users have requested to be able to reduce the size of the phpMyAdmin instal
This is not recommended and could lead to confusion over missing features, but can be done.
A list of files and corresponding functionality which degrade gracefully when removed include:
* :file:`./resources/locale/` folder, or unused subfolders (interface translations)
* Any unused themes in :file:`./public/themes/` except the default theme `pmahomme`.
* :file:`./app/language_stats.inc.php` (translation statistics)
* :file:`./docs/` (documentation)
* :file:`./locale/` folder, or unused subfolders (interface translations)
* Any unused themes in :file:`./themes/` except the default theme `pmahomme`.
* :file:`./libraries/language_stats.inc.php` (translation statistics)
* :file:`./doc/` (documentation)
* :file:`./setup/` (setup script)
* :file:`./examples/` (configuration examples)
* :file:`./resources/sql/` (SQL scripts to configure advanced functionalities)
* :file:`./resources/js/` (Source files to re-build `./public/js/`)
* :file:`./sql/` (SQL scripts to configure advanced functionalities)
* :file:`./js/src/` (Source files to re-build `./js/dist/`)
* :file:`./js/config/` (Configuration files to re-build `./js/dist/`)
* Run `rm -rv vendor/tecnickcom/tcpdf && composer dump-autoload --no-interaction --optimize --dev` (exporting to PDF)
* Run `rm -rv vendor/williamdes/mariadb-mysql-kbs && composer dump-autoload --no-interaction --optimize --dev` (external links to MariaDB and MySQL documentations)
* Run `rm -rv vendor/code-lts/u2f-php-server && composer dump-autoload --no-interaction --optimize --dev` (U2F second factor authentication)
@ -814,6 +871,8 @@ Here are a few points to check:
Dorninger for the hint).
* In the :file:`php.ini` directive ``arg_separator.input``, a value of ";"
will cause this error. Replace it with "&;".
* If you are using `Suhosin <https://suhosin5.suhosin.org/stories/index.html>`_, you
might want to increase `request limits <https://suhosin5.suhosin.org/stories/faq.html>`_.
* The directory specified in the :file:`php.ini` directive
``session.save_path`` does not exist or is read-only (this can be caused
by `bug in the PHP installer <https://bugs.php.net/bug.php?id=39842>`_).
@ -824,10 +883,13 @@ Here are a few points to check:
---------------------------------
To be able to see a progress bar during your uploads, your server must
have the `uploadprogress <https://pecl.php.net/package/uploadprogress>`_ extension enabled.
have the `uploadprogress <https://pecl.php.net/package/uploadprogress>`_ extension, and
you must be running PHP 5.4.0 or higher. Moreover, the JSON extension
has to be enabled in your PHP.
You must set ``session.upload_progress.enabled`` to ``1`` in your :file:`php.ini`.
However, starting from phpMyAdmin version 4.0.4, session-based upload progress has
If using PHP 5.4.0 or higher, you must set
``session.upload_progress.enabled`` to ``1`` in your :file:`php.ini`. However,
starting from phpMyAdmin version 4.0.4, session-based upload progress has
been temporarily deactivated due to its problematic behavior.
.. _faq2_10:
@ -858,7 +920,7 @@ And then this hexadecimal value can be used in the configuration file.
$cfg['blowfish_secret'] = sodium_hex2bin('f16ce59f45714194371b48fe362072dc3b019da7861558cd4ad29e4d6fb13851');
The `sodium_hex2bin <https://www.php.net/sodium_hex2bin>`_ function is used here to convert the hexadecimal value back to the
The `sodium_hex2bin <https://www.php.net/sodium_hex2bin>`_ is used here to convert the hexadecimal value back to the
binary format.
.. _faqlimitations:
@ -2193,10 +2255,9 @@ logs. Currently there are two variables available:
User name of currently active user (they do not have to be logged in).
``userStatus``
Status of currently active user, one of ``ok`` (user is logged in),
``server-denied`` (database server denied user login), ``allow-denied`` (user denied
``mysql-denied`` (MySQL denied user login), ``allow-denied`` (user denied
by allow/deny rules), ``root-denied`` (root is denied in configuration),
``empty-denied`` (empty password is denied),
``no-activity`` (automatically logged out due to inactivity).
``empty-denied`` (empty password is denied).
``LogFormat`` directive for Apache can look like following:

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -264,13 +264,6 @@ rendered, for example in following document:
\end{document}
TOON
----
Data can be exported to TOON `(Token-Oriented Object Notation) <https://en.wikipedia.org/wiki/Token-Oriented_Object_Notation>`_,
which is a text-based data format. It encodes the JSON data model in a compact way.
TOON is designed to reduce token usage in LLM prompts while staying human-readable.
MediaWiki
---------

View File

@ -30,6 +30,8 @@ Currently phpMyAdmin can:
* administer multiple servers
* add, edit, and remove MySQL user accounts and privileges
* check referential integrity in MyISAM tables
* using Query-by-example (QBE), create complex queries automatically
connecting required tables
* create :term:`PDF` graphics of your
database layout
* search globally in a database or a subset of it

65
doc/require.rst Normal file
View File

@ -0,0 +1,65 @@
.. _require:
Requirements
============
Web server
----------
Since phpMyAdmin's interface is based entirely in your browser, you'll need a
web server (such as Apache, nginx, :term:`IIS`) to install phpMyAdmin's files into.
PHP
---
* You need PHP 7.2.5 or newer, with ``session`` support, the Standard PHP Library
(SPL) extension, hash, ctype, and JSON support.
* The ``mbstring`` extension (see :term:`mbstring`) is strongly recommended
for performance reasons.
* To support uploading of ZIP files, you need the PHP ``zip`` extension.
* You need GD2 support in PHP to display inline thumbnails of JPEGs
("image/jpeg: inline") with their original aspect ratio.
* When using the cookie authentication (the default), the `openssl
<https://www.php.net/openssl>`_ extension is strongly suggested.
* To support upload progress bars, see :ref:`faq2_9`.
* To support XML and Open Document Spreadsheet importing, you need the
`libxml <https://www.php.net/libxml>`_ extension.
* To support reCAPTCHA on the login page, you need the
`openssl <https://www.php.net/openssl>`_ extension.
* To support displaying phpMyAdmin's latest version, you need to enable
``allow_url_open`` in your :file:`php.ini` or to have the
`curl <https://www.php.net/curl>`_ extension.
.. seealso:: :ref:`faq1_31`, :ref:`authentication_modes`
Database
--------
phpMyAdmin supports MySQL-compatible databases.
* MySQL 5.5 or newer
* MariaDB 5.5 or newer
.. seealso:: :ref:`faq1_17`
Web browser
-----------
To access phpMyAdmin you need a web browser with cookies and JavaScript
enabled.
You need a browser which is supported by Bootstrap 4.5, see
<https://getbootstrap.com/docs/4.5/getting-started/browsers-devices/>.
.. versionchanged:: 5.2.0
You need a browser which is supported by Bootstrap 5.0, see
<https://getbootstrap.com/docs/5.0/getting-started/browsers-devices/>.

View File

@ -64,7 +64,7 @@ mysql control connection. This controlconnection can have additional privileges
which the logged in user does not poses. E.g. access the :ref:`linked-tables`.
User data that is included in (administrative) queries should always be run
through DatabaseInterface::quoteString().
through DatabaseInterface::escapeString().
.. seealso::

View File

@ -90,7 +90,7 @@ In order to install from Git, you'll need a few supporting applications:
* `Git <https://git-scm.com/downloads>`_ to download the source, or you can download the most recent source directly from `Github <https://codeload.github.com/phpmyadmin/phpmyadmin/zip/QA_5_2>`_
* `Composer <https://getcomposer.org/download/>`__
* `Node.js <https://nodejs.org/en/download/>`_ (version 20 or higher)
* `Node.js <https://nodejs.org/en/download/>`_ (version 12 or higher)
* `Yarn <https://classic.yarnpkg.com/en/docs/install>`_
You can clone current phpMyAdmin source from
@ -104,14 +104,14 @@ Additionally you need to install dependencies using `Composer <https://getcompos
.. code-block:: sh
composer install
composer update
If you do not intend to develop, you can skip the installation of developer tools
by invoking:
.. code-block:: sh
composer install --no-dev
composer update --no-dev
Finally, you'll need to use `Yarn`_ to install some JavaScript dependencies:
@ -926,7 +926,7 @@ Zero configuration
In many cases, this database structure can be automatically created and
configured. This is called “Zero Configuration” mode and can be particularly
useful in shared hosting situations. “ZeroConf” mode is on by default, to
useful in shared hosting situations. “Zeroconf” mode is on by default, to
disable set :config:option:`$cfg['ZeroConf']` to false.
The following three scenarios are covered by the Zero Configuration mode:
@ -948,27 +948,27 @@ The following three scenarios are covered by the Zero Configuration mode:
Manual configuration
--------------------
Please look at your ``./resources/sql/`` directory, where you should find a
Please look at your ``./sql/`` directory, where you should find a
file called *create\_tables.sql*. (If you are using a Windows server,
pay special attention to :ref:`faq1_23`).
If you already had this infrastructure and:
* upgraded to MySQL 4.1.2 or newer, please use
:file:`resources/sql/upgrade_tables_mysql_4_1_2+.sql`.
:file:`sql/upgrade_tables_mysql_4_1_2+.sql`.
* upgraded to phpMyAdmin 4.3.0 or newer from 2.5.0 or newer (<= 4.2.x),
please use :file:`resources/sql/upgrade_column_info_4_3_0+.sql`.
please use :file:`sql/upgrade_column_info_4_3_0+.sql`.
* upgraded to phpMyAdmin 4.7.0 or newer from 4.3.0 or newer,
please use :file:`resources/sql/upgrade_tables_4_7_0+.sql`.
please use :file:`sql/upgrade_tables_4_7_0+.sql`.
and then create new tables by importing :file:`resources/sql/create_tables.sql`.
and then create new tables by importing :file:`sql/create_tables.sql`.
You can use your phpMyAdmin to create the tables for you. Please be
aware that you may need special (administrator) privileges to create
the database and tables, and that the script may need some tuning,
depending on the database name.
After having imported the :file:`resources/sql/create_tables.sql` file, you
After having imported the :file:`sql/create_tables.sql` file, you
should specify the table names in your :file:`config.inc.php` file. The
directives used for that can be found in the :ref:`config`.
@ -1036,12 +1036,12 @@ The complete upgrade can be performed in a few simple steps:
If you have upgraded your MySQL server from a version previous to 4.1.2 to
version 5.x or newer and if you use the phpMyAdmin configuration storage, you
should run the :term:`SQL` script found in
:file:`resources/sql/upgrade_tables_mysql_4_1_2+.sql`.
:file:`sql/upgrade_tables_mysql_4_1_2+.sql`.
If you have upgraded your phpMyAdmin to 4.3.0 or newer from 2.5.0 or
newer (<= 4.2.x) and if you use the phpMyAdmin configuration storage, you
should run the :term:`SQL` script found in
:file:`resources/sql/upgrade_column_info_4_3_0+.sql`.
:file:`sql/upgrade_column_info_4_3_0+.sql`.
Do not forget to clear the browser cache and to empty the old session by
logging out and logging in again.
@ -1227,7 +1227,7 @@ are always ways to make your installation more secure:
* Ensure your PHP setup follows recommendations for production sites, for example
`display_errors <https://www.php.net/manual/en/errorfunc.configuration.php#ini.display-errors>`_
should be disabled.
* Remove the ``tests`` directory from phpMyAdmin, unless you are developing and need a test suite.
* Remove the ``test`` directory from phpMyAdmin, unless you are developing and need a test suite.
* Remove the ``setup`` directory from phpMyAdmin, you will probably not
use it after the initial setup.
* Properly choose an authentication method - :ref:`cookie`

View File

@ -10,7 +10,7 @@ Configuration
-------------
Themes are configured with :config:option:`$cfg['ThemeManager']` and
:config:option:`$cfg['ThemeDefault']`. Under :file:`./public/themes/`, you should not
:config:option:`$cfg['ThemeDefault']`. Under :file:`./themes/`, you should not
delete the directory ``pmahomme`` or its underlying structure, because this is
the system theme used by phpMyAdmin. ``pmahomme`` contains all images and
styles, for backwards compatibility and for all themes that would not include
@ -23,7 +23,7 @@ Creating custom theme
To create a theme:
* make a new subdirectory (for example "your\_theme\_name") under :file:`./public/themes/`.
* make a new subdirectory (for example "your\_theme\_name") under :file:`./themes/`.
* copy the files and directories from ``pmahomme`` to "your\_theme\_name"
* edit the css-files in "your\_theme\_name/css"
* put your new images in "your\_theme\_name/img"

View File

@ -103,9 +103,9 @@ File structure
++++++++++++++
All specific transformations for mimetypes are defined through class
files in the directory :file:`src/Plugins/Transformations/`. Each of
files in the directory :file:`libraries/classes/Plugins/Transformations/`. Each of
them extends a certain transformation abstract class declared in
:file:`src/Plugins/Transformations/Abs`.
:file:`libraries/classes/Plugins/Transformations/Abs`.
They are stored in files to ease customization and to allow easy adding of
new or custom transformations.
@ -115,7 +115,7 @@ the transformations will always work. It makes no sense to apply a
transformation to a mimetype the transform-function doesn't know to
handle.
There is a file called :file:`src/Plugins/Transformations.php` that provides some
There is a file called :file:`libraries/classes/Plugins/Transformations.php` that provides some
basic functions which can be included by any other transform function.
The file name convention is ``[Mimetype]_[Subtype]_[Transformation
@ -133,13 +133,13 @@ getInfo() returns the transformation's description and possible
options it may receive and applyTransformation() is the method that
does the actual work of the transformation plug-in.
Please see the :file:`src/Plugins/Transformations/TEMPLATE` and
:file:`src/Plugins/Transformations/TEMPLATE\_ABSTRACT` files for adding
Please see the :file:`libraries/classes/Plugins/Transformations/TEMPLATE` and
:file:`libraries/classes/Plugins/Transformations/TEMPLATE\_ABSTRACT` files for adding
your own transformation plug-in. You can also generate a new
transformation plug-in (with or without the abstract transformation
class), by using
:file:`bin/transformations_generator_plugin.sh` or
:file:`bin/transformations_generator_main_class.sh`.
:file:`scripts/transformations_generator_plugin.sh` or
:file:`scripts/transformations_generator_main_class.sh`.
The applyTransformation() method always gets passed three variables:

View File

@ -7,7 +7,7 @@ distribution or some all in one package including web server and MySQL
server.
Generally, you can customize some basic aspects (paths to some files and
behavior) in :file:`app/vendor_config.php`.
behavior) in :file:`libraries/vendor_config.php`.
For example, if you want setup script to generate a config file in var, change
``SETUP_CONFIG_FILE`` to :file:`/var/lib/phpmyadmin/config.inc.php` and you
@ -24,7 +24,7 @@ one we ship.
Currently known list of external libraries:
public/js/vendor
js/vendor
jQuery js framework libraries and various js libraries.
vendor/

View File

@ -1,81 +0,0 @@
.. _require:
Requirements
============
Web server
----------
Since phpMyAdmin's interface is based entirely in your browser, you'll need a
web server (such as Apache, nginx, :term:`IIS`) to install phpMyAdmin's files into.
PHP
---
* You need PHP 8.2.0 or newer.
* You need the following PHP extensions
(``php -m`` or ``phpinfo()`` will indicate the enabled ones):
* normally bundled into PHP and enabled by default:
- `json <https://www.php.net/json>`_ provides JSON functions
- `session <https://www.php.net/session>`_ provides session storage
- `pcre <https://www.php.net/pcre>`_ provides regular expression functions
- `hash <https://www.php.net/hash>`_ provides basic hashing functions
- `spl <https://www.php.net/spl>`_ the Standard PHP Library (SPL) extension
- `sodium <https://www.php.net/sodium>`_ a modern cryptography library
* manual installation required:
- `mysqli <https://www.php.net/mysqli>`_ To connect to MySQL/MariaDB databases
- `ctype <https://www.php.net/ctype>`_ To check the type of strings
* The `mbstring <https://www.php.net/mbstring>`_ extension (see :term:`mbstring`) is strongly recommended
for performance reasons.
* To support uploading of ZIP files, you need the PHP `zip <https://www.php.net/zip>`_ extension.
* You need `GD2 <https://www.php.net/gd>`_ support in PHP to display inline thumbnails of JPEGs
(``"image/jpeg: inline"``) with their original aspect ratio.
* When using the cookie authentication (the default), the `openssl
<https://www.php.net/openssl>`_ extension is strongly suggested.
* To support upload progress bars, see :ref:`faq2_9`.
* To support XML and Open Document Spreadsheet importing, you need the
`libxml <https://www.php.net/libxml>`_ extension.
* To support reCAPTCHA on the login page, you need the
`openssl <https://www.php.net/openssl>`_ extension.
* To support displaying phpMyAdmin's latest version, you need to enable
``allow_url_open`` in your :file:`php.ini` or to have the
`curl <https://www.php.net/curl>`_ extension.
.. seealso:: :ref:`faq1_31`, :ref:`authentication_modes`
Database
--------
phpMyAdmin supports MySQL-compatible databases.
* MySQL 5.5 or newer
* MariaDB 5.5 or newer
.. seealso:: :ref:`faq1_17`
Web browser
-----------
To access phpMyAdmin you need a web browser with cookies and JavaScript
enabled.
You need a browser which is supported by Bootstrap 4.5, see
<https://getbootstrap.com/docs/4.5/getting-started/browsers-devices/>.
.. versionchanged:: 5.2.0
You need a browser which is supported by Bootstrap 5.0, see
<https://getbootstrap.com/docs/5.0/getting-started/browsers-devices/>.

View File

@ -9,7 +9,12 @@
declare(strict_types=1);
$i = 0;
$hosts = ['foo.example.com', 'bar.example.com', 'baz.example.com', 'quux.example.com'];
$hosts = [
'foo.example.com',
'bar.example.com',
'baz.example.com',
'quux.example.com',
];
foreach ($hosts as $host) {
$i++;

View File

@ -19,12 +19,17 @@ if (false === @include_once 'OpenID/RelyingParty.php') {
}
/* Change this to true if using phpMyAdmin over https */
$secureCookie = false;
$secure_cookie = false;
/**
* Map of authenticated users to MySQL user/password pairs.
*/
$authMap = ['https://launchpad.net/~username' => ['user' => 'root', 'password' => '']];
$AUTH_MAP = [
'https://launchpad.net/~username' => [
'user' => 'root',
'password' => '',
],
];
// phpcs:disable PSR1.Files.SideEffects,Squiz.Functions.GlobalFunction
@ -33,7 +38,7 @@ $authMap = ['https://launchpad.net/~username' => ['user' => 'root', 'password' =
*
* @param string $contents Content to include in page
*/
function Show_page(string $contents): void
function Show_page($contents): void
{
header('Content-Type: text/html; charset=utf-8');
@ -62,7 +67,7 @@ function Show_page(string $contents): void
*
* @param Exception $e Exception object
*/
function Die_error(Throwable $e): void
function Die_error($e): void
{
$contents = "<div class='relyingparty_results'>\n";
$contents .= '<pre>' . htmlspecialchars($e->getMessage()) . "</pre>\n";
@ -74,10 +79,10 @@ function Die_error(Throwable $e): void
// phpcs:enable
/* Need to have cookie visible from parent directory */
session_set_cookie_params(0, '/', '', $secureCookie, true);
session_set_cookie_params(0, '/', '', $secure_cookie, true);
/* Create signon session */
$sessionName = 'SignonSession';
session_name($sessionName);
$session_name = 'SignonSession';
session_name($session_name);
@session_start();
// Determine realm and return_to
@ -153,13 +158,13 @@ try {
$id = $message->get('openid.claimed_id');
if (empty($id) || ! isset($authMap[$id])) {
if (empty($id) || ! isset($AUTH_MAP[$id])) {
Show_page('<p>User not allowed!</p>');
exit;
}
$_SESSION['PMA_single_signon_user'] = $authMap[$id]['user'];
$_SESSION['PMA_single_signon_password'] = $authMap[$id]['password'];
$_SESSION['PMA_single_signon_user'] = $AUTH_MAP[$id]['user'];
$_SESSION['PMA_single_signon_password'] = $AUTH_MAP[$id]['password'];
$_SESSION['PMA_single_signon_HMAC_secret'] = hash('sha1', uniqid(strval(random_int(0, mt_getrandmax())), true));
session_write_close();
/* Redirect to phpMyAdmin (should use absolute URL here!) */

View File

@ -18,15 +18,21 @@ declare(strict_types=1);
*
* @param string $user User name
*
* @return array<int,string>
* @return array
*/
function get_login_credentials(string $user): array
function get_login_credentials($user)
{
/* Optionally we can use passed username */
if ($user !== '') {
return [$user, 'password'];
if (! empty($user)) {
return [
$user,
'password',
];
}
/* Here we would retrieve the credentials */
return ['root', ''];
return [
'root',
'',
];
}

View File

@ -12,12 +12,12 @@ declare(strict_types=1);
/* Use cookies for session */
ini_set('session.use_cookies', 'true');
/* Change this to true if using phpMyAdmin over https */
$secureCookie = false;
$secure_cookie = false;
/* Need to have cookie visible from parent directory */
session_set_cookie_params(0, '/', '', $secureCookie, true);
session_set_cookie_params(0, '/', '', $secure_cookie, true);
/* Create signon session */
$sessionName = 'SignonSession';
session_name($sessionName);
$session_name = 'SignonSession';
session_name($session_name);
// Uncomment and change the following line to match your $cfg['SessionSavePath']
//session_save_path('/foobar');
@session_start();
@ -32,6 +32,7 @@ if (isset($_POST['user'])) {
/* Update another field of server configuration */
$_SESSION['PMA_single_signon_cfgupdate'] = ['verbose' => 'Signon test'];
$_SESSION['PMA_single_signon_HMAC_secret'] = hash('sha1', uniqid(strval(random_int(0, mt_getrandmax())), true));
$id = session_id();
/* Close that session */
@session_write_close();
/* Redirect to phpMyAdmin (should use absolute URL here!) */

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,22 +1,43 @@
<!doctype html>
<html lang="en">
<head>
<title>phpMyAdmin</title>
<meta http-equiv="expires" content="0">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Refresh" content="0;url=./public/">
<script>
//<![CDATA[
setTimeout(function() { window.location = decodeURI('./public/'); }, 2000);
//]]>
</script>
</head>
<body>
<script>
//<![CDATA[
document.write('<p>Redirecting to the <a href="./public/">phpMyAdmin interface</a>. If you are not redirected automatically, click the link.</p>');
//]]>
</script>
</body>
</html>
<?php
declare(strict_types=1);
use PhpMyAdmin\Common;
use PhpMyAdmin\Routing;
if (! defined('ROOT_PATH')) {
// phpcs:disable PSR1.Files.SideEffects
define('ROOT_PATH', __DIR__ . DIRECTORY_SEPARATOR);
// phpcs:enable
}
if (PHP_VERSION_ID < 70205) {
die('<p>PHP 7.2.5+ is required.</p><p>Currently installed version is: ' . PHP_VERSION . '</p>');
}
// phpcs:disable PSR1.Files.SideEffects
define('PHPMYADMIN', true);
// phpcs:enable
require_once ROOT_PATH . 'libraries/constants.php';
/**
* Activate autoloader
*/
if (! @is_readable(AUTOLOAD_FILE)) {
die(
'<p>File <samp>' . AUTOLOAD_FILE . '</samp> missing or not readable.</p>'
. '<p>Most likely you did not run Composer to '
. '<a href="https://docs.phpmyadmin.net/en/latest/setup.html#installing-from-git">'
. 'install library files</a>.</p>'
);
}
require AUTOLOAD_FILE;
global $route, $containerBuilder, $request;
Common::run();
$dispatcher = Routing::getDispatcher();
Routing::callControllerForRoute($request, $route, $dispatcher, $containerBuilder);

18
infection.json.dist Normal file
View File

@ -0,0 +1,18 @@
{
"source": {
"directories": [
"libraries\/classes"
]
},
"logs": {
"text": "build/logs/infection.log",
"stryker": {
"report": "master"
}
},
"mutators": {
"@default": true
},
"minMsi": 31,
"minCoveredMsi": 61
}

View File

@ -1,18 +0,0 @@
{
"source": {
"directories": [
"src"
]
},
"logs": {
"text": "build/logs/infection.log",
"stryker": {
"report": "master"
}
},
"mutators": {
"@default": true
},
"minMsi": 41,
"minCoveredMsi": 65
}

View File

@ -1,23 +0,0 @@
/* eslint-env node */
module.exports = {
extensionsToTreatAsEsm: ['.ts'],
coverageDirectory: '<rootDir>/build/javascript/',
collectCoverageFrom: ['<rootDir>/resources/js/**/*.ts'],
projects: [
{
coveragePathIgnorePatterns: [
'<rootDir>/node_modules/',
'<rootDir>/public/js/vendor/',
],
displayName: 'phpMyAdmin',
testMatch: ['<rootDir>/tests/javascript/**/*.ts'],
transform: { '\\.[jt]sx?$': 'babel-jest' },
moduleNameMapper: {
'^phpmyadmin/(.*)$': '<rootDir>/resources/js/$1',
'^@vendor/(.*)$': '<rootDir>/public/js/vendor/$1',
},
testEnvironment: 'jsdom',
}
]
};

26
jest.config.js Normal file
View File

@ -0,0 +1,26 @@
/* eslint-env node */
module.exports = {
coverageDirectory: '<rootDir>/build/javascript/',
collectCoverageFrom: ['<rootDir>/js/src/**/*.js'],
projects: [
{
verbose: true,
setupFiles: ['<rootDir>/test/jest/test-env.js'],
coveragePathIgnorePatterns: [
'<rootDir>/node_modules/',
'<rootDir>/js/vendor/',
],
displayName: 'phpMyAdmin',
testMatch: ['<rootDir>/test/javascript/**/*.js'],
transform: {
'^.+\\.js$': '<rootDir>/test/jest/file-transformer.js'
},
moduleNameMapper: {
'^phpmyadmin/(.*)$': '<rootDir>/js/src/$1',
'^@vendor/(.*)$': '<rootDir>/js/vendor/$1',
},
testEnvironment: 'jsdom',
}
]
};

Some files were not shown because too many files have changed in this diff Show More