Merge branch 'phpbb:master' into patch-4

This commit is contained in:
phpBB TR 2024-12-05 19:13:03 +03:00 committed by GitHub
commit 48f82c466d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
247 changed files with 7246 additions and 3235 deletions

View file

@ -0,0 +1,70 @@
name: Check merge to master
on:
pull_request_target:
types: [ opened, synchronize, reopened ]
branches:
- 3.3.x
jobs:
merge-check:
if: github.event_name == 'pull_request_target' && github.event.pull_request.base.ref == '3.3.x'
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v3
with:
fetch-depth: 0 # Ensure full history is fetched
- name: Set up Git user
run: |
git config --global user.name "github-actions"
git config --global user.email "github-actions@github.com"
- name: Fetch all branches
run: git fetch origin
- name: Simulate merging PR into 3.3.x
id: simulate_merge
run: |
git checkout 3.3.x
git fetch origin pull/${{ github.event.pull_request.number }}/head
git merge --no-ff FETCH_HEAD || exit 1
- name: Attempt to merge updated 3.3.x into master
id: merge_master
run: |
git checkout master
if git merge --no-ff 3.3.x --no-commit; then
echo "mergeable=true" >> $GITHUB_OUTPUT
else
echo "mergeable=false" >> $GITHUB_OUTPUT
git merge --abort
fi
- name: Find Comment
uses: peter-evans/find-comment@v3
id: fc
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: The attempt to merge branch `3.3.x` into `master` has completed
- name: Post comment on PR
if: always() # Ensure this step always runs, regardless of merge result
uses: peter-evans/create-or-update-comment@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.fc.outputs.comment-id }}
edit-mode: replace
body: |
The attempt to merge branch `3.3.x` into `master` has completed after considering the changes in this PR.
- Merge result: ${{ steps.merge_master.outputs.mergeable == 'true' && 'Success ✅' || 'Conflict ❌' }}
${{ steps.merge_master.outputs.mergeable == 'true' && 'This PR is ready to be merged.' || 'A separate PR will be needed to merge `3.3.x` into `master`.' }}
- name: Mark job as succeeded
if: always()
run: echo "Merge check completed. Ignoring the result to avoid failed status."

View file

@ -0,0 +1,60 @@
name: Merge 3.3.x into master
on:
push:
branches:
- 3.3.x
jobs:
merge-branch:
runs-on: ubuntu-latest
steps:
- uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ vars.MERGE_MASTER_APP_ID }}
private-key: ${{ secrets.MERGE_MASTER_SECRET }}
- name: Checkout the repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch full history for proper merging
ref: 3.3.x # Checkout the 3.3.x branch
token: ${{ steps.app-token.outputs.token }}
- name: Fetch the latest commit information
id: get-commit-info
run: |
# Get the latest commit SHA and its author details
COMMIT_SHA=$(git rev-parse HEAD)
COMMIT_AUTHOR_NAME=$(git log -1 --pretty=format:'%an' $COMMIT_SHA)
COMMIT_AUTHOR_EMAIL=$(git log -1 --pretty=format:'%ae' $COMMIT_SHA)
# Save them as output for later steps
echo "commit_sha=$COMMIT_SHA" >> $GITHUB_ENV
echo "commit_author_name=$COMMIT_AUTHOR_NAME" >> $GITHUB_ENV
echo "commit_author_email=$COMMIT_AUTHOR_EMAIL" >> $GITHUB_ENV
- name: Set up Git with the pull request author's info
run: |
git config --global user.name "${{ env.commit_author_name }}"
git config --global user.email "${{ env.commit_author_email }}"
- name: Fetch all branches
run: git fetch --all
- name: Merge 3.3.x into master
run: |
git checkout master
if git merge --no-ff 3.3.x; then
echo "merge_failed=false" >> $GITHUB_ENV
else
echo "merge_failed=true" >> $GITHUB_ENV
fi
- name: Push changes to master if merge was successful
if: env.merge_failed == 'false'
run: git push origin master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View file

@ -137,6 +137,10 @@ jobs:
db: "mysql:5.7"
- php: '8.3'
db: "mariadb:10.2"
- php: '8.4'
db: "mysql:8.0"
- php: '8.4'
db: "mariadb:10.3"
name: PHP ${{ matrix.php }} - ${{ matrix.db_alias != '' && matrix.db_alias || matrix.db }}
@ -272,6 +276,8 @@ jobs:
db: "postgres:9.5"
- php: '8.3'
db: "postgres:9.5"
- php: '8.4'
db: "postgres:9.5"
name: PHP ${{ matrix.php }} - ${{ matrix.db }}
@ -364,7 +370,7 @@ jobs:
# Other database types, namely sqlite3 and mssql
other-tests:
runs-on: ubuntu-latest
runs-on: ubuntu-20.04
strategy:
matrix:
include:
@ -374,17 +380,17 @@ jobs:
db: "mcr.microsoft.com/mssql/server:2017-latest"
db_alias: 'MSSQL 2017'
- php: '8.1'
db: "mcr.microsoft.com/mssql/server:2019-latest"
db: "mcr.microsoft.com/mssql/server:2019-CU27-ubuntu-20.04"
db_alias: 'MSSQL 2019'
- php: '8.1'
db: "mcr.microsoft.com/mssql/server:2022-latest"
db: "mcr.microsoft.com/mssql/server:2022-CU13-ubuntu-22.04"
db_alias: 'MSSQL 2022'
name: PHP ${{ matrix.php }} - ${{ matrix.db_alias != '' && matrix.db_alias || matrix.db }}
services:
mssql:
image: ${{ matrix.db != 'mcr.microsoft.com/mssql/server:2017-latest' && matrix.db != 'mcr.microsoft.com/mssql/server:2019-latest' && matrix.db != 'mcr.microsoft.com/mssql/server:2022-latest' && 'mcr.microsoft.com/mssql/server:2017-latest' || matrix.db }}
image: ${{ matrix.db != 'mcr.microsoft.com/mssql/server:2017-latest' && matrix.db != 'mcr.microsoft.com/mssql/server:2019-CU27-ubuntu-20.04' && matrix.db != 'mcr.microsoft.com/mssql/server:2022-CU13-ubuntu-22.04' && 'mcr.microsoft.com/mssql/server:2017-latest' || matrix.db }}
env:
SA_PASSWORD: "Pssw0rd_12"
ACCEPT_EULA: "y"
@ -416,7 +422,7 @@ jobs:
env:
MATRIX_DB: ${{ matrix.db }}
run: |
if [ $MATRIX_DB == 'mcr.microsoft.com/mssql/server:2017-latest' ] || [ $MATRIX_DB == 'mcr.microsoft.com/mssql/server:2019-latest' ] || [ $MATRIX_DB == 'mcr.microsoft.com/mssql/server:2022-latest' ]
if [ $MATRIX_DB == 'mcr.microsoft.com/mssql/server:2017-latest' ] || [ $MATRIX_DB == 'mcr.microsoft.com/mssql/server:2019-CU27-ubuntu-20.04' ] || [ $MATRIX_DB == 'mcr.microsoft.com/mssql/server:2022-CU13-ubuntu-22.04' ]
then
db='mssql'
else
@ -480,7 +486,7 @@ jobs:
strategy:
matrix:
type: ['unit', 'functional']
php: ['8.1', '8.2']
php: ['8.1', '8.2', '8.3']
db: ['postgres']
name: Windows - ${{ matrix.type }} - PHP ${{ matrix.php }} - ${{ matrix.db }}

View file

@ -42,8 +42,8 @@ We have unit and functional tests in order to prevent regressions. You can view
Branch | Description | GitHub Actions |
------- | ----------- | -------------- |
**master** | Latest development version | ![Tests](https://github.com/phpbb/phpbb/workflows/Tests/badge.svg?branch=master) |
**3.3.x** | Development of version 3.3.x | ![Tests](https://github.com/phpbb/phpbb/workflows/Tests/badge.svg?branch=3.3.x) |
**master** | Latest development version | ![Tests](https://github.com/phpbb/phpbb/actions/workflows/tests.yml/badge.svg?branch=master) |
**3.3.x** | Development of version 3.3.x | ![Tests](https://github.com/phpbb/phpbb/actions/workflows/tests.yml/badge.svg?branch=3.3.x) |
## 📜 License

6
Vagrantfile vendored
View file

@ -11,15 +11,15 @@ aliasesPath = "vagrant/aliases"
require File.expand_path(confDir + '/scripts/homestead.rb')
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
if File.exists? aliasesPath then
if File.exist? aliasesPath then
config.vm.provision "file", source: aliasesPath, destination: "~/.bash_aliases"
end
if File.exists? homesteadYamlPath then
if File.exist? homesteadYamlPath then
Homestead.configure(config, YAML::load(File.read(homesteadYamlPath)))
end
if File.exists? afterScriptPath then
if File.exist? afterScriptPath then
config.vm.provision "shell", path: afterScriptPath
end
end

View file

@ -3,8 +3,8 @@
<project name="phpBB" description="The phpBB forum software" default="all" basedir="../">
<!-- a few settings for the build -->
<property name="newversion" value="4.0.0-a1-dev" />
<property name="prevversion" value="3.3.12" />
<property name="olderversions" value="3.1.0, 3.1.1, 3.1.2, 3.1.3, 3.1.4, 3.1.5, 3.1.6, 3.1.7, 3.1.7-pl1, 3.1.8, 3.1.9, 3.1.10, 3.1.11, 3.1.12, 3.2.0, 3.2.1, 3.2.2, 3.2.3, 3.2.4, 3.2.5, 3.2.6, 3.2.7, 3.2.8, 3.2.9, 3.2.10, 3.2.11, 3.3.0, 3.3.1, 3.3.2, 3.3.3, 3.3.4, 3.3.5, 3.3.6, 3.3.7, 3.3.8, 3.3.9, 3.3.10, 3.3.11" />
<property name="prevversion" value="3.3.14" />
<property name="olderversions" value="3.1.0, 3.1.1, 3.1.2, 3.1.3, 3.1.4, 3.1.5, 3.1.6, 3.1.7, 3.1.7-pl1, 3.1.8, 3.1.9, 3.1.10, 3.1.11, 3.1.12, 3.2.0, 3.2.1, 3.2.2, 3.2.3, 3.2.4, 3.2.5, 3.2.6, 3.2.7, 3.2.8, 3.2.9, 3.2.10, 3.2.11, 3.3.0, 3.3.1, 3.3.2, 3.3.3, 3.3.4, 3.3.5, 3.3.6, 3.3.7, 3.3.8, 3.3.9, 3.3.10, 3.3.11, 3.3.12, 3.3.13" />
<!-- no configuration should be needed beyond this point -->
<property name="oldversions" value="${olderversions}, ${prevversion}" />
@ -181,6 +181,7 @@
<!-- create an empty config.php file (not for diffs) -->
<touch file="build/new_version/phpBB3/config.php" />
<copy file="build/new_version/phpBB3/vendor-ext/.htaccess" tofile="build/new_version/phpBB3/vendor/.htaccess" />
</target>

328
package-lock.json generated
View file

@ -595,10 +595,11 @@
}
},
"node_modules/body-parser": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
"version": "1.20.3",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
"integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dev": true,
"license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.5",
@ -608,7 +609,7 @@
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"qs": "6.13.0",
"raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
@ -623,6 +624,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@ -631,7 +633,8 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
"dev": true,
"license": "MIT"
},
"node_modules/boolbase": {
"version": "1.0.0",
@ -650,12 +653,13 @@
}
},
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"license": "MIT",
"dependencies": {
"fill-range": "^7.0.1"
"fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
@ -725,6 +729,7 @@
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@ -734,6 +739,7 @@
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
@ -1027,15 +1033,17 @@
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
"integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
@ -1316,6 +1324,7 @@
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
@ -1333,6 +1342,7 @@
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@ -1342,6 +1352,7 @@
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
@ -1461,7 +1472,8 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"dev": true
"dev": true,
"license": "MIT"
},
"node_modules/electron-to-chromium": {
"version": "1.4.111",
@ -1476,10 +1488,11 @@
"dev": true
},
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@ -1516,6 +1529,7 @@
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.4"
},
@ -1528,6 +1542,7 @@
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
@ -1545,7 +1560,8 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"dev": true
"dev": true,
"license": "MIT"
},
"node_modules/escape-string-regexp": {
"version": "4.0.0",
@ -1739,6 +1755,7 @@
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
@ -1768,37 +1785,38 @@
}
},
"node_modules/express": {
"version": "4.19.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
"version": "4.21.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz",
"integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.2",
"body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.6.0",
"cookie": "0.7.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"finalhandler": "1.3.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"path-to-regexp": "0.1.10",
"proxy-addr": "~2.0.7",
"qs": "6.11.0",
"qs": "6.13.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"send": "0.19.0",
"serve-static": "1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
@ -1958,10 +1976,11 @@
}
},
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
@ -1970,13 +1989,14 @@
}
},
"node_modules/finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
"integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
@ -1992,6 +2012,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@ -2000,7 +2021,8 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
"dev": true,
"license": "MIT"
},
"node_modules/find-up": {
"version": "4.1.0",
@ -2122,6 +2144,7 @@
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
@ -2188,6 +2211,7 @@
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
@ -2338,6 +2362,7 @@
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dev": true,
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.1.3"
},
@ -2509,6 +2534,7 @@
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-define-property": "^1.0.0"
},
@ -2521,6 +2547,7 @@
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
@ -2533,6 +2560,7 @@
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
@ -2545,6 +2573,7 @@
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
@ -2605,6 +2634,7 @@
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"depd": "2.0.0",
"inherits": "2.0.4",
@ -2621,6 +2651,7 @@
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
@ -2851,6 +2882,7 @@
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.12.0"
}
@ -3226,6 +3258,7 @@
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
@ -3269,10 +3302,14 @@
}
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
"dev": true
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
"integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/merge2": {
"version": "1.4.1",
@ -3293,12 +3330,13 @@
}
},
"node_modules/micromatch": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"license": "MIT",
"dependencies": {
"braces": "^3.0.2",
"braces": "^3.0.3",
"picomatch": "^2.3.1"
},
"engines": {
@ -3310,6 +3348,7 @@
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"dev": true,
"license": "MIT",
"bin": {
"mime": "cli.js"
},
@ -3587,10 +3626,14 @@
}
},
"node_modules/object-inspect": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
"integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@ -3627,6 +3670,7 @@
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"dev": true,
"license": "MIT",
"dependencies": {
"ee-first": "1.1.1"
},
@ -3763,6 +3807,7 @@
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@ -3822,10 +3867,11 @@
}
},
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
"dev": true
"version": "0.1.10",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
"integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
"dev": true,
"license": "MIT"
},
"node_modules/path-type": {
"version": "4.0.0",
@ -4443,12 +4489,13 @@
}
},
"node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
"integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.0.4"
"side-channel": "^1.0.6"
},
"engines": {
"node": ">=0.6"
@ -4497,6 +4544,7 @@
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
@ -4506,6 +4554,7 @@
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"dev": true,
"license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
@ -4854,10 +4903,11 @@
}
},
"node_modules/send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
"integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
@ -4882,6 +4932,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@ -4890,24 +4941,37 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
"dev": true,
"license": "MIT"
},
"node_modules/send/node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/send/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
"dev": true,
"license": "MIT"
},
"node_modules/serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"version": "1.16.2",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
"integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dev": true,
"license": "MIT",
"dependencies": {
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
"send": "0.19.0"
},
"engines": {
"node": ">= 0.8.0"
@ -4918,6 +4982,7 @@
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
"dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
@ -4934,7 +4999,8 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"dev": true
"dev": true,
"license": "ISC"
},
"node_modules/shebang-command": {
"version": "2.0.0",
@ -4962,6 +5028,7 @@
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.7",
"es-errors": "^1.3.0",
@ -5086,6 +5153,7 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@ -5519,6 +5587,7 @@
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
@ -5543,6 +5612,7 @@
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.6"
}
@ -5585,6 +5655,7 @@
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"dev": true,
"license": "MIT",
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
@ -5640,6 +5711,7 @@
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@ -6389,9 +6461,9 @@
}
},
"body-parser": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
"version": "1.20.3",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
"integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dev": true,
"requires": {
"bytes": "3.1.2",
@ -6402,7 +6474,7 @@
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"qs": "6.13.0",
"raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
@ -6442,12 +6514,12 @@
}
},
"braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"requires": {
"fill-range": "^7.0.1"
"fill-range": "^7.1.1"
}
},
"browserslist": {
@ -6709,9 +6781,9 @@
"dev": true
},
"cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
"integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"dev": true
},
"cookie-signature": {
@ -7033,9 +7105,9 @@
"dev": true
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"dev": true
},
"end-of-stream": {
@ -7246,37 +7318,37 @@
}
},
"express": {
"version": "4.19.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
"version": "4.21.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz",
"integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==",
"dev": true,
"requires": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.2",
"body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.6.0",
"cookie": "0.7.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"finalhandler": "1.3.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"path-to-regexp": "0.1.10",
"proxy-addr": "~2.0.7",
"qs": "6.11.0",
"qs": "6.13.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"send": "0.19.0",
"serve-static": "1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
@ -7408,22 +7480,22 @@
}
},
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"requires": {
"to-regex-range": "^5.0.1"
}
},
"finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
"integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dev": true,
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
@ -8402,9 +8474,9 @@
}
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
"integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"dev": true
},
"merge2": {
@ -8420,12 +8492,12 @@
"dev": true
},
"micromatch": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"requires": {
"braces": "^3.0.2",
"braces": "^3.0.3",
"picomatch": "^2.3.1"
}
},
@ -8637,9 +8709,9 @@
}
},
"object-inspect": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
"integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
"dev": true
},
"object.defaults": {
@ -8809,9 +8881,9 @@
"dev": true
},
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
"version": "0.1.10",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
"integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
"dev": true
},
"path-type": {
@ -9201,12 +9273,12 @@
"dev": true
},
"qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
"integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dev": true,
"requires": {
"side-channel": "^1.0.4"
"side-channel": "^1.0.6"
}
},
"queue-microtask": {
@ -9493,9 +9565,9 @@
}
},
"send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
"integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dev": true,
"requires": {
"debug": "2.6.9",
@ -9530,6 +9602,12 @@
}
}
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"dev": true
},
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@ -9539,15 +9617,15 @@
}
},
"serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"version": "1.16.2",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
"integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dev": true,
"requires": {
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
"send": "0.19.0"
}
},
"set-function-length": {

View file

@ -1,79 +1,85 @@
<!-- INCLUDE overall_header.html -->
{% include 'overall_header.html' %}
<a id="maincontent"></a>
<h1>{L_ACP_VC_SETTINGS}</h1>
<h1>{{ lang('ACP_VC_SETTINGS') }}</h1>
<p>{L_ACP_VC_SETTINGS_EXPLAIN}</p>
<p>{{ lang('ACP_VC_SETTINGS_EXPLAIN') }}</p>
<p>{L_ACP_VC_EXT_GET_MORE}</p>
<p>{{ lang('ACP_VC_EXT_GET_MORE') }}</p>
<!-- IF ERROR_MSG -->
{% if ERRORS %}
<div class="errorbox">
<h3>{L_WARNING}</h3>
<p>{ERROR_MSG}</p>
<h3>{{ lang('WARNING') }}</h3>
<p>{{ ERRORS|join('<br>') }}</p>
</div>
<!-- ENDIF -->
{% endif %}
<form id="acp_captcha" method="post" action="{U_ACTION}">
<form id="acp_captcha" method="post" action="{{ U_ACTION }}">
<fieldset>
<legend>{L_GENERAL_OPTIONS}</legend>
<legend>{{ lang('GENERAL_OPTIONS') }}</legend>
<dl>
<dt><label for="enable_confirm">{L_VISUAL_CONFIRM_REG}{L_COLON}</label><br /><span>{L_VISUAL_CONFIRM_REG_EXPLAIN}</span></dt>
<dd><label><input type="radio" class="radio" id="enable_confirm" name="enable_confirm" value="1"<!-- IF REG_ENABLE --> checked="checked"<!-- ENDIF --> /> {L_ENABLED}</label>
<label><input type="radio" class="radio" name="enable_confirm" value="0"<!-- IF not REG_ENABLE --> checked="checked"<!-- ENDIF --> /> {L_DISABLED}</label></dd>
<dt><label for="enable_confirm">{{ lang('VISUAL_CONFIRM_REG') ~ lang('COLON') }}</label><br /><span>{{ lang('VISUAL_CONFIRM_REG_EXPLAIN') }}</span></dt>
<dd>
<label><input type="radio" class="radio" id="enable_confirm" name="enable_confirm" value="1"{% if REG_ENABLE %} checked="checked"{% endif %}/> {{ lang('ENABLED') }}</label>
<label><input type="radio" class="radio" name="enable_confirm" value="0"{% if not REG_ENABLE %} checked="checked"{% endif %}/> {{ lang('DISABLED') }}</label>
</dd>
</dl>
<dl>
<dt><label for="max_reg_attempts">{L_REG_LIMIT}{L_COLON}</label><br /><span>{L_REG_LIMIT_EXPLAIN}</span></dt>
<dd><input id="max_reg_attempts" type="number" min="0" max="9999" name="max_reg_attempts" value="{REG_LIMIT}" /></dd>
<dt><label for="max_reg_attempts">{{ lang('REG_LIMIT') ~ lang('COLON') }}</label><br /><span>{{ lang('REG_LIMIT_EXPLAIN') }}</span></dt>
<dd><input id="max_reg_attempts" type="number" min="0" max="9999" name="max_reg_attempts" value="{{ REG_LIMIT }}" /></dd>
</dl>
<dl>
<dt><label for="max_login_attempts">{L_MAX_LOGIN_ATTEMPTS}{L_COLON}</label><br /><span>{L_MAX_LOGIN_ATTEMPTS_EXPLAIN}</span></dt>
<dd><input id="max_login_attempts" type="number" min="0" max="9999" name="max_login_attempts" value="{MAX_LOGIN_ATTEMPTS}" /></dd>
<dt><label for="max_login_attempts">{{ lang('MAX_LOGIN_ATTEMPTS') ~ lang('COLON') }}</label><br /><span>{{ lang('MAX_LOGIN_ATTEMPTS_EXPLAIN') }}</span></dt>
<dd><input id="max_login_attempts" type="number" min="0" max="9999" name="max_login_attempts" value="{{ MAX_LOGIN_ATTEMPTS }}" /></dd>
</dl>
<dl>
<dt><label for="enable_post_confirm">{L_VISUAL_CONFIRM_POST}{L_COLON}</label><br /><span>{L_VISUAL_CONFIRM_POST_EXPLAIN}</span></dt>
<dd><label><input type="radio" class="radio" id="enable_post_confirm" name="enable_post_confirm" value="1"<!-- IF POST_ENABLE --> checked="checked"<!-- ENDIF --> /> {L_ENABLED}</label>
<label><input type="radio" class="radio" name="enable_post_confirm" value="0"<!-- IF not POST_ENABLE --> checked="checked"<!-- ENDIF --> /> {L_DISABLED}</label></dd>
<dt><label for="enable_post_confirm">{{ lang('VISUAL_CONFIRM_POST') ~ lang('COLON') }}</label><br /><span>{{ lang('VISUAL_CONFIRM_POST_EXPLAIN') }}</span></dt>
<dd>
<label><input type="radio" class="radio" id="enable_post_confirm" name="enable_post_confirm" value="1"{% if POST_ENABLE %} checked="checked"{% endif %}/> {{ lang('ENABLED') }}</label>
<label><input type="radio" class="radio" name="enable_post_confirm" value="0"{% if not POST_ENABLE %} checked="checked"{% endif %}/> {{ lang('DISABLED') }}</label>
</dd>
</dl>
<dl>
<dt><label for="confirm_refresh">{L_VISUAL_CONFIRM_REFRESH}{L_COLON}</label><br /><span>{L_VISUAL_CONFIRM_REFRESH_EXPLAIN}</span></dt>
<dd><label><input type="radio" class="radio" id="confirm_refresh" name="confirm_refresh" value="1"<!-- IF CONFIRM_REFRESH --> checked="checked"<!-- ENDIF --> /> {L_ENABLED}</label>
<label><input type="radio" class="radio" name="confirm_refresh" value="0"<!-- IF not CONFIRM_REFRESH --> checked="checked"<!-- ENDIF --> /> {L_DISABLED}</label></dd>
<dt><label for="confirm_refresh">{{ lang('VISUAL_CONFIRM_REFRESH') ~ lang('COLON') }}</label><br /><span>{{ lang('VISUAL_CONFIRM_REFRESH_EXPLAIN') }}</span></dt>
<dd>
<label><input type="radio" class="radio" id="confirm_refresh" name="confirm_refresh" value="1"{% if CONFIRM_REFRESH %} checked="checked"{% endif %}/> {{ lang('ENABLED') }}</label>
<label><input type="radio" class="radio" name="confirm_refresh" value="0"{% if not CONFIRM_REFRESH %} checked="checked"{% endif %}/> {{ lang('DISABLED') }}</label>
</dd>
</dl>
</fieldset>
<fieldset>
<legend>{L_AVAILABLE_CAPTCHAS}</legend>
<dl>
<dt><label for="captcha_select">{L_CAPTCHA_SELECT}{L_COLON}</label><br /><span>{L_CAPTCHA_SELECT_EXPLAIN}</span></dt>
<dd><select id="captcha_select" name="select_captcha" onchange="(document.getElementById('acp_captcha')).submit()" >{CAPTCHA_SELECT}</select></dd>
</dl>
<!-- IF S_CAPTCHA_HAS_CONFIG -->
<dl>
<dt><label for="configure">{L_CAPTCHA_CONFIGURE}{L_COLON}</label><br /><span>{L_CAPTCHA_CONFIGURE_EXPLAIN}</span></dt>
<dd><input class="button2" type="submit" id="configure" name="configure" value="{L_CONFIGURE}" /></dd>
</dl>
<!-- ENDIF -->
<legend>{{ lang('AVAILABLE_CAPTCHAS') }}</legend>
<dl>
<dt><label for="captcha_select">{{ lang('CAPTCHA_SELECT') ~ lang('COLON') }}</label><br><span>{{ lang('CAPTCHA_SELECT_EXPLAIN') }}</span></dt>
<dd>{{ FormsSelect(CAPTCHA_SELECT | merge({id: 'captcha_select', onchange: "(document.getElementById('acp_captcha')).submit()"})) }}</dd>
</dl>
{% if S_CAPTCHA_HAS_CONFIG %}
<dl>
<dt><label for="configure">{{ lang('CAPTCHA_CONFIGURE') ~ lang('COLON') }}</label><br /><span>{{ lang('CAPTCHA_CONFIGURE_EXPLAIN') }}</span></dt>
<dd><input class="button2" type="submit" id="configure" name="configure" value="{{ lang('CONFIGURE') }}" /></dd>
</dl>
{% endif %}
</fieldset>
<!-- IF CAPTCHA_PREVIEW_TPL -->
{% if CAPTCHA_PREVIEW_TPL %}
<fieldset>
<legend>{L_PREVIEW}</legend>
<!-- INCLUDE {CAPTCHA_PREVIEW_TPL} -->
<legend>{{ lang('PREVIEW') }}</legend>
{% include CAPTCHA_PREVIEW_TPL %}
</fieldset>
<!-- ENDIF -->
{% endif %}
<fieldset>
<legend>{L_ACP_SUBMIT_CHANGES}</legend>
<legend>{{ lang('ACP_SUBMIT_CHANGES') }}</legend>
<p class="submit-buttons">
<input class="button1" type="submit" id="main_submit" name="main_submit" value="{L_SUBMIT}" />&nbsp;
<input class="button2" type="reset" id="form_reset" name="reset" value="{L_RESET}" />&nbsp;
<input class="button1" type="submit" id="main_submit" name="main_submit" value="{{ lang('SUBMIT') }}" />&nbsp;
<input class="button2" type="reset" id="form_reset" name="reset" value="{{ lang('RESET') }}" />&nbsp;
</p>
{S_FORM_TOKEN}
{{ S_FORM_TOKEN }}
</fieldset>
</form>
<!-- INCLUDE overall_footer.html -->
{% include 'overall_footer.html' %}

View file

@ -42,82 +42,94 @@
</tr>
</thead>
<tbody>
<!-- IF .enabled -->
<tr>
<td class="row3" colspan="4"><strong>{L_EXTENSIONS_ENABLED}</strong><!-- EVENT acp_ext_list_enabled_title_after --></td>
</tr>
<!-- BEGIN enabled -->
<tr class="ext_enabled row-highlight">
<td><strong title="{enabled.NAME}">{enabled.META_DISPLAY_NAME}</strong><!-- EVENT acp_ext_list_enabled_name_after --></td>
<td style="text-align: center;">
<!-- IF enabled.S_VERSIONCHECK -->
<strong class="<!-- IF enabled.S_UP_TO_DATE -->current-ext<!-- ELSE -->outdated-ext<!-- ENDIF -->">{enabled.META_VERSION}</strong>
<!-- IF not enabled.S_UP_TO_DATE -->{{ Icon('font', 'circle-exclamation', '', true, 'fas outdated-ext') }}<!-- ENDIF -->
<!-- ELSE -->
{enabled.META_VERSION}
<!-- ENDIF -->
</td>
<td style="text-align: center;"><a href="{enabled.U_DETAILS}">{L_DETAILS}</a></td>
<td style="text-align: center;">
<!-- BEGIN actions -->
<a href="{enabled.actions.U_ACTION}"<!-- IF enabled.actions.ACTION == 'REMOVE' --> style="color: #bc2a4d;"<!-- ENDIF --><!-- IF enabled.actions.L_ACTION_EXPLAIN --> title="{enabled.actions.L_ACTION_EXPLAIN}"<!-- ENDIF -->>{enabled.actions.L_ACTION}</a>
<!-- IF not enabled.actions.S_LAST_ROW -->&nbsp;|&nbsp;<!-- ENDIF -->
<!-- END actions -->
</td>
</tr>
<!-- END enabled -->
<!-- ENDIF -->
<!-- IF .disabled -->
<tr>
<td class="row3" colspan="4"><strong>{L_EXTENSIONS_DISABLED}</strong><!-- EVENT acp_ext_list_disabled_title_after --></td>
</tr>
<!-- BEGIN disabled -->
<tr class="ext_disabled row-highlight">
<td><strong title="{disabled.NAME}">{disabled.META_DISPLAY_NAME}</strong><!-- EVENT acp_ext_list_disabled_name_after --></td>
<td style="text-align: center;">
<!-- IF disabled.S_VERSIONCHECK -->
<strong class="<!-- IF disabled.S_UP_TO_DATE -->current-ext<!-- ELSE -->outdated-ext<!-- ENDIF -->">{disabled.META_VERSION}</strong>
<!-- IF not disabled.S_UP_TO_DATE -->{{ Icon('font', 'circle-exclamation', '', true, 'fas outdated-ext') }}<!-- ENDIF -->
<!-- ELSE -->
{disabled.META_VERSION}
<!-- ENDIF -->
</td>
<td style="text-align: center;">
<!-- IF disabled.U_DETAILS --><a href="{disabled.U_DETAILS}">{L_DETAILS}</a><!-- ENDIF -->
</td>
<td style="text-align: center;">
<!-- BEGIN actions -->
<a href="{disabled.actions.U_ACTION}"<!-- IF disabled.actions.ACTION == 'REMOVE' --> style="color: #bc2a4d;"<!-- ENDIF --><!-- IF disabled.actions.L_ACTION_EXPLAIN --> title="{disabled.actions.L_ACTION_EXPLAIN}"<!-- ENDIF -->>{disabled.actions.L_ACTION}</a>
<!-- IF not disabled.actions.S_LAST_ROW -->&nbsp;|&nbsp;<!-- ENDIF -->
<!-- END actions -->
</td>
</tr>
<!-- END disabled -->
<!-- ENDIF -->
{% for list in ['enabled', 'disabled', 'not_installed'] %}
{% set blockname = attribute(loops, list) %}
{% if blockname|length %}
<tr>
<td class="row3" colspan="4"><strong>{{ lang('EXTENSIONS_' ~ list|upper) }}</strong>
{% if list == 'enabled' %}
{% EVENT acp_ext_list_enabled_title_after %}
{% elseif list == 'disabled' %}
{% EVENT acp_ext_list_disabled_title_after %}
{% elseif list == 'not_installed' %}
{% EVENT acp_ext_list_not_installed_title_after %}
{% endif %}
</td>
</tr>
{% for data in blockname %}
<tr class="ext_{{ list }} row-highlight">
<td><strong title="{{ data.NAME }}">{{ data.META_DISPLAY_NAME }}</strong>
{% if list == 'enabled' %}
{% EVENT acp_ext_list_enabled_name_after %}
{% elseif list == 'disabled' %}
{% EVENT acp_ext_list_disabled_name_after %}
{% elseif list == 'not_installed' %}
{% EVENT acp_ext_list_not_installed_name_after %}
{% endif %}
</td>
<td style="text-align: center;">
{% if data.S_VERSIONCHECK %}
<strong class="{% if data.S_UP_TO_DATE %}current-ext{% else %}outdated-ext{% endif %}">{{ data.META_VERSION }}</strong>
{% if not data.S_UP_TO_DATE %}{{ Icon('font', 'circle-exclamation', '', true, 'fas outdated-ext') }}{% endif %}
{% else %}
{{ data.META_VERSION }}
{% endif %}
</td>
<td style="text-align: center;">
{% if data.U_DETAILS %}<a href="{{ data.U_DETAILS }}">{{ lang ('DETAILS') }}</a>{% endif %}
</td>
<td style="text-align: center;">
{% for actions in data.actions %}
<a href="{{ actions.U_ACTION }}"{% if actions.L_ACTION_EXPLAIN %} title="{{ actions.L_ACTION_EXPLAIN }}"{% endif %}>{{ actions.L_ACTION }}</a>
{% if not actions.S_LAST_ROW %}&nbsp;|&nbsp;{% endif %}
{% endfor %}
</td>
</tr>
{% endfor %}
{% endif %}
{% endfor %}
</tbody>
</table>
<table class="table1">
<tr>
<th>{L_EXTENSION_INSTALL_HEADLINE}</th>
</tr>
<tr>
<td class="row3">{L_EXTENSION_INSTALL_EXPLAIN}</td>
</tr>
<tr>
<th>{L_EXTENSION_UPDATE_HEADLINE}</th>
</tr>
<tr>
<td class="row3">{L_EXTENSION_UPDATE_EXPLAIN}</td>
</tr>
<tr>
<th>{L_EXTENSION_REMOVE_HEADLINE}</th>
</tr>
<tr>
<td class="row3">{L_EXTENSION_REMOVE_EXPLAIN}</td>
</tr>
</tbody>
<tbody>
<tr>
<th>{L_EXTENSION_INSTALLING_HEADLINE}</th>
</tr>
<tr>
<td class="row3">
<ol>
{% for step in lang_raw('EXTENSION_INSTALLING_EXPLAIN') %}
<li>{{ step }}</li>
{% endfor %}
</ol>
</td>
</tr>
<tr>
<th>{L_EXTENSION_UPDATING_HEADLINE}</th>
</tr>
<tr>
<td class="row3">
<ol>
{% for step in lang_raw('EXTENSION_UPDATING_EXPLAIN') %}
<li>{{ step }}</li>
{% endfor %}
</ol>
</td>
</tr>
<tr>
<th>{L_EXTENSION_REMOVING_HEADLINE}</th>
</tr>
<tr>
<td class="row3">
<ol>
{% for step in lang_raw('EXTENSION_REMOVING_EXPLAIN') %}
<li>{{ step }}</li>
{% endfor %}
</ol>
</td>
</tr>
</tbody>
</table>
<!-- INCLUDE overall_footer.html -->

View file

@ -181,7 +181,14 @@
<!-- ENDIF -->
<dl>
<dt><label for="forum_style">{L_FORUM_STYLE}{L_COLON}</label></dt>
<dd><select id="forum_style" name="forum_style"><option value="0">{L_DEFAULT_STYLE}</option>{S_STYLES_OPTIONS}</select></dd>
<dd>
<select id="forum_style" name="forum_style">
<option value="0">{{ lang('DEFAULT_STYLE') }}</option>
{% for style in S_STYLES_OPTIONS %}
<option value="{{ style.value }}"{% if style.selected %} selected="selected"{% endif %}>{{ style.label }}</option>
{% endfor %}
</select>
</dd>
</dl>
<!-- EVENT acp_forums_main_settings_append -->
</fieldset>

View file

@ -1,22 +0,0 @@
<!-- INCLUDE overall_header.html -->
<h1>{L_COPY_PERMISSIONS}</h1>
<p>{L_COPY_PERMISSIONS_EXPLAIN}</p>
<p>{L_ACL_LINK}</p>
<form id="confirm" method="post" action="{S_COPY_ACTION}">
<fieldset>
<dl>
<dt><label for="forum_perm_from">{L_COPY_PERMISSIONS}{L_COLON}</label><br /><span>{L_COPY_PERMISSIONS_EXPLAIN}</span></dt>
<dd><select id="forum_perm_from" name="forum_perm_from"><option value="0">{L_NO_PERMISSIONS}</option>{S_FORUM_OPTIONS}</select></dd>
</dl>
<div style="text-align: center;">{S_FORM_TOKEN}{S_HIDDEN_FIELDS}
<input type="submit" name="update" value="{L_CONTINUE}" class="button2" />&nbsp;
</div>
</fieldset>
</form>
<!-- INCLUDE overall_footer.html -->

View file

@ -105,7 +105,7 @@
<!-- BEGIN items -->
<tr>
<td style="text-align: center;"><img src="{items.IMG_SRC}" alt="{items.TEXT_ALT}" title="{items.TEXT_ALT}" style="max-width: 160px;"><input type="hidden" name="image[{items.IMG}]" value="1" /></td>
<td style="text-align: center;"><img src="{items.IMG_SRC}" alt="{items.TEXT_ALT}" title="{items.TEXT_ALT}" style="max-width: 160px;"{% if items.WIDTH && items.HEIGHT %} width="{{ items.WIDTH }}" height="{{ items.HEIGHT }}"{% endif %}><input type="hidden" name="image[{items.IMG}]" value="1" /></td>
<td style="vertical-align: top;">[{items.IMG}]</td>
<!-- IF S_SMILIES -->
<td><input class="text post" type="text" name="code[{items.IMG}]" value="{items.CODE}" size="10" maxlength="50" /></td>

View file

@ -28,7 +28,7 @@
<!-- IF S_LINKS_ALLOWED -->
<input type="button" class="button2" accesskey="w" name="addbbcode16" value="URL" style="text-decoration: underline; width: 40px" onclick="bbstyle(16)" title="{L_BBCODE_W_HELP}" />
<!-- ENDIF -->
<select name="addbbcode20" onchange="bbfontstyle('[size=' + this.form.addbbcode20.options[this.form.addbbcode20.selectedIndex].value + ']', '[/size]');this.form.addbbcode20.selectedIndex = 2;" title="{L_BBCODE_F_HELP}">
<select name="addbbcode18" onchange="bbfontstyle('[size=' + this.form.addbbcode18.options[this.form.addbbcode18.selectedIndex].value + ']', '[/size]');this.form.addbbcode18.selectedIndex = 2;" title="{L_BBCODE_F_HELP}">
<option value="50">{L_FONT_TINY}</option>
<option value="85">{L_FONT_SMALL}</option>
<option value="100" selected="selected">{L_FONT_NORMAL}</option>

View file

@ -18,11 +18,13 @@
<tr>
<th colspan="3">{L_QUESTIONS}</th>
</tr>
{% if questions %}
<tr class="row3">
<td style="text-align: center;">{L_QUESTION_TEXT}</td>
<td style="width: 5%; text-align: center;">{L_QUESTION_LANG}</td>
<td style="vertical-align: top; width: 50px; text-align: center; white-space: nowrap;">{L_ACTION}</td>
</tr>
{% endif %}
</thead>
<tbody>
@ -33,6 +35,10 @@
<td style="text-align: center;">{{ question.QUESTION_LANG }}</td>
<td style="text-align: center;"><a href="{{ question.U_EDIT }}">{{ ICON_EDIT }}</a> <a href="{{ question.U_DELETE }}">{{ ICON_DELETE }}</a></td>
</tr>
{% else %}
<tr>
<td class="row3 centered-text" colspan="3">{{ lang('QA_NO_QUESTIONS') }}</td>
</tr>
{% endfor %}
</tbody>

View file

@ -0,0 +1,64 @@
{% include('overall_header.html') %}
<a id="maincontent"></a>
<h1>{{ lang('ACP_VC_SETTINGS') }}</h1>
<p>{{ lang('ACP_VC_SETTINGS_EXPLAIN') }}</p>
<form id="acp_captcha" method="post" action="{{ U_ACTION }}">
<fieldset>
<legend>{{ lang('GENERAL_OPTIONS') }}</legend>
<dl>
<dt>
<label for="captcha_turnstile_sitekey">{{ lang('CAPTCHA_TURNSTILE_SITEKEY') ~ lang('COLON') }}</label><br>
<span>{{ lang('CAPTCHA_TURNSTILE_SITEKEY_EXPLAIN') }}</span>
</dt>
<dd><input id="captcha_turnstile_sitekey" name="captcha_turnstile_sitekey" value="{{ CAPTCHA_TURNSTILE_SITEKEY }}" size="50" type="text" /></dd>
</dl>
<dl>
<dt>
<label for="captcha_turnstile_secret">{{ lang('CAPTCHA_TURNSTILE_SECRET') ~ lang('COLON') }}</label><br>
<span>{{ lang('CAPTCHA_TURNSTILE_SECRET_EXPLAIN') }}</span>
</dt>
<dd><input id="captcha_turnstile_secret" name="captcha_turnstile_secret" value="{{ CAPTCHA_TURNSTILE_SECRET }}" size="50" type="text" /></dd>
</dl>
<dl>
<dt>
<label>{{ lang('CAPTCHA_TURNSTILE_THEME') ~ lang('COLON') }}</label>
<br><span>{{ lang('CAPTCHA_TURNSTILE_THEME_EXPLAIN') }}</span>
</dt>
<dd>
{% for theme in CAPTCHA_TURNSTILE_THEMES %}
<label>
<input class="radio" name="captcha_turnstile_theme" type="radio" value="{{ theme }}"{{ theme == CAPTCHA_TURNSTILE_THEME ? ' checked' }}>
<span>{{ lang('CAPTCHA_TURNSTILE_THEME_' ~ theme|upper) }}</span>
</label>
{% endfor %}
</dd>
</dl>
</fieldset>
<fieldset>
<legend>{{ lang('PREVIEW') }}</legend>
{% if PREVIEW %}
<div class="successbox">
<h3>{{ lang('WARNING') }}</h3>
<p>{{ lang('CAPTCHA_PREVIEW_MSG') }}</p>
</div>
{% endif %}
{% include(CAPTCHA_PREVIEW) %}
</fieldset>
<fieldset>
<legend>{{ lang('ACP_SUBMIT_CHANGES') }}</legend>
<p class="submit-buttons">
<input class="button1" type="submit" id="submit" name="submit" value="{{ lang('SUBMIT') }}" />&nbsp;
<input class="button2" type="reset" id="reset" name="reset" value="{{ lang('RESET') }}" />&nbsp;
</p>
<input type="hidden" name="select_captcha" value="{{ CAPTCHA_NAME }}" />
<input type="hidden" name="configure" value="1" />
{{ S_FORM_TOKEN }}
</fieldset>
</form>
{% include('overall_footer.html') %}

View file

@ -0,0 +1,23 @@
<dl>
<dt><div id="captcha_turnstile" data-language="{{ lang('TURNSTILE_LANG') }}"{% if TURNSTILE_THEME %} data-theme="{{ TURNSTILE_THEME }}"{% endif %}></div></dt>
</dl>
{% INCLUDEJS U_TURNSTILE_SCRIPT %}
<script>
function domReady(callBack) {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callBack);
} else {
callBack();
}
}
domReady(() => {
/* global turnstile */
console.debug('_turnstileCb called');
turnstile.render('#captcha_turnstile', {
sitekey: '1x00000000000000000000AA',
theme: 'light',
});
});
</script>

