Compare commits

..

8 commits

Author SHA1 Message Date
Marc Alexander
ed943854ec
[ticket/17153] Use mocked user class in extension test
PHPBB3-17153
2023-09-22 13:08:52 +02:00
Marc Alexander
839d2ecbff
[ticket/17153] Add basic avatar config file for installer
It doesn't actually add proper avatar functionality to the installer but
provides the necessary base classes for templating.

PHPBB3-17153
2023-09-22 13:08:52 +02:00
Marc Alexander
7a4352fd72
[ticket/17153] Use routing helper instead of controller helper in upload avatar
The controller helper class is not needed, routing helper brings all the
needed functionality already.

PHPBB3-17153
2023-09-22 13:08:50 +02:00
Marc Alexander
58ae38f5a2
[ticket/17153] Remove phpbb_get_avatar()
PHPBB3-17153
2023-09-22 13:07:49 +02:00
Marc Alexander
c193140e1d
[ticket/17153] Remove get_user_avatar
PHPBB3-17153
2023-09-22 13:06:37 +02:00
Marc Alexander
7fcb455ec4
[ticket/17153] Remove phpbb_get_user_avatar
PHPBB3-17153
2023-09-22 13:06:37 +02:00
Marc Alexander
90d35b760f
[ticket/17153] Remove phpbb_get_group_avatar()
PHPBB3-17153
2023-09-22 13:06:37 +02:00
Marc Alexander
2f623770df
[ticket/17153] Use twig and avatar helper to render avatars
PHPBB3-17153
2023-09-22 13:06:36 +02:00
447 changed files with 18070 additions and 14080 deletions

View file

@ -30,7 +30,7 @@ installer:
server: server:
cookie_secure: false cookie_secure: false
server_protocol: http:// server_protocol: http://
force_server_vars: true force_server_vars: false
server_name: localhost server_name: localhost
server_port: 80 server_port: 80
script_path: / script_path: /

View file

@ -34,14 +34,6 @@ sudo ln -s /workspaces/phpbb/phpBB /var/www/html
echo "[Codespaces] Copy phpBB configuration" echo "[Codespaces] Copy phpBB configuration"
cp /workspaces/phpbb/.devcontainer/resources/phpbb-config.yml /workspaces/phpbb/phpBB/install/install-config.yml cp /workspaces/phpbb/.devcontainer/resources/phpbb-config.yml /workspaces/phpbb/phpBB/install/install-config.yml
# Force the server URL to reflect the Codespace
# https://docs.github.com/en/codespaces/developing-in-a-codespace/default-environment-variables-for-your-codespace
if [ "$CODESPACES" = true ] ; then
echo "[Codespaces] Set the phpBB server name using default environment variables"
codespaces_url="${CODESPACE_NAME}-80.${GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN}"
sed -i "s/localhost/$codespaces_url/g" /workspaces/phpbb/phpBB/install/install-config.yml
fi
# Install phpBB # Install phpBB
echo "[Codespaces] Run phpBB CLI installation" echo "[Codespaces] Run phpBB CLI installation"
cd /workspaces/phpbb/phpBB && composer install --no-interaction cd /workspaces/phpbb/phpBB && composer install --no-interaction

1
.github/check-js.sh vendored
View file

@ -15,5 +15,4 @@ sudo npm install -g > /dev/null
npm ci > /dev/null npm ci > /dev/null
set -x set -x
node_modules/eslint/bin/eslint.js "phpBB/**/*.js" node_modules/eslint/bin/eslint.js "phpBB/**/*.js"
node_modules/eslint/bin/eslint.js "phpBB/**/*.js.twig"
node_modules/eslint/bin/eslint.js "gulpfile.js" node_modules/eslint/bin/eslint.js "gulpfile.js"

View file

@ -29,7 +29,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v3
with: with:
fetch-depth: 100 fetch-depth: 100
@ -48,7 +48,7 @@ jobs:
cd .. cd ..
- name: Cache Composer dependencies - name: Cache Composer dependencies
uses: actions/cache@v4 uses: actions/cache@v3
with: with:
path: ${{ steps.composer-cache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }} key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }}
@ -166,7 +166,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v3
- id: database-type - id: database-type
env: env:
@ -192,7 +192,7 @@ jobs:
cd .. cd ..
- name: Cache Composer dependencies - name: Cache Composer dependencies
uses: actions/cache@v4 uses: actions/cache@v3
with: with:
path: ${{ steps.composer-cache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }} key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }}
@ -217,13 +217,6 @@ jobs:
run: | run: |
.github/setup-ldap.sh .github/setup-ldap.sh
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20
- name: Setup node dependencies
run: npm ci
- name: Setup SPHINX - name: Setup SPHINX
run: | run: |
.github/setup-sphinx.sh .github/setup-sphinx.sh
@ -303,7 +296,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v3
- id: database-type - id: database-type
env: env:
@ -329,7 +322,7 @@ jobs:
cd .. cd ..
- name: Cache Composer dependencies - name: Cache Composer dependencies
uses: actions/cache@v4 uses: actions/cache@v3
with: with:
path: ${{ steps.composer-cache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }} key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }}
@ -349,13 +342,6 @@ jobs:
run: | run: |
.github/setup-database.sh $DB $MYISAM .github/setup-database.sh $DB $MYISAM
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20
- name: Setup node dependencies
run: npm ci
- name: Run unit tests - name: Run unit tests
env: env:
DB: ${{steps.database-type.outputs.db}} DB: ${{steps.database-type.outputs.db}}
@ -410,7 +396,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v3
- id: database-type - id: database-type
env: env:
@ -441,7 +427,7 @@ jobs:
cd .. cd ..
- name: Cache Composer dependencies - name: Cache Composer dependencies
uses: actions/cache@v4 uses: actions/cache@v3
with: with:
path: ${{ steps.composer-cache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }} key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }}
@ -461,13 +447,6 @@ jobs:
run: | run: |
.github/setup-database.sh $DB $MYISAM .github/setup-database.sh $DB $MYISAM
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20
- name: Setup node dependencies
run: npm ci
- name: Run unit tests - name: Run unit tests
env: env:
DB: ${{steps.database-type.outputs.db}} DB: ${{steps.database-type.outputs.db}}
@ -491,7 +470,7 @@ jobs:
git config --system core.autocrlf false git config --system core.autocrlf false
git config --system core.eol lf git config --system core.eol lf
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v3
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
@ -509,7 +488,7 @@ jobs:
cd .. cd ..
- name: Cache Composer dependencies - name: Cache Composer dependencies
uses: actions/cache@v4 uses: actions/cache@v3
with: with:
path: ${{ steps.composer-cache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }} key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }}
@ -576,14 +555,6 @@ jobs:
psql -c 'create database phpbb_tests;' -U postgres psql -c 'create database phpbb_tests;' -U postgres
Set-MpPreference -ExclusionPath "${env:PGDATA}" # Exclude PGDATA directory from Windows Defender Set-MpPreference -ExclusionPath "${env:PGDATA}" # Exclude PGDATA directory from Windows Defender
Set-MpPreference -DisableRealtimeMonitoring $true Set-MpPreference -DisableRealtimeMonitoring $true
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20
- name: Setup node dependencies
run: npm ci
- name: Run unit tests - name: Run unit tests
if: ${{ matrix.type == 'unit' }} if: ${{ matrix.type == 'unit' }}
run: | run: |

View file

@ -3,8 +3,8 @@
<project name="phpBB" description="The phpBB forum software" default="all" basedir="../"> <project name="phpBB" description="The phpBB forum software" default="all" basedir="../">
<!-- a few settings for the build --> <!-- a few settings for the build -->
<property name="newversion" value="4.0.0-a1-dev" /> <property name="newversion" value="4.0.0-a1-dev" />
<property name="prevversion" value="3.3.12-RC1" /> <property name="prevversion" value="3.3.10" />
<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="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" />
<!-- no configuration should be needed beyond this point --> <!-- no configuration should be needed beyond this point -->
<property name="oldversions" value="${olderversions}, ${prevversion}" /> <property name="oldversions" value="${olderversions}, ${prevversion}" />

Binary file not shown.

Binary file not shown.

View file

@ -34,12 +34,6 @@ then
ticket_id=$(sed -E 's/(ticket\/)(security\/)?([0-9]+)(.+$)?/\3/gm;t;d' <<< "$branch"); ticket_id=$(sed -E 's/(ticket\/)(security\/)?([0-9]+)(.+$)?/\3/gm;t;d' <<< "$branch");
branch_title=$(sed -E 's/(ticket\/)(security\/)?([0-9]+)(.+$)?/\1\2\3/gm;t;d' <<< "$branch"); branch_title=$(sed -E 's/(ticket\/)(security\/)?([0-9]+)(.+$)?/\1\2\3/gm;t;d' <<< "$branch");
# Fall back to branch name if no ticket ID
if [ -z "$branch_title" ];
then
branch_title="$branch";
fi
if [ "security/" = "$(sed -E 's/(ticket\/)(security\/)?([0-9]+)(.+$)?/\2/gm;t;d' <<< "$branch")" ]; if [ "security/" = "$(sed -E 's/(ticket\/)(security\/)?([0-9]+)(.+$)?/\2/gm;t;d' <<< "$branch")" ];
then then
tail="$(printf '\n\nSECURITY-%s' "$ticket_id")"; tail="$(printf '\n\nSECURITY-%s' "$ticket_id")";

View file

