Compare commits

..

14 commits

Author SHA1 Message Date
rxu
d4190df928
[ticket/17151] Adjust code styling
PHPBB3-17151
2023-10-03 12:48:48 +07:00
rxu
fd05c47aae
[ticket/17151] Extend forms tests
PHPBB3-17151
2023-10-02 15:45:36 +07:00
rxu
da04734a2a
[ticket/17151] Revert radio yes_no/enabled_disabled, fix select "selected"
PHPBB3-17151
2023-10-02 12:18:04 +07:00
rxu
bcc917ecbb
[ticket/17151] Reimplement radio buttons yes_no / enabled_disabled shorthands
PHPBB3-17151
2023-09-24 21:43:54 +07:00
rxu
dddd937ac5
[ticket/17151] Fix avatar ACP options
PHPBB3-17151
2023-09-24 10:40:22 +07:00
rxu
a4438ec9c6
[ticket/17151] Refactor radio buttons output logic
PHPBB3-17151
2023-09-24 09:48:07 +07:00
rxu
ddfd6e7f35
[ticket/17151] Adjust template output formatting
PHPBB3-17151
2023-09-24 01:22:38 +07:00
rxu
1c3faaffff
[ticket/17151] Fix PHP warning on board settings page, add ACP pages test
PHPBB3-17151
2023-09-24 01:22:38 +07:00
rxu
8ef91638f2
[ticket/17151] Improve radio input type handling
- allow more than 2 buttons count
- allow custom buttons order
- allow custom button labels

Implemented by allowing JSON data format, backward compatibility preserved.

PHPBB3-17151
2023-09-24 01:22:37 +07:00
rxu
20151f6532
[ticket/17151] Deduplicate code for building configuration options data
PHPBB3-17151
2023-09-24 01:22:37 +07:00
rxu
275a9b6794
[ticket/17151] Fix tests
PHPBB3-17151
2023-09-24 01:22:36 +07:00
rxu
34d0ccc547
[ticket/17151] Fix registration test error
PHPBB3-17151
2023-09-24 01:22:36 +07:00
rxu
438cc94e85
[ticket/17151] Fix test error
PHPBB3-17151
2023-09-24 01:22:35 +07:00
rxu
9dce82c453
[ticket/17151] Make settings forms use macros
PHPBB3-17151
2023-09-24 01:22:31 +07:00
414 changed files with 17213 additions and 13957 deletions

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

@ -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

@ -35,15 +35,6 @@
<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

@ -31,7 +31,6 @@
"ext-pdo": "*", "ext-pdo": "*",
"ext-zlib": "*", "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",
@ -70,8 +69,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": { "suggest": {
"ext-mbstring": "Better performance in search" "ext-mbstring": "Better performance in search"

3032
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 }

View file

@ -26,7 +26,6 @@ services:
arguments: arguments:
- '@config' - '@config'
- '@dbal.conn' - '@dbal.conn'
- '@dbal.tools'
- '@event_dispatcher' - '@event_dispatcher'
- '@language' - '@language'
- '@user' - '@user'

View file

@ -5,7 +5,6 @@ services:
template.twig.environment: template.twig.environment:
class: phpbb\template\twig\environment class: phpbb\template\twig\environment
arguments: arguments:
- '@assets.bag'
- '@config' - '@config'
- '@filesystem' - '@filesystem'
- '@path_helper' - '@path_helper'

View file

@ -15,17 +15,3 @@ services:
- '%tables.users%' - '%tables.users%'
- '%core.root_path%' - '%core.root_path%'
- '%core.php_ext%' - '%core.php_ext%'
phpbb.ucp.controller.webpush:
class: phpbb\ucp\controller\webpush
arguments:
- '@config'
- '@controller.helper'
- '@dbal.conn'
- '@form_helper'
- '@path_helper'
- '@request'
- '@user'
- '@template.twig.environment'
- '%tables.notification_push%'
- '%tables.push_subscriptions%'

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