View file

@ -605,6 +605,8 @@
function interceptFormSubmit($form) {
if (!$form.length) {
return;
} else if ($form.find('input[name="admin_name"]').length > 0) {
setAdminTimezone($form);
}
$form.find(':submit').bind('click', function (event) {
@ -612,4 +614,20 @@
submitForm($form, $(this));
});
}
/**
* Set admin timezone in form
*
* @param $form
*/
function setAdminTimezone($form) {
// Set admin timezone if it does not exist yet
if ($form.find('input[name="admin_timezone"]').length === 0) {
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
// Add timezone as form entry
const timezoneEntry = $('<input type="hidden" name="admin_timezone" value="' + timeZone + '">');
$form.append(timezoneEntry);
}
}
})(jQuery); // Avoid conflicts with other libraries

View file

@ -51,7 +51,7 @@ function PhpbbWebpush() {
// Service workers are only supported in secure context
if (window.isSecureContext !== true) {
subscribeButton.disabled = true;
setDisabledState();
return;
}
@ -66,13 +66,33 @@ function PhpbbWebpush() {
.catch(error => {
console.info(error);
// Service worker could not be registered
subscribeButton.disabled = true;
setDisabledState();
});
} else {
subscribeButton.disabled = true;
setDisabledState();
}
};
/**
* Disable subscribing buttons, update subscribe button text and hide dropdown toggle
*
* @return void
*/
function setDisabledState() {
subscribeButton.disabled = true;
const notificationList = document.getElementById('notification-menu');
const subscribeToggle = notificationList.querySelector('.webpush-subscribe');
if (subscribeToggle) {
subscribeToggle.style.display = 'none';
}
if (subscribeButton.type === 'submit' || subscribeButton.classList.contains('button')) {
subscribeButton.value = subscribeButton.getAttribute('data-disabled-msg');
}
}
/**
* Update button state depending on notifications state
*
@ -150,6 +170,7 @@ function PhpbbWebpush() {
// Prevent the user from clicking the subscribe button multiple times.
const result = await Notification.requestPermission();
if (result === 'denied') {
phpbb.alert(subscribeButton.getAttribute('data-l-err'), subscribeButton.getAttribute('data-l-msg'));
return;
}

View file

@ -58,7 +58,7 @@
"symfony/routing": "^6.3",
"symfony/twig-bridge": "^6.3",
"symfony/yaml": "^6.3",
"twig/twig": "3.8.0"
"twig/twig": "^3.14"
},
"require-dev": {
"laravel/homestead": "~14.4",
@ -73,9 +73,6 @@
"vimeo/psalm": "^5.18.0",
"psalm/plugin-symfony": "^v5.1.0"
},
"suggest": {
"ext-mbstring": "Better performance in search"
},
"extra": {
"branch-alias": {
"dev-master": "4.0.x-dev"

1072
phpBB/composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -157,6 +157,15 @@ services:
- '%core.php_ext%'
- '%tables.log%'
manifest.controller:
class: phpbb\manifest
arguments:
- '@config'
- '@language'
- '@path_helper'
- '@event_dispatcher'
- '@user'
path_helper:
class: phpbb\path_helper
arguments:

View file

@ -19,7 +19,11 @@ services:
shared: false
arguments:
- '@config'
- '@dbal.conn'
- '@language'
- '@request'
- '@template'
- '@user'
- '%core.root_path%'
- '%core.php_ext%'
calls:
@ -54,3 +58,19 @@ services:
- ['set_name', ['core.captcha.plugins.recaptcha_v3']]
tags:
- { name: captcha.plugins }
core.captcha.plugins.turnstile:
class: phpbb\captcha\plugins\turnstile
shared: false
arguments:
- '@config'
- '@dbal.conn'
- '@language'
- '@log'
- '@request'
- '@template'
- '@user'
calls:
- ['set_name', ['core.captcha.plugins.turnstile']]
tags:
- { name: captcha.plugins }

View file

@ -359,6 +359,22 @@ services:
tags:
- { name: console.command }
console.command.user.delete_id:
class: phpbb\console\command\user\delete_id
arguments:
- '@dbal.conn'
- '@language'
- '@log'
- '@user'
- '@user_loader'
- '%tables.bots%'
- '%tables.user_group%'
- '%tables.users%'
- '%core.root_path%'
- '%core.php_ext%'
tags:
- { name: console.command }
console.command.user.reclean:
class: phpbb\console\command\user\reclean
arguments:

View file

@ -70,8 +70,6 @@ services:
shared: false
arguments:
- '@filesystem'
- '@upload_imagesize'
- '@mimetype.guesser'
- '%core.root_path%'
tags:
- { name: storage.adapter }
@ -90,6 +88,7 @@ services:
- '@cache'
- '@config'
- '@dbal.conn'
- '@mimetype.extension_guesser'
- '@storage.avatar'
- '@symfony_request'
@ -102,6 +101,7 @@ services:
- '@content.visibility'
- '@dbal.conn'
- '@event_dispatcher'
- '@mimetype.extension_guesser'
- '@language'
- '@request'
- '@storage.attachment'

View file

@ -1,4 +1,15 @@
services:
phpbb.ucp.controller.delete_cookies:
class: phpbb\ucp\controller\delete_cookies
arguments:
- '@config'
- '@dispatcher'
- '@language'
- '@request'
- '@user'
- '%core.root_path%'
- '%core.php_ext%'
phpbb.ucp.controller.reset_password:
class: phpbb\ucp\controller\reset_password
arguments:
@ -23,8 +34,11 @@ services:
- '@controller.helper'
- '@dbal.conn'
- '@form_helper'
- '@language'
- '@notification_manager'
- '@path_helper'
- '@request'
- '@user_loader'
- '@user'
- '@template.twig.environment'
- '%tables.notification_push%'

View file

@ -24,6 +24,10 @@ phpbb_help_routing:
resource: help.yml
prefix: /help
phpbb_manifest_controller:
path: /manifest
defaults: { _controller: manifest.controller:handle }
phpbb_mention_controller:
path: /mention
methods: [GET, POST]

View file

@ -1,3 +1,7 @@
phpbb_ucp_delete_cookies_controller:
path: /delete_cookies
defaults: { _controller: phpbb.ucp.controller.delete_cookies:handle }
phpbb_ucp_reset_password_controller:
path: /reset_password
defaults: { _controller: phpbb.ucp.controller.reset_password:reset }

View file

@ -50,6 +50,10 @@
<ol>
<li><a href="#changelog">Changelog</a>
<ul>
<li><a href="#v3314rc1">Changes since 3.3.14-RC1</a></li>
<li><a href="#v3313">Changes since 3.3.13</a></li>
<li><a href="#v3313rc1">Changes since 3.3.13-RC1</a></li>
<li><a href="#v3312">Changes since 3.3.12</a></li>
<li><a href="#v3312rc1">Changes since 3.3.12-RC1</a></li>
<li><a href="#v3311">Changes since 3.3.11</a></li>
<li><a href="#v3310">Changes since 3.3.10</a></li>
@ -169,6 +173,97 @@
<div class="inner">
<div class="content">
<a name="v3314rc1"></a><h3>Changes since 3.3.14-RC1</h3>
<h4>Improvement</h4>
<ul>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17421">PHPBB-17421</a>] - Rename section for not installed extensions to not installed</li>
</ul>
<a name="v3313"></a><h3>Changes since 3.3.13</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17181">PHPBB-17181</a>] - If statement to highlight Reported PMS on the view message page doesn't work.</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17383">PHPBB-17383</a>] - HELO/EHLO error while using gethostbyaddr()</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17384">PHPBB-17384</a>] - Passing E_USER_ERROR to trigger_error() is deprecated in PHP 8.4</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17385">PHPBB-17385</a>] - Version check without SSL flag for CDB extensions fails</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17386">PHPBB-17386</a>] - Incorrect trace result while tracing user-based permissions</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17387">PHPBB-17387</a>] - PHP warnings in search results</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17390">PHPBB-17390</a>] - Missing buttons for approval of new messages</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17391">PHPBB-17391</a>] - PHP warnings on attempt to create user group having name already in use</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17398">PHPBB-17398</a>] - Ajax error on deleting cookies</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17405">PHPBB-17405</a>] - Function phpbb_gmgetdate() returns incorrect result for edge cases</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17410">PHPBB-17410</a>] - UCP tabs do not work when testing out another user's permissions</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-16852">PHPBB-16852</a>] - Addition of a new PHP event concerning bump topics</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17359">PHPBB-17359</a>] - Distinct disabled and not installed extensions in the list</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17376">PHPBB-17376</a>] - Link reference to quote post is a poor accessibility experience</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17382">PHPBB-17382</a>] - Incorrect grammar on FAQ page regarding searching for members</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17388">PHPBB-17388</a>] - Add php event to bump_topic_allowed function</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17394">PHPBB-17394</a>] - Check mergeability of PR on GitHub Actions</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17396">PHPBB-17396</a>] - Automatically handle merges of 3.3.x into master</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17397">PHPBB-17397</a>] - Add event for forum_data query in viewforum</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17402">PHPBB-17402</a>] - Add possibility to force reparsing BBCode via CLI</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17407">PHPBB-17407</a>] - Limit mergeability check to single comment</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17411">PHPBB-17411</a>] - Add core event to search.php</li>
</ul>
<a name="v3313rc1"></a><h3>Changes since 3.3.13-RC1</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17377">PHPBB-17377</a>] - MSSQL builds on GitHub actions broken</li>
</ul>
<a name="v3312"></a><h3>Changes since 3.3.12</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-13916">PHPBB-13916</a>] - Cancelling save draft removes previous notify setting on posting page</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-14454">PHPBB-14454</a>] - Accessing ACP modules while testing user permissions returns a General Error</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-15043">PHPBB-15043</a>] - Searching no longer working in 3.2.0</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-15576">PHPBB-15576</a>] - PM subject truncated to shorter length than maxlength</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-16213">PHPBB-16213</a>] - vendor and phpbb folders should have .htaccess files</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-16907">PHPBB-16907</a>] - &quot;phpbb&quot; value in &quot;hiddenSegments&quot; blocks client requests for extensions in IIS</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17109">PHPBB-17109</a>] - Users without the &quot;Can use signature&quot; permission should not see checkboxes for signature</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17175">PHPBB-17175</a>] - Breadcrumbs show wrong forum and topic when using 'email topic'</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17301">PHPBB-17301</a>] - Wrong length parameter for fread in phpbb/cache/driver/file.php can lead to unusable forum</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17327">PHPBB-17327</a>] - Fix linting issue in console user add command</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17332">PHPBB-17332</a>] - New permission copied from existing permission ignores permission set options</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17337">PHPBB-17337</a>] - Transaction begin is missing from mysqli driver </li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17338">PHPBB-17338</a>] - Incorrect members list sorting by user_last_visit</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17351">PHPBB-17351</a>] - phpBB2 password hashes incorrectly handled during rehash cron</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17352">PHPBB-17352</a>] - Long rank titles push other profile details below</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17353">PHPBB-17353</a>] - Gravatar avatar src is not image src</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17356">PHPBB-17356</a>] - Errors hidden by at are being displayed in PHP 8 or newer</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17358">PHPBB-17358</a>] - Redis cache never expires with the TTL of 0</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17362">PHPBB-17362</a>] - Missing declaration of property in extension manager</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17365">PHPBB-17365</a>] - Enforce the search word limit on queries containing operators without white space</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17366">PHPBB-17366</a>] - Captcha disappears on error message from registration &amp; posting</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17369">PHPBB-17369</a>] - Permanently deleting soft-deleted topics returns incorrect forum in redirect link</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17370">PHPBB-17370</a>] - Deleting Cookies on FAQ/other pages</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17374">PHPBB-17374</a>] - ACP - Maintenance - Logs: Deleting Error / Bug</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17375">PHPBB-17375</a>] - User lastvisit gets updated too often in session garbage collection</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-16553">PHPBB-16553</a>] - Disapproving a reported post causes a &quot;Module not accessible&quot; error</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17308">PHPBB-17308</a>] - Rename tracker project key to PHPBB-</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17315">PHPBB-17315</a>] - Add new template events to group</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17316">PHPBB-17316</a>] - Add template events to ucp_groups_manage</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17317">PHPBB-17317</a>] - Update button text and make it more readable</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17325">PHPBB-17325</a>] - Show explicit message for &quot;Re-Check version&quot; if installed version is still up to date</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17340">PHPBB-17340</a>] - Update composer to 2.7.7</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17342">PHPBB-17342</a>] - Add PHP 8.4-dev tests to GitHub Actions</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17347">PHPBB-17347</a>] - Support deleting users by ID via console</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17350">PHPBB-17350</a>] - Add user IP address to log when installing extensions on fresh installs</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-17355">PHPBB-17355</a>] - Update gravatar hash to sha256</li>
</ul>
<h4>Task</h4>
<ul>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-13933">PHPBB-13933</a>] - Update tokens' definitions in acp_bbcodes</li>
<li>[<a href="https://tracker.phpbb.com/browse/PHPBB-16890">PHPBB-16890</a>] - Edit the config sample files and web.config to deny access to the &quot;config&quot; directory</li>
</ul>
<a name="v3312rc1"></a><h3>Changes since 3.3.12-RC1</h3>
<h4>Bug</h4>
<ul>

View file

@ -106,5 +106,4 @@ MIT licensed:
Symfony2 (c) 2004-2011 Fabien Potencier, https://symfony.com/
Cookie Consent (c) 2015 Silktide Ltd, https://cookieconsent.insites.com
Emoji by:
Twemoji (c) 2018 Twitter, Inc, https://twemoji.twitter.com/
HiDPI smilies by rednoah: https://github.com/rednoah/phpBB-smilies

View file

@ -94,6 +94,20 @@ acp_ext_list_enabled_title_after
* Since: 3.1.11-RC1
* Purpose: Add text after enabled extensions section title.
acp_ext_list_not_installed_name_after
===
* Location: adm/style/acp_ext_list.html
* Since: 3.3.14-RC1
* Changed: 3.3.14 Renamed from acp_ext_list_available_name_after
* Purpose: Add content after the name of not installed extensions in the list
acp_ext_list_not_installed_title_after
===
* Location: adm/style/acp_ext_list.html
* Since: 3.3.14-RC1
* Changed: 3.3.14 Renamed from acp_ext_list_available_title_after
* Purpose: Add text after not installed extensions section title.
acp_forums_custom_settings
===
* Location: adm/style/acp_forums.html

View file

@ -1,7 +1,7 @@
# Sample lighttpd configuration file for phpBB.
# Global settings have been removed, copy them
# from your system's lighttpd.conf.
# Tested with lighttpd 1.4.35
# Tested with lighttpd 1.4.36
# Load moules
server.modules += (
@ -28,7 +28,7 @@ $HTTP["host"] == "www.myforums.com" {
accesslog.filename = "/var/log/lighttpd/access-www.myforums.com.log"
# Deny access to internal phpbb files.
$HTTP["url"] =~ "^/(config\.php|common\.php|cache|files|images/avatars/upload|includes|phpbb|store|vendor)" {
$HTTP["url"] =~ "^/(config|common\.php|cache|files|images/avatars/upload|includes|phpbb|store|vendor|vendor-ext)" {
url.access-deny = ( "" )
}
@ -47,7 +47,8 @@ $HTTP["host"] == "www.myforums.com" {
# by default accessed at /app.php/my/controller, but can also be accessed at
# /my/controller
url.rewrite-if-not-file = (
"^/(.*)$" => "/app.php/$1"
"^/install/(.*)$" => "/install/app.php/$1",
"^/(.*)$" => "/app.php/$1"
)
fastcgi.server = ( ".php" =>

View file

@ -55,7 +55,7 @@ server {
}
# Deny access to internal phpbb files.
location ~ /(config\.php|common\.php|cache|files|images/avatars/upload|includes|(?<!ext/)phpbb(?!\w+)|store|vendor) {
location ~ /(config|common\.php|cache|files|images/avatars/upload|includes|(?<!ext/)phpbb(?!\w+)|store|vendor|vendor-ext) {
deny all;
# deny was ignored before 0.8.40 for connections over IPv6.
# Use internal directive to prohibit access on older versions.
@ -92,4 +92,10 @@ server {
deny all;
internal;
}
# Deny access to apache configuration files.
location ~ /\.htaccess|/\.htpasswd|/\.htgroups {
deny all;
internal;
}
}

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_2" data-name="Ebene 2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 73.75 92.51">
<defs>
<style>
.cls-1 {
fill: #d3575d;
}
.cls-1, .cls-2 {
stroke-width: 0px;
}
.cls-2 {
fill: url(#Neues_Verlaufsfeld_1);
}
</style>
<linearGradient id="Neues_Verlaufsfeld_1" data-name="Neues Verlaufsfeld 1" x1="36.87" y1="2" x2="36.87" y2="90.51" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#fdf4dc"/>
<stop offset=".03" stop-color="#fdf1d3"/>
<stop offset=".11" stop-color="#fdebc1"/>
<stop offset=".19" stop-color="#fde8b5"/>
<stop offset=".28" stop-color="#fee7b2"/>
<stop offset=".67" stop-color="#fed36d"/>
<stop offset=".89" stop-color="#ffc232"/>
<stop offset="1" stop-color="#e5832c"/>
</linearGradient>
</defs>
<g id="Layer_1" data-name="Layer 1">
<g id="Fire">
<g>
<path class="cls-2" d="m31.52,2.02c-.34.31,4.05,4.97,4.5,11.33.46,6.46-5.95,9.98-15.32,19-9.54,9.18-9.98,10.45-14.01,17.17-2.05,3.42-4.96,8.42-4.67,15.17.31,7.07,3.96,11.98,5.83,14.5,5.99,8.07,14.53,11.79,15,11.17.42-.56-4.79-3.78-7.65-11.17-4.2-10.82,3.07-21.76,4.04-23.17,4.04-5.88,8.57-10.24,9.45-9.5.68.58-2.19,3.41-2.83,8.5-.68,5.32,1.22,12.05,5,13.33,2.64.9,3.79-1.68,8.5-2.17,4.55-.47,10.46,1.22,12.83,5,3.59,5.73-6.73,17.99-4.83,19.23,1.93,1.27,14.39-10,19.33-19.4,2.62-4.98,6.94-13.2,4.17-21.17-2.13-6.14-6.61-6.8-7.67-13.33-1.04-6.42,2.45-10.91,1.17-11.67-1.41-.83-7.37,3.52-9.17,9.83-1.74,6.12,1.75,9.51-.83,13-2.04,2.76-6.43,3.67-10,2.67-2.94-.83-6.33-3.24-6.83-6.5-.47-3.05,1.96-4.5,5.5-11.17,2-3.76,3.26-6.15,3.67-8.5,1.86-10.9-14.59-22.7-15.17-22.17Z"/>
<path class="cls-1" d="m47.74,92.51c-.67,0-1.16-.21-1.48-.42-2.23-1.46-.85-4.16,1.05-7.9,1.91-3.73,4.79-9.38,3.18-11.95-1.92-3.05-7.06-4.47-10.94-4.07-1.89.19-3.06.77-4.18,1.33-1.41.69-3,1.48-5.17.75-4.92-1.67-7.12-9.34-6.34-15.48.09-.72.22-1.4.38-2.04-1.05,1.25-2.2,2.73-3.36,4.42-1.29,1.88-7.54,11.74-3.82,21.31,1.8,4.64,4.63,7.53,6.15,9.09,1.07,1.09,2.4,2.45,1.23,4-.24.32-.8.87-1.82.87h0c-2.23,0-10.48-4.11-16.38-12.04-1.91-2.57-5.89-7.93-6.23-15.61-.33-7.48,2.98-12.99,4.95-16.28l.81-1.35c3.35-5.62,4.48-7.52,13.53-16.23,2.28-2.2,4.39-4.07,6.25-5.72,6.06-5.39,8.73-7.93,8.46-11.69-.29-4.09-2.5-7.54-3.56-9.19-.69-1.07-1.63-2.54-.29-3.76h0c1.15-1.05,2.54-.29,2.99-.05,3.95,2.16,17.34,13.19,15.49,24.02-.46,2.67-1.82,5.23-3.87,9.1-1.36,2.56-2.54,4.34-3.49,5.78-1.5,2.27-1.97,3.04-1.8,4.14.35,2.28,3.04,4.22,5.4,4.88,2.99.84,6.43,0,7.85-1.93.8-1.08.67-2.13.33-4.22-.34-2.12-.77-4.75.19-8.13,1.64-5.79,6.23-9.93,8.97-11.03,1.23-.49,2.28-.49,3.14.02,1.89,1.12,1.25,3.21.69,5.06-.6,1.99-1.43,4.72-.9,8.01.48,3,1.76,4.45,3.37,6.29,1.46,1.66,3.11,3.54,4.21,6.7,3.05,8.79-1.54,17.53-4.28,22.75-4.5,8.56-15.46,19.32-19.79,20.44-.34.09-.65.12-.93.12Zm-6.85-28.41c4.83,0,10.43,1.93,12.99,6.01,2.82,4.49-.55,11.08-3.01,15.89-.13.25-.26.52-.4.79,4.1-3.19,11.05-10.26,14.44-16.72,2.44-4.65,6.53-12.43,4.05-19.58-.84-2.42-2.1-3.86-3.44-5.38-1.71-1.95-3.65-4.16-4.32-8.29-.59-3.66.11-6.69.75-8.88-1.71,1.42-3.92,4-4.85,7.28-.72,2.52-.4,4.5-.09,6.4.38,2.34.77,4.76-1.06,7.24-2.74,3.71-8.19,4.52-12.15,3.4-3.53-.99-7.63-3.96-8.27-8.12-.41-2.68.78-4.47,2.42-6.96.9-1.36,2.02-3.06,3.29-5.45,1.94-3.65,3.11-5.86,3.46-7.9.91-5.36-3.52-11.18-7.6-15.15.45,1.37.79,2.89.9,4.51.42,5.89-3.65,9.5-9.8,14.97-1.83,1.63-3.91,3.47-6.13,5.62-8.67,8.34-9.64,9.98-12.87,15.4l-.81,1.36c-1.85,3.09-4.66,7.77-4.38,14.05.28,6.45,3.64,10.97,5.44,13.39,1.88,2.52,3.97,4.56,5.94,6.14-.74-1.23-1.45-2.64-2.07-4.22-4.44-11.45,2.77-22.85,4.26-25.02.28-.41,6.86-9.94,10.48-10.43.71-.09,1.39.09,1.91.53,1.5,1.27.59,3.03-.08,4.31-.69,1.33-1.73,3.33-2.06,5.97-.61,4.81,1.2,10.35,3.66,11.19.54.19.86.07,2.11-.54,1.24-.61,2.93-1.45,5.54-1.72.56-.06,1.15-.09,1.74-.09Z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_2" data-name="Ebene 2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 83.59 73.05">
<defs>
<style>
.cls-1 {
fill: none;
stroke: #c40007;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 4px;
}
.cls-2 {
fill: url(#Unbenannter_Verlauf_41);
stroke-width: 0px;
}
</style>
<linearGradient id="Unbenannter_Verlauf_41" data-name="Unbenannter Verlauf 41" x1="41.8" y1="2" x2="41.8" y2="71.05" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#fff"/>
<stop offset="1" stop-color="#ecedf0"/>
</linearGradient>
</defs>
<g id="Layer_1" data-name="Layer 1">
<g id="heart">
<g>
<path class="cls-2" d="m41.8,71.05c14.96-14.08,38.34-25.92,39.79-49.33-4.09-27.63-30.48-22.93-39.79-6h0C32.48-1.22,6.09-5.92,2,21.72c1.45,23.4,24.84,35.25,39.8,49.33"/>
<path class="cls-1" d="m41.8,71.05c14.96-14.08,38.34-25.92,39.79-49.33-4.09-27.63-30.48-22.93-39.79-6h0C32.48-1.22,6.09-5.92,2,21.72c1.45,23.4,24.84,35.25,39.8,49.33"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_2" data-name="Ebene 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 83.37 83.37">
<defs>
<style>
.cls-1 {
fill: #196db5;
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-1, .cls-2 {
stroke: #196db5;
stroke-width: 4px;
}
.cls-2 {
fill: #ecedf0;
stroke-miterlimit: 10;
}
</style>
</defs>
<g id="Layer_1" data-name="Layer 1">
<g id="radioactive">
<circle class="cls-2" cx="41.69" cy="41.69" r="39.69"/>
<path class="cls-1" d="m37.09,32.64l-6.37-14.01h0c-1.8.93-3.47,2.08-4.98,3.4-5.36,4.68-8.75,11.56-8.75,19.23,0,0,14.54,0,14.54,0,0-2.4.89-4.59,2.37-6.26.88-.99,1.96-1.8,3.18-2.36"/>
<path class="cls-1" d="m46.95,50.36l8.55,12.8h0c-1.74,1.04-3.6,1.85-5.52,2.44-6.8,2.09-14.43,1.34-20.95-2.71,0,0,7.67-12.35,7.67-12.35,2.04,1.27,4.37,1.66,6.57,1.29,1.31-.22,2.57-.72,3.68-1.46"/>
<path class="cls-1" d="m46.28,32.64l6.37-14.01h0c1.8.93,3.47,2.08,4.98,3.4,5.36,4.68,8.75,11.56,8.75,19.23,0,0-14.54,0-14.54,0,0-2.4-.89-4.59-2.37-6.26-.88-.99-1.96-1.8-3.18-2.36"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_2" data-name="Ebene 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 86.66 83.37">
<defs>
<style>
.cls-1 {
fill: #ecedf0;
stroke: #196db5;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 4px;
}
</style>
</defs>
<g id="Layer_1" data-name="Layer 1">
<g id="star">
<polygon class="cls-1" points="43.33 61.61 17.13 81.37 26.28 48.78 2 28.28 30.83 28.28 43.33 2 55.82 28.28 84.66 28.28 60.38 48.78 69.52 81.37 43.33 61.61"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 587 B

View file

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_2" data-name="Ebene 2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 92.62 89.11">
<defs>
<style>
.cls-1 {
fill: url(#Unbenannter_Verlauf_13-7);
}
.cls-1, .cls-2, .cls-3, .cls-4, .cls-5, .cls-6, .cls-7, .cls-8 {
stroke: #605a4f;
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-1, .cls-4 {
stroke-width: 3px;
}
.cls-2 {
fill: url(#Unbenannter_Verlauf_13-4);
}
.cls-2, .cls-3, .cls-5, .cls-6, .cls-8 {
stroke-width: 2px;
}
.cls-3 {
fill: url(#Unbenannter_Verlauf_13-6);
}
.cls-4 {
fill: url(#Unbenannter_Verlauf_13-8);
}
.cls-5 {
fill: url(#Unbenannter_Verlauf_13-3);
}
.cls-6 {
fill: url(#Unbenannter_Verlauf_13-2);
}
.cls-7 {
fill: url(#Unbenannter_Verlauf_13);
stroke-width: 4px;
}
.cls-8 {
fill: url(#Unbenannter_Verlauf_13-5);
}
</style>
<linearGradient id="Unbenannter_Verlauf_13" data-name="Unbenannter Verlauf 13" x1="46.31" y1="22.65" x2="46.31" y2="76.67" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#ffb607"/>
<stop offset="1" stop-color="#fdda99"/>
</linearGradient>
<linearGradient id="Unbenannter_Verlauf_13-2" data-name="Unbenannter Verlauf 13" x1="46.48" y1="1" x2="46.48" y2="15.17" gradientTransform="translate(38.05 54.23) scale(1 -1)" xlink:href="#Unbenannter_Verlauf_13"/>
<linearGradient id="Unbenannter_Verlauf_13-3" data-name="Unbenannter Verlauf 13" x1="46.48" y1="1" x2="46.48" y2="15.17" xlink:href="#Unbenannter_Verlauf_13"/>
<linearGradient id="Unbenannter_Verlauf_13-4" data-name="Unbenannter Verlauf 13" x1="46.48" y1="1" x2="46.48" y2="15.17" gradientTransform="translate(-38.4 54.57) scale(1 -1)" xlink:href="#Unbenannter_Verlauf_13"/>
<linearGradient id="Unbenannter_Verlauf_13-5" data-name="Unbenannter Verlauf 13" x1="46.48" y1="1" x2="46.48" y2="15.17" gradientTransform="translate(-27.58 11.58)" xlink:href="#Unbenannter_Verlauf_13"/>
<linearGradient id="Unbenannter_Verlauf_13-6" data-name="Unbenannter Verlauf 13" x1="46.48" y1="1" x2="46.48" y2="15.17" gradientTransform="translate(27.24 27.76) scale(1 -1)" xlink:href="#Unbenannter_Verlauf_13"/>
<linearGradient id="Unbenannter_Verlauf_13-7" data-name="Unbenannter Verlauf 13" x1="52.5" y1="76.15" x2="40.76" y2="87.45" xlink:href="#Unbenannter_Verlauf_13"/>
<linearGradient id="Unbenannter_Verlauf_13-8" data-name="Unbenannter Verlauf 13" x1="51.08" y1="82.31" x2="41.55" y2="91.49" xlink:href="#Unbenannter_Verlauf_13"/>
</defs>
<g id="Layer_1" data-name="Layer 1">
<g id="thinking">
<path class="cls-7" d="m30.32,64.76c6.94,5.25,5.92,11.91,5.92,11.91h10.07s10.07,0,10.07,0c0,0-1.02-6.66,5.92-11.91l-.73.63c1.86-1.53,3.49-3.33,4.83-5.34,2.53-3.81,4-8.39,4-13.3,0-13.31-10.79-24.09-24.09-24.09-13.31,0-24.09,10.79-24.09,24.09,0,4.92,1.47,9.49,4,13.3,1.34,2.01,2.97,3.82,4.83,5.34"/>
<rect class="cls-6" x="81.7" y="39.05" width="5.67" height="14.17" transform="translate(38.4 130.68) rotate(-90)"/>
<rect class="cls-5" x="43.65" y="1" width="5.67" height="14.17"/>
<rect class="cls-2" x="5.25" y="39.4" width="5.67" height="14.17" transform="translate(54.57 38.4) rotate(90)"/>
<rect class="cls-8" x="16.07" y="12.58" width="5.67" height="14.17" transform="translate(-8.38 19.64) rotate(-46.07)"/>
<rect class="cls-3" x="70.89" y="12.58" width="5.67" height="14.17" transform="translate(110.7 86.41) rotate(-133.93)"/>
<rect class="cls-1" x="36" y="81.09" width="21.26" height="1.42"/>
<rect class="cls-4" x="37.81" y="86.19" width="17.01" height="1.42"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_2" data-name="Ebene 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 79.24 80.84">
<defs>
<style>
.cls-1, .cls-2 {
stroke: #196db5;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 4px;
}
.cls-1, .cls-3 {
fill: #196db5;
}
.cls-2 {
fill: #ecedf0;
}
.cls-3 {
stroke-width: 0px;
}
</style>
</defs>
<g id="Layer_1" data-name="Layer 1">
<g id="alert">
<polygon class="cls-2" points="39.62 78.84 77.24 78.84 39.62 2 2 78.84 39.62 78.84"/>
<rect class="cls-1" x="37.32" y="31.89" width="4.25" height="24.09"/>
<circle class="cls-3" cx="39.45" cy="66.48" r="4.96"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 791 B

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_2" data-name="Ebene 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 83.37 83.37">
<defs>
<style>
.cls-1 {
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-1, .cls-2 {
stroke: #196db5;
stroke-width: 4px;
}
.cls-1, .cls-3 {
fill: #196db5;
}
.cls-2 {
fill: #ecedf0;
stroke-miterlimit: 10;
}
.cls-3 {
stroke-width: 0px;
}
</style>
</defs>
<g id="Layer_1" data-name="Layer 1">
<g id="info">
<circle class="cls-2" cx="41.69" cy="41.69" r="39.69"/>
<rect class="cls-1" x="39.56" y="39.81" width="4.25" height="24.09"/>
<circle class="cls-3" cx="41.69" cy="23.69" r="4.96"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 815 B

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_2" data-name="Ebene 2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 89.46 92.29">
<defs>
<style>
.cls-1 {
fill: #fff;
}
.cls-1, .cls-2, .cls-3 {
stroke: #000;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 3px;
}
.cls-2 {
fill: none;
}
.cls-3 {
fill: url(#Unbenannter_Verlauf_24);
}
</style>
<linearGradient id="Unbenannter_Verlauf_24" data-name="Unbenannter Verlauf 24" x1="13.66" y1="15.07" x2="75.8" y2="77.22" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#9af17d"/>
<stop offset="1" stop-color="#559435"/>
</linearGradient>
</defs>
<g id="Layer_1" data-name="Layer 1">
<g id="mrgreen">
<ellipse class="cls-3" cx="44.73" cy="46.15" rx="43.23" ry="44.65"/>
<path class="cls-2" d="m19.52,30.72s5.5-9.42,10.5-9.42,11.69,9.42,11.69,9.42"/>
<path class="cls-2" d="m69.64,30.72s-5.5-9.42-10.5-9.42-11.69,9.42-11.69,9.42"/>
<path class="cls-1" d="m11.52,41.47h68.33s-5.36,19.13-8.33,24.83-11,18.17-25.83,18.17-22.62-11.76-25.33-16.5c-3.67-6.42-8.83-26.5-8.83-26.5"/>
<line class="cls-2" x1="56.97" y1="81.63" x2="56.97" y2="41.47"/>
<line class="cls-2" x1="32.18" y1="80.24" x2="32.18" y2="41.97"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_2" data-name="Ebene 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 83.37 83.37">
<defs>
<style>
.cls-1 {
fill: #ecedf0;
stroke-miterlimit: 10;
stroke-width: 4px;
}
.cls-1, .cls-2 {
stroke: #196db5;
}
.cls-3 {
fill: #196db5;
stroke-width: 0px;
}
.cls-2 {
fill: none;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 8px;
}
</style>
</defs>
<g id="Layer_1" data-name="Layer 1">
<g id="question">
<circle class="cls-1" cx="41.69" cy="41.69" r="39.69"/>
<path class="cls-2" d="m26.85,28.87c1.72-6.67,7.87-11.2,14.5-10.83,6.9.38,12.73,5.97,13.17,12.5.31,4.65-2.16,9.14-5.83,11.67-2.85,1.96-5.77,2.28-7.17,2.33v6.17"/>
<circle class="cls-3" cx="41.69" cy="63.17" r="4.96"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 927 B

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_2" data-name="Ebene 2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 88.04 87.12">
<defs>
<style>
.cls-1, .cls-2 {
stroke-width: 0px;
}
.cls-3, .cls-4 {
fill: none;
}
.cls-3, .cls-4, .cls-5 {
stroke: #000;
stroke-width: 3px;
}
.cls-3, .cls-5 {
stroke-miterlimit: 10;
}
.cls-2 {
fill: #fff;
}
.cls-4 {
stroke-linecap: round;
stroke-linejoin: round;
}
</style>
<!-- Define the linear (start) gradient -->
<linearGradient id="linearGradient" x1="1.5" y1="43.56" x2="86.54" y2="43.56" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#ffa49f" id="linearStart" />
<stop offset="1" stop-color="#fd5756" id="linearEnd" />
</linearGradient>
<!-- Define the radial gradient -->
<radialGradient id="radialGradient" cx="44.02" cy="43.56" fx="44.02" fy="43.56" r="42.29" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#fdf504" id="radialStart" />
<stop offset="0.71" stop-color="#f8c00c" />
<stop offset="1" stop-color="#f8bd0c" id="radialEnd" />
</radialGradient>
</defs>
<g id="Layer_1" data-name="Layer 1">
<g id="redface">
<!-- <ellipse class="cls-5" cx="44.02" cy="43.56" rx="42.52" ry="42.06"/> -->
<!-- Ellipse with linear gradient -->
<ellipse class="cls-5" cx="44.02" cy="43.56" rx="42.52" ry="42.06" fill="url(#linearGradient)" opacity="1"/>
<!-- Ellipse with radial gradient, positioned exactly over the first -->
<ellipse class="cls-5" cx="44.02" cy="43.56" rx="42.52" ry="42.06" fill="url(#radialGradient)" opacity="0">
<animate attributeName="opacity" values="0;1;1;0" keyTimes="0;0.3;0.7;1" dur="2s" repeatCount="indefinite" />
</ellipse>
<path class="cls-2" d="m44.02,43.13h18.85c1.56,0,2.82-1.26,2.82-2.82v-8.65s-.37-3.6-2.08-6.08q-3.25-4.71-6.41-5.94c-2.5-.97-13.17-.98-13.17-.98,0,0-10.68.01-13.17.98q-3.17,1.23-6.41,5.94c-1.47,2.13-1.95,5.1-2.06,5.89-.02.13-.02.24-.02.37v8.48c0,1.56,1.26,2.82,2.82,2.82h18.85Z"/>
<ellipse class="cls-1" cx="38.06" cy="34.43" rx="4.96" ry="6.57"/>
<ellipse class="cls-1" cx="49.98" cy="34.43" rx="4.96" ry="6.57"/>
<path class="cls-4" d="m20.35,27.15s3.16-7.94,9.17-9.33"/>
<path class="cls-4" d="m67.69,27.15s-3.16-7.94-9.17-9.33"/>
<path class="cls-3" d="m56.52,68.49c7.91,0,13.33.12,13.33-12.09"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><polyline points="18.24 34.01 24.21 28.32 11.25 28.32 11.25 19.79 24.21 19.79 18.24 14.13 25.42 14.13 35.53 24.09 25.46 34.01 18.24 34.01"/></svg>

After

Width:  |  Height:  |  Size: 927 B

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#fff;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path d="M11.31,32.91c6.18,5.18,13.72,5.21,19.9,0-4.08,7.87-15.8,7.84-19.9,0Z"/><path d="M5,18.65c0,11,16,12.71,14.28,0Z"/><path class="cls-2" d="M19.05,22.9a1.64,1.64,0,1,1-1.64-1.64A1.64,1.64,0,0,1,19.05,22.9Z"/><path d="M23.1,18.65c0,11,16,12.71,14.28,0Z"/><path class="cls-2" d="M37.14,22.9a1.64,1.64,0,1,1-1.64-1.64A1.63,1.63,0,0,1,37.14,22.9Z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#fff;}.cls-3{fill:#5c92bd;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path d="M10.67,39.31c4.1-7.85,15.82-7.87,19.89,0-6.18-5.22-13.72-5.19-19.89,0Z"/><path class="cls-2" d="M19.23,27.71V24.06c0-4-2.95-7.28-6.58-7.28h0C9,16.78,6.07,20,6.07,24.06v3.65"/><path d="M20,27.71h-1.5V24.06c0-3.6-2.62-6.53-5.83-6.53s-5.83,2.93-5.83,6.53v3.65H5.32V24.06c0-4.43,3.29-8,7.33-8s7.33,3.6,7.33,8Z"/><rect x="11.15" y="22.24" width="3" height="4.22"/><rect class="cls-3" x="5.54" y="26.22" width="13.38" height="1.5"/><path d="M20,27.71h-1.5V24.06c0-3.6-2.62-6.53-5.83-6.53s-5.83,2.93-5.83,6.53v3.65H5.32V24.06c0-4.43,3.29-8,7.33-8s7.33,3.6,7.33,8Z"/><path class="cls-2" d="M37,27.71V24.06c0-4-2.94-7.28-6.58-7.28h0c-3.63,0-6.58,3.26-6.58,7.28v3.65"/><path d="M37.73,27.71h-1.5V24.06c0-3.6-2.61-6.53-5.83-6.53s-5.83,2.93-5.83,6.53v3.65h-1.5V24.06c0-4.43,3.29-8,7.33-8s7.33,3.6,7.33,8Z"/><rect x="28.9" y="22.24" width="3" height="4.22"/><rect class="cls-3" x="23.29" y="26.22" width="13.38" height="1.5"/><path d="M37.73,27.71h-1.5V24.06c0-3.6-2.61-6.53-5.83-6.53s-5.83,2.93-5.83,6.53v3.65h-1.5V24.06c0-4.43,3.29-8,7.33-8s7.33,3.6,7.33,8Z"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#fff;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path d="M5.41,19.89c.39-7.56,12.59-6.59,13.91,0l-.19.06c-1.79-4-7-4.72-10.4-2.54A9.54,9.54,0,0,0,5.6,20l-.19-.06Z"/><path d="M36.92,20c-3.43-4.29-10.75-5.62-13.53,0l-.19-.06c1.08-4.77,7.71-6.86,11.65-4.17a5.14,5.14,0,0,1,2.26,4.17l-.19.06Z"/><path class="cls-2" d="M5.5,27.21c4.2,20.91,27.76,20.68,31.52,0Z"/><path d="M21.38,43.56c-6.19,0-14.21-4.23-16.61-16.2l-.19-.9H37.92l-.16.89C36,37.12,29.6,43.48,21.5,43.56ZM6.43,28c2.43,10.39,9.48,14.1,15,14.1h.11C26.91,42,33.89,38.27,36.11,28Z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#fff;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><circle class="cls-2" cx="10.64" cy="19.69" r="7.35"/><path d="M10.64,27.79a8.1,8.1,0,1,1,8.1-8.1A8.1,8.1,0,0,1,10.64,27.79Zm0-14.7a6.6,6.6,0,1,0,6.6,6.6A6.61,6.61,0,0,0,10.64,13.09Z"/><path d="M18.26,21.52a2.6,2.6,0,1,1-2.6-2.6A2.6,2.6,0,0,1,18.26,21.52Z"/><circle class="cls-2" cx="31.61" cy="19.69" r="7.35"/><path d="M31.61,27.79a8.1,8.1,0,1,1,8.1-8.1A8.1,8.1,0,0,1,31.61,27.79Zm0-14.7a6.6,6.6,0,1,0,6.6,6.6A6.61,6.61,0,0,0,31.61,13.09Z"/><path d="M39.23,21.52a2.6,2.6,0,1,1-2.6-2.6A2.6,2.6,0,0,1,39.23,21.52Z"/><path d="M27.41,40.2a11.18,11.18,0,0,1-5.28-2c-2.56-1.52-4.08-2-5.23-1.6S15,38.12,14.11,40.1l-1.38-.58c1-2.44,2.21-3.81,3.7-4.3,1.88-.62,3.95.25,6.46,1.74,1.84,1.09,3.91,2.13,5.4,1.59a4,4,0,0,0,2.1-2.71l1.42.49c-.68,2-1.66,3.14-3,3.63A4.16,4.16,0,0,1,27.41,40.2Z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48.19 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#cee657;}</style><linearGradient id="linear-gradient" x1="11.67" y1="4.55" x2="37.43" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M44.33,21.09c0,12.88-9.06,26.32-20.24,26.32S3.85,34,3.85,21.09,12.92.78,24.09.78,44.33,8.22,44.33,21.09Z"/><path d="M24.09,48.16c-12,0-21-14.29-21-27.07C3.1,8.69,11.74,0,24.09,0s21,8.66,21,21.06C45.08,33.87,36.11,48.16,24.09,48.16Zm0-46.63C12.44,1.53,4.6,9.39,4.6,21.09c0,12.07,8.34,25.57,19.49,25.57s19.49-13.5,19.49-25.57C43.58,9.39,35.75,1.53,24.09,1.53Z"/><rect class="cls-2" x="0.85" y="15.53" width="23.24" height="14.28" rx="2.64"/><path d="M21.1,30.66H3.84A3.85,3.85,0,0,1,0,26.81V18.52a3.84,3.84,0,0,1,3.84-3.84H21.1a3.84,3.84,0,0,1,3.84,3.84v8.29A3.85,3.85,0,0,1,21.1,30.66ZM3.84,16.38A2.14,2.14,0,0,0,1.7,18.52v8.29A2.15,2.15,0,0,0,3.84,29H21.1a2.16,2.16,0,0,0,2.15-2.15V18.52a2.15,2.15,0,0,0-2.15-2.14Z"/><rect class="cls-2" x="24.09" y="15.53" width="23.24" height="14.28" rx="2.64"/><path d="M44.34,30.66H27.09a3.85,3.85,0,0,1-3.84-3.85V18.52a3.84,3.84,0,0,1,3.84-3.84H44.34a3.85,3.85,0,0,1,3.85,3.84v8.29A3.86,3.86,0,0,1,44.34,30.66ZM27.09,16.38a2.15,2.15,0,0,0-2.15,2.14v8.29A2.16,2.16,0,0,0,27.09,29H44.34a2.15,2.15,0,0,0,2.15-2.15V18.52a2.14,2.14,0,0,0-2.15-2.14Z"/><path d="M18.17,22.67a3,3,0,1,1-3-3A3,3,0,0,1,18.17,22.67Z"/><path d="M36,22.67a3,3,0,1,1-3-3A3,3,0,0,1,36,22.67Z"/><path d="M19.07,36.71c1.54-.1,3.33,0,4.83,0s3.28-.1,4.84,0a6.85,6.85,0,0,1-9.67,0Z"/></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#fff;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path d="M10.67,39.31c4.1-7.85,15.82-7.87,19.89,0-6.18-5.22-13.72-5.19-19.89,0Z"/><path class="cls-2" d="M19.23,27.71V24.06c0-4-2.95-7.28-6.58-7.28h0C9,16.78,6.07,20,6.07,24.06v3.65"/><path d="M20,27.71h-1.5V24.06c0-3.6-2.62-6.53-5.83-6.53s-5.83,2.93-5.83,6.53v3.65H5.32V24.06c0-4.43,3.29-8,7.33-8s7.33,3.6,7.33,8Z"/><rect x="11.15" y="22.24" width="3" height="5.47"/><path class="cls-2" d="M37,27.71V24.06c0-4-2.94-7.28-6.58-7.28h0c-3.63,0-6.58,3.26-6.58,7.28v3.65"/><path d="M37.73,27.71h-1.5V24.06c0-3.6-2.61-6.53-5.83-6.53s-5.83,2.93-5.83,6.53v3.65h-1.5V24.06c0-4.43,3.29-8,7.33-8s7.33,3.6,7.33,8Z"/><rect x="28.9" y="22.24" width="3" height="5.47"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#fff;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path d="M16,20.87a3.45,3.45,0,1,1-3.45-3.44A3.45,3.45,0,0,1,16,20.87Z"/><path d="M33.46,20.87A3.45,3.45,0,1,1,30,17.43,3.45,3.45,0,0,1,33.46,20.87Z"/><path class="cls-2" d="M8.18,32.28c5.56,12.36,21,12.43,26.16,0A237.8,237.8,0,0,1,8.18,32.28Z"/><path d="M21.43,42.32c-5.9,0-11.22-3.71-13.94-9.73L7,31.46l1.23.07a236.35,236.35,0,0,0,26.08,0l1.19-.07L35,32.57c-2.5,6-7.51,9.67-13.4,9.75Zm-12-9.23C12,38,16.63,40.92,21.61,40.82s9.15-2.93,11.54-7.73A234.78,234.78,0,0,1,9.42,33.09Z"/><path d="M7.22,16.43C7.9,12.93,11.85,10,15.47,11a1,1,0,0,1,.74,1.22c-.43,1.32-2.24.56-3.23.75a7.2,7.2,0,0,0-5.76,3.51Z"/><path d="M35.3,16.43a7.2,7.2,0,0,0-5.76-3.51c-1-.18-3.13.61-3.26-1a1,1,0,0,1,.77-1c3.62-.95,7.57,2,8.25,5.48Z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#fff;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path class="cls-2" d="M19.23,21.05V17.39c0-4-2.95-7.27-6.58-7.27h0c-3.64,0-6.58,3.25-6.58,7.27v3.66"/><path d="M20,21.05h-1.5V17.39c0-3.6-2.62-6.52-5.83-6.52s-5.83,2.92-5.83,6.52v3.66H5.32V17.39c0-4.42,3.29-8,7.33-8S20,13,20,17.39Z"/><rect x="11.15" y="15.58" width="3" height="5.47"/><path class="cls-2" d="M37,21.05V17.39c0-4-2.94-7.27-6.58-7.27h0c-3.63,0-6.58,3.25-6.58,7.27v3.66"/><path d="M37.73,21.05h-1.5V17.39c0-3.6-2.61-6.52-5.83-6.52s-5.83,2.92-5.83,6.52v3.66h-1.5V17.39c0-4.42,3.29-8,7.33-8s7.33,3.6,7.33,8Z"/><rect x="28.9" y="15.58" width="3" height="5.47"/><rect x="17.65" y="27.95" width="8.25" height="11.79"/><rect class="cls-2" x="17.65" y="27.95" width="8.25" height="1.44"/><rect x="17.65" y="27.46" width="8.25" height="0.49"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48.19 51.02"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:url(#linear-gradient-2);}.cls-3{fill:url(#linear-gradient-3);}.cls-4{fill:#3a3a3a;}</style><linearGradient id="linear-gradient" x1="11.67" y1="4.51" x2="37.43" y2="41.3" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient><linearGradient id="linear-gradient-2" x1="3.62" y1="28.36" x2="19.48" y2="12.5" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a1d78d"/><stop offset="0.18" stop-color="#a3da90"/><stop offset="0.31" stop-color="#abe399"/><stop offset="0.43" stop-color="#b7f2a9"/><stop offset="0.49" stop-color="#c1ffb6"/><stop offset="0.5" stop-color="#befbb2"/><stop offset="0.56" stop-color="#b1eba1"/><stop offset="0.63" stop-color="#a8df96"/><stop offset="0.73" stop-color="#a2d98f"/><stop offset="1" stop-color="#a1d78d"/></linearGradient><linearGradient id="linear-gradient-3" x1="27.79" y1="29.28" x2="45.49" y2="11.57" xlink:href="#linear-gradient-2"/></defs><path class="cls-1" d="M44.33,21.06c0,12.88-9.06,26.31-20.24,26.31S3.85,33.94,3.85,21.06,12.92.75,24.09.75,44.33,8.19,44.33,21.06Z"/><path d="M24.09,48.12c-12,0-21-14.28-21-27.06C3.1,8.66,11.74,0,24.09,0s21,8.66,21,21.06C45.08,33.84,36.11,48.12,24.09,48.12Zm0-46.62C12.44,1.5,4.6,9.36,4.6,21.06c0,12.07,8.34,25.56,19.49,25.56S43.58,33.13,43.58,21.06C43.58,9.36,35.75,1.5,24.09,1.5Z"/><path class="cls-2" d="M.85,13.42H17.79a6.3,6.3,0,0,1,6.3,6.3V23a6.3,6.3,0,0,1-6.3,6.3H7.15A6.3,6.3,0,0,1,.85,23V13.42A0,0,0,0,1,.85,13.42Z"/><path d="M17,30.13H8a8,8,0,0,1-8-8V12.57H17a8,8,0,0,1,8,8v1.57A8,8,0,0,1,17,30.13ZM1.7,14.27v7.87A6.29,6.29,0,0,0,8,28.43h9a6.29,6.29,0,0,0,6.29-6.29V20.57A6.3,6.3,0,0,0,17,14.27Z"/><path class="cls-3" d="M30.4,13.42H47.34a0,0,0,0,1,0,0V23a6.3,6.3,0,0,1-6.3,6.3H30.4a6.3,6.3,0,0,1-6.3-6.3V19.72A6.3,6.3,0,0,1,30.4,13.42Z"/><path d="M40.19,30.13H31.24a8,8,0,0,1-8-8V20.57a8,8,0,0,1,8-8h17v9.57A8,8,0,0,1,40.19,30.13ZM31.24,14.27a6.31,6.31,0,0,0-6.3,6.3v1.57a6.3,6.3,0,0,0,6.3,6.29h9a6.3,6.3,0,0,0,6.3-6.29V14.27Z"/><rect x="10.65" y="20.19" width="7.05" height="2.68" rx="1.18"/><rect x="30.48" y="20.19" width="7.05" height="2.68" rx="1.18"/><path d="M27.28,35.8H20.91a1.54,1.54,0,0,1-1.55-1.55h0a1.54,1.54,0,0,1,1.55-1.55h6.37a1.54,1.54,0,0,1,1.55,1.55h0A1.54,1.54,0,0,1,27.28,35.8Z"/><path class="cls-4" d="M28.36,42a1.76,1.76,0,0,0-1.75-1.57h-5A1.75,1.75,0,0,0,19.83,42l-.16,1.46L22,49.9A1.67,1.67,0,0,0,23.57,51h1.05a1.67,1.67,0,0,0,1.59-1.12l2.31-6.44Z"/></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path d="M16.86,22.47a3.79,3.79,0,1,1-3.78-3.79A3.78,3.78,0,0,1,16.86,22.47Z"/><path d="M27.49,18.68h3.4A2.34,2.34,0,0,1,33.23,21v.45a0,0,0,0,1,0,0H25.15a0,0,0,0,1,0,0V21A2.34,2.34,0,0,1,27.49,18.68Z"/><path d="M18.12,37.69c4.83.79,9.75-.6,12.53-4.83-.82,5.61-8.13,8-12.53,4.83Z"/><path d="M7.65,15.4c.69-3.5,4.64-6.43,8.26-5.47a1,1,0,0,1,.73,1.22c-.42,1.31-2.23.55-3.23.75C11,11.88,9,13.46,7.65,15.4Z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#fff;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><circle class="cls-2" cx="9.96" cy="20.75" r="8.4" transform="translate(-12.49 25.85) rotate(-77.17)"/><path d="M10,29.9a9.15,9.15,0,1,1,9.14-9.15A9.15,9.15,0,0,1,10,29.9Zm0-16.79a7.65,7.65,0,1,0,7.64,7.64A7.65,7.65,0,0,0,10,13.11Z"/><path d="M12,20.75A2.08,2.08,0,1,1,10,18.67,2.08,2.08,0,0,1,12,20.75Z"/><circle class="cls-2" cx="32.56" cy="20.75" r="8.4" transform="translate(-5.42 13.8) rotate(-22.14)"/><path d="M32.56,29.9a9.15,9.15,0,1,1,9.15-9.15A9.15,9.15,0,0,1,32.56,29.9Zm0-16.79a7.65,7.65,0,1,0,7.65,7.64A7.65,7.65,0,0,0,32.56,13.11Z"/><circle cx="32.56" cy="20.75" r="2.08"/><rect x="16.52" y="36.47" width="9.47" height="2.77" rx="1.08"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:red;}.cls-2{fill:url(#linear-gradient);}</style><linearGradient id="linear-gradient" x1="9.23" y1="5.16" x2="34.18" y2="40.8" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M33,7.55A15.59,15.59,0,0,0,39.82,2c1.44,4.57.89,9.26-.73,14C37.52,12.39,35.59,9.4,33,7.55Z"/><path d="M39.17,18.06l-.77-1.77c-1.69-3.88-3.61-6.54-5.87-8.13l-1.09-.77,1.23-.53A15.05,15.05,0,0,0,39.2,1.55L40.07.28l.46,1.46c1.36,4.31,1.12,9-.73,14.49ZM34.38,7.71A19.8,19.8,0,0,1,39,13.92a21.12,21.12,0,0,0,.54-10.28A16.29,16.29,0,0,1,34.38,7.71Z"/><path class="cls-1" d="M9.56,7.55A15.59,15.59,0,0,1,2.7,2c-1.44,4.57-.89,9.26.73,14C5,12.39,6.93,9.4,9.56,7.55Z"/><path d="M3.34,18.06l-.62-1.83C.87,10.79.63,6.05,2,1.74L2.45.28l.87,1.27A15.05,15.05,0,0,0,9.85,6.86l1.23.53L10,8.16c-2.26,1.59-4.18,4.25-5.87,8.13ZM3,3.64a21,21,0,0,0,.54,10.28A19.8,19.8,0,0,1,8.14,7.71,16.29,16.29,0,0,1,3,3.64Z"/><path class="cls-2" d="M40.87,21.19c0,12.47-8.78,25.49-19.61,25.49S1.65,33.66,1.65,21.19,10.43,1.51,21.26,1.51,40.87,8.71,40.87,21.19Z"/><path d="M21.26,47.41C9.62,47.41.92,33.56.92,21.19.92,9.17,9.29.78,21.26.78S41.6,9.17,41.6,21.19C41.6,33.56,32.9,47.41,21.26,47.41Zm0-45.17C10,2.24,2.38,9.85,2.38,21.19,2.38,32.88,10.45,46,21.26,46S40.14,32.88,40.14,21.19C40.14,9.85,32.55,2.24,21.26,2.24Z"/><path d="M9.47,38.08c4.86-9.3,18.75-9.33,23.58,0-7.32-6.19-16.26-6.15-23.58,0Z"/><path class="cls-1" d="M32.85,26.88a4.77,4.77,0,1,1,1.07-6.67A4.77,4.77,0,0,1,32.85,26.88Z"/><path d="M32.85,26.87a4.78,4.78,0,0,1-6.67-1.06,4.93,4.93,0,0,1-.64-1.25,4.17,4.17,0,0,0,.46.82,3.93,3.93,0,1,0,.88-5.48,3.76,3.76,0,0,0-1.5,2.23,4.69,4.69,0,0,1,1.87-3,4.77,4.77,0,1,1,5.6,7.72Z"/><path d="M25.19,20.82l10.35-10-7.19,12.5a2,2,0,1,1-3.16-2.46Z"/><path class="cls-1" d="M9.67,26.88A4.77,4.77,0,1,0,8.6,20.21,4.77,4.77,0,0,0,9.67,26.88Z"/><path d="M9.67,26.87a4.77,4.77,0,0,0,6.66-1.06A5,5,0,0,0,17,24.56a4.17,4.17,0,0,1-.46.82,3.93,3.93,0,1,1-.88-5.48,3.76,3.76,0,0,1,1.5,2.23,4.69,4.69,0,0,0-1.87-3,4.77,4.77,0,1,0-5.6,7.72Z"/><path d="M17.33,20.82,7,10.78l7.19,12.5a2,2,0,1,0,3.16-2.46Z"/><path d="M31.91,26.54a4.11,4.11,0,0,1-5.86-1,4.89,4.89,0,0,1-.56-1.15A3.44,3.44,0,0,0,30.71,26a3.68,3.68,0,0,0,.77-5,3.36,3.36,0,0,0-4.82-.79,3.47,3.47,0,0,0-1.32,2A4.28,4.28,0,0,1,27,19.49a4.09,4.09,0,0,1,5.86,1A4.47,4.47,0,0,1,31.91,26.54Z"/><path d="M10.61,26.54a4.09,4.09,0,0,0,5.85-1A4.37,4.37,0,0,0,17,24.42a3.19,3.19,0,0,1-.4.75A3.37,3.37,0,0,1,11.8,26,3.69,3.69,0,0,1,11,21a3.35,3.35,0,0,1,4.81-.79,3.47,3.47,0,0,1,1.32,2,4.28,4.28,0,0,0-1.65-2.72,4.08,4.08,0,0,0-5.85,1A4.47,4.47,0,0,0,10.61,26.54Z"/></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path d="M21.26,32a3.49,3.49,0,1,0,3.49,3.49A3.49,3.49,0,0,0,21.26,32Z"/><path d="M25.39,11.66a.57.57,0,0,0,0-.13,4.14,4.14,0,0,0-8.24,0s0,0,0,0,0,.22,0,.34v7.37a9,9,0,0,0,.95,4.1L19.84,27a1.6,1.6,0,0,0,2.85,0l1.79-3.58a9.13,9.13,0,0,0,.94-4.09V11.94A2.4,2.4,0,0,0,25.39,11.66Z"/></svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#fff;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><circle class="cls-2" cx="21.26" cy="21.39" r="10.09"/><path d="M21.26,32.49a11.1,11.1,0,1,1,11.09-11.1A11.1,11.1,0,0,1,21.26,32.49Zm0-20.19a9.1,9.1,0,1,0,9.09,9.09A9.1,9.1,0,0,0,21.26,12.3Z"/><rect x="19.44" y="18.17" width="3.63" height="24.87" rx="0.92"/><path d="M16.43,29.2V39.5a1,1,0,0,0,.48.88L19.58,42h3.36l2.66-1.66a1,1,0,0,0,.49-.88V29.2Z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:red;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path d="M19,20.56a.72.72,0,0,1-.75-.72v-.05a4.41,4.41,0,0,0-4.54-4.26,4.41,4.41,0,0,0-4.54,4.26.77.77,0,0,1-.75.77.73.73,0,0,1-.75-.72,5.92,5.92,0,0,1,6-5.81,5.91,5.91,0,0,1,6,5.76A.77.77,0,0,1,19,20.56Z"/><path d="M34.14,20.56a.72.72,0,0,1-.75-.72v-.05a4.55,4.55,0,0,0-9.08,0,.77.77,0,0,1-.75.77.73.73,0,0,1-.75-.72,6,6,0,0,1,12.08-.05A.77.77,0,0,1,34.14,20.56Z"/><path d="M21,42.07h0A12.64,12.64,0,0,1,8.38,29.43v-1.7H33.66v1.7A12.64,12.64,0,0,1,21,42.07Z"/><path class="cls-2" d="M21.63,35.56H20.42a4.78,4.78,0,0,0-4.78,4.78h0c3.61,2.4,7.2,2.21,10.77,0h0A4.78,4.78,0,0,0,21.63,35.56Z"/><path d="M21,42.82A13.41,13.41,0,0,1,7.63,29.43V27.72h1.5v1.71a11.89,11.89,0,1,0,23.78,0V27.72h1.5v1.71A13.4,13.4,0,0,1,21,42.82Z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#fff;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path class="cls-2" d="M10.74,37.94a7.18,7.18,0,0,1,7.18-7.07H24.6a7.19,7.19,0,0,1,7.18,7.07Z"/><path d="M24.6,31.62A6.44,6.44,0,0,1,31,37.19H11.54a6.44,6.44,0,0,1,6.38-5.57H24.6m0-1.5H17.92A7.93,7.93,0,0,0,10,38.05v.64H32.53v-.64a7.93,7.93,0,0,0-7.93-7.93Z"/><path d="M26.4,27.22c-2.3-4.66,4.18-8.79,7.35-4.61l0,.19c-3.72-.95-6.26.79-7.11,4.47l-.19-.05Z"/><path d="M15.93,27.27c-.86-3.69-3.39-5.42-7.11-4.47l-.05-.19c2-3,7-1.79,7.68,1.64a4.11,4.11,0,0,1-.33,3l-.19.05Z"/><path d="M26,18.28a6,6,0,0,1,1.11-3,8.13,8.13,0,0,1,2.27-1.83c1.55-1.19,3.18-2.29,4.85-3.33a.16.16,0,0,1,.21.05,33.88,33.88,0,0,1-3.37,5,8.28,8.28,0,0,1-1.85,2.25,6,6,0,0,1-3,1.08.19.19,0,0,1-.21-.21Z"/><path d="M16.28,18.49a6,6,0,0,1-3-1.08,8.28,8.28,0,0,1-1.85-2.25q-1.8-2.33-3.37-4.83a.16.16,0,0,1,0-.21,34,34,0,0,1,5,3.33,8.13,8.13,0,0,1,2.27,1.83,6,6,0,0,1,1.11,3,.19.19,0,0,1-.21.21Z"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#fff;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#8bffb1"/><stop offset="1" stop-color="#3a794b"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path d="M5.41,19.89c.39-7.56,12.59-6.59,13.91,0l-.19.06c-1.79-4-7-4.72-10.4-2.54A9.54,9.54,0,0,0,5.6,20l-.19-.06Z"/><path d="M36.92,20c-3.43-4.29-10.75-5.62-13.53,0l-.19-.06c1.08-4.77,7.71-6.86,11.65-4.17a5.14,5.14,0,0,1,2.26,4.17l-.19.06Z"/><path class="cls-2" d="M6.19,27.56c4,20,26.54,19.77,30.14,0Z"/><path d="M21.37,43.47c-6,0-13.83-4.11-16.16-15.72L5,26.56H37.53l-.22,1.17c-1.72,9.49-7.93,15.66-15.81,15.74ZM7.44,28.56c2.36,9.51,8.87,12.91,13.93,12.91h.11c5,0,11.46-3.49,13.62-12.91Z"/><rect x="14.58" y="27.88" width="2" height="13.1"/><rect x="25.94" y="27.88" width="2" height="13.1"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path d="M28.88,36.44H13.44A1.43,1.43,0,0,1,12,35h0a1.43,1.43,0,0,1,1.43-1.43H28.88A1.43,1.43,0,0,1,30.31,35h0A1.43,1.43,0,0,1,28.88,36.44Z"/><path d="M30.64,22.41a2.84,2.84,0,1,1-2.83-2.84A2.83,2.83,0,0,1,30.64,22.41Z"/><path d="M17.55,22.41a2.84,2.84,0,1,1-2.83-2.84A2.83,2.83,0,0,1,17.55,22.41Z"/><path d="M29.49,15H25.87a2,2,0,0,0-1.95,2h7.51A1.94,1.94,0,0,0,29.49,15Z"/><path d="M9.3,19.7h0a.75.75,0,0,1,0-1.06l4.09-4.06a.75.75,0,0,1,1.06,0h0a.75.75,0,0,1,0,1.06l-4.1,4A.75.75,0,0,1,9.3,19.7Z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 41.98 48.12"><defs><style>.cls-1{fill:url(#linear-gradient);}</style><linearGradient id="linear-gradient" x1="8.57" y1="4.51" x2="34.33" y2="41.3" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.23,21.06c0,12.88-9.06,26.31-20.24,26.31S.75,33.94.75,21.06,9.81.75,21,.75,41.23,8.19,41.23,21.06Z"/><path d="M21,48.12C9,48.12,0,33.84,0,21.06,0,8.66,8.63,0,21,0S42,8.66,42,21.06C42,33.84,33,48.12,21,48.12ZM21,1.5C9.33,1.5,1.5,9.36,1.5,21.06,1.5,33.13,9.83,46.62,21,46.62S40.48,33.13,40.48,21.06C40.48,9.36,32.65,1.5,21,1.5Z"/><path d="M21.21,29.42A1.25,1.25,0,0,1,20,28.17c0-1.89,0-4.25,2.5-6.13l1-.71c2.21-1.58,3.25-2.44,2.77-4.47-.55-2.36-3-3.35-5.15-3.29s-4.47,1.18-4.86,3.52a1.25,1.25,0,0,1-2.47-.42c.64-3.73,4.1-5.5,7.25-5.6s6.79,1.48,7.67,5.22-1.59,5.52-3.75,7.07c-.31.22-.62.44-.93.68-1.43,1.07-1.5,2.21-1.5,4.13A1.24,1.24,0,0,1,21.21,29.42Z"/><ellipse cx="21.21" cy="33.94" rx="2.04" ry="1.93"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:red;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path d="M16,20.5a3.27,3.27,0,0,1-3.45,3.07A3.27,3.27,0,0,1,9.06,20.5a3.27,3.27,0,0,1,3.44-3.07A3.28,3.28,0,0,1,16,20.5Z"/><path d="M33.46,20.5A3.27,3.27,0,0,1,30,23.57a3.27,3.27,0,0,1-3.45-3.07A3.28,3.28,0,0,1,30,17.43,3.27,3.27,0,0,1,33.46,20.5Z"/><path d="M27.05,8.78c3.51,1.05,7,3.28,8.58,6.63a12.18,12.18,0,0,0-9.08-3.88,1.41,1.41,0,1,1,.5-2.75Z"/><path d="M16,11.53a12.17,12.17,0,0,0-9.08,3.88c1.58-3.36,5.08-5.59,8.6-6.63A1.41,1.41,0,1,1,16,11.53Z"/><path class="cls-2" d="M8.88,33.58c5.27,11.16,19.87,11.22,24.76,0Z"/><path d="M21.42,42.72A14.71,14.71,0,0,1,8.2,33.9l-.5-1.07H34.78l-.45,1.05c-2.38,5.45-7.13,8.76-12.7,8.84Zm-11.3-8.39a13,13,0,0,0,11.49,6.89,12.35,12.35,0,0,0,10.84-6.89Z"/><path d="M21.44,42.72C15.16,42.72,9.5,38,6.64,30.43A.75.75,0,1,1,8,29.9C10.7,37,15.89,41.31,21.58,41.22S32,36.92,34.47,29.92a.75.75,0,0,1,1-.46.74.74,0,0,1,.46.95c-2.66,7.63-8,12.23-14.29,12.31Z"/><path d="M34.27,33H8.48a.75.75,0,0,1,0-1.5H34.27a.75.75,0,1,1,0,1.5Z"/></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffc984"/><stop offset="1" stop-color="#ff4900"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><path d="M24.64,36.47H17.88a1.57,1.57,0,0,1-1.57-1.57h0a1.57,1.57,0,0,1,1.57-1.57h6.76a1.57,1.57,0,0,1,1.57,1.57h0A1.57,1.57,0,0,1,24.64,36.47Z"/><path d="M8.75,19.68h0a.75.75,0,0,1,0-1.06l4.38-4.34a.75.75,0,0,1,1.06,0h0a.75.75,0,0,1,0,1.06L9.81,19.69A.75.75,0,0,1,8.75,19.68Z"/><path d="M16.83,21.85c0,1.66-1,3-2.26,3s-2.27-1.34-2.27-3,1-3,2.27-3S16.83,20.19,16.83,21.85Z"/><path d="M33.77,19.68h0a.75.75,0,0,0,0-1.06l-4.38-4.34a.75.75,0,0,0-1.06,0h0a.75.75,0,0,0,0,1.06l4.39,4.34A.75.75,0,0,0,33.77,19.68Z"/><path d="M25.69,21.85c0,1.66,1,3,2.26,3s2.27-1.34,2.27-3-1-3-2.27-3S25.69,20.19,25.69,21.85Z"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:#fff;}</style><linearGradient id="linear-gradient" x1="8.84" y1="4.55" x2="34.6" y2="41.34" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M41.5,21.09c0,12.88-9.06,26.32-20.24,26.32S1,34,1,21.09,10.08.78,21.26.78,41.5,8.22,41.5,21.09Z"/><path d="M21.26,48.16c-12,0-21-14.29-21-27.07C.27,8.69,8.9,0,21.26,0s21,8.66,21,21.06C42.25,33.87,33.27,48.16,21.26,48.16Zm0-46.63C9.6,1.53,1.77,9.39,1.77,21.09c0,12.07,8.33,25.57,19.49,25.57s19.49-13.5,19.49-25.57C40.75,9.39,32.92,1.53,21.26,1.53Z"/><circle class="cls-2" cx="13.49" cy="20.66" r="7.71" transform="translate(-10.66 15.59) rotate(-45)"/><path d="M13.49,29.05a8.4,8.4,0,1,1,8.39-8.39A8.4,8.4,0,0,1,13.49,29.05Zm0-15.41a7,7,0,1,0,7,7A7,7,0,0,0,13.49,13.64Z"/><path d="M17.59,16.56a4.1,4.1,0,1,1-4.1-4.1A4.11,4.11,0,0,1,17.59,16.56Z"/><circle class="cls-2" cx="29.03" cy="20.66" r="7.71" transform="translate(3.98 46) rotate(-80.76)"/><path d="M29,29.05a8.4,8.4,0,1,1,8.4-8.39A8.39,8.39,0,0,1,29,29.05Zm0-15.41a7,7,0,1,0,7,7A7,7,0,0,0,29,13.64Z"/><path d="M33.13,16.56a4.1,4.1,0,1,1-4.1-4.1A4.1,4.1,0,0,1,33.13,16.56Z"/><path d="M21.37,38.08H21L16.56,38a1.5,1.5,0,1,1,.07-3l4.47.11a10.07,10.07,0,0,0,6-1.73l.86-.57a1.5,1.5,0,1,1,1.67,2.49l-.87.57A13.15,13.15,0,0,1,21.37,38.08Z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.52 48.19"><defs><style>.cls-1{fill:red;}.cls-2{fill:url(#linear-gradient);}.cls-3{fill:#fff;}.cls-4{fill:none;stroke:#000;stroke-miterlimit:10;stroke-width:1.5px;}</style><linearGradient id="linear-gradient" x1="9.23" y1="5.16" x2="34.18" y2="40.8" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffff2e"/><stop offset="1" stop-color="#ff913d"/></linearGradient></defs><path class="cls-1" d="M33,7.55A15.59,15.59,0,0,0,39.82,2c1.44,4.57.89,9.26-.73,14C37.52,12.39,35.59,9.4,33,7.55Z"/><path d="M39.17,18.06l-.77-1.77c-1.69-3.88-3.61-6.54-5.87-8.13l-1.09-.77,1.23-.53A15.05,15.05,0,0,0,39.2,1.55L40.07.28l.46,1.46c1.36,4.31,1.12,9-.73,14.49ZM34.38,7.71A19.8,19.8,0,0,1,39,13.92a21.12,21.12,0,0,0,.54-10.28A16.29,16.29,0,0,1,34.38,7.71Z"/><path class="cls-1" d="M9.56,7.55A15.59,15.59,0,0,1,2.7,2c-1.44,4.57-.89,9.26.73,14C5,12.39,6.93,9.4,9.56,7.55Z"/><path d="M3.34,18.06l-.62-1.83C.87,10.79.63,6.05,2,1.74L2.45.28l.87,1.27A15.05,15.05,0,0,0,9.85,6.86l1.23.53L10,8.16c-2.26,1.59-4.18,4.25-5.87,8.13ZM3,3.64a21,21,0,0,0,.54,10.28A19.8,19.8,0,0,1,8.14,7.71,16.29,16.29,0,0,1,3,3.64Z"/><path class="cls-2" d="M40.87,21.19c0,12.47-8.78,25.49-19.61,25.49S1.65,33.66,1.65,21.19,10.43,1.51,21.26,1.51,40.87,8.71,40.87,21.19Z"/><path d="M21.26,47.41C9.62,47.41.92,33.56.92,21.19.92,9.17,9.29.78,21.26.78S41.6,9.17,41.6,21.19C41.6,33.56,32.9,47.41,21.26,47.41Zm0-45.17C10,2.24,2.38,9.85,2.38,21.19,2.38,32.88,10.45,46,21.26,46S40.14,32.88,40.14,21.19C40.14,9.85,32.55,2.24,21.26,2.24Z"/><path class="cls-1" d="M32.85,26.88a4.77,4.77,0,1,1,1.07-6.67A4.77,4.77,0,0,1,32.85,26.88Z"/><path d="M32.85,26.87a4.78,4.78,0,0,1-6.67-1.06,4.93,4.93,0,0,1-.64-1.25,4.17,4.17,0,0,0,.46.82,3.93,3.93,0,1,0,.88-5.48,3.76,3.76,0,0,0-1.5,2.23,4.69,4.69,0,0,1,1.87-3,4.77,4.77,0,1,1,5.6,7.72Z"/><path d="M25.19,20.82l10.35-10-7.19,12.5a2,2,0,1,1-3.16-2.46Z"/><path class="cls-1" d="M9.67,26.88A4.77,4.77,0,1,0,8.6,20.21,4.77,4.77,0,0,0,9.67,26.88Z"/><path d="M9.67,26.87a4.77,4.77,0,0,0,6.66-1.06A5,5,0,0,0,17,24.56a4.17,4.17,0,0,1-.46.82,3.93,3.93,0,1,1-.88-5.48,3.76,3.76,0,0,1,1.5,2.23,4.69,4.69,0,0,0-1.87-3,4.77,4.77,0,1,0-5.6,7.72Z"/><path d="M17.33,20.82,7,10.78l7.19,12.5a2,2,0,1,0,3.16-2.46Z"/><path d="M31.91,26.54a4.11,4.11,0,0,1-5.86-1,4.89,4.89,0,0,1-.56-1.15A3.44,3.44,0,0,0,30.71,26a3.68,3.68,0,0,0,.77-5,3.36,3.36,0,0,0-4.82-.79,3.47,3.47,0,0,0-1.32,2A4.28,4.28,0,0,1,27,19.49a4.09,4.09,0,0,1,5.86,1A4.47,4.47,0,0,1,31.91,26.54Z"/><path d="M10.61,26.54a4.09,4.09,0,0,0,5.85-1A4.37,4.37,0,0,0,17,24.42a3.19,3.19,0,0,1-.4.75A3.37,3.37,0,0,1,11.8,26,3.69,3.69,0,0,1,11,21a3.35,3.35,0,0,1,4.81-.79,3.47,3.47,0,0,1,1.32,2,4.28,4.28,0,0,0-1.65-2.72,4.08,4.08,0,0,0-5.85,1A4.47,4.47,0,0,0,10.61,26.54Z"/><path class="cls-3" d="M26,39.85H16.48a6.1,6.1,0,0,1-6.1-6.11H32.14A6.11,6.11,0,0,1,26,39.85Z"/><path class="cls-4" d="M34.09,31.71v0c0,4.66-5.74,8.44-12.83,8.44h0c-7.09,0-12.83-3.78-12.83-8.44v0"/><polygon points="32.61 35.21 9.96 35.21 8.84 33.21 33.44 33.21 32.61 35.21"/></svg>

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -173,8 +173,6 @@ class acp_attachments
'img_max_width' => array('lang' => 'MAX_IMAGE_SIZE', 'validate' => 'int:0', 'type' => false, 'method' => false, 'explain' => false,),
'img_max_height' => array('lang' => 'MAX_IMAGE_SIZE', 'validate' => 'int:0', 'type' => false, 'method' => false, 'explain' => false,),
'img_link_width' => array('lang' => 'IMAGE_LINK_SIZE', 'validate' => 'int:0', 'type' => false, 'method' => false, 'explain' => false,),
'img_link_height' => array('lang' => 'IMAGE_LINK_SIZE', 'validate' => 'int:0', 'type' => false, 'method' => false, 'explain' => false,),
'allow_attachments' => array('lang' => 'ALLOW_ATTACHMENTS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
'allow_pm_attach' => array('lang' => 'ALLOW_PM_ATTACHMENTS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
@ -197,7 +195,6 @@ class acp_attachments
'img_max' => array('lang' => 'MAX_IMAGE_SIZE', 'validate' => 'int:0:9999', 'type' => 'dimension:0:9999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'img_strip_metadata' => array('lang' => 'IMAGE_STRIP_METADATA', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'img_quality' => array('lang' => 'IMAGE_QUALITY', 'validate' => 'int:50:90', 'type' => 'number:50:90', 'explain' => true, 'append' => ' &percnt;'),
'img_link' => array('lang' => 'IMAGE_LINK_SIZE', 'validate' => 'int:0:9999', 'type' => 'dimension:0:9999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
)
);

View file

@ -110,6 +110,7 @@ class acp_bbcodes
);
$bbcode_tokens = array('TEXT', 'SIMPLETEXT', 'INTTEXT', 'IDENTIFIER', 'NUMBER', 'EMAIL', 'URL', 'LOCAL_URL', 'RELATIVE_URL', 'COLOR');
$bbcode_tokens = array_merge($bbcode_tokens, ['ALNUM', 'CHOICE', 'FLOAT', 'HASHMAP', 'INT', 'IP', 'IPPORT', 'IPV4', 'IPV6', 'MAP', 'RANGE', 'REGEXP', 'TIMESTAMP', 'UINT']);
/**
* Modify custom bbcode template data before we display the add/edit form

View file

@ -78,6 +78,7 @@ class acp_board
'site_home_url' => array('lang' => 'SITE_HOME_URL', 'validate' => 'url', 'type' => 'url:40:255', 'explain' => true),
'site_home_text' => array('lang' => 'SITE_HOME_TEXT', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => true),
'board_index_text' => array('lang' => 'BOARD_INDEX_TEXT', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => true),
'sitename_short' => array('lang' => 'SITE_NAME_SHORT', 'validate' => 'string', 'type' => 'text:40:12', 'explain' => true),
'board_disable' => array('lang' => 'DISABLE_BOARD', 'validate' => 'bool', 'type' => 'custom', 'method' => 'board_disable', 'explain' => true),
'board_disable_msg' => false,
'board_disable_access' => array('lang' => 'DISABLE_BOARD_ACCESS', 'validate' => 'int', 'type' => 'select', 'method' => 'board_disable_access', 'explain' => true),
@ -259,8 +260,6 @@ class acp_board
'max_sig_urls' => array('lang' => 'MAX_SIG_URLS', 'validate' => 'int:0:9999', 'type' => 'number:0:9999', 'explain' => true),
'max_sig_font_size' => array('lang' => 'MAX_SIG_FONT_SIZE', 'validate' => 'int:0:9999', 'type' => 'number:0:9999', 'explain' => true, 'append' => ' %'),
'max_sig_smilies' => array('lang' => 'MAX_SIG_SMILIES', 'validate' => 'int:0:9999', 'type' => 'number:0:9999', 'explain' => true),
'max_sig_img_width' => array('lang' => 'MAX_SIG_IMG_WIDTH', 'validate' => 'int:0:9999', 'type' => 'number:0:9999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'max_sig_img_height' => array('lang' => 'MAX_SIG_IMG_HEIGHT', 'validate' => 'int:0:9999', 'type' => 'number:0:9999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'legend3' => 'ACP_SUBMIT_CHANGES',
)
@ -392,7 +391,7 @@ class acp_board
'title' => 'ACP_AUTH_SETTINGS',
'vars' => array(
'legend1' => 'ACP_AUTH_SETTINGS',
'auth_method' => array('lang' => 'AUTH_METHOD', 'validate' => 'string', 'type' => 'select:1:toggable', 'method' => 'select_auth_method', 'explain' => false),
'auth_method' => array('lang' => 'AUTH_METHOD', 'validate' => 'string', 'type' => 'select:1:toggleable', 'method' => 'select_auth_method', 'explain' => false),
)
);
break;
@ -403,7 +402,7 @@ class acp_board
'vars' => array(
'legend1' => 'ACP_SERVER_SETTINGS',
'gzip_compress' => array('lang' => 'ENABLE_GZIP', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'use_system_cron' => array('lang' => 'USE_SYSTEM_CRON', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'use_system_cron' => array('lang' => 'USE_SYSTEM_CRON', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true),
'legend2' => 'PATH_SETTINGS',
'enable_mod_rewrite' => array('lang' => 'MOD_REWRITE_ENABLE', 'validate' => 'bool', 'type' => 'custom', 'method' => 'enable_mod_rewrite', 'explain' => true),
@ -593,6 +592,7 @@ class acp_board
// Array of emoji-enabled configurations
$config_name_ary = [
'sitename',
'sitename_short',
'site_desc',
'site_home_text',
'board_index_text',

View file

@ -95,7 +95,7 @@ class acp_captcha
add_form_key($form_key);
$submit = $request->variable('main_submit', false);
$error = $cfg_array = array();
$errors = $cfg_array = array();
if ($submit)
{
@ -103,13 +103,13 @@ class acp_captcha
{
$cfg_array[$config_var] = $request->variable($config_var, $options['default']);
}
validate_config_vars($config_vars, $cfg_array, $error);
validate_config_vars($config_vars, $cfg_array, $errors);
if (!check_form_key($form_key))
{
$error[] = $user->lang['FORM_INVALID'];
$errors[] = $user->lang['FORM_INVALID'];
}
if ($error)
if ($errors)
{
$submit = false;
}
@ -128,11 +128,9 @@ class acp_captcha
if (isset($captchas['available'][$selected]))
{
$old_captcha = $factory->get_instance($config['captcha_plugin']);
$old_captcha->uninstall();
$old_captcha->garbage_collect();
$config->set('captcha_plugin', $selected);
$new_captcha = $factory->get_instance($config['captcha_plugin']);
$new_captcha->install();
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_VISUAL');
}
@ -145,17 +143,24 @@ class acp_captcha
}
else
{
$captcha_select = '';
$captcha_options = [];
foreach ($captchas['available'] as $value => $title)
{
$current = ($selected !== false && $value == $selected) ? ' selected="selected"' : '';
$captcha_select .= '<option value="' . $value . '"' . $current . '>' . $user->lang($title) . '</option>';
$captcha_options[] = [
'value' => $value,
'label' => $user->lang($title),
'selected' => $selected !== false && $value == $selected,
];
}
foreach ($captchas['unavailable'] as $value => $title)
{
$current = ($selected !== false && $value == $selected) ? ' selected="selected"' : '';
$captcha_select .= '<option value="' . $value . '"' . $current . ' class="disabled-option">' . $user->lang($title) . '</option>';
$captcha_options[] = [
'value' => $value,
'label' => $user->lang($title),
'selected' => $selected !== false && $value == $selected,
'class' => 'disabled-option',
];
}
$demo_captcha = $factory->get_instance($selected);
@ -168,8 +173,12 @@ class acp_captcha
$template->assign_vars(array(
'CAPTCHA_PREVIEW_TPL' => $demo_captcha->get_demo_template($id),
'S_CAPTCHA_HAS_CONFIG' => $demo_captcha->has_config(),
'CAPTCHA_SELECT' => $captcha_select,
'ERROR_MSG' => implode('<br />', $error),
'CAPTCHA_SELECT' => [
'tag' => 'select',
'name' => 'select_captcha',
'options' => $captcha_options,
],
'ERRORS' => $errors,
'U_ACTION' => $this->u_action,
));

View file

@ -972,7 +972,7 @@ class acp_extensions
catch (exception_interface $e)
{
$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
$this->template->assign_block_vars('disabled', array(
$this->template->assign_block_vars('not_installed', array(
'META_DISPLAY_NAME' => $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),
'S_VERSIONCHECK' => false,
));
@ -986,9 +986,9 @@ class acp_extensions
$block_vars['NAME'] = $name;
$block_vars['U_DETAILS'] = $this->u_action . '&amp;action=details&amp;ext_name=' . urlencode($name);
$this->template->assign_block_vars('disabled', $block_vars);
$this->template->assign_block_vars('not_installed', $block_vars);
$this->output_actions('disabled', array(
$this->output_actions('not_installed', array(
'ENABLE' => $this->u_action . '&amp;action=enable_pre&amp;ext_name=' . urlencode($name),
'REMOVE' => $this->u_catalog_action . '&amp;action=remove&amp;extension=' . urlencode($block_vars['META_NAME']),
));

View file

@ -213,13 +213,7 @@ class acp_forums
phpbb_cache_moderators($db, $phpbb_container->get('dbal.tools'), $cache, $auth);
$copied_permissions = true;
}
/* Commented out because of questionable UI workflow - re-visit for 3.0.7
else if (!$this->parent_id && $action != 'edit' && $auth->acl_get('a_fauth') && $auth->acl_get('a_authusers') && $auth->acl_get('a_authgroups') && $auth->acl_get('a_mauth'))
{
$this->copy_permission_page($forum_data);
return;
}
*/
$auth->acl_clear_prefetch();
$acl_url = '&amp;mode=setting_forum_local&amp;forum_id[]=' . $forum_data['forum_id'];