@ -2,7 +2,8 @@
const gulp = require('gulp'); const gulp = require('gulp');
const rename = require('gulp-rename'); const rename = require('gulp-rename');
const concat = require('gulp-concat'); const sourcemaps = require('gulp-sourcemaps');
const concat = require('gulp-concat-css');
const postcss = require('gulp-postcss'); const postcss = require('gulp-postcss');
const autoprefixer = require('autoprefixer'); const autoprefixer = require('autoprefixer');
const cssnano = require('cssnano'); const cssnano = require('cssnano');
@ -18,14 +19,16 @@ const paths = {
}; };
function styles() { function styles() {
return gulp.src(paths.styles.src, { sourcemaps: true }) return gulp.src(paths.styles.src)
.pipe(sourcemaps.init())
.pipe( .pipe(
postcss([ postcss([
autoprefixer(), autoprefixer(),
sorting(sortOrder), sorting(sortOrder),
]), ]),
) )
.pipe(gulp.dest(paths.styles.css, { sourcemaps: './' })); .pipe(sourcemaps.write('./'))
.pipe(gulp.dest(paths.styles.css));
} }
function minify() { function minify() {
@ -44,7 +47,8 @@ function minify() {
paths.styles.css + 'colours.css', paths.styles.css + 'colours.css',
paths.styles.css + 'responsive.css', paths.styles.css + 'responsive.css',
paths.styles.css + 'bidi.css', paths.styles.css + 'bidi.css',
], { sourcemaps: true }) ])
.pipe(sourcemaps.init())
.pipe(concat('stylesheet.css')) .pipe(concat('stylesheet.css'))
.pipe( .pipe(
postcss([ postcss([
@ -55,7 +59,8 @@ function minify() {
suffix: '.min', suffix: '.min',
extname: '.css', extname: '.css',
})) }))
.pipe(gulp.dest(paths.styles.css, { sourcemaps: './' })); .pipe(sourcemaps.write('./'))
.pipe(gulp.dest(paths.styles.css));
} }
function watch() { function watch() {

9844
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -56,7 +56,11 @@
"always" "always"
], ],
"no-lonely-if": "off", "no-lonely-if": "off",
"unicorn/prefer-module": "off" "unicorn/prefer-module": "off",
"space-before-function-paren": [
"error",
"never"
]
}, },
"env": { "env": {
"es6": true, "es6": true,
@ -103,14 +107,14 @@
"cssnano": "^5.1.7", "cssnano": "^5.1.7",
"eslint": "^8.13.0", "eslint": "^8.13.0",
"eslint-config-xo": "^0.40.0", "eslint-config-xo": "^0.40.0",
"gulp": "^5.0.0", "gulp": "^4.0.2",
"gulp-concat": "^2.6.1", "gulp-concat-css": "^3.1.0",
"gulp-postcss": "^9.0.1", "gulp-postcss": "^9.0.1",
"gulp-rename": "^2.0.0", "gulp-rename": "^2.0.0",
"postcss": "^8.4.31", "gulp-sourcemaps": "^3.0.0",
"postcss": "^8.4.12",
"postcss-sorting": "^7.0.1", "postcss-sorting": "^7.0.1",
"stylelint": "^14.7.0", "stylelint": "^14.7.0",
"stylelint-order": "^5.0.0", "stylelint-order": "^5.0.0"
"web-push-testing": "^1.1.1"
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 826 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 708 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 681 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 725 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View file

@ -63,13 +63,12 @@ $template->set_custom_style(
], ],
[ [
$phpbb_admin_path . 'style', $phpbb_admin_path . 'style',
$phpbb_root_path . 'styles/all/imgs/',
$phpbb_root_path . 'styles/all/template/', $phpbb_root_path . 'styles/all/template/',
], ],
); );
$template->assign_var('T_ASSETS_PATH', $phpbb_path_helper->update_web_root_path($phpbb_root_path . 'assets')); $template->assign_var('T_ASSETS_PATH', $phpbb_root_path . 'assets');
$template->assign_var('T_TEMPLATE_PATH', $phpbb_path_helper->update_web_root_path($phpbb_root_path . 'style')); $template->assign_var('T_TEMPLATE_PATH', $phpbb_admin_path . 'style');
// Instantiate new module // Instantiate new module
$module = new p_master(); $module = new p_master();

View file

@ -17,52 +17,52 @@
<div class="avatar-cropper-buttons" id="avatar-cropper-buttons"> <div class="avatar-cropper-buttons" id="avatar-cropper-buttons">
<div class="button-group"> <div class="button-group">
<button class="button" type="button" title="{{ lang('ZOOM_IN') }}" data-cropper-action="zoom,0.1"> <button class="button" type="button" title="{{ lang('ZOOM_IN') }}" data-cropper-action="zoom,0.1">
{{ Icon('font', 'search-plus', '', true) }} <i class="icon fa-search-plus fa-fw"></i>
</button> </button>
<button class="button" type="button" title="{{ lang('ZOOM_OUT') }}" data-cropper-action="zoom,-0.1"> <button class="button" type="button" title="{{ lang('ZOOM_OUT') }}" data-cropper-action="zoom,-0.1">
{{ Icon('font', 'search-minus', '', true) }} <i class="icon fa-search-minus fa-fw"></i>
</button> </button>
</div> </div>
<div class="button-group"> <div class="button-group">
<button class="button" type="button" title="{{ lang('MOVE_LEFT') }}" data-cropper-action="move,-10,0"> <button class="button" type="button" title="{{ lang('MOVE_LEFT') }}" data-cropper-action="move,-10,0">
{{ Icon('font', 'arrow-left', '', true) }} <i class="icon fa-arrow-left fa-fw"></i>
</button> </button>
<button class="button" type="button" title="{{ lang('MOVE_RIGHT') }}" data-cropper-action="move,10,0"> <button class="button" type="button" title="{{ lang('MOVE_RIGHT') }}" data-cropper-action="move,10,0">
{{ Icon('font', 'arrow-right', '', true) }} <i class="icon fa-arrow-right fa-fw"></i>
</button> </button>
<button class="button" type="button" title="{{ lang('MOVE_UP') }}" data-cropper-action="move,0,-10"> <button class="button" type="button" title="{{ lang('MOVE_UP') }}" data-cropper-action="move,0,-10">
{{ Icon('font', 'arrow-up', '', true) }} <i class="icon fa-arrow-up fa-fw"></i>
</button> </button>
<button class="button" type="button" title="{{ lang('MOVE_DOWN') }}" data-cropper-action="move,0,10"> <button class="button" type="button" title="{{ lang('MOVE_DOWN') }}" data-cropper-action="move,0,10">
{{ Icon('font', 'arrow-down', '', true) }} <i class="icon fa-arrow-down fa-fw"></i>
</button> </button>
</div> </div>
<div class="button-group"> <div class="button-group">
<button class="button" type="button" title="{{ lang('ROTATE_LEFT') }}" data-cropper-action="rotate,-90"> <button class="button" type="button" title="{{ lang('ROTATE_LEFT') }}" data-cropper-action="rotate,-90">
{{ Icon('font', 'rotate-left', '', true) }} <i class="icon fa-rotate-left fa-fw"></i>
</button> </button>
<button class="button" type="button" title="{{ lang('ROTATE_RIGHT') }}" data-cropper-action="rotate,90"> <button class="button" type="button" title="{{ lang('ROTATE_RIGHT') }}" data-cropper-action="rotate,90">
{{ Icon('font', 'rotate-right', '', true) }} <i class="icon fa-rotate-right fa-fw"></i>
</button> </button>
</div> </div>
<div class="button-group"> <div class="button-group">
<button class="button" type="button" title="{{ lang('FLIP_HORIZONTALLY') }}" data-cropper-action="scaleX"> <button class="button" type="button" title="{{ lang('FLIP_HORIZONTALLY') }}" data-cropper-action="scaleX">
{{ Icon('font', 'arrows-left-right', '', true) }} <i class="icon fa-arrows-h fa-fw"></i>
</button> </button>
<button class="button" type="button" title="{{ lang('FLIP_VERTICALLY') }}" data-cropper-action="scaleY"> <button class="button" type="button" title="{{ lang('FLIP_VERTICALLY') }}" data-cropper-action="scaleY">
{{ Icon('font', 'arrows-up-down', '', true) }} <i class="icon fa-arrows-v fa-fw"></i>
</button> </button>
</div> </div>
<div class="button-group"> <div class="button-group">
<button class="button" type="button" title="{{ lang('RESET') }}" data-cropper-action="reset"> <button class="button" type="button" title="{{ lang('RESET') }}" data-cropper-action="reset">
{{ Icon('font', 'arrows-rotate', '', true) }} <i class="icon fa-refresh fa-fw"></i>
</button> </button>
<button class="button" type="button" title="{{ lang('CLEAR') }}" data-cropper-action="clear"> <button class="button" type="button" title="{{ lang('CLEAR') }}" data-cropper-action="clear">
{{ Icon('font', 'xmark', '', true) }} <i class="icon fa-times fa-fw"></i>
</button> </button>
</div> </div>
</div> </div>

View file

@ -11,11 +11,11 @@
<script> <script>
// <![CDATA[ // <![CDATA[
const ban_length = []; var ban_length = new Array();
ban_length[-1] = ''; ban_length[-1] = '';
const ban_reason = []; var ban_reason = new Array();
ban_reason[-1] = ''; ban_reason[-1] = '';
const ban_give_reason = []; var ban_give_reason = new Array();
ban_give_reason[-1] = ''; ban_give_reason[-1] = '';
<!-- BEGIN bans --> <!-- BEGIN bans -->
@ -43,19 +43,6 @@
} }
} }
document.addEventListener("DOMContentLoaded", () => {
const $unbanSelect = document.getElementById('unban');
if ($unbanSelect) {
$unbanSelect.addEventListener('change', function () {
if (this.selectedIndex > -1) {
display_details(this.options[this.selectedIndex].value);
} else {
display_details(-1);
}
});
}
});
// ]]> // ]]>
</script> </script>
@ -73,6 +60,11 @@
<dd><label for="banlength"><select name="banlength" id="banlength" onchange="if(this.value==-1){document.getElementById('banlengthother').style.display = 'block';}else{document.getElementById('banlengthother').style.display='none';}">{S_BAN_END_OPTIONS}</select></label></dd> <dd><label for="banlength"><select name="banlength" id="banlength" onchange="if(this.value==-1){document.getElementById('banlengthother').style.display = 'block';}else{document.getElementById('banlengthother').style.display='none';}">{S_BAN_END_OPTIONS}</select></label></dd>
<dd id="banlengthother" style="display: none;"><label><input type="text" name="banlengthother" class="inputbox" /><br /><span>{L_YEAR_MONTH_DAY}</span></label></dd> <dd id="banlengthother" style="display: none;"><label><input type="text" name="banlengthother" class="inputbox" /><br /><span>{L_YEAR_MONTH_DAY}</span></label></dd>
</dl> </dl>
<dl>
<dt><label for="banexclude">{L_BAN_EXCLUDE}{L_COLON}</label><br /><span>{L_BAN_EXCLUDE_EXPLAIN}</span></dt>
<dd><label><input type="radio" name="banexclude" value="1" class="radio" /> {L_YES}</label>
<label><input type="radio" name="banexclude" id="banexclude" value="0" checked="checked" class="radio" /> {L_NO}</label></dd>
</dl>
<dl> <dl>
<dt><label for="banreason">{L_BAN_REASON}{L_COLON}</label></dt> <dt><label for="banreason">{L_BAN_REASON}{L_COLON}</label></dt>
<dd><input name="banreason" type="text" class="text medium" maxlength="255" id="banreason" /></dd> <dd><input name="banreason" type="text" class="text medium" maxlength="255" id="banreason" /></dd>
@ -98,41 +90,44 @@
<p>{L_UNBAN_EXPLAIN}</p> <p>{L_UNBAN_EXPLAIN}</p>
<form id="acp_unban" method="post" action="{{ U_ACTION }}"> <form id="acp_unban" method="post" action="{U_ACTION}">
<fieldset> <fieldset>
<legend>{{ lang('UNBAN_TITLE') }}</legend> <legend>{L_UNBAN_TITLE}</legend>
{% if BANNED_SELECT %} <!-- IF S_BANNED_OPTIONS -->
<dl> <dl>
<dt><label for="unban">{{ lang('BAN_CELL') ~ lang('COLON') }}</label></dt> <dt><label for="unban">{L_BAN_CELL}{L_COLON}</label></dt>
<dd> <dd><select id="unban" name="unban[]" multiple="multiple" size="10" style="width: 50%" onchange="if (this.selectedIndex > -1) display_details(this.options[this.selectedIndex].value); else display_details(-1);">{BANNED_OPTIONS}</select></dd>
{{ FormsSelect(BANNED_SELECT) }}
</dd>
</dl> </dl>
<dl> <dl>
<dt><label for="unbanlength">{{ lang('BAN_LENGTH') ~ lang('COLON') }}</label></dt> <dt><label for="unbanlength">{L_BAN_LENGTH}{L_COLON}</label></dt>
<dd><input style="border: 0;" type="text" class="text full" readonly="readonly" name="unbanlength" id="unbanlength" /></dd> <dd><input style="border: 0;" type="text" class="text full" readonly="readonly" name="unbanlength" id="unbanlength" /></dd>
</dl> </dl>
<dl> <dl>
<dt><label for="unbanreason">{{ lang('BAN_REASON') ~ lang('COLON') }}</label></dt> <dt><label for="unbanreason">{L_BAN_REASON}{L_COLON}</label></dt>
<dd><textarea style="border: 0;" class="text full" readonly="readonly" name="unbanreason" id="unbanreason" rows="5" cols="80">&nbsp;</textarea></dd> <dd><textarea style="border: 0;" class="text full" readonly="readonly" name="unbanreason" id="unbanreason" rows="5" cols="80">&nbsp;</textarea></dd>
</dl> </dl>
<dl> <dl>
<dt><label for="unbangivereason">{{ lang('BAN_GIVE_REASON') ~ lang('COLON') }}</label></dt> <dt><label for="unbangivereason">{L_BAN_GIVE_REASON}{L_COLON}</label></dt>
<dd><textarea style="border: 0;" class="text full" readonly="readonly" name="unbangivereason" id="unbangivereason" rows="5" cols="80">&nbsp;</textarea></dd> <dd><textarea style="border: 0;" class="text full" readonly="readonly" name="unbangivereason" id="unbangivereason" rows="5" cols="80">&nbsp;</textarea></dd>
</dl> </dl>
<p class="submit-buttons"> <p class="submit-buttons">
<input class="button1" type="submit" id="unbansubmit" name="unbansubmit" value="{{ lang('SUBMIT') }}" />&nbsp; <input class="button1" type="submit" id="unbansubmit" name="unbansubmit" value="{L_SUBMIT}" />&nbsp;
<input class="button2" type="reset" id="unbanreset" name="unbanreset" value="{{ lang('RESET') }}" /> <input class="button2" type="reset" id="unbanreset" name="unbanreset" value="{L_RESET}" />
</p> </p>
{% else %} {S_FORM_TOKEN}
<p>{{ lang('NO_BAN_CELL') }}</p> </fieldset>
{% endif %}
{{ S_FORM_TOKEN }} <!-- ELSE -->
<p>{L_NO_BAN_CELL}</p>
{S_FORM_TOKEN}
</fieldset> </fieldset>
<!-- ENDIF -->
</form> </form>
<!-- INCLUDE overall_footer.html --> <!-- INCLUDE overall_footer.html -->

