aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore6
-rw-r--r--.travis.yml25
-rw-r--r--README.md8
-rw-r--r--build/build.xml52
-rwxr-xr-xbuild/build_announcement.php98
-rwxr-xr-xbuild/build_diff.php414
-rw-r--r--build/diff_class.php1710
-rwxr-xr-xbuild/package.php12
-rwxr-xr-xcomposer.pharbin799883 -> 960311 bytes
-rwxr-xr-xgit-tools/commit-msg-hook-range.sh51
-rw-r--r--phpBB/adm/style/acp_inactive.html2
-rw-r--r--phpBB/adm/style/acp_users_overview.html2
-rw-r--r--phpBB/adm/style/editor.js2
-rw-r--r--phpBB/composer.json4
-rw-r--r--phpBB/composer.lock452
-rw-r--r--phpBB/develop/create_schema_files.php19
-rw-r--r--phpBB/docs/AUTHORS4
-rw-r--r--phpBB/docs/CHANGELOG.html1
-rw-r--r--phpBB/docs/INSTALL.html1
-rw-r--r--phpBB/docs/README.html2
-rw-r--r--phpBB/includes/acp/acp_board.php2
-rw-r--r--phpBB/includes/acp/acp_forums.php1
-rw-r--r--phpBB/includes/acp/acp_users.php12
-rw-r--r--phpBB/includes/bbcode.php4
-rw-r--r--phpBB/includes/db/db_tools.php152
-rw-r--r--phpBB/includes/functions.php15
-rw-r--r--phpBB/includes/functions_admin.php16
-rw-r--r--phpBB/includes/functions_content.php18
-rw-r--r--phpBB/includes/functions_module.php6
-rw-r--r--phpBB/includes/functions_posting.php4
-rw-r--r--phpBB/includes/functions_profile_fields.php2
-rw-r--r--phpBB/includes/mcp/info/mcp_pm_reports.php2
-rw-r--r--phpBB/includes/mcp/mcp_queue.php6
-rw-r--r--phpBB/includes/search/fulltext_native.php39
-rw-r--r--phpBB/install/database_update.php6
-rw-r--r--phpBB/install/index.php3
-rw-r--r--phpBB/install/install_convert.php2
-rw-r--r--phpBB/install/install_install.php50
-rw-r--r--phpBB/install/schemas/mssql_schema.sql605
-rw-r--r--phpBB/install/schemas/schema_data.sql2
-rw-r--r--phpBB/language/en/acp/ban.php4
-rw-r--r--phpBB/language/en/acp/board.php4
-rw-r--r--phpBB/language/en/acp/common.php2
-rw-r--r--phpBB/language/en/acp/users.php1
-rw-r--r--phpBB/language/en/common.php5
-rw-r--r--phpBB/language/en/email/topic_notify.txt3
-rw-r--r--phpBB/language/en/memberlist.php1
-rw-r--r--phpBB/search.php15
-rw-r--r--phpBB/styles/prosilver/style.cfg4
-rw-r--r--phpBB/styles/prosilver/template/editor.js2
-rw-r--r--phpBB/styles/prosilver/template/forum_fn.js2
-rw-r--r--phpBB/styles/prosilver/template/overall_footer.html2
-rw-r--r--phpBB/styles/prosilver/template/ucp_groups_manage.html2
-rw-r--r--phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html2
-rw-r--r--phpBB/styles/prosilver/template/ucp_profile_profile_info.html6
-rw-r--r--phpBB/styles/prosilver/template/ucp_profile_reg_details.html4
-rw-r--r--phpBB/styles/prosilver/template/viewtopic_print.html2
-rw-r--r--phpBB/styles/subsilver2/style.cfg2
-rw-r--r--phpBB/styles/subsilver2/template/editor.js2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_pm_viewmessage_print.html1
-rw-r--r--phpBB/styles/subsilver2/template/ucp_profile_reg_details.html4
-rw-r--r--phpBB/styles/subsilver2/template/viewtopic_print.html1
-rw-r--r--phpBB/viewtopic.php24
-rw-r--r--tests/functional/acp_users_test.php45
-rw-r--r--tests/functions/obtain_online_test.php3
-rw-r--r--tests/functions/parse_cfg_file_test.php103
-rw-r--r--tests/functions_content/get_username_string_test.php125
-rw-r--r--tests/functions_content/phpbb_clean_search_string_test.php38
-rw-r--r--tests/lint_test.php28
-rw-r--r--tests/profile/get_profile_value_test.php42
-rw-r--r--tests/security/hash_test.php8
-rw-r--r--tests/test_framework/phpbb_functional_test_case.php9
-rw-r--r--travis/phpunit-mariadb-travis.xml41
-rwxr-xr-xtravis/setup-mariadb.sh49
-rwxr-xr-xtravis/setup-webserver.sh87
75 files changed, 1761 insertions, 2724 deletions
diff --git a/.gitignore b/.gitignore
index c757210654..06f50e9c4e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,9 +4,7 @@
/phpBB/cache/*.php
/phpBB/cache/*.lock
/phpBB/composer.phar
-/phpBB/config.php
-/phpBB/config_dev.php
-/phpBB/config_test.php
+/phpBB/config*.php
/phpBB/ext/*
/phpBB/files/*
/phpBB/images/avatars/gallery/*
@@ -14,5 +12,5 @@
/phpBB/store/*
/phpBB/vendor
/tests/phpbb_unit_tests.sqlite2
-/tests/test_config.php
+/tests/test_config*.php
/tests/tmp/*
diff --git a/.travis.yml b/.travis.yml
index 5e2569dd22..635023d596 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,15 +5,18 @@ php:
- 5.3
- 5.4
- 5.5
+ - 5.6
+ - hhvm
env:
- DB=mysql
- - DB=postgres
before_script:
- sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'DROP DATABASE IF EXISTS phpbb_tests;' -U postgres; fi"
- sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'create database phpbb_tests;' -U postgres; fi"
- - sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'create database IF NOT EXISTS phpbb_tests;'; fi"
+ - sh -c "if [ '$DB' = 'mariadb' ]; then travis/setup-mariadb.sh; fi"
+ - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.3' -a '$DB' = 'mysql' ]; then mysql -e 'SET GLOBAL storage_engine=MyISAM;'; fi"
+ - sh -c "if [ '$DB' = 'mysql' -o '$DB' = 'mariadb' ]; then mysql -e 'create database IF NOT EXISTS phpbb_tests;'; fi"
- sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.2' ]; then pear install --force phpunit/DbUnit; phpenv rehash; fi"
- cd phpBB
- sh -c "if [ '$TRAVIS_PHP_VERSION' != '5.2' ]; then php ../composer.phar install --dev --no-interaction --prefer-source; fi"
@@ -22,10 +25,14 @@ before_script:
script:
- sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.2' ]; then phpunit --configuration travis/phpunit-$DB-travis.xml; else phpBB/vendor/bin/phpunit --configuration travis/phpunit-$DB-travis.xml; fi"
-
-notifications:
- email:
- recipients:
- - dev-team@phpbb.com
- on_success: change
- on_failure: change
+ - 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"
+
+matrix:
+ include:
+ - php: 5.4
+ env: DB=mariadb
+ - php: 5.4
+ env: DB=postgres
+ allow_failures:
+ - php: hhvm
+ fast_finish: true
diff --git a/README.md b/README.md
index f6ef523e17..37a42fa57f 100644
--- a/README.md
+++ b/README.md
@@ -17,9 +17,11 @@ Find support and lots more on [phpBB.com](http://www.phpbb.com)! Discuss the dev
## 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 build below.
-develop - [![Build Status](https://secure.travis-ci.org/phpbb/phpbb3.png?branch=develop)](http://travis-ci.org/phpbb/phpbb3)
-develop-olympus - [![Build Status](https://secure.travis-ci.org/phpbb/phpbb3.png?branch=develop-olympus)](http://travis-ci.org/phpbb/phpbb3)
+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 build below:
+
+* develop [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=develop)](http://travis-ci.org/phpbb/phpbb)
+* develop-ascraeus [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=develop-ascraeus)](http://travis-ci.org/phpbb/phpbb)
+* develop-olympus [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=develop-olympus)](http://travis-ci.org/phpbb/phpbb)
## LICENSE
diff --git a/build/build.xml b/build/build.xml
index d034c79731..a86cb9c36b 100644
--- a/build/build.xml
+++ b/build/build.xml
@@ -2,9 +2,9 @@
<project name="phpBB" description="The phpBB forum software" default="all" basedir="../">
<!-- a few settings for the build -->
- <property name="newversion" value="3.0.12-RC3" />
- <property name="prevversion" value="3.0.11" />
- <property name="olderversions" value="3.0.2, 3.0.3, 3.0.4, 3.0.5, 3.0.6, 3.0.7, 3.0.7-PL1, 3.0.8, 3.0.9, 3.0.10, 3.0.12-RC1, 3.0.12-RC2" />
+ <property name="newversion" value="3.0.13-dev" />
+ <property name="prevversion" value="3.0.12" />
+ <property name="olderversions" value="3.0.2, 3.0.3, 3.0.4, 3.0.5, 3.0.6, 3.0.7, 3.0.7-PL1, 3.0.8, 3.0.9, 3.0.10, 3.0.11" />
<!-- no configuration should be needed beyond this point -->
<property name="oldversions" value="${olderversions}, ${prevversion}" />
@@ -105,7 +105,7 @@
<property name="dir" value="build/old_versions/release-${version}" />
</phingcall>
- <exec dir="build/old_versions" command="diff -crNEBwd release-${version} release-${newversion} >
+ <exec dir="build/old_versions" command="LC_ALL=C diff -crNEBwd release-${version} release-${newversion} >
../new_version/patches/phpBB-${version}_to_${newversion}.patch" escape="false" />
</target>
@@ -131,24 +131,52 @@
<target name="package" depends="clean,prepare,prepare-new-version,old-version-diffs">
<exec dir="build" command="php -f package.php '${versions}' > logs/package.log" escape="false" />
- <exec dir="build" command="php -f build_diff.php '${prevversion}' '${newversion}' > logs/build_diff.log" escape="false" />
-
<exec dir="build" escape="false"
command="diff -crNEBwd old_versions/release-${prevversion}/language new_version/phpBB3/language >
- save/save_${prevversion}_to_${newversion}/language/phpbb-${prevversion}_to_${newversion}_language.patch" />
+ save/phpbb-${prevversion}_to_${newversion}_language.patch" />
<exec dir="build" escape="false"
command="diff -crNEBwd old_versions/release-${prevversion}/styles/prosilver new_version/phpBB3/styles/prosilver >
- save/save_${prevversion}_to_${newversion}/prosilver/phpbb-${prevversion}_to_${newversion}_prosilver.patch" />
+ save/phpbb-${prevversion}_to_${newversion}_prosilver.patch" />
<exec dir="build" escape="false"
command="diff -crNEBwd old_versions/release-${prevversion}/styles/subsilver2 new_version/phpBB3/styles/subsilver2 >
- save/save_${prevversion}_to_${newversion}/subsilver2/phpbb-${prevversion}_to_${newversion}_subsilver2.patch" />
+ save/phpbb-${prevversion}_to_${newversion}_subsilver2.patch" />
<exec dir="build" escape="false"
command="git shortlog --summary --numbered release-${prevversion}...HEAD >
- save/save_${prevversion}_to_${newversion}/phpbb-${prevversion}_to_${newversion}_git_shortlog.txt" />
+ save/phpbb-${prevversion}_to_${newversion}_git_shortlog.txt" />
<exec dir="build" escape="false"
command="git diff --stat release-${prevversion}...HEAD >
- save/save_${prevversion}_to_${newversion}/phpbb-${prevversion}_to_${newversion}_git_diffstat.txt" />
+ save/phpbb-${prevversion}_to_${newversion}_git_diffstat.txt" />
+
+ <phingcall target="checksum-dir">
+ <property name="dir" value="build/new_version/release_files" />
+ </phingcall>
+ </target>
+
+ <target name="checksum-dir">
+ <foreach param="filename" absparam="absfilename" target="checksum-file">
+ <fileset dir="${dir}">
+ <type type="file" />
+ </fileset>
+ </foreach>
+ </target>
+
+ <target name="checksum-file">
+ <echo msg="Creating checksum file for ${absfilename}" />
+ <php function="dirname" returnProperty="dir"><param value="${absfilename}"/></php>
+ <exec dir="${dir}" command="sha256sum ${filename} > ${filename}.sha256" />
+ </target>
+
+ <target name="announcement" depends="prepare">
+ <echo msg="Writing download links and checksums for email announcement to save/announcement_email_${newversion}.txt" />
+ <exec dir="build" escape="false"
+ command="php -f build_announcement.php email '${newversion}' 'new_version/release_files' sha256 >
+ save/announcement_email_${newversion}.txt" />
+
+ <echo msg="Writing download links and checksums for bbcode announcement to save/announcement_bbcode_${newversion}.txt" />
+ <exec dir="build" escape="false"
+ command="php -f build_announcement.php bbcode '${newversion}' 'new_version/release_files' sha256 >
+ save/announcement_bbcode_${newversion}.txt" />
</target>
<target name="changelog" depends="prepare">
@@ -193,7 +221,7 @@
command="git archive ${revision} composer.phar | tar -xf - -C ${dir}"
checkreturn="true" />
<exec dir="${dir}"
- command="php composer.phar install"
+ command="php composer.phar install --no-dev"
checkreturn="true"
passthru="true" />
<delete file="${dir}/composer.phar" />
diff --git a/build/build_announcement.php b/build/build_announcement.php
new file mode 100755
index 0000000000..3ee96fc67d
--- /dev/null
+++ b/build/build_announcement.php
@@ -0,0 +1,98 @@
+#!/usr/bin/env php
+<?php
+/**
+*
+* @package build
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+if (php_sapi_name() !== 'cli' || $_SERVER['argc'] != 5)
+{
+ echo "Usage (CLI only): build_announcement.php email|bbcode new_version release_files_dir checksum_algorithm\n";
+ exit(1);
+}
+
+$mode = $_SERVER['argv'][1];
+$version = $_SERVER['argv'][2];
+$root = $_SERVER['argv'][3];
+$checksum_algorithm = $_SERVER['argv'][4];
+
+$series_version = substr($version, 0, 3);
+$base_url = "https://download.phpbb.com/pub/release/$series_version";
+
+if (strpos($version, 'RC') === false)
+{
+ // Final release
+ $install_url = "$base_url/$version";
+ $update_url = "$base_url/update/to_$version";
+}
+else
+{
+ $install_url = "$base_url/release_candidates/$version";
+ $update_url = "$base_url/release_candidates/update/other_to_$version";
+}
+
+if ($mode === 'bbcode')
+{
+ $template = "[url=%1\$s/%2\$s]%2\$s[/url]\n{$checksum_algorithm}sum: %3\$s\n";
+}
+else
+{
+ $template = "%s/%s\n{$checksum_algorithm}sum: %s\n";
+}
+
+function phpbb_rnatsort($array)
+{
+ $strrnatcmp = function($a, $b)
+ {
+ return strnatcmp($b, $a);
+ };
+ usort($array, $strrnatcmp);
+ return $array;
+}
+
+function phpbb_string_ends_with($haystack, $needle)
+{
+ return substr($haystack, -strlen($needle)) === $needle;
+}
+
+function phpbb_is_update_file($filename)
+{
+ return strpos($filename, '_to_') !== false;
+}
+
+function phpbb_get_checksum($checksum_file)
+{
+ return array_shift(explode(' ', file_get_contents($checksum_file)));
+}
+
+$install_files = $update_files = array();
+foreach (phpbb_rnatsort(array_diff(scandir($root), array('.', '..'))) as $filename)
+{
+ if (phpbb_string_ends_with($filename, $checksum_algorithm))
+ {
+ continue;
+ }
+ else if (phpbb_is_update_file($filename))
+ {
+ $update_files[] = $filename;
+ }
+ else
+ {
+ $install_files[] = $filename;
+ }
+}
+
+foreach ($install_files as $filename)
+{
+ printf($template, $install_url, $filename, phpbb_get_checksum("$root/$filename.$checksum_algorithm"));
+}
+
+echo "\n";
+
+foreach ($update_files as $filename)
+{
+ printf($template, $update_url, $filename, phpbb_get_checksum("$root/$filename.$checksum_algorithm"));
+}
diff --git a/build/build_diff.php b/build/build_diff.php
deleted file mode 100755
index 0824b53caa..0000000000
--- a/build/build_diff.php
+++ /dev/null
@@ -1,414 +0,0 @@
-#!/usr/bin/env php
-<?php
-/**
-*
-* @package build
-* @copyright (c) 2010 phpBB Group
-* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
-*
-*/
-
-if ($_SERVER['argc'] != 3)
-{
- die("Please specify the previous and current version as arguments (e.g. build_diff.php '1.0.2' '1.0.3').");
-}
-
-$old_version = trim($_SERVER['argv'][1]);
-$new_version = trim($_SERVER['argv'][2]);
-
-$substitute_old = $old_version;
-$substitute_new = $new_version;
-$simple_name_old = 'release-' . $old_version;
-$simple_name_new = 'release-' . $new_version;
-$echo_changes = false;
-
-// DO NOT EVER USE THE FOLLOWING! Fix the script to generate proper changes,
-// do NOT manually create them.
-
-// Set this to true to just compress the changes and do not build them again
-// This should be used for building custom modified txt file. ;)
-$package_changed_files = false;
-
-//$debug_file = 'includes/functions_user.php'; //'styles/prosilver/style.cfg';
-$debug_file = false;
-
-if ($debug_file !== false)
-{
- $echo_changes = false;
-}
-
-$s_name = 'save_' . $substitute_old . '_to_' . $substitute_new;
-
-$location = dirname(__FILE__);
-
-if (!$package_changed_files)
-{
- if (!$echo_changes)
- {
- // Create directory...
- run_command("mkdir $location/save/{$s_name}");
- run_command("mkdir $location/save/{$s_name}/language");
- run_command("mkdir $location/save/{$s_name}/prosilver");
- run_command("mkdir $location/save/{$s_name}/subsilver2");
- }
-}
-
-// Build code changes and place them into 'save'
-if (!$package_changed_files)
-{
- build_code_changes('language');
- build_code_changes('prosilver');
- build_code_changes('subsilver2');
-}
-
-// Package code changes
-$code_changes_filename = 'phpBB-' . $substitute_old . '_to_' . $substitute_new . '-codechanges';
-
-if (!$echo_changes)
-{
- // Now compress the files...
- // Build Main phpBB Release
- $compress_programs = array(
-// 'tar.gz' => 'tar -czf',
- 'tar.bz2' => 'tar -cjf',
- 'zip' => 'zip -r'
- );
-
- chdir($location . '/save/' . $s_name);
- foreach ($compress_programs as $extension => $compress_command)
- {
- echo "Packaging code changes for $extension\n";
- run_command("rm ./../../new_version/release_files/{$code_changes_filename}.{$extension}");
- flush();
-
- // Build Package
- run_command("$compress_command ./../../new_version/release_files/{$code_changes_filename}.{$extension} *");
-
- // Build MD5 Sum
- run_command("md5sum ./../../new_version/release_files/{$code_changes_filename}.{$extension} > ./../../new_version/release_files/{$code_changes_filename}.{$extension}.md5");
- flush();
- }
-}
-
-/**
-* $output_format can be: language, prosilver and subsilver2
-*/
-function build_code_changes($output_format)
-{
- global $substitute_new, $substitute_old, $simple_name_old, $simple_name_new, $echo_changes, $package_changed_files, $location, $debug_file, $s_name;
-
- // Global array holding the data entries
- $data = array(
- 'header' => array(),
- 'diff' => array(),
- );
-
- // Read diff file and prepare the output filedata...
- //$patch_filename = '../new_version/patches/phpBB-' . $substitute_old . '_to_' . $substitute_new . '.patch';
- $release_filename = 'phpbb-' . $substitute_old . '_to_' . $substitute_new . '_' . $output_format . '.txt';
-
- if (!$package_changed_files)
- {
- if (!$echo_changes)
- {
- $fp = fopen('save/' . $s_name . '/' . $output_format . '/' . $release_filename, 'wb');
-
- if (!$fp)
- {
- die('Unable to create ' . $release_filename);
- }
- }
- }
-
- include_once($location . '/build_helper.php');
- $package = new build_package(array($substitute_old, $substitute_new), false);
-
- $titles = array(
- 'language' => 'phpBB ' . $substitute_old . ' to phpBB ' . $substitute_new . ' Language Pack Changes',
- 'prosilver' => 'phpBB ' . $substitute_old . ' to phpBB ' . $substitute_new . ' prosilver Changes',
- 'subsilver2' => 'phpBB ' . $substitute_old . ' to phpBB ' . $substitute_new . ' subsilver2 Changes',
- );
-
- $data['header'] = array(
- 'title' => $titles[$output_format],
- 'intro' => '
-
-These are the ' . $titles[$output_format] . ' summed up into a little Mod. These changes are only partial and do not include any code changes, therefore not meant for updating phpBB.
-
- ',
- 'included_files' => array(),
- );
-
- // We collect the files we want to diff first (ironically we grab this from a diff file)
- if (!$echo_changes)
- {
- echo "\n\nCollecting Filenames:";
- }
-
- // We re-create the patch file
- foreach ($package->old_packages as $_package_name => $dest_package_filename)
- {
- chdir($package->locations['old_versions']);
-
- if (!$echo_changes)
- {
- echo "\n\n" . 'Creating patch/diff files for phpBB-' . $dest_package_filename . $package->get('new_version_number');
- }
-
- $dest_package_filename = $location . '/save/' . $s_name . '/phpBB-' . $dest_package_filename . $package->get('new_version_number') . '.patch';
- $package->run_command('diff ' . $package->diff_options . ' ' . $_package_name . ' ' . $package->get('simple_name') . ' > ' . $dest_package_filename);
-
- // Parse this diff to determine file changes from the checked versions and save them
- $result = $package->collect_diff_files($dest_package_filename, $_package_name);
- $package->run_command('rm ' . $dest_package_filename);
- }
-
- chdir($location);
-
- $filenames = array();
- foreach ($result['files'] as $filename)
- {
- if ($debug_file !== false && $filename != $debug_file)
- {
- continue;
- }
-
- // Decide which files to compare...
- switch ($output_format)
- {
- case 'language':
- if (strpos($filename, 'language/en/') !== 0)
- {
- continue 2;
- }
- break;
-
- case 'prosilver':
- if (strpos($filename, 'styles/prosilver/') !== 0)
- {
- continue 2;
- }
- break;
-
- case 'subsilver2':
- if (strpos($filename, 'styles/subsilver2/') !== 0)
- {
- continue 2;
- }
- break;
- }
-
- if (!file_exists($location . '/old_versions/' . $simple_name_old . '/' . $filename))
- {
- // New file... include it
- $data['header']['included_files'][] = array(
- 'old' => $location . '/old_versions/' . $simple_name_old . '/' . $filename,
- 'new' => $location . '/old_versions/' . $simple_name_new . '/' . $filename,
- 'phpbb_filename' => $filename,
- );
- continue;
- }
-
- $filenames[] = array(
- 'old' => $location . '/old_versions/' . $simple_name_old . '/' . $filename,
- 'new' => $location . '/old_versions/' . $simple_name_new . '/' . $filename,
- 'phpbb_filename' => $filename,
- );
- }
-
- // Now let us go through the filenames list and create a more comprehensive diff
- if (!$echo_changes)
- {
- fwrite($fp, build_header($output_format, $filenames, $data['header']));
- }
- else
- {
- //echo build_header('text', $filenames, $data['header']);
- }
-
- // Copy files...
- $files_to_copy = array();
-
- foreach ($data['header']['included_files'] as $filename)
- {
- $files_to_copy[] = $filename['phpbb_filename'];
- }
-
- // First step is to copy the new version over (clean structure)
- if (!$echo_changes && sizeof($files_to_copy))
- {
- foreach ($files_to_copy as $file)
- {
- // Create directory?
- $dirname = dirname($file);
-
- if ($dirname)
- {
- $dirname = explode('/', $dirname);
- $__dir = array();
-
- foreach ($dirname as $i => $dir)
- {
- $__dir[] = $dir;
- run_command("mkdir -p $location/save/" . $s_name . '/' . $output_format . '/' . implode('/', $__dir));
- }
- }
-
- $source_file = $location . '/new_version/phpBB3/' . $file;
- $dest_file = $location . '/save/' . $s_name . '/' . $output_format . '/';
- $dest_file .= $file;
-
- $command = "cp -p $source_file $dest_file";
- $result = trim(`$command`);
- echo "- Copied File: " . $source_file . " -> " . $dest_file . "\n";
- }
- }
-
- include_once('diff_class.php');
-
- if (!$echo_changes)
- {
- echo "\n\nDiffing Codebases:";
- }
-
- foreach ($filenames as $file_ary)
- {
- if (!file_exists($file_ary['old']))
- {
- $lines1 = array();
- }
- else
- {
- $lines1 = file($file_ary['old']);
- }
- $lines2 = file($file_ary['new']);
-
- if (!sizeof($lines1))
- {
- // New File
- }
- else
- {
- $diff = new Diff($lines1, $lines2);
- $fmt = new BBCodeDiffFormatter(false, 5, $debug_file);
-
- if (!$echo_changes)
- {
- fwrite($fp, $fmt->format_open($file_ary['phpbb_filename']));
- fwrite($fp, $fmt->format($diff, $lines1));
- fwrite($fp, $fmt->format_close($file_ary['phpbb_filename']));
- }
- else
- {
- echo $fmt->format_open($file_ary['phpbb_filename']);
- echo $fmt->format($diff, $lines1);
- echo $fmt->format_close($file_ary['phpbb_filename']);
- }
-
- if ($debug_file !== false)
- {
- echo $fmt->format_open($file_ary['phpbb_filename']);
- echo $fmt->format($diff, $lines1);
- echo $fmt->format_close($file_ary['phpbb_filename']);
- exit;
- }
- }
- }
-
- if (!$echo_changes)
- {
- fwrite($fp, build_footer($output_format));
-
- // Close file
- fclose($fp);
-
- chmod('save/' . $s_name . '/' . $output_format . '/' . $release_filename, 0666);
- }
- else
- {
- echo build_footer($output_format);
- }
-}
-
-/**
-* Build Footer
-*/
-function build_footer($mode)
-{
- $html = '';
-
- $html .= "# \n";
- $html .= "#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------ \n";
- $html .= "# \n";
- $html .= "# EoM";
-
- return $html;
-}
-
-/**
-* Build Header
-*/
-function build_header($mode, $filenames, $header)
-{
- global $substitute_old;
-
- $html = '';
-
- $html .= "############################################################## \n";
- $html .= "## Title: " . $header['title'] . "\n";
- $html .= "## Author: naderman < naderman@phpbb.com > (Nils Adermann) http://www.phpbb.com \n";
- $html .= "## Description: \n";
-
- $intr = explode("\n", $header['intro']);
- $introduction = '';
- foreach ($intr as $_line)
- {
- $introduction .= wordwrap($_line, 80) . "\n";
- }
- $intr = explode("\n", $introduction);
-
- foreach ($intr as $_line)
- {
- $html .= "## " . $_line . "\n";
- }
- $html .= "## \n";
- $html .= "## Files To Edit: \n";
-
- foreach ($filenames as $file_ary)
- {
- $html .= "## " . $file_ary['phpbb_filename'] . "\n";
- }
- $html .= "##\n";
- if (sizeof($header['included_files']))
- {
- $html .= "## Included Files: \n";
- foreach ($header['included_files'] as $filename)
- {
- $html .= "## {$filename['phpbb_filename']}\n";
- }
- }
- $html .= "## License: http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 \n";
- $html .= "############################################################## \n";
- $html .= "\n";
-
- // COPY Statement?
- if (sizeof($header['included_files']))
- {
- $html .= "#\n#-----[ COPY ]------------------------------------------\n#\n";
- foreach ($header['included_files'] as $filename)
- {
- $html .= "copy {$filename['phpbb_filename']} to {$filename['phpbb_filename']}\n";
- }
- $html .= "\n";
- }
-
- return $html;
-}
-
-function run_command($command)
-{
- $result = trim(`$command`);
- echo "\n- Command Run: " . $command . "\n";
-}
-
-?>
diff --git a/build/diff_class.php b/build/diff_class.php
deleted file mode 100644
index 2d8555400d..0000000000
--- a/build/diff_class.php
+++ /dev/null
@@ -1,1710 +0,0 @@
-<?php
-/**
-*
-* @package build
-* @copyright (c) 2000 Geoffrey T. Dairiki <dairiki@dairiki.org>
-* @copyright (c) 2010 phpBB Group
-* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
-*
-*/
-
-/**
-* Class used internally by WikiDiff to actually compute the diffs.
-*
-* The algorithm used here is mostly lifted from the perl module
-* Algorithm::Diff (version 1.06) by Ned Konz, which is available at:
-* http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip
-*
-* More ideas are taken from:
-* http://www.ics.uci.edu/~eppstein/161/960229.html
-*
-* Some ideas are (and a bit of code) are from from analyze.c, from GNU
-* diffutils-2.7, which can be found at:
-* ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz
-*
-* Finally, some ideas (subdivision by NCHUNKS > 2, and some optimizations)
-* are my own.
-*/
-class _WikiDiffEngine
-{
- var $edits; // List of editing operation to convert XV to YV.
- var $xv = array(), $yv = array();
-
- function _WikiDiffEngine($from_lines, $to_lines)
- {
- $n_from = sizeof($from_lines);
- $n_to = sizeof($to_lines);
-
- $endskip = 0;
- // Ignore trailing and leading matching lines.
- while ($n_from > 0 && $n_to > 0)
- {
- if ($from_lines[$n_from - 1] != $to_lines[$n_to - 1])
- {
- break;
- }
-
- $n_from--;
- $n_to--;
- $endskip++;
- }
-
- for ($skip = 0; $skip < min($n_from, $n_to); $skip++)
- {
- if ($from_lines[$skip] != $to_lines[$skip])
- {
- break;
- }
- }
- $n_from -= $skip;
- $n_to -= $skip;
-
- $xlines = array();
- $ylines = array();
-
- // Ignore lines which do not exist in both files.
- for ($x = 0; $x < $n_from; $x++)
- {
- $xhash[$from_lines[$x + $skip]] = 1;
- }
-
- for ($y = 0; $y < $n_to; $y++)
- {
- $line = $to_lines[$y + $skip];
- $ylines[] = $line;
-
- if (($this->ychanged[$y] = empty($xhash[$line])))
- {
- continue;
- }
- $yhash[$line] = 1;
- $this->yv[] = $line;
- $this->yind[] = $y;
- }
-
- for ($x = 0; $x < $n_from; $x++)
- {
- $line = $from_lines[$x + $skip];
- $xlines[] = $line;
-
- if (($this->xchanged[$x] = empty($yhash[$line])))
- {
- continue; // fixme? what happens to yhash/xhash when
- // there are two identical lines??
- }
- $this->xv[] = $line;
- $this->xind[] = $x;
- }
-
- // Find the LCS.
- $this->_compareseq(0, sizeof($this->xv), 0, sizeof($this->yv));
-
- // Merge edits when possible
- $this->_shift_boundaries($xlines, $this->xchanged, $this->ychanged);
- $this->_shift_boundaries($ylines, $this->ychanged, $this->xchanged);
-
- // Compute the edit operations.
- $this->edits = array();
-
- if ($skip)
- {
- $this->edits[] = $skip;
- }
-
- $x = 0;
- $y = 0;
-
- while ($x < $n_from || $y < $n_to)
- {
- // Skip matching "snake".
- $x0 = $x;
- $ncopy = 0;
- while ($x < $n_from && $y < $n_to && !$this->xchanged[$x] && !$this->ychanged[$y])
- {
- ++$x;
- ++$y;
- ++$ncopy;
- }
-
- if ($x > $x0)
- {
- $this->edits[] = $x - $x0;
- }
-
- // Find deletes.
- $x0 = $x;
- $ndelete = 0;
-
- while ($x < $n_from && $this->xchanged[$x])
- {
- ++$x;
- ++$ndelete;
- }
-
- if ($x > $x0)
- {
- $this->edits[] = -($x - $x0);
- }
-
- // Find adds.
- if (isset($this->ychanged[$y]) && $this->ychanged[$y])
- {
- $adds = array();
- while ($y < $n_to && $this->ychanged[$y])
- {
- $adds[] = $ylines[$y++];
- }
- $this->edits[] = $adds;
- }
- }
-
- if (!empty($endskip))
- {
- $this->edits[] = $endskip;
- }
- }
-
- /* Divide the Largest Common Subsequence (LCS) of the sequences
- * [XOFF, XLIM) and [YOFF, YLIM) into NCHUNKS approximately equally
- * sized segments.
- *
- * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an
- * array of NCHUNKS+1 (X, Y) indexes giving the diving points between
- * sub sequences. The first sub-sequence is contained in [X0, X1),
- * [Y0, Y1), the second in [X1, X2), [Y1, Y2) and so on. Note
- * that (X0, Y0) == (XOFF, YOFF) and
- * (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM).
- *
- * This function assumes that the first lines of the specified portions
- * of the two files do not match, and likewise that the last lines do not
- * match. The caller must trim matching lines from the beginning and end
- * of the portions it is going to specify.
- */
- function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks)
- {
- $flip = false;
-
- if ($xlim - $xoff > $ylim - $yoff)
- {
- // Things seems faster (I'm not sure I understand why)
- // when the shortest sequence in X.
- $flip = true;
- list ($xoff, $xlim, $yoff, $ylim) = array( $yoff, $ylim, $xoff, $xlim);
- }
-
- if ($flip)
- {
- for ($i = $ylim - 1; $i >= $yoff; $i--)
- {
- $ymatches[$this->xv[$i]][] = $i;
- }
- }
- else
- {
- for ($i = $ylim - 1; $i >= $yoff; $i--)
- {
- $ymatches[$this->yv[$i]][] = $i;
- }
- }
-
- $this->lcs = 0;
- $this->seq[0]= $yoff - 1;
- $this->in_seq = array();
- $ymids[0] = array();
-
- $numer = $xlim - $xoff + $nchunks - 1;
- $x = $xoff;
-
- for ($chunk = 0; $chunk < $nchunks; $chunk++)
- {
- if ($chunk > 0)
- {
- for ($i = 0; $i <= $this->lcs; $i++)
- {
- $ymids[$i][$chunk-1] = $this->seq[$i];
- }
- }
-
- $x1 = $xoff + (int)(($numer + ($xlim-$xoff)*$chunk) / $nchunks);
-
- for ( ; $x < $x1; $x++)
- {
- $_index = $flip ? $this->yv[$x] : $this->xv[$x];
- $matches = (isset($ymatches[$_index])) ? $ymatches[$_index] : array();
-
- if (!$matches)
- {
- continue;
- }
- reset($matches);
-
- while (list ($junk, $y) = each($matches))
- {
- if (!isset($this->in_seq[$y]) || !$this->in_seq[$y])
- {
- $k = $this->_lcs_pos($y);
- //if (!$k) die('assertion "!$k" failed');
- $ymids[$k] = $ymids[$k-1];
- break;
- }
- }
-
- while (list ($junk, $y) = each($matches))
- {
- if ($y > $this->seq[$k-1])
- {
- //if ($y >= $this->seq[$k]) die('assertion failed');
- // Optimization: this is a common case:
- // next match is just replacing previous match.
- $this->in_seq[$this->seq[$k]] = false;
- $this->seq[$k] = $y;
- $this->in_seq[$y] = 1;
- }
- else if (!isset($this->in_seq[$y]) || !$this->in_seq[$y])
- {
- $k = $this->_lcs_pos($y);
- //if (!$k) die('assertion "!$k" failed');
- $ymids[$k] = $ymids[$k-1];
- }
- }
- }
- }
-
- $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff);
- $ymid = $ymids[$this->lcs];
-
- for ($n = 0; $n < $nchunks - 1; $n++)
- {
- $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks);
- $y1 = $ymid[$n] + 1;
- $seps[] = $flip ? array($y1, $x1) : array($x1, $y1);
- }
- $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim);
-
- return array($this->lcs, $seps);
- }
-
- function _lcs_pos ($ypos)
- {
- $end = $this->lcs;
- if ($end == 0 || $ypos > $this->seq[$end])
- {
- $this->seq[++$this->lcs] = $ypos;
- $this->in_seq[$ypos] = 1;
- return $this->lcs;
- }
-
- $beg = 1;
- while ($beg < $end)
- {
- $mid = (int)(($beg + $end) / 2);
-
- if ($ypos > $this->seq[$mid])
- {
- $beg = $mid + 1;
- }
- else
- {
- $end = $mid;
- }
- }
-
- //if ($ypos == $this->seq[$end]) die("assertion failure");
-
- $this->in_seq[$this->seq[$end]] = false;
- $this->seq[$end] = $ypos;
- $this->in_seq[$ypos] = 1;
- return $end;
- }
-
- /* Find LCS of two sequences.
- *
- * The results are recorded in the vectors $this->{x,y}changed[], by
- * storing a 1 in the element for each line that is an insertion
- * or deletion (ie. is not in the LCS).
- *
- * The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1.
- *
- * Note that XLIM, YLIM are exclusive bounds.
- * All line numbers are origin-0 and discarded lines are not counted.
- */
- function _compareseq ($xoff, $xlim, $yoff, $ylim)
- {
- // Slide down the bottom initial diagonal.
- while ($xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff])
- {
- ++$xoff;
- ++$yoff;
- }
-
- // Slide up the top initial diagonal.
- while ($xlim > $xoff && $ylim > $yoff && $this->xv[$xlim - 1] == $this->yv[$ylim - 1])
- {
- --$xlim;
- --$ylim;
- }
-
- if ($xoff == $xlim || $yoff == $ylim)
- {
- $lcs = 0;
- }
- else
- {
- // This is ad hoc but seems to work well.
- //$nchunks = sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5);
- //$nchunks = max(2,min(8,(int)$nchunks));
- $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1;
- list ($lcs, $seps) = $this->_diag($xoff, $xlim, $yoff, $ylim, $nchunks);
- }
-
- if ($lcs == 0)
- {
- // X and Y sequences have no common subsequence:
- // mark all changed.
- while ($yoff < $ylim)
- {
- $this->ychanged[$this->yind[$yoff++]] = 1;
- }
-
- while ($xoff < $xlim)
- {
- $this->xchanged[$this->xind[$xoff++]] = 1;
- }
- }
- else
- {
- // Use the partitions to split this problem into subproblems.
- reset($seps);
-
- $pt1 = $seps[0];
-
- while ($pt2 = next($seps))
- {
- $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]);
- $pt1 = $pt2;
- }
- }
- }
-
- /* Adjust inserts/deletes of identical lines to join changes
- * as much as possible.
- *
- * We do something when a run of changed lines include a
- * line at one end and have an excluded, identical line at the other.
- * We are free to choose which identical line is included.
- * `compareseq' usually chooses the one at the beginning,
- * but usually it is cleaner to consider the following identical line
- * to be the "change".
- *
- * This is extracted verbatim from analyze.c (GNU diffutils-2.7).
- */
- function _shift_boundaries ($lines, &$changed, $other_changed)
- {
- $i = 0;
- $j = 0;
- $len = sizeof($lines);
-
- while (1)
- {
- /*
- * Scan forwards to find beginning of another run of changes.
- * Also keep track of the corresponding point in the other file.
- */
-
- while ($i < $len && $changed[$i] == 0)
- {
- while ($other_changed[$j++])
- {
- continue;
- }
- $i++;
- }
-
- if ($i == $len)
- {
- break;
- }
-
- $start = $i;
-
- // Find the end of this run of changes.
- while (isset($changed[++$i]))
- {
- continue;
- }
-
- while (isset($other_changed[$j]) && $other_changed[$j])
- {
- $j++;
- }
-
- do
- {
- /*
- * Record the length of this run of changes, so that
- * we can later determine whether the run has grown.
- */
- $runlength = $i - $start;
-
- /*
- * Move the changed region back, so long as the
- * previous unchanged line matches the last changed one.
- * This merges with previous changed regions.
- */
- while ($start && $lines[$start - 1] == $lines[$i - 1])
- {
- $changed[--$start] = 1;
- $changed[--$i] = false;
-
- while ($changed[$start - 1])
- {
- $start--;
- }
-
- while ($other_changed[--$j])
- {
- continue;
- }
- }
-
- /*
- * Set CORRESPONDING to the end of the changed run, at the last
- * point where it corresponds to a changed run in the other file.
- * CORRESPONDING == LEN means no such point has been found.
- */
- $corresponding = empty($other_changed[$j - 1]) ? $len : $i;
-
- /*
- * Move the changed region forward, so long as the
- * first changed line matches the following unchanged one.
- * This merges with following changed regions.
- * Do this second, so that if there are no merges,
- * the changed region is moved forward as far as possible.
- */
- while ($i != $len && $lines[$start] == $lines[$i])
- {
- $changed[$start++] = false;
- $changed[$i++] = 1;
-
- while ($changed[$i])
- {
- $i++;
- }
-
- while ($other_changed[++$j])
- {
- $corresponding = $i;
- }
- }
- } while ($runlength != $i - $start);
-
- /*
- * If possible, move the fully-merged run of changes
- * back to a corresponding run in the other file.
- */
- while ($corresponding < $i)
- {
- $changed[--$start] = 1;
- $changed[--$i] = 0;
-
- while ($other_changed[--$j])
- {
- continue;
- }
- }
- }
- }
-}
-
-/**
-* Class representing a diff between two files.
-*/
-class Diff
-{
- var $edits;
-
- /**
- * Compute diff between files (or deserialize serialized WikiDiff.)
- */
- function Diff($from_lines = false, $to_lines = false)
- {
- if ($from_lines && $to_lines)
- {
- $compute = new _WikiDiffEngine($from_lines, $to_lines);
- $this->edits = $compute->edits;
- }
- else if ($from_lines)
- {
- // $from_lines is not really from_lines, but rather
- // a serialized Diff.
- $this->edits = unserialize($from_lines);
- }
- else
- {
- $this->edits = array();
- }
- }
-
- /**
- * Compute reversed Diff.
- *
- * SYNOPSIS:
- *
- * $diff = new Diff($lines1, $lines2);
- * $rev = $diff->reverse($lines1);
- *
- * // reconstruct $lines1 from $lines2:
- * $out = $rev->apply($lines2);
- */
- function reverse ($from_lines)
- {
- $x = 0;
- $rev = new Diff;
-
- for (reset($this->edits); $edit = current($this->edits); next($this->edits))
- {
- if (is_array($edit))
- { // Was an add, turn it into a delete.
- $nadd = sizeof($edit);
- if ($nadd == 0)
- {
- die("assertion error");
- }
- $edit = -$nadd;
- }
- else if ($edit > 0)
- {
- // Was a copy --- just pass it through. }
- $x += $edit;
- }
- else if ($edit < 0)
- { // Was a delete, turn it into an add.
- $ndelete = -$edit;
- $edit = array();
-
- while ($ndelete-- > 0)
- {
- $edit[] = $from_lines[$x++];
- }
- }
- else
- {
- die("assertion error");
- }
-
- $rev->edits[] = $edit;
- }
-
- return $rev;
- }
-
- /**
- * Compose (concatenate) Diffs.
- *
- * SYNOPSIS:
- *
- * $diff1 = new Diff($lines1, $lines2);
- * $diff2 = new Diff($lines2, $lines3);
- * $comp = $diff1->compose($diff2);
- *
- * // reconstruct $lines3 from $lines1:
- * $out = $comp->apply($lines1);
- */
- function compose ($that)
- {
- reset($this->edits);
- reset($that->edits);
-
- $comp = new Diff;
- $left = current($this->edits);
- $right = current($that->edits);
-
- while ($left || $right)
- {
- if (!is_array($left) && $left < 0)
- { // Left op is a delete.
- $newop = $left;
- $left = next($this->edits);
- }
- else if (is_array($right))
- { // Right op is an add.
- $newop = $right;
- $right = next($that->edits);
- }
- else if (!$left || !$right)
- {
- die ("assertion error");
- }
- else if (!is_array($left) && $left > 0)
- { // Left op is a copy.
- if ($left <= abs($right))
- {
- $newop = $right > 0 ? $left : -$left;
- $right -= $newop;
-
- if ($right == 0)
- {
- $right = next($that->edits);
- }
- $left = next($this->edits);
- }
- else
- {
- $newop = $right;
- $left -= abs($right);
- $right = next($that->edits);
- }
- }
- else
- { // Left op is an add.
- if (!is_array($left))
- {
- die('assertion error');
- }
- $nleft = sizeof($left);
-
- if ($nleft <= abs($right))
- {
- if ($right > 0)
- { // Right op is copy
- $newop = $left;
- $right -= $nleft;
- }
- else // Right op is delete
- {
- $newop = false;
- $right += $nleft;
- }
-
- if ($right == 0)
- {
- $right = next($that->edits);
- }
- $left = next($this->edits);
- }
- else
- {
- unset($newop);
-
- if ($right > 0)
- {
- for ($i = 0; $i < $right; $i++)
- {
- $newop[] = $left[$i];
- }
- }
-
- $tmp = array();
- for ($i = abs($right); $i < $nleft; $i++)
- {
- $tmp[] = $left[$i];
- }
- $left = $tmp;
- $right = next($that->edits);
- }
- }
-
- if (!$op)
- {
- $op = $newop;
- continue;
- }
-
- if (!$newop)
- {
- continue;
- }
-
- if (is_array($op) && is_array($newop))
- {
- // Both $op and $newop are adds.
- for ($i = 0; $i < sizeof($newop); $i++)
- {
- $op[] = $newop[$i];
- }
- }
- else if (($op > 0 && $newop > 0) || ($op < 0 && $newop < 0))
- { // $op and $newop are both either deletes or copies.
- $op += $newop;
- }
- else
- {
- $comp->edits[] = $op;
- $op = $newop;
- }
- }
-
- if ($op)
- {
- $comp->edits[] = $op;
- }
-
- return $comp;
- }
-
- /* Debugging only:
- function _dump ()
- {
- echo "<ol>";
- for (reset($this->edits);
- {
- $edit = current($this->edits);
- }
- next($this->edits))
- {
- echo "<li>";
- if ($edit > 0)
- echo "Copy $edit";
- else if ($edit < 0)
- echo "Delete " . -$edit;
- else if (is_array($edit))
- {
- echo "Add " . sizeof($edit) . "<ul>";
- for ($i = 0; $i < sizeof($edit); $i++)
- echo "<li>" . htmlspecialchars($edit[$i]);
- echo "</ul>";
- }
- else
- die("assertion error");
- }
- echo "</ol>";
- }
- */
-
- /**
- * Apply a Diff to a set of lines.
- *
- * SYNOPSIS:
- *
- * $diff = new Diff($lines1, $lines2);
- *
- * // reconstruct $lines2 from $lines1:
- * $out = $diff->apply($lines1);
- */
- function apply ($from_lines)
- {
- $x = 0;
- $xlim = sizeof($from_lines);
-
- for (reset($this->edits); $edit = current($this->edits); next($this->edits))
- {
- if (is_array($edit))
- {
- reset($edit);
- while (list ($junk, $line) = each($edit))
- {
- $output[] = $line;
- }
- }
- else if ($edit > 0)
- {
- while ($edit--)
- {
- $output[] = $from_lines[$x++];
- }
- }
- else
- {
- $x += -$edit;
- }
- }
-
- if ($x != $xlim)
- {
- die(sprintf("Diff::apply: line count mismatch: %s != %s", $x, $xlim));
- }
-
- return $output;
- }
-
- /**
- * Serialize a Diff.
- *
- * SYNOPSIS:
- *
- * $diff = new Diff($lines1, $lines2);
- * $string = $diff->serialize;
- *
- * // recover Diff from serialized version:
- * $diff2 = new Diff($string);
- */
- function serialize ()
- {
- return serialize($this->edits);
- }
-
- /**
- * Return true if two files were equal.
- */
- function isEmpty()
- {
- if (sizeof($this->edits) > 1)
- {
- return false;
- }
-
- if (sizeof($this->edits) == 0)
- {
- return true;
- }
-
- // Test for: only edit is a copy.
- return !is_array($this->edits[0]) && $this->edits[0] > 0;
- }
-
- /**
- * Compute the length of the Longest Common Subsequence (LCS).
- *
- * This is mostly for diagnostic purposed.
- */
- function lcs()
- {
- $lcs = 0;
- for (reset($this->edits); $edit = current($this->edits); next($this->edits))
- {
- if (!is_array($edit) && $edit > 0)
- {
- $lcs += $edit;
- }
- }
-
- return $lcs;
- }
-
- /**
- * Check a Diff for validity.
- *
- * This is here only for debugging purposes.
- */
- function _check ($from_lines, $to_lines)
- {
- $test = $this->apply($from_lines);
- if (serialize($test) != serialize($to_lines))
- {
- die("Diff::_check: failed");
- }
-
- reset($this->edits);
- $prev = current($this->edits);
- $prevtype = is_array($prev) ? 'a' : ($prev > 0 ? 'c' : 'd');
-
- while ($edit = next($this->edits))
- {
- $type = is_array($edit) ? 'a' : ($edit > 0 ? 'c' : 'd');
- if ($prevtype == $type)
- {
- die("Diff::_check: edit sequence is non-optimal");
- }
- $prevtype = $type;
- }
- $lcs = $this->lcs();
- echo "<strong>Diff Okay: LCS = $lcs</strong>\n";
- }
-}
-
-/**
-* A class to format a Diff as HTML.
-*
-* Usage:
-*
-* $diff = new Diff($lines1, $lines2); // compute diff.
-*
-* $fmt = new DiffFormatter;
-* echo $fmt->format($diff, $lines1); // Output HTMLified standard diff.
-*
-* or to output reverse diff (diff's that would take $lines2 to $lines1):
-*
-* $fmt = new DiffFormatter(true);
-* echo $fmt->format($diff, $lines1);
-*/
-class DiffFormatter
-{
- var $context_lines;
- var $do_reverse_diff;
- var $context_prefix, $deletes_prefix, $adds_prefix;
-
- function DiffFormatter ($reverse = false)
- {
- $this->do_reverse_diff = $reverse;
- $this->context_lines = 0;
- $this->context_prefix = '&nbsp;&nbsp;';
- $this->deletes_prefix = '&lt;&nbsp;';
- $this->adds_prefix = '&gt;&nbsp;';
- }
-
- function format ($diff, $from_lines)
- {
- $html = '<table width="100%" bgcolor="black" cellspacing=2 cellpadding=2 border=0>' . "\n";
- $html .= $this->_format($diff->edits, $from_lines);
- $html .= "</table>\n";
-
- return $html;
- }
-
- function _format ($edits, $from_lines)
- {
- $html = '';
- $x = 0; $y = 0;
- $xlim = sizeof($from_lines);
-
- reset($edits);
- while ($edit = current($edits))
- {
- if (!is_array($edit) && $edit >= 0)
- { // Edit op is a copy.
- $ncopy = $edit;
- }
- else
- {
- $ncopy = 0;
-
- if (empty($hunk))
- {
- // Start of an output hunk.
- $xoff = max(0, $x - $this->context_lines);
- $yoff = $xoff + $y - $x;
-
- if ($xoff < $x)
- {
- // Get leading context.
- $context = array();
-
- for ($i = $xoff; $i < $x; $i++)
- {
- $context[] = $from_lines[$i];
- }
- $hunk['c'] = $context;
- }
- }
-
- if (is_array($edit))
- {
- // Edit op is an add.
- $y += sizeof($edit);
- $hunk[$this->do_reverse_diff ? 'd' : 'a'] = $edit;
- }
- else
- {
- // Edit op is a delete
- $deletes = array();
-
- while ($edit++ < 0)
- {
- $deletes[] = $from_lines[$x++];
- }
-
- $hunk[$this->do_reverse_diff ? 'a' : 'd'] = $deletes;
- }
- }
-
- $next = next($edits);
-
- if (!empty($hunk))
- {
- // Originally $ncopy > 2 * $this->context_lines, but we need to split as early as we can for creating MOD Text Templates. ;)
- if (!$next || $ncopy > $this->context_lines)
- {
- // End of an output hunk.
- $hunks[] = $hunk;
- unset($hunk);
-
- $xend = min($x + $this->context_lines, $xlim);
-
- if ($x < $xend)
- {
- // Get trailing context.
- $context = array();
- for ($i = $x; $i < $xend; $i++)
- {
- $context[] = $from_lines[$i];
- }
- $hunks[] = array('c' => $context);
- }
-
- $xlen = $xend - $xoff;
- $ylen = $xend + $y - $x - $yoff;
- $xbeg = $xlen ? $xoff + 1 : $xoff;
- $ybeg = $ylen ? $yoff + 1 : $yoff;
-
- if ($this->do_reverse_diff)
- {
- list ($xbeg, $xlen, $ybeg, $ylen) = array($ybeg, $ylen, $xbeg, $xlen);
- }
-
- $html .= $this->_emit_diff($xbeg, $xlen, $ybeg, $ylen, $hunks);
- unset($hunks);
- }
- else if ($ncopy)
- {
- $hunks[] = $hunk;
-
- // Copy context.
- $context = array();
- for ($i = $x; $i < $x + $ncopy; $i++)
- {
- $context[] = $from_lines[$i];
- }
- $hunk = array('c' => $context);
- }
- }
-
- $x += $ncopy;
- $y += $ncopy;
- }
-
- return $html;
- }
-
- function _emit_lines($lines, $prefix, $color)
- {
- $html = '';
- reset($lines);
- while (list ($junk, $line) = each($lines))
- {
- $html .= "<tr bgcolor=\"$color\"><td><tt>$prefix</tt>";
- $html .= "<tt>" . htmlspecialchars($line) . "</tt></td></tr>\n";
- }
- return $html;
- }
-
- function _emit_diff ($xbeg,$xlen,$ybeg,$ylen,$hunks)
- {
- // Save hunk...
- $this->diff_hunks[] = $hunks;
-
- $html = '<tr><td><table width="100%" bgcolor="white" cellspacing="0" border="0" cellpadding="4">
- <tr bgcolor="#cccccc"><td><tt>' .
- $this->_diff_header($xbeg, $xlen, $ybeg, $ylen) . '
- </tt></td></tr>\n<tr><td>
- <table width="100%" cellspacing="0" border="0" cellpadding="2">
- ';
-
- $prefix = array('c' => $this->context_prefix, 'a' => $this->adds_prefix, 'd' => $this->deletes_prefix);
- $color = array('c' => '#ffffff', 'a' => '#ffcccc', 'd' => '#ccffcc');
-
- for (reset($hunks); $hunk = current($hunks); next($hunks))
- {
- if (!empty($hunk['c']))
- {
- $html .= $this->_emit_lines($hunk['c'], $this->context_prefix, '#ffffff');
- }
-
- if (!empty($hunk['d']))
- {
- $html .= $this->_emit_lines($hunk['d'], $this->deletes_prefix, '#ccffcc');
- }
-
- if (!empty($hunk['a']))
- {
- $html .= $this->_emit_lines($hunk['a'], $this->adds_prefix, '#ffcccc');
- }
- }
-
- $html .= "</table></td></tr></table></td></tr>\n";
- return $html;
- }
-
- function _diff_header ($xbeg,$xlen,$ybeg,$ylen)
- {
- $what = $xlen ? ($ylen ? 'c' : 'd') : 'a';
- $xlen = $xlen > 1 ? "," . ($xbeg + $xlen - 1) : '';
- $ylen = $ylen > 1 ? "," . ($ybeg + $ylen - 1) : '';
-
- return "$xbeg$xlen$what$ybeg$ylen";
- }
-}
-
-/**
-* A class to format a Diff as a pretty HTML unified diff.
-*
-* Usage:
-*
-* $diff = new Diff($lines1, $lines2); // compute diff.
-*
-* $fmt = new UnifiedDiffFormatter;
-* echo $fmt->format($diff, $lines1); // Output HTMLified unified diff.
-*/
-class UnifiedDiffFormatter extends DiffFormatter
-{
- function UnifiedDiffFormatter ($reverse = false, $context_lines = 3)
- {
- $this->do_reverse_diff = $reverse;
- $this->context_lines = $context_lines;
- $this->context_prefix = '&nbsp;';
- $this->deletes_prefix = '-';
- $this->adds_prefix = '+';
- }
-
- function _diff_header ($xbeg,$xlen,$ybeg,$ylen)
- {
- $xlen = $xlen == 1 ? '' : ",$xlen";
- $ylen = $ylen == 1 ? '' : ",$ylen";
-
- return "@@ -$xbeg$xlen +$ybeg$ylen @@";
- }
-}
-
-/**
-* A class to format a Diff as MOD Template instuctions.
-*
-* Usage:
-*
-* $diff = new Diff($lines1, $lines2); // compute diff.
-*
-* $fmt = new BBCodeDiffFormatter;
-* echo $fmt->format($diff, $lines1); // Output MOD Actions.
-*/
-class BBCodeDiffFormatter extends DiffFormatter
-{
- function BBCodeDiffFormatter ($reverse = false, $context_lines = 3, $debug = false)
- {
- $this->do_reverse_diff = $reverse;
- $this->context_lines = $context_lines;
- $this->context_prefix = '&nbsp;';
- $this->deletes_prefix = '-';
- $this->adds_prefix = '+';
- $this->debug = $debug;
- }
-
- function format ($diff, $from_lines)
- {
- $html = $this->_format($diff->edits, $from_lines);
-
- return $html;
- }
-
- function skip_lines(&$order_array, &$ordering)
- {
- if (sizeof($order_array['find_c']))
- {
- $text = implode('', $order_array['find_c']);
- if ($text === "\n" || $text === "\t" || $text === '')
- {
- if (isset($order_array['first_find_c'][0]) &&
- is_array($order_array['first_find_c'][0]) &&
- trim(implode('', $order_array['first_find_c'][0])) != '' &&
- isset($order_array['replace']))
- {
- $order_array['add'] = $order_array['replace'];
- unset($order_array['replace']);
- // this is actually an after add
- }
- else
- {
- return true;
- }
- }
- }
-
- if (isset($order_array['add']) && sizeof($order_array['add']))
- {
- $text = implode('', $order_array['add']);
- if ($text === "\n" || $text === "\t" || $text === '')
- {
- return true;
- }
- }
-
- if (isset($order_array['replace']) && sizeof($order_array['replace']))
- {
- $text = implode('', $order_array['replace']);
- if ($text === "\n" || $text === "\t" || $text === '')
- {
- return true;
- }
- }
- }
-
- function _emit_lines_bb($ybeg, &$ordering)
- {
- $html = '';
-
- // Now adjust for bbcode display...
- foreach ($ordering as $order_array)
- {
- // Skip useless empty lines...
- if ($this->skip_lines($order_array, $ordering))
- {
- continue;
- }
-
- // Only include double-finds if the last find has very few code location indications...
- if (isset($order_array['first_find_c']) && sizeof($order_array['first_find_c']))
- {
- $text = implode('', $order_array['find_c']);
- if ($text === "\n" || $text === "\t" || $text === '')
- {
- // no real find, use first_find_c if possible!
- //var_dump($order_array);
- if (is_array($order_array['first_find_c'][0]))
- {
- $order_array['find_c'] = $order_array['first_find_c'][0];
- }
- else
- {
- if (isset($order_array['replace']) || isset($order_array['add']) || isset($order_array['delete']))
- {
- echo "skipped an edit!\n";
- var_dump($order_array);
- }
- continue;
- }
- }
- else
- {
- if (strlen(implode('', $order_array['find_c'])) < 50 && is_array($order_array['first_find_c'][0]))
- {
- $html .= "#\n#-----[ FIND ]---------------------------------------------\n# Around Line {$ybeg}\n";
- $html .= implode("", $order_array['first_find_c'][0]);
- $html .= "\n";
- $ybeg += sizeof($order_array['first_find_c'][0]);
- }
- }
- }
-
- // still here but nothing to do? what the heck?
- if (!isset($order_array['replace']) && !isset($order_array['add']) && !isset($order_array['delete']))
- {
- echo "skipped an edit!\n";
- var_dump($order_array);
- continue;
- }
-
- if (sizeof($order_array['find_c']))
- {
- $html .= "#\n#-----[ FIND ]---------------------------------------------\n# Around Line {$ybeg}\n";
- $html .= implode("", $order_array['find_c']);
- $html .= "\n";
- }
-
- if (isset($order_array['replace']))
- {
- $html .= "#\n#-----[ REPLACE WITH ]---------------------------------------------\n#\n";
- $html .= implode("", $order_array['replace']);
- $html .= "\n";
- }
-
- if (isset($order_array['add']))
- {
- $html .= "#\n#-----[ AFTER, ADD ]---------------------------------------------\n#\n";
- $html .= implode("", $order_array['add']);
- $html .= "\n";
- }
-
- // There is no DELETE. :o
- // Let's try to adjust it then...
- if (isset($order_array['delete']))
- {
- $text = implode('', $order_array['delete']);
- if ($text === "\n" || $text === "\t" || $text === '')
- {
- continue;
- }
-
- $ybeg += sizeof($order_array['find_c']);
-
- $html .= "#\n#-----[ FIND ]---------------------------------------------\n# Around Line {$ybeg}\n";
- $html .= implode("", $order_array['delete']);
- $html .= "\n";
-
- $html .= "#\n#-----[ REPLACE WITH ]---------------------------------------------\n# Just remove/delete the lines (replacing with an empty line)\n";
- $html .= "\n";
- $html .= "\n";
- }
- }
-
- return $html;
- }
-
- function format_open($filename)
- {
- $html = '';
- $html .= "#\n#-----[ OPEN ]--------------------------------------------- \n#\n{$filename}\n\n";
-
- return $html;
- }
-
- function format_close($filename)
- {
- return '';
- }
-
- function _emit_diff ($xbeg, $xlen, $ybeg, $ylen, $hunks)
- {
-
- // Go through the hunks to determine which method we are using (AFTER, ADD; REPLACE WITH or DELETE)
-
- // Remove the header...
- if (sizeof($hunks) <= 2 && !isset($hunks[1]['a']) && !isset($hunks[1]['d']))
- {
- $reorder = false;
- $orig_hunks = $hunks;
-
- foreach ($hunks as $key => $hunk)
- {
- if (isset($hunk['a']) && isset($hunk['d']))
- {
- /**/ if (sizeof($hunk['a']) == 1 && sizeof($hunk['d']) == 1)
- {
- if (preg_match('/\* @version \$Id:.+\$$/', $hunk['a'][0]) && preg_match('/\* @version \$Id:.+\$$/', $hunk['d'][0]))
- {
- // Only remove this sole hunk...
- unset($hunks[$key]);
- $reorder = true;
- continue;
- }
- }/**/
-
- // Compare the add and replace one...
- $string_1 = rtrim(trim(implode('', $hunk['a'])));
- $string_2 = rtrim(trim(implode('', $hunk['d'])));
-
- if (strcmp($string_1, $string_2) === 0)
- {
- // Only remove this sole hunk...
- unset($hunks[$key]);
- $reorder = true;
- continue;
- }
- }
- }
-
- if ($reorder)
- {
- // Now check if we have no more 'a' and 'd's
- $hunks = array_merge($hunks, array());
- }
- }
- else
- {
- $reorder = false;
- $orig_hunks = $hunks;
-
- foreach ($hunks as $key => $hunk)
- {
- if (isset($hunk['a']) && isset($hunk['d']))
- {
- /**/ if (sizeof($hunk['a']) == 1 && sizeof($hunk['d']) == 1)
- {
- if (preg_match('/\* @version \$Id:.+\$$/', $hunk['a'][0]) && preg_match('/\* @version \$Id:.+\$$/', $hunk['d'][0]))
- {
- // Only remove this sole hunk...
- unset($hunks[$key]);
- $reorder = true;
- continue;
- }
- }/**/
-
- // Compare the add and replace one...
- $string_1 = rtrim(trim(implode('', $hunk['a'])));
- $string_2 = rtrim(trim(implode('', $hunk['d'])));
-
- if (strcmp($string_1, $string_2) === 0)
- {
- // Only remove this sole hunk...
- unset($hunks[$key]);
- $reorder = true;
- continue;
- }
- }
- }
-
- if ($reorder)
- {
- $hunks = array_merge($hunks, array());
-
- if (sizeof($hunks) == 1 && sizeof($hunks[0]) == 1 && isset($hunks[0]['c']))
- {
- return;
- }
- else
- {
- $hunks = $orig_hunks;
- }
- }
- }
-
- if (sizeof($hunks) == 1 && sizeof($hunks[0]) == 1 && isset($hunks[0]['c']))
- {
- return;
- }
-
- $replace = false;
- foreach ($hunks as $key => $hunk)
- {
- if (isset($hunk['d']) && isset($hunk['a']))
- {
- $replace = true;
- break;
- }
- }
-
- $ordering = array();
- $cur_pos = 0;
-
- // Replace-block
- if ($replace)
- {
- foreach ($hunks as $hunk)
- {
- if (!isset($hunk['a']) && !isset($hunk['d']))
- {
- continue;
- }
-
- if (!empty($hunk['c']))
- {
- if (!isset($ordering[$cur_pos]['find_c']))
- {
- $ordering[$cur_pos]['find_c'] = $hunk['c'];
- }
- else
- {
- $ordering[$cur_pos]['end_c'] = $hunk['c'];
- }
- }
-
- // Make sure we begin fresh...
- if (!isset($ordering[$cur_pos]['replace']))
- {
- $ordering[$cur_pos]['first_find_c'][] = $ordering[$cur_pos]['find_c'];
- $ordering[$cur_pos]['find_c'] = array();
- $ordering[$cur_pos]['replace'] = array();
- }
-
- // Add the middle part if one exist...
- if (isset($ordering[$cur_pos]['end_c']))
- {
- $ordering[$cur_pos]['find_c'] = array_merge($ordering[$cur_pos]['find_c'], $ordering[$cur_pos]['end_c']);
- $ordering[$cur_pos]['replace'] = array_merge($ordering[$cur_pos]['replace'], $ordering[$cur_pos]['end_c']);
- unset($ordering[$cur_pos]['end_c']);
- }
-
- if (isset($hunk['d']))
- {
- $ordering[$cur_pos]['find_c'] = array_merge($ordering[$cur_pos]['find_c'], $hunk['d']);
- }
-
- if (isset($hunk['a']))
- {
- $ordering[$cur_pos]['replace'] = array_merge($ordering[$cur_pos]['replace'], $hunk['a']);
- }
- }
- }
- else
- {
- foreach ($hunks as $hunk)
- {
- if (!empty($hunk['c']))
- {
- if (!isset($ordering[$cur_pos]['find_c']))
- {
- $ordering[$cur_pos]['find_c'] = $hunk['c'];
- }
- else
- {
- $ordering[$cur_pos]['end_c'] = $hunk['c'];
- }
- }
-
- if (!empty($hunk['a']))
- {
- if (isset($ordering[$cur_pos]['delete']))
- {
- // If ordering is set with an delete entry, we will actually begin a new ordering array (to seperate delete from add)
- $cur_pos++;
- $ordering[$cur_pos]['find_c'] = $ordering[($cur_pos - 1)]['end_c'];
- $ordering[$cur_pos]['add'] = $hunk['a'];
- }
- else
- {
- if (isset($ordering[$cur_pos]['add']))
- {
- // Now, we really need to be quite careful here...
- if (isset($ordering[$cur_pos]['end_c']) && isset($hunk['c']) && isset($hunk['a']) && sizeof($hunk) == 2)
- {
- // There is a new find/add entry we did not catch... let's try to add a new entry then... but first check the hunk[a] contents...
- $text = trim(implode("\n", $hunk['c']));
- if ($text == "\n" || !$text)
- {
- $ordering[$cur_pos]['add'] = array_merge($ordering[$cur_pos]['add'], array("\n"), $hunk['a']);
- }
- else if (sizeof($hunk['c']) > 2 || strlen(implode('', $hunk['c'])) > 20)
- {
- $cur_pos++;
- $ordering[$cur_pos]['find_c'] = $ordering[($cur_pos - 1)]['end_c'];
- $ordering[$cur_pos]['add'] = $hunk['a'];
- }
- else
- {
- $cur_pos++;
- $ordering[$cur_pos]['find_c'] = $ordering[($cur_pos - 1)]['end_c'];
- $ordering[$cur_pos]['add'] = $hunk['a'];
-/* echo 'FIND STATEMENT TOO TINY';
- echo ";".rawurlencode($text).";";
- var_dump($hunk);
- exit;*/
- }
- }
- else
- {
- echo 'UNCATCHED ENTRY';
- var_dump($hunks);
- exit;
- }
- }
- else
- {
- $ordering[$cur_pos]['add'] = $hunk['a'];
- }
- }
- }
- else if (!empty($hunk['d']))
- {
- if (isset($ordering[$cur_pos]['add']))
- {
- // If ordering is set with an add entry, we will actually begin a new ordering array (to seperate delete from add)
- $cur_pos++;
- $ordering[$cur_pos]['find_c'] = $ordering[($cur_pos - 1)]['end_c'];
- $ordering[$cur_pos]['delete'] = $hunk['d'];
- }
- else
- {
- $ordering[$cur_pos]['delete'] = $hunk['d'];
- }
- }
- }
- }
-
- $html = '';
-
- return $this->_emit_lines_bb($ybeg, $ordering);
- }
-
- function _diff_header($xbeg, $xlen, $ybeg, $ylen)
- {
- }
-}
-
-
-/**
-* A class to format a Diff as MOD Template instuctions.
-*
-* Usage:
-*
-* $diff = new Diff($lines1, $lines2); // compute diff.
-*
-* $fmt = new BBCodeDiffFormatter;
-* echo $fmt->format($diff, $lines1); // Output MOD Actions.
-*/
-class MODXDiffFormatter extends BBCodeDiffFormatter
-{
- function MODXDiffFormatter ($reverse = false, $context_lines = 3, $debug = false)
- {
- $this->do_reverse_diff = $reverse;
- $this->context_lines = $context_lines;
- $this->context_prefix = '&nbsp;';
- $this->deletes_prefix = '-';
- $this->adds_prefix = '+';
- $this->debug = $debug;
- }
-
- function _emit_lines_bb($ybeg, &$ordering)
- {
- $html = '';
-
- // Now adjust for bbcode display...
- foreach ($ordering as $order_array)
- {
- // Skip useless empty lines...
- if ($this->skip_lines($order_array, $ordering))
- {
- continue;
- }
-
- // Only include double-finds if the last find has very few code location indications...
- if (sizeof($order_array['first_find_c']))
- {
- $text = implode('', $order_array['find_c']);
- if ($text === "\n" || $text === "\t" || $text === '')
- {
- continue;
- }
-
- if (strlen(implode('', $order_array['find_c'])) < 50)
- {
- if (substr($html, -8) !== '</find>' . "\n")
- {
- $html .= ' <edit>' . "\n";
- }
-
- $html .= ' <comment lang="en">Around Line ' . $ybeg . '</comment>' . "\n";
- $html .= ' <find>' . htmlspecialchars(implode('', $order_array['first_find_c'][0])) . '</find>' . "\n";
- $ybeg += sizeof($order_array['first_find_c'][0]);
- }
- }
-
- if (sizeof($order_array['find_c']))
- {
- if (substr($html, -8) !== '</find>' . "\n")
- {
- $html .= ' <edit>' . "\n";
- }
-
-// $html .= ' <edit>' . "\n";
- $html .= ' <comment lang="en">Around Line ' . $ybeg . '</comment>' . "\n";
- $html .= ' <find>' . htmlspecialchars(implode('', $order_array['find_c'])) . '</find>' . "\n";
- }
-
- if (isset($order_array['replace']))
- {
- $html .= ' <action type="replace-with">' . htmlspecialchars(implode('', $order_array['replace'])) . '</action>' . "\n";
- $html .= ' </edit>' . "\n";
- }
-
- if (isset($order_array['add']))
- {
- $html .= ' <action type="after-add">' . htmlspecialchars(implode('', $order_array['add'])) . '</action>' . "\n";
- $html .= ' </edit>' . "\n";
- }
-
- // There is no DELETE. :o
- // Let's try to adjust it then...
- if (isset($order_array['delete']))
- {
- $text = implode('', $order_array['delete']);
- if ($text === "\n" || $text === "\t" || $text === '')
- {
- continue;
- }
-
- $ybeg += sizeof($order_array['find_c']);
-
- if (substr($html, -8) !== '</find>' . "\n")
- {
- $html .= ' <edit>' . "\n";
- }
- $html .= ' <comment lang="en">Around Line ' . $ybeg . ' / Just remove/delete the lines (replacing with an empty line)</comment>' . "\n";
- $html .= ' <find>' . htmlspecialchars(implode('', $order_array['delete'])) . '</find>' . "\n";
- $html .= ' <action type="replace-with"></action>' . "\n";
- $html .= ' </edit>';
- }
- }
-
- return $html;
- }
-
- function format_open($filename)
- {
- return '<open src="' . $filename . '">' . "\n";
- }
-
- function format_close($filename)
- {
- return '</open>' . "\n";
- }
-
- function _diff_header($xbeg, $xlen, $ybeg, $ylen)
- {
- }
-}
diff --git a/build/package.php b/build/package.php
index 48f42b3572..22ea4e52af 100755
--- a/build/package.php
+++ b/build/package.php
@@ -285,9 +285,6 @@ if (sizeof($package->old_packages))
// Build Package
$package->run_command($compress_command . ' ../release_files/' . $package->get('release_filename') . '-patch.' . $extension . ' *');
-
- // Build MD5 Sum
- $package->run_command('md5sum ../release_files/' . $package->get('release_filename') . '-patch.' . $extension . ' > ../release_files/' . $package->get('release_filename') . '-patch.' . $extension . '.md5');
}
// Build Files Package
@@ -319,8 +316,6 @@ if (sizeof($package->old_packages))
chdir('./release');
$package->run_command("$compress_command ../../release_files/" . $package->get('release_filename') . '-files.' . $extension . ' *');
- // Build MD5 Sum
- $package->run_command('md5sum ../../release_files/' . $package->get('release_filename') . '-files.' . $extension . ' > ../../release_files/' . $package->get('release_filename') . '-files.' . $extension . '.md5');
chdir('..');
$package->run_command('rm -Rv ' . $package->get('files_directory') . '/release');
@@ -363,9 +358,6 @@ if (sizeof($package->old_packages))
// Copy last package over...
$package->run_command('rm -v ../release_files/phpBB-' . $last_version . ".$extension");
$package->run_command("$compress_command ../../release_files/phpBB-$last_version.$extension *");
-
- // Build MD5 Sum
- $package->run_command("md5sum ../../release_files/phpBB-$last_version.$extension > ../../release_files/phpBB-$last_version.$extension.md5");
chdir('..');
}
@@ -388,9 +380,6 @@ foreach ($compress_programs as $extension => $compress_command)
// Build Package
$package->run_command("$compress_command ./release_files/" . $package->get('release_filename') . '.' . $extension . ' ' . $package->get('package_name'));
-
- // Build MD5 Sum
- $package->run_command('md5sum ./release_files/' . $package->get('release_filename') . '.' . $extension . ' > ./release_files/' . $package->get('release_filename') . '.' . $extension . '.md5');
}
// Microsoft Web PI packaging
@@ -398,7 +387,6 @@ $package->begin_status('Packaging phpBB for Microsoft WebPI');
$file = './release_files/' . $package->get('release_filename') . '.webpi.zip';
$package->run_command('cp -p ./release_files/' . $package->get('release_filename') . ".zip $file");
$package->run_command('cd ./../webpi && ' . $compress_programs['zip'] . " ./../new_version/$file *");
-$package->run_command("md5sum $file > $file.md5");
// verify results
chdir($package->locations['root']);
diff --git a/composer.phar b/composer.phar
index a035fdc911..1e9ca731cd 100755
--- a/composer.phar
+++ b/composer.phar
Binary files differ
diff --git a/git-tools/commit-msg-hook-range.sh b/git-tools/commit-msg-hook-range.sh
new file mode 100755
index 0000000000..2b408c3e79
--- /dev/null
+++ b/git-tools/commit-msg-hook-range.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+#
+# @copyright (c) 2014 phpBB Group
+# @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+#
+# Calls the git commit-msg hook on all non-merge commits in a given commit range.
+#
+
+if [ "$#" -ne 1 ];
+then
+ echo "Expected one argument (commit range, e.g. phpbb/develop..ticket/12345)."
+ exit
+fi
+
+DIR=$(dirname "$0")
+COMMIT_RANGE="$1"
+COMMIT_MSG_HOOK_PATH="$DIR/hooks/commit-msg"
+COMMIT_MSG_HOOK_FATAL=$(git config --bool phpbb.hooks.commit-msg.fatal 2> /dev/null)
+git config phpbb.hooks.commit-msg.fatal true
+
+EXIT_STATUS=0
+for COMMIT_HASH in $(git rev-list --no-merges "$COMMIT_RANGE")
+do
+ echo "Inspecting commit message of commit $COMMIT_HASH"
+
+ # The git commit-msg hook takes a path to a file containing a commit
+ # message. So we have to extract the commit message into a file first,
+ # which then also needs to be deleted after our work is done.
+ COMMIT_MESSAGE_PATH="$DIR/commit_msg.$COMMIT_HASH"
+ git log -n 1 --pretty=format:%B "$COMMIT_HASH" > "$COMMIT_MESSAGE_PATH"
+
+ # Invoke hook on commit message file.
+ "$COMMIT_MSG_HOOK_PATH" "$COMMIT_MESSAGE_PATH"
+
+ # If any commit message hook complains with a non-zero exit status, we
+ # will send a non-zero exit status upstream.
+ if [ $? -ne 0 ]
+ then
+ EXIT_STATUS=1
+ fi
+
+ rm "$COMMIT_MESSAGE_PATH"
+done
+
+# Restore phpbb.hooks.commit-msg.fatal config
+if [ -n "$COMMIT_MSG_HOOK_FATAL" ]
+then
+ git config phpbb.hooks.commit-msg.fatal "$COMMIT_MSG_HOOK_FATAL"
+fi
+
+exit $EXIT_STATUS
diff --git a/phpBB/adm/style/acp_inactive.html b/phpBB/adm/style/acp_inactive.html
index 3b20043dd9..b8e46a6e53 100644
--- a/phpBB/adm/style/acp_inactive.html
+++ b/phpBB/adm/style/acp_inactive.html
@@ -53,7 +53,7 @@
</table>
<fieldset class="display-options">
- {L_DISPLAY_LOG}: &nbsp;{S_LIMIT_DAYS}&nbsp;{L_SORT_BY}: {S_SORT_KEY} {S_SORT_DIR}<!-- IF PAGINATION -->&nbsp;Users per page: <input class="inputbox autowidth" type="text" name="users_per_page" id="users_per_page" size="3" value="{USERS_PER_PAGE}" /><!-- ENDIF -->
+ {L_DISPLAY_LOG}: &nbsp;{S_LIMIT_DAYS}&nbsp;{L_SORT_BY}: {S_SORT_KEY} {S_SORT_DIR}<!-- IF PAGINATION -->&nbsp;{L_USERS_PER_PAGE}: <input class="inputbox autowidth" type="text" name="users_per_page" id="users_per_page" size="3" value="{USERS_PER_PAGE}" /><!-- ENDIF -->
<input class="button2" type="submit" value="{L_GO}" name="sort" />
</fieldset>
diff --git a/phpBB/adm/style/acp_users_overview.html b/phpBB/adm/style/acp_users_overview.html
index ba350a13fb..964d6e5c17 100644
--- a/phpBB/adm/style/acp_users_overview.html
+++ b/phpBB/adm/style/acp_users_overview.html
@@ -30,7 +30,7 @@
</dl>
<dl>
<dt><label>{L_POSTS}:</label></dt>
- <dd><strong>{USER_POSTS}</strong><!-- IF POSTS_IN_QUEUE and U_MCP_QUEUE --> (<a href="{U_MCP_QUEUE}">{L_POSTS_IN_QUEUE}</a>)<!-- ELSEIF POSTS_IN_QUEUE --> ({L_POSTS_IN_QUEUE})<!-- ENDIF --></dd>
+ <dd><strong><!-- IF USER_HAS_POSTS and U_SEARCH_USER --><a href="{U_SEARCH_USER}">{USER_POSTS}</a><!-- ELSE -->{USER_POSTS}<!-- ENDIF --></strong><!-- IF POSTS_IN_QUEUE and U_MCP_QUEUE --> (<a href="{U_MCP_QUEUE}">{L_POSTS_IN_QUEUE}</a>)<!-- ELSEIF POSTS_IN_QUEUE --> ({L_POSTS_IN_QUEUE})<!-- ENDIF --></dd>
</dl>
<dl>
<dt><label>{L_WARNINGS}:</label></dt>
diff --git a/phpBB/adm/style/editor.js b/phpBB/adm/style/editor.js
index 217aa699e2..cad01aa9f2 100644
--- a/phpBB/adm/style/editor.js
+++ b/phpBB/adm/style/editor.js
@@ -292,7 +292,7 @@ function mozWrap(txtarea, open, close)
*/
function storeCaret(textEl)
{
- if (textEl.createTextRange)
+ if (textEl.createTextRange && document.selection)
{
textEl.caretPos = document.selection.createRange().duplicate();
}
diff --git a/phpBB/composer.json b/phpBB/composer.json
index 4b3fe8ebb3..434bf330ec 100644
--- a/phpBB/composer.json
+++ b/phpBB/composer.json
@@ -1,8 +1,8 @@
{
"require-dev": {
"fabpot/goutte": "1.0.*",
- "phpunit/dbunit": "1.2.*",
- "phpunit/phpunit": "3.7.*",
+ "phpunit/dbunit": "1.3.*",
+ "phpunit/phpunit": "4.1.*",
"phing/phing": "2.4.*"
}
}
diff --git a/phpBB/composer.lock b/phpBB/composer.lock
index 61ba0fdebc..6f57e67015 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": "ec5fbbc971057677b452c4600e7501c6",
+ "hash": "9a505c5911182b264ea0eccffa5d5ad6",
"packages": [
],
@@ -54,7 +54,9 @@
"authors": [
{
"name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
}
],
"description": "A simple PHP Web Scraper",
@@ -316,31 +318,32 @@
},
{
"name": "phpunit/dbunit",
- "version": "1.2.3",
+ "version": "1.3.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/dbunit.git",
- "reference": "8386782a2d55153e44a06eb1a9d13d6ed35d9c2d"
+ "reference": "a5891b7a9c4f21587a51f9bc4e8f7042b741b480"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/dbunit/zipball/8386782a2d55153e44a06eb1a9d13d6ed35d9c2d",
- "reference": "8386782a2d55153e44a06eb1a9d13d6ed35d9c2d",
+ "url": "https://api.github.com/repos/sebastianbergmann/dbunit/zipball/a5891b7a9c4f21587a51f9bc4e8f7042b741b480",
+ "reference": "a5891b7a9c4f21587a51f9bc4e8f7042b741b480",
"shasum": ""
},
"require": {
"ext-pdo": "*",
"ext-simplexml": "*",
"php": ">=5.3.3",
- "phpunit/phpunit": ">=3.7.0@stable"
+ "phpunit/phpunit": ">=3.7.0@stable",
+ "symfony/yaml": ">=2.1.0"
},
"bin": [
- "dbunit.php"
+ "composer/bin/dbunit"
],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2.x-dev"
+ "dev-master": "1.3.x-dev"
}
},
"autoload": {
@@ -370,44 +373,48 @@
"testing",
"xunit"
],
- "time": "2013-03-01 11:50:46"
+ "time": "2014-03-26 11:25:06"
},
{
"name": "phpunit/php-code-coverage",
- "version": "1.2.12",
+ "version": "2.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "0e9958c459d675fb497d8dc5001c91d335734e48"
+ "reference": "bccecf50645068b44f49a84009e2a0499a500b99"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0e9958c459d675fb497d8dc5001c91d335734e48",
- "reference": "0e9958c459d675fb497d8dc5001c91d335734e48",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/bccecf50645068b44f49a84009e2a0499a500b99",
+ "reference": "bccecf50645068b44f49a84009e2a0499a500b99",
"shasum": ""
},
"require": {
"php": ">=5.3.3",
- "phpunit/php-file-iterator": ">=1.3.0@stable",
- "phpunit/php-text-template": ">=1.1.1@stable",
- "phpunit/php-token-stream": ">=1.1.3@stable"
+ "phpunit/php-file-iterator": "~1.3.1",
+ "phpunit/php-text-template": "~1.2.0",
+ "phpunit/php-token-stream": "~1.2.2",
+ "sebastian/environment": "~1.0.0",
+ "sebastian/version": "~1.0.3"
},
"require-dev": {
- "phpunit/phpunit": "3.7.*@dev"
+ "ext-xdebug": ">=2.1.4",
+ "phpunit/phpunit": "~4.0.14"
},
"suggest": {
"ext-dom": "*",
- "ext-xdebug": ">=2.0.5"
+ "ext-xdebug": ">=2.2.1",
+ "ext-xmlwriter": "*"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2.x-dev"
+ "dev-master": "2.0.x-dev"
}
},
"autoload": {
"classmap": [
- "PHP/"
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -431,20 +438,20 @@
"testing",
"xunit"
],
- "time": "2013-07-06 06:26:16"
+ "time": "2014-04-30 09:01:21"
},
{
"name": "phpunit/php-file-iterator",
- "version": "1.3.3",
+ "version": "1.3.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "16a78140ed2fc01b945cfa539665fadc6a038029"
+ "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/16a78140ed2fc01b945cfa539665fadc6a038029",
- "reference": "16a78140ed2fc01b945cfa539665fadc6a038029",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb",
+ "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb",
"shasum": ""
},
"require": {
@@ -471,25 +478,25 @@
}
],
"description": "FilterIterator implementation that filters files based on a list of suffixes.",
- "homepage": "http://www.phpunit.de/",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
"keywords": [
"filesystem",
"iterator"
],
- "time": "2012-10-11 11:44:38"
+ "time": "2013-10-10 15:34:57"
},
{
"name": "phpunit/php-text-template",
- "version": "1.1.4",
+ "version": "1.2.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git",
- "reference": "5180896f51c5b3648ac946b05f9ec02be78a0b23"
+ "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5180896f51c5b3648ac946b05f9ec02be78a0b23",
- "reference": "5180896f51c5b3648ac946b05f9ec02be78a0b23",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
+ "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
"shasum": ""
},
"require": {
@@ -520,7 +527,7 @@
"keywords": [
"template"
],
- "time": "2012-10-31 18:15:28"
+ "time": "2014-01-30 17:20:04"
},
{
"name": "phpunit/php-timer",
@@ -568,16 +575,16 @@
},
{
"name": "phpunit/php-token-stream",
- "version": "1.2.0",
+ "version": "1.2.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
- "reference": "31babf400e5b5868573bf49a000a3519d3978233"
+ "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/31babf400e5b5868573bf49a000a3519d3978233",
- "reference": "31babf400e5b5868573bf49a000a3519d3978233",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/ad4e1e23ae01b483c16f600ff1bebec184588e32",
+ "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32",
"shasum": ""
},
"require": {
@@ -614,56 +621,56 @@
"keywords": [
"tokenizer"
],
- "time": "2013-08-04 05:57:48"
+ "time": "2014-03-03 05:10:30"
},
{
"name": "phpunit/phpunit",
- "version": "3.7.24",
+ "version": "4.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "af7b77ccb5c64458bdfca95665d29558d1df7d08"
+ "reference": "efb1b1334605594417a3bd466477772d06d460a8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/af7b77ccb5c64458bdfca95665d29558d1df7d08",
- "reference": "af7b77ccb5c64458bdfca95665d29558d1df7d08",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/efb1b1334605594417a3bd466477772d06d460a8",
+ "reference": "efb1b1334605594417a3bd466477772d06d460a8",
"shasum": ""
},
"require": {
"ext-dom": "*",
+ "ext-json": "*",
"ext-pcre": "*",
"ext-reflection": "*",
"ext-spl": "*",
"php": ">=5.3.3",
- "phpunit/php-code-coverage": "~1.2.1",
- "phpunit/php-file-iterator": ">=1.3.1",
- "phpunit/php-text-template": ">=1.1.1",
- "phpunit/php-timer": ">=1.0.4",
- "phpunit/phpunit-mock-objects": "~1.2.0",
+ "phpunit/php-code-coverage": "~2.0",
+ "phpunit/php-file-iterator": "~1.3.1",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "~1.0.2",
+ "phpunit/phpunit-mock-objects": "~2.1",
+ "sebastian/comparator": "~1.0",
+ "sebastian/diff": "~1.1",
+ "sebastian/environment": "~1.0",
+ "sebastian/exporter": "~1.0",
+ "sebastian/version": "~1.0",
"symfony/yaml": "~2.0"
},
- "require-dev": {
- "pear-pear/pear": "1.9.4"
- },
"suggest": {
- "ext-json": "*",
- "ext-simplexml": "*",
- "ext-tokenizer": "*",
- "phpunit/php-invoker": ">=1.1.0,<1.2.0"
+ "phpunit/php-invoker": "~1.1"
},
"bin": [
- "composer/bin/phpunit"
+ "phpunit"
],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.7.x-dev"
+ "dev-master": "4.1.x-dev"
}
},
"autoload": {
"classmap": [
- "PHPUnit/"
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -688,33 +695,41 @@
"testing",
"xunit"
],
- "time": "2013-08-09 06:58:24"
+ "time": "2014-05-02 07:13:40"
},
{
"name": "phpunit/phpunit-mock-objects",
- "version": "1.2.3",
+ "version": "2.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
- "reference": "5794e3c5c5ba0fb037b11d8151add2a07fa82875"
+ "reference": "da0eb04d8ee95ec2898187e407e519c118d3d27c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/5794e3c5c5ba0fb037b11d8151add2a07fa82875",
- "reference": "5794e3c5c5ba0fb037b11d8151add2a07fa82875",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/da0eb04d8ee95ec2898187e407e519c118d3d27c",
+ "reference": "da0eb04d8ee95ec2898187e407e519c118d3d27c",
"shasum": ""
},
"require": {
"php": ">=5.3.3",
- "phpunit/php-text-template": ">=1.1.1@stable"
+ "phpunit/php-text-template": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.1"
},
"suggest": {
"ext-soap": "*"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
"autoload": {
"classmap": [
- "PHPUnit/"
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -737,7 +752,274 @@
"mock",
"xunit"
],
- "time": "2013-01-13 10:24:48"
+ "time": "2014-05-02 07:04:11"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2",
+ "reference": "f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.1",
+ "sebastian/exporter": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2014-05-02 07:05:58"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d",
+ "reference": "1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "http://www.github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "time": "2013-08-03 16:46:33"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "79517609ec01139cd7e9fded0dd7ce08c952ef6a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/79517609ec01139cd7e9fded0dd7ce08c952ef6a",
+ "reference": "79517609ec01139cd7e9fded0dd7ce08c952ef6a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.0.*@dev"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2014-02-18 16:17:19"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529",
+ "reference": "1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.0.*@dev"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2014-02-16 08:26:31"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43",
+ "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2014-03-07 15:35:33"
},
{
"name": "symfony/browser-kit",
@@ -783,7 +1065,9 @@
"authors": [
{
"name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
},
{
"name": "Symfony Community",
@@ -830,7 +1114,9 @@
"authors": [
{
"name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
},
{
"name": "Symfony Community",
@@ -887,7 +1173,9 @@
"authors": [
{
"name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
},
{
"name": "Symfony Community",
@@ -941,7 +1229,9 @@
"authors": [
{
"name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
},
{
"name": "Symfony Community",
@@ -988,7 +1278,9 @@
"authors": [
{
"name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
},
{
"name": "Symfony Community",
@@ -1035,7 +1327,9 @@
"authors": [
{
"name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
},
{
"name": "Symfony Community",
@@ -1048,17 +1342,17 @@
},
{
"name": "symfony/yaml",
- "version": "v2.3.4",
+ "version": "v2.4.4",
"target-dir": "Symfony/Component/Yaml",
"source": {
"type": "git",
"url": "https://github.com/symfony/Yaml.git",
- "reference": "5a279f1b5f5e1045a6c432354d9ea727ff3a9847"
+ "reference": "65539ecde838f9c0d18b006b2101e3deb4b5c9ff"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Yaml/zipball/5a279f1b5f5e1045a6c432354d9ea727ff3a9847",
- "reference": "5a279f1b5f5e1045a6c432354d9ea727ff3a9847",
+ "url": "https://api.github.com/repos/symfony/Yaml/zipball/65539ecde838f9c0d18b006b2101e3deb4b5c9ff",
+ "reference": "65539ecde838f9c0d18b006b2101e3deb4b5c9ff",
"shasum": ""
},
"require": {
@@ -1067,7 +1361,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.3-dev"
+ "dev-master": "2.4-dev"
}
},
"autoload": {
@@ -1082,7 +1376,9 @@
"authors": [
{
"name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
},
{
"name": "Symfony Community",
@@ -1091,7 +1387,7 @@
],
"description": "Symfony Yaml Component",
"homepage": "http://symfony.com",
- "time": "2013-08-24 15:26:22"
+ "time": "2014-04-18 20:37:09"
}
],
"aliases": [
diff --git a/phpBB/develop/create_schema_files.php b/phpBB/develop/create_schema_files.php
index 7b1fff40fb..b5f1202c0d 100644
--- a/phpBB/develop/create_schema_files.php
+++ b/phpBB/develop/create_schema_files.php
@@ -237,6 +237,19 @@ $supported_dbms = array('firebird', 'mssql', 'mysql_40', 'mysql_41', 'oracle', '
foreach ($supported_dbms as $dbms)
{
+ $schema_data = get_schema_struct();
+ if ($dbms == 'mssql')
+ {
+ foreach ($schema_data as $table_name => $table_data)
+ {
+ if (!isset($table_data['PRIMARY_KEY']))
+ {
+ $schema_data[$table_name]['COLUMNS']['mssqlindex'] = array('UINT', NULL, 'auto_increment');
+ $schema_data[$table_name]['PRIMARY_KEY'] = 'mssqlindex';
+ }
+ }
+ }
+
$fp = fopen($schema_path . $dbms . '_schema.sql', 'wb');
$line = '';
@@ -552,7 +565,7 @@ foreach ($supported_dbms as $dbms)
case 'mssql':
$line = substr($line, 0, -2);
- $line .= "\n) ON [PRIMARY]" . (($textimage) ? ' TEXTIMAGE_ON [PRIMARY]' : '') . "\n";
+ $line .= "\n)";// ON [PRIMARY]" . (($textimage) ? ' TEXTIMAGE_ON [PRIMARY]' : '') . "\n";
$line .= "GO\n\n";
break;
}
@@ -589,7 +602,7 @@ foreach ($supported_dbms as $dbms)
$line .= "\tCONSTRAINT [PK_{$table_name}] PRIMARY KEY CLUSTERED \n";
$line .= "\t(\n";
$line .= "\t\t[" . implode("],\n\t\t[", $table_data['PRIMARY_KEY']) . "]\n";
- $line .= "\t) ON [PRIMARY] \n";
+ $line .= "\t)\n";
$line .= "GO\n\n";
break;
@@ -684,7 +697,7 @@ foreach ($supported_dbms as $dbms)
case 'mssql':
$line .= ($key_data[0] == 'INDEX') ? 'CREATE INDEX' : '';
$line .= ($key_data[0] == 'UNIQUE') ? 'CREATE UNIQUE INDEX' : '';
- $line .= " [{$key_name}] ON [{$table_name}]([" . implode('], [', $key_data[1]) . "]) ON [PRIMARY]\n";
+ $line .= " [{$key_name}] ON [{$table_name}]([" . implode('], [', $key_data[1]) . "])\n";
$line .= "GO\n\n";
break;
diff --git a/phpBB/docs/AUTHORS b/phpBB/docs/AUTHORS
index 5995bd2ab4..25d2849dbe 100644
--- a/phpBB/docs/AUTHORS
+++ b/phpBB/docs/AUTHORS
@@ -23,10 +23,12 @@ involved in phpBB.
phpBB Lead Developer: naderman (Nils Adermann)
phpBB Developers: bantu (Andreas Fischer)
- EXreaction (Nathan Guse)
dhruv.goel92 (Dhruv Goel)
+ EXreaction (Nathan Guse)
imkingdavid (David King)
+ marc1706 (Marc Alexander)
nickvergessen (Joas Schilling)
+ prototech (Cesar Gallegos)
Contributions by: leviatan21 (Gabriel Vazquez)
Raimon (Raimon Meuldijk)
diff --git a/phpBB/docs/CHANGELOG.html b/phpBB/docs/CHANGELOG.html
index 6d8b39d524..71795f83ac 100644
--- a/phpBB/docs/CHANGELOG.html
+++ b/phpBB/docs/CHANGELOG.html
@@ -218,6 +218,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11368">PHPBB3-11368</a>] - Latest pm reports row count</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11583">PHPBB3-11583</a>] - InnoDB supports FULLTEXT index since MySQL 5.6.4.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11740">PHPBB3-11740</a>] - Update link in FAQ to Ideas Centre</li>
+<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11873">PHPBB3-11873</a>] - Prevent expensive hash computation in phpbb_check_hash() by rejecting very long passwords</li>
</ul>
<h4>Sub-task</h4>
<ul>
diff --git a/phpBB/docs/INSTALL.html b/phpBB/docs/INSTALL.html
index 3fa0597fc8..74c017ecff 100644
--- a/phpBB/docs/INSTALL.html
+++ b/phpBB/docs/INSTALL.html
@@ -139,6 +139,7 @@
<li>A SQL database system, <strong>one of</strong>:
<ul>
<li>MySQL 3.23 or above (MySQLi supported)</li>
+ <li>MariaDB 5.1 or above</li>
<li>PostgreSQL 7.3+</li>
<li>SQLite 2.8.2+ (SQLite 3 is not supported)</li>
<li>Firebird 2.1+</li>
diff --git a/phpBB/docs/README.html b/phpBB/docs/README.html
index 89f573de04..d54c58eca6 100644
--- a/phpBB/docs/README.html
+++ b/phpBB/docs/README.html
@@ -329,7 +329,7 @@
<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 phpBB3. 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, MSSQL Server 2000, PostgreSQL 7.x, Oracle 8, SQLite 2 and Firebird. Versions of PHP used range from 4.3.3 to 5.4.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, MSSQL Server 2000, PostgreSQL 7.x, Oracle 8, SQLite 2 and Firebird. Versions of PHP used range from 4.3.3 to 5.4.x without problem. </p>
<a name="phpsec"></a><h3>7.i. Notice on PHP security issues</h3>
diff --git a/phpBB/includes/acp/acp_board.php b/phpBB/includes/acp/acp_board.php
index ebbf66657e..526d8e05da 100644
--- a/phpBB/includes/acp/acp_board.php
+++ b/phpBB/includes/acp/acp_board.php
@@ -123,7 +123,7 @@ class acp_board
'avatar_filesize' => array('lang' => 'MAX_FILESIZE', 'validate' => 'int:0', 'type' => 'text:4:10', 'explain' => true, 'append' => ' ' . $user->lang['BYTES']),
'avatar_min' => array('lang' => 'MIN_AVATAR_SIZE', 'validate' => 'int:0', 'type' => 'dimension:3:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'avatar_max' => array('lang' => 'MAX_AVATAR_SIZE', 'validate' => 'int:0', 'type' => 'dimension:3:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
- 'avatar_path' => array('lang' => 'AVATAR_STORAGE_PATH', 'validate' => 'rwpath', 'type' => 'text:20:255', 'explain' => true),
+ 'avatar_path' => array('lang' => 'AVATAR_STORAGE_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true),
'avatar_gallery_path' => array('lang' => 'AVATAR_GALLERY_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true)
)
);
diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php
index 50e12a0f15..dc2e6b75fb 100644
--- a/phpBB/includes/acp/acp_forums.php
+++ b/phpBB/includes/acp/acp_forums.php
@@ -56,7 +56,6 @@ class acp_forums
$total = request_var('total', 0);
$this->display_progress_bar($start, $total);
- exit;
break;
case 'delete':
diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php
index 70e08f79f2..b82be8887c 100644
--- a/phpBB/includes/acp/acp_users.php
+++ b/phpBB/includes/acp/acp_users.php
@@ -172,8 +172,7 @@ class acp_users
if ($submit)
{
- // You can't delete the founder
- if ($delete && $user_row['user_type'] != USER_FOUNDER)
+ if ($delete)
{
if (!$auth->acl_get('a_userdel'))
{
@@ -186,6 +185,12 @@ class acp_users
trigger_error($user->lang['CANNOT_REMOVE_ANONYMOUS'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
}
+ // Founders can not be deleted.
+ if ($user_row['user_type'] == USER_FOUNDER)
+ {
+ trigger_error($user->lang['CANNOT_REMOVE_FOUNDER'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
+ }
+
if ($user_id == $user->data['user_id'])
{
trigger_error($user->lang['CANNOT_REMOVE_YOURSELF'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
@@ -1032,6 +1037,7 @@ class acp_users
'U_SHOW_IP' => $this->u_action . "&amp;u=$user_id&amp;ip=" . (($ip == 'ip') ? 'hostname' : 'ip'),
'U_WHOIS' => $this->u_action . "&amp;action=whois&amp;user_ip={$user_row['user_ip']}",
'U_MCP_QUEUE' => ($auth->acl_getf_global('m_approve')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue', true, $user->session_id) : '',
+ 'U_SEARCH_USER' => ($config['load_search'] && $auth->acl_get('u_search')) ? append_sid("{$phpbb_root_path}search.$phpEx", "author_id={$user_row['user_id']}&amp;sr=posts") : '',
'U_SWITCH_PERMISSIONS' => ($auth->acl_get('a_switchperm') && $user->data['user_id'] != $user_row['user_id']) ? append_sid("{$phpbb_root_path}ucp.$phpEx", "mode=switch_perm&amp;u={$user_row['user_id']}&amp;hash=" . generate_link_hash('switchperm')) : '',
@@ -2009,7 +2015,7 @@ class acp_users
WHERE a.poster_id = ' . $user_id . "
AND a.is_orphan = 0
ORDER BY $order_by";
- $result = $db->sql_query_limit($sql, $config['posts_per_page'], $start);
+ $result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
while ($row = $db->sql_fetchrow($result))
{
diff --git a/phpBB/includes/bbcode.php b/phpBB/includes/bbcode.php
index 9356e3e9b4..f587e111f3 100644
--- a/phpBB/includes/bbcode.php
+++ b/phpBB/includes/bbcode.php
@@ -376,7 +376,7 @@ class bbcode
}
// Replace {L_*} lang strings
- $bbcode_tpl = preg_replace('/{L_([A-Z_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $bbcode_tpl);
+ $bbcode_tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $bbcode_tpl);
if (!empty($rowset[$bbcode_id]['second_pass_replace']))
{
@@ -480,7 +480,7 @@ class bbcode
'email' => array('{EMAIL}' => '$1', '{DESCRIPTION}' => '$2')
);
- $tpl = preg_replace('/{L_([A-Z_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $tpl);
+ $tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $tpl);
if (!empty($replacements[$tpl_name]))
{
diff --git a/phpBB/includes/db/db_tools.php b/phpBB/includes/db/db_tools.php
index f63ff18cbe..6913960185 100644
--- a/phpBB/includes/db/db_tools.php
+++ b/phpBB/includes/db/db_tools.php
@@ -452,9 +452,6 @@ class phpbb_db_tools
// Determine if we have created a PRIMARY KEY in the earliest
$primary_key_gen = false;
- // Determine if the table must be created with TEXTIMAGE
- $create_textimage = false;
-
// Determine if the table requires a sequence
$create_sequence = false;
@@ -471,13 +468,22 @@ class phpbb_db_tools
break;
}
+ if ($this->sql_layer == 'mssql' || $this->sql_layer == 'mssqlnative')
+ {
+ if (!isset($table_data['PRIMARY_KEY']))
+ {
+ $table_data['COLUMNS']['mssqlindex'] = array('UINT', null, 'auto_increment');
+ $table_data['PRIMARY_KEY'] = 'mssqlindex';
+ }
+ }
+
// Iterate through the columns to create a table
foreach ($table_data['COLUMNS'] as $column_name => $column_data)
{
// here lies an array, filled with information compiled on the column's data
$prepared_column = $this->sql_prepare_column_data($table_name, $column_name, $column_data);
- if (isset($prepared_column['auto_increment']) && strlen($column_name) > 26) // "${column_name}_gen"
+ if (isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'] && strlen($column_name) > 26) // "${column_name}_gen"
{
trigger_error("Index name '${column_name}_gen' on table '$table_name' is too long. The maximum auto increment column length is 26 characters.", E_USER_ERROR);
}
@@ -501,12 +507,6 @@ class phpbb_db_tools
$primary_key_gen = isset($prepared_column['primary_key_set']) && $prepared_column['primary_key_set'];
}
- // create textimage DDL based off of the existance of certain column types
- if (!$create_textimage)
- {
- $create_textimage = isset($prepared_column['textimage']) && $prepared_column['textimage'];
- }
-
// create sequence DDL based off of the existance of auto incrementing columns
if (!$create_sequence && isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'])
{
@@ -521,13 +521,9 @@ class phpbb_db_tools
switch ($this->sql_layer)
{
case 'firebird':
- $table_sql .= "\n);";
- $statements[] = $table_sql;
- break;
-
case 'mssql':
case 'mssqlnative':
- $table_sql .= "\n) ON [PRIMARY]" . (($create_textimage) ? ' TEXTIMAGE_ON [PRIMARY]' : '');
+ $table_sql .= "\n);";
$statements[] = $table_sql;
break;
}
@@ -879,7 +875,7 @@ class phpbb_db_tools
}
}
- // Add unqiue indexes?
+ // Add unique indexes?
if (!empty($schema_changes['add_unique_index']))
{
foreach ($schema_changes['add_unique_index'] as $table => $index_array)
@@ -1290,7 +1286,7 @@ class phpbb_db_tools
}
/**
- * Check if a specified index exists in table. Does not return PRIMARY KEY and UNIQUE indexes.
+ * Check if a specified index exists in table. Does not return PRIMARY KEY indexes.
*
* @param string $table_name Table to check the index at
* @param string $index_name The index name to check
@@ -1819,22 +1815,49 @@ class phpbb_db_tools
case 'mssql':
case 'mssqlnative':
- // remove default cosntraints first
- // http://msdn.microsoft.com/en-us/library/aa175912%28v=sql.80%29.aspx
- $statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
- SET @drop_default_name =
- (SELECT so.name FROM sysobjects so
- JOIN sysconstraints sc ON so.id = sc.constid
- WHERE object_name(so.parent_obj) = '{$table_name}'
- AND so.xtype = 'D'
- AND sc.colid = (SELECT colid FROM syscolumns
- WHERE id = object_id('{$table_name}')
- AND name = '{$column_name}'))
- IF @drop_default_name <> ''
- BEGIN
- SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
- EXEC(@cmd)
- END";
+ $sql = "SELECT CAST(SERVERPROPERTY('productversion') AS VARCHAR(25)) AS mssql_version";
+ $result = $this->db->sql_query($sql);
+ $row = $this->db->sql_fetchrow($result);
+ $this->db->sql_freeresult($result);
+
+ // Remove default constraints
+ if ($row['mssql_version'][0] == '8') // SQL Server 2000
+ {
+ // http://msdn.microsoft.com/en-us/library/aa175912%28v=sql.80%29.aspx
+ // Deprecated in SQL Server 2005
+ $statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
+ SET @drop_default_name =
+ (SELECT so.name FROM sysobjects so
+ JOIN sysconstraints sc ON so.id = sc.constid
+ WHERE object_name(so.parent_obj) = '{$table_name}'
+ AND so.xtype = 'D'
+ AND sc.colid = (SELECT colid FROM syscolumns
+ WHERE id = object_id('{$table_name}')
+ AND name = '{$column_name}'))
+ IF @drop_default_name <> ''
+ BEGIN
+ SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
+ EXEC(@cmd)
+ END";
+ }
+ else
+ {
+ $sql = "SELECT dobj.name AS def_name
+ FROM sys.columns col
+ LEFT OUTER JOIN sys.objects dobj ON (dobj.object_id = col.default_object_id AND dobj.type = 'D')
+ WHERE col.object_id = object_id('{$table_name}')
+ AND col.name = '{$column_name}'
+ AND dobj.name IS NOT NULL";
+ $result = $this->db->sql_query($sql);
+ $row = $this->db->sql_fetchrow($result);
+ $this->db->sql_freeresult($result);
+
+ if ($row)
+ {
+ $statements[] = 'ALTER TABLE [' . $table_name . '] DROP CONSTRAINT [' . $row['def_name'] . ']';
+ }
+ }
+
$statements[] = 'ALTER TABLE [' . $table_name . '] DROP COLUMN [' . $column_name . ']';
break;
@@ -2038,7 +2061,7 @@ class phpbb_db_tools
$sql = "ALTER TABLE [{$table_name}] WITH NOCHECK ADD ";
$sql .= "CONSTRAINT [PK_{$table_name}] PRIMARY KEY CLUSTERED (";
$sql .= '[' . implode("],\n\t\t[", $column) . ']';
- $sql .= ') ON [PRIMARY]';
+ $sql .= ')';
$statements[] = $sql;
break;
@@ -2136,7 +2159,7 @@ class phpbb_db_tools
case 'mssql':
case 'mssqlnative':
- $statements[] = 'CREATE UNIQUE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ') ON [PRIMARY]';
+ $statements[] = 'CREATE UNIQUE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
break;
}
@@ -2189,7 +2212,7 @@ class phpbb_db_tools
case 'mssql':
case 'mssqlnative':
- $statements[] = 'CREATE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ') ON [PRIMARY]';
+ $statements[] = 'CREATE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
break;
}
@@ -2321,23 +2344,48 @@ class phpbb_db_tools
if (!empty($column_data['default']))
{
+ $sql = "SELECT CAST(SERVERPROPERTY('productversion') AS VARCHAR(25)) AS mssql_version";
+ $result = $this->db->sql_query($sql);
+ $row = $this->db->sql_fetchrow($result);
+ $this->db->sql_freeresult($result);
+
// Using TRANSACT-SQL for this statement because we do not want to have colliding data if statements are executed at a later stage
- $statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
- SET @drop_default_name =
- (SELECT so.name FROM sysobjects so
- JOIN sysconstraints sc ON so.id = sc.constid
- WHERE object_name(so.parent_obj) = '{$table_name}'
- AND so.xtype = 'D'
- AND sc.colid = (SELECT colid FROM syscolumns
- WHERE id = object_id('{$table_name}')
- AND name = '{$column_name}'))
- IF @drop_default_name <> ''
- BEGIN
- SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
- EXEC(@cmd)
- END
- SET @cmd = 'ALTER TABLE [{$table_name}] ADD CONSTRAINT [DF_{$table_name}_{$column_name}_1] {$column_data['default']} FOR [{$column_name}]'
- EXEC(@cmd)";
+ if ($row['mssql_version'][0] == '8') // SQL Server 2000
+ {
+ $statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
+ SET @drop_default_name =
+ (SELECT so.name FROM sysobjects so
+ JOIN sysconstraints sc ON so.id = sc.constid
+ WHERE object_name(so.parent_obj) = '{$table_name}'
+ AND so.xtype = 'D'
+ AND sc.colid = (SELECT colid FROM syscolumns
+ WHERE id = object_id('{$table_name}')
+ AND name = '{$column_name}'))
+ IF @drop_default_name <> ''
+ BEGIN
+ SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
+ EXEC(@cmd)
+ END
+ SET @cmd = 'ALTER TABLE [{$table_name}] ADD CONSTRAINT [DF_{$table_name}_{$column_name}_1] {$column_data['default']} FOR [{$column_name}]'
+ EXEC(@cmd)";
+ }
+ else
+ {
+ $statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
+ SET @drop_default_name =
+ (SELECT dobj.name FROM sys.columns col
+ LEFT OUTER JOIN sys.objects dobj ON (dobj.object_id = col.default_object_id AND dobj.type = 'D')
+ WHERE col.object_id = object_id('{$table_name}')
+ AND col.name = '{$column_name}'
+ AND dobj.name IS NOT NULL)
+ IF @drop_default_name <> ''
+ BEGIN
+ SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
+ EXEC(@cmd)
+ END
+ SET @cmd = 'ALTER TABLE [{$table_name}] ADD CONSTRAINT [DF_{$table_name}_{$column_name}_1] {$column_data['default']} FOR [{$column_name}]'
+ EXEC(@cmd)";
+ }
}
break;
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index b2b12c1445..f0657b9016 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -502,6 +502,13 @@ function phpbb_hash($password)
*/
function phpbb_check_hash($password, $hash)
{
+ if (strlen($password) > 4096)
+ {
+ // If the password is too huge, we will simply reject it
+ // and not let the server try to hash it.
+ return false;
+ }
+
$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
if (strlen($hash) == 34)
{
@@ -3360,7 +3367,7 @@ function parse_cfg_file($filename, $lines = false)
}
// Determine first occurrence, since in values the equal sign is allowed
- $key = strtolower(trim(substr($line, 0, $delim_pos)));
+ $key = htmlspecialchars(strtolower(trim(substr($line, 0, $delim_pos))));
$value = trim(substr($line, $delim_pos + 1));
if (in_array($value, array('off', 'false', '0')))
@@ -3377,7 +3384,11 @@ function parse_cfg_file($filename, $lines = false)
}
else if (($value[0] == "'" && $value[sizeof($value) - 1] == "'") || ($value[0] == '"' && $value[sizeof($value) - 1] == '"'))
{
- $value = substr($value, 1, sizeof($value)-2);
+ $value = htmlspecialchars(substr($value, 1, sizeof($value)-2));
+ }
+ else
+ {
+ $value = htmlspecialchars($value);
}
$parsed_items[$key] = $value;
diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php
index 2f73858ea2..3e69a997a2 100644
--- a/phpBB/includes/functions_admin.php
+++ b/phpBB/includes/functions_admin.php
@@ -3057,8 +3057,24 @@ function get_database_size()
case 'mssql':
case 'mssql_odbc':
case 'mssqlnative':
+ $sql = 'SELECT @@VERSION AS mssql_version';
+ $result = $db->sql_query($sql);
+ $row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+
$sql = 'SELECT ((SUM(size) * 8.0) * 1024.0) as dbsize
FROM sysfiles';
+
+ if ($row)
+ {
+ // Azure stats are stored elsewhere
+ if (strpos($row['mssql_version'], 'SQL Azure') !== false)
+ {
+ $sql = 'SELECT ((SUM(reserved_page_count) * 8.0) * 1024.0) as dbsize
+ FROM sys.dm_db_partition_stats';
+ }
+ }
+
$result = $db->sql_query($sql, 7200);
$database_size = ($row = $db->sql_fetchrow($result)) ? $row['dbsize'] : false;
$db->sql_freeresult($result);
diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php
index 6213d2fd24..19459239d5 100644
--- a/phpBB/includes/functions_content.php
+++ b/phpBB/includes/functions_content.php
@@ -21,6 +21,7 @@ if (!defined('IN_PHPBB'))
* make_jumpbox()
* bump_topic_allowed()
* get_context()
+* phpbb_clean_search_string()
* decode_message()
* strip_bbcode()
* generate_text_for_display()
@@ -361,6 +362,23 @@ function get_context($text, $words, $length = 400)
}
/**
+* Cleans a search string by removing single wildcards from it and replacing multiple spaces with a single one.
+*
+* @param string $search_string The full search string which should be cleaned.
+*
+* @return string The cleaned search string without any wildcards and multiple spaces.
+*/
+function phpbb_clean_search_string($search_string)
+{
+ // This regular expressions matches every single wildcard.
+ // That means one after a whitespace or the beginning of the string or one before a whitespace or the end of the string.
+ $search_string = preg_replace('#(?<=^|\s)\*+(?=\s|$)#', '', $search_string);
+ $search_string = trim($search_string);
+ $search_string = preg_replace(array('#\s+#u', '#\*+#u'), array(' ', '*'), $search_string);
+ return $search_string;
+}
+
+/**
* Decode text whereby text is coming from the db and expected to be pre-parsed content
* We are placing this outside of the message parser because we are often in need of it...
*/
diff --git a/phpBB/includes/functions_module.php b/phpBB/includes/functions_module.php
index d0e7c8cfc8..0cc2425b28 100644
--- a/phpBB/includes/functions_module.php
+++ b/phpBB/includes/functions_module.php
@@ -436,21 +436,21 @@ class p_master
if ($this->active_module === false)
{
- trigger_error('Module not accessible', E_USER_ERROR);
+ trigger_error('MODULE_NOT_ACCESS', E_USER_ERROR);
}
if (!class_exists("{$this->p_class}_$this->p_name"))
{
if (!file_exists("$module_path/{$this->p_class}_$this->p_name.$phpEx"))
{
- trigger_error("Cannot find module $module_path/{$this->p_class}_$this->p_name.$phpEx", E_USER_ERROR);
+ trigger_error($user->lang('MODULE_NOT_FIND', "$module_path/{$this->p_class}_$this->p_name.$phpEx"), E_USER_ERROR);
}
include("$module_path/{$this->p_class}_$this->p_name.$phpEx");
if (!class_exists("{$this->p_class}_$this->p_name"))
{
- trigger_error("Module file $module_path/{$this->p_class}_$this->p_name.$phpEx does not contain correct class [{$this->p_class}_$this->p_name]", E_USER_ERROR);
+ trigger_error($user->lang('MODULE_FILE_INCORRECT_CLASS', "$module_path/{$this->p_class}_$this->p_name.$phpEx", "{$this->p_class}_$this->p_name"), E_USER_ERROR);
}
if (!empty($mode))
diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php
index 11a5067ef9..3f0a78a7cb 100644
--- a/phpBB/includes/functions_posting.php
+++ b/phpBB/includes/functions_posting.php
@@ -394,6 +394,10 @@ function upload_attachment($form_name, $forum_id, $local = false, $local_storage
{
$upload->set_disallowed_content(explode('|', $config['mime_triggers']));
}
+ else if (!$config['check_attachment_content'])
+ {
+ $upload->set_disallowed_content(array());
+ }
if (!$local)
{
diff --git a/phpBB/includes/functions_profile_fields.php b/phpBB/includes/functions_profile_fields.php
index 8573533c2c..a2c0656ca4 100644
--- a/phpBB/includes/functions_profile_fields.php
+++ b/phpBB/includes/functions_profile_fields.php
@@ -532,7 +532,7 @@ class custom_profile
switch ($this->profile_types[$field_type])
{
case 'int':
- if ($value === '' && !$ident_ary['data']['field_show_novalue'])
+ if (($value === '' || $value === null) && !$ident_ary['data']['field_show_novalue'])
{
return NULL;
}
diff --git a/phpBB/includes/mcp/info/mcp_pm_reports.php b/phpBB/includes/mcp/info/mcp_pm_reports.php
index 103f560597..84f15b7107 100644
--- a/phpBB/includes/mcp/info/mcp_pm_reports.php
+++ b/phpBB/includes/mcp/info/mcp_pm_reports.php
@@ -20,7 +20,7 @@ class mcp_pm_reports_info
'title' => 'MCP_PM_REPORTS',
'version' => '1.0.0',
'modes' => array(
- 'pm_reports' => array('title' => 'MCP_PM_REPORTS_OPEN', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),
+ 'pm_reports' => array('title' => 'MCP_PM_REPORTS_OPEN', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),
'pm_reports_closed' => array('title' => 'MCP_PM_REPORTS_CLOSED', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),
'pm_report_details' => array('title' => 'MCP_PM_REPORT_DETAILS', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),
),
diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php
index 764461fa53..acf344fd3c 100644
--- a/phpBB/includes/mcp/mcp_queue.php
+++ b/phpBB/includes/mcp/mcp_queue.php
@@ -660,15 +660,17 @@ function approve_post($post_id_list, $id, $mode)
foreach ($post_info as $post_id => $post_data)
{
+ $username = ($post_data['post_username']) ? $post_data['post_username'] : $post_data['username'];
+
if ($post_id == $post_data['topic_first_post_id'] && $post_id == $post_data['topic_last_post_id'])
{
// Forum Notifications
- user_notification('post', $post_data['topic_title'], $post_data['topic_title'], $post_data['forum_name'], $post_data['forum_id'], $post_data['topic_id'], $post_id);
+ user_notification('post', $post_data['topic_title'], $post_data['topic_title'], $post_data['forum_name'], $post_data['forum_id'], $post_data['topic_id'], $post_id, $username);
}
else
{
// Topic Notifications
- user_notification('reply', $post_data['post_subject'], $post_data['topic_title'], $post_data['forum_name'], $post_data['forum_id'], $post_data['topic_id'], $post_id);
+ user_notification('reply', $post_data['post_subject'], $post_data['topic_title'], $post_data['forum_name'], $post_data['forum_id'], $post_data['topic_id'], $post_id, $username);
}
}
diff --git a/phpBB/includes/search/fulltext_native.php b/phpBB/includes/search/fulltext_native.php
index dc961f3c8a..29c5a72874 100644
--- a/phpBB/includes/search/fulltext_native.php
+++ b/phpBB/includes/search/fulltext_native.php
@@ -231,7 +231,12 @@ class fulltext_native extends search_backend
}
$db->sql_freeresult($result);
}
- unset($exact_words);
+
+ // Handle +, - without preceeding whitespace character
+ $match = array('#(\S)\+#', '#(\S)-#');
+ $replace = array('$1 +', '$1 +');
+
+ $keywords = preg_replace($match, $replace, $keywords);
// now analyse the search query, first split it using the spaces
$query = explode(' ', $keywords);
@@ -357,39 +362,21 @@ class fulltext_native extends search_backend
$this->{$mode . '_ids'}[] = $words[$word];
}
}
- // throw an error if we shall not ignore unexistant words
- else if (!$ignore_no_id)
+ else
{
if (!isset($common_ids[$word]))
{
$len = utf8_strlen($word);
- if ($len >= $this->word_length['min'] && $len <= $this->word_length['max'])
- {
- trigger_error(sprintf($user->lang['WORD_IN_NO_POST'], $word));
- }
- else
+ if ($len < $this->word_length['min'] || $len > $this->word_length['max'])
{
$this->common_words[] = $word;
}
}
}
- else
- {
- $len = utf8_strlen($word);
- if ($len < $this->word_length['min'] || $len > $this->word_length['max'])
- {
- $this->common_words[] = $word;
- }
- }
- }
-
- // we can't search for negatives only
- if (!sizeof($this->must_contain_ids))
- {
- return false;
}
- if (!empty($this->search_query))
+ // Return true if all words are not common words
+ if (sizeof($exact_words) - sizeof($this->common_words) > 0)
{
return true;
}
@@ -428,6 +415,12 @@ class fulltext_native extends search_backend
return false;
}
+ // we can't search for negatives only
+ if (empty($this->must_contain_ids))
+ {
+ return false;
+ }
+
$must_contain_ids = $this->must_contain_ids;
$must_not_contain_ids = $this->must_not_contain_ids;
$must_exclude_one_ids = $this->must_exclude_one_ids;
diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php
index 1070b10b18..7c57dfdc1f 100644
--- a/phpBB/install/database_update.php
+++ b/phpBB/install/database_update.php
@@ -1009,6 +1009,8 @@ function database_update_info()
'3.0.12-RC1' => array(),
// No changes from 3.0.12-RC2 to 3.0.12-RC3
'3.0.12-RC2' => array(),
+ // No changes from 3.0.12-RC3 to 3.0.12
+ '3.0.12-RC3' => array(),
/** @todo DROP LOGIN_ATTEMPT_TABLE.attempt_id in 3.0.13-RC1 */
);
@@ -2248,6 +2250,10 @@ function change_database_data(&$no_updates, $version)
// No changes from 3.0.12-RC2 to 3.0.12-RC3
case '3.0.12-RC2':
break;
+
+ // No changes from 3.0.12-RC3 to 3.0.12
+ case '3.0.12-RC3':
+ break;
}
}
diff --git a/phpBB/install/index.php b/phpBB/install/index.php
index ad46e273c2..35e7c70e1d 100644
--- a/phpBB/install/index.php
+++ b/phpBB/install/index.php
@@ -641,8 +641,9 @@ class module
case 'password':
$size = (int) $tpl_type[1];
$maxlength = (int) $tpl_type[2];
+ $autocomplete = (isset($options['autocomplete']) && $options['autocomplete'] == 'off') ? ' autocomplete="off"' : '';
- $tpl = '<input id="' . $name . '" type="' . $tpl_type[0] . '"' . (($size) ? ' size="' . $size . '"' : '') . ' maxlength="' . (($maxlength) ? $maxlength : 255) . '" name="' . $name . '" value="' . $value . '" />';
+ $tpl = '<input id="' . $name . '" type="' . $tpl_type[0] . '"' . (($size) ? ' size="' . $size . '"' : '') . ' maxlength="' . (($maxlength) ? $maxlength : 255) . '" name="' . $name . '"' . $autocomplete . ' value="' . $value . '" />';
break;
case 'textarea':
diff --git a/phpBB/install/install_convert.php b/phpBB/install/install_convert.php
index fb97255981..725cb4fdee 100644
--- a/phpBB/install/install_convert.php
+++ b/phpBB/install/install_convert.php
@@ -417,7 +417,7 @@ class install_convert extends module
if (!isset($available_dbms[$src_dbms]) || !$available_dbms[$src_dbms]['AVAILABLE'])
{
- $error['db'][] = $lang['INST_ERR_NO_DB'];
+ $error[] = $lang['INST_ERR_NO_DB'];
$connect_test = false;
}
else
diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php
index 4618cff855..cb63c70e11 100644
--- a/phpBB/install/install_install.php
+++ b/phpBB/install/install_install.php
@@ -273,8 +273,8 @@ class install_install extends module
$checks = array(
array('func_overload', '&', MB_OVERLOAD_MAIL|MB_OVERLOAD_STRING),
array('encoding_translation', '!=', 0),
- array('http_input', '!=', 'pass'),
- array('http_output', '!=', 'pass')
+ array('http_input', '!=', array('pass', '')),
+ array('http_output', '!=', array('pass', ''))
);
foreach ($checks as $mb_checks)
@@ -295,7 +295,8 @@ class install_install extends module
break;
case '!=':
- if ($ini_val != $mb_checks[2])
+ if (!is_array($mb_checks[2]) && $ini_val != $mb_checks[2] ||
+ is_array($mb_checks[2]) && !in_array($ini_val, $mb_checks[2]))
{
$result = '<strong style="color:red">' . $lang['NO'] . '</strong>';
$passed['mbstring'] = false;
@@ -1624,6 +1625,45 @@ class install_install extends module
$_module->move_module_by($row, 'move_up', 5);
}
+ if ($module_class == 'mcp')
+ {
+ // Move pm report details module 3 down...
+ $sql = 'SELECT *
+ FROM ' . MODULES_TABLE . "
+ WHERE module_basename = 'pm_reports'
+ AND module_class = 'mcp'
+ AND module_mode = 'pm_report_details'";
+ $result = $db->sql_query($sql);
+ $row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+
+ $_module->move_module_by($row, 'move_down', 3);
+
+ // Move closed pm reports module 3 down...
+ $sql = 'SELECT *
+ FROM ' . MODULES_TABLE . "
+ WHERE module_basename = 'pm_reports'
+ AND module_class = 'mcp'
+ AND module_mode = 'pm_reports_closed'";
+ $result = $db->sql_query($sql);
+ $row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+
+ $_module->move_module_by($row, 'move_down', 3);
+
+ // Move open pm reports module 3 down...
+ $sql = 'SELECT *
+ FROM ' . MODULES_TABLE . "
+ WHERE module_basename = 'pm_reports'
+ AND module_class = 'mcp'
+ AND module_mode = 'pm_reports'";
+ $result = $db->sql_query($sql);
+ $row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+
+ $_module->move_module_by($row, 'move_down', 3);
+ }
+
if ($module_class == 'ucp')
{
// Move attachment module 4 down...
@@ -2045,8 +2085,8 @@ class install_install extends module
'smtp_delivery' => array('lang' => 'USE_SMTP', 'type' => 'radio:yes_no', 'explain' => true),
'smtp_host' => array('lang' => 'SMTP_SERVER', 'type' => 'text:25:50', 'explain' => false),
'smtp_auth' => array('lang' => 'SMTP_AUTH_METHOD', 'type' => 'select', 'options' => '$this->module->mail_auth_select(\'{VALUE}\')', 'explain' => true),
- 'smtp_user' => array('lang' => 'SMTP_USERNAME', 'type' => 'text:25:255', 'explain' => true),
- 'smtp_pass' => array('lang' => 'SMTP_PASSWORD', 'type' => 'password:25:255', 'explain' => true),
+ 'smtp_user' => array('lang' => 'SMTP_USERNAME', 'type' => 'text:25:255', 'explain' => true, 'options' => array('autocomplete' => 'off')),
+ 'smtp_pass' => array('lang' => 'SMTP_PASSWORD', 'type' => 'password:25:255', 'explain' => true, 'options' => array('autocomplete' => 'off')),
'legend2' => 'SERVER_URL_SETTINGS',
'cookie_secure' => array('lang' => 'COOKIE_SECURE', 'type' => 'radio:enabled_disabled', 'explain' => true),
diff --git a/phpBB/install/schemas/mssql_schema.sql b/phpBB/install/schemas/mssql_schema.sql
index 0b2f8368de..68993d45ee 100644
--- a/phpBB/install/schemas/mssql_schema.sql
+++ b/phpBB/install/schemas/mssql_schema.sql
@@ -25,29 +25,28 @@ CREATE TABLE [phpbb_attachments] (
[filesize] [int] DEFAULT (0) NOT NULL ,
[filetime] [int] DEFAULT (0) NOT NULL ,
[thumbnail] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_attachments] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_attachments] PRIMARY KEY CLUSTERED
(
[attach_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [filetime] ON [phpbb_attachments]([filetime]) ON [PRIMARY]
+CREATE INDEX [filetime] ON [phpbb_attachments]([filetime])
GO
-CREATE INDEX [post_msg_id] ON [phpbb_attachments]([post_msg_id]) ON [PRIMARY]
+CREATE INDEX [post_msg_id] ON [phpbb_attachments]([post_msg_id])
GO
-CREATE INDEX [topic_id] ON [phpbb_attachments]([topic_id]) ON [PRIMARY]
+CREATE INDEX [topic_id] ON [phpbb_attachments]([topic_id])
GO
-CREATE INDEX [poster_id] ON [phpbb_attachments]([poster_id]) ON [PRIMARY]
+CREATE INDEX [poster_id] ON [phpbb_attachments]([poster_id])
GO
-CREATE INDEX [is_orphan] ON [phpbb_attachments]([is_orphan]) ON [PRIMARY]
+CREATE INDEX [is_orphan] ON [phpbb_attachments]([is_orphan])
GO
@@ -59,17 +58,24 @@ CREATE TABLE [phpbb_acl_groups] (
[forum_id] [int] DEFAULT (0) NOT NULL ,
[auth_option_id] [int] DEFAULT (0) NOT NULL ,
[auth_role_id] [int] DEFAULT (0) NOT NULL ,
- [auth_setting] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
+ [auth_setting] [int] DEFAULT (0) NOT NULL ,
+ [mssqlindex] [int] IDENTITY (1, 1) NOT NULL
+)GO
+
+ALTER TABLE [phpbb_acl_groups] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_acl_groups] PRIMARY KEY CLUSTERED
+ (
+ [mssqlindex]
+ )
GO
-CREATE INDEX [group_id] ON [phpbb_acl_groups]([group_id]) ON [PRIMARY]
+CREATE INDEX [group_id] ON [phpbb_acl_groups]([group_id])
GO
-CREATE INDEX [auth_opt_id] ON [phpbb_acl_groups]([auth_option_id]) ON [PRIMARY]
+CREATE INDEX [auth_opt_id] ON [phpbb_acl_groups]([auth_option_id])
GO
-CREATE INDEX [auth_role_id] ON [phpbb_acl_groups]([auth_role_id]) ON [PRIMARY]
+CREATE INDEX [auth_role_id] ON [phpbb_acl_groups]([auth_role_id])
GO
@@ -82,17 +88,16 @@ CREATE TABLE [phpbb_acl_options] (
[is_global] [int] DEFAULT (0) NOT NULL ,
[is_local] [int] DEFAULT (0) NOT NULL ,
[founder_only] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_acl_options] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_acl_options] PRIMARY KEY CLUSTERED
(
[auth_option_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE UNIQUE INDEX [auth_option] ON [phpbb_acl_options]([auth_option]) ON [PRIMARY]
+CREATE UNIQUE INDEX [auth_option] ON [phpbb_acl_options]([auth_option])
GO
@@ -105,20 +110,19 @@ CREATE TABLE [phpbb_acl_roles] (
[role_description] [varchar] (4000) DEFAULT ('') NOT NULL ,
[role_type] [varchar] (10) DEFAULT ('') NOT NULL ,
[role_order] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_acl_roles] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_acl_roles] PRIMARY KEY CLUSTERED
(
[role_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [role_type] ON [phpbb_acl_roles]([role_type]) ON [PRIMARY]
+CREATE INDEX [role_type] ON [phpbb_acl_roles]([role_type])
GO
-CREATE INDEX [role_order] ON [phpbb_acl_roles]([role_order]) ON [PRIMARY]
+CREATE INDEX [role_order] ON [phpbb_acl_roles]([role_order])
GO
@@ -129,18 +133,17 @@ CREATE TABLE [phpbb_acl_roles_data] (
[role_id] [int] DEFAULT (0) NOT NULL ,
[auth_option_id] [int] DEFAULT (0) NOT NULL ,
[auth_setting] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_acl_roles_data] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_acl_roles_data] PRIMARY KEY CLUSTERED
(
[role_id],
[auth_option_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [ath_op_id] ON [phpbb_acl_roles_data]([auth_option_id]) ON [PRIMARY]
+CREATE INDEX [ath_op_id] ON [phpbb_acl_roles_data]([auth_option_id])
GO
@@ -152,17 +155,24 @@ CREATE TABLE [phpbb_acl_users] (
[forum_id] [int] DEFAULT (0) NOT NULL ,
[auth_option_id] [int] DEFAULT (0) NOT NULL ,
[auth_role_id] [int] DEFAULT (0) NOT NULL ,
- [auth_setting] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
+ [auth_setting] [int] DEFAULT (0) NOT NULL ,
+ [mssqlindex] [int] IDENTITY (1, 1) NOT NULL
+)GO
+
+ALTER TABLE [phpbb_acl_users] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_acl_users] PRIMARY KEY CLUSTERED
+ (
+ [mssqlindex]
+ )
GO
-CREATE INDEX [user_id] ON [phpbb_acl_users]([user_id]) ON [PRIMARY]
+CREATE INDEX [user_id] ON [phpbb_acl_users]([user_id])
GO
-CREATE INDEX [auth_option_id] ON [phpbb_acl_users]([auth_option_id]) ON [PRIMARY]
+CREATE INDEX [auth_option_id] ON [phpbb_acl_users]([auth_option_id])
GO
-CREATE INDEX [auth_role_id] ON [phpbb_acl_users]([auth_role_id]) ON [PRIMARY]
+CREATE INDEX [auth_role_id] ON [phpbb_acl_users]([auth_role_id])
GO
@@ -179,26 +189,25 @@ CREATE TABLE [phpbb_banlist] (
[ban_exclude] [int] DEFAULT (0) NOT NULL ,
[ban_reason] [varchar] (255) DEFAULT ('') NOT NULL ,
[ban_give_reason] [varchar] (255) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_banlist] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_banlist] PRIMARY KEY CLUSTERED
(
[ban_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [ban_end] ON [phpbb_banlist]([ban_end]) ON [PRIMARY]
+CREATE INDEX [ban_end] ON [phpbb_banlist]([ban_end])
GO
-CREATE INDEX [ban_user] ON [phpbb_banlist]([ban_userid], [ban_exclude]) ON [PRIMARY]
+CREATE INDEX [ban_user] ON [phpbb_banlist]([ban_userid], [ban_exclude])
GO
-CREATE INDEX [ban_email] ON [phpbb_banlist]([ban_email], [ban_exclude]) ON [PRIMARY]
+CREATE INDEX [ban_email] ON [phpbb_banlist]([ban_email], [ban_exclude])
GO
-CREATE INDEX [ban_ip] ON [phpbb_banlist]([ban_ip], [ban_exclude]) ON [PRIMARY]
+CREATE INDEX [ban_ip] ON [phpbb_banlist]([ban_ip], [ban_exclude])
GO
@@ -216,17 +225,16 @@ CREATE TABLE [phpbb_bbcodes] (
[first_pass_replace] [text] DEFAULT ('') NOT NULL ,
[second_pass_match] [text] DEFAULT ('') NOT NULL ,
[second_pass_replace] [text] DEFAULT ('') NOT NULL
-) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_bbcodes] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_bbcodes] PRIMARY KEY CLUSTERED
(
[bbcode_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [display_on_post] ON [phpbb_bbcodes]([display_on_posting]) ON [PRIMARY]
+CREATE INDEX [display_on_post] ON [phpbb_bbcodes]([display_on_posting])
GO
@@ -236,15 +244,14 @@ GO
CREATE TABLE [phpbb_bookmarks] (
[topic_id] [int] DEFAULT (0) NOT NULL ,
[user_id] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_bookmarks] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_bookmarks] PRIMARY KEY CLUSTERED
(
[topic_id],
[user_id]
- ) ON [PRIMARY]
+ )
GO
@@ -258,17 +265,16 @@ CREATE TABLE [phpbb_bots] (
[user_id] [int] DEFAULT (0) NOT NULL ,
[bot_agent] [varchar] (255) DEFAULT ('') NOT NULL ,
[bot_ip] [varchar] (255) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_bots] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_bots] PRIMARY KEY CLUSTERED
(
[bot_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [bot_active] ON [phpbb_bots]([bot_active]) ON [PRIMARY]
+CREATE INDEX [bot_active] ON [phpbb_bots]([bot_active])
GO
@@ -279,17 +285,16 @@ CREATE TABLE [phpbb_config] (
[config_name] [varchar] (255) DEFAULT ('') NOT NULL ,
[config_value] [varchar] (255) DEFAULT ('') NOT NULL ,
[is_dynamic] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_config] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_config] PRIMARY KEY CLUSTERED
(
[config_name]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [is_dynamic] ON [phpbb_config]([is_dynamic]) ON [PRIMARY]
+CREATE INDEX [is_dynamic] ON [phpbb_config]([is_dynamic])
GO
@@ -303,18 +308,17 @@ CREATE TABLE [phpbb_confirm] (
[code] [varchar] (8) DEFAULT ('') NOT NULL ,
[seed] [int] DEFAULT (0) NOT NULL ,
[attempts] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_confirm] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_confirm] PRIMARY KEY CLUSTERED
(
[session_id],
[confirm_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [confirm_type] ON [phpbb_confirm]([confirm_type]) ON [PRIMARY]
+CREATE INDEX [confirm_type] ON [phpbb_confirm]([confirm_type])
GO
@@ -324,14 +328,13 @@ GO
CREATE TABLE [phpbb_disallow] (
[disallow_id] [int] IDENTITY (1, 1) NOT NULL ,
[disallow_username] [varchar] (255) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_disallow] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_disallow] PRIMARY KEY CLUSTERED
(
[disallow_id]
- ) ON [PRIMARY]
+ )
GO
@@ -346,17 +349,16 @@ CREATE TABLE [phpbb_drafts] (
[save_time] [int] DEFAULT (0) NOT NULL ,
[draft_subject] [varchar] (255) DEFAULT ('') NOT NULL ,
[draft_message] [text] DEFAULT ('') NOT NULL
-) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_drafts] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_drafts] PRIMARY KEY CLUSTERED
(
[draft_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [save_time] ON [phpbb_drafts]([save_time]) ON [PRIMARY]
+CREATE INDEX [save_time] ON [phpbb_drafts]([save_time])
GO
@@ -367,14 +369,13 @@ CREATE TABLE [phpbb_extensions] (
[extension_id] [int] IDENTITY (1, 1) NOT NULL ,
[group_id] [int] DEFAULT (0) NOT NULL ,
[extension] [varchar] (100) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_extensions] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_extensions] PRIMARY KEY CLUSTERED
(
[extension_id]
- ) ON [PRIMARY]
+ )
GO
@@ -391,14 +392,13 @@ CREATE TABLE [phpbb_extension_groups] (
[max_filesize] [int] DEFAULT (0) NOT NULL ,
[allowed_forums] [varchar] (8000) DEFAULT ('') NOT NULL ,
[allow_in_pm] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_extension_groups] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_extension_groups] PRIMARY KEY CLUSTERED
(
[group_id]
- ) ON [PRIMARY]
+ )
GO
@@ -448,20 +448,19 @@ CREATE TABLE [phpbb_forums] (
[prune_days] [int] DEFAULT (0) NOT NULL ,
[prune_viewed] [int] DEFAULT (0) NOT NULL ,
[prune_freq] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_forums] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_forums] PRIMARY KEY CLUSTERED
(
[forum_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [left_right_id] ON [phpbb_forums]([left_id], [right_id]) ON [PRIMARY]
+CREATE INDEX [left_right_id] ON [phpbb_forums]([left_id], [right_id])
GO
-CREATE INDEX [forum_lastpost_id] ON [phpbb_forums]([forum_last_post_id]) ON [PRIMARY]
+CREATE INDEX [forum_lastpost_id] ON [phpbb_forums]([forum_last_post_id])
GO
@@ -472,8 +471,7 @@ CREATE TABLE [phpbb_forums_access] (
[forum_id] [int] DEFAULT (0) NOT NULL ,
[user_id] [int] DEFAULT (0) NOT NULL ,
[session_id] [char] (32) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_forums_access] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_forums_access] PRIMARY KEY CLUSTERED
@@ -481,7 +479,7 @@ ALTER TABLE [phpbb_forums_access] WITH NOCHECK ADD
[forum_id],
[user_id],
[session_id]
- ) ON [PRIMARY]
+ )
GO
@@ -492,15 +490,14 @@ CREATE TABLE [phpbb_forums_track] (
[user_id] [int] DEFAULT (0) NOT NULL ,
[forum_id] [int] DEFAULT (0) NOT NULL ,
[mark_time] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_forums_track] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_forums_track] PRIMARY KEY CLUSTERED
(
[user_id],
[forum_id]
- ) ON [PRIMARY]
+ )
GO
@@ -510,17 +507,24 @@ GO
CREATE TABLE [phpbb_forums_watch] (
[forum_id] [int] DEFAULT (0) NOT NULL ,
[user_id] [int] DEFAULT (0) NOT NULL ,
- [notify_status] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
+ [notify_status] [int] DEFAULT (0) NOT NULL ,
+ [mssqlindex] [int] IDENTITY (1, 1) NOT NULL
+)GO
+
+ALTER TABLE [phpbb_forums_watch] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_forums_watch] PRIMARY KEY CLUSTERED
+ (
+ [mssqlindex]
+ )
GO
-CREATE INDEX [forum_id] ON [phpbb_forums_watch]([forum_id]) ON [PRIMARY]
+CREATE INDEX [forum_id] ON [phpbb_forums_watch]([forum_id])
GO
-CREATE INDEX [user_id] ON [phpbb_forums_watch]([user_id]) ON [PRIMARY]
+CREATE INDEX [user_id] ON [phpbb_forums_watch]([user_id])
GO
-CREATE INDEX [notify_stat] ON [phpbb_forums_watch]([notify_status]) ON [PRIMARY]
+CREATE INDEX [notify_stat] ON [phpbb_forums_watch]([notify_status])
GO
@@ -549,17 +553,16 @@ CREATE TABLE [phpbb_groups] (
[group_message_limit] [int] DEFAULT (0) NOT NULL ,
[group_max_recipients] [int] DEFAULT (0) NOT NULL ,
[group_legend] [int] DEFAULT (1) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_groups] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_groups] PRIMARY KEY CLUSTERED
(
[group_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [group_legend_name] ON [phpbb_groups]([group_legend], [group_name]) ON [PRIMARY]
+CREATE INDEX [group_legend_name] ON [phpbb_groups]([group_legend], [group_name])
GO
@@ -573,17 +576,16 @@ CREATE TABLE [phpbb_icons] (
[icons_height] [int] DEFAULT (0) NOT NULL ,
[icons_order] [int] DEFAULT (0) NOT NULL ,
[display_on_posting] [int] DEFAULT (1) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_icons] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_icons] PRIMARY KEY CLUSTERED
(
[icons_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [display_on_posting] ON [phpbb_icons]([display_on_posting]) ON [PRIMARY]
+CREATE INDEX [display_on_posting] ON [phpbb_icons]([display_on_posting])
GO
@@ -597,17 +599,16 @@ CREATE TABLE [phpbb_lang] (
[lang_english_name] [varchar] (100) DEFAULT ('') NOT NULL ,
[lang_local_name] [varchar] (255) DEFAULT ('') NOT NULL ,
[lang_author] [varchar] (255) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_lang] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_lang] PRIMARY KEY CLUSTERED
(
[lang_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [lang_iso] ON [phpbb_lang]([lang_iso]) ON [PRIMARY]
+CREATE INDEX [lang_iso] ON [phpbb_lang]([lang_iso])
GO
@@ -625,29 +626,28 @@ CREATE TABLE [phpbb_log] (
[log_time] [int] DEFAULT (0) NOT NULL ,
[log_operation] [varchar] (4000) DEFAULT ('') NOT NULL ,
[log_data] [text] DEFAULT ('') NOT NULL
-) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_log] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_log] PRIMARY KEY CLUSTERED
(
[log_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [log_type] ON [phpbb_log]([log_type]) ON [PRIMARY]
+CREATE INDEX [log_type] ON [phpbb_log]([log_type])
GO
-CREATE INDEX [forum_id] ON [phpbb_log]([forum_id]) ON [PRIMARY]
+CREATE INDEX [forum_id] ON [phpbb_log]([forum_id])
GO
-CREATE INDEX [topic_id] ON [phpbb_log]([topic_id]) ON [PRIMARY]
+CREATE INDEX [topic_id] ON [phpbb_log]([topic_id])
GO
-CREATE INDEX [reportee_id] ON [phpbb_log]([reportee_id]) ON [PRIMARY]
+CREATE INDEX [reportee_id] ON [phpbb_log]([reportee_id])
GO
-CREATE INDEX [user_id] ON [phpbb_log]([user_id]) ON [PRIMARY]
+CREATE INDEX [user_id] ON [phpbb_log]([user_id])
GO
@@ -661,20 +661,27 @@ CREATE TABLE [phpbb_login_attempts] (
[attempt_time] [int] DEFAULT (0) NOT NULL ,
[user_id] [int] DEFAULT (0) NOT NULL ,
[username] [varchar] (255) DEFAULT (0) NOT NULL ,
- [username_clean] [varchar] (255) DEFAULT (0) NOT NULL
-) ON [PRIMARY]
+ [username_clean] [varchar] (255) DEFAULT (0) NOT NULL ,
+ [mssqlindex] [int] IDENTITY (1, 1) NOT NULL
+)GO
+
+ALTER TABLE [phpbb_login_attempts] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_login_attempts] PRIMARY KEY CLUSTERED
+ (
+ [mssqlindex]
+ )
GO
-CREATE INDEX [att_ip] ON [phpbb_login_attempts]([attempt_ip], [attempt_time]) ON [PRIMARY]
+CREATE INDEX [att_ip] ON [phpbb_login_attempts]([attempt_ip], [attempt_time])
GO
-CREATE INDEX [att_for] ON [phpbb_login_attempts]([attempt_forwarded_for], [attempt_time]) ON [PRIMARY]
+CREATE INDEX [att_for] ON [phpbb_login_attempts]([attempt_forwarded_for], [attempt_time])
GO
-CREATE INDEX [att_time] ON [phpbb_login_attempts]([attempt_time]) ON [PRIMARY]
+CREATE INDEX [att_time] ON [phpbb_login_attempts]([attempt_time])
GO
-CREATE INDEX [user_id] ON [phpbb_login_attempts]([user_id]) ON [PRIMARY]
+CREATE INDEX [user_id] ON [phpbb_login_attempts]([user_id])
GO
@@ -687,14 +694,21 @@ CREATE TABLE [phpbb_moderator_cache] (
[username] [varchar] (255) DEFAULT ('') NOT NULL ,
[group_id] [int] DEFAULT (0) NOT NULL ,
[group_name] [varchar] (255) DEFAULT ('') NOT NULL ,
- [display_on_index] [int] DEFAULT (1) NOT NULL
-) ON [PRIMARY]
+ [display_on_index] [int] DEFAULT (1) NOT NULL ,
+ [mssqlindex] [int] IDENTITY (1, 1) NOT NULL
+)GO
+
+ALTER TABLE [phpbb_moderator_cache] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_moderator_cache] PRIMARY KEY CLUSTERED
+ (
+ [mssqlindex]
+ )
GO
-CREATE INDEX [disp_idx] ON [phpbb_moderator_cache]([display_on_index]) ON [PRIMARY]
+CREATE INDEX [disp_idx] ON [phpbb_moderator_cache]([display_on_index])
GO
-CREATE INDEX [forum_id] ON [phpbb_moderator_cache]([forum_id]) ON [PRIMARY]
+CREATE INDEX [forum_id] ON [phpbb_moderator_cache]([forum_id])
GO
@@ -713,23 +727,22 @@ CREATE TABLE [phpbb_modules] (
[module_langname] [varchar] (255) DEFAULT ('') NOT NULL ,
[module_mode] [varchar] (255) DEFAULT ('') NOT NULL ,
[module_auth] [varchar] (255) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_modules] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_modules] PRIMARY KEY CLUSTERED
(
[module_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [left_right_id] ON [phpbb_modules]([left_id], [right_id]) ON [PRIMARY]
+CREATE INDEX [left_right_id] ON [phpbb_modules]([left_id], [right_id])
GO
-CREATE INDEX [module_enabled] ON [phpbb_modules]([module_enabled]) ON [PRIMARY]
+CREATE INDEX [module_enabled] ON [phpbb_modules]([module_enabled])
GO
-CREATE INDEX [class_left_id] ON [phpbb_modules]([module_class], [left_id]) ON [PRIMARY]
+CREATE INDEX [class_left_id] ON [phpbb_modules]([module_class], [left_id])
GO
@@ -740,14 +753,21 @@ CREATE TABLE [phpbb_poll_options] (
[poll_option_id] [int] DEFAULT (0) NOT NULL ,
[topic_id] [int] DEFAULT (0) NOT NULL ,
[poll_option_text] [varchar] (4000) DEFAULT ('') NOT NULL ,
- [poll_option_total] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
+ [poll_option_total] [int] DEFAULT (0) NOT NULL ,
+ [mssqlindex] [int] IDENTITY (1, 1) NOT NULL
+)GO
+
+ALTER TABLE [phpbb_poll_options] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_poll_options] PRIMARY KEY CLUSTERED
+ (
+ [mssqlindex]
+ )
GO
-CREATE INDEX [poll_opt_id] ON [phpbb_poll_options]([poll_option_id]) ON [PRIMARY]
+CREATE INDEX [poll_opt_id] ON [phpbb_poll_options]([poll_option_id])
GO
-CREATE INDEX [topic_id] ON [phpbb_poll_options]([topic_id]) ON [PRIMARY]
+CREATE INDEX [topic_id] ON [phpbb_poll_options]([topic_id])
GO
@@ -758,17 +778,24 @@ CREATE TABLE [phpbb_poll_votes] (
[topic_id] [int] DEFAULT (0) NOT NULL ,
[poll_option_id] [int] DEFAULT (0) NOT NULL ,
[vote_user_id] [int] DEFAULT (0) NOT NULL ,
- [vote_user_ip] [varchar] (40) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
+ [vote_user_ip] [varchar] (40) DEFAULT ('') NOT NULL ,
+ [mssqlindex] [int] IDENTITY (1, 1) NOT NULL
+)GO
+
+ALTER TABLE [phpbb_poll_votes] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_poll_votes] PRIMARY KEY CLUSTERED
+ (
+ [mssqlindex]
+ )
GO
-CREATE INDEX [topic_id] ON [phpbb_poll_votes]([topic_id]) ON [PRIMARY]
+CREATE INDEX [topic_id] ON [phpbb_poll_votes]([topic_id])
GO
-CREATE INDEX [vote_user_id] ON [phpbb_poll_votes]([vote_user_id]) ON [PRIMARY]
+CREATE INDEX [vote_user_id] ON [phpbb_poll_votes]([vote_user_id])
GO
-CREATE INDEX [vote_user_ip] ON [phpbb_poll_votes]([vote_user_ip]) ON [PRIMARY]
+CREATE INDEX [vote_user_ip] ON [phpbb_poll_votes]([vote_user_ip])
GO
@@ -802,35 +829,34 @@ CREATE TABLE [phpbb_posts] (
[post_edit_user] [int] DEFAULT (0) NOT NULL ,
[post_edit_count] [int] DEFAULT (0) NOT NULL ,
[post_edit_locked] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_posts] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_posts] PRIMARY KEY CLUSTERED
(
[post_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [forum_id] ON [phpbb_posts]([forum_id]) ON [PRIMARY]
+CREATE INDEX [forum_id] ON [phpbb_posts]([forum_id])
GO
-CREATE INDEX [topic_id] ON [phpbb_posts]([topic_id]) ON [PRIMARY]
+CREATE INDEX [topic_id] ON [phpbb_posts]([topic_id])
GO
-CREATE INDEX [poster_ip] ON [phpbb_posts]([poster_ip]) ON [PRIMARY]
+CREATE INDEX [poster_ip] ON [phpbb_posts]([poster_ip])
GO
-CREATE INDEX [poster_id] ON [phpbb_posts]([poster_id]) ON [PRIMARY]
+CREATE INDEX [poster_id] ON [phpbb_posts]([poster_id])
GO
-CREATE INDEX [post_approved] ON [phpbb_posts]([post_approved]) ON [PRIMARY]
+CREATE INDEX [post_approved] ON [phpbb_posts]([post_approved])
GO
-CREATE INDEX [post_username] ON [phpbb_posts]([post_username]) ON [PRIMARY]
+CREATE INDEX [post_username] ON [phpbb_posts]([post_username])
GO
-CREATE INDEX [tid_post_time] ON [phpbb_posts]([topic_id], [post_time]) ON [PRIMARY]
+CREATE INDEX [tid_post_time] ON [phpbb_posts]([topic_id], [post_time])
GO
@@ -860,26 +886,25 @@ CREATE TABLE [phpbb_privmsgs] (
[to_address] [varchar] (4000) DEFAULT ('') NOT NULL ,
[bcc_address] [varchar] (4000) DEFAULT ('') NOT NULL ,
[message_reported] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_privmsgs] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_privmsgs] PRIMARY KEY CLUSTERED
(
[msg_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [author_ip] ON [phpbb_privmsgs]([author_ip]) ON [PRIMARY]
+CREATE INDEX [author_ip] ON [phpbb_privmsgs]([author_ip])
GO
-CREATE INDEX [message_time] ON [phpbb_privmsgs]([message_time]) ON [PRIMARY]
+CREATE INDEX [message_time] ON [phpbb_privmsgs]([message_time])
GO
-CREATE INDEX [author_id] ON [phpbb_privmsgs]([author_id]) ON [PRIMARY]
+CREATE INDEX [author_id] ON [phpbb_privmsgs]([author_id])
GO
-CREATE INDEX [root_level] ON [phpbb_privmsgs]([root_level]) ON [PRIMARY]
+CREATE INDEX [root_level] ON [phpbb_privmsgs]([root_level])
GO
@@ -891,17 +916,16 @@ CREATE TABLE [phpbb_privmsgs_folder] (
[user_id] [int] DEFAULT (0) NOT NULL ,
[folder_name] [varchar] (255) DEFAULT ('') NOT NULL ,
[pm_count] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_privmsgs_folder] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_privmsgs_folder] PRIMARY KEY CLUSTERED
(
[folder_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [user_id] ON [phpbb_privmsgs_folder]([user_id]) ON [PRIMARY]
+CREATE INDEX [user_id] ON [phpbb_privmsgs_folder]([user_id])
GO
@@ -918,17 +942,16 @@ CREATE TABLE [phpbb_privmsgs_rules] (
[rule_group_id] [int] DEFAULT (0) NOT NULL ,
[rule_action] [int] DEFAULT (0) NOT NULL ,
[rule_folder_id] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_privmsgs_rules] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_privmsgs_rules] PRIMARY KEY CLUSTERED
(
[rule_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [user_id] ON [phpbb_privmsgs_rules]([user_id]) ON [PRIMARY]
+CREATE INDEX [user_id] ON [phpbb_privmsgs_rules]([user_id])
GO
@@ -945,17 +968,24 @@ CREATE TABLE [phpbb_privmsgs_to] (
[pm_replied] [int] DEFAULT (0) NOT NULL ,
[pm_marked] [int] DEFAULT (0) NOT NULL ,
[pm_forwarded] [int] DEFAULT (0) NOT NULL ,
- [folder_id] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
+ [folder_id] [int] DEFAULT (0) NOT NULL ,
+ [mssqlindex] [int] IDENTITY (1, 1) NOT NULL
+)GO
+
+ALTER TABLE [phpbb_privmsgs_to] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_privmsgs_to] PRIMARY KEY CLUSTERED
+ (
+ [mssqlindex]
+ )
GO
-CREATE INDEX [msg_id] ON [phpbb_privmsgs_to]([msg_id]) ON [PRIMARY]
+CREATE INDEX [msg_id] ON [phpbb_privmsgs_to]([msg_id])
GO
-CREATE INDEX [author_id] ON [phpbb_privmsgs_to]([author_id]) ON [PRIMARY]
+CREATE INDEX [author_id] ON [phpbb_privmsgs_to]([author_id])
GO
-CREATE INDEX [usr_flder_id] ON [phpbb_privmsgs_to]([user_id], [folder_id]) ON [PRIMARY]
+CREATE INDEX [usr_flder_id] ON [phpbb_privmsgs_to]([user_id], [folder_id])
GO
@@ -982,20 +1012,19 @@ CREATE TABLE [phpbb_profile_fields] (
[field_no_view] [int] DEFAULT (0) NOT NULL ,
[field_active] [int] DEFAULT (0) NOT NULL ,
[field_order] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_profile_fields] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_profile_fields] PRIMARY KEY CLUSTERED
(
[field_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [fld_type] ON [phpbb_profile_fields]([field_type]) ON [PRIMARY]
+CREATE INDEX [fld_type] ON [phpbb_profile_fields]([field_type])
GO
-CREATE INDEX [fld_ordr] ON [phpbb_profile_fields]([field_order]) ON [PRIMARY]
+CREATE INDEX [fld_ordr] ON [phpbb_profile_fields]([field_order])
GO
@@ -1004,14 +1033,13 @@ GO
*/
CREATE TABLE [phpbb_profile_fields_data] (
[user_id] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_profile_fields_data] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_profile_fields_data] PRIMARY KEY CLUSTERED
(
[user_id]
- ) ON [PRIMARY]
+ )
GO
@@ -1024,8 +1052,7 @@ CREATE TABLE [phpbb_profile_fields_lang] (
[option_id] [int] DEFAULT (0) NOT NULL ,
[field_type] [int] DEFAULT (0) NOT NULL ,
[lang_value] [varchar] (255) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_profile_fields_lang] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_profile_fields_lang] PRIMARY KEY CLUSTERED
@@ -1033,7 +1060,7 @@ ALTER TABLE [phpbb_profile_fields_lang] WITH NOCHECK ADD
[field_id],
[lang_id],
[option_id]
- ) ON [PRIMARY]
+ )
GO
@@ -1046,15 +1073,14 @@ CREATE TABLE [phpbb_profile_lang] (
[lang_name] [varchar] (255) DEFAULT ('') NOT NULL ,
[lang_explain] [varchar] (4000) DEFAULT ('') NOT NULL ,
[lang_default_value] [varchar] (255) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_profile_lang] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_profile_lang] PRIMARY KEY CLUSTERED
(
[field_id],
[lang_id]
- ) ON [PRIMARY]
+ )
GO
@@ -1067,14 +1093,13 @@ CREATE TABLE [phpbb_ranks] (
[rank_min] [int] DEFAULT (0) NOT NULL ,
[rank_special] [int] DEFAULT (0) NOT NULL ,
[rank_image] [varchar] (255) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_ranks] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_ranks] PRIMARY KEY CLUSTERED
(
[rank_id]
- ) ON [PRIMARY]
+ )
GO
@@ -1091,20 +1116,19 @@ CREATE TABLE [phpbb_reports] (
[report_closed] [int] DEFAULT (0) NOT NULL ,
[report_time] [int] DEFAULT (0) NOT NULL ,
[report_text] [text] DEFAULT ('') NOT NULL
-) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_reports] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_reports] PRIMARY KEY CLUSTERED
(
[report_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [post_id] ON [phpbb_reports]([post_id]) ON [PRIMARY]
+CREATE INDEX [post_id] ON [phpbb_reports]([post_id])
GO
-CREATE INDEX [pm_id] ON [phpbb_reports]([pm_id]) ON [PRIMARY]
+CREATE INDEX [pm_id] ON [phpbb_reports]([pm_id])
GO
@@ -1116,14 +1140,13 @@ CREATE TABLE [phpbb_reports_reasons] (
[reason_title] [varchar] (255) DEFAULT ('') NOT NULL ,
[reason_description] [text] DEFAULT ('') NOT NULL ,
[reason_order] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_reports_reasons] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_reports_reasons] PRIMARY KEY CLUSTERED
(
[reason_id]
- ) ON [PRIMARY]
+ )
GO
@@ -1135,14 +1158,13 @@ CREATE TABLE [phpbb_search_results] (
[search_time] [int] DEFAULT (0) NOT NULL ,
[search_keywords] [text] DEFAULT ('') NOT NULL ,
[search_authors] [text] DEFAULT ('') NOT NULL
-) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_search_results] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_search_results] PRIMARY KEY CLUSTERED
(
[search_key]
- ) ON [PRIMARY]
+ )
GO
@@ -1154,20 +1176,19 @@ CREATE TABLE [phpbb_search_wordlist] (
[word_text] [varchar] (255) DEFAULT ('') NOT NULL ,
[word_common] [int] DEFAULT (0) NOT NULL ,
[word_count] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_search_wordlist] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_search_wordlist] PRIMARY KEY CLUSTERED
(
[word_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE UNIQUE INDEX [wrd_txt] ON [phpbb_search_wordlist]([word_text]) ON [PRIMARY]
+CREATE UNIQUE INDEX [wrd_txt] ON [phpbb_search_wordlist]([word_text])
GO
-CREATE INDEX [wrd_cnt] ON [phpbb_search_wordlist]([word_count]) ON [PRIMARY]
+CREATE INDEX [wrd_cnt] ON [phpbb_search_wordlist]([word_count])
GO
@@ -1177,17 +1198,24 @@ GO
CREATE TABLE [phpbb_search_wordmatch] (
[post_id] [int] DEFAULT (0) NOT NULL ,
[word_id] [int] DEFAULT (0) NOT NULL ,
- [title_match] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
+ [title_match] [int] DEFAULT (0) NOT NULL ,
+ [mssqlindex] [int] IDENTITY (1, 1) NOT NULL
+)GO
+
+ALTER TABLE [phpbb_search_wordmatch] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_search_wordmatch] PRIMARY KEY CLUSTERED
+ (
+ [mssqlindex]
+ )
GO
-CREATE UNIQUE INDEX [unq_mtch] ON [phpbb_search_wordmatch]([word_id], [post_id], [title_match]) ON [PRIMARY]
+CREATE UNIQUE INDEX [unq_mtch] ON [phpbb_search_wordmatch]([word_id], [post_id], [title_match])
GO
-CREATE INDEX [word_id] ON [phpbb_search_wordmatch]([word_id]) ON [PRIMARY]
+CREATE INDEX [word_id] ON [phpbb_search_wordmatch]([word_id])
GO
-CREATE INDEX [post_id] ON [phpbb_search_wordmatch]([post_id]) ON [PRIMARY]
+CREATE INDEX [post_id] ON [phpbb_search_wordmatch]([post_id])
GO
@@ -1208,23 +1236,22 @@ CREATE TABLE [phpbb_sessions] (
[session_viewonline] [int] DEFAULT (1) NOT NULL ,
[session_autologin] [int] DEFAULT (0) NOT NULL ,
[session_admin] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_sessions] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_sessions] PRIMARY KEY CLUSTERED
(
[session_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [session_time] ON [phpbb_sessions]([session_time]) ON [PRIMARY]
+CREATE INDEX [session_time] ON [phpbb_sessions]([session_time])
GO
-CREATE INDEX [session_user_id] ON [phpbb_sessions]([session_user_id]) ON [PRIMARY]
+CREATE INDEX [session_user_id] ON [phpbb_sessions]([session_user_id])
GO
-CREATE INDEX [session_fid] ON [phpbb_sessions]([session_forum_id]) ON [PRIMARY]
+CREATE INDEX [session_fid] ON [phpbb_sessions]([session_forum_id])
GO
@@ -1236,18 +1263,17 @@ CREATE TABLE [phpbb_sessions_keys] (
[user_id] [int] DEFAULT (0) NOT NULL ,
[last_ip] [varchar] (40) DEFAULT ('') NOT NULL ,
[last_login] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_sessions_keys] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_sessions_keys] PRIMARY KEY CLUSTERED
(
[key_id],
[user_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [last_login] ON [phpbb_sessions_keys]([last_login]) ON [PRIMARY]
+CREATE INDEX [last_login] ON [phpbb_sessions_keys]([last_login])
GO
@@ -1259,14 +1285,13 @@ CREATE TABLE [phpbb_sitelist] (
[site_ip] [varchar] (40) DEFAULT ('') NOT NULL ,
[site_hostname] [varchar] (255) DEFAULT ('') NOT NULL ,
[ip_exclude] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_sitelist] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_sitelist] PRIMARY KEY CLUSTERED
(
[site_id]
- ) ON [PRIMARY]
+ )
GO
@@ -1282,17 +1307,16 @@ CREATE TABLE [phpbb_smilies] (
[smiley_height] [int] DEFAULT (0) NOT NULL ,
[smiley_order] [int] DEFAULT (0) NOT NULL ,
[display_on_posting] [int] DEFAULT (1) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_smilies] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_smilies] PRIMARY KEY CLUSTERED
(
[smiley_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [display_on_post] ON [phpbb_smilies]([display_on_posting]) ON [PRIMARY]
+CREATE INDEX [display_on_post] ON [phpbb_smilies]([display_on_posting])
GO
@@ -1307,26 +1331,25 @@ CREATE TABLE [phpbb_styles] (
[template_id] [int] DEFAULT (0) NOT NULL ,
[theme_id] [int] DEFAULT (0) NOT NULL ,
[imageset_id] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_styles] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_styles] PRIMARY KEY CLUSTERED
(
[style_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE UNIQUE INDEX [style_name] ON [phpbb_styles]([style_name]) ON [PRIMARY]
+CREATE UNIQUE INDEX [style_name] ON [phpbb_styles]([style_name])
GO
-CREATE INDEX [template_id] ON [phpbb_styles]([template_id]) ON [PRIMARY]
+CREATE INDEX [template_id] ON [phpbb_styles]([template_id])
GO
-CREATE INDEX [theme_id] ON [phpbb_styles]([theme_id]) ON [PRIMARY]
+CREATE INDEX [theme_id] ON [phpbb_styles]([theme_id])
GO
-CREATE INDEX [imageset_id] ON [phpbb_styles]([imageset_id]) ON [PRIMARY]
+CREATE INDEX [imageset_id] ON [phpbb_styles]([imageset_id])
GO
@@ -1342,17 +1365,16 @@ CREATE TABLE [phpbb_styles_template] (
[template_storedb] [int] DEFAULT (0) NOT NULL ,
[template_inherits_id] [int] DEFAULT (0) NOT NULL ,
[template_inherit_path] [varchar] (255) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_styles_template] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_styles_template] PRIMARY KEY CLUSTERED
(
[template_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE UNIQUE INDEX [tmplte_nm] ON [phpbb_styles_template]([template_name]) ON [PRIMARY]
+CREATE UNIQUE INDEX [tmplte_nm] ON [phpbb_styles_template]([template_name])
GO
@@ -1364,14 +1386,21 @@ CREATE TABLE [phpbb_styles_template_data] (
[template_filename] [varchar] (100) DEFAULT ('') NOT NULL ,
[template_included] [varchar] (8000) DEFAULT ('') NOT NULL ,
[template_mtime] [int] DEFAULT (0) NOT NULL ,
- [template_data] [text] DEFAULT ('') NOT NULL
-) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+ [template_data] [text] DEFAULT ('') NOT NULL ,
+ [mssqlindex] [int] IDENTITY (1, 1) NOT NULL
+)GO
+
+ALTER TABLE [phpbb_styles_template_data] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_styles_template_data] PRIMARY KEY CLUSTERED
+ (
+ [mssqlindex]
+ )
GO
-CREATE INDEX [tid] ON [phpbb_styles_template_data]([template_id]) ON [PRIMARY]
+CREATE INDEX [tid] ON [phpbb_styles_template_data]([template_id])
GO
-CREATE INDEX [tfn] ON [phpbb_styles_template_data]([template_filename]) ON [PRIMARY]
+CREATE INDEX [tfn] ON [phpbb_styles_template_data]([template_filename])
GO
@@ -1386,17 +1415,16 @@ CREATE TABLE [phpbb_styles_theme] (
[theme_storedb] [int] DEFAULT (0) NOT NULL ,
[theme_mtime] [int] DEFAULT (0) NOT NULL ,
[theme_data] [text] DEFAULT ('') NOT NULL
-) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_styles_theme] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_styles_theme] PRIMARY KEY CLUSTERED
(
[theme_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE UNIQUE INDEX [theme_name] ON [phpbb_styles_theme]([theme_name]) ON [PRIMARY]
+CREATE UNIQUE INDEX [theme_name] ON [phpbb_styles_theme]([theme_name])
GO
@@ -1408,17 +1436,16 @@ CREATE TABLE [phpbb_styles_imageset] (
[imageset_name] [varchar] (255) DEFAULT ('') NOT NULL ,
[imageset_copyright] [varchar] (255) DEFAULT ('') NOT NULL ,
[imageset_path] [varchar] (100) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_styles_imageset] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_styles_imageset] PRIMARY KEY CLUSTERED
(
[imageset_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE UNIQUE INDEX [imgset_nm] ON [phpbb_styles_imageset]([imageset_name]) ON [PRIMARY]
+CREATE UNIQUE INDEX [imgset_nm] ON [phpbb_styles_imageset]([imageset_name])
GO
@@ -1433,17 +1460,16 @@ CREATE TABLE [phpbb_styles_imageset_data] (
[image_height] [int] DEFAULT (0) NOT NULL ,
[image_width] [int] DEFAULT (0) NOT NULL ,
[imageset_id] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_styles_imageset_data] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_styles_imageset_data] PRIMARY KEY CLUSTERED
(
[image_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [i_d] ON [phpbb_styles_imageset_data]([imageset_id]) ON [PRIMARY]
+CREATE INDEX [i_d] ON [phpbb_styles_imageset_data]([imageset_id])
GO
@@ -1485,32 +1511,31 @@ CREATE TABLE [phpbb_topics] (
[poll_max_options] [int] DEFAULT (1) NOT NULL ,
[poll_last_vote] [int] DEFAULT (0) NOT NULL ,
[poll_vote_change] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_topics] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_topics] PRIMARY KEY CLUSTERED
(
[topic_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [forum_id] ON [phpbb_topics]([forum_id]) ON [PRIMARY]
+CREATE INDEX [forum_id] ON [phpbb_topics]([forum_id])
GO
-CREATE INDEX [forum_id_type] ON [phpbb_topics]([forum_id], [topic_type]) ON [PRIMARY]
+CREATE INDEX [forum_id_type] ON [phpbb_topics]([forum_id], [topic_type])
GO
-CREATE INDEX [last_post_time] ON [phpbb_topics]([topic_last_post_time]) ON [PRIMARY]
+CREATE INDEX [last_post_time] ON [phpbb_topics]([topic_last_post_time])
GO
-CREATE INDEX [topic_approved] ON [phpbb_topics]([topic_approved]) ON [PRIMARY]
+CREATE INDEX [topic_approved] ON [phpbb_topics]([topic_approved])
GO
-CREATE INDEX [forum_appr_last] ON [phpbb_topics]([forum_id], [topic_approved], [topic_last_post_id]) ON [PRIMARY]
+CREATE INDEX [forum_appr_last] ON [phpbb_topics]([forum_id], [topic_approved], [topic_last_post_id])
GO
-CREATE INDEX [fid_time_moved] ON [phpbb_topics]([forum_id], [topic_last_post_time], [topic_moved_id]) ON [PRIMARY]
+CREATE INDEX [fid_time_moved] ON [phpbb_topics]([forum_id], [topic_last_post_time], [topic_moved_id])
GO
@@ -1522,21 +1547,20 @@ CREATE TABLE [phpbb_topics_track] (
[topic_id] [int] DEFAULT (0) NOT NULL ,
[forum_id] [int] DEFAULT (0) NOT NULL ,
[mark_time] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_topics_track] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_topics_track] PRIMARY KEY CLUSTERED
(
[user_id],
[topic_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [topic_id] ON [phpbb_topics_track]([topic_id]) ON [PRIMARY]
+CREATE INDEX [topic_id] ON [phpbb_topics_track]([topic_id])
GO
-CREATE INDEX [forum_id] ON [phpbb_topics_track]([forum_id]) ON [PRIMARY]
+CREATE INDEX [forum_id] ON [phpbb_topics_track]([forum_id])
GO
@@ -1547,15 +1571,14 @@ CREATE TABLE [phpbb_topics_posted] (
[user_id] [int] DEFAULT (0) NOT NULL ,
[topic_id] [int] DEFAULT (0) NOT NULL ,
[topic_posted] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_topics_posted] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_topics_posted] PRIMARY KEY CLUSTERED
(
[user_id],
[topic_id]
- ) ON [PRIMARY]
+ )
GO
@@ -1565,17 +1588,24 @@ GO
CREATE TABLE [phpbb_topics_watch] (
[topic_id] [int] DEFAULT (0) NOT NULL ,
[user_id] [int] DEFAULT (0) NOT NULL ,
- [notify_status] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
+ [notify_status] [int] DEFAULT (0) NOT NULL ,
+ [mssqlindex] [int] IDENTITY (1, 1) NOT NULL
+)GO
+
+ALTER TABLE [phpbb_topics_watch] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_topics_watch] PRIMARY KEY CLUSTERED
+ (
+ [mssqlindex]
+ )
GO
-CREATE INDEX [topic_id] ON [phpbb_topics_watch]([topic_id]) ON [PRIMARY]
+CREATE INDEX [topic_id] ON [phpbb_topics_watch]([topic_id])
GO
-CREATE INDEX [user_id] ON [phpbb_topics_watch]([user_id]) ON [PRIMARY]
+CREATE INDEX [user_id] ON [phpbb_topics_watch]([user_id])
GO
-CREATE INDEX [notify_stat] ON [phpbb_topics_watch]([notify_status]) ON [PRIMARY]
+CREATE INDEX [notify_stat] ON [phpbb_topics_watch]([notify_status])
GO
@@ -1586,17 +1616,24 @@ CREATE TABLE [phpbb_user_group] (
[group_id] [int] DEFAULT (0) NOT NULL ,
[user_id] [int] DEFAULT (0) NOT NULL ,
[group_leader] [int] DEFAULT (0) NOT NULL ,
- [user_pending] [int] DEFAULT (1) NOT NULL
-) ON [PRIMARY]
+ [user_pending] [int] DEFAULT (1) NOT NULL ,
+ [mssqlindex] [int] IDENTITY (1, 1) NOT NULL
+)GO
+
+ALTER TABLE [phpbb_user_group] WITH NOCHECK ADD
+ CONSTRAINT [PK_phpbb_user_group] PRIMARY KEY CLUSTERED
+ (
+ [mssqlindex]
+ )
GO
-CREATE INDEX [group_id] ON [phpbb_user_group]([group_id]) ON [PRIMARY]
+CREATE INDEX [group_id] ON [phpbb_user_group]([group_id])
GO
-CREATE INDEX [user_id] ON [phpbb_user_group]([user_id]) ON [PRIMARY]
+CREATE INDEX [user_id] ON [phpbb_user_group]([user_id])
GO
-CREATE INDEX [group_leader] ON [phpbb_user_group]([group_leader]) ON [PRIMARY]
+CREATE INDEX [group_leader] ON [phpbb_user_group]([group_leader])
GO
@@ -1680,26 +1717,25 @@ CREATE TABLE [phpbb_users] (
[user_new] [int] DEFAULT (1) NOT NULL ,
[user_reminded] [int] DEFAULT (0) NOT NULL ,
[user_reminded_time] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_users] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_users] PRIMARY KEY CLUSTERED
(
[user_id]
- ) ON [PRIMARY]
+ )
GO
-CREATE INDEX [user_birthday] ON [phpbb_users]([user_birthday]) ON [PRIMARY]
+CREATE INDEX [user_birthday] ON [phpbb_users]([user_birthday])
GO
-CREATE INDEX [user_email_hash] ON [phpbb_users]([user_email_hash]) ON [PRIMARY]
+CREATE INDEX [user_email_hash] ON [phpbb_users]([user_email_hash])
GO
-CREATE INDEX [user_type] ON [phpbb_users]([user_type]) ON [PRIMARY]
+CREATE INDEX [user_type] ON [phpbb_users]([user_type])
GO
-CREATE UNIQUE INDEX [username_clean] ON [phpbb_users]([username_clean]) ON [PRIMARY]
+CREATE UNIQUE INDEX [username_clean] ON [phpbb_users]([username_clean])
GO
@@ -1712,14 +1748,13 @@ CREATE TABLE [phpbb_warnings] (
[post_id] [int] DEFAULT (0) NOT NULL ,
[log_id] [int] DEFAULT (0) NOT NULL ,
[warning_time] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_warnings] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_warnings] PRIMARY KEY CLUSTERED
(
[warning_id]
- ) ON [PRIMARY]
+ )
GO
@@ -1730,14 +1765,13 @@ CREATE TABLE [phpbb_words] (
[word_id] [int] IDENTITY (1, 1) NOT NULL ,
[word] [varchar] (255) DEFAULT ('') NOT NULL ,
[replacement] [varchar] (255) DEFAULT ('') NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_words] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_words] PRIMARY KEY CLUSTERED
(
[word_id]
- ) ON [PRIMARY]
+ )
GO
@@ -1749,15 +1783,14 @@ CREATE TABLE [phpbb_zebra] (
[zebra_id] [int] DEFAULT (0) NOT NULL ,
[friend] [int] DEFAULT (0) NOT NULL ,
[foe] [int] DEFAULT (0) NOT NULL
-) ON [PRIMARY]
-GO
+)GO
ALTER TABLE [phpbb_zebra] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_zebra] PRIMARY KEY CLUSTERED
(
[user_id],
[zebra_id]
- ) ON [PRIMARY]
+ )
GO
diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql
index e1b36e64a2..b266025c86 100644
--- a/phpBB/install/schemas/schema_data.sql
+++ b/phpBB/install/schemas/schema_data.sql
@@ -668,7 +668,7 @@ INSERT INTO phpbb_acl_groups (group_id, forum_id, auth_option_id, auth_role_id,
# Bots having bot access
INSERT INTO phpbb_acl_groups (group_id, forum_id, auth_option_id, auth_role_id, auth_setting) VALUES (6, 2, 0, 19, 0);
-# NEW MEMBERS aren't allowed to PM
+# NEW MEMBERS are not allowed to send private messages
INSERT INTO phpbb_acl_groups (group_id, forum_id, auth_option_id, auth_role_id, auth_setting) VALUES (7, 0, 0, 23, 0);
# NEW MEMBERS on the queue
diff --git a/phpBB/language/en/acp/ban.php b/phpBB/language/en/acp/ban.php
index 7b2ef59a7a..bc547b6d8f 100644
--- a/phpBB/language/en/acp/ban.php
+++ b/phpBB/language/en/acp/ban.php
@@ -74,11 +74,11 @@ $lang = array_merge($lang, array(
'PERMANENT' => 'Permanent',
'UNTIL' => 'Until',
- 'USER_BAN' => 'Ban one or more usernames',
+ 'USER_BAN' => 'Ban one or more users by username',
'USER_BAN_EXCLUDE_EXPLAIN' => 'Enable this to exclude the entered users from all current bans.',
'USER_BAN_EXPLAIN' => 'You can ban multiple users in one go by entering each name on a new line. Use the <span style="text-decoration: underline;">Find a member</span> facility to look up and add one or more users automatically.',
'USER_NO_BANNED' => 'No banned usernames',
- 'USER_UNBAN' => 'Un-ban or un-exclude usernames',
+ 'USER_UNBAN' => 'Un-ban or un-exclude users by username',
'USER_UNBAN_EXPLAIN' => 'You can unban (or un-exclude) multiple users in one go using the appropriate combination of mouse and keyboard for your computer and browser. Excluded users are emphasised.',
));
diff --git a/phpBB/language/en/acp/board.php b/phpBB/language/en/acp/board.php
index ccd12fcb6a..e109ea6d3a 100644
--- a/phpBB/language/en/acp/board.php
+++ b/phpBB/language/en/acp/board.php
@@ -44,7 +44,7 @@ $lang = array_merge($lang, array(
'DEFAULT_LANGUAGE' => 'Default language',
'DEFAULT_STYLE' => 'Default style',
'DISABLE_BOARD' => 'Disable board',
- 'DISABLE_BOARD_EXPLAIN' => 'This will make the board unavailable to users. You can also enter a short (255 character) message to display if you wish.',
+ 'DISABLE_BOARD_EXPLAIN' => 'This will make the board unavailable to users who are neither administrators nor moderators. You can also enter a short (255 character) message to display if you wish.',
'OVERRIDE_STYLE' => 'Override user style',
'OVERRIDE_STYLE_EXPLAIN' => 'Replaces user’s style with the default.',
'SITE_DESC' => 'Site description',
@@ -104,7 +104,7 @@ $lang = array_merge($lang, array(
'AVATAR_GALLERY_PATH' => 'Avatar gallery path',
'AVATAR_GALLERY_PATH_EXPLAIN' => 'Path under your phpBB root directory for pre-loaded images, e.g. <samp>images/avatars/gallery</samp>.',
'AVATAR_STORAGE_PATH' => 'Avatar storage path',
- 'AVATAR_STORAGE_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/avatars/upload</samp>.',
+ 'AVATAR_STORAGE_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/avatars/upload</samp>.<br />Avatar uploading <strong>will not be available</strong> if this path is not writable.',
'MAX_AVATAR_SIZE' => 'Maximum avatar dimensions',
'MAX_AVATAR_SIZE_EXPLAIN' => 'Width x Height in pixels.',
'MAX_FILESIZE' => 'Maximum avatar file size',
diff --git a/phpBB/language/en/acp/common.php b/phpBB/language/en/acp/common.php
index 04d614c80d..f2ab15335d 100644
--- a/phpBB/language/en/acp/common.php
+++ b/phpBB/language/en/acp/common.php
@@ -50,7 +50,7 @@ $lang = array_merge($lang, array(
'ACP_BAN' => 'Banning',
'ACP_BAN_EMAILS' => 'Ban e-mails',
'ACP_BAN_IPS' => 'Ban IPs',
- 'ACP_BAN_USERNAMES' => 'Ban usernames',
+ 'ACP_BAN_USERNAMES' => 'Ban users',
'ACP_BBCODES' => 'BBCodes',
'ACP_BOARD_CONFIGURATION' => 'Board configuration',
'ACP_BOARD_FEATURES' => 'Board features',
diff --git a/phpBB/language/en/acp/users.php b/phpBB/language/en/acp/users.php
index 3b82a7022d..25e5ff8269 100644
--- a/phpBB/language/en/acp/users.php
+++ b/phpBB/language/en/acp/users.php
@@ -52,6 +52,7 @@ $lang = array_merge($lang, array(
'CANNOT_FORCE_REACT_FOUNDER' => 'You are not allowed to force reactivation on founder accounts.',
'CANNOT_FORCE_REACT_YOURSELF' => 'You are not allowed to force reactivation of your own account.',
'CANNOT_REMOVE_ANONYMOUS' => 'You are not able to remove the guest user account.',
+ 'CANNOT_REMOVE_FOUNDER' => 'You are not allowed to remove founder accounts.',
'CANNOT_REMOVE_YOURSELF' => 'You are not allowed to remove your own user account.',
'CANNOT_SET_FOUNDER_IGNORED' => 'You are not able to promote ignored users to be founders.',
'CANNOT_SET_FOUNDER_INACTIVE' => 'You need to activate users before you promote them to founders, only activated users are able to be promoted.',
diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php
index f37f6d3b30..0bf48eb841 100644
--- a/phpBB/language/en/common.php
+++ b/phpBB/language/en/common.php
@@ -341,6 +341,9 @@ $lang = array_merge($lang, array(
'MODERATE' => 'Moderate',
'MODERATOR' => 'Moderator',
'MODERATORS' => 'Moderators',
+ 'MODULE_NOT_ACCESS' => 'Module not accessible',
+ 'MODULE_NOT_FIND' => 'Cannot find module %s',
+ 'MODULE_FILE_INCORRECT_CLASS' => 'Module file %s does not contain correct class [%s]',
'MONTH' => 'Month',
'MOVE' => 'Move',
'MSNM' => 'MSNM/WLM',
@@ -651,7 +654,7 @@ $lang = array_merge($lang, array(
'TOTAL_USERS_ZERO' => 'Total members <strong>0</strong>',
'TRACKED_PHP_ERROR' => 'Tracked PHP errors: %s',
- 'UNABLE_GET_IMAGE_SIZE' => 'It was not possible to determine the dimensions of the image.',
+ 'UNABLE_GET_IMAGE_SIZE' => 'It was not possible to determine the dimensions of the image. Please verify that the URL you entered is correct.',
'UNABLE_TO_DELIVER_FILE'=> 'Unable to deliver file.',
'UNKNOWN_BROWSER' => 'Unknown browser',
'UNMARK_ALL' => 'Unmark all',
diff --git a/phpBB/language/en/email/topic_notify.txt b/phpBB/language/en/email/topic_notify.txt
index 99865494ac..f52ce9395d 100644
--- a/phpBB/language/en/email/topic_notify.txt
+++ b/phpBB/language/en/email/topic_notify.txt
@@ -2,7 +2,7 @@ Subject: Topic reply notification - "{TOPIC_TITLE}"
Hello {USERNAME},
-You are receiving this notification because you are watching the topic "{TOPIC_TITLE}" at "{SITENAME}". This topic has received a reply<!-- IF AUTHOR_NAME !== '' --> by {AUTHOR_NAME}<!-- ENDIF --> since your last visit. You can use the following link to view the replies made, no more notifications will be sent until you visit the topic.
+You are receiving this notification because you are watching the topic "{TOPIC_TITLE}" at "{SITENAME}". This topic has received a reply<!-- IF AUTHOR_NAME !== '' --> by {AUTHOR_NAME}<!-- ENDIF --> since your last visit. No more notifications will be sent until you visit the topic.
If you want to view the newest post made since your last visit, click the following link:
{U_NEWEST_POST}
@@ -14,7 +14,6 @@ If you want to view the forum, click the following link:
{U_FORUM}
If you no longer wish to watch this topic you can either click the "Unsubscribe topic" link found at the bottom of the topic above, or by clicking the following link:
-
{U_STOP_WATCHING_TOPIC}
{EMAIL_SIG} \ No newline at end of file
diff --git a/phpBB/language/en/memberlist.php b/phpBB/language/en/memberlist.php
index 7dc5e6b74a..f59efd3b95 100644
--- a/phpBB/language/en/memberlist.php
+++ b/phpBB/language/en/memberlist.php
@@ -138,6 +138,7 @@ $lang = array_merge($lang, array(
),
'USER_ONLINE' => 'Online',
'USER_PRESENCE' => 'Board presence',
+ 'USERS_PER_PAGE' => 'Users per page',
'VIEWING_PROFILE' => 'Viewing profile - %s',
'VISITED' => 'Last visited',
diff --git a/phpBB/search.php b/phpBB/search.php
index ad9c371f63..d0d86fac17 100644
--- a/phpBB/search.php
+++ b/phpBB/search.php
@@ -540,12 +540,6 @@ if ($keywords || $author || $author_id || $search_id || $submit)
$total_match_count = $search->author_search($show_results, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_id_ary, $sql_author_match, $id_ary, $start, $per_page);
}
- // For some searches we need to print out the "no results" page directly to allow re-sorting/refining the search options.
- if (!sizeof($id_ary) && !$search_id)
- {
- trigger_error('NO_SEARCH_RESULTS');
- }
-
$sql_where = '';
if (sizeof($id_ary))
@@ -580,9 +574,9 @@ if ($keywords || $author || $author_id || $search_id || $submit)
}
// define some vars for urls
- $hilit = implode('|', explode(' ', preg_replace('#\s+#u', ' ', str_replace(array('+', '-', '|', '(', ')', '&quot;'), ' ', $keywords))));
- // Do not allow *only* wildcard being used for hilight
- $hilit = (strspn($hilit, '*') === strlen($hilit)) ? '' : $hilit;
+ // A single wildcard will make the search results look ugly
+ $hilit = phpbb_clean_search_string(str_replace(array('+', '-', '|', '(', ')', '&quot;'), ' ', $keywords));
+ $hilit = str_replace(' ', '|', $hilit);
$u_hilit = urlencode(htmlspecialchars_decode(str_replace('|', ' ', $hilit)));
$u_show_results = '&amp;sr=' . $show_results;
@@ -846,7 +840,8 @@ if ($keywords || $author || $author_id || $search_id || $submit)
$hilit_array = array_filter(explode('|', $hilit), 'strlen');
foreach ($hilit_array as $key => $value)
{
- $hilit_array[$key] = str_replace('\*', '\w*?', preg_quote($value, '#'));
+ $hilit_array[$key] = phpbb_clean_search_string($value);
+ $hilit_array[$key] = str_replace('\*', '\w*?', preg_quote($hilit_array[$key], '#'));
$hilit_array[$key] = preg_replace('#(^|\s)\\\\w\*\?(\s|$)#', '$1\w+?$2', $hilit_array[$key]);
}
$hilit = implode('|', $hilit_array);
diff --git a/phpBB/styles/prosilver/style.cfg b/phpBB/styles/prosilver/style.cfg
index 811e5f4376..abd5a5dd22 100644
--- a/phpBB/styles/prosilver/style.cfg
+++ b/phpBB/styles/prosilver/style.cfg
@@ -18,5 +18,5 @@
# General Information about this style
name = prosilver
-copyright = &copy; phpBB Group, 2007
-version = 3.0.12 \ No newline at end of file
+copyright = © phpBB Group, 2007
+version = 3.0.12
diff --git a/phpBB/styles/prosilver/template/editor.js b/phpBB/styles/prosilver/template/editor.js
index c16b0ef703..42be70be92 100644
--- a/phpBB/styles/prosilver/template/editor.js
+++ b/phpBB/styles/prosilver/template/editor.js
@@ -347,7 +347,7 @@ function mozWrap(txtarea, open, close)
*/
function storeCaret(textEl)
{
- if (textEl.createTextRange)
+ if (textEl.createTextRange && document.selection)
{
textEl.caretPos = document.selection.createRange().duplicate();
}
diff --git a/phpBB/styles/prosilver/template/forum_fn.js b/phpBB/styles/prosilver/template/forum_fn.js
index 240fe7e51d..6a65caf6f6 100644
--- a/phpBB/styles/prosilver/template/forum_fn.js
+++ b/phpBB/styles/prosilver/template/forum_fn.js
@@ -403,7 +403,7 @@ function apply_onkeypress_event()
// jQuery code in case jQuery is used
if (jquery_present)
{
- jQuery('form input[type=text], form input[type=password]').live('keypress', function (e)
+ jQuery('form input[type=text], form input[type=password]').on('keypress', function (e)
{
var default_button = jQuery(this).parents('form').find('input[type=submit].default-submit-action');
diff --git a/phpBB/styles/prosilver/template/overall_footer.html b/phpBB/styles/prosilver/template/overall_footer.html
index 25b60be6e1..fc6a37cbe3 100644
--- a/phpBB/styles/prosilver/template/overall_footer.html
+++ b/phpBB/styles/prosilver/template/overall_footer.html
@@ -6,7 +6,7 @@
<div class="inner"><span class="corners-top"><span></span></span>
<ul class="linklist">
- <li class="icon-home"><a href="{U_INDEX}" accesskey="h">{L_INDEX}</a></li>
+ <li class="icon-home"><a href="{U_INDEX}">{L_INDEX}</a></li>
<!-- IF not S_IS_BOT -->
<!-- IF S_WATCH_FORUM_LINK --><li <!-- IF S_WATCHING_FORUM -->class="icon-unsubscribe"<!-- ELSE -->class="icon-subscribe"<!-- ENDIF -->><a href="{S_WATCH_FORUM_LINK}" title="{S_WATCH_FORUM_TITLE}">{S_WATCH_FORUM_TITLE}</a></li><!-- ENDIF -->
<!-- IF U_WATCH_TOPIC --><li <!-- IF S_WATCHING_TOPIC -->class="icon-unsubscribe"<!-- ELSE -->class="icon-subscribe"<!-- ENDIF -->><a href="{U_WATCH_TOPIC}" title="{L_WATCH_TOPIC}">{L_WATCH_TOPIC}</a></li><!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/ucp_groups_manage.html b/phpBB/styles/prosilver/template/ucp_groups_manage.html
index c90461312e..53d2dfffb3 100644
--- a/phpBB/styles/prosilver/template/ucp_groups_manage.html
+++ b/phpBB/styles/prosilver/template/ucp_groups_manage.html
@@ -54,7 +54,7 @@
<fieldset>
<dl>
<dt><label for="group_colour">{L_GROUP_COLOR}:</label><br /><span>{L_GROUP_COLOR_EXPLAIN}</span></dt>
- <dd><input name="group_colour" type="text" id="group_colour" value="{GROUP_COLOUR}" size="6" maxlength="6" class="inputbox narrow" /> <span style="background-color: {GROUP_COLOUR};">&nbsp;&nbsp;&nbsp;</span> [ <a href="{U_SWATCH}" onclick="popup(this.href, 636, 150, '_swatch'); return false;">{L_COLOUR_SWATCH}</a> ]</dd>
+ <dd><input name="group_colour" type="text" id="group_colour" value="{GROUP_COLOUR}" size="6" maxlength="6" class="inputbox narrow" /> <span style="background-color: #{GROUP_COLOUR};">&nbsp;&nbsp;&nbsp;</span> [ <a href="{U_SWATCH}" onclick="popup(this.href, 636, 150, '_swatch'); return false;">{L_COLOUR_SWATCH}</a> ]</dd>
</dl>
<dl>
<dt><label for="group_rank">{L_GROUP_RANK}:</label></dt>
diff --git a/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html b/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html
index 67e14defc3..91dd4606c8 100644
--- a/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html
+++ b/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html
@@ -8,8 +8,6 @@
<meta http-equiv="imagetoolbar" content="no" />
<meta name="resource-type" content="document" />
<meta name="distribution" content="global" />
-<meta name="keywords" content="" />
-<meta name="description" content="" />
<meta name="robots" content="noindex" />
{META}
<title>{SITENAME} &bull; {PAGE_TITLE}</title>
diff --git a/phpBB/styles/prosilver/template/ucp_profile_profile_info.html b/phpBB/styles/prosilver/template/ucp_profile_profile_info.html
index 1bd54619b9..0d3a48c334 100644
--- a/phpBB/styles/prosilver/template/ucp_profile_profile_info.html
+++ b/phpBB/styles/prosilver/template/ucp_profile_profile_info.html
@@ -50,9 +50,9 @@
<dl>
<dt><label for="bday_day">{L_BIRTHDAY}:</label><br /><span>{L_BIRTHDAY_EXPLAIN}</span></dt>
<dd>
- <label for="bday_day">{L_DAY}: <select name="bday_day" id="bday_day" style="width: 4em;">{S_BIRTHDAY_DAY_OPTIONS}</select></label>
- <label for="bday_month">{L_MONTH}: <select name="bday_month" id="bday_month" style="width: 4em;">{S_BIRTHDAY_MONTH_OPTIONS}</select></label>
- <label for="bday_year">{L_YEAR}: <select name="bday_year" id="bday_year" style="width: 6em;">{S_BIRTHDAY_YEAR_OPTIONS}</select></label>
+ <label for="bday_day">{L_DAY}: <select name="bday_day" id="bday_day">{S_BIRTHDAY_DAY_OPTIONS}</select></label>
+ <label for="bday_month">{L_MONTH}: <select name="bday_month" id="bday_month">{S_BIRTHDAY_MONTH_OPTIONS}</select></label>
+ <label for="bday_year">{L_YEAR}: <select name="bday_year" id="bday_year">{S_BIRTHDAY_YEAR_OPTIONS}</select></label>
</dd>
</dl>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/ucp_profile_reg_details.html b/phpBB/styles/prosilver/template/ucp_profile_reg_details.html
index 5eb55dc71c..2f24601645 100644
--- a/phpBB/styles/prosilver/template/ucp_profile_reg_details.html
+++ b/phpBB/styles/prosilver/template/ucp_profile_reg_details.html
@@ -7,7 +7,7 @@
<div class="inner"><span class="corners-top"><span></span></span>
<!-- IF S_FORCE_PASSWORD -->
- <p>{L_FORCE_PASSWORD_EXPLAIN}</p>
+ <p class="error">{L_FORCE_PASSWORD_EXPLAIN}</p>
<!-- ENDIF -->
<fieldset>
@@ -60,4 +60,4 @@
</fieldset>
</form>
-<!-- INCLUDE ucp_footer.html --> \ No newline at end of file
+<!-- INCLUDE ucp_footer.html -->
diff --git a/phpBB/styles/prosilver/template/viewtopic_print.html b/phpBB/styles/prosilver/template/viewtopic_print.html
index 39d2d76394..168305a6a4 100644
--- a/phpBB/styles/prosilver/template/viewtopic_print.html
+++ b/phpBB/styles/prosilver/template/viewtopic_print.html
@@ -8,8 +8,6 @@
<meta http-equiv="imagetoolbar" content="no" />
<meta name="resource-type" content="document" />
<meta name="distribution" content="global" />
-<meta name="keywords" content="" />
-<meta name="description" content="" />
<meta name="robots" content="noindex" />
{META}
<title>{SITENAME} &bull; {PAGE_TITLE}</title>
diff --git a/phpBB/styles/subsilver2/style.cfg b/phpBB/styles/subsilver2/style.cfg
index b99c433ff1..b0fe5e6639 100644
--- a/phpBB/styles/subsilver2/style.cfg
+++ b/phpBB/styles/subsilver2/style.cfg
@@ -18,5 +18,5 @@
# General Information about this style
name = subsilver2
-copyright = &copy; 2005 phpBB Group
+copyright = © 2005 phpBB Group
version = 3.0.12
diff --git a/phpBB/styles/subsilver2/template/editor.js b/phpBB/styles/subsilver2/template/editor.js
index 151cf53ff1..103a271a71 100644
--- a/phpBB/styles/subsilver2/template/editor.js
+++ b/phpBB/styles/subsilver2/template/editor.js
@@ -351,7 +351,7 @@ function mozWrap(txtarea, open, close)
*/
function storeCaret(textEl)
{
- if (textEl.createTextRange)
+ if (textEl.createTextRange && document.selection)
{
textEl.caretPos = document.selection.createRange().duplicate();
}
diff --git a/phpBB/styles/subsilver2/template/ucp_pm_viewmessage_print.html b/phpBB/styles/subsilver2/template/ucp_pm_viewmessage_print.html
index cd55c16a50..085e26ecd2 100644
--- a/phpBB/styles/subsilver2/template/ucp_pm_viewmessage_print.html
+++ b/phpBB/styles/subsilver2/template/ucp_pm_viewmessage_print.html
@@ -4,6 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset={S_CONTENT_ENCODING}">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Language" content="{S_USER_LANG}">
+<meta name="robots" content="noindex" />
<title>{SITENAME} :: {PAGE_TITLE}</title>
<style type="text/css">
diff --git a/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html b/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html
index 09f60ad5a7..2eca7a93c8 100644
--- a/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html
+++ b/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html
@@ -6,7 +6,7 @@
</tr>
<!-- IF S_FORCE_PASSWORD -->
<tr>
- <td class="row3" colspan="2" align="center"><span class="gensmall">{L_FORCE_PASSWORD_EXPLAIN}</span></td>
+ <td class="row3" colspan="2" align="center"><span class="gensmall error">{L_FORCE_PASSWORD_EXPLAIN}</span></td>
</tr>
<!-- ENDIF -->
<!-- IF ERROR -->
@@ -50,4 +50,4 @@
</tr>
</table>
-<!-- INCLUDE ucp_footer.html --> \ No newline at end of file
+<!-- INCLUDE ucp_footer.html -->
diff --git a/phpBB/styles/subsilver2/template/viewtopic_print.html b/phpBB/styles/subsilver2/template/viewtopic_print.html
index 1ca1eccc99..47b5bdb28e 100644
--- a/phpBB/styles/subsilver2/template/viewtopic_print.html
+++ b/phpBB/styles/subsilver2/template/viewtopic_print.html
@@ -4,6 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset={S_CONTENT_ENCODING}">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Language" content="{S_USER_LANG}">
+<meta name="robots" content="noindex" />
<title>{SITENAME} :: {PAGE_TITLE}</title>
<style type="text/css">
diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php
index fb12dd925a..f52e04e1a8 100644
--- a/phpBB/viewtopic.php
+++ b/phpBB/viewtopic.php
@@ -471,17 +471,11 @@ else
$highlight_match = $highlight = '';
if ($hilit_words)
{
- foreach (explode(' ', trim($hilit_words)) as $word)
- {
- if (trim($word))
- {
- $word = str_replace('\*', '\w+?', preg_quote($word, '#'));
- $word = preg_replace('#(^|\s)\\\\w\*\?(\s|$)#', '$1\w+?$2', $word);
- $highlight_match .= (($highlight_match != '') ? '|' : '') . $word;
- }
- }
-
- $highlight = urlencode($hilit_words);
+ $highlight_match = phpbb_clean_search_string($hilit_words);
+ $highlight = urlencode($highlight_match);
+ $highlight_match = str_replace('\*', '\w+?', preg_quote($highlight_match, '#'));
+ $highlight_match = preg_replace('#(?<=^|\s)\\\\w\*\?(?=\s|$)#', '\w+?', $highlight_match);
+ $highlight_match = str_replace(' ', '|', $highlight_match);
}
// Make sure $start is set to the last page if it exceeds the amount
@@ -1509,13 +1503,19 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
$edit_allowed = ($user->data['is_registered'] && ($auth->acl_get('m_edit', $forum_id) || (
$user->data['user_id'] == $poster_id &&
$auth->acl_get('f_edit', $forum_id) &&
+ $topic_data['topic_status'] != ITEM_LOCKED &&
!$row['post_edit_locked'] &&
($row['post_time'] > time() - ($config['edit_time'] * 60) || !$config['edit_time'])
)));
+ $quote_allowed = $auth->acl_get('m_edit', $forum_id) || ($topic_data['topic_status'] != ITEM_LOCKED &&
+ ($user->data['user_id'] == ANONYMOUS || $auth->acl_get('f_reply', $forum_id))
+ );
+
$delete_allowed = ($user->data['is_registered'] && ($auth->acl_get('m_delete', $forum_id) || (
$user->data['user_id'] == $poster_id &&
$auth->acl_get('f_delete', $forum_id) &&
+ $topic_data['topic_status'] != ITEM_LOCKED &&
$topic_data['topic_last_post_id'] == $row['post_id'] &&
($row['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time']) &&
// we do not want to allow removal of the last post if a moderator locked it!
@@ -1556,7 +1556,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
'S_ONLINE' => ($poster_id == ANONYMOUS || !$config['load_onlinetrack']) ? false : (($user_cache[$poster_id]['online']) ? true : false),
'U_EDIT' => ($edit_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&amp;f=$forum_id&amp;p={$row['post_id']}") : '',
- 'U_QUOTE' => ($auth->acl_get('f_reply', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=quote&amp;f=$forum_id&amp;p={$row['post_id']}") : '',
+ 'U_QUOTE' => ($quote_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=quote&amp;f=$forum_id&amp;p={$row['post_id']}") : '',
'U_INFO' => ($auth->acl_get('m_info', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&amp;mode=post_details&amp;f=$forum_id&amp;p=" . $row['post_id'], true, $user->session_id) : '',
'U_DELETE' => ($delete_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=delete&amp;f=$forum_id&amp;p={$row['post_id']}") : '',
diff --git a/tests/functional/acp_users_test.php b/tests/functional/acp_users_test.php
new file mode 100644
index 0000000000..50d9a67dc1
--- /dev/null
+++ b/tests/functional/acp_users_test.php
@@ -0,0 +1,45 @@
+<?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_acp_users_test extends phpbb_functional_test_case
+{
+ public function setUp()
+ {
+ parent::setUp();
+
+ $this->login();
+ $this->admin_login();
+ $this->add_lang('acp/users');
+ }
+
+ public function test_founder_deletion()
+ {
+ $username = 'founder-account';
+ $user_id = $this->create_user($username);
+ $this->make_founder($user_id);
+
+ $crawler = self::request('GET', "adm/index.php?i=users&mode=overview&u=$user_id&sid={$this->sid}");
+ $form = $crawler->filter('#user_delete')->selectButton($this->lang('SUBMIT'))->form();
+ $crawler = self::submit($form);
+ $this->assertContains($this->lang('CANNOT_REMOVE_FOUNDER'), $this->get_content());
+ }
+
+ protected function make_founder($user_id)
+ {
+ $crawler = self::request('GET', "adm/index.php?i=users&mode=overview&u=$user_id&sid={$this->sid}");
+ $form = $crawler->filter('#user_overview')->selectButton($this->lang('SUBMIT'))->form();
+ $data = array('user_founder' => '1');
+ $form->setValues($data);
+ $crawler = self::submit($form);
+ $this->assertContains($this->lang('USER_OVERVIEW_UPDATED'), $this->get_content());
+ }
+}
diff --git a/tests/functions/obtain_online_test.php b/tests/functions/obtain_online_test.php
index b3beb55a96..de6451a0db 100644
--- a/tests/functions/obtain_online_test.php
+++ b/tests/functions/obtain_online_test.php
@@ -22,8 +22,9 @@ class phpbb_functions_obtain_online_test extends phpbb_database_test_case
{
parent::setUp();
- global $config, $db;
+ global $config, $db, $user;
+ $user = new StdClass;
$db = $this->db = $this->new_dbal();
$config = array(
'load_online_time' => 5,
diff --git a/tests/functions/parse_cfg_file_test.php b/tests/functions/parse_cfg_file_test.php
new file mode 100644
index 0000000000..69000ddf72
--- /dev/null
+++ b/tests/functions/parse_cfg_file_test.php
@@ -0,0 +1,103 @@
+<?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';
+
+class phpbb_functions_parse_cfg_file extends phpbb_test_case
+{
+ public function parse_cfg_file_data()
+ {
+ return array(
+ array(
+ array(
+ '#',
+ '# phpBB Style Configuration File',
+ '#',
+ '# @package phpBB3',
+ '# @copyright (c) 2005 phpBB Group',
+ '# @license http://opensource.org/licenses/gpl-license.php GNU Public License',
+ '#',
+ '#',
+ '# At the left is the name, please do not change this',
+ '# At the right the value is entered',
+ '# For on/off options the valid values are on, off, 1, 0, true and false',
+ '#',
+ '# Values get trimmed, if you want to add a space in front or at the end of',
+ '# the value, then enclose the value with single or double quotes.',
+ '# Single and double quotes do not need to be escaped.',
+ '#',
+ '',
+ '# General Information about this style',
+ 'name = prosilver',
+ 'copyright = © phpBB Group, 2007',
+ 'version = 3.0.12',
+ ),
+ array(
+ 'name' => 'prosilver',
+ 'copyright' => '© phpBB Group, 2007',
+ 'version' => '3.0.12',
+ ),
+ ),
+ array(
+ array(
+ 'name = subsilver2',
+ 'copyright = © 2005 phpBB Group',
+ 'version = 3.0.12',
+ ),
+ array(
+ 'name' => 'subsilver2',
+ 'copyright' => '© 2005 phpBB Group',
+ 'version' => '3.0.12',
+ ),
+ ),
+ array(
+ array(
+ 'foo = on',
+ 'foo1 = true',
+ 'foo2 = 1',
+ 'bar = off',
+ 'bar1 = false',
+ 'bar2 = 0',
+ 'foobar =',
+ 'foobar1 = "asdf"',
+ 'foobar2 = \'qwer\'',
+ ),
+ array(
+ 'foo' => true,
+ 'foo1' => true,
+ 'foo2' => true,
+ 'bar' => false,
+ 'bar1' => false,
+ 'bar2' => false,
+ 'foobar' => '',
+ 'foobar1' => 'asdf',
+ 'foobar2' => 'qwer',
+ ),
+ ),
+ array(
+ array(
+ 'foo = &amp; bar',
+ 'bar = <a href="test">Test</a>',
+ ),
+ array(
+ 'foo' => '&amp;amp; bar',
+ 'bar' => '&lt;a href=&quot;test&quot;&gt;Test&lt;/a&gt;',
+ ),
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider parse_cfg_file_data
+ */
+ public function test_parse_cfg_file($file_contents, $expected)
+ {
+ $this->assertEquals($expected, parse_cfg_file(false, $file_contents));
+ }
+}
diff --git a/tests/functions_content/get_username_string_test.php b/tests/functions_content/get_username_string_test.php
new file mode 100644
index 0000000000..48e8936cc1
--- /dev/null
+++ b/tests/functions_content/get_username_string_test.php
@@ -0,0 +1,125 @@
+<?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_content.php';
+
+class phpbb_functions_content_get_username_string_test extends phpbb_test_case
+{
+ public function setUp()
+ {
+ parent::setUp();
+
+ global $auth, $user;
+ $auth = $this->getMock('auth');
+ $auth->expects($this->any())
+ ->method('acl_get')
+ ->with($this->stringContains('_'), $this->anything())
+ ->will($this->returnValueMap(array(
+ array('u_viewprofile', true),
+ )));
+ $user->data['user_id'] = ANONYMOUS;
+ $user->lang['GUEST'] = 'Guest';
+ }
+
+ public function get_username_string_profile_data()
+ {
+ global $phpbb_root_path, $phpEx;
+
+ return array(
+ array(ANONYMOUS, 'Anonymous', '', false, false, ''),
+ array(2, 'Administrator', 'FF0000', false, false, "{$phpbb_root_path}memberlist.$phpEx?mode=viewprofile&amp;u=2"),
+ array(42, 'User42', '', false, 'http://www.example.org/user.php?mode=show', 'http://www.example.org/user.php?mode=show&amp;u=42'),
+ );
+ }
+
+ /**
+ * @dataProvider get_username_string_profile_data
+ */
+ public function test_get_username_string_profile($user_id, $username, $user_colour, $guest_username, $custom_profile_url, $expected)
+ {
+ $this->assertEquals($expected, get_username_string('profile', $user_id, $username, $user_colour, $guest_username, $custom_profile_url));
+ }
+
+ public function get_username_string_username_data()
+ {
+ return array(
+ array(ANONYMOUS, '', '', false, false, 'Guest'),
+ array(ANONYMOUS, '', '', 'CustomName', false, 'CustomName'),
+ array(2, 'User2', '', false, false, 'User2'),
+ array(5, 'User5', '', 'Anonymous', false, 'User5'),
+ array(128, 'User128', '', false, false, 'User128'),
+ );
+ }
+
+ /**
+ * @dataProvider get_username_string_username_data
+ */
+ public function test_get_username_string_username($user_id, $username, $user_colour, $guest_username, $custom_profile_url, $expected)
+ {
+ $this->assertEquals($expected, get_username_string('username', $user_id, $username, $user_colour, $guest_username, $custom_profile_url));
+ }
+
+ public function get_username_string_colour_data()
+ {
+ return array(
+ array(0, '', '', false, false, ''),
+ array(0, '', 'F0F0F0', false, false, '#F0F0F0'),
+ array(ANONYMOUS, 'Anonymous', '000000', false, false, '#000000'),
+ array(2, 'Administrator', '', false, false, ''),
+ );
+ }
+
+ /**
+ * @dataProvider get_username_string_colour_data
+ */
+ public function test_get_username_string_colour($user_id, $username, $user_colour, $guest_username, $custom_profile_url, $expected)
+ {
+ $this->assertEquals($expected, get_username_string('colour', $user_id, $username, $user_colour, $guest_username, $custom_profile_url));
+ }
+
+ public function get_username_string_full_data()
+ {
+ global $phpbb_root_path, $phpEx;
+
+ return array(
+ array(0, '', '', false, false, 'Guest'),
+ array(ANONYMOUS, 'Anonymous', '', false, false, 'Anonymous'),
+ array(2, 'Administrator', 'FF0000', false, false, '<a href="' . $phpbb_root_path . 'memberlist.' . $phpEx . '?mode=viewprofile&amp;u=2" style="color: #FF0000;" class="username-coloured">Administrator</a>'),
+ array(5, 'User5', '', false, 'http://www.example.org/user.php?mode=show', '<a href="http://www.example.org/user.php?mode=show&amp;u=5">User5</a>'),
+ array(8, 'Eight', '', false, false, '<a href="' . $phpbb_root_path . 'memberlist.php?mode=viewprofile&amp;u=8">Eight</a>'),
+ );
+ }
+
+ /**
+ * @dataProvider get_username_string_full_data
+ */
+ public function test_get_username_string_full($user_id, $username, $user_colour, $guest_username, $custom_profile_url, $expected)
+ {
+ $this->assertEquals($expected, get_username_string('full', $user_id, $username, $user_colour, $guest_username, $custom_profile_url));
+ }
+
+ public function get_username_string_no_profile_data()
+ {
+ return array(
+ array(ANONYMOUS, 'Anonymous', '', false, false, 'Anonymous'),
+ array(ANONYMOUS, 'Anonymous', '', '', false, 'Guest'),
+ array(2, 'Administrator', 'FF0000', false, false, '<span style="color: #FF0000;" class="username-coloured">Administrator</span>'),
+ array(8, 'Eight', '', false, false, 'Eight'),
+ );
+ }
+
+ /**
+ * @dataProvider get_username_string_no_profile_data
+ */
+ public function test_get_username_string_no_profile($user_id, $username, $user_colour, $guest_username, $custom_profile_url, $expected)
+ {
+ $this->assertEquals($expected, get_username_string('no_profile', $user_id, $username, $user_colour, $guest_username, $custom_profile_url));
+ }
+}
diff --git a/tests/functions_content/phpbb_clean_search_string_test.php b/tests/functions_content/phpbb_clean_search_string_test.php
new file mode 100644
index 0000000000..de642c9040
--- /dev/null
+++ b/tests/functions_content/phpbb_clean_search_string_test.php
@@ -0,0 +1,38 @@
+<?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_content.php';
+
+class phpbb_functions_content_phpbb_clean_search_string_test extends phpbb_test_case
+{
+ public function phpbb_clean_search_string_data()
+ {
+ return array(
+ array('*', ''),
+ array('* *', ''),
+ array('test', 'test'),
+ array(' test ', 'test'),
+ array(' test * ', 'test'),
+ array('test* *', 'test*'),
+ array('* *test*', '*test*'),
+ array('test test * test', 'test test test'),
+ array(' some wild*cards * between wo*rds ', 'some wild*cards between wo*rds'),
+ array(' we * now have*** multiple wild***cards * ', 'we now have* multiple wild*cards'),
+ array('pi is *** . * **** * *****', 'pi is .'),
+ );
+ }
+
+ /**
+ * @dataProvider phpbb_clean_search_string_data
+ */
+ public function test_phpbb_clean_search_string($search_string, $expected)
+ {
+ $this->assertEquals($expected, phpbb_clean_search_string($search_string));
+ }
+}
diff --git a/tests/lint_test.php b/tests/lint_test.php
index 905067072d..b0149063bd 100644
--- a/tests/lint_test.php
+++ b/tests/lint_test.php
@@ -9,20 +9,37 @@
class phpbb_lint_test extends phpbb_test_case
{
+ static protected $php_binary;
static protected $exclude;
static public function setUpBeforeClass()
{
+ // Try to use PHP_BINARY constant if available so lint tests are run
+ // using the same php binary as phpunit. If not available (pre PHP
+ // 5.4), assume binary is called 'php' and is in PATH.
+ self::$php_binary = defined('PHP_BINARY') ? escapeshellcmd(PHP_BINARY) : 'php';
+
$output = array();
$status = 1;
- exec('(php -v) 2>&1', $output, $status);
+ exec(sprintf('(%s --version) 2>&1', self::$php_binary), $output, $status);
if ($status)
{
$output = implode("\n", $output);
- self::markTestSkipped("php is not in PATH or broken: $output");
+ if (self::$php_binary === 'php')
+ {
+ self::markTestSkipped(sprintf('php is not in PATH or broken. Output: %s', $output));
+ }
+ else
+ {
+ self::markTestSkipped(sprintf('Could not run PHP_BINARY %s. Output: %s', self::$php_binary, $output));
+ }
}
self::$exclude = array(
+ dirname(__FILE__) . '/../.git',
+ dirname(__FILE__) . '/../build/new_version',
+ dirname(__FILE__) . '/../build/old_versions',
+ dirname(__FILE__) . '/../phpBB/cache',
// PHP Fatal error: Cannot declare class Container because the name is already in use in /var/www/projects/phpbb3/tests/../phpBB/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1-1.php on line 20
// https://gist.github.com/e003913ffd493da63cbc
dirname(__FILE__) . '/../phpBB/vendor',
@@ -45,7 +62,7 @@ class phpbb_lint_test extends phpbb_test_case
$dh = opendir($root);
while (($filename = readdir($dh)) !== false)
{
- if ($filename == '.' || $filename == '..' || $filename == 'git')
+ if ($filename == '.' || $filename == '..')
{
continue;
}
@@ -61,13 +78,12 @@ class phpbb_lint_test extends phpbb_test_case
}
else if (substr($filename, strlen($filename)-4) == '.php')
{
- // assume php binary is called php and it is in PATH
- $cmd = '(php -l ' . escapeshellarg($path) . ') 2>&1';
+ $cmd = sprintf('(%s -l %s) 2>&1', self::$php_binary, escapeshellarg($path));
$output = array();
$status = 1;
exec($cmd, $output, $status);
$output = implode("\n", $output);
- $this->assertEquals(0, $status, "php -l failed for $path:\n$output");
+ $this->assertEquals(0, $status, "PHP lint failed for $path:\n$output");
}
}
}
diff --git a/tests/profile/get_profile_value_test.php b/tests/profile/get_profile_value_test.php
new file mode 100644
index 0000000000..a5f37a85ce
--- /dev/null
+++ b/tests/profile/get_profile_value_test.php
@@ -0,0 +1,42 @@
+<?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_profile_fields.php';
+
+class phpbb_profile_get_profile_value_test extends phpbb_test_case
+{
+ static public function get_profile_value_int_data()
+ {
+ return array(
+ array(FIELD_INT, '10', true, 10),
+ array(FIELD_INT, '0', true, 0),
+ array(FIELD_INT, '', true, 0),
+ array(FIELD_INT, null, true, 0),
+ array(FIELD_INT, '10', false, 10),
+ array(FIELD_INT, '0', false, 0),
+ array(FIELD_INT, '', false, null),
+ array(FIELD_INT, null, false, null),
+ );
+ }
+
+ /**
+ * @dataProvider get_profile_value_int_data
+ */
+ public function test_get_profile_value_int($type, $value, $show_novalue, $expected)
+ {
+ $cp = new custom_profile;
+ $this->assertSame($expected, $cp->get_profile_value(array(
+ 'value' => $value,
+ 'data' => array(
+ 'field_type' => $type,
+ 'field_show_novalue' => $show_novalue,
+ ),
+ )));
+ }
+}
diff --git a/tests/security/hash_test.php b/tests/security/hash_test.php
index 0c2580c19b..e226365ef3 100644
--- a/tests/security/hash_test.php
+++ b/tests/security/hash_test.php
@@ -17,5 +17,13 @@ class phpbb_security_hash_test extends phpbb_test_case
$this->assertTrue(phpbb_check_hash('test', '$P$9isfrtKXWqrz8PvztXlL3.daw4U0zI1'));
$this->assertFalse(phpbb_check_hash('foo', '$H$9isfrtKXWqrz8PvztXlL3.daw4U0zI1'));
}
+
+ public function test_check_hash_with_large_input()
+ {
+ // 16 MB password, should be rejected quite fast
+ $start_time = time();
+ $this->assertFalse(phpbb_check_hash(str_repeat('a', 1024 * 1024 * 16), '$H$9isfrtKXWqrz8PvztXlL3.daw4U0zI1'));
+ $this->assertLessThanOrEqual(5, time() - $start_time);
+ }
}
diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php
index 00b31212b2..5dfe07d380 100644
--- a/tests/test_framework/phpbb_functional_test_case.php
+++ b/tests/test_framework/phpbb_functional_test_case.php
@@ -423,6 +423,15 @@ class phpbb_functional_test_case extends phpbb_test_case
$config = array();
}
+ /*
+ * Add required config entries to the config array to prevent
+ * set_config() sending an INSERT query for already existing entries,
+ * resulting in a SQL error.
+ * This is because set_config() first sends an UPDATE query, then checks
+ * sql_affectedrows() which can be 0 (e.g. on MySQL) when the new
+ * data is already there.
+ */
+ $config['newest_user_colour'] = '';
$config['rand_seed'] = '';
$config['rand_seed_last_update'] = time() + 600;
diff --git a/travis/phpunit-mariadb-travis.xml b/travis/phpunit-mariadb-travis.xml
new file mode 100644
index 0000000000..1eaee5b7d8
--- /dev/null
+++ b/travis/phpunit-mariadb-travis.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit backupGlobals="true"
+ backupStaticAttributes="true"
+ colors="true"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ processIsolation="false"
+ stopOnFailure="false"
+ syntaxCheck="true"
+ strict="true"
+ verbose="true"
+ bootstrap="../tests/bootstrap.php">
+ <testsuites>
+ <testsuite name="phpBB Test Suite">
+ <directory suffix="_test.php">../tests/</directory>
+ <exclude>tests/functional</exclude>
+ <exclude>tests/lint_test.php</exclude>
+ </testsuite>
+ <testsuite name="phpBB Functional Tests">
+ <directory suffix="_test.php" phpVersion="5.3.19" phpVersionOperator=">=">../tests/functional</directory>
+ </testsuite>
+ </testsuites>
+
+ <groups>
+ <exclude>
+ <group>slow</group>
+ </exclude>
+ </groups>
+
+ <php>
+ <server name="PHPBB_TEST_DBMS" value="mysqli" />
+ <server name="PHPBB_TEST_DBHOST" value="0.0.0.0" />
+ <server name="PHPBB_TEST_DBPORT" value="3306" />
+ <server name="PHPBB_TEST_DBNAME" value="phpbb_tests" />
+ <server name="PHPBB_TEST_DBUSER" value="root" />
+ <server name="PHPBB_TEST_DBPASSWD" value="" />
+ <server name="PHPBB_TEST_TABLE_PREFIX" value="phpbb_"/>
+ <server name="PHPBB_FUNCTIONAL_URL" value="http://localhost/" />
+ </php>
+</phpunit>
diff --git a/travis/setup-mariadb.sh b/travis/setup-mariadb.sh
new file mode 100755
index 0000000000..aceb6af7ee
--- /dev/null
+++ b/travis/setup-mariadb.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+#
+# @copyright (c) 2013 phpBB Group
+# @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+#
+set -e
+set -x
+
+# MariaDB Series
+VERSION='5.5'
+
+# Operating system codename, e.g. "precise"
+OS_CODENAME=$(lsb_release --codename --short)
+
+# Manually purge MySQL to remove conflicting files (e.g. /etc/mysql/my.cnf)
+sudo apt-get purge -y mysql-common
+
+if ! which add-apt-repository > /dev/null
+then
+ sudo apt-get update
+ sudo apt-get install -y python-software-properties
+fi
+
+MIRROR_DOMAIN='ftp.osuosl.org'
+sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
+sudo add-apt-repository "deb http://$MIRROR_DOMAIN/pub/mariadb/repo/$VERSION/ubuntu $OS_CODENAME main"
+sudo apt-get update
+
+# Pin repository in order to avoid conflicts with MySQL from distribution
+# repository. See https://mariadb.com/kb/en/installing-mariadb-deb-files
+# section "Version Mismatch Between MariaDB and Ubuntu/Debian Repositories"
+echo "
+Package: *
+Pin: origin $MIRROR_DOMAIN
+Pin-Priority: 1000
+" | sudo tee /etc/apt/preferences.d/mariadb
+
+sudo debconf-set-selections <<< "mariadb-server-$VERSION mysql-server/root_password password rootpasswd"
+sudo debconf-set-selections <<< "mariadb-server-$VERSION mysql-server/root_password_again password rootpasswd"
+sudo apt-get install -y mariadb-server
+
+# Set root password to empty string.
+echo "
+USE mysql;
+UPDATE user SET Password = PASSWORD('') where User = 'root';
+FLUSH PRIVILEGES;
+" | mysql -u root -prootpasswd
+
+mysql --version
diff --git a/travis/setup-webserver.sh b/travis/setup-webserver.sh
index 95fc4ec1f8..6188d2c232 100755
--- a/travis/setup-webserver.sh
+++ b/travis/setup-webserver.sh
@@ -1,54 +1,79 @@
#!/bin/bash
#
-# @copyright (c) 2013 phpBB Group
+# @copyright (c) 2014 phpBB Group
# @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
#
set -e
+set -x
-sudo apt-get update -qq
-sudo apt-get install -qq nginx realpath
+if [ "$TRAVIS_PHP_VERSION" = 'hhvm' ]
+then
+ # Add PPA providing dependencies for recent HHVM on Ubuntu 12.04.
+ sudo add-apt-repository -y ppa:mapnik/boost
+fi
+
+sudo apt-get update
+sudo apt-get install -y nginx realpath
sudo service nginx stop
DIR=$(dirname "$0")
+USER=$(whoami)
PHPBB_ROOT_PATH=$(realpath "$DIR/../phpBB")
-
NGINX_CONF="/etc/nginx/sites-enabled/default"
+APP_SOCK=$(realpath "$DIR")/php-app.sock
-PHP_FPM_BIN="$HOME/.phpenv/versions/$TRAVIS_PHP_VERSION/sbin/php-fpm"
-PHP_FPM_CONF="$DIR/php-fpm.conf"
-PHP_FPM_SOCK=$(realpath "$DIR")/php-fpm.sock
+if [ "$TRAVIS_PHP_VERSION" = 'hhvm' ]
+then
+ # Upgrade to a recent stable version of HHVM
+ sudo apt-get -o Dpkg::Options::="--force-confnew" install -y hhvm-nightly
-USER=$(whoami)
+ # 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"
-# php-fpm configuration
-echo "
-[global]
+ HHVM_LOG=$(realpath "$DIR")/hhvm.log
-[travis]
-user = $USER
-group = $USER
-listen = $PHP_FPM_SOCK
-pm = static
-pm.max_children = 2
+ sudo hhvm \
+ --mode daemon \
+ --user "$USER" \
+ -vServer.Type=fastcgi \
+ -vServer.FileSocket="$APP_SOCK" \
+ -vLog.File="$HHVM_LOG"
+else
+ # php-fpm
+ PHP_FPM_BIN="$HOME/.phpenv/versions/$TRAVIS_PHP_VERSION/sbin/php-fpm"
+ PHP_FPM_CONF="$DIR/php-fpm.conf"
-php_admin_value[memory_limit] = 128M
-" > $PHP_FPM_CONF
+ echo "
+ [global]
-# nginx configuration
+ [travis]
+ user = $USER
+ group = $USER
+ listen = $APP_SOCK
+ pm = static
+ pm.max_children = 2
+
+ php_admin_value[memory_limit] = 128M
+ " > $PHP_FPM_CONF
+
+ sudo $PHP_FPM_BIN \
+ --fpm-config "$DIR/php-fpm.conf"
+fi
+
+# nginx
echo "
-server {
- listen 80;
- root $PHPBB_ROOT_PATH/;
- index index.php index.html;
-
- location ~ \.php {
- fastcgi_pass unix:$PHP_FPM_SOCK;
- include fastcgi_params;
+ server {
+ listen 80;
+ root $PHPBB_ROOT_PATH/;
+ index index.php index.html;
+
+ location ~ \.php {
+ fastcgi_pass unix:$APP_SOCK;
+ include fastcgi_params;
+ }
}
-}
" | sudo tee $NGINX_CONF > /dev/null
-# Start daemons
-sudo $PHP_FPM_BIN --fpm-config "$DIR/php-fpm.conf"
sudo service nginx start