View file

@ -396,7 +396,7 @@ class acp_groups
$allow_desc_urls = $request->variable('desc_parse_urls', false);
$allow_desc_smilies = $request->variable('desc_parse_smilies', false);
$submit_ary = array(
$submit_ary = [
'colour' => $request->variable('group_colour', ''),
'rank' => $request->variable('group_rank', 0),
'receive_pm' => isset($_REQUEST['group_receive_pm']) ? 1 : 0,
@ -406,7 +406,13 @@ class acp_groups
'max_recipients' => $request->variable('group_max_recipients', 0),
'founder_manage' => 0,
'skip_auth' => $request->variable('group_skip_auth', 0),
);
// Initialize avatar data
'avatar' => $avatar_data['avatar'] ?? '',
'avatar_type' => $avatar_data['avatar_type'] ?? '',
'avatar_height' => $avatar_data['avatar_height'] ?? 0,
'avatar_width' => $avatar_data['avatar_width'] ?? 0,
];
if ($user->data['user_type'] == USER_FOUNDER)
{

View file

@ -50,7 +50,7 @@ class acp_logs
$pagination = $phpbb_container->get('pagination');
// Delete entries if requested and able
if (($deletemark || $deleteall) && $auth->acl_get('a_clearlogs'))
if (($deleteall || ($deletemark && count($marked))) && $auth->acl_get('a_clearlogs'))
{
if (confirm_box(true))
{

View file

@ -1094,7 +1094,7 @@ class acp_users
$s_action_options .= '<option value="' . $value . '">' . $user->lang['USER_ADMIN_' . $lang] . '</option>';
}
$last_active = (!empty($user_row['session_time'])) ? $user_row['session_time'] : $user_row['user_last_active'];
$last_active = $user_row['user_last_active'] ?: ($user_row['session_time'] ?? 0);
$inactive_reason = '';
if ($user_row['user_type'] == USER_INACTIVE)

View file

@ -651,38 +651,4 @@ class bbcode
return $code;
}
/**
* Function to perform custom bbcode second pass by extensions
* can be used to assign bbcode pattern replacement
* Example: '#\[list=([^\[]+):$uid\]#e' => "\$this->bbcode_second_pass_by_extension('\$1')"
*
* Accepts variable number of parameters
*
* @return bool Second pass result
*
* @deprecated 3.2.10 (To be removed 4.0.0)
*/
function bbcode_second_pass_by_extension()
{
global $phpbb_dispatcher;
$return = false;
$params_array = func_get_args();
/**
* Event to perform bbcode second pass with
* the custom validating methods provided by extensions
*
* @event core.bbcode_second_pass_by_extension
* @var array params_array Array with the function parameters
* @var mixed return Second pass result to return
*
* @since 3.1.5-RC1
*/
$vars = array('params_array', 'return');
extract($phpbb_dispatcher->trigger_event('core.bbcode_second_pass_by_extension', compact($vars)));
return $return;
}
}