View file

@ -52,7 +52,7 @@
<td style="text-align: center;"> <td style="text-align: center;">
<!-- IF enabled.S_VERSIONCHECK --> <!-- IF enabled.S_VERSIONCHECK -->
<strong class="<!-- IF enabled.S_UP_TO_DATE -->current-ext<!-- ELSE -->outdated-ext<!-- ENDIF -->">{enabled.META_VERSION}</strong> <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 --> <!-- IF not enabled.S_UP_TO_DATE --><i class="fa fa-exclamation-circle outdated-ext" aria-hidden="true"></i><!-- ENDIF -->
<!-- ELSE --> <!-- ELSE -->
{enabled.META_VERSION} {enabled.META_VERSION}
<!-- ENDIF --> <!-- ENDIF -->
@ -78,7 +78,7 @@
<td style="text-align: center;"> <td style="text-align: center;">
<!-- IF disabled.S_VERSIONCHECK --> <!-- IF disabled.S_VERSIONCHECK -->
<strong class="<!-- IF disabled.S_UP_TO_DATE -->current-ext<!-- ELSE -->outdated-ext<!-- ENDIF -->">{disabled.META_VERSION}</strong> <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 --> <!-- IF not disabled.S_UP_TO_DATE --><i class="fa fa-exclamation-circle outdated-ext" aria-hidden="true"></i><!-- ENDIF -->
<!-- ELSE --> <!-- ELSE -->
{disabled.META_VERSION} {disabled.META_VERSION}
<!-- ENDIF --> <!-- ENDIF -->

View file

@ -348,7 +348,7 @@
<!-- EVENT acp_forums_rules_settings_append --> <!-- EVENT acp_forums_rules_settings_append -->
</fieldset> </fieldset>
</div> </div>
<!-- EVENT acp_forums_custom_settings --> <!-- EVENT acp_forums_custom_settings -->
<fieldset class="submit-buttons"> <fieldset class="submit-buttons">
@ -472,17 +472,7 @@
<tbody> <tbody>
<!-- BEGIN forums --> <!-- BEGIN forums -->
<tr> <tr>
<td class="folder"> <td class="folder">{forums.FOLDER_IMAGE}</td>
<span class="fa-stack fa-2x">
{{ Icon('font', 'circle', '', true, 'fas fa-stack-2x') }}
{{ Icon('font', {
'link' : forums.S_FORUM_LINK,
'lock' : forums.S_FORUM_LOCKED,
'comments' : forums.S_SUBFORUMS,
'comment' : true,
}, '', true, 'fas fa-inverse fa-stack-1x') }}
</span>
</td>
<td class="forum-desc"> <td class="forum-desc">
<!-- IF forums.FORUM_IMAGE --><div style="float: {S_CONTENT_FLOW_BEGIN}; margin-right: 5px;">{forums.FORUM_IMAGE}</div><!-- ENDIF --> <!-- IF forums.FORUM_IMAGE --><div style="float: {S_CONTENT_FLOW_BEGIN}; margin-right: 5px;">{forums.FORUM_IMAGE}</div><!-- ENDIF -->
<strong><!-- IF forums.S_FORUM_LINK -->{forums.FORUM_NAME}<!-- ELSE --><a href="{forums.U_FORUM}">{forums.FORUM_NAME}</a><!-- ENDIF --></strong> <strong><!-- IF forums.S_FORUM_LINK -->{forums.FORUM_NAME}<!-- ELSE --><a href="{forums.U_FORUM}">{forums.FORUM_NAME}</a><!-- ENDIF --></strong>

View file

@ -225,7 +225,6 @@
<fieldset> <fieldset>
<legend>{L_ADD_USERS}</legend> <legend>{L_ADD_USERS}</legend>
{% EVENT acp_groups_add_user_options_before %}
<dl> <dl>
<dt><label for="leader">{L_USER_GROUP_LEADER}{L_COLON}</label></dt> <dt><label for="leader">{L_USER_GROUP_LEADER}{L_COLON}</label></dt>
<dd><label><input name="leader" type="radio" class="radio" value="1" /> {L_YES}</label> <dd><label><input name="leader" type="radio" class="radio" value="1" /> {L_YES}</label>
@ -236,13 +235,11 @@
<dd><label><input name="default" type="radio" class="radio" value="1" /> {L_YES}</label> <dd><label><input name="default" type="radio" class="radio" value="1" /> {L_YES}</label>
<label><input name="default" type="radio" class="radio" id="default" value="0" checked="checked" /> {L_NO}</label></dd> <label><input name="default" type="radio" class="radio" id="default" value="0" checked="checked" /> {L_NO}</label></dd>
</dl> </dl>
{% EVENT acp_groups_add_user_usernames_before %}
<dl> <dl>
<dt><label for="usernames">{L_USERNAME}{L_COLON}</label><br /><span>{L_USERNAMES_EXPLAIN}</span></dt> <dt><label for="usernames">{L_USERNAME}{L_COLON}</label><br /><span>{L_USERNAMES_EXPLAIN}</span></dt>
<dd><textarea id="usernames" name="usernames" cols="40" rows="5"></textarea></dd> <dd><textarea id="usernames" name="usernames" cols="40" rows="5"></textarea></dd>
<dd><!-- EVENT acp_groups_find_username_prepend -->[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]<!-- EVENT acp_groups_find_username_append --></dd> <dd><!-- EVENT acp_groups_find_username_prepend -->[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]<!-- EVENT acp_groups_find_username_append --></dd>
</dl> </dl>
{% EVENT acp_groups_add_user_options_after %}
<p class="quick"> <p class="quick">
<input class="button2" type="submit" name="addusers" value="{L_SUBMIT}" /> <input class="button2" type="submit" name="addusers" value="{L_SUBMIT}" />

View file

@ -8,11 +8,11 @@
<div class="send-stats-row"> <div class="send-stats-row">
<!-- EVENT acp_help_phpbb_stats_before --> <!-- EVENT acp_help_phpbb_stats_before -->
<div class="send-stats-tile"> <div class="send-stats-tile">
<h2>{{ Icon('font', 'chart-column', lang('SEND_STATISTICS')) }}</h2> <h2><i class="icon fa-bar-chart"></i>{L_SEND_STATISTICS}</h2>
<p>{L_EXPLAIN_SEND_STATISTICS}</p> <p>{L_EXPLAIN_SEND_STATISTICS}</p>
<div class="send-stats-row"> <div class="send-stats-row">
<div class="send-stats-data-row send-stats-data-only-row"> <div class="send-stats-data-row send-stats-data-only-row">
<a id="trigger-configlist" data-ajax="toggle_link" data-overlay="false" data-toggle-text="{L_HIDE_STATISTICS}"><span>{L_SHOW_STATISTICS}</span>{{ Icon('font', 'angle-down', '', true) }}</a> <a id="trigger-configlist" data-ajax="toggle_link" data-overlay="false" data-toggle-text="{L_HIDE_STATISTICS}"><span>{L_SHOW_STATISTICS}</span><i class="icon fa-angle-down"></i></a>
</div> </div>
<div class="send-stats-data-row"> <div class="send-stats-data-row">
<div class="configlist" id="configlist"> <div class="configlist" id="configlist">

View file

@ -14,40 +14,27 @@
<p>{L_ADMIN_INTRO}</p> <p>{L_ADMIN_INTRO}</p>
{% if S_UPDATE_INCOMPLETE %} <!-- IF S_UPDATE_INCOMPLETE -->
<div class="errorbox"> <div class="errorbox">
<p>{{ lang('UPDATE_INCOMPLETE') }} <a href="{{ U_VERSIONCHECK }}">{{ lang('MORE_INFORMATION') }}</a></p> <p>{L_UPDATE_INCOMPLETE} <a href="{U_VERSIONCHECK}">{L_MORE_INFORMATION}</a></p>
</div> </div>
{% elseif S_VERSIONCHECK_FAIL %} <!-- ELSEIF S_VERSIONCHECK_FAIL -->
<div class="errorbox notice"> <div class="errorbox notice">
<p>{{ lang('VERSIONCHECK_FAIL') }}</p> <p>{L_VERSIONCHECK_FAIL}</p>
<p>{{ VERSIONCHECK_FAIL_REASON }}</p> <p>{VERSIONCHECK_FAIL_REASON}</p>
<p><a href="{{ U_VERSIONCHECK_FORCE }}">{{ lang('VERSIONCHECK_FORCE_UPDATE') }}</a> &middot; <a href="{{ U_VERSIONCHECK }}">{{ lang('MORE_INFORMATION') }}</a></p> <p><a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE}</a> &middot; <a href="{U_VERSIONCHECK}">{L_MORE_INFORMATION}</a></p>
</div> </div>
{% elseif not S_VERSION_UP_TO_DATE %} <!-- ELSEIF not S_VERSION_UP_TO_DATE -->
<div class="errorbox"> <div class="errorbox">
<p>{{ lang('VERSION_NOT_UP_TO_DATE_TITLE') }}</p> <p>{L_VERSION_NOT_UP_TO_DATE_TITLE}</p>
<p><a href="{{ U_VERSIONCHECK_FORCE }}">{{ lang('VERSIONCHECK_FORCE_UPDATE') }}</a> &middot; <a href="{{ U_VERSIONCHECK }}">{{ lang('MORE_INFORMATION') }}</a></p> <p><a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE}</a> &middot; <a href="{U_VERSIONCHECK}">{L_MORE_INFORMATION}</a></p>
</div> </div>
{% elseif S_VERSION_UP_TO_DATE && S_VERSIONCHECK_FORCE %} <!-- ENDIF -->
<div class="successbox"> <!-- IF S_VERSION_UPGRADEABLE -->
<p>{{ lang('VERSION_UP_TO_DATE_ACP') }}</p>
</div>
{% endif %}
{% if S_VERSION_UPGRADEABLE %}
<div class="errorbox notice"> <div class="errorbox notice">
<p>{{ UPGRADE_INSTRUCTIONS }}</p> <p>{UPGRADE_INSTRUCTIONS}</p>
</div> </div>
{% endif %} <!-- ENDIF -->
{% if S_CAPTCHA_UNSAFE %}
<div class="errorbox">
<p>{{ lang('CAPTCHA_UNSAFE_WARNING') }}</p>
</div>
{% elseif S_CAPTCHA_INCOMPLETE %}
<div class="errorbox">
<p>{{ lang('CAPTCHA_INCOMPLETE_WARNING') }}</p>
</div>
{% endif %}
<!-- IF S_SEARCH_INDEX_MISSING --> <!-- IF S_SEARCH_INDEX_MISSING -->
<div class="errorbox"> <div class="errorbox">

