Compare commits
561 commits
ed943854ec
...
c495a26f98
Author | SHA1 | Date | |
---|---|---|---|
|
c495a26f98 | ||
|
ad7721368c | ||
|
aac7d5a99c | ||
|
4db4a5571b | ||
|
f54bafec29 | ||
|
808b2f3a41 | ||
|
cf44868393 | ||
|
902283c368 | ||
|
32e6c637ec | ||
|
8a8232109c | ||
|
6f3d50bfb2 | ||
|
f3ead808f3 | ||
|
7a26ba43f6 | ||
|
276502ce58 | ||
|
463dbd59ec | ||
|
8899fcfdc2 | ||
|
166c4eeb7e | ||
|
bf55502c62 | ||
|
e101f02473 | ||
|
f5b14a95b4 | ||
|
df5fcafcb9 | ||
|
cfeb747f10 | ||
|
ef593afec5 | ||
|
51da43f77f | ||
|
e328ee96d2 | ||
|
4b206ee28b | ||
|
7f11c1b46d | ||
|
ae18669fcd | ||
|
9ea4aabe9a | ||
|
a88040df85 | ||
|
fcf89208cf | ||
|
85e60c7816 | ||
|
d365f17ebd | ||
|
6f345e43cb | ||
|
874fb7bf8a | ||
|
558b8ae7ed | ||
|
acddce37e6 | ||
|
05fafdc445 | ||
|
c6fd14352e | ||
|
477f5d9e1d | ||
|
92e545fc26 | ||
|
c330500c4d | ||
|
9fcf956888 | ||
|
40ed6c6458 | ||
|
cd34cdedee | ||
|
e850915190 | ||
|
f22784f0a4 | ||
|
d14f98f672 | ||
|
130c10915e | ||
|
fc86b5a2d0 | ||
|
7d8b4d5817 | ||
|
9ecf09dbe8 | ||
|
f986138467 | ||
|
611faafaf3 | ||
|
ed0b5020a9 | ||
|
b2d2216b87 | ||
|
766ecaed5a | ||
|
b8e66f43dc | ||
|
a7a53de34d | ||
|
9cb10ec28d | ||
|
df5822141e | ||
|
6aa980eadb | ||
|
dbf0b9ebe6 | ||
|
874fb8c59c | ||
|
43dcf73a21 | ||
|
e195e2ad82 | ||
|
9aebbcc1a0 | ||
|
de31c4e797 | ||
|
7b734ef529 | ||
|
6753961756 | ||
|
d2295b82f1 | ||
|
74845a6b3a | ||
|
f13b17fd00 | ||
|
546cf61dbd | ||
|
d67493e887 | ||
|
149d0bd227 | ||
|
8c8f7315ea | ||
|
eb12d385a0 | ||
|
b502fe9fbc | ||
|
d318768634 | ||
|
843cb97048 | ||
|
9ecd1e4dd4 | ||
|
b5f867c3cc | ||
|
ec1f322440 | ||
|
a85c36b15e | ||
|
19f534770d | ||
|
76ab83893b | ||
|
222ca643b5 | ||
|
9aec69413f | ||
|
4573e2eae0 | ||
|
42108b5e11 | ||
|
241cd5f41a | ||
|
2267ef1ac2 | ||
|
3f73ae8545 | ||
|
6f45b46746 | ||
|
a05ce5fd59 | ||
|
844bf0141f | ||
|
df43810f55 | ||
|
f81c217015 | ||
|
2008035527 | ||
|
42252460a9 | ||
|
8dd6b5373d | ||
|
6c45c1ff6b | ||
|
18a672c16e | ||
|
4a3367e594 | ||
|
d60998ba69 | ||
|
03ac7a6d5e | ||
|
8f1a777c5f | ||
|
17a50027b1 | ||
|
c219abf726 | ||
|
6f5035597a | ||
|
663100a44f | ||
|
1c8128292c | ||
|
eb37600df0 | ||
|
25bd56c254 | ||
|
e83f25a448 | ||
|
d1e2e39469 | ||
|
7da461eac4 | ||
|
9d51ca3eb7 | ||
|
4c721de243 | ||
|
5d11098753 | ||
|
1baf5c295e | ||
|
3e23839c04 | ||
|
d0c48f3fde | ||
|
b7076f5cd4 | ||
|
abffd0f662 | ||
|
82db151303 | ||
|
adf53d3264 | ||
|
0871522326 | ||
|
a9576a4084 | ||
|
98929ca983 | ||
|
3b5777f900 | ||
|
6943fbba89 | ||
|
c07c6816fc | ||
|
e333d96eef | ||
|
716c1ca8eb | ||
|
5e9d8662d1 | ||
|
12e9c3d082 | ||
|
70d61a4e91 | ||
|
7c36c0c5bd | ||
|
b38e8a2c84 | ||
|
98ad0750f0 | ||
|
b2459edaf3 | ||
|
3a3971053c | ||
|
48b832b864 | ||
|
ff96c1a907 | ||
|
e7d928d6ef | ||
|
b4a343bdc9 | ||
|
1ec51c99e5 | ||
|
385de647ec | ||
|
6ee64c94a2 | ||
|
9c51a7866b | ||
|
51b3d9de63 | ||
|
bda99e1c35 | ||
|
fc23fd39d2 | ||
|
ddb4f142a6 | ||
|
511d96a522 | ||
|
6c5518157d | ||
|
e586cd833c | ||
|
fcfed79385 | ||
|
6d47a6c6dc | ||
|
93a6b8d87a | ||
|
fc14c5fd0b | ||
|
f36542c661 | ||
|
158ccd17ff | ||
|
690370fac0 | ||
|
a3f6563568 | ||
|
e993d82bc5 | ||
|
9d8d82e176 | ||
|
44861c1f45 | ||
|
5ada5728ee | ||
|
4e9fb6ed4f | ||
|
adf639e871 | ||
|
a86d222ab0 | ||
|
d79e10e032 | ||
|
bfc3a969ee | ||
|
8d9a7aa62c | ||
|
fa91bf791f | ||
|
d85da61c9a | ||
|
2da2211898 | ||
|
479e54db93 | ||
|
f3eb774abd | ||
|
6b00e9fe09 | ||
|
5098f315fd | ||
|
79ff21fdf5 | ||
|
b779ce5910 | ||
|
c35e9c2438 | ||
|
6cc8df5d95 | ||
|
21ccb804d3 | ||
|
3cbe14eb4a | ||
|
7410c3be6f | ||
|
3513c85ee6 | ||
|
974b7a9184 | ||
|
a8dc08a219 | ||
|
ad196d1dba | ||
|
edaff6cd2d | ||
|
e97313839e | ||
|
b3777894cb | ||
|
ac6512da14 | ||
|
98e0559a1d | ||
|
166f0deae9 | ||
|
e177ee3750 | ||
|
06458c95f5 | ||
|
7092f24645 | ||
|
d4b6ad5620 | ||
|
35259056f0 | ||
|
0395c8dbac | ||
|
ff27401ed2 | ||
|
199bc8f964 | ||
|
9bd9962aea | ||
|
c4a8e32689 | ||
|
5fba4682c3 | ||
|
af29f388da | ||
|
be21479b2a | ||
|
ec3dc28b51 | ||
|
af31080445 | ||
|
83cf915758 | ||
|
1c64c695a9 | ||
|
873a22176d | ||
|
d05e2dd043 | ||
|
769f5bc397 | ||
|
3feeb237ca | ||
|
5c51f2ef7f | ||
|
07d3376612 | ||
|
464f37fe46 | ||
|
c46b700e22 | ||
|
4adf5ac99f | ||
|
3cc3bc7e81 | ||
|
873c838d57 | ||
|
2c29c8352a | ||
|
ab9f636ad6 | ||
|
763c6f625f | ||
|
35f4dc7691 | ||
|
7a734f7f74 | ||
|
b05082e011 | ||
|
06672d896b | ||
|
4afa184110 | ||
|
12a942747a | ||
|
a700111808 | ||
|
c654b9b702 | ||
|
602841fd11 | ||
|
ae3c294a2f | ||
|
86af3c0f56 | ||
|
ba2421ec0e | ||
|
00b8cb1e52 | ||
|
946fb7d9a4 | ||
|
be93efee1d | ||
|
232dfa6b20 | ||
|
d8608e4ba5 | ||
|
073e19552f | ||
|
6fe2012bf8 | ||
|
eabe2632dc | ||
|
3c75fedffe | ||
|
aa3f253030 | ||
|
ad5e2a3602 | ||
|
da48c178ea | ||
|
580ce4ca42 | ||
|
3b7795ecc0 | ||
|
db56017d57 | ||
|
9af61c1f1e | ||
|
75b2579aa9 | ||
|
8bbb4aa25d | ||
|
91af7e5df6 | ||
|
1c961e4531 | ||
|
455d6b071b | ||
|
e4974888bd | ||
|
302e9000e6 | ||
|
cb33889999 | ||
|
c000089cfd | ||
|
ce8b31130c | ||
|
73806f9342 | ||
|
112392bcf3 | ||
|
9401ce1c5f | ||
|
ec7180db4f | ||
|
99884d8bbb | ||
|
3abcd746ab | ||
|
512a93727a | ||
|
e5ddf24fb9 | ||
|
c4642d2502 | ||
|
f3a596b78b | ||
|
887b1e25fb | ||
|
f31ea59a1a | ||
|
39cad1d235 | ||
|
61a28c154b | ||
|
c73e7bfe05 | ||
|
00a9c130ac | ||
|
9f099a75cd | ||
|
565053f508 | ||
|
6593440b56 | ||
|
5a922ffa5b | ||
|
af05fe4f19 | ||
|
e42b743b86 | ||
|
5d53089651 | ||
|
661a8a6117 | ||
|
b4ff57e2a4 | ||
|
c6c299eea4 | ||
|
bedc86ea2d | ||
|
95f5f6730e | ||
|
e4d5cbbc76 | ||
|
b6951fa44a | ||
|
ae7100957c | ||
|
327b891ee1 | ||
|
0c2fa3a065 | ||
|
5afa5db41f | ||
|
d2ac8a3abd | ||
|
dc415768a8 | ||
|
83f9838217 | ||
|
6a8140e82b | ||
|
f9863f9b34 | ||
|
3c66dc0128 | ||
|
213d092f6f | ||
|
59f387e828 | ||
|
c31ac7348a | ||
|
0ae7e3f992 | ||
|
5a1fe1db12 | ||
|
afe41e3916 | ||
|
0ad712b4e2 | ||
|
3477562c58 | ||
|
b1c5401ba8 | ||
|
d5d449b78e | ||
|
6c43f81e8d | ||
|
856ce16a87 | ||
|
bc5c095363 | ||
|
fc29dfd9df | ||
|
9ba6e9b60d | ||
|
bf26da660a | ||
|
a9b5dcd954 | ||
|
5b1ef39c08 | ||
|
7e5e499615 | ||
|
303f8f55cb | ||
|
100294d5e7 | ||
|
c6fe842bc8 | ||
|
e6edd24a2b | ||
|
c98778dbf6 | ||
|
b4b7199ed5 | ||
|
09cc08ea74 | ||
|
fdb28d1d06 | ||
|
1f5ae7be76 | ||
|
3db2089208 | ||
|
0434bce5af | ||
|
bd6cd8f2fc | ||
|
a1b41f25ef | ||
|
a531d6071b | ||
|
7f80772eda | ||
|
5cc4691d87 | ||
|
485cd776d1 | ||
|
92e678a116 | ||
|
c098468699 | ||
|
613582e2c5 | ||
|
604d776dd7 | ||
|
58b777b51c | ||
|
13361a3b4b | ||
|
eacfe7be7b | ||
|
744bf162b3 | ||
|
0901633349 | ||
|
51ea6d8241 | ||
|
21b389bb81 | ||
|
63473239f2 | ||
|
8a15670055 | ||
|
8e80d734c8 | ||
|
598f899fb8 | ||
|
e54d54488c | ||
|
54bb32bba5 | ||
|
d7389809aa | ||
|
0f18869702 | ||
|
040b277fd9 | ||
|
66cb07d2f4 | ||
|
a0bd70885d | ||
|
0be1ffd296 | ||
|
0414536727 | ||
|
f9a0e4d606 | ||
|
9b8b34e8f3 | ||
|
927f33fad3 | ||
|
2d53b8f947 | ||
|
dcbd4a54aa | ||
|
7b551adb2b | ||
|
cf26a30030 | ||
|
872439b8f4 | ||
|
1a4e6fe3e8 | ||
|
6048458a12 | ||
|
c88a9f0b01 | ||
|
cf0e747d51 | ||
|
658e8effd5 | ||
|
8a5a26be87 | ||
|
026d66dab2 | ||
|
43b35e1560 | ||
|
ec4a53169a | ||
|
d99968a800 | ||
|
d4a4dd453a | ||
|
8bdda472bf | ||
|
7739eb2cfe | ||
|
9b77dd0283 | ||
|
9048aed163 | ||
|
3563f20991 | ||
|
40b1d1e6ff | ||
|
e7015bf1dd | ||
|
64ab1fc24c | ||
|
728b200cd9 | ||
|
7267df431f | ||
|
9373fa3edb | ||
|
c8b8675dff | ||
|
95de576ccd | ||
|
64af01f528 | ||
|
5ae1d9eac6 | ||
|
caddc73e06 | ||
|
43e69df080 | ||
|
573fe5ddf8 | ||
|
8758cb641f | ||
|
f6b4c5b70d | ||
|
d65141aa75 | ||
|
fe84120bf2 | ||
|
6710bba04a | ||
|
0e1e792574 | ||
|
f177cfa386 | ||
|
7d1e637a0a | ||
|
7efadf46a6 | ||
|
98209b91ba | ||
|
6f79608c76 | ||
|
fb4ea608e3 | ||
|
d4178511a2 | ||
|
010464c2a4 | ||
|
0e3bc638e9 | ||
|
dd549a5e43 | ||
|
526c79d2e2 | ||
|
8afc638171 | ||
|
9e130333c0 | ||
|
8a951a6ad3 | ||
|
be9e833661 | ||
|
101d8fd52e | ||
|
00d349cfbb | ||
|
2b7d8020b9 | ||
|
bb7e7b682d | ||
|
4955de8104 | ||
|
37039f95d2 | ||
|
da7c0da151 | ||
|
993e28098d | ||
|
9ec60b4523 | ||
|
9a1a613c0c | ||
|
25c20cbcf3 | ||
|
2e6d825046 | ||
|
88bbd0fca6 | ||
|
d90e97342a | ||
|
eed57fd089 | ||
|
58fc9e042a | ||
|
5ab3916311 | ||
|
79b8f56427 | ||
|
a86f64fbe9 | ||
|
593c4b875c | ||
|
2e93f5f3e8 | ||
|
959f60a591 | ||
|
607a2c483a | ||
|
70ba9dac03 | ||
|
88385d6da2 | ||
|
7e6c5df710 | ||
|
90973a52b4 | ||
|
4eef6a4de4 | ||
|
01b8d6a58e | ||
|
31b3d56ac1 | ||
|
ccf6e6c255 | ||
|
8fe3a97a1a | ||
|
2c5519da39 | ||
|
0c90bf0000 | ||
|
edc610e81d | ||
|
831942a022 | ||
|
e071cd801a | ||
|
228e2437b2 | ||
|
ac76b80cb1 | ||
|
d4e0840e6f | ||
|
137422116e | ||
|
3cc2e41af8 | ||
|
1e3d9f99b4 | ||
|
5f8c9962a0 | ||
|
4ed18355e9 | ||
|
dc9ef40669 | ||
|
4baa3e778d | ||
|
154f0e719d | ||
|
8abf9b66e1 | ||
|
14b7caecd1 | ||
|
a54f5c0ca0 | ||
|
5b79ac0fc9 | ||
|
21c38e2572 | ||
|
706c788f28 | ||
|
6d07852410 | ||
|
06f38a5646 | ||
|
1cc6a479a1 | ||
|
36ea0c1f2e | ||
|
99fabe2eb8 | ||
|
0a8391857f | ||
|
7fcfcec600 | ||
|
233d6a0a69 | ||
|
91b3627236 | ||
|
368239a0fc | ||
|
9dec6d3176 | ||
|
6fac65d193 | ||
|
2ff409ae4d | ||
|
42bf5778d5 | ||
|
4bf78d139b | ||
|
d76c571ad1 | ||
|
4046365977 | ||
|
4cd895e456 | ||
|
c480dd8d2f | ||
|
266376af2e | ||
|
c4f42c1573 | ||
|
d8ac6f575e | ||
|
752800ba19 | ||
|
715c0ad608 | ||
|
745dd5f5a8 | ||
|
346523fad6 | ||
|
71f04e7337 | ||
|
78aca08d39 | ||
|
3dfe60b620 | ||
|
90b1c2210e | ||
|
a04af20806 | ||
|
88dcb5d3d5 | ||
|
6e7c366189 | ||
|
2d3781f285 | ||
|
b724e82bbd | ||
|
76748edf71 | ||
|
3163b1726c | ||
|
6b6c710706 | ||
|
a78eb6fb42 | ||
|
3b622bc005 | ||
|
b14f37d409 | ||
|
b0248d2d78 | ||
|
f2e4bdc481 | ||
|
e9445bfeb5 | ||
|
042feffed8 | ||
|
fd21296a18 | ||
|
104e56f56f | ||
|
e55e2f17d3 | ||
|
54f9b95bea | ||
|
31d30ae01d | ||
|
d86c51f9e3 | ||
|
94279d8ead | ||
|
0f38ece743 | ||
|
276d793c7b | ||
|
eee8d80aae | ||
|
686f034c39 | ||
|
e80cf43adc | ||
|
0a395ebb6d | ||
|
54ea9e0aef | ||
|
78dba4c4c0 | ||
|
2803f04d35 | ||
|
aba7f4a9e6 | ||
|
d59a4d4aad | ||
|
8360752b2a | ||
|
4513d1c0af | ||
|
74fe9f40b7 | ||
|
10330e5867 | ||
|
2563561663 | ||
|
facd14b47e | ||
|
9515abdb91 | ||
|
7ba5f8f22a | ||
|
f99d1a7a51 | ||
|
33dfaa478c | ||
|
735b826063 | ||
|
bbe2b21310 | ||
|
9e55d3cb44 | ||
|
a14e8f8ce5 | ||
|
aefdd86020 | ||
|
aafb522538 |
|
@ -30,7 +30,7 @@ installer:
|
|||
server:
|
||||
cookie_secure: false
|
||||
server_protocol: http://
|
||||
force_server_vars: false
|
||||
force_server_vars: true
|
||||
server_name: localhost
|
||||
server_port: 80
|
||||
script_path: /
|
||||
|
|
|
@ -34,6 +34,14 @@ sudo ln -s /workspaces/phpbb/phpBB /var/www/html
|
|||
echo "[Codespaces] Copy phpBB configuration"
|
||||
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
|
||||
echo "[Codespaces] Run phpBB CLI installation"
|
||||
cd /workspaces/phpbb/phpBB && composer install --no-interaction
|
||||
|
|
1
.github/check-js.sh
vendored
|
@ -15,4 +15,5 @@ sudo npm install -g > /dev/null
|
|||
npm ci > /dev/null
|
||||
set -x
|
||||
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"
|
||||
|
|
49
.github/workflows/tests.yml
vendored
|
@ -29,7 +29,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 100
|
||||
|
||||
|
@ -48,7 +48,7 @@ jobs:
|
|||
cd ..
|
||||
|
||||
- name: Cache Composer dependencies
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ steps.composer-cache.outputs.dir }}
|
||||
key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }}
|
||||
|
@ -166,7 +166,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- id: database-type
|
||||
env:
|
||||
|
@ -192,7 +192,7 @@ jobs:
|
|||
cd ..
|
||||
|
||||
- name: Cache Composer dependencies
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ steps.composer-cache.outputs.dir }}
|
||||
key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }}
|
||||
|
@ -217,6 +217,13 @@ jobs:
|
|||
run: |
|
||||
.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
|
||||
run: |
|
||||
.github/setup-sphinx.sh
|
||||
|
@ -296,7 +303,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- id: database-type
|
||||
env:
|
||||
|
@ -322,7 +329,7 @@ jobs:
|
|||
cd ..
|
||||
|
||||
- name: Cache Composer dependencies
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ steps.composer-cache.outputs.dir }}
|
||||
key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }}
|
||||
|
@ -342,6 +349,13 @@ jobs:
|
|||
run: |
|
||||
.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
|
||||
env:
|
||||
DB: ${{steps.database-type.outputs.db}}
|
||||
|
@ -396,7 +410,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- id: database-type
|
||||
env:
|
||||
|
@ -427,7 +441,7 @@ jobs:
|
|||
cd ..
|
||||
|
||||
- name: Cache Composer dependencies
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ steps.composer-cache.outputs.dir }}
|
||||
key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }}
|
||||
|
@ -447,6 +461,13 @@ jobs:
|
|||
run: |
|
||||
.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
|
||||
env:
|
||||
DB: ${{steps.database-type.outputs.db}}
|
||||
|
@ -470,7 +491,7 @@ jobs:
|
|||
git config --system core.autocrlf false
|
||||
git config --system core.eol lf
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
|
@ -488,7 +509,7 @@ jobs:
|
|||
cd ..
|
||||
|
||||
- name: Cache Composer dependencies
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ steps.composer-cache.outputs.dir }}
|
||||
key: composer-${{ matrix.php }}-${{ hashFiles('phpBB/composer.lock') }}
|
||||
|
@ -555,6 +576,14 @@ jobs:
|
|||
psql -c 'create database phpbb_tests;' -U postgres
|
||||
Set-MpPreference -ExclusionPath "${env:PGDATA}" # Exclude PGDATA directory from Windows Defender
|
||||
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
|
||||
if: ${{ matrix.type == 'unit' }}
|
||||
run: |
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
<project name="phpBB" description="The phpBB forum software" default="all" basedir="../">
|
||||
<!-- a few settings for the build -->
|
||||
<property name="newversion" value="4.0.0-a1-dev" />
|
||||
<property name="prevversion" value="3.3.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" />
|
||||
<property name="prevversion" value="3.3.12-RC1" />
|
||||
<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" />
|
||||
<!-- no configuration should be needed beyond this point -->
|
||||
|
||||
<property name="oldversions" value="${olderversions}, ${prevversion}" />
|
||||
|
|
BIN
composer.phar
BIN
doctum.phar
|
@ -34,6 +34,12 @@ then
|
|||
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");
|
||||
|
||||
# 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")" ];
|
||||
then
|
||||
tail="$(printf '\n\nSECURITY-%s' "$ticket_id")";
|
||||
|
|
15
gulpfile.js
|
@ -2,8 +2,7 @@
|
|||
|
||||
const gulp = require('gulp');
|
||||
const rename = require('gulp-rename');
|
||||
const sourcemaps = require('gulp-sourcemaps');
|
||||
const concat = require('gulp-concat-css');
|
||||
const concat = require('gulp-concat');
|
||||
const postcss = require('gulp-postcss');
|
||||
const autoprefixer = require('autoprefixer');
|
||||
const cssnano = require('cssnano');
|
||||
|
@ -19,16 +18,14 @@ const paths = {
|
|||
};
|
||||
|
||||
function styles() {
|
||||
return gulp.src(paths.styles.src)
|
||||
.pipe(sourcemaps.init())
|
||||
return gulp.src(paths.styles.src, { sourcemaps: true })
|
||||
.pipe(
|
||||
postcss([
|
||||
autoprefixer(),
|
||||
sorting(sortOrder),
|
||||
]),
|
||||
)
|
||||
.pipe(sourcemaps.write('./'))
|
||||
.pipe(gulp.dest(paths.styles.css));
|
||||
.pipe(gulp.dest(paths.styles.css, { sourcemaps: './' }));
|
||||
}
|
||||
|
||||
function minify() {
|
||||
|
@ -47,8 +44,7 @@ function minify() {
|
|||
paths.styles.css + 'colours.css',
|
||||
paths.styles.css + 'responsive.css',
|
||||
paths.styles.css + 'bidi.css',
|
||||
])
|
||||
.pipe(sourcemaps.init())
|
||||
], { sourcemaps: true })
|
||||
.pipe(concat('stylesheet.css'))
|
||||
.pipe(
|
||||
postcss([
|
||||
|
@ -59,8 +55,7 @@ function minify() {
|
|||
suffix: '.min',
|
||||
extname: '.css',
|
||||
}))
|
||||
.pipe(sourcemaps.write('./'))
|
||||
.pipe(gulp.dest(paths.styles.css));
|
||||
.pipe(gulp.dest(paths.styles.css, { sourcemaps: './' }));
|
||||
}
|
||||
|
||||
function watch() {
|
||||
|
|
9808
package-lock.json
generated
16
package.json
|
@ -56,11 +56,7 @@
|
|||
"always"
|
||||
],
|
||||
"no-lonely-if": "off",
|
||||
"unicorn/prefer-module": "off",
|
||||
"space-before-function-paren": [
|
||||
"error",
|
||||
"never"
|
||||
]
|
||||
"unicorn/prefer-module": "off"
|
||||
},
|
||||
"env": {
|
||||
"es6": true,
|
||||
|
@ -107,14 +103,14 @@
|
|||
"cssnano": "^5.1.7",
|
||||
"eslint": "^8.13.0",
|
||||
"eslint-config-xo": "^0.40.0",
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-concat-css": "^3.1.0",
|
||||
"gulp": "^5.0.0",
|
||||
"gulp-concat": "^2.6.1",
|
||||
"gulp-postcss": "^9.0.1",
|
||||
"gulp-rename": "^2.0.0",
|
||||
"gulp-sourcemaps": "^3.0.0",
|
||||
"postcss": "^8.4.12",
|
||||
"postcss": "^8.4.31",
|
||||
"postcss-sorting": "^7.0.1",
|
||||
"stylelint": "^14.7.0",
|
||||
"stylelint-order": "^5.0.0"
|
||||
"stylelint-order": "^5.0.0",
|
||||
"web-push-testing": "^1.1.1"
|
||||
}
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 51 B |
Before Width: | Height: | Size: 49 B |
Before Width: | Height: | Size: 49 B |
Before Width: | Height: | Size: 51 B |
Before Width: | Height: | Size: 182 B |
Before Width: | Height: | Size: 48 B |
Before Width: | Height: | Size: 48 B |
Before Width: | Height: | Size: 48 B |
Before Width: | Height: | Size: 48 B |
Before Width: | Height: | Size: 416 B |
Before Width: | Height: | Size: 385 B |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 420 B |
Before Width: | Height: | Size: 826 B |
Before Width: | Height: | Size: 344 B |
Before Width: | Height: | Size: 358 B |
Before Width: | Height: | Size: 229 B |
Before Width: | Height: | Size: 357 B |
Before Width: | Height: | Size: 570 B |
Before Width: | Height: | Size: 357 B |
Before Width: | Height: | Size: 192 B |
Before Width: | Height: | Size: 255 B |
Before Width: | Height: | Size: 249 B |
Before Width: | Height: | Size: 239 B |
Before Width: | Height: | Size: 166 B |
Before Width: | Height: | Size: 242 B |
Before Width: | Height: | Size: 239 B |
Before Width: | Height: | Size: 662 B |
Before Width: | Height: | Size: 708 B |
Before Width: | Height: | Size: 681 B |
Before Width: | Height: | Size: 725 B |
Before Width: | Height: | Size: 251 B |
Before Width: | Height: | Size: 246 B |
Before Width: | Height: | Size: 307 B |
Before Width: | Height: | Size: 240 B |
Before Width: | Height: | Size: 168 B |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 6.5 KiB |
|
@ -63,12 +63,13 @@ $template->set_custom_style(
|
|||
],
|
||||
[
|
||||
$phpbb_admin_path . 'style',
|
||||
$phpbb_root_path . 'styles/all/imgs/',
|
||||
$phpbb_root_path . 'styles/all/template/',
|
||||
],
|
||||
);
|
||||
|
||||
$template->assign_var('T_ASSETS_PATH', $phpbb_root_path . 'assets');
|
||||
$template->assign_var('T_TEMPLATE_PATH', $phpbb_admin_path . 'style');
|
||||
$template->assign_var('T_ASSETS_PATH', $phpbb_path_helper->update_web_root_path($phpbb_root_path . 'assets'));
|
||||
$template->assign_var('T_TEMPLATE_PATH', $phpbb_path_helper->update_web_root_path($phpbb_root_path . 'style'));
|
||||
|
||||
// Instantiate new module
|
||||
$module = new p_master();
|
||||
|
|
|
@ -17,52 +17,52 @@
|
|||
<div class="avatar-cropper-buttons" id="avatar-cropper-buttons">
|
||||
<div class="button-group">
|
||||
<button class="button" type="button" title="{{ lang('ZOOM_IN') }}" data-cropper-action="zoom,0.1">
|
||||
<i class="icon fa-search-plus fa-fw"></i>
|
||||
{{ Icon('font', 'search-plus', '', true) }}
|
||||
</button>
|
||||
<button class="button" type="button" title="{{ lang('ZOOM_OUT') }}" data-cropper-action="zoom,-0.1">
|
||||
<i class="icon fa-search-minus fa-fw"></i>
|
||||
{{ Icon('font', 'search-minus', '', true) }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="button-group">
|
||||
<button class="button" type="button" title="{{ lang('MOVE_LEFT') }}" data-cropper-action="move,-10,0">
|
||||
<i class="icon fa-arrow-left fa-fw"></i>
|
||||
{{ Icon('font', 'arrow-left', '', true) }}
|
||||
</button>
|
||||
<button class="button" type="button" title="{{ lang('MOVE_RIGHT') }}" data-cropper-action="move,10,0">
|
||||
<i class="icon fa-arrow-right fa-fw"></i>
|
||||
{{ Icon('font', 'arrow-right', '', true) }}
|
||||
</button>
|
||||
<button class="button" type="button" title="{{ lang('MOVE_UP') }}" data-cropper-action="move,0,-10">
|
||||
<i class="icon fa-arrow-up fa-fw"></i>
|
||||
{{ Icon('font', 'arrow-up', '', true) }}
|
||||
</button>
|
||||
<button class="button" type="button" title="{{ lang('MOVE_DOWN') }}" data-cropper-action="move,0,10">
|
||||
<i class="icon fa-arrow-down fa-fw"></i>
|
||||
{{ Icon('font', 'arrow-down', '', true) }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="button-group">
|
||||
<button class="button" type="button" title="{{ lang('ROTATE_LEFT') }}" data-cropper-action="rotate,-90">
|
||||
<i class="icon fa-rotate-left fa-fw"></i>
|
||||
{{ Icon('font', 'rotate-left', '', true) }}
|
||||
</button>
|
||||
<button class="button" type="button" title="{{ lang('ROTATE_RIGHT') }}" data-cropper-action="rotate,90">
|
||||
<i class="icon fa-rotate-right fa-fw"></i>
|
||||
{{ Icon('font', 'rotate-right', '', true) }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="button-group">
|
||||
<button class="button" type="button" title="{{ lang('FLIP_HORIZONTALLY') }}" data-cropper-action="scaleX">
|
||||
<i class="icon fa-arrows-h fa-fw"></i>
|
||||
{{ Icon('font', 'arrows-left-right', '', true) }}
|
||||
</button>
|
||||
<button class="button" type="button" title="{{ lang('FLIP_VERTICALLY') }}" data-cropper-action="scaleY">
|
||||
<i class="icon fa-arrows-v fa-fw"></i>
|
||||
{{ Icon('font', 'arrows-up-down', '', true) }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="button-group">
|
||||
<button class="button" type="button" title="{{ lang('RESET') }}" data-cropper-action="reset">
|
||||
<i class="icon fa-refresh fa-fw"></i>
|
||||
{{ Icon('font', 'arrows-rotate', '', true) }}
|
||||
</button>
|
||||
<button class="button" type="button" title="{{ lang('CLEAR') }}" data-cropper-action="clear">
|
||||
<i class="icon fa-times fa-fw"></i>
|
||||
{{ Icon('font', 'xmark', '', true) }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -11,11 +11,11 @@
|
|||
<script>
|
||||
// <![CDATA[
|
||||
|
||||
var ban_length = new Array();
|
||||
ban_length[-1] = '';
|
||||
var ban_reason = new Array();
|
||||
const ban_length = [];
|
||||
ban_length[-1] = '';
|
||||
const ban_reason = [];
|
||||
ban_reason[-1] = '';
|
||||
var ban_give_reason = new Array();
|
||||
const ban_give_reason = [];
|
||||
ban_give_reason[-1] = '';
|
||||
|
||||
<!-- BEGIN bans -->
|
||||
|
@ -43,6 +43,19 @@
|
|||
}
|
||||
}
|
||||
|
||||
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>
|
||||
|
||||
|
@ -60,11 +73,6 @@
|
|||
<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>
|
||||
</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>
|
||||
<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>
|
||||
|
@ -90,44 +98,41 @@
|
|||
|
||||
<p>{L_UNBAN_EXPLAIN}</p>
|
||||
|
||||
<form id="acp_unban" method="post" action="{U_ACTION}">
|
||||
<form id="acp_unban" method="post" action="{{ U_ACTION }}">
|
||||
|
||||
<fieldset>
|
||||
<legend>{L_UNBAN_TITLE}</legend>
|
||||
<legend>{{ lang('UNBAN_TITLE') }}</legend>
|
||||
|
||||
<!-- IF S_BANNED_OPTIONS -->
|
||||
{% if BANNED_SELECT %}
|
||||
<dl>
|
||||
<dt><label for="unban">{L_BAN_CELL}{L_COLON}</label></dt>
|
||||
<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>
|
||||
<dt><label for="unban">{{ lang('BAN_CELL') ~ lang('COLON') }}</label></dt>
|
||||
<dd>
|
||||
{{ FormsSelect(BANNED_SELECT) }}
|
||||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="unbanlength">{L_BAN_LENGTH}{L_COLON}</label></dt>
|
||||
<dt><label for="unbanlength">{{ lang('BAN_LENGTH') ~ lang('COLON') }}</label></dt>
|
||||
<dd><input style="border: 0;" type="text" class="text full" readonly="readonly" name="unbanlength" id="unbanlength" /></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="unbanreason">{L_BAN_REASON}{L_COLON}</label></dt>
|
||||
<dt><label for="unbanreason">{{ lang('BAN_REASON') ~ lang('COLON') }}</label></dt>
|
||||
<dd><textarea style="border: 0;" class="text full" readonly="readonly" name="unbanreason" id="unbanreason" rows="5" cols="80"> </textarea></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="unbangivereason">{L_BAN_GIVE_REASON}{L_COLON}</label></dt>
|
||||
<dt><label for="unbangivereason">{{ lang('BAN_GIVE_REASON') ~ lang('COLON') }}</label></dt>
|
||||
<dd><textarea style="border: 0;" class="text full" readonly="readonly" name="unbangivereason" id="unbangivereason" rows="5" cols="80"> </textarea></dd>
|
||||
</dl>
|
||||
|
||||
<p class="submit-buttons">
|
||||
<input class="button1" type="submit" id="unbansubmit" name="unbansubmit" value="{L_SUBMIT}" />
|
||||
<input class="button2" type="reset" id="unbanreset" name="unbanreset" value="{L_RESET}" />
|
||||
<input class="button1" type="submit" id="unbansubmit" name="unbansubmit" value="{{ lang('SUBMIT') }}" />
|
||||
<input class="button2" type="reset" id="unbanreset" name="unbanreset" value="{{ lang('RESET') }}" />
|
||||
</p>
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
|
||||
<!-- ELSE -->
|
||||
|
||||
<p>{L_NO_BAN_CELL}</p>
|
||||
{S_FORM_TOKEN}
|
||||
{% else %}
|
||||
<p>{{ lang('NO_BAN_CELL') }}</p>
|
||||
{% endif %}
|
||||
{{ S_FORM_TOKEN }}
|
||||
</fieldset>
|
||||
|
||||
<!-- ENDIF -->
|
||||
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
<td style="text-align: center;">
|
||||
<!-- IF enabled.S_VERSIONCHECK -->
|
||||
<strong class="<!-- IF enabled.S_UP_TO_DATE -->current-ext<!-- ELSE -->outdated-ext<!-- ENDIF -->">{enabled.META_VERSION}</strong>
|
||||
<!-- IF not enabled.S_UP_TO_DATE --><i class="fa fa-exclamation-circle outdated-ext" aria-hidden="true"></i><!-- ENDIF -->
|
||||
<!-- IF not enabled.S_UP_TO_DATE -->{{ Icon('font', 'circle-exclamation', '', true, 'fas outdated-ext') }}<!-- ENDIF -->
|
||||
<!-- ELSE -->
|
||||
{enabled.META_VERSION}
|
||||
<!-- ENDIF -->
|
||||
|
@ -78,7 +78,7 @@
|
|||
<td style="text-align: center;">
|
||||
<!-- IF disabled.S_VERSIONCHECK -->
|
||||
<strong class="<!-- IF disabled.S_UP_TO_DATE -->current-ext<!-- ELSE -->outdated-ext<!-- ENDIF -->">{disabled.META_VERSION}</strong>
|
||||
<!-- IF not disabled.S_UP_TO_DATE --><i class="fa fa-exclamation-circle outdated-ext" aria-hidden="true"></i><!-- ENDIF -->
|
||||
<!-- IF not disabled.S_UP_TO_DATE -->{{ Icon('font', 'circle-exclamation', '', true, 'fas outdated-ext') }}<!-- ENDIF -->
|
||||
<!-- ELSE -->
|
||||
{disabled.META_VERSION}
|
||||
<!-- ENDIF -->
|
||||
|
|
|
@ -348,7 +348,7 @@
|
|||
<!-- EVENT acp_forums_rules_settings_append -->
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- EVENT acp_forums_custom_settings -->
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
|
@ -472,7 +472,17 @@
|
|||
<tbody>
|
||||
<!-- BEGIN forums -->
|
||||
<tr>
|
||||
<td class="folder">{forums.FOLDER_IMAGE}</td>
|
||||
<td class="folder">
|
||||
<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">
|
||||
<!-- 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>
|
||||
|
|
|
@ -225,6 +225,7 @@
|
|||
|
||||
<fieldset>
|
||||
<legend>{L_ADD_USERS}</legend>
|
||||
{% EVENT acp_groups_add_user_options_before %}
|
||||
<dl>
|
||||
<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>
|
||||
|
@ -235,11 +236,13 @@
|
|||
<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>
|
||||
</dl>
|
||||
{% EVENT acp_groups_add_user_usernames_before %}
|
||||
<dl>
|
||||
<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><!-- 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>
|
||||
{% EVENT acp_groups_add_user_options_after %}
|
||||
|
||||
<p class="quick">
|
||||
<input class="button2" type="submit" name="addusers" value="{L_SUBMIT}" />
|
||||
|
|
|
@ -8,11 +8,11 @@
|
|||
<div class="send-stats-row">
|
||||
<!-- EVENT acp_help_phpbb_stats_before -->
|
||||
<div class="send-stats-tile">
|
||||
<h2><i class="icon fa-bar-chart"></i>{L_SEND_STATISTICS}</h2>
|
||||
<h2>{{ Icon('font', 'chart-column', lang('SEND_STATISTICS')) }}</h2>
|
||||
<p>{L_EXPLAIN_SEND_STATISTICS}</p>
|
||||
<div class="send-stats-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><i class="icon fa-angle-down"></i></a>
|
||||
<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>
|
||||
</div>
|
||||
<div class="send-stats-data-row">
|
||||
<div class="configlist" id="configlist">
|
||||
|
|
|
@ -14,27 +14,40 @@
|
|||
|
||||
<p>{L_ADMIN_INTRO}</p>
|
||||
|
||||
<!-- IF S_UPDATE_INCOMPLETE -->
|
||||
{% if S_UPDATE_INCOMPLETE %}
|
||||
<div class="errorbox">
|
||||
<p>{L_UPDATE_INCOMPLETE} <a href="{U_VERSIONCHECK}">{L_MORE_INFORMATION}</a></p>
|
||||
<p>{{ lang('UPDATE_INCOMPLETE') }} <a href="{{ U_VERSIONCHECK }}">{{ lang('MORE_INFORMATION') }}</a></p>
|
||||
</div>
|
||||
<!-- ELSEIF S_VERSIONCHECK_FAIL -->
|
||||
{% elseif S_VERSIONCHECK_FAIL %}
|
||||
<div class="errorbox notice">
|
||||
<p>{L_VERSIONCHECK_FAIL}</p>
|
||||
<p>{VERSIONCHECK_FAIL_REASON}</p>
|
||||
<p><a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE}</a> · <a href="{U_VERSIONCHECK}">{L_MORE_INFORMATION}</a></p>
|
||||
<p>{{ lang('VERSIONCHECK_FAIL') }}</p>
|
||||
<p>{{ VERSIONCHECK_FAIL_REASON }}</p>
|
||||
<p><a href="{{ U_VERSIONCHECK_FORCE }}">{{ lang('VERSIONCHECK_FORCE_UPDATE') }}</a> · <a href="{{ U_VERSIONCHECK }}">{{ lang('MORE_INFORMATION') }}</a></p>
|
||||
</div>
|
||||
<!-- ELSEIF not S_VERSION_UP_TO_DATE -->
|
||||
{% elseif not S_VERSION_UP_TO_DATE %}
|
||||
<div class="errorbox">
|
||||
<p>{L_VERSION_NOT_UP_TO_DATE_TITLE}</p>
|
||||
<p><a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE}</a> · <a href="{U_VERSIONCHECK}">{L_MORE_INFORMATION}</a></p>
|
||||
<p>{{ lang('VERSION_NOT_UP_TO_DATE_TITLE') }}</p>
|
||||
<p><a href="{{ U_VERSIONCHECK_FORCE }}">{{ lang('VERSIONCHECK_FORCE_UPDATE') }}</a> · <a href="{{ U_VERSIONCHECK }}">{{ lang('MORE_INFORMATION') }}</a></p>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_VERSION_UPGRADEABLE -->
|
||||
{% elseif S_VERSION_UP_TO_DATE && S_VERSIONCHECK_FORCE %}
|
||||
<div class="successbox">
|
||||
<p>{{ lang('VERSION_UP_TO_DATE_ACP') }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if S_VERSION_UPGRADEABLE %}
|
||||
<div class="errorbox notice">
|
||||
<p>{UPGRADE_INSTRUCTIONS}</p>
|
||||
<p>{{ UPGRADE_INSTRUCTIONS }}</p>
|
||||
</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 -->
|
||||
<div class="errorbox">
|
||||
|
|
|
@ -132,7 +132,16 @@
|
|||
<tbody>
|
||||
<!-- BEGIN modules -->
|
||||
<tr>
|
||||
<td style="width: 5%; text-align: center;">{modules.MODULE_IMAGE}</td>
|
||||
<td style="width: 5%; text-align: center;">
|
||||
<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 style="width: 15%; white-space: nowrap; text-align: center; vertical-align: middle;"> <!-- IF modules.MODULE_ENABLED --><a href="{modules.U_DISABLE}">{L_DISABLE}</a><!-- ELSE --><a href="{modules.U_ENABLE}">{L_ENABLE}</a><!-- ENDIF --> </td>
|
||||
<td class="actions">
|
||||
|
|
|
@ -288,6 +288,10 @@ li {
|
|||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.w-50 {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) {
|
||||
#wrap,
|
||||
#page-body,
|
||||
|
@ -330,7 +334,8 @@ li {
|
|||
}
|
||||
|
||||
#content {
|
||||
background: #f3f3f3 url("../images/innerbox_bg.gif") repeat-x top;
|
||||
background: #f3f3f3;
|
||||
background: linear-gradient(to bottom, #dbdee2 0%, #e0e2e5 27%, #ecedee 65%, #f3f3f3 100%);
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
|
@ -497,7 +502,8 @@ li {
|
|||
/* Main Panel
|
||||
---------------------------------------- */
|
||||
#acp {
|
||||
background: #f3f3f3 url("../images/innerbox_bg.gif") repeat-x top;
|
||||
background: #f3f3f3;
|
||||
background: linear-gradient(to bottom, #dbdee2 0%, #e0e2e5 27%, #ecedee 65%, #f3f3f3 100%);
|
||||
border: 1px #999999 solid;
|
||||
border-radius: 5px;
|
||||
box-shadow: #ffffff 0 0 0 1px inset;
|
||||
|
@ -513,7 +519,8 @@ li {
|
|||
}
|
||||
|
||||
.panel {
|
||||
background: #f3f3f3 url("../images/innerbox_bg.gif") repeat-x top;
|
||||
background: #f3f3f3;
|
||||
background: linear-gradient(to bottom, #dbdee2 0%, #e0e2e5 27%, #ecedee 65%, #f3f3f3 100%);
|
||||
border-radius: 5px;
|
||||
overflow: hidden;
|
||||
padding: 5px 0;
|
||||
|
@ -600,25 +607,47 @@ li {
|
|||
#menu li#activemenu a span {
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
background: transparent url("../images/arrow_right.gif") 0% 50% no-repeat;
|
||||
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 span {
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
background: #ffffff url("../images/arrow_right.gif") 1% 50% no-repeat;
|
||||
color: #bc2a4d;
|
||||
}
|
||||
|
||||
.rtl #menu li#activemenu a:hover span,
|
||||
.rtl #menu li#activemenu span {
|
||||
background: #ffffff url("../images/arrow_left.gif") 99% 50% no-repeat;
|
||||
#menu li#activemenu a span:before,
|
||||
#menu li#activemenu a:hover span:before,
|
||||
#menu li#activemenu span:before {
|
||||
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,
|
||||
|
@ -629,16 +658,30 @@ li {
|
|||
|
||||
#menu li span.completed {
|
||||
text-decoration: none;
|
||||
background: url("../images/arrow_down.gif") 1% 50% no-repeat;
|
||||
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 {
|
||||
text-decoration: none;
|
||||
background: url("../images/arrow_down.gif") 99% 50% no-repeat;
|
||||
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 {
|
||||
font-family: Tahoma, Helvetica, sans-serif;
|
||||
font-size: 0.75em;
|
||||
|
@ -730,7 +773,8 @@ th {
|
|||
font-size: 0.75em;
|
||||
text-align: left;
|
||||
text-transform: uppercase;
|
||||
background: #70aed3 url("../images/gradient2b.gif") bottom left repeat-x;
|
||||
background: #70aed3;
|
||||
background: linear-gradient(to bottom, #70aed3 0%, #5ba0c9 100%);
|
||||
border-top: 1px solid #6dacd2;
|
||||
border-bottom: 1px solid #327aa5;
|
||||
color: #ffffff;
|
||||
|
@ -1015,7 +1059,8 @@ table.fixed-width-table {
|
|||
font-weight: bold;
|
||||
text-align: left;
|
||||
text-transform: uppercase;
|
||||
background: #70aed3 url("../images/gradient2b.gif") bottom left repeat-x;
|
||||
background: #70aed3;
|
||||
background: linear-gradient(to bottom, #70aed3 0%, #5ba0c9 100%);
|
||||
border-top: 1px solid #6dacd2;
|
||||
border-bottom: 1px solid #327aa5;
|
||||
color: #ffffff;
|
||||
|
@ -1715,7 +1760,8 @@ a.button2,
|
|||
input.button2 {
|
||||
font-family: "Lucida Grande", Verdana, Helvetica, Arial, sans-serif;
|
||||
font-size: 0.85em;
|
||||
background: #efefef url("../images/bg_button.gif") repeat-x top;
|
||||
background: #efefef;
|
||||
background: linear-gradient(to bottom, #ffffff 0%, #d2d2d2 4%, #dfdfdf 26%, #efefef 65%, #efefef 100%);
|
||||
color: #000000;
|
||||
width: auto !important;
|
||||
padding: 1px 3px 0;
|
||||
|
@ -1759,7 +1805,8 @@ a.button1:hover,
|
|||
input.button1:hover,
|
||||
a.button2:hover,
|
||||
input.button2:hover {
|
||||
background: #efefef url("../images/bg_button.gif") repeat bottom;
|
||||
background: #efefef;
|
||||
background: linear-gradient(to bottom, #ffffff 0%, #d2d2d2 4%, #dfdfdf 26%, #efefef 65%, #efefef 100%);
|
||||
border: 1px solid #bc2a4d;
|
||||
color: #bc2a4d;
|
||||
}
|
||||
|
@ -1819,24 +1866,18 @@ input.button2:focus {
|
|||
display: none;
|
||||
width: 620px;
|
||||
margin: 0 auto;
|
||||
padding: 25px;
|
||||
padding: 0 25px 20px;
|
||||
}
|
||||
|
||||
.phpbb_alert .alert_close {
|
||||
text-decoration: none !important;
|
||||
background: transparent url("../images/alert_close.png") 0 0 no-repeat;
|
||||
display: block;
|
||||
font-size: 14px;
|
||||
float: right;
|
||||
overflow: hidden;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin-top: -7px;
|
||||
margin-right: -31px;
|
||||
margin-top: 2px;
|
||||
margin-right: -22px;
|
||||
}
|
||||
|
||||
.phpbb_alert .alert_close:hover {
|
||||
background-position: 0 -16px;
|
||||
color: #bc2a4d;
|
||||
}
|
||||
|
||||
.phpbb_alert p {
|
||||
|
@ -2347,11 +2388,11 @@ fieldset.permissions .permissions-switch {
|
|||
font-size: 0.85em;
|
||||
line-height: normal;
|
||||
min-width: 570px;
|
||||
margin: 0 0 -1px 7px;
|
||||
margin: 0 0 0 7px;
|
||||
}
|
||||
|
||||
.rtl .permissions-category {
|
||||
margin: 0 7px -1px 0;
|
||||
margin: 0 7px 0 0;
|
||||
}
|
||||
|
||||
.permissions-category ul {
|
||||
|
@ -2372,7 +2413,9 @@ fieldset.permissions .permissions-switch {
|
|||
|
||||
.permissions-category a {
|
||||
text-decoration: none;
|
||||
background: url("../images/bg_tabs_alt1.gif") no-repeat 0% -35px;
|
||||
background: #bcccd8;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 4px 4px 0 0;
|
||||
position: relative;
|
||||
float: left;
|
||||
margin: 0 1px 0 0;
|
||||
|
@ -2385,7 +2428,6 @@ fieldset.permissions .permissions-switch {
|
|||
|
||||
.permissions-category a span.tabbg {
|
||||
white-space: nowrap;
|
||||
background: url("../images/bg_tabs_alt2.gif") no-repeat 100% -35px;
|
||||
color: #536482;
|
||||
display: block;
|
||||
float: left;
|
||||
|
@ -2396,41 +2438,34 @@ fieldset.permissions .permissions-switch {
|
|||
float: right;
|
||||
}
|
||||
|
||||
/* Commented Backslash Hack hides rule from IE5-Mac \ */
|
||||
.permissions-category a span.tabbg,
|
||||
.rtl .permissions-category a span.tabbg {
|
||||
float: none;
|
||||
}
|
||||
|
||||
/* End hack */
|
||||
.permissions-category a:hover,
|
||||
.permissions-category a:hover span.tabbg {
|
||||
background-position: 100% -70px;
|
||||
background: #dfedfa;
|
||||
color: #dd6900;
|
||||
}
|
||||
|
||||
.permissions-category .activetab a,
|
||||
.permissions-category .activetab a:hover,
|
||||
.permissions-category .activetab a span.tabbg {
|
||||
background: #ccdcea;
|
||||
background: linear-gradient(to bottom, #eaf2f9 0%, #ccdcea 100%);
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.permissions-category .activetab a {
|
||||
background-position: 0 0;
|
||||
border-color: #cadceb;
|
||||
box-shadow: 0 1px 1px #f2f9ff inset;
|
||||
}
|
||||
|
||||
.permissions-category .activetab a span.tabbg {
|
||||
background-position: 100% 0;
|
||||
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;
|
||||
}
|
||||
|
||||
.permissions-category .activetab a:hover {
|
||||
background-position: 0 0;
|
||||
}
|
||||
|
||||
.permissions-category a span.colour {
|
||||
border: 1px solid #536482;
|
||||
display: block;
|
||||
|
@ -2804,8 +2839,16 @@ fieldset.permissions .permissions-switch {
|
|||
user-select: none;
|
||||
}
|
||||
|
||||
.roles-options > .button:hover {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.roles-options > .button:active {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.roles-options > span {
|
||||
background: url("../images/arrow_down.gif") no-repeat 245px 0.7em;
|
||||
background: transparent;
|
||||
border: 1px solid #dedede;
|
||||
border-radius: 3px;
|
||||
display: none;
|
||||
|
@ -2813,8 +2856,16 @@ fieldset.permissions .permissions-switch {
|
|||
padding: 4px;
|
||||
}
|
||||
|
||||
.rtl .roles-options > span {
|
||||
background: url("../images/arrow_down.gif") no-repeat 7px 0.7em;
|
||||
.roles-options > span:after {
|
||||
font-family: "Font Awesome 6 Free";
|
||||
float: right;
|
||||
content: "\f107";
|
||||
}
|
||||
|
||||
.rtl .roles-options > span:after {
|
||||
font-family: "Font Awesome 6 Free";
|
||||
float: left;
|
||||
content: "\f107";
|
||||
}
|
||||
|
||||
.roles-options li {
|
||||
|
@ -2956,11 +3007,6 @@ fieldset.permissions .permissions-switch {
|
|||
padding-right: 0.3em;
|
||||
}
|
||||
|
||||
.icon {
|
||||
font-family: FontAwesome;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.send-stats-data-row {
|
||||
background: #f9f9f9;
|
||||
border: #dedede 1px solid;
|
||||
|
@ -3009,12 +3055,14 @@ fieldset.permissions .permissions-switch {
|
|||
}
|
||||
|
||||
.send-stats-settings input[type="checkbox"] + label:before {
|
||||
font-family: FontAwesome;
|
||||
font-family: "Font Awesome 6 Free", "Font Awesome 6 Brands";
|
||||
font-size: 1.5em;
|
||||
content: "\f096";
|
||||
font-weight: 400;
|
||||
content: "\f0c8";
|
||||
}
|
||||
|
||||
.send-stats-settings input[type="checkbox"]:checked + label:before {
|
||||
font-weight: 900;
|
||||
color: #3c763d;
|
||||
content: "\f14a";
|
||||
}
|
||||
|
@ -3052,6 +3100,28 @@ fieldset.permissions .permissions-switch {
|
|||
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 {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
|
|
@ -157,6 +157,55 @@ 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
|
||||
* This call will submit permissions forms in chunks of 5 fieldsets.
|
||||
|
|
|
@ -1,74 +0,0 @@
|
|||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<a id="maincontent"></a>
|
||||
<a href="{U_ACTION}" style="float: {S_CONTENT_FLOW_END};">« {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}" />
|
||||
<input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" />
|
||||
<input class="button2" type="submit" id="preview" name="preview" value="{L_PREVIEW}" />
|
||||
</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 -->
|
|
@ -1,4 +1,3 @@
|
|||
<!-- IF S_RECAPTCHA_AVAILABLE -->
|
||||
<dl>
|
||||
<dd>
|
||||
<noscript>
|
||||
|
@ -7,9 +6,6 @@
|
|||
|
||||
{L_RECAPTCHA_INVISIBLE}
|
||||
<script src="{RECAPTCHA_SERVER}.js?hl={LA_RECAPTCHA_LANG}" async defer></script>
|
||||
<div class="g-recaptcha" data-sitekey="{RECAPTCHA_PUBKEY}" data-size="invisible"></div>
|
||||
<div class="g-recaptcha" data-sitekey="{% if RECAPTCHA_PUBKEY %}{{ RECAPTCHA_PUBKEY }}{% else %}6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI{% endif %}" data-size="invisible"></div>
|
||||
</dd>
|
||||
</dl>
|
||||
<!-- ELSE -->
|
||||
{L_RECAPTCHA_NOT_AVAILABLE}
|
||||
<!-- ENDIF -->
|
||||
|
|
|
@ -23,9 +23,10 @@ installLang = {
|
|||
</script>
|
||||
|
||||
<script src="{T_JQUERY_LINK}"></script>
|
||||
<!-- 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 -->
|
||||
<!-- 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 -->
|
||||
<script src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
|
||||
<!-- INCLUDEJS admin.js -->
|
||||
|
||||
{$SCRIPTS}
|
||||
|
||||
</body>
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
<!-- IF META -->{META}<!-- ENDIF -->
|
||||
<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" />
|
||||
</head>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<p>{L_FILES_DELETED_EXPLAIN}</p>
|
||||
|
||||
<fieldset id="deleted">
|
||||
<legend><img src="{T_IMAGE_PATH}/icon_delete.gif" alt="{L_STATUS_DELETED}" /></legend>
|
||||
<legend>{{ Icon('font', 'circle-xmark', lang('STATUS_DELETED'), true, '', {'style' : 'color:red;'}) }}</legend>
|
||||
<!-- BEGIN deleted -->
|
||||
<dl>
|
||||
<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>
|
||||
|
||||
<fieldset id="conflict">
|
||||
<legend><img src="{T_IMAGE_PATH}/file_conflict.gif" alt="{L_STATUS_CONFLICT}" /></legend>
|
||||
<legend>{{ Icon('font', 'circle-exclamation', lang('STATUS_CONFLICT'), true, '', {'style' : 'color:red;'}) }}</legend>
|
||||
<!-- BEGIN conflict -->
|
||||
<dl>
|
||||
<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>
|
||||
|
||||
<fieldset id="modified">
|
||||
<legend><img src="{T_IMAGE_PATH}/file_modified.gif" alt="{L_STATUS_MODIFIED}" /></legend>
|
||||
<legend>{{ Icon('font', 'circle-arrow-left', lang('STATUS_MODIFIED'), true, '', {'style' : 'color:#ffd43b;'}) }}</legend>
|
||||
<!-- BEGIN modified -->
|
||||
<dl>
|
||||
<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>
|
||||
|
||||
<fieldset id="new_files" style="display: none;">
|
||||
<legend><img src="{T_IMAGE_PATH}/file_new.gif" alt="{L_STATUS_NEW}" /></legend>
|
||||
<legend>{{ Icon('font', 'circle-plus', lang('STATUS_NEW'), true, '', {'style' : 'color:#ffd43b;'}) }}</legend>
|
||||
<!-- BEGIN new -->
|
||||
<dl>
|
||||
<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>
|
||||
|
||||
<fieldset id="not_modified" style="display: none;">
|
||||
<legend><img src="{T_IMAGE_PATH}/file_not_modified.gif" alt="{L_STATUS_NOT_MODIFIED}" /></legend>
|
||||
<legend>{{ Icon('font', 'lock', lang('STATUS_NOT_MODIFIED'), true, '', {'style' : 'color:#1180b7;'}) }}</legend>
|
||||
<!-- BEGIN not_modified -->
|
||||
<dl>
|
||||
<dt style="width: 100%;"><!-- IF not_modified.DIR_PART -->{not_modified.DIR_PART}<!-- ENDIF --><strong>{not_modified.FILE_PART}</strong></dt>
|
||||
|
|
|
@ -30,21 +30,34 @@
|
|||
</div>
|
||||
|
||||
<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"></a>
|
||||
<a href="#" class="alert_close">{{ Icon('font', 'circle-xmark', '', true) }}</a>
|
||||
<h3 class="alert_title"> </h3><p class="alert_text"></p>
|
||||
</div>
|
||||
<div id="phpbb_confirm" class="phpbb_alert">
|
||||
<a href="#" class="alert_close"></a>
|
||||
<a href="#" class="alert_close">{{ Icon('font', 'circle-xmark', '', true) }}</a>
|
||||
<div class="alert_text"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="{T_JQUERY_LINK}"></script>
|
||||
<!-- 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 -->
|
||||
<!-- 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 -->
|
||||
<script src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
|
||||
<!-- INCLUDEJS ajax.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 -->
|
||||
{$SCRIPTS}
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
<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}">
|
||||
<!-- 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 -->
|
||||
<!-- 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}
|
||||
|
@ -73,7 +73,7 @@
|
|||
<div class="permissions-category">
|
||||
<ul>
|
||||
<!-- ENDIF -->
|
||||
|
||||
|
||||
<!-- 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}">
|
||||
<!-- ELSEIF p_mask.f_mask.category.S_NEVER -->
|
||||
|
@ -116,7 +116,7 @@
|
|||
<tbody>
|
||||
<!-- BEGIN mask -->
|
||||
<!-- 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}"><img src="images/icon_trace.gif" alt="{L_TRACE_SETTING}" /></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}">{{ Icon('font', 'eye', lang('TRACE_SETTING'), true, '', {'style' : 'color:#1180b7;'}) }}</a> <!-- ENDIF -->{p_mask.f_mask.category.mask.PERMISSION}</th>
|
||||
<!-- IF p_mask.S_VIEW -->
|
||||
<td<!-- IF p_mask.f_mask.category.mask.S_YES --> class="yes"<!-- ENDIF -->> </td>
|
||||
<td<!-- IF p_mask.f_mask.category.mask.S_NEVER --> class="never"<!-- ENDIF -->></td>
|
||||
|
@ -130,7 +130,7 @@
|
|||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- IF not p_mask.S_VIEW -->
|
||||
<fieldset class="quick" style="margin-{S_CONTENT_FLOW_END}{L_COLON} 11px;">
|
||||
<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> • <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 -->
|
||||
</fieldset>
|
||||
|
||||
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
|
|
|
@ -17,8 +17,21 @@
|
|||
</div>
|
||||
|
||||
<script src="{T_JQUERY_LINK}"></script>
|
||||
<!-- 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 -->
|
||||
<!-- 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 -->
|
||||
<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 -->
|
||||
{$SCRIPTS}
|
||||
|
|
11
phpBB/assets/css/font-awesome.min.css
vendored
Before Width: | Height: | Size: 434 KiB |
|
@ -1677,6 +1677,33 @@ phpbb.getFunctionByName = function (functionName) {
|
|||
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.
|
||||
*/
|
||||
|
|
2
phpBB/assets/javascript/jquery-3.6.0.min.js
vendored
2
phpBB/assets/javascript/jquery-3.7.1.min.js
vendored
Normal file
300
phpBB/assets/javascript/webpush.js
Normal file
|
@ -0,0 +1,300 @@
|
|||
/* 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);
|
||||
});
|
BIN
phpBB/assets/webfonts/fa-brands-400.ttf
Normal file
BIN
phpBB/assets/webfonts/fa-brands-400.woff2
Normal file
BIN
phpBB/assets/webfonts/fa-regular-400.ttf
Normal file
BIN
phpBB/assets/webfonts/fa-regular-400.woff2
Normal file
BIN
phpBB/assets/webfonts/fa-solid-900.ttf
Normal file
BIN
phpBB/assets/webfonts/fa-solid-900.woff2
Normal file
BIN
phpBB/assets/webfonts/fa-v4compatibility.ttf
Normal file
BIN
phpBB/assets/webfonts/fa-v4compatibility.woff2
Normal file
|
@ -12,7 +12,7 @@
|
|||
*/
|
||||
|
||||
/**
|
||||
* Minimum Requirement: PHP 7.1.3
|
||||
* Minimum Requirement: PHP 7.2.0
|
||||
*/
|
||||
|
||||
if (!defined('IN_PHPBB'))
|
||||
|
@ -51,20 +51,10 @@ if (!defined('PHPBB_INSTALLED'))
|
|||
$server_port = 443;
|
||||
}
|
||||
|
||||
$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);
|
||||
$script_path = phpbb_get_install_redirect($phpbb_root_path, $phpEx);
|
||||
|
||||
// Eliminate . and .. from the path
|
||||
require($phpbb_root_path . 'phpbb/filesystem.' . $phpEx);
|
||||
require($phpbb_root_path . 'phpbb/filesystem/helper.' . $phpEx);
|
||||
$script_path = \phpbb\filesystem\helper::clean_path($script_path);
|
||||
|
||||
$url = (($secure) ? 'https://' : 'http://') . $server_name;
|
||||
|
|
|
@ -28,9 +28,10 @@
|
|||
"require": {
|
||||
"php": "^8.1",
|
||||
"ext-json": "*",
|
||||
"ext-mbstring": "*",
|
||||
"ext-pdo": "*",
|
||||
"ext-zlib": "*",
|
||||
"bantu/ini-get-wrapper": "~1.0",
|
||||
"carlos-mg89/oauth": "^0.8.15",
|
||||
"chita/topological_sort": "^3.0",
|
||||
"composer/composer": "^2.0",
|
||||
"composer/installers": "^1.9",
|
||||
|
@ -38,8 +39,8 @@
|
|||
"doctrine/dbal": "~3.3.6",
|
||||
"google/recaptcha": "~1.1",
|
||||
"guzzlehttp/guzzle": "~6.3",
|
||||
"lusitanian/oauth": "^0.8.1",
|
||||
"marc1706/fast-image-size": "^1.1",
|
||||
"minishlink/web-push": "^8.0",
|
||||
"s9e/text-formatter": "^2.0",
|
||||
"symfony/config": "^6.3",
|
||||
"symfony/console": "^6.3",
|
||||
|
@ -50,6 +51,7 @@
|
|||
"symfony/finder": "^6.3",
|
||||
"symfony/http-foundation": "^6.3",
|
||||
"symfony/http-kernel": "^6.3",
|
||||
"symfony/polyfill-mbstring": "^1.23",
|
||||
"symfony/mime": "^6.3",
|
||||
"symfony/process": "^6.3",
|
||||
"symfony/proxy-manager-bridge": "^6.3",
|
||||
|
@ -68,8 +70,11 @@
|
|||
"symfony/css-selector": "^6.3",
|
||||
"symfony/dom-crawler": "^6.3",
|
||||
"symfony/http-client": "^6.3",
|
||||
"vimeo/psalm": "^4.14",
|
||||
"psalm/plugin-symfony": "^3.1"
|
||||
"vimeo/psalm": "^5.18.0",
|
||||
"psalm/plugin-symfony": "^v5.1.0"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-mbstring": "Better performance in search"
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
|
|
3048
phpBB/composer.lock
generated
|
@ -1,7 +1,9 @@
|
|||
imports:
|
||||
- { resource: services_assets.yml }
|
||||
- { resource: services_attachment.yml }
|
||||
- { resource: services_auth.yml }
|
||||
- { resource: services_avatar.yml }
|
||||
- { resource: services_ban.yml }
|
||||
- { resource: services_captcha.yml }
|
||||
- { resource: services_console.yml }
|
||||
- { resource: services_content.yml }
|
||||
|
@ -124,6 +126,13 @@ services:
|
|||
arguments:
|
||||
- '%core.root_path%'
|
||||
|
||||
form_helper:
|
||||
class: phpbb\form\form_helper
|
||||
arguments:
|
||||
- '@config'
|
||||
- '@request'
|
||||
- '@user'
|
||||
|
||||
group_helper:
|
||||
class: phpbb\group\helper
|
||||
arguments:
|
||||
|
|
4
phpBB/config/default/container/services_assets.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
services:
|
||||
assets.bag:
|
||||
class: phpbb\template\assets_bag
|
||||
shared: false
|
|
@ -56,11 +56,11 @@ services:
|
|||
class: phpbb\avatar\driver\upload
|
||||
arguments:
|
||||
- '@config'
|
||||
- '@controller.helper'
|
||||
- '%core.root_path%'
|
||||
- '%core.php_ext%'
|
||||
- '@storage.avatar'
|
||||
- '@path_helper'
|
||||
- '@routing.helper'
|
||||
- '@event_dispatcher'
|
||||
- '@files.factory'
|
||||
- '@php_ini'
|
||||
|
|
54
phpBB/config/default/container/services_ban.yml
Normal file
|
@ -0,0 +1,54 @@
|
|||
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 }
|
|
@ -14,27 +14,16 @@ services:
|
|||
tags:
|
||||
- { name: service_collection, tag: captcha.plugins }
|
||||
|
||||
core.captcha.plugins.gd:
|
||||
class: phpbb\captcha\plugins\gd
|
||||
core.captcha.plugins.incomplete:
|
||||
class: phpbb\captcha\plugins\incomplete
|
||||
shared: false
|
||||
arguments:
|
||||
- '@config'
|
||||
- '@template'
|
||||
- '%core.root_path%'
|
||||
- '%core.php_ext%'
|
||||
calls:
|
||||
- [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]]
|
||||
- [ set_name, [ core.captcha.plugins.incomplete ] ]
|
||||
tags:
|
||||
- { name: captcha.plugins }
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ services:
|
|||
- '@user'
|
||||
- '@cache.driver'
|
||||
- '@dbal.conn'
|
||||
- '@dbal.tools'
|
||||
- '@auth'
|
||||
- '@log'
|
||||
- '@config'
|
||||
|
|
|
@ -65,6 +65,13 @@ services:
|
|||
- '@controller.helper'
|
||||
- '@event_dispatcher'
|
||||
|
||||
posting.lock:
|
||||
class: phpbb\lock\posting
|
||||
shared: false
|
||||
arguments:
|
||||
- '@cache.driver'
|
||||
- '@config'
|
||||
|
||||
viewonline_helper:
|
||||
class: phpbb\viewonline_helper
|
||||
arguments:
|
||||
|
|
|
@ -9,6 +9,7 @@ services:
|
|||
arguments:
|
||||
- '@template'
|
||||
- '@language'
|
||||
- '@user'
|
||||
- '%debug.exceptions%'
|
||||
tags:
|
||||
- { name: kernel.event_subscriber }
|
||||
|
|