View file

@ -49,8 +49,6 @@ function register_compatibility_globals()
/* @var $request \phpbb\request\request_interface */
$request = $phpbb_container->get('request');
// Inject request instance, so only this instance is used with request_var
request_var('', 0, false, false, $request);
/* @var $user \phpbb\user */
$user = $phpbb_container->get('user');
@ -67,8 +65,6 @@ function register_compatibility_globals()
// Grab global variables, re-cache if necessary
/* @var $config phpbb\config\db */
$config = $phpbb_container->get('config');
set_config('', '', false, $config);
set_config_count('', 0, false, $config);
/* @var $phpbb_log \phpbb\log\log_interface */
$phpbb_log = $phpbb_container->get('log');

View file

@ -152,9 +152,13 @@ define('FULL_FOLDER_DELETE', -2);
define('FULL_FOLDER_HOLD', -1);
// Confirm types
/** @deprecated 4.0.0-a1 Replaced by \phpbb\captcha\plugins\confirm_type::REGISTRATION, to be removed in 5.0.0-a1 */
define('CONFIRM_REG', 1);
/** @deprecated 4.0.0-a1 Replaced by \phpbb\captcha\plugins\confirm_type::LOGIN, to be removed in 5.0.0-a1 */
define('CONFIRM_LOGIN', 2);
/** @deprecated 4.0.0-a1 Replaced by \phpbb\captcha\plugins\confirm_type::POST, to be removed in 5.0.0-a1 */
define('CONFIRM_POST', 3);
/** @deprecated 4.0.0-a1 Replaced by \phpbb\captcha\plugins\confirm_type::REPORT, to be removed in 5.0.0-a1 */
define('CONFIRM_REPORT', 4);
// Categories - Attachments
@ -174,7 +178,7 @@ define('BBCODE_UID_LEN', 8);
// Number of core BBCodes
define('NUM_CORE_BBCODES', 12);
define('NUM_PREDEFINED_BBCODES', 22);
define('NUM_PREDEFINED_BBCODES', 20);
// BBCode IDs
define('BBCODE_ID_QUOTE', 0);

