diff options
27 files changed, 1612 insertions, 191 deletions
| diff --git a/.travis.yml b/.travis.yml index 26744c57ef..330cce59b9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,10 +22,12 @@ before_script:    - sh -c "if [ '$TRAVIS_PHP_VERSION' != '5.2' ]; then php ../composer.phar install --dev --no-interaction --prefer-source; fi"    - cd ..    - sh -c "if [ `php -r "echo (int) version_compare(PHP_VERSION, '5.3.19', '>=');"` = "1" ]; then travis/setup-webserver.sh; fi" +  - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.3.3' -a '$DB' = 'mysql' ]; then sudo apt-get update; sudo apt-get install -y parallel libimage-exiftool-perl; fi"  script:    - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.2' ]; then phpunit --configuration travis/phpunit-$DB-5-2-travis.xml; else phpBB/vendor/bin/phpunit --configuration travis/phpunit-$DB-travis.xml; fi" -  - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.5' -a '$DB' = 'mysql' -a '$TRAVIS_PULL_REQUEST' != 'false' ]; then git-tools/commit-msg-hook-range.sh origin/$TRAVIS_BRANCH..FETCH_HEAD; fi" +  - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.3.3' -a '$DB' = 'mysql' -a '$TRAVIS_PULL_REQUEST' != 'false' ]; then git-tools/commit-msg-hook-range.sh origin/$TRAVIS_BRANCH..FETCH_HEAD; fi" +  - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.3.3' -a '$DB' = 'mysql' ]; then find . -type f -not -path './phpBB/vendor/*' -iregex '.*\.\(gif\|jpg\|jpeg\|png\)$' | parallel --gnu --keep-order 'phpBB/develop/strip_icc_profiles.sh {}' || exit 1; fi"  matrix:    include: diff --git a/build/build.xml b/build/build.xml index 5ea77bd9e1..6873f48fab 100644 --- a/build/build.xml +++ b/build/build.xml @@ -74,14 +74,8 @@  	</target>  	<target name="docs"> -		<!-- only works if you setup phpdoctor: -                     git clone https://github.com/peej/phpdoctor.git -                     and then create an executable phpdoctor in your path containing -                     #!/bin/sh -                     php -f /path/to/phpdoctor/phpdoc.php $@ -                --> -		<exec dir="build" -			command="phpdoctor phpdoc-phpbb.ini" +		<exec dir="." +			command="phpBB/vendor/bin/sami.php update build/sami.conf.php"  			passthru="true" />  	</target> diff --git a/build/phpdoc-phpbb.ini b/build/phpdoc-phpbb.ini deleted file mode 100644 index f1a7a4bee5..0000000000 --- a/build/phpdoc-phpbb.ini +++ /dev/null @@ -1,145 +0,0 @@ -; Default configuration file for PHPDoctor - -; This config file will cause PHPDoctor to generate API documentation of -; itself. - - -; PHPDoctor settings -; ----------------------------------------------------------------------------- - -; Names of files to parse. This can be a single filename, or a comma separated -; list of filenames. Wildcards are allowed. - -files = "*.php" - -; Names of files or directories to ignore. This can be a single filename, or a -; comma separated list of filenames. Wildcards are NOT allowed. - -;ignore = "CVS, .svn, .git, _compiled" -ignore = templates_c/,*HTML/default/*,spec/,*config.php*,*CVS/,test_chora.php,testupdate/,cache/,store/,*proSilver/,develop/,includes/utf/data/,includes/captcha/fonts/,install/update/,install/update.new/,files/,*phpinfo.php*,*update_script.php*,*upgrade.php*,*convert.php*,install/converter/,language/de/,script/,*swatch.php*,*test.php*,*test2.php*,*install.php*,*functions_diff.php*,*acp_update.php*,acm_xcache.php - -; The directory to look for files in, if not used the PHPDoctor will look in -; the current directory (the directory it is run from). - -source_path = "../phpBB/" - -; If you do not want PHPDoctor to look in each sub directory for files -; uncomment this line. - -;subdirs = off - -; Set how loud PHPDoctor is as it runs. Quiet mode suppresses all output other -; than warnings and errors. Verbose mode outputs additional messages during -; execution. - -quiet = on -;verbose = on - -; Select the doclet to use for generating output. - -doclet = standard -;doclet = debug - -; The directory to find the doclet in. Doclets control the HTML output of -; phpDoctor and can be modified to suit your needs. They are expected to be  -; in a directory named after themselves at the location given. - -;doclet_path = ./doclets - -; Select the formatter to use for generating output. - -;formatter = htmlStandardFormatter - -; The directory to find the formatter in. Formatters convert textual markup -; for use by the doclet. - -;formatter_path = ./formatters - -; The directory to find taglets in. Taglets allow you to make PHPDoctor handle -; new tags and to alter the behavour of existing tags and their output. - -;taglet_path = ./taglets - -; If the code you are parsing does not use package tags or not all elements -; have package tags, use this setting to place unbound elements into a -; particular package. - -default_package = "phpBB" - -use_class_path_as_package = off - -ignore_package_tags = off - -; Specifies the name of a HTML file containing text for the overview -; documentation to be placed on the overview page. The path is relative to -; "source_path" unless an absolute path is given. - -overview = ../README.md - -; Package comments will be looked for in a file named package.html in the same -; directory as the first source file parsed in that package or in the directory -; given below. If package comments are placed in the directory given below then -; they should be named "<packageName>.html". - -package_comment_dir = ./ - -; Parse out global variables and/or global constants? - -;globals = off -;constants = off - -; Generate documentation for all class members - -;private = on - -; Generate documentation for public and protected class members - -;protected = on - -; Generate documentation for only public class members - -;public = on - -; Use the PEAR compatible handling of the docblock first sentence - -;pear_compat = on - -; Standard doclet settings -; ----------------------------------------------------------------------------- - -; The directory to place generated documentation in. If the given path is -; relative to it will be relative to "source_path". - -d = "../build/api/" - -; Specifies the title to be placed in the HTML <title> tag. - -windowtitle = "phpBB3" - -; Specifies the title to be placed near the top of the overview summary file. - -doctitle = "phpBB3 Sourcecode Documentation" - -; Specifies the header text to be placed at the top of each output file. The -; header will be placed to the right of the upper navigation bar.  - -header = "phpBB3" - -; Specifies the footer text to be placed at the bottom of each output file. The -; footer will be placed to the right of the lower navigation bar. - -footer = "phpBB3" - -; Specifies the text to be placed at the bottom of each output file. The text -; will be placed at the bottom of the page, below the lower navigation bar. - -;bottom = "This document was generated by <a href="http://peej.github.com/phpdoctor/">PHPDoctor: The PHP Documentation Creator</a>" - -; Create a class tree? - -;tree = off - -; Use GeSHi to include formatted source files in the documentation. PHPDoctor will look in the current doclet directory for a /geshi subdirectory. Unpack the GeSHi archive from http://qbnz.com/highlighter to get this directory - it will contain a php script and a subdirectory with formatting files. - -include_source = off - diff --git a/build/sami.conf.php b/build/sami.conf.php new file mode 100644 index 0000000000..dd57ec8780 --- /dev/null +++ b/build/sami.conf.php @@ -0,0 +1,50 @@ +<?php +/** +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +*/ + +// Prevent 'Class "acm" does not exist.' exception on removeClass(). +class PhpbbArrayStore extends Sami\Store\ArrayStore +{ +	public function removeClass(Sami\Project $project, $name) +	{ +		unset($this->classes[$name]); +	} +} + +$iterator = Symfony\Component\Finder\Finder::create() +	->files() +	->name('*.php') +	->in(__DIR__ . '/../phpBB/') +	->notPath('#^cache/#') +	->notPath('#^develop/#') +	->notPath('#^ext/#') +	->notPath('#^vendor/#') +	->notPath('data') +; + +$versions = Sami\Version\GitVersionCollection::create(__DIR__ . '/../') +	/* +	This would be nice, but currently causes various problems that need +	debugging. +	->addFromTags('release-3.0.*') +	->add('develop-olympus', '3.0-next (olympus)') +	->addFromTags('release-3.1.*') +	->add('develop-ascraeus', '3.1-next (ascraeus)') +	->add('develop') +	*/ +	->add('develop-olympus') +	->add('develop-ascraeus') +; + +return new Sami\Sami($iterator, array( +	'theme'                => 'enhanced', +	'versions'             => $versions, +	'title'                => 'phpBB API Documentation', +	'build_dir'            => __DIR__.'/api/output/%version%', +	'cache_dir'            => __DIR__.'/api/cache/%version%', +	'default_opened_level' => 2, +	// Do not use JsonStore. See https://github.com/fabpot/Sami/issues/79 +	'store'                => new PhpbbArrayStore, +)); diff --git a/git-tools/hooks/commit-msg b/git-tools/hooks/commit-msg index b156d276df..136606252c 100755 --- a/git-tools/hooks/commit-msg +++ b/git-tools/hooks/commit-msg @@ -191,12 +191,12 @@ do  				err=$ERR_HEADER;  				echo "$line" | grep -Eq "^\[(ticket/[0-9]+|feature/$branch_regex|task/$branch_regex)\] .+$"  				result=$? -				if ! echo "$line" | grep -Eq "^\[(ticket/[0-9]+|feature/$branch_regex|task/$branch_regex)\] [A-Z].+$" +				if ! echo "$line" | grep -Eq "^\[(ticket/[0-9]+|feature/$branch_regex|task/$branch_regex)\] [a-zA-Z].+$"  				then  					# Don't be too strict.  					# Commits may be temporary, intended to be squashed later.  					# Just issue a warning here. -					complain "$severity: heading should be a sentence beginning with a capital letter." 1>&2 +					complain "$severity: heading should be a sentence beginning with a letter." 1>&2  					complain "You entered:" 1>&2  					complain "$line" 1>&2  				fi diff --git a/phpBB/adm/images/phpbb_logo.png b/phpBB/adm/images/phpbb_logo.pngBinary files differ index c3f9248ed7..2d76ef18cb 100644 --- a/phpBB/adm/images/phpbb_logo.png +++ b/phpBB/adm/images/phpbb_logo.png diff --git a/phpBB/composer.json b/phpBB/composer.json index 434bf330ec..966ff39fcc 100644 --- a/phpBB/composer.json +++ b/phpBB/composer.json @@ -3,6 +3,7 @@  		"fabpot/goutte": "1.0.*",  		"phpunit/dbunit": "1.3.*",  		"phpunit/phpunit": "4.1.*", -		"phing/phing": "2.4.*" +		"phing/phing": "2.4.*", +		"sami/sami": "1.*"  	}  } diff --git a/phpBB/composer.lock b/phpBB/composer.lock index 6f57e67015..4dd6da46ed 100644 --- a/phpBB/composer.lock +++ b/phpBB/composer.lock @@ -3,7 +3,7 @@          "This file locks the dependencies of your project to a known state",          "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"      ], -    "hash": "9a505c5911182b264ea0eccffa5d5ad6", +    "hash": "78d2a648f5519c8c5370017aaeba7731",      "packages": [      ], @@ -265,6 +265,101 @@              "time": "2013-07-30 22:07:23"          },          { +            "name": "michelf/php-markdown", +            "version": "1.4.1", +            "source": { +                "type": "git", +                "url": "https://github.com/michelf/php-markdown.git", +                "reference": "de9a19c7bf352d41cc99ed86c3c0ef17e87394b6" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/michelf/php-markdown/zipball/de9a19c7bf352d41cc99ed86c3c0ef17e87394b6", +                "reference": "de9a19c7bf352d41cc99ed86c3c0ef17e87394b6", +                "shasum": "" +            }, +            "require": { +                "php": ">=5.3.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-lib": "1.4.x-dev" +                } +            }, +            "autoload": { +                "psr-0": { +                    "Michelf": "" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Michel Fortin", +                    "email": "michel.fortin@michelf.ca", +                    "homepage": "http://michelf.ca/", +                    "role": "Developer" +                }, +                { +                    "name": "John Gruber", +                    "homepage": "http://daringfireball.net/" +                } +            ], +            "description": "PHP Markdown", +            "homepage": "http://michelf.ca/projects/php-markdown/", +            "keywords": [ +                "markdown" +            ], +            "time": "2014-05-05 02:43:50" +        }, +        { +            "name": "nikic/php-parser", +            "version": "v0.9.4", +            "source": { +                "type": "git", +                "url": "https://github.com/nikic/PHP-Parser.git", +                "reference": "1e5e280ae88a27effa2ae4aa2bd088494ed8594f" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1e5e280ae88a27effa2ae4aa2bd088494ed8594f", +                "reference": "1e5e280ae88a27effa2ae4aa2bd088494ed8594f", +                "shasum": "" +            }, +            "require": { +                "php": ">=5.2" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "0.9-dev" +                } +            }, +            "autoload": { +                "psr-0": { +                    "PHPParser": "lib/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Nikita Popov" +                } +            ], +            "description": "A PHP parser written in PHP", +            "keywords": [ +                "parser", +                "php" +            ], +            "time": "2013-08-25 17:11:40" +        }, +        {              "name": "phing/phing",              "version": "2.4.14",              "source": { @@ -755,6 +850,113 @@              "time": "2014-05-02 07:04:11"          },          { +            "name": "pimple/pimple", +            "version": "v1.0.2", +            "source": { +                "type": "git", +                "url": "https://github.com/fabpot/Pimple.git", +                "reference": "ae11e57e8c2bb414b2ff93396dbbfc0eb92feb94" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/fabpot/Pimple/zipball/ae11e57e8c2bb414b2ff93396dbbfc0eb92feb94", +                "reference": "ae11e57e8c2bb414b2ff93396dbbfc0eb92feb94", +                "shasum": "" +            }, +            "require": { +                "php": ">=5.3.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.0.x-dev" +                } +            }, +            "autoload": { +                "psr-0": { +                    "Pimple": "lib/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com", +                    "homepage": "http://fabien.potencier.org", +                    "role": "Lead Developer" +                } +            ], +            "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", +            "homepage": "http://pimple.sensiolabs.org", +            "keywords": [ +                "container", +                "dependency injection" +            ], +            "time": "2013-03-08 08:21:40" +        }, +        { +            "name": "sami/sami", +            "version": "v1.3", +            "source": { +                "type": "git", +                "url": "https://github.com/fabpot/Sami.git", +                "reference": "76f2ed80b3420f7e2f6dcd5b7218b5a5781f4110" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/fabpot/Sami/zipball/76f2ed80b3420f7e2f6dcd5b7218b5a5781f4110", +                "reference": "76f2ed80b3420f7e2f6dcd5b7218b5a5781f4110", +                "shasum": "" +            }, +            "require": { +                "michelf/php-markdown": "~1.3", +                "nikic/php-parser": "0.9.*", +                "php": ">=5.3.0", +                "pimple/pimple": "1.0.*", +                "symfony/console": "~2.1", +                "symfony/filesystem": "~2.1", +                "symfony/finder": "~2.1", +                "symfony/process": "~2.1", +                "symfony/yaml": "~2.1", +                "twig/twig": "1.*" +            }, +            "bin": [ +                "sami.php" +            ], +            "type": "application", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.3-dev" +                } +            }, +            "autoload": { +                "psr-0": { +                    "Sami": "." +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com", +                    "homepage": "http://fabien.potencier.org", +                    "role": "Lead Developer" +                } +            ], +            "description": "Sami, an API documentation generator", +            "homepage": "http://sami.sensiolabs.org", +            "keywords": [ +                "phpdoc" +            ], +            "time": "2013-11-30 17:16:25" +        }, +        {              "name": "sebastian/comparator",              "version": "1.0.0",              "source": { @@ -1079,6 +1281,61 @@              "time": "2013-07-21 12:12:18"          },          { +            "name": "symfony/console", +            "version": "v2.4.4", +            "target-dir": "Symfony/Component/Console", +            "source": { +                "type": "git", +                "url": "https://github.com/symfony/Console.git", +                "reference": "2e452005b1e1d003d23702d227e23614679eb5ca" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/symfony/Console/zipball/2e452005b1e1d003d23702d227e23614679eb5ca", +                "reference": "2e452005b1e1d003d23702d227e23614679eb5ca", +                "shasum": "" +            }, +            "require": { +                "php": ">=5.3.3" +            }, +            "require-dev": { +                "symfony/event-dispatcher": "~2.1" +            }, +            "suggest": { +                "symfony/event-dispatcher": "" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "2.4-dev" +                } +            }, +            "autoload": { +                "psr-0": { +                    "Symfony\\Component\\Console\\": "" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com", +                    "homepage": "http://fabien.potencier.org", +                    "role": "Lead Developer" +                }, +                { +                    "name": "Symfony Community", +                    "homepage": "http://symfony.com/contributors" +                } +            ], +            "description": "Symfony Console Component", +            "homepage": "http://symfony.com", +            "time": "2014-04-27 13:34:57" +        }, +        {              "name": "symfony/css-selector",              "version": "v2.3.4",              "target-dir": "Symfony/Component/CssSelector", @@ -1243,6 +1500,55 @@              "time": "2013-07-21 12:12:18"          },          { +            "name": "symfony/filesystem", +            "version": "v2.4.4", +            "target-dir": "Symfony/Component/Filesystem", +            "source": { +                "type": "git", +                "url": "https://github.com/symfony/Filesystem.git", +                "reference": "a3af8294bcce4a7c1b2892363b0c9d8109affad4" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/symfony/Filesystem/zipball/a3af8294bcce4a7c1b2892363b0c9d8109affad4", +                "reference": "a3af8294bcce4a7c1b2892363b0c9d8109affad4", +                "shasum": "" +            }, +            "require": { +                "php": ">=5.3.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "2.4-dev" +                } +            }, +            "autoload": { +                "psr-0": { +                    "Symfony\\Component\\Filesystem\\": "" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com", +                    "homepage": "http://fabien.potencier.org", +                    "role": "Lead Developer" +                }, +                { +                    "name": "Symfony Community", +                    "homepage": "http://symfony.com/contributors" +                } +            ], +            "description": "Symfony Filesystem Component", +            "homepage": "http://symfony.com", +            "time": "2014-04-16 10:34:31" +        }, +        {              "name": "symfony/finder",              "version": "v2.3.4",              "target-dir": "Symfony/Component/Finder", @@ -1388,6 +1694,63 @@              "description": "Symfony Yaml Component",              "homepage": "http://symfony.com",              "time": "2014-04-18 20:37:09" +        }, +        { +            "name": "twig/twig", +            "version": "v1.15.1", +            "source": { +                "type": "git", +                "url": "https://github.com/fabpot/Twig.git", +                "reference": "1fb5784662f438d7d96a541e305e28b812e2eeed" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/fabpot/Twig/zipball/1fb5784662f438d7d96a541e305e28b812e2eeed", +                "reference": "1fb5784662f438d7d96a541e305e28b812e2eeed", +                "shasum": "" +            }, +            "require": { +                "php": ">=5.2.4" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.15-dev" +                } +            }, +            "autoload": { +                "psr-0": { +                    "Twig_": "lib/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Fabien Potencier", +                    "email": "fabien@symfony.com", +                    "homepage": "http://fabien.potencier.org", +                    "role": "Lead Developer" +                }, +                { +                    "name": "Armin Ronacher", +                    "email": "armin.ronacher@active-4.com", +                    "role": "Project Founder" +                }, +                { +                    "name": "Twig Team", +                    "homepage": "https://github.com/fabpot/Twig/graphs/contributors", +                    "role": "Contributors" +                } +            ], +            "description": "Twig, the flexible, fast, and secure template language for PHP", +            "homepage": "http://twig.sensiolabs.org", +            "keywords": [ +                "templating" +            ], +            "time": "2014-02-13 10:19:29"          }      ],      "aliases": [ diff --git a/phpBB/develop/strip_icc_profiles.sh b/phpBB/develop/strip_icc_profiles.sh new file mode 100755 index 0000000000..779c7ffca7 --- /dev/null +++ b/phpBB/develop/strip_icc_profiles.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# +# @copyright (c) 2014 phpBB Group +# @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +# + +if [ "$#" -ne 1 ] +then +	SCRIPT=$(basename "$0") +	echo "Description: Finds and strips ICC Profiles from given image file." >&2 +	echo "Usage: $SCRIPT /path/to/image/file" >&2 +	echo "Exit Status: 0 if no ICC profiles have been stripped, otherwise 1." >&2 +	echo "Requires: exiftool" >&2 +	exit 1 +fi + +FILE=$1 +HASH_OLD=$(md5sum "$FILE") +exiftool -icc_profile"-<=" -overwrite_original_in_place "$FILE" > /dev/null 2>&1 +HASH_NEW=$(md5sum "$FILE") + +if [ "$HASH_OLD" != "$HASH_NEW" ] +then +	echo "Stripped ICC Profile from $FILE." +	exit 1 +fi diff --git a/phpBB/docs/AUTHORS b/phpBB/docs/AUTHORS index 25d2849dbe..36dd847e96 100644 --- a/phpBB/docs/AUTHORS +++ b/phpBB/docs/AUTHORS @@ -25,9 +25,9 @@ phpBB Lead Developer:  naderman (Nils Adermann)  phpBB Developers:      bantu (Andreas Fischer)                         dhruv.goel92 (Dhruv Goel)                         EXreaction (Nathan Guse) -                       imkingdavid (David King)                         marc1706 (Marc Alexander)                         nickvergessen (Joas Schilling) +                       nicofuma (Tristan Darricau)                         prototech (Cesar Gallegos)  Contributions by:      leviatan21 (Gabriel Vazquez) @@ -53,8 +53,9 @@ phpBB Developers:      A_Jelly_Doughnut (Josh Woody) [01/2010 - 11/2010]                         DavidMJ (David M.)            [12/2005 - 08/2009]                         dhn (Dominik Dröscher)        [05/2007 - 01/2011]                         GrahamJE (Graham Eames)       [09/2005 - 11/2006] -                       kellanved (Henry Sudhof)      [04/2007 - 03/2011]                         igorw (Igor Wiedler)          [08/2010 - 02/2013] +                       imkingdavid (David King)      [11/2012 - 06/2014] +                       kellanved (Henry Sudhof)      [04/2007 - 03/2011]                         Oleg (Oleg Pudeyev)           [01/2011 - 05/2013]                         rxu (Ruslan Uzdenov)          [04/2010 - 12/2012]                         TerraFrost (Jim Wigginton)    [04/2009 - 01/2011] diff --git a/phpBB/includes/acp/acp_php_info.php b/phpBB/includes/acp/acp_php_info.php index 7dd345971a..88e2ac3f8d 100644 --- a/phpBB/includes/acp/acp_php_info.php +++ b/phpBB/includes/acp/acp_php_info.php @@ -47,7 +47,7 @@ class acp_php_info  		// for this was nabbed from the PHP annotated manual  		preg_match_all('#<body[^>]*>(.*)</body>#si', $phpinfo, $output); -		if (empty($phpinfo) || empty($output)) +		if (empty($phpinfo) || empty($output[1][0]))  		{  			trigger_error('NO_PHPINFO_AVAILABLE', E_USER_WARNING);  		} diff --git a/phpBB/includes/auth/auth_ldap.php b/phpBB/includes/auth/auth_ldap.php index eebf147d48..63796a474b 100644 --- a/phpBB/includes/auth/auth_ldap.php +++ b/phpBB/includes/auth/auth_ldap.php @@ -282,7 +282,7 @@ function ldap_user_filter($username)  {  	global $config; -	$filter = '(' . $config['ldap_uid'] . '=' . ldap_escape(htmlspecialchars_decode($username)) . ')'; +	$filter = '(' . $config['ldap_uid'] . '=' . phpbb_ldap_escape(htmlspecialchars_decode($username)) . ')';  	if ($config['ldap_user_filter'])  	{  		$_filter = ($config['ldap_user_filter'][0] == '(' && substr($config['ldap_user_filter'], -1) == ')') ? $config['ldap_user_filter'] : "({$config['ldap_user_filter']})"; @@ -294,7 +294,7 @@ function ldap_user_filter($username)  /**  * Escapes an LDAP AttributeValue  */ -function ldap_escape($string) +function phpbb_ldap_escape($string)  {  	return str_replace(array('*', '\\', '(', ')'), array('\\*', '\\\\', '\\(', '\\)'), $string);  } diff --git a/phpBB/includes/functions_install.php b/phpBB/includes/functions_install.php index 47f4eac627..21dd8bfebe 100644 --- a/phpBB/includes/functions_install.php +++ b/phpBB/includes/functions_install.php @@ -309,7 +309,7 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,  	if (is_array($db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, true)))  	{  		$db_error = $db->sql_error(); -		$error[] = $lang['INST_ERR_DB_CONNECT'] . '<br />' . (($db_error['message']) ? $db_error['message'] : $lang['INST_ERR_DB_NO_ERROR']); +		$error[] = $lang['INST_ERR_DB_CONNECT'] . '<br />' . (($db_error['message']) ? utf8_convert_message($db_error['message']) : $lang['INST_ERR_DB_NO_ERROR']);  	}  	else  	{ diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index b08d6e7f5c..c99f40d453 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -208,7 +208,7 @@ function get_folder($user_id, $folder_id = false)  		);  	} -	if ($folder_id !== false && !isset($folder[$folder_id])) +	if ($folder_id !== false && $folder_id !== PRIVMSGS_HOLD_BOX && !isset($folder[$folder_id]))  	{  		trigger_error('UNKNOWN_FOLDER');  	} diff --git a/phpBB/includes/functions_upload.php b/phpBB/includes/functions_upload.php index 73ac1df2d2..69f10911ec 100644 --- a/phpBB/includes/functions_upload.php +++ b/phpBB/includes/functions_upload.php @@ -466,6 +466,9 @@ class fileupload  	var $max_height = 0;  	var $error_prefix = ''; +	/** @var int Timeout for remote upload */ +	var $upload_timeout = 6; +  	/**  	* Init file upload class.  	* @@ -795,13 +798,28 @@ class fileupload  		fputs($fsock, "HOST: " . $host . "\r\n");  		fputs($fsock, "Connection: close\r\n\r\n"); +		// Set a proper timeout for the socket +		socket_set_timeout($fsock, $this->upload_timeout); +  		$get_info = false;  		$data = ''; -		while (!@feof($fsock)) +		$length = false; +		$timer_stop = time() + $this->upload_timeout; + +		while ((!$length || $filesize < $length) && !@feof($fsock))  		{  			if ($get_info)  			{ -				$block = @fread($fsock, 1024); +				if ($length) +				{ +					// Don't attempt to read past end of file if server indicated length +					$block = @fread($fsock, min($length - $filesize, 1024)); +				} +				else +				{ +					$block = @fread($fsock, 1024); +				} +  				$filesize += strlen($block);  				if ($remote_max_filesize && $filesize > $remote_max_filesize) @@ -847,6 +865,15 @@ class fileupload  					}  				}  			} + +			$stream_meta_data = stream_get_meta_data($fsock); + +			// Cancel upload if we exceed timeout +			if (!empty($stream_meta_data['timed_out']) || time() >= $timer_stop) +			{ +				$file = new fileerror($user->lang[$this->error_prefix . 'REMOTE_UPLOAD_TIMEOUT']); +				return $file; +			}  		}  		@fclose($fsock); diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index ea8b0a4640..abb057df5b 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -329,11 +329,16 @@ function user_add($user_row, $cp_data = false)  }  /** -* Remove User -*/ + * Remove User + * + * @param string	$mode		'retain' or 'remove' + * @param int		$user_id + * @param mixed		$post_username + * @return bool + */  function user_delete($mode, $user_id, $post_username = false)  { -	global $cache, $config, $db, $user, $auth; +	global $cache, $config, $db, $user;  	global $phpbb_root_path, $phpEx;  	$sql = 'SELECT * @@ -439,11 +444,6 @@ function user_delete($mode, $user_id, $post_username = false)  					WHERE poster_id = $user_id";  				$db->sql_query($sql); -				$sql = 'UPDATE ' . POSTS_TABLE . ' -					SET post_edit_user = ' . ANONYMOUS . " -					WHERE post_edit_user = $user_id"; -				$db->sql_query($sql); -  				$sql = 'UPDATE ' . TOPICS_TABLE . '  					SET topic_poster = ' . ANONYMOUS . ", topic_first_poster_name = '" . $db->sql_escape($post_username) . "', topic_first_poster_colour = ''  					WHERE topic_poster = $user_id"; @@ -501,6 +501,18 @@ function user_delete($mode, $user_id, $post_username = false)  	$cache->destroy('sql', MODERATOR_CACHE_TABLE); +	// Change user_id to anonymous for posts edited by this user +	$sql = 'UPDATE ' . POSTS_TABLE . ' +		SET post_edit_user = ' . ANONYMOUS . ' +		WHERE post_edit_user = ' . $user_id; +	$db->sql_query($sql); + +	// Change user_id to anonymous for pms edited by this user +	$sql = 'UPDATE ' . PRIVMSGS_TABLE . ' +		SET message_edit_user = ' . ANONYMOUS . ' +		WHERE message_edit_user = ' . $user_id; +	$db->sql_query($sql); +  	// Delete user log entries about this user  	$sql = 'DELETE FROM ' . LOG_TABLE . '  		WHERE reportee_id = ' . $user_id; diff --git a/phpBB/includes/mcp/mcp_post.php b/phpBB/includes/mcp/mcp_post.php index ba45037a18..df5dc27996 100644 --- a/phpBB/includes/mcp/mcp_post.php +++ b/phpBB/includes/mcp/mcp_post.php @@ -157,6 +157,7 @@ function mcp_post_details($id, $mode, $action)  		if (sizeof($attachments))  		{ +			$user->add_lang('viewtopic');  			$update_count = array();  			parse_attachments($post_info['forum_id'], $message, $attachments, $update_count);  		} diff --git a/phpBB/language/en/acp/email.php b/phpBB/language/en/acp/email.php index 38c9f19c27..6db09a77c9 100644 --- a/phpBB/language/en/acp/email.php +++ b/phpBB/language/en/acp/email.php @@ -37,7 +37,7 @@ if (empty($lang) || !is_array($lang))  // Email settings  $lang = array_merge($lang, array( -	'ACP_MASS_EMAIL_EXPLAIN'		=> 'Here you can e-mail a message to either all of your users or all users of a specific group <strong>having the option to receive mass e-mails enabled</strong>. To achieve this an e-mail will be sent out to the administrative e-mail address supplied, with a blind carbon copy sent to all recipients. The default setting is to only include 50 recipients in such an e-mail, for more recipients more e-mails will be sent. If you are emailing a large group of people please be patient after submitting and do not stop the page halfway through. It is normal for a mass emailing to take a long time, you will be notified when the script has completed.', +	'ACP_MASS_EMAIL_EXPLAIN'		=> 'Here you can e-mail a message to either all of your users or all users of a specific group <strong>having the option to receive mass e-mails enabled</strong>. To achieve this an e-mail will be sent out to the administrative e-mail address supplied, with a blind carbon copy sent to all recipients. The default setting is to only include 20 recipients in such an e-mail, for more recipients more e-mails will be sent. If you are emailing a large group of people please be patient after submitting and do not stop the page halfway through. It is normal for a mass emailing to take a long time, you will be notified when the script has completed.',  	'ALL_USERS'						=> 'All users',  	'COMPOSE'				=> 'Compose', diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index 0bf48eb841..2d3710e15c 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -88,9 +88,10 @@ $lang = array_merge($lang, array(  	'AVATAR_PARTIAL_UPLOAD'			=> 'The specified file was only partially uploaded.',  	'AVATAR_PHP_SIZE_NA'			=> 'The avatar’s filesize is too large.<br />The maximum allowed filesize set in php.ini could not be determined.',  	'AVATAR_PHP_SIZE_OVERRUN'		=> 'The avatar’s filesize is too large. The maximum allowed upload size is %1$d %2$s.<br />Please note this is set in php.ini and cannot be overridden.', +	'AVATAR_REMOTE_UPLOAD_TIMEOUT'		=> 'The specified avatar could not be uploaded because the request timed out.',  	'AVATAR_URL_INVALID'			=> 'The URL you specified is invalid.',  	'AVATAR_URL_NOT_FOUND'			=> 'The file specified could not be found.', -	'AVATAR_WRONG_FILESIZE'			=> 'The avatar’s filesize must be between 0 and %1d %2s.', +	'AVATAR_WRONG_FILESIZE'			=> 'The avatar’s filesize must be between 0 and %1$d %2$s.',  	'AVATAR_WRONG_SIZE'				=> 'The submitted avatar is %5$d pixels wide and %6$d pixels high. Avatars must be at least %1$d pixels wide and %2$d pixels high, but no larger than %3$d pixels wide and %4$d pixels high.',  	'BACK_TO_TOP'			=> 'Top', diff --git a/phpBB/language/en/posting.php b/phpBB/language/en/posting.php index dfc5065a05..5316011f4e 100644 --- a/phpBB/language/en/posting.php +++ b/phpBB/language/en/posting.php @@ -178,6 +178,7 @@ $lang = array_merge($lang, array(  	'QUOTE_DEPTH_EXCEEDED'		=> 'You may embed only %1$d quotes within each other.', +	'REMOTE_UPLOAD_TIMEOUT'		=> 'The specified file could not be uploaded because the request timed out.',  	'SAVE'						=> 'Save',  	'SAVE_DATE'					=> 'Saved at',  	'SAVE_DRAFT'				=> 'Save draft', @@ -219,7 +220,7 @@ $lang = array_merge($lang, array(  	'VIEW_MESSAGE'				=> '%sView your submitted message%s',  	'VIEW_PRIVATE_MESSAGE'		=> '%sView your submitted private message%s', -	'WRONG_FILESIZE'			=> 'The file is too big, maximum allowed size is %1d %2s.', +	'WRONG_FILESIZE'			=> 'The file is too big, maximum allowed size is %1$d %2$s.',  	'WRONG_SIZE'				=> 'The image must be at least %1$d pixels wide, %2$d pixels high and at most %3$d pixels wide and %4$d pixels high. The submitted image is %5$d pixels wide and %6$d pixels high.',  )); diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index ad11213052..641cf6a70a 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -266,7 +266,7 @@ $lang = array_merge($lang, array(  	'MOVE_DELETED_MESSAGES_TO'		=> 'Move messages from removed folder to',  	'MOVE_DOWN'						=> 'Move down',  	'MOVE_MARKED_TO_FOLDER'			=> 'Move marked to %s', -	'MOVE_PM_ERROR'					=> 'An error occurred while moving the messages to the new folder, only %1d from %2d messages were moved.', +	'MOVE_PM_ERROR'					=> 'An error occurred while moving the messages to the new folder, only %1$d from %2$d messages were moved.',  	'MOVE_TO_FOLDER'				=> 'Move to folder',  	'MOVE_UP'						=> 'Move up', diff --git a/tests/functional/private_messages_test.php b/tests/functional/private_messages_test.php new file mode 100644 index 0000000000..15aa2b681a --- /dev/null +++ b/tests/functional/private_messages_test.php @@ -0,0 +1,65 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +/** +* @group functional +*/ +class phpbb_functional_private_messages_test extends phpbb_functional_test_case +{ +	public function test_setup_config() +	{ +		$this->login(); +		$this->admin_login(); + +		$crawler = self::request('GET', "adm/index.php?sid={$this->sid}&i=board&mode=message"); + +		$form = $crawler->selectButton('Submit')->form(); +		$values = $form->getValues(); + +		// Set the maximum number of private messages per folder to 1 +		$values['config[pm_max_msgs]'] = 1; + +		$form->setValues($values); + +		$crawler = self::submit($form); +		$this->assertContains($this->lang('CONFIG_UPDATED'), $crawler->filter('.successbox')->text()); +	} + +	public function test_inbox_full() +	{ +		$this->login(); +		$message_id = $this->create_private_message('Test private message #1', 'This is a test private message sent by the testing framework.', array(2)); + +		$crawler = self::request('GET', "ucp.php?i=pm&mode=view&sid{$this->sid}&p={$message_id}"); +		$this->assertContains($this->lang('UCP_PM_VIEW'), $crawler->filter('html')->text()); + +		$message_id = $this->create_private_message('Test private message #2', 'This is a test private message sent by the testing framework.', array(2)); + +		$crawler = self::request('GET', "ucp.php?i=pm&mode=view&sid{$this->sid}&p={$message_id}"); +		$this->assertContains($this->lang('NO_AUTH_READ_HOLD_MESSAGE'), $crawler->filter('html')->text()); +	} + +	public function test_restore_config() +	{ +		$this->login(); +		$this->admin_login(); + +		$crawler = self::request('GET', "adm/index.php?sid={$this->sid}&i=board&mode=message"); + +		$form = $crawler->selectButton('Submit')->form(); +		$values = $form->getValues(); + +		$values['config[pm_max_msgs]'] = 50; + +		$form->setValues($values); + +		$crawler = self::submit($form); +		$this->assertContains($this->lang('CONFIG_UPDATED'), $crawler->filter('.successbox')->text()); +	} +} diff --git a/tests/functions_user/delete_user_test.php b/tests/functions_user/delete_user_test.php new file mode 100644 index 0000000000..9a7805a819 --- /dev/null +++ b/tests/functions_user/delete_user_test.php @@ -0,0 +1,436 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; +require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php'; +require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php'; +require_once dirname(__FILE__) . '/../mock/null_cache.php'; + +class phpbb_functions_user_delete_user_test extends phpbb_database_test_case +{ +	/** @var \dbal */ +	protected $db; + +	public function getDataSet() +	{ +		return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/delete_user.xml'); +	} + +	protected function setUp() +	{ +		parent::setUp(); + +		global $cache, $config, $db; + +		$db = $this->db = $this->new_dbal(); +		$config = array( +			'load_online_time'	=> 5, +			'search_type'		=> 'fulltext_mysql', +		); +		$cache = new phpbb_mock_null_cache(); +	} + +	 public function first_last_post_data() +	{ +		return array( +			array( +				'retain', false, +				array( +					array('post_id' => 1, 'poster_id' => ANONYMOUS, 'post_username' => ''), +					array('post_id' => 2, 'poster_id' => ANONYMOUS, 'post_username' => 'Other'), +					array('post_id' => 3, 'poster_id' => ANONYMOUS, 'post_username' => ''), +					array('post_id' => 4, 'poster_id' => ANONYMOUS, 'post_username' => 'Other'), +				), +				array( +					array( +						'topic_id' => 1, +						'topic_poster' => ANONYMOUS, 'topic_first_poster_name' => '', 'topic_first_poster_colour' => '', +						'topic_last_poster_id' => ANONYMOUS, 'topic_last_poster_name' => '', 'topic_last_poster_colour' => '', +					), +					array( +						'topic_id' => 2, +						'topic_poster' => ANONYMOUS, 'topic_first_poster_name' => 'Other', 'topic_first_poster_colour' => '', +						'topic_last_poster_id' => ANONYMOUS, 'topic_last_poster_name' => 'Other', 'topic_last_poster_colour' => '', +					), +					array( +						'topic_id' => 3, +						'topic_poster' => ANONYMOUS, 'topic_first_poster_name' => '', 'topic_first_poster_colour' => '', +						'topic_last_poster_id' => ANONYMOUS, 'topic_last_poster_name' => '', 'topic_last_poster_colour' => '', +					), +					array( +						'topic_id' => 4, +						'topic_poster' => ANONYMOUS, 'topic_first_poster_name' => 'Other', 'topic_first_poster_colour' => '', +						'topic_last_poster_id' => ANONYMOUS, 'topic_last_poster_name' => 'Other', 'topic_last_poster_colour' => '', +					), +				), +				array( +					array('forum_id' => 1, 'forum_last_poster_id' => ANONYMOUS, 'forum_last_poster_name' => '', 'forum_last_poster_colour' => ''), +					array('forum_id' => 2, 'forum_last_poster_id' => ANONYMOUS, 'forum_last_poster_name' => 'Other', 'forum_last_poster_colour' => ''), +					array('forum_id' => 3, 'forum_last_poster_id' => ANONYMOUS, 'forum_last_poster_name' => '', 'forum_last_poster_colour' => ''), +					array('forum_id' => 4, 'forum_last_poster_id' => ANONYMOUS, 'forum_last_poster_name' => 'Other', 'forum_last_poster_colour' => ''), +				), +			), +			array( +				'remove', false, +				array( +					array('post_id' => 2, 'poster_id' => ANONYMOUS, 'post_username' => 'Other'), +					array('post_id' => 4, 'poster_id' => ANONYMOUS, 'post_username' => 'Other'), +				), +				array( +					array( +						'topic_id' => 2, +						'topic_poster' => ANONYMOUS, 'topic_first_poster_name' => 'Other', 'topic_first_poster_colour' => '', +						'topic_last_poster_id' => ANONYMOUS, 'topic_last_poster_name' => 'Other', 'topic_last_poster_colour' => '', +					), +					array( +						'topic_id' => 4, +						'topic_poster' => ANONYMOUS, 'topic_first_poster_name' => 'Other', 'topic_first_poster_colour' => '', +						'topic_last_poster_id' => ANONYMOUS, 'topic_last_poster_name' => 'Other', 'topic_last_poster_colour' => '', +					), +				), +				array( +					array('forum_id' => 1, 'forum_last_poster_id' => 0, 'forum_last_poster_name' => '', 'forum_last_poster_colour' => ''), +					array('forum_id' => 2, 'forum_last_poster_id' => ANONYMOUS, 'forum_last_poster_name' => 'Other', 'forum_last_poster_colour' => ''), +					array('forum_id' => 3, 'forum_last_poster_id' => 0, 'forum_last_poster_name' => '', 'forum_last_poster_colour' => ''), +					array('forum_id' => 4, 'forum_last_poster_id' => ANONYMOUS, 'forum_last_poster_name' => 'Other', 'forum_last_poster_colour' => ''), +				), +			), +			array( +				'retain', 'Bertie', +				array( +					array('post_id' => 1, 'poster_id' => ANONYMOUS, 'post_username' => 'Bertie'), +					array('post_id' => 2, 'poster_id' => ANONYMOUS, 'post_username' => 'Other'), +					array('post_id' => 3, 'poster_id' => ANONYMOUS, 'post_username' => 'Bertie'), +					array('post_id' => 4, 'poster_id' => ANONYMOUS, 'post_username' => 'Other'), +				), +				array( +					array( +						'topic_id' => 1, +						'topic_poster' => ANONYMOUS, 'topic_first_poster_name' => 'Bertie', 'topic_first_poster_colour' => '', +						'topic_last_poster_id' => ANONYMOUS, 'topic_last_poster_name' => 'Bertie', 'topic_last_poster_colour' => '', +					), +					array( +						'topic_id' => 2, +						'topic_poster' => ANONYMOUS, 'topic_first_poster_name' => 'Other', 'topic_first_poster_colour' => '', +						'topic_last_poster_id' => ANONYMOUS, 'topic_last_poster_name' => 'Other', 'topic_last_poster_colour' => '', +					), +					array( +						'topic_id' => 3, +						'topic_poster' => ANONYMOUS, 'topic_first_poster_name' => 'Bertie', 'topic_first_poster_colour' => '', +						'topic_last_poster_id' => ANONYMOUS, 'topic_last_poster_name' => 'Bertie', 'topic_last_poster_colour' => '', +					), +					array( +						'topic_id' => 4, +						'topic_poster' => ANONYMOUS, 'topic_first_poster_name' => 'Other', 'topic_first_poster_colour' => '', +						'topic_last_poster_id' => ANONYMOUS, 'topic_last_poster_name' => 'Other', 'topic_last_poster_colour' => '', +					), +				), +				array( +					array('forum_id' => 1, 'forum_last_poster_id' => ANONYMOUS, 'forum_last_poster_name' => 'Bertie', 'forum_last_poster_colour' => ''), +					array('forum_id' => 2, 'forum_last_poster_id' => ANONYMOUS, 'forum_last_poster_name' => 'Other', 'forum_last_poster_colour' => ''), +					array('forum_id' => 3, 'forum_last_poster_id' => ANONYMOUS, 'forum_last_poster_name' => 'Bertie', 'forum_last_poster_colour' => ''), +					array('forum_id' => 4, 'forum_last_poster_id' => ANONYMOUS, 'forum_last_poster_name' => 'Other', 'forum_last_poster_colour' => ''), +				), +			), +			array( +				'remove', 'Bertie', +				array( +					array('post_id' => 2, 'poster_id' => ANONYMOUS, 'post_username' => 'Other'), +					array('post_id' => 4, 'poster_id' => ANONYMOUS, 'post_username' => 'Other'), +				), +				array( +					array( +						'topic_id' => 2, +						'topic_poster' => ANONYMOUS, 'topic_first_poster_name' => 'Other', 'topic_first_poster_colour' => '', +						'topic_last_poster_id' => ANONYMOUS, 'topic_last_poster_name' => 'Other', 'topic_last_poster_colour' => '', +					), +					array( +						'topic_id' => 4, +						'topic_poster' => ANONYMOUS, 'topic_first_poster_name' => 'Other', 'topic_first_poster_colour' => '', +						'topic_last_poster_id' => ANONYMOUS, 'topic_last_poster_name' => 'Other', 'topic_last_poster_colour' => '', +					), +				), +				array( +					array('forum_id' => 1, 'forum_last_poster_id' => 0, 'forum_last_poster_name' => '', 'forum_last_poster_colour' => ''), +					array('forum_id' => 2, 'forum_last_poster_id' => ANONYMOUS, 'forum_last_poster_name' => 'Other', 'forum_last_poster_colour' => ''), +					array('forum_id' => 3, 'forum_last_poster_id' => 0, 'forum_last_poster_name' => '', 'forum_last_poster_colour' => ''), +					array('forum_id' => 4, 'forum_last_poster_id' => ANONYMOUS, 'forum_last_poster_name' => 'Other', 'forum_last_poster_colour' => ''), +				), +			), +		); +	} + +	/** +	* @dataProvider first_last_post_data +	*/ +	public function test_first_last_post_info($mode, $post_username, $expected_posts, $expected_topics, $expected_forums) +	{ +		$this->assertFalse(user_delete($mode, 2, $post_username)); + +		$sql = 'SELECT post_id, poster_id, post_username +			FROM ' . POSTS_TABLE . ' +			ORDER BY post_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_posts, $this->db->sql_fetchrowset($result), 'Post table poster info is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); + +		$sql = 'SELECT topic_id, topic_poster, topic_first_poster_name, topic_first_poster_colour, topic_last_poster_id, topic_last_poster_name, topic_last_poster_colour +			FROM ' . TOPICS_TABLE . ' +			ORDER BY topic_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_topics, $this->db->sql_fetchrowset($result), 'Topic table first/last poster info is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); + +		$sql = 'SELECT forum_id, forum_last_poster_id, forum_last_poster_name, forum_last_poster_colour +			FROM ' . FORUMS_TABLE . ' +			ORDER BY forum_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_forums, $this->db->sql_fetchrowset($result), 'Forum table last poster info is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); +	} + +	 public function report_attachment_data() +	{ +		return array( +			array( +				'retain', +				array( +					array('post_id' => 1, 'post_reported' => 1, 'post_edit_user' => 1), +					array('post_id' => 2, 'post_reported' => 1, 'post_edit_user' => 1), +					array('post_id' => 3, 'post_reported' => 0, 'post_edit_user' => 1), +					array('post_id' => 4, 'post_reported' => 0, 'post_edit_user' => 1), +				), +				array( +					array('report_id' => 1, 'post_id' => 1, 'user_id' => 1), +					array('report_id' => 3, 'post_id' => 2, 'user_id' => 1), +				), +				array( +					array('topic_id' => 1, 'topic_reported' => 1), +					array('topic_id' => 2, 'topic_reported' => 1), +					array('topic_id' => 3, 'topic_reported' => 0), +					array('topic_id' => 4, 'topic_reported' => 0), +				), +				array( +					array('attach_id' => 1, 'post_msg_id' => 1, 'poster_id' => 1), +					array('attach_id' => 2, 'post_msg_id' => 2, 'poster_id' => 1), +					array('attach_id' => 3, 'post_msg_id' => 0, 'poster_id' => 1), // TODO should be deleted: PHPBB3-13089 +				), +			), +			array( +				'remove', +				array( +					array('post_id' => 2, 'post_reported' => 1, 'post_edit_user' => 1), +					array('post_id' => 4, 'post_reported' => 0, 'post_edit_user' => 1), +				), +				array( +					array('report_id' => 3, 'post_id' => 2, 'user_id' => 1), +				), +				array( +					array('topic_id' => 2, 'topic_reported' => 1), +					array('topic_id' => 4, 'topic_reported' => 0), +				), +				array( +					array('attach_id' => 2, 'post_msg_id' => 2, 'poster_id' => 1), +					array('attach_id' => 3, 'post_msg_id' => 0, 'poster_id' => 2), // TODO should be deleted: PHPBB3-13089 +				), +			), +		); +	} + +	/** +	* @dataProvider report_attachment_data +	*/ +	public function test_report_attachment_info($mode, $expected_posts, $expected_reports, $expected_topics, $expected_attach) +	{ +		$this->assertFalse(user_delete($mode, 2)); + +		$sql = 'SELECT post_id, post_reported, post_edit_user +			FROM ' . POSTS_TABLE . ' +			ORDER BY post_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_posts, $this->db->sql_fetchrowset($result), 'Post report status content is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); + +		$sql = 'SELECT report_id, post_id, user_id +			FROM ' . REPORTS_TABLE . ' +			ORDER BY report_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_reports, $this->db->sql_fetchrowset($result), 'Report table content is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); + +		$sql = 'SELECT topic_id, topic_reported +			FROM ' . TOPICS_TABLE . ' +			ORDER BY topic_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_topics, $this->db->sql_fetchrowset($result), 'Topic report status is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); + +		$sql = 'SELECT attach_id, post_msg_id, poster_id +			FROM ' . ATTACHMENTS_TABLE . ' +			ORDER BY attach_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_attach, $this->db->sql_fetchrowset($result), 'Attachment table content is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); +	} + +	 public function delete_data() +	{ +		return array( +			array( +				'retain', +				array(array('user_id' => 1, 'user_posts' => 4)), +				array(array('user_id' => 1, 'zebra_id' => 3)), +				array(array('ban_id' => 2), array('ban_id' => 3)), +				array(array('session_id' => '12345678901234567890123456789013')), +				array( +					array('log_id' => 2, 'user_id' => 1, 'reportee_id' => 1), +					array('log_id' => 3, 'user_id' => 1, 'reportee_id' => 1), +				), +				array( +					array('msg_id' => 1, 'author_id' => 3, 'message_edit_user' => 3), +					array('msg_id' => 2, 'author_id' => 1, 'message_edit_user' => 1), +				), +			), +			array( +				'remove', +				array(array('user_id' => 1, 'user_posts' => 2)), +				array(array('user_id' => 1, 'zebra_id' => 3)), +				array(array('ban_id' => 2), array('ban_id' => 3)), +				array(array('session_id' => '12345678901234567890123456789013')), +				array( +					array('log_id' => 2, 'user_id' => 1, 'reportee_id' => 1), +					array('log_id' => 3, 'user_id' => 1, 'reportee_id' => 1), +				), +				array( +					array('msg_id' => 1, 'author_id' => 3, 'message_edit_user' => 3), +					array('msg_id' => 2, 'author_id' => 1, 'message_edit_user' => 1), +				), +			), +		); +	} + +	/** +	* @dataProvider delete_data +	*/ +	public function test_delete_data($mode, $expected_users, $expected_zebra, $expected_ban, $expected_sessions, $expected_logs, $expected_pms) +	{ +		$this->assertFalse(user_delete($mode, 2)); + +		$sql = 'SELECT user_id, user_posts +			FROM ' . USERS_TABLE . ' +			ORDER BY user_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_users, $this->db->sql_fetchrowset($result), 'User table content is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); + +		$sql = 'SELECT user_id, zebra_id +			FROM ' . ZEBRA_TABLE . ' +			ORDER BY user_id ASC, zebra_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_zebra, $this->db->sql_fetchrowset($result), 'Zebra table content is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); + +		$sql = 'SELECT ban_id +			FROM ' . BANLIST_TABLE . ' +			ORDER BY ban_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_ban, $this->db->sql_fetchrowset($result), 'Ban table content is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); + +		$sql = 'SELECT session_id +			FROM ' . SESSIONS_TABLE . ' +			ORDER BY session_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_sessions, $this->db->sql_fetchrowset($result), 'Session table content is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); + +		$sql = 'SELECT log_id, user_id, reportee_id +			FROM ' . LOG_TABLE . ' +			ORDER BY log_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_logs, $this->db->sql_fetchrowset($result), 'Log table content is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); + +		$sql = 'SELECT msg_id, author_id, message_edit_user +			FROM ' . PRIVMSGS_TABLE . ' +			ORDER BY msg_id ASC'; +		$result = $this->db->sql_query($sql); +		$this->assertEquals($expected_pms, $this->db->sql_fetchrowset($result), 'Private messages table content is mismatching after deleting a user.'); +		$this->db->sql_freeresult($result); +	} + +	 public function delete_user_id_data() +	{ +		return array( +			array( +				'retain', +				array( +					USER_GROUP_TABLE, +					TOPICS_WATCH_TABLE, +					FORUMS_WATCH_TABLE, +					ACL_USERS_TABLE, +					TOPICS_TRACK_TABLE, +					TOPICS_POSTED_TABLE, +					FORUMS_TRACK_TABLE, +					PROFILE_FIELDS_DATA_TABLE, +					MODERATOR_CACHE_TABLE, +					DRAFTS_TABLE, +					BOOKMARKS_TABLE, +					SESSIONS_KEYS_TABLE, +					PRIVMSGS_FOLDER_TABLE, +					PRIVMSGS_RULES_TABLE, +				), +			), +			array( +				'remove', +				array( +					USER_GROUP_TABLE, +					TOPICS_WATCH_TABLE, +					FORUMS_WATCH_TABLE, +					ACL_USERS_TABLE, +					TOPICS_TRACK_TABLE, +					TOPICS_POSTED_TABLE, +					FORUMS_TRACK_TABLE, +					PROFILE_FIELDS_DATA_TABLE, +					MODERATOR_CACHE_TABLE, +					DRAFTS_TABLE, +					BOOKMARKS_TABLE, +					SESSIONS_KEYS_TABLE, +					PRIVMSGS_FOLDER_TABLE, +					PRIVMSGS_RULES_TABLE, +				), +			), +		); +	} + +	/** +	* @dataProvider delete_user_id_data +	*/ +	public function test_delete_user_id_data($mode, $cleaned_tables) +	{ +		$this->assertFalse(user_delete($mode, 2)); + +		foreach ($cleaned_tables as $table) +		{ +			$sql = 'SELECT user_id +				FROM ' . $table . ' +				WHERE user_id = 2'; +			$result = $this->db->sql_query($sql); +			$this->assertFalse($this->db->sql_fetchfield('user_id'), 'Found data for deleted user in table: ' . $table); +			$this->db->sql_freeresult($result); + +			$sql = 'SELECT user_id +				FROM ' . $table . ' +				WHERE user_id = 3'; +			$result = $this->db->sql_query($sql); +			$this->assertEquals(3, $this->db->sql_fetchfield('user_id'), 'Missing data for user in table: ' . $table); +			$this->db->sql_freeresult($result); +		} +	} +} diff --git a/tests/functions_user/fixtures/delete_user.xml b/tests/functions_user/fixtures/delete_user.xml new file mode 100644 index 0000000000..07591389d2 --- /dev/null +++ b/tests/functions_user/fixtures/delete_user.xml @@ -0,0 +1,531 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<dataset> +	<table name="phpbb_attachments"> +		<column>attach_id</column> +		<column>post_msg_id</column> +		<column>topic_id</column> +		<column>in_message</column> +		<column>poster_id</column> +		<column>is_orphan</column> +		<column>attach_comment</column> +		<row> +			<value>1</value> +			<value>1</value> +			<value>1</value> +			<value>0</value> +			<value>2</value> +			<value>0</value> +			<value></value> +		</row> +		<row> +			<value>2</value> +			<value>2</value> +			<value>2</value> +			<value>0</value> +			<value>1</value> +			<value>0</value> +			<value></value> +		</row> +		<row> +			<value>3</value> +			<value>0</value> +			<value>0</value> +			<value>0</value> +			<value>2</value> +			<value>1</value> +			<value></value> +		</row> +	</table> +	<table name="phpbb_banlist"> +		<column>ban_id</column> +		<column>ban_userid</column> +		<column>ban_email</column> +		<column>ban_reason</column> +		<column>ban_give_reason</column> +		<row> +			<value>1</value> +			<value>2</value> +			<value></value> +			<value></value> +			<value></value> +		</row> +		<row> +			<value>2</value> +			<value>3</value> +			<value></value> +			<value></value> +			<value></value> +		</row> +		<row> +			<value>3</value> +			<value>0</value> +			<value></value> +			<value></value> +			<value></value> +		</row> +	</table> +	<table name="phpbb_forums"> +		<column>forum_id</column> +		<column>forum_last_poster_id</column> +		<column>forum_last_poster_name</column> +		<column>forum_last_poster_colour</column> +		<column>forum_parents</column> +		<column>forum_desc</column> +		<column>forum_rules</column> +		<row> +			<value>1</value> +			<value>2</value> +			<value></value> +			<value>00AA00</value> +			<value></value> +			<value></value> +			<value></value> +		</row> +		<row> +			<value>2</value> +			<value>1</value> +			<value>Other</value> +			<value></value> +			<value></value> +			<value></value> +			<value></value> +		</row> +		<row> +			<value>3</value> +			<value>2</value> +			<value></value> +			<value>00AA00</value> +			<value></value> +			<value></value> +			<value></value> +		</row> +		<row> +			<value>4</value> +			<value>1</value> +			<value>Other</value> +			<value></value> +			<value></value> +			<value></value> +			<value></value> +		</row> +	</table> +	<table name="phpbb_log"> +		<column>log_id</column> +		<column>user_id</column> +		<column>reportee_id</column> +		<column>log_operation</column> +		<column>log_data</column> +		<row> +			<value>1</value> +			<value>1</value> +			<value>2</value> +			<value></value> +			<value></value> +		</row> +		<row> +			<value>2</value> +			<value>2</value> +			<value>1</value> +			<value></value> +			<value></value> +		</row> +		<row> +			<value>3</value> +			<value>1</value> +			<value>1</value> +			<value></value> +			<value></value> +		</row> +		<row> +			<value>4</value> +			<value>2</value> +			<value>2</value> +			<value></value> +			<value></value> +		</row> +	</table> +	<table name="phpbb_posts"> +		<column>post_id</column> +		<column>poster_id</column> +		<column>post_edit_user</column> +		<column>post_username</column> +		<column>topic_id</column> +		<column>forum_id</column> +		<column>post_approved</column> +		<column>post_time</column> +		<column>post_text</column> +		<column>post_reported</column> +		<row> +			<value>1</value> +			<value>2</value> +			<value>2</value> +			<value></value> +			<value>1</value> +			<value>1</value> +			<value>1</value> +			<value>1</value> +			<value></value> +			<value>1</value> +		</row> +		<row> +			<value>2</value> +			<value>1</value> +			<value>1</value> +			<value>Other</value> +			<value>2</value> +			<value>2</value> +			<value>1</value> +			<value>1</value> +			<value></value> +			<value>1</value> +		</row> +		<row> +			<value>3</value> +			<value>2</value> +			<value>2</value> +			<value></value> +			<value>3</value> +			<value>3</value> +			<value>1</value> +			<value>1</value> +			<value></value> +			<value>1</value> +		</row> +		<row> +			<value>4</value> +			<value>1</value> +			<value>1</value> +			<value>Other</value> +			<value>4</value> +			<value>4</value> +			<value>1</value> +			<value>1</value> +			<value></value> +			<value>1</value> +		</row> +	</table> +	<table name="phpbb_privmsgs"> +		<column>msg_id</column> +		<column>author_id</column> +		<column>message_edit_user</column> +		<column>message_text</column> +		<column>to_address</column> +		<column>bcc_address</column> +		<row> +			<value>1</value> +			<value>3</value> +			<value>3</value> +			<value></value> +			<value></value> +			<value></value> +		</row> +		<row> +			<value>2</value> +			<value>2</value> +			<value>2</value> +			<value></value> +			<value></value> +			<value></value> +		</row> +	</table> +	<table name="phpbb_privmsgs_to"> +		<column>msg_id</column> +		<column>user_id</column> +		<column>author_id</column> +		<row> +			<value>1</value> +			<value>3</value> +			<value>3</value> +		</row> +		<row> +			<value>1</value> +			<value>2</value> +			<value>3</value> +		</row> +		<row> +			<value>2</value> +			<value>3</value> +			<value>2</value> +		</row> +		<row> +			<value>2</value> +			<value>2</value> +			<value>2</value> +		</row> +	</table> +	<table name="phpbb_reports"> +		<column>report_id</column> +		<column>post_id</column> +		<column>user_id</column> +		<column>report_text</column> +		<row> +			<value>1</value> +			<value>1</value> +			<value>1</value> +			<value>Post Removed?</value> +		</row> +		<row> +			<value>2</value> +			<value>3</value> +			<value>2</value> +			<value>Post Removed?</value> +		</row> +		<row> +			<value>3</value> +			<value>2</value> +			<value>1</value> +			<value>Keep</value> +		</row> +		<row> +			<value>4</value> +			<value>4</value> +			<value>2</value> +			<value>Remove Report</value> +		</row> +	</table> +	<table name="phpbb_sessions"> +		<column>session_id</column> +		<column>session_user_id</column> +		<column>session_page</column> +		<row> +			<value>12345678901234567890123456789012</value> +			<value>2</value> +			<value></value> +		</row> +		<row> +			<value>12345678901234567890123456789013</value> +			<value>3</value> +			<value></value> +		</row> +	</table> +	<table name="phpbb_topics"> +		<column>topic_id</column> +		<column>forum_id</column> +		<column>topic_reported</column> +		<column>topic_poster</column> +		<column>topic_first_poster_name</column> +		<column>topic_first_poster_colour</column> +		<column>topic_last_poster_id</column> +		<column>topic_last_poster_name</column> +		<column>topic_last_poster_colour</column> +		<row> +			<value>1</value> +			<value>1</value> +			<value>1</value> +			<value>2</value> +			<value></value> +			<value>00AA00</value> +			<value>2</value> +			<value></value> +			<value>00AA00</value> +		</row> +		<row> +			<value>2</value> +			<value>2</value> +			<value>1</value> +			<value>1</value> +			<value>Other</value> +			<value></value> +			<value>1</value> +			<value>Other</value> +			<value></value> +		</row> +		<row> +			<value>3</value> +			<value>3</value> +			<value>1</value> +			<value>2</value> +			<value></value> +			<value>00AA00</value> +			<value>2</value> +			<value></value> +			<value>00AA00</value> +		</row> +		<row> +			<value>4</value> +			<value>4</value> +			<value>1</value> +			<value>1</value> +			<value>Other</value> +			<value></value> +			<value>1</value> +			<value>Other</value> +			<value></value> +		</row> +	</table> +	<table name="phpbb_users"> +		<column>user_id</column> +		<column>username_clean</column> +		<column>user_permissions</column> +		<column>user_sig</column> +		<column>user_occ</column> +		<column>user_interests</column> +		<column>user_posts</column> +		<row> +			<value>1</value> +			<value>Anonymous</value> +			<value></value> +			<value></value> +			<value></value> +			<value></value> +			<value>2</value> +		</row> +		<row> +			<value>2</value> +			<value>Foobar</value> +			<value></value> +			<value></value> +			<value></value> +			<value></value> +			<value>2</value> +		</row> +	</table> +	<table name="phpbb_zebra"> +		<column>user_id</column> +		<column>zebra_id</column> +		<row> +			<value>1</value> +			<value>2</value> +		</row> +		<row> +			<value>1</value> +			<value>3</value> +		</row> +		<row> +			<value>2</value> +			<value>1</value> +		</row> +	</table> +	<table name="phpbb_user_group"> +		<column>user_id</column> +		<row> +			<value>2</value> +		</row> +		<row> +			<value>3</value> +		</row> +	</table> +	<table name="phpbb_topics_watch"> +		<column>user_id</column> +		<row> +			<value>2</value> +		</row> +		<row> +			<value>3</value> +		</row> +	</table> +	<table name="phpbb_forums_watch"> +		<column>user_id</column> +		<row> +			<value>2</value> +		</row> +		<row> +			<value>3</value> +		</row> +	</table> +	<table name="phpbb_acl_users"> +		<column>user_id</column> +		<row> +			<value>2</value> +		</row> +		<row> +			<value>3</value> +		</row> +	</table> +	<table name="phpbb_topics_track"> +		<column>user_id</column> +		<row> +			<value>2</value> +		</row> +		<row> +			<value>3</value> +		</row> +	</table> +	<table name="phpbb_forums_track"> +		<column>user_id</column> +		<row> +			<value>2</value> +		</row> +		<row> +			<value>3</value> +		</row> +	</table> +	<table name="phpbb_topics_posted"> +		<column>user_id</column> +		<row> +			<value>2</value> +		</row> +		<row> +			<value>3</value> +		</row> +	</table> +	<table name="phpbb_profile_fields_data"> +		<column>user_id</column> +		<row> +			<value>2</value> +		</row> +		<row> +			<value>3</value> +		</row> +	</table> +	<table name="phpbb_moderator_cache"> +		<column>user_id</column> +		<row> +			<value>2</value> +		</row> +		<row> +			<value>3</value> +		</row> +	</table> +	<table name="phpbb_bookmarks"> +		<column>user_id</column> +		<row> +			<value>2</value> +		</row> +		<row> +			<value>3</value> +		</row> +	</table> +	<table name="phpbb_sessions_keys"> +		<column>user_id</column> +		<row> +			<value>2</value> +		</row> +		<row> +			<value>3</value> +		</row> +	</table> +	<table name="phpbb_privmsgs_folder"> +		<column>user_id</column> +		<row> +			<value>2</value> +		</row> +		<row> +			<value>3</value> +		</row> +	</table> +	<table name="phpbb_privmsgs_rules"> +		<column>user_id</column> +		<column>rule_string</column> +		<row> +			<value>2</value> +			<value></value> +		</row> +		<row> +			<value>3</value> +			<value></value> +		</row> +	</table> +	<table name="phpbb_drafts"> +		<column>user_id</column> +		<column>draft_message</column> +		<row> +			<value>2</value> +			<value></value> +		</row> +		<row> +			<value>3</value> +			<value></value> +		</row> +	</table> +</dataset> diff --git a/tests/session/fixtures/sessions_empty.xml b/tests/session/fixtures/sessions_empty.xml index 0e6ddccd88..c592e0a6c8 100644 --- a/tests/session/fixtures/sessions_empty.xml +++ b/tests/session/fixtures/sessions_empty.xml @@ -38,4 +38,11 @@  		<column>session_ip</column>  		<column>session_browser</column>  	</table> +	<table name="phpbb_banlist"> +		<column>ban_id</column> +		<column>ban_userid</column> +		<column>ban_email</column> +		<column>ban_reason</column> +		<column>ban_give_reason</column> +	</table>  </dataset> diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php index 5dfe07d380..4522674649 100644 --- a/tests/test_framework/phpbb_functional_test_case.php +++ b/tests/test_framework/phpbb_functional_test_case.php @@ -665,6 +665,64 @@ class phpbb_functional_test_case extends phpbb_test_case  	{  		$this->add_lang('posting'); +		$crawler = $this->submit_message($posting_url, $posting_contains, $form_data); + +		$this->assertContains($this->lang('POST_STORED'), $crawler->filter('html')->text()); +		$url = $crawler->selectLink($this->lang('VIEW_MESSAGE', '', ''))->link()->getUri(); + +		return array( +			'topic_id'	=> $this->get_parameter_from_link($url, 't'), +			'post_id'	=> $this->get_parameter_from_link($url, 'p'), +		); +	} + +	/** +	* Creates a private message +	* +	* Be sure to login before creating +	* +	* @param string $subject +	* @param string $message +	* @param array $to +	* @param array $additional_form_data Any additional form data to be sent in the request +	* @return int private_message_id +	*/ +	public function create_private_message($subject, $message, $to, $additional_form_data = array()) +	{ +		$this->add_lang(array('ucp', 'posting')); + +		$posting_url = "ucp.php?i=pm&mode=compose&sid={$this->sid}"; + +		$form_data = array_merge(array( +			'subject'		=> $subject, +			'message'		=> $message, +			'post'			=> true, +		), $additional_form_data); + +		foreach ($to as $user_id) +		{ +			$form_data['address_list[u][' . $user_id . ']'] = 'to'; +		} + +		$crawler = self::submit_message($posting_url, 'POST_NEW_PM', $form_data); + +		$this->assertContains($this->lang('MESSAGE_STORED'), $crawler->filter('html')->text()); +		$url = $crawler->selectLink($this->lang('VIEW_PRIVATE_MESSAGE', '', ''))->link()->getUri(); + +		return $this->get_parameter_from_link($url, 'p'); +	} + +	/** +	* Helper for submitting a message (post or private message) +	* +	* @param string $posting_url +	* @param string $posting_contains +	* @param array $form_data +	* @return \Symfony\Component\DomCrawler\Crawler the crawler object +	*/ +	protected function submit_message($posting_url, $posting_contains, $form_data) +	{ +  		$crawler = self::request('GET', $posting_url);  		$this->assertContains($this->lang($posting_contains), $crawler->filter('html')->text()); @@ -689,14 +747,7 @@ class phpbb_functional_test_case extends phpbb_test_case  		// I use a request because the form submission method does not allow you to send data that is not  		// contained in one of the actual form fields that the browser sees (i.e. it ignores "hidden" inputs)  		// Instead, I send it as a request with the submit button "post" set to true. -		$crawler = self::request('POST', $posting_url, $form_data); -		$this->assertContains($this->lang('POST_STORED'), $crawler->filter('html')->text()); -		$url = $crawler->selectLink($this->lang('VIEW_MESSAGE', '', ''))->link()->getUri(); - -		return array( -			'topic_id'	=> $this->get_parameter_from_link($url, 't'), -			'post_id'	=> $this->get_parameter_from_link($url, 'p'), -		); +		return self::request('POST', $posting_url, $form_data);  	}  	/** diff --git a/travis/setup-webserver.sh b/travis/setup-webserver.sh index 6188d2c232..a6086bb9f9 100755 --- a/travis/setup-webserver.sh +++ b/travis/setup-webserver.sh @@ -28,10 +28,6 @@ then  	# Upgrade to a recent stable version of HHVM  	sudo apt-get -o Dpkg::Options::="--force-confnew" install -y hhvm-nightly -	# MySQLi is broken in HHVM 3.0.0~precise and still does not work for us in -	# 2014.03.28~saucy, i.e. needs more work. Use MySQL extension for now. -	sed -i "s/mysqli/mysql/" "$DIR/phpunit-mysql-travis.xml" -  	HHVM_LOG=$(realpath "$DIR")/hhvm.log  	sudo hhvm \ @@ -52,6 +48,7 @@ else  		user = $USER  		group = $USER  		listen = $APP_SOCK +		listen.mode = 0666  		pm = static  		pm.max_children = 2 | 
