1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-06-10 08:25:42 +02:00

Merge branch 'develop-olympus' into develop

* develop-olympus:
  [ticket/9880] Change "antibot" to "anti-spambot".
  [ticket/9696] Surpress is_dir() notice when using SQLite with open_basedir.
  [ticket/9880] Changing the term 'CAPTCHA' to something more obvious.
  [task/phing-build] Automatically trigger build_diff
  [task/phing-build] Added a build.xml configuration for phing.
This commit is contained in:
Andreas Fischer 2010-11-07 15:00:02 +01:00
commit f15446fe39
8 changed files with 218 additions and 359 deletions

149
build/build.xml Normal file
View File

@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="phpBB" description="The phpBB forum software" default="all" basedir="../">
<!-- a few settings for the build -->
<property name="newversion" value="3.0.8" />
<property name="prevversion" value="3.0.7-PL1" />
<property name="olderversions" value="3.0.2, 3.0.3, 3.0.4, 3.0.5, 3.0.6" />
<!-- no configuration should be needed beyond this point -->
<property name="oldversions" value="${olderversions}, ${prevversion}" />
<property name="versions" value="${oldversions}, ${newversion}" />
<!-- These are the main targets which you will probably want to use -->
<target name="package" depends="clean,prepare,create-package" />
<target name="all" depends="clean,prepare,test,create-package" />
<target name="prepare">
<mkdir dir="build/logs" />
<mkdir dir="build/api" />
<mkdir dir="build/codebrowser" />
<mkdir dir="build/coverage" />
<mkdir dir="build/cpd" />
<mkdir dir="build/dependencies" />
<mkdir dir="build/new_version" />
<mkdir dir="build/new_version/files" />
<mkdir dir="build/new_version/patches" />
<mkdir dir="build/new_version/release_files" />
<mkdir dir="build/new_version/update" />
<mkdir dir="build/old_versions" />
<mkdir dir="build/save" />
</target>
<target name="clean">
<delete dir="build/logs" />
<delete dir="build/api" />
<delete dir="build/codebrowser" />
<delete dir="build/coverage" />
<delete dir="build/cpd" />
<delete dir="build/dependencies" />
<delete dir="build/new_version" />
<delete dir="build/old_versions" />
<delete dir="build/save" />
</target>
<target name="test">
<exec dir="tests"
command="phpunit --log-junit ../build/logs/phpunit.xml
--coverage-clover ../build/logs/clover.xml
--coverage-html ../build/coverage
phpbb_all_tests all_tests.php"
passthru="true" />
<!-- Does not allow changing the working directory to tests/
so this approach does not work for us unfortunately
<phpunit codecoverage="true" haltonfailure="true">
<formatter todir="build/logs" type="xml"/>
<batchtest>
<fileset dir="tests">
<include name="all_tests.php"/>
</fileset>
</batchtest>
</phpunit>
-->
</target>
<target name="old-version-diffs">
<foreach list="${oldversions}" param="version" target="old-version-diff" />
</target>
<!-- This target retrieves an old version from the git tag release-${version}
and creates a diff between that release and the new one -->
<target name="old-version-diff">
<echo msg="Retrieving version ${version}" />
<mkdir dir="build/old_versions/release-${version}" />
<phingcall target="export">
<property name="revision" value="release-${version}" />
<property name="dir" value="build/old_versions/release-${version}" />
</phingcall>
<phingcall target="clean-diff-dir">
<property name="dir" value="build/old_versions/release-${version}" />
</phingcall>
<exec dir="build/old_versions" command="diff -crNEBwd release-${version} release-${newversion} >
../new_version/patches/phpBB-${version}_to_${newversion}.patch" escape="false" />
</target>
<target name="prepare-new-version">
<!-- select the currently checked out commit (HEAD) for packaging -->
<mkdir dir="build/new_version/phpBB3" />
<phingcall target="export">
<property name="revision" value="HEAD" />
<property name="dir" value="build/new_version/phpBB3" />
</phingcall>
<!-- copy into directory for diffs -->
<exec dir="build" command="cp -rp new_version/phpBB3 old_versions/release-${newversion}" />
<!-- and clean up -->
<phingcall target="clean-diff-dir">
<property name="dir" value="build/old_versions/release-${newversion}" />
</phingcall>
<!-- create an empty config.php file (not for diffs) -->
<touch file="build/new_version/phpBB3/config.php" />
</target>
<target name="create-package" depends="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" />
</target>
<!--
This target can be called using phingcall to retrieve a clean
checkout of a commit from git. It will only export the phpBB directory.
The properties revision and dir are required.
This target will remove directories that are not needed in distribution
and set correct permissions.
-->
<target name="export">
<exec dir="phpBB"
command="git archive ${revision} | tar -x -C ../${dir}"
checkreturn="true" />
<delete file="${dir}/config.php" />
<delete dir="${dir}/develop" />
<delete dir="${dir}/install/data" />
<echo msg="Setting permissions for checkout of ${revision} in ${dir}" />
<!-- set permissions of all files to 644, directories to 755 -->
<exec dir="${dir}" command="find -type f|xargs chmod 644" escape="false" />
<exec dir="${dir}" command="find -type d|xargs chmod 755" escape="false" />
<!-- set permissions of some directories to 777 -->
<chmod mode="0777" file="${dir}/cache" />
<chmod mode="0777" file="${dir}/store" />
<chmod mode="0777" file="${dir}/files" />
<chmod mode="0777" file="${dir}/images/avatars/upload" />
</target>
<target name="clean-diff-dir">
<delete dir="${dir}/cache" />
<delete dir="${dir}/docs" />
<delete dir="${dir}/files" />
<delete dir="${dir}/install" />
<delete dir="${dir}/store" />
</target>
</project>

