Merge branch 'develop' of github.com:phpbb/phpbb3 into feature/twig

# By Dhruv (35) and others
# Via Andreas Fischer (15) and others
* 'develop' of github.com:phpbb/phpbb3: (75 commits)
  [ticket/10776] update min php version 5.3.3 in readme
  [ticket/11503] similar implementation for mssql_native and odbc
  [ticket/11603] Fix out dated comment
  [ticket/11603] Fix usage note
  [ticket/11604] Skip installer step where config.php is created.
  [ticket/11603] Throw RuntimeExceptions instead of using exit()
  [ticket/11603] Avoid using cURL
  [ticket/11604] Fix case where config.php is not generated by phpBB.
  [ticket/11604] Use variables for config.php filesnames.
  [ticket/11561] Specify used tables in notification fixture, so they are emptied
  [ticket/11094] Add textbox for jabber while memberlist search
  [ticket/10820] fix if condition to check for IE
  [ticket/11603] Split api_request into two functions (query only vs. full url)
  [ticket/11603] Fix spacing and add some comments
  [ticket/10820] Add additional check for IE in condition
  [ticket/11603] Fix github API calls
  [ticket/11603] Rename network to forks and fix handling
  [ticket/11603] Fix github api url and use curl with valid user agent
  [ticket/10820] Fix function docblock
  [ticket/10820] Inject IE version in function
  ...
This commit is contained in:
Nathan Guse 2013-06-24 13:49:29 -05:00
commit ff84aed0b2
37 changed files with 1403 additions and 303 deletions

View file