View file

@ -132,16 +132,7 @@
<tbody> <tbody>
<!-- BEGIN modules --> <!-- BEGIN modules -->
<tr> <tr>
<td style="width: 5%; text-align: center;"> <td style="width: 5%; text-align: center;">{modules.MODULE_IMAGE}</td>
<span class="fa-stack fa-2x">
{{ Icon('font', 'circle', '', true, 'fas fa-stack-2x') }}
{{ Icon('font', {
'lock' : not modules.MODULE_ENABLED,
'folder-tree' : modules.S_SUB_MODULE,
'folder' : true,
}, '', true, 'fas fa-inverse fa-stack-1x') }}
</span>
</td>
<td><a href="{modules.U_MODULE}">{modules.MODULE_TITLE}</a><!-- IF not modules.MODULE_DISPLAYED --> <span class="small">[{L_HIDDEN_MODULE}]</span><!-- ENDIF --></td> <td><a href="{modules.U_MODULE}">{modules.MODULE_TITLE}</a><!-- IF not modules.MODULE_DISPLAYED --> <span class="small">[{L_HIDDEN_MODULE}]</span><!-- ENDIF --></td>
<td style="width: 15%; white-space: nowrap; text-align: center; vertical-align: middle;">&nbsp;<!-- IF modules.MODULE_ENABLED --><a href="{modules.U_DISABLE}">{L_DISABLE}</a><!-- ELSE --><a href="{modules.U_ENABLE}">{L_ENABLE}</a><!-- ENDIF -->&nbsp;</td> <td style="width: 15%; white-space: nowrap; text-align: center; vertical-align: middle;">&nbsp;<!-- IF modules.MODULE_ENABLED --><a href="{modules.U_DISABLE}">{L_DISABLE}</a><!-- ELSE --><a href="{modules.U_ENABLE}">{L_ENABLE}</a><!-- ENDIF -->&nbsp;</td>
<td class="actions"> <td class="actions">

View file

