Merge branch '3.2.x' into ticket/16159

This commit is contained in:
stevendegroote 2019-09-17 23:15:54 +02:00
commit f8967fec78
511 changed files with 11353 additions and 4088 deletions

145
.appveyor.yml Normal file
View file

@ -0,0 +1,145 @@
build: false
clone_folder: c:\projects\phpbb
version: '{build}'
services:
- iis
environment:
matrix:
- db: mssql
db_version: sql2012sp1
php: 7.0
- db: mssql
db_version: sql2014
php: 7.0
- db: mssql
db_version: sql2016
php: 7.1.12
# - db: mssql
# db_version: sql2017
# php: 7.1
# - db: mariadb
# php: 7.1
# - db: mysqli
# php: 7.1
# - db: sqlite
# php: 7.1
# - db: postgresql
# php: 7.1
hosts:
phpbb.test: 127.0.0.1
init:
- SET PATH=%systemroot%\system32\inetsrv\;C:\Program Files\OpenSSL;C:\tools\php;c:\php;%PATH%
- SET ANSICON=121x90 (121x90)
- REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Command Processor" /v DelayedExpansion /t REG_DWORD /d 1 /f
before_test:
- ps: |
Set-Service wuauserv -StartupType Manual
choco install chocolatey -y --version 0.10.13 --allow-downgrade
choco install php -y --version ((choco search php --exact --all-versions -r | select-string -pattern $env:php | sort { [version]($_ -split '\|' | select -last 1) } -Descending | Select-Object -first 1) -replace '[php|]','')
Get-ChildItem -Path "c:\tools\php$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1$2')" -Recurse |
Move-Item -destination "c:\tools\php"
cd c:\tools\php
cat php.ini-development | %{$_ -replace "memory_limit = 128M","memory_limit = 1024M"} | Out-File -Encoding "Default" php.ini
Add-Content php.ini "`n date.timezone=UTC"
Add-Content php.ini "`n display_errors=On"
Add-Content php.ini "`n extension_dir=ext"
Add-Content php.ini "`n extension=php_openssl.dll"
Add-Content php.ini "`n extension=php_mbstring.dll"
Add-Content php.ini "`n extension=php_curl.dll"
Add-Content php.ini "`n extension=php_gd2.dll"
Add-Content php.ini "`n extension=php_tidy.dll"
Add-Content php.ini "`n extension=php_fileinfo.dll"
Add-Content php.ini "`n extension=php_pdo_sqlite.dll"
Add-Content php.ini "`n extension=php_sqlite3.dll"
Add-Content php.ini "`n extension=php_pdo_mysql.dll"
Add-Content php.ini "`n extension=php_mysqli.dll"
Add-Content php.ini "`n extension=php_pdo_pgsql.dll"
Add-Content php.ini "`n extension=php_pgsql.dll"
# Get MSSQL driver
if ($env:db -eq "mssql") {
cd c:\tools\php\ext
$DLLVersion = "4.1.6.1"
curl -o php_sqlsrv-$($DLLVersion)-$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1.$2')-nts-vc14-x64.zip https://windows.php.net/downloads/pecl/releases/sqlsrv/$($:DLLVersion)/php_sqlsrv-$($DLLVersion)-$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1.$2')-nts-vc14-x64.zip
7z x -y php_sqlsrv-$($DLLVersion)-$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1.$2')-nts-vc14-x64.zip > $null
curl -o php_pdo_sqlsrv-$($DLLVersion)-$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1.$2')-nts-vc14-x64.zip https://windows.php.net/downloads/pecl/releases/pdo_sqlsrv/$($DLLVersion)/php_pdo_sqlsrv-$($DLLVersion)-$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1.$2')-nts-vc14-x64.zip
7z x -y php_pdo_sqlsrv-$($DLLVersion)-$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1.$2')-nts-vc14-x64.zip > $null
Remove-Item c:\tools\php\* -include .zip
cd c:\tools\php
Add-Content php.ini "`nextension=php_sqlsrv.dll"
Add-Content php.ini "`nextension=php_pdo_sqlsrv.dll"
Add-Content php.ini "`n"
$instanceName = $env:db_version.ToUpper()
Start-Service "MSSQL`$$instanceName"
Set-Variable -Name "sqlServerPath" -Value "(local)\$($env:db_version.ToUpper())"
# Create database write test config
sqlcmd -S $sqlServerPath -Q "Use [master]; CREATE DATABASE [phpbb_test] COLLATE Latin1_General_CI_AS"
$data = "<?php`n`n`$dbms = 'phpbb\\db\\driver\\mssqlnative';`n`$dbhost = '.\\$env:db_version';`n`$dbport = '';`n`$dbname = 'phpbb_test';`n`$dbuser = 'sa';`n`$dbpasswd = 'Password12!';`n`$phpbb_functional_url = 'http://phpbb.test/';"; $data | Out-File -Encoding "Default" "c:\\projects\\phpbb\\tests\\test_config.php"
}
elseif ($env:db -eq "mysqli") {
Start-Service MySQL57
$env:MYSQL_PWD="Password12!"
$cmd = '"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql" -e "create database phpbb_test;" --user=root'
iex "& $cmd"
$data = "<?php`n`n`$dbms = 'phpbb\\db\\driver\\mysqli';`n`$dbhost = 'localhost';`n`$dbport = '';`n`$dbname = 'phpbb_test';`n`$dbuser = 'root';`n`$dbpasswd = 'Password12!';`n`$phpbb_functional_url = 'http://phpbb.test/';"; $data | Out-File -Encoding "Default" "c:\\projects\\phpbb\\tests\\test_config.php"
}
elseif ($env:db -eq "postgresql") {
Start-Service postgresql-x64-9.5
$env:PGUSER="postgres"
$env:PGPASSWORD="Password12!"
$Env:Path="C:\Program Files\PostgreSQL\9.6\bin\;$($Env:Path)"
createdb phpbb_test
$data = "<?php`n`n`$dbms = 'phpbb\\db\\driver\\postgres';`n`$dbhost = 'localhost';`n`$dbport = '';`n`$dbname = 'phpbb_test';`n`$dbuser = 'postgres';`n`$dbpasswd = 'Password12!';`n`$phpbb_functional_url = 'http://phpbb.test/';"; $data | Out-File -Encoding "Default" "c:\\projects\\phpbb\\tests\\test_config.php"
}
elseif ($env:db -eq "mariadb") {
appveyor-retry choco install mariadb -y --force
$env:MYSQL_PWD=""
$cmd = '"C:\Program Files\MariaDB 10.2\bin\mysql" -e "create database phpbb_test;" --user=root'
iex "& $cmd"
$data = "<?php`n`n`$dbms = 'phpbb\\db\\driver\\mysqli';`n`$dbhost = 'localhost';`n`$dbport = '';`n`$dbname = 'phpbb_test';`n`$dbuser = 'root';`n`$dbpasswd = '';`n`$phpbb_functional_url = 'http://phpbb.test/';"; $data | Out-File -Encoding "Default" "c:\\projects\\phpbb\\tests\\test_config.php"
}
elseif ($env:db -eq "sqlite") {
# install sqlite
appveyor-retry choco install sqlite -y
sqlite3 c:\projects\test.db "create table aTable(field1 int); drop table aTable;"
$data = "<?php`n`n`$dbms = 'phpbb\\db\\driver\\sqlite3';`n`$dbhost = 'c:\\projects\\test.db';`n`$dbport = '';`n`$dbname = '';`n`$dbuser = '';`n`$dbpasswd = '';`n`$phpbb_functional_url = 'http://phpbb.test/';"; $data | Out-File -Encoding "Default" "c:\\projects\\phpbb\\tests\\test_config.php"
}
# Install PhantomJS
choco install phantomjs -y
Start-Process "phantomjs" "--webdriver=8910" | Out-Null
- ps: |
cd c:\projects\phpbb\phpBB
(Get-Content c:\projects\phpbb\phpBB\web.config).replace("<configuration>", "<configuration>`n`t<system.web>`n`t`t<customErrors mode=`"Off`"/>`n`t</system.web>") | Set-Content c:\projects\phpbb\phpBB\web.config
(Get-Content c:\projects\phpbb\phpBB\web.config).replace("`t</system.webServer>", "`t`t<httpErrors errorMode=`"Detailed`" />`n`t</system.webServer>") | Set-Content c:\projects\phpbb\phpBB\web.config
- cd c:\projects\phpbb\phpBB
- php ..\composer.phar install
- choco install urlrewrite -y
- ps: New-WebSite -Name 'phpBBTest' -PhysicalPath 'c:\projects\phpbb\phpBB' -Force
- ps: Import-Module WebAdministration; Set-ItemProperty 'IIS:\Sites\phpBBTest' -name Bindings -value @{protocol='http';bindingInformation='*:80:phpbb.test'}
- echo Change default anonymous user AUTH to ApplicationPool
- appcmd set config -section:anonymousAuthentication /username:"" --password
- echo Setup FAST-CGI configuration
- appcmd set config /section:system.webServer/fastCGI /+[fullPath='C:\tools\php\php-cgi.exe']
- echo Setup FACT-CGI handler
- appcmd set config /section:system.webServer/handlers /+[name='PHP-FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='C:\tools\php\php-cgi.exe',resourceType='Either']
- iisreset
- NET START W3SVC
- mkdir "C:\projects\phpbb\phpBB\cache\test"
- mkdir "C:\projects\phpbb\phpBB\cache\installer"
- icacls "C:\projects\phpbb\phpBB\cache" /grant Users:F /T
- icacls "C:\projects\phpbb\phpBB\files" /grant Users:F /T
- icacls "C:\projects\phpbb\phpBB\store" /grant Users:F /T
- icacls "C:\projects\phpbb\phpBB\images\avatars\upload" /grant Users:F /T
test_script:
- cd c:\projects\phpbb
- php -e phpBB\vendor\phpunit\phpunit\phpunit --verbose

View file

@ -1,9 +1,9 @@
Checklist: Checklist:
- [ ] Correct branch: master for new features; 3.2.x, 3.1.x for fixes - [ ] Correct branch: master for new features; 3.2.x for fixes
- [ ] Tests pass - [ ] Tests pass
- [ ] Code follows coding guidelines: [master / 3.2.x](https://area51.phpbb.com/docs/master/coding-guidelines.html), [3.1.x](https://area51.phpbb.com/docs/31x/coding-guidelines.html) - [ ] Code follows coding guidelines: [master](https://area51.phpbb.com/docs/dev/master/development/coding_guidelines.html) and [3.2.x](https://area51.phpbb.com/docs/dev/3.2.x/development/coding_guidelines.html)
- [ ] Commit follows commit message [format](https://wiki.phpbb.com/Git#Commit_Messages) - [ ] Commit follows commit message [format](https://area51.phpbb.com/docs/dev/3.2.x/development/git.html)
Tracker ticket (set the ticket ID to **your ticket ID**): Tracker ticket (set the ticket ID to **your ticket ID**):

View file

@ -1,6 +1,5 @@
language: php language: php
sudo: required dist: trusty
dist: precise
matrix: matrix:
include: include:
@ -26,12 +25,11 @@ matrix:
env: DB=mysqli env: DB=mysqli
- php: 7.1 - php: 7.1
env: DB=mysqli env: DB=mysqli
- php: 7.2
env: DB=mysqli
- php: nightly - php: nightly
env: DB=mysqli env: DB=mysqli
- php: hhvm
env: DB=mysqli
allow_failures: allow_failures:
- php: hhvm
- php: nightly - php: nightly
fast_finish: true fast_finish: true
@ -53,4 +51,4 @@ script:
- sh -c "if [ '$SLOWTESTS' != '1' -a '$DB' = 'mysqli' ]; then phpBB/vendor/bin/phpunit tests/lint_test.php; fi" - sh -c "if [ '$SLOWTESTS' != '1' -a '$DB' = 'mysqli' ]; then phpBB/vendor/bin/phpunit tests/lint_test.php; fi"
- sh -c "if [ '$NOTESTS' != '1' -a '$SLOWTESTS' != '1' ]; then phpBB/vendor/bin/phpunit --configuration travis/phpunit-$DB-travis.xml --verbose --stop-on-error; fi" - sh -c "if [ '$NOTESTS' != '1' -a '$SLOWTESTS' != '1' ]; then phpBB/vendor/bin/phpunit --configuration travis/phpunit-$DB-travis.xml --verbose --stop-on-error; fi"
- sh -c "if [ '$SLOWTESTS' = '1' ]; then phpBB/vendor/bin/phpunit --configuration travis/phpunit-$DB-travis.xml --group slow; fi" - sh -c "if [ '$SLOWTESTS' = '1' ]; then phpBB/vendor/bin/phpunit --configuration travis/phpunit-$DB-travis.xml --group slow; fi"
- sh -c "set -x;if [ '$NOTESTS' = '1' -a '$TRAVIS_PULL_REQUEST' != 'false' ]; then git-tools/commit-msg-hook-range.sh origin/$TRAVIS_BRANCH..FETCH_HEAD; fi" - sh -c "set -x;if [ '$NOTESTS' = '1' -a '$TRAVIS_PULL_REQUEST' != 'false' ]; then git remote set-branches --add origin $TRAVIS_BRANCH && git fetch && git-tools/commit-msg-hook-range.sh origin/$TRAVIS_BRANCH..$TRAVIS_PULL_REQUEST_SHA; fi"

281
LICENSE Normal file
View file

@ -0,0 +1,281 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS

View file

@ -20,7 +20,7 @@ To be able to run an installation from the repo (and not from a pre-built packag
1. [Create an account on phpBB.com](http://www.phpbb.com/community/ucp.php?mode=register) 1. [Create an account on phpBB.com](http://www.phpbb.com/community/ucp.php?mode=register)
2. [Create a ticket (unless there already is one)](http://tracker.phpbb.com/secure/CreateIssue!default.jspa) 2. [Create a ticket (unless there already is one)](http://tracker.phpbb.com/secure/CreateIssue!default.jspa)
3. Read our [Coding guidelines](https://wiki.phpbb.com/Coding_guidelines) and [Git Contribution Guidelines](http://wiki.phpbb.com/Git) 3. Read our [Coding guidelines](https://area51.phpbb.com/docs/dev/development/coding_guidelines.html) and [Git Contribution Guidelines](https://area51.phpbb.com/docs/dev/development/git.html)
4. Send us a pull request 4. Send us a pull request
## VAGRANT ## VAGRANT
@ -29,11 +29,11 @@ Read our [Vagrant documentation](phpBB/docs/vagrant.md) to find out how to use V
## AUTOMATED TESTING ## AUTOMATED TESTING
We have unit and functional tests in order to prevent regressions. You can view the bamboo continuous integration [here](http://bamboo.phpbb.com) or check our travis builds below: We have unit and functional tests in order to prevent regressions. You can view the bamboo continuous integration [here](https://bamboo.phpbb.com) or check our travis builds below:
* [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=master)](http://travis-ci.org/phpbb/phpbb) **master** - Latest development version * [![Build Status](https://travis-ci.org/phpbb/phpbb.svg?branch=master)](http://travis-ci.org/phpbb/phpbb)[![Build status](https://ci.appveyor.com/api/projects/status/8g98ybngd2f3axy1/branch/master?svg=true)](https://ci.appveyor.com/project/phpBB/phpbb/branch/master) **master** - Latest development version
* [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=3.2.x)](http://travis-ci.org/phpbb/phpbb) **3.2.x** - Development of version 3.2.x * [![Build Status](https://travis-ci.org/phpbb/phpbb.svg?branch=3.2.x)](http://travis-ci.org/phpbb/phpbb)[![Build status](https://ci.appveyor.com/api/projects/status/8g98ybngd2f3axy1/branch/3.2.x?svg=true)](https://ci.appveyor.com/project/phpBB/phpbb/branch/3.2.x) **3.2.x** - Development of version 3.2.x
* [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=3.1.x)](http://travis-ci.org/phpbb/phpbb) **3.1.x** - Development of version 3.1.x * [![Build Status](https://travis-ci.org/phpbb/phpbb.svg?branch=3.1.x)](http://travis-ci.org/phpbb/phpbb) **3.1.x** - Development of version 3.1.x
## LICENSE ## LICENSE

View file

@ -2,9 +2,9 @@
<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="3.2.2-dev" /> <property name="newversion" value="3.2.9-dev" />
<property name="prevversion" value="3.2.1" /> <property name="prevversion" value="3.2.7" />
<property name="olderversions" value="3.0.14, 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.2.0-a1, 3.2.0-a2, 3.2.0-b1, 3.2.0-b2, 3.2.0-RC1, 3.2.0-RC2, 3.2.0" /> <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-a1, 3.2.0-a2, 3.2.0-b1, 3.2.0-b2, 3.2.0-RC1, 3.2.0-RC2, 3.2.0, 3.2.1, 3.2.2, 3.2.3, 3.2.4, 3.2.5, 3.2.6" />
<!-- 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}" />

View file

@ -33,14 +33,14 @@ class build_package
var $status_begun = false; var $status_begun = false;
var $num_dots = 0; var $num_dots = 0;
function build_package($versions, $verbose = false) function __construct($versions, $verbose = false)
{ {
$this->versions = $versions; $this->versions = $versions;
$this->verbose = $verbose; $this->verbose = $verbose;
// Get last two entries // Get last two entries
$_latest = $this->versions[sizeof($this->versions) - 1]; $_latest = $this->versions[count($this->versions) - 1];
$_before = $this->versions[sizeof($this->versions) - 2]; $_before = $this->versions[count($this->versions) - 2];
$this->locations = array( $this->locations = array(
'new_version' => dirname(dirname(__FILE__)) . '/phpBB/', 'new_version' => dirname(dirname(__FILE__)) . '/phpBB/',

View file

@ -33,7 +33,7 @@ echo "Now all three package types (patch, files, release) are built as well as t
// Go trough all versions making a diff if we even have old versions // Go trough all versions making a diff if we even have old versions
// For phpBB 3.0.x we might choose a different update method, rendering the things below useless... // For phpBB 3.0.x we might choose a different update method, rendering the things below useless...
if (sizeof($package->old_packages)) if (count($package->old_packages))
{ {
chdir($package->locations['old_versions']); chdir($package->locations['old_versions']);
@ -76,7 +76,7 @@ if (sizeof($package->old_packages))
// Create Directories along the way? // Create Directories along the way?
$file = explode('/', $file); $file = explode('/', $file);
// Remove filename portion // Remove filename portion
$file[sizeof($file)-1] = ''; $file[count($file)-1] = '';
chdir($dest_filename_dir); chdir($dest_filename_dir);
foreach ($file as $entry) foreach ($file as $entry)
@ -169,7 +169,7 @@ if (sizeof($package->old_packages))
// Create Directories along the way? // Create Directories along the way?
$file = explode('/', $file); $file = explode('/', $file);
// Remove filename portion // Remove filename portion
$file[sizeof($file)-1] = ''; $file[count($file)-1] = '';
chdir($dest_filename_dir . '/install/update/old'); chdir($dest_filename_dir . '/install/update/old');
foreach ($file as $entry) foreach ($file as $entry)
@ -214,7 +214,7 @@ if (sizeof($package->old_packages))
// Create Directories along the way? // Create Directories along the way?
$file = explode('/', $file); $file = explode('/', $file);
// Remove filename portion // Remove filename portion
$file[sizeof($file)-1] = ''; $file[count($file)-1] = '';
chdir($dest_filename_dir . '/install/update/new'); chdir($dest_filename_dir . '/install/update/new');
foreach ($file as $entry) foreach ($file as $entry)
@ -321,7 +321,7 @@ $update_info = array(
\'version\' => array(\'from\' => \'' . str_replace('_to_', '', $package->old_packages[$_package_name]) . '\', \'to\' => \'' . $package->get('new_version_number') . '\'), \'version\' => array(\'from\' => \'' . str_replace('_to_', '', $package->old_packages[$_package_name]) . '\', \'to\' => \'' . $package->get('new_version_number') . '\'),
'; ';
if (sizeof($file_contents['all'])) if (count($file_contents['all']))
{ {
$index_contents .= "\t'files' => array(\n\t\t'" . implode("',\n\t\t'", $file_contents['all']) . "',\n\t),\n"; $index_contents .= "\t'files' => array(\n\t\t'" . implode("',\n\t\t'", $file_contents['all']) . "',\n\t),\n";
} }
@ -330,7 +330,7 @@ $update_info = array(
$index_contents .= "\t'files' => array(),\n"; $index_contents .= "\t'files' => array(),\n";
} }
if (sizeof($file_contents['binary'])) if (count($file_contents['binary']))
{ {
$index_contents .= "\t'binary' => array(\n\t\t'" . implode("',\n\t\t'", $file_contents['binary']) . "',\n\t),\n"; $index_contents .= "\t'binary' => array(\n\t\t'" . implode("',\n\t\t'", $file_contents['binary']) . "',\n\t),\n";
} }
@ -339,7 +339,7 @@ $update_info = array(
$index_contents .= "\t'binary' => array(),\n"; $index_contents .= "\t'binary' => array(),\n";
} }
if (sizeof($file_contents['deleted'])) if (count($file_contents['deleted']))
{ {
$index_contents .= "\t'deleted' => array(\n\t\t'" . implode("',\n\t\t'", $file_contents['deleted']) . "',\n\t),\n"; $index_contents .= "\t'deleted' => array(\n\t\t'" . implode("',\n\t\t'", $file_contents['deleted']) . "',\n\t),\n";
} }
@ -380,7 +380,7 @@ $compress_programs = array(
'zip' => 'zip -r' 'zip' => 'zip -r'
); );
if (sizeof($package->old_packages)) if (count($package->old_packages))
{ {
// Build Patch Files // Build Patch Files
chdir($package->get('patch_directory')); chdir($package->get('patch_directory'));

Binary file not shown.

View file

@ -147,6 +147,15 @@ then
quit $ERR_LENGTH; quit $ERR_LENGTH;
fi fi
# Check for CR/LF line breaks
if grep -q $'\r$' "$1"
then
complain "The commit message uses CR/LF line breaks, which are not permitted." >&2
complain >&2
quit $ERR_EOF;
fi
lines=$(wc -l "$1" | awk '{ print $1; }'); lines=$(wc -l "$1" | awk '{ print $1; }');
expecting=header; expecting=header;
in_description=0; in_description=0;

View file

@ -37,12 +37,6 @@
<!-- IF S_ATTACHMENT_SETTINGS --> <!-- IF S_ATTACHMENT_SETTINGS -->
<!-- IF not S_THUMBNAIL_SUPPORT -->
<div class="errorbox">
<p>{L_NO_THUMBNAIL_SUPPORT}</p>
</div>
<!-- ENDIF -->
<form id="attachsettings" method="post" action="{U_ACTION}"> <form id="attachsettings" method="post" action="{U_ACTION}">
<!-- BEGIN options --> <!-- BEGIN options -->
<!-- IF options.S_LEGEND --> <!-- IF options.S_LEGEND -->
@ -329,42 +323,71 @@
<fieldset class="tabulated"> <fieldset class="tabulated">
<legend>{L_TITLE}</legend> <legend>{L_TITLE}</legend>
<table class="table1 zebra-table fixed-width-table"> <div class="pagination top-pagination">
<thead> <!-- IF .pagination or TOTAL_FILES -->
<tr> {L_NUMBER_FILES}{L_COLON} {TOTAL_FILES} &bull; {L_TOTAL_SIZE}{L_COLON} {TOTAL_SIZE}
<th>{L_FILENAME}</th> <!-- IF .pagination -->
<th style="width: 15%;">{L_FILEDATE}</th> &bull; <!-- INCLUDE pagination.html -->
<th style="width: 15%;">{L_FILESIZE}</th> <!-- ELSE -->
<th style="width: 15%;">{L_ATTACH_POST_ID}</th> &bull; {PAGE_NUMBER}
<th style="width: 15%;">{L_ATTACH_TO_POST}</th> <!-- ENDIF -->
<th style="width: 15%;">{L_DELETE}</th> <!-- ENDIF -->
</tr> </div>
</thead>
<tbody> <!-- IF .orphan -->
<!-- BEGIN orphan --> <table class="table1 zebra-table fixed-width-table">
<thead>
<tr> <tr>
<td><a href="{orphan.U_FILE}">{orphan.REAL_FILENAME}</a></td> <th>{L_FILENAME}</th>
<td>{orphan.FILETIME}</td> <th style="width: 15%;">{L_FILEDATE}</th>
<td>{orphan.FILESIZE}</td> <th style="width: 15%;">{L_FILESIZE}</th>
<td><strong>{L_ATTACH_ID}{L_COLON} </strong><input type="number" min="0" max="9999999999" name="post_id[{orphan.ATTACH_ID}]" value="{orphan.POST_ID}" style="width: 75%;" /></td> <th style="width: 15%;">{L_ATTACH_POST_ID}</th>
<td><input type="checkbox" class="radio" name="add[{orphan.ATTACH_ID}]" /></td> <th style="width: 15%;">{L_ATTACH_TO_POST}</th>
<td><input type="checkbox" class="radio" name="delete[{orphan.ATTACH_ID}]" /></td> <th style="width: 15%;">{L_DELETE}</th>
</tr> </tr>
<!-- END orphan --> </thead>
<tr class="row4"> <tbody>
<td colspan="4">&nbsp;</td> <!-- BEGIN orphan -->
<td class="small"><a href="#" onclick="marklist('orphan', 'add', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('orphan', 'add', false); return false;">{L_UNMARK_ALL}</a></td> <tr>
<td class="small"><a href="#" onclick="marklist('orphan', 'delete', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('orphan', 'delete', false); return false;">{L_UNMARK_ALL}</a></td> <td><a href="{orphan.U_FILE}">{orphan.REAL_FILENAME}</a></td>
</tr> <td>{orphan.FILETIME}</td>
</tbody> <td>{orphan.FILESIZE}</td>
</table> <td><strong>{L_ATTACH_ID}{L_COLON} </strong><input type="number" min="0" max="9999999999" name="post_id[{orphan.ATTACH_ID}]" value="{orphan.POST_ID}" style="width: 75%;" /></td>
<td><input type="checkbox" class="radio" name="add[{orphan.ATTACH_ID}]" /></td>
<td><input type="checkbox" class="radio" name="delete[{orphan.ATTACH_ID}]" /></td>
</tr>
<!-- END orphan -->
<tr class="row4">
<td colspan="4">&nbsp;</td>
<td class="small"><a href="#" onclick="marklist('orphan', 'add', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('orphan', 'add', false); return false;">{L_UNMARK_ALL}</a></td>
<td class="small"><a href="#" onclick="marklist('orphan', 'delete', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('orphan', 'delete', false); return false;">{L_UNMARK_ALL}</a></td>
</tr>
</tbody>
</table>
<!-- ELSE -->
<div class="errorbox">
<p>{L_NO_ATTACHMENTS}</p>
</div>
<!-- ENDIF -->
<br /> <!-- IF TOTAL_FILES -->
<div class="pagination">
{L_NUMBER_FILES}{L_COLON} {TOTAL_FILES} &bull; {L_TOTAL_SIZE}{L_COLON} {TOTAL_SIZE}
<!-- IF .pagination -->
&bull; <!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
<!-- ENDIF -->
<!-- IF .orphan -->
<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}" />
</p>
<!-- ENDIF -->
<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}" />
</p>
{S_FORM_TOKEN} {S_FORM_TOKEN}
</fieldset> </fieldset>
</form> </form>
@ -398,17 +421,25 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<!-- BEGIN attachments --> {% for attachments in attachments %}
<tr> <tr>
<td> <td>
<!-- IF attachments.S_IN_MESSAGE -->{L_EXTENSION_GROUP}{L_COLON} <strong><!-- IF attachments.EXT_GROUP_NAME -->{attachments.EXT_GROUP_NAME}<!-- ELSE -->{L_NO_EXT_GROUP}<!-- ENDIF --></strong><br />{attachments.L_DOWNLOAD_COUNT}<br />{L_IN} {L_PRIVATE_MESSAGE} {{ lang('EXTENSION_GROUP') ~ lang('COLON') }} <strong>{{ attachments.EXT_GROUP_NAME }}</strong>
<!-- ELSE --><a href="{attachments.U_FILE}" style="font-weight: bold;">{attachments.REAL_FILENAME}</a><br /><!-- IF attachments.COMMENT -->{attachments.COMMENT}<br /><!-- ENDIF -->{attachments.L_DOWNLOAD_COUNT}<br />{L_TOPIC}{L_COLON} <a href="{attachments.U_VIEW_TOPIC}">{attachments.TOPIC_TITLE}</a><!-- ENDIF --> {% if attachments.S_IN_MESSAGE %}
<br>{{ attachments.L_DOWNLOAD_COUNT }}
<br>{{ lang('IN') }} {{ lang('PRIVATE_MESSAGE') }}
{% else %}
<br><a href="{{ attachments.U_FILE }}"><strong>{{ attachments.REAL_FILENAME }}</strong></a>
{% if attachments.COMMENT %}<br>{{ attachments.COMMENT }}{% endif %}
<br>{{ attachments.L_DOWNLOAD_COUNT }}
<br>{{ lang('TOPIC') ~ lang('COLON') }} <a href="{{ attachments.U_VIEW_TOPIC }}">{{ attachments.TOPIC_TITLE }}</a>
{% endif %}
</td> </td>
<td>{attachments.FILETIME}<br />{L_POST_BY_AUTHOR} {attachments.ATTACHMENT_POSTER}</td> <td>{{ attachments.FILETIME }}<br>{{ lang('POST_BY_AUTHOR') }} {{ attachments.ATTACHMENT_POSTER }}</td>
<td class="centered-text">{attachments.FILESIZE}</td> <td class="centered-text">{{ attachments.FILESIZE }}</td>
<td class="centered-text"><input type="checkbox" class="radio" name="delete[{attachments.ATTACH_ID}]" /></td> <td class="centered-text"><input type="checkbox" class="radio" name="delete[{{ attachments.ATTACH_ID }}]" /></td>
</tr> </tr>
<!-- END attachments --> {% endfor %}
</tbody> </tbody>
</table> </table>
<!-- ELSE --> <!-- ELSE -->
@ -440,7 +471,7 @@
<input class="button2" type="submit" name="submit" value="{L_DELETE_MARKED}" /><br /> <input class="button2" type="submit" name="submit" value="{L_DELETE_MARKED}" /><br />
<p class="small"> <p class="small">
<a href="#" onclick="marklist('attachments', 'delete', true); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('attachments', 'delete', true); return false;">{L_MARK_ALL}</a> &bull;
<a href="#" onclick="marklist('attachments', 'delete', false); return false;">{L_UNMARK_ALL}</a> <a href="#" onclick="marklist('attachments', 'delete', false); return false;">{L_UNMARK_ALL}</a>
</p> </p>
</fieldset> </fieldset>
<!-- ENDIF --> <!-- ENDIF -->

View file

@ -20,7 +20,6 @@
<p class="submit-buttons"> <p class="submit-buttons">
<input class="button1" type="submit" id="submit" name="submit" value="{L_START_RESTORE}" />&nbsp; <input class="button1" type="submit" id="submit" name="submit" value="{L_START_RESTORE}" />&nbsp;
<input class="button2" type="submit" id="delete" name="delete" value="{L_DELETE_BACKUP}" />&nbsp; <input class="button2" type="submit" id="delete" name="delete" value="{L_DELETE_BACKUP}" />&nbsp;
<input class="button2" type="submit" id="download" name="download" value="{L_DOWNLOAD_BACKUP}" />
</p> </p>
{S_FORM_TOKEN} {S_FORM_TOKEN}
</fieldset> </fieldset>
@ -68,13 +67,6 @@
<label><input name="method"<!-- IF methods.S_FIRST_ROW --> id="method" checked="checked"<!-- ENDIF --> type="radio" class="radio" value="{methods.TYPE}" /> {methods.TYPE}</label> <label><input name="method"<!-- IF methods.S_FIRST_ROW --> id="method" checked="checked"<!-- ENDIF --> type="radio" class="radio" value="{methods.TYPE}" /> {methods.TYPE}</label>
<!-- END methods --></dd> <!-- END methods --></dd>
</dl> </dl>
<dl>
<dt><label for="where">{L_ACTION}{L_COLON}</label></dt>
<dd>
<label><input id="where" type="radio" class="radio" name="where" value="store" checked="checked" /> {L_STORE_LOCAL}</label>
<label><input type="radio" class="radio" name="where" value="download" /> {L_DOWNLOAD}</label>
</dd>
</dl>
<dl> <dl>
<dt><label for="table">{L_TABLE_SELECT}{L_COLON}</label></dt> <dt><label for="table">{L_TABLE_SELECT}{L_COLON}</label></dt>
<dd><select id="table" name="table[]" size="10" multiple="multiple"> <dd><select id="table" name="table[]" size="10" multiple="multiple">

View file

@ -7,7 +7,7 @@
<p>{L_EXTENSIONS_EXPLAIN}</p> <p>{L_EXTENSIONS_EXPLAIN}</p>
<fieldset class="quick"> <fieldset class="quick">
<span class="small"><a href="https://www.phpbb.com/go/customise/extensions/3.1" target="_blank">{L_BROWSE_EXTENSIONS_DATABASE}</a> &bull; <a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE_ALL}</a> &bull; <a href="javascript:phpbb.toggleDisplay('version_check_settings');">{L_SETTINGS}</a></span> <span class="small"><a href="https://www.phpbb.com/go/customise/extensions/3.2" target="_blank">{L_BROWSE_EXTENSIONS_DATABASE}</a> &bull; <a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE_ALL}</a> &bull; <a href="javascript:phpbb.toggleDisplay('version_check_settings');">{L_SETTINGS}</a></span>
</fieldset> </fieldset>
<form id="version_check_settings" method="post" action="{U_ACTION}" style="display:none"> <form id="version_check_settings" method="post" action="{U_ACTION}" style="display:none">

View file

@ -316,7 +316,7 @@
<tbody> <tbody>
<!-- ELSE --> <!-- ELSE -->
<tr> <tr>
<td><strong>{groups.GROUP_NAME}</strong></td> <td><strong<!-- IF groups.GROUP_COLOR --> style="color: #{groups.GROUP_COLOR}"<!-- ENDIF -->>{groups.GROUP_NAME}</strong></td>
<td style="text-align: center;">{groups.TOTAL_MEMBERS}</td> <td style="text-align: center;">{groups.TOTAL_MEMBERS}</td>
<td style="text-align: center;">{groups.PENDING_MEMBERS}</td> <td style="text-align: center;">{groups.PENDING_MEMBERS}</td>
<td style="text-align: center;"><a href="{groups.U_EDIT}">{L_SETTINGS}</a></td> <td style="text-align: center;"><a href="{groups.U_EDIT}">{L_SETTINGS}</a></td>

View file

@ -69,7 +69,7 @@
<p>{L_ACP_LANGUAGE_PACKS_EXPLAIN}</p> <p>{L_ACP_LANGUAGE_PACKS_EXPLAIN}</p>
<fieldset class="quick"> <fieldset class="quick">
<span class="small"><a href="https://www.phpbb.com/go/customise/language-packs/3.1" target="_blank">{L_BROWSE_LANGUAGE_PACKS_DATABASE}</a></span> <span class="small"><a href="https://www.phpbb.com/go/customise/language-packs/3.2" target="_blank">{L_BROWSE_LANGUAGE_PACKS_DATABASE}</a></span>
</fieldset> </fieldset>
<table class="table1 zebra-table"> <table class="table1 zebra-table">

View file

@ -153,8 +153,14 @@
<td><strong>{PHP_VERSION_INFO}</strong></td> <td><strong>{PHP_VERSION_INFO}</strong></td>
<!-- IF S_TOTAL_ORPHAN --> <!-- IF S_TOTAL_ORPHAN -->
<td>{L_NUMBER_ORPHAN}{L_COLON} </td> <td>{L_NUMBER_ORPHAN}{L_COLON} </td>
<td><strong>{TOTAL_ORPHAN}</strong></td> <td>
<!-- ELSE --> <!-- IF TOTAL_ORPHAN > 0 -->
<a href="{U_ATTACH_ORPHAN}" title="{L_MORE_INFORMATION}"><strong>{TOTAL_ORPHAN}</strong></a>
<!-- ELSE -->
<strong>{TOTAL_ORPHAN}</strong>
<!-- ENDIF -->
</td>
<!-- ELSE -->
<td>&nbsp;</td> <td>&nbsp;</td>
<td>&nbsp;</td> <td>&nbsp;</td>
<!-- ENDIF --> <!-- ENDIF -->

View file

@ -238,7 +238,7 @@
<form id="profile_fields" method="post" action="{U_ACTION}"> <form id="profile_fields" method="post" action="{U_ACTION}">
<fieldset class="quick"> <fieldset class="quick">
<input class="text small" type="text" name="field_ident" /> <select name="field_type">{S_TYPE_OPTIONS}</select> <select name="field_type">{S_TYPE_OPTIONS}</select>
<input class="button1" type="submit" name="submit" value="{L_CREATE_NEW_FIELD}" /> <input class="button1" type="submit" name="submit" value="{L_CREATE_NEW_FIELD}" />
<input type="hidden" name="create" value="1" /> <input type="hidden" name="create" value="1" />
{S_FORM_TOKEN} {S_FORM_TOKEN}

View file

@ -94,7 +94,9 @@
<dd><label><input type="radio" class="radio" name="prune_sticky" value="1" /> {L_YES}</label> <dd><label><input type="radio" class="radio" name="prune_sticky" value="1" /> {L_YES}</label>
<label><input type="radio" class="radio" id="sticky" name="prune_sticky" value="0" checked="checked" /> {L_NO}</label></dd> <label><input type="radio" class="radio" id="sticky" name="prune_sticky" value="0" checked="checked" /> {L_NO}</label></dd>
</dl> </dl>
<!-- EVENT acp_prune_forums_settings_append -->
<p class="quick"> <p class="quick">
{S_HIDDEN_FIELDS} {S_HIDDEN_FIELDS}
{S_FORM_TOKEN} {S_FORM_TOKEN}

View file

@ -33,7 +33,7 @@
<!-- IF L_EXPLAIN --><p>{L_EXPLAIN}</p><!-- ENDIF --> <!-- IF L_EXPLAIN --><p>{L_EXPLAIN}</p><!-- ENDIF -->
<fieldset class="quick"> <fieldset class="quick">
<span class="small"><a href="https://www.phpbb.com/go/customise/styles/3.1" target="_blank">{L_BROWSE_STYLES_DATABASE}</a></span> <span class="small"><a href="https://www.phpbb.com/go/customise/styles/3.2" target="_blank">{L_BROWSE_STYLES_DATABASE}</a></span>
</fieldset> </fieldset>
<form id="acp_styles" method="post" action="{U_ACTION}"> <form id="acp_styles" method="post" action="{U_ACTION}">
@ -96,6 +96,7 @@
<thead> <thead>
<tr> <tr>
<th>{L_STYLE_NAME}</th> <th>{L_STYLE_NAME}</th>
<th width="10%" style="white-space: nowrap; text-align: center;">{L_STYLE_PHPBB_VERSION}</th>
<!-- IF not STYLES_LIST_HIDE_COUNT --><th width="10%" style="white-space: nowrap; text-align: center;">{L_STYLE_USED_BY}</th><!-- ENDIF --> <!-- IF not STYLES_LIST_HIDE_COUNT --><th width="10%" style="white-space: nowrap; text-align: center;">{L_STYLE_USED_BY}</th><!-- ENDIF -->
<th width="25%" style="white-space: nowrap; text-align: center;">{L_ACTIONS}</th> <th width="25%" style="white-space: nowrap; text-align: center;">{L_ACTIONS}</th>
{STYLES_LIST_EXTRA} {STYLES_LIST_EXTRA}
@ -129,6 +130,7 @@
<span class="style-path"><br />{L_STYLE_PATH}{L_COLON} {styles_list.STYLE_PATH_FULL}</span> <span class="style-path"><br />{L_STYLE_PATH}{L_COLON} {styles_list.STYLE_PATH_FULL}</span>
<!-- ENDIF --> <!-- ENDIF -->
</td> </td>
<td class="{$ROW_CLASS} users">{styles_list.STYLE_PHPBB_VERSION}</td>
<!-- IF not STYLES_LIST_HIDE_COUNT --> <!-- IF not STYLES_LIST_HIDE_COUNT -->
<td class="{$ROW_CLASS} users">{styles_list.USERS}</td> <td class="{$ROW_CLASS} users">{styles_list.USERS}</td>
<!-- ENDIF --> <!-- ENDIF -->
@ -144,7 +146,9 @@
{styles_list.EXTRA} {styles_list.EXTRA}
<td class="{$ROW_CLASS} mark" width="20"> <td class="{$ROW_CLASS} mark" width="20">
<!-- IF styles_list.STYLE_ID --> <!-- IF styles_list.STYLE_ID -->
<input class="checkbox" type="checkbox" name="ids[]" value="{styles_list.STYLE_ID}" /> {% if styles_list.STYLE_NAME !== 'prosilver' %}
<input class="checkbox" type="checkbox" name="ids[]" value="{styles_list.STYLE_ID}" />
{% endif %}
<!-- ELSE --> <!-- ELSE -->
<!-- IF styles_list.COMMENT != '' --> <!-- IF styles_list.COMMENT != '' -->
&nbsp; &nbsp;

View file

@ -33,7 +33,7 @@
<dt><label for="notifymethod">{L_NOTIFY_METHOD}{L_COLON}</label><br /><span>{L_NOTIFY_METHOD_EXPLAIN}</span></dt> <dt><label for="notifymethod">{L_NOTIFY_METHOD}{L_COLON}</label><br /><span>{L_NOTIFY_METHOD_EXPLAIN}</span></dt>
<dd><label><input type="radio" class="radio" name="notifymethod" value="0"<!-- IF NOTIFY_EMAIL --> id="notifymethod" checked="checked"<!-- ENDIF --> /> {L_NOTIFY_METHOD_EMAIL}</label> <dd><label><input type="radio" class="radio" name="notifymethod" value="0"<!-- IF NOTIFY_EMAIL --> id="notifymethod" checked="checked"<!-- ENDIF --> /> {L_NOTIFY_METHOD_EMAIL}</label>
<label><input type="radio" class="radio" name="notifymethod" value="1"<!-- IF NOTIFY_IM --> id="notifymethod" checked="checked"<!-- ENDIF --><!-- IF S_JABBER_DISABLED --> disabled="disabled"<!-- ENDIF --> /> {L_NOTIFY_METHOD_IM}</label> <label><input type="radio" class="radio" name="notifymethod" value="1"<!-- IF NOTIFY_IM --> id="notifymethod" checked="checked"<!-- ENDIF --><!-- IF S_JABBER_DISABLED --> disabled="disabled"<!-- ENDIF --> /> {L_NOTIFY_METHOD_IM}</label>
<label><input type="radio" class="radio" name="notifymethod" value="2"<!-- IF NOTIFY_BOTH --> id="notifymethod" checked="checked"<!-- ENDIF --> /> {L_NOTIFY_METHOD_BOTH}</label></dd> <label><input type="radio" class="radio" name="notifymethod" value="2"<!-- IF NOTIFY_BOTH --> id="notifymethod" checked="checked"<!-- ENDIF --><!-- IF S_JABBER_DISABLED --> disabled="disabled"<!-- ENDIF --> /> {L_NOTIFY_METHOD_BOTH}</label></dd>
</dl> </dl>
<dl> <dl>
<dt><label for="notifypm">{L_NOTIFY_ON_PM}{L_COLON}</label></dt> <dt><label for="notifypm">{L_NOTIFY_ON_PM}{L_COLON}</label></dt>

View file

@ -525,7 +525,6 @@ li {
padding: 0; padding: 0;
border-right: 1px solid #CCCFD3; border-right: 1px solid #CCCFD3;
position: relative; position: relative;
z-index: 1;
} }
.rtl #menu { .rtl #menu {
@ -841,6 +840,7 @@ table.zebra-table tbody tr:nth-child(odd) {
} }
.row2 { .row2 {
word-break: break-all;
background-color: #DCEBFE; background-color: #DCEBFE;
} }
@ -1891,7 +1891,6 @@ li.pagination ul {
color: #000; color: #000;
text-align: center; text-align: center;
border: 1px solid #AAA; border: 1px solid #AAA;
opacity: .95;
} }
.tooltip span.top { .tooltip span.top {
@ -2461,6 +2460,9 @@ fieldset.permissions .padding {
text-align: left; text-align: left;
} }
.rtl .dropdown li {
text-align: right;
}
.wrap .dropdown li, .dropdown.wrap li { .wrap .dropdown li, .dropdown.wrap li {
white-space: normal; white-space: normal;
} }
@ -2475,6 +2477,10 @@ fieldset.permissions .padding {
width: 250px; width: 250px;
} }
.rtl .roles-options > .dropdown {
right: auto;
}
.roles-options { .roles-options {
-webkit-user-select: none; -webkit-user-select: none;
-moz-user-select: none; -moz-user-select: none;
@ -2493,6 +2499,10 @@ fieldset.permissions .padding {
background: url('../images/arrow_down.gif') no-repeat 245px .7em; background: url('../images/arrow_down.gif') no-repeat 245px .7em;
} }
.rtl .roles-options > span {
background: url('../images/arrow_down.gif') no-repeat 7px .7em;
}
.roles-options li { .roles-options li {
list-style: none; list-style: none;
} }

View file

@ -6,7 +6,9 @@
<div id="page-footer"> <div id="page-footer">
<div class="copyright"> <div class="copyright">
Powered by <a href="https://www.phpbb.com/">phpBB</a>&reg; Forum Software &copy; phpBB Limited {% if S_COPYRIGHT_HTML %}
{{ CREDIT_LINE }}
{% endif %}
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,3 +1,4 @@
<!-- IF FORM_TITLE --><h1>{FORM_TITLE}</h1><!-- ENDIF -->
<form id="<!-- IF FORM_ID -->{FORM_ID}<!-- ELSE -->install_install<!-- ENDIF -->" method="POST" action="{U_ACTION}"> <form id="<!-- IF FORM_ID -->{FORM_ID}<!-- ELSE -->install_install<!-- ENDIF -->" method="POST" action="{U_ACTION}">
<!-- IF .options --> <!-- IF .options -->
<!-- IF S_NOT_ONLY_BUTTON_FORM --> <!-- IF S_NOT_ONLY_BUTTON_FORM -->
@ -8,9 +9,9 @@
<!-- IF options.S_LEGEND --> <!-- IF options.S_LEGEND -->
<!-- IF not options.S_FIRST_ROW --> <!-- IF not options.S_FIRST_ROW -->
</fieldset> </fieldset>
<fieldset>
<!-- ENDIF --> <!-- ENDIF -->
<fieldset>
<legend>{options.LEGEND}</legend> <legend>{options.LEGEND}</legend>
<!-- ELSE --> <!-- ELSE -->
<dl> <dl>
@ -49,7 +50,7 @@
<fieldset class="submit-buttons"> <fieldset class="submit-buttons">
<legend>{L_SUBMIT}</legend> <legend>{L_SUBMIT}</legend>
<!-- BEGIN submit_buttons --> <!-- BEGIN submit_buttons -->
<input class="button1<!-- IF submit_buttons.DISABLED --> disabled<!-- ENDIF -->" type="submit" name="{submit_buttons.KEY}" value="{submit_buttons.TITLE}"<!-- IF submit_buttons.DISABLED --> disabled="disabled"<!-- ENDIF --> /> <input class="<!-- IF not submit_buttons.IS_SECONDARY -->button1<!-- ELSE -->button2<!-- ENDIF --><!-- IF submit_buttons.DISABLED --> disabled<!-- ENDIF -->" type="submit" name="{submit_buttons.KEY}" value="{submit_buttons.TITLE}"<!-- IF submit_buttons.DISABLED --> disabled="disabled"<!-- ENDIF --> />
<!-- END submit_buttons --> <!-- END submit_buttons -->
</fieldset> </fieldset>
<!-- ENDIF --> <!-- ENDIF -->

View file

@ -41,7 +41,7 @@
<dt style="width: 20%"><label for="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}">{L_ROLE}{L_COLON}</label></dt> <dt style="width: 20%"><label for="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}">{L_ROLE}{L_COLON}</label></dt>
{% if p_mask.f_mask.role_options %} {% if p_mask.f_mask.role_options %}
<dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 20%"> <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 20%">
<div class="dropdown-container dropdown-button-control roles-options" data-alt-text="{LA_ROLE_DESCRIPTION}"> <div class="dropdown-container dropdown-{S_CONTENT_FLOW_END} dropdown-button-control roles-options" data-alt-text="{LA_ROLE_DESCRIPTION}">
<select id="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" name="role[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]">{p_mask.f_mask.S_ROLE_OPTIONS}</select> <select id="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" name="role[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]">{p_mask.f_mask.S_ROLE_OPTIONS}</select>
<span title="Roles" class="button icon-button tools-icon dropdown-trigger dropdown-select">{L_NO_ROLE_ASSIGNED}</span> <span title="Roles" class="button icon-button tools-icon dropdown-trigger dropdown-select">{L_NO_ROLE_ASSIGNED}</span>
<div class="dropdown hidden"> <div class="dropdown hidden">

View file

@ -130,10 +130,17 @@ phpbb.positionTooltip = function ($element) {
$element = $element.parent(); $element = $element.parent();
offset = $element.offset(); offset = $element.offset();
$('#_tooltip_container').css({ if ($('body').hasClass('rtl')) {
top: offset.top + 30, $('#_tooltip_container').css({
left: offset.left - 205 top: offset.top + 30,
}); left: offset.left + 255
});
} else {
$('#_tooltip_container').css({
top: offset.top + 30,
left: offset.left - 205
});
}
}; };
/** /**

View file

@ -20,6 +20,13 @@ var phpbbAlertTimer = null;
phpbb.isTouch = (window && typeof window.ontouchstart !== 'undefined'); phpbb.isTouch = (window && typeof window.ontouchstart !== 'undefined');
// Add ajax pre-filter to prevent cross-domain script execution
$.ajaxPrefilter(function(s) {
if (s.crossDomain) {
s.contents.script = false;
}
});
/** /**
* Display a loading screen * Display a loading screen
* *
@ -27,9 +34,9 @@ phpbb.isTouch = (window && typeof window.ontouchstart !== 'undefined');
*/ */
phpbb.loadingIndicator = function() { phpbb.loadingIndicator = function() {
if (!$loadingIndicator) { if (!$loadingIndicator) {
$loadingIndicator = $('<div />', { $loadingIndicator = $('<div />', {
id: 'loading_indicator', 'id': 'loading_indicator',
class: 'loading_indicator', 'class': 'loading_indicator'
}); });
$loadingIndicator.appendTo('#page-footer'); $loadingIndicator.appendTo('#page-footer');
} }
@ -179,7 +186,7 @@ phpbb.alert.close = function($alert, fadedark) {
phpbb.confirm = function(msg, callback, fadedark) { phpbb.confirm = function(msg, callback, fadedark) {
var $confirmDiv = $('#phpbb_confirm'); var $confirmDiv = $('#phpbb_confirm');
$confirmDiv.find('.alert_text').html(msg); $confirmDiv.find('.alert_text').html(msg);
fadedark = fadedark !== 'undefined' ? fadedark : true; fadedark = typeof fadedark !== 'undefined' ? fadedark : true;
$(document).on('keydown.phpbb.alert', function(e) { $(document).on('keydown.phpbb.alert', function(e) {
if (e.keyCode === keymap.ENTER || e.keyCode === keymap.ESC) { if (e.keyCode === keymap.ENTER || e.keyCode === keymap.ESC) {
@ -935,9 +942,9 @@ phpbb.addAjaxCallback('alt_text', function() {
$anchor.each(function() { $anchor.each(function() {
var $this = $(this); var $this = $(this);
altText = $this.attr('data-alt-text'); altText = $this.attr('data-alt-text');
$this.attr('data-alt-text', $this.text()); $this.attr('data-alt-text', $.trim($this.text()));
$this.attr('title', $.trim(altText)); $this.attr('title', altText);
$this.text(altText); $this.children('span').text(altText);
}); });
}); });
@ -1331,6 +1338,7 @@ phpbb.toggleDropdown = function() {
$this.css({ $this.css({
marginLeft: 0, marginLeft: 0,
left: 0, left: 0,
marginRight: 0,
maxWidth: (windowWidth - 4) + 'px' maxWidth: (windowWidth - 4) + 'px'
}); });
@ -1642,7 +1650,7 @@ phpbb.lazyLoadAvatars = function loadAvatars() {
}); });
}; };
$(window).load(phpbb.lazyLoadAvatars); $(window).on('load', phpbb.lazyLoadAvatars);
/** /**
* Apply code editor to all textarea elements with data-bbcode attribute * Apply code editor to all textarea elements with data-bbcode attribute
@ -1654,7 +1662,7 @@ $(function() {
phpbb.registerPageDropdowns(); phpbb.registerPageDropdowns();
$('#color_palette_placeholder').each(function() { $('[data-orientation]').each(function() {
phpbb.registerPalette($(this)); phpbb.registerPalette($(this));
}); });

File diff suppressed because one or more lines are too long

View file

@ -21,7 +21,9 @@ phpbb.plupload.initialize = function() {
// Only execute if Plupload initialized successfully. // Only execute if Plupload initialized successfully.
phpbb.plupload.uploader.bind('Init', function() { phpbb.plupload.uploader.bind('Init', function() {
phpbb.plupload.form = $(phpbb.plupload.config.form_hook)[0]; phpbb.plupload.form = $(phpbb.plupload.config.form_hook)[0];
phpbb.plupload.rowTpl = $('#attach-row-tpl')[0].outerHTML; let $attachRowTemplate = $('#attach-row-tpl');
$attachRowTemplate.removeClass('attach-row-tpl');
phpbb.plupload.rowTpl = $attachRowTemplate[0].outerHTML;
// Hide the basic upload panel and remove the attach row template. // Hide the basic upload panel and remove the attach row template.
$('#attach-row-tpl, #attach-panel-basic').remove(); $('#attach-row-tpl, #attach-panel-basic').remove();
@ -211,7 +213,7 @@ phpbb.plupload.updateHiddenData = function(row, attach, index) {
.attr('type', 'hidden') .attr('type', 'hidden')
.attr('name', 'attachment_data[' + index + '][' + key + ']') .attr('name', 'attachment_data[' + index + '][' + key + ']')
.attr('value', attach[key]); .attr('value', attach[key]);
$('textarea', row).after(input); $(row).append(input);
} }
}; };

File diff suppressed because one or more lines are too long

View file

@ -71,9 +71,12 @@ require($phpbb_root_path . 'includes/compatibility_globals.' . $phpEx);
register_compatibility_globals(); register_compatibility_globals();
/** @var \phpbb\config\config $config */
$config = $phpbb_container->get('config');
/** @var \phpbb\language\language $language */ /** @var \phpbb\language\language $language */
$language = $phpbb_container->get('language'); $language = $phpbb_container->get('language');
$language->set_default_language($phpbb_container->get('config')['default_lang']); $language->set_default_language($config['default_lang']);
$language->add_lang(array('common', 'acp/common', 'cli')); $language->add_lang(array('common', 'acp/common', 'cli'));
/* @var $user \phpbb\user */ /* @var $user \phpbb\user */

View file

@ -4,7 +4,7 @@
"type": "project", "type": "project",
"keywords": ["phpbb", "forum"], "keywords": ["phpbb", "forum"],
"homepage": "https://www.phpbb.com", "homepage": "https://www.phpbb.com",
"license": "GPL-2.0", "license": "GPL-2.0-only",
"authors": [ "authors": [
{ {
"name": "phpBB Limited", "name": "phpBB Limited",
@ -31,9 +31,9 @@
"guzzlehttp/guzzle": "~5.3", "guzzlehttp/guzzle": "~5.3",
"lusitanian/oauth": "^0.8.1", "lusitanian/oauth": "^0.8.1",
"marc1706/fast-image-size": "^1.1", "marc1706/fast-image-size": "^1.1",
"paragonie/random_compat": "^1.4", "paragonie/random_compat": "^2.0",
"patchwork/utf8": "^1.1", "patchwork/utf8": "^1.1",
"s9e/text-formatter": "~0.11.0", "s9e/text-formatter": "^1.3",
"symfony/config": "^2.8", "symfony/config": "^2.8",
"symfony/console": "^2.8", "symfony/console": "^2.8",
"symfony/debug": "^2.8", "symfony/debug": "^2.8",
@ -69,7 +69,7 @@
}, },
"config": { "config": {
"platform": { "platform": {
"php": "5.4" "php": "5.4.7"
} }
} }
} }

569
phpBB/composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -122,7 +122,13 @@ services:
group_helper: group_helper:
class: phpbb\group\helper class: phpbb\group\helper
arguments: arguments:
- '@auth'
- '@cache'
- '@config'
- '@language' - '@language'
- '@dispatcher'
- '@path_helper'
- '@user'
log: log:
class: phpbb\log\log class: phpbb\log\log

View file

@ -3,6 +3,7 @@ services:
class: phpbb\avatar\manager class: phpbb\avatar\manager
arguments: arguments:
- '@config' - '@config'
- '@dispatcher'
- '@avatar.driver_collection' - '@avatar.driver_collection'
# ----- Avatar drivers ----- # ----- Avatar drivers -----

View file

@ -3,7 +3,6 @@ services:
class: phpbb\console\exception_subscriber class: phpbb\console\exception_subscriber
arguments: arguments:
- '@language' - '@language'
- '%debug.exceptions%'
tags: tags:
- { name: kernel.event_subscriber } - { name: kernel.event_subscriber }
@ -209,6 +208,7 @@ services:
console.command.thumbnail.delete: console.command.thumbnail.delete:
class: phpbb\console\command\thumbnail\delete class: phpbb\console\command\thumbnail\delete
arguments: arguments:
- '@config'
- '@user' - '@user'
- '@dbal.conn' - '@dbal.conn'
- '%core.root_path%' - '%core.root_path%'
@ -218,6 +218,7 @@ services:
console.command.thumbnail.generate: console.command.thumbnail.generate:
class: phpbb\console\command\thumbnail\generate class: phpbb\console\command\thumbnail\generate
arguments: arguments:
- '@config'
- '@user' - '@user'
- '@dbal.conn' - '@dbal.conn'
- '@cache' - '@cache'

View file

@ -35,6 +35,7 @@ services:
- '@config_text' - '@config_text'
- '@dbal.conn' - '@dbal.conn'
- '@user' - '@user'
- '@dispatcher'
- '%core.root_path%' - '%core.root_path%'
- '%core.php_ext%' - '%core.php_ext%'

View file

@ -18,9 +18,10 @@ services:
class: phpbb\feed\helper class: phpbb\feed\helper
arguments: arguments:
- '@config' - '@config'
- '@service_container'
- '@path_helper'
- '@text_formatter.renderer'
- '@user' - '@user'
- '%core.root_path%'
- '%core.php_ext%'
feed.forum: feed.forum:
class: phpbb\feed\forum class: phpbb\feed\forum
@ -78,6 +79,10 @@ services:
- '@dispatcher' - '@dispatcher'
- '%core.php_ext%' - '%core.php_ext%'
feed.quote_helper:
class: phpbb\feed\quote_helper
parent: text_formatter.s9e.quote_helper
feed.topic: feed.topic:
class: phpbb\feed\topic class: phpbb\feed\topic
shared: false shared: false

View file

@ -26,6 +26,11 @@ services:
text_formatter.utils: text_formatter.utils:
alias: text_formatter.s9e.utils alias: text_formatter.s9e.utils
text_formatter.s9e.bbcode_merger:
class: phpbb\textformatter\s9e\bbcode_merger
arguments:
- '@text_formatter.s9e.factory'
text_formatter.s9e.factory: text_formatter.s9e.factory:
class: phpbb\textformatter\s9e\factory class: phpbb\textformatter\s9e\factory
arguments: arguments:
@ -34,6 +39,7 @@ services:
- '@dispatcher' - '@dispatcher'
- '@config' - '@config'
- '@text_formatter.s9e.link_helper' - '@text_formatter.s9e.link_helper'
- '@log'
- '%text_formatter.cache.dir%' - '%text_formatter.cache.dir%'
- '%text_formatter.cache.parser.key%' - '%text_formatter.cache.parser.key%'
- '%text_formatter.cache.renderer.key%' - '%text_formatter.cache.renderer.key%'

View file

@ -33,13 +33,6 @@ services:
tags: tags:
- { name: install_obtain_data, order: 40 } - { name: install_obtain_data, order: 40 }
installer.obtain_data.obtain_imagick_path:
class: phpbb\install\module\obtain_data\task\obtain_imagick_path
arguments:
- '@installer.helper.config'
tags:
- { name: install_obtain_data, order: 60 }
installer.obtain_data.obtain_server_data: installer.obtain_data.obtain_server_data:
class: phpbb\install\module\obtain_data\task\obtain_server_data class: phpbb\install\module\obtain_data\task\obtain_server_data
arguments: arguments:

View file

@ -185,7 +185,7 @@ while ($row = $db->sql_fetchrow($result))
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($remove_auth_options)) if (count($remove_auth_options))
{ {
$db->sql_query('DELETE FROM ' . ACL_USERS_TABLE . ' WHERE auth_option_id IN (' . implode(', ', $remove_auth_options) . ')'); $db->sql_query('DELETE FROM ' . ACL_USERS_TABLE . ' WHERE auth_option_id IN (' . implode(', ', $remove_auth_options) . ')');
$db->sql_query('DELETE FROM ' . ACL_GROUPS_TABLE . ' WHERE auth_option_id IN (' . implode(', ', $remove_auth_options) . ')'); $db->sql_query('DELETE FROM ' . ACL_GROUPS_TABLE . ' WHERE auth_option_id IN (' . implode(', ', $remove_auth_options) . ')');
@ -199,7 +199,7 @@ $prefixes = array('f_', 'a_', 'm_', 'u_');
foreach ($prefixes as $prefix) foreach ($prefixes as $prefix)
{ {
$var = $prefix . 'permissions'; $var = $prefix . 'permissions';
if (sizeof(${$var})) if (count(${$var}))
{ {
foreach (${$var} as $auth_option => $l_ary) foreach (${$var} as $auth_option => $l_ary)
{ {

View file

@ -51,7 +51,7 @@ function check_table_flash_bbcodes($table_name, $id_field, $content_field, $uid_
$ids = get_table_flash_bbcode_pkids($table_name, $id_field, $content_field, $uid_field, $bitfield_field); $ids = get_table_flash_bbcode_pkids($table_name, $id_field, $content_field, $uid_field, $bitfield_field);
$size = sizeof($ids); $size = count($ids);
if ($size) if ($size)
{ {
echo "Found $size potentially dangerous flash bbcodes.\n"; echo "Found $size potentially dangerous flash bbcodes.\n";

View file

@ -489,12 +489,12 @@ foreach ($lang_references as $lang_var => $filenames)
$html_data .= '<b>' . $lang_var . '</b><ul>'; $html_data .= '<b>' . $lang_var . '</b><ul>';
if (sizeof($filenames) != 1) if (count($filenames) != 1)
{ {
fwrite($common_fp, (($entry['common']) ? ",\n" : '') . "\t'$var' => '" . $lang[$var] . "'"); fwrite($common_fp, (($entry['common']) ? ",\n" : '') . "\t'$var' => '" . $lang[$var] . "'");
$entry['common'] = true; $entry['common'] = true;
} }
else if (sizeof($filenames) == 1) else if (count($filenames) == 1)
{ {
// Merge logical - hardcoded // Merge logical - hardcoded
$fname = (preg_match('#^(' . implode('|', $merge) . ')#', $filenames[0], $match)) ? $match[0] . '.php' : str_replace($ext, 'php', $filenames[0]); $fname = (preg_match('#^(' . implode('|', $merge) . ')#', $filenames[0], $match)) ? $match[0] . '.php' : str_replace($ext, 'php', $filenames[0]);

View file

@ -120,7 +120,7 @@ do
$pct_encoded = "%[\dA-F]{2}"; $pct_encoded = "%[\dA-F]{2}";
$unreserved = "$add_chars\pL0-9\-._~"; $unreserved = "$add_chars\pL0-9\-._~";
$sub_delims = ($inline) ? '!$&\'(*+,;=' : '!$&\'()*+,;='; $sub_delims = ($inline) ? '!$&\'(*+,;=' : '!$&\'()*+,;=';
$scheme = ($inline) ? '[a-z][a-z\d+]*': '[a-z][a-z\d+\-.]*' ; // avoid automatic parsing of "word" in "last word.http://..." $scheme = ($inline) ? '[a-z][a-z\d+]*(?<!javascript)': '[a-z][a-z\d+\-.]*(?<!javascript)' ; // avoid automatic parsing of "word" in "last word.http://..."
$pchar = "(?:[^$remove_chars]*[$unreserved$sub_delims:@|]+|$pct_encoded)"; // rfc: no "|" $pchar = "(?:[^$remove_chars]*[$unreserved$sub_delims:@|]+|$pct_encoded)"; // rfc: no "|"
$reg_name = "(?:[^$remove_chars]*[$unreserved$sub_delims:@|]+|$pct_encoded)+"; // rfc: * instead of + and no "|" and no "@" and no ":" (included instead of userinfo) $reg_name = "(?:[^$remove_chars]*[$unreserved$sub_delims:@|]+|$pct_encoded)+"; // rfc: * instead of + and no "|" and no "@" and no ":" (included instead of userinfo)

View file

@ -89,7 +89,7 @@ for(;$postcounter <= $max_post_id; $postcounter += $batchsize)
$rowset = $db->sql_fetchrowset($result); $rowset = $db->sql_fetchrowset($result);
$db->sql_freeresult($result); $db->sql_freeresult($result);
$post_rows = sizeof($rowset); $post_rows = count($rowset);
if( $post_rows ) if( $post_rows )
{ {

View file

@ -50,6 +50,18 @@
<ol> <ol>
<li><a href="#changelog">Changelog</a> <li><a href="#changelog">Changelog</a>
<ul> <ul>
<li><a href="#v327">Changes since 3.2.7</a></li>
<li><a href="#v326">Changes since 3.2.6</a></li>
<li><a href="#v326rc1">Changes since 3.2.6-RC1</a></li>
<li><a href="#v325">Changes since 3.2.5</a></li>
<li><a href="#v325rc1">Changes since 3.2.5-RC1</a></li>
<li><a href="#v324">Changes since 3.2.4</a></li>
<li><a href="#v324rc1">Changes since 3.2.4-RC1</a></li>
<li><a href="#v323">Changes since 3.2.3</a></li>
<li><a href="#v323rc2">Changes since 3.2.3-RC2</a></li>
<li><a href="#v323rc1">Changes since 3.2.3-RC1</a></li>
<li><a href="#v322">Changes since 3.2.2</a></li>
<li><a href="#v321">Changes since 3.2.1</a></li>
<li><a href="#v320">Changes since 3.2.0</a></li> <li><a href="#v320">Changes since 3.2.0</a></li>
<li><a href="#v320rc1">Changes since 3.2.0-RC1</a></li> <li><a href="#v320rc1">Changes since 3.2.0-RC1</a></li>
<li><a href="#v320b2">Changes since 3.2.0-b2</a></li> <li><a href="#v320b2">Changes since 3.2.0-b2</a></li>
@ -57,6 +69,7 @@
<li><a href="#v320a2">Changes since 3.2.0-a2</a></li> <li><a href="#v320a2">Changes since 3.2.0-a2</a></li>
<li><a href="#v320a1">Changes since 3.2.0-a1</a></li> <li><a href="#v320a1">Changes since 3.2.0-a1</a></li>
<li><a href="#v31x">Changes since 3.1.x</a></li> <li><a href="#v31x">Changes since 3.1.x</a></li>
<li><a href="#v3111">Changes since 3.1.11</a></li>
<li><a href="#v3110">Changes since 3.1.10</a></li> <li><a href="#v3110">Changes since 3.1.10</a></li>
<li><a href="#v319">Changes since 3.1.9</a></li> <li><a href="#v319">Changes since 3.1.9</a></li>
<li><a href="#v318">Changes since 3.1.8</a></li> <li><a href="#v318">Changes since 3.1.8</a></li>
@ -126,6 +139,558 @@
<div class="inner"> <div class="inner">
<div class="content"> <div class="content">
<a name="v327"></a><h3>Changes since 3.2.7</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13175">PHPBB3-13175</a>] - External accounts can be linked to more than one local account</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14459">PHPBB3-14459</a>] - Check language input for group</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15211">PHPBB3-15211</a>] - Emoji characters in forum name causing SQL errors</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15885">PHPBB3-15885</a>] - Group rank not displaying on memberlist_body</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15897">PHPBB3-15897</a>] - Unicode Characters in Attachment Comment Causes mySQL Error </li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15932">PHPBB3-15932</a>] - Users can delete their attachments in the UCP, even if the post is locked</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15961">PHPBB3-15961</a>] - SMTP support for TLS is forcing use of deprecated TLS 1.0</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15974">PHPBB3-15974</a>] - The link &quot;Back to previous page&quot; can redirect to another page, not the previous one</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15976">PHPBB3-15976</a>] - Changing account settings without changing password resets user_passchg</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15982">PHPBB3-15982</a>] - Q&amp;A captcha plug-in still throws PHP 7.2.x countable warning</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16003">PHPBB3-16003</a>] - Post count not updated when deleting only post in topic</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16021">PHPBB3-16021</a>] - Recognize number of Template Event instances in events.md file</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16040">PHPBB3-16040</a>] - Topic Icon with space in filename isn't displayed by viewforum_body.html</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16048">PHPBB3-16048</a>] - Unable to restore any backup from ACP</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16050">PHPBB3-16050</a>] - PHP warning in MCP banning tab on PHP 7.2+</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16053">PHPBB3-16053</a>] - BBCodes using {TEXT} in HTML tags no longer work</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16054">PHPBB3-16054</a>] - Style templates no longer able to login &quot;from any page.&quot;</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16055">PHPBB3-16055</a>] - Unable to login using Oauth via Forums, topics or posts</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16061">PHPBB3-16061</a>] - Migrator never drops unique indexes</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16063">PHPBB3-16063</a>] - board_dst config value is not removed from config table after conversion</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16066">PHPBB3-16066</a>] - Banned or suspended user receives &quot;The submitted form was invalid. Try submitting again.&quot;</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16071">PHPBB3-16071</a>] - Undefined index for custom attachments groups</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16073">PHPBB3-16073</a>] - Fix warning in ACP version check</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16074">PHPBB3-16074</a>] - Twemoji -fe0f sequence not rendering</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16075">PHPBB3-16075</a>] - PM filter “sent to my default usergroup” triggers array to string conversion warning</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16080">PHPBB3-16080</a>] - Warnings When a Style exists on database but not on FTP</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16093">PHPBB3-16093</a>] - Attach row template always gets displayed with JS disabled</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16096">PHPBB3-16096</a>] - MySQL full text search always uses MyISAM limits</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16124">PHPBB3-16124</a>] - Incorrect users search by last visit time in memberlist.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16126">PHPBB3-16126</a>] - AppVeyor builds fail due to chocolatey being unable to install PHP</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15745">PHPBB3-15745</a>] - Hardcoded lang in credit line</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15886">PHPBB3-15886</a>] - Group helper functions</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15946">PHPBB3-15946</a>] - Add event - core.posting_modify_row_data</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15967">PHPBB3-15967</a>] - Unambiguous wording in user activation request email to Admin/Moderator</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15984">PHPBB3-15984</a>] - Use of 'Cache-Control: public' for serving files</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16000">PHPBB3-16000</a>] - Provide link to PHP Date Function in both ACP and UCP</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16013">PHPBB3-16013</a>] - Do not prevent username changes in ACP</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16019">PHPBB3-16019</a>] - Deny prosilver's uninstallation</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16024">PHPBB3-16024</a>] - Add core.topic_review_modify_sql_ary</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16025">PHPBB3-16025</a>] - Add 2 template events *_author_username_{append/prepend}</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16047">PHPBB3-16047</a>] - ACP Private Messages: Wording could be better</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16058">PHPBB3-16058</a>] - Remove sudo required from travis config</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16065">PHPBB3-16065</a>] - Undefined index: user_ip in oauth.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16068">PHPBB3-16068</a>] - Incorrect docblock parameter types</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16070">PHPBB3-16070</a>] - Remove support for WebSTAR and Xitami</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16078">PHPBB3-16078</a>] - Use chrome webdriver for UI tests</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16089">PHPBB3-16089</a>] - Add core.confirm_box_ajax_before</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16097">PHPBB3-16097</a>] - Add core.viewtopic_gen_sort_selects_before</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16101">PHPBB3-16101</a>] - Add Referrer-Policy header</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16102">PHPBB3-16102</a>] - Add core.posting_modify_post_subject</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16103">PHPBB3-16103</a>] - Add core.pm_modify_message_subject</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16106">PHPBB3-16106</a>] - Add core.mcp_main_before</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16107">PHPBB3-16107</a>] - Add mcp_move_destination_forum_before|after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16108">PHPBB3-16108</a>] - Add topiclist_row_topic_by_author_before|after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16109">PHPBB3-16109</a>] - Custom Profile Field visibility is incorrectly explained</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16111">PHPBB3-16111</a>] - Add core.message_history_modify_sql_ary</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16113">PHPBB3-16113</a>] - Add core.mcp_topic_modify_sql_ary</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16114">PHPBB3-16114</a>] - Add 2 mcp_topic_post_author_full_{append/prepend}</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16127">PHPBB3-16127</a>] - Add UI for Mass email $max_chunk_size</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16129">PHPBB3-16129</a>] - The attachment's ALT tag is supposed to describe the image, not the file.</li>
</ul>
<h4>Task</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16067">PHPBB3-16067</a>] - Define trusty build environment for travis builds</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16112">PHPBB3-16112</a>] - Update composer dependencies to latest</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16119">PHPBB3-16119</a>] - The text input for poll question has a too high maxlength attribute</li>
</ul>
<a name="v326"></a><h3>Changes since 3.2.6</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16034">PHPBB3-16034</a>] - Links created with [url=] - are sometimes incorrectly shortened</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16036">PHPBB3-16036</a>] - Cannot login with 3.2.6</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16037">PHPBB3-16037</a>] - Private message ViewFolder Broken</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16039">PHPBB3-16039</a>] - Unable to change announcement to standard topic due to missing global</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16042">PHPBB3-16042</a>] - Use S_LOGIN_REDIRECT to output login form token</li>
</ul>
<a name="v326rc1"></a><h3>Changes since 3.2.6-RC1</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16027">PHPBB3-16027</a>] - Appveyor builds fail on PHP 7.0</li>
</ul>
<h4>Security Issue</h4>
<ul>
<li>[SECURITY-231] - Remote avatar functionality allows checking for files and ports on local network</li>
<li>[SECURITY-235] - Fulltext native search can be used to cause long execution times</li>
</ul>
<h4>Hardening</h4>
<ul>
<li>[SECURITY-228] - Require form token in login_box</li>
<li>[SECURITY-233] - SMTP auth data shouldn't be cached</li>
<li>[SECURITY-234] - Main website URL in Admin Control Panel should not support JS URLs</li>
</ul>
<a name="v325"></a><h3>Changes since 3.2.5</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15509">PHPBB3-15509</a>] - Update database: info message is to scary</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15869">PHPBB3-15869</a>] - Cookies Problem with domains with special chars</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15876">PHPBB3-15876</a>] - Mysql 5.7 support Q&amp;A plugin</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15883">PHPBB3-15883</a>] - No error for invalid usernames on bulk add to usergroup</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15904">PHPBB3-15904</a>] - PHP warning when accessing modules in ACP System tab</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15917">PHPBB3-15917</a>] - Unapproved posts count towards forum post count</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15918">PHPBB3-15918</a>] - Ban reason messages show backslash (\) before apostrophe -- ex. (don\'t).</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15919">PHPBB3-15919</a>] - Lint test throws PHP warnings due to node modules folder</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15931">PHPBB3-15931</a>] - Issues in PM report emails</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15954">PHPBB3-15954</a>] - Some calls to include() don't have a safeguard</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15957">PHPBB3-15957</a>] - User preferences show notification method &quot;both&quot; with disabled Jabber in ACP</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15959">PHPBB3-15959</a>] - Travis Network Test is Failing for news.cnet.com</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15965">PHPBB3-15965</a>] - Console command to handle thumbnails have files directory hardcoded</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15975">PHPBB3-15975</a>] - Delete or prune an user doesn't remove its entries in the user_notifications table</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15986">PHPBB3-15986</a>] - Add missing language key for posting.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15996">PHPBB3-15996</a>] - Invalid data provider function name in migrator_tool_permission_test</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16006">PHPBB3-16006</a>] - Duplicate form IDs in UCP oauth form</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15884">PHPBB3-15884</a>] - Add memberlist_body_* events</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15889">PHPBB3-15889</a>] - Add core.memberlist_modify_memberrow_sql</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15890">PHPBB3-15890</a>] - Add core.memberlist_modify_viewprofile_sql</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15891">PHPBB3-15891</a>] - Add core.memberlist_modify_view_profile_template_vars</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15898">PHPBB3-15898</a>] - Add core.ucp_pm_compose_template</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15899">PHPBB3-15899</a>] - Add core.modify_attachment_sql_ary_on_* events</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15901">PHPBB3-15901</a>] - Add mcp_post_* template events</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15910">PHPBB3-15910</a>] - Pass object arguments by reference implicitly</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15914">PHPBB3-15914</a>] - Add core.modify_memberlist_viewprofile_group_sql and core.modify_memberlist_viewprofile_group_data</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15915">PHPBB3-15915</a>] - Add template events to posting_attach_body.html</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15924">PHPBB3-15924</a>] - Move from precise to trusty builds</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15926">PHPBB3-15926</a>] - Deny installs on PHP &gt;= 7.3@dev - Increase min. req. to 5.4.7</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15928">PHPBB3-15928</a>] - Remove support for backup download</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15939">PHPBB3-15939</a>] - Pagination docblocks</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15941">PHPBB3-15941</a>] - Replace MAX SQL in functions_posting.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15942">PHPBB3-15942</a>] - Array to string conversion when permanently deleting a post</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15948">PHPBB3-15948</a>] - Add core.mcp_change_topic_type_after/before</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15949">PHPBB3-15949</a>] - [Template] - ucp_profile_signature_posting_editor_options_prepend</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15950">PHPBB3-15950</a>] - Add SQL transactions to mcp_main.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15960">PHPBB3-15960</a>] - Add SQL transactions to functions_admin.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15970">PHPBB3-15970</a>] - Add core.message_admin_form_submit_before</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15972">PHPBB3-15972</a>] - Add core.markread_after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15992">PHPBB3-15992</a>] - Fix breadcrumb schema</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15995">PHPBB3-15995</a>] - Add core.memberlist_modify_sort_pagination_params</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15997">PHPBB3-15997</a>] - Increase webdriver timeout for UI tests</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16001">PHPBB3-16001</a>] - Append data to the OAuth's redirect URL</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16009">PHPBB3-16009</a>] - Display OAuth login's buttons in a row.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16010">PHPBB3-16010</a>] - Automatically check order of events in events.md file</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16018">PHPBB3-16018</a>] - Update composer and dependencies for 3.2.6</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16020">PHPBB3-16020</a>] - Fix placement of event viewforum_body_topic_author_username_append</li>
</ul>
<h4>New Feature</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15944">PHPBB3-15944</a>] - Add core.posting_modify_quote_attributes</li>
</ul>
<h4>Task</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15921">PHPBB3-15921</a>] - Update TextFormatter to 1.3.2</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15953">PHPBB3-15953</a>] - pm reported missing border color</li>
</ul>
<a name="v325rc1"></a><h3>Changes since 3.2.5-RC1</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15888">PHPBB3-15888</a>] - Update link to user guide</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15893">PHPBB3-15893</a>] - Call to undefined $user in phpbb_format_quote() when BBCodes are disabled</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15911">PHPBB3-15911</a>] - SQL general error on DB update from 3.0 branch</li>
</ul>
<h4>Hardening</h4>
<ul>
<li>[SECURITY-229] - Update to latest version of jQuery 1.x and add ajax prefilter</li>
</ul>
<a name="v324"></a><h3>Changes since 3.2.4</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15665">PHPBB3-15665</a>] - MSSQL implementation crashes when upload directory &gt; 2GB</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15858">PHPBB3-15858</a>] - Unapproved User(s) appearing as Guest in Team Page.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15867">PHPBB3-15867</a>] - Contact form without class</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15871">PHPBB3-15871</a>] - PHP 7.1+ warning in ACP extensions module</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15875">PHPBB3-15875</a>] - BBCode parsing error (PHP fatal error)</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15881">PHPBB3-15881</a>] - Login keys are not reset after password update in some cases</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15542">PHPBB3-15542</a>] - Some JS files being called without assets version</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15859">PHPBB3-15859</a>] - Modify the topic ordering if needed</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15863">PHPBB3-15863</a>] - Modify the topic sort ordering from the beginning</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15870">PHPBB3-15870</a>] - Modify the forum ID to handle the correct display of viewtopic if needed</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15872">PHPBB3-15872</a>] - Add show_user_activity to display_user_activity_modify_actives</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15873">PHPBB3-15873</a>] - Event to add/modify MCP report details template data.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15878">PHPBB3-15878</a>] - Add attachment to core.ucp_pm_view_message</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15879">PHPBB3-15879</a>] - Modify attachment's poster_id for get_submitted_attachment_data</li>
</ul>
<a name="v324rc1"></a><h3>Changes since 3.2.4-RC1</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15860">PHPBB3-15860</a>] - Backups filenames arent saved in the expected format</li>
</ul>
<h4>Security Issue</h4>
<ul>
<li>[SECURITY-227] - Phar deserialization in ACP leads to Remote Code Execution</li>
</ul>
<a name="v323"></a><h3>Changes since 3.2.3</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11453">PHPBB3-11453</a>] - phpbb_notification_method_email unnecessarily loads data of banned users.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12430">PHPBB3-12430</a>] - hilit not removed from URL after search</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13043">PHPBB3-13043</a>] - Fixing HTML5 conformance</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13128">PHPBB3-13128</a>] - sql_query_info, max_matches and charset_type removed from sphinxsearch 2.2.2-beta</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14812">PHPBB3-14812</a>] - No shadow pruning with system cron enabled</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15329">PHPBB3-15329</a>] - View/Edit drafts contain underlying HTML coding</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15420">PHPBB3-15420</a>] - Quote Notification Sent for Edited Posts by Non Author</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15494">PHPBB3-15494</a>] - Users can only be removed once from newly registered users</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15507">PHPBB3-15507</a>] - PHP 7.2 Warning</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15544">PHPBB3-15544</a>] - Migrations don't delete modules in every case</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15552">PHPBB3-15552</a>] - Private Message (PM) &quot;find a member&quot; button &quot;select marked&quot; not working</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15557">PHPBB3-15557</a>] - Used composer version has bug with PHP 7.2</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15583">PHPBB3-15583</a>] - Updating session time in AJAX request ignores 60 seconds check</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15593">PHPBB3-15593</a>] - Disabling &quot;print view&quot; (permission or private messages settings) actually doesn't block the feature</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15600">PHPBB3-15600</a>] - Ban reasons are not escaped in mcp_ban.html template</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15604">PHPBB3-15604</a>] - Appveyor builds unable to download and unpack MSSQL drivers</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15606">PHPBB3-15606</a>] - Hide/Reveal 'Profile' Link According to Permission Setting</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15607">PHPBB3-15607</a>] - Board's cookies not deleted on disabled board</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15611">PHPBB3-15611</a>] - Prosilver mobile layout: Misaligned text in user profile</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15612">PHPBB3-15612</a>] - PHP warning with MSSQL on PHP 7.2</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15616">PHPBB3-15616</a>] - Jumpbox doesn't display in the login forum page (access to forum with password)</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15618">PHPBB3-15618</a>] - Team page link always appears when you are logout (anonymous), even if you don't have the permission (unlike memberlist link)</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15619">PHPBB3-15619</a>] - Legends of custom profile fields could be hidden in memberlist, when viewing an user group</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15620">PHPBB3-15620</a>] - Avatar gallery can be unusable on multilingual boards, unless people use the board default language</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15622">PHPBB3-15622</a>] - Quoting messages (while viewing one, not inside post editor) can return a wrong chain</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15637">PHPBB3-15637</a>] - Event list only has first line of PHP event description</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15651">PHPBB3-15651</a>] - Migration 'if' conditions only support booleans</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15659">PHPBB3-15659</a>] - retrieve_block_vars generates warnings in PHP 7.2</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15666">PHPBB3-15666</a>] - Language system is not fully supported in Twig</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15670">PHPBB3-15670</a>] - Group forum permission: Can see forum gives NO SQL ERROR</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15673">PHPBB3-15673</a>] - Duplicated links for (ACP,MCP,FAQ) in QuickLinks and main nav bar</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15680">PHPBB3-15680</a>] - INSTALL.html should point to 3.2 documentation instead of 3.1</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15693">PHPBB3-15693</a>] - gen_rand_string() don't return a string with the expected length</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15695">PHPBB3-15695</a>] - gen_rand_string can return less characters than expected</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15700">PHPBB3-15700</a>] - {T_THEME_LANG_NAME} template variable could be wrong when log off</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15705">PHPBB3-15705</a>] - phpbbcli language parse error in PHP &lt;= 5.5.38</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15716">PHPBB3-15716</a>] - OAuth link information remains after deleting a user, causes fatal exception</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15717">PHPBB3-15717</a>] - Old email address missing from log when user changes email address</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15723">PHPBB3-15723</a>] - gen_rand_string() return wrong number or characters sometimes</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15733">PHPBB3-15733</a>] - Remove unused variables related to deprecated flood control</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15742">PHPBB3-15742</a>] - Remove get_magic_quotes_gpc from type_cast_helper</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15751">PHPBB3-15751</a>] - Warning when update with CLI</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15755">PHPBB3-15755</a>] - Broken events in /phpbb/attachment/delete.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15758">PHPBB3-15758</a>] - String INSECURE_REDIRECT is not shown translated</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15770">PHPBB3-15770</a>] - Sphinx assertion fails on unread posts when exceeding an offset of 999</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15788">PHPBB3-15788</a>] - Return button from privacy policy shows wrong text</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15817">PHPBB3-15817</a>] - Unable to install in Oracle 11R2 Express</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15824">PHPBB3-15824</a>] - UI test framework Broken for extensions</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15830">PHPBB3-15830</a>] - 'core.modify_notification_message' event is useless</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15849">PHPBB3-15849</a>] - PHP 7.2 compat for bitfield class</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15852">PHPBB3-15852</a>] - IPv6 address not working in Whois</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10432">PHPBB3-10432</a>] - Don't require username when user forgets password</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11500">PHPBB3-11500</a>] - on Custom profile fields the field_ident field lacks name</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12739">PHPBB3-12739</a>] - Make the font color palette in ACP same as Prosilver</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14656">PHPBB3-14656</a>] - Add a list-unsubscribe header with the unsubscribe URL</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14990">PHPBB3-14990</a>] - Add core event to the Twig environment</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15554">PHPBB3-15554</a>] - Simple footer after load js</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15579">PHPBB3-15579</a>] - Add core.ucp_main_front_modify_sql and core.ucp_main_front_modify_template_vars</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15590">PHPBB3-15590</a>] - Add PHP events after adding, updating and deleting BBCodes</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15628">PHPBB3-15628</a>] - newtopic_notify.txt does not have directly link to the new topic</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15638">PHPBB3-15638</a>] - Add word-break for overflowing.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15642">PHPBB3-15642</a>] - String to be used in HTML element contains &quot;&gt;&quot;</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15656">PHPBB3-15656</a>] - Add &quot;View post&quot; link in the mod logs on the ACP</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15661">PHPBB3-15661</a>] - Add core.viewtopic_modify_poll_ajax_data</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15662">PHPBB3-15662</a>] - Add $this-&gt;template to core.modify_notification_message</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15668">PHPBB3-15668</a>] - Change JQuery .load(fn) event to .on('load',fn)</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15674">PHPBB3-15674</a>] - Edit language lines in file en\acp\profile.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15683">PHPBB3-15683</a>] - Better error message when commit message has CRLF</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15696">PHPBB3-15696</a>] - 'if' module tool should support calling other tools</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15706">PHPBB3-15706</a>] - [Template] - mcp_post_report_buttons_top_*</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15719">PHPBB3-15719</a>] - Add core event on viewtopic post_list query for query modification</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15726">PHPBB3-15726</a>] - Implement selective purge in APCu cache driver</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15735">PHPBB3-15735</a>] - [Template] - *_content_after (for posts)</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15737">PHPBB3-15737</a>] - [PHP] - Add $user_rows to core.delete_user_before</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15762">PHPBB3-15762</a>] - Topics per page Conformity</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15768">PHPBB3-15768</a>] - Add a license to a repository</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15771">PHPBB3-15771</a>] - Q&amp;A configuration instructions not optilmal</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15799">PHPBB3-15799</a>] - Find correct poll for voting animation</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15803">PHPBB3-15803</a>] - Add core events on ucp_pm_compose for additional message list actions</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15819">PHPBB3-15819</a>] - Add core event to functions_posting to modify notifications</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15825">PHPBB3-15825</a>] - Add core.acp_manage_forums_move_content_sql_before</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15826">PHPBB3-15826</a>] - Add core.mcp_main_fork_sql_after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15827">PHPBB3-15827</a>] - [Template] - Add *_username_{prepend/append} template events</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15831">PHPBB3-15831</a>] - ACP signature update should trigger event</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15832">PHPBB3-15832</a>] - ACP avatar update event</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15833">PHPBB3-15833</a>] - ACP and UCP avatar delete events</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15837">PHPBB3-15837</a>] - Add core.ucp_register_welcome_email_before</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15838">PHPBB3-15838</a>] - Add core.ucp_register_register_after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15839">PHPBB3-15839</a>] - Add core.ucp_login_link_template_after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15841">PHPBB3-15841</a>] - Allow postrow pm link to be modified by event</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15848">PHPBB3-15848</a>] - Up-version plupload to v2.3.6 to fix image rotation issues</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15850">PHPBB3-15850</a>] - Use standard SQL cache for notification types</li>
</ul>
<h4>New Feature</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15792">PHPBB3-15792</a>] - [Template] - confirm_delete_body_delete_reason_before</li>
</ul>
<h4>Task</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15596">PHPBB3-15596</a>] - Migrate from data-vocabulary.org to schema.org</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15621">PHPBB3-15621</a>] - Some graphical inconsistencies with colored users groups in posting, UCP and MCP</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15701">PHPBB3-15701</a>] - {SIGNATURE} variable is added in mcp_post.html but not defined in MCP</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15809">PHPBB3-15809</a>] - Allow events with twig syntax</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15857">PHPBB3-15857</a>] - Add rubencm to CREDITS.txt</li>
</ul>
<a name="v323rc2"></a><h3>Changes since 3.2.3-RC2</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15504">PHPBB3-15504</a>] - phpBB Debug warning in 3.2.2</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15740">PHPBB3-15740</a>] - Terms &amp; Privavy hardcoded</li>
</ul>
<a name="v323rc1"></a><h3>Changes since 3.2.3-RC1</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11847">PHPBB3-11847</a>] - auth_provider_oauth migration must depend on at least one migration that ensures the module tables exist as expected</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15548">PHPBB3-15548</a>] - Dead link in ACP_COOKIE_SETTINGS_EXPLAIN language entry</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15586">PHPBB3-15586</a>] - When creating a module without the modes array a missing 'module_langname' index is accessed</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15613">PHPBB3-15613</a>] - Notification dropdown said to be not RTL compliant</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15627">PHPBB3-15627</a>] - Improve wording of YES_ACCURATE_PM_BUTTON + EXPLAIN</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15678">PHPBB3-15678</a>] - PHP warning in filesystem.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15731">PHPBB3-15731</a>] - Fix acp_search language parameters when deleting index</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15630">PHPBB3-15630</a>] - Change &lt;b&gt; to &lt;strong&gt; </li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15633">PHPBB3-15633</a>] - Remove extra space in GROUP_MAX_RECIPIENTS_EXPLAIN</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15657">PHPBB3-15657</a>] - Add core.mcp_queue_get_posts_for_posts_query_before and core.mcp_queue_get_posts_modify_post_row</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15676">PHPBB3-15676</a>] - Display privacy policy &amp; terms of use more prominently</li>
</ul>
<h4>Task</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15677">PHPBB3-15677</a>] - Updated dependencies for 3.2.3-RC2</li>
</ul>
<a name="v322"></a><h3>Changes since 3.2.2</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14936">PHPBB3-14936</a>] - Missing language variable INST_ERR_DB</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15491">PHPBB3-15491</a>] - Outdated linkes in installer support page</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15492">PHPBB3-15492</a>] - Permissions role combobox does not work in RTL</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15500">PHPBB3-15500</a>] - Docs outdated for new PHP 5.4.7 requirement</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15502">PHPBB3-15502</a>] - Errors in migrations in 3.2.2 release</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15506">PHPBB3-15506</a>] - Previewing new post empties attachment list of all but first attachment</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15512">PHPBB3-15512</a>] - Avoid reparsing non-existent polls</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15513">PHPBB3-15513</a>] - Signature edit in acp gives error</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15520">PHPBB3-15520</a>] - DbDriver-&gt;sql_build_query cant cope with sub-selects</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15522">PHPBB3-15522</a>] - Allow multiple color palettes per page</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15523">PHPBB3-15523</a>] - AdBlocker may cause JS error when using CookieConsent</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15525">PHPBB3-15525</a>] - composer.json License is Invalid/Deprecated</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15526">PHPBB3-15526</a>] - Cast bbcode ID to integer</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15527">PHPBB3-15527</a>] - Cannot interpret the BBCode definition</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15532">PHPBB3-15532</a>] - Update pull request template</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15533">PHPBB3-15533</a>] - Typo in viewtopic_topic_tools.html</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15558">PHPBB3-15558</a>] - phpbb\report\report_handler_post.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15559">PHPBB3-15559</a>] - phpbb\report\report_handler_pm.php:56</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15595">PHPBB3-15595</a>] - Migration Module Exists Tool Broken</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12579">PHPBB3-12579</a>] - Add BUTTON_ language strings for post &amp; PM buttons</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15495">PHPBB3-15495</a>] - Use transactions for queries in move_forum</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15499">PHPBB3-15499</a>] - Drop HHVM support</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15510">PHPBB3-15510</a>] - Link Orphan attachments in ACP&gt;General to Orphaned attachments page </li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15514">PHPBB3-15514</a>] - Improve accessibility by adding vital info from explanation to a title</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15518">PHPBB3-15518</a>] - Do not attempt to accurately determine whether posters can read private messages in viewtopic</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15528">PHPBB3-15528</a>] - Display the version of the installed styles in acp</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15529">PHPBB3-15529</a>] - Color groups in ACP</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15531">PHPBB3-15531</a>] - Log malformed BBCodes</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15534">PHPBB3-15534</a>] - Outdated ACP extensions database link for phpBB 3.2</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15535">PHPBB3-15535</a>] - Add S_FIRST_POST to postrow on viewtopic</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15537">PHPBB3-15537</a>] - Add events core.search_(native|mysql|postgres|sphinx)_index_before</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15547">PHPBB3-15547</a>] - Add file object to event core.avatar_driver_upload_move_file_before</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15561">PHPBB3-15561</a>] - Add core events for adding columns to MySQL and Postgres search backends</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15568">PHPBB3-15568</a>] - Update depencies to latest versions</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15569">PHPBB3-15569</a>] - Adjust update instructions to suggest file replacement method</li>
</ul>
<h4>New Feature</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15398">PHPBB3-15398</a>] - Add event to oauth login after ID check</li>
</ul>
<h4>Security Issue</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15570">PHPBB3-15570</a>] - Extension version check is restricted to TLS 1.0</li>
</ul>
<h4>Task</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15466">PHPBB3-15466</a>] - Move Nils in CREDITS.txt</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15516">PHPBB3-15516</a>] - Add instructions on running UI tests</li>
</ul>
<a name="v321"></a><h3>Changes since 3.2.1</h3>
<h4>Security Issue</h4>
<ul>
<li>[SECURITY-211] - URLs with javascript scheme should not be made clickable</li>
</ul>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-7845">PHPBB3-7845</a>] - Error on posting local image when script path is empty</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13214">PHPBB3-13214</a>] - Contact us page textarea looks narrow in responsive mode</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14629">PHPBB3-14629</a>] - acp global quick reply will not enable quick reply correctly</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14857">PHPBB3-14857</a>] - ordinal suffix in dateformat is not handled in translations</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15041">PHPBB3-15041</a>] - Cannot delete Orphaned Attachments when large number of attachments</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15060">PHPBB3-15060</a>] - Online user list fails on notifications</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15089">PHPBB3-15089</a>] - Enable/Disable settings backwards for Cookie Secure</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15133">PHPBB3-15133</a>] - Fast image size library sometimes returns no size or invalid sizes</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15149">PHPBB3-15149</a>] - Unexpected Ctrl+Enter behavior on reply</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15171">PHPBB3-15171</a>] - Confusing bitfield values</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15172">PHPBB3-15172</a>] - $request-&gt;server('server_port') is returning wrong port</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15174">PHPBB3-15174</a>] - Unable to purge cache (ext &amp; acp)</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15195">PHPBB3-15195</a>] - Code direction in print view is not defined as &quot;ltr&quot;</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15201">PHPBB3-15201</a>] - Removing style sets user_style to 0</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15224">PHPBB3-15224</a>] - Advanced search in &quot;message text only&quot; crashes with SQL error when using Mysql fulltext search index</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15245">PHPBB3-15245</a>] - Relative URLs in atom feeds broken when accessing via app.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15262">PHPBB3-15262</a>] - WebFontConfig google families script issue in 3.2.1</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15266">PHPBB3-15266</a>] - Content visibility events do not allow what they describe</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15273">PHPBB3-15273</a>] - 'COOKIE_PATH_EXPLAIN' does not make sense</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15285">PHPBB3-15285</a>] - Travis tests are failing due to trusty changes</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15292">PHPBB3-15292</a>] - Retina imageset is blurry when displayed in Chrome browser</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15297">PHPBB3-15297</a>] - Current date in board index is broken into lines in RTL</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15298">PHPBB3-15298</a>] - Errors being suppressed in cli</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15303">PHPBB3-15303</a>] - Typo in memcached driver</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15306">PHPBB3-15306</a>] - Error and missing information in core.acp_users_profile_validate event</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15309">PHPBB3-15309</a>] - Improved fix for pagination layout in tables</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15314">PHPBB3-15314</a>] - Wrong class constructor definition for convertor component</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15319">PHPBB3-15319</a>] - Database update v310\style_update_p2 fails to drop sequences</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15320">PHPBB3-15320</a>] - Redis cache does not save keys with expiration date 0 (no expiration)</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15322">PHPBB3-15322</a>] - Wrong return Return-Path in emails</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15331">PHPBB3-15331</a>] - Gravatars cannot be overridden</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15332">PHPBB3-15332</a>] - Dark background is always removed after confirm popup</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15333">PHPBB3-15333</a>] - Callback isn't called when confirm dialog is canceled</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15339">PHPBB3-15339</a>] - Missing acp_send_statistics -&gt; Upgrading to 3.2.0 fails for phpBB 3.0.5</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15346">PHPBB3-15346</a>] - The installer tries to enable all extensions even if they are not enableable</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15347">PHPBB3-15347</a>] - Password updater in cron generates invalid postgres SQL</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15349">PHPBB3-15349</a>] - Cli doesn't check if an extension is enableable before enable it</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15350">PHPBB3-15350</a>] - Links to Plural rules are outdated</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15351">PHPBB3-15351</a>] - Confirm box function does not work with symlink on server config</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15353">PHPBB3-15353</a>] - Invalid HTML in ACP board settings</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15355">PHPBB3-15355</a>] - Empty version field in versioncheck when using the latest version</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15356">PHPBB3-15356</a>] - Avatar remote upload doesn't work</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15361">PHPBB3-15361</a>] - Topic / Forum Icons Look Withered (on Safari)</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15362">PHPBB3-15362</a>] - Excessive value for {NOTIFICATION_TYPES_COLS}</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15365">PHPBB3-15365</a>] - Fix invalidating OPcache</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15367">PHPBB3-15367</a>] - Sphinx search backend doesn't escape special characters</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15368">PHPBB3-15368</a>] - Schema upgrade fails in 3.2.1 when using SQL Server</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15379">PHPBB3-15379</a>] - Reparser cron will always run</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15381">PHPBB3-15381</a>] - L_CONTACT_US_ENABLE_EXPLAIN should specify that &quot;Enable board-wide emails&quot; is also needed for it to work</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15390">PHPBB3-15390</a>] - Admin permissions role tooltip popup has vertical bar running through it.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15396">PHPBB3-15396</a>] - revert_schema() steps not executed in correct order</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15401">PHPBB3-15401</a>] - Use separate constant for memcached driver config</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15419">PHPBB3-15419</a>] - Sphinx does not search UTF keywords in delta index</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15423">PHPBB3-15423</a>] - Wrong title for topic's &quot;Unappproved posts&quot; icon</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15432">PHPBB3-15432</a>] - Don't remove dark background if fadedark is false</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15433">PHPBB3-15433</a>] - phpbbcli can enable non-existent extension</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15445">PHPBB3-15445</a>] - Git Contribution Guidelines in README.md is outdated</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15464">PHPBB3-15464</a>] - Can't reparse [IMG] - in uppercase</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15475">PHPBB3-15475</a>] - Restore Travis PR commit message validation</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15478">PHPBB3-15478</a>] - core.js $loadingIndicator JavaScript errors</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15489">PHPBB3-15489</a>] - Wrong footer text on forum of type &quot;category&quot;</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15496">PHPBB3-15496</a>] - SQL Error in PostgreSQL Fulltext search when results displayed as topics</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15497">PHPBB3-15497</a>] - Declaration of admin_activate_user::create_insert_array not compatible with base</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15498">PHPBB3-15498</a>] - confirm_box() adds duplicate strings to URLs in extensions</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-7488">PHPBB3-7488</a>] - View Only - Categories: No Message</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9819">PHPBB3-9819</a>] - Move functions definitions out of mcp.php and includes/mcp/mcp_*.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12291">PHPBB3-12291</a>] - Allow extensions to use custom topic icons</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12939">PHPBB3-12939</a>] - Drop support for IE &lt;11 on January 2016</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14677">PHPBB3-14677</a>] - Extension update check is not very colorblind / colourblind friendly.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14820">PHPBB3-14820</a>] - Style Version Missing</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14919">PHPBB3-14919</a>] - Inconsistent use of globals vs class elements in acp_extensions</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14927">PHPBB3-14927</a>] - event core.user_add_modify_data</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14944">PHPBB3-14944</a>] - Add possibility to search for template loop indexes by key</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14950">PHPBB3-14950</a>] - Add possibility to delete a template block with alter_block_array</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14979">PHPBB3-14979</a>] - Remove underline from unread icon</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14994">PHPBB3-14994</a>] - Refactor template-&gt;assign_block_var to be consistent with alter_block_array</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14995">PHPBB3-14995</a>] - Add ACP template events acp_ext_list_*_name_after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15111">PHPBB3-15111</a>] - Fix the typo in ucp_pm_view_messsage</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15134">PHPBB3-15134</a>] - Avatar upload driver should use filesystem service</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15247">PHPBB3-15247</a>] - Add driver for APCu v5.x cache</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15267">PHPBB3-15267</a>] - Hide birthday block if the user cannot view profile</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15291">PHPBB3-15291</a>] - Allow short array notation in event declarations</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15293">PHPBB3-15293</a>] - Prevent skipping file changes in automatic updater</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15307">PHPBB3-15307</a>] - Allow extensions to add custom modes to acp_users module</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15328">PHPBB3-15328</a>] - Disable email/jabber checkbox if notification method isn't supported</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15340">PHPBB3-15340</a>] - Update to plupload 2.3.1, stable for one year</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15352">PHPBB3-15352</a>] - Add text to clarify forum descriptions won't display on categories</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15374">PHPBB3-15374</a>] - Add core event to modify page title in viewforum.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15384">PHPBB3-15384</a>] - Add linebreaks to SMTP configuration option explanations</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15385">PHPBB3-15385</a>] - nginx sample config: www redirection, security regex</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15387">PHPBB3-15387</a>] - prosilver: vertical bars on forum rows on index page not full height</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15389">PHPBB3-15389</a>] - Simplify migration between event names</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15391">PHPBB3-15391</a>] - Remove not needed image rendering from topic/forum images</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15394">PHPBB3-15394</a>] - Add $user_cache and $post_edit_list to core.viewtopic_modify_post_row</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15408">PHPBB3-15408</a>] - Reject duplicate BBCodes in ACP</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15409">PHPBB3-15409</a>] - Add u_action to core.acp_users_overview_run_quicktool</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15442">PHPBB3-15442</a>] - Allow unsafe HTML in bbcode.html</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15444">PHPBB3-15444</a>] - Merge duplicate BBCodes via a migration</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15446">PHPBB3-15446</a>] - Add event core.acp_profile_action</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15447">PHPBB3-15447</a>] - Add event core.acp_profile_modify_profile_row</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15451">PHPBB3-15451</a>] - [EVENT] - mcp_topic_postrow_attachments_before/after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15452">PHPBB3-15452</a>] - [EVENT] - mcp_topic_postrow_post_before</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15453">PHPBB3-15453</a>] - Add event in acp_language after delete language</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15454">PHPBB3-15454</a>] - event - mcp_queue_approve_details_template</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15470">PHPBB3-15470</a>] - attachment boxes need there own font-size</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15471">PHPBB3-15471</a>] - Add core events to ACP when pruning a forum</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15476">PHPBB3-15476</a>] - Add core event before search rows are edited</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15485">PHPBB3-15485</a>] - Add template event to forumlist_body &gt; forum images</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15486">PHPBB3-15486</a>] - Add core event to the function user_add() to modify notifications data</li>
</ul>
<h4>New Feature</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13344">PHPBB3-13344</a>] - Add new events for logging</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15122">PHPBB3-15122</a>] - Support using memcached instead of memcache</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15372">PHPBB3-15372</a>] - Add a &quot;Can view topics&quot; permission</li>
</ul>
<h4>Sub-task</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13150">PHPBB3-13150</a>] - [Event] - core.phpbb_log_get_topic_auth_sql_after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15468">PHPBB3-15468</a>] - Add a service to merge duplicate BBCodes</li>
</ul>
<h4>Task</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15179">PHPBB3-15179</a>] - Update 3.2.x dependencies and fix Twig &gt; 1.25 compatibility</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15304">PHPBB3-15304</a>] - Update s9e/text-formatter dependency</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15455">PHPBB3-15455</a>] - Margin discrepancy due to &lt;!-- INCLUDE jumpbox.html --&gt;</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15457">PHPBB3-15457</a>] - Update s9e/text-formatter dependency</li>
</ul>
<a name="v320"></a><h3>Changes since 3.2.0</h3> <a name="v320"></a><h3>Changes since 3.2.0</h3>
<h4>Bug</h4> <h4>Bug</h4>
<ul> <ul>
@ -718,6 +1283,53 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14265">PHPBB3-14265</a>] - Make all tables available in the container</li> <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14265">PHPBB3-14265</a>] - Make all tables available in the container</li>
</ul> </ul>
<a name="v3111"></a><h3>Changes since 3.1.11</h3>
<h4>Security Issue</h4>
<ul>
<li>[SECURITY-211] - URLs with javascript scheme should not be made clickable</li>
</ul>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9533">PHPBB3-9533</a>] - phpbb_own_realpath() doesn't always replicate realpath() behaviour</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12835">PHPBB3-12835</a>] - Jump-box dropdown menu doesn't expand with according to line length in IE8</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13360">PHPBB3-13360</a>] - rename_too_long_indexes migration never deleted the old unique index</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13464">PHPBB3-13464</a>] - problem with drop down options and Arabic letters in chrome</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13574">PHPBB3-13574</a>] - Last post not showing in &quot;Active topics&quot; when Prosilver goes responsive</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15174">PHPBB3-15174</a>] - Unable to purge cache (ext &amp; acp)</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15285">PHPBB3-15285</a>] - Travis tests are failing due to trusty changes</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15303">PHPBB3-15303</a>] - Typo in memcached driver</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15347">PHPBB3-15347</a>] - Password updater in cron generates invalid postgres SQL</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15367">PHPBB3-15367</a>] - Sphinx search backend doesn't escape special characters</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10122">PHPBB3-10122</a>] - [list=] - should support &quot;none&quot;, along with CSS2 types</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11063">PHPBB3-11063</a>] - Change version check to SSL</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14820">PHPBB3-14820</a>] - Style Version Missing</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14919">PHPBB3-14919</a>] - Inconsistent use of globals vs class elements in acp_extensions</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14927">PHPBB3-14927</a>] - event core.user_add_modify_data</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14944">PHPBB3-14944</a>] - Add possibility to search for template loop indexes by key</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14995">PHPBB3-14995</a>] - Add ACP template events acp_ext_list_*_name_after</li>
</ul>
<h4>New Feature</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13344">PHPBB3-13344</a>] - Add new events for logging</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15122">PHPBB3-15122</a>] - Support using memcached instead of memcache</li>
</ul>
<h4>Sub-task</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11182">PHPBB3-11182</a>] - Ensure that template files use L_COLON instead of colons.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11676">PHPBB3-11676</a>] - generate_text_for_storage on includes/acp/acp_users.php</li>
</ul>
<h4>Task</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10758">PHPBB3-10758</a>] - Improve Functional Test Code Coverage</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10791">PHPBB3-10791</a>] - Add a section for extensions to readme.html</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10792">PHPBB3-10792</a>] - Add a section for 3.0 to 3.1 upgrades to install.html</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13874">PHPBB3-13874</a>] - Add master to sami API docs</li>
</ul>
<a name="v3110"></a><h3>Changes since 3.1.10</h3> <a name="v3110"></a><h3>Changes since 3.1.10</h3>
<h4>Bug</h4> <h4>Bug</h4>

View file

@ -20,15 +20,16 @@
phpBB Project Manager: Marshalrusty (Yuriy Rusko) phpBB Project Manager: Marshalrusty (Yuriy Rusko)
phpBB Product Manager: naderman (Nils Adermann)
phpBB Lead Developer: Marc (Marc Alexander) phpBB Lead Developer: Marc (Marc Alexander)
phpBB Developers: bantu (Andreas Fischer) phpBB Developers: bantu (Andreas Fischer)
CHItA (Máté Bartus) CHItA (Máté Bartus)
Derky (Derk Ruitenbeek)
Elsensee (Oliver Schramm) Elsensee (Oliver Schramm)
Hanakin (Michael Miday)
MichaelC (Michael Cullum)
Nicofuma (Tristan Darricau) Nicofuma (Tristan Darricau)
prototech (Cesar Gallegos) rubencm (Rubén Calvo)
For a list of phpBB Team members, please see: For a list of phpBB Team members, please see:
http://www.phpbb.com/about/team/ http://www.phpbb.com/about/team/
@ -41,7 +42,10 @@ https://github.com/phpbb/phpbb/graphs/contributors
phpBB Project Manager: theFinn (James Atkinson) [Founder - 04/2007] phpBB Project Manager: theFinn (James Atkinson) [Founder - 04/2007]
SHS` (Jonathan Stanley) SHS` (Jonathan Stanley)
phpBB Lead Developer: Acyd Burn (Meik Sievertsen) [09/2005 - 01/2010] phpBB Product Manager: naderman (Nils Adermann) [02/2016 - 02/2017]
phpBB Lead Developer: naderman (Nils Adermann) [01/2010 - 02/2016]
Acyd Burn (Meik Sievertsen) [09/2005 - 01/2010]
psoTFX (Paul S. Owen) [2001 - 09/2005] psoTFX (Paul S. Owen) [2001 - 09/2005]
phpBB Developers: A_Jelly_Doughnut (Josh Woody) [01/2010 - 11/2010] phpBB Developers: A_Jelly_Doughnut (Josh Woody) [01/2010 - 11/2010]
@ -61,6 +65,7 @@ phpBB Developers: A_Jelly_Doughnut (Josh Woody) [01/2010 - 11/2010]
kellanved (Henry Sudhof) [04/2007 - 03/2011] kellanved (Henry Sudhof) [04/2007 - 03/2011]
nickvergessen (Joas Schilling)[04/2010 - 12/2015] nickvergessen (Joas Schilling)[04/2010 - 12/2015]
Oleg (Oleg Pudeyev) [01/2011 - 05/2013] Oleg (Oleg Pudeyev) [01/2011 - 05/2013]
prototech (Cesar Gallegos) [01/2014 - 12/2016]
rxu (Ruslan Uzdenov) [04/2010 - 12/2012] rxu (Ruslan Uzdenov) [04/2010 - 12/2012]
TerraFrost (Jim Wigginton) [04/2009 - 01/2011] TerraFrost (Jim Wigginton) [04/2009 - 01/2011]
ToonArmy (Chris Smith) [06/2008 - 11/2011] ToonArmy (Chris Smith) [06/2008 - 11/2011]
@ -99,3 +104,6 @@ Text_Diff-0.2.1 http://pear.php.net/package/Text_Diff
MIT licenced: MIT licenced:
Symfony2 (c) 2004-2011 Fabien Potencier, https://symfony.com/ Symfony2 (c) 2004-2011 Fabien Potencier, https://symfony.com/
Cookie Consent (c) 2015 Silktide Ltd, https://cookieconsent.insites.com Cookie Consent (c) 2015 Silktide Ltd, https://cookieconsent.insites.com
Emoji by:
Twemoji (c) 2018 Twitter, Inc, https://twemoji.twitter.com/

View file

@ -44,7 +44,7 @@
<p> <p>
A basic overview of running phpBB can be found in the accompanying <a href="README.html">README</a> file. A basic overview of running phpBB can be found in the accompanying <a href="README.html">README</a> file.
Please ensure you read that document in addition to this! For more detailed information on using, installing, Please ensure you read that document in addition to this! For more detailed information on using, installing,
updating and converting phpBB you should read <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">the documentation</a> updating and converting phpBB you should read <a href="https://www.phpbb.com/support/docs/en/3.2/ug/">the documentation</a>
available online. available online.
</p> </p>
</div> </div>
@ -147,7 +147,7 @@
<li>Oracle</li> <li>Oracle</li>
</ul> </ul>
</li> </li>
<li><strong>PHP 5.4.0+</strong> with support for the database you intend to use.</li> <li><strong>PHP 5.4.7+</strong> but less than <strong>PHP 7.3</strong> with support for the database you intend to use.</li>
<li>The following PHP modules are required: <li>The following PHP modules are required:
<ul> <ul>
<li>json</li> <li>json</li>
@ -159,7 +159,6 @@
<li>zlib Compression support</li> <li>zlib Compression support</li>
<li>Remote FTP support</li> <li>Remote FTP support</li>
<li>XML support</li> <li>XML support</li>
<li>ImageMagick support</li>
<li>GD Support</li> <li>GD Support</li>
</ul> </ul>
</li> </li>
@ -269,11 +268,11 @@
<a name="update_full"></a><h3>4.i. Full package</h3> <a name="update_full"></a><h3>4.i. Full package</h3>
<p>The full package is normally meant for new installations only, but if you want to replace all source files, this package comes in handy.</p> <p>Updating using the full package is the recommended update method for boards without modifications to core phpBB files.</p>
<p>First, you should make a copy of your existing <code>config.php</code> file; keep it in a safe place! Next, delete all the existing phpBB files, you may want to leave your <code>files/</code>, <code>images/</code> and <code>ext/</code> directories in place, otherwise you will lose your file attachments, uploaded images and get error due to missing extension files. You can leave alternative styles in place too. With this complete, you can upload the new phpBB files (see <a href="#install">New installation</a> for details if necessary). Once complete, copy back your saved <code>config.php</code>, replacing the new one. Another method is to just <strong>replace</strong> the existing files with the files from the full package - though make sure you do <strong>not</strong> overwrite your config.php file.</p> <p>First, you should make a copy of your existing <code>config.php</code> file; keep it in a safe place! Next, delete all the existing phpBB files, you should leave your <code>files/</code>, <code>images/</code> and <code>ext/</code> directories in place, otherwise you will lose your file attachments, uploaded images and get errors due to missing extension files. You can leave alternative styles in place too. With this complete, you can upload the new phpBB files (see <a href="#install">New installation</a> for details if necessary). Once complete, copy back your saved <code>config.php</code>, replacing the new one. Another method is to just <strong>replace</strong> the existing files with the files from the full package - though make sure you do <strong>not</strong> overwrite your config.php file.</p>
<p>You should now got to <code>/install/app.php/update</code> which will display a warning: <strong>No valid update directory was found, please make sure you uploaded the relevant files</strong>. Beneath that warning you will see a radion button <em>Update database only</em>, just click <strong>Submit</strong>. Depending on your previous version this will make a number of database changes. You may receive <em>FAILURES</em> during this procedure. They should not be a cause for concern unless you see an actual <em>ERROR</em>, in which case the script will stop (in this case you should seek help via our forums or bug tracker). If you have shell access to your server, you may wish to update via the command line interface. From your board's root, execute the following command: <code>php bin/phpbbcli.php --safe-mode db:migrate</code>.</p> <p>You should now got to <code>/install/app.php/update</code> which will display a warning: <strong>No valid update directory was found, please make sure you uploaded the relevant files</strong>. Beneath that warning you will see a radio button <em>Update database only</em>, just click <strong>Submit</strong>. Depending on your previous version this will make a number of database changes. You may receive <em>FAILURES</em> during this procedure. They should not be a cause for concern unless you see an actual <em>ERROR</em>, in which case the script will stop (in this case you should seek help via our forums or bug tracker). If you have shell access to your server, you may wish to update via the command line interface. From your board's root, execute the following command: <code>php bin/phpbbcli.php --safe-mode db:migrate</code>.</p>
<p>Once <code>/install/app.php/update</code> has completed, it displays the success message: <strong>The database update was successful</strong>. You may proceed to the Administration Control Panel and then remove the install directory as advised.</p> <p>Once <code>/install/app.php/update</code> has completed, it displays the success message: <strong>The database update was successful</strong>. You may proceed to the Administration Control Panel and then remove the install directory as advised.</p>
@ -301,7 +300,7 @@
<a name="update_auto"></a><h3>4.iv. Automatic update package</h3> <a name="update_auto"></a><h3>4.iv. Automatic update package</h3>
<p>This update method is the recommended method for updating. This package detects changed files automatically and merges in changes if needed.</p> <p>This update method is only recommended for installations with modifications to core phpBB files. This package detects changed files automatically and merges in changes if needed.</p>
<p>The automatic update package will update the board from a given version to the latest version. A number of automatic update files are available, and you should choose the one that corresponds to the version of the board that you are currently running. For example, if your current version is <strong>3.2.0</strong>, you need the <code>phpBB-3.2.0_to_3.2.1.zip/tar.bz2</code> file.</p> <p>The automatic update package will update the board from a given version to the latest version. A number of automatic update files are available, and you should choose the one that corresponds to the version of the board that you are currently running. For example, if your current version is <strong>3.2.0</strong>, you need the <code>phpBB-3.2.0_to_3.2.1.zip/tar.bz2</code> file.</p>

View file

@ -323,11 +323,11 @@
<div class="content"> <div class="content">
<p>phpBB 3.2.x takes advantage of new features added in PHP 5.4. We recommend that you upgrade to the latest stable release of PHP to run phpBB. The minimum version required is PHP 5.4.0 and the maximum supported version is the latest stable version of PHP.</p> <p>phpBB 3.2.x takes advantage of new features added in PHP 5.4. We recommend that you upgrade to the latest stable release of PHP to run phpBB. The minimum version required is PHP 5.4.7 and the maximum supported version is the latest stable version of PHP.</p>
<p>Please remember that running any application on a development (unstable, e.g. a beta release) version of PHP can lead to strange/unexpected results which may appear to be bugs in the application. Therefore, we recommend you upgrade to the newest stable version of PHP before running phpBB. If you are running a development version of PHP please check any bugs you find on a system running a stable release before submitting.</p> <p>Please remember that running any application on a development (unstable, e.g. a beta release) version of PHP can lead to strange/unexpected results which may appear to be bugs in the application. Therefore, we recommend you upgrade to the newest stable version of PHP before running phpBB. If you are running a development version of PHP please check any bugs you find on a system running a stable release before submitting.</p>
<p>This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MariaDB 5.x, PostgreSQL 8.x, Oracle 8 and SQLite 3. Versions of PHP used range from 5.4.x above 5.6.x to 7.0.x without problem.</p> <p>This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MariaDB 5.x, PostgreSQL 8.x, Oracle 8 and SQLite 3. Versions of PHP used range from 5.4.7 above 5.6.x to 7.1.x and 7.2.x without problem.</p>
<a name="phpsec"></a><h3>7.i. Notice on PHP security issues</h3> <a name="phpsec"></a><h3>7.i. Notice on PHP security issues</h3>

View file

@ -627,7 +627,7 @@ $min = ($i &lt; $j) ? $i : $j;</pre>
<pre>if (isset($forum) &amp;&amp; $forum == 5)</pre> <pre>if (isset($forum) &amp;&amp; $forum == 5)</pre>
</div> </div>
<p>The <code>empty()</code> function is useful if you want to check if a variable is not set or being empty (an empty string, 0 as an integer or string, NULL, false, an empty array or a variable declared, but without a value in a class). Therefore empty should be used in favor of <code>isset($array) &amp;&amp; sizeof($array) &gt; 0</code> - this can be written in a shorter way as <code>!empty($array)</code>.</p> <p>The <code>empty()</code> function is useful if you want to check if a variable is not set or being empty (an empty string, 0 as an integer or string, NULL, false, an empty array or a variable declared, but without a value in a class). Therefore empty should be used in favor of <code>isset($array) &amp;&amp; count($array) &gt; 0</code> - this can be written in a shorter way as <code>!empty($array)</code>.</p>
<h4>Switch statements:</h4> <h4>Switch statements:</h4>
<p>Switch/case code blocks can get a bit long sometimes. To have some level of notice and being in-line with the opening/closing brace requirement (where they are on the same line for better readability), this also applies to switch/case code blocks and the breaks. An example:</p> <p>Switch/case code blocks can get a bit long sometimes. To have some level of notice and being in-line with the opening/closing brace requirement (where they are on the same line for better readability), this also applies to switch/case code blocks and the breaks. An example:</p>
@ -994,9 +994,9 @@ $sql = $db-&gt;sql_build_query('SELECT', $sql_array);</pre>
<h4>Operations in loop definition: </h4> <h4>Operations in loop definition: </h4>
<p>Always try to optimize your loops if operations are going on at the comparing part, since this part is executed every time the loop is parsed through. For assignments a descriptive name should be chosen. Example:</p> <p>Always try to optimize your loops if operations are going on at the comparing part, since this part is executed every time the loop is parsed through. For assignments a descriptive name should be chosen. Example:</p>
<p class="bad">// On every iteration the sizeof function is called</p> <p class="bad">// On every iteration the count function is called</p>
<div class="codebox"><pre> <div class="codebox"><pre>
for ($i = 0; $i &lt; sizeof($post_data); $i++) for ($i = 0; $i &lt; count($post_data); $i++)
{ {
do_something(); do_something();
}</pre> }</pre>
@ -1004,7 +1004,7 @@ for ($i = 0; $i &lt; sizeof($post_data); $i++)
<p class="good">// You are able to assign the (not changing) result within the loop itself</p> <p class="good">// You are able to assign the (not changing) result within the loop itself</p>
<div class="codebox"><pre> <div class="codebox"><pre>
for ($i = 0, $size = sizeof($post_data); $i &lt; $size; $i++) for ($i = 0, $size = count($post_data); $i &lt; $size; $i++)
{ {
do_something(); do_something();
}</pre> }</pre>

File diff suppressed because it is too large Load diff

View file

@ -18,11 +18,11 @@ http {
gzip_vary on; gzip_vary on;
gzip_http_version 1.1; gzip_http_version 1.1;
gzip_min_length 700; gzip_min_length 700;
# Compression levels over 6 do not give an appreciable improvement # Compression levels over 6 do not give an appreciable improvement
# in compression ratio, but take more resources. # in compression ratio, but take more resources.
gzip_comp_level 6; gzip_comp_level 6;
# IE 6 and lower do not support gzip with Vary correctly. # IE 6 and lower do not support gzip with Vary correctly.
gzip_disable "msie6"; gzip_disable "msie6";
# Before nginx 0.7.63: # Before nginx 0.7.63:
@ -49,9 +49,7 @@ http {
server_name myforums.com; server_name myforums.com;
# A trick from http://wiki.nginx.org/Pitfalls#Taxing_Rewrites: # A trick from http://wiki.nginx.org/Pitfalls#Taxing_Rewrites:
rewrite ^ http://www.myforums.com$request_uri permanent; return 301 http://www.myforums.com$request_uri;
# Equivalent to:
#rewrite ^(.*)$ http://www.myforums.com$1 permanent;
} }
# The actual board domain. # The actual board domain.
@ -72,7 +70,7 @@ http {
} }
# Deny access to internal phpbb files. # Deny access to internal phpbb files.
location ~ /(config\.php|common\.php|cache|files|images/avatars/upload|includes|phpbb|store|vendor) { location ~ /(config\.php|common\.php|cache|files|images/avatars/upload|includes|(?<!ext/)phpbb|store|vendor) {
deny all; deny all;
# deny was ignored before 0.8.40 for connections over IPv6. # deny was ignored before 0.8.40 for connections over IPv6.
# Use internal directive to prohibit access on older versions. # Use internal directive to prohibit access on older versions.

View file

@ -29,7 +29,6 @@ source source_phpbb_{SPHINX_ID}_main
AND p.post_id >= $start AND p.post_id <= $end AND p.post_id >= $start AND p.post_id <= $end
sql_query_post = sql_query_post =
sql_query_post_index = UPDATE phpbb_sphinx SET max_doc_id = $maxid WHERE counter_id = 1 sql_query_post_index = UPDATE phpbb_sphinx SET max_doc_id = $maxid WHERE counter_id = 1
sql_query_info = SELECT * FROM phpbb_posts WHERE post_id = $id
sql_attr_uint = forum_id sql_attr_uint = forum_id
sql_attr_uint = topic_id sql_attr_uint = topic_id
sql_attr_uint = poster_id sql_attr_uint = poster_id
@ -72,7 +71,6 @@ index index_phpbb_{SPHINX_ID}_main
morphology = none morphology = none
stopwords = stopwords =
min_word_len = 2 min_word_len = 2
charset_type = utf-8
charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6, U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101, U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109, U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F, U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, U+0116->U+0117, U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D, U+011D, U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, U+0134->U+0135, U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, U+013C, U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, U+0143->U+0144, U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, U+014B, U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, U+0152->U+0153, U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159, U+0159, U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, U+0160->U+0161, U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, U+0167, U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, U+016E->U+016F, U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175, U+0175, U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, U+017B->U+017C, U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, U+0430..U+044F, U+4E00..U+9FFF charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6, U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101, U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109, U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F, U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, U+0116->U+0117, U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D, U+011D, U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, U+0134->U+0135, U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, U+013C, U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, U+0143->U+0144, U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, U+014B, U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, U+0152->U+0153, U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159, U+0159, U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, U+0160->U+0161, U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, U+0167, U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, U+016E->U+016F, U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175, U+0175, U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, U+017B->U+017C, U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, U+0430..U+044F, U+4E00..U+9FFF
min_prefix_len = 0 min_prefix_len = 0
min_infix_len = 0 min_infix_len = 0
@ -88,13 +86,11 @@ indexer
} }
searchd searchd
{ {
compat_sphinxql_magics = 0
listen = localhost:9312 listen = localhost:9312
log = {DATA_PATH}/log/searchd.log log = {DATA_PATH}/log/searchd.log
query_log = {DATA_PATH}/log/sphinx-query.log query_log = {DATA_PATH}/log/sphinx-query.log
read_timeout = 5 read_timeout = 5
max_children = 30 max_children = 30
pid_file = {DATA_PATH}/searchd.pid pid_file = {DATA_PATH}/searchd.pid
max_matches = 20000
binlog_path = {DATA_PATH} binlog_path = {DATA_PATH}
} }

View file

@ -159,6 +159,8 @@ $user->session_begin(false);
$auth->acl($user->data); $auth->acl($user->data);
$user->setup('viewtopic'); $user->setup('viewtopic');
$phpbb_content_visibility = $phpbb_container->get('content.visibility');
if (!$config['allow_attachments'] && !$config['allow_pm_attach']) if (!$config['allow_attachments'] && !$config['allow_pm_attach'])
{ {
send_status_line(404, 'Not Found'); send_status_line(404, 'Not Found');
@ -225,7 +227,7 @@ else
$post_row = $db->sql_fetchrow($result); $post_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (!$post_row || ($post_row['post_visibility'] != ITEM_APPROVED && !$auth->acl_get('m_approve', $post_row['forum_id']))) if (!$post_row || !$phpbb_content_visibility->is_visible('post', $post_row['forum_id'], $post_row))
{ {
// Attachment of a soft deleted post and the user is not allowed to see the post // Attachment of a soft deleted post and the user is not allowed to see the post
send_status_line(404, 'Not Found'); send_status_line(404, 'Not Found');

View file

@ -27,6 +27,9 @@ class acp_attachments
/** @var \phpbb\config\config */ /** @var \phpbb\config\config */
protected $config; protected $config;
/** @var \phpbb\language\language */
protected $language;
/** @var ContainerBuilder */ /** @var ContainerBuilder */
protected $phpbb_container; protected $phpbb_container;
@ -54,6 +57,7 @@ class acp_attachments
$this->id = $id; $this->id = $id;
$this->db = $db; $this->db = $db;
$this->config = $config; $this->config = $config;
$this->language = $phpbb_container->get('language');
$this->template = $template; $this->template = $template;
$this->user = $user; $this->user = $user;
$this->phpbb_container = $phpbb_container; $this->phpbb_container = $phpbb_container;
@ -128,7 +132,7 @@ class acp_attachments
$s_assigned_groups = array(); $s_assigned_groups = array();
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$row['group_name'] = (isset($user->lang['EXT_GROUP_' . $row['group_name']])) ? $user->lang['EXT_GROUP_' . $row['group_name']] : $row['group_name']; $row['group_name'] = $this->language->is_set('EXT_GROUP_' . utf8_strtoupper($row['group_name'])) ? $this->language->lang('EXT_GROUP_' . utf8_strtoupper($row['group_name'])) : $row['group_name'];
$s_assigned_groups[$row['cat_id']][] = $row['group_name']; $s_assigned_groups[$row['cat_id']][] = $row['group_name'];
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
@ -164,7 +168,6 @@ class acp_attachments
'img_create_thumbnail' => array('lang' => 'CREATE_THUMBNAIL', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'img_create_thumbnail' => array('lang' => 'CREATE_THUMBNAIL', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'img_max_thumb_width' => array('lang' => 'MAX_THUMB_WIDTH', 'validate' => 'int:0:999999999999999', 'type' => 'number:0:999999999999999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']), 'img_max_thumb_width' => array('lang' => 'MAX_THUMB_WIDTH', 'validate' => 'int:0:999999999999999', 'type' => 'number:0:999999999999999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'img_min_thumb_filesize' => array('lang' => 'MIN_THUMB_FILESIZE', 'validate' => 'int:0:999999999999999', 'type' => 'number:0:999999999999999', 'explain' => true, 'append' => ' ' . $user->lang['BYTES']), 'img_min_thumb_filesize' => array('lang' => 'MIN_THUMB_FILESIZE', 'validate' => 'int:0:999999999999999', 'type' => 'number:0:999999999999999', 'explain' => true, 'append' => ' ' . $user->lang['BYTES']),
'img_imagick' => array('lang' => 'IMAGICK_PATH', 'validate' => 'absolute_path', 'type' => 'text:20:200', 'explain' => true, 'append' => '&nbsp;&nbsp;<span>[ <a href="' . $this->u_action . '&amp;action=imgmagick">' . $user->lang['SEARCH_IMAGICK'] . '</a> ]</span>'),
'img_max' => array('lang' => 'MAX_IMAGE_SIZE', 'validate' => 'int:0:9999', 'type' => 'dimension:0:9999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']), 'img_max' => array('lang' => 'MAX_IMAGE_SIZE', 'validate' => 'int:0:9999', 'type' => 'dimension:0:9999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'img_link' => array('lang' => 'IMAGE_LINK_SIZE', 'validate' => 'int:0:9999', 'type' => 'dimension:0:9999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']), 'img_link' => array('lang' => 'IMAGE_LINK_SIZE', 'validate' => 'int:0:9999', 'type' => 'dimension:0:9999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
) )
@ -190,7 +193,7 @@ class acp_attachments
validate_config_vars($display_vars['vars'], $cfg_array, $error); validate_config_vars($display_vars['vars'], $cfg_array, $error);
// Do not write values if there is an error // Do not write values if there is an error
if (sizeof($error)) if (count($error))
{ {
$submit = false; $submit = false;
} }
@ -226,7 +229,7 @@ class acp_attachments
// Check Settings // Check Settings
$this->test_upload($error, $this->new_config['upload_path'], false); $this->test_upload($error, $this->new_config['upload_path'], false);
if (!sizeof($error)) if (!count($error))
{ {
trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action)); trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
} }
@ -234,38 +237,6 @@ class acp_attachments
$template->assign_var('S_ATTACHMENT_SETTINGS', true); $template->assign_var('S_ATTACHMENT_SETTINGS', true);
if ($action == 'imgmagick')
{
$this->new_config['img_imagick'] = $this->search_imagemagick();
}
// We strip eventually manual added convert program, we only want the patch
if ($this->new_config['img_imagick'])
{
// Change path separator
$this->new_config['img_imagick'] = str_replace('\\', '/', $this->new_config['img_imagick']);
$this->new_config['img_imagick'] = str_replace(array('convert', '.exe'), array('', ''), $this->new_config['img_imagick']);
// Check for trailing slash
if (substr($this->new_config['img_imagick'], -1) !== '/')
{
$this->new_config['img_imagick'] .= '/';
}
}
$supported_types = get_supported_image_types();
// Check Thumbnail Support
if (!$this->new_config['img_imagick'] && (!isset($supported_types['format']) || !sizeof($supported_types['format'])))
{
$this->new_config['img_create_thumbnail'] = 0;
}
$template->assign_vars(array(
'U_SEARCH_IMAGICK' => $this->u_action . '&amp;action=imgmagick',
'S_THUMBNAIL_SUPPORT' => (!$this->new_config['img_imagick'] && (!isset($supported_types['format']) || !sizeof($supported_types['format']))) ? false : true)
);
// Secure Download Options - Same procedure as with banning // Secure Download Options - Same procedure as with banning
$allow_deny = ($this->new_config['secure_allow_deny']) ? 'ALLOWED' : 'DISALLOWED'; $allow_deny = ($this->new_config['secure_allow_deny']) ? 'ALLOWED' : 'DISALLOWED';
@ -290,7 +261,7 @@ class acp_attachments
$template->assign_vars(array( $template->assign_vars(array(
'S_SECURE_DOWNLOADS' => $this->new_config['secure_downloads'], 'S_SECURE_DOWNLOADS' => $this->new_config['secure_downloads'],
'S_DEFINED_IPS' => ($defined_ips != '') ? true : false, 'S_DEFINED_IPS' => ($defined_ips != '') ? true : false,
'S_WARNING' => (sizeof($error)) ? true : false, 'S_WARNING' => (count($error)) ? true : false,
'WARNING_MSG' => implode('<br />', $error), 'WARNING_MSG' => implode('<br />', $error),
'DEFINED_IPS' => $defined_ips, 'DEFINED_IPS' => $defined_ips,
@ -363,7 +334,7 @@ class acp_attachments
// Generate correct Change List // Generate correct Change List
$extensions = array(); $extensions = array();
for ($i = 0, $size = sizeof($extension_change_list); $i < $size; $i++) for ($i = 0, $size = count($extension_change_list); $i < $size; $i++)
{ {
$extensions[$extension_change_list[$i]]['group_id'] = $group_select_list[$i]; $extensions[$extension_change_list[$i]]['group_id'] = $group_select_list[$i];
} }
@ -390,7 +361,7 @@ class acp_attachments
// Delete Extension? // Delete Extension?
$extension_id_list = $request->variable('extension_id_list', array(0)); $extension_id_list = $request->variable('extension_id_list', array(0));
if (sizeof($extension_id_list)) if (count($extension_id_list))
{ {
$sql = 'SELECT extension $sql = 'SELECT extension
FROM ' . EXTENSIONS_TABLE . ' FROM ' . EXTENSIONS_TABLE . '
@ -420,7 +391,7 @@ class acp_attachments
if ($add_extension && $add) if ($add_extension && $add)
{ {
if (!sizeof($error)) if (!count($error))
{ {
$sql = 'SELECT extension_id $sql = 'SELECT extension_id
FROM ' . EXTENSIONS_TABLE . " FROM ' . EXTENSIONS_TABLE . "
@ -433,7 +404,7 @@ class acp_attachments
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (!sizeof($error)) if (!count($error))
{ {
$sql_ary = array( $sql_ary = array(
'group_id' => $add_extension_group, 'group_id' => $add_extension_group,
@ -447,7 +418,7 @@ class acp_attachments
} }
} }
if (!sizeof($error)) if (!count($error))
{ {
$notify[] = $user->lang['EXTENSIONS_UPDATED']; $notify[] = $user->lang['EXTENSIONS_UPDATED'];
} }
@ -558,7 +529,7 @@ class acp_attachments
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
if (!sizeof($error)) if (!count($error))
{ {
// Ok, build the update/insert array // Ok, build the update/insert array
$upload_icon = $request->variable('upload_icon', 'no_image'); $upload_icon = $request->variable('upload_icon', 'no_image');
@ -575,7 +546,7 @@ class acp_attachments
$max_filesize = 0; $max_filesize = 0;
} }
if (!sizeof($allowed_forums)) if (!count($allowed_forums))
{ {
$forum_select = false; $forum_select = false;
} }
@ -606,13 +577,13 @@ class acp_attachments
$group_id = $db->sql_nextid(); $group_id = $db->sql_nextid();
} }
$group_name = (isset($user->lang['EXT_GROUP_' . $group_name])) ? $user->lang['EXT_GROUP_' . $group_name] : $group_name; $group_name = $this->language->is_set('EXT_GROUP_' . utf8_strtoupper($group_name)) ? $this->language->lang('EXT_GROUP_' . utf8_strtoupper($group_name)) : $group_name;
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXTGROUP_' . strtoupper($action), false, array($group_name)); $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXTGROUP_' . strtoupper($action), false, array($group_name));
} }
$extension_list = $request->variable('extensions', array(0)); $extension_list = $request->variable('extensions', array(0));
if ($action == 'edit' && sizeof($extension_list)) if ($action == 'edit' && count($extension_list))
{ {
$sql = 'UPDATE ' . EXTENSIONS_TABLE . " $sql = 'UPDATE ' . EXTENSIONS_TABLE . "
SET group_id = 0 SET group_id = 0
@ -620,7 +591,7 @@ class acp_attachments
$db->sql_query($sql); $db->sql_query($sql);
} }
if (sizeof($extension_list)) if (count($extension_list))
{ {
$sql = 'UPDATE ' . EXTENSIONS_TABLE . " $sql = 'UPDATE ' . EXTENSIONS_TABLE . "
SET group_id = $group_id SET group_id = $group_id
@ -630,7 +601,7 @@ class acp_attachments
$cache->destroy('_extensions'); $cache->destroy('_extensions');
if (!sizeof($error)) if (!count($error))
{ {
$notify[] = $user->lang['SUCCESS_EXTENSION_GROUP_' . strtoupper($action)]; $notify[] = $user->lang['SUCCESS_EXTENSION_GROUP_' . strtoupper($action)];
} }
@ -806,7 +777,7 @@ class acp_attachments
'S_FILENAME_LIST' => $filename_list, 'S_FILENAME_LIST' => $filename_list,
'S_EDIT_GROUP' => true, 'S_EDIT_GROUP' => true,
'S_NO_IMAGE' => $no_image_select, 'S_NO_IMAGE' => $no_image_select,
'S_FORUM_IDS' => (sizeof($forum_ids)) ? true : false, 'S_FORUM_IDS' => (count($forum_ids)) ? true : false,
'U_EXTENSIONS' => append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&amp;mode=extensions"), 'U_EXTENSIONS' => append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&amp;mode=extensions"),
'U_BACK' => $this->u_action, 'U_BACK' => $this->u_action,
@ -908,7 +879,7 @@ class acp_attachments
'U_EDIT' => $this->u_action . "&amp;action=edit&amp;g={$row['group_id']}", 'U_EDIT' => $this->u_action . "&amp;action=edit&amp;g={$row['group_id']}",
'U_DELETE' => $this->u_action . "&amp;action=delete&amp;g={$row['group_id']}", 'U_DELETE' => $this->u_action . "&amp;action=delete&amp;g={$row['group_id']}",
'GROUP_NAME' => (isset($user->lang['EXT_GROUP_' . $row['group_name']])) ? $user->lang['EXT_GROUP_' . $row['group_name']] : $row['group_name'], 'GROUP_NAME' => $this->language->is_set('EXT_GROUP_' . utf8_strtoupper($row['group_name'])) ? $this->language->lang('EXT_GROUP_' . utf8_strtoupper($row['group_name'])) : $row['group_name'],
'CATEGORY' => $cat_lang[$row['cat_id']], 'CATEGORY' => $cat_lang[$row['cat_id']],
) )
); );
@ -922,13 +893,16 @@ class acp_attachments
case 'orphan': case 'orphan':
/* @var $pagination \phpbb\pagination */
$pagination = $this->phpbb_container->get('pagination');
if ($submit) if ($submit)
{ {
$delete_files = (isset($_POST['delete'])) ? array_keys($request->variable('delete', array('' => 0))) : array(); $delete_files = (isset($_POST['delete'])) ? array_keys($request->variable('delete', array('' => 0))) : array();
$add_files = (isset($_POST['add'])) ? array_keys($request->variable('add', array('' => 0))) : array(); $add_files = (isset($_POST['add'])) ? array_keys($request->variable('add', array('' => 0))) : array();
$post_ids = $request->variable('post_id', array('' => 0)); $post_ids = $request->variable('post_id', array('' => 0));
if (sizeof($delete_files)) if (count($delete_files))
{ {
$sql = 'SELECT * $sql = 'SELECT *
FROM ' . ATTACHMENTS_TABLE . ' FROM ' . ATTACHMENTS_TABLE . '
@ -951,7 +925,7 @@ class acp_attachments
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
if (sizeof($delete_files)) if (count($delete_files))
{ {
$sql = 'DELETE FROM ' . ATTACHMENTS_TABLE . ' $sql = 'DELETE FROM ' . ATTACHMENTS_TABLE . '
WHERE ' . $db->sql_in_set('attach_id', array_keys($delete_files)); WHERE ' . $db->sql_in_set('attach_id', array_keys($delete_files));
@ -971,7 +945,7 @@ class acp_attachments
} }
unset($add_files); unset($add_files);
if (sizeof($upload_list)) if (count($upload_list))
{ {
$template->assign_var('S_UPLOADING_FILES', true); $template->assign_var('S_UPLOADING_FILES', true);
@ -1064,13 +1038,29 @@ class acp_attachments
'S_ORPHAN' => true) 'S_ORPHAN' => true)
); );
$attachments_per_page = (int) $config['topics_per_page'];
// Get total number or orphans older than 3 hours
$sql = 'SELECT COUNT(attach_id) as num_files, SUM(filesize) as total_size
FROM ' . ATTACHMENTS_TABLE . '
WHERE is_orphan = 1
AND filetime < ' . (time() - 3*60*60);
$result = $this->db->sql_query($sql);
$row = $this->db->sql_fetchrow($result);
$num_files = (int) $row['num_files'];
$total_size = (int) $row['total_size'];
$this->db->sql_freeresult($result);
$start = $request->variable('start', 0);
$start = $pagination->validate_start($start, $attachments_per_page, $num_files);
// Just get the files with is_orphan set and older than 3 hours // Just get the files with is_orphan set and older than 3 hours
$sql = 'SELECT * $sql = 'SELECT *
FROM ' . ATTACHMENTS_TABLE . ' FROM ' . ATTACHMENTS_TABLE . '
WHERE is_orphan = 1 WHERE is_orphan = 1
AND filetime < ' . (time() - 3*60*60) . ' AND filetime < ' . (time() - 3*60*60) . '
ORDER BY filetime DESC'; ORDER BY filetime DESC';
$result = $db->sql_query($sql); $result = $db->sql_query_limit($sql, $attachments_per_page, $start);
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
@ -1086,6 +1076,20 @@ class acp_attachments
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$pagination->generate_template_pagination(
$this->u_action,
'pagination',
'start',
$num_files,
$attachments_per_page,
$start
);
$template->assign_vars(array(
'TOTAL_FILES' => $num_files,
'TOTAL_SIZE' => get_formatted_filesize($total_size),
));
break; break;
case 'manage': case 'manage':
@ -1094,7 +1098,7 @@ class acp_attachments
{ {
$delete_files = (isset($_POST['delete'])) ? array_keys($request->variable('delete', array('' => 0))) : array(); $delete_files = (isset($_POST['delete'])) ? array_keys($request->variable('delete', array('' => 0))) : array();
if (sizeof($delete_files)) if (count($delete_files))
{ {
// Select those attachments we want to delete... // Select those attachments we want to delete...
$sql = 'SELECT real_filename $sql = 'SELECT real_filename
@ -1110,7 +1114,7 @@ class acp_attachments
if ($num_deleted = $this->attachment_manager->delete('attach', $delete_files)) if ($num_deleted = $this->attachment_manager->delete('attach', $delete_files))
{ {
if (sizeof($delete_files) != $num_deleted) if (count($delete_files) != $num_deleted)
{ {
$error[] = $user->lang['FILES_GONE']; $error[] = $user->lang['FILES_GONE'];
} }
@ -1231,28 +1235,24 @@ class acp_attachments
// Grab extensions // Grab extensions
$extensions = $cache->obtain_attach_extensions(true); $extensions = $cache->obtain_attach_extensions(true);
for ($i = 0, $end = sizeof($attachments_list); $i < $end; ++$i) for ($i = 0, $end = count($attachments_list); $i < $end; ++$i)
{ {
$row = $attachments_list[$i]; $row = $attachments_list[$i];
$row['extension'] = strtolower(trim((string) $row['extension'])); $row['extension'] = strtolower(trim((string) $row['extension']));
$comment = ($row['attach_comment'] && !$row['in_message']) ? str_replace(array("\n", "\r"), array('<br />', "\n"), $row['attach_comment']) : ''; $comment = ($row['attach_comment'] && !$row['in_message']) ? str_replace(array("\n", "\r"), array('<br />', "\n"), $row['attach_comment']) : '';
$display_cat = $extensions[$row['extension']]['display_cat']; $display_cat = isset($extensions[$row['extension']]['display_cat']) ? $extensions[$row['extension']]['display_cat'] : ATTACHMENT_CATEGORY_NONE;
$l_downloaded_viewed = ($display_cat == ATTACHMENT_CATEGORY_NONE) ? 'DOWNLOAD_COUNTS' : 'VIEWED_COUNTS'; $l_downloaded_viewed = ($display_cat == ATTACHMENT_CATEGORY_NONE) ? 'DOWNLOAD_COUNTS' : 'VIEWED_COUNTS';
$template->assign_block_vars('attachments', array( $template->assign_block_vars('attachments', array(
'ATTACHMENT_POSTER' => get_username_string('full', (int) $row['poster_id'], (string) $row['username'], (string) $row['user_colour'], (string) $row['username']), 'ATTACHMENT_POSTER' => get_username_string('full', (int) $row['poster_id'], (string) $row['username'], (string) $row['user_colour'], (string) $row['username']),
'FILESIZE' => get_formatted_filesize((int) $row['filesize']), 'FILESIZE' => get_formatted_filesize((int) $row['filesize']),
'FILETIME' => $user->format_date((int) $row['filetime']), 'FILETIME' => $user->format_date((int) $row['filetime']),
'REAL_FILENAME' => (!$row['in_message']) ? utf8_basename((string) $row['real_filename']) : '', 'REAL_FILENAME' => utf8_basename((string) $row['real_filename']),
'PHYSICAL_FILENAME' => utf8_basename((string) $row['physical_filename']), 'EXT_GROUP_NAME' => $this->language->is_set('EXT_GROUP_' . utf8_strtoupper($extensions[$row['extension']]['group_name'])) ? $this->language->lang('EXT_GROUP_' . utf8_strtoupper($extensions[$row['extension']]['group_name'])) : $extensions[$row['extension']]['group_name'],
'EXT_GROUP_NAME' => (!empty($extensions[$row['extension']]['group_name'])) ? $user->lang['EXT_GROUP_' . $extensions[$row['extension']]['group_name']] : '',
'COMMENT' => $comment, 'COMMENT' => $comment,
'TOPIC_TITLE' => (!$row['in_message']) ? (string) $row['topic_title'] : '', 'TOPIC_TITLE' => (!$row['in_message']) ? (string) $row['topic_title'] : '',
'ATTACH_ID' => (int) $row['attach_id'], 'ATTACH_ID' => (int) $row['attach_id'],
'POST_ID' => (int) $row['post_msg_id'],
'TOPIC_ID' => (int) $row['topic_id'],
'POST_IDS' => (!empty($post_ids[$row['attach_id']])) ? (int) $post_ids[$row['attach_id']] : '',
'L_DOWNLOAD_COUNT' => $user->lang($l_downloaded_viewed, (int) $row['download_count']), 'L_DOWNLOAD_COUNT' => $user->lang($l_downloaded_viewed, (int) $row['download_count']),
@ -1266,7 +1266,7 @@ class acp_attachments
break; break;
} }
if (sizeof($error)) if (count($error))
{ {
$template->assign_vars(array( $template->assign_vars(array(
'S_WARNING' => true, 'S_WARNING' => true,
@ -1274,7 +1274,7 @@ class acp_attachments
); );
} }
if (sizeof($notify)) if (count($notify))
{ {
$template->assign_vars(array( $template->assign_vars(array(
'S_NOTIFY' => true, 'S_NOTIFY' => true,
@ -1434,7 +1434,7 @@ class acp_attachments
$group_name = array(); $group_name = array();
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$row['group_name'] = (isset($user->lang['EXT_GROUP_' . $row['group_name']])) ? $user->lang['EXT_GROUP_' . $row['group_name']] : $row['group_name']; $row['group_name'] = $this->language->is_set('EXT_GROUP_' . utf8_strtoupper($row['group_name'])) ? $this->language->lang('EXT_GROUP_' . utf8_strtoupper($row['group_name'])) : $row['group_name'];
$group_name[] = $row; $group_name[] = $row;
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
@ -1443,7 +1443,7 @@ class acp_attachments
$row['group_name'] = $user->lang['NOT_ASSIGNED']; $row['group_name'] = $user->lang['NOT_ASSIGNED'];
$group_name[] = $row; $group_name[] = $row;
for ($i = 0, $groups_size = sizeof($group_name); $i < $groups_size; $i++) for ($i = 0, $groups_size = count($group_name); $i < $groups_size; $i++)
{ {
if ($default_group === false) if ($default_group === false)
{ {
@ -1462,47 +1462,6 @@ class acp_attachments
return $group_select; return $group_select;
} }
/**
* Search Imagick
*/
function search_imagemagick()
{
$imagick = '';
$exe = ((defined('PHP_OS')) && (preg_match('#^win#i', PHP_OS))) ? '.exe' : '';
$magic_home = getenv('MAGICK_HOME');
if (empty($magic_home))
{
$locations = array('C:/WINDOWS/', 'C:/WINNT/', 'C:/WINDOWS/SYSTEM/', 'C:/WINNT/SYSTEM/', 'C:/WINDOWS/SYSTEM32/', 'C:/WINNT/SYSTEM32/', '/usr/bin/', '/usr/sbin/', '/usr/local/bin/', '/usr/local/sbin/', '/opt/', '/usr/imagemagick/', '/usr/bin/imagemagick/');
$path_locations = str_replace('\\', '/', (explode(($exe) ? ';' : ':', getenv('PATH'))));
$locations = array_merge($path_locations, $locations);
foreach ($locations as $location)
{
// The path might not end properly, fudge it
if (substr($location, -1) !== '/')
{
$location .= '/';
}
if (@file_exists($location) && @is_readable($location . 'mogrify' . $exe) && @filesize($location . 'mogrify' . $exe) > 3000)
{
$imagick = str_replace('\\', '/', $location);
continue;
}
}
}
else
{
$imagick = str_replace('\\', '/', $magic_home);
}
return $imagick;
}
/** /**
* Test Settings * Test Settings
*/ */
@ -1676,7 +1635,7 @@ class acp_attachments
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($iplist)) if (count($iplist))
{ {
foreach ($iplist as $ip_entry) foreach ($iplist as $ip_entry)
{ {
@ -1686,7 +1645,7 @@ class acp_attachments
} }
} }
if (sizeof($hostlist)) if (count($hostlist))
{ {
foreach ($hostlist as $host_entry) foreach ($hostlist as $host_entry)
{ {
@ -1709,7 +1668,7 @@ class acp_attachments
{ {
$unip_sql = $request->variable('unip', array(0)); $unip_sql = $request->variable('unip', array(0));
if (sizeof($unip_sql)) if (count($unip_sql))
{ {
$l_unip_list = ''; $l_unip_list = '';

View file

@ -253,7 +253,7 @@ class acp_bbcodes
if ($row) if ($row)
{ {
$bbcode_id = $row['max_bbcode_id'] + 1; $bbcode_id = (int) $row['max_bbcode_id'] + 1;
// Make sure it is greater than the core bbcode ids... // Make sure it is greater than the core bbcode ids...
if ($bbcode_id <= NUM_CORE_BBCODES) if ($bbcode_id <= NUM_CORE_BBCODES)
@ -295,6 +295,22 @@ class acp_bbcodes
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log_action, false, array($data['bbcode_tag'])); $phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log_action, false, array($data['bbcode_tag']));
/**
* Event after a BBCode has been added or updated
*
* @event core.acp_bbcodes_modify_create_after
* @var string action Type of the action: modify|create
* @var int bbcode_id The id of the added or updated bbcode
* @var array sql_ary Array with bbcode data (read only)
* @since 3.2.4-RC1
*/
$vars = array(
'action',
'bbcode_id',
'sql_ary',
);
extract($phpbb_dispatcher->trigger_event('core.acp_bbcodes_modify_create_after', compact($vars)));
trigger_error($user->lang[$lang] . adm_back_link($this->u_action)); trigger_error($user->lang[$lang] . adm_back_link($this->u_action));
} }
else else
@ -325,10 +341,28 @@ class acp_bbcodes
{ {
if (confirm_box(true)) if (confirm_box(true))
{ {
$bbcode_tag = $row['bbcode_tag'];
$db->sql_query('DELETE FROM ' . BBCODES_TABLE . " WHERE bbcode_id = $bbcode_id"); $db->sql_query('DELETE FROM ' . BBCODES_TABLE . " WHERE bbcode_id = $bbcode_id");
$cache->destroy('sql', BBCODES_TABLE); $cache->destroy('sql', BBCODES_TABLE);
$phpbb_container->get('text_formatter.cache')->invalidate(); $phpbb_container->get('text_formatter.cache')->invalidate();
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_BBCODE_DELETE', false, array($row['bbcode_tag'])); $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_BBCODE_DELETE', false, array($bbcode_tag));
/**
* Event after a BBCode has been deleted
*
* @event core.acp_bbcodes_delete_after
* @var string action Type of the action: delete
* @var int bbcode_id The id of the deleted bbcode
* @var string bbcode_tag The tag of the deleted bbcode
* @since 3.2.4-RC1
*/
$vars = array(
'action',
'bbcode_id',
'bbcode_tag',
);
extract($phpbb_dispatcher->trigger_event('core.acp_bbcodes_delete_after', compact($vars)));
if ($request->is_ajax()) if ($request->is_ajax())
{ {
@ -494,7 +528,7 @@ class acp_bbcodes
// Pad backreference numbers from tokens // Pad backreference numbers from tokens
if (preg_match_all('/(?<!\\\\)\$([0-9]+)/', $replace, $repad)) if (preg_match_all('/(?<!\\\\)\$([0-9]+)/', $replace, $repad))
{ {
$repad = $pad + sizeof(array_unique($repad[0])); $repad = $pad + count(array_unique($repad[0]));
$replace = preg_replace_callback('/(?<!\\\\)\$([0-9]+)/', function ($match) use ($pad) { $replace = preg_replace_callback('/(?<!\\\\)\$([0-9]+)/', function ($match) use ($pad) {
return '${' . ($match[1] + $pad) . '}'; return '${' . ($match[1] + $pad) . '}';
}, $replace); }, $replace);
@ -553,10 +587,10 @@ class acp_bbcodes
} }
// Lowercase tags // Lowercase tags
$bbcode_tag = preg_replace('/.*?\[([a-z0-9_-]+=?).*/i', '$1', $bbcode_match); $bbcode_tag = preg_replace('/.*?\[([a-z0-9_-]+).*/i', '$1', $bbcode_match);
$bbcode_search = preg_replace('/.*?\[([a-z0-9_-]+)=?.*/i', '$1', $bbcode_match); $bbcode_search = preg_replace('/.*?\[([a-z0-9_-]+).*/i', '$1', $bbcode_match);
if (!preg_match('/^[a-zA-Z0-9_-]+=?$/', $bbcode_tag)) if (!preg_match('/^[a-zA-Z0-9_-]+$/', $bbcode_tag))
{ {
global $user; global $user;
trigger_error($user->lang['BBCODE_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['BBCODE_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);

View file

@ -30,10 +30,13 @@ class acp_board
function main($id, $mode) function main($id, $mode)
{ {
global $user, $template, $request; global $user, $template, $request, $language;
global $config, $phpbb_root_path, $phpEx; global $config, $phpbb_root_path, $phpEx;
global $cache, $phpbb_container, $phpbb_dispatcher, $phpbb_log; global $cache, $phpbb_container, $phpbb_dispatcher, $phpbb_log;
/** @var \phpbb\language\language $language Language object */
$language = $phpbb_container->get('language');
$user->add_lang('acp/board'); $user->add_lang('acp/board');
$submit = (isset($_POST['submit']) || isset($_POST['allow_quick_reply_enable'])) ? true : false; $submit = (isset($_POST['submit']) || isset($_POST['allow_quick_reply_enable'])) ? true : false;
@ -56,7 +59,7 @@ class acp_board
'legend1' => 'ACP_BOARD_SETTINGS', 'legend1' => 'ACP_BOARD_SETTINGS',
'sitename' => array('lang' => 'SITE_NAME', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => false), 'sitename' => array('lang' => 'SITE_NAME', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => false),
'site_desc' => array('lang' => 'SITE_DESC', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => false), 'site_desc' => array('lang' => 'SITE_DESC', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => false),
'site_home_url' => array('lang' => 'SITE_HOME_URL', 'validate' => 'string', 'type' => 'url:40:255', 'explain' => true), 'site_home_url' => array('lang' => 'SITE_HOME_URL', 'validate' => 'url', 'type' => 'url:40:255', 'explain' => true),
'site_home_text' => array('lang' => 'SITE_HOME_TEXT', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => true), 'site_home_text' => array('lang' => 'SITE_HOME_TEXT', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => true),
'board_index_text' => array('lang' => 'BOARD_INDEX_TEXT', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => true), 'board_index_text' => array('lang' => 'BOARD_INDEX_TEXT', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => true),
'board_disable' => array('lang' => 'DISABLE_BOARD', 'validate' => 'bool', 'type' => 'custom', 'method' => 'board_disable', 'explain' => true), 'board_disable' => array('lang' => 'DISABLE_BOARD', 'validate' => 'bool', 'type' => 'custom', 'method' => 'board_disable', 'explain' => true),
@ -122,6 +125,7 @@ class acp_board
$avatar_vars = array(); $avatar_vars = array();
foreach ($avatar_drivers as $current_driver) foreach ($avatar_drivers as $current_driver)
{ {
/** @var \phpbb\avatar\driver\driver_interface $driver */
$driver = $phpbb_avatar_manager->get_driver($current_driver, false); $driver = $phpbb_avatar_manager->get_driver($current_driver, false);
/* /*
@ -356,6 +360,7 @@ class acp_board
'load_user_activity_limit' => array('lang' => 'LOAD_USER_ACTIVITY_LIMIT', 'validate' => 'int:0:99999999', 'type' => 'number:0:99999999', 'explain' => true), 'load_user_activity_limit' => array('lang' => 'LOAD_USER_ACTIVITY_LIMIT', 'validate' => 'int:0:99999999', 'type' => 'number:0:99999999', 'explain' => true),
'load_tplcompile' => array('lang' => 'RECOMPILE_STYLES', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'load_tplcompile' => array('lang' => 'RECOMPILE_STYLES', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'allow_cdn' => array('lang' => 'ALLOW_CDN', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'allow_cdn' => array('lang' => 'ALLOW_CDN', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'enable_accurate_pm_button' => array('lang' => 'YES_ACCURATE_PM_BUTTON', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'allow_live_searches' => array('lang' => 'ALLOW_LIVE_SEARCHES', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'allow_live_searches' => array('lang' => 'ALLOW_LIVE_SEARCHES', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'legend3' => 'CUSTOM_PROFILE_FIELDS', 'legend3' => 'CUSTOM_PROFILE_FIELDS',
@ -444,11 +449,12 @@ class acp_board
'legend1' => 'GENERAL_SETTINGS', 'legend1' => 'GENERAL_SETTINGS',
'email_enable' => array('lang' => 'ENABLE_EMAIL', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true), 'email_enable' => array('lang' => 'ENABLE_EMAIL', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true),
'board_email_form' => array('lang' => 'BOARD_EMAIL_FORM', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true), 'board_email_form' => array('lang' => 'BOARD_EMAIL_FORM', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true),
'email_function_name' => array('lang' => 'EMAIL_FUNCTION_NAME', 'validate' => 'string', 'type' => 'text:20:50', 'explain' => true),
'email_package_size' => array('lang' => 'EMAIL_PACKAGE_SIZE', 'validate' => 'int:0', 'type' => 'number:0:99999', 'explain' => true), 'email_package_size' => array('lang' => 'EMAIL_PACKAGE_SIZE', 'validate' => 'int:0', 'type' => 'number:0:99999', 'explain' => true),
'email_max_chunk_size' => array('lang' => 'EMAIL_MAX_CHUNK_SIZE', 'validate' => 'int:1:99999', 'type' => 'number:1:99999', 'explain' => true),
'board_contact' => array('lang' => 'CONTACT_EMAIL', 'validate' => 'email', 'type' => 'email:25:100', 'explain' => true), 'board_contact' => array('lang' => 'CONTACT_EMAIL', 'validate' => 'email', 'type' => 'email:25:100', 'explain' => true),
'board_contact_name' => array('lang' => 'CONTACT_EMAIL_NAME', 'validate' => 'string', 'type' => 'text:25:50', 'explain' => true), 'board_contact_name' => array('lang' => 'CONTACT_EMAIL_NAME', 'validate' => 'string', 'type' => 'text:25:50', 'explain' => true),
'board_email' => array('lang' => 'ADMIN_EMAIL', 'validate' => 'email', 'type' => 'email:25:100', 'explain' => true), 'board_email' => array('lang' => 'ADMIN_EMAIL', 'validate' => 'email', 'type' => 'email:25:100', 'explain' => true),
'email_force_sender' => array('lang' => 'EMAIL_FORCE_SENDER', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'board_email_sig' => array('lang' => 'EMAIL_SIG', 'validate' => 'string', 'type' => 'textarea:5:30', 'explain' => true), 'board_email_sig' => array('lang' => 'EMAIL_SIG', 'validate' => 'string', 'type' => 'textarea:5:30', 'explain' => true),
'board_hide_emails' => array('lang' => 'BOARD_HIDE_EMAILS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'board_hide_emails' => array('lang' => 'BOARD_HIDE_EMAILS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'send_test_email' => array('lang' => 'SEND_TEST_EMAIL', 'validate' => 'bool', 'type' => 'custom', 'method' => 'send_test_email', 'explain' => true), 'send_test_email' => array('lang' => 'SEND_TEST_EMAIL', 'validate' => 'bool', 'type' => 'custom', 'method' => 'send_test_email', 'explain' => true),
@ -503,7 +509,7 @@ class acp_board
$error[] = $user->lang['FORM_INVALID']; $error[] = $user->lang['FORM_INVALID'];
} }
// Do not write values if there is an error // Do not write values if there is an error
if (sizeof($error)) if (count($error))
{ {
$submit = false; $submit = false;
} }
@ -532,13 +538,6 @@ class acp_board
$this->new_config[$config_name] = $config_value = $cfg_array[$config_name]; $this->new_config[$config_name] = $config_value = $cfg_array[$config_name];
if ($config_name == 'email_function_name')
{
$this->new_config['email_function_name'] = trim(str_replace(array('(', ')'), array('', ''), $this->new_config['email_function_name']));
$this->new_config['email_function_name'] = (empty($this->new_config['email_function_name']) || !function_exists($this->new_config['email_function_name'])) ? 'mail' : $this->new_config['email_function_name'];
$config_value = $this->new_config['email_function_name'];
}
if ($submit) if ($submit)
{ {
if (strpos($data['type'], 'password') === 0 && $config_value === '********') if (strpos($data['type'], 'password') === 0 && $config_value === '********')
@ -690,7 +689,7 @@ class acp_board
'L_TITLE' => $user->lang[$display_vars['title']], 'L_TITLE' => $user->lang[$display_vars['title']],
'L_TITLE_EXPLAIN' => $user->lang[$display_vars['title'] . '_EXPLAIN'], 'L_TITLE_EXPLAIN' => $user->lang[$display_vars['title'] . '_EXPLAIN'],
'S_ERROR' => (sizeof($error)) ? true : false, 'S_ERROR' => (count($error)) ? true : false,
'ERROR_MSG' => implode('<br />', $error), 'ERROR_MSG' => implode('<br />', $error),
'U_ACTION' => $this->u_action) 'U_ACTION' => $this->u_action)
@ -736,7 +735,7 @@ class acp_board
$template->assign_block_vars('options', array( $template->assign_block_vars('options', array(
'KEY' => $config_key, 'KEY' => $config_key,
'TITLE' => (isset($user->lang[$vars['lang']])) ? $user->lang[$vars['lang']] : $vars['lang'], 'TITLE' => (isset($user->lang[$vars['lang']])) ? $user->lang[$vars['lang']] : $vars['lang'],
'S_EXPLAIN' => $vars['explain'], 'S_EXPLAIN' => $vars['explain'] && !empty($l_explain),
'TITLE_EXPLAIN' => $l_explain, 'TITLE_EXPLAIN' => $l_explain,
'CONTENT' => $content, 'CONTENT' => $content,
) )
@ -1110,7 +1109,7 @@ class acp_board
$db->sql_query($sql); $db->sql_query($sql);
// Already emptied for all... // Already emptied for all...
if (sizeof($values)) if (count($values))
{ {
// Set for selected forums // Set for selected forums
$sql = 'UPDATE ' . FORUMS_TABLE . ' $sql = 'UPDATE ' . FORUMS_TABLE . '

View file

@ -55,7 +55,7 @@ class acp_bots
switch ($action) switch ($action)
{ {
case 'activate': case 'activate':
if ($bot_id || sizeof($mark)) if ($bot_id || count($mark))
{ {
$sql_id = ($bot_id) ? " = $bot_id" : ' IN (' . implode(', ', $mark) . ')'; $sql_id = ($bot_id) ? " = $bot_id" : ' IN (' . implode(', ', $mark) . ')';
@ -69,7 +69,7 @@ class acp_bots
break; break;
case 'deactivate': case 'deactivate':
if ($bot_id || sizeof($mark)) if ($bot_id || count($mark))
{ {
$sql_id = ($bot_id) ? " = $bot_id" : ' IN (' . implode(', ', $mark) . ')'; $sql_id = ($bot_id) ? " = $bot_id" : ' IN (' . implode(', ', $mark) . ')';
@ -83,7 +83,7 @@ class acp_bots
break; break;
case 'delete': case 'delete':
if ($bot_id || sizeof($mark)) if ($bot_id || count($mark))
{ {
if (confirm_box(true)) if (confirm_box(true))
{ {
@ -109,7 +109,7 @@ class acp_bots
WHERE bot_id $sql_id"; WHERE bot_id $sql_id";
$db->sql_query($sql); $db->sql_query($sql);
if (sizeof($user_id_ary)) if (count($user_id_ary))
{ {
$_tables = array(USERS_TABLE, USER_GROUP_TABLE); $_tables = array(USERS_TABLE, USER_GROUP_TABLE);
foreach ($_tables as $table) foreach ($_tables as $table)
@ -207,7 +207,7 @@ class acp_bots
$error[] = $user->lang['BOT_NAME_TAKEN']; $error[] = $user->lang['BOT_NAME_TAKEN'];
} }
if (!sizeof($error)) if (!count($error))
{ {
// New bot? Create a new user and group entry // New bot? Create a new user and group entry
if ($action == 'add') if ($action == 'add')
@ -338,7 +338,7 @@ class acp_bots
'L_TITLE' => $user->lang['BOT_' . $l_title], 'L_TITLE' => $user->lang['BOT_' . $l_title],
'U_ACTION' => $this->u_action . "&amp;id=$bot_id&amp;action=$action", 'U_ACTION' => $this->u_action . "&amp;id=$bot_id&amp;action=$action",
'U_BACK' => $this->u_action, 'U_BACK' => $this->u_action,
'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '', 'ERROR_MSG' => (count($error)) ? implode('<br />', $error) : '',
'BOT_NAME' => $bot_row['bot_name'], 'BOT_NAME' => $bot_row['bot_name'],
'BOT_IP' => $bot_row['bot_ip'], 'BOT_IP' => $bot_row['bot_ip'],
@ -348,7 +348,7 @@ class acp_bots
'S_ACTIVE_OPTIONS' => $s_active_options, 'S_ACTIVE_OPTIONS' => $s_active_options,
'S_STYLE_OPTIONS' => $style_select, 'S_STYLE_OPTIONS' => $style_select,
'S_LANG_OPTIONS' => $lang_select, 'S_LANG_OPTIONS' => $lang_select,
'S_ERROR' => (sizeof($error)) ? true : false, 'S_ERROR' => (count($error)) ? true : false,
) )
); );

View file

@ -23,6 +23,7 @@ class acp_database
{ {
var $db_tools; var $db_tools;
var $u_action; var $u_action;
public $page_title;
function main($id, $mode) function main($id, $mode)
{ {
@ -57,9 +58,8 @@ class acp_database
$type = $request->variable('type', ''); $type = $request->variable('type', '');
$table = array_intersect($this->db_tools->sql_list_tables(), $request->variable('table', array(''))); $table = array_intersect($this->db_tools->sql_list_tables(), $request->variable('table', array('')));
$format = $request->variable('method', ''); $format = $request->variable('method', '');
$where = $request->variable('where', '');
if (!sizeof($table)) if (!count($table))
{ {
trigger_error($user->lang['TABLE_SELECT_ERROR'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['TABLE_SELECT_ERROR'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
@ -69,17 +69,9 @@ class acp_database
trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
$store = $download = $structure = $schema_data = false; $store = true;
$structure = false;
if ($where == 'store_and_download' || $where == 'store') $schema_data = false;
{
$store = true;
}
if ($where == 'store_and_download' || $where == 'download')
{
$download = true;
}
if ($type == 'full' || $type == 'structure') if ($type == 'full' || $type == 'structure')
{ {
@ -98,8 +90,9 @@ class acp_database
$filename = 'backup_' . $time . '_' . unique_id(); $filename = 'backup_' . $time . '_' . unique_id();
/** @var phpbb\db\extractor\extractor_interface $extractor Database extractor */
$extractor = $phpbb_container->get('dbal.extractor'); $extractor = $phpbb_container->get('dbal.extractor');
$extractor->init_extractor($format, $filename, $time, $download, $store); $extractor->init_extractor($format, $filename, $time, false, $store);
$extractor->write_start($table_prefix); $extractor->write_start($table_prefix);
@ -145,11 +138,6 @@ class acp_database
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DB_BACKUP'); $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DB_BACKUP');
if ($download == true)
{
exit;
}
trigger_error($user->lang['BACKUP_SUCCESS'] . adm_back_link($this->u_action)); trigger_error($user->lang['BACKUP_SUCCESS'] . adm_back_link($this->u_action));
break; break;
@ -201,16 +189,10 @@ class acp_database
case 'submit': case 'submit':
$delete = $request->variable('delete', ''); $delete = $request->variable('delete', '');
$file = $request->variable('file', ''); $file = $request->variable('file', '');
$download = $request->variable('download', '');
if (!preg_match('#^backup_\d{10,}_[a-z\d]{16}\.(sql(?:\.(?:gz|bz2))?)$#', $file, $matches)) $backup_info = $this->get_backup_file($phpbb_root_path . 'store/', $file);
{
trigger_error($user->lang['BACKUP_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
}
$file_name = $phpbb_root_path . 'store/' . $matches[0]; if (empty($backup_info) || !is_readable($backup_info['file_name']))
if (!file_exists($file_name) || !is_readable($file_name))
{ {
trigger_error($user->lang['BACKUP_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['BACKUP_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
@ -219,7 +201,7 @@ class acp_database
{ {
if (confirm_box(true)) if (confirm_box(true))
{ {
unlink($file_name); unlink($backup_info['file_name']);
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DB_DELETE'); $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DB_DELETE');
trigger_error($user->lang['BACKUP_DELETE'] . adm_back_link($this->u_action)); trigger_error($user->lang['BACKUP_DELETE'] . adm_back_link($this->u_action));
} }
@ -228,50 +210,12 @@ class acp_database
confirm_box(false, $user->lang['DELETE_SELECTED_BACKUP'], build_hidden_fields(array('delete' => $delete, 'file' => $file))); confirm_box(false, $user->lang['DELETE_SELECTED_BACKUP'], build_hidden_fields(array('delete' => $delete, 'file' => $file)));
} }
} }
else if ($download || confirm_box(true)) else if (confirm_box(true))
{ {
if ($download) switch ($backup_info['extension'])
{
$name = $matches[0];
switch ($matches[1])
{
case 'sql':
$mimetype = 'text/x-sql';
break;
case 'sql.bz2':
$mimetype = 'application/x-bzip2';
break;
case 'sql.gz':
$mimetype = 'application/x-gzip';
break;
}
header('Cache-Control: private, no-cache');
header("Content-Type: $mimetype; name=\"$name\"");
header("Content-disposition: attachment; filename=$name");
@set_time_limit(0);
$fp = @fopen($file_name, 'rb');
if ($fp !== false)
{
while (!feof($fp))
{
echo fread($fp, 8192);
}
fclose($fp);
}
flush();
exit;
}
switch ($matches[1])
{ {
case 'sql': case 'sql':
$fp = fopen($file_name, 'rb'); $fp = fopen($backup_info['file_name'], 'rb');
$read = 'fread'; $read = 'fread';
$seek = 'fseek'; $seek = 'fseek';
$eof = 'feof'; $eof = 'feof';
@ -280,7 +224,7 @@ class acp_database
break; break;
case 'sql.bz2': case 'sql.bz2':
$fp = bzopen($file_name, 'r'); $fp = bzopen($backup_info['file_name'], 'r');
$read = 'bzread'; $read = 'bzread';
$seek = ''; $seek = '';
$eof = 'feof'; $eof = 'feof';
@ -289,13 +233,17 @@ class acp_database
break; break;
case 'sql.gz': case 'sql.gz':
$fp = gzopen($file_name, 'rb'); $fp = gzopen($backup_info['file_name'], 'rb');
$read = 'gzread'; $read = 'gzread';
$seek = 'gzseek'; $seek = 'gzseek';
$eof = 'gzeof'; $eof = 'gzeof';
$close = 'gzclose'; $close = 'gzclose';
$fgetd = 'fgetd'; $fgetd = 'fgetd';
break; break;
default:
trigger_error($user->lang['BACKUP_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
return;
} }
switch ($db->get_sql_layer()) switch ($db->get_sql_layer())
@ -375,43 +323,13 @@ class acp_database
trigger_error($user->lang['RESTORE_SUCCESS'] . adm_back_link($this->u_action)); trigger_error($user->lang['RESTORE_SUCCESS'] . adm_back_link($this->u_action));
break; break;
} }
else if (!$download) else
{ {
confirm_box(false, $user->lang['RESTORE_SELECTED_BACKUP'], build_hidden_fields(array('file' => $file))); confirm_box(false, $user->lang['RESTORE_SELECTED_BACKUP'], build_hidden_fields(array('file' => $file)));
} }
default: default:
$methods = array('sql'); $backup_files = $this->get_file_list($phpbb_root_path . 'store/');
$available_methods = array('sql.gz' => 'zlib', 'sql.bz2' => 'bz2');
foreach ($available_methods as $type => $module)
{
if (!@extension_loaded($module))
{
continue;
}
$methods[] = $type;
}
$dir = $phpbb_root_path . 'store/';
$dh = @opendir($dir);
$backup_files = array();
if ($dh)
{
while (($file = readdir($dh)) !== false)
{
if (preg_match('#^backup_(\d{10,})_[a-z\d]{16}\.(sql(?:\.(?:gz|bz2))?)$#', $file, $matches))
{
if (in_array($matches[2], $methods))
{
$backup_files[(int) $matches[1]] = $file;
}
}
}
closedir($dh);
}
if (!empty($backup_files)) if (!empty($backup_files))
{ {
@ -420,8 +338,8 @@ class acp_database
foreach ($backup_files as $name => $file) foreach ($backup_files as $name => $file)
{ {
$template->assign_block_vars('files', array( $template->assign_block_vars('files', array(
'FILE' => $file, 'FILE' => sha1($file),
'NAME' => $user->format_date($name, 'd-m-Y H:i:s', true), 'NAME' => $user->format_date($name, 'd-m-Y H:i', true),
'SUPPORTED' => true, 'SUPPORTED' => true,
)); ));
} }
@ -435,6 +353,92 @@ class acp_database
break; break;
} }
} }
/**
* Get backup file from file hash
*
* @param string $directory Relative path to directory
* @param string $file_hash Hash of selected file
*
* @return array Backup file data or empty array if unable to find file
*/
protected function get_backup_file($directory, $file_hash)
{
$backup_data = [];
$file_list = $this->get_file_list($directory);
$supported_extensions = $this->get_supported_extensions();
foreach ($file_list as $file)
{
preg_match('#^backup_(\d{10,})_(?:[a-z\d]{16}|[a-z\d]{32})\.(sql(?:\.(?:gz|bz2))?)$#i', $file, $matches);
if (sha1($file) === $file_hash && in_array($matches[2], $supported_extensions))
{
$backup_data = [
'file_name' => $directory . $file,
'extension' => $matches[2],
];
break;
}
}
return $backup_data;
}
/**
* Get backup file list for directory
*
* @param string $directory Relative path to backup directory
*
* @return array List of backup files in specified directory
*/
protected function get_file_list($directory)
{
$supported_extensions = $this->get_supported_extensions();
$dh = @opendir($directory);
$backup_files = [];
if ($dh)
{
while (($file = readdir($dh)) !== false)
{
if (preg_match('#^backup_(\d{10,})_(?:[a-z\d]{16}|[a-z\d]{32})\.(sql(?:\.(?:gz|bz2))?)$#i', $file, $matches))
{
if (in_array($matches[2], $supported_extensions))
{
$backup_files[(int) $matches[1]] = $file;
}
}
}
closedir($dh);
}
return $backup_files;
}
/**
* Get supported extensions for backup
*
* @return array List of supported extensions
*/
protected function get_supported_extensions()
{
$extensions = ['sql'];
$available_methods = ['sql.gz' => 'zlib', 'sql.bz2' => 'bz2'];
foreach ($available_methods as $type => $module)
{
if (!@extension_loaded($module))
{
continue;
}
$extensions[] = $type;
}
return $extensions;
}
} }
// get how much space we allow for a chunk of data, very similar to phpMyAdmin's way of doing things ;-) (hey, we only do this for MySQL anyway :P) // get how much space we allow for a chunk of data, very similar to phpMyAdmin's way of doing things ;-) (hey, we only do this for MySQL anyway :P)
@ -495,7 +499,7 @@ function sanitize_data_mssql($text)
{ {
$val[] = "'" . $value . "'"; $val[] = "'" . $value . "'";
} }
if (sizeof($matches[0])) if (count($matches[0]))
{ {
$val[] = 'char(' . ord(array_shift($matches[0])) . ')'; $val[] = 'char(' . ord(array_shift($matches[0])) . ')';
} }
@ -519,7 +523,7 @@ function sanitize_data_oracle($text)
{ {
$val[] = "'" . $value . "'"; $val[] = "'" . $value . "'";
} }
if (sizeof($matches[0])) if (count($matches[0]))
{ {
$val[] = 'chr(' . ord(array_shift($matches[0])) . ')'; $val[] = 'chr(' . ord(array_shift($matches[0])) . ')';
} }
@ -541,7 +545,7 @@ function sanitize_data_generic($text)
{ {
$val[] = "'" . $value . "'"; $val[] = "'" . $value . "'";
} }
if (sizeof($matches[0])) if (count($matches[0]))
{ {
$val[] = "'" . array_shift($matches[0]) . "'"; $val[] = "'" . array_shift($matches[0]) . "'";
} }
@ -583,7 +587,7 @@ function fgetd_seekless(&$fp, $delim, $read, $seek, $eof, $buffer = 8192)
static $array = array(); static $array = array();
static $record = ''; static $record = '';
if (!sizeof($array)) if (!count($array))
{ {
while (!$eof($fp)) while (!$eof($fp))
{ {
@ -605,7 +609,7 @@ function fgetd_seekless(&$fp, $delim, $read, $seek, $eof, $buffer = 8192)
} }
} }
if (sizeof($array)) if (count($array))
{ {
return array_shift($array); return array_shift($array);
} }

View file

@ -68,7 +68,7 @@ class acp_email
$error[] = $user->lang['NO_EMAIL_MESSAGE']; $error[] = $user->lang['NO_EMAIL_MESSAGE'];
} }
if (!sizeof($error)) if (!count($error))
{ {
if (!empty($usernames)) if (!empty($usernames))
{ {
@ -168,7 +168,7 @@ class acp_email
{ {
$i = 0; $i = 0;
if (sizeof($email_list)) if (count($email_list))
{ {
$j++; $j++;
} }
@ -235,16 +235,16 @@ class acp_email
); );
extract($phpbb_dispatcher->trigger_event('core.acp_email_send_before', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_email_send_before', compact($vars)));
for ($i = 0, $size = sizeof($email_list); $i < $size; $i++) for ($i = 0, $size = count($email_list); $i < $size; $i++)
{ {
$used_lang = $email_list[$i][0]['lang']; $used_lang = $email_list[$i][0]['lang'];
$used_method = $email_list[$i][0]['method']; $used_method = $email_list[$i][0]['method'];
for ($j = 0, $list_size = sizeof($email_list[$i]); $j < $list_size; $j++) for ($j = 0, $list_size = count($email_list[$i]); $j < $list_size; $j++)
{ {
$email_row = $email_list[$i][$j]; $email_row = $email_list[$i][$j];
$messenger->{((sizeof($email_list[$i]) == 1) ? 'to' : 'bcc')}($email_row['email'], $email_row['name']); $messenger->{((count($email_list[$i]) == 1) ? 'to' : 'bcc')}($email_row['email'], $email_row['name']);
$messenger->im($email_row['jabber'], $email_row['name']); $messenger->im($email_row['jabber'], $email_row['name']);
} }
@ -322,8 +322,8 @@ class acp_email
$s_priority_options .= '<option value="' . MAIL_HIGH_PRIORITY . '">' . $user->lang['MAIL_HIGH_PRIORITY'] . '</option>'; $s_priority_options .= '<option value="' . MAIL_HIGH_PRIORITY . '">' . $user->lang['MAIL_HIGH_PRIORITY'] . '</option>';
$template_data = array( $template_data = array(
'S_WARNING' => (sizeof($error)) ? true : false, 'S_WARNING' => (count($error)) ? true : false,
'WARNING_MSG' => (sizeof($error)) ? implode('<br />', $error) : '', 'WARNING_MSG' => (count($error)) ? implode('<br />', $error) : '',
'U_ACTION' => $this->u_action, 'U_ACTION' => $this->u_action,
'S_GROUP_OPTIONS' => $select_list, 'S_GROUP_OPTIONS' => $select_list,
'USERNAMES' => implode("\n", $usernames), 'USERNAMES' => implode("\n", $usernames),

View file

@ -35,11 +35,13 @@ class acp_extensions
private $request; private $request;
private $phpbb_dispatcher; private $phpbb_dispatcher;
private $ext_manager; private $ext_manager;
private $phpbb_container;
private $php_ini;
function main() function main()
{ {
// Start the page // Start the page
global $config, $user, $template, $request, $phpbb_extension_manager, $phpbb_root_path, $phpbb_log, $phpbb_dispatcher; global $config, $user, $template, $request, $phpbb_extension_manager, $phpbb_root_path, $phpbb_log, $phpbb_dispatcher, $phpbb_container;
$this->config = $config; $this->config = $config;
$this->template = $template; $this->template = $template;
@ -48,6 +50,8 @@ class acp_extensions
$this->log = $phpbb_log; $this->log = $phpbb_log;
$this->phpbb_dispatcher = $phpbb_dispatcher; $this->phpbb_dispatcher = $phpbb_dispatcher;
$this->ext_manager = $phpbb_extension_manager; $this->ext_manager = $phpbb_extension_manager;
$this->phpbb_container = $phpbb_container;
$this->php_ini = $this->phpbb_container->get('php_ini');
$this->user->add_lang(array('install', 'acp/extensions', 'migrator')); $this->user->add_lang(array('install', 'acp/extensions', 'migrator'));
@ -57,7 +61,7 @@ class acp_extensions
$ext_name = $this->request->variable('ext_name', ''); $ext_name = $this->request->variable('ext_name', '');
// What is a safe limit of execution time? Half the max execution time should be safe. // What is a safe limit of execution time? Half the max execution time should be safe.
$safe_time_limit = (ini_get('max_execution_time') / 2); $safe_time_limit = ($this->php_ini->getNumeric('max_execution_time') / 2);
$start_time = time(); $start_time = time();
// Cancel action // Cancel action

View file

@ -90,7 +90,7 @@ class acp_forums
$errors = $this->delete_forum($forum_id, $action_posts, $action_subforums, $posts_to_id, $subforums_to_id); $errors = $this->delete_forum($forum_id, $action_posts, $action_subforums, $posts_to_id, $subforums_to_id);
if (sizeof($errors)) if (count($errors))
{ {
break; break;
} }
@ -198,7 +198,7 @@ class acp_forums
$errors = $this->update_forum_data($forum_data); $errors = $this->update_forum_data($forum_data);
if (!sizeof($errors)) if (!count($errors))
{ {
$forum_perm_from = $request->variable('forum_perm_from', 0); $forum_perm_from = $request->variable('forum_perm_from', 0);
$cache->destroy('sql', FORUMS_TABLE); $cache->destroy('sql', FORUMS_TABLE);
@ -622,7 +622,7 @@ class acp_forums
$template_data = array( $template_data = array(
'S_EDIT_FORUM' => true, 'S_EDIT_FORUM' => true,
'S_ERROR' => (sizeof($errors)) ? true : false, 'S_ERROR' => (count($errors)) ? true : false,
'S_PARENT_ID' => $this->parent_id, 'S_PARENT_ID' => $this->parent_id,
'S_FORUM_PARENT_ID' => $forum_data['parent_id'], 'S_FORUM_PARENT_ID' => $forum_data['parent_id'],
'S_ADD_ACTION' => ($action == 'add') ? true : false, 'S_ADD_ACTION' => ($action == 'add') ? true : false,
@ -632,7 +632,7 @@ class acp_forums
'L_COPY_PERMISSIONS_EXPLAIN' => $user->lang['COPY_PERMISSIONS_' . strtoupper($action) . '_EXPLAIN'], 'L_COPY_PERMISSIONS_EXPLAIN' => $user->lang['COPY_PERMISSIONS_' . strtoupper($action) . '_EXPLAIN'],
'L_TITLE' => $user->lang[$this->page_title], 'L_TITLE' => $user->lang[$this->page_title],
'ERROR_MSG' => (sizeof($errors)) ? implode('<br />', $errors) : '', 'ERROR_MSG' => (count($errors)) ? implode('<br />', $errors) : '',
'FORUM_NAME' => $forum_data['forum_name'], 'FORUM_NAME' => $forum_data['forum_name'],
'FORUM_DATA_LINK' => $forum_data['forum_link'], 'FORUM_DATA_LINK' => $forum_data['forum_link'],
@ -772,8 +772,8 @@ class acp_forums
'S_FORUM_LINK' => ($forum_data['forum_type'] == FORUM_LINK) ? true : false, 'S_FORUM_LINK' => ($forum_data['forum_type'] == FORUM_LINK) ? true : false,
'S_HAS_SUBFORUMS' => ($forum_data['right_id'] - $forum_data['left_id'] > 1) ? true : false, 'S_HAS_SUBFORUMS' => ($forum_data['right_id'] - $forum_data['left_id'] > 1) ? true : false,
'S_FORUMS_LIST' => $forums_list, 'S_FORUMS_LIST' => $forums_list,
'S_ERROR' => (sizeof($errors)) ? true : false, 'S_ERROR' => (count($errors)) ? true : false,
'ERROR_MSG' => (sizeof($errors)) ? implode('<br />', $errors) : '') 'ERROR_MSG' => (count($errors)) ? implode('<br />', $errors) : '')
); );
return; return;
@ -924,7 +924,7 @@ class acp_forums
unset($rowset); unset($rowset);
$template->assign_vars(array( $template->assign_vars(array(
'ERROR_MSG' => (sizeof($errors)) ? implode('<br />', $errors) : '', 'ERROR_MSG' => (count($errors)) ? implode('<br />', $errors) : '',
'NAVIGATION' => $navigation, 'NAVIGATION' => $navigation,
'FORUM_BOX' => $forum_box, 'FORUM_BOX' => $forum_box,
'U_SEL_ACTION' => $this->u_action, 'U_SEL_ACTION' => $this->u_action,
@ -986,6 +986,13 @@ class acp_forums
$errors[] = $user->lang['FORUM_NAME_EMPTY']; $errors[] = $user->lang['FORUM_NAME_EMPTY'];
} }
// No Emojis
if (preg_match_all('/[\x{10000}-\x{10FFFF}]/u', $forum_data_ary['forum_name'], $matches))
{
$character_list = implode('<br>', $matches[0]);
$errors[] = $user->lang('FORUM_NAME_EMOJI', $character_list);
}
if (utf8_strlen($forum_data_ary['forum_desc']) > 4000) if (utf8_strlen($forum_data_ary['forum_desc']) > 4000)
{ {
$errors[] = $user->lang['FORUM_DESC_TOO_LONG']; $errors[] = $user->lang['FORUM_DESC_TOO_LONG'];
@ -1012,7 +1019,7 @@ class acp_forums
} }
$range_test_ary = array( $range_test_ary = array(
array('lang' => 'FORUM_TOPICS_PAGE', 'value' => $forum_data_ary['forum_topics_per_page'], 'column_type' => 'TINT:0'), array('lang' => 'FORUM_TOPICS_PAGE', 'value' => $forum_data_ary['forum_topics_per_page'], 'column_type' => 'USINT:0'),
); );
if (!empty($forum_data_ary['forum_image']) && !file_exists($phpbb_root_path . $forum_data_ary['forum_image'])) if (!empty($forum_data_ary['forum_image']) && !file_exists($phpbb_root_path . $forum_data_ary['forum_image']))
@ -1053,7 +1060,7 @@ class acp_forums
// What are we going to do tonight Brain? The same thing we do everynight, // What are we going to do tonight Brain? The same thing we do everynight,
// try to take over the world ... or decide whether to continue update // try to take over the world ... or decide whether to continue update
// and if so, whether it's a new forum/cat/link or an existing one // and if so, whether it's a new forum/cat/link or an existing one
if (sizeof($errors)) if (count($errors))
{ {
return $errors; return $errors;
} }
@ -1217,12 +1224,12 @@ class acp_forums
$errors = array_merge($errors, $this->delete_forum_content($_row['forum_id'])); $errors = array_merge($errors, $this->delete_forum_content($_row['forum_id']));
} }
if (sizeof($errors)) if (count($errors))
{ {
return $errors; return $errors;
} }
if (sizeof($forum_ids)) if (count($forum_ids))
{ {
$sql = 'DELETE FROM ' . FORUMS_TABLE . ' $sql = 'DELETE FROM ' . FORUMS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids); WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
@ -1252,7 +1259,7 @@ class acp_forums
$allowed_forums = array_diff($allowed_forums, $forum_ids); $allowed_forums = array_diff($allowed_forums, $forum_ids);
$sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . " $sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . "
SET allowed_forums = '" . ((sizeof($allowed_forums)) ? serialize($allowed_forums) : '') . "' SET allowed_forums = '" . ((count($allowed_forums)) ? serialize($allowed_forums) : '') . "'
WHERE group_id = {$_row['group_id']}"; WHERE group_id = {$_row['group_id']}";
$db->sql_query($sql); $db->sql_query($sql);
} }
@ -1321,7 +1328,7 @@ class acp_forums
$forum_data_sql['forum_last_poster_colour'] = ''; $forum_data_sql['forum_last_poster_colour'] = '';
} }
if (sizeof($errors)) if (count($errors))
{ {
return $errors; return $errors;
} }
@ -1338,7 +1345,7 @@ class acp_forums
} }
} }
if (sizeof($errors)) if (count($errors))
{ {
return $errors; return $errors;
} }
@ -1431,12 +1438,14 @@ class acp_forums
return $errors; return $errors;
} }
$db->sql_transaction('begin');
$moved_forums = get_forum_branch($from_id, 'children', 'descending'); $moved_forums = get_forum_branch($from_id, 'children', 'descending');
$from_data = $moved_forums[0]; $from_data = $moved_forums[0];
$diff = sizeof($moved_forums) * 2; $diff = count($moved_forums) * 2;
$moved_ids = array(); $moved_ids = array();
for ($i = 0, $size = sizeof($moved_forums); $i < $size; ++$i) for ($i = 0, $size = count($moved_forums); $i < $size; ++$i)
{ {
$moved_ids[] = $moved_forums[$i]['forum_id']; $moved_ids[] = $moved_forums[$i]['forum_id'];
} }
@ -1502,6 +1511,8 @@ class acp_forums
WHERE " . $db->sql_in_set('forum_id', $moved_ids); WHERE " . $db->sql_in_set('forum_id', $moved_ids);
$db->sql_query($sql); $db->sql_query($sql);
$db->sql_transaction('commit');
return $errors; return $errors;
} }
@ -1537,6 +1548,16 @@ class acp_forums
$table_ary = array(LOG_TABLE, POSTS_TABLE, TOPICS_TABLE, DRAFTS_TABLE, TOPICS_TRACK_TABLE); $table_ary = array(LOG_TABLE, POSTS_TABLE, TOPICS_TABLE, DRAFTS_TABLE, TOPICS_TRACK_TABLE);
/**
* Perform additional actions before move forum content
*
* @event core.acp_manage_forums_move_content_sql_before
* @var array table_ary Array of tables from which forum_id will be updated
* @since 3.2.4-RC1
*/
$vars = array('table_ary');
extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_move_content_sql_before', compact($vars)));
foreach ($table_ary as $table) foreach ($table_ary as $table)
{ {
$sql = "UPDATE $table $sql = "UPDATE $table
@ -1612,7 +1633,7 @@ class acp_forums
} }
} }
if (sizeof($errors)) if (count($errors))
{ {
return $errors; return $errors;
} }
@ -1628,12 +1649,12 @@ class acp_forums
$errors = array_merge($errors, $this->delete_forum_content($row['forum_id'])); $errors = array_merge($errors, $this->delete_forum_content($row['forum_id']));
} }
if (sizeof($errors)) if (count($errors))
{ {
return $errors; return $errors;
} }
$diff = sizeof($forum_ids) * 2; $diff = count($forum_ids) * 2;
$sql = 'DELETE FROM ' . FORUMS_TABLE . ' $sql = 'DELETE FROM ' . FORUMS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids); WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
@ -1706,7 +1727,7 @@ class acp_forums
} }
} }
if (sizeof($errors)) if (count($errors))
{ {
return $errors; return $errors;
} }
@ -1754,7 +1775,7 @@ class acp_forums
$allowed_forums = array_diff($allowed_forums, $forum_ids); $allowed_forums = array_diff($allowed_forums, $forum_ids);
$sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . " $sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . "
SET allowed_forums = '" . ((sizeof($allowed_forums)) ? serialize($allowed_forums) : '') . "' SET allowed_forums = '" . ((count($allowed_forums)) ? serialize($allowed_forums) : '') . "'
WHERE group_id = {$row['group_id']}"; WHERE group_id = {$row['group_id']}";
$db->sql_query($sql); $db->sql_query($sql);
} }
@ -1927,9 +1948,9 @@ class acp_forums
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($ids)) if (count($ids))
{ {
$start += sizeof($ids); $start += count($ids);
foreach ($tables as $table) foreach ($tables as $table)
{ {
@ -1937,7 +1958,7 @@ class acp_forums
} }
} }
} }
while (sizeof($ids) == $batch_size); while (count($ids) == $batch_size);
} }
unset($ids); unset($ids);
@ -1978,7 +1999,7 @@ class acp_forums
} }
// Adjust users post counts // Adjust users post counts
if (sizeof($post_counts)) if (count($post_counts))
{ {
foreach ($post_counts as $poster_id => $substract) foreach ($post_counts as $poster_id => $substract)
{ {
@ -2062,7 +2083,7 @@ class acp_forums
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (!sizeof($target)) if (!count($target))
{ {
// The forum is already on top or bottom // The forum is already on top or bottom
return false; return false;

View file

@ -29,6 +29,9 @@ class acp_groups
global $phpbb_root_path, $phpbb_admin_path, $phpEx; global $phpbb_root_path, $phpbb_admin_path, $phpEx;
global $request, $phpbb_container, $phpbb_dispatcher; global $request, $phpbb_container, $phpbb_dispatcher;
/** @var \phpbb\language\language $language Language object */
$language = $phpbb_container->get('language');
$user->add_lang('acp/groups'); $user->add_lang('acp/groups');
$this->tpl_name = 'acp_groups'; $this->tpl_name = 'acp_groups';
$this->page_title = 'ACP_GROUPS_MANAGE'; $this->page_title = 'ACP_GROUPS_MANAGE';
@ -187,7 +190,7 @@ class acp_groups
group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row); group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row);
$start = (sizeof($mark_ary) < 200) ? 0 : $start + 200; $start = (count($mark_ary) < 200) ? 0 : $start + 200;
} }
else else
{ {
@ -293,7 +296,19 @@ class acp_groups
// Add user/s to group // Add user/s to group
if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, $leader, 0, $group_row)) if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, $leader, 0, $group_row))
{ {
trigger_error($user->lang[$error] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING); $display_message = $language->lang($error);
if ($error == 'GROUP_USERS_INVALID')
{
// Find which users don't exist
$actual_name_ary = $name_ary;
$actual_user_id_ary = [];
user_get_id_name($actual_user_id_ary, $actual_name_ary, false, true);
$display_message = $language->lang('GROUP_USERS_INVALID', implode($language->lang('COMMA_SEPARATOR'), array_udiff($name_ary, $actual_name_ary, 'strcasecmp')));
}
trigger_error($display_message . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
} }
$message = ($leader) ? 'GROUP_MODS_ADDED' : 'GROUP_USERS_ADDED'; $message = ($leader) ? 'GROUP_MODS_ADDED' : 'GROUP_USERS_ADDED';
@ -486,7 +501,7 @@ class acp_groups
$error = array_merge($error, $validation_error); $error = array_merge($error, $validation_error);
} }
if (!sizeof($error)) if (!count($error))
{ {
// Only set the rank, colour, etc. if it's changed or if we're adding a new // Only set the rank, colour, etc. if it's changed or if we're adding a new
// group. This prevents existing group members being updated if no changes // group. This prevents existing group members being updated if no changes
@ -614,7 +629,7 @@ class acp_groups
} }
} }
if (sizeof($error)) if (count($error))
{ {
$error = array_map(array(&$user, 'lang'), $error); $error = array_map(array(&$user, 'lang'), $error);
$group_rank = $submit_ary['rank']; $group_rank = $submit_ary['rank'];
@ -732,12 +747,12 @@ class acp_groups
'S_ADD_GROUP' => ($action == 'add') ? true : false, 'S_ADD_GROUP' => ($action == 'add') ? true : false,
'S_GROUP_PERM' => ($action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth')) ? true : false, 'S_GROUP_PERM' => ($action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth')) ? true : false,
'S_INCLUDE_SWATCH' => true, 'S_INCLUDE_SWATCH' => true,
'S_ERROR' => (sizeof($error)) ? true : false, 'S_ERROR' => (count($error)) ? true : false,
'S_SPECIAL_GROUP' => ($group_type == GROUP_SPECIAL) ? true : false, 'S_SPECIAL_GROUP' => ($group_type == GROUP_SPECIAL) ? true : false,
'S_USER_FOUNDER' => ($user->data['user_type'] == USER_FOUNDER) ? true : false, 'S_USER_FOUNDER' => ($user->data['user_type'] == USER_FOUNDER) ? true : false,
'S_AVATARS_ENABLED' => ($config['allow_avatar'] && $avatars_enabled), 'S_AVATARS_ENABLED' => ($config['allow_avatar'] && $avatars_enabled),
'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '', 'ERROR_MSG' => (count($error)) ? implode('<br />', $error) : '',
'GROUP_NAME' => $group_helper->get_name($group_name), 'GROUP_NAME' => $group_helper->get_name($group_name),
'GROUP_INTERNAL_NAME' => $group_name, 'GROUP_INTERNAL_NAME' => $group_name,
'GROUP_DESC' => $group_desc_data['text'], 'GROUP_DESC' => $group_desc_data['text'],
@ -926,7 +941,7 @@ class acp_groups
); );
// Get us all the groups // Get us all the groups
$sql = 'SELECT g.group_id, g.group_name, g.group_type $sql = 'SELECT g.group_id, g.group_name, g.group_type, g.group_colour
FROM ' . GROUPS_TABLE . ' g FROM ' . GROUPS_TABLE . ' g
ORDER BY g.group_type ASC, g.group_name'; ORDER BY g.group_type ASC, g.group_name';
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
@ -985,6 +1000,7 @@ class acp_groups
'S_GROUP_SPECIAL' => ($row['group_type'] == GROUP_SPECIAL) ? true : false, 'S_GROUP_SPECIAL' => ($row['group_type'] == GROUP_SPECIAL) ? true : false,
'GROUP_NAME' => $group_name, 'GROUP_NAME' => $group_name,
'GROUP_COLOR' => $row['group_colour'],
'TOTAL_MEMBERS' => $row['total_members'], 'TOTAL_MEMBERS' => $row['total_members'],
'PENDING_MEMBERS' => $row['pending_members'] 'PENDING_MEMBERS' => $row['pending_members']
)); ));

View file

@ -48,7 +48,7 @@ class acp_help_phpbb
$error[] = $user->lang['FORM_INVALID']; $error[] = $user->lang['FORM_INVALID'];
} }
// Do not write values if there is an error // Do not write values if there is an error
if (sizeof($error)) if (count($error))
{ {
$submit = false; $submit = false;
} }

View file

@ -166,7 +166,7 @@ class acp_icons
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($smilies)) if (count($smilies))
{ {
foreach ($smilies as $row) foreach ($smilies as $row)
{ {
@ -301,7 +301,7 @@ class acp_icons
} }
// Ok, another row for adding an addition code for a pre-existing image... // Ok, another row for adding an addition code for a pre-existing image...
if ($action == 'add' && $mode == 'smilies' && sizeof($smilies)) if ($action == 'add' && $mode == 'smilies' && count($smilies))
{ {
$template->assign_vars(array( $template->assign_vars(array(
'S_ADD_CODE' => true, 'S_ADD_CODE' => true,
@ -378,7 +378,7 @@ class acp_icons
{ {
$smiley_count = $this->item_count($table); $smiley_count = $this->item_count($table);
$addable_smileys_count = sizeof($images); $addable_smileys_count = count($images);
foreach ($images as $image) foreach ($images as $image)
{ {
if (!isset($image_add[$image])) if (!isset($image_add[$image]))
@ -546,8 +546,8 @@ class acp_icons
{ {
if (preg_match_all("#'(.*?)', ?#", $pak_entry, $data)) if (preg_match_all("#'(.*?)', ?#", $pak_entry, $data))
{ {
if ((sizeof($data[1]) != 4 && $mode == 'icons') || if ((count($data[1]) != 4 && $mode == 'icons') ||
((sizeof($data[1]) != 6 || (empty($data[1][4]) || empty($data[1][5]))) && $mode == 'smilies' )) ((count($data[1]) != 6 || (empty($data[1][4]) || empty($data[1][5]))) && $mode == 'smilies' ))
{ {
trigger_error($user->lang['WRONG_PAK_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['WRONG_PAK_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
@ -605,7 +605,7 @@ class acp_icons
if ($mode == 'smilies') if ($mode == 'smilies')
{ {
$smiley_count = $this->item_count($table); $smiley_count = $this->item_count($table);
if ($smiley_count + sizeof($pak_ary) > SMILEY_LIMIT) if ($smiley_count + count($pak_ary) > SMILEY_LIMIT)
{ {
trigger_error($user->lang('TOO_MANY_SMILIES', SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang('TOO_MANY_SMILIES', SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING);
} }
@ -616,8 +616,8 @@ class acp_icons
$data = array(); $data = array();
if (preg_match_all("#'(.*?)', ?#", $pak_entry, $data)) if (preg_match_all("#'(.*?)', ?#", $pak_entry, $data))
{ {
if ((sizeof($data[1]) != 4 && $mode == 'icons') || if ((count($data[1]) != 4 && $mode == 'icons') ||
(sizeof($data[1]) != 6 && $mode == 'smilies')) (count($data[1]) != 6 && $mode == 'smilies'))
{ {
trigger_error($user->lang['WRONG_PAK_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['WRONG_PAK_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
} }

View file

@ -24,9 +24,9 @@ class acp_inactive
var $u_action; var $u_action;
var $p_master; var $p_master;
function acp_inactive(&$p_master) function __construct($p_master)
{ {
$this->p_master = &$p_master; $this->p_master = $p_master;
} }
function main($id, $mode) function main($id, $mode)
@ -70,7 +70,7 @@ class acp_inactive
$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = ''; $s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param); gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
if ($submit && sizeof($mark)) if ($submit && count($mark))
{ {
if ($action !== 'delete' && !check_form_key($form_key)) if ($action !== 'delete' && !check_form_key($form_key))
{ {

View file

@ -32,7 +32,7 @@ class acp_language
function main($id, $mode) function main($id, $mode)
{ {
global $config, $db, $user, $template, $phpbb_log, $phpbb_container; global $config, $db, $user, $template, $phpbb_log, $phpbb_container;
global $phpbb_root_path, $phpEx, $request; global $phpbb_root_path, $phpEx, $request, $phpbb_dispatcher;
if (!function_exists('validate_language_iso_name')) if (!function_exists('validate_language_iso_name'))
{ {
@ -229,7 +229,20 @@ class acp_language
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_LANGUAGE_PACK_DELETED', false, array($row['lang_english_name'])); $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_LANGUAGE_PACK_DELETED', false, array($row['lang_english_name']));
trigger_error(sprintf($user->lang['LANGUAGE_PACK_DELETED'], $row['lang_english_name']) . adm_back_link($this->u_action)); $delete_message = sprintf($user->lang['LANGUAGE_PACK_DELETED'], $row['lang_english_name']);
$lang_iso = $row['lang_iso'];
/**
* Run code after language deleted
*
* @event core.acp_language_after_delete
* @var string lang_iso Language ISO code
* @var string delete_message Delete message appear to user
* @since 3.2.2-RC1
*/
$vars = array('lang_iso', 'delete_message');
extract($phpbb_dispatcher->trigger_event('core.acp_language_after_delete', compact($vars)));
trigger_error($delete_message . adm_back_link($this->u_action));
} }
else else
{ {
@ -402,7 +415,7 @@ class acp_language
unset($installed); unset($installed);
if (sizeof($new_ary)) if (count($new_ary))
{ {
foreach ($new_ary as $iso => $lang_ary) foreach ($new_ary as $iso => $lang_ary)
{ {

View file

@ -57,7 +57,7 @@ class acp_logs
{ {
$conditions = array(); $conditions = array();
if ($deletemark && sizeof($marked)) if ($deletemark && count($marked))
{ {
$conditions['log_id'] = array('IN' => $marked); $conditions['log_id'] = array('IN' => $marked);
} }
@ -151,7 +151,7 @@ class acp_logs
{ {
$data = array(); $data = array();
$checks = array('viewtopic', 'viewlogs', 'viewforum'); $checks = array('viewpost', 'viewtopic', 'viewlogs', 'viewforum');
foreach ($checks as $check) foreach ($checks as $check)
{ {
if (isset($row[$check]) && $row[$check]) if (isset($row[$check]) && $row[$check])
@ -167,7 +167,7 @@ class acp_logs
'IP' => $row['ip'], 'IP' => $row['ip'],
'DATE' => $user->format_date($row['time']), 'DATE' => $user->format_date($row['time']),
'ACTION' => $row['action'], 'ACTION' => $row['action'],
'DATA' => (sizeof($data)) ? implode(' | ', $data) : '', 'DATA' => (count($data)) ? implode(' | ', $data) : '',
'ID' => $row['id'], 'ID' => $row['id'],
) )
); );

View file

@ -337,7 +337,7 @@ class acp_main
} }
unset($posted); unset($posted);
if (sizeof($sql_ary)) if (count($sql_ary))
{ {
$db->sql_multi_insert(TOPICS_POSTED_TABLE, $sql_ary); $db->sql_multi_insert(TOPICS_POSTED_TABLE, $sql_ary);
} }
@ -585,6 +585,7 @@ class acp_main
'U_INACTIVE_USERS' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=inactive&amp;mode=list'), 'U_INACTIVE_USERS' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=inactive&amp;mode=list'),
'U_VERSIONCHECK' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=update&amp;mode=version_check'), 'U_VERSIONCHECK' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=update&amp;mode=version_check'),
'U_VERSIONCHECK_FORCE' => append_sid("{$phpbb_admin_path}index.$phpEx", 'versioncheck_force=1'), 'U_VERSIONCHECK_FORCE' => append_sid("{$phpbb_admin_path}index.$phpEx", 'versioncheck_force=1'),
'U_ATTACH_ORPHAN' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=acp_attachments&mode=orphan'),
'S_VERSIONCHECK' => ($auth->acl_get('a_board')) ? true : false, 'S_VERSIONCHECK' => ($auth->acl_get('a_board')) ? true : false,
'S_ACTION_OPTIONS' => ($auth->acl_get('a_board')) ? true : false, 'S_ACTION_OPTIONS' => ($auth->acl_get('a_board')) ? true : false,

View file

@ -249,7 +249,7 @@ class acp_modules
trigger_error($msg . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING); trigger_error($msg . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
} }
if (!sizeof($errors)) if (!count($errors))
{ {
$module_manager->remove_cache_file($this->module_class); $module_manager->remove_cache_file($this->module_class);
@ -364,7 +364,7 @@ class acp_modules
trigger_error($msg . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING); trigger_error($msg . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
} }
if (!sizeof($errors)) if (!count($errors))
{ {
$module_manager->remove_cache_file($this->module_class); $module_manager->remove_cache_file($this->module_class);
@ -430,7 +430,7 @@ class acp_modules
array_change_key_case($module_data, CASE_UPPER)) array_change_key_case($module_data, CASE_UPPER))
); );
if (sizeof($errors)) if (count($errors))
{ {
$template->assign_vars(array( $template->assign_vars(array(
'S_ERROR' => true, 'S_ERROR' => true,
@ -444,7 +444,7 @@ class acp_modules
} }
// Default management page // Default management page
if (sizeof($errors)) if (count($errors))
{ {
if ($request->is_ajax()) if ($request->is_ajax())
{ {

View file

@ -348,7 +348,7 @@ class acp_permission_roles
{ {
$hold_ary = $this->auth_admin->get_role_mask($role_id); $hold_ary = $this->auth_admin->get_role_mask($role_id);
if (sizeof($hold_ary)) if (count($hold_ary))
{ {
$role_name = (!empty($user->lang[$role_row['role_name']])) ? $user->lang[$role_row['role_name']] : $role_row['role_name']; $role_name = (!empty($user->lang[$role_row['role_name']])) ? $user->lang[$role_row['role_name']] : $role_row['role_name'];
@ -496,7 +496,7 @@ class acp_permission_roles
$content_array = $content_array[0]; $content_array = $content_array[0];
$template->assign_var('S_NUM_PERM_COLS', sizeof($categories)); $template->assign_var('S_NUM_PERM_COLS', count($categories));
// Assign to template // Assign to template
foreach ($content_array as $cat => $cat_array) foreach ($content_array as $cat => $cat_array)

View file

@ -131,11 +131,11 @@ class acp_permissions
} }
unset($usernames); unset($usernames);
if (sizeof($username) && !sizeof($user_id)) if (count($username) && !count($user_id))
{ {
user_get_id_name($user_id, $username); user_get_id_name($user_id, $username);
if (!sizeof($user_id)) if (!count($user_id))
{ {
trigger_error($user->lang['SELECTED_USER_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['SELECTED_USER_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
@ -260,17 +260,17 @@ class acp_permissions
{ {
$items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type); $items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type);
if ($all_users && sizeof($items['user_ids'])) if ($all_users && count($items['user_ids']))
{ {
$user_id = $items['user_ids']; $user_id = $items['user_ids'];
} }
else if ($all_groups && sizeof($items['group_ids'])) else if ($all_groups && count($items['group_ids']))
{ {
$group_id = $items['group_ids']; $group_id = $items['group_ids'];
} }
} }
if (sizeof($user_id) || sizeof($group_id)) if (count($user_id) || count($group_id))
{ {
$this->remove_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id, $forum_id); $this->remove_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id, $forum_id);
} }
@ -349,7 +349,7 @@ class acp_permissions
{ {
case 'forum_dropdown': case 'forum_dropdown':
if (sizeof($forum_id)) if (count($forum_id))
{ {
$this->check_existence('forum', $forum_id); $this->check_existence('forum', $forum_id);
continue 2; continue 2;
@ -364,7 +364,7 @@ class acp_permissions
case 'forums': case 'forums':
if (sizeof($forum_id)) if (count($forum_id))
{ {
$this->check_existence('forum', $forum_id); $this->check_existence('forum', $forum_id);
continue 2; continue 2;
@ -394,7 +394,7 @@ class acp_permissions
case 'user': case 'user':
if (sizeof($user_id)) if (count($user_id))
{ {
$this->check_existence('user', $user_id); $this->check_existence('user', $user_id);
continue 2; continue 2;
@ -409,7 +409,7 @@ class acp_permissions
case 'group': case 'group':
if (sizeof($group_id)) if (count($group_id))
{ {
$this->check_existence('group', $group_id); $this->check_existence('group', $group_id);
continue 2; continue 2;
@ -428,14 +428,14 @@ class acp_permissions
$all_users = (isset($_POST['all_users'])) ? true : false; $all_users = (isset($_POST['all_users'])) ? true : false;
$all_groups = (isset($_POST['all_groups'])) ? true : false; $all_groups = (isset($_POST['all_groups'])) ? true : false;
if ((sizeof($user_id) && !$all_users) || (sizeof($group_id) && !$all_groups)) if ((count($user_id) && !$all_users) || (count($group_id) && !$all_groups))
{ {
if (sizeof($user_id)) if (count($user_id))
{ {
$this->check_existence('user', $user_id); $this->check_existence('user', $user_id);
} }
if (sizeof($group_id)) if (count($group_id))
{ {
$this->check_existence('group', $group_id); $this->check_existence('group', $group_id);
} }
@ -446,13 +446,13 @@ class acp_permissions
// Now we check the users... because the "all"-selection is different here (all defined users/groups) // Now we check the users... because the "all"-selection is different here (all defined users/groups)
$items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type); $items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type);
if ($all_users && sizeof($items['user_ids'])) if ($all_users && count($items['user_ids']))
{ {
$user_id = $items['user_ids']; $user_id = $items['user_ids'];
continue 2; continue 2;
} }
if ($all_groups && sizeof($items['group_ids'])) if ($all_groups && count($items['group_ids']))
{ {
$group_id = $items['group_ids']; $group_id = $items['group_ids'];
continue 2; continue 2;
@ -487,14 +487,14 @@ class acp_permissions
'ANONYMOUS_USER_ID' => ANONYMOUS, 'ANONYMOUS_USER_ID' => ANONYMOUS,
'S_SELECT_VICTIM' => true, 'S_SELECT_VICTIM' => true,
'S_ALLOW_ALL_SELECT' => (sizeof($forum_id) > 5) ? false : true, 'S_ALLOW_ALL_SELECT' => (count($forum_id) > 5) ? false : true,
'S_CAN_SELECT_USER' => ($auth->acl_get('a_authusers')) ? true : false, 'S_CAN_SELECT_USER' => ($auth->acl_get('a_authusers')) ? true : false,
'S_CAN_SELECT_GROUP' => ($auth->acl_get('a_authgroups')) ? true : false, 'S_CAN_SELECT_GROUP' => ($auth->acl_get('a_authgroups')) ? true : false,
'S_HIDDEN_FIELDS' => $s_hidden_fields) 'S_HIDDEN_FIELDS' => $s_hidden_fields)
); );
// Let the forum names being displayed // Let the forum names being displayed
if (sizeof($forum_id)) if (count($forum_id))
{ {
$sql = 'SELECT forum_name $sql = 'SELECT forum_name
FROM ' . FORUMS_TABLE . ' FROM ' . FORUMS_TABLE . '
@ -510,7 +510,7 @@ class acp_permissions
$db->sql_freeresult($result); $db->sql_freeresult($result);
$template->assign_vars(array( $template->assign_vars(array(
'S_FORUM_NAMES' => (sizeof($forum_names)) ? true : false, 'S_FORUM_NAMES' => (count($forum_names)) ? true : false,
'FORUM_NAMES' => implode($user->lang['COMMA_SEPARATOR'], $forum_names)) 'FORUM_NAMES' => implode($user->lang['COMMA_SEPARATOR'], $forum_names))
); );
} }
@ -527,13 +527,13 @@ class acp_permissions
)); ));
// Do not allow forum_ids being set and no other setting defined (will bog down the server too much) // Do not allow forum_ids being set and no other setting defined (will bog down the server too much)
if (sizeof($forum_id) && !sizeof($user_id) && !sizeof($group_id)) if (count($forum_id) && !count($user_id) && !count($group_id))
{ {
trigger_error($user->lang['ONLY_FORUM_DEFINED'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['ONLY_FORUM_DEFINED'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
$template->assign_vars(array( $template->assign_vars(array(
'S_PERMISSION_DROPDOWN' => (sizeof($this->permission_dropdown) > 1) ? $this->build_permission_dropdown($this->permission_dropdown, $permission_type, $permission_scope) : false, 'S_PERMISSION_DROPDOWN' => (count($this->permission_dropdown) > 1) ? $this->build_permission_dropdown($this->permission_dropdown, $permission_type, $permission_scope) : false,
'L_PERMISSION_TYPE' => $this->permissions->get_type_lang($permission_type), 'L_PERMISSION_TYPE' => $this->permissions->get_type_lang($permission_type),
'U_ACTION' => $this->u_action, 'U_ACTION' => $this->u_action,
@ -546,8 +546,8 @@ class acp_permissions
'S_SETTING_PERMISSIONS' => true) 'S_SETTING_PERMISSIONS' => true)
); );
$hold_ary = $auth_admin->get_mask('set', (sizeof($user_id)) ? $user_id : false, (sizeof($group_id)) ? $group_id : false, (sizeof($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NO); $hold_ary = $auth_admin->get_mask('set', (count($user_id)) ? $user_id : false, (count($group_id)) ? $group_id : false, (count($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NO);
$auth_admin->display_mask('set', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false)); $auth_admin->display_mask('set', $permission_type, $hold_ary, ((count($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
} }
else else
{ {
@ -555,8 +555,8 @@ class acp_permissions
'S_VIEWING_PERMISSIONS' => true) 'S_VIEWING_PERMISSIONS' => true)
); );
$hold_ary = $auth_admin->get_mask('view', (sizeof($user_id)) ? $user_id : false, (sizeof($group_id)) ? $group_id : false, (sizeof($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NEVER); $hold_ary = $auth_admin->get_mask('view', (count($user_id)) ? $user_id : false, (count($group_id)) ? $group_id : false, (count($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NEVER);
$auth_admin->display_mask('view', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false)); $auth_admin->display_mask('view', $permission_type, $hold_ary, ((count($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
} }
} }
@ -652,7 +652,7 @@ class acp_permissions
break; break;
} }
if (sizeof($ids)) if (count($ids))
{ {
$sql = "SELECT $sql_id $sql = "SELECT $sql_id
FROM $table FROM $table
@ -667,7 +667,7 @@ class acp_permissions
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
if (!sizeof($ids)) if (!count($ids))
{ {
trigger_error($user->lang['SELECTED_' . strtoupper($mode) . '_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['SELECTED_' . strtoupper($mode) . '_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
@ -676,7 +676,7 @@ class acp_permissions
/** /**
* Apply permissions * Apply permissions
*/ */
function set_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id) function set_permissions($mode, $permission_type, $auth_admin, &$user_id, &$group_id)
{ {
global $db, $cache, $user, $auth; global $db, $cache, $user, $auth;
global $request; global $request;
@ -684,7 +684,7 @@ class acp_permissions
$psubmit = $request->variable('psubmit', array(0 => array(0 => 0))); $psubmit = $request->variable('psubmit', array(0 => array(0 => 0)));
// User or group to be set? // User or group to be set?
$ug_type = (sizeof($user_id)) ? 'user' : 'group'; $ug_type = (count($user_id)) ? 'user' : 'group';
// Check the permission setting again // Check the permission setting again
if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's')) if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
@ -715,7 +715,7 @@ class acp_permissions
$ug_id = array($ug_id); $ug_id = array($ug_id);
$forum_id = array($forum_id); $forum_id = array($forum_id);
if (sizeof($inherit)) if (count($inherit))
{ {
foreach ($inherit as $_ug_id => $forum_id_ary) foreach ($inherit as $_ug_id => $forum_id_ary)
{ {
@ -765,13 +765,13 @@ class acp_permissions
/** /**
* Apply all permissions * Apply all permissions
*/ */
function set_all_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id) function set_all_permissions($mode, $permission_type, $auth_admin, &$user_id, &$group_id)
{ {
global $db, $cache, $user, $auth; global $db, $cache, $user, $auth;
global $request; global $request;
// User or group to be set? // User or group to be set?
$ug_type = (sizeof($user_id)) ? 'user' : 'group'; $ug_type = (count($user_id)) ? 'user' : 'group';
// Check the permission setting again // Check the permission setting again
if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's')) if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
@ -870,7 +870,7 @@ class acp_permissions
} }
} }
if (sizeof(array_diff_assoc($auth_settings, $test_auth_settings))) if (count(array_diff_assoc($auth_settings, $test_auth_settings)))
{ {
return false; return false;
} }
@ -881,12 +881,12 @@ class acp_permissions
/** /**
* Remove permissions * Remove permissions
*/ */
function remove_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id, &$forum_id) function remove_permissions($mode, $permission_type, $auth_admin, &$user_id, &$group_id, &$forum_id)
{ {
global $user, $db, $cache, $auth; global $user, $db, $cache, $auth;
// User or group to be set? // User or group to be set?
$ug_type = (sizeof($user_id)) ? 'user' : 'group'; $ug_type = (count($user_id)) ? 'user' : 'group';
// Check the permission setting again // Check the permission setting again
if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's')) if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
@ -895,7 +895,7 @@ class acp_permissions
trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
$auth_admin->acl_delete($ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : false), $permission_type); $auth_admin->acl_delete($ug_type, (($ug_type == 'user') ? $user_id : $group_id), (count($forum_id) ? $forum_id : false), $permission_type);
// Do we need to recache the moderator lists? // Do we need to recache the moderator lists?
if ($permission_type == 'm_') if ($permission_type == 'm_')
@ -903,7 +903,7 @@ class acp_permissions
phpbb_cache_moderators($db, $cache, $auth); phpbb_cache_moderators($db, $cache, $auth);
} }
$this->log_action($mode, 'del', $permission_type, $ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : array(0 => 0))); $this->log_action($mode, 'del', $permission_type, $ug_type, (($ug_type == 'user') ? $user_id : $group_id), (count($forum_id) ? $forum_id : array(0 => 0)));
if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local') if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
{ {
@ -1053,7 +1053,7 @@ class acp_permissions
$total = ACL_NO; $total = ACL_NO;
$add_key = (($forum_id) ? '_LOCAL' : ''); $add_key = (($forum_id) ? '_LOCAL' : '');
if (sizeof($groups)) if (count($groups))
{ {
// Get group auth settings // Get group auth settings
$hold_ary = $auth->acl_group_raw_data(array_keys($groups), $permission, $forum_id); $hold_ary = $auth->acl_group_raw_data(array_keys($groups), $permission, $forum_id);
@ -1099,7 +1099,7 @@ class acp_permissions
// Get user specific permission... globally or for this forum // Get user specific permission... globally or for this forum
$hold_ary = $auth->acl_user_raw_data($user_id, $permission, $forum_id); $hold_ary = $auth->acl_user_raw_data($user_id, $permission, $forum_id);
$auth_setting = (!sizeof($hold_ary)) ? ACL_NO : $hold_ary[$user_id][$forum_id][$permission]; $auth_setting = (!count($hold_ary)) ? ACL_NO : $hold_ary[$user_id][$forum_id][$permission];
switch ($auth_setting) switch ($auth_setting)
{ {
@ -1258,7 +1258,7 @@ class acp_permissions
/** @var \phpbb\group\helper $group_helper */ /** @var \phpbb\group\helper $group_helper */
$group_helper = $phpbb_container->get('group_helper'); $group_helper = $phpbb_container->get('group_helper');
$sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((sizeof($forum_id)) ? 'AND ' . $db->sql_in_set('a.forum_id', $forum_id) : 'AND a.forum_id <> 0'); $sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((count($forum_id)) ? 'AND ' . $db->sql_in_set('a.forum_id', $forum_id) : 'AND a.forum_id <> 0');
// Permission options are only able to be a permission set... therefore we will pre-fetch the possible options and also the possible roles // Permission options are only able to be a permission set... therefore we will pre-fetch the possible options and also the possible roles
$option_ids = $role_ids = array(); $option_ids = $role_ids = array();
@ -1274,7 +1274,7 @@ class acp_permissions
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($option_ids)) if (count($option_ids))
{ {
$sql = 'SELECT DISTINCT role_id $sql = 'SELECT DISTINCT role_id
FROM ' . ACL_ROLES_DATA_TABLE . ' FROM ' . ACL_ROLES_DATA_TABLE . '
@ -1288,15 +1288,15 @@ class acp_permissions
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
if (sizeof($option_ids) && sizeof($role_ids)) if (count($option_ids) && count($role_ids))
{ {
$sql_where = 'AND (' . $db->sql_in_set('a.auth_option_id', $option_ids) . ' OR ' . $db->sql_in_set('a.auth_role_id', $role_ids) . ')'; $sql_where = 'AND (' . $db->sql_in_set('a.auth_option_id', $option_ids) . ' OR ' . $db->sql_in_set('a.auth_role_id', $role_ids) . ')';
} }
else if (sizeof($role_ids)) else if (count($role_ids))
{ {
$sql_where = 'AND ' . $db->sql_in_set('a.auth_role_id', $role_ids); $sql_where = 'AND ' . $db->sql_in_set('a.auth_role_id', $role_ids);
} }
else if (sizeof($option_ids)) else if (count($option_ids))
{ {
$sql_where = 'AND ' . $db->sql_in_set('a.auth_option_id', $option_ids); $sql_where = 'AND ' . $db->sql_in_set('a.auth_option_id', $option_ids);
} }

View file

@ -446,7 +446,7 @@ class acp_profile
{ {
$exploded_options = (is_array($options)) ? $options : explode("\n", $options); $exploded_options = (is_array($options)) ? $options : explode("\n", $options);
if (sizeof($exploded_options) == sizeof($lang_options) || $action == 'create') if (count($exploded_options) == count($lang_options) || $action == 'create')
{ {
// The number of options in the field is equal to the number of options already in the database // The number of options in the field is equal to the number of options already in the database
// Or we are creating a new dropdown list. // Or we are creating a new dropdown list.
@ -567,7 +567,7 @@ class acp_profile
} }
} }
if (sizeof($error)) if (count($error))
{ {
$submit = false; $submit = false;
} }
@ -600,9 +600,9 @@ class acp_profile
$s_hidden_fields .= build_hidden_fields($_new_key_ary); $s_hidden_fields .= build_hidden_fields($_new_key_ary);
} }
if (!sizeof($error)) if (!count($error))
{ {
if (($step == 3 && (sizeof($this->lang_defs['iso']) == 1 || $save)) || ($action == 'edit' && $save)) if (($step == 3 && (count($this->lang_defs['iso']) == 1 || $save)) || ($action == 'edit' && $save))
{ {
if (!check_form_key($form_key)) if (!check_form_key($form_key))
{ {
@ -616,7 +616,7 @@ class acp_profile
$template->assign_vars(array( $template->assign_vars(array(
'S_EDIT' => true, 'S_EDIT' => true,
'S_EDIT_MODE' => ($action == 'edit') ? true : false, 'S_EDIT_MODE' => ($action == 'edit') ? true : false,
'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '', 'ERROR_MSG' => (count($error)) ? implode('<br />', $error) : '',
'L_TITLE' => $user->lang['STEP_' . $step . '_TITLE_' . strtoupper($action)], 'L_TITLE' => $user->lang['STEP_' . $step . '_TITLE_' . strtoupper($action)],
'L_EXPLAIN' => $user->lang['STEP_' . $step . '_EXPLAIN_' . strtoupper($action)], 'L_EXPLAIN' => $user->lang['STEP_' . $step . '_EXPLAIN_' . strtoupper($action)],
@ -664,7 +664,7 @@ class acp_profile
$template->assign_vars(array( $template->assign_vars(array(
'S_STEP_TWO' => true, 'S_STEP_TWO' => true,
'L_NEXT_STEP' => (sizeof($this->lang_defs['iso']) == 1) ? $user->lang['SAVE'] : $user->lang['PROFILE_LANG_OPTIONS']) 'L_NEXT_STEP' => (count($this->lang_defs['iso']) == 1) ? $user->lang['SAVE'] : $user->lang['PROFILE_LANG_OPTIONS'])
); );
// Build options based on profile type // Build options based on profile type
@ -738,6 +738,32 @@ class acp_profile
break; break;
} }
$tpl_name = $this->tpl_name;
$page_title = $this->page_title;
$u_action = $this->u_action;
/**
* Event to handle actions on the ACP profile fields page
*
* @event core.acp_profile_action
* @var string action Action that is being performed
* @var string tpl_name Template file to load
* @var string page_title Page title
* @var string u_action The URL we are at, read only
* @since 3.2.2-RC1
*/
$vars = array(
'action',
'tpl_name',
'page_title',
'u_action',
);
extract($phpbb_dispatcher->trigger_event('core.acp_profile_action', compact($vars)));
$this->tpl_name = $tpl_name;
$this->page_title = $page_title;
unset($u_action);
$sql = 'SELECT * $sql = 'SELECT *
FROM ' . PROFILE_FIELDS_TABLE . ' FROM ' . PROFILE_FIELDS_TABLE . '
ORDER BY field_order'; ORDER BY field_order';
@ -750,7 +776,7 @@ class acp_profile
$active_value = (!$row['field_active']) ? 'activate' : 'deactivate'; $active_value = (!$row['field_active']) ? 'activate' : 'deactivate';
$id = $row['field_id']; $id = $row['field_id'];
$s_need_edit = (sizeof($this->lang_defs['diff'][$row['field_id']])) ? true : false; $s_need_edit = (count($this->lang_defs['diff'][$row['field_id']])) ? true : false;
if ($s_need_edit) if ($s_need_edit)
{ {
@ -762,7 +788,8 @@ class acp_profile
continue; continue;
} }
$profile_field = $this->type_collection[$row['field_type']]; $profile_field = $this->type_collection[$row['field_type']];
$template->assign_block_vars('fields', array(
$field_block = array(
'FIELD_IDENT' => $row['field_ident'], 'FIELD_IDENT' => $row['field_ident'],
'FIELD_TYPE' => $profile_field->get_name(), 'FIELD_TYPE' => $profile_field->get_name(),
@ -774,8 +801,26 @@ class acp_profile
'U_MOVE_UP' => $this->u_action . "&amp;action=move_up&amp;field_id=$id" . '&amp;hash=' . generate_link_hash('acp_profile'), 'U_MOVE_UP' => $this->u_action . "&amp;action=move_up&amp;field_id=$id" . '&amp;hash=' . generate_link_hash('acp_profile'),
'U_MOVE_DOWN' => $this->u_action . "&amp;action=move_down&amp;field_id=$id" . '&amp;hash=' . generate_link_hash('acp_profile'), 'U_MOVE_DOWN' => $this->u_action . "&amp;action=move_down&amp;field_id=$id" . '&amp;hash=' . generate_link_hash('acp_profile'),
'S_NEED_EDIT' => $s_need_edit) 'S_NEED_EDIT' => $s_need_edit,
); );
/**
* Event to modify profile field data before it is assigned to the template
*
* @event core.acp_profile_modify_profile_row
* @var array row Array with data for the current profile field
* @var array field_block Template data that is being assigned to the 'fields' block
* @var object profile_field A profile field instance, implements \phpbb\profilefields\type\type_base
* @since 3.2.2-RC1
*/
$vars = array(
'row',
'field_block',
'profile_field',
);
extract($phpbb_dispatcher->trigger_event('core.acp_profile_modify_profile_row', compact($vars)));
$template->assign_block_vars('fields', $field_block);
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
@ -800,7 +845,7 @@ class acp_profile
/** /**
* Build all Language specific options * Build all Language specific options
*/ */
function build_language_options(&$cp, $field_type, $action = 'create') function build_language_options($cp, $field_type, $action = 'create')
{ {
global $user, $config, $db, $request; global $user, $config, $db, $request;
@ -897,7 +942,7 @@ class acp_profile
/** /**
* Save Profile Field * Save Profile Field
*/ */
function save_profile_field(&$cp, $field_type, $action = 'create') function save_profile_field($cp, $field_type, $action = 'create')
{ {
global $db, $config, $user, $phpbb_container, $phpbb_log, $request, $phpbb_dispatcher; global $db, $config, $user, $phpbb_container, $phpbb_log, $request, $phpbb_dispatcher;
@ -1011,7 +1056,7 @@ class acp_profile
$this->update_insert(PROFILE_LANG_TABLE, $sql_ary, array('field_id' => $field_id, 'lang_id' => $default_lang_id)); $this->update_insert(PROFILE_LANG_TABLE, $sql_ary, array('field_id' => $field_id, 'lang_id' => $default_lang_id));
} }
if (is_array($cp->vars['l_lang_name']) && sizeof($cp->vars['l_lang_name'])) if (is_array($cp->vars['l_lang_name']) && count($cp->vars['l_lang_name']))
{ {
foreach ($cp->vars['l_lang_name'] as $lang_id => $data) foreach ($cp->vars['l_lang_name'] as $lang_id => $data)
{ {
@ -1087,7 +1132,7 @@ class acp_profile
} }
} }
if (is_array($cp->vars['l_lang_options']) && sizeof($cp->vars['l_lang_options'])) if (is_array($cp->vars['l_lang_options']) && count($cp->vars['l_lang_options']))
{ {
$empty_lang = array(); $empty_lang = array();
@ -1098,7 +1143,7 @@ class acp_profile
$lang_ary = explode("\n", $lang_ary); $lang_ary = explode("\n", $lang_ary);
} }
if (sizeof($lang_ary) != sizeof($cp->vars['lang_options'])) if (count($lang_ary) != count($cp->vars['lang_options']))
{ {
$empty_lang[$lang_id] = true; $empty_lang[$lang_id] = true;
} }
@ -1150,7 +1195,7 @@ class acp_profile
} }
} }
if (sizeof($profile_lang_fields)) if (count($profile_lang_fields))
{ {
foreach ($profile_lang_fields as $sql) foreach ($profile_lang_fields as $sql)
{ {
@ -1213,7 +1258,7 @@ class acp_profile
$where_sql[] = $key . ' = ' . ((is_string($value)) ? "'" . $db->sql_escape($value) . "'" : (int) $value); $where_sql[] = $key . ' = ' . ((is_string($value)) ? "'" . $db->sql_escape($value) . "'" : (int) $value);
} }
if (!sizeof($where_sql)) if (!count($where_sql))
{ {
return; return;
} }
@ -1229,14 +1274,14 @@ class acp_profile
{ {
$sql_ary = array_merge($where_fields, $sql_ary); $sql_ary = array_merge($where_fields, $sql_ary);
if (sizeof($sql_ary)) if (count($sql_ary))
{ {
$db->sql_query("INSERT INTO $table " . $db->sql_build_array('INSERT', $sql_ary)); $db->sql_query("INSERT INTO $table " . $db->sql_build_array('INSERT', $sql_ary));
} }
} }
else else
{ {
if (sizeof($sql_ary)) if (count($sql_ary))
{ {
$sql = "UPDATE $table SET " . $db->sql_build_array('UPDATE', $sql_ary) . ' $sql = "UPDATE $table SET " . $db->sql_build_array('UPDATE', $sql_ary) . '
WHERE ' . implode(' AND ', $where_sql); WHERE ' . implode(' AND ', $where_sql);

View file

@ -55,7 +55,7 @@ class acp_prune
*/ */
function prune_forums($id, $mode) function prune_forums($id, $mode)
{ {
global $db, $user, $auth, $template, $phpbb_log, $request; global $db, $user, $auth, $template, $phpbb_log, $request, $phpbb_dispatcher;
$all_forums = $request->variable('all_forums', 0); $all_forums = $request->variable('all_forums', 0);
$forum_id = $request->variable('f', array(0)); $forum_id = $request->variable('f', array(0));
@ -97,7 +97,7 @@ class acp_prune
'S_PRUNED' => true) 'S_PRUNED' => true)
); );
$sql_forum = (sizeof($forum_id)) ? ' AND ' . $db->sql_in_set('forum_id', $forum_id) : ''; $sql_forum = (count($forum_id)) ? ' AND ' . $db->sql_in_set('forum_id', $forum_id) : '';
// Get a list of forum's or the data for the forum that we are pruning. // Get a list of forum's or the data for the forum that we are pruning.
$sql = 'SELECT forum_id, forum_name $sql = 'SELECT forum_id, forum_name
@ -165,7 +165,7 @@ class acp_prune
} }
else else
{ {
confirm_box(false, $user->lang['PRUNE_FORUM_CONFIRM'], build_hidden_fields(array( $hidden_fields = array(
'i' => $id, 'i' => $id,
'mode' => $mode, 'mode' => $mode,
'submit' => 1, 'submit' => 1,
@ -177,13 +177,25 @@ class acp_prune
'prune_old_polls' => $request->variable('prune_old_polls', 0), 'prune_old_polls' => $request->variable('prune_old_polls', 0),
'prune_announce' => $request->variable('prune_announce', 0), 'prune_announce' => $request->variable('prune_announce', 0),
'prune_sticky' => $request->variable('prune_sticky', 0), 'prune_sticky' => $request->variable('prune_sticky', 0),
))); );
/**
* Use this event to pass data from the prune form to the confirmation screen
*
* @event core.prune_forums_settings_confirm
* @var array hidden_fields Hidden fields that are passed through the confirm screen
* @since 3.2.2-RC1
*/
$vars = array('hidden_fields');
extract($phpbb_dispatcher->trigger_event('core.prune_forums_settings_confirm', compact($vars)));
confirm_box(false, $user->lang['PRUNE_FORUM_CONFIRM'], build_hidden_fields($hidden_fields));
} }
} }
// If they haven't selected a forum for pruning yet then // If they haven't selected a forum for pruning yet then
// display a select box to use for pruning. // display a select box to use for pruning.
if (!sizeof($forum_id)) if (!count($forum_id))
{ {
$template->assign_vars(array( $template->assign_vars(array(
'U_ACTION' => $this->u_action, 'U_ACTION' => $this->u_action,
@ -215,15 +227,27 @@ class acp_prune
$db->sql_freeresult($result); $db->sql_freeresult($result);
$l_selected_forums = (sizeof($forum_id) == 1) ? 'SELECTED_FORUM' : 'SELECTED_FORUMS'; $l_selected_forums = (count($forum_id) == 1) ? 'SELECTED_FORUM' : 'SELECTED_FORUMS';
$template->assign_vars(array( $template_data = array(
'L_SELECTED_FORUMS' => $user->lang[$l_selected_forums], 'L_SELECTED_FORUMS' => $user->lang[$l_selected_forums],
'U_ACTION' => $this->u_action, 'U_ACTION' => $this->u_action,
'U_BACK' => $this->u_action, 'U_BACK' => $this->u_action,
'FORUM_LIST' => $forum_list, 'FORUM_LIST' => $forum_list,
'S_HIDDEN_FIELDS' => $s_hidden_fields) 'S_HIDDEN_FIELDS' => $s_hidden_fields,
); );
/**
* Event to add/modify prune forums settings template data
*
* @event core.prune_forums_settings_template_data
* @var array template_data Array with form template data
* @since 3.2.2-RC1
*/
$vars = array('template_data');
extract($phpbb_dispatcher->trigger_event('core.prune_forums_settings_template_data', compact($vars)));
$template->assign_vars($template_data);
} }
} }
@ -252,7 +276,7 @@ class acp_prune
$user_ids = $usernames = array(); $user_ids = $usernames = array();
$this->get_prune_users($user_ids, $usernames); $this->get_prune_users($user_ids, $usernames);
if (sizeof($user_ids)) if (count($user_ids))
{ {
if ($action == 'deactivate') if ($action == 'deactivate')
{ {
@ -291,7 +315,7 @@ class acp_prune
$user_ids = $usernames = array(); $user_ids = $usernames = array();
$this->get_prune_users($user_ids, $usernames); $this->get_prune_users($user_ids, $usernames);
if (!sizeof($user_ids)) if (!count($user_ids))
{ {
trigger_error($user->lang['USER_PRUNE_FAILURE'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['USER_PRUNE_FAILURE'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
@ -434,7 +458,7 @@ class acp_prune
} }
// implicit else when both arrays are empty do nothing // implicit else when both arrays are empty do nothing
if ((sizeof($active) && sizeof($active) != 3) || (sizeof($joined_before) && sizeof($joined_before) != 3) || (sizeof($joined_after) && sizeof($joined_after) != 3)) if ((count($active) && count($active) != 3) || (count($joined_before) && count($joined_before) != 3) || (count($joined_after) && count($joined_after) != 3))
{ {
trigger_error($user->lang['WRONG_ACTIVE_JOINED_DATE'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['WRONG_ACTIVE_JOINED_DATE'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
@ -448,15 +472,15 @@ class acp_prune
$where_sql .= ($count !== false) ? " AND user_posts " . $key_match[$count_select] . ' ' . (int) $count . ' ' : ''; $where_sql .= ($count !== false) ? " AND user_posts " . $key_match[$count_select] . ' ' . (int) $count . ' ' : '';
// First handle pruning of users who never logged in, last active date is 0000-00-00 // First handle pruning of users who never logged in, last active date is 0000-00-00
if (sizeof($active) && (int) $active[0] == 0 && (int) $active[1] == 0 && (int) $active[2] == 0) if (count($active) && (int) $active[0] == 0 && (int) $active[1] == 0 && (int) $active[2] == 0)
{ {
$where_sql .= ' AND user_lastvisit = 0'; $where_sql .= ' AND user_lastvisit = 0';
} }
else if (sizeof($active) && $active_select != 'lt') else if (count($active) && $active_select != 'lt')
{ {
$where_sql .= ' AND user_lastvisit ' . $key_match[$active_select] . ' ' . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]); $where_sql .= ' AND user_lastvisit ' . $key_match[$active_select] . ' ' . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]);
} }
else if (sizeof($active)) else if (count($active))
{ {
$where_sql .= ' AND (user_lastvisit > 0 AND user_lastvisit < ' . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]) . ')'; $where_sql .= ' AND (user_lastvisit > 0 AND user_lastvisit < ' . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]) . ')';
} }

View file

@ -103,7 +103,7 @@ class acp_reasons
} }
} }
if (!sizeof($error)) if (!count($error))
{ {
// New reason? // New reason?
if ($action == 'add') if ($action == 'add')
@ -171,7 +171,7 @@ class acp_reasons
'L_TITLE' => $user->lang['REASON_' . $l_title], 'L_TITLE' => $user->lang['REASON_' . $l_title],
'U_ACTION' => $this->u_action . "&amp;id=$reason_id&amp;action=$action", 'U_ACTION' => $this->u_action . "&amp;id=$reason_id&amp;action=$action",
'U_BACK' => $this->u_action, 'U_BACK' => $this->u_action,
'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '', 'ERROR_MSG' => (count($error)) ? implode('<br />', $error) : '',
'REASON_TITLE' => $reason_row['reason_title'], 'REASON_TITLE' => $reason_row['reason_title'],
'REASON_DESCRIPTION' => $reason_row['reason_description'], 'REASON_DESCRIPTION' => $reason_row['reason_description'],
@ -182,7 +182,7 @@ class acp_reasons
'S_AVAILABLE_TITLES' => implode($user->lang['COMMA_SEPARATOR'], array_map('htmlspecialchars', array_keys($user->lang['report_reasons']['TITLE']))), 'S_AVAILABLE_TITLES' => implode($user->lang['COMMA_SEPARATOR'], array_map('htmlspecialchars', array_keys($user->lang['report_reasons']['TITLE']))),
'S_EDIT_REASON' => true, 'S_EDIT_REASON' => true,
'S_TRANSLATED' => $translated, 'S_TRANSLATED' => $translated,
'S_ERROR' => (sizeof($error)) ? true : false, 'S_ERROR' => (count($error)) ? true : false,
) )
); );

View file

@ -332,9 +332,9 @@ class acp_search
$forum_ids[] = $row['forum_id']; $forum_ids[] = $row['forum_id'];
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$row_count += sizeof($ids); $row_count += count($ids);
if (sizeof($ids)) if (count($ids))
{ {
$this->search->index_remove($ids, $posters, $forum_ids); $this->search->index_remove($ids, $posters, $forum_ids);
} }
@ -349,7 +349,7 @@ class acp_search
$totaltime = microtime(true) - $starttime; $totaltime = microtime(true) - $starttime;
$rows_per_second = $row_count / $totaltime; $rows_per_second = $row_count / $totaltime;
meta_refresh(1, append_sid($this->u_action . '&amp;action=delete&amp;skip_rows=' . $post_counter . '&amp;hash=' . generate_link_hash('acp_search'))); meta_refresh(1, append_sid($this->u_action . '&amp;action=delete&amp;skip_rows=' . $post_counter . '&amp;hash=' . generate_link_hash('acp_search')));
trigger_error($user->lang('SEARCH_INDEX_DELETE_REDIRECT', (int) $row_count, $post_counter, $rows_per_second)); trigger_error($user->lang('SEARCH_INDEX_DELETE_REDIRECT', (int) $row_count, $post_counter) . $user->lang('SEARCH_INDEX_DELETE_REDIRECT_RATE', $rows_per_second));
} }
} }
@ -474,8 +474,8 @@ class acp_search
$statistics = array(); $statistics = array();
foreach ($data as $statistic => $value) foreach ($data as $statistic => $value)
{ {
$n = sizeof($statistics); $n = count($statistics);
if ($n && sizeof($statistics[$n - 1]) < 3) if ($n && count($statistics[$n - 1]) < 3)
{ {
$statistics[$n - 1] += array('statistic_2' => $statistic, 'value_2' => $value); $statistics[$n - 1] += array('statistic_2' => $statistic, 'value_2' => $value);
} }
@ -492,7 +492,7 @@ class acp_search
'S_ACTIVE' => ($type == $config['search_type']) ? true : false, 'S_ACTIVE' => ($type == $config['search_type']) ? true : false,
'S_HIDDEN_FIELDS' => build_hidden_fields(array('search_type' => $type)), 'S_HIDDEN_FIELDS' => build_hidden_fields(array('search_type' => $type)),
'S_INDEXED' => (bool) $search->index_created(), 'S_INDEXED' => (bool) $search->index_created(),
'S_STATS' => (bool) sizeof($statistics)) 'S_STATS' => (bool) count($statistics))
); );
foreach ($statistics as $statistic) foreach ($statistics as $statistic)

View file

@ -259,6 +259,19 @@ class acp_styles
// Get list of styles to uninstall // Get list of styles to uninstall
$ids = $this->request_vars('id', 0, true); $ids = $this->request_vars('id', 0, true);
// Don't remove prosilver, you can still deactivate it.
$sql = 'SELECT style_id
FROM ' . STYLES_TABLE . "
WHERE style_name = '" . $this->db->sql_escape('prosilver') . "'";
$result = $this->db->sql_query($sql);
$prosilver_id = (int) $this->db->sql_fetchfield('style_id');
$this->db->sql_freeresult($result);
if ($prosilver_id && in_array($prosilver_id, $ids))
{
trigger_error($this->user->lang('UNINSTALL_PROSILVER') . adm_back_link($this->u_action), E_USER_WARNING);
}
// Check if confirmation box was submitted // Check if confirmation box was submitted
if (confirm_box(true)) if (confirm_box(true))
{ {
@ -398,7 +411,7 @@ class acp_styles
// Reset default style for users who use selected styles // Reset default style for users who use selected styles
$sql = 'UPDATE ' . USERS_TABLE . ' $sql = 'UPDATE ' . USERS_TABLE . '
SET user_style = 0 SET user_style = ' . (int) $this->default_style . '
WHERE user_style IN (' . implode(', ', $ids) . ')'; WHERE user_style IN (' . implode(', ', $ids) . ')';
$this->db->sql_query($sql); $this->db->sql_query($sql);
@ -952,6 +965,7 @@ class acp_styles
// Style data // Style data
'STYLE_ID' => $style['style_id'], 'STYLE_ID' => $style['style_id'],
'STYLE_NAME' => htmlspecialchars($style['style_name']), 'STYLE_NAME' => htmlspecialchars($style['style_name']),
'STYLE_PHPBB_VERSION' => $this->read_style_cfg($style['style_path'])['phpbb_version'],
'STYLE_PATH' => htmlspecialchars($style['style_path']), 'STYLE_PATH' => htmlspecialchars($style['style_path']),
'STYLE_COPYRIGHT' => strip_tags($style['style_copyright']), 'STYLE_COPYRIGHT' => strip_tags($style['style_copyright']),
'STYLE_ACTIVE' => $style['style_active'], 'STYLE_ACTIVE' => $style['style_active'],
@ -997,11 +1011,14 @@ class acp_styles
'L_ACTION' => $this->user->lang['EXPORT'] 'L_ACTION' => $this->user->lang['EXPORT']
); */ ); */
// Uninstall if ($style['style_name'] !== 'prosilver')
$actions[] = array( {
'U_ACTION' => $this->u_action . '&amp;action=uninstall&amp;hash=' . generate_link_hash('uninstall') . '&amp;id=' . $style['style_id'], // Uninstall
'L_ACTION' => $this->user->lang['STYLE_UNINSTALL'] $actions[] = array(
); 'U_ACTION' => $this->u_action . '&amp;action=uninstall&amp;hash=' . generate_link_hash('uninstall') . '&amp;id=' . $style['style_id'],
'L_ACTION' => $this->user->lang['STYLE_UNINSTALL']
);
}
// Preview // Preview
$actions[] = array( $actions[] = array(
@ -1122,7 +1139,14 @@ class acp_styles
*/ */
protected function read_style_cfg($dir) protected function read_style_cfg($dir)
{ {
// This should never happen, we give them a red warning because of its relevance.
if (!file_exists($this->styles_path . $dir . '/style.cfg'))
{
trigger_error($this->user->lang('NO_STYLE_CFG', $dir), E_USER_WARNING);
}
static $required = array('name', 'phpbb_version', 'copyright'); static $required = array('name', 'phpbb_version', 'copyright');
$cfg = parse_cfg_file($this->styles_path . $dir . '/style.cfg'); $cfg = parse_cfg_file($this->styles_path . $dir . '/style.cfg');
// Check if it is a valid file // Check if it is a valid file
@ -1249,7 +1273,7 @@ class acp_styles
// Change default style for users // Change default style for users
$sql = 'UPDATE ' . USERS_TABLE . ' $sql = 'UPDATE ' . USERS_TABLE . '
SET user_style = 0 SET user_style = ' . (int) $this->default_style . '
WHERE user_style = ' . $id; WHERE user_style = ' . $id;
$this->db->sql_query($sql); $this->db->sql_query($sql);
@ -1355,18 +1379,18 @@ class acp_styles
} }
// Hardcoded template bitfield to add for new templates // Hardcoded template bitfield to add for new templates
$default_bitfield = '1111111111111';
$bitfield = new bitfield(); $bitfield = new bitfield();
$bitfield->set(0); for ($i = 0; $i < strlen($default_bitfield); $i++)
$bitfield->set(1); {
$bitfield->set(2); if ($default_bitfield[$i] == '1')
$bitfield->set(3); {
$bitfield->set(4); $bitfield->set($i);
$bitfield->set(8); }
$bitfield->set(9); }
$bitfield->set(11);
$bitfield->set(12); return $bitfield->get_base64();
$value = $bitfield->get_base64();
return $value;
} }
} }

View file

@ -59,17 +59,19 @@ class acp_update
$update_link = $phpbb_root_path . 'install/app.' . $phpEx; $update_link = $phpbb_root_path . 'install/app.' . $phpEx;
$template->assign_vars(array( $template_ary = [
'S_UP_TO_DATE' => empty($updates_available), 'S_UP_TO_DATE' => empty($updates_available),
'U_ACTION' => $this->u_action, 'U_ACTION' => $this->u_action,
'U_VERSIONCHECK_FORCE' => append_sid($this->u_action . '&amp;versioncheck_force=1'), 'U_VERSIONCHECK_FORCE' => append_sid($this->u_action . '&amp;versioncheck_force=1'),
'CURRENT_VERSION' => $config['version'], 'CURRENT_VERSION' => $config['version'],
'UPDATE_INSTRUCTIONS' => sprintf($user->lang['UPDATE_INSTRUCTIONS'], $update_link), 'UPDATE_INSTRUCTIONS' => $user->lang('UPDATE_INSTRUCTIONS', $update_link),
'S_VERSION_UPGRADEABLE' => !empty($upgrades_available), 'S_VERSION_UPGRADEABLE' => !empty($upgrades_available),
'UPGRADE_INSTRUCTIONS' => !empty($upgrades_available) ? $user->lang('UPGRADE_INSTRUCTIONS', $upgrades_available['current'], $upgrades_available['announcement']) : false, 'UPGRADE_INSTRUCTIONS' => !empty($upgrades_available) ? $user->lang('UPGRADE_INSTRUCTIONS', $upgrades_available['current'], $upgrades_available['announcement']) : false,
)); ];
$template->assign_vars($template_ary);
// Incomplete update? // Incomplete update?
if (phpbb_version_compare($config['version'], PHPBB_VERSION, '<')) if (phpbb_version_compare($config['version'], PHPBB_VERSION, '<'))

View file

@ -24,9 +24,9 @@ class acp_users
var $u_action; var $u_action;
var $p_master; var $p_master;
function acp_users(&$p_master) function __construct($p_master)
{ {
$this->p_master = &$p_master; $this->p_master = $p_master;
} }
function main($id, $mode) function main($id, $mode)
@ -690,7 +690,7 @@ class acp_users
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($topic_id_ary)) if (count($topic_id_ary))
{ {
$sql = 'SELECT topic_id, forum_id, topic_title, topic_posts_approved, topic_posts_unapproved, topic_posts_softdeleted, topic_attachment $sql = 'SELECT topic_id, forum_id, topic_title, topic_posts_approved, topic_posts_unapproved, topic_posts_softdeleted, topic_attachment
FROM ' . TOPICS_TABLE . ' FROM ' . TOPICS_TABLE . '
@ -718,12 +718,12 @@ class acp_users
} }
// Entire topic comprises posts by this user, move these topics // Entire topic comprises posts by this user, move these topics
if (sizeof($move_topic_ary)) if (count($move_topic_ary))
{ {
move_topics($move_topic_ary, $new_forum_id, false); move_topics($move_topic_ary, $new_forum_id, false);
} }
if (sizeof($move_post_ary)) if (count($move_post_ary))
{ {
// Create new topic // Create new topic
// Update post_ids, report_ids, attachment_ids // Update post_ids, report_ids, attachment_ids
@ -769,13 +769,13 @@ class acp_users
$forum_id_ary = array_unique($forum_id_ary); $forum_id_ary = array_unique($forum_id_ary);
$topic_id_ary = array_unique(array_merge(array_keys($topic_id_ary), $new_topic_id_ary)); $topic_id_ary = array_unique(array_merge(array_keys($topic_id_ary), $new_topic_id_ary));
if (sizeof($topic_id_ary)) if (count($topic_id_ary))
{ {
sync('topic_reported', 'topic_id', $topic_id_ary); sync('topic_reported', 'topic_id', $topic_id_ary);
sync('topic', 'topic_id', $topic_id_ary); sync('topic', 'topic_id', $topic_id_ary);
} }
if (sizeof($forum_id_ary)) if (count($forum_id_ary))
{ {
sync('forum', 'forum_id', $forum_id_ary, false, true); sync('forum', 'forum_id', $forum_id_ary, false, true);
} }
@ -855,7 +855,7 @@ class acp_users
$check_ary += array( $check_ary += array(
'username' => array( 'username' => array(
array('string', false, $config['min_name_chars'], $config['max_name_chars']), array('string', false, $config['min_name_chars'], $config['max_name_chars']),
array('username', $user_row['username']) array('username', $user_row['username'], true)
), ),
); );
} }
@ -892,7 +892,7 @@ class acp_users
$update_password = $data['new_password'] && !$passwords_manager->check($data['new_password'], $user_row['user_password']); $update_password = $data['new_password'] && !$passwords_manager->check($data['new_password'], $user_row['user_password']);
$update_email = ($data['email'] != $user_row['user_email']) ? $data['email'] : false; $update_email = ($data['email'] != $user_row['user_email']) ? $data['email'] : false;
if (!sizeof($error)) if (!count($error))
{ {
$sql_ary = array(); $sql_ary = array();
@ -994,7 +994,7 @@ class acp_users
)); ));
} }
if (sizeof($sql_ary)) if (count($sql_ary))
{ {
$sql = 'UPDATE ' . USERS_TABLE . ' $sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
@ -1347,7 +1347,7 @@ class acp_users
{ {
$s_hidden_fields['delall'] = 1; $s_hidden_fields['delall'] = 1;
} }
if (isset($_POST['delall']) || (isset($_POST['delmarked']) && sizeof($marked))) if (isset($_POST['delall']) || (isset($_POST['delmarked']) && count($marked)))
{ {
confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields($s_hidden_fields)); confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields($s_hidden_fields));
} }
@ -1383,9 +1383,9 @@ class acp_users
{ {
// Check if there are more occurrences of % than arguments, if there are we fill out the arguments array // Check if there are more occurrences of % than arguments, if there are we fill out the arguments array
// It doesn't matter if we add more arguments than placeholders // It doesn't matter if we add more arguments than placeholders
if ((substr_count($row['action'], '%') - sizeof($log_data_ary)) > 0) if ((substr_count($row['action'], '%') - count($log_data_ary)) > 0)
{ {
$log_data_ary = array_merge($log_data_ary, array_fill(0, substr_count($row['action'], '%') - sizeof($log_data_ary), '')); $log_data_ary = array_merge($log_data_ary, array_fill(0, substr_count($row['action'], '%') - count($log_data_ary), ''));
} }
$row['action'] = vsprintf($row['action'], $log_data_ary); $row['action'] = vsprintf($row['action'], $log_data_ary);
$row['action'] = bbcode_nl2br(censor_text($row['action'])); $row['action'] = bbcode_nl2br(censor_text($row['action']));
@ -1478,7 +1478,7 @@ class acp_users
// validate custom profile fields // validate custom profile fields
$cp->submit_cp_field('profile', $user_row['iso_lang_id'], $cp_data, $cp_error); $cp->submit_cp_field('profile', $user_row['iso_lang_id'], $cp_data, $cp_error);
if (sizeof($cp_error)) if (count($cp_error))
{ {
$error = array_merge($error, $cp_error); $error = array_merge($error, $cp_error);
} }
@ -1501,7 +1501,7 @@ class acp_users
$vars = array('data', 'user_id', 'user_row', 'error'); $vars = array('data', 'user_id', 'user_row', 'error');
extract($phpbb_dispatcher->trigger_event('core.acp_users_profile_validate', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_users_profile_validate', compact($vars)));
if (!sizeof($error)) if (!count($error))
{ {
$sql_ary = array( $sql_ary = array(
'user_jabber' => $data['jabber'], 'user_jabber' => $data['jabber'],
@ -1645,7 +1645,7 @@ class acp_users
$error[] = 'FORM_INVALID'; $error[] = 'FORM_INVALID';
} }
if (!sizeof($error)) if (!count($error))
{ {
$this->optionset($user_row, 'viewimg', $data['view_images']); $this->optionset($user_row, 'viewimg', $data['view_images']);
$this->optionset($user_row, 'viewflash', $data['view_flash']); $this->optionset($user_row, 'viewflash', $data['view_flash']);
@ -1696,7 +1696,7 @@ class acp_users
$vars = array('data', 'user_row', 'sql_ary', 'error'); $vars = array('data', 'user_row', 'sql_ary', 'error');
extract($phpbb_dispatcher->trigger_event('core.acp_users_prefs_modify_sql', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_users_prefs_modify_sql', compact($vars)));
if (!sizeof($error)) if (!count($error))
{ {
$sql = 'UPDATE ' . USERS_TABLE . ' $sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
@ -1883,6 +1883,17 @@ class acp_users
'user_avatar_height' => $result['avatar_height'], 'user_avatar_height' => $result['avatar_height'],
); );
/**
* Modify users preferences data before assigning it to the template
*
* @event core.acp_users_avatar_sql
* @var array user_row Array with user data
* @var array result Array with user avatar data to be updated in the DB
* @since 3.2.4-RC1
*/
$vars = array('user_row', 'result');
extract($phpbb_dispatcher->trigger_event('core.acp_users_avatar_sql', compact($vars)));
$sql = 'UPDATE ' . USERS_TABLE . ' $sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $result) . ' SET ' . $db->sql_build_array('UPDATE', $result) . '
WHERE user_id = ' . (int) $user_id; WHERE user_id = ' . (int) $user_id;
@ -2060,7 +2071,7 @@ class acp_users
'sig' 'sig'
); );
if (sizeof($warn_msg)) if (count($warn_msg))
{ {
$error += $warn_msg; $error += $warn_msg;
} }
@ -2072,7 +2083,7 @@ class acp_users
} }
else else
{ {
if (!sizeof($error)) if (!count($error))
{ {
$this->optionset($user_row, 'sig_bbcode', $enable_bbcode); $this->optionset($user_row, 'sig_bbcode', $enable_bbcode);
$this->optionset($user_row, 'sig_smilies', $enable_smilies); $this->optionset($user_row, 'sig_smilies', $enable_smilies);
@ -2085,6 +2096,17 @@ class acp_users
'user_sig_bbcode_bitfield' => $bbcode_bitfield, 'user_sig_bbcode_bitfield' => $bbcode_bitfield,
); );
/**
* Modify user signature before it is stored in the DB
*
* @event core.acp_users_modify_signature_sql_ary
* @var array user_row Array with user data
* @var array sql_ary Array with user signature data to be updated in the DB
* @since 3.2.4-RC1
*/
$vars = array('user_row', 'sql_ary');
extract($phpbb_dispatcher->trigger_event('core.acp_users_modify_signature_sql_ary', compact($vars)));
$sql = 'UPDATE ' . USERS_TABLE . ' $sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
WHERE user_id = ' . $user_id; WHERE user_id = ' . $user_id;
@ -2099,7 +2121,7 @@ class acp_users
if ($request->is_set_post('preview')) if ($request->is_set_post('preview'))
{ {
$decoded_message = generate_text_for_edit($signature, $bbcode_uid, $bbcode_bitfield); $decoded_message = generate_text_for_edit($signature, $bbcode_uid, $bbcode_flags);
} }
/** @var \phpbb\controller\helper $controller_helper */ /** @var \phpbb\controller\helper $controller_helper */
@ -2147,7 +2169,7 @@ class acp_users
$sort_key = $request->variable('sk', 'a'); $sort_key = $request->variable('sk', 'a');
$sort_dir = $request->variable('sd', 'd'); $sort_dir = $request->variable('sd', 'd');
if ($deletemark && sizeof($marked)) if ($deletemark && count($marked))
{ {
$sql = 'SELECT attach_id $sql = 'SELECT attach_id
FROM ' . ATTACHMENTS_TABLE . ' FROM ' . ATTACHMENTS_TABLE . '
@ -2164,7 +2186,7 @@ class acp_users
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
if ($deletemark && sizeof($marked)) if ($deletemark && count($marked))
{ {
if (confirm_box(true)) if (confirm_box(true))
{ {
@ -2185,7 +2207,7 @@ class acp_users
$attachment_manager->delete('attach', $marked); $attachment_manager->delete('attach', $marked);
unset($attachment_manager); unset($attachment_manager);
$message = (sizeof($log_attachments) == 1) ? $user->lang['ATTACHMENT_DELETED'] : $user->lang['ATTACHMENTS_DELETED']; $message = (count($log_attachments) == 1) ? $user->lang['ATTACHMENT_DELETED'] : $user->lang['ATTACHMENTS_DELETED'];
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACHMENTS_DELETED', false, array(implode($user->lang['COMMA_SEPARATOR'], $log_attachments))); $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACHMENTS_DELETED', false, array(implode($user->lang['COMMA_SEPARATOR'], $log_attachments)));
trigger_error($message . adm_back_link($this->u_action . '&amp;u=' . $user_id)); trigger_error($message . adm_back_link($this->u_action . '&amp;u=' . $user_id));
@ -2455,7 +2477,7 @@ class acp_users
// Select box for other groups // Select box for other groups
$sql = 'SELECT group_id, group_name, group_type, group_founder_manage $sql = 'SELECT group_id, group_name, group_type, group_founder_manage
FROM ' . GROUPS_TABLE . ' FROM ' . GROUPS_TABLE . '
' . ((sizeof($id_ary)) ? 'WHERE ' . $db->sql_in_set('group_id', $id_ary, true) : '') . ' ' . ((count($id_ary)) ? 'WHERE ' . $db->sql_in_set('group_id', $id_ary, true) : '') . '
ORDER BY group_type DESC, group_name ASC'; ORDER BY group_type DESC, group_name ASC';
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
@ -2497,7 +2519,7 @@ class acp_users
'U_DELETE' => $this->u_action . "&amp;action=delete&amp;u=$user_id&amp;g=" . $data['group_id'], 'U_DELETE' => $this->u_action . "&amp;action=delete&amp;u=$user_id&amp;g=" . $data['group_id'],
'U_APPROVE' => ($group_type == 'pending') ? $this->u_action . "&amp;action=approve&amp;u=$user_id&amp;g=" . $data['group_id'] : '', 'U_APPROVE' => ($group_type == 'pending') ? $this->u_action . "&amp;action=approve&amp;u=$user_id&amp;g=" . $data['group_id'] : '',
'GROUP_NAME' => ($group_type == 'special') ? $user->lang['G_' . $data['group_name']] : $data['group_name'], 'GROUP_NAME' => $group_helper->get_name($data['group_name']),
'L_DEMOTE_PROMOTE' => ($data['group_leader']) ? $user->lang['GROUP_DEMOTE'] : $user->lang['GROUP_PROMOTE'], 'L_DEMOTE_PROMOTE' => ($data['group_leader']) ? $user->lang['GROUP_DEMOTE'] : $user->lang['GROUP_PROMOTE'],
'S_IS_MEMBER' => ($group_type != 'pending') ? true : false, 'S_IS_MEMBER' => ($group_type != 'pending') ? true : false,
@ -2604,8 +2626,8 @@ class acp_users
// Assign general variables // Assign general variables
$template->assign_vars(array( $template->assign_vars(array(
'S_ERROR' => (sizeof($error)) ? true : false, 'S_ERROR' => (count($error)) ? true : false,
'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '') 'ERROR_MSG' => (count($error)) ? implode('<br />', $error) : '')
); );
} }

View file

@ -27,7 +27,7 @@ class auth_admin extends \phpbb\auth\auth
/** /**
* Init auth settings * Init auth settings
*/ */
function auth_admin() function __construct()
{ {
global $db, $cache; global $db, $cache;
@ -107,7 +107,7 @@ class auth_admin extends \phpbb\auth\auth
$compare_options = array_diff(preg_replace('/^((?!' . $auth_option . ').+)|(' . $auth_option . ')$/', '', array_keys($this->acl_options[$scope])), array('')); $compare_options = array_diff(preg_replace('/^((?!' . $auth_option . ').+)|(' . $auth_option . ')$/', '', array_keys($this->acl_options[$scope])), array(''));
// If forum_ids is false and the scope is local we actually want to have all forums within the array // If forum_ids is false and the scope is local we actually want to have all forums within the array
if ($scope == 'local' && !sizeof($forum_ids)) if ($scope == 'local' && !count($forum_ids))
{ {
$sql = 'SELECT forum_id $sql = 'SELECT forum_id
FROM ' . FORUMS_TABLE; FROM ' . FORUMS_TABLE;
@ -177,9 +177,9 @@ class auth_admin extends \phpbb\auth\auth
// Now, we need to fill the gaps with $acl_fill. ;) // Now, we need to fill the gaps with $acl_fill. ;)
// Now switch back to keys // Now switch back to keys
if (sizeof($compare_options)) if (count($compare_options))
{ {
$compare_options = array_combine($compare_options, array_fill(1, sizeof($compare_options), $acl_fill)); $compare_options = array_combine($compare_options, array_fill(1, count($compare_options), $acl_fill));
} }
// Defining the user-function here to save some memory // Defining the user-function here to save some memory
@ -189,7 +189,7 @@ class auth_admin extends \phpbb\auth\auth
}; };
// Actually fill the gaps // Actually fill the gaps
if (sizeof($hold_ary)) if (count($hold_ary))
{ {
foreach ($hold_ary as $ug_id => $row) foreach ($hold_ary as $ug_id => $row)
{ {
@ -356,7 +356,7 @@ class auth_admin extends \phpbb\auth\auth
// Build js roles array (role data assignments) // Build js roles array (role data assignments)
$s_role_js_array = ''; $s_role_js_array = '';
if (sizeof($roles)) if (count($roles))
{ {
$s_role_js_array = array(); $s_role_js_array = array();
@ -422,7 +422,7 @@ class auth_admin extends \phpbb\auth\auth
// If we only have one forum id to display or being in local mode and more than one user/group to display, // If we only have one forum id to display or being in local mode and more than one user/group to display,
// we switch the complete interface to group by user/usergroup instead of grouping by forum // we switch the complete interface to group by user/usergroup instead of grouping by forum
// To achieve this, we need to switch the array a bit // To achieve this, we need to switch the array a bit
if (sizeof($forum_ids) == 1 || ($local && sizeof($ug_names_ary) > 1)) if (count($forum_ids) == 1 || ($local && count($ug_names_ary) > 1))
{ {
$hold_ary_temp = $hold_ary; $hold_ary_temp = $hold_ary;
$hold_ary = array(); $hold_ary = array();
@ -453,9 +453,9 @@ class auth_admin extends \phpbb\auth\auth
'S_LOCAL' => ($local) ? true : false, 'S_LOCAL' => ($local) ? true : false,
'S_GLOBAL' => (!$local) ? true : false, 'S_GLOBAL' => (!$local) ? true : false,
'S_NUM_CATS' => sizeof($categories), 'S_NUM_CATS' => count($categories),
'S_VIEW' => ($mode == 'view') ? true : false, 'S_VIEW' => ($mode == 'view') ? true : false,
'S_NUM_OBJECTS' => sizeof($content_array), 'S_NUM_OBJECTS' => count($content_array),
'S_USER_MODE' => ($user_mode == 'user') ? true : false, 'S_USER_MODE' => ($user_mode == 'user') ? true : false,
'S_GROUP_MODE' => ($user_mode == 'group') ? true : false) 'S_GROUP_MODE' => ($user_mode == 'group') ? true : false)
); );
@ -546,15 +546,15 @@ class auth_admin extends \phpbb\auth\auth
'NAME' => $ug_name, 'NAME' => $ug_name,
'CATEGORIES' => implode('</th><th>', $categories), 'CATEGORIES' => implode('</th><th>', $categories),
'USER_GROUPS_DEFAULT' => ($user_mode == 'user' && isset($user_groups_default[$ug_id]) && sizeof($user_groups_default[$ug_id])) ? implode($user->lang['COMMA_SEPARATOR'], $user_groups_default[$ug_id]) : '', 'USER_GROUPS_DEFAULT' => ($user_mode == 'user' && isset($user_groups_default[$ug_id]) && count($user_groups_default[$ug_id])) ? implode($user->lang['COMMA_SEPARATOR'], $user_groups_default[$ug_id]) : '',
'USER_GROUPS_CUSTOM' => ($user_mode == 'user' && isset($user_groups_custom[$ug_id]) && sizeof($user_groups_custom[$ug_id])) ? implode($user->lang['COMMA_SEPARATOR'], $user_groups_custom[$ug_id]) : '', 'USER_GROUPS_CUSTOM' => ($user_mode == 'user' && isset($user_groups_custom[$ug_id]) && count($user_groups_custom[$ug_id])) ? implode($user->lang['COMMA_SEPARATOR'], $user_groups_custom[$ug_id]) : '',
'L_ACL_TYPE' => $l_acl_type, 'L_ACL_TYPE' => $l_acl_type,
'S_LOCAL' => ($local) ? true : false, 'S_LOCAL' => ($local) ? true : false,
'S_GLOBAL' => (!$local) ? true : false, 'S_GLOBAL' => (!$local) ? true : false,
'S_NUM_CATS' => sizeof($categories), 'S_NUM_CATS' => count($categories),
'S_VIEW' => ($mode == 'view') ? true : false, 'S_VIEW' => ($mode == 'view') ? true : false,
'S_NUM_OBJECTS' => sizeof($content_array), 'S_NUM_OBJECTS' => count($content_array),
'S_USER_MODE' => ($user_mode == 'user') ? true : false, 'S_USER_MODE' => ($user_mode == 'user') ? true : false,
'S_GROUP_MODE' => ($user_mode == 'group') ? true : false) 'S_GROUP_MODE' => ($user_mode == 'group') ? true : false)
); );
@ -637,7 +637,7 @@ class auth_admin extends \phpbb\auth\auth
global $db, $template, $user, $phpbb_root_path, $phpEx; global $db, $template, $user, $phpbb_root_path, $phpEx;
global $phpbb_container; global $phpbb_container;
if (!sizeof($hold_ary)) if (!count($hold_ary))
{ {
return; return;
} }
@ -669,7 +669,7 @@ class auth_admin extends \phpbb\auth\auth
'FORUM_ID' => $forum_id) 'FORUM_ID' => $forum_id)
); );
if (isset($auth_ary['users']) && sizeof($auth_ary['users'])) if (isset($auth_ary['users']) && count($auth_ary['users']))
{ {
$sql = 'SELECT user_id, username $sql = 'SELECT user_id, username
FROM ' . USERS_TABLE . ' FROM ' . USERS_TABLE . '
@ -688,7 +688,7 @@ class auth_admin extends \phpbb\auth\auth
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
if (isset($auth_ary['groups']) && sizeof($auth_ary['groups'])) if (isset($auth_ary['groups']) && count($auth_ary['groups']))
{ {
$sql = 'SELECT group_id, group_name, group_type $sql = 'SELECT group_id, group_name, group_type
FROM ' . GROUPS_TABLE . ' FROM ' . GROUPS_TABLE . '
@ -819,7 +819,7 @@ class auth_admin extends \phpbb\auth\auth
// Because we just changed the options and also purged the options cache, we instantly update/regenerate it for later calls to succeed. // Because we just changed the options and also purged the options cache, we instantly update/regenerate it for later calls to succeed.
$this->acl_options = array(); $this->acl_options = array();
$this->auth_admin(); $this->__construct();
return true; return true;
} }
@ -890,7 +890,7 @@ class auth_admin extends \phpbb\auth\auth
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($role_ids)) if (count($role_ids))
{ {
$sql = "DELETE FROM $table $sql = "DELETE FROM $table
WHERE $forum_sql WHERE $forum_sql
@ -1000,7 +1000,7 @@ class auth_admin extends \phpbb\auth\auth
} }
// If no data is there, we set the any-flag to ACL_NEVER... // If no data is there, we set the any-flag to ACL_NEVER...
if (!sizeof($sql_ary)) if (!count($sql_ary))
{ {
$sql_ary[] = array( $sql_ary[] = array(
'role_id' => (int) $role_id, 'role_id' => (int) $role_id,
@ -1083,7 +1083,7 @@ class auth_admin extends \phpbb\auth\auth
$db->sql_freeresult($result); $db->sql_freeresult($result);
// Get role data for resetting data // Get role data for resetting data
if (sizeof($cur_role_auth)) if (count($cur_role_auth))
{ {
$sql = 'SELECT ao.auth_option, rd.role_id, rd.auth_setting $sql = 'SELECT ao.auth_option, rd.role_id, rd.auth_setting
FROM ' . ACL_OPTIONS_TABLE . ' ao, ' . ACL_ROLES_DATA_TABLE . ' rd FROM ' . ACL_OPTIONS_TABLE . ' ao, ' . ACL_ROLES_DATA_TABLE . ' rd

View file

@ -35,9 +35,18 @@ class bbcode
/** /**
* Constructor * Constructor
* Init bbcode cache entries if bitfield is specified
*/ */
function bbcode($bitfield = '') function __construct($bitfield = '')
{
$this->bbcode_set_bitfield($bitfield);
}
/**
* Init bbcode cache entries if bitfield is specified
*
* @param string $bbcode_bitfield The bbcode bitfield
*/
function bbcode_set_bitfield($bitfield = '')
{ {
if ($bitfield) if ($bitfield)
{ {
@ -94,13 +103,13 @@ class bbcode
${$type}['replace'][] = $replace; ${$type}['replace'][] = $replace;
} }
if (sizeof($str['search'])) if (count($str['search']))
{ {
$message = str_replace($str['search'], $str['replace'], $message); $message = str_replace($str['search'], $str['replace'], $message);
$str = array('search' => array(), 'replace' => array()); $str = array('search' => array(), 'replace' => array());
} }
if (sizeof($preg['search'])) if (count($preg['search']))
{ {
// we need to turn the entities back into their original form to allow the // we need to turn the entities back into their original form to allow the
// search patterns to work properly // search patterns to work properly
@ -191,7 +200,7 @@ class bbcode
} }
} }
if (sizeof($sql)) if (count($sql))
{ {
global $db; global $db;

View file

@ -29,7 +29,7 @@ function register_compatibility_globals()
{ {
global $phpbb_container; global $phpbb_container;
global $cache, $phpbb_dispatcher, $request, $user, $auth, $db, $config, $phpbb_log; global $cache, $phpbb_dispatcher, $request, $user, $auth, $db, $config, $language, $phpbb_log;
global $symfony_request, $phpbb_filesystem, $phpbb_path_helper, $phpbb_extension_manager, $template; global $symfony_request, $phpbb_filesystem, $phpbb_path_helper, $phpbb_extension_manager, $template;
// set up caching // set up caching
@ -48,6 +48,9 @@ function register_compatibility_globals()
/* @var $user \phpbb\user */ /* @var $user \phpbb\user */
$user = $phpbb_container->get('user'); $user = $phpbb_container->get('user');
/* @var \phpbb\language\language $language */
$language = $phpbb_container->get('language');
/* @var $auth \phpbb\auth\auth */ /* @var $auth \phpbb\auth\auth */
$auth = $phpbb_container->get('auth'); $auth = $phpbb_container->get('auth');

View file

@ -28,7 +28,7 @@ if (!defined('IN_PHPBB'))
*/ */
// phpBB Version // phpBB Version
@define('PHPBB_VERSION', '3.2.2-dev'); @define('PHPBB_VERSION', '3.2.9-dev');
// QA-related // QA-related
// define('PHPBB_QA', 1); // define('PHPBB_QA', 1);

View file

@ -50,7 +50,7 @@ class diff
* @param array &$to_content An array of strings. * @param array &$to_content An array of strings.
* @param bool $preserve_cr If true, \r is replaced by a new line in the diff output * @param bool $preserve_cr If true, \r is replaced by a new line in the diff output
*/ */
function diff(&$from_content, &$to_content, $preserve_cr = true) function __construct(&$from_content, &$to_content, $preserve_cr = true)
{ {
$diff_engine = new diff_engine(); $diff_engine = new diff_engine();
$this->_edits = $diff_engine->diff($from_content, $to_content, $preserve_cr); $this->_edits = $diff_engine->diff($from_content, $to_content, $preserve_cr);
@ -75,7 +75,7 @@ class diff
{ {
$count = 0; $count = 0;
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
@ -98,7 +98,7 @@ class diff
{ {
$count = 0; $count = 0;
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
@ -136,7 +136,7 @@ class diff
$rev->_edits = array(); $rev->_edits = array();
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
$rev->_edits[] = $edit->reverse(); $rev->_edits[] = $edit->reverse();
@ -152,7 +152,7 @@ class diff
*/ */
function is_empty() function is_empty()
{ {
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
@ -168,8 +168,8 @@ class diff
$final = $edit->final; $final = $edit->final;
// We can simplify one case where the array is usually supposed to be empty... // We can simplify one case where the array is usually supposed to be empty...
if (sizeof($orig) == 1 && trim($orig[0]) === '') $orig = array(); if (count($orig) == 1 && trim($orig[0]) === '') $orig = array();
if (sizeof($final) == 1 && trim($final[0]) === '') $final = array(); if (count($final) == 1 && trim($final[0]) === '') $final = array();
if (!$orig && !$final) if (!$orig && !$final)
{ {
@ -196,13 +196,13 @@ class diff
{ {
$lcs = 0; $lcs = 0;
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
if (is_a($edit, 'diff_op_copy')) if (is_a($edit, 'diff_op_copy'))
{ {
$lcs += sizeof($edit->orig); $lcs += count($edit->orig);
} }
} }
return $lcs; return $lcs;
@ -219,13 +219,13 @@ class diff
{ {
$lines = array(); $lines = array();
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
if ($edit->orig) if ($edit->orig)
{ {
array_splice($lines, sizeof($lines), 0, $edit->orig); array_splice($lines, count($lines), 0, $edit->orig);
} }
} }
return $lines; return $lines;
@ -242,13 +242,13 @@ class diff
{ {
$lines = array(); $lines = array();
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
if ($edit->final) if ($edit->final)
{ {
array_splice($lines, sizeof($lines), 0, $edit->final); array_splice($lines, count($lines), 0, $edit->final);
} }
} }
return $lines; return $lines;
@ -296,7 +296,7 @@ class diff
$prevtype = null; $prevtype = null;
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
@ -330,30 +330,30 @@ class mapped_diff extends diff
* compared when computing the diff. * compared when computing the diff.
* @param array $mapped_to_lines This array should have the same number of elements as $to_lines. * @param array $mapped_to_lines This array should have the same number of elements as $to_lines.
*/ */
function mapped_diff(&$from_lines, &$to_lines, &$mapped_from_lines, &$mapped_to_lines) function __construct(&$from_lines, &$to_lines, &$mapped_from_lines, &$mapped_to_lines)
{ {
if (sizeof($from_lines) != sizeof($mapped_from_lines) || sizeof($to_lines) != sizeof($mapped_to_lines)) if (count($from_lines) != count($mapped_from_lines) || count($to_lines) != count($mapped_to_lines))
{ {
return false; return false;
} }
parent::diff($mapped_from_lines, $mapped_to_lines); parent::__construct($mapped_from_lines, $mapped_to_lines);
$xi = $yi = 0; $xi = $yi = 0;
for ($i = 0; $i < sizeof($this->_edits); $i++) for ($i = 0; $i < count($this->_edits); $i++)
{ {
$orig = &$this->_edits[$i]->orig; $orig = &$this->_edits[$i]->orig;
if (is_array($orig)) if (is_array($orig))
{ {
$orig = array_slice($from_lines, $xi, sizeof($orig)); $orig = array_slice($from_lines, $xi, count($orig));
$xi += sizeof($orig); $xi += count($orig);
} }
$final = &$this->_edits[$i]->final; $final = &$this->_edits[$i]->final;
if (is_array($final)) if (is_array($final))
{ {
$final = array_slice($to_lines, $yi, sizeof($final)); $final = array_slice($to_lines, $yi, count($final));
$yi += sizeof($final); $yi += count($final);
} }
} }
} }
@ -377,12 +377,12 @@ class diff_op
function norig() function norig()
{ {
return ($this->orig) ? sizeof($this->orig) : 0; return ($this->orig) ? count($this->orig) : 0;
} }
function nfinal() function nfinal()
{ {
return ($this->final) ? sizeof($this->final) : 0; return ($this->final) ? count($this->final) : 0;
} }
} }
@ -394,7 +394,7 @@ class diff_op
*/ */
class diff_op_copy extends diff_op class diff_op_copy extends diff_op
{ {
function diff_op_copy($orig, $final = false) function __construct($orig, $final = false)
{ {
if (!is_array($final)) if (!is_array($final))
{ {
@ -419,7 +419,7 @@ class diff_op_copy extends diff_op
*/ */
class diff_op_delete extends diff_op class diff_op_delete extends diff_op
{ {
function diff_op_delete($lines) function __construct($lines)
{ {
$this->orig = $lines; $this->orig = $lines;
$this->final = false; $this->final = false;
@ -440,7 +440,7 @@ class diff_op_delete extends diff_op
*/ */
class diff_op_add extends diff_op class diff_op_add extends diff_op
{ {
function diff_op_add($lines) function __construct($lines)
{ {
$this->final = $lines; $this->final = $lines;
$this->orig = false; $this->orig = false;
@ -461,7 +461,7 @@ class diff_op_add extends diff_op
*/ */
class diff_op_change extends diff_op class diff_op_change extends diff_op
{ {
function diff_op_change($orig, $final) function __construct($orig, $final)
{ {
$this->orig = $orig; $this->orig = $orig;
$this->final = $final; $this->final = $final;
@ -498,7 +498,7 @@ class diff3 extends diff
* @param bool $preserve_cr If true, \r\n and bare \r are replaced by a new line * @param bool $preserve_cr If true, \r\n and bare \r are replaced by a new line
* in the diff output * in the diff output
*/ */
function diff3(&$orig, &$final1, &$final2, $preserve_cr = true) function __construct(&$orig, &$final1, &$final2, $preserve_cr = true)
{ {
$diff_engine = new diff_engine(); $diff_engine = new diff_engine();
@ -517,7 +517,7 @@ class diff3 extends diff
{ {
$conflicts = 0; $conflicts = 0;
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
@ -550,7 +550,7 @@ class diff3 extends diff
$lines = array(); $lines = array();
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
@ -590,7 +590,7 @@ class diff3 extends diff
{ {
$lines = array(); $lines = array();
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
@ -614,7 +614,7 @@ class diff3 extends diff
{ {
$lines = array(); $lines = array();
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
@ -638,7 +638,7 @@ class diff3 extends diff
{ {
$conflicts = array(); $conflicts = array();
for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++) for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{ {
$edit = $this->_edits[$i]; $edit = $this->_edits[$i];
@ -754,7 +754,7 @@ class diff3 extends diff
*/ */
class diff3_op class diff3_op
{ {
function diff3_op($orig = false, $final1 = false, $final2 = false) function __construct($orig = false, $final1 = false, $final2 = false)
{ {
$this->orig = $orig ? $orig : array(); $this->orig = $orig ? $orig : array();
$this->final1 = $final1 ? $final1 : array(); $this->final1 = $final1 ? $final1 : array();
@ -803,9 +803,9 @@ class diff3_op
function solve_prepare() function solve_prepare()
{ {
// We can simplify one case where the array is usually supposed to be empty... // We can simplify one case where the array is usually supposed to be empty...
if (sizeof($this->orig) == 1 && trim($this->orig[0]) === '') $this->orig = array(); if (count($this->orig) == 1 && trim($this->orig[0]) === '') $this->orig = array();
if (sizeof($this->final1) == 1 && trim($this->final1[0]) === '') $this->final1 = array(); if (count($this->final1) == 1 && trim($this->final1[0]) === '') $this->final1 = array();
if (sizeof($this->final2) == 1 && trim($this->final2[0]) === '') $this->final2 = array(); if (count($this->final2) == 1 && trim($this->final2[0]) === '') $this->final2 = array();
// Now we only can have the case where the only difference between arrays are newlines, so compare all cases // Now we only can have the case where the only difference between arrays are newlines, so compare all cases
@ -848,10 +848,10 @@ class diff3_op
$_final1 = &$this->$final1; $_final1 = &$this->$final1;
// Ok, we basically search for $orig in $final1 // Ok, we basically search for $orig in $final1
$compare_seq = sizeof($_orig); $compare_seq = count($_orig);
// Go through the conflict code // Go through the conflict code
for ($i = 0, $j = 0, $size = sizeof($_final1); $i < $size; $i++, $j = $i) for ($i = 0, $j = 0, $size = count($_final1); $i < $size; $i++, $j = $i)
{ {
$line = $_final1[$i]; $line = $_final1[$i];
$skip = 0; $skip = 0;
@ -895,7 +895,7 @@ class diff3_op
// CASE ONE: orig changed into final2, but modified/unknown code in final1. // CASE ONE: orig changed into final2, but modified/unknown code in final1.
// IF orig is found "as is" in final1 we replace the code directly in final1 and populate this as final2/merge // IF orig is found "as is" in final1 we replace the code directly in final1 and populate this as final2/merge
if (sizeof($this->orig) && sizeof($this->final2)) if (count($this->orig) && count($this->final2))
{ {
$result = $this->_compare_conflict_seq('orig', 'final1', 'final2'); $result = $this->_compare_conflict_seq('orig', 'final1', 'final2');
@ -915,7 +915,7 @@ class diff3_op
} }
// Try to solve $Id$ issues. ;) // Try to solve $Id$ issues. ;)
if (sizeof($this->orig) == 1 && sizeof($this->final1) == 1 && sizeof($this->final2) == 1) if (count($this->orig) == 1 && count($this->final1) == 1 && count($this->final2) == 1)
{ {
$match = '#^' . preg_quote('* @version $Id: ', '#') . '[a-z\._\- ]+[0-9]+ [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9\:Z]+ [a-z0-9_\- ]+\$$#'; $match = '#^' . preg_quote('* @version $Id: ', '#') . '[a-z\._\- ]+[0-9]+ [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9\:Z]+ [a-z0-9_\- ]+\$$#';
@ -939,9 +939,9 @@ class diff3_op
} }
// The same is true for a line at the end. ;) // The same is true for a line at the end. ;)
if (sizeof($this->orig) && sizeof($this->final2) && sizeof($this->orig) === sizeof($this->final2) && trim($this->orig[sizeof($this->orig)-1]) === '' && trim($this->final2[sizeof($this->final2)-1]) === '') if (count($this->orig) && count($this->final2) && count($this->orig) === count($this->final2) && trim($this->orig[count($this->orig)-1]) === '' && trim($this->final2[count($this->final2)-1]) === '')
{ {
unset($this->orig[sizeof($this->orig)-1], $this->final2[sizeof($this->final2)-1]); unset($this->orig[count($this->orig)-1], $this->final2[count($this->final2)-1]);
$this->orig = array_values($this->orig); $this->orig = array_values($this->orig);
$this->final2 = array_values($this->final2); $this->final2 = array_values($this->final2);
@ -972,7 +972,7 @@ class diff3_op
} }
// CASE TWO: Added lines from orig to final2 but final1 had added lines too. Just merge them. // CASE TWO: Added lines from orig to final2 but final1 had added lines too. Just merge them.
if (!sizeof($this->orig) && $this->final1 !== $this->final2 && sizeof($this->final1) && sizeof($this->final2)) if (!count($this->orig) && $this->final1 !== $this->final2 && count($this->final1) && count($this->final2))
{ {
$result = $this->_compare_conflict_seq('final2', 'final1'); $result = $this->_compare_conflict_seq('final2', 'final1');
@ -1001,7 +1001,7 @@ class diff3_op
} }
// CASE THREE: Removed lines (orig has the to-remove line(s), but final1 has additional lines which does not need to be removed). Just remove orig from final1 and then use final1 as final2/merge // CASE THREE: Removed lines (orig has the to-remove line(s), but final1 has additional lines which does not need to be removed). Just remove orig from final1 and then use final1 as final2/merge
if (!sizeof($this->final2) && sizeof($this->orig) && sizeof($this->final1) && $this->orig !== $this->final1) if (!count($this->final2) && count($this->orig) && count($this->final1) && $this->orig !== $this->final1)
{ {
$result = $this->_compare_conflict_seq('orig', 'final1'); $result = $this->_compare_conflict_seq('orig', 'final1');
@ -1011,11 +1011,11 @@ class diff3_op
} }
// First of all, try to find the code in orig in final1. ;) // First of all, try to find the code in orig in final1. ;)
$compare_seq = sizeof($this->orig); $compare_seq = count($this->orig);
$begin = $end = -1; $begin = $end = -1;
$j = 0; $j = 0;
for ($i = 0, $size = sizeof($this->final1); $i < $size; $i++) for ($i = 0, $size = count($this->final1); $i < $size; $i++)
{ {
$line = $this->final1[$i]; $line = $this->final1[$i];
@ -1066,7 +1066,7 @@ class diff3_op
*/ */
class diff3_op_copy extends diff3_op class diff3_op_copy extends diff3_op
{ {
function diff3_op_copy($lines = false) function __construct($lines = false)
{ {
$this->orig = $lines ? $lines : array(); $this->orig = $lines ? $lines : array();
$this->final1 = &$this->orig; $this->final1 = &$this->orig;
@ -1092,7 +1092,7 @@ class diff3_op_copy extends diff3_op
*/ */
class diff3_block_builder class diff3_block_builder
{ {
function diff3_block_builder() function __construct()
{ {
$this->_init(); $this->_init();
} }
@ -1147,6 +1147,6 @@ class diff3_block_builder
function _append(&$array, $lines) function _append(&$array, $lines)
{ {
array_splice($array, sizeof($array), 0, $lines); array_splice($array, count($array), 0, $lines);
} }
} }

View file

@ -84,8 +84,8 @@ class diff_engine
$to_lines = explode("\n", preg_replace('#[\n\r]+#', "\n", $to_lines)); $to_lines = explode("\n", preg_replace('#[\n\r]+#', "\n", $to_lines));
} }
$n_from = sizeof($from_lines); $n_from = count($from_lines);
$n_to = sizeof($to_lines); $n_to = count($to_lines);
$this->xchanged = $this->ychanged = $this->xv = $this->yv = $this->xind = $this->yind = array(); $this->xchanged = $this->ychanged = $this->xv = $this->yv = $this->xind = $this->yind = array();
unset($this->seq, $this->in_seq, $this->lcs); unset($this->seq, $this->in_seq, $this->lcs);
@ -145,7 +145,7 @@ class diff_engine
} }
// Find the LCS. // Find the LCS.
$this->_compareseq(0, sizeof($this->xv), 0, sizeof($this->yv)); $this->_compareseq(0, count($this->xv), 0, count($this->yv));
// Merge edits when possible. // Merge edits when possible.
if ($this->skip_whitespace_changes) if ($this->skip_whitespace_changes)
@ -444,8 +444,8 @@ class diff_engine
$i = 0; $i = 0;
$j = 0; $j = 0;
$len = sizeof($lines); $len = count($lines);
$other_len = sizeof($other_changed); $other_len = count($other_changed);
while (1) while (1)
{ {

View file

@ -56,7 +56,7 @@ class diff_renderer
/** /**
* Constructor. * Constructor.
*/ */
function diff_renderer($params = array()) function __construct($params = array())
{ {
foreach ($params as $param => $value) foreach ($params as $param => $value)
{ {
@ -128,8 +128,8 @@ class diff_renderer
if (is_array($block)) if (is_array($block))
{ {
// How many lines to keep as context from the copy block. // How many lines to keep as context from the copy block.
$keep = ($i == sizeof($diffs) - 1) ? $ntrail : $nlead + $ntrail; $keep = ($i == count($diffs) - 1) ? $ntrail : $nlead + $ntrail;
if (sizeof($edit->orig) <= $keep) if (count($edit->orig) <= $keep)
{ {
// We have less lines in the block than we want for context => keep the whole block. // We have less lines in the block than we want for context => keep the whole block.
$block[] = $edit; $block[] = $edit;
@ -156,9 +156,9 @@ class diff_renderer
if (!is_array($block)) if (!is_array($block))
{ {
// Extract context lines from the preceding copy block. // Extract context lines from the preceding copy block.
$context = array_slice($context, sizeof($context) - $nlead); $context = array_slice($context, count($context) - $nlead);
$x0 = $xi - sizeof($context); $x0 = $xi - count($context);
$y0 = $yi - sizeof($context); $y0 = $yi - count($context);
$block = array(); $block = array();
if ($context) if ($context)
@ -169,8 +169,8 @@ class diff_renderer
$block[] = $edit; $block[] = $edit;
} }
$xi += ($edit->orig) ? sizeof($edit->orig) : 0; $xi += ($edit->orig) ? count($edit->orig) : 0;
$yi += ($edit->final) ? sizeof($edit->final) : 0; $yi += ($edit->final) ? count($edit->final) : 0;
} }
if (is_array($block)) if (is_array($block))
@ -433,7 +433,7 @@ class diff_renderer_inline extends diff_renderer
{ {
array_walk($lines, array(&$this, '_encode')); array_walk($lines, array(&$this, '_encode'));
$lines[0] = $this->_ins_prefix . $lines[0]; $lines[0] = $this->_ins_prefix . $lines[0];
$lines[sizeof($lines) - 1] .= $this->_ins_suffix; $lines[count($lines) - 1] .= $this->_ins_suffix;
return $this->_lines($lines, ' ', false); return $this->_lines($lines, ' ', false);
} }
@ -441,7 +441,7 @@ class diff_renderer_inline extends diff_renderer
{ {
array_walk($lines, array(&$this, '_encode')); array_walk($lines, array(&$this, '_encode'));
$lines[0] = $this->_del_prefix . $lines[0]; $lines[0] = $this->_del_prefix . $lines[0];
$lines[sizeof($lines) - 1] .= $this->_del_suffix; $lines[count($lines) - 1] .= $this->_del_suffix;
return $this->_lines($lines, ' ', false); return $this->_lines($lines, ' ', false);
} }
@ -617,7 +617,7 @@ class diff_renderer_side_by_side extends diff_renderer
$this->render($diff); $this->render($diff);
// Is the diff empty? // Is the diff empty?
if (!sizeof($this->lines)) if (!count($this->lines))
{ {
$output .= '<tr><th colspan="2">' . $user->lang['NO_VISIBLE_CHANGES'] . '</th></tr>'; $output .= '<tr><th colspan="2">' . $user->lang['NO_VISIBLE_CHANGES'] . '</th></tr>';
} }
@ -672,8 +672,8 @@ class diff_renderer_side_by_side extends diff_renderer
case 'change': case 'change':
// Pop the old/new stacks one by one, until both are empty. // Pop the old/new stacks one by one, until both are empty.
$oldsize = sizeof($change['old']); $oldsize = count($change['old']);
$newsize = sizeof($change['new']); $newsize = count($change['new']);
$left = $right = ''; $left = $right = '';
for ($row = 0, $row_max = max($oldsize, $newsize); $row < $row_max; ++$row) for ($row = 0, $row_max = max($oldsize, $newsize); $row < $row_max; ++$row)

View file

@ -66,29 +66,48 @@ function set_var(&$result, $var, $type, $multibyte = false)
/** /**
* Generates an alphanumeric random string of given length * Generates an alphanumeric random string of given length
* *
* @param int $num_chars Length of random string, defaults to 8.
* This number should be less or equal than 64.
*
* @return string * @return string
*/ */
function gen_rand_string($num_chars = 8) function gen_rand_string($num_chars = 8)
{ {
// [a, z] + [0, 9] = 36 $range = array_merge(range('A', 'Z'), range(0, 9));
return substr(strtoupper(base_convert(unique_id(), 16, 36)), 0, $num_chars); $size = count($range);
$output = '';
for ($i = 0; $i < $num_chars; $i++)
{
$rand = random_int(0, $size-1);
$output .= $range[$rand];
}
return $output;
} }
/** /**
* Generates a user-friendly alphanumeric random string of given length * Generates a user-friendly alphanumeric random string of given length
* We remove 0 and O so users cannot confuse those in passwords etc. * We remove 0 and O so users cannot confuse those in passwords etc.
* *
* @param int $num_chars Length of random string, defaults to 8.
* This number should be less or equal than 64.
*
* @return string * @return string
*/ */
function gen_rand_string_friendly($num_chars = 8) function gen_rand_string_friendly($num_chars = 8)
{ {
$rand_str = unique_id(); $range = array_merge(range('A', 'N'), range('P', 'Z'), range(1, 9));
$size = count($range);
// Remove Z and Y from the base_convert(), replace 0 with Z and O with Y $output = '';
// [a, z] + [0, 9] - {z, y} = [a, z] + [0, 9] - {0, o} = 34 for ($i = 0; $i < $num_chars; $i++)
$rand_str = str_replace(array('0', 'O'), array('Z', 'Y'), strtoupper(base_convert($rand_str, 16, 34))); {
$rand = random_int(0, $size-1);
$output .= $range[$rand];
}
return substr($rand_str, 0, $num_chars); return $output;
} }
/** /**
@ -96,7 +115,7 @@ function gen_rand_string_friendly($num_chars = 8)
*/ */
function unique_id() function unique_id()
{ {
return bin2hex(random_bytes(8)); return strtolower(gen_rand_string(16));
} }
/** /**
@ -602,7 +621,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
if ($mode == 'all') if ($mode == 'all')
{ {
if ($forum_id === false || !sizeof($forum_id)) if (empty($forum_id))
{ {
// Mark all forums read (index page) // Mark all forums read (index page)
/* @var $phpbb_notifications \phpbb\notification\manager */ /* @var $phpbb_notifications \phpbb\notification\manager */
@ -661,8 +680,6 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
} }
} }
} }
return;
} }
else if ($mode == 'topics') else if ($mode == 'topics')
{ {
@ -727,7 +744,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($sql_update)) if (count($sql_update))
{ {
$sql = 'UPDATE ' . FORUMS_TRACK_TABLE . " $sql = 'UPDATE ' . FORUMS_TRACK_TABLE . "
SET mark_time = $post_time SET mark_time = $post_time
@ -789,8 +806,6 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
unset($tracking); unset($tracking);
} }
return;
} }
else if ($mode == 'topic') else if ($mode == 'topic')
{ {
@ -863,7 +878,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
// We get the ten most minimum stored time offsets and its associated topic ids // We get the ten most minimum stored time offsets and its associated topic ids
$time_keys = array(); $time_keys = array();
for ($i = 0; $i < 10 && sizeof($tracking['t']); $i++) for ($i = 0; $i < 10 && count($tracking['t']); $i++)
{ {
$min_value = min($tracking['t']); $min_value = min($tracking['t']);
$m_tkey = array_search($min_value, $tracking['t']); $m_tkey = array_search($min_value, $tracking['t']);
@ -904,8 +919,6 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
$user->set_cookie('track', tracking_serialize($tracking), $post_time + 31536000); $user->set_cookie('track', tracking_serialize($tracking), $post_time + 31536000);
$request->overwrite($config['cookie_name'] . '_track', tracking_serialize($tracking), \phpbb\request\request_interface::COOKIE); $request->overwrite($config['cookie_name'] . '_track', tracking_serialize($tracking), \phpbb\request\request_interface::COOKIE);
} }
return;
} }
else if ($mode == 'post') else if ($mode == 'post')
{ {
@ -930,9 +943,28 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
$db->sql_return_on_error(false); $db->sql_return_on_error(false);
} }
return;
} }
/**
* This event is used for performing actions directly after forums,
* topics or posts have been marked as read.
*
* @event core.markread_after
* @var string mode Variable containing marking mode value
* @var mixed forum_id Variable containing forum id, or false
* @var mixed topic_id Variable containing topic id, or false
* @var int post_time Variable containing post time
* @var int user_id Variable containing the user id
* @since 3.2.6-RC1
*/
$vars = array(
'mode',
'forum_id',
'topic_id',
'post_time',
'user_id',
);
extract($phpbb_dispatcher->trigger_event('core.markread_after', compact($vars)));
} }
/** /**
@ -959,7 +991,7 @@ function get_topic_tracking($forum_id, $topic_ids, &$rowset, $forum_mark_time, $
$topic_ids = array_diff($topic_ids, array_keys($last_read)); $topic_ids = array_diff($topic_ids, array_keys($last_read));
if (sizeof($topic_ids)) if (count($topic_ids))
{ {
$mark_time = array(); $mark_time = array();
@ -1011,7 +1043,7 @@ function get_complete_topic_tracking($forum_id, $topic_ids, $global_announce_lis
$topic_ids = array_diff($topic_ids, array_keys($last_read)); $topic_ids = array_diff($topic_ids, array_keys($last_read));
if (sizeof($topic_ids)) if (count($topic_ids))
{ {
$sql = 'SELECT forum_id, mark_time $sql = 'SELECT forum_id, mark_time
FROM ' . FORUMS_TRACK_TABLE . " FROM ' . FORUMS_TRACK_TABLE . "
@ -1038,7 +1070,7 @@ function get_complete_topic_tracking($forum_id, $topic_ids, $global_announce_lis
{ {
global $tracking_topics; global $tracking_topics;
if (!isset($tracking_topics) || !sizeof($tracking_topics)) if (!isset($tracking_topics) || !count($tracking_topics))
{ {
$tracking_topics = $request->variable($config['cookie_name'] . '_track', '', true, \phpbb\request\request_interface::COOKIE); $tracking_topics = $request->variable($config['cookie_name'] . '_track', '', true, \phpbb\request\request_interface::COOKIE);
$tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array(); $tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
@ -1065,7 +1097,7 @@ function get_complete_topic_tracking($forum_id, $topic_ids, $global_announce_lis
$topic_ids = array_diff($topic_ids, array_keys($last_read)); $topic_ids = array_diff($topic_ids, array_keys($last_read));
if (sizeof($topic_ids)) if (count($topic_ids))
{ {
$mark_time = array(); $mark_time = array();
@ -1407,7 +1439,7 @@ function tracking_unserialize($string, $max_depth = 3)
switch ($string[$i]) switch ($string[$i])
{ {
case '(': case '(':
if (sizeof($stack) >= $max_depth) if (count($stack) >= $max_depth)
{ {
die('Invalid data supplied'); die('Invalid data supplied');
} }
@ -1461,7 +1493,7 @@ function tracking_unserialize($string, $max_depth = 3)
} }
} }
if (sizeof($stack) != 0 || ($mode != 0 && $mode != 3)) if (count($stack) != 0 || ($mode != 0 && $mode != 3))
{ {
die('Invalid data supplied'); die('Invalid data supplied');
} }
@ -1725,14 +1757,14 @@ function redirect($url, $return = false, $disable_cd_check = false)
if ($url_parts === false) if ($url_parts === false)
{ {
// Malformed url // Malformed url
trigger_error('INSECURE_REDIRECT', E_USER_ERROR); trigger_error('INSECURE_REDIRECT', E_USER_WARNING);
} }
else if (!empty($url_parts['scheme']) && !empty($url_parts['host'])) else if (!empty($url_parts['scheme']) && !empty($url_parts['host']))
{ {
// Attention: only able to redirect within the same domain if $disable_cd_check is false (yourdomain.com -> www.yourdomain.com will not work) // Attention: only able to redirect within the same domain if $disable_cd_check is false (yourdomain.com -> www.yourdomain.com will not work)
if (!$disable_cd_check && $url_parts['host'] !== $user->host) if (!$disable_cd_check && $url_parts['host'] !== $user->host)
{ {
trigger_error('INSECURE_REDIRECT', E_USER_ERROR); trigger_error('INSECURE_REDIRECT', E_USER_WARNING);
} }
} }
else if ($url[0] == '/') else if ($url[0] == '/')
@ -1772,13 +1804,13 @@ function redirect($url, $return = false, $disable_cd_check = false)
if (!$disable_cd_check && strpos($url, generate_board_url(true) . '/') !== 0) if (!$disable_cd_check && strpos($url, generate_board_url(true) . '/') !== 0)
{ {
trigger_error('INSECURE_REDIRECT', E_USER_ERROR); trigger_error('INSECURE_REDIRECT', E_USER_WARNING);
} }
// Make sure no linebreaks are there... to prevent http response splitting for PHP < 4.4.2 // Make sure no linebreaks are there... to prevent http response splitting for PHP < 4.4.2
if (strpos(urldecode($url), "\n") !== false || strpos(urldecode($url), "\r") !== false || strpos($url, ';') !== false) if (strpos(urldecode($url), "\n") !== false || strpos(urldecode($url), "\r") !== false || strpos($url, ';') !== false)
{ {
trigger_error('INSECURE_REDIRECT', E_USER_ERROR); trigger_error('INSECURE_REDIRECT', E_USER_WARNING);
} }
// Now, also check the protocol and for a valid url the last time... // Now, also check the protocol and for a valid url the last time...
@ -1787,7 +1819,7 @@ function redirect($url, $return = false, $disable_cd_check = false)
if ($url_parts === false || empty($url_parts['scheme']) || !in_array($url_parts['scheme'], $allowed_protocols)) if ($url_parts === false || empty($url_parts['scheme']) || !in_array($url_parts['scheme'], $allowed_protocols))
{ {
trigger_error('INSECURE_REDIRECT', E_USER_ERROR); trigger_error('INSECURE_REDIRECT', E_USER_WARNING);
} }
/** /**
@ -1811,27 +1843,6 @@ function redirect($url, $return = false, $disable_cd_check = false)
garbage_collection(); garbage_collection();
} }
// Redirect via an HTML form for PITA webservers
if (@preg_match('#WebSTAR|Xitami#', getenv('SERVER_SOFTWARE')))
{
header('Refresh: 0; URL=' . $url);
echo '<!DOCTYPE html>';
echo '<html dir="' . $user->lang['DIRECTION'] . '" lang="' . $user->lang['USER_LANG'] . '">';
echo '<head>';
echo '<meta charset="utf-8">';
echo '<meta http-equiv="X-UA-Compatible" content="IE=edge">';
echo '<meta http-equiv="refresh" content="0; url=' . str_replace('&', '&amp;', $url) . '" />';
echo '<title>' . $user->lang['REDIRECT'] . '</title>';
echo '</head>';
echo '<body>';
echo '<div style="text-align: center;">' . sprintf($user->lang['URL_REDIRECT'], '<a href="' . str_replace('&', '&amp;', $url) . '">', '</a>') . '</div>';
echo '</body>';
echo '</html>';
exit;
}
// Behave as per HTTP/1.1 spec for others // Behave as per HTTP/1.1 spec for others
header('Location: ' . $url); header('Location: ' . $url);
exit; exit;
@ -2111,25 +2122,29 @@ function check_form_key($form_name, $timespan = false)
/** /**
* Build Confirm box * Build Confirm box
* @param boolean $check True for checking if confirmed (without any additional parameters) and false for displaying the confirm box * @param boolean $check True for checking if confirmed (without any additional parameters) and false for displaying the confirm box
* @param string $title Title/Message used for confirm box. * @param string|array $title Title/Message used for confirm box.
* message text is _CONFIRM appended to title. * message text is _CONFIRM appended to title.
* If title cannot be found in user->lang a default one is displayed * If title cannot be found in user->lang a default one is displayed
* If title_CONFIRM cannot be found in user->lang the text given is used. * If title_CONFIRM cannot be found in user->lang the text given is used.
* If title is an array, the first array value is used as explained per above,
* all other array values are sent as parameters to the language function.
* @param string $hidden Hidden variables * @param string $hidden Hidden variables
* @param string $html_body Template used for confirm box * @param string $html_body Template used for confirm box
* @param string $u_action Custom form action * @param string $u_action Custom form action
*
* @return bool True if confirmation was successful, false if not
*/ */
function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_body.html', $u_action = '') function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_body.html', $u_action = '')
{ {
global $user, $template, $db, $request; global $user, $template, $db, $request;
global $config, $phpbb_path_helper; global $config, $language, $phpbb_path_helper, $phpbb_dispatcher;
if (isset($_POST['cancel'])) if (isset($_POST['cancel']))
{ {
return false; return false;
} }
$confirm = ($user->lang['YES'] === $request->variable('confirm', '', true, \phpbb\request\request_interface::POST)); $confirm = ($language->lang('YES') === $request->variable('confirm', '', true, \phpbb\request\request_interface::POST));
if ($check && $confirm) if ($check && $confirm)
{ {
@ -2163,13 +2178,27 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
// generate activation key // generate activation key
$confirm_key = gen_rand_string(10); $confirm_key = gen_rand_string(10);
if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin']) // generate language strings
if (is_array($title))
{ {
adm_page_header((!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang[$title]); $key = array_shift($title);
$count = array_shift($title);
$confirm_title = $language->is_set($key) ? $language->lang($key, $count, $title) : $language->lang('CONFIRM');
$confirm_text = $language->is_set($key . '_CONFIRM') ? $language->lang($key . '_CONFIRM', $count, $title) : $key;
} }
else else
{ {
page_header((!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang[$title]); $confirm_title = $language->is_set($title) ? $language->lang($title) : $language->lang('CONFIRM');
$confirm_text = $language->is_set($title . '_CONFIRM') ? $language->lang($title . '_CONFIRM') : $title;
}
if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin'])
{
adm_page_header($confirm_title);
}
else
{
page_header($confirm_title);
} }
$template->set_filenames(array( $template->set_filenames(array(
@ -2185,14 +2214,14 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
// re-add sid / transform & to &amp; for user->page (user->page is always using &) // re-add sid / transform & to &amp; for user->page (user->page is always using &)
$use_page = ($u_action) ? $u_action : str_replace('&', '&amp;', $user->page['page']); $use_page = ($u_action) ? $u_action : str_replace('&', '&amp;', $user->page['page']);
$u_action = reapply_sid($phpbb_path_helper->get_valid_page($use_page, $config['enable_mod_rewrite']), $phpbb_path_helper->is_router_used()); $u_action = reapply_sid($phpbb_path_helper->get_valid_page($use_page, $config['enable_mod_rewrite']));
$u_action .= ((strpos($u_action, '?') === false) ? '?' : '&amp;') . 'confirm_key=' . $confirm_key; $u_action .= ((strpos($u_action, '?') === false) ? '?' : '&amp;') . 'confirm_key=' . $confirm_key;
$template->assign_vars(array( $template->assign_vars(array(
'MESSAGE_TITLE' => (!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang($title, 1), 'MESSAGE_TITLE' => $confirm_title,
'MESSAGE_TEXT' => (!isset($user->lang[$title . '_CONFIRM'])) ? $title : $user->lang[$title . '_CONFIRM'], 'MESSAGE_TEXT' => $confirm_text,
'YES_VALUE' => $user->lang['YES'], 'YES_VALUE' => $language->lang('YES'),
'S_CONFIRM_ACTION' => $u_action, 'S_CONFIRM_ACTION' => $u_action,
'S_HIDDEN_FIELDS' => $hidden . $s_hidden_fields, 'S_HIDDEN_FIELDS' => $hidden . $s_hidden_fields,
'S_AJAX_REQUEST' => $request->is_ajax(), 'S_AJAX_REQUEST' => $request->is_ajax(),
@ -2205,16 +2234,36 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
if ($request->is_ajax()) if ($request->is_ajax())
{ {
$u_action .= '&confirm_uid=' . $user->data['user_id'] . '&sess=' . $user->session_id . '&sid=' . $user->session_id; $u_action .= '&confirm_uid=' . $user->data['user_id'] . '&sess=' . $user->session_id . '&sid=' . $user->session_id;
$json_response = new \phpbb\json_response; $data = array(
$json_response->send(array(
'MESSAGE_BODY' => $template->assign_display('body'), 'MESSAGE_BODY' => $template->assign_display('body'),
'MESSAGE_TITLE' => (!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang[$title], 'MESSAGE_TITLE' => $confirm_title,
'MESSAGE_TEXT' => (!isset($user->lang[$title . '_CONFIRM'])) ? $title : $user->lang[$title . '_CONFIRM'], 'MESSAGE_TEXT' => $confirm_text,
'YES_VALUE' => $user->lang['YES'], 'YES_VALUE' => $language->lang('YES'),
'S_CONFIRM_ACTION' => str_replace('&amp;', '&', $u_action), //inefficient, rewrite whole function 'S_CONFIRM_ACTION' => str_replace('&amp;', '&', $u_action), //inefficient, rewrite whole function
'S_HIDDEN_FIELDS' => $hidden . $s_hidden_fields 'S_HIDDEN_FIELDS' => $hidden . $s_hidden_fields
)); );
/**
* This event allows an extension to modify the ajax output of confirm box.
*
* @event core.confirm_box_ajax_before
* @var string u_action Action of the form
* @var array data Data to be sent
* @var string hidden Hidden fields generated by caller
* @var string s_hidden_fields Hidden fields generated by this function
* @since 3.2.8-RC1
*/
$vars = array(
'u_action',
'data',
'hidden',
's_hidden_fields',
);
extract($phpbb_dispatcher->trigger_event('core.confirm_box_ajax_before', compact($vars)));
$json_response = new \phpbb\json_response;
$json_response->send($data);
} }
if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin']) if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin'])
@ -2225,6 +2274,8 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
{ {
page_footer(); page_footer();
} }
exit; // unreachable, page_footer() above will call exit()
} }
/** /**
@ -2236,6 +2287,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
global $request, $phpbb_container, $phpbb_dispatcher, $phpbb_log; global $request, $phpbb_container, $phpbb_dispatcher, $phpbb_log;
$err = ''; $err = '';
$form_name = 'login';
// Make sure user->setup() has been called // Make sure user->setup() has been called
if (!$user->is_setup()) if (!$user->is_setup())
@ -2311,8 +2363,19 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
trigger_error('NO_AUTH_ADMIN_USER_DIFFER'); trigger_error('NO_AUTH_ADMIN_USER_DIFFER');
} }
// If authentication is successful we redirect user to previous page // Check form key
$result = $auth->login($username, $password, $autologin, $viewonline, $admin); if ($password && !defined('IN_CHECK_BAN') && !check_form_key($form_name))
{
$result = array(
'status' => false,
'error_msg' => 'FORM_INVALID',
);
}
else
{
// If authentication is successful we redirect user to previous page
$result = $auth->login($username, $password, $autologin, $viewonline, $admin);
}
// If admin authentication and login, we will log if it was a success or not... // If admin authentication and login, we will log if it was a success or not...
// We also break the operation on the first non-success login - it could be argued that the user already knows // We also break the operation on the first non-success login - it could be argued that the user already knows
@ -2344,10 +2407,12 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
* @event core.login_box_redirect * @event core.login_box_redirect
* @var string redirect Redirect string * @var string redirect Redirect string
* @var bool admin Is admin? * @var bool admin Is admin?
* @var array result Result from auth provider
* @since 3.1.0-RC5 * @since 3.1.0-RC5
* @changed 3.1.9-RC1 Removed undefined return variable * @changed 3.1.9-RC1 Removed undefined return variable
* @changed 3.2.4-RC1 Added result
*/ */
$vars = array('redirect', 'admin'); $vars = array('redirect', 'admin', 'result');
extract($phpbb_dispatcher->trigger_event('core.login_box_redirect', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.login_box_redirect', compact($vars)));
// append/replace SID (may change during the session for AOL users) // append/replace SID (may change during the session for AOL users)
@ -2463,7 +2528,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
$s_hidden_fields = build_hidden_fields($s_hidden_fields); $s_hidden_fields = build_hidden_fields($s_hidden_fields);
$template->assign_vars(array( $login_box_template_data = array(
'LOGIN_ERROR' => $err, 'LOGIN_ERROR' => $err,
'LOGIN_EXPLAIN' => $l_explain, 'LOGIN_EXPLAIN' => $l_explain,
@ -2471,6 +2536,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
'U_RESEND_ACTIVATION' => ($config['require_activation'] == USER_ACTIVATION_SELF && $config['email_enable']) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=resend_act') : '', 'U_RESEND_ACTIVATION' => ($config['require_activation'] == USER_ACTIVATION_SELF && $config['email_enable']) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=resend_act') : '',
'U_TERMS_USE' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=terms'), 'U_TERMS_USE' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=terms'),
'U_PRIVACY' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy'), 'U_PRIVACY' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy'),
'UA_PRIVACY' => addslashes(append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy')),
'S_DISPLAY_FULL_LOGIN' => ($s_display) ? true : false, 'S_DISPLAY_FULL_LOGIN' => ($s_display) ? true : false,
'S_HIDDEN_FIELDS' => $s_hidden_fields, 'S_HIDDEN_FIELDS' => $s_hidden_fields,
@ -2480,7 +2546,29 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
'USERNAME_CREDENTIAL' => 'username', 'USERNAME_CREDENTIAL' => 'username',
'PASSWORD_CREDENTIAL' => ($admin) ? 'password_' . $credential : 'password', 'PASSWORD_CREDENTIAL' => ($admin) ? 'password_' . $credential : 'password',
)); );
/**
* Event to add/modify login box template data
*
* @event core.login_box_modify_template_data
* @var int admin Flag whether user is admin
* @var string username User name
* @var int autologin Flag whether autologin is enabled
* @var string redirect Redirect URL
* @var array login_box_template_data Array with the login box template data
* @since 3.2.3-RC2
*/
$vars = array(
'admin',
'username',
'autologin',
'redirect',
'login_box_template_data',
);
extract($phpbb_dispatcher->trigger_event('core.login_box_modify_template_data', compact($vars)));
$template->assign_vars($login_box_template_data);
page_header($user->lang['LOGIN']); page_header($user->lang['LOGIN']);
@ -2497,7 +2585,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
*/ */
function login_forum_box($forum_data) function login_forum_box($forum_data)
{ {
global $db, $phpbb_container, $request, $template, $user, $phpbb_dispatcher; global $db, $phpbb_container, $request, $template, $user, $phpbb_dispatcher, $phpbb_root_path, $phpEx;
$password = $request->variable('password', '', true); $password = $request->variable('password', '', true);
@ -2582,6 +2670,8 @@ function login_forum_box($forum_data)
'body' => 'login_forum.html') 'body' => 'login_forum.html')
); );
make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"), $forum_data['forum_id']);
page_footer(); page_footer();
} }
@ -2676,9 +2766,9 @@ function parse_cfg_file($filename, $lines = false)
{ {
$value = ''; $value = '';
} }
else if (($value[0] == "'" && $value[sizeof($value) - 1] == "'") || ($value[0] == '"' && $value[sizeof($value) - 1] == '"')) else if (($value[0] == "'" && $value[strlen($value) - 1] == "'") || ($value[0] == '"' && $value[strlen($value) - 1] == '"'))
{ {
$value = htmlspecialchars(substr($value, 1, sizeof($value)-2)); $value = htmlspecialchars(substr($value, 1, strlen($value)-2));
} }
else else
{ {
@ -2780,12 +2870,17 @@ function get_preg_expression($mode)
case 'url': case 'url':
// generated with regex_idn.php file in the develop folder // generated with regex_idn.php file in the develop folder
return "[a-z][a-z\d+\-.]*:/{2}(?:(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?"; return "[a-z][a-z\d+\-.]*(?<!javascript):/{2}(?:(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?";
break;
case 'url_http':
// generated with regex_idn.php file in the develop folder
return "http[s]?:/{2}(?:(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?";
break; break;
case 'url_inline': case 'url_inline':
// generated with regex_idn.php file in the develop folder // generated with regex_idn.php file in the develop folder
return "[a-z][a-z\d+]*:/{2}(?:(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?"; return "[a-z][a-z\d+]*(?<!javascript):/{2}(?:(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?";
break; break;
case 'www_url': case 'www_url':
@ -3007,7 +3102,7 @@ function phpbb_inet_pton($address)
if (preg_match(get_preg_expression('ipv6'), $address)) if (preg_match(get_preg_expression('ipv6'), $address))
{ {
$parts = explode(':', $address); $parts = explode(':', $address);
$missing_parts = 8 - sizeof($parts) + 1; $missing_parts = 8 - count($parts) + 1;
if (substr($address, 0, 2) === '::') if (substr($address, 0, 2) === '::')
{ {
@ -3024,7 +3119,7 @@ function phpbb_inet_pton($address)
if (preg_match(get_preg_expression('ipv4'), $last_part)) if (preg_match(get_preg_expression('ipv4'), $last_part))
{ {
$parts[sizeof($parts) - 1] = ''; $parts[count($parts) - 1] = '';
$last_part = phpbb_inet_pton($last_part); $last_part = phpbb_inet_pton($last_part);
$embedded_ipv4 = true; $embedded_ipv4 = true;
--$missing_parts; --$missing_parts;
@ -3036,7 +3131,7 @@ function phpbb_inet_pton($address)
{ {
$ret .= str_pad($part, 4, '0', STR_PAD_LEFT); $ret .= str_pad($part, 4, '0', STR_PAD_LEFT);
} }
else if ($i && $i < sizeof($parts) - 1) else if ($i && $i < count($parts) - 1)
{ {
$ret .= str_repeat('0000', $missing_parts); $ret .= str_repeat('0000', $missing_parts);
} }
@ -3632,7 +3727,7 @@ function obtain_users_online_string($online_users, $item_id = 0, $item = 'forum'
// Need caps version of $item for language-strings // Need caps version of $item for language-strings
$item_caps = strtoupper($item); $item_caps = strtoupper($item);
if (sizeof($online_users['online_users'])) if (count($online_users['online_users']))
{ {
$sql_ary = array( $sql_ary = array(
'SELECT' => 'u.username, u.username_clean, u.user_id, u.user_type, u.user_allow_viewonline, u.user_colour', 'SELECT' => 'u.username, u.username_clean, u.user_id, u.user_type, u.user_allow_viewonline, u.user_colour',
@ -4030,9 +4125,9 @@ function phpbb_get_user_avatar($user_row, $alt = 'USER_AVATAR', $ignore_config =
* *
* @return string Avatar html * @return string Avatar html
*/ */
function phpbb_get_group_avatar($user_row, $alt = 'GROUP_AVATAR', $ignore_config = false, $lazy = false) function phpbb_get_group_avatar($group_row, $alt = 'GROUP_AVATAR', $ignore_config = false, $lazy = false)
{ {
$row = \phpbb\avatar\manager::clean_row($user_row, 'group'); $row = \phpbb\avatar\manager::clean_row($group_row, 'group');
return phpbb_get_avatar($row, $alt, $ignore_config, $lazy); return phpbb_get_avatar($row, $alt, $ignore_config, $lazy);
} }
@ -4337,6 +4432,23 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
$controller_helper = $phpbb_container->get('controller.helper'); $controller_helper = $phpbb_container->get('controller.helper');
$notification_mark_hash = generate_link_hash('mark_all_notifications_read'); $notification_mark_hash = generate_link_hash('mark_all_notifications_read');
$s_login_redirect = build_hidden_fields(array('redirect' => $phpbb_path_helper->remove_web_root_path(build_url())));
// Add form token for login box, in case page is presenting a login form.
add_form_key('login', '_LOGIN');
/**
* Workaround for missing template variable in pre phpBB 3.2.6 styles.
* @deprecated 3.2.7 (To be removed: 3.3.0-a1)
*/
$form_token_login = $template->retrieve_var('S_FORM_TOKEN_LOGIN');
if (!empty($form_token_login))
{
$s_login_redirect .= $form_token_login;
// Remove S_FORM_TOKEN_LOGIN as it's already appended to S_LOGIN_REDIRECT
$template->assign_var('S_FORM_TOKEN_LOGIN', '');
}
// The following assigns all _common_ variables that may be used at any point in a template. // The following assigns all _common_ variables that may be used at any point in a template.
$template->assign_vars(array( $template->assign_vars(array(
'SITENAME' => $config['sitename'], 'SITENAME' => $config['sitename'],
@ -4396,9 +4508,10 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
'U_SEARCH_ACTIVE_TOPICS'=> append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=active_topics'), 'U_SEARCH_ACTIVE_TOPICS'=> append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=active_topics'),
'U_DELETE_COOKIES' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=delete_cookies'), 'U_DELETE_COOKIES' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=delete_cookies'),
'U_CONTACT_US' => ($config['contact_admin_form_enable'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=contactadmin') : '', 'U_CONTACT_US' => ($config['contact_admin_form_enable'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=contactadmin') : '',
'U_TEAM' => ($user->data['user_id'] != ANONYMOUS && !$auth->acl_get('u_viewprofile')) ? '' : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=team'), 'U_TEAM' => (!$auth->acl_get('u_viewprofile')) ? '' : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=team'),
'U_TERMS_USE' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=terms'), 'U_TERMS_USE' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=terms'),
'U_PRIVACY' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy'), 'U_PRIVACY' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy'),
'UA_PRIVACY' => addslashes(append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy')),
'U_RESTORE_PERMISSIONS' => ($user->data['user_perm_from'] && $auth->acl_get('a_switchperm')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=restore_perm') : '', 'U_RESTORE_PERMISSIONS' => ($user->data['user_perm_from'] && $auth->acl_get('a_switchperm')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=restore_perm') : '',
'U_FEED' => $controller_helper->route('phpbb_feed_index'), 'U_FEED' => $controller_helper->route('phpbb_feed_index'),
@ -4425,7 +4538,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
'S_TOPIC_ID' => $topic_id, 'S_TOPIC_ID' => $topic_id,
'S_LOGIN_ACTION' => ((!defined('ADMIN_START')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login') : append_sid("{$phpbb_admin_path}index.$phpEx", false, true, $user->session_id)), 'S_LOGIN_ACTION' => ((!defined('ADMIN_START')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login') : append_sid("{$phpbb_admin_path}index.$phpEx", false, true, $user->session_id)),
'S_LOGIN_REDIRECT' => build_hidden_fields(array('redirect' => $phpbb_path_helper->remove_web_root_path(build_url()))), 'S_LOGIN_REDIRECT' => $s_login_redirect,
'S_ENABLE_FEEDS' => ($config['feed_enable']) ? true : false, 'S_ENABLE_FEEDS' => ($config['feed_enable']) ? true : false,
'S_ENABLE_FEEDS_OVERALL' => ($config['feed_overall']) ? true : false, 'S_ENABLE_FEEDS_OVERALL' => ($config['feed_overall']) ? true : false,
@ -4458,7 +4571,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
'S_COOKIE_NOTICE' => !empty($config['cookie_notice']), 'S_COOKIE_NOTICE' => !empty($config['cookie_notice']),
'T_THEME_NAME' => rawurlencode($user->style['style_path']), 'T_THEME_NAME' => rawurlencode($user->style['style_path']),
'T_THEME_LANG_NAME' => $user->data['user_lang'], 'T_THEME_LANG_NAME' => $user->lang_name,
'T_TEMPLATE_NAME' => $user->style['style_path'], 'T_TEMPLATE_NAME' => $user->style['style_path'],
'T_SUPER_TEMPLATE_NAME' => rawurlencode((isset($user->style['style_parent_tree']) && $user->style['style_parent_tree']) ? $user->style['style_parent_tree'] : $user->style['style_path']), 'T_SUPER_TEMPLATE_NAME' => rawurlencode((isset($user->style['style_parent_tree']) && $user->style['style_parent_tree']) ? $user->style['style_parent_tree'] : $user->style['style_path']),
'T_IMAGES' => 'images', 'T_IMAGES' => 'images',
@ -4476,12 +4589,13 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
if ($send_headers) if ($send_headers)
{ {
// An array of http headers that phpbb will set. The following event may override these. // An array of http headers that phpBB will set. The following event may override these.
$http_headers += array( $http_headers += array(
// application/xhtml+xml not used because of IE // application/xhtml+xml not used because of IE
'Content-type' => 'text/html; charset=UTF-8', 'Content-type' => 'text/html; charset=UTF-8',
'Cache-Control' => 'private, no-cache="set-cookie"', 'Cache-Control' => 'private, no-cache="set-cookie"',
'Expires' => gmdate('D, d M Y H:i:s', time()) . ' GMT', 'Expires' => gmdate('D, d M Y H:i:s', time()) . ' GMT',
'Referrer-Policy' => 'strict-origin-when-cross-origin',
); );
if (!empty($user->data['is_bot'])) if (!empty($user->data['is_bot']))
{ {

View file

@ -112,12 +112,13 @@ function adm_page_header($page_title)
'CONTAINER_EXCEPTION' => $phpbb_container->hasParameter('container_exception') ? $phpbb_container->getParameter('container_exception') : false, 'CONTAINER_EXCEPTION' => $phpbb_container->hasParameter('container_exception') ? $phpbb_container->getParameter('container_exception') : false,
)); ));
// An array of http headers that phpbb will set. The following event may override these. // An array of http headers that phpBB will set. The following event may override these.
$http_headers = array( $http_headers = array(
// application/xhtml+xml not used because of IE // application/xhtml+xml not used because of IE
'Content-type' => 'text/html; charset=UTF-8', 'Content-type' => 'text/html; charset=UTF-8',
'Cache-Control' => 'private, no-cache="set-cookie"', 'Cache-Control' => 'private, no-cache="set-cookie"',
'Expires' => gmdate('D, d M Y H:i:s', time()) . ' GMT', 'Expires' => gmdate('D, d M Y H:i:s', time()) . ' GMT',
'Referrer-Policy' => 'strict-origin-when-cross-origin',
); );
/** /**
@ -419,7 +420,7 @@ function build_cfg_template($tpl_type, $key, &$new_ary, $config_key, $vars)
*/ */
function validate_config_vars($config_vars, &$cfg_array, &$error) function validate_config_vars($config_vars, &$cfg_array, &$error)
{ {
global $phpbb_root_path, $user, $phpbb_dispatcher, $phpbb_filesystem; global $phpbb_root_path, $user, $phpbb_dispatcher, $phpbb_filesystem, $language;
$type = 0; $type = 0;
$min = 1; $min = 1;
@ -442,6 +443,16 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)
// Validate a bit. ;) (0 = type, 1 = min, 2= max) // Validate a bit. ;) (0 = type, 1 = min, 2= max)
switch ($validator[$type]) switch ($validator[$type])
{ {
case 'url':
$cfg_array[$config_name] = trim($cfg_array[$config_name]);
if (!empty($cfg_array[$config_name]) && !preg_match('#^' . get_preg_expression('url') . '$#iu', $cfg_array[$config_name]))
{
$error[] = $language->lang('URL_INVALID', $language->lang($config_definition['lang']));
}
// no break here
case 'string': case 'string':
$length = utf8_strlen($cfg_array[$config_name]); $length = utf8_strlen($cfg_array[$config_name]);
@ -564,9 +575,6 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)
$cfg_array[$config_name] = trim($destination); $cfg_array[$config_name] = trim($destination);
// Absolute file path
case 'absolute_path':
case 'absolute_path_writable':
// Path being relative (still prefixed by phpbb_root_path), but with the ability to escape the root dir... // Path being relative (still prefixed by phpbb_root_path), but with the ability to escape the root dir...
case 'path': case 'path':
case 'wpath': case 'wpath':
@ -585,7 +593,7 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)
break; break;
} }
$path = in_array($config_definition['validate'], array('wpath', 'path', 'rpath', 'rwpath')) ? $phpbb_root_path . $cfg_array[$config_name] : $cfg_array[$config_name]; $path = $phpbb_root_path . $cfg_array[$config_name];
if (!file_exists($path)) if (!file_exists($path))
{ {
@ -598,7 +606,7 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)
} }
// Check if the path is writable // Check if the path is writable
if ($config_definition['validate'] == 'wpath' || $config_definition['validate'] == 'rwpath' || $config_definition['validate'] === 'absolute_path_writable') if ($config_definition['validate'] == 'wpath' || $config_definition['validate'] == 'rwpath')
{ {
if (file_exists($path) && !$phpbb_filesystem->is_writable($path)) if (file_exists($path) && !$phpbb_filesystem->is_writable($path))
{ {

View file

@ -167,7 +167,7 @@ function size_select_options($size_compare)
$s_size_options = ''; $s_size_options = '';
for ($i = 0, $size = sizeof($size_types_text); $i < $size; $i++) for ($i = 0, $size = count($size_types_text); $i < $size; $i++)
{ {
$selected = ($size_compare == $size_types[$i]) ? ' selected="selected"' : ''; $selected = ($size_compare == $size_types[$i]) ? ' selected="selected"' : '';
$s_size_options .= '<option value="' . $size_types[$i] . '"' . $selected . '>' . $size_types_text[$i] . '</option>'; $s_size_options .= '<option value="' . $size_types[$i] . '"' . $selected . '>' . $size_types_text[$i] . '</option>';
@ -192,7 +192,7 @@ function group_select_options($group_id, $exclude_ids = false, $manage_founder =
/** @var \phpbb\group\helper $group_helper */ /** @var \phpbb\group\helper $group_helper */
$group_helper = $phpbb_container->get('group_helper'); $group_helper = $phpbb_container->get('group_helper');
$exclude_sql = ($exclude_ids !== false && sizeof($exclude_ids)) ? 'WHERE ' . $db->sql_in_set('group_id', array_map('intval', $exclude_ids), true) : ''; $exclude_sql = ($exclude_ids !== false && count($exclude_ids)) ? 'WHERE ' . $db->sql_in_set('group_id', array_map('intval', $exclude_ids), true) : '';
$sql_and = (!$config['coppa_enable']) ? (($exclude_sql) ? ' AND ' : ' WHERE ') . "group_name <> 'REGISTERED_COPPA'" : ''; $sql_and = (!$config['coppa_enable']) ? (($exclude_sql) ? ' AND ' : ' WHERE ') . "group_name <> 'REGISTERED_COPPA'" : '';
$sql_founder = ($manage_founder !== false) ? (($exclude_sql || $sql_and) ? ' AND ' : ' WHERE ') . 'group_founder_manage = ' . (int) $manage_founder : ''; $sql_founder = ($manage_founder !== false) ? (($exclude_sql || $sql_and) ? ' AND ' : ' WHERE ') . 'group_founder_manage = ' . (int) $manage_founder : '';
@ -747,7 +747,7 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s
{ {
$where_ids = (is_array($where_ids)) ? array_unique($where_ids) : array($where_ids); $where_ids = (is_array($where_ids)) ? array_unique($where_ids) : array($where_ids);
if (!sizeof($where_ids)) if (!count($where_ids))
{ {
return array('topics' => 0, 'posts' => 0); return array('topics' => 0, 'posts' => 0);
} }
@ -777,9 +777,9 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$return['topics'] = sizeof($topic_ids); $return['topics'] = count($topic_ids);
if (!sizeof($topic_ids)) if (!count($topic_ids))
{ {
return $return; return $return;
} }
@ -837,7 +837,7 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($moved_topic_ids)) if (count($moved_topic_ids))
{ {
$sql = 'DELETE FROM ' . TOPICS_TABLE . ' $sql = 'DELETE FROM ' . TOPICS_TABLE . '
WHERE ' . $db->sql_in_set('topic_id', $moved_topic_ids); WHERE ' . $db->sql_in_set('topic_id', $moved_topic_ids);
@ -923,7 +923,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
$where_ids = array($where_ids); $where_ids = array($where_ids);
} }
if (!sizeof($where_ids)) if (!count($where_ids))
{ {
return false; return false;
} }
@ -931,7 +931,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
$where_ids = array_map('intval', $where_ids); $where_ids = array_map('intval', $where_ids);
/* Possible code for splitting post deletion /* Possible code for splitting post deletion
if (sizeof($where_ids) >= 1001) if (count($where_ids) >= 1001)
{ {
// Split into chunks of 1000 // Split into chunks of 1000
$chunks = array_chunk($where_ids, 1000); $chunks = array_chunk($where_ids, 1000);
@ -974,7 +974,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (!sizeof($post_ids)) if (!count($post_ids))
{ {
return false; return false;
} }
@ -1018,7 +1018,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
unset($table_ary); unset($table_ary);
// Adjust users post counts // Adjust users post counts
if (sizeof($post_counts) && $post_count_sync) if (count($post_counts) && $post_count_sync)
{ {
foreach ($post_counts as $poster_id => $substract) foreach ($post_counts as $poster_id => $substract)
{ {
@ -1037,7 +1037,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
} }
// Remove topics now having no posts? // Remove topics now having no posts?
if (sizeof($topic_ids)) if (count($topic_ids))
{ {
$sql = 'SELECT topic_id $sql = 'SELECT topic_id
FROM ' . POSTS_TABLE . ' FROM ' . POSTS_TABLE . '
@ -1147,7 +1147,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
} }
// We actually remove topics now to not be inconsistent (the delete_topics function calls this function too) // We actually remove topics now to not be inconsistent (the delete_topics function calls this function too)
if (sizeof($remove_topics) && $call_delete_topics) if (count($remove_topics) && $call_delete_topics)
{ {
delete_topics('topic_id', $remove_topics, $auto_sync, $post_count_sync, false); delete_topics('topic_id', $remove_topics, $auto_sync, $post_count_sync, false);
} }
@ -1157,7 +1157,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
$phpbb_notifications->delete_notifications($delete_notifications_types, $post_ids); $phpbb_notifications->delete_notifications($delete_notifications_types, $post_ids);
return sizeof($post_ids); return count($post_ids);
} }
/** /**
@ -1232,7 +1232,7 @@ function delete_topic_shadows($forum_id, $sql_more = '', $auto_sync = true)
$db->sql_query($sql); $db->sql_query($sql);
} }
} }
while (sizeof($topic_ids) == $batch_size); while (count($topic_ids) == $batch_size);
if ($auto_sync) if ($auto_sync)
{ {
@ -1363,7 +1363,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
// Do not sync the "global forum" // Do not sync the "global forum"
$where_ids = array_diff($where_ids, array(0)); $where_ids = array_diff($where_ids, array(0));
if (!sizeof($where_ids)) if (!count($where_ids))
{ {
// Empty array with IDs. This means that we don't have any work to do. Just return. // Empty array with IDs. This means that we don't have any work to do. Just return.
return; return;
@ -1377,7 +1377,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
} }
else else
{ {
if (!sizeof($where_ids)) if (!count($where_ids))
{ {
return; return;
} }
@ -1416,7 +1416,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (!sizeof($topic_id_ary)) if (!count($topic_id_ary))
{ {
return; return;
} }
@ -1533,7 +1533,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$post_ids[] = $post_id; $post_ids[] = $post_id;
} }
if (sizeof($post_ids)) if (count($post_ids))
{ {
$sql = 'UPDATE ' . POSTS_TABLE . ' $sql = 'UPDATE ' . POSTS_TABLE . '
SET post_reported = 1 - post_reported SET post_reported = 1 - post_reported
@ -1579,7 +1579,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($topic_ids)) if (count($topic_ids))
{ {
$sql = 'UPDATE ' . TOPICS_TABLE . ' $sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_reported = 1 - topic_reported SET topic_reported = 1 - topic_reported
@ -1638,7 +1638,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$post_ids[] = $post_id; $post_ids[] = $post_id;
} }
if (sizeof($post_ids)) if (count($post_ids))
{ {
$sql = 'UPDATE ' . POSTS_TABLE . ' $sql = 'UPDATE ' . POSTS_TABLE . '
SET post_attachment = 1 - post_attachment SET post_attachment = 1 - post_attachment
@ -1684,7 +1684,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($topic_ids)) if (count($topic_ids))
{ {
$sql = 'UPDATE ' . TOPICS_TABLE . ' $sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_attachment = 1 - topic_attachment SET topic_attachment = 1 - topic_attachment
@ -1736,7 +1736,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (!sizeof($forum_ids)) if (!count($forum_ids))
{ {
break; break;
} }
@ -1775,7 +1775,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
// 3: Get post count for each forum (optional) // 3: Get post count for each forum (optional)
if ($sync_extra) if ($sync_extra)
{ {
if (sizeof($forum_ids) == 1) if (count($forum_ids) == 1)
{ {
$sql = 'SELECT SUM(t.topic_posts_approved) AS forum_posts_approved, SUM(t.topic_posts_unapproved) AS forum_posts_unapproved, SUM(t.topic_posts_softdeleted) AS forum_posts_softdeleted $sql = 'SELECT SUM(t.topic_posts_approved) AS forum_posts_approved, SUM(t.topic_posts_unapproved) AS forum_posts_unapproved, SUM(t.topic_posts_softdeleted) AS forum_posts_softdeleted
FROM ' . TOPICS_TABLE . ' t FROM ' . TOPICS_TABLE . ' t
@ -1795,7 +1795,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$forum_id = (sizeof($forum_ids) == 1) ? (int) $forum_ids[0] : (int) $row['forum_id']; $forum_id = (count($forum_ids) == 1) ? (int) $forum_ids[0] : (int) $row['forum_id'];
$forum_data[$forum_id]['posts_approved'] = (int) $row['forum_posts_approved']; $forum_data[$forum_id]['posts_approved'] = (int) $row['forum_posts_approved'];
$forum_data[$forum_id]['posts_unapproved'] = (int) $row['forum_posts_unapproved']; $forum_data[$forum_id]['posts_unapproved'] = (int) $row['forum_posts_unapproved'];
@ -1805,7 +1805,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
} }
// 4: Get last_post_id for each forum // 4: Get last_post_id for each forum
if (sizeof($forum_ids) == 1) if (count($forum_ids) == 1)
{ {
$sql = 'SELECT MAX(t.topic_last_post_id) as last_post_id $sql = 'SELECT MAX(t.topic_last_post_id) as last_post_id
FROM ' . TOPICS_TABLE . ' t FROM ' . TOPICS_TABLE . ' t
@ -1825,7 +1825,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$forum_id = (sizeof($forum_ids) == 1) ? (int) $forum_ids[0] : (int) $row['forum_id']; $forum_id = (count($forum_ids) == 1) ? (int) $forum_ids[0] : (int) $row['forum_id'];
$forum_data[$forum_id]['last_post_id'] = (int) $row['last_post_id']; $forum_data[$forum_id]['last_post_id'] = (int) $row['last_post_id'];
@ -1834,7 +1834,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$db->sql_freeresult($result); $db->sql_freeresult($result);
// 5: Retrieve last_post infos // 5: Retrieve last_post infos
if (sizeof($post_ids)) if (count($post_ids))
{ {
$sql = 'SELECT p.post_id, p.poster_id, p.post_subject, p.post_time, p.post_username, u.username, u.user_colour $sql = 'SELECT p.post_id, p.poster_id, p.post_subject, p.post_time, p.post_username, u.username, u.user_colour
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
@ -1902,7 +1902,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
} }
} }
if (sizeof($sql_ary)) if (count($sql_ary))
{ {
$sql = 'UPDATE ' . FORUMS_TABLE . ' $sql = 'UPDATE ' . FORUMS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
@ -2025,20 +2025,20 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
} }
// Now we delete empty topics and orphan posts // Now we delete empty topics and orphan posts
if (sizeof($delete_posts)) if (count($delete_posts))
{ {
delete_posts('topic_id', array_keys($delete_posts), false); delete_posts('topic_id', array_keys($delete_posts), false);
unset($delete_posts); unset($delete_posts);
} }
if (!sizeof($topic_data)) if (!count($topic_data))
{ {
// If we get there, topic ids were invalid or topics did not contain any posts // If we get there, topic ids were invalid or topics did not contain any posts
delete_topics($where_type, $where_ids, true); delete_topics($where_type, $where_ids, true);
return; return;
} }
if (sizeof($delete_topics)) if (count($delete_topics))
{ {
$delete_topic_ids = array(); $delete_topic_ids = array();
foreach ($delete_topics as $topic_id => $void) foreach ($delete_topics as $topic_id => $void)
@ -2081,7 +2081,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$db->sql_freeresult($result); $db->sql_freeresult($result);
// Make sure shadow topics do link to existing topics // Make sure shadow topics do link to existing topics
if (sizeof($moved_topics)) if (count($moved_topics))
{ {
$delete_topics = array(); $delete_topics = array();
@ -2098,7 +2098,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($delete_topics)) if (count($delete_topics))
{ {
delete_topics('topic_id', $delete_topics, false); delete_topics('topic_id', $delete_topics, false);
} }
@ -2121,7 +2121,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$db->sql_freeresult($result); $db->sql_freeresult($result);
$sync_shadow_topics = array(); $sync_shadow_topics = array();
if (sizeof($post_ids)) if (count($post_ids))
{ {
$sql = 'SELECT p.post_id, p.topic_id, p.post_visibility, p.poster_id, p.post_subject, p.post_username, p.post_time, u.username, u.user_colour $sql = 'SELECT p.post_id, p.topic_id, p.post_visibility, p.poster_id, p.post_subject, p.post_username, p.post_time, u.username, u.user_colour
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
@ -2174,7 +2174,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$shadow_topic_data = array(); $shadow_topic_data = array();
// Update the information we collected // Update the information we collected
if (sizeof($sync_shadow_topics)) if (count($sync_shadow_topics))
{ {
foreach ($sync_shadow_topics as $sync_topic_id => $sql_ary) foreach ($sync_shadow_topics as $sync_topic_id => $sql_ary)
{ {
@ -2239,7 +2239,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
} }
} }
if (sizeof($sql_ary)) if (count($sql_ary))
{ {
$sql = 'UPDATE ' . TOPICS_TABLE . ' $sql = 'UPDATE ' . TOPICS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
@ -2256,7 +2256,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
// if some topics have been resync'ed then resync parent forums // if some topics have been resync'ed then resync parent forums
// except when we're only syncing a range, we don't want to sync forums during // except when we're only syncing a range, we don't want to sync forums during
// batch processing. // batch processing.
if ($resync_parents && sizeof($resync_forums) && $where_type != 'range') if ($resync_parents && count($resync_forums) && $where_type != 'range')
{ {
sync('forum', 'forum_id', array_values($resync_forums), true, true); sync('forum', 'forum_id', array_values($resync_forums), true, true);
} }
@ -2278,7 +2278,7 @@ function prune($forum_id, $prune_mode, $prune_date, $prune_flags = 0, $auto_sync
$forum_id = array($forum_id); $forum_id = array($forum_id);
} }
if (!sizeof($forum_id)) if (!count($forum_id))
{ {
return; return;
} }
@ -2369,6 +2369,16 @@ function prune($forum_id, $prune_mode, $prune_date, $prune_flags = 0, $auto_sync
$topic_list = array_unique($topic_list); $topic_list = array_unique($topic_list);
} }
/**
* Perform additional actions before topic deletion via pruning
*
* @event core.prune_delete_before
* @var int[] topic_list The IDs of the topics to be deleted
* @since 3.2.2-RC1
*/
$vars = array('topic_list');
extract($phpbb_dispatcher->trigger_event('core.prune_delete_before', compact($vars)));
return delete_topics('topic_id', $topic_list, $auto_sync, false); return delete_topics('topic_id', $topic_list, $auto_sync, false);
} }
@ -2441,7 +2451,7 @@ function phpbb_cache_moderators($db, $cache, $auth)
$hold_ary = $auth->acl_user_raw_data(false, 'm_%', false); $hold_ary = $auth->acl_user_raw_data(false, 'm_%', false);
// Add users? // Add users?
if (sizeof($hold_ary)) if (!empty($hold_ary))
{ {
// At least one moderative option warrants a display // At least one moderative option warrants a display
$ug_id_ary = array_keys($hold_ary); $ug_id_ary = array_keys($hold_ary);
@ -2486,7 +2496,7 @@ function phpbb_cache_moderators($db, $cache, $auth)
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($hold_ary)) if (count($hold_ary))
{ {
// Get usernames... // Get usernames...
$sql = 'SELECT user_id, username $sql = 'SELECT user_id, username
@ -2526,7 +2536,7 @@ function phpbb_cache_moderators($db, $cache, $auth)
// Now to the groups... // Now to the groups...
$hold_ary = $auth->acl_group_raw_data(false, 'm_%', false); $hold_ary = $auth->acl_group_raw_data(false, 'm_%', false);
if (sizeof($hold_ary)) if (!empty($hold_ary))
{ {
$ug_id_ary = array_keys($hold_ary); $ug_id_ary = array_keys($hold_ary);
@ -2630,7 +2640,7 @@ function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id
function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false) function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
{ {
// update foes for some user // update foes for some user
if (is_array($user_id) && sizeof($user_id)) if (is_array($user_id) && count($user_id))
{ {
$sql = 'DELETE FROM ' . ZEBRA_TABLE . ' $sql = 'DELETE FROM ' . ZEBRA_TABLE . '
WHERE ' . $db->sql_in_set('zebra_id', $user_id) . ' WHERE ' . $db->sql_in_set('zebra_id', $user_id) . '
@ -2640,7 +2650,7 @@ function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
} }
// update foes for some group // update foes for some group
if (is_array($group_id) && sizeof($group_id)) if (is_array($group_id) && count($group_id))
{ {
// Grab group settings... // Grab group settings...
$sql_ary = array( $sql_ary = array(
@ -2674,7 +2684,7 @@ function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (!sizeof($groups)) if (!count($groups))
{ {
return; return;
} }
@ -2704,7 +2714,7 @@ function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($users)) if (count($users))
{ {
$sql = 'DELETE FROM ' . ZEBRA_TABLE . ' $sql = 'DELETE FROM ' . ZEBRA_TABLE . '
WHERE ' . $db->sql_in_set('zebra_id', $users) . ' WHERE ' . $db->sql_in_set('zebra_id', $users) . '
@ -2727,7 +2737,7 @@ function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
} }
} }
if (sizeof($perms)) if (count($perms))
{ {
$sql = 'DELETE FROM ' . ZEBRA_TABLE . ' $sql = 'DELETE FROM ' . ZEBRA_TABLE . '
WHERE ' . $db->sql_in_set('zebra_id', array_unique($perms)) . ' WHERE ' . $db->sql_in_set('zebra_id', array_unique($perms)) . '
@ -2990,7 +3000,7 @@ function tidy_warnings()
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($warning_list)) if (count($warning_list))
{ {
$db->sql_transaction('begin'); $db->sql_transaction('begin');
@ -3032,6 +3042,8 @@ function tidy_database()
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$db->sql_transaction('begin');
// Delete those rows from the acl tables not having listed the forums above // Delete those rows from the acl tables not having listed the forums above
$sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . ' $sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true); WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true);
@ -3041,6 +3053,8 @@ function tidy_database()
WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true); WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true);
$db->sql_query($sql); $db->sql_query($sql);
$db->sql_transaction('commit');
$config->set('database_last_gc', time(), false); $config->set('database_last_gc', time(), false);
} }

View file

@ -391,7 +391,7 @@ function request_var($var_name, $default, $multibyte = false, $cookie = false, $
* *
* @deprecated 3.1.0 (To be removed: 3.3.0) * @deprecated 3.1.0 (To be removed: 3.3.0)
*/ */
function get_tables(&$db) function get_tables($db)
{ {
$db_tools_factory = new \phpbb\db\tools\factory(); $db_tools_factory = new \phpbb\db\tools\factory();
$db_tools = $db_tools_factory->get($db); $db_tools = $db_tools_factory->get($db);

View file

@ -210,7 +210,7 @@ class compress_zip extends compress
/** /**
* Constructor * Constructor
*/ */
function compress_zip($mode, $file) function __construct($mode, $file)
{ {
global $phpbb_filesystem; global $phpbb_filesystem;
@ -409,7 +409,7 @@ class compress_zip extends compress
function close() function close()
{ {
// Write out central file directory and footer ... if it exists // Write out central file directory and footer ... if it exists
if (sizeof($this->ctrl_dir)) if (count($this->ctrl_dir))
{ {
fwrite($this->fp, $this->file()); fwrite($this->fp, $this->file());
} }
@ -511,8 +511,8 @@ class compress_zip extends compress
$ctrldir = implode('', $this->ctrl_dir); $ctrldir = implode('', $this->ctrl_dir);
return $ctrldir . $this->eof_cdh . return $ctrldir . $this->eof_cdh .
pack('v', sizeof($this->ctrl_dir)) . // total # of entries "on this disk" pack('v', count($this->ctrl_dir)) . // total # of entries "on this disk"
pack('v', sizeof($this->ctrl_dir)) . // total # of entries overall pack('v', count($this->ctrl_dir)) . // total # of entries overall
pack('V', strlen($ctrldir)) . // size of central dir pack('V', strlen($ctrldir)) . // size of central dir
pack('V', $this->datasec_len) . // offset to start of central dir pack('V', $this->datasec_len) . // offset to start of central dir
"\x00\x00"; // .zip file comment length "\x00\x00"; // .zip file comment length
@ -569,7 +569,7 @@ class compress_tar extends compress
/** /**
* Constructor * Constructor
*/ */
function compress_tar($mode, $file, $type = '') function __construct($mode, $file, $type = '')
{ {
global $phpbb_filesystem; global $phpbb_filesystem;

View file

@ -336,7 +336,7 @@ function get_context($text, $words, $length = 400)
$text = str_replace($entities, $characters, $text); $text = str_replace($entities, $characters, $text);
$word_indizes = array(); $word_indizes = array();
if (sizeof($words)) if (count($words))
{ {
$match = ''; $match = '';
// find the starting indizes of all words // find the starting indizes of all words
@ -361,12 +361,12 @@ function get_context($text, $words, $length = 400)
} }
unset($match); unset($match);
if (sizeof($word_indizes)) if (count($word_indizes))
{ {
$word_indizes = array_unique($word_indizes); $word_indizes = array_unique($word_indizes);
sort($word_indizes); sort($word_indizes);
$wordnum = sizeof($word_indizes); $wordnum = count($word_indizes);
// number of characters on the right and left side of each word // number of characters on the right and left side of each word
$sequence_length = (int) ($length / (2 * $wordnum)) - 2; $sequence_length = (int) ($length / (2 * $wordnum)) - 2;
$final_text = ''; $final_text = '';
@ -434,7 +434,7 @@ function get_context($text, $words, $length = 400)
} }
} }
if (!sizeof($words) || !sizeof($word_indizes)) if (!count($words) || !count($word_indizes))
{ {
return str_replace($characters, $entities, ((utf8_strlen($text) >= $length + 3) ? utf8_substr($text, 0, $length) . '...' : $text)); return str_replace($characters, $entities, ((utf8_strlen($text) >= $length + 3) ? utf8_substr($text, 0, $length) . '...' : $text));
} }
@ -627,7 +627,7 @@ function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text
} }
else else
{ {
$bbcode->bbcode($bitfield); $bbcode->bbcode_set_bitfield($bitfield);
} }
$bbcode->bbcode_second_pass($text, $uid); $bbcode->bbcode_second_pass($text, $uid);
@ -1021,7 +1021,7 @@ function censor_text($text)
} }
} }
if (sizeof($censors)) if (count($censors))
{ {
return preg_replace($censors['match'], $censors['replace'], $text); return preg_replace($censors['match'], $censors['replace'], $text);
} }
@ -1079,7 +1079,7 @@ function smiley_text($text, $force_option = false)
*/ */
function parse_attachments($forum_id, &$message, &$attachments, &$update_count_ary, $preview = false) function parse_attachments($forum_id, &$message, &$attachments, &$update_count_ary, $preview = false)
{ {
if (!sizeof($attachments)) if (!count($attachments))
{ {
return; return;
} }
@ -1114,7 +1114,7 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count_a
} }
// Grab attachments (security precaution) // Grab attachments (security precaution)
if (sizeof($attach_ids)) if (count($attach_ids))
{ {
global $db; global $db;
@ -1151,7 +1151,7 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count_a
foreach ($attachments as $attachment) foreach ($attachments as $attachment)
{ {
if (!sizeof($attachment)) if (!count($attachment))
{ {
continue; continue;
} }
@ -1443,7 +1443,7 @@ function truncate_string($string, $max_length = 60, $max_store_length = 255, $al
$chars = array_map('utf8_htmlspecialchars', $_chars); $chars = array_map('utf8_htmlspecialchars', $_chars);
// Now check the length ;) // Now check the length ;)
if (sizeof($chars) > $max_length) if (count($chars) > $max_length)
{ {
// Cut off the last elements from the array // Cut off the last elements from the array
$string = implode('', array_slice($chars, 0, $max_length - utf8_strlen($append))); $string = implode('', array_slice($chars, 0, $max_length - utf8_strlen($append)));
@ -1482,6 +1482,8 @@ function truncate_string($string, $max_length = 60, $max_store_length = 255, $al
* Get username details for placing into templates. * Get username details for placing into templates.
* This function caches all modes on first call, except for no_profile and anonymous user - determined by $user_id. * This function caches all modes on first call, except for no_profile and anonymous user - determined by $user_id.
* *
* @html Username spans and links
*
* @param string $mode Can be profile (for getting an url to the profile), username (for obtaining the username), colour (for obtaining the user colour), full (for obtaining a html string representing a coloured link to the users profile) or no_profile (the same as full but forcing no profile link) * @param string $mode Can be profile (for getting an url to the profile), username (for obtaining the username), colour (for obtaining the user colour), full (for obtaining a html string representing a coloured link to the users profile) or no_profile (the same as full but forcing no profile link)
* @param int $user_id The users id * @param int $user_id The users id
* @param string $username The users name * @param string $username The users name
@ -1501,6 +1503,7 @@ function get_username_string($mode, $user_id, $username, $username_colour = '',
{ {
global $phpbb_root_path, $phpEx; global $phpbb_root_path, $phpEx;
/** @html Username spans and links for usage in the template */
$_profile_cache['base_url'] = append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile&amp;u={USER_ID}'); $_profile_cache['base_url'] = append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile&amp;u={USER_ID}');
$_profile_cache['tpl_noprofile'] = '<span class="username">{USERNAME}</span>'; $_profile_cache['tpl_noprofile'] = '<span class="username">{USERNAME}</span>';
$_profile_cache['tpl_noprofile_colour'] = '<span style="color: {USERNAME_COLOUR};" class="username-coloured">{USERNAME}</span>'; $_profile_cache['tpl_noprofile_colour'] = '<span style="color: {USERNAME_COLOUR};" class="username-coloured">{USERNAME}</span>';
@ -1651,7 +1654,7 @@ function phpbb_generate_string_list($items, $user)
return ''; return '';
} }
$count = sizeof($items); $count = count($items);
$last_item = array_pop($items); $last_item = array_pop($items);
$lang_key = 'STRING_LIST_MULTI'; $lang_key = 'STRING_LIST_MULTI';
@ -1672,7 +1675,7 @@ class bitfield
{ {
var $data; var $data;
function bitfield($bitfield = '') function __construct($bitfield = '')
{ {
$this->data = base64_decode($bitfield); $this->data = base64_decode($bitfield);
} }
@ -1758,3 +1761,48 @@ class bitfield
$this->data = $this->data | $bitfield->get_blob(); $this->data = $this->data | $bitfield->get_blob();
} }
} }
/**
* Formats the quote according to the given BBCode status setting
*
* @param phpbb\language\language $language Language class
* @param parse_message $message_parser Message parser class
* @param phpbb\textformatter\utils_interface $text_formatter_utils Text formatter utilities
* @param bool $bbcode_status The status of the BBCode setting
* @param array $quote_attributes The attributes of the quoted post
* @param string $message_link Link of the original quoted post
*/
function phpbb_format_quote($language, $message_parser, $text_formatter_utils, $bbcode_status, $quote_attributes, $message_link = '')
{
if ($bbcode_status)
{
$quote_text = $text_formatter_utils->generate_quote(
censor_text($message_parser->message),
$quote_attributes
);
$message_parser->message = $quote_text . "\n\n";
}
else
{
$offset = 0;
$quote_string = "&gt; ";
$message = censor_text(trim($message_parser->message));
// see if we are nesting. It's easily tricked but should work for one level of nesting
if (strpos($message, "&gt;") !== false)
{
$offset = 10;
}
$message = utf8_wordwrap($message, 75 + $offset, "\n");
$message = $quote_string . $message;
$message = str_replace("\n", "\n" . $quote_string, $message);
$message_parser->message = $quote_attributes['author'] . " " . $language->lang('WROTE') . ":\n" . $message . "\n";
}
if ($message_link)
{
$message_parser->message = $message_link . $message_parser->message;
}
}

View file

@ -192,7 +192,7 @@ function get_group_id($group_name)
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
if (!sizeof($group_mapping)) if (!count($group_mapping))
{ {
add_default_groups(); add_default_groups();
return get_group_id($group_name); return get_group_id($group_name);
@ -249,7 +249,7 @@ function validate_website($url)
{ {
return ''; return '';
} }
else if (!preg_match('#^[a-z0-9]+://#i', $url) && strlen($url) > 0) else if (!preg_match('#^http[s]?://#i', $url) && strlen($url) > 0)
{ {
return 'http://' . $url; return 'http://' . $url;
} }
@ -307,7 +307,7 @@ function decode_ip($int_ip)
$hexipbang = explode('.', chunk_split($int_ip, 2, '.')); $hexipbang = explode('.', chunk_split($int_ip, 2, '.'));
// Any mod changing the way ips are stored? Then we are not able to convert and enter the ip "as is" to not "destroy" anything... // Any mod changing the way ips are stored? Then we are not able to convert and enter the ip "as is" to not "destroy" anything...
if (sizeof($hexipbang) < 4) if (count($hexipbang) < 4)
{ {
return $int_ip; return $int_ip;
} }
@ -479,7 +479,7 @@ function import_avatar_gallery($gallery_name = '', $subdirs_as_galleries = false
$dir->close(); $dir->close();
} }
for ($i = 0, $end = sizeof($dirlist); $i < $end; ++$i) for ($i = 0, $end = count($dirlist); $i < $end; ++$i)
{ {
$dir = $dirlist[$i]; $dir = $dirlist[$i];
@ -1261,7 +1261,7 @@ function get_config()
} }
} }
if (!sizeof($convert_config)) if (!count($convert_config))
{ {
$convert->p_master->error($user->lang['CONV_ERROR_CONFIG_EMPTY'], __LINE__, __FILE__); $convert->p_master->error($user->lang['CONV_ERROR_CONFIG_EMPTY'], __LINE__, __FILE__);
} }
@ -1406,9 +1406,9 @@ function get_path($src_path, $src_url, $test_file)
$url_parts = explode('/', $m[2]); $url_parts = explode('/', $m[2]);
if (substr($src_url, -1) != '/') if (substr($src_url, -1) != '/')
{ {
if (preg_match('/.*\.([a-z0-9]{3,4})$/i', $url_parts[sizeof($url_parts) - 1])) if (preg_match('/.*\.([a-z0-9]{3,4})$/i', $url_parts[count($url_parts) - 1]))
{ {
$url_parts[sizeof($url_parts) - 1] = ''; $url_parts[count($url_parts) - 1] = '';
} }
else else
{ {
@ -1425,9 +1425,9 @@ function get_path($src_path, $src_url, $test_file)
$path_array = array(); $path_array = array();
$phpbb_parts = explode('/', $script_path); $phpbb_parts = explode('/', $script_path);
for ($i = 0, $end = sizeof($url_parts); $i < $end; ++$i) for ($i = 0, $end = count($url_parts); $i < $end; ++$i)
{ {
if ($i < sizeof($phpbb_parts[$i]) && $url_parts[$i] == $phpbb_parts[$i]) if ($i < count($phpbb_parts[$i]) && $url_parts[$i] == $phpbb_parts[$i])
{ {
$path_array[] = $url_parts[$i]; $path_array[] = $url_parts[$i];
unset($url_parts[$i]); unset($url_parts[$i]);
@ -1435,7 +1435,7 @@ function get_path($src_path, $src_url, $test_file)
else else
{ {
$path = ''; $path = '';
for ($j = $i, $end2 = sizeof($phpbb_parts); $j < $end2; ++$j) for ($j = $i, $end2 = count($phpbb_parts); $j < $end2; ++$j)
{ {
$path .= '../'; $path .= '../';
} }
@ -1458,7 +1458,7 @@ function get_path($src_path, $src_url, $test_file)
function compare_table($tables, $tablename, &$prefixes) function compare_table($tables, $tablename, &$prefixes)
{ {
for ($i = 0, $table_size = sizeof($tables); $i < $table_size; ++$i) for ($i = 0, $table_size = count($tables); $i < $table_size; ++$i)
{ {
if (preg_match('/(.*)' . $tables[$i] . '$/', $tablename, $m)) if (preg_match('/(.*)' . $tables[$i] . '$/', $tablename, $m))
{ {
@ -1754,7 +1754,7 @@ function add_default_groups()
); );
} }
if (sizeof($sql_ary)) if (count($sql_ary))
{ {
$db->sql_multi_insert(GROUPS_TABLE, $sql_ary); $db->sql_multi_insert(GROUPS_TABLE, $sql_ary);
} }
@ -1786,7 +1786,7 @@ function add_groups_to_teampage()
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($teampage_ary)) if (count($teampage_ary))
{ {
$db->sql_multi_insert(TEAMPAGE_TABLE, $teampage_ary); $db->sql_multi_insert(TEAMPAGE_TABLE, $teampage_ary);
} }
@ -2101,7 +2101,7 @@ function update_topics_posted()
} }
unset($posted); unset($posted);
if (sizeof($sql_ary)) if (count($sql_ary))
{ {
$db->sql_multi_insert(TOPICS_POSTED_TABLE, $sql_ary); $db->sql_multi_insert(TOPICS_POSTED_TABLE, $sql_ary);
} }
@ -2136,7 +2136,7 @@ function fix_empty_primary_groups()
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($user_ids)) if (count($user_ids))
{ {
$db->sql_query('UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('administrators') . ' $db->sql_query('UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('administrators') . '
WHERE group_id = 0 AND ' . $db->sql_in_set('user_id', $user_ids)); WHERE group_id = 0 AND ' . $db->sql_in_set('user_id', $user_ids));
@ -2152,7 +2152,7 @@ function fix_empty_primary_groups()
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($user_ids)) if (count($user_ids))
{ {
$db->sql_query('UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('global_moderators') . ' $db->sql_query('UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('global_moderators') . '
WHERE group_id = 0 AND ' . $db->sql_in_set('user_id', $user_ids)); WHERE group_id = 0 AND ' . $db->sql_in_set('user_id', $user_ids));
@ -2264,7 +2264,7 @@ function convert_bbcode($message, $convert_size = true, $extended_bbcodes = fals
"\n\n" "\n\n"
); );
for ($i = 0, $end = sizeof($str_from); $i < $end; ++$i) for ($i = 0, $end = count($str_from); $i < $end; ++$i)
{ {
$origx[] = '#\\' . str_replace(']', '\\]', $str_from[$i]) . '#is'; $origx[] = '#\\' . str_replace(']', '\\]', $str_from[$i]) . '#is';
$replx[] = $str_to[$i]; $replx[] = $str_to[$i];
@ -2273,7 +2273,7 @@ function convert_bbcode($message, $convert_size = true, $extended_bbcodes = fals
if (preg_match_all('#\[email=([^\]]+)\](.*?)\[/email\]#i', $message, $m)) if (preg_match_all('#\[email=([^\]]+)\](.*?)\[/email\]#i', $message, $m))
{ {
for ($i = 0, $end = sizeof($m[1]); $i < $end; ++$i) for ($i = 0, $end = count($m[1]); $i < $end; ++$i)
{ {
if ($m[1][$i] == $m[2][$i]) if ($m[1][$i] == $m[2][$i])
{ {
@ -2292,7 +2292,7 @@ function convert_bbcode($message, $convert_size = true, $extended_bbcodes = fals
$message = preg_replace('#\[size=([0-9]+)\](.*?)\[/size\]#i', '[size=\1]\2[/size]', $message); $message = preg_replace('#\[size=([0-9]+)\](.*?)\[/size\]#i', '[size=\1]\2[/size]', $message);
$message = preg_replace('#\[size=[0-9]{2,}\](.*?)\[/size\]#i', '[size=29]\1[/size]', $message); $message = preg_replace('#\[size=[0-9]{2,}\](.*?)\[/size\]#i', '[size=29]\1[/size]', $message);
for ($i = sizeof($size); $i;) for ($i = count($size); $i;)
{ {
$i--; $i--;
$message = str_replace('[size=' . $i . ']', '[size=' . $size[$i] . ']', $message); $message = str_replace('[size=' . $i . ']', '[size=' . $size[$i] . ']', $message);
@ -2335,9 +2335,9 @@ function copy_file($src, $trg, $overwrite = false, $die_on_failure = true, $sour
$path = $phpbb_root_path; $path = $phpbb_root_path;
$parts = explode('/', $trg); $parts = explode('/', $trg);
unset($parts[sizeof($parts) - 1]); unset($parts[count($parts) - 1]);
for ($i = 0, $end = sizeof($parts); $i < $end; ++$i) for ($i = 0, $end = count($parts); $i < $end; ++$i)
{ {
$path .= $parts[$i] . '/'; $path .= $parts[$i] . '/';
@ -2437,7 +2437,7 @@ function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_
if ($copy_subdirs) if ($copy_subdirs)
{ {
for ($i = 0, $end = sizeof($dirlist); $i < $end; ++$i) for ($i = 0, $end = count($dirlist); $i < $end; ++$i)
{ {
$dir = $dirlist[$i]; $dir = $dirlist[$i];
@ -2458,21 +2458,21 @@ function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_
$bad_dirs[] = $trg_path . $dir; $bad_dirs[] = $trg_path . $dir;
} }
if (!sizeof($bad_dirs)) if (!count($bad_dirs))
{ {
copy_dir($src . $dir, $trg . $dir, true, $overwrite, $die_on_failure, $source_relative_path); copy_dir($src . $dir, $trg . $dir, true, $overwrite, $die_on_failure, $source_relative_path);
} }
} }
} }
if (sizeof($bad_dirs)) if (count($bad_dirs))
{ {
$str = (sizeof($bad_dirs) == 1) ? $user->lang['MAKE_FOLDER_WRITABLE'] : $user->lang['MAKE_FOLDERS_WRITABLE']; $str = (count($bad_dirs) == 1) ? $user->lang['MAKE_FOLDER_WRITABLE'] : $user->lang['MAKE_FOLDERS_WRITABLE'];
sort($bad_dirs); sort($bad_dirs);
$convert->p_master->error(sprintf($str, implode('<br />', $bad_dirs)), __LINE__, __FILE__); $convert->p_master->error(sprintf($str, implode('<br />', $bad_dirs)), __LINE__, __FILE__);
} }
for ($i = 0, $end = sizeof($filelist); $i < $end; ++$i) for ($i = 0, $end = count($filelist); $i < $end; ++$i)
{ {
copy_file($src . $filelist[$i], $trg . $filelist[$i], $overwrite, $die_on_failure, $source_relative_path); copy_file($src . $filelist[$i], $trg . $filelist[$i], $overwrite, $die_on_failure, $source_relative_path);
} }

View file

@ -506,7 +506,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
} }
} }
$l_subforums = (sizeof($subforums[$forum_id]) == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS']; $l_subforums = (count($subforums[$forum_id]) == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'];
$folder_image = ($forum_unread) ? 'forum_unread_subforum' : 'forum_read_subforum'; $folder_image = ($forum_unread) ? 'forum_unread_subforum' : 'forum_read_subforum';
} }
else else
@ -537,7 +537,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
// Create last post link information, if appropriate // Create last post link information, if appropriate
if ($row['forum_last_post_id']) if ($row['forum_last_post_id'])
{ {
if ($row['forum_password_last_post'] === '' && $auth->acl_get('f_read', $row['forum_id_last_post'])) if ($row['forum_password_last_post'] === '' && $auth->acl_gets('f_read', 'f_list_topics', $row['forum_id_last_post']))
{ {
$last_post_subject = censor_text($row['forum_last_post_subject']); $last_post_subject = censor_text($row['forum_last_post_subject']);
$last_post_subject_truncated = truncate_string($last_post_subject, 30, 255, false, $user->lang['ELLIPSIS']); $last_post_subject_truncated = truncate_string($last_post_subject, 30, 255, false, $user->lang['ELLIPSIS']);
@ -559,7 +559,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
$l_moderator = $moderators_list = ''; $l_moderator = $moderators_list = '';
if ($display_moderators && !empty($forum_moderators[$forum_id])) if ($display_moderators && !empty($forum_moderators[$forum_id]))
{ {
$l_moderator = (sizeof($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS']; $l_moderator = (count($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS'];
$moderators_list = implode($user->lang['COMMA_SEPARATOR'], $forum_moderators[$forum_id]); $moderators_list = implode($user->lang['COMMA_SEPARATOR'], $forum_moderators[$forum_id]);
} }
@ -606,7 +606,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
'S_AUTH_READ' => $auth->acl_get('f_read', $row['forum_id']), 'S_AUTH_READ' => $auth->acl_get('f_read', $row['forum_id']),
'S_LOCKED_FORUM' => ($row['forum_status'] == ITEM_LOCKED) ? true : false, 'S_LOCKED_FORUM' => ($row['forum_status'] == ITEM_LOCKED) ? true : false,
'S_LIST_SUBFORUMS' => ($row['display_subforum_list']) ? true : false, 'S_LIST_SUBFORUMS' => ($row['display_subforum_list']) ? true : false,
'S_SUBFORUMS' => (sizeof($subforums_list)) ? true : false, 'S_SUBFORUMS' => (count($subforums_list)) ? true : false,
'S_DISPLAY_SUBJECT' => ($last_post_subject !== '' && $config['display_last_subject']) ? true : false, 'S_DISPLAY_SUBJECT' => ($last_post_subject !== '' && $config['display_last_subject']) ? true : false,
'S_FEED_ENABLED' => ($config['feed_forum'] && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $row['forum_options']) && $row['forum_type'] == FORUM_POST) ? true : false, 'S_FEED_ENABLED' => ($config['feed_forum'] && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $row['forum_options']) && $row['forum_type'] == FORUM_POST) ? true : false,
@ -1243,6 +1243,7 @@ function display_user_activity(&$userdata_ary)
} }
$userdata = $userdata_ary; $userdata = $userdata_ary;
$show_user_activity = true;
/** /**
* Alter list of forums and topics to display as active * Alter list of forums and topics to display as active
* *
@ -1250,9 +1251,11 @@ function display_user_activity(&$userdata_ary)
* @var array userdata User's data * @var array userdata User's data
* @var array active_f_row List of active forums * @var array active_f_row List of active forums
* @var array active_t_row List of active posts * @var array active_t_row List of active posts
* @var bool show_user_activity Show user forum and topic activity
* @since 3.1.0-RC3 * @since 3.1.0-RC3
* @changed 3.2.5-RC1 Added show_user_activity into event
*/ */
$vars = array('userdata', 'active_f_row', 'active_t_row'); $vars = array('userdata', 'active_f_row', 'active_t_row', 'show_user_activity');
extract($phpbb_dispatcher->trigger_event('core.display_user_activity_modify_actives', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.display_user_activity_modify_actives', compact($vars)));
$userdata_ary = $userdata; $userdata_ary = $userdata;
unset($userdata); unset($userdata);
@ -1289,7 +1292,7 @@ function display_user_activity(&$userdata_ary)
'ACTIVE_TOPIC_PCT' => sprintf($l_active_pct, $active_t_pct), 'ACTIVE_TOPIC_PCT' => sprintf($l_active_pct, $active_t_pct),
'U_ACTIVE_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $active_f_id), 'U_ACTIVE_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $active_f_id),
'U_ACTIVE_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $active_t_id), 'U_ACTIVE_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $active_t_id),
'S_SHOW_ACTIVITY' => true) 'S_SHOW_ACTIVITY' => $show_user_activity)
); );
} }
@ -1648,10 +1651,10 @@ function phpbb_show_profile($data, $user_notes_enabled = false, $warn_user_enabl
($data['user_type'] != USER_INACTIVE || $data['user_inactive_reason'] != INACTIVE_MANUAL) && ($data['user_type'] != USER_INACTIVE || $data['user_inactive_reason'] != INACTIVE_MANUAL) &&
// They must be able to read PMs // They must be able to read PMs
sizeof($auth->acl_get_list($user_id, 'u_readpm')) && count($auth->acl_get_list($user_id, 'u_readpm')) &&
// They must not be permanently banned // They must not be permanently banned
!sizeof(phpbb_get_banned_user_ids($user_id, false)) && !count(phpbb_get_banned_user_ids($user_id, false)) &&
// They must allow users to contact via PM // They must allow users to contact via PM
(($auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_')) || $data['user_allow_pm']) (($auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_')) || $data['user_allow_pm'])

View file

@ -196,7 +196,7 @@ function send_file_to_browser($attachment, $upload_dir, $category)
} }
// Now the tricky part... let's dance // Now the tricky part... let's dance
header('Cache-Control: public'); header('Cache-Control: private');
// Send out the Headers. Do not set Content-Disposition to inline please, it is a security measure for users using the Internet Explorer. // Send out the Headers. Do not set Content-Disposition to inline please, it is a security measure for users using the Internet Explorer.
header('Content-Type: ' . $attachment['mimetype']); header('Content-Type: ' . $attachment['mimetype']);
@ -451,7 +451,7 @@ function set_modified_headers($stamp, $browser)
{ {
send_status_line(304, 'Not Modified'); send_status_line(304, 'Not Modified');
// seems that we need those too ... browsers // seems that we need those too ... browsers
header('Cache-Control: public'); header('Cache-Control: private');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 31536000) . ' GMT'); header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 31536000) . ' GMT');
return true; return true;
} }
@ -568,7 +568,7 @@ function phpbb_parse_range_request($request_array, $filesize)
$range = explode('-', trim($range_string)); $range = explode('-', trim($range_string));
// "-" is invalid, "0-0" however is valid and means the very first byte. // "-" is invalid, "0-0" however is valid and means the very first byte.
if (sizeof($range) != 2 || $range[0] === '' && $range[1] === '') if (count($range) != 2 || $range[0] === '' && $range[1] === '')
{ {
continue; continue;
} }
@ -662,6 +662,8 @@ function phpbb_increment_downloads($db, $ids)
*/ */
function phpbb_download_handle_forum_auth($db, $auth, $topic_id) function phpbb_download_handle_forum_auth($db, $auth, $topic_id)
{ {
global $phpbb_container;
$sql_array = array( $sql_array = array(
'SELECT' => 't.topic_visibility, t.forum_id, f.forum_name, f.forum_password, f.parent_id', 'SELECT' => 't.topic_visibility, t.forum_id, f.forum_name, f.forum_password, f.parent_id',
'FROM' => array( 'FROM' => array(
@ -677,7 +679,9 @@ function phpbb_download_handle_forum_auth($db, $auth, $topic_id)
$row = $db->sql_fetchrow($result); $row = $db->sql_fetchrow($result);
$db->sql_freeresult($result); $db->sql_freeresult($result);
if ($row && $row['topic_visibility'] != ITEM_APPROVED && !$auth->acl_get('m_approve', $row['forum_id'])) $phpbb_content_visibility = $phpbb_container->get('content.visibility');
if ($row && !$phpbb_content_visibility->is_visible('topic', $row['forum_id'], $row))
{ {
send_status_line(404, 'Not Found'); send_status_line(404, 'Not Found');
trigger_error('ERROR_NO_ATTACHMENT'); trigger_error('ERROR_NO_ATTACHMENT');

View file

@ -207,7 +207,7 @@ class jabber
*/ */
function login() function login()
{ {
if (!sizeof($this->features)) if (!count($this->features))
{ {
$this->add_to_log('Error: No feature information from server available.'); $this->add_to_log('Error: No feature information from server available.');
return false; return false;
@ -293,7 +293,7 @@ class jabber
*/ */
function get_log() function get_log()
{ {
if ($this->enable_logging && sizeof($this->log_array)) if ($this->enable_logging && count($this->log_array))
{ {
return implode("<br /><br />", $this->log_array); return implode("<br /><br />", $this->log_array);
} }
@ -400,14 +400,14 @@ class jabber
*/ */
function response($xml) function response($xml)
{ {
if (!is_array($xml) || !sizeof($xml)) if (!is_array($xml) || !count($xml))
{ {
return false; return false;
} }
// did we get multiple elements? do one after another // did we get multiple elements? do one after another
// array('message' => ..., 'presence' => ...) // array('message' => ..., 'presence' => ...)
if (sizeof($xml) > 1) if (count($xml) > 1)
{ {
foreach ($xml as $key => $value) foreach ($xml as $key => $value)
{ {
@ -419,7 +419,7 @@ class jabber
{ {
// or even multiple elements of the same type? // or even multiple elements of the same type?
// array('message' => array(0 => ..., 1 => ...)) // array('message' => array(0 => ..., 1 => ...))
if (sizeof(reset($xml)) > 1) if (count(reset($xml)) > 1)
{ {
foreach (reset($xml) as $value) foreach (reset($xml) as $value)
{ {
@ -858,14 +858,14 @@ class jabber
array_push($children, $vals[$i]['value']); array_push($children, $vals[$i]['value']);
} }
while (++$i < sizeof($vals)) while (++$i < count($vals))
{ {
switch ($vals[$i]['type']) switch ($vals[$i]['type'])
{ {
case 'open': case 'open':
$tagname = (isset($vals[$i]['tag'])) ? $vals[$i]['tag'] : ''; $tagname = (isset($vals[$i]['tag'])) ? $vals[$i]['tag'] : '';
$size = (isset($children[$tagname])) ? sizeof($children[$tagname]) : 0; $size = (isset($children[$tagname])) ? count($children[$tagname]) : 0;
if (isset($vals[$i]['attributes'])) if (isset($vals[$i]['attributes']))
{ {
@ -883,7 +883,7 @@ class jabber
case 'complete': case 'complete':
$tagname = $vals[$i]['tag']; $tagname = $vals[$i]['tag'];
$size = (isset($children[$tagname])) ? sizeof($children[$tagname]) : 0; $size = (isset($children[$tagname])) ? count($children[$tagname]) : 0;
$children[$tagname][$size]['#'] = (isset($vals[$i]['value'])) ? $vals[$i]['value'] : array(); $children[$tagname][$size]['#'] = (isset($vals[$i]['value'])) ? $vals[$i]['value'] : array();
if (isset($vals[$i]['attributes'])) if (isset($vals[$i]['attributes']))

View file

@ -22,12 +22,12 @@ if (!defined('IN_PHPBB'))
/** /**
* Functions used to generate additional URL paramters * Functions used to generate additional URL paramters
*/ */
function phpbb_module__url($mode, &$module_row) function phpbb_module__url($mode, $module_row)
{ {
return phpbb_extra_url(); return phpbb_extra_url();
} }
function phpbb_module_notes_url($mode, &$module_row) function phpbb_module_notes_url($mode, $module_row)
{ {
if ($mode == 'front') if ($mode == 'front')
{ {
@ -38,7 +38,7 @@ function phpbb_module_notes_url($mode, &$module_row)
return ($user_id) ? "&amp;u=$user_id" : ''; return ($user_id) ? "&amp;u=$user_id" : '';
} }
function phpbb_module_warn_url($mode, &$module_row) function phpbb_module_warn_url($mode, $module_row)
{ {
if ($mode == 'front' || $mode == 'list') if ($mode == 'front' || $mode == 'list')
{ {
@ -64,27 +64,27 @@ function phpbb_module_warn_url($mode, &$module_row)
} }
} }
function phpbb_module_main_url($mode, &$module_row) function phpbb_module_main_url($mode, $module_row)
{ {
return phpbb_extra_url(); return phpbb_extra_url();
} }
function phpbb_module_logs_url($mode, &$module_row) function phpbb_module_logs_url($mode, $module_row)
{ {
return phpbb_extra_url(); return phpbb_extra_url();
} }
function phpbb_module_ban_url($mode, &$module_row) function phpbb_module_ban_url($mode, $module_row)
{ {
return phpbb_extra_url(); return phpbb_extra_url();
} }
function phpbb_module_queue_url($mode, &$module_row) function phpbb_module_queue_url($mode, $module_row)
{ {
return phpbb_extra_url(); return phpbb_extra_url();
} }
function phpbb_module_reports_url($mode, &$module_row) function phpbb_module_reports_url($mode, $module_row)
{ {
return phpbb_extra_url(); return phpbb_extra_url();
} }
@ -113,7 +113,7 @@ function phpbb_get_topic_data($topic_ids, $acl_list = false, $read_tracking = fa
$topics = array(); $topics = array();
if (!sizeof($topic_ids)) if (!count($topic_ids))
{ {
return array(); return array();
} }
@ -130,7 +130,7 @@ function phpbb_get_topic_data($topic_ids, $acl_list = false, $read_tracking = fa
$cache_topic_ids = array(); $cache_topic_ids = array();
} }
if (sizeof($topic_ids)) if (count($topic_ids))
{ {
$sql_array = array( $sql_array = array(
'SELECT' => 't.*, f.*', 'SELECT' => 't.*, f.*',
@ -197,11 +197,11 @@ function phpbb_get_topic_data($topic_ids, $acl_list = false, $read_tracking = fa
*/ */
function phpbb_get_post_data($post_ids, $acl_list = false, $read_tracking = false) function phpbb_get_post_data($post_ids, $acl_list = false, $read_tracking = false)
{ {
global $db, $auth, $config, $user; global $db, $auth, $config, $user, $phpbb_container;
$rowset = array(); $rowset = array();
if (!sizeof($post_ids)) if (!count($post_ids))
{ {
return array(); return array();
} }
@ -246,6 +246,8 @@ function phpbb_get_post_data($post_ids, $acl_list = false, $read_tracking = fals
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
unset($sql_array); unset($sql_array);
$phpbb_content_visibility = $phpbb_container->get('content.visibility');
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id'])) if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
@ -253,7 +255,7 @@ function phpbb_get_post_data($post_ids, $acl_list = false, $read_tracking = fals
continue; continue;
} }
if ($row['post_visibility'] != ITEM_APPROVED && !$auth->acl_get('m_approve', $row['forum_id'])) if (!$phpbb_content_visibility->is_visible('post', $row['forum_id'], $row))
{ {
// Moderators without the permission to approve post should at least not see them. ;) // Moderators without the permission to approve post should at least not see them. ;)
continue; continue;
@ -280,7 +282,7 @@ function phpbb_get_forum_data($forum_id, $acl_list = 'f_list', $read_tracking =
$forum_id = array($forum_id); $forum_id = array($forum_id);
} }
if (!sizeof($forum_id)) if (!count($forum_id))
{ {
return array(); return array();
} }
@ -329,7 +331,7 @@ function phpbb_get_pm_data($pm_ids)
$rowset = array(); $rowset = array();
if (!sizeof($pm_ids)) if (!count($pm_ids))
{ {
return array(); return array();
} }
@ -730,7 +732,7 @@ function phpbb_check_ids(&$ids, $table, $sql_id, $acl_list = false, $single_foru
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (!sizeof($ids)) if (!count($ids))
{ {
return false; return false;
} }

View file

@ -24,8 +24,9 @@ if (!defined('IN_PHPBB'))
*/ */
class messenger class messenger
{ {
var $msg, $extra_headers, $replyto, $from, $subject; var $msg, $replyto, $from, $subject;
var $addresses = array(); var $addresses = array();
var $extra_headers = array();
var $mail_priority = MAIL_NORMAL_PRIORITY; var $mail_priority = MAIL_NORMAL_PRIORITY;
var $use_queue = true; var $use_queue = true;
@ -36,7 +37,7 @@ class messenger
/** /**
* Constructor * Constructor
*/ */
function messenger($use_queue = true) function __construct($use_queue = true)
{ {
global $config; global $config;
@ -84,7 +85,7 @@ class messenger
return; return;
} }
$pos = isset($this->addresses['to']) ? sizeof($this->addresses['to']) : 0; $pos = isset($this->addresses['to']) ? count($this->addresses['to']) : 0;
$this->addresses['to'][$pos]['email'] = trim($address); $this->addresses['to'][$pos]['email'] = trim($address);
@ -109,7 +110,7 @@ class messenger
return; return;
} }
$pos = isset($this->addresses['cc']) ? sizeof($this->addresses['cc']) : 0; $pos = isset($this->addresses['cc']) ? count($this->addresses['cc']) : 0;
$this->addresses['cc'][$pos]['email'] = trim($address); $this->addresses['cc'][$pos]['email'] = trim($address);
$this->addresses['cc'][$pos]['name'] = trim($realname); $this->addresses['cc'][$pos]['name'] = trim($realname);
} }
@ -124,7 +125,7 @@ class messenger
return; return;
} }
$pos = isset($this->addresses['bcc']) ? sizeof($this->addresses['bcc']) : 0; $pos = isset($this->addresses['bcc']) ? count($this->addresses['bcc']) : 0;
$this->addresses['bcc'][$pos]['email'] = trim($address); $this->addresses['bcc'][$pos]['email'] = trim($address);
$this->addresses['bcc'][$pos]['name'] = trim($realname); $this->addresses['bcc'][$pos]['name'] = trim($realname);
} }
@ -140,7 +141,7 @@ class messenger
return; return;
} }
$pos = isset($this->addresses['im']) ? sizeof($this->addresses['im']) : 0; $pos = isset($this->addresses['im']) ? count($this->addresses['im']) : 0;
$this->addresses['im'][$pos]['uid'] = trim($address); $this->addresses['im'][$pos]['uid'] = trim($address);
$this->addresses['im'][$pos]['name'] = trim($realname); $this->addresses['im'][$pos]['name'] = trim($realname);
} }
@ -180,10 +181,9 @@ class messenger
/** /**
* Adds X-AntiAbuse headers * Adds X-AntiAbuse headers
* *
* @param array $config Configuration array * @param \phpbb\config\config $config Config object
* @param user $user A user object * @param \phpbb\user $user User object
* * @return void
* @return null
*/ */
function anti_abuse_headers($config, $user) function anti_abuse_headers($config, $user)
{ {
@ -325,9 +325,26 @@ class messenger
)); ));
$subject = $this->subject; $subject = $this->subject;
$message = $this->msg; $template = $this->template;
/** /**
* Event to modify notification message text before parsing * Event to modify the template before parsing
*
* @event core.modify_notification_template
* @var int method User notification method NOTIFY_EMAIL|NOTIFY_IM|NOTIFY_BOTH
* @var bool break Flag indicating if the function only formats the subject
* and the message without sending it
* @var string subject The message subject
* @var \phpbb\template\template template The (readonly) template object
* @since 3.2.4-RC1
*/
$vars = array('method', 'break', 'subject', 'template');
extract($phpbb_dispatcher->trigger_event('core.modify_notification_template', compact($vars)));
// Parse message through template
$message = trim($this->template->assign_display('body'));
/**
* Event to modify notification message text after parsing
* *
* @event core.modify_notification_message * @event core.modify_notification_message
* @var int method User notification method NOTIFY_EMAIL|NOTIFY_IM|NOTIFY_BOTH * @var int method User notification method NOTIFY_EMAIL|NOTIFY_IM|NOTIFY_BOTH
@ -337,19 +354,12 @@ class messenger
* @var string message The message text * @var string message The message text
* @since 3.1.11-RC1 * @since 3.1.11-RC1
*/ */
$vars = array( $vars = array('method', 'break', 'subject', 'message');
'method',
'break',
'subject',
'message',
);
extract($phpbb_dispatcher->trigger_event('core.modify_notification_message', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.modify_notification_message', compact($vars)));
$this->subject = $subject; $this->subject = $subject;
$this->msg = $message; $this->msg = $message;
unset($subject, $message); unset($subject, $message, $template);
// Parse message through template
$this->msg = trim($this->template->assign_display('body'));
// Because we use \n for newlines in the body message we need to fix line encoding errors for those admins who uploaded email template files in the wrong encoding // Because we use \n for newlines in the body message we need to fix line encoding errors for those admins who uploaded email template files in the wrong encoding
$this->msg = str_replace("\r\n", "\n", $this->msg); $this->msg = str_replace("\r\n", "\n", $this->msg);
@ -368,6 +378,12 @@ class messenger
$this->subject = (($this->subject != '') ? $this->subject : $user->lang['NO_EMAIL_SUBJECT']); $this->subject = (($this->subject != '') ? $this->subject : $user->lang['NO_EMAIL_SUBJECT']);
} }
if (preg_match('#^(List-Unsubscribe:(.*?))$#m', $this->msg, $match))
{
$this->extra_headers[] = $match[1];
$drop_header .= '[\r\n]*?' . preg_quote($match[1], '#');
}
if ($drop_header) if ($drop_header)
{ {
$this->msg = trim(preg_replace('#' . $drop_header . '#s', '', $this->msg)); $this->msg = trim(preg_replace('#' . $drop_header . '#s', '', $this->msg));
@ -416,7 +432,7 @@ class messenger
switch ($type) switch ($type)
{ {
case 'EMAIL': case 'EMAIL':
$message = '<strong>EMAIL/' . (($config['smtp_delivery']) ? 'SMTP' : 'PHP/' . $config['email_function_name'] . '()') . '</strong>'; $message = '<strong>EMAIL/' . (($config['smtp_delivery']) ? 'SMTP' : 'PHP/mail()') . '</strong>';
break; break;
default: default:
@ -503,7 +519,7 @@ class messenger
$vars = array('headers'); $vars = array('headers');
extract($phpbb_dispatcher->trigger_event('core.modify_email_headers', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.modify_email_headers', compact($vars)));
if (sizeof($this->extra_headers)) if (count($this->extra_headers))
{ {
$headers = array_merge($headers, $this->extra_headers); $headers = array_merge($headers, $this->extra_headers);
} }
@ -516,7 +532,7 @@ class messenger
*/ */
function msg_email() function msg_email()
{ {
global $config; global $config, $phpbb_dispatcher;
if (empty($config['email_enable'])) if (empty($config['email_enable']))
{ {
@ -544,6 +560,33 @@ class messenger
$contact_name = htmlspecialchars_decode($config['board_contact_name']); $contact_name = htmlspecialchars_decode($config['board_contact_name']);
$board_contact = (($contact_name !== '') ? '"' . mail_encode($contact_name) . '" ' : '') . '<' . $config['board_contact'] . '>'; $board_contact = (($contact_name !== '') ? '"' . mail_encode($contact_name) . '" ' : '') . '<' . $config['board_contact'] . '>';
$break = false;
$addresses = $this->addresses;
$subject = $this->subject;
$msg = $this->msg;
/**
* Event to send message via external transport
*
* @event core.notification_message_email
* @var bool break Flag indicating if the function return after hook
* @var array addresses The message recipients
* @var string subject The message subject
* @var string msg The message text
* @since 3.2.4-RC1
*/
$vars = array(
'break',
'addresses',
'subject',
'msg',
);
extract($phpbb_dispatcher->trigger_event('core.notification_message_email', compact($vars)));
if ($break)
{
return true;
}
if (empty($this->replyto)) if (empty($this->replyto))
{ {
$this->replyto = $board_contact; $this->replyto = $board_contact;
@ -749,7 +792,7 @@ class queue
/** /**
* constructor * constructor
*/ */
function queue() function __construct()
{ {
global $phpEx, $phpbb_root_path, $phpbb_filesystem, $phpbb_container; global $phpEx, $phpbb_root_path, $phpbb_filesystem, $phpbb_container;
@ -782,7 +825,7 @@ class queue
*/ */
function process() function process()
{ {
global $config, $phpEx, $phpbb_root_path, $user; global $config, $phpEx, $phpbb_root_path, $user, $phpbb_dispatcher;
$lock = new \phpbb\lock\flock($this->cache_file); $lock = new \phpbb\lock\flock($this->cache_file);
$lock->acquire(); $lock->acquire();
@ -814,7 +857,7 @@ class queue
} }
$package_size = $data_ary['package_size']; $package_size = $data_ary['package_size'];
$num_items = (!$package_size || sizeof($data_ary['data']) < $package_size) ? sizeof($data_ary['data']) : $package_size; $num_items = (!$package_size || count($data_ary['data']) < $package_size) ? count($data_ary['data']) : $package_size;
/* /*
* This code is commented out because it causes problems on some web hosts. * This code is commented out because it causes problems on some web hosts.
@ -823,9 +866,9 @@ class queue
* web host and the package size setting is wrong. * web host and the package size setting is wrong.
// If the amount of emails to be sent is way more than package_size than we need to increase it to prevent backlogs... // If the amount of emails to be sent is way more than package_size than we need to increase it to prevent backlogs...
if (sizeof($data_ary['data']) > $package_size * 2.5) if (count($data_ary['data']) > $package_size * 2.5)
{ {
$num_items = sizeof($data_ary['data']); $num_items = count($data_ary['data']);
} }
*/ */
@ -879,23 +922,45 @@ class queue
switch ($object) switch ($object)
{ {
case 'email': case 'email':
$err_msg = ''; $break = false;
$to = (!$to) ? 'undisclosed-recipients:;' : $to; /**
* Event to send message via external transport
*
* @event core.notification_message_process
* @var bool break Flag indicating if the function return after hook
* @var array addresses The message recipients
* @var string subject The message subject
* @var string msg The message text
* @since 3.2.4-RC1
*/
$vars = array(
'break',
'addresses',
'subject',
'msg',
);
extract($phpbb_dispatcher->trigger_event('core.notification_message_process', compact($vars)));
if ($config['smtp_delivery']) if (!$break)
{ {
$result = smtpmail($addresses, mail_encode($subject), wordwrap(utf8_wordwrap($msg), 997, "\n", true), $err_msg, $headers); $err_msg = '';
} $to = (!$to) ? 'undisclosed-recipients:;' : $to;
else
{
$result = phpbb_mail($to, $subject, $msg, $headers, PHP_EOL, $err_msg);
}
if (!$result) if ($config['smtp_delivery'])
{ {
$messenger = new messenger(); $result = smtpmail($addresses, mail_encode($subject), wordwrap(utf8_wordwrap($msg), 997, "\n", true), $err_msg, $headers);
$messenger->error('EMAIL', $err_msg); }
continue 2; else
{
$result = phpbb_mail($to, $subject, $msg, $headers, PHP_EOL, $err_msg);
}
if (!$result)
{
$messenger = new messenger();
$messenger->error('EMAIL', $err_msg);
continue 2;
}
} }
break; break;
@ -914,7 +979,7 @@ class queue
} }
// No more data for this object? Unset it // No more data for this object? Unset it
if (!sizeof($this->queue_data[$object]['data'])) if (!count($this->queue_data[$object]['data']))
{ {
unset($this->queue_data[$object]); unset($this->queue_data[$object]);
} }
@ -930,7 +995,7 @@ class queue
} }
} }
if (!sizeof($this->queue_data)) if (!count($this->queue_data))
{ {
@unlink($this->cache_file); @unlink($this->cache_file);
} }
@ -965,7 +1030,7 @@ class queue
*/ */
function save() function save()
{ {
if (!sizeof($this->data)) if (!count($this->data))
{ {
return; return;
} }
@ -979,7 +1044,7 @@ class queue
foreach ($this->queue_data as $object => $data_ary) foreach ($this->queue_data as $object => $data_ary)
{ {
if (isset($this->data[$object]) && sizeof($this->data[$object])) if (isset($this->data[$object]) && count($this->data[$object]))
{ {
$this->data[$object]['data'] = array_merge($data_ary['data'], $this->data[$object]['data']); $this->data[$object]['data'] = array_merge($data_ary['data'], $this->data[$object]['data']);
} }
@ -1067,7 +1132,7 @@ function smtpmail($addresses, $subject, $message, &$err_msg, $headers = false)
$mail_rcpt = $mail_to = $mail_cc = array(); $mail_rcpt = $mail_to = $mail_cc = array();
// Build correct addresses for RCPT TO command and the client side display (TO, CC) // Build correct addresses for RCPT TO command and the client side display (TO, CC)
if (isset($addresses['to']) && sizeof($addresses['to'])) if (isset($addresses['to']) && count($addresses['to']))
{ {
foreach ($addresses['to'] as $which_ary) foreach ($addresses['to'] as $which_ary)
{ {
@ -1076,7 +1141,7 @@ function smtpmail($addresses, $subject, $message, &$err_msg, $headers = false)
} }
} }
if (isset($addresses['bcc']) && sizeof($addresses['bcc'])) if (isset($addresses['bcc']) && count($addresses['bcc']))
{ {
foreach ($addresses['bcc'] as $which_ary) foreach ($addresses['bcc'] as $which_ary)
{ {
@ -1084,7 +1149,7 @@ function smtpmail($addresses, $subject, $message, &$err_msg, $headers = false)
} }
} }
if (isset($addresses['cc']) && sizeof($addresses['cc'])) if (isset($addresses['cc']) && count($addresses['cc']))
{ {
foreach ($addresses['cc'] as $which_ary) foreach ($addresses['cc'] as $which_ary)
{ {
@ -1263,7 +1328,7 @@ class smtp_class
var $backtrace = false; var $backtrace = false;
var $backtrace_log = array(); var $backtrace_log = array();
function smtp_class() function __construct()
{ {
// Always create a backtrace for admins to identify SMTP problems // Always create a backtrace for admins to identify SMTP problems
$this->backtrace = true; $this->backtrace = true;
@ -1516,6 +1581,14 @@ class smtp_class
*/ */
protected function starttls() protected function starttls()
{ {
global $config;
// allow SMTPS (what was used by phpBB 3.0) if hostname is prefixed with tls:// or ssl://
if (strpos($config['smtp_host'], 'tls://') === 0 || strpos($config['smtp_host'], 'ssl://') === 0)
{
return true;
}
if (!function_exists('stream_socket_enable_crypto')) if (!function_exists('stream_socket_enable_crypto'))
{ {
return false; return false;
@ -1538,7 +1611,9 @@ class smtp_class
if (socket_set_blocking($this->socket, 1)) if (socket_set_blocking($this->socket, 1))
{ {
$result = stream_socket_enable_crypto($this->socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); // https://secure.php.net/manual/en/function.stream-socket-enable-crypto.php#119122
$crypto = (phpbb_version_compare(PHP_VERSION, '5.6.7', '<')) ? STREAM_CRYPTO_METHOD_TLS_CLIENT : STREAM_CRYPTO_METHOD_SSLv23_CLIENT;
$result = stream_socket_enable_crypto($this->socket, true, $crypto);
socket_set_blocking($this->socket, (int) $stream_meta['blocked']); socket_set_blocking($this->socket, (int) $stream_meta['blocked']);
} }
@ -1802,11 +1877,11 @@ function mail_encode($str, $eol = "\r\n")
$array = utf8_str_split($str); $array = utf8_str_split($str);
$str = ''; $str = '';
while (sizeof($array)) while (count($array))
{ {
$text = ''; $text = '';
while (sizeof($array) && intval((strlen($text . $array[0]) + 2) / 3) << 2 <= $split_length) while (count($array) && intval((strlen($text . $array[0]) + 2) / 3) << 2 <= $split_length)
{ {
$text .= array_shift($array); $text .= array_shift($array);
} }
@ -1839,7 +1914,8 @@ function phpbb_mail($to, $subject, $msg, $headers, $eol, &$err_msg)
// On some PHP Versions mail() *may* fail if there are newlines within the subject. // On some PHP Versions mail() *may* fail if there are newlines within the subject.
// Newlines are used as a delimiter for lines in mail_encode() according to RFC 2045 section 6.8. // Newlines are used as a delimiter for lines in mail_encode() according to RFC 2045 section 6.8.
// Because PHP can't decide what is wanted we revert back to the non-RFC-compliant way of separating by one space (Use '' as parameter to mail_encode() results in SPACE used) // Because PHP can't decide what is wanted we revert back to the non-RFC-compliant way of separating by one space (Use '' as parameter to mail_encode() results in SPACE used)
$result = $config['email_function_name']($to, mail_encode($subject, ''), wordwrap(utf8_wordwrap($msg), 997, "\n", true), $headers); $additional_parameters = $config['email_force_sender'] ? '-f' . $config['board_email'] : '';
$result = mail($to, mail_encode($subject, ''), wordwrap(utf8_wordwrap($msg), 997, "\n", true), $headers, $additional_parameters);
$collector->uninstall(); $collector->uninstall();
$err_msg = $collector->format_errors(); $err_msg = $collector->format_errors();

View file

@ -40,7 +40,7 @@ class p_master
* Constuctor * Constuctor
* Set module include path * Set module include path
*/ */
function p_master($include_path = false) function __construct($include_path = false)
{ {
global $phpbb_root_path; global $phpbb_root_path;
@ -243,7 +243,7 @@ class p_master
} }
} }
$depth = sizeof($this->module_cache['parents'][$row['module_id']]); $depth = count($this->module_cache['parents'][$row['module_id']]);
// We need to prefix the functions to not create a naming conflict // We need to prefix the functions to not create a naming conflict
@ -279,7 +279,7 @@ class p_master
'parent' => (int) $row['parent_id'], 'parent' => (int) $row['parent_id'],
'cat' => ($row['right_id'] > $row['left_id'] + 1) ? true : false, 'cat' => ($row['right_id'] > $row['left_id'] + 1) ? true : false,
'is_duplicate' => ($row['module_basename'] && sizeof($names[$row['module_basename'] . '_' . $row['module_mode']]) > 1) ? true : false, 'is_duplicate' => ($row['module_basename'] && count($names[$row['module_basename'] . '_' . $row['module_mode']]) > 1) ? true : false,
'name' => (string) $row['module_basename'], 'name' => (string) $row['module_basename'],
'mode' => (string) $row['module_mode'], 'mode' => (string) $row['module_mode'],
@ -431,7 +431,7 @@ class p_master
extract($phpbb_dispatcher->trigger_event('core.module_auth', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.module_auth', compact($vars)));
$tokens = $match[0]; $tokens = $match[0];
for ($i = 0, $size = sizeof($tokens); $i < $size; $i++) for ($i = 0, $size = count($tokens); $i < $size; $i++)
{ {
$token = &$tokens[$i]; $token = &$tokens[$i];

View file

@ -114,7 +114,7 @@ function generate_smilies($mode, $forum_id)
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($smilies)) if (count($smilies))
{ {
$root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_path_helper->get_web_root_path(); $root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_path_helper->get_web_root_path();
@ -200,13 +200,15 @@ function update_post_information($type, $ids, $return_update_sql = false)
$topic_condition = ''; $topic_condition = '';
} }
if (sizeof($ids) == 1) if (count($ids) == 1)
{ {
$sql = 'SELECT MAX(p.post_id) as last_post_id $sql = 'SELECT p.post_id as last_post_id
FROM ' . POSTS_TABLE . " p $topic_join FROM ' . POSTS_TABLE . " p $topic_join
WHERE " . $db->sql_in_set('p.' . $type . '_id', $ids) . " WHERE " . $db->sql_in_set('p.' . $type . '_id', $ids) . "
$topic_condition $topic_condition
AND p.post_visibility = " . ITEM_APPROVED; AND p.post_visibility = " . ITEM_APPROVED . "
ORDER BY p.post_id DESC";
$result = $db->sql_query_limit($sql, 1);
} }
else else
{ {
@ -216,13 +218,13 @@ function update_post_information($type, $ids, $return_update_sql = false)
$topic_condition $topic_condition
AND p.post_visibility = " . ITEM_APPROVED . " AND p.post_visibility = " . ITEM_APPROVED . "
GROUP BY p.{$type}_id"; GROUP BY p.{$type}_id";
$result = $db->sql_query($sql);
} }
$result = $db->sql_query($sql);
$last_post_ids = array(); $last_post_ids = array();
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
if (sizeof($ids) == 1) if (count($ids) == 1)
{ {
$row[$type . '_id'] = $ids[0]; $row[$type . '_id'] = $ids[0];
} }
@ -256,7 +258,7 @@ function update_post_information($type, $ids, $return_update_sql = false)
} }
} }
if (sizeof($last_post_ids)) if (count($last_post_ids))
{ {
$sql = 'SELECT p.' . $type . '_id, p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.user_id, u.username, u.user_colour $sql = 'SELECT p.' . $type . '_id, p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.user_id, u.username, u.user_colour
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
@ -277,7 +279,7 @@ function update_post_information($type, $ids, $return_update_sql = false)
} }
unset($empty_forums, $ids, $last_post_ids); unset($empty_forums, $ids, $last_post_ids);
if ($return_update_sql || !sizeof($update_sql)) if ($return_update_sql || !count($update_sql))
{ {
return $update_sql; return $update_sql;
} }
@ -310,7 +312,7 @@ function posting_gen_topic_icons($mode, $icon_id)
$template->assign_var('S_NO_ICON_CHECKED', ' checked="checked"'); $template->assign_var('S_NO_ICON_CHECKED', ' checked="checked"');
} }
if (sizeof($icons)) if (count($icons))
{ {
$root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_root_path; $root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_root_path;
@ -519,7 +521,7 @@ function get_supported_image_types($type = false)
*/ */
function create_thumbnail($source, $destination, $mimetype) function create_thumbnail($source, $destination, $mimetype)
{ {
global $config, $phpbb_filesystem; global $config, $phpbb_filesystem, $phpbb_dispatcher;
$min_filesize = (int) $config['img_min_thumb_filesize']; $min_filesize = (int) $config['img_min_thumb_filesize'];
$img_filesize = (file_exists($source)) ? @filesize($source) : false; $img_filesize = (file_exists($source)) ? @filesize($source) : false;
@ -551,25 +553,31 @@ function create_thumbnail($source, $destination, $mimetype)
return false; return false;
} }
$used_imagick = false; $thumbnail_created = false;
// Only use ImageMagick if defined and the passthru function not disabled /**
if ($config['img_imagick'] && function_exists('passthru')) * Create thumbnail event to replace GD thumbnail creation with for example ImageMagick
{ *
if (substr($config['img_imagick'], -1) !== '/') * @event core.thumbnail_create_before
{ * @var string source Image source path
$config['img_imagick'] .= '/'; * @var string destination Thumbnail destination path
} * @var string mimetype Image mime type
* @var float new_width Calculated thumbnail width
* @var float new_height Calculated thumbnail height
* @var bool thumbnail_created Set to true to skip default GD thumbnail creation
* @since 3.2.4
*/
$vars = array(
'source',
'destination',
'mimetype',
'new_width',
'new_height',
'thumbnail_created',
);
extract($phpbb_dispatcher->trigger_event('core.thumbnail_create_before', compact($vars)));
@passthru(escapeshellcmd($config['img_imagick']) . 'convert' . ((defined('PHP_OS') && preg_match('#^win#i', PHP_OS)) ? '.exe' : '') . ' -quality 85 -geometry ' . $new_width . 'x' . $new_height . ' "' . str_replace('\\', '/', $source) . '" "' . str_replace('\\', '/', $destination) . '"'); if (!$thumbnail_created)
if (file_exists($destination))
{
$used_imagick = true;
}
}
if (!$used_imagick)
{ {
$type = get_supported_image_types($type); $type = get_supported_image_types($type);
@ -690,7 +698,7 @@ function posting_gen_inline_attachments(&$attachment_data)
{ {
global $template; global $template;
if (sizeof($attachment_data)) if (count($attachment_data))
{ {
$s_inline_attachment_options = ''; $s_inline_attachment_options = '';
@ -717,20 +725,21 @@ function posting_gen_attachment_entry($attachment_data, &$filename_data, $show_a
// Some default template variables // Some default template variables
$template->assign_vars(array( $template->assign_vars(array(
'S_SHOW_ATTACH_BOX' => $show_attach_box, 'S_SHOW_ATTACH_BOX' => $show_attach_box,
'S_HAS_ATTACHMENTS' => sizeof($attachment_data), 'S_HAS_ATTACHMENTS' => count($attachment_data),
'FILESIZE' => $config['max_filesize'], 'FILESIZE' => $config['max_filesize'],
'FILE_COMMENT' => (isset($filename_data['filecomment'])) ? $filename_data['filecomment'] : '', 'FILE_COMMENT' => (isset($filename_data['filecomment'])) ? $filename_data['filecomment'] : '',
)); ));
if (sizeof($attachment_data)) if (count($attachment_data))
{ {
// We display the posted attachments within the desired order. // We display the posted attachments within the desired order.
($config['display_order']) ? krsort($attachment_data) : ksort($attachment_data); ($config['display_order']) ? krsort($attachment_data) : ksort($attachment_data);
$attachrow_template_vars = [];
foreach ($attachment_data as $count => $attach_row) foreach ($attachment_data as $count => $attach_row)
{ {
$hidden = ''; $hidden = '';
$attachrow_template_vars = array();
$attach_row['real_filename'] = utf8_basename($attach_row['real_filename']); $attach_row['real_filename'] = utf8_basename($attach_row['real_filename']);
foreach ($attach_row as $key => $value) foreach ($attach_row as $key => $value)
@ -768,7 +777,7 @@ function posting_gen_attachment_entry($attachment_data, &$filename_data, $show_a
$template->assign_block_vars_array('attach_row', $attachrow_template_vars); $template->assign_block_vars_array('attach_row', $attachrow_template_vars);
} }
return sizeof($attachment_data); return count($attachment_data);
} }
// //
@ -816,13 +825,13 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0, $pm_action = '', $ms
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (!sizeof($draft_rows)) if (!count($draft_rows))
{ {
return; return;
} }
$topic_rows = array(); $topic_rows = array();
if (sizeof($topic_ids)) if (count($topic_ids))
{ {
$sql = 'SELECT topic_id, forum_id, topic_title, topic_poster $sql = 'SELECT topic_id, forum_id, topic_title, topic_poster
FROM ' . TOPICS_TABLE . ' FROM ' . TOPICS_TABLE . '
@ -935,7 +944,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (!sizeof($post_list)) if (!count($post_list))
{ {
return false; return false;
} }
@ -969,6 +978,30 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
AND u.user_id = p.poster_id', AND u.user_id = p.poster_id',
); );
/**
* Event to modify the SQL query for topic reviews
*
* @event core.topic_review_modify_sql_ary
* @var int topic_id The topic ID that is being reviewed
* @var int forum_id The topic's forum ID
* @var string mode The topic review mode
* @var int cur_post_id Post offset ID
* @var bool show_quote_button Flag indicating if the quote button should be displayed
* @var array post_list Array with the post IDs
* @var array sql_ary Array with the SQL query
* @since 3.2.8-RC1
*/
$vars = array(
'topic_id',
'forum_id',
'mode',
'cur_post_id',
'show_quote_button',
'post_list',
'sql_ary',
);
extract($phpbb_dispatcher->trigger_event('core.topic_review_modify_sql_ary', compact($vars)));
$sql = $db->sql_build_query('SELECT', $sql_ary); $sql = $db->sql_build_query('SELECT', $sql_ary);
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
@ -1030,7 +1063,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
); );
extract($phpbb_dispatcher->trigger_event('core.topic_review_modify_post_list', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.topic_review_modify_post_list', compact($vars)));
for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i) for ($i = 0, $end = count($post_list); $i < $end; ++$i)
{ {
// A non-existing rowset only happens if there was no user present for the entered poster_id // A non-existing rowset only happens if there was no user present for the entered poster_id
// This could be a broken posts table. // This could be a broken posts table.
@ -1257,7 +1290,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $
foreach ($shadow_forum_ids as $updated_forum => $topic_count) foreach ($shadow_forum_ids as $updated_forum => $topic_count)
{ {
// counting is fun! we only have to do sizeof($forum_ids) number of queries, // counting is fun! we only have to do count($forum_ids) number of queries,
// even if the topic is moved back to where its shadow lives (we count how many times it is in a forum) // even if the topic is moved back to where its shadow lives (we count how many times it is in a forum)
$sql = 'UPDATE ' . FORUMS_TABLE . ' $sql = 'UPDATE ' . FORUMS_TABLE . '
SET forum_topics_approved = forum_topics_approved - ' . $topic_count . ' SET forum_topics_approved = forum_topics_approved - ' . $topic_count . '
@ -1275,9 +1308,10 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $
delete_topics('topic_id', array($topic_id), false); delete_topics('topic_id', array($topic_id), false);
$phpbb_content_visibility->remove_topic_from_statistic($data, $sql_data); $phpbb_content_visibility->remove_topic_from_statistic($data, $sql_data);
$config->increment('num_posts', -1, false);
$update_sql = update_post_information('forum', $forum_id, true); $update_sql = update_post_information('forum', $forum_id, true);
if (sizeof($update_sql)) if (count($update_sql))
{ {
$sql_data[FORUMS_TABLE] .= ($sql_data[FORUMS_TABLE]) ? ', ' : ''; $sql_data[FORUMS_TABLE] .= ($sql_data[FORUMS_TABLE]) ? ', ' : '';
$sql_data[FORUMS_TABLE] .= implode(', ', $update_sql[$forum_id]); $sql_data[FORUMS_TABLE] .= implode(', ', $update_sql[$forum_id]);
@ -1326,7 +1360,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $
{ {
// Update last post information when hard deleting. Soft delete already did that by itself. // Update last post information when hard deleting. Soft delete already did that by itself.
$update_sql = update_post_information('forum', $forum_id, true); $update_sql = update_post_information('forum', $forum_id, true);
if (sizeof($update_sql)) if (count($update_sql))
{ {
$sql_data[FORUMS_TABLE] = (($sql_data[FORUMS_TABLE]) ? $sql_data[FORUMS_TABLE] . ', ' : '') . implode(', ', $update_sql[$forum_id]); $sql_data[FORUMS_TABLE] = (($sql_data[FORUMS_TABLE]) ? $sql_data[FORUMS_TABLE] . ', ' : '') . implode(', ', $update_sql[$forum_id]);
} }
@ -1968,7 +2002,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
$sql_insert_ary = array(); $sql_insert_ary = array();
for ($i = 0, $size = sizeof($poll_ary['poll_options']); $i < $size; $i++) for ($i = 0, $size = count($poll_ary['poll_options']); $i < $size; $i++)
{ {
if (strlen(trim($poll_ary['poll_options'][$i]))) if (strlen(trim($poll_ary['poll_options'][$i])))
{ {
@ -1976,7 +2010,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
{ {
// If we add options we need to put them to the end to be able to preserve votes... // If we add options we need to put them to the end to be able to preserve votes...
$sql_insert_ary[] = array( $sql_insert_ary[] = array(
'poll_option_id' => (int) sizeof($cur_poll_options) + 1 + sizeof($sql_insert_ary), 'poll_option_id' => (int) count($cur_poll_options) + 1 + count($sql_insert_ary),
'topic_id' => (int) $data_ary['topic_id'], 'topic_id' => (int) $data_ary['topic_id'],
'poll_option_text' => (string) $poll_ary['poll_options'][$i] 'poll_option_text' => (string) $poll_ary['poll_options'][$i]
); );
@ -1994,16 +2028,16 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
$db->sql_multi_insert(POLL_OPTIONS_TABLE, $sql_insert_ary); $db->sql_multi_insert(POLL_OPTIONS_TABLE, $sql_insert_ary);
if (sizeof($poll_ary['poll_options']) < sizeof($cur_poll_options)) if (count($poll_ary['poll_options']) < count($cur_poll_options))
{ {
$sql = 'DELETE FROM ' . POLL_OPTIONS_TABLE . ' $sql = 'DELETE FROM ' . POLL_OPTIONS_TABLE . '
WHERE poll_option_id > ' . sizeof($poll_ary['poll_options']) . ' WHERE poll_option_id > ' . count($poll_ary['poll_options']) . '
AND topic_id = ' . $data_ary['topic_id']; AND topic_id = ' . $data_ary['topic_id'];
$db->sql_query($sql); $db->sql_query($sql);
} }
// If edited, we would need to reset votes (since options can be re-ordered above, you can't be sure if the change is for changing the text or adding an option // If edited, we would need to reset votes (since options can be re-ordered above, you can't be sure if the change is for changing the text or adding an option
if ($mode == 'edit' && sizeof($poll_ary['poll_options']) != sizeof($cur_poll_options)) if ($mode == 'edit' && count($poll_ary['poll_options']) != count($cur_poll_options))
{ {
$db->sql_query('DELETE FROM ' . POLL_VOTES_TABLE . ' WHERE topic_id = ' . $data_ary['topic_id']); $db->sql_query('DELETE FROM ' . POLL_VOTES_TABLE . ' WHERE topic_id = ' . $data_ary['topic_id']);
$db->sql_query('UPDATE ' . POLL_OPTIONS_TABLE . ' SET poll_option_total = 0 WHERE topic_id = ' . $data_ary['topic_id']); $db->sql_query('UPDATE ' . POLL_OPTIONS_TABLE . ' SET poll_option_total = 0 WHERE topic_id = ' . $data_ary['topic_id']);
@ -2021,7 +2055,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
$orphan_rows[(int) $attach_row['attach_id']] = array(); $orphan_rows[(int) $attach_row['attach_id']] = array();
} }
if (sizeof($orphan_rows)) if (count($orphan_rows))
{ {
$sql = 'SELECT attach_id, filesize, physical_filename $sql = 'SELECT attach_id, filesize, physical_filename
FROM ' . ATTACHMENTS_TABLE . ' FROM ' . ATTACHMENTS_TABLE . '
@ -2045,6 +2079,11 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
continue; continue;
} }
if (preg_match('/[\x{10000}-\x{10FFFF}]/u', $attach_row['attach_comment']))
{
trigger_error('ATTACH_COMMENT_NO_EMOJIS');
}
if (!$attach_row['is_orphan']) if (!$attach_row['is_orphan'])
{ {
// update entry in db if attachment already stored in db and filespace // update entry in db if attachment already stored in db and filespace
@ -2281,6 +2320,19 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
'post_subject' => $subject, 'post_subject' => $subject,
)); ));
/**
* This event allows you to modify the notification data upon submission
*
* @event core.modify_submit_notification_data
* @var array notification_data The notification data to be inserted in to the database
* @var array data_ary The data array with a lot of the post submission data
* @var string mode The posting mode
* @var int poster_id The poster id
* @since 3.2.4-RC1
*/
$vars = array('notification_data', 'data_ary', 'mode', 'poster_id');
extract($phpbb_dispatcher->trigger_event('core.modify_submit_notification_data', compact($vars)));
/* @var $phpbb_notifications \phpbb\notification\manager */ /* @var $phpbb_notifications \phpbb\notification\manager */
$phpbb_notifications = $phpbb_container->get('notification_manager'); $phpbb_notifications = $phpbb_container->get('notification_manager');
@ -2308,8 +2360,14 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
case 'edit_first_post': case 'edit_first_post':
case 'edit': case 'edit':
case 'edit_last_post': case 'edit_last_post':
if ($user->data['user_id'] == $poster_id)
{
$phpbb_notifications->update_notifications(array(
'notification.type.quote',
), $notification_data);
}
$phpbb_notifications->update_notifications(array( $phpbb_notifications->update_notifications(array(
'notification.type.quote',
'notification.type.bookmark', 'notification.type.bookmark',
'notification.type.topic', 'notification.type.topic',
'notification.type.post', 'notification.type.post',

View file

@ -466,7 +466,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
$user_rules = $db->sql_fetchrowset($result); $user_rules = $db->sql_fetchrowset($result);
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($user_rules)) if (count($user_rules))
{ {
$sql = 'SELECT zebra_id, friend, foe $sql = 'SELECT zebra_id, friend, foe
FROM ' . ZEBRA_TABLE . " FROM ' . ZEBRA_TABLE . "
@ -490,7 +490,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
'bcc' => explode(':', $row['bcc_address']), 'bcc' => explode(':', $row['bcc_address']),
'friend' => (isset($zebra[$row['author_id']])) ? $zebra[$row['author_id']]['friend'] : 0, 'friend' => (isset($zebra[$row['author_id']])) ? $zebra[$row['author_id']]['friend'] : 0,
'foe' => (isset($zebra[$row['author_id']])) ? $zebra[$row['author_id']]['foe'] : 0, 'foe' => (isset($zebra[$row['author_id']])) ? $zebra[$row['author_id']]['foe'] : 0,
'user_in_group' => array($user->data['group_id']), 'user_in_group' => $user->data['group_id'],
'author_in_group' => array()) 'author_in_group' => array())
); );
@ -499,7 +499,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
$db->sql_freeresult($result); $db->sql_freeresult($result);
// Retrieve user memberships // Retrieve user memberships
if (sizeof($user_ids)) if (count($user_ids))
{ {
$sql = 'SELECT * $sql = 'SELECT *
FROM ' . USER_GROUP_TABLE . ' FROM ' . USER_GROUP_TABLE . '
@ -600,14 +600,14 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
// only gone through if new messages arrive. // only gone through if new messages arrive.
// Delete messages // Delete messages
if (sizeof($delete_ids)) if (count($delete_ids))
{ {
$num_removed += sizeof($delete_ids); $num_removed += count($delete_ids);
delete_pm($user_id, $delete_ids, PRIVMSGS_NO_BOX); delete_pm($user_id, $delete_ids, PRIVMSGS_NO_BOX);
} }
// Set messages to Unread // Set messages to Unread
if (sizeof($unread_ids)) if (count($unread_ids))
{ {
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' $sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . '
SET pm_unread = 0 SET pm_unread = 0
@ -618,7 +618,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
} }
// mark messages as important // mark messages as important
if (sizeof($important_ids)) if (count($important_ids))
{ {
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' $sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . '
SET pm_marked = 1 - pm_marked SET pm_marked = 1 - pm_marked
@ -631,7 +631,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
// Move into folder // Move into folder
$folder = array(); $folder = array();
if (sizeof($move_into_folder)) if (count($move_into_folder))
{ {
// Determine Full Folder Action - we need the move to folder id later eventually // Determine Full Folder Action - we need the move to folder id later eventually
$full_folder_action = ($user->data['user_full_folder'] == FULL_FOLDER_NONE) ? ($config['full_folder_action'] - (FULL_FOLDER_NONE*(-1))) : $user->data['user_full_folder']; $full_folder_action = ($user->data['user_full_folder'] == FULL_FOLDER_NONE) ? ($config['full_folder_action'] - (FULL_FOLDER_NONE*(-1))) : $user->data['user_full_folder'];
@ -676,12 +676,12 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
// Check Message Limit - we calculate with the complete array, most of the time it is one message // Check Message Limit - we calculate with the complete array, most of the time it is one message
// But we are making sure that the other way around works too (more messages in queue than allowed to be stored) // But we are making sure that the other way around works too (more messages in queue than allowed to be stored)
if ($user->data['message_limit'] && $folder[$folder_id] && ($folder[$folder_id] + sizeof($msg_ary)) > $user->data['message_limit']) if ($user->data['message_limit'] && $folder[$folder_id] && ($folder[$folder_id] + count($msg_ary)) > $user->data['message_limit'])
{ {
$full_folder_action = ($user->data['user_full_folder'] == FULL_FOLDER_NONE) ? ($config['full_folder_action'] - (FULL_FOLDER_NONE*(-1))) : $user->data['user_full_folder']; $full_folder_action = ($user->data['user_full_folder'] == FULL_FOLDER_NONE) ? ($config['full_folder_action'] - (FULL_FOLDER_NONE*(-1))) : $user->data['user_full_folder'];
// If destination folder itself is full... // If destination folder itself is full...
if ($full_folder_action >= 0 && ($folder[$full_folder_action] + sizeof($msg_ary)) > $user->data['message_limit']) if ($full_folder_action >= 0 && ($folder[$full_folder_action] + count($msg_ary)) > $user->data['message_limit'])
{ {
$full_folder_action = $config['full_folder_action'] - (FULL_FOLDER_NONE*(-1)); $full_folder_action = $config['full_folder_action'] - (FULL_FOLDER_NONE*(-1));
} }
@ -699,7 +699,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
WHERE user_id = $user_id WHERE user_id = $user_id
AND folder_id = $dest_folder AND folder_id = $dest_folder
ORDER BY msg_id ASC"; ORDER BY msg_id ASC";
$result = $db->sql_query_limit($sql, (($folder[$dest_folder] + sizeof($msg_ary)) - $user->data['message_limit'])); $result = $db->sql_query_limit($sql, (($folder[$dest_folder] + count($msg_ary)) - $user->data['message_limit']));
$delete_ids = array(); $delete_ids = array();
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
@ -708,7 +708,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$num_removed += sizeof($delete_ids); $num_removed += count($delete_ids);
delete_pm($user_id, $delete_ids, $dest_folder); delete_pm($user_id, $delete_ids, $dest_folder);
} }
} }
@ -744,7 +744,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
} }
} }
if (sizeof($action_ary)) if (count($action_ary))
{ {
// Move from OUTBOX to SENTBOX // Move from OUTBOX to SENTBOX
// We are not checking any full folder status here... SENTBOX is a special treatment (old messages get deleted) // We are not checking any full folder status here... SENTBOX is a special treatment (old messages get deleted)
@ -785,7 +785,7 @@ function move_pm($user_id, $message_limit, $move_msg_ids, $dest_folder, $cur_fol
$move_msg_ids = array($move_msg_ids); $move_msg_ids = array($move_msg_ids);
} }
if (sizeof($move_msg_ids) && !in_array($dest_folder, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX, PRIVMSGS_SENTBOX)) && if (count($move_msg_ids) && !in_array($dest_folder, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX, PRIVMSGS_SENTBOX)) &&
!in_array($cur_folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX)) && $cur_folder_id != $dest_folder) !in_array($cur_folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX)) && $cur_folder_id != $dest_folder)
{ {
// We have to check the destination folder ;) // We have to check the destination folder ;)
@ -805,7 +805,7 @@ function move_pm($user_id, $message_limit, $move_msg_ids, $dest_folder, $cur_fol
trigger_error('NOT_AUTHORISED'); trigger_error('NOT_AUTHORISED');
} }
if ($message_limit && $row['pm_count'] + sizeof($move_msg_ids) > $message_limit) if ($message_limit && $row['pm_count'] + count($move_msg_ids) > $message_limit)
{ {
$message = sprintf($user->lang['NOT_ENOUGH_SPACE_FOLDER'], $row['folder_name']) . '<br /><br />'; $message = sprintf($user->lang['NOT_ENOUGH_SPACE_FOLDER'], $row['folder_name']) . '<br /><br />';
$message .= sprintf($user->lang['CLICK_RETURN_FOLDER'], '<a href="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=' . $row['folder_id']) . '">', '</a>', $row['folder_name']); $message .= sprintf($user->lang['CLICK_RETURN_FOLDER'], '<a href="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=' . $row['folder_id']) . '">', '</a>', $row['folder_name']);
@ -822,7 +822,7 @@ function move_pm($user_id, $message_limit, $move_msg_ids, $dest_folder, $cur_fol
$num_messages = (int) $db->sql_fetchfield('num_messages'); $num_messages = (int) $db->sql_fetchfield('num_messages');
$db->sql_freeresult($result); $db->sql_freeresult($result);
if ($message_limit && $num_messages + sizeof($move_msg_ids) > $message_limit) if ($message_limit && $num_messages + count($move_msg_ids) > $message_limit)
{ {
$message = sprintf($user->lang['NOT_ENOUGH_SPACE_FOLDER'], $user->lang['PM_INBOX']) . '<br /><br />'; $message = sprintf($user->lang['NOT_ENOUGH_SPACE_FOLDER'], $user->lang['PM_INBOX']) . '<br /><br />';
$message .= sprintf($user->lang['CLICK_RETURN_FOLDER'], '<a href="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=inbox') . '">', '</a>', $user->lang['PM_INBOX']); $message .= sprintf($user->lang['CLICK_RETURN_FOLDER'], '<a href="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=inbox') . '">', '</a>', $user->lang['PM_INBOX']);
@ -949,7 +949,7 @@ function handle_mark_actions($user_id, $mark_action)
$msg_ids = $request->variable('marked_msg_id', array(0)); $msg_ids = $request->variable('marked_msg_id', array(0));
$cur_folder_id = $request->variable('cur_folder_id', PRIVMSGS_NO_BOX); $cur_folder_id = $request->variable('cur_folder_id', PRIVMSGS_NO_BOX);
if (!sizeof($msg_ids)) if (!count($msg_ids))
{ {
return false; return false;
} }
@ -981,7 +981,7 @@ function handle_mark_actions($user_id, $mark_action)
{ {
delete_pm($user_id, $msg_ids, $cur_folder_id); delete_pm($user_id, $msg_ids, $cur_folder_id);
$success_msg = (sizeof($msg_ids) == 1) ? 'MESSAGE_DELETED' : 'MESSAGES_DELETED'; $success_msg = (count($msg_ids) == 1) ? 'MESSAGE_DELETED' : 'MESSAGES_DELETED';
$redirect = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=' . $cur_folder_id); $redirect = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=' . $cur_folder_id);
meta_refresh(3, $redirect); meta_refresh(3, $redirect);
@ -1032,7 +1032,7 @@ function delete_pm($user_id, $msg_ids, $folder_id)
$msg_ids = array($msg_ids); $msg_ids = array($msg_ids);
} }
if (!sizeof($msg_ids)) if (!count($msg_ids))
{ {
return false; return false;
} }
@ -1069,7 +1069,7 @@ function delete_pm($user_id, $msg_ids, $folder_id)
$db->sql_freeresult($result); $db->sql_freeresult($result);
unset($msg_ids); unset($msg_ids);
if (!sizeof($delete_rows)) if (!count($delete_rows))
{ {
return false; return false;
} }
@ -1156,7 +1156,7 @@ function delete_pm($user_id, $msg_ids, $folder_id)
$delete_ids = array_keys($delete_rows); $delete_ids = array_keys($delete_rows);
if (sizeof($delete_ids)) if (count($delete_ids))
{ {
// Check if there are any attachments we need to remove // Check if there are any attachments we need to remove
/** @var \phpbb\attachment\manager $attachment_manager */ /** @var \phpbb\attachment\manager $attachment_manager */
@ -1289,7 +1289,7 @@ function phpbb_delete_users_pms($user_ids)
$num_pms = (int) $row['num_undelivered_privmsgs']; $num_pms = (int) $row['num_undelivered_privmsgs'];
$undelivered_user[$num_pms][] = (int) $row['user_id']; $undelivered_user[$num_pms][] = (int) $row['user_id'];
if (sizeof($undelivered_user[$num_pms]) > 50) if (count($undelivered_user[$num_pms]) > 50)
{ {
// If there are too many users affected the query might get // If there are too many users affected the query might get
// too long, so we update the value for the first bunch here. // too long, so we update the value for the first bunch here.
@ -1416,7 +1416,7 @@ function rebuild_header($check_ary)
$_types = array('u', 'g'); $_types = array('u', 'g');
foreach ($_types as $type) foreach ($_types as $type)
{ {
if (sizeof(${$type})) if (count(${$type}))
{ {
foreach (${$type} as $id) foreach (${$type} as $id)
{ {
@ -1461,7 +1461,7 @@ function write_pm_addresses($check_ary, $author_id, $plaintext = false)
} }
$address = array(); $address = array();
if (sizeof($u)) if (count($u))
{ {
$sql = 'SELECT user_id, username, user_colour $sql = 'SELECT user_id, username, user_colour
FROM ' . USERS_TABLE . ' FROM ' . USERS_TABLE . '
@ -1485,7 +1485,7 @@ function write_pm_addresses($check_ary, $author_id, $plaintext = false)
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
if (sizeof($g)) if (count($g))
{ {
if ($plaintext) if ($plaintext)
{ {
@ -1532,7 +1532,7 @@ function write_pm_addresses($check_ary, $author_id, $plaintext = false)
} }
} }
if (sizeof($address) && !$plaintext) if (count($address) && !$plaintext)
{ {
$template->assign_var('S_' . strtoupper($check_type) . '_RECIPIENT', true); $template->assign_var('S_' . strtoupper($check_type) . '_RECIPIENT', true);
@ -1651,7 +1651,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
$_types = array('u', 'g'); $_types = array('u', 'g');
foreach ($_types as $ug_type) foreach ($_types as $ug_type)
{ {
if (isset($data_ary['address_list'][$ug_type]) && sizeof($data_ary['address_list'][$ug_type])) if (isset($data_ary['address_list'][$ug_type]) && count($data_ary['address_list'][$ug_type]))
{ {
foreach ($data_ary['address_list'][$ug_type] as $id => $field) foreach ($data_ary['address_list'][$ug_type] as $id => $field)
{ {
@ -1673,7 +1673,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
} }
} }
if (isset($data_ary['address_list']['g']) && sizeof($data_ary['address_list']['g'])) if (isset($data_ary['address_list']['g']) && count($data_ary['address_list']['g']))
{ {
// We need to check the PM status of group members (do they want to receive PM's?) // We need to check the PM status of group members (do they want to receive PM's?)
// Only check if not a moderator or admin, since they are allowed to override this user setting // Only check if not a moderator or admin, since they are allowed to override this user setting
@ -1696,7 +1696,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
if (!sizeof($recipients)) if (!count($recipients))
{ {
trigger_error('NO_RECIPIENT'); trigger_error('NO_RECIPIENT');
} }
@ -1764,7 +1764,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
break; break;
} }
if (sizeof($sql_data)) if (count($sql_data))
{ {
if ($mode == 'post' || $mode == 'reply' || $mode == 'quote' || $mode == 'quotepost' || $mode == 'forward') if ($mode == 'post' || $mode == 'reply' || $mode == 'quote' || $mode == 'quotepost' || $mode == 'forward')
{ {
@ -1844,7 +1844,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
$orphan_rows[(int) $attach_row['attach_id']] = array(); $orphan_rows[(int) $attach_row['attach_id']] = array();
} }
if (sizeof($orphan_rows)) if (count($orphan_rows))
{ {
$sql = 'SELECT attach_id, filesize, physical_filename $sql = 'SELECT attach_id, filesize, physical_filename
FROM ' . ATTACHMENTS_TABLE . ' FROM ' . ATTACHMENTS_TABLE . '
@ -1966,7 +1966,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
*/ */
function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode = false) function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode = false)
{ {
global $db, $user, $template, $phpbb_root_path, $phpEx, $auth; global $db, $user, $template, $phpbb_root_path, $phpEx, $auth, $phpbb_dispatcher;
// Select all receipts and the author from the pm we currently view, to only display their pm-history // Select all receipts and the author from the pm we currently view, to only display their pm-history
$sql = 'SELECT author_id, user_id $sql = 'SELECT author_id, user_id
@ -1985,9 +1985,7 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
$recipients = array_unique($recipients); $recipients = array_unique($recipients);
// Get History Messages (could be newer) // Get History Messages (could be newer)
$sql = 'SELECT t.*, p.*, u.* $sql_where = 't.msg_id = p.msg_id
FROM ' . PRIVMSGS_TABLE . ' p, ' . PRIVMSGS_TO_TABLE . ' t, ' . USERS_TABLE . ' u
WHERE t.msg_id = p.msg_id
AND p.author_id = u.user_id AND p.author_id = u.user_id
AND t.folder_id NOT IN (' . PRIVMSGS_NO_BOX . ', ' . PRIVMSGS_HOLD_BOX . ') AND t.folder_id NOT IN (' . PRIVMSGS_NO_BOX . ', ' . PRIVMSGS_HOLD_BOX . ')
AND ' . $db->sql_in_set('t.author_id', $recipients, false, true) . " AND ' . $db->sql_in_set('t.author_id', $recipients, false, true) . "
@ -1998,13 +1996,37 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
if (!$message_row['root_level']) if (!$message_row['root_level'])
{ {
$sql .= " AND (p.root_level = $msg_id OR (p.root_level = 0 AND p.msg_id = $msg_id))"; $sql_where .= " AND (p.root_level = $msg_id OR (p.root_level = 0 AND p.msg_id = $msg_id))";
} }
else else
{ {
$sql .= " AND (p.root_level = " . $message_row['root_level'] . ' OR p.msg_id = ' . $message_row['root_level'] . ')'; $sql_where .= " AND (p.root_level = " . $message_row['root_level'] . ' OR p.msg_id = ' . $message_row['root_level'] . ')';
} }
$sql .= ' ORDER BY p.message_time DESC';
$sql_ary = array(
'SELECT' => 't.*, p.*, u.*',
'FROM' => array(
PRIVMSGS_TABLE => 'p',
PRIVMSGS_TO_TABLE => 't',
USERS_TABLE => 'u'
),
'LEFT_JOIN' => array(),
'WHERE' => $sql_where,
'ORDER_BY' => 'p.message_time DESC',
);
/**
* Event to modify the SQL query before the message history in private message is queried
*
* @event core.message_history_modify_sql_ary
* @var array sql_ary The SQL array to get the data of the message history in private message
* @since 3.2.8-RC1
*/
$vars = array('sql_ary');
extract($phpbb_dispatcher->trigger_event('core.message_history_modify_sql_ary', compact($vars)));
$sql = $db->sql_build_query('SELECT', $sql_ary);
unset($sql_ary);
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result); $row = $db->sql_fetchrow($result);
@ -2038,7 +2060,7 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
while ($row = $db->sql_fetchrow($result)); while ($row = $db->sql_fetchrow($result));
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($rowset) == 1 && !$in_post_mode) if (count($rowset) == 1 && !$in_post_mode)
{ {
return false; return false;
} }
@ -2051,7 +2073,7 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
// Re-order rowset to be able to get the next/prev message rows... // Re-order rowset to be able to get the next/prev message rows...
$rowset = array_values($rowset); $rowset = array_values($rowset);
for ($i = 0, $size = sizeof($rowset); $i < $size; $i++) for ($i = 0, $size = count($rowset); $i < $size; $i++)
{ {
$row = &$rowset[$i]; $row = &$rowset[$i];
$id = (int) $row['msg_id']; $id = (int) $row['msg_id'];
@ -2087,7 +2109,7 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
$previous_history_pm = $prev_id; $previous_history_pm = $prev_id;
} }
$template->assign_block_vars('history_row', array( $template_vars = array(
'MESSAGE_AUTHOR_QUOTE' => (($decoded_message) ? addslashes(get_username_string('username', $author_id, $row['username'], $row['user_colour'], $row['username'])) : ''), 'MESSAGE_AUTHOR_QUOTE' => (($decoded_message) ? addslashes(get_username_string('username', $author_id, $row['username'], $row['user_colour'], $row['username'])) : ''),
'MESSAGE_AUTHOR_FULL' => get_username_string('full', $author_id, $row['username'], $row['user_colour'], $row['username']), 'MESSAGE_AUTHOR_FULL' => get_username_string('full', $author_id, $row['username'], $row['user_colour'], $row['username']),
'MESSAGE_AUTHOR_COLOUR' => get_username_string('colour', $author_id, $row['username'], $row['user_colour'], $row['username']), 'MESSAGE_AUTHOR_COLOUR' => get_username_string('colour', $author_id, $row['username'], $row['user_colour'], $row['username']),
@ -2109,8 +2131,25 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
'USER_ID' => $row['user_id'], 'USER_ID' => $row['user_id'],
'U_VIEW_MESSAGE' => "$url&amp;f=$folder_id&amp;p=" . $row['msg_id'], 'U_VIEW_MESSAGE' => "$url&amp;f=$folder_id&amp;p=" . $row['msg_id'],
'U_QUOTE' => (!$in_post_mode && $auth->acl_get('u_sendpm') && $author_id != ANONYMOUS) ? "$url&amp;mode=compose&amp;action=quote&amp;f=" . $folder_id . "&amp;p=" . $row['msg_id'] : '', 'U_QUOTE' => (!$in_post_mode && $auth->acl_get('u_sendpm') && $author_id != ANONYMOUS) ? "$url&amp;mode=compose&amp;action=quote&amp;f=" . $folder_id . "&amp;p=" . $row['msg_id'] : '',
'U_POST_REPLY_PM' => ($author_id != $user->data['user_id'] && $author_id != ANONYMOUS && $auth->acl_get('u_sendpm')) ? "$url&amp;mode=compose&amp;action=reply&amp;f=$folder_id&amp;p=" . $row['msg_id'] : '') 'U_POST_REPLY_PM' => ($author_id != $user->data['user_id'] && $author_id != ANONYMOUS && $auth->acl_get('u_sendpm')) ? "$url&amp;mode=compose&amp;action=reply&amp;f=$folder_id&amp;p=" . $row['msg_id'] : ''
); );
/**
* Modify the template vars for displaying the message history in private message
*
* @event core.message_history_modify_template_vars
* @var array template_vars Array containing the query
* @var array row Array containing the action user row
* @since 3.2.8-RC1
*/
$vars = array(
'template_vars',
'row',
);
extract($phpbb_dispatcher->trigger_event('core.message_history_modify_template_vars', compact($vars)));
$template->assign_block_vars('history_row', $template_vars);
unset($rowset[$i]); unset($rowset[$i]);
$prev_id = $id; $prev_id = $id;
} }
@ -2197,7 +2236,7 @@ function get_recipient_strings($pm_by_id)
foreach ($_types as $ug_type) foreach ($_types as $ug_type)
{ {
if (isset($address[$message_id][$ug_type]) && sizeof($address[$message_id][$ug_type])) if (isset($address[$message_id][$ug_type]) && count($address[$message_id][$ug_type]))
{ {
foreach ($address[$message_id][$ug_type] as $ug_id => $in_to) foreach ($address[$message_id][$ug_type] as $ug_id => $in_to)
{ {

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