@ -124,19 +124,34 @@ function get_repository_url($username, $repository, $ssh = false)
function api_request($query) function api_request($query)
{ {
$contents = file_get_contents("http://github.com/api/v2/json/$query"); return api_url_request("https://api.github.com/$query?per_page=100");
}
function api_url_request($url)
{
$contents = file_get_contents($url, false, stream_context_create(array(
'http' => array(
'header' => "User-Agent: phpBB/1.0\r\n",
),
)));
if ($contents === false) if ($contents === false)
{ {
throw new RuntimeException("Error: failed to retrieve pull request data\n", 4); throw new RuntimeException("Error: failed to retrieve pull request data\n", 4);
} }
$contents = json_decode($contents);
return json_decode($contents); if (isset($contents->message) && strpos($contents->message, 'API Rate Limit') === 0)
{
throw new RuntimeException('Reached github API Rate Limit. Please try again later' . "\n", 4);
}
return $contents;
} }
function get_pull($username, $repository, $pull_id) function get_pull($username, $repository, $pull_id)
{ {
$request = api_request("pulls/$username/$repository/$pull_id"); $request = api_request("repos/$username/$repository/pulls/$pull_id");
$pull = $request->pull; $pull = $request->pull;

View file

@ -15,14 +15,14 @@ function show_usage()
echo "$filename adds repositories of a github network as remotes to a local git repository.\n"; echo "$filename adds repositories of a github network as remotes to a local git repository.\n";
echo "\n"; echo "\n";
echo "Usage: [php] $filename -s collaborators|organisation|contributors|network [OPTIONS]\n"; echo "Usage: [php] $filename -s collaborators|organisation|contributors|forks [OPTIONS]\n";
echo "\n"; echo "\n";
echo "Scopes:\n"; echo "Scopes:\n";
echo " collaborators Repositories of people who have push access to the specified repository\n"; echo " collaborators Repositories of people who have push access to the specified repository\n";
echo " contributors Repositories of people who have contributed to the specified repository\n"; echo " contributors Repositories of people who have contributed to the specified repository\n";
echo " organisation Repositories of members of the organisation at github\n"; echo " organisation Repositories of members of the organisation at github\n";
echo " network All repositories of the whole github network\n"; echo " forks All repositories of the whole github network\n";
echo "\n"; echo "\n";
echo "Options:\n"; echo "Options:\n";
@ -55,31 +55,31 @@ exit(work($scope, $username, $repository, $developer));
function work($scope, $username, $repository, $developer) function work($scope, $username, $repository, $developer)
{ {
// Get some basic data // Get some basic data
$network = get_network($username, $repository); $forks = get_forks($username, $repository);
$collaborators = get_collaborators($username, $repository); $collaborators = get_collaborators($username, $repository);
if ($network === false || $collaborators === false) if ($forks === false || $collaborators === false)
{ {
echo "Error: failed to retrieve network or collaborators\n"; echo "Error: failed to retrieve forks or collaborators\n";
return 1; return 1;
} }
switch ($scope) switch ($scope)
{ {
case 'collaborators': case 'collaborators':
$remotes = array_intersect_key($network, $collaborators); $remotes = array_intersect_key($forks, $collaborators);
break; break;
case 'organisation': case 'organisation':
$remotes = array_intersect_key($network, get_organisation_members($username)); $remotes = array_intersect_key($forks, get_organisation_members($username));
break; break;
case 'contributors': case 'contributors':
$remotes = array_intersect_key($network, get_contributors($username, $repository)); $remotes = array_intersect_key($forks, get_contributors($username, $repository));
break; break;
case 'network': case 'forks':
$remotes = $network; $remotes = $forks;
break; break;
default: default:
@ -145,26 +145,66 @@ function get_repository_url($username, $repository, $ssh = false)
function api_request($query) function api_request($query)
{ {
$contents = file_get_contents("http://github.com/api/v2/json/$query"); return api_url_request("https://api.github.com/$query?per_page=100");
}
function api_url_request($url)
{
$contents = file_get_contents($url, false, stream_context_create(array(
'http' => array(
'header' => "User-Agent: phpBB/1.0\r\n",
),
)));
$sub_request_result = array();
// Check headers for pagination links
if (!empty($http_response_header))
{
foreach ($http_response_header as $header_element)
{
// Find Link Header which gives us a link to the next page
if (strpos($header_element, 'Link: ') === 0)
{
list($head, $header_content) = explode(': ', $header_element);
foreach (explode(', ', $header_content) as $links)
{
list($url, $rel) = explode('; ', $links);
if ($rel == 'rel="next"')
{
// Found a next link, follow it and merge the results
$sub_request_result = api_url_request(substr($url, 1, -1));
}
}
}
}
}
if ($contents === false) if ($contents === false)
{ {
return false; return false;
} }
return json_decode($contents); $contents = json_decode($contents);
if (isset($contents->message) && strpos($contents->message, 'API Rate Limit') === 0)
{
throw new RuntimeException('Reached github API Rate Limit. Please try again later' . "\n", 4);
}
return ($sub_request_result) ? array_merge($sub_request_result, $contents) : $contents;
} }
function get_contributors($username, $repository) function get_contributors($username, $repository)
{ {
$request = api_request("repos/show/$username/$repository/contributors"); $request = api_request("repos/$username/$repository/stats/contributors");
if ($request === false) if ($request === false)
{ {
return false; return false;
} }
$usernames = array(); $usernames = array();
foreach ($request->contributors as $contributor) foreach ($request as $contribution)
{ {
$usernames[$contributor->login] = $contributor->login; $usernames[$contribution->author->login] = $contribution->author->login;
} }
return $usernames; return $usernames;
@ -172,14 +212,14 @@ function get_contributors($username, $repository)
function get_organisation_members($username) function get_organisation_members($username)
{ {
$request = api_request("organizations/$username/public_members"); $request = api_request("orgs/$username/public_members");
if ($request === false) if ($request === false)
{ {
return false; return false;
} }
$usernames = array(); $usernames = array();
foreach ($request->users as $member) foreach ($request as $member)
{ {
$usernames[$member->login] = $member->login; $usernames[$member->login] = $member->login;
} }
@ -189,35 +229,35 @@ function get_organisation_members($username)
function get_collaborators($username, $repository) function get_collaborators($username, $repository)
{ {
$request = api_request("repos/show/$username/$repository/collaborators"); $request = api_request("repos/$username/$repository/collaborators");
if ($request === false) if ($request === false)
{ {
return false; return false;
} }
$usernames = array(); $usernames = array();
foreach ($request->collaborators as $collaborator) foreach ($request as $collaborator)
{ {
$usernames[$collaborator] = $collaborator; $usernames[$collaborator->login] = $collaborator->login;
} }
return $usernames; return $usernames;
} }
function get_network($username, $repository) function get_forks($username, $repository)
{ {
$request = api_request("repos/show/$username/$repository/network"); $request = api_request("repos/$username/$repository/forks");
if ($request === false) if ($request === false)
{ {
return false; return false;
} }
$usernames = array(); $usernames = array();
foreach ($request->network as $network) foreach ($request as $fork)
{ {
$usernames[$network->owner] = array( $usernames[$fork->owner->login] = array(
'username' => $network->owner, 'username' => $fork->owner->login,
'repository' => $network->name, 'repository' => $fork->name,
); );
} }

View file

@ -34,7 +34,7 @@
<!-- BEGIN DOCUMENT --> <!-- BEGIN DOCUMENT -->
<p>Thank you for downloading phpBB3. This README will guide through the basics of installation and operation of phpBB3. Please ensure you read this and the accompanying documentation fully <strong>before</strong> proceeding with the installation.</p> <p>Thank you for downloading phpBB3. This README will guide you through the basics of installation and operation of phpBB3. Please ensure you read this and the accompanying documentation fully <strong>before</strong> proceeding with the installation.</p>
<h1>Readme</h1> <h1>Readme</h1>
@ -61,7 +61,7 @@
</ol> </ol>
</li> </li>
<li><a href="#status">Status of this version</a></li> <li><a href="#status">Status of this version</a></li>
<li><a href="#bugs">Reporting Bugs</a> <li><a href="#bugs">Reporting bugs</a>
<ol style="list-style-type: lower-roman;"> <ol style="list-style-type: lower-roman;">
<li><a href="#securitybugs">Security related bugs</a></li> <li><a href="#securitybugs">Security related bugs</a></li>
</ol> </ol>
@ -84,12 +84,11 @@
<div class="inner"><span class="corners-top"><span></span></span> <div class="inner"><span class="corners-top"><span></span></span>
<div class="content"> <div class="content">
<p>Installation, update and conversion instructions can be found in the <a href="INSTALL.html">INSTALL</a> document in this directory. If you are intending on converting from a phpBB 2.0.x or 3.0.x installation we highly recommend that you backup any existing data before proceeding!</p>
<p>Installation, update and conversion instructions can be found in the <a href="INSTALL.html">INSTALL</a> document contained in this distribution. If you are intending to convert from a previous phpBB 2.0.x or 3.0.x installation we highly recommend you backup any existing data before proceeding!</p>
<p>Users of phpBB 3.0 and 3.1 Beta versions cannot directly update.</p> <p>Users of phpBB 3.0 and 3.1 Beta versions cannot directly update.</p>
<p>Please note that we won't support the following installation types:</p> <p>Please note that we don't support the following installation types:</p>
<ul> <ul>
<li>Updates from phpBB 3.0 Beta versions to phpBB 3.0 RC1 and higher</li> <li>Updates from phpBB 3.0 Beta versions to phpBB 3.0 RC1 and higher</li>
<li>Updates from phpBB 3.1 Beta versions to phpBB 3.1 RC1 and higher</li> <li>Updates from phpBB 3.1 Beta versions to phpBB 3.1 RC1 and higher</li>
@ -103,8 +102,8 @@
<li>Updates from phpBB 3.0 RC1 and 3.1 RC1 to the latest version</li> <li>Updates from phpBB 3.0 RC1 and 3.1 RC1 to the latest version</li>
<li>Note: if using the <em>Automatic Update Package</em>, updates are supported from phpBB 3.0.2 onward. To update a pre-3.0.2 installation, first update to 3.0.2 and then update to the current version.</li> <li>Note: if using the <em>Automatic Update Package</em>, updates are supported from phpBB 3.0.2 onward. To update a pre-3.0.2 installation, first update to 3.0.2 and then update to the current version.</li>
<li>Conversions from phpBB 2.0.x to the latest version</li> <li>Conversions from phpBB 2.0.x to the latest version</li>
<li>New installations of phpBB 3.0.x - always only the latest released version</li> <li>New installations of phpBB 3.0.x - only the latest released version</li>
<li>New installations of phpBB 3.1.x - always only the latest released version</li> <li>New installations of phpBB 3.1.x - only the latest released version</li>
</ul> </ul>
</div> </div>
@ -131,7 +130,7 @@
<p>For more information about language packs, please see: <a href="http://www.phpbb.com/languages/">http://www.phpbb.com/languages/</a></p> <p>For more information about language packs, please see: <a href="http://www.phpbb.com/languages/">http://www.phpbb.com/languages/</a></p>
<p>This is the <em>official</em> location for all supported language sets. If you download a package from a 3rd party site you do so with the understanding that we cannot offer support. So please, do not ask for help in these cases!</p> <p>This is the <em>official</em> location for all supported language sets. If you download a package from a 3rd party site you do so with the understanding that we cannot offer support. Please do not ask for support if you download a language pack from a 3rd party site.</p>
<p>Installation of these packages is straightforward: simply download the required language pack, uncompress (unzip) it and via FTP transfer the included <code>language</code> and <code>styles</code> folders to the root of your board installation. The language can then be installed via the Administration Control Panel of your board: <code>System tab -&gt; General Tasks -&gt; Language packs</code>. A more detailed description of the process is in the Knowledge Base article, <a href="http://www.phpbb.com/kb/article/how-to-install-a-language-pack/">How to Install a Language Pack</a>.</p> <p>Installation of these packages is straightforward: simply download the required language pack, uncompress (unzip) it and via FTP transfer the included <code>language</code> and <code>styles</code> folders to the root of your board installation. The language can then be installed via the Administration Control Panel of your board: <code>System tab -&gt; General Tasks -&gt; Language packs</code>. A more detailed description of the process is in the Knowledge Base article, <a href="http://www.phpbb.com/kb/article/how-to-install-a-language-pack/">How to Install a Language Pack</a>.</p>
@ -175,15 +174,15 @@
<div class="content"> <div class="content">
<p>phpBB3 can seem a little daunting to new users in places, particularly with regard the permission system. The first thing you should do is check the <a href="FAQ.html">FAQ</a> which covers a few basic getting started questions. If you need additional help there are several places you should look.</p> <p>phpBB3 can sometimes seem a little daunting to new users, particularly with regards to the permission system. The first thing you should do is check the <a href="FAQ.html">FAQ</a>, which covers a few basic getting started questions. If you need additional help there are several places you can find it.</p>
<a name="docs"></a><h3>3.i. phpBB3 Documentation</h3> <a name="docs"></a><h3>3.i. phpBB3 Documentation</h3>
<p>A comprehensive documentation is now available online and can be accessed from the following location:</p> <p>Comprehensive documentation is now available on the phpBB website:</p>
<p><a href="http://www.phpbb.com/support/documentation/3.0/">http://www.phpbb.com/support/documentation/3.0/</a></p> <p><a href="http://www.phpbb.com/support/documentation/3.0/">http://www.phpbb.com/support/documentation/3.0/</a></p>
<p>This covers everything from installation through setting permissions and managing users.</p> <p>This covers everything from installation to setting permissions and managing users.</p>
<a name="kb"></a><h3>3.ii. Knowledge Base</h3> <a name="kb"></a><h3>3.ii. Knowledge Base</h3>
@ -197,7 +196,7 @@
<p><a href="http://www.phpbb.com/community/">http://www.phpbb.com/community/</a></p> <p><a href="http://www.phpbb.com/community/">http://www.phpbb.com/community/</a></p>
<p>If you do seek help via our forums please be sure to do a Search before posting. This may well save both you and us time and allow the developer, moderator and support groups to spend more time responding to people with unknown issues and problems. Please also remember that phpBB is an entirely volunteer effort, no one receives any compensation for the time they give, this includes moderators as well as developers. So please be respectful and mindful when awaiting responses.</p> <p>If you do seek help via our forums please be sure to do a search before posting; if someone has experienced the issue before, then you may find that your question has already been answered. Please remember that phpBB is entirely staffed by volunteers, no one receives any compensation for the time they give, including moderators as well as developers; please be respectful and mindful when awaiting responses and receiving support.</p>
<a name="irc"></a><h3>3.iv Internet Relay Chat</h3> <a name="irc"></a><h3>3.iv Internet Relay Chat</h3>
@ -268,7 +267,7 @@
<p>The relevant database type/version is listed within the administration control panel.</p> <p>The relevant database type/version is listed within the administration control panel.</p>
<p>Please also be as detailed as you can in your report, if possible list the steps required to duplicate the problem. If you have a patch that fixes the issue, please attach it to the ticket or submit a pull request <a href="https://github.com/phpbb/phpbb3">on GitHub</a>.</p> <p>Please be as detailed as you can in your report, and if possible, list the steps required to duplicate the problem. If you have a patch that fixes the issue, please attach it to the ticket or submit a pull request to our repository <a href="https://github.com/phpbb/phpbb3">on GitHub</a>.</p>
<p>If you create a patch, it is very much appreciated (but not required) if you follow the phpBB coding guidelines. Please note that the coding guidelines are somewhat different between different versions of phpBB. For phpBB 3.1.x the coding guidelines may be found here: <a href="http://area51.phpbb.com/docs/31x/coding-guidelines.html">http://area51.phpbb.com/docs/31x/coding-guidelines.html</a></p> <p>If you create a patch, it is very much appreciated (but not required) if you follow the phpBB coding guidelines. Please note that the coding guidelines are somewhat different between different versions of phpBB. For phpBB 3.1.x the coding guidelines may be found here: <a href="http://area51.phpbb.com/docs/31x/coding-guidelines.html">http://area51.phpbb.com/docs/31x/coding-guidelines.html</a></p>
@ -299,8 +298,8 @@
<p>This list is not complete but does represent those bugs which may affect users on a wider scale. Other bugs listed in the tracker have typically been shown to be limited to certain setups or methods of installation, updating and/or conversions.</p> <p>This list is not complete but does represent those bugs which may affect users on a wider scale. Other bugs listed in the tracker have typically been shown to be limited to certain setups or methods of installation, updating and/or conversions.</p>
<ul> <ul>
<li>Conversions may fail to complete on large boards under some hosts</li> <li>Conversions may fail to complete on large boards under some hosts.</li>
<li>Updates may fail to complete on large update sets under some hosts</li> <li>Updates may fail to complete on large update sets under some hosts.</li>
<li>Smilies placed directly after bbcode tags will not get parsed. Smilies always need to be separated by spaces.</li> <li>Smilies placed directly after bbcode tags will not get parsed. Smilies always need to be separated by spaces.</li>
</ul> </ul>
@ -322,7 +321,7 @@
<p>phpBB 3.1.x takes advantage of new features added in PHP 5.3. We recommend that you upgrade to the latest stable release of PHP5 to run phpBB. The minimum version required is PHP 5.3.3.</p> <p>phpBB 3.1.x takes advantage of new features added in PHP 5.3. We recommend that you upgrade to the latest stable release of PHP5 to run phpBB. The minimum version required is PHP 5.3.3.</p>
<p>Please remember that running any application on a developmental version of PHP can lead to strange/unexpected results which may appear to be bugs in the application (which may not be true). Therefore we recommend you upgrade to the newest stable version of PHP before running phpBB3. If you are running a developmental version of PHP please check any bugs you find on a system running a stable release before submitting.</p> <p>Please remember that running any application on a development (unstable, e.g. a beta release) version of PHP can lead to strange/unexpected results which may appear to be bugs in the application. Therefore, we recommend you upgrade to the newest stable version of PHP before running 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 8.x, Oracle 8, SQLite 2 and Firebird. Versions of PHP used range from 5.3.x 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, MSSQL Server 2000, PostgreSQL 8.x, Oracle 8, SQLite 2 and Firebird. Versions of PHP used range from 5.3.x to 5.4.x without problem.</p>

View file

@ -279,7 +279,7 @@ else if ($download_id)
phpbb_increment_downloads($db, $attachment['attach_id']); phpbb_increment_downloads($db, $attachment['attach_id']);
} }
if ($display_cat == ATTACHMENT_CATEGORY_IMAGE && $mode === 'view' && (strpos($attachment['mimetype'], 'image') === 0) && ((strpos(strtolower($user->browser), 'msie') !== false) && (strpos(strtolower($user->browser), 'msie 8.0') === false))) if ($display_cat == ATTACHMENT_CATEGORY_IMAGE && $mode === 'view' && (strpos($attachment['mimetype'], 'image') === 0) && (strpos(strtolower($user->browser), 'msie') !== false) && !phpbb_is_greater_ie_version($user->browser, 7))
{ {
wrap_img_in_html(append_sid($phpbb_root_path . 'download/file.' . $phpEx, 'id=' . $attachment['attach_id']), $attachment['real_filename']); wrap_img_in_html(append_sid($phpbb_root_path . 'download/file.' . $phpEx, 'id=' . $attachment['attach_id']), $attachment['real_filename']);
file_gc(); file_gc();

View file

@ -591,7 +591,7 @@ class acp_groups
$avatar = phpbb_get_group_avatar($group_row, 'GROUP_AVATAR', true); $avatar = phpbb_get_group_avatar($group_row, 'GROUP_AVATAR', true);
if (!$update) if (isset($phpbb_avatar_manager) && !$update)
{ {
// Merge any avatar errors into the primary error array // Merge any avatar errors into the primary error array
$error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error)); $error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error));

View file

@ -253,7 +253,7 @@ class phpbb_db_driver_mssql_odbc extends phpbb_db_driver_mssql_base
* Fetch current row * Fetch current row
* @note number of bytes returned depends on odbc.defaultlrl php.ini setting. If it is limited to 4K for example only 4K of data is returned max. * @note number of bytes returned depends on odbc.defaultlrl php.ini setting. If it is limited to 4K for example only 4K of data is returned max.
*/ */
function sql_fetchrow($query_id = false, $debug = false) function sql_fetchrow($query_id = false)
{ {
global $cache; global $cache;

View file

@ -326,7 +326,7 @@ class phpbb_db_driver_mssqlnative extends phpbb_db_driver_mssql_base
$this->sql_report('stop', $query); $this->sql_report('stop', $query);
} }
if ($cache_ttl) if ($cache && $cache_ttl)
{ {
$this->open_queries[(int) $this->query_result] = $this->query_result; $this->open_queries[(int) $this->query_result] = $this->query_result;
$this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl); $this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
@ -394,7 +394,7 @@ class phpbb_db_driver_mssqlnative extends phpbb_db_driver_mssql_base
*/ */
function sql_affectedrows() function sql_affectedrows()
{ {
return (!empty($this->query_result)) ? @sqlsrv_rows_affected($this->query_result) : false; return ($this->db_connect_id) ? @sqlsrv_rows_affected($this->query_result) : false;
} }
/** /**
@ -409,7 +409,7 @@ class phpbb_db_driver_mssqlnative extends phpbb_db_driver_mssql_base
$query_id = $this->query_result; $query_id = $this->query_result;
} }
if ($cache->sql_exists($query_id)) if ($cache && $cache->sql_exists($query_id))
{ {
return $cache->sql_fetchrow($query_id); return $cache->sql_fetchrow($query_id);
} }
@ -474,9 +474,9 @@ class phpbb_db_driver_mssqlnative extends phpbb_db_driver_mssql_base
return $cache->sql_freeresult($query_id); return $cache->sql_freeresult($query_id);
} }
if (isset($this->open_queries[$query_id])) if (isset($this->open_queries[(int) $query_id]))
{ {
unset($this->open_queries[$query_id]); unset($this->open_queries[(int) $query_id]);
return @sqlsrv_free_stmt($query_id); return @sqlsrv_free_stmt($query_id);
} }
return false; return false;

View file

@ -46,7 +46,7 @@ function send_avatar_to_browser($file, $browser)
$image_data = @getimagesize($file_path); $image_data = @getimagesize($file_path);
header('Content-Type: ' . image_type_to_mime_type($image_data[2])); header('Content-Type: ' . image_type_to_mime_type($image_data[2]));
if (strpos(strtolower($browser), 'msie') !== false && strpos(strtolower($browser), 'msie 8.0') === false) if ((strpos(strtolower($user->browser), 'msie') !== false) && !phpbb_is_greater_ie_version($browser, 7))
{ {
header('Content-Disposition: attachment; ' . header_filename($file)); header('Content-Disposition: attachment; ' . header_filename($file));
@ -174,10 +174,9 @@ function send_file_to_browser($attachment, $upload_dir, $category)
header('Pragma: public'); header('Pragma: public');
// Send out the Headers. Do not set Content-Disposition to inline please, it is a security measure for users using the Internet Explorer. // Send out the Headers. Do not set Content-Disposition to inline please, it is a security measure for users using the Internet Explorer.
$is_ie8 = (strpos(strtolower($user->browser), 'msie 8.0') !== false);
header('Content-Type: ' . $attachment['mimetype']); header('Content-Type: ' . $attachment['mimetype']);
if ($is_ie8) if (phpbb_is_greater_ie_version($user->browser, 7))
{ {
header('X-Content-Type-Options: nosniff'); header('X-Content-Type-Options: nosniff');
} }
@ -189,7 +188,7 @@ function send_file_to_browser($attachment, $upload_dir, $category)
} }
else else
{ {
if (empty($user->browser) || (!$is_ie8 && (strpos(strtolower($user->browser), 'msie') !== false))) if (empty($user->browser) || ((strpos(strtolower($user->browser), 'msie') !== false) && !phpbb_is_greater_ie_version($user->browser, 7)))
{ {
header('Content-Disposition: attachment; ' . header_filename(htmlspecialchars_decode($attachment['real_filename']))); header('Content-Disposition: attachment; ' . header_filename(htmlspecialchars_decode($attachment['real_filename'])));
if (empty($user->browser) || (strpos(strtolower($user->browser), 'msie 6.0') !== false)) if (empty($user->browser) || (strpos(strtolower($user->browser), 'msie 6.0') !== false))
@ -200,7 +199,7 @@ function send_file_to_browser($attachment, $upload_dir, $category)
else else
{ {
header('Content-Disposition: ' . ((strpos($attachment['mimetype'], 'image') === 0) ? 'inline' : 'attachment') . '; ' . header_filename(htmlspecialchars_decode($attachment['real_filename']))); header('Content-Disposition: ' . ((strpos($attachment['mimetype'], 'image') === 0) ? 'inline' : 'attachment') . '; ' . header_filename(htmlspecialchars_decode($attachment['real_filename'])));
if ($is_ie8 && (strpos($attachment['mimetype'], 'image') !== 0)) if (phpbb_is_greater_ie_version($user->browser, 7) && (strpos($attachment['mimetype'], 'image') !== 0))
{ {
header('X-Download-Options: noopen'); header('X-Download-Options: noopen');
} }
@ -410,7 +409,8 @@ function set_modified_headers($stamp, $browser)
// let's see if we have to send the file at all // let's see if we have to send the file at all
$last_load = $request->header('Modified-Since') ? strtotime(trim($request->header('Modified-Since'))) : false; $last_load = $request->header('Modified-Since') ? strtotime(trim($request->header('Modified-Since'))) : false;
if ((strpos(strtolower($browser), 'msie 6.0') === false) && (strpos(strtolower($browser), 'msie 8.0') === false))
if (strpos(strtolower($browser), 'msie 6.0') === false && !phpbb_is_greater_ie_version($browser, 7))
{ {
if ($last_load !== false && $last_load >= $stamp) if ($last_load !== false && $last_load >= $stamp)
{ {
@ -721,3 +721,24 @@ function phpbb_download_clean_filename($filename)
return $filename; return $filename;
} }
/**
* Check if the browser is internet explorer version 7+
*
* @param string $user_agent User agent HTTP header
* @param int $version IE version to check against
*
* @return bool true if internet explorer version is greater than $version
*/
function phpbb_is_greater_ie_version($user_agent, $version)
{
if (preg_match('/msie (\d+)/', strtolower($user_agent), $matches))
{
$ie_version = (int) $matches[1];
return ($ie_version > $version);
}
else
{
return false;
}
}

View file

@ -1653,7 +1653,7 @@ function validate_username($username, $allowed_username = false)
*/ */
function validate_password($password) function validate_password($password)
{ {
global $config, $db, $user; global $config;
if ($password === '' || $config['pass_complex'] === 'PASS_TYPE_ANY') if ($password === '' || $config['pass_complex'] === 'PASS_TYPE_ANY')
{ {

View file

@ -691,7 +691,7 @@ class ucp_groups
} }
} }
if (!$update) if (isset($phpbb_avatar_manager) && !$update)
{ {
// Merge any avatars errors into the primary error array // Merge any avatars errors into the primary error array
$error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error)); $error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error));

View file

@ -74,6 +74,10 @@ function insert_single(user)
<dt><label for="msn">{L_MSNM}{L_COLON}</label></dt> <dt><label for="msn">{L_MSNM}{L_COLON}</label></dt>
<dd><input type="text" name="msn" id="msn" value="{MSNM}" class="inputbox" /></dd> <dd><input type="text" name="msn" id="msn" value="{MSNM}" class="inputbox" /></dd>
</dl> </dl>
<dl>
<dt><label for="jabber">{L_JABBER}:</label></dt>
<dd><input type="text" name="jabber" id="jabber" value="{JABBER}" class="inputbox" /></dd>
</dl>
</fieldset> </fieldset>
<fieldset class="fields1 column2"> <fieldset class="fields1 column2">

View file

@ -0,0 +1,130 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_download.php';
class phpbb_download_http_user_agent_test extends phpbb_test_case
{
public function user_agents_check_greater_ie_version()
{
return array(
// user agent
// IE version
// expected
array(
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)',
7,
true,
),
array(
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
7,
true,
),
array(
'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)',
7,
true,
),
array(
'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)',
7,
false,
),
array(
'Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
7,
false,
),
array(
'Mozilla/4.0 (compatible; MSIE 6.01; Windows NT 6.0)',
7,
false,
),
array(
'Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)',
7,
false,
),
array(
'Mozilla/5.0 (Windows NT 6.2; Win64; x64;) Gecko/20100101 Firefox/20.0',
7,
false,
),
array(
'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36',
7,
false,
),
array(
'Googlebot-Image/1.0',
7,
false,
),
array(
'Googlebot/2.1 ( http://www.google.com/bot.html)',
7,
false,
),
array(
'Lynx/2.8.3dev.9 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.6',
7,
false,
),
array(
'Links (0.9x; Linux 2.4.7-10 i686)',
7,
false,
),
array(
'Opera/9.60 (Windows NT 5.1; U; de) Presto/2.1.1',
7,
false,
),
array(
'Mozilla/4.0 (compatible; MSIE 5.0; Windows NT;)',
7,
false,
),
array(
'Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 4.0) Opera 6.01 [en]',
7,
false,
),
array(
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.24',
7,
false,
),
array(
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)',
8,
true,
),
array(
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
9,
true,
),
array(
'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)',
10,
false,
),
);
}
/**
* @dataProvider user_agents_check_greater_ie_version
*/
public function test_is_greater_ie_version($user_agent, $version, $expected)
{
$this->assertEquals($expected, phpbb_is_greater_ie_version($user_agent, $version));
}
}

View file

@ -12,34 +12,25 @@
*/ */
class phpbb_functional_extension_acp_test extends phpbb_functional_test_case class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
{ {
static private $copied_files = array();
static private $helper; static private $helper;
/** static protected $fixtures = array(
* This should only be called once before the tests are run. './',
* This is used to copy the extensions to the phpBB install );
*/
static public function setUpBeforeClass() static public function setUpBeforeClass()
{ {
global $phpbb_root_path;
parent::setUpBeforeClass(); parent::setUpBeforeClass();
self::$helper = new phpbb_test_case_helpers(self); self::$helper = new phpbb_test_case_helpers(self);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/../extension/ext/', self::$fixtures);
self::$copied_files = array();
if (file_exists($phpbb_root_path . 'ext/'))
{
// First, move any extensions setup on the board to a temp directory
self::$copied_files = self::$helper->copy_dir($phpbb_root_path . 'ext/', $phpbb_root_path . 'store/temp_ext/');
// Then empty the ext/ directory on the board (for accurate test cases)
self::$helper->empty_dir($phpbb_root_path . 'ext/');
} }
// Copy our ext/ files from the test case to the board static public function tearDownAfterClass()
self::$copied_files = array_merge(self::$copied_files, self::$helper->copy_dir(dirname(__FILE__) . '/../extension/ext/', $phpbb_root_path . 'ext/')); {
parent::tearDownAfterClass();
self::$helper->restore_original_ext_dir();
} }
public function setUp() public function setUp()
@ -84,29 +75,6 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
$this->add_lang('acp/extensions'); $this->add_lang('acp/extensions');
} }
/**
* This should only be called once after the tests are run.
* This is used to remove the files copied to the phpBB install
*/
static public function tearDownAfterClass()
{
global $phpbb_root_path;
if (file_exists($phpbb_root_path . 'store/temp_ext/'))
{
// Copy back the board installed extensions from the temp directory
self::$helper->copy_dir($phpbb_root_path . 'store/temp_ext/', $phpbb_root_path . 'ext/');
}
// Remove all of the files we copied around (from board ext -> temp_ext, from test ext -> board ext)
self::$helper->remove_files(self::$copied_files);
if (file_exists($phpbb_root_path . 'store/temp_ext/'))
{
self::$helper->empty_dir($phpbb_root_path . 'store/temp_ext/');
}
}
public function test_list() public function test_list()
{ {
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid); $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid);

View file

@ -15,65 +15,27 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
{ {
protected $phpbb_extension_manager; protected $phpbb_extension_manager;
static private $helper;
static protected $fixtures = array( static protected $fixtures = array(
'foo/bar/config/routing.yml', 'foo/bar/config/',
'foo/bar/config/services.yml', 'foo/bar/controller/',
'foo/bar/controller/controller.php', 'foo/bar/styles/prosilver/template/',
'foo/bar/styles/prosilver/template/foo_bar_body.html',
); );
/**
* This should only be called once before the tests are run.
* This is used to copy the fixtures to the phpBB install
*/
static public function setUpBeforeClass() static public function setUpBeforeClass()
{ {
global $phpbb_root_path;
parent::setUpBeforeClass(); parent::setUpBeforeClass();
$directories = array( self::$helper = new phpbb_test_case_helpers(self);
$phpbb_root_path . 'ext/foo/bar/', self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
$phpbb_root_path . 'ext/foo/bar/config/',
$phpbb_root_path . 'ext/foo/bar/controller/',
$phpbb_root_path . 'ext/foo/bar/styles/prosilver/template',
);
foreach ($directories as $dir)
{
if (!is_dir($dir))
{
mkdir($dir, 0777, true);
}
} }
foreach (self::$fixtures as $fixture)
{
copy(
"tests/functional/fixtures/ext/$fixture",
"{$phpbb_root_path}ext/$fixture");
}
}
/**
* This should only be called once after the tests are run.
* This is used to remove the fixtures from the phpBB install
*/
static public function tearDownAfterClass() static public function tearDownAfterClass()
{ {
global $phpbb_root_path; parent::tearDownAfterClass();
foreach (self::$fixtures as $fixture) self::$helper->restore_original_ext_dir();
{
unlink("{$phpbb_root_path}ext/$fixture");
}
rmdir("{$phpbb_root_path}ext/foo/bar/config");
rmdir("{$phpbb_root_path}ext/foo/bar/controller");
rmdir("{$phpbb_root_path}ext/foo/bar/styles/prosilver/template");
rmdir("{$phpbb_root_path}ext/foo/bar/styles/prosilver");
rmdir("{$phpbb_root_path}ext/foo/bar/styles");
rmdir("{$phpbb_root_path}ext/foo/bar");
rmdir("{$phpbb_root_path}ext/foo");
} }
public function setUp() public function setUp()

View file

@ -16,56 +16,26 @@ require_once dirname(__FILE__) . '/../../phpBB/includes/acp/acp_modules.php';
class phpbb_functional_extension_module_test extends phpbb_functional_test_case class phpbb_functional_extension_module_test extends phpbb_functional_test_case
{ {
protected $phpbb_extension_manager; protected $phpbb_extension_manager;
static private $copied_files = array();
static private $helper; static private $helper;
/** static protected $fixtures = array(
* This should only be called once before the tests are run. './',
* This is used to copy the fixtures to the phpBB install );
*/
static public function setUpBeforeClass() static public function setUpBeforeClass()
{ {
global $phpbb_root_path;
parent::setUpBeforeClass(); parent::setUpBeforeClass();
self::$helper = new phpbb_test_case_helpers(self); self::$helper = new phpbb_test_case_helpers(self);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
self::$copied_files = array();
if (file_exists($phpbb_root_path . 'ext/'))
{
// First, move any extensions setup on the board to a temp directory
self::$copied_files = self::$helper->copy_dir($phpbb_root_path . 'ext/', $phpbb_root_path . 'store/temp_ext/');
// Then empty the ext/ directory on the board (for accurate test cases)
self::$helper->empty_dir($phpbb_root_path . 'ext/');
} }
// Copy our ext/ files from the test case to the board
self::$copied_files = array_merge(self::$copied_files, self::$helper->copy_dir(dirname(__FILE__) . '/fixtures/ext/', $phpbb_root_path . 'ext/'));
}
/**
* This should only be called once after the tests are run.
* This is used to remove the fixtures from the phpBB install
*/
static public function tearDownAfterClass() static public function tearDownAfterClass()
{ {
global $phpbb_root_path; parent::tearDownAfterClass();
if (file_exists($phpbb_root_path . 'store/temp_ext/')) self::$helper->restore_original_ext_dir();
{
// Copy back the board installed extensions from the temp directory
self::$helper->copy_dir($phpbb_root_path . 'store/temp_ext/', $phpbb_root_path . 'ext/');
}
// Remove all of the files we copied around (from board ext -> temp_ext, from test ext -> board ext)
self::$helper->remove_files(self::$copied_files);
if (file_exists($phpbb_root_path . 'store/temp_ext/'))
{
self::$helper->empty_dir($phpbb_root_path . 'store/temp_ext/');
}
} }
public function setUp() public function setUp()

View file

@ -16,59 +16,23 @@ class phpbb_functional_extension_permission_lang_test extends phpbb_functional_t
static private $helper; static private $helper;
static private $copied_files = array();
static protected $fixtures = array( static protected $fixtures = array(
'foo/bar/language/en/', 'foo/bar/language/en/',
); );
/**
* This should only be called once before the tests are run.
* This is used to copy the fixtures to the phpBB install
*/
static public function setUpBeforeClass() static public function setUpBeforeClass()
{ {
global $phpbb_root_path;
parent::setUpBeforeClass(); parent::setUpBeforeClass();
self::$helper = new phpbb_test_case_helpers(self); self::$helper = new phpbb_test_case_helpers(self);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
self::$copied_files = array();
if (file_exists($phpbb_root_path . 'ext/'))
{
// First, move any extensions setup on the board to a temp directory
self::$copied_files = self::$helper->copy_dir($phpbb_root_path . 'ext/', $phpbb_root_path . 'store/temp_ext/');
// Then empty the ext/ directory on the board (for accurate test cases)
self::$helper->empty_dir($phpbb_root_path . 'ext/');
} }
// Copy our ext/ files from the test case to the board
self::$copied_files = array_merge(self::$copied_files, self::$helper->copy_dir(dirname(__FILE__) . '/fixtures/ext/' . $fixture, $phpbb_root_path . 'ext/' . $fixture));
}
/**
* This should only be called once after the tests are run.
* This is used to remove the fixtures from the phpBB install
*/
static public function tearDownAfterClass() static public function tearDownAfterClass()
{ {
global $phpbb_root_path; parent::tearDownAfterClass();
if (file_exists($phpbb_root_path . 'store/temp_ext/')) self::$helper->restore_original_ext_dir();
{
// Copy back the board installed extensions from the temp directory
self::$helper->copy_dir($phpbb_root_path . 'store/temp_ext/', $phpbb_root_path . 'ext/');
}
// Remove all of the files we copied around (from board ext -> temp_ext, from test ext -> board ext)
self::$helper->remove_files(self::$copied_files);
if (file_exists($phpbb_root_path . 'store/temp_ext/'))
{
self::$helper->empty_dir($phpbb_root_path . 'store/temp_ext/');
}
} }
public function setUp() public function setUp()

View file

@ -16,47 +16,25 @@ class phpbb_functional_metadata_manager_test extends phpbb_functional_test_case
{ {
protected $phpbb_extension_manager; protected $phpbb_extension_manager;
static private $helpers; static private $helper;
static protected $fixtures = array( static protected $fixtures = array(
'foo/bar/', 'foo/bar/',
); );
/**
* This should only be called once before the tests are run.
* This is used to copy the fixtures to the phpBB install
*/
static public function setUpBeforeClass() static public function setUpBeforeClass()
{ {
global $phpbb_root_path;
parent::setUpBeforeClass(); parent::setUpBeforeClass();
self::$helpers = new phpbb_test_case_helpers(self); self::$helper = new phpbb_test_case_helpers(self);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
if (!file_exists($phpbb_root_path . 'ext/foo/bar/'))
{
self::$helpers->makedirs($phpbb_root_path . 'ext/foo/bar/');
} }
foreach (self::$fixtures as $fixture)
{
self::$helpers->copy_dir(dirname(__FILE__) . '/fixtures/ext/' . $fixture, $phpbb_root_path . 'ext/' . $fixture);
}
}
/**
* This should only be called once after the tests are run.
* This is used to remove the fixtures from the phpBB install
*/
static public function tearDownAfterClass() static public function tearDownAfterClass()
{ {
global $phpbb_root_path; parent::tearDownAfterClass();
foreach (self::$fixtures as $fixture) self::$helper->restore_original_ext_dir();
{
self::$helpers->empty_dir($phpbb_root_path . 'ext/' . $fixture);
}
self::$helpers->empty_dir($phpbb_root_path . 'ext/foo/');
} }
public function setUp() public function setUp()

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_users">
<column>user_id</column>
<column>username</column>
<column>username_clean</column>
<column>user_permissions</column>
<column>user_sig</column>
<column>user_occ</column>
<column>user_interests</column>
<column>user_email_hash</column>
<row>
<value>1</value>
<value>admin</value>
<value>admin</value>
<value></value>
<value></value>
<value></value>
<value></value>
<value>143317126117</value>
</row>
</table>
</dataset>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_groups">
<column>group_name</column>
<column>group_desc</column>
<row>
<value>foobar_group</value>
<value>test123</value>
</row>
</table>
<table name="phpbb_users">
<column>user_id</column>
<column>username</column>
<column>username_clean</column>
<column>user_permissions</column>
<column>user_sig</column>
<column>user_occ</column>
<column>user_interests</column>
<row>
<value>1</value>
<value>admin</value>
<value>admin</value>
<value></value>
<value></value>
<value></value>
<value></value>
</row>
<row>
<value>2</value>
<value>moderator</value>
<value>moderator</value>
<value></value>
<value></value>
<value></value>
<value></value>
</row>
</table>
</dataset>

View file

@ -0,0 +1,36 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
class phpbb_functions_validate_data_helper
{
protected $test_case;
public function __construct($test_case)
{
$this->test_case = $test_case;
}
/**
* Test provided input data with supplied checks and compare to expected
* results
*
* @param array $data Array containing one or more subarrays with the
* test data. The first element of a subarray is the
* expected result, the second one is the input, and the
* third is the data that should be passed to the function
* validate_data().
*/
public function assert_valid_data($data)
{
foreach ($data as $key => $test)
{
$this->test_case->assertEquals($test[0], validate_data(array($test[1]), array($test[2])));
}
}
}

View file

@ -0,0 +1,82 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
require_once dirname(__FILE__) . '/validate_data_helper.php';
class phpbb_functions_validate_date_test extends phpbb_test_case
{
protected $helper;
protected function setUp()
{
parent::setUp();
$this->helper = new phpbb_functions_validate_data_helper($this);
}
public function test_validate_date()
{
$this->helper->assert_valid_data(array(
'empty' => array(
array('INVALID'),
'',
array('date'),
),
'empty_opt' => array(
array(),
'',
array('date', true),
),
'double_single' => array(
array(),
'17-06-1990',
array('date'),
),
'single_single' => array(
array(),
'05-05-2009',
array('date'),
),
'double_double' => array(
array(),
'17-12-1990',
array('date'),
),
'month_high' => array(
array('INVALID'),
'17-17-1990',
array('date'),
),
'month_low' => array(
array('INVALID'),
'01-00-1990',
array('date'),
),
'day_high' => array(
array('INVALID'),
'64-01-1990',
array('date'),
),
'day_low' => array(
array('INVALID'),
'00-12-1990',
array('date'),
),
// Currently fails
/*
'zero_year' => array(
array(),
'01-01-0000',
array('date'),
),
*/
));
}
}

View file

@ -0,0 +1,108 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
require_once dirname(__FILE__) . '/../mock/user.php';
require_once dirname(__FILE__) . '/validate_data_helper.php';
class phpbb_functions_validate_email_test extends phpbb_database_test_case
{
protected $db;
protected $user;
protected $helper;
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/validate_email.xml');
}
protected function setUp()
{
parent::setUp();
$this->db = $this->new_dbal();
$this->user = new phpbb_mock_user;
$this->helper = new phpbb_functions_validate_data_helper($this);
}
/**
* Get validation prerequesites
*
* @param bool $check_mx Whether mx records should be checked
*/
protected function set_validation_prerequisites($check_mx)
{
global $config, $db, $user;
$config['email_check_mx'] = $check_mx;
$db = $this->db;
$user = $this->user;
$user->optionset('banned_users', array('banned@example.com'));
}
public function test_validate_email()
{
$this->set_validation_prerequisites(false);
$this->helper->assert_valid_data(array(
'empty' => array(
array(),
'',
array('email'),
),
'allowed' => array(
array(),
'foobar@example.com',
array('email', 'foobar@example.com'),
),
'invalid' => array(
array('EMAIL_INVALID'),
'fööbar@example.com',
array('email'),
),
'valid_complex' => array(
array(),
"'%$~test@example.com",
array('email'),
),
'taken' => array(
array('EMAIL_TAKEN'),
'admin@example.com',
array('email'),
),
'banned' => array(
array('EMAIL_BANNED'),
'banned@example.com',
array('email'),
),
));
}
/**
* @group slow
*/
public function test_validate_email_mx()
{
$this->set_validation_prerequisites(true);
$this->helper->assert_valid_data(array(
'valid' => array(
array(),
'foobar@phpbb.com',
array('email'),
),
'no_mx' => array(
array('DOMAIN_NO_MX_RECORD'),
'test@does-not-exist.phpbb.com',
array('email'),
),
));
}
}

View file

@ -0,0 +1,79 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
require_once dirname(__FILE__) . '/validate_data_helper.php';
class phpbb_functions_validate_jabber_test extends phpbb_test_case
{
protected $helper;
protected function setUp()
{
parent::setUp();
$this->helper = new phpbb_functions_validate_data_helper($this);
}
public function test_validate_jabber()
{
$this->helper->assert_valid_data(array(
'empty' => array(
array(),
'',
array('jabber'),
),
'no_seperator' => array(
array('WRONG_DATA'),
'testjabber.ccc',
array('jabber'),
),
'no_user' => array(
array('WRONG_DATA'),
'@jabber.ccc',
array('jabber'),
),
'no_realm' => array(
array('WRONG_DATA'),
'user@',
array('jabber'),
),
'dot_realm' => array(
array('WRONG_DATA'),
'user@.....',
array('jabber'),
),
'-realm' => array(
array('WRONG_DATA'),
'user@-jabber.ccc',
array('jabber'),
),
'realm-' => array(
array('WRONG_DATA'),
'user@jabber.ccc-',
array('jabber'),
),
'correct' => array(
array(),
'user@jabber.09A-z.org',
array('jabber'),
),
'prohibited' => array(
array('WRONG_DATA'),
'u@ser@jabber.ccc.org',
array('jabber'),
),
'prohibited_char' => array(
array('WRONG_DATA'),
'u<s>er@jabber.ccc.org',
array('jabber'),
),
));
}
}

View file

@ -0,0 +1,60 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
require_once dirname(__FILE__) . '/validate_data_helper.php';
class phpbb_functions_validate_lang_iso_test extends phpbb_database_test_case
{
protected $db;
protected $helper;
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/language_select.xml');
}
protected function setUp()
{
parent::setUp();
$this->db = $this->new_dbal();
$this->helper = new phpbb_functions_validate_data_helper($this);
}
public function test_validate_lang_iso()
{
global $db;
$db = $this->db;
$this->helper->assert_valid_data(array(
'empty' => array(
array('WRONG_DATA'),
'',
array('language_iso_name'),
),
'en' => array(
array(),
'en',
array('language_iso_name'),
),
'cs' => array(
array(),
'cs',
array('language_iso_name'),
),
'de' => array(
array('WRONG_DATA'),
'de',
array('language_iso_name'),
),
));
}
}

View file

@ -0,0 +1,49 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
require_once dirname(__FILE__) . '/validate_data_helper.php';
class phpbb_functions_validate_match_test extends phpbb_test_case
{
protected $helper;
protected function setUp()
{
parent::setUp();
$this->helper = new phpbb_functions_validate_data_helper($this);
}
public function test_validate_match()
{
$this->helper->assert_valid_data(array(
'empty_opt' => array(
array(),
'',
array('match', true, '/[a-z]$/'),
),
'empty_empty_match' => array(
array(),
'',
array('match'),
),
'foobar' => array(
array(),
'foobar',
array('match', false, '/[a-z]$/'),
),
'foobar_fail' => array(
array('WRONG_DATA'),
'foobar123',
array('match', false, '/[a-z]$/'),
),
));
}
}

View file

@ -0,0 +1,59 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
require_once dirname(__FILE__) . '/validate_data_helper.php';
class phpbb_functions_validate_num_test extends phpbb_test_case
{
protected $helper;
protected function setUp()
{
parent::setUp();
$this->helper = new phpbb_functions_validate_data_helper($this);
}
public function test_validate_num()
{
$this->helper->assert_valid_data(array(
'empty' => array(
array(),
'',
array('num'),
),
'zero' => array(
array(),
'0',
array('num'),
),
'five_minmax_correct' => array(
array(),
'5',
array('num', false, 2, 6),
),
'five_minmax_short' => array(
array('TOO_SMALL'),
'5',
array('num', false, 7, 10),
),
'five_minmax_long' => array(
array('TOO_LARGE'),
'5',
array('num', false, 2, 3),
),
'string' => array(
array(),
'foobar',
array('num'),
),
));
}
}

View file

@ -0,0 +1,96 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
require_once dirname(__FILE__) . '/validate_data_helper.php';
class phpbb_functions_validate_password_test extends phpbb_test_case
{
protected $helper;
protected function setUp()
{
parent::setUp();
$this->helper = new phpbb_functions_validate_data_helper($this);
}
public function validate_password_data()
{
return array(
array('PASS_TYPE_ANY', array(
'empty' => array(),
'foobar_any' => array(),
'foobar_mixed' => array(),
'foobar_alpha' => array(),
'foobar_symbol' => array(),
)),
array('PASS_TYPE_CASE', array(
'empty' => array(),
'foobar_any' => array('INVALID_CHARS'),
'foobar_mixed' => array(),
'foobar_alpha' => array(),
'foobar_symbol' => array(),
)),
array('PASS_TYPE_ALPHA', array(
'empty' => array(),
'foobar_any' => array('INVALID_CHARS'),
'foobar_mixed' => array('INVALID_CHARS'),
'foobar_alpha' => array(),
'foobar_symbol' => array(),
)),
array('PASS_TYPE_SYMBOL', array(
'empty' => array(),
'foobar_any' => array('INVALID_CHARS'),
'foobar_mixed' => array('INVALID_CHARS'),
'foobar_alpha' => array('INVALID_CHARS'),
'foobar_symbol' => array(),
)),
);
}
/**
* @dataProvider validate_password_data
*/
public function test_validate_password($pass_complexity, $expected)
{
global $config;
// Set complexity to mixed case letters, numbers and symbols
$config['pass_complex'] = $pass_complexity;
$this->helper->assert_valid_data(array(
'empty' => array(
$expected['empty'],
'',
array('password'),
),
'foobar_any' => array(
$expected['foobar_any'],
'foobar',
array('password'),
),
'foobar_mixed' => array(
$expected['foobar_mixed'],
'FooBar',
array('password'),
),
'foobar_alpha' => array(
$expected['foobar_alpha'],
'F00bar',
array('password'),
),
'foobar_symbol' => array(
$expected['foobar_symbol'],
'fooBar123*',
array('password'),
),
));
}
}

View file

@ -0,0 +1,70 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php';
require_once dirname(__FILE__) . '/validate_data_helper.php';
class phpbb_functions_validate_string_test extends phpbb_test_case
{
protected $helper;
protected function setUp()
{
parent::setUp();
$this->helper = new phpbb_functions_validate_data_helper($this);
}
public function test_validate_string()
{
$this->helper->assert_valid_data(array(
'empty_opt' => array(
array(),
'',
array('string', true),
),
'empty' => array(
array(),
'',
array('string'),
),
'foo' => array(
array(),
'foobar',
array('string'),
),
'foo_minmax_correct' => array(
array(),
'foobar',
array('string', false, 2, 6),
),
'foo_minmax_short' => array(
array('TOO_SHORT'),
'foobar',
array('string', false, 7, 9),
),
'foo_minmax_long' => array(
array('TOO_LONG'),
'foobar',
array('string', false, 2, 5),
),
'empty_short' => array(
array('TOO_SHORT'),
'',
array('string', false, 1, 6),
),
'empty_length_opt' => array(
array(),
'',
array('string', true, 1, 6),
),
));
}
}

View file

@ -0,0 +1,190 @@
<?php
/**
*
* @package testing
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php';
require_once dirname(__FILE__) . '/../mock/cache.php';
require_once dirname(__FILE__) . '/validate_data_helper.php';
class phpbb_functions_validate_data_test extends phpbb_database_test_case
{
protected $db;
protected $cache;
protected $helper;
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/validate_username.xml');
}
protected function setUp()
{
parent::setUp();
$this->db = $this->new_dbal();
$this->cache = new phpbb_mock_cache;
$this->helper = new phpbb_functions_validate_data_helper($this);
}
public function validate_username_data()
{
return array(
array('USERNAME_CHARS_ANY', array(
'foobar_allow' => array(),
'foobar_ascii' => array(),
'foobar_any' => array(),
'foobar_alpha' => array(),
'foobar_alpha_spacers' => array(),
'foobar_letter_num' => array(),
'foobar_letter_num_sp' => array(),
'foobar_quot' => array('INVALID_CHARS'),
'barfoo_disallow' => array('USERNAME_DISALLOWED'),
'admin_taken' => array('USERNAME_TAKEN'),
'group_taken' => array('USERNAME_TAKEN'),
)),
array('USERNAME_ALPHA_ONLY', array(
'foobar_allow' => array(),
'foobar_ascii' => array(),
'foobar_any' => array('INVALID_CHARS'),
'foobar_alpha' => array(),
'foobar_alpha_spacers' => array('INVALID_CHARS'),
'foobar_letter_num' => array(),
'foobar_letter_num_sp' => array('INVALID_CHARS'),
'foobar_quot' => array('INVALID_CHARS'),
'barfoo_disallow' => array('USERNAME_DISALLOWED'),
'admin_taken' => array('USERNAME_TAKEN'),
'group_taken' => array('INVALID_CHARS'),
)),
array('USERNAME_ALPHA_SPACERS', array(
'foobar_allow' => array(),
'foobar_ascii' => array(),
'foobar_any' => array('INVALID_CHARS'),
'foobar_alpha' => array(),
'foobar_alpha_spacers' => array(),
'foobar_letter_num' => array(),
'foobar_letter_num_sp' => array('INVALID_CHARS'),
'foobar_quot' => array('INVALID_CHARS'),
'barfoo_disallow' => array('USERNAME_DISALLOWED'),
'admin_taken' => array('USERNAME_TAKEN'),
'group_taken' => array('USERNAME_TAKEN'),
)),
array('USERNAME_LETTER_NUM', array(
'foobar_allow' => array(),
'foobar_ascii' => array(),
'foobar_any' => array('INVALID_CHARS'),
'foobar_alpha' => array(),
'foobar_alpha_spacers' => array('INVALID_CHARS'),
'foobar_letter_num' => array(),
'foobar_letter_num_sp' => array('INVALID_CHARS'),
'foobar_quot' => array('INVALID_CHARS'),
'barfoo_disallow' => array('USERNAME_DISALLOWED'),
'admin_taken' => array('USERNAME_TAKEN'),
'group_taken' => array('INVALID_CHARS'),
)),
array('USERNAME_LETTER_NUM_SPACERS', array(
'foobar_allow' => array(),
'foobar_ascii' => array(),
'foobar_any' => array('INVALID_CHARS'),
'foobar_alpha' => array(),
'foobar_alpha_spacers' => array(),
'foobar_letter_num' => array(),
'foobar_letter_num_sp' => array(),
'foobar_quot' => array('INVALID_CHARS'),
'barfoo_disallow' => array('USERNAME_DISALLOWED'),
'admin_taken' => array('USERNAME_TAKEN'),
'group_taken' => array('USERNAME_TAKEN'),
)),
array('USERNAME_ASCII', array(
'foobar_allow' => array(),
'foobar_ascii' => array(),
'foobar_any' => array(),
'foobar_alpha' => array(),
'foobar_alpha_spacers' => array(),
'foobar_letter_num' => array(),
'foobar_letter_num_sp' => array('INVALID_CHARS'),
'foobar_quot' => array('INVALID_CHARS'),
'barfoo_disallow' => array('USERNAME_DISALLOWED'),
'admin_taken' => array('USERNAME_TAKEN'),
'group_taken' => array('USERNAME_TAKEN'),
)),
);
}
/**
* @dataProvider validate_username_data
*/
public function test_validate_username($allow_name_chars, $expected)
{
global $cache, $config, $db;
$db = $this->db;
$cache = $this->cache;
$cache->put('_disallowed_usernames', array('barfoo'));
$config['allow_name_chars'] = $allow_name_chars;
$this->helper->assert_valid_data(array(
'foobar_allow' => array(
$expected['foobar_allow'],
'foobar',
array('username', 'foobar'),
),
'foobar_ascii' => array(
$expected['foobar_ascii'],
'foobar',
array('username'),
),
'foobar_any' => array(
$expected['foobar_any'],
'f*~*^=oo_bar1',
array('username'),
),
'foobar_alpha' => array(
$expected['foobar_alpha'],
'fo0Bar',
array('username'),
),
'foobar_alpha_spacers' => array(
$expected['foobar_alpha_spacers'],
'Fo0-[B]_a+ R',
array('username'),
),
'foobar_letter_num' => array(
$expected['foobar_letter_num'],
'fo0Bar0',
array('username'),
),
'foobar_letter_num_sp' => array(
$expected['foobar_letter_num_sp'],
'Fö0-[B]_a+ R',
array('username'),
),
'foobar_quot' => array(
$expected['foobar_quot'],
'"foobar"',
array('username'),
),
'barfoo_disallow' => array(
$expected['barfoo_disallow'],
'barfoo',
array('username'),
),
'admin_taken' => array(
$expected['admin_taken'],
'admin',
array('username'),
),
'group_taken' => array(
$expected['group_taken'],
'foobar_group',
array('username'),
),
));
}
}

View file

@ -53,6 +53,21 @@ class phpbb_mock_cache implements phpbb_cache_driver_interface
); );
} }
/**
* Obtain disallowed usernames. Input data via standard put method.
*/
public function obtain_disallowed_usernames()
{
if (($usernames = $this->get('_disallowed_usernames')) !== false)
{
return $usernames;
}
else
{
return array();
}
}
public function checkVar(PHPUnit_Framework_Assert $test, $var_name, $data) public function checkVar(PHPUnit_Framework_Assert $test, $var_name, $data)
{ {
$test->assertTrue(isset($this->data[$var_name])); $test->assertTrue(isset($this->data[$var_name]));

View file

@ -33,4 +33,17 @@ class phpbb_mock_user
{ {
$this->options[$item] = $value; $this->options[$item] = $value;
} }
public function check_ban($user_id = false, $user_ips = false, $user_email = false, $return = false)
{
$banned_users = $this->optionget('banned_users');
foreach ($banned_users as $banned)
{
if ($banned == $user_id || $banned == $user_ips || $banned == $user_email)
{
return true;
}
}
return false;
}
} }

View file

@ -1,5 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<dataset> <dataset>
<table name="phpbb_bookmarks">
</table>
<table name="phpbb_notifications"> <table name="phpbb_notifications">
</table> </table>
<table name="phpbb_notification_types">
</table>
<table name="phpbb_topics_watch">
</table>
<table name="phpbb_user_notifications">
</table>
</dataset> </dataset>

View file

@ -62,6 +62,21 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
} }
} }
/**
* Performs synchronisations for a given table/column set on the database
*
* @param array $table_column_map Information about the tables/columns to synchronise
*
* @return null
*/
protected function database_synchronisation($table_column_map)
{
$config = $this->get_database_config();
$manager = $this->create_connection_manager($config);
$manager->connect();
$manager->database_synchronisation($table_column_map);
}
public function createXMLDataSet($path) public function createXMLDataSet($path)
{ {
$db_config = $this->get_database_config(); $db_config = $this->get_database_config();

View file

@ -479,12 +479,33 @@ class phpbb_database_test_connection_manager
* @return null * @return null
*/ */
public function post_setup_synchronisation($xml_data_set) public function post_setup_synchronisation($xml_data_set)
{
$table_names = $xml_data_set->getTableNames();
$tables = array();
foreach ($table_names as $table)
{
$tables[$table] = $xml_data_set->getTableMetaData($table)->getColumns();
}
$this->database_synchronisation($tables);
}
/**
* Performs synchronisations on the database after a fixture has been loaded
*
* @param array $table_column_map Array of tables/columns to synchronise
* array(table1 => array(column1, column2))
*
* @return null
*/
public function database_synchronisation($table_column_map)
{ {
$this->ensure_connected(__METHOD__); $this->ensure_connected(__METHOD__);
$queries = array(); $queries = array();
// Get escaped versions of the table names used in the fixture // Get escaped versions of the table names to synchronise
$table_names = array_map(array($this->pdo, 'PDO::quote'), $xml_data_set->getTableNames()); $table_names = array_map(array($this->pdo, 'PDO::quote'), array_keys($table_column_map));
switch ($this->config['dbms']) switch ($this->config['dbms'])
{ {
@ -541,7 +562,7 @@ class phpbb_database_test_connection_manager
while ($row = $result->fetch(PDO::FETCH_ASSOC)) while ($row = $result->fetch(PDO::FETCH_ASSOC))
{ {
// Get the columns used in the fixture for this table // Get the columns used in the fixture for this table
$column_names = $xml_data_set->getTableMetaData($row['table_name'])->getColumns(); $column_names = $table_column_map[$row['table_name']];
// Skip sequences that weren't specified in the fixture // Skip sequences that weren't specified in the fixture
if (!in_array($row['column_name'], $column_names)) if (!in_array($row['column_name'], $column_names))

View file

@ -219,15 +219,19 @@ class phpbb_functional_test_case extends phpbb_test_case
self::recreate_database(self::$config); self::recreate_database(self::$config);
if (file_exists($phpbb_root_path . "config.$phpEx")) $config_file = $phpbb_root_path . "config.$phpEx";
$config_file_dev = $phpbb_root_path . "config_dev.$phpEx";
$config_file_test = $phpbb_root_path . "config_test.$phpEx";
if (file_exists($config_file))
{ {
if (!file_exists($phpbb_root_path . "config_dev.$phpEx")) if (!file_exists($config_file_dev))
{ {
rename($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_dev.$phpEx"); rename($config_file, $config_file_dev);
} }
else else
{ {
unlink($phpbb_root_path . "config.$phpEx"); unlink($config_file);
} }
} }
@ -251,10 +255,12 @@ class phpbb_functional_test_case extends phpbb_test_case
self::assertContains('Welcome to Installation', $crawler->filter('#main')->text()); self::assertContains('Welcome to Installation', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(); $form = $crawler->selectButton('submit')->form();
// install/index.php?mode=install&sub=requirements
$crawler = self::submit($form); $crawler = self::submit($form);
self::assertContains('Installation compatibility', $crawler->filter('#main')->text()); self::assertContains('Installation compatibility', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(); $form = $crawler->selectButton('submit')->form();
// install/index.php?mode=install&sub=database
$crawler = self::submit($form); $crawler = self::submit($form);
self::assertContains('Database configuration', $crawler->filter('#main')->text()); self::assertContains('Database configuration', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(array( $form = $crawler->selectButton('submit')->form(array(
@ -268,10 +274,12 @@ class phpbb_functional_test_case extends phpbb_test_case
'table_prefix' => self::$config['table_prefix'], 'table_prefix' => self::$config['table_prefix'],
)); ));
// install/index.php?mode=install&sub=database
$crawler = self::submit($form); $crawler = self::submit($form);
self::assertContains('Successful connection', $crawler->filter('#main')->text()); self::assertContains('Successful connection', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(); $form = $crawler->selectButton('submit')->form();
// install/index.php?mode=install&sub=administrator
$crawler = self::submit($form); $crawler = self::submit($form);
self::assertContains('Administrator configuration', $crawler->filter('#main')->text()); self::assertContains('Administrator configuration', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(array( $form = $crawler->selectButton('submit')->form(array(
@ -282,16 +290,38 @@ class phpbb_functional_test_case extends phpbb_test_case
'board_email' => 'nobody@example.com', 'board_email' => 'nobody@example.com',
)); ));
// install/index.php?mode=install&sub=administrator
$crawler = self::submit($form); $crawler = self::submit($form);
self::assertContains('Tests passed', $crawler->filter('#main')->text()); self::assertContains('Tests passed', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(); $form = $crawler->selectButton('submit')->form();
$crawler = self::submit($form); // We have to skip install/index.php?mode=install&sub=config_file
self::assertContains('The configuration file has been written.', $crawler->filter('#main')->text()); // because that step will create a config.php file if phpBB has the
file_put_contents($phpbb_root_path . "config.$phpEx", phpbb_create_config_file_data(self::$config, self::$config['dbms'], true, true)); // permission to do so. We have to create the config file on our own
$form = $crawler->selectButton('submit')->form(); // in order to get the DEBUG constants defined.
$config_php_data = phpbb_create_config_file_data(self::$config, self::$config['dbms'], true, true);
$config_created = file_put_contents($config_file, $config_php_data) !== false;
if (!$config_created)
{
self::markTestSkipped("Could not write $config_file file.");
}
$crawler = self::submit($form); // We also have to create a install lock that is normally created by
// the installer. The file will be removed by the final step of the
// installer.
$install_lock_file = $phpbb_root_path . 'cache/install_lock';
$lock_created = file_put_contents($install_lock_file, '') !== false;
if (!$lock_created)
{
self::markTestSkipped("Could not create $lock_created file.");
}
@chmod($install_lock_file, 0666);
// install/index.php?mode=install&sub=advanced
$form_data = $form->getValues();
unset($form_data['submit']);
$crawler = self::request('POST', 'install/index.php?mode=install&sub=advanced', $form_data);
self::assertContains('The settings on this page are only necessary to set if you know that you require something different from the default.', $crawler->filter('#main')->text()); self::assertContains('The settings on this page are only necessary to set if you know that you require something different from the default.', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(array( $form = $crawler->selectButton('submit')->form(array(
'email_enable' => true, 'email_enable' => true,
@ -308,14 +338,17 @@ class phpbb_functional_test_case extends phpbb_test_case
'script_path' => $parseURL['path'], 'script_path' => $parseURL['path'],
)); ));
// install/index.php?mode=install&sub=create_table
$crawler = self::submit($form); $crawler = self::submit($form);
self::assertContains('The database tables used by phpBB', $crawler->filter('#main')->text()); self::assertContains('The database tables used by phpBB', $crawler->filter('#main')->text());
self::assertContains('have been created and populated with some initial data.', $crawler->filter('#main')->text()); self::assertContains('have been created and populated with some initial data.', $crawler->filter('#main')->text());
$form = $crawler->selectButton('submit')->form(); $form = $crawler->selectButton('submit')->form();
// install/index.php?mode=install&sub=final
$crawler = self::submit($form); $crawler = self::submit($form);
self::assertContains('You have successfully installed', $crawler->text()); self::assertContains('You have successfully installed', $crawler->text());
copy($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_test.$phpEx");
copy($config_file, $config_file_test);
} }
static private function recreate_database($config) static private function recreate_database($config)

View file

@ -18,6 +18,56 @@ class phpbb_test_case_helpers
$this->test_case = $test_case; $this->test_case = $test_case;
} }
/**
* This should only be called once before the tests are run.
* This is used to copy the fixtures to the phpBB install
*/
public function copy_ext_fixtures($fixtures_dir, $fixtures)
{
global $phpbb_root_path;
if (file_exists($phpbb_root_path . 'ext/'))
{
// First, move any extensions setup on the board to a temp directory
$this->copy_dir($phpbb_root_path . 'ext/', $phpbb_root_path . 'store/temp_ext/');
// Then empty the ext/ directory on the board (for accurate test cases)
$this->empty_dir($phpbb_root_path . 'ext/');
}
// Copy our ext/ files from the test case to the board
foreach ($fixtures as $fixture)
{
$this->copy_dir($fixtures_dir . $fixture, $phpbb_root_path . 'ext/' . $fixture);
}
}
/**
* This should only be called once after the tests are run.
* This is used to remove the fixtures from the phpBB install
*/
public function restore_original_ext_dir()
{
global $phpbb_root_path;
// Remove all of the files we copied from test ext -> board ext
$this->empty_dir($phpbb_root_path . 'ext/');
// Copy back the board installed extensions from the temp directory
if (file_exists($phpbb_root_path . 'store/temp_ext/'))
{
$this->copy_dir($phpbb_root_path . 'store/temp_ext/', $phpbb_root_path . 'ext/');
// Remove all of the files we copied from board ext -> temp_ext
$this->empty_dir($phpbb_root_path . 'store/temp_ext/');
}
if (file_exists($phpbb_root_path . 'store/temp_ext/'))
{
$this->empty_dir($phpbb_root_path . 'store/temp_ext/');
}
}
public function setExpectedTriggerError($errno, $message = '') public function setExpectedTriggerError($errno, $message = '')
{ {
$exceptionName = ''; $exceptionName = '';
@ -202,27 +252,6 @@ class phpbb_test_case_helpers
return $copied_files; return $copied_files;
} }
/**
* Remove files/directories that are listed in an array
* Designed for use with $this->copy_dir()
*
* @param array $file_list
*/
public function remove_files($file_list)
{
foreach ($file_list as $file)
{
if (is_dir($file))
{
rmdir($file);
}
else
{
unlink($file);
}
}
}
/** /**
* Empty directory (remove any subdirectories/files below) * Empty directory (remove any subdirectories/files below)
* *

View file

@ -59,13 +59,13 @@ class phpbb_tests_tree_nestedset_forum_base extends phpbb_database_test_case
$this->set = new phpbb_tree_nestedset_forum($this->db, $this->lock, 'phpbb_forums'); $this->set = new phpbb_tree_nestedset_forum($this->db, $this->lock, 'phpbb_forums');
$this->set_up_forums(); $this->set_up_forums();
$sql = "UPDATE phpbb_forums
SET forum_parents = 'a:0:{}'";
$this->db->sql_query($sql);
} }
protected function set_up_forums() protected function set_up_forums()
{
static $forums;
if (empty($forums))
{ {
$this->create_forum('Parent with two flat children'); $this->create_forum('Parent with two flat children');
$this->create_forum('Flat child #1', 1); $this->create_forum('Flat child #1', 1);
@ -80,6 +80,31 @@ class phpbb_tests_tree_nestedset_forum_base extends phpbb_database_test_case
$this->create_forum('Mixed child #2', 7); $this->create_forum('Mixed child #2', 7);
$this->create_forum('Nested child #1 of Mixed child #2', 9); $this->create_forum('Nested child #1 of Mixed child #2', 9);
$this->create_forum('Mixed child #3', 7); $this->create_forum('Mixed child #3', 7);
// Updating forum_parents column here so it's not empty
// This is required, so we can see whether the methods
// correctly clear the values.
$sql = "UPDATE phpbb_forums
SET forum_parents = 'a:0:{}'";
$this->db->sql_query($sql);
// Copy the forums into a static array, so we can reuse the list later
$sql = 'SELECT *
FROM phpbb_forums';
$result = $this->db->sql_query($sql);
$forums = $this->db->sql_fetchrowset($result);
$this->db->sql_freeresult($result);
}
else
{
$buffer = new phpbb_db_sql_insert_buffer($this->db, 'phpbb_forums');
$buffer->insert_all($forums);
$buffer->flush();
$this->database_synchronisation(array(
'phpbb_forums' => array('forum_id'),
));
}
} }
protected function create_forum($name, $parent_id = 0) protected function create_forum($name, $parent_id = 0)