@ -288,10 +288,6 @@ li {
padding-right: 10px; padding-right: 10px;
} }
.w-50 {
width: 50%;
}
@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) { @media only screen and (max-width: 700px), only screen and (max-device-width: 700px) {
#wrap, #wrap,
#page-body, #page-body,
@ -334,8 +330,7 @@ li {
} }
#content { #content {
background: #f3f3f3; background: #f3f3f3 url("../images/innerbox_bg.gif") repeat-x top;
background: linear-gradient(to bottom, #dbdee2 0%, #e0e2e5 27%, #ecedee 65%, #f3f3f3 100%);
padding: 5px; padding: 5px;
} }
@ -502,8 +497,7 @@ li {
/* Main Panel /* Main Panel
---------------------------------------- */ ---------------------------------------- */
#acp { #acp {
background: #f3f3f3; background: #f3f3f3 url("../images/innerbox_bg.gif") repeat-x top;
background: linear-gradient(to bottom, #dbdee2 0%, #e0e2e5 27%, #ecedee 65%, #f3f3f3 100%);
border: 1px #999999 solid; border: 1px #999999 solid;
border-radius: 5px; border-radius: 5px;
box-shadow: #ffffff 0 0 0 1px inset; box-shadow: #ffffff 0 0 0 1px inset;
@ -519,8 +513,7 @@ li {
} }
.panel { .panel {
background: #f3f3f3; background: #f3f3f3 url("../images/innerbox_bg.gif") repeat-x top;
background: linear-gradient(to bottom, #dbdee2 0%, #e0e2e5 27%, #ecedee 65%, #f3f3f3 100%);
border-radius: 5px; border-radius: 5px;
overflow: hidden; overflow: hidden;
padding: 5px 0; padding: 5px 0;
@ -607,47 +600,25 @@ li {
#menu li#activemenu a span { #menu li#activemenu a span {
font-weight: bold; font-weight: bold;
text-decoration: none; text-decoration: none;
background: transparent url("../images/arrow_right.gif") 0% 50% no-repeat;
color: #1180b7; color: #1180b7;
} }
.rtl #menu li#activemenu a span {
background: transparent url("../images/arrow_left.gif") 100% 50% no-repeat;
}
#menu li#activemenu a:hover span, #menu li#activemenu a:hover span,
#menu li#activemenu span { #menu li#activemenu span {
font-weight: bold; font-weight: bold;
text-decoration: none; text-decoration: none;
background: #ffffff url("../images/arrow_right.gif") 1% 50% no-repeat;
color: #bc2a4d; color: #bc2a4d;
} }
#menu li#activemenu a span:before, .rtl #menu li#activemenu a:hover span,
#menu li#activemenu a:hover span:before, .rtl #menu li#activemenu span {
#menu li#activemenu span:before { background: #ffffff url("../images/arrow_left.gif") 99% 50% no-repeat;
font-family: "Font Awesome 6 Free";
color: #515f77;
margin-right: 3px;
margin-left: -10px;
content: "\f105";
}
#menu li#activemenu a:hover span:before,
#menu li#activemenu span:before {
margin-right: 1px;
margin-left: -8px;
}
.rtl #menu li#activemenu a span:before,
.rtl #menu li#activemenu a:hover span:before,
.rtl #menu li#activemenu span:before {
font-family: "Font Awesome 6 Free";
color: #515f77;
margin-right: -10px;
margin-left: 3px;
content: "\f104";
}
.rtl #menu li#activemenu a:hover span:before,
.rtl #menu li#activemenu span:before {
margin-right: -8px;
margin-left: 1px;
} }
#menu li a:active, #menu li a:active,
@ -658,30 +629,16 @@ li {
#menu li span.completed { #menu li span.completed {
text-decoration: none; text-decoration: none;
background: url("../images/arrow_down.gif") 1% 50% no-repeat;
padding: 3px 3px 3px 12px; padding: 3px 3px 3px 12px;
} }
#menu li span.completed:before {
font-family: "Font Awesome 6 Free";
color: #515f77;
margin-right: 1px;
margin-left: -8px;
content: "\f107";
}
.rtl #menu li span.completed { .rtl #menu li span.completed {
text-decoration: none; text-decoration: none;
background: url("../images/arrow_down.gif") 99% 50% no-repeat;
padding: 3px 12px 3px 3px; padding: 3px 12px 3px 3px;
} }
.rtl #menu li span.completed:before {
font-family: "Font Awesome 6 Free";
color: #515f77;
margin-right: -8px;
margin-left: 1px;
content: "\f107";
}
#menu .header { #menu .header {
font-family: Tahoma, Helvetica, sans-serif; font-family: Tahoma, Helvetica, sans-serif;
font-size: 0.75em; font-size: 0.75em;
@ -773,8 +730,7 @@ th {
font-size: 0.75em; font-size: 0.75em;
text-align: left; text-align: left;
text-transform: uppercase; text-transform: uppercase;
background: #70aed3; background: #70aed3 url("../images/gradient2b.gif") bottom left repeat-x;
background: linear-gradient(to bottom, #70aed3 0%, #5ba0c9 100%);
border-top: 1px solid #6dacd2; border-top: 1px solid #6dacd2;
border-bottom: 1px solid #327aa5; border-bottom: 1px solid #327aa5;
color: #ffffff; color: #ffffff;
@ -1059,8 +1015,7 @@ table.fixed-width-table {
font-weight: bold; font-weight: bold;
text-align: left; text-align: left;
text-transform: uppercase; text-transform: uppercase;
background: #70aed3; background: #70aed3 url("../images/gradient2b.gif") bottom left repeat-x;
background: linear-gradient(to bottom, #70aed3 0%, #5ba0c9 100%);
border-top: 1px solid #6dacd2; border-top: 1px solid #6dacd2;
border-bottom: 1px solid #327aa5; border-bottom: 1px solid #327aa5;
color: #ffffff; color: #ffffff;
@ -1760,8 +1715,7 @@ a.button2,
input.button2 { input.button2 {
font-family: "Lucida Grande", Verdana, Helvetica, Arial, sans-serif; font-family: "Lucida Grande", Verdana, Helvetica, Arial, sans-serif;
font-size: 0.85em; font-size: 0.85em;
background: #efefef; background: #efefef url("../images/bg_button.gif") repeat-x top;
background: linear-gradient(to bottom, #ffffff 0%, #d2d2d2 4%, #dfdfdf 26%, #efefef 65%, #efefef 100%);
color: #000000; color: #000000;
width: auto !important; width: auto !important;
padding: 1px 3px 0; padding: 1px 3px 0;
@ -1805,8 +1759,7 @@ a.button1:hover,
input.button1:hover, input.button1:hover,
a.button2:hover, a.button2:hover,
input.button2:hover { input.button2:hover {
background: #efefef; background: #efefef url("../images/bg_button.gif") repeat bottom;
background: linear-gradient(to bottom, #ffffff 0%, #d2d2d2 4%, #dfdfdf 26%, #efefef 65%, #efefef 100%);
border: 1px solid #bc2a4d; border: 1px solid #bc2a4d;
color: #bc2a4d; color: #bc2a4d;
} }
@ -1866,18 +1819,24 @@ input.button2:focus {
display: none; display: none;
width: 620px; width: 620px;
margin: 0 auto; margin: 0 auto;
padding: 25px;
padding: 0 25px 20px; padding: 0 25px 20px;
} }
.phpbb_alert .alert_close { .phpbb_alert .alert_close {
font-size: 14px; text-decoration: none !important;
background: transparent url("../images/alert_close.png") 0 0 no-repeat;
display: block;
float: right; float: right;
margin-top: 2px; overflow: hidden;
margin-right: -22px; width: 16px;
height: 16px;
margin-top: -7px;
margin-right: -31px;
} }
.phpbb_alert .alert_close:hover { .phpbb_alert .alert_close:hover {
color: #bc2a4d; background-position: 0 -16px;
} }
.phpbb_alert p { .phpbb_alert p {
@ -2388,11 +2347,11 @@ fieldset.permissions .permissions-switch {
font-size: 0.85em; font-size: 0.85em;
line-height: normal; line-height: normal;
min-width: 570px; min-width: 570px;
margin: 0 0 0 7px; margin: 0 0 -1px 7px;
} }
.rtl .permissions-category { .rtl .permissions-category {
margin: 0 7px 0 0; margin: 0 7px -1px 0;
} }
.permissions-category ul { .permissions-category ul {
@ -2413,9 +2372,7 @@ fieldset.permissions .permissions-switch {
.permissions-category a { .permissions-category a {
text-decoration: none; text-decoration: none;
background: #bcccd8; background: url("../images/bg_tabs_alt1.gif") no-repeat 0% -35px;
border: 1px solid transparent;
border-radius: 4px 4px 0 0;
position: relative; position: relative;
float: left; float: left;
margin: 0 1px 0 0; margin: 0 1px 0 0;
@ -2428,6 +2385,7 @@ fieldset.permissions .permissions-switch {
.permissions-category a span.tabbg { .permissions-category a span.tabbg {
white-space: nowrap; white-space: nowrap;
background: url("../images/bg_tabs_alt2.gif") no-repeat 100% -35px;
color: #536482; color: #536482;
display: block; display: block;
float: left; float: left;
@ -2438,32 +2396,39 @@ fieldset.permissions .permissions-switch {
float: right; float: right;
} }
/* Commented Backslash Hack hides rule from IE5-Mac \ */
.permissions-category a span.tabbg, .permissions-category a span.tabbg,
.rtl .permissions-category a span.tabbg { .rtl .permissions-category a span.tabbg {
float: none; float: none;
} }
.permissions-category a:hover, /* End hack */
.permissions-category a:hover span.tabbg { .permissions-category a:hover span.tabbg {
background: #dfedfa; background-position: 100% -70px;
color: #dd6900; color: #dd6900;
} }
.permissions-category .activetab a, .permissions-category .activetab a {
.permissions-category .activetab a:hover, background-position: 0 0;
}
.permissions-category .activetab a span.tabbg { .permissions-category .activetab a span.tabbg {
background: #ccdcea; background-position: 100% 0;
background: linear-gradient(to bottom, #eaf2f9 0%, #ccdcea 100%); color: #333333;
padding-bottom: 7px;
}
.permissions-category a:hover {
background-position: 0 -70px;
}
.permissions-category .activetab a:hover span.tabbg {
background-position: 100% 0;
color: #333333; color: #333333;
} }
.permissions-category .activetab a { .permissions-category .activetab a:hover {
border-color: #cadceb; background-position: 0 0;
box-shadow: 0 1px 1px #f2f9ff inset;
}
.permissions-category .activetab a span.tabbg {
padding-bottom: 7px;
} }
.permissions-category a span.colour { .permissions-category a span.colour {
@ -2839,16 +2804,8 @@ fieldset.permissions .permissions-switch {
user-select: none; user-select: none;
} }
.roles-options > .button:hover {
background: transparent;
}
.roles-options > .button:active {
padding: 4px;
}
.roles-options > span { .roles-options > span {
background: transparent; background: url("../images/arrow_down.gif") no-repeat 245px 0.7em;
border: 1px solid #dedede; border: 1px solid #dedede;
border-radius: 3px; border-radius: 3px;
display: none; display: none;
@ -2856,16 +2813,8 @@ fieldset.permissions .permissions-switch {
padding: 4px; padding: 4px;
} }
.roles-options > span:after { .rtl .roles-options > span {
font-family: "Font Awesome 6 Free"; background: url("../images/arrow_down.gif") no-repeat 7px 0.7em;
float: right;
content: "\f107";
}
.rtl .roles-options > span:after {
font-family: "Font Awesome 6 Free";
float: left;
content: "\f107";
} }
.roles-options li { .roles-options li {
@ -3007,6 +2956,11 @@ fieldset.permissions .permissions-switch {
padding-right: 0.3em; padding-right: 0.3em;
} }
.icon {
font-family: FontAwesome;
font-style: normal;
}
.send-stats-data-row { .send-stats-data-row {
background: #f9f9f9; background: #f9f9f9;
border: #dedede 1px solid; border: #dedede 1px solid;
@ -3055,14 +3009,12 @@ fieldset.permissions .permissions-switch {
} }
.send-stats-settings input[type="checkbox"] + label:before { .send-stats-settings input[type="checkbox"] + label:before {
font-family: "Font Awesome 6 Free", "Font Awesome 6 Brands"; font-family: FontAwesome;
font-size: 1.5em; font-size: 1.5em;
font-weight: 400; content: "\f096";
content: "\f0c8";
} }
.send-stats-settings input[type="checkbox"]:checked + label:before { .send-stats-settings input[type="checkbox"]:checked + label:before {
font-weight: 900;
color: #3c763d; color: #3c763d;
content: "\f14a"; content: "\f14a";
} }
@ -3100,28 +3052,6 @@ fieldset.permissions .permissions-switch {
overflow-x: scroll; overflow-x: scroll;
} }
.o-icon {
vertical-align: middle !important;
}
.o-icon-font {
font-family: "Font Awesome 6 Free", "Font Awesome 6 Brands";
font-style: normal;
font-variant: normal;
-webkit-font-smoothing: antialiased;
vertical-align: baseline;
display: inline-block;
/* stylelint-disable order/properties-order */
-moz-osx-font-smoothing: grayscale;
/* stylelint-enable order/properties-order */
text-rendering: auto; /* optimizelegibility throws things off #1094 */
}
.o-icon + span,
span + .o-icon {
padding-left: 4px;
}
.acp-icon { .acp-icon {
font-size: 1.5em; font-size: 1.5em;
} }

View file

@ -157,55 +157,6 @@ phpbb.addAjaxCallback('row_delete', function(res) {
} }
}); });
/**
* This callback generates the VAPID keys for the web push notification service.
*/
phpbb.addAjaxCallback('generate_vapid_keys', () => {
/**
* Generate VAPID keypair with public and private key string
*
* @returns {Promise<{privateKey: string, publicKey: string}|null>}
*/
async function generateVAPIDKeys() {
try {
// Generate a new key pair using the Subtle Crypto API
const keyPair = await crypto.subtle.generateKey(
{
name: 'ECDH',
namedCurve: 'P-256',
},
true,
['deriveKey', 'deriveBits']
);
const privateKeyJwk = await crypto.subtle.exportKey('jwk', keyPair.privateKey);
const privateKeyString = privateKeyJwk.d;
const publicKeyBuffer = await crypto.subtle.exportKey('raw', keyPair.publicKey);
const publicKeyString = phpbb.base64UrlEncode(phpbb.rawKeyToBase64(publicKeyBuffer));
return {
privateKey: privateKeyString,
publicKey: publicKeyString
};
} catch (error) {
console.error('Error generating keys with SubtleCrypto:', error);
return null;
}
}
generateVAPIDKeys().then(keyPair => {
if (!keyPair) {
return;
}
const publicKeyInput = document.querySelector('#webpush_vapid_public');
const privateKeyInput = document.querySelector('#webpush_vapid_private');
publicKeyInput.value = keyPair.publicKey;
privateKeyInput.value = keyPair.privateKey;
})
})
/** /**
* Handler for submitting permissions form in chunks * Handler for submitting permissions form in chunks
* This call will submit permissions forms in chunks of 5 fieldsets. * This call will submit permissions forms in chunks of 5 fieldsets.

View file

@ -0,0 +1,74 @@
<!-- INCLUDE overall_header.html -->
<a id="maincontent"></a>
<a href="{U_ACTION}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_ACP_VC_SETTINGS}</h1>
<p>{L_ACP_VC_SETTINGS_EXPLAIN}</p>
<form id="acp_captcha" method="post" action="{U_ACTION}">
<fieldset>
<legend>{L_GENERAL_OPTIONS}</legend>
<dl>
<dt><label for="captcha_gd_foreground_noise">{L_CAPTCHA_GD_FOREGROUND_NOISE}{L_COLON}</label><br /><span>{L_CAPTCHA_GD_FOREGROUND_NOISE_EXPLAIN}</span></dt>
<dd><label><input id="captcha_gd_foreground_noise" name="captcha_gd_foreground_noise" value="1" class="radio" type="radio"<!-- IF CAPTCHA_GD_FOREGROUND_NOISE --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
<label><input name="captcha_gd_foreground_noise" value="0" class="radio" type="radio"<!-- IF not CAPTCHA_GD_FOREGROUND_NOISE --> checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
</dl>
<dl>
<dt><label for="captcha_gd_x_grid">{L_CAPTCHA_GD_X_GRID}{L_COLON}</label><br /><span>{L_CAPTCHA_GD_X_GRID_EXPLAIN}</span></dt>
<dd><input id="captcha_gd_x_grid" name="captcha_gd_x_grid" value="{CAPTCHA_GD_X_GRID}" type="number" /></dd>
</dl>
<dl>
<dt><label for="captcha_gd_y_grid">{L_CAPTCHA_GD_Y_GRID}{L_COLON}</label><br /><span>{L_CAPTCHA_GD_Y_GRID_EXPLAIN}</span></dt>
<dd><input id="captcha_gd_y_grid" name="captcha_gd_y_grid" value="{CAPTCHA_GD_Y_GRID}" type="number" /></dd>
</dl>
<dl>
<dt><label for="captcha_gd_wave">{L_CAPTCHA_GD_WAVE}{L_COLON}</label><br /><span>{L_CAPTCHA_GD_WAVE_EXPLAIN}</span></dt>
<dd><label><input id="captcha_gd_wave" name="captcha_gd_wave" value="1" class="radio" type="radio"<!-- IF CAPTCHA_GD_WAVE --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
<label><input name="captcha_gd_wave" value="0" class="radio" type="radio"<!-- IF not CAPTCHA_GD_WAVE --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
</dd>
</dl>
<dl>
<dt><label for="captcha_gd_3d_noise">{L_CAPTCHA_GD_3D_NOISE}{L_COLON}</label><br /><span>{L_CAPTCHA_GD_3D_NOISE_EXPLAIN}</span></dt>
<dd><label><input id="captcha_gd_3d_noise" name="captcha_gd_3d_noise" value="1" class="radio" type="radio"<!-- IF CAPTCHA_GD_3D_NOISE --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
<label><input name="captcha_gd_3d_noise" value="0" class="radio" type="radio"<!-- IF not CAPTCHA_GD_3D_NOISE --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
</dd>
</dl>
<dl>
<dt><label for="captcha_gd_fonts">{L_CAPTCHA_GD_FONTS}{L_COLON}</label><br /><span>{L_CAPTCHA_GD_FONTS_EXPLAIN}</span></dt>
<dd><label><input id="captcha_gd_fonts" name="captcha_gd_fonts" value="1" class="radio" type="radio"<!-- IF CAPTCHA_GD_FONTS == 1 --> checked="checked"<!-- ENDIF --> /> {L_CAPTCHA_FONT_DEFAULT}</label>
<label><input name="captcha_gd_fonts" value="2" class="radio" type="radio"<!-- IF CAPTCHA_GD_FONTS == 2 --> checked="checked"<!-- ENDIF --> /> {L_CAPTCHA_FONT_NEW}</label>
<label><input name="captcha_gd_fonts" value="3" class="radio" type="radio"<!-- IF CAPTCHA_GD_FONTS == 3 --> checked="checked"<!-- ENDIF --> /> {L_CAPTCHA_FONT_LOWER}</label>
</dd>
</dl>
</fieldset>
<fieldset>
<legend>{L_PREVIEW}</legend>
<!-- IF CAPTCHA_PREVIEW -->
<!-- INCLUDE {CAPTCHA_PREVIEW} -->
<!-- ENDIF -->
</fieldset>
<fieldset>
<legend>{L_ACP_SUBMIT_CHANGES}</legend>
<p class="submit-buttons">
<input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" />&nbsp;
<input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" />&nbsp;
<input class="button2" type="submit" id="preview" name="preview" value="{L_PREVIEW}" />&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

@ -1,3 +1,4 @@
<!-- IF S_RECAPTCHA_AVAILABLE -->
<dl> <dl>
<dd> <dd>
<noscript> <noscript>
@ -6,6 +7,9 @@
{L_RECAPTCHA_INVISIBLE} {L_RECAPTCHA_INVISIBLE}
<script src="{RECAPTCHA_SERVER}.js?hl={LA_RECAPTCHA_LANG}" async defer></script> <script src="{RECAPTCHA_SERVER}.js?hl={LA_RECAPTCHA_LANG}" async defer></script>
<div class="g-recaptcha" data-sitekey="{% if RECAPTCHA_PUBKEY %}{{ RECAPTCHA_PUBKEY }}{% else %}6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI{% endif %}" data-size="invisible"></div> <div class="g-recaptcha" data-sitekey="{RECAPTCHA_PUBKEY}" data-size="invisible"></div>
</dd> </dd>
</dl> </dl>
<!-- ELSE -->
{L_RECAPTCHA_NOT_AVAILABLE}
<!-- ENDIF -->

View file

@ -23,10 +23,9 @@ installLang = {
</script> </script>
<script src="{T_JQUERY_LINK}"></script> <script src="{T_JQUERY_LINK}"></script>
<!-- IF S_ALLOW_CDN --><script>window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery-3.7.1.min.js">\x3C/script>');</script><!-- ENDIF --> <!-- IF S_ALLOW_CDN --><script>window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery-3.6.0.min.js">\x3C/script>');</script><!-- ENDIF -->
<script src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script> <script src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
<!-- INCLUDEJS admin.js --> <!-- INCLUDEJS admin.js -->
{$SCRIPTS} {$SCRIPTS}
</body> </body>

View file

@ -7,7 +7,6 @@
<!-- IF META -->{META}<!-- ENDIF --> <!-- IF META -->{META}<!-- ENDIF -->
<title>{PAGE_TITLE}</title> <title>{PAGE_TITLE}</title>
<link href="{T_FONT_AWESOME_LINK}" rel="stylesheet">
<link href="{T_TEMPLATE_PATH}/admin.css" rel="stylesheet" type="text/css" media="screen" /> <link href="{T_TEMPLATE_PATH}/admin.css" rel="stylesheet" type="text/css" media="screen" />
</head> </head>

View file

@ -4,7 +4,7 @@
<p>{L_FILES_DELETED_EXPLAIN}</p> <p>{L_FILES_DELETED_EXPLAIN}</p>
<fieldset id="deleted"> <fieldset id="deleted">
<legend>{{ Icon('font', 'circle-xmark', lang('STATUS_DELETED'), true, '', {'style' : 'color:red;'}) }}</legend> <legend><img src="{T_IMAGE_PATH}/icon_delete.gif" alt="{L_STATUS_DELETED}" /></legend>
<!-- BEGIN deleted --> <!-- BEGIN deleted -->
<dl> <dl>
<dt style="width: 100%;"><!-- IF deleted.DIR_PART -->{deleted.DIR_PART}<!-- ENDIF --><strong>{deleted.FILE_PART}</strong></dt> <dt style="width: 100%;"><!-- IF deleted.DIR_PART -->{deleted.DIR_PART}<!-- ENDIF --><strong>{deleted.FILE_PART}</strong></dt>
@ -20,7 +20,7 @@
<p>{L_FILES_CONFLICT_EXPLAIN}</p> <p>{L_FILES_CONFLICT_EXPLAIN}</p>
<fieldset id="conflict"> <fieldset id="conflict">
<legend>{{ Icon('font', 'circle-exclamation', lang('STATUS_CONFLICT'), true, '', {'style' : 'color:red;'}) }}</legend> <legend><img src="{T_IMAGE_PATH}/file_conflict.gif" alt="{L_STATUS_CONFLICT}" /></legend>
<!-- BEGIN conflict --> <!-- BEGIN conflict -->
<dl> <dl>
<dt style="width: 100%;"><!-- IF conflict.DIR_PART -->{conflict.DIR_PART}<!-- ENDIF --><strong>{conflict.FILE_PART}</strong></dt> <dt style="width: 100%;"><!-- IF conflict.DIR_PART -->{conflict.DIR_PART}<!-- ENDIF --><strong>{conflict.FILE_PART}</strong></dt>
@ -36,7 +36,7 @@
<p>{L_FILES_MODIFIED_EXPLAIN}</p> <p>{L_FILES_MODIFIED_EXPLAIN}</p>
<fieldset id="modified"> <fieldset id="modified">
<legend>{{ Icon('font', 'circle-arrow-left', lang('STATUS_MODIFIED'), true, '', {'style' : 'color:#ffd43b;'}) }}</legend> <legend><img src="{T_IMAGE_PATH}/file_modified.gif" alt="{L_STATUS_MODIFIED}" /></legend>
<!-- BEGIN modified --> <!-- BEGIN modified -->
<dl> <dl>
<dt style="width: 100%;"><!-- IF modified.DIR_PART -->{modified.DIR_PART}<!-- ENDIF --><strong>{modified.FILE_PART}</strong></dt> <dt style="width: 100%;"><!-- IF modified.DIR_PART -->{modified.DIR_PART}<!-- ENDIF --><strong>{modified.FILE_PART}</strong></dt>
@ -52,7 +52,7 @@
<p>{L_FILES_NEW_EXPLAIN}</p> <p>{L_FILES_NEW_EXPLAIN}</p>
<fieldset id="new_files" style="display: none;"> <fieldset id="new_files" style="display: none;">
<legend>{{ Icon('font', 'circle-plus', lang('STATUS_NEW'), true, '', {'style' : 'color:#ffd43b;'}) }}</legend> <legend><img src="{T_IMAGE_PATH}/file_new.gif" alt="{L_STATUS_NEW}" /></legend>
<!-- BEGIN new --> <!-- BEGIN new -->
<dl> <dl>
<dt style="width: 100%;"><!-- IF new.DIR_PART -->{new.DIR_PART}<!-- ENDIF --><strong>{new.FILE_PART}</strong> <dt style="width: 100%;"><!-- IF new.DIR_PART -->{new.DIR_PART}<!-- ENDIF --><strong>{new.FILE_PART}</strong>
@ -69,7 +69,7 @@
<p>{L_FILES_NOT_MODIFIED_EXPLAIN}</p> <p>{L_FILES_NOT_MODIFIED_EXPLAIN}</p>
<fieldset id="not_modified" style="display: none;"> <fieldset id="not_modified" style="display: none;">
<legend>{{ Icon('font', 'lock', lang('STATUS_NOT_MODIFIED'), true, '', {'style' : 'color:#1180b7;'}) }}</legend> <legend><img src="{T_IMAGE_PATH}/file_not_modified.gif" alt="{L_STATUS_NOT_MODIFIED}" /></legend>
<!-- BEGIN not_modified --> <!-- BEGIN not_modified -->
<dl> <dl>
<dt style="width: 100%;"><!-- IF not_modified.DIR_PART -->{not_modified.DIR_PART}<!-- ENDIF --><strong>{not_modified.FILE_PART}</strong></dt> <dt style="width: 100%;"><!-- IF not_modified.DIR_PART -->{not_modified.DIR_PART}<!-- ENDIF --><strong>{not_modified.FILE_PART}</strong></dt>

View file

@ -30,34 +30,21 @@
</div> </div>
<div id="phpbb_alert" class="phpbb_alert" data-l-err="{L_ERROR}" data-l-timeout-processing-req="{L_TIMEOUT_PROCESSING_REQ}"> <div id="phpbb_alert" class="phpbb_alert" data-l-err="{L_ERROR}" data-l-timeout-processing-req="{L_TIMEOUT_PROCESSING_REQ}">
<a href="#" class="alert_close">{{ Icon('font', 'circle-xmark', '', true) }}</a> <a href="#" class="alert_close"></a>
<h3 class="alert_title">&nbsp;</h3><p class="alert_text"></p> <h3 class="alert_title">&nbsp;</h3><p class="alert_text"></p>
</div> </div>
<div id="phpbb_confirm" class="phpbb_alert"> <div id="phpbb_confirm" class="phpbb_alert">
<a href="#" class="alert_close">{{ Icon('font', 'circle-xmark', '', true) }}</a> <a href="#" class="alert_close"></a>
<div class="alert_text"></div> <div class="alert_text"></div>
</div> </div>
</div> </div>
</div> </div>
<script src="{T_JQUERY_LINK}"></script> <script src="{T_JQUERY_LINK}"></script>
<!-- IF S_ALLOW_CDN --><script>window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery-3.7.1.min.js?assets_version={T_ASSETS_VERSION}">\x3C/script>');</script><!-- ENDIF --> <!-- IF S_ALLOW_CDN --><script>window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery-3.6.0.min.js?assets_version={T_ASSETS_VERSION}">\x3C/script>');</script><!-- ENDIF -->
<script src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script> <script src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
<!-- INCLUDEJS ajax.js --> <!-- INCLUDEJS ajax.js -->
<!-- INCLUDEJS admin.js --> <!-- INCLUDEJS admin.js -->
{% if S_ALLOW_CDN %}
<script>
(function($){
const $fa_cdn = $('head').find('link[rel="stylesheet"]').first(),
$span = $('<span class="fa" style="display:none"></span>').appendTo('body');
if ($span.css('fontFamily') !== '"Font Awesome 6 Free"') {
$fa_cdn.after('<link href="{{ T_ASSETS_PATH ~ '/css/font-awesome.min.css' }}" rel="stylesheet">');
$fa_cdn.remove();
}
$span.remove();
})(jQuery);
</script>
{% endif %}
<!-- EVENT acp_overall_footer_after --> <!-- EVENT acp_overall_footer_after -->
{$SCRIPTS} {$SCRIPTS}

View file

@ -27,7 +27,7 @@
<fieldset class="permissions" id="perm{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}"> <fieldset class="permissions" id="perm{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}">
<legend id="legend{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}"> <legend id="legend{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}">
<!-- IF not p_mask.S_VIEW --> <!-- IF not p_mask.S_VIEW -->
<input type="checkbox" style="display: none;" class="permissions-checkbox" name="inherit[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]" id="checkbox{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" value="1" onclick="toggle_opacity('{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}')" /> <input type="checkbox" style="display: none;" class="permissions-checkbox" name="inherit[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]" id="checkbox{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" value="1" onclick="toggle_opacity('{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}')" />
<!-- ELSE --> <!-- ELSE -->
<!-- ENDIF --> <!-- ENDIF -->
<!-- IF p_mask.f_mask.PADDING --><span class="padding">{p_mask.f_mask.PADDING}{p_mask.f_mask.PADDING}</span><!-- ENDIF -->{p_mask.f_mask.NAME} <!-- IF p_mask.f_mask.PADDING --><span class="padding">{p_mask.f_mask.PADDING}{p_mask.f_mask.PADDING}</span><!-- ENDIF -->{p_mask.f_mask.NAME}
@ -73,7 +73,7 @@
<div class="permissions-category"> <div class="permissions-category">
<ul> <ul>
<!-- ENDIF --> <!-- ENDIF -->
<!-- IF p_mask.f_mask.category.S_YES --> <!-- IF p_mask.f_mask.category.S_YES -->
<li class="permissions-preset-yes<!-- IF p_mask.S_FIRST_ROW and p_mask.f_mask.S_FIRST_ROW and p_mask.f_mask.category.S_FIRST_ROW --> activetab<!-- ENDIF -->" id="tab{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}"> <li class="permissions-preset-yes<!-- IF p_mask.S_FIRST_ROW and p_mask.f_mask.S_FIRST_ROW and p_mask.f_mask.category.S_FIRST_ROW --> activetab<!-- ENDIF -->" id="tab{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}">
<!-- ELSEIF p_mask.f_mask.category.S_NEVER --> <!-- ELSEIF p_mask.f_mask.category.S_NEVER -->
@ -116,7 +116,7 @@
<tbody> <tbody>
<!-- BEGIN mask --> <!-- BEGIN mask -->
<!-- IF p_mask.f_mask.category.mask.S_ROW_COUNT is even --><tr class="row4"><!-- ELSE --><tr class="row3"><!-- ENDIF --> <!-- IF p_mask.f_mask.category.mask.S_ROW_COUNT is even --><tr class="row4"><!-- ELSE --><tr class="row3"><!-- ENDIF -->
<th class="permissions-name<!-- IF p_mask.f_mask.category.mask.S_ROW_COUNT is even --> row4<!-- ELSE --> row3<!-- ENDIF -->"><!-- IF p_mask.f_mask.category.mask.U_TRACE --><a href="{p_mask.f_mask.category.mask.U_TRACE}" class="trace" onclick="popup(this.href, 750, 515, '_trace'); return false;" title="{L_TRACE_SETTING}">{{ Icon('font', 'eye', lang('TRACE_SETTING'), true, '', {'style' : 'color:#1180b7;'}) }}</a> <!-- ENDIF -->{p_mask.f_mask.category.mask.PERMISSION}</th> <th class="permissions-name<!-- IF p_mask.f_mask.category.mask.S_ROW_COUNT is even --> row4<!-- ELSE --> row3<!-- ENDIF -->"><!-- IF p_mask.f_mask.category.mask.U_TRACE --><a href="{p_mask.f_mask.category.mask.U_TRACE}" class="trace" onclick="popup(this.href, 750, 515, '_trace'); return false;" title="{L_TRACE_SETTING}"><img src="images/icon_trace.gif" alt="{L_TRACE_SETTING}" /></a> <!-- ENDIF -->{p_mask.f_mask.category.mask.PERMISSION}</th>
<!-- IF p_mask.S_VIEW --> <!-- IF p_mask.S_VIEW -->
<td<!-- IF p_mask.f_mask.category.mask.S_YES --> class="yes"<!-- ENDIF -->>&nbsp;</td> <td<!-- IF p_mask.f_mask.category.mask.S_YES --> class="yes"<!-- ENDIF -->>&nbsp;</td>
<td<!-- IF p_mask.f_mask.category.mask.S_NEVER --> class="never"<!-- ENDIF -->></td> <td<!-- IF p_mask.f_mask.category.mask.S_NEVER --> class="never"<!-- ENDIF -->></td>
@ -130,7 +130,7 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<!-- IF not p_mask.S_VIEW --> <!-- IF not p_mask.S_VIEW -->
<fieldset class="quick" style="margin-{S_CONTENT_FLOW_END}{L_COLON} 11px;"> <fieldset class="quick" style="margin-{S_CONTENT_FLOW_END}{L_COLON} 11px;">
<p class="small">{L_APPLY_PERMISSIONS_EXPLAIN}</p> <p class="small">{L_APPLY_PERMISSIONS_EXPLAIN}</p>
@ -139,7 +139,7 @@
<p class="small"><a href="#" onclick="reset_opacity(0, '{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="reset_opacity(1, '{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); return false;">{L_UNMARK_ALL}</a></p> <p class="small"><a href="#" onclick="reset_opacity(0, '{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="reset_opacity(1, '{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); return false;">{L_UNMARK_ALL}</a></p>
<!-- ENDIF --> <!-- ENDIF -->
</fieldset> </fieldset>
<!-- ENDIF --> <!-- ENDIF -->
</div> </div>

View file

@ -17,21 +17,8 @@
</div> </div>
<script src="{T_JQUERY_LINK}"></script> <script src="{T_JQUERY_LINK}"></script>
<!-- IF S_ALLOW_CDN --><script>window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery-3.7.1.min.js?assets_version={T_ASSETS_VERSION}">\x3C/script>');</script><!-- ENDIF --> <!-- IF S_ALLOW_CDN --><script>window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery-3.6.0.min.js?assets_version={T_ASSETS_VERSION}">\x3C/script>');</script><!-- ENDIF -->
<script src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script> <script src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
{% if S_ALLOW_CDN %}
<script>
(function($){
const $fa_cdn = $('head').find('link[rel="stylesheet"]').first(),
$span = $('<span class="fa" style="display:none"></span>').appendTo('body');
if ($span.css('fontFamily') !== '"Font Awesome 6 Free"') {
$fa_cdn.after('<link href="{{ T_ASSETS_PATH ~ '/css/font-awesome.min.css' }}" rel="stylesheet">');
$fa_cdn.remove();
}
$span.remove();
})(jQuery);
</script>
{% endif %}
<!-- EVENT acp_simple_footer_after --> <!-- EVENT acp_simple_footer_after -->
{$SCRIPTS} {$SCRIPTS}

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1677,33 +1677,6 @@ phpbb.getFunctionByName = function (functionName) {
return context[func]; return context[func];
}; };
/**
* Convert raw key ArrayBuffer to base64 string.
*
* @param {ArrayBuffer} rawKey Raw key array buffer as exported by SubtleCrypto exportKey()
* @returns {string} Base64 encoded raw key string
*/
phpbb.rawKeyToBase64 = (rawKey) => {
const keyBuffer = new Uint8Array(rawKey);
let keyText = '';
const keyLength = keyBuffer.byteLength;
for (let i = 0; i < keyLength; i++) {
keyText += String.fromCharCode(keyBuffer[i]);
}
return window.btoa(keyText);
};
/**
* Base64URL encode base64 encoded string
*
* @param {string} base64String Base64 encoded string
* @returns {string} Base64URL encoded string
*/
phpbb.base64UrlEncode = (base64String) => {
return base64String.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
};
/** /**
* Register page dropdowns. * Register page dropdowns.
*/ */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,300 +0,0 @@
/* global phpbb */
'use strict';
function PhpbbWebpush() {
/** @type {string} URL to service worker */
let serviceWorkerUrl = '';
/** @type {string} URL to subscribe to push */
let subscribeUrl = '';
/** @type {string} URL to unsubscribe from push */
let unsubscribeUrl = '';
/** @type { {creationTime: number, formToken: string} } Form tokens */
this.formTokens = {
creationTime: 0,
formToken: '',
};
/** @type {{endpoint: string, expiration: string}[]} Subscriptions */
let subscriptions;
/** @type {string} Title of error message */
let ajaxErrorTitle = '';
/** @type {string} VAPID public key */
let vapidPublicKey = '';
/** @type {HTMLElement} Subscribe button */
let subscribeButton;
/** @type {HTMLElement} Unsubscribe button */
let unsubscribeButton;
/**
* Init function for phpBB Web Push
* @type {array} options
*/
this.init = function(options) {
serviceWorkerUrl = options.serviceWorkerUrl;
subscribeUrl = options.subscribeUrl;
unsubscribeUrl = options.unsubscribeUrl;
this.formTokens = options.formTokens;
subscriptions = options.subscriptions;
ajaxErrorTitle = options.ajaxErrorTitle;
vapidPublicKey = options.vapidPublicKey;
subscribeButton = document.querySelector('#subscribe_webpush');
unsubscribeButton = document.querySelector('#unsubscribe_webpush');
// Service workers are only supported in secure context
if (window.isSecureContext !== true) {
subscribeButton.disabled = true;
return;
}
if ('serviceWorker' in navigator && 'PushManager' in window) {
navigator.serviceWorker.register(serviceWorkerUrl)
.then(() => {
subscribeButton.addEventListener('click', subscribeButtonHandler);
unsubscribeButton.addEventListener('click', unsubscribeButtonHandler);
updateButtonState();
})
.catch(error => {
console.info(error);
// Service worker could not be registered
subscribeButton.disabled = true;
});
} else {
subscribeButton.disabled = true;
}
};
/**
* Update button state depending on notifications state
*
* @return void
*/
function updateButtonState() {
if (Notification.permission === 'granted') {
navigator.serviceWorker.getRegistration(serviceWorkerUrl)
.then(registration => {
if (typeof registration === 'undefined') {
return;
}
registration.pushManager.getSubscription()
.then(subscribed => {
if (isValidSubscription(subscribed)) {
setSubscriptionState(true);
}
});
});
}
}
/**
* Check whether subscription is valid
*
* @param {PushSubscription} subscription
* @returns {boolean}
*/
const isValidSubscription = subscription => {
if (!subscription) {
return false;
}
if (subscription.expirationTime && subscription.expirationTime <= Date.now()) {
return false;
}
for (const curSubscription of subscriptions) {
if (subscription.endpoint === curSubscription.endpoint) {
return true;
}
}
// Subscription is not in valid subscription list for user
return false;
};
/**
* Set subscription state for buttons
*
* @param {boolean} subscribed True if subscribed, false if not
*/
function setSubscriptionState(subscribed) {
if (subscribed) {
subscribeButton.classList.add('hidden');
unsubscribeButton.classList.remove('hidden');
} else {
subscribeButton.classList.remove('hidden');
unsubscribeButton.classList.add('hidden');
}
}
/**
* Handler for pushing subscribe button
*
* @param {Object} event Subscribe button push event
* @returns {Promise<void>}
*/
async function subscribeButtonHandler(event) {
event.preventDefault();
subscribeButton.addEventListener('click', subscribeButtonHandler);
// Prevent the user from clicking the subscribe button multiple times.
const result = await Notification.requestPermission();
if (result === 'denied') {
return;
}
const registration = await navigator.serviceWorker.getRegistration(serviceWorkerUrl);
// We might already have a subscription that is unknown to this instance of phpBB.
// Unsubscribe before trying to subscribe again.
if (typeof registration !== 'undefined') {
const subscribed = await registration.pushManager.getSubscription();
if (subscribed) {
await subscribed.unsubscribe();
}
}
const newSubscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlB64ToUint8Array(vapidPublicKey),
});
const loadingIndicator = phpbb.loadingIndicator();
fetch(subscribeUrl, {
method: 'POST',
headers: {
'X-Requested-With': 'XMLHttpRequest',
},
body: getFormData(newSubscription),
})
.then(response => {
loadingIndicator.fadeOut(phpbb.alertTime);
return response.json();
})
.then(handleSubscribe)
.catch(error => {
loadingIndicator.fadeOut(phpbb.alertTime);
phpbb.alert(ajaxErrorTitle, error);
});
}
/**
* Handler for pushing unsubscribe button
*
* @param {Object} event Unsubscribe button push event
* @returns {Promise<void>}
*/
async function unsubscribeButtonHandler(event) {
event.preventDefault();
const registration = await navigator.serviceWorker.getRegistration(serviceWorkerUrl);
if (typeof registration === 'undefined') {
return;
}
const subscription = await registration.pushManager.getSubscription();
const loadingIndicator = phpbb.loadingIndicator();
fetch(unsubscribeUrl, {
method: 'POST',
headers: {
'X-Requested-With': 'XMLHttpRequest',
},
body: getFormData({ endpoint: subscription.endpoint }),
})
.then(() => {
loadingIndicator.fadeOut(phpbb.alertTime);
return subscription.unsubscribe();
})
.then(unsubscribed => {
if (unsubscribed) {
setSubscriptionState(false);
}
})
.catch(error => {
loadingIndicator.fadeOut(phpbb.alertTime);
phpbb.alert(ajaxErrorTitle, error);
});
}
/**
* Handle subscribe response
*
* @param {Object} response Response from subscription endpoint
*/
function handleSubscribe(response) {
if (response.success) {
setSubscriptionState(true);
if ('form_tokens' in response) {
updateFormTokens(response.form_tokens);
}
}
}
/**
* Get form data object including form tokens
*
* @param {Object} data Data to create form data from
* @returns {FormData} Form data
*/
function getFormData(data) {
const formData = new FormData();
formData.append('form_token', phpbb.webpush.formTokens.formToken);
formData.append('creation_time', phpbb.webpush.formTokens.creationTime.toString());
formData.append('data', JSON.stringify(data));
return formData;
}
/**
* Update form tokens with supplied ones
*
* @param {Object} formTokens
*/
function updateFormTokens(formTokens) {
phpbb.webpush.formTokens.creationTime = formTokens.creation_time;
phpbb.webpush.formTokens.formToken = formTokens.form_token;
}
/**
* Convert a base64 string to Uint8Array
*
* @param base64String
* @returns {Uint8Array}
*/
function urlB64ToUint8Array(base64String) {
const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
}
function domReady(callBack) {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callBack);
} else {
callBack();
}
}
phpbb.webpush = new PhpbbWebpush();
domReady(() => {
/* global phpbbWebpushOptions */
phpbb.webpush.init(phpbbWebpushOptions);
});

View file

@ -12,7 +12,7 @@
*/ */
/** /**
* Minimum Requirement: PHP 7.2.0 * Minimum Requirement: PHP 7.1.3
*/ */
if (!defined('IN_PHPBB')) if (!defined('IN_PHPBB'))
@ -51,10 +51,20 @@ if (!defined('PHPBB_INSTALLED'))
$server_port = 443; $server_port = 443;
} }
$script_path = phpbb_get_install_redirect($phpbb_root_path, $phpEx); $script_name = (!empty($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : getenv('REQUEST_URI');
if (!$script_name)
{
$script_name = (!empty($_SERVER['PHP_SELF'])) ? $_SERVER['PHP_SELF'] : getenv('PHP_SELF');
}
// $phpbb_root_path accounts for redirects from e.g. /adm
$script_path = trim(dirname($script_name)) . '/' . $phpbb_root_path . 'install/app.' . $phpEx;
// Replace any number of consecutive backslashes and/or slashes with a single slash
// (could happen on some proxy setups and/or Windows servers)
$script_path = preg_replace('#[\\\\/]{2,}#', '/', $script_path);
// Eliminate . and .. from the path // Eliminate . and .. from the path
require($phpbb_root_path . 'phpbb/filesystem/helper.' . $phpEx); require($phpbb_root_path . 'phpbb/filesystem.' . $phpEx);
$script_path = \phpbb\filesystem\helper::clean_path($script_path); $script_path = \phpbb\filesystem\helper::clean_path($script_path);
$url = (($secure) ? 'https://' : 'http://') . $server_name; $url = (($secure) ? 'https://' : 'http://') . $server_name;

View file

@ -28,10 +28,9 @@
"require": { "require": {
"php": "^8.1", "php": "^8.1",
"ext-json": "*", "ext-json": "*",
"ext-mbstring": "*",
"ext-pdo": "*", "ext-pdo": "*",
"ext-zlib": "*",
"bantu/ini-get-wrapper": "~1.0", "bantu/ini-get-wrapper": "~1.0",
"carlos-mg89/oauth": "^0.8.15",
"chita/topological_sort": "^3.0", "chita/topological_sort": "^3.0",
"composer/composer": "^2.0", "composer/composer": "^2.0",
"composer/installers": "^1.9", "composer/installers": "^1.9",
@ -39,8 +38,8 @@
"doctrine/dbal": "~3.3.6", "doctrine/dbal": "~3.3.6",
"google/recaptcha": "~1.1", "google/recaptcha": "~1.1",
"guzzlehttp/guzzle": "~6.3", "guzzlehttp/guzzle": "~6.3",
"lusitanian/oauth": "^0.8.1",
"marc1706/fast-image-size": "^1.1", "marc1706/fast-image-size": "^1.1",
"minishlink/web-push": "^8.0",
"s9e/text-formatter": "^2.0", "s9e/text-formatter": "^2.0",
"symfony/config": "^6.3", "symfony/config": "^6.3",
"symfony/console": "^6.3", "symfony/console": "^6.3",
@ -51,7 +50,6 @@
"symfony/finder": "^6.3", "symfony/finder": "^6.3",
"symfony/http-foundation": "^6.3", "symfony/http-foundation": "^6.3",
"symfony/http-kernel": "^6.3", "symfony/http-kernel": "^6.3",
"symfony/polyfill-mbstring": "^1.23",
"symfony/mime": "^6.3", "symfony/mime": "^6.3",
"symfony/process": "^6.3", "symfony/process": "^6.3",
"symfony/proxy-manager-bridge": "^6.3", "symfony/proxy-manager-bridge": "^6.3",
@ -70,11 +68,8 @@
"symfony/css-selector": "^6.3", "symfony/css-selector": "^6.3",
"symfony/dom-crawler": "^6.3", "symfony/dom-crawler": "^6.3",
"symfony/http-client": "^6.3", "symfony/http-client": "^6.3",
"vimeo/psalm": "^5.18.0", "vimeo/psalm": "^4.14",
"psalm/plugin-symfony": "^v5.1.0" "psalm/plugin-symfony": "^3.1"
},
"suggest": {
"ext-mbstring": "Better performance in search"
}, },
"extra": { "extra": {
"branch-alias": { "branch-alias": {

3038
phpBB/composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,9 +1,7 @@
imports: imports:
- { resource: services_assets.yml }
- { resource: services_attachment.yml } - { resource: services_attachment.yml }
- { resource: services_auth.yml } - { resource: services_auth.yml }
- { resource: services_avatar.yml } - { resource: services_avatar.yml }
- { resource: services_ban.yml }
- { resource: services_captcha.yml } - { resource: services_captcha.yml }
- { resource: services_console.yml } - { resource: services_console.yml }
- { resource: services_content.yml } - { resource: services_content.yml }
@ -126,13 +124,6 @@ services:
arguments: arguments:
- '%core.root_path%' - '%core.root_path%'
form_helper:
class: phpbb\form\form_helper
arguments:
- '@config'
- '@request'
- '@user'
group_helper: group_helper:
class: phpbb\group\helper class: phpbb\group\helper
arguments: arguments:

View file

@ -1,4 +0,0 @@
services:
assets.bag:
class: phpbb\template\assets_bag
shared: false

View file

@ -1,54 +0,0 @@
services:
# ----- Ban management -----
ban.manager:
class: \phpbb\ban\manager
arguments:
- '@ban.type_collection'
- '@cache.driver'
- '@dbal.conn'
- '@language'
- '@log'
- '@user'
- '%tables.bans%'
- '%tables.users%'
# ----- Ban types -----
ban.type_collection:
class: \phpbb\di\service_collection
arguments:
- '@service_container'
tags:
- { name: service_collection, tag: ban.type }
ban.type.email:
class: \phpbb\ban\type\email
arguments:
- '@dbal.conn'
- '%tables.bans%'
- '%tables.users%'
- '%tables.sessions%'
- '%tables.sessions_keys%'
tags:
- { name: ban.type }
ban.type.ip:
class: \phpbb\ban\type\ip
arguments:
- '@dbal.conn'
- '%tables.bans%'
- '%tables.users%'
- '%tables.sessions%'
- '%tables.sessions_keys%'
tags:
- { name: ban.type }
ban.type.user:
class: \phpbb\ban\type\user
arguments:
- '@dbal.conn'
- '%tables.bans%'
- '%tables.users%'
- '%tables.sessions%'
- '%tables.sessions_keys%'
tags:
- { name: ban.type }

View file

@ -14,16 +14,27 @@ services:
tags: tags:
- { name: service_collection, tag: captcha.plugins } - { name: service_collection, tag: captcha.plugins }
core.captcha.plugins.incomplete: core.captcha.plugins.gd:
class: phpbb\captcha\plugins\incomplete class: phpbb\captcha\plugins\gd
shared: false shared: false
arguments:
- '@config'
- '@template'
- '%core.root_path%'
- '%core.php_ext%'
calls: calls:
- [ set_name, [ core.captcha.plugins.incomplete ] ] - [set_name, [core.captcha.plugins.gd]]
tags:
- { name: captcha.plugins }
core.captcha.plugins.gd_wave:
class: phpbb\captcha\plugins\gd_wave
shared: false
calls:
- [set_name, [core.captcha.plugins.gd_wave]]
tags:
- { name: captcha.plugins }
core.captcha.plugins.nogd:
class: phpbb\captcha\plugins\nogd
shared: false
calls:
- [set_name, [core.captcha.plugins.nogd]]
tags: tags:
- { name: captcha.plugins } - { name: captcha.plugins }

View file

@ -19,7 +19,6 @@ services:
- '@user' - '@user'
- '@cache.driver' - '@cache.driver'
- '@dbal.conn' - '@dbal.conn'
- '@dbal.tools'
- '@auth' - '@auth'
- '@log' - '@log'
- '@config' - '@config'

View file

@ -65,13 +65,6 @@ services:
- '@controller.helper' - '@controller.helper'
- '@event_dispatcher' - '@event_dispatcher'
posting.lock:
class: phpbb\lock\posting
shared: false
arguments:
- '@cache.driver'
- '@config'
viewonline_helper: viewonline_helper:
class: phpbb\viewonline_helper class: phpbb\viewonline_helper
arguments: arguments:

View file

@ -9,7 +9,6 @@ services:
arguments: arguments:
- '@template' - '@template'
- '@language' - '@language'
- '@user'
- '%debug.exceptions%' - '%debug.exceptions%'
tags: tags:
- { name: kernel.event_subscriber } - { name: kernel.event_subscriber }

View file

@ -243,19 +243,3 @@ services:
- '%core.php_ext%' - '%core.php_ext%'
tags: tags:
- { name: notification.method } - { name: notification.method }
notification.method.webpush:
class: phpbb\notification\method\webpush
shared: false
arguments:
- '@config'
- '@dbal.conn'
- '@log'
- '@user_loader'
- '@user'
- '%core.root_path%'
- '%core.php_ext%'
- '%tables.notification_push%'
- '%tables.push_subscriptions%'
tags:
- { name: notification.method }

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