View File

@ -9,16 +9,26 @@
* *
*/ */
// CONFIG - Begin if ($_SERVER['argc'] != 3)
$substitute_old = '3.0.6'; {
$substitute_new = '3.0.7-PL1'; die("Please specify the previous and current version as arguments (e.g. build_diff.php '1.0.2' '1.0.3').");
$simple_name_old = 'phpbb306'; }
$simple_name_new = 'phpbb307-PL1';
$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; $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 // 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. ;) // This should be used for building custom modified txt file. ;)
$package_changed_files = false; $package_changed_files = false;
// CONFIG - End
//$debug_file = 'includes/functions_user.php'; //'styles/prosilver/style.cfg'; //$debug_file = 'includes/functions_user.php'; //'styles/prosilver/style.cfg';
$debug_file = false; $debug_file = false;
@ -36,9 +46,6 @@ if (!$package_changed_files)
{ {
if (!$echo_changes) if (!$echo_changes)
{ {
// Cleanup...
run_command("rm -R $location/save/*");
// Create directory... // Create directory...
run_command("mkdir $location/save/{$s_name}"); run_command("mkdir $location/save/{$s_name}");
run_command("mkdir $location/save/{$s_name}/language"); run_command("mkdir $location/save/{$s_name}/language");
@ -72,14 +79,14 @@ if (!$echo_changes)
foreach ($compress_programs as $extension => $compress_command) foreach ($compress_programs as $extension => $compress_command)
{ {
echo "Packaging code changes for $extension\n"; echo "Packaging code changes for $extension\n";
run_command("rm ./../../release_files/{$code_changes_filename}.{$extension}"); run_command("rm ./../../new_version/release_files/{$code_changes_filename}.{$extension}");
flush(); flush();
// Build Package // Build Package
run_command("$compress_command ./../../release_files/{$code_changes_filename}.{$extension} *"); run_command("$compress_command ./../../new_version/release_files/{$code_changes_filename}.{$extension} *");
// Build MD5 Sum // Build MD5 Sum
run_command("md5sum ./../../release_files/{$code_changes_filename}.{$extension} > ./../../release_files/{$code_changes_filename}.{$extension}.md5"); run_command("md5sum ./../../new_version/release_files/{$code_changes_filename}.{$extension} > ./../../new_version/release_files/{$code_changes_filename}.{$extension}.md5");
flush(); flush();
} }
} }

View File

@ -14,10 +14,6 @@ class build_package
var $old_packages; var $old_packages;
var $versions; var $versions;
var $locations; var $locations;
var $clean_directory_structure;
var $files_to_copy;
var $files_to_remove;
var $remove_from_diff_structure;
// -c - context diff // -c - context diff
// -r - compare recursive // -r - compare recursive
@ -53,11 +49,11 @@ class build_package
$this->package_infos = array( $this->package_infos = array(
'package_name' => 'phpBB3', 'package_name' => 'phpBB3',
'name_prefix' => 'phpbb', 'name_prefix' => 'phpbb',
'simple_name' => 'phpbb' . str_replace('.', '', $_latest), 'simple_name' => 'release-' . $_latest,
'new_version_number' => $_latest, 'new_version_number' => $_latest,
'short_version_number' => str_replace('.', '', $_latest), 'short_version_number' => str_replace('.', '', $_latest),
'release_filename' => 'phpBB-' . $_latest, 'release_filename' => 'phpBB-' . $_latest,
'last_version' => 'phpbb' . str_replace('.', '', $_before), 'last_version' => 'release-' . $_before,
'last_version_number' => $_before, 'last_version_number' => $_before,
); );
@ -78,112 +74,7 @@ class build_package
continue; continue;
} }
$this->old_packages['phpbb' . str_replace('.', '', $package_version)] = $package_version . '_to_'; $this->old_packages['release-' . $package_version] = $package_version . '_to_';
}
// We need to make sure this is up to date with the latest version
$this->clean_directory_structure = array(
'adm' => array(
'images' => '',
'style' => '',
),
'cache' => '',
'docs' => '',
'download' => '',
'files' => '',
'images' => array(
'avatars' => array(
'gallery' => '',
'upload' => '',
),
'icons' => array(
'misc' => '',
'smile' => '',
),
'ranks' => '',
'smilies' => '',
'upload_icons' => '',
),
'includes' => array(
'acm' => '',
'acp' => array(
'info' => '',
),
'auth' => '',
'captcha' => array(
'plugins' => '',
),
'diff' => '',
'db' => '',
'hooks' => '',
'mcp' => array(
'info' => '',
),
'questionnaire' => '',
'search' => '',
'ucp' => array(
'info' => '',
),
'utf' => array(
'data' => '',
),
),
'install' => array(
'convertors'=> '',
'schemas' => '',
// 'data' => '',
),
'language' => array(
'en' => array(
'acp' => '',
'email' => '',
'mods' => '',
),
),
'store' => '',
'styles' => array(
'subsilver2' => array(
'imageset' => array(
'en' => '',
),
'template' => '',
'theme' => array(
'images' => '',
),
),
'prosilver' => array(
'imageset' => array(
'en' => '',
),
'template' => '',
'theme' => array(
'images' => '',
),
),
),
);
// Files to remove (not include within package)
$this->files_to_remove = array(); //array('includes/utf/data/recode_cjk.php');
// Files within the main directory to copy - do not include config.php
$this->files_to_copy = array(
'.htaccess', 'common.php', 'cron.php', 'faq.php', 'feed.php', 'index.php', 'mcp.php', 'memberlist.php', 'posting.php', 'report.php',
'search.php', 'style.php', 'ucp.php', 'viewforum.php', 'viewonline.php', 'viewtopic.php'
);
// These files/directories will be removed and not used for creating the patch files
$this->remove_from_diff_structure = array(
'config.php', 'cache', 'docs', 'files', 'install', 'store', 'develop'
);
// Writeable directories
$this->writeable = array('cache', 'store', 'images/avatars/upload', 'files');
// Fill the rest of the files_to_copy array
foreach ($this->clean_directory_structure as $cur_dir => $dir_struct)
{
$this->_fill_files_to_copy($this->locations['new_version'] . $cur_dir, $cur_dir, $dir_struct);
} }
} }
@ -192,66 +83,6 @@ class build_package
return $this->package_infos[$var]; return $this->package_infos[$var];
} }
function _fill_files_to_copy($directory, $cur_dir, $dir_struct)
{
$dh = opendir($directory);
while ($file = readdir($dh))
{
if (is_file($directory . '/' . $file) && $file != '.' && $file != '..')
{
$_loc = str_replace($this->locations['new_version'], '', $directory . '/' . $file);
if (in_array($_loc, $this->files_to_remove))
{
continue;
}
$this->files_to_copy[] = $cur_dir . '/' . $file;
}
}
closedir($dh);
if (is_array($dir_struct))
{
foreach ($dir_struct as $_cur_dir => $_dir_struct)
{
$this->_fill_files_to_copy($directory . '/' . $_cur_dir, $cur_dir . '/' . $_cur_dir, $_dir_struct);
}
}
}
function adjust_permissions($directory)
{
$dh = opendir($directory);
while ($file = readdir($dh))
{
if ($file == '.' || $file == '..' || $file == '.svn')
{
continue;
}
// If file, then 644
if (is_file($directory . '/' . $file))
{
chmod($directory . '/' . $file, 0644);
}
else if (is_dir($directory . '/' . $file))
{
$_loc = str_replace($this->package_infos['dest_dir'] . '/', '', $directory . '/' . $file);
// If directory is within the writeable chmod to 777, else 755
$mode = (in_array($_loc, $this->writeable)) ? 0777 : 0755;
chmod($directory . '/' . $file, $mode);
// Now traverse to the directory
$this->adjust_permissions($directory . '/' . $file);
}
}
closedir($dh);
}
function begin_status($headline) function begin_status($headline)
{ {
if ($this->status_begun) if ($this->status_begun)

View File

@ -9,14 +9,17 @@
* *
*/ */
// The only thing i need to adjust. ;) //$versions = array('3.0.2', '3.0.3', '3.0.4', '3.0.5', '3.0.6', '3.0.7-RC1', '3.0.7-RC2', '3.0.7', '3.0.7-PL1');
// Please always add the latest version number to the end
// Only have 5 releases here... if ($_SERVER['argc'] < 2)
// If RC8 drops remove the install/data directory {
//$versions = array('3.0.2', '3.0.3-RC1', '3.0.3', '3.0.4-RC1', '3.0.4', '3.0.5-RC1', '3.0.5', '3.0.6-RC1', '3.0.6-RC2', '3.0.6-RC3'); die("Please specify a list of versions as the first argument (e.g. package.php '1.0.0, 1.0.1, 1.0.2').");
//$versions = array('3.0.2', '3.0.3', '3.0.4', '3.0.5', '3.0.6', '3.0.7-RC1', '3.0.7'); }
$versions = array('3.0.2', '3.0.3', '3.0.4', '3.0.5', '3.0.6', '3.0.7-RC1', '3.0.7-RC2', '3.0.7', '3.0.7-PL1');
$verbose = false; $versions = explode(',', $_SERVER['argv'][1]);
$versions = array_map('trim', $versions);
$verbose = true;
require('build_helper.php'); require('build_helper.php');
@ -25,130 +28,6 @@ $package = new build_package($versions, $verbose);
echo "Building Release Packages\n"; echo "Building Release Packages\n";
echo "Now all three package types (patch, files, release) are built as well as the update package (update).\n"; echo "Now all three package types (patch, files, release) are built as well as the update package (update).\n";
$package->begin_status('Remove temporary files');
// Cleanup...
$package->run_command('rm -Rv ' . $package->get('dest_dir'));
$package->run_command('rm -Rv ' . $package->get('diff_dir'));
$package->run_command('rm -Rv ' . $package->get('patch_directory'));
$package->run_command('rm -Rv ' . $package->get('files_directory'));
$package->run_command('rm -Rv ' . $package->get('update_directory'));
$package->run_command('rm -Rv ' . $package->get('release_directory'));
$package->begin_status('Create new directories');
// Make sure the directories got removed
while (file_exists($package->get('update_directory')))
{
sleep(1);
}
if (!file_exists($package->get('dest_dir')))
{
$package->run_command('mkdir ' . $package->get('dest_dir'));
}
if (!file_exists($package->get('diff_dir')))
{
$package->run_command('mkdir ' . $package->get('diff_dir'));
}
if (!file_exists($package->get('patch_directory')))
{
$package->run_command('mkdir ' . $package->get('patch_directory'));
}
if (!file_exists($package->get('files_directory')))
{
$package->run_command('mkdir ' . $package->get('files_directory'));
}
if (!file_exists($package->get('update_directory')))
{
$package->run_command('mkdir ' . $package->get('update_directory'));
}
if (!file_exists($package->get('release_directory')))
{
$package->run_command('mkdir ' . $package->get('release_directory'));
}
$package->begin_status('Copy release files to clean release directory');
// Create config.php file
$package->run_command('touch ' . $package->get('dest_dir') . '/config.php');
//$package->run_command('sudo chown www-data:www-data ' . $package->get('dest_dir') . '/config.php');
// Create new directory structure
foreach ($package->clean_directory_structure as $dir => $dir_struct)
{
$package->create_directory($package->get('dest_dir') . '/' . $dir, $dir_struct);
}
// First step is to copy the new version over (clean structure)
foreach ($package->files_to_copy as $file)
{
$source_file = $package->locations['new_version'] . $file;
$dest_file = $package->get('dest_dir') . '/' . $file;
$package->run_command("cp -p $source_file $dest_file");
}
// fix line endings
chdir($package->get('dest_dir'));
$package->run_command($package->locations['new_version'] . 'develop/fix_files.sh');
// Now clean up the permissions
$package->begin_status('Adjust permissions');
$package->adjust_permissions($package->get('dest_dir'));
// Now create a version for diffing the version - copy the tree over to old_versions...
$package->begin_status('Create diff directory for obtaining file differences');
$package->run_command('cp -Rp ' . $package->get('dest_dir') . '/* ' . $package->get('diff_dir'));
$package->run_command('cp -Rp ' . $package->get('dest_dir') . '/.htaccess ' . $package->get('diff_dir'));
// Cleanup diff directory (only contents to diff)
foreach ($package->remove_from_diff_structure as $remove_dir)
{
$package->run_command('rm -Rv ' . $package->get('diff_dir') . '/' . $remove_dir);
}
// Now, first of all we need to rebuild all old packages we want to support
foreach ($package->old_packages as $package_name => $tag_name)
{
$package->begin_status('Create old packages directory for diffing to ' . $package_name);
chdir($package->locations['old_versions']);
if (is_dir($package->locations['old_versions'] . $package_name))
{
$package->run_command('rm -Rv ' . $package->locations['old_versions'] . $package_name);
}
// Now, create a new one...
$tag_name = 'release_' . str_replace(array('.', '_to_'), array('_', ''), $tag_name);
$package->run_command('svn export --non-interactive http://code.phpbb.com/svn/phpbb/tags/' . $tag_name . '/phpBB/ ' . $package_name);
$location = $package->locations['old_versions'] . $package_name;
chdir($location . '/');
$package->run_command($package->locations['new_version'] . 'develop/fix_files.sh');
// Now clean up the permissions
$package->begin_status('Adjust permissions for package ' . $package_name);
$package->adjust_permissions($location);
// Cleanup diff directory (only contents to diff)
foreach ($package->remove_from_diff_structure as $remove_dir)
{
$package->run_command('rm -Rv ' . $location . '/' . $remove_dir);
}
}
// Go trough all versions making a diff if we even have old versions // Go trough all versions making a diff if we even have old versions
// For phpBB 3.0.x we might choose a different update method, rendering the things below useless... // For phpBB 3.0.x we might choose a different update method, rendering the things below useless...
if (sizeof($package->old_packages)) if (sizeof($package->old_packages))
@ -160,10 +39,7 @@ if (sizeof($package->old_packages))
foreach ($package->old_packages as $_package_name => $dest_package_filename) foreach ($package->old_packages as $_package_name => $dest_package_filename)
{ {
$package->begin_status('Creating patch/diff files for phpBB-' . $dest_package_filename . $package->get('new_version_number')); $package->begin_status('Parsing patch/diff files for phpBB-' . $dest_package_filename . $package->get('new_version_number'));
$dest_package_filename = $package->get('patch_directory') . '/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 // Parse this diff to determine file changes from the checked versions and save them
$diff_file_changes[$_package_name] = $package->collect_diff_files($dest_package_filename, $_package_name); $diff_file_changes[$_package_name] = $package->collect_diff_files($dest_package_filename, $_package_name);
@ -404,7 +280,6 @@ if (sizeof($package->old_packages))
foreach ($compress_programs as $extension => $compress_command) foreach ($compress_programs as $extension => $compress_command)
{ {
$package->begin_status('Packaging phpBB Patch Files for ' . $extension); $package->begin_status('Packaging phpBB Patch Files for ' . $extension);
$package->run_command('rm -v ../release_files/' . $package->get('release_filename') . '-patch.' . $extension);
// Build Package // Build Package
$package->run_command($compress_command . ' ../release_files/' . $package->get('release_filename') . '-patch.' . $extension . ' *'); $package->run_command($compress_command . ' ../release_files/' . $package->get('release_filename') . '-patch.' . $extension . ' *');
@ -420,7 +295,6 @@ if (sizeof($package->old_packages))
{ {
$package->begin_status('Packaging phpBB Files for ' . $extension); $package->begin_status('Packaging phpBB Files for ' . $extension);
$package->run_command('rm -v ../release_files/' . $package->get('release_filename') . '-files.' . $extension);
$package->run_command('mkdir ' . $package->get('files_directory') . '/release'); $package->run_command('mkdir ' . $package->get('files_directory') . '/release');
$package->run_command('cp -Rp ' . $package->get('dest_dir') . '/docs ' . $package->get('files_directory') . '/release'); $package->run_command('cp -Rp ' . $package->get('dest_dir') . '/docs ' . $package->get('files_directory') . '/release');
$package->run_command('cp -Rp ' . $package->get('dest_dir') . '/install ' . $package->get('files_directory') . '/release'); $package->run_command('cp -Rp ' . $package->get('dest_dir') . '/install ' . $package->get('files_directory') . '/release');
@ -457,7 +331,6 @@ if (sizeof($package->old_packages))
$package->begin_status('Packaging phpBB Update for ' . $extension); $package->begin_status('Packaging phpBB Update for ' . $extension);
$package->run_command('rm -v ../release_files/' . $package->get('release_filename') . '-update.' . $extension);
$package->run_command('mkdir ' . $package->get('update_directory') . '/release'); $package->run_command('mkdir ' . $package->get('update_directory') . '/release');
// Pack update files // Pack update files
@ -521,7 +394,6 @@ foreach ($compress_programs as $extension => $compress_command)
// Microsoft Web PI packaging // Microsoft Web PI packaging
$package->begin_status('Packaging phpBB for Microsoft WebPI'); $package->begin_status('Packaging phpBB for Microsoft WebPI');
$file = './release_files/' . $package->get('release_filename') . '.webpi.zip'; $file = './release_files/' . $package->get('release_filename') . '.webpi.zip';
$package->run_command("rm -v $file");
$package->run_command('cp -p ./release_files/' . $package->get('release_filename') . ".zip $file"); $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('cd ./../webpi && ' . $compress_programs['zip'] . " ./../new_version/$file *");
$package->run_command("md5sum $file > $file.md5"); $package->run_command("md5sum $file > $file.md5");

View File

@ -992,7 +992,7 @@ function phpbb_own_realpath($path)
// @todo If the file exists fine and open_basedir only has one path we should be able to prepend it // @todo If the file exists fine and open_basedir only has one path we should be able to prepend it
// because we must be inside that basedir, the question is where... // because we must be inside that basedir, the question is where...
// @internal The slash in is_dir() gets around an open_basedir restriction // @internal The slash in is_dir() gets around an open_basedir restriction
if (!@file_exists($resolved) || (!is_dir($resolved . '/') && !is_file($resolved))) if (!@file_exists($resolved) || (!@is_dir($resolved . '/') && !is_file($resolved)))
{ {
return false; return false;
} }

View File

@ -233,7 +233,7 @@ $lang = array_merge($lang, array(
'PASSWORD_LENGTH' => 'Password length', 'PASSWORD_LENGTH' => 'Password length',
'PASSWORD_LENGTH_EXPLAIN' => 'Minimum and maximum number of characters in passwords.', 'PASSWORD_LENGTH_EXPLAIN' => 'Minimum and maximum number of characters in passwords.',
'REG_LIMIT' => 'Registration attempts', 'REG_LIMIT' => 'Registration attempts',
'REG_LIMIT_EXPLAIN' => 'Number of attempts users can make at solving the CAPTCHA before being locked out of that session.', 'REG_LIMIT_EXPLAIN' => 'Number of attempts users can make at solving the anti-spambot task before being locked out of that session.',
'USERNAME_ALPHA_ONLY' => 'Alphanumeric only', 'USERNAME_ALPHA_ONLY' => 'Alphanumeric only',
'USERNAME_ALPHA_SPACERS' => 'Alphanumeric and spacers', 'USERNAME_ALPHA_SPACERS' => 'Alphanumeric and spacers',
'USERNAME_ASCII' => 'ASCII (no international unicode)', 'USERNAME_ASCII' => 'ASCII (no international unicode)',
@ -288,44 +288,44 @@ $lang = array_merge($lang, array(
// Visual Confirmation Settings // Visual Confirmation Settings
$lang = array_merge($lang, array( $lang = array_merge($lang, array(
'ACP_VC_SETTINGS_EXPLAIN' => 'Here you can select and configure CAPTCHA plugins, which are designed to block automated form submissions by spambots.', 'ACP_VC_SETTINGS_EXPLAIN' => 'Here you can select and configure plugins, which are designed to block automated form submissions by spambots. These plugins typically work by challenging the user with a <em>CAPTCHA</em>, a test which is designed to be difficult for computers to solve.',
'AVAILABLE_CAPTCHAS' => 'Available plugins', 'AVAILABLE_CAPTCHAS' => 'Available plugins',
'CAPTCHA_UNAVAILABLE' => 'The CAPTCHA cannot be selected as its requirements are not met.', 'CAPTCHA_UNAVAILABLE' => 'The plugin cannot be selected as its requirements are not met.',
'CAPTCHA_GD' => 'GD CAPTCHA', 'CAPTCHA_GD' => 'GD image',
'CAPTCHA_GD_3D' => 'GD 3D Captcha', 'CAPTCHA_GD_3D' => 'GD 3D image',
'CAPTCHA_GD_FOREGROUND_NOISE' => 'GD CAPTCHA foreground noise', 'CAPTCHA_GD_FOREGROUND_NOISE' => 'Foreground noise',
'CAPTCHA_GD_EXPLAIN' => 'Use GD to make a more advanced CAPTCHA.', 'CAPTCHA_GD_EXPLAIN' => 'Uses GD to make a more advanced anti-spambot image.',
'CAPTCHA_GD_FOREGROUND_NOISE_EXPLAIN' => 'Use foreground noise to make the GD based CAPTCHA harder.', 'CAPTCHA_GD_FOREGROUND_NOISE_EXPLAIN' => 'Use foreground noise to make the image harder to read.',
'CAPTCHA_GD_X_GRID' => 'GD CAPTCHA background noise x-axis', 'CAPTCHA_GD_X_GRID' => 'Background noise x-axis',
'CAPTCHA_GD_X_GRID_EXPLAIN' => 'Use lower settings of this to make the GD based CAPTCHA harder. 0 will disable x-axis background noise.', 'CAPTCHA_GD_X_GRID_EXPLAIN' => 'Use lower settings of this to make the image harder to read. 0 will disable x-axis background noise.',
'CAPTCHA_GD_Y_GRID' => 'GD CAPTCHA background noise y-axis', 'CAPTCHA_GD_Y_GRID' => 'Background noise y-axis',
'CAPTCHA_GD_Y_GRID_EXPLAIN' => 'Use lower settings of this to make the GD based CAPTCHA harder. 0 will disable y-axis background noise.', 'CAPTCHA_GD_Y_GRID_EXPLAIN' => 'Use lower settings of this to make the image harder to read. 0 will disable y-axis background noise.',
'CAPTCHA_GD_WAVE' => 'GD CAPTCHA wave distortion', 'CAPTCHA_GD_WAVE' => 'Wave distortion',
'CAPTCHA_GD_WAVE_EXPLAIN' => 'This applies a wave distortion to the CAPTCHA.', 'CAPTCHA_GD_WAVE_EXPLAIN' => 'This applies a wave distortion to the image.',
'CAPTCHA_GD_3D_NOISE' => 'Add 3D-noise objects', 'CAPTCHA_GD_3D_NOISE' => 'Add 3D-noise objects',
'CAPTCHA_GD_3D_NOISE_EXPLAIN' => 'This adds additional objects to the CAPTCHA, over the letters.', 'CAPTCHA_GD_3D_NOISE_EXPLAIN' => 'This adds additional objects to the image, over the letters.',
'CAPTCHA_GD_FONTS' => 'Use different fonts', 'CAPTCHA_GD_FONTS' => 'Use different fonts',
'CAPTCHA_GD_FONTS_EXPLAIN' => 'This setting controls how many different letter shapes are used. You can just use the default shapes or introduce altered letters. Adding lowercase letters is also possible.', 'CAPTCHA_GD_FONTS_EXPLAIN' => 'This setting controls how many different letter shapes are used. You can just use the default shapes or introduce altered letters. Adding lowercase letters is also possible.',
'CAPTCHA_FONT_DEFAULT' => 'Default', 'CAPTCHA_FONT_DEFAULT' => 'Default',
'CAPTCHA_FONT_NEW' => 'New Shapes', 'CAPTCHA_FONT_NEW' => 'New Shapes',
'CAPTCHA_FONT_LOWER' => 'Also use lowercase', 'CAPTCHA_FONT_LOWER' => 'Also use lowercase',
'CAPTCHA_NO_GD' => 'CAPTCHA without GD', 'CAPTCHA_NO_GD' => 'Simple image',
'CAPTCHA_PREVIEW_MSG' => 'Your changes to the visual confirmation setting were not saved. This is just a preview.', 'CAPTCHA_PREVIEW_MSG' => 'Your changes have not been saved, this is just a preview.',
'CAPTCHA_PREVIEW_EXPLAIN' => 'The CAPTCHA as it would look like using the current selection.', 'CAPTCHA_PREVIEW_EXPLAIN' => 'The plugin as it would look like using the current selection.',
'CAPTCHA_SELECT' => 'Installed CAPTCHA plugins', 'CAPTCHA_SELECT' => 'Installed plugins',
'CAPTCHA_SELECT_EXPLAIN' => 'The dropdown holds the CAPTCHA plugins recognized by the board. Gray entries are not available right now and might need configuration prior to use.', 'CAPTCHA_SELECT_EXPLAIN' => 'The dropdown holds the plugins recognized by the board. Grey entries are not available right now and might need configuration prior to use.',
'CAPTCHA_CONFIGURE' => 'Configure CAPTCHAs', 'CAPTCHA_CONFIGURE' => 'Configure plugins',
'CAPTCHA_CONFIGURE_EXPLAIN' => 'Change the settings for the selected CAPTCHA.', 'CAPTCHA_CONFIGURE_EXPLAIN' => 'Change the settings for the selected plugin.',
'CONFIGURE' => 'Configure', 'CONFIGURE' => 'Configure',
'CAPTCHA_NO_OPTIONS' => 'This CAPTCHA has no configuration options.', 'CAPTCHA_NO_OPTIONS' => 'This plugin has no configuration options.',
'VISUAL_CONFIRM_POST' => 'Enable CAPTCHA for guest postings', 'VISUAL_CONFIRM_POST' => 'Enable spambot countermeasures for guest postings',
'VISUAL_CONFIRM_POST_EXPLAIN' => 'Requires guest users to solve a CAPTCHA to help prevent automated postings.', 'VISUAL_CONFIRM_POST_EXPLAIN' => 'Requires guest users to pass the anti-spambot task to help prevent automated postings.',
'VISUAL_CONFIRM_REG' => 'Enable CAPTCHA for registrations', 'VISUAL_CONFIRM_REG' => 'Enable spambot countermeasures for registrations',
'VISUAL_CONFIRM_REG_EXPLAIN' => 'Requires new users to solve a CAPTCHA to help prevent automated registrations.', 'VISUAL_CONFIRM_REG_EXPLAIN' => 'Requires new users to pass the anti-spambot task to help prevent automated registrations.',
'VISUAL_CONFIRM_REFRESH' => 'Enable users to refresh the CAPTCHA', 'VISUAL_CONFIRM_REFRESH' => 'Allow users to refresh the anti-spambot task',
'VISUAL_CONFIRM_REFRESH_EXPLAIN' => 'Allows users to request a new CAPTCHA if they are unable to solve the CAPTCHA during registration. Some plugins might not support this option.', 'VISUAL_CONFIRM_REFRESH_EXPLAIN' => 'Allows users to request a new anti-spambot task if they are unable to solve the currunt task during registration. Some plugins might not support this option.',
)); ));
// Cookie Settings // Cookie Settings
@ -463,7 +463,7 @@ $lang = array_merge($lang, array(
'IP_VALID' => 'Session IP validation', 'IP_VALID' => 'Session IP validation',
'IP_VALID_EXPLAIN' => 'Determines how much of the users IP is used to validate a session; <samp>All</samp> compares the complete address, <samp>A.B.C</samp> the first x.x.x, <samp>A.B</samp> the first x.x, <samp>None</samp> disables checking. On IPv6 addresses <samp>A.B.C</samp> compares the first 4 blocks and <samp>A.B</samp> the first 3 blocks.', 'IP_VALID_EXPLAIN' => 'Determines how much of the users IP is used to validate a session; <samp>All</samp> compares the complete address, <samp>A.B.C</samp> the first x.x.x, <samp>A.B</samp> the first x.x, <samp>None</samp> disables checking. On IPv6 addresses <samp>A.B.C</samp> compares the first 4 blocks and <samp>A.B</samp> the first 3 blocks.',
'MAX_LOGIN_ATTEMPTS' => 'Maximum number of login attempts', 'MAX_LOGIN_ATTEMPTS' => 'Maximum number of login attempts',
'MAX_LOGIN_ATTEMPTS_EXPLAIN' => 'After this number of failed logins the user needs to additionally solve the CAPTCHA.', 'MAX_LOGIN_ATTEMPTS_EXPLAIN' => 'After this number of failed logins the user needs to additionally solve the anti-spambot task.',
'NO_IP_VALIDATION' => 'None', 'NO_IP_VALIDATION' => 'None',
'NO_REF_VALIDATION' => 'None', 'NO_REF_VALIDATION' => 'None',
'PASSWORD_TYPE' => 'Password complexity', 'PASSWORD_TYPE' => 'Password complexity',

View File

@ -190,7 +190,7 @@ $lang = array_merge($lang, array(
'ACP_USER_SIG' => 'Signature', 'ACP_USER_SIG' => 'Signature',
'ACP_USER_WARNINGS' => 'Warnings', 'ACP_USER_WARNINGS' => 'Warnings',
'ACP_VC_SETTINGS' => 'CAPTCHA module settings', 'ACP_VC_SETTINGS' => 'Spambot countermeasures',
'ACP_VC_CAPTCHA_DISPLAY' => 'CAPTCHA image preview', 'ACP_VC_CAPTCHA_DISPLAY' => 'CAPTCHA image preview',
'ACP_VERSION_CHECK' => 'Check for updates', 'ACP_VERSION_CHECK' => 'Check for updates',
'ACP_VIEW_ADMIN_PERMISSIONS' => 'View administrative permissions', 'ACP_VIEW_ADMIN_PERMISSIONS' => 'View administrative permissions',
@ -503,7 +503,7 @@ $lang = array_merge($lang, array(
'LOG_CONFIG_SERVER' => '<strong>Altered server settings</strong>', 'LOG_CONFIG_SERVER' => '<strong>Altered server settings</strong>',
'LOG_CONFIG_SETTINGS' => '<strong>Altered board settings</strong>', 'LOG_CONFIG_SETTINGS' => '<strong>Altered board settings</strong>',
'LOG_CONFIG_SIGNATURE' => '<strong>Altered signature settings</strong>', 'LOG_CONFIG_SIGNATURE' => '<strong>Altered signature settings</strong>',
'LOG_CONFIG_VISUAL' => '<strong>Altered antibot settings</strong>', 'LOG_CONFIG_VISUAL' => '<strong>Altered anti-spambot settings</strong>',
'LOG_APPROVE_TOPIC' => '<strong>Approved topic</strong><br />» %s', 'LOG_APPROVE_TOPIC' => '<strong>Approved topic</strong><br />» %s',
'LOG_BUMP_TOPIC' => '<strong>User bumped topic</strong><br />» %s', 'LOG_BUMP_TOPIC' => '<strong>User bumped topic</strong><br />» %s',

View File

@ -36,7 +36,7 @@ if (empty($lang) || !is_array($lang))
// in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine // in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
$lang = array_merge($lang, array( $lang = array_merge($lang, array(
'CAPTCHA_QA' => 'Q&amp;A CAPTCHA', 'CAPTCHA_QA' => 'Q&amp;A',
'CONFIRM_QUESTION_EXPLAIN' => 'This question is a means of preventing automated form submissions by spambots.', 'CONFIRM_QUESTION_EXPLAIN' => 'This question is a means of preventing automated form submissions by spambots.',
'CONFIRM_QUESTION_WRONG' => 'You have provided an invalid answer to the question.', 'CONFIRM_QUESTION_WRONG' => 'You have provided an invalid answer to the question.',
@ -47,7 +47,7 @@ $lang = array_merge($lang, array(
'ANSWER' => 'Answer', 'ANSWER' => 'Answer',
'EDIT_QUESTION' => 'Edit Question', 'EDIT_QUESTION' => 'Edit Question',
'QUESTIONS' => 'Questions', 'QUESTIONS' => 'Questions',
'QUESTIONS_EXPLAIN' => 'For every form submission where you have enabled the Q&amp;A CAPTCHA, users will be asked one of the questions specified here. To use this plugin at least one question must be set in the default language. These questions should be easy for your target audience to answer but beyond the ability of a bot capable of running a Google™ search. Using a large and regularly changed set of questions will yield the best results. Enable the strict setting if your question relies on mixed case, punctuation or whitespace.', 'QUESTIONS_EXPLAIN' => 'For every form submission where you have enabled the Q&amp;A plugin, users will be asked one of the questions specified here. To use this plugin at least one question must be set in the default language. These questions should be easy for your target audience to answer but beyond the ability of a bot capable of running a Google™ search. Using a large and regularly changed set of questions will yield the best results. Enable the strict setting if your question relies on mixed case, punctuation or whitespace.',
'QUESTION_DELETED' => 'Question deleted', 'QUESTION_DELETED' => 'Question deleted',
'QUESTION_LANG' => 'Language', 'QUESTION_LANG' => 'Language',
'QUESTION_LANG_EXPLAIN' => 'The language this question and its answers are written in.', 'QUESTION_LANG_EXPLAIN' => 'The language this question and its answers are written in.',