View file

@ -107,9 +107,17 @@ function phpbb_gmgetdate($time = false)
}
// getdate() interprets timestamps in local time.
// What follows uses the fact that getdate() and
// date('Z') balance each other out.
return getdate($time - date('Z'));
// So use UTC timezone temporarily to get UTC date info array.
$current_timezone = date_default_timezone_get();
// Set UTC timezone and get respective date info
date_default_timezone_set('UTC');
$date_info = getdate($time);
// Restore timezone back
date_default_timezone_set($current_timezone);
return $date_info;
}
/**
@ -2931,8 +2939,16 @@ function msg_handler($errno, $msg_text, $errfile, $errline): bool
global $phpbb_root_path, $msg_title, $msg_long_text, $phpbb_log;
global $phpbb_container;
// https://www.php.net/manual/en/language.operators.errorcontrol.php
// error_reporting() return a different error code inside the error handler after php 8.0
$suppresed = E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE;
if (PHP_VERSION_ID < 80000)
{
$suppresed = 0;
}
// Do not display notices if we suppress them via @
if (error_reporting() == 0 && $errno != E_USER_ERROR && $errno != E_USER_WARNING && $errno != E_USER_NOTICE)
if (error_reporting() == $suppresed && $errno != E_USER_ERROR && $errno != E_USER_WARNING && $errno != E_USER_NOTICE)
{
return true;
}
@ -3847,7 +3863,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
'U_SEARCH_UNANSWERED' => append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=unanswered'),
'U_SEARCH_UNREAD' => append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=unreadposts'),
'U_SEARCH_ACTIVE_TOPICS'=> append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=active_topics'),
'U_DELETE_COOKIES' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=delete_cookies'),
'U_DELETE_COOKIES' => $controller_helper->route('phpbb_ucp_delete_cookies_controller'),
'U_CONTACT_US' => ($config['contact_admin_form_enable'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=contactadmin') : '',
'U_TEAM' => (!$auth->acl_get('u_viewprofile')) ? '' : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=team'),
'U_TERMS_USE' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=terms'),
@ -3855,6 +3871,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
'UA_PRIVACY' => addslashes(append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy')),
'U_RESTORE_PERMISSIONS' => ($user->data['user_perm_from'] && $auth->acl_get('a_switchperm')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=restore_perm') : '',
'U_FEED' => $controller_helper->route('phpbb_feed_index'),
'U_MANIFEST' => $controller_helper->route('phpbb_manifest_controller'),
'S_ALLOW_MENTIONS' => ($config['allow_mentions'] && $auth->acl_get('u_mention') && (empty($forum_id) || $auth->acl_get('f_mention', $forum_id))) ? true : false,
'S_MENTION_NAMES_LIMIT' => $config['mention_names_limit'],
@ -4023,7 +4040,9 @@ function phpbb_generate_debug_output(\phpbb\db\driver\driver_interface $db, \php
if ($auth->acl_get('a_'))
{
$debug_info[] = '<a href="' . build_url() . '&amp;explain=1">SQL Explain</a>';
$page_url = build_url();
$page_url .= ((!str_contains($page_url, '?')) ? '?' : '&amp;') . 'explain=1';
$debug_info[] = '<a href="' . $page_url . '">SQL Explain</a>';
}
}

View file

@ -203,8 +203,8 @@ function adm_page_footer($copyright_html = true)
*/
function adm_back_link($u_action)
{
global $user;
return '<br /><br /><a href="' . $u_action . '">&laquo; ' . $user->lang['BACK_TO_PREV'] . '</a>';
global $language;
return '<br /><br /><a href="' . $u_action . '">&laquo; ' . $language->lang('BACK_TO_PREV') . '</a>';
}
/**

View file

@ -19,835 +19,6 @@ if (!defined('IN_PHPBB'))
exit;
}
/**
* Hash the password
*
* @deprecated 3.1.0-a2 (To be removed: 4.0.0)
*
* @param string $password Password to be hashed
*
* @return string|bool Password hash or false if something went wrong during hashing
*/
function phpbb_hash($password)
{
global $phpbb_container;
/* @var $passwords_manager \phpbb\passwords\manager */
$passwords_manager = $phpbb_container->get('passwords.manager');
return $passwords_manager->hash($password);
}
/**
* Check for correct password
*
* @deprecated 3.1.0-a2 (To be removed: 4.0.0)
*
* @param string $password The password in plain text
* @param string $hash The stored password hash
*
* @return bool Returns true if the password is correct, false if not.
*/
function phpbb_check_hash($password, $hash)
{
global $phpbb_container;
/* @var $passwords_manager \phpbb\passwords\manager */
$passwords_manager = $phpbb_container->get('passwords.manager');
return $passwords_manager->check($password, $hash);
}
/**
* Eliminates useless . and .. components from specified path.
*
* Deprecated, use storage helper class instead
*
* @param string $path Path to clean
* @return string Cleaned path
*
* @deprecated 3.1.0 (To be removed: 4.0.0)
*/
function phpbb_clean_path($path)
{
return \phpbb\filesystem\helper::clean_path($path);
}
/**
* Pick a timezone
*
* @param string $default A timezone to select
* @param boolean $truncate Shall we truncate the options text
*
* @return string Returns the options for timezone selector only
*
* @deprecated 3.1.0 (To be removed: 4.0.0)
*/
function tz_select($default = '', $truncate = false)
{
global $user;
return phpbb_timezone_select($user, $default, $truncate);
}
/**
* Cache moderators. Called whenever permissions are changed
* via admin_permissions. Changes of usernames and group names
* must be carried through for the moderators table.
*
* @deprecated 3.1.0 (To be removed: 4.0.0)
* @return void
*/
function cache_moderators()
{
global $db, $cache, $auth, $phpbb_container;
phpbb_cache_moderators($db, $phpbb_container->get('dbal.tools'), $cache, $auth);
}
/**
* Removes moderators and administrators from foe lists.
*
* @deprecated 3.1.0 (To be removed: 4.0.0)
* @param array|bool $group_id If an array, remove all members of this group from foe lists, or false to ignore
* @param array|bool $user_id If an array, remove this user from foe lists, or false to ignore
* @return void
*/
function update_foes($group_id = false, $user_id = false)
{
global $db, $auth;
return phpbb_update_foes($db, $auth, $group_id, $user_id);
}
/**
* Get user rank title and image
*
* @param int $user_rank the current stored users rank id
* @param int $user_posts the users number of posts
* @param string &$rank_title the rank title will be stored here after execution
* @param string &$rank_img the rank image as full img tag is stored here after execution
* @param string &$rank_img_src the rank image source is stored here after execution
*
* @deprecated 3.1.0-RC5 (To be removed: 4.0.0)
*
* Note: since we do not want to break backwards-compatibility, this function will only properly assign ranks to guests if you call it for them with user_posts == false
*/
function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank_img_src)
{
global $phpbb_root_path, $phpEx;
if (!function_exists('phpbb_get_user_rank'))
{
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
}
$rank_data = phpbb_get_user_rank(array('user_rank' => $user_rank), $user_posts);
$rank_title = $rank_data['title'];
$rank_img = $rank_data['img'];
$rank_img_src = $rank_data['img_src'];
}
/**
* Retrieve contents from remotely stored file
*
* @deprecated 3.1.2 Use file_downloader instead
*/
function get_remote_file($host, $directory, $filename, &$errstr, &$errno, $port = 80, $timeout = 6)
{
global $phpbb_container;
// Get file downloader and assign $errstr and $errno
/* @var $file_downloader \phpbb\file_downloader */
$file_downloader = $phpbb_container->get('file_downloader');
$file_data = $file_downloader->get($host, $directory, $filename, $port, $timeout);
$errstr = $file_downloader->get_error_string();
$errno = $file_downloader->get_error_number();
return $file_data;
}
/**
* Add log entry
*
* string $mode The mode defines which log_type is used and from which log the entry is retrieved
* int $forum_id Mode 'mod' ONLY: forum id of the related item, NOT INCLUDED otherwise
* int $topic_id Mode 'mod' ONLY: topic id of the related item, NOT INCLUDED otherwise
* int $reportee_id Mode 'user' ONLY: user id of the reportee, NOT INCLUDED otherwise
* string $log_operation Name of the operation
* array $additional_data More arguments can be added, depending on the log_type
*
* @return int|bool Returns the log_id, if the entry was added to the database, false otherwise.
*
* @deprecated 3.1.0 (To be removed: 4.0.0)
*/
function add_log()
{
global $phpbb_log, $user;
$args = func_get_args();
$mode = array_shift($args);
// This looks kind of dirty, but add_log has some additional data before the log_operation
$additional_data = array();
switch ($mode)
{
case 'admin':
case 'critical':
break;
case 'mod':
$additional_data['forum_id'] = array_shift($args);
$additional_data['topic_id'] = array_shift($args);
break;
case 'user':
$additional_data['reportee_id'] = array_shift($args);
break;
}
$log_operation = array_shift($args);
$additional_data = array_merge($additional_data, $args);
$user_id = (empty($user->data)) ? ANONYMOUS : $user->data['user_id'];
$user_ip = (empty($user->ip)) ? '' : $user->ip;
return $phpbb_log->add($mode, $user_id, $user_ip, $log_operation, time(), $additional_data);
}
/**
* Sets a configuration option's value.
*
* Please note that this function does not update the is_dynamic value for
* an already existing config option.
*
* @param string $config_name The configuration option's name
* @param string $config_value New configuration value
* @param bool $is_dynamic Whether this variable should be cached (false) or
* if it changes too frequently (true) to be
* efficiently cached.
*
* @return void
*
* @deprecated 3.1.0 (To be removed: 4.0.0)
*/
function set_config($config_name, $config_value, $is_dynamic = false, \phpbb\config\config $set_config = null)
{
static $config = null;
if ($set_config !== null)
{
$config = $set_config;
if (empty($config_name))
{
return;
}
}
$config->set($config_name, $config_value, !$is_dynamic);
}
/**
* Increments an integer config value directly in the database.
*
* @param string $config_name The configuration option's name
* @param int $increment Amount to increment by
* @param bool $is_dynamic Whether this variable should be cached (false) or
* if it changes too frequently (true) to be
* efficiently cached.
*
* @return void
*
* @deprecated 3.1.0 (To be removed: 4.0.0)
*/
function set_config_count($config_name, $increment, $is_dynamic = false, \phpbb\config\config $set_config = null)
{
static $config = null;
if ($set_config !== null)
{
$config = $set_config;
if (empty($config_name))
{
return;
}
}
$config->increment($config_name, $increment, !$is_dynamic);
}
/**
* Wrapper function of \phpbb\request\request::variable which exists for backwards compatability.
* See {@link \phpbb\request\request_interface::variable \phpbb\request\request_interface::variable} for
* documentation of this function's use.
*
* @deprecated 3.1.0 (To be removed: 4.0.0)
* @param mixed $var_name The form variable's name from which data shall be retrieved.
* If the value is an array this may be an array of indizes which will give
* direct access to a value at any depth. E.g. if the value of "var" is array(1 => "a")
* then specifying array("var", 1) as the name will return "a".
* If you pass an instance of {@link \phpbb\request\request_interface phpbb_request_interface}
* as this parameter it will overwrite the current request class instance. If you do
* not do so, it will create its own instance (but leave superglobals enabled).
* @param mixed $default A default value that is returned if the variable was not set.
* This function will always return a value of the same type as the default.
* @param bool $multibyte If $default is a string this paramater has to be true if the variable may contain any UTF-8 characters
* Default is false, causing all bytes outside the ASCII range (0-127) to be replaced with question marks
* @param bool $cookie This param is mapped to \phpbb\request\request_interface::COOKIE as the last param for
* \phpbb\request\request_interface::variable for backwards compatability reasons.
* @param \phpbb\request\request_interface|null|false $request
* If an instance of \phpbb\request\request_interface is given the instance is stored in
* a static variable and used for all further calls where this parameters is null. Until
* the function is called with an instance it automatically creates a new \phpbb\request\request
* instance on every call. By passing false this per-call instantiation can be restored
* after having passed in a \phpbb\request\request_interface instance.
*
* @return mixed The value of $_REQUEST[$var_name] run through {@link set_var set_var} to ensure that the type is the
* the same as that of $default. If the variable is not set $default is returned.
*/
function request_var($var_name, $default, $multibyte = false, $cookie = false, $request = null)
{
// This is all just an ugly hack to add "Dependency Injection" to a function
// the only real code is the function call which maps this function to a method.
static $static_request = null;
if ($request instanceof \phpbb\request\request_interface)
{
$static_request = $request;
if (empty($var_name))
{
return null;
}
}
else if ($request === false)
{
$static_request = null;
if (empty($var_name))
{
return null;
}
}
$tmp_request = $static_request;
// no request class set, create a temporary one ourselves to keep backwards compatibility
if ($tmp_request === null)
{
// false param: enable super globals, so the created request class does not
// make super globals inaccessible everywhere outside this function.
$tmp_request = new \phpbb\request\request(new \phpbb\request\type_cast_helper(), false);
}
return $tmp_request->variable($var_name, $default, $multibyte, ($cookie) ? \phpbb\request\request_interface::COOKIE : \phpbb\request\request_interface::REQUEST);
}
/**
* Get tables of a database
*
* @deprecated 3.1.0 (To be removed: 4.0.0)
*/
function get_tables($db)
{
throw new BadFunctionCallException('function removed from phpBB core, use db_tools service instead.');
}
/**
* Global function for chmodding directories and files for internal use
*
* This function determines owner and group whom the file belongs to and user and group of PHP and then set safest possible file permissions.
* The function determines owner and group from common.php file and sets the same to the provided file.
* The function uses bit fields to build the permissions.
* The function sets the appropiate execute bit on directories.
*
* Supported constants representing bit fields are:
*
* CHMOD_ALL - all permissions (7)
* CHMOD_READ - read permission (4)
* CHMOD_WRITE - write permission (2)
* CHMOD_EXECUTE - execute permission (1)
*
* NOTE: The function uses POSIX extension and fileowner()/filegroup() functions. If any of them is disabled, this function tries to build proper permissions, by calling is_readable() and is_writable() functions.
*
* @param string $filename The file/directory to be chmodded
* @param int $perms Permissions to set
*
* @return bool true on success, otherwise false
*
* @deprecated 3.2.0-dev use \phpbb\filesystem\filesystem::phpbb_chmod() instead
*/
function phpbb_chmod($filename, $perms = CHMOD_READ)
{
global $phpbb_filesystem;
try
{
$phpbb_filesystem->phpbb_chmod($filename, $perms);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
return false;
}
return true;
}
/**
* Test if a file/directory is writable
*
* This function calls the native is_writable() when not running under
* Windows and it is not disabled.
*
* @param string $file Path to perform write test on
* @return bool True when the path is writable, otherwise false.
*
* @deprecated 3.2.0-dev use \phpbb\filesystem\filesystem::is_writable() instead
*/
function phpbb_is_writable($file)
{
global $phpbb_filesystem;
return $phpbb_filesystem->is_writable($file);
}
/**
* Checks if a path ($path) is absolute or relative
*
* @param string $path Path to check absoluteness of
* @return boolean
*
* @deprecated 3.2.0-dev use \phpbb\filesystem\helper::is_absolute_path() instead
*/
function phpbb_is_absolute($path)
{
return \phpbb\filesystem\helper::is_absolute_path($path);
}
/**
* A wrapper for realpath
*
* @deprecated 3.2.0-dev use \phpbb\filesystem\helper::realpath() instead
*/
function phpbb_realpath($path)
{
return \phpbb\filesystem\helper::realpath($path);
}
/**
* Determine which plural form we should use.
* For some languages this is not as simple as for English.
*
* @param int $rule ID of the plural rule we want to use, see https://area51.phpbb.com/docs/dev/3.3.x/language/plurals.html
* @param int|float $number The number we want to get the plural case for. Float numbers are floored.
* @return int The plural-case we need to use for the number plural-rule combination
*
* @deprecated 3.2.0-dev (To be removed: 4.0.0)
*/
function phpbb_get_plural_form($rule, $number)
{
global $phpbb_container;
/** @var \phpbb\language\language $language */
$language = $phpbb_container->get('language');
return $language->get_plural_form($number, $rule);
}
/**
* @return bool Always true
* @deprecated 3.2.0-dev
*/
function phpbb_pcre_utf8_support()
{
return true;
}
/**
* Casts a variable to the given type.
*
* @deprecated 3.1 (To be removed 4.0.0)
*/
function set_var(&$result, $var, $type, $multibyte = false)
{
// no need for dependency injection here, if you have the object, call the method yourself!
$type_cast_helper = new \phpbb\request\type_cast_helper();
$type_cast_helper->set_var($result, $var, $type, $multibyte);
}
/**
* Delete Attachments
*
* @deprecated 3.2.0-a1 (To be removed: 4.0.0)
*
* @param string $mode can be: post|message|topic|attach|user
* @param mixed $ids can be: post_ids, message_ids, topic_ids, attach_ids, user_ids
* @param bool $resync set this to false if you are deleting posts or topics
*/
function delete_attachments($mode, $ids, $resync = true)
{
global $phpbb_container;
/** @var \phpbb\attachment\manager $attachment_manager */
$attachment_manager = $phpbb_container->get('attachment.manager');
$num_deleted = $attachment_manager->delete($mode, $ids, $resync);
unset($attachment_manager);
return $num_deleted;
}
/**
* Delete attached file
*
* @deprecated 3.2.0-a1 (To be removed: 4.0.0)
*/
function phpbb_unlink($filename, $mode = 'file', $entry_removed = false)
{
global $phpbb_container;
/** @var \phpbb\attachment\manager $attachment_manager */
$attachment_manager = $phpbb_container->get('attachment.manager');
$unlink = $attachment_manager->unlink($filename, $mode, $entry_removed);
unset($attachment_manager);
return $unlink;
}
/**
* Display reasons
*
* @deprecated 3.2.0-dev (To be removed: 4.0.0)
*/
function display_reasons($reason_id = 0)
{
global $phpbb_container;
$phpbb_container->get('phpbb.report.report_reason_list_provider')->display_reasons($reason_id);
}
/**
* Upload Attachment - filedata is generated here
* Uses upload class
*
* @deprecated 3.2.0-a1 (To be removed: 4.0.0)
*
* @param string $form_name The form name of the file upload input
* @param int $forum_id The id of the forum
* @param bool $local Whether the file is local or not
* @param string $local_storage The path to the local file
* @param bool $is_message Whether it is a PM or not
* @param array $local_filedata A filespec object created for the local file
*
* @return array File data array
*/
function upload_attachment($form_name, $forum_id, $local = false, $local_storage = '', $is_message = false, $local_filedata = false)
{
global $phpbb_container;
/** @var \phpbb\attachment\manager $attachment_manager */
$attachment_manager = $phpbb_container->get('attachment.manager');
$file = $attachment_manager->upload($form_name, $forum_id, $local, $local_storage, $is_message, $local_filedata);
unset($attachment_manager);
return $file;
}
/**
* Wrapper for php's checkdnsrr function.
*
* @param string $host Fully-Qualified Domain Name
* @param string $type Resource record type to lookup
* Supported types are: MX (default), A, AAAA, NS, TXT, CNAME
* Other types may work or may not work
*
* @return bool|null true if entry found,
* false if entry not found,
* null if this function is not supported by this environment
*
* Since null can also be returned, you probably want to compare the result
* with === true or === false,
*
* @deprecated 3.3.0-b2 (To be removed: 4.0.0)
*/
function phpbb_checkdnsrr($host, $type = 'MX')
{
return checkdnsrr($host, $type);
}
/*
* Wrapper for inet_ntop()
*
* Converts a packed internet address to a human readable representation
* inet_ntop() is supported by PHP since 5.1.0, since 5.3.0 also on Windows.
*
* @param string $in_addr A 32bit IPv4, or 128bit IPv6 address.
*
* @return mixed false on failure,
* string otherwise
*
* @deprecated 3.3.0-b2 (To be removed: 4.0.0)
*/
function phpbb_inet_ntop($in_addr)
{
return inet_ntop($in_addr);
}
/**
* Wrapper for inet_pton()
*
* Converts a human readable IP address to its packed in_addr representation
* inet_pton() is supported by PHP since 5.1.0, since 5.3.0 also on Windows.
*
* @param string $address A human readable IPv4 or IPv6 address.
*
* @return false|string false if address is invalid,
* in_addr representation of the given address otherwise (string)
*
* @deprecated 3.3.0-b2 (To be removed: 4.0.0)
*/
function phpbb_inet_pton($address)
{
return inet_pton($address);
}
/**
* Hashes an email address to a big integer
*
* @param string $email Email address
*
* @return string Unsigned Big Integer
*
* @deprecated 3.3.0-b2 (To be removed: 4.0.0)
*/
function phpbb_email_hash($email)
{
return sprintf('%u', crc32(strtolower($email))) . strlen($email);
}
/**
* Load the autoloaders added by the extensions.
*
* @param string $phpbb_root_path Path to the phpbb root directory.
*/
function phpbb_load_extensions_autoloaders($phpbb_root_path)
{
$iterator = new \phpbb\finder\recursive_path_iterator(
$phpbb_root_path . 'ext/',
\RecursiveIteratorIterator::SELF_FIRST,
\FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS
);
$iterator->setMaxDepth(2);
foreach ($iterator as $file_info)
{
if ($file_info->getFilename() === 'vendor' && $iterator->getDepth() === 2)
{
$filename = $file_info->getRealPath() . '/autoload.php';
if (file_exists($filename))
{
require $filename;
}
}
}
}
/**
* Login using http authenticate.
*
* @param array $param Parameter array, see $param_defaults array.
*
* @return void
*
* @deprecated 3.2.10 (To be removed 4.0.0)
*/
function phpbb_http_login($param)
{
global $auth, $user, $request;
global $config;
$param_defaults = array(
'auth_message' => '',
'autologin' => false,
'viewonline' => true,
'admin' => false,
);
// Overwrite default values with passed values
$param = array_merge($param_defaults, $param);
// User is already logged in
// We will not overwrite his session
if (!empty($user->data['is_registered']))
{
return;
}
// $_SERVER keys to check
$username_keys = array(
'PHP_AUTH_USER',
'Authorization',
'REMOTE_USER', 'REDIRECT_REMOTE_USER',
'HTTP_AUTHORIZATION', 'REDIRECT_HTTP_AUTHORIZATION',
'REMOTE_AUTHORIZATION', 'REDIRECT_REMOTE_AUTHORIZATION',
'AUTH_USER',
);
$password_keys = array(
'PHP_AUTH_PW',
'REMOTE_PASSWORD',
'AUTH_PASSWORD',
);
$username = null;
foreach ($username_keys as $k)
{
if ($request->is_set($k, \phpbb\request\request_interface::SERVER))
{
$username = html_entity_decode($request->server($k), ENT_COMPAT);
break;
}
}
$password = null;
foreach ($password_keys as $k)
{
if ($request->is_set($k, \phpbb\request\request_interface::SERVER))
{
$password = html_entity_decode($request->server($k), ENT_COMPAT);
break;
}
}
// Decode encoded information (IIS, CGI, FastCGI etc.)
if (!is_null($username) && is_null($password) && strpos($username, 'Basic ') === 0)
{
list($username, $password) = explode(':', base64_decode(substr($username, 6)), 2);
}
if (!is_null($username) && !is_null($password))
{
set_var($username, $username, 'string', true);
set_var($password, $password, 'string', true);
$auth_result = $auth->login($username, $password, $param['autologin'], $param['viewonline'], $param['admin']);
if ($auth_result['status'] == LOGIN_SUCCESS)
{
return;
}
else if ($auth_result['status'] == LOGIN_ERROR_ATTEMPTS)
{
send_status_line(401, 'Unauthorized');
trigger_error('NOT_AUTHORISED');
}
}
// Prepend sitename to auth_message
$param['auth_message'] = ($param['auth_message'] === '') ? $config['sitename'] : $config['sitename'] . ' - ' . $param['auth_message'];
// We should probably filter out non-ASCII characters - RFC2616
$param['auth_message'] = preg_replace('/[\x80-\xFF]/', '?', $param['auth_message']);
header('WWW-Authenticate: Basic realm="' . $param['auth_message'] . '"');
send_status_line(401, 'Unauthorized');
trigger_error('NOT_AUTHORISED');
}
/**
* Converts query string (GET) parameters in request into hidden fields.
*
* Useful for forwarding GET parameters when submitting forms with GET method.
*
* It is possible to omit some of the GET parameters, which is useful if
* they are specified in the form being submitted.
*
* sid is always omitted.
*
* @param \phpbb\request\request $request Request object
* @param array $exclude A list of variable names that should not be forwarded
* @return string HTML with hidden fields
*
* @deprecated 3.2.10 (To be removed 4.0.0)
*/
function phpbb_build_hidden_fields_for_query_params($request, $exclude = null)
{
$names = $request->variable_names(\phpbb\request\request_interface::GET);
$hidden = '';
foreach ($names as $name)
{
// Sessions are dealt with elsewhere, omit sid always
if ($name == 'sid')
{
continue;
}
// Omit any additional parameters requested
if (!empty($exclude) && in_array($name, $exclude))
{
continue;
}
$escaped_name = phpbb_quoteattr($name);
// Note: we might retrieve the variable from POST or cookies
// here. To avoid exposing cookies, skip variables that are
// overwritten somewhere other than GET entirely.
$value = $request->variable($name, '', true);
$get_value = $request->variable($name, '', true, \phpbb\request\request_interface::GET);
if ($value === $get_value)
{
$escaped_value = phpbb_quoteattr($value);
$hidden .= "<input type='hidden' name=$escaped_name value=$escaped_value />";
}
}
return $hidden;
}
/**
* Delete all PM(s) for a given user and delete the ones without references
*
* @param int $user_id ID of the user whose private messages we want to delete
*
* @return boolean False if there were no pms found, true otherwise.
*
* @deprecated 3.2.10 (To be removed 4.0.0)
*/
function phpbb_delete_user_pms($user_id)
{
$user_id = (int) $user_id;
if (!$user_id)
{
return false;
}
return phpbb_delete_users_pms(array($user_id));
}
/**
* Casts a numeric string $input to an appropriate numeric type (i.e. integer or float)
*
* @param string $input A numeric string.
*
* @return int|float Integer $input if $input fits integer,
* float $input otherwise.
*
* @deprecated 3.2.10 (To be removed 4.0.0)
*/
function phpbb_to_numeric($input)
{
return ($input > PHP_INT_MAX) ? (float) $input : (int) $input;
}
/**
* Check and display the SQL report if requested.
*
* @param \phpbb\request\request_interface $request Request object
* @param \phpbb\auth\auth $auth Auth object
* @param \phpbb\db\driver\driver_interface $db Database connection
*
* @deprecated 3.3.1 (To be removed: 4.0.0-a1); use controller helper's display_sql_report()
*/
function phpbb_check_and_display_sql_report(\phpbb\request\request_interface $request, \phpbb\auth\auth $auth, \phpbb\db\driver\driver_interface $db)
{
global $phpbb_container;
/** @var \phpbb\controller\helper $controller_helper */
$controller_helper = $phpbb_container->get('controller.helper');
$controller_helper->display_sql_report();
}
/**
* Parse cfg file
* @param string $filename
@ -909,27 +80,3 @@ function parse_cfg_file($filename, $lines = false)
return $parsed_items;
}
/**
* Wraps an url into a simple html page. Used to display attachments in IE.
* this is a workaround for now; might be moved to template system later
* direct any complaints to 1 Microsoft Way, Redmond
*
* @deprecated: 3.3.0-dev (To be removed: 4.0.0)
*/
function wrap_img_in_html($src, $title)
{
echo '<!DOCTYPE html>';
echo '<html>';
echo '<head>';
echo '<meta charset="utf-8">';
echo '<meta http-equiv="X-UA-Compatible" content="IE=edge">';
echo '<title>' . $title . '</title>';
echo '</head>';
echo '<body>';
echo '<div>';
echo '<img src="' . $src . '" alt="' . $title . '" />';
echo '</div>';
echo '</body>';
echo '</html>';
}

View file

@ -288,7 +288,27 @@ function make_jumpbox($action, $forum_id = false, $select_all = false, $acl_list
*/
function bump_topic_allowed($forum_id, $topic_bumped, $last_post_time, $topic_poster, $last_topic_poster)
{
global $config, $auth, $user;
global $config, $auth, $user, $phpbb_dispatcher;
/**
* Event to run code before the topic bump checks
*
* @event core.bump_topic_allowed_before
* @var int forum_id ID of the forum
* @var int topic_bumped Flag indicating if the topic was already bumped (0/1)
* @var int last_post_time The time of the topic last post
* @var int topic_poster User ID of the topic author
* @var int last_topic_poster User ID of the topic last post author
* @since 3.3.14-RC1
*/
$vars = [
'forum_id',
'topic_bumped',
'last_post_time',
'topic_poster',
'last_topic_poster',
];
extract($phpbb_dispatcher->trigger_event('core.bump_topic_allowed_before', compact($vars)));
// Check permission and make sure the last post was not already bumped
if (!$auth->acl_get('f_bump', $forum_id) || $topic_bumped)
@ -311,6 +331,28 @@ function bump_topic_allowed($forum_id, $topic_bumped, $last_post_time, $topic_po
return false;
}
/**
* Event to run code after the topic bump checks
*
* @event core.bump_topic_allowed_after
* @var int forum_id ID of the forum
* @var int topic_bumped Flag indicating if the topic was already bumped (0/1)
* @var int last_post_time The time of the topic last post
* @var int topic_poster User ID of the topic author
* @var int last_topic_poster User ID of the topic last post author
* @var int bump_time Bump time range
* @since 3.3.14-RC1
*/
$vars = [
'forum_id',
'topic_bumped',
'last_post_time',
'topic_poster',
'last_topic_poster',
'bump_time',
];
extract($phpbb_dispatcher->trigger_event('core.bump_topic_allowed_after', compact($vars)));
// A bump time of 0 will completely disable the bump feature... not intended but might be useful.
return $bump_time;
}
@ -324,121 +366,95 @@ function bump_topic_allowed($forum_id, $topic_bumped, $last_post_time, $topic_po
*
* @return string Context of the specified words separated by "..."
*/
function get_context(string $text, array $words, int $length = 400)
function get_context(string $text, array $words, int $length = 400): string
{
// first replace all whitespaces with single spaces
$text = preg_replace('/ +/', ' ', strtr($text, "\t\n\r\x0C ", ' '));
// we need to turn the entities back into their original form, to not cut the message in between them
$entities = array('&lt;', '&gt;', '&#91;', '&#93;', '&#46;', '&#58;', '&#058;');
$characters = array('<', '>', '[', ']', '.', ':', ':');
$text = str_replace($entities, $characters, $text);
$word_indizes = array();
if (count($words))
if ($length <= 0)
{
$match = '';
// find the starting indizes of all words
foreach ($words as $word)
{
if ($word)
{
if (preg_match('#(?:[^\w]|^)(' . $word . ')(?:[^\w]|$)#i', $text, $match))
{
if (empty($match[1]))
{
continue;
}
$pos = utf8_strpos($text, $match[1]);
if ($pos !== false)
{
$word_indizes[] = $pos;
}
}
}
}
unset($match);
if (count($word_indizes))
{
$word_indizes = array_unique($word_indizes);
sort($word_indizes);
$wordnum = count($word_indizes);
// number of characters on the right and left side of each word
$sequence_length = (int) ($length / (2 * $wordnum)) - 2;
$final_text = '';
$word = $j = 0;
$final_text_index = -1;
// cycle through every character in the original text
for ($i = $word_indizes[$word], $n = utf8_strlen($text); $i < $n; $i++)
{
// if the current position is the start of one of the words then append $sequence_length characters to the final text
if (isset($word_indizes[$word]) && ($i == $word_indizes[$word]))
{
if ($final_text_index < $i - $sequence_length - 1)
{
$final_text .= '... ' . preg_replace('#^([^ ]*)#', '', utf8_substr($text, $i - $sequence_length, $sequence_length));
}
else
{
// if the final text is already nearer to the current word than $sequence_length we only append the text
// from its current index on and distribute the unused length to all other sequenes
$sequence_length += (int) (($final_text_index - $i + $sequence_length + 1) / (2 * $wordnum));
$final_text .= utf8_substr($text, $final_text_index + 1, $i - $final_text_index - 1);
}
$final_text_index = $i - 1;
// add the following characters to the final text (see below)
$word++;
$j = 1;
}
if ($j > 0)
{
// add the character to the final text and increment the sequence counter
$final_text .= utf8_substr($text, $i, 1);
$final_text_index++;
$j++;
// if this is a whitespace then check whether we are done with this sequence
if (utf8_substr($text, $i, 1) == ' ')
{
// only check whether we have to exit the context generation completely if we haven't already reached the end anyway
if ($i + 4 < $n)
{
if (($j > $sequence_length && $word >= $wordnum) || utf8_strlen($final_text) > $length)
{
$final_text .= ' ...';
break;
}
}
else
{
// make sure the text really reaches the end
$j -= 4;
}
// stop context generation and wait for the next word
if ($j > $sequence_length)
{
$j = 0;
}
}
}
}
return str_replace($characters, $entities, $final_text);
}
return $text;
}
if (!count($words) || !count($word_indizes))
// We need to turn the entities back into their original form, to not cut the message in between them
$text = htmlspecialchars_decode($text);
// Replace all spaces/invisible characters with single spaces
$text = preg_replace("/[\p{Z}\h\v]+/u", ' ', $text);
$text_length = utf8_strlen($text);
// Get first occurrence of each word
$word_indexes = [];
foreach ($words as $word)
{
return str_replace($characters, $entities, ((utf8_strlen($text) >= $length + 3) ? utf8_substr($text, 0, $length) . '...' : $text));
$pos = utf8_stripos($text, $word);
if ($pos !== false)
{
$word_indexes[$pos] = $word;
}
}
if (!empty($word_indexes))
{
ksort($word_indexes);
// Size of the fragment of text per word
$num_indexes = count($word_indexes);
$characters_per_word = (int) ($length / $num_indexes) + 2; // 2 to leave one character of margin at the sides to don't cut words
// Get text fragment indexes
$fragments = [];
foreach ($word_indexes as $index => $word)
{
$word_length = utf8_strlen($word);
$start = max(0, min($text_length - 1 - $characters_per_word, (int) ($index + ($word_length / 2) - ($characters_per_word / 2))));
$end = $start + $characters_per_word;
// Check if we can merge this fragment into the previous fragment
if (!empty($fragments))
{
[$prev_start, $prev_end] = end($fragments);
if ($prev_end + $characters_per_word >= $index + $word_length)
{
array_pop($fragments);
$start = $prev_start;
$end = $prev_end + $characters_per_word;
}
}
$fragments[] = [$start, $end];
}
}
else
{
// There is no coincidences, so we just create a fragment with the first $length characters
$fragments[] = [0, $length];
$end = $length;
}
return '';
$output = [];
foreach ($fragments as [$start, $end])
{
$fragment = utf8_substr($text, $start, $end - $start + 1);
$fragment_start = 0;
$fragment_end = $end - $start + 1;
// Find the first valid alphanumeric character in the fragment to don't cut words
if ($start > 0 && preg_match('/[^\p{L}\p{N}][\p{L}\p{N}]/u', $fragment, $matches, PREG_OFFSET_CAPTURE))
{
$fragment_start = utf8_strlen(substr($fragment, 0, (int) $matches[0][1])) + 1;
}
// Find the last valid alphanumeric character in the fragment to don't cut words
if ($end < $text_length - 1 && preg_match_all('/[\p{L}\p{N}][^\p{L}\p{N}]/u', $fragment, $matches, PREG_OFFSET_CAPTURE))
{
$fragment_end = utf8_strlen(substr($fragment, 0, end($matches[0])[1]));
}
$output[] = utf8_substr($fragment, $fragment_start, $fragment_end - $fragment_start + 1);
}
return ($fragments[0][0] !== 0 ? '... ' : '') . utf8_htmlspecialchars(implode(' ... ', $output)) . ($end < $text_length - 1 ? ' ...' : '');
}
/**
@ -1260,19 +1276,7 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count_a
{
if ($config['img_display_inlined'])
{
if ($config['img_link_width'] || $config['img_link_height'])
{
try
{
$file_info = $storage_attachment->file_info($filename);
$display_cat = ($file_info->image_width <= $config['img_link_width'] && $file_info->image_height <= $config['img_link_height']) ? attachment_category::IMAGE : attachment_category::NONE;
}
catch (\Exception $e)
{
$display_cat = attachment_category::NONE;
}
}
$display_cat = attachment_category::IMAGE;
}
else
{

View file

@ -1595,7 +1595,7 @@ function phpbb_show_profile($data, $user_notes_enabled = false, $warn_user_enabl
if ($data['user_allow_viewonline'] || $auth->acl_get('u_viewonline'))
{
$last_active = (!empty($data['session_time'])) ? $data['session_time'] : $data['user_last_active'];
$last_active = $data['user_last_active'] ?: ($data['session_time'] ?? 0);
}
else
{

View file

@ -1417,22 +1417,22 @@ class smtp_class
global $user;
// Here we try to determine the *real* hostname (reverse DNS entry preferrably)
$local_host = $user->host;
if (function_exists('php_uname'))
if (function_exists('php_uname') && !empty($local_host = php_uname('n')))
{
$local_host = php_uname('n');
// Able to resolve name to IP
if (($addr = @gethostbyname($local_host)) !== $local_host)
{
// Able to resolve IP back to name
if (($name = @gethostbyaddr($addr)) !== $addr)
if (!empty($name = @gethostbyaddr($addr)) && $name !== $addr)
{
$local_host = $name;
}
}
}
else
{
$local_host = $user->host;
}
// If we are authenticating through pop-before-smtp, we
// have to login ones before we get authenticated

View file

@ -480,7 +480,7 @@ class p_master
*/
function set_active($id = false, $mode = false)
{
global $request;
global $auth, $request, $user;
$icat = false;
$this->active_module = false;
@ -502,6 +502,14 @@ class p_master
$id = $this->p_class . '_' . $id;
}
// Fallback to acp main page for special test permission mode
if ($this->p_class === 'acp' && $user->data['user_perm_from'] && $auth->acl_get('a_switchperm'))
{
$id = '';
$mode = '';
$icat = false;
}
$category = false;
foreach ($this->module_ary as $row_id => $item_ary)
{

View file

@ -1691,7 +1691,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
}
// First of all make sure the subject are having the correct length.
$subject = truncate_string($subject);
$subject = truncate_string($subject, $mode === 'post' ? 120 : 124);
$db->sql_transaction('begin');

View file

@ -284,6 +284,7 @@ class mcp_queue
$post_data = array(
'S_MCP_QUEUE' => true,
'U_APPROVE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;p=$post_id"),
'S_CAN_APPROVE' => $auth->acl_get('m_approve', $post_info['forum_id']),
'S_CAN_DELETE_POST' => $auth->acl_get('m_delete', $post_info['forum_id']),
'S_CAN_VIEWIP' => $auth->acl_get('m_info', $post_info['forum_id']),
'S_POST_REPORTED' => $post_info['post_reported'],

View file

@ -1179,8 +1179,6 @@ class parse_message extends bbcode_firstpass
// Set some config values
$parser->set_vars(array(
'max_font_size' => $config['max_' . $this->mode . '_font_size'],
'max_img_height' => $config['max_' . $this->mode . '_img_height'],
'max_img_width' => $config['max_' . $this->mode . '_img_width'],
'max_smilies' => $config['max_' . $this->mode . '_smilies'],
'max_urls' => $config['max_' . $this->mode . '_urls']
));

View file

@ -361,8 +361,6 @@ class phpbb_questionnaire_phpbb_data_provider
'hot_threshold' => true,
'img_create_thumbnail' => true,
'img_display_inlined' => true,
'img_link_height' => true,
'img_link_width' => true,
'img_max_height' => true,
'img_max_thumb_width' => true,
'img_max_width' => true,
@ -406,8 +404,6 @@ class phpbb_questionnaire_phpbb_data_provider
'max_reg_attempts' => true,
'max_sig_chars' => true,
'max_sig_font_size' => true,
'max_sig_img_height' => true,
'max_sig_img_width' => true,
'max_sig_smilies' => true,
'max_sig_urls' => true,
'min_name_chars' => true,

View file

@ -235,8 +235,10 @@ class ucp_register
// The CAPTCHA kicks in here. We can't help that the information gets lost on language change.
if ($config['enable_confirm'])
{
$captcha = $phpbb_container->get('captcha.factory')->get_instance($config['captcha_plugin']);
$captcha->init(CONFIRM_REG);
/** @var \phpbb\captcha\factory $captcha_factory */
$captcha_factory = $phpbb_container->get('captcha.factory');
$captcha = $captcha_factory->get_instance($config['captcha_plugin']);
$captcha->init(\phpbb\captcha\plugins\confirm_type::REGISTRATION);
}
$timezone = $config['board_timezone'];
@ -291,10 +293,9 @@ class ucp_register
if ($config['enable_confirm'])
{
$vc_response = $captcha->validate($data);
if ($vc_response !== false)
if ($captcha->validate() !== true)
{
$error[] = $vc_response;
$error[] = $captcha->get_error();
}
if ($config['max_reg_attempts'] && $captcha->get_attempt_count() > $config['max_reg_attempts'])
@ -426,7 +427,7 @@ class ucp_register
}
// Okay, captcha, your job is done.
if ($config['enable_confirm'] && isset($captcha))
if ($config['enable_confirm'])
{
$captcha->reset();
}

View file

@ -72,6 +72,22 @@ function utf8_strpos($str, $needle, $offset = null)
}
}
/**
* UTF-8 aware alternative to stripos
* @ignore
*/
function utf8_stripos($str, $needle, $offset = null)
{
if (is_null($offset))
{
return mb_stripos($str, $needle);
}
else
{
return mb_stripos($str, $needle, $offset);
}
}
/**
* UTF-8 aware alternative to strtolower
* @ignore

View file

@ -1420,9 +1420,9 @@ function phpbb_attachment_extension_group_name()
$result = $db->sql_query($sql);
$extension_groups_updated = array();
while ($lang_dir = $db->sql_fetchfield('lang_dir'))
while ($row = $db->sql_fetchrow($result))
{
$lang_dir = basename($lang_dir);
$lang_dir = basename($row['lang_dir']);
$lang_file = $phpbb_root_path . 'language/' . $lang_dir . '/acp/attachments.' . $phpEx;
if (!file_exists($lang_file))
@ -1676,8 +1676,6 @@ function phpbb_import_attach_config()
$config->set('img_display_inlined', $attach_config['img_display_inlined']);
$config->set('img_max_width', $attach_config['img_max_width']);
$config->set('img_max_height', $attach_config['img_max_height']);
$config->set('img_link_width', $attach_config['img_link_width']);
$config->set('img_link_height', $attach_config['img_link_height']);
$config->set('img_create_thumbnail', $attach_config['img_create_thumbnail']);
$config->set('img_max_thumb_width', 400);
$config->set('img_min_thumb_filesize', $attach_config['img_min_thumb_filesize']);

View file

@ -77,6 +77,9 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('captcha_gd_wave',
INSERT INTO phpbb_config (config_name, config_value) VALUES ('captcha_gd_x_grid', '25');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('captcha_gd_y_grid', '25');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('captcha_plugin', 'core.captcha.plugins.incomplete');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('captcha_turnstile_sitekey', '');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('captcha_turnstile_secret', '');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('captcha_turnstile_theme', 'light');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('check_attachment_content', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('check_dnsbl', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('chg_passforce', '0');
@ -155,8 +158,6 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('hot_threshold', '2
INSERT INTO phpbb_config (config_name, config_value) VALUES ('icons_path', 'images/icons');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_create_thumbnail', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_display_inlined', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_link_height', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_link_width', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_max_height', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_max_thumb_width', '400');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_max_width', '0');
@ -227,8 +228,6 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_quote_depth',
INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_reg_attempts', '5');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_sig_chars', '255');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_sig_font_size', '200');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_sig_img_height', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_sig_img_width', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_sig_smilies', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_sig_urls', '5');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('mention_batch_size', '50');
@ -284,6 +283,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('site_desc', '{L_CO
INSERT INTO phpbb_config (config_name, config_value) VALUES ('site_home_text', '');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('site_home_url', '');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('sitename', '{L_CONFIG_SITENAME}');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('sitename_short', '');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('smilies_path', 'images/smilies');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('smilies_per_page', '50');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('smtp_allow_self_signed', '0');
@ -712,60 +712,60 @@ INSERT INTO phpbb_posts (topic_id, forum_id, poster_id, icon_id, post_time, post
INSERT INTO phpbb_topics_posted (user_id, topic_id, topic_posted) VALUES (2, 1, 1);
# -- Smilies
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':D', 'icon_e_biggrin.gif', '{L_SMILIES_VERY_HAPPY}', 15, 17, 1);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-D', 'icon_e_biggrin.gif', '{L_SMILIES_VERY_HAPPY}', 15, 17, 2);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':grin:', 'icon_e_biggrin.gif', '{L_SMILIES_VERY_HAPPY}', 15, 17, 3);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':)', 'icon_e_smile.gif', '{L_SMILIES_SMILE}', 15, 17, 4);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-)', 'icon_e_smile.gif', '{L_SMILIES_SMILE}', 15, 17, 5);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':smile:', 'icon_e_smile.gif', '{L_SMILIES_SMILE}', 15, 17, 6);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (';)', 'icon_e_wink.gif', '{L_SMILIES_WINK}', 15, 17, 7);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (';-)', 'icon_e_wink.gif', '{L_SMILIES_WINK}', 15, 17, 8);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':wink:', 'icon_e_wink.gif', '{L_SMILIES_WINK}', 15, 17, 9);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':(', 'icon_e_sad.gif', '{L_SMILIES_SAD}', 15, 17, 10);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-(', 'icon_e_sad.gif', '{L_SMILIES_SAD}', 15, 17, 11);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':sad:', 'icon_e_sad.gif', '{L_SMILIES_SAD}', 15, 17, 12);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':o', 'icon_e_surprised.gif', '{L_SMILIES_SURPRISED}', 15, 17, 13);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-o', 'icon_e_surprised.gif', '{L_SMILIES_SURPRISED}', 15, 17, 14);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':eek:', 'icon_e_surprised.gif', '{L_SMILIES_SURPRISED}', 15, 17, 15);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':shock:', 'icon_eek.gif', '{L_SMILIES_SHOCKED}', 15, 17, 16);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':?', 'icon_e_confused.gif', '{L_SMILIES_CONFUSED}', 15, 17, 17);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-?', 'icon_e_confused.gif', '{L_SMILIES_CONFUSED}', 15, 17, 18);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':???:', 'icon_e_confused.gif', '{L_SMILIES_CONFUSED}', 15, 17, 19);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES ('8-)', 'icon_cool.gif', '{L_SMILIES_COOL}', 15, 17, 20);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':cool:', 'icon_cool.gif', '{L_SMILIES_COOL}', 15, 17, 21);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':lol:', 'icon_lol.gif', '{L_SMILIES_LAUGHING}', 15, 17, 22);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':x', 'icon_mad.gif', '{L_SMILIES_MAD}', 15, 17, 23);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-x', 'icon_mad.gif', '{L_SMILIES_MAD}', 15, 17, 24);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':mad:', 'icon_mad.gif', '{L_SMILIES_MAD}', 15, 17, 25);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':P', 'icon_razz.gif', '{L_SMILIES_RAZZ}', 15, 17, 26);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-P', 'icon_razz.gif', '{L_SMILIES_RAZZ}', 15, 17, 27);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':razz:', 'icon_razz.gif', '{L_SMILIES_RAZZ}', 15, 17, 28);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':oops:', 'icon_redface.gif', '{L_SMILIES_EMARRASSED}', 15, 17, 29);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':cry:', 'icon_cry.gif', '{L_SMILIES_CRYING}', 15, 17, 30);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':evil:', 'icon_evil.gif', '{L_SMILIES_EVIL}', 15, 17, 31);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':twisted:', 'icon_twisted.gif', '{L_SMILIES_TWISTED_EVIL}', 15, 17, 32);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':roll:', 'icon_rolleyes.gif', '{L_SMILIES_ROLLING_EYES}', 15, 17, 33);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':!:', 'icon_exclaim.gif', '{L_SMILIES_EXCLAMATION}', 15, 17, 34);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':?:', 'icon_question.gif', '{L_SMILIES_QUESTION}', 15, 17, 35);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':idea:', 'icon_idea.gif', '{L_SMILIES_IDEA}', 15, 17, 36);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':arrow:', 'icon_arrow.gif', '{L_SMILIES_ARROW}', 15, 17, 37);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':|', 'icon_neutral.gif', '{L_SMILIES_NEUTRAL}', 15, 17, 38);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-|', 'icon_neutral.gif', '{L_SMILIES_NEUTRAL}', 15, 17, 39);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':mrgreen:', 'icon_mrgreen.gif', '{L_SMILIES_MR_GREEN}', 15, 17, 40);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':geek:', 'icon_e_geek.gif', '{L_SMILIES_GEEK}', 17, 17, 41);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':ugeek:', 'icon_e_ugeek.gif', '{L_SMILIES_UBER_GEEK}', 17, 18, 42);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':D', 'icon_e_biggrin.svg', '{L_SMILIES_VERY_HAPPY}', 15, 17, 1);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-D', 'icon_e_biggrin.svg', '{L_SMILIES_VERY_HAPPY}', 15, 17, 2);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':grin:', 'icon_e_biggrin.svg', '{L_SMILIES_VERY_HAPPY}', 15, 17, 3);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':)', 'icon_e_smile.svg', '{L_SMILIES_SMILE}', 15, 17, 4);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-)', 'icon_e_smile.svg', '{L_SMILIES_SMILE}', 15, 17, 5);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':smile:', 'icon_e_smile.svg', '{L_SMILIES_SMILE}', 15, 17, 6);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (';)', 'icon_e_wink.svg', '{L_SMILIES_WINK}', 15, 17, 7);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (';-)', 'icon_e_wink.svg', '{L_SMILIES_WINK}', 15, 17, 8);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':wink:', 'icon_e_wink.svg', '{L_SMILIES_WINK}', 15, 17, 9);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':(', 'icon_e_sad.svg', '{L_SMILIES_SAD}', 15, 17, 10);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-(', 'icon_e_sad.svg', '{L_SMILIES_SAD}', 15, 17, 11);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':sad:', 'icon_e_sad.svg', '{L_SMILIES_SAD}', 15, 17, 12);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':o', 'icon_e_surprised.svg', '{L_SMILIES_SURPRISED}', 15, 17, 13);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-o', 'icon_e_surprised.svg', '{L_SMILIES_SURPRISED}', 15, 17, 14);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':eek:', 'icon_e_surprised.svg', '{L_SMILIES_SURPRISED}', 15, 17, 15);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':shock:', 'icon_eek.svg', '{L_SMILIES_SHOCKED}', 15, 17, 16);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':?', 'icon_e_confused.svg', '{L_SMILIES_CONFUSED}', 15, 17, 17);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-?', 'icon_e_confused.svg', '{L_SMILIES_CONFUSED}', 15, 17, 18);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':???:', 'icon_e_confused.svg', '{L_SMILIES_CONFUSED}', 15, 17, 19);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES ('8-)', 'icon_cool.svg', '{L_SMILIES_COOL}', 15, 17, 20);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':cool:', 'icon_cool.svg', '{L_SMILIES_COOL}', 15, 17, 21);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':lol:', 'icon_lol.svg', '{L_SMILIES_LAUGHING}', 15, 17, 22);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':x', 'icon_mad.svg', '{L_SMILIES_MAD}', 15, 17, 23);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-x', 'icon_mad.svg', '{L_SMILIES_MAD}', 15, 17, 24);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':mad:', 'icon_mad.svg', '{L_SMILIES_MAD}', 15, 17, 25);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':P', 'icon_razz.svg', '{L_SMILIES_RAZZ}', 15, 17, 26);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-P', 'icon_razz.svg', '{L_SMILIES_RAZZ}', 15, 17, 27);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':razz:', 'icon_razz.svg', '{L_SMILIES_RAZZ}', 15, 17, 28);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':oops:', 'icon_redface.svg', '{L_SMILIES_EMARRASSED}', 15, 17, 29);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':cry:', 'icon_cry.svg', '{L_SMILIES_CRYING}', 15, 17, 30);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':evil:', 'icon_evil.svg', '{L_SMILIES_EVIL}', 15, 17, 31);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':twisted:', 'icon_twisted.svg', '{L_SMILIES_TWISTED_EVIL}', 15, 17, 32);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':roll:', 'icon_rolleyes.svg', '{L_SMILIES_ROLLING_EYES}', 15, 17, 33);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':!:', 'icon_exclaim.svg', '{L_SMILIES_EXCLAMATION}', 15, 17, 34);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':?:', 'icon_question.svg', '{L_SMILIES_QUESTION}', 15, 17, 35);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':idea:', 'icon_idea.svg', '{L_SMILIES_IDEA}', 15, 17, 36);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':arrow:', 'icon_arrow.svg', '{L_SMILIES_ARROW}', 15, 17, 37);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':|', 'icon_neutral.svg', '{L_SMILIES_NEUTRAL}', 15, 17, 38);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':-|', 'icon_neutral.svg', '{L_SMILIES_NEUTRAL}', 15, 17, 39);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':mrgreen:', 'icon_mrgreen.svg', '{L_SMILIES_MR_GREEN}', 15, 17, 40);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':geek:', 'icon_e_geek.svg', '{L_SMILIES_GEEK}', 17, 17, 41);
INSERT INTO phpbb_smilies (code, smiley_url, emotion, smiley_width, smiley_height, smiley_order) VALUES (':ugeek:', 'icon_e_ugeek.svg', '{L_SMILIES_UBER_GEEK}', 17, 18, 42);
# -- icons
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('misc/fire.gif', 16, 16, 1, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('smile/redface.gif', 16, 16, 9, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('smile/mrgreen.gif', 16, 16, 10, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('misc/heart.gif', 16, 16, 4, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('misc/star.gif', 16, 16, 2, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('misc/radioactive.gif', 16, 16, 3, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('misc/thinking.gif', 16, 16, 5, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('smile/info.gif', 16, 16, 8, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('smile/question.gif', 16, 16, 6, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('smile/alert.gif', 16, 16, 7, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('misc/fire.svg', 16, 16, 1, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('smile/redface.svg', 16, 16, 9, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('smile/mrgreen.svg', 16, 16, 10, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('misc/heart.svg', 16, 16, 4, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('misc/star.svg', 16, 16, 2, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('misc/radioactive.svg', 16, 16, 3, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('misc/thinking.svg', 16, 16, 5, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('smile/info.svg', 16, 16, 8, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('smile/question.svg', 16, 16, 6, 1);
INSERT INTO phpbb_icons (icons_url, icons_width, icons_height, icons_order, display_on_posting) VALUES ('smile/alert.svg', 16, 16, 7, 1);
# -- reasons
INSERT INTO phpbb_reports_reasons (reason_title, reason_description, reason_order) VALUES ('warez', '{L_REPORT_WAREZ}', 1);

View file

@ -51,7 +51,15 @@ function installer_msg_handler($errno, $msg_text, $errfile, $errline): bool
{
global $phpbb_installer_container, $msg_long_text;
if (error_reporting() == 0)
// Acording to https://www.php.net/manual/en/language.operators.errorcontrol.php
// error_reporting() return a different error code inside the error handler after php 8.0
$suppresed = E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE;
if (PHP_VERSION_ID < 80000)
{
$suppresed = 0;
}
if (error_reporting() == $suppresed)
{
return true;
}

View file

@ -111,8 +111,6 @@ $lang = array_merge($lang, array(
'GO_TO_EXTENSIONS' => 'Go to extension management screen',
'GROUP_NAME' => 'Group name',
'IMAGE_LINK_SIZE' => 'Image link dimensions',
'IMAGE_LINK_SIZE_EXPLAIN' => 'Display image attachment as an inline text link if image is larger than this. To disable this behaviour, set the values to 0px by 0px.',
'IMAGE_QUALITY' => 'Quality of uploaded image attachments (JPEG only)',
'IMAGE_QUALITY_EXPLAIN' => 'Specify value between 50% (smaller file size) and 90% (higher quality). Quality higher than 90% increases filesize and is disabled. Setting only applies if maximum image dimensions are set to a value other than 0px by 0px.',
'IMAGE_STRIP_METADATA' => 'Strip image metadata (JPEG only)',

View file

@ -69,6 +69,8 @@ $lang = array_merge($lang, array(
'SITE_HOME_URL' => 'Main website URL',
'SITE_HOME_URL_EXPLAIN' => 'If specified, a link to this URL will be prepended to your boards breadcrumbs and the board logo will link to this URL instead of the forum index. An absolute URL is required, e.g. <samp>http://www.phpbb.com</samp>.',
'SITE_NAME' => 'Site name',
'SITE_NAME_SHORT' => 'Short site name',
'SITE_NAME_SHORT_EXPLAIN' => 'Short name will be used if your site is added to a mobile devices home screen. It can not exceed 12 characters (Emoji is supported).',
'SYSTEM_TIMEZONE' => 'Guest timezone',
'SYSTEM_TIMEZONE_EXPLAIN' => 'Timezone to use for displaying times to users who are not logged in (guests, bots). Logged in users set their timezone during registration and can change it in their user control panel.',
'WARNINGS_EXPIRE' => 'Warning duration',
@ -206,10 +208,6 @@ $lang = array_merge($lang, array(
'MAX_SIG_FONT_SIZE' => 'Maximum signature font size',
'MAX_SIG_FONT_SIZE_EXPLAIN' => 'Maximum font size allowed in user signatures. Set to 0 for unlimited size.',
'MAX_SIG_IMG_HEIGHT' => 'Maximum signature image height',
'MAX_SIG_IMG_HEIGHT_EXPLAIN' => 'Maximum height of an image file in user signatures. Set to 0 for unlimited height.',
'MAX_SIG_IMG_WIDTH' => 'Maximum signature image width',
'MAX_SIG_IMG_WIDTH_EXPLAIN' => 'Maximum width of an image file in user signatures. Set to 0 for unlimited width.',
'MAX_SIG_LENGTH' => 'Maximum signature length',
'MAX_SIG_LENGTH_EXPLAIN' => 'Maximum number of characters in user signatures.',
'MAX_SIG_SMILIES' => 'Maximum smilies per signature',
@ -472,8 +470,8 @@ $lang = array_merge($lang, array(
'SMILIES_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/smilies</samp>.',
'UPLOAD_ICONS_PATH' => 'Extension group icons storage path',
'UPLOAD_ICONS_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/upload_icons</samp>.',
'USE_SYSTEM_CRON' => 'Run periodic tasks from system cron',
'USE_SYSTEM_CRON_EXPLAIN' => 'When off, phpBB will arrange for periodic tasks to be run automatically. When on, phpBB will not schedule any periodic tasks by itself; a system administrator must arrange for <code>bin/phpbbcli.php cron:run</code> to be run by the system cron facility at regular intervals (e.g. every 5 minutes).',
'USE_SYSTEM_CRON' => 'Run periodic tasks from operating system cron',
'USE_SYSTEM_CRON_EXPLAIN' => 'When disabled, phpBB will arrange for periodic tasks to be run automatically. When enabled, phpBB will not schedule any periodic tasks by itself; a system administrator must arrange for <code>bin/phpbbcli.php cron:run</code> to be run by the operating system cron facility at regular intervals (e.g. every 5 minutes).',
));
// Security Settings

View file

@ -36,14 +36,15 @@ if (empty($lang) || !is_array($lang))
$lang = array_merge($lang, array(
'EXTENSION_ALREADY_INSTALLED' => 'The “%s” extension has already been installed.',
'EXTENSION_ALREADY_INSTALLED_MANUALLY' => 'The “%s” extension has already been installed manually.',
'EXTENSION_ALREADY_MANAGED' => 'The “%s” extension is already managed.',
'EXTENSION_CANNOT_MANAGE_FILESYSTEM_ERROR' => 'The “%s” extension cannot be managed because the existing files could not be removed from the filesystem.',
'EXTENSION_CANNOT_MANAGE_INSTALL_ERROR' => 'The “%s” extension could not be installed. The prior installation of this extension has been restored.',
'EXTENSION_MANAGED_WITH_CLEAN_ERROR' => 'The “%1$s” extension has been installed but an error occurred and the old files could not be removed. You might want to delete the “%2$s” files manually.',
'EXTENSION_MANAGED_WITH_ENABLE_ERROR' => 'The “%s” extension has been installed but an error occurred while enabling it.',
'EXTENSION_NOT_INSTALLED' => 'The “%s” extension is not installed.',
'EXTENSIONS_ALREADY_INSTALLED' => 'The “%s” extension has already been installed.',
'EXTENSIONS_ALREADY_INSTALLED_MANUALLY' => 'The “%s” extension has already been installed manually.',
'EXTENSIONS_ALREADY_MANAGED' => 'The “%s” extension is already managed.',
'EXTENSIONS_CANNOT_MANAGE_FILESYSTEM_ERROR' => 'The “%s” extension cannot be managed because the existing files could not be removed from the filesystem.',
'EXTENSIONS_CANNOT_MANAGE_INSTALL_ERROR' => 'The “%s” extension could not be installed. The prior installation of this extension has been restored.',
'EXTENSIONS_MANAGED_WITH_CLEAN_ERROR' => 'The “%1$s” extension has been installed but an error occurred and the old files could not be removed. You might want to delete the “%2$s” files manually.',
'EXTENSIONS_MANAGED_WITH_ENABLE_ERROR' => 'The “%s” extension has been installed but an error occurred while enabling it.',
'EXTENSIONS_NOT_INSTALLED' => 'The “%s” extension is not installed.',
'EXTENSIONS_NOT_MANAGED' => 'The “%s” extension is not being managed.',
'ENABLING_EXTENSIONS' => 'Enabling extensions',
'DISABLING_EXTENSIONS' => 'Disabling extensions',
@ -62,8 +63,9 @@ $lang = array_merge($lang, array(
'DETAILS' => 'Details',
'EXTENSIONS_DISABLED' => 'Disabled Extensions',
'EXTENSIONS_ENABLED' => 'Enabled Extensions',
'EXTENSIONS_NOT_INSTALLED' => 'Not installed Extensions',
'EXTENSIONS_DISABLED' => 'Disabled Extensions',
'EXTENSIONS_ENABLED' => 'Enabled Extensions',
'EXTENSION_DELETE_DATA' => 'Delete data',
'EXTENSION_DISABLE' => 'Disable',
@ -74,6 +76,8 @@ $lang = array_merge($lang, array(
'EXTENSION_DELETE_DATA_EXPLAIN' => 'Deleting an extensions data removes all of its data and settings. The extension files are retained so it can be enabled again.',
'EXTENSION_DISABLE_EXPLAIN' => 'Disabling an extension retains its files, data and settings but removes any functionality added by the extension.',
'EXTENSION_ENABLE_EXPLAIN' => 'Enabling an extension allows you to use it on your board.',
'EXTENSION_REMOVE_EXPLAIN' => 'Removing an extension removes all of its files, data and settings.',
'EXTENSION_UPDATE_EXPLAIN' => 'Updating an extension will install the latest version compatible with your board, removing old files and replacing them with new ones, and updating the database if necessary.',
'EXTENSION_DELETE_DATA_IN_PROGRESS' => 'The extensions data is currently being deleted. Please do not leave or refresh this page until it is completed.',
'EXTENSION_DISABLE_IN_PROGRESS' => 'The extension is currently being disabled. Please do not leave or refresh this page until it is completed.',
@ -86,25 +90,25 @@ $lang = array_merge($lang, array(
'EXTENSION_NAME' => 'Extension Name',
'EXTENSION_ACTIONS' => 'Actions',
'EXTENSION_OPTIONS' => 'Options',
'EXTENSION_INSTALL_HEADLINE'=> 'Installing an extension',
'EXTENSION_INSTALL_EXPLAIN' => '<ol>
<li>Download an extension from phpBBs extensions database</li>
<li>Unzip the extension and upload it to the <samp>ext/</samp> directory of your phpBB board</li>
<li>Enable the extension, here in the Extensions manager</li>
</ol>',
'EXTENSION_UPDATE_HEADLINE' => 'Updating an extension',
'EXTENSION_UPDATE_EXPLAIN' => '<ol>
<li>Disable the extension</li>
<li>Delete the extensions files from the filesystem</li>
<li>Upload the new files</li>
<li>Enable the extension</li>
</ol>',
'EXTENSION_REMOVE_HEADLINE' => 'Completely removing an extension from your board',
'EXTENSION_REMOVE_EXPLAIN' => '<ol>
<li>Disable the extension</li>
<li>Delete the extensions data</li>
<li>Delete the extensions files from the filesystem</li>
</ol>',
'EXTENSION_INSTALLING_HEADLINE' => 'Installing an extension',
'EXTENSION_INSTALLING_EXPLAIN' => [
0 => 'Download an extension from phpBBs extensions database',
1 => 'Unzip the extension and upload it to the <samp>ext/</samp> directory of your phpBB board',
2 => 'Enable the extension, here in the Extensions manager',
],
'EXTENSION_REMOVING_HEADLINE' => 'Deleting an extension from your board',
'EXTENSION_REMOVING_EXPLAIN' => [
0 => 'Disable the extension',
1 => 'Delete the extensions data',
2 => 'Delete the extensions files from the filesystem',
],
'EXTENSION_UPDATING_HEADLINE' => 'Updating an extension',
'EXTENSION_UPDATING_EXPLAIN' => [
0 => 'Disable the extension',
1 => 'Delete the extensions files from the filesystem',
2 => 'Upload the new files',
3 => 'Enable the extension',
],
'EXTENSION_DELETE_DATA_CONFIRM' => 'Are you sure that you wish to delete the data associated with “%s”?<br /><br />This removes all of its data and settings and cannot be undone!',
'EXTENSION_DISABLE_CONFIRM' => 'Are you sure that you wish to disable the “%s” extension?',

View file

@ -88,6 +88,20 @@ $lang = array_merge($lang, array(
'LOCAL_URL' => 'A local URL. The URL must be relative to the topic page and cannot contain a server name or protocol, as links are prefixed with “%s”',
'RELATIVE_URL' => 'A relative URL. You can use this to match parts of a URL, but be careful: a full URL is a valid relative URL. When you want to use relative URLs of your board, use the LOCAL_URL token.',
'COLOR' => 'A HTML colour, can be either in the numeric form <samp>#FF1234</samp> or a <a href="http://www.w3.org/TR/CSS21/syndata.html#value-def-color">CSS colour keyword</a> such as <samp>fuchsia</samp> or <samp>InactiveBorder</samp>',
'ALNUM' => 'Characters from the latin alphabet (A-Z) and numbers.',
'CHOICE' => 'A choice of specified values, e.g. <samp>{CHOICE=spades,hearts,diamonds,clubs}</samp>. The values are treated as case-insensitive by default and can be treated case-sensitive by specifying the <samp>caseSensitive</samp> option: <samp>{CHOICE=Spades,Hearts,Diamonds,Clubs;caseSensitive}</samp>',
'FLOAT' => 'A decimal value, e.g. <samp>0.5</samp>.',
'HASHMAP' => 'Maps strings to their replacement in the form <samp>{HASHMAP=string1:replacement1,string2:replacement2}</samp>. Case-sensitive. Preserves unknown values by default.',
'INT' => 'An integer value, e.g. <samp>2</samp>.',
'IP' => 'A valid IPv4 or IPv6 address.',
'IPPORT' => 'A valid IPv4 or IPv6 address with port number.',
'IPV4' => 'A valid IPv4 address.',
'IPV6' => 'A valid IPv6 address.',
'MAP' => 'Maps strings to their replacement in the form <samp>{MAP=string1:replacement1,string2:replacement2}</samp>. Case-insensitive. Preserves unknown values by default.',
'RANGE' => 'Accepts an integer in the given range, e.g. <samp>{RANGE=-10,42}</samp>.',
'REGEXP' => 'Validates its value against a given regexp, e.g. <samp>{REGEXP=/^foo\w+bar$/}</samp>.',
'TIMESTAMP' => 'A timestamp such as <samp>1h30m10s</samp> which will be converted to a number of seconds. Also accepts a number.',
'UINT' => 'An unsigned integer value. Same as <samp>{INT}</samp>, but rejects values less than 0.',
),
));

View file

@ -61,4 +61,5 @@ $lang = array_merge($lang, array(
'QA_ERROR_MSG' => 'Please fill in all fields and enter at least one answer.',
'QA_LAST_QUESTION' => 'You cannot delete all questions while the plugin is active.',
'QA_NO_QUESTIONS' => 'There are no questions yet.',
));

View file

@ -0,0 +1,53 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
/**
* DO NOT CHANGE
*/
if (!defined('IN_PHPBB'))
{
exit;
}
if (empty($lang) || !is_array($lang))
{
$lang = [];
}
// DEVELOPERS PLEASE NOTE
//
// All language files should use UTF-8 as their encoding and the files must not contain a BOM.
//
// Placeholders can now contain order information, e.g. instead of
// 'Page %s of %s' you can (and should) write 'Page %1$s of %2$s', this allows
// translators to re-order the output of data while ensuring it remains correct
//
// You do not need this where single placeholders are used, e.g. 'Message %d' is fine
// equally where a string contains only two placeholders which are used to wrap text
// in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
$lang = array_merge($lang, [
'CAPTCHA_TURNSTILE' => 'Turnstile',
'CAPTCHA_TURNSTILE_INCORRECT' => 'The solution you provided was incorrect',
'CAPTCHA_TURNSTILE_NOSCRIPT' => 'Please enable JavaScript in your browser to load the challenge.',
'CAPTCHA_TURNSTILE_NOT_AVAILABLE' => 'In order to use Turnstile you must create a <a href="https://www.cloudflare.com/products/turnstile/">Cloudflare account</a>.',
'CAPTCHA_TURNSTILE_SECRET' => 'Secret key',
'CAPTCHA_TURNSTILE_SECRET_EXPLAIN' => 'Your Turnstile secret key. The secret key can be retrieved from your <a href="https://dash.cloudflare.com/?to=/:account/turnstile">Cloudflare dashboard</a>.',
'CAPTCHA_TURNSTILE_SITEKEY' => 'Sitekey',
'CAPTCHA_TURNSTILE_SITEKEY_EXPLAIN' => 'Your Turnstile sitekey. The sitekey can be retrieved from your <a href="https://dash.cloudflare.com/?to=/:account/turnstile">Cloudflare dashboard</a>.',
'CAPTCHA_TURNSTILE_THEME' => 'Widget theme',
'CAPTCHA_TURNSTILE_THEME_EXPLAIN' => 'The theme of the CAPTCHA widget. By default, <samp>light</samp> will be used. Other possibilities are <samp>dark</samp> and <samp>auto</samp>, which respects the users preference.',
'CAPTCHA_TURNSTILE_THEME_AUTO' => 'Auto',
'CAPTCHA_TURNSTILE_THEME_DARK' => 'Dark',
'CAPTCHA_TURNSTILE_THEME_LIGHT' => 'Light',
]);

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