├── .editorconfig ├── .env ├── .env.test ├── .github └── workflows │ └── tests.yml ├── .gitignore ├── LICENSE ├── README.md ├── app ├── .htaccess ├── AppCache.php ├── AppKernel.php ├── SymfonyRequirements.php ├── autoload.php ├── check.php ├── console └── phpunit.xml.dist ├── bin ├── .htaccess ├── build_code_changes_30.sh ├── build_code_changes_31.sh ├── build_code_changes_32.sh ├── build_code_changes_33.sh ├── build_docs.sh ├── console ├── patch-type-declarations ├── php-parse ├── phpunit ├── sql-formatter ├── update_phpbb.sh ├── update_symfony.sh ├── var-dump-server └── yaml-lint ├── composer.json ├── composer.lock ├── composer.phar ├── config ├── bootstrap.php ├── bundles.php ├── config.yml ├── config_dev.yml ├── config_prod.yml ├── config_test.yml ├── packages │ ├── cache.yaml │ ├── dev │ │ └── monolog.yaml │ ├── doctrine.yaml │ ├── framework.yaml │ ├── prod │ │ ├── deprecations.yaml │ │ ├── doctrine.yaml │ │ ├── monolog.yaml │ │ └── routing.yaml │ ├── sensio_framework_extra.yaml │ ├── test │ │ ├── framework.yaml │ │ ├── monolog.yaml │ │ └── twig.yaml │ └── twig.yaml ├── routes.yaml ├── routes │ └── annotations.yaml ├── routing_dev.yml ├── security.yml └── services.yaml ├── data └── code-changes │ └── template │ ├── 30_nav.html │ ├── 31_nav.html │ ├── 32_nav.html │ ├── 33_nav.html │ ├── overall_footer.html │ └── overall_header.html ├── phpunit.xml.dist ├── src ├── .htaccess ├── Controller │ ├── .gitignore │ └── DefaultController.php ├── DependencyInjection │ └── PhpbbArea51Extension.php ├── Entity │ └── .gitignore ├── Kernel.php ├── Repository │ └── .gitignore ├── TrackerChart.php ├── TrackerChartFactory.php └── code-changes │ ├── create_diffs.php │ └── includes │ ├── diff.php │ ├── engine.php │ └── renderer.php ├── symfony.lock ├── templates ├── base.html.twig ├── default │ ├── contributors.html.twig │ ├── contributorsList.html.twig │ ├── downloads.html.twig │ ├── index.html.twig │ ├── projects.html.twig │ └── stats.html.twig └── layout.html.twig ├── tests ├── Controller │ └── DefaultControllerTest.php └── bootstrap.php └── web ├── .htaccess ├── analytics.js ├── area51.css ├── code-changes ├── css │ ├── admin.css │ ├── code_changes.css │ ├── code_changes.js │ └── images │ │ ├── arrow_right.gif │ │ ├── bg_tabs1.gif │ │ ├── bg_tabs2.gif │ │ ├── corners_left.gif │ │ ├── corners_right.gif │ │ ├── file-A.png │ │ ├── file-D.png │ │ ├── file-M.png │ │ ├── file.png │ │ ├── folder-A.png │ │ ├── folder-D.png │ │ ├── folder-M.png │ │ ├── folder-closed-A.png │ │ ├── folder-closed-D.png │ │ ├── folder-closed-M.png │ │ ├── folder-closed.png │ │ ├── folder.png │ │ ├── innerbox_bg.gif │ │ ├── toggle.gif │ │ ├── treeview-default-line.gif │ │ └── treeview-default.gif └── index.php ├── config.php ├── favicon.ico ├── header.css ├── images ├── api.png ├── area51.png ├── back_phpbb.png ├── ci.png ├── code-changes.png ├── coding-style.png ├── development-discussion.png ├── github.png ├── header_bg.png ├── mainlogo.png ├── phpbb_small.png ├── sflogo.png ├── symfony.png └── tracker.png ├── index.php ├── phpBB ├── robots.txt ├── subSilver.css └── writable └── stats └── .keep /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for standardising the coding style between different editors 2 | # http://editorconfig.org/ 3 | 4 | root = true 5 | 6 | [*] 7 | end_of_line = lf 8 | indent_size = 4 9 | indent_style = spaces 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | 16 | [*.yml] 17 | indent_size = 4 18 | indent_style = space 19 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | # In all environments, the following files are loaded if they exist, 2 | # the latter taking precedence over the former: 3 | # 4 | # * .env contains default values for the environment variables needed by the app 5 | # * .env.local uncommitted file with local overrides 6 | # * .env.$APP_ENV committed environment-specific defaults 7 | # * .env.$APP_ENV.local uncommitted environment-specific overrides 8 | # 9 | # Real environment variables win over .env files. 10 | # 11 | # DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. 12 | # https://symfony.com/doc/current/configuration/secrets.html 13 | # 14 | # Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). 15 | # https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration 16 | 17 | ###> doctrine/doctrine-bundle ### 18 | # Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url 19 | # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml 20 | # 21 | # DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db" 22 | # DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/db_name?serverVersion=8" 23 | tracker_chart_root_path="./" 24 | DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/db_name?serverVersion=15&charset=utf8" 25 | ###< doctrine/doctrine-bundle ### 26 | ###> symfony/framework-bundle ### 27 | APP_ENV=dev 28 | APP_SECRET=b4fa2a1d061b78975eea395d6f6a9ca5 29 | #TRUSTED_PROXIES=127.0.0.1,127.0.0.2 30 | #TRUSTED_HOSTS='^(localhost|example\.com)$' 31 | ###< symfony/framework-bundle ### 32 | -------------------------------------------------------------------------------- /.env.test: -------------------------------------------------------------------------------- 1 | # define your env variables for the test env here 2 | KERNEL_CLASS='App\Kernel' 3 | APP_SECRET='$ecretf0rt3st' 4 | SYMFONY_DEPRECATIONS_HELPER=999999 5 | PANTHER_APP_ENV=panther 6 | PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots 7 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Test Area51 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | branches: 9 | - master 10 | 11 | jobs: 12 | test-area51: 13 | strategy: 14 | matrix: 15 | include: 16 | - php: '8.1' 17 | - php: '8.2' 18 | - php: '8.3' 19 | 20 | name: Test Area51 - ${{ matrix.php }} 21 | runs-on: ubuntu-latest 22 | steps: 23 | - name: Checkout repository 24 | uses: actions/checkout@v3 25 | with: 26 | fetch-depth: 100 27 | 28 | - name: Setup PHP 29 | uses: shivammathur/setup-php@v2 30 | with: 31 | php-version: ${{ matrix.php }} 32 | extensions: dom, curl, libxml, mbstring, zip, pcntl, intl, gd, exif, iconv 33 | coverage: none 34 | 35 | - name: Setup environment for dev-hooks 36 | env: 37 | PHP_VERSION: ${{ matrix.php }} 38 | run: | 39 | php composer.phar install --no-interaction 40 | 41 | - name: Run unit tests 42 | run: | 43 | php bin/phpunit --verbose --stop-on-error 44 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | app/cache 2 | data/code-changes/* 3 | web/code-changes/* 4 | web/writable/stats/* 5 | web/phpBB/* 6 | vendor 7 | *.cache 8 | *.log 9 | bin/doctrine* 10 | app/config/parameters.yml 11 | /.idea/ 12 | 13 | ###> phpunit/phpunit ### 14 | /phpunit.xml 15 | .phpunit.result.cache 16 | ###< phpunit/phpunit ### 17 | 18 | ###> symfony/framework-bundle ### 19 | /.env.local 20 | /.env.local.php 21 | /.env.*.local 22 | /public/bundles/ 23 | /var/ 24 | /vendor/ 25 | ###< symfony/framework-bundle ### 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Area51 2 | 3 | [Area51](http://area51.phpbb.com) is the development site of phpBB. 4 | 5 | ## About 6 | 7 | This repository contains the source code for the area51 website. It is 8 | based on Symfony2. 9 | 10 | ## Installation 11 | 12 | First of all, install the dependencies. 13 | 14 | $ php composer.phar install 15 | 16 | Copy `app/config/parameters.dist.yml` to `app/config/parameters.yml` 17 | and adjust the configuration. 18 | 19 | Point your webroot to `/web`. 20 | 21 | ## Tests 22 | 23 | To run tests, after installing dependencies, run the following from 24 | the project root 25 | 26 | $ bin/phpunit -c app/ 27 | 28 | ## License 29 | 30 | See `LICENSE`. 31 | -------------------------------------------------------------------------------- /app/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all -------------------------------------------------------------------------------- /app/AppCache.php: -------------------------------------------------------------------------------- 1 | getEnvironment(), array('dev', 'test'))) { 26 | $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); 27 | $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); 28 | $bundles[] = new Symfony\Bundle\WebServerBundle\WebServerBundle(); 29 | } 30 | 31 | return $bundles; 32 | } 33 | 34 | public function registerContainerConfiguration(LoaderInterface $loader) 35 | { 36 | $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); 37 | } 38 | 39 | public function getRootDir() 40 | { 41 | return __DIR__; 42 | } 43 | public function getCacheDir() 44 | { 45 | return dirname(__DIR__).'/var/cache/'.$this->getEnvironment(); 46 | } 47 | public function getLogDir() 48 | { 49 | return dirname(__DIR__).'/var/logs'; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/autoload.php: -------------------------------------------------------------------------------- 1 | add('', __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs'); 12 | } 13 | 14 | AnnotationRegistry::registerLoader(array($loader, 'loadClass')); 15 | 16 | return $loader; -------------------------------------------------------------------------------- /app/check.php: -------------------------------------------------------------------------------- 1 | getPhpIniConfigPath(); 8 | 9 | echo_title('Symfony Requirements Checker'); 10 | 11 | echo '> PHP is using the following php.ini file:'.PHP_EOL; 12 | if ($iniPath) { 13 | echo_style('green', ' '.$iniPath); 14 | } else { 15 | echo_style('yellow', ' WARNING: No configuration file (php.ini) used by PHP!'); 16 | } 17 | 18 | echo PHP_EOL.PHP_EOL; 19 | 20 | echo '> Checking Symfony requirements:'.PHP_EOL.' '; 21 | 22 | $messages = array(); 23 | foreach ($symfonyRequirements->getRequirements() as $req) { 24 | if ($helpText = get_error_message($req, $lineSize)) { 25 | echo_style('red', 'E'); 26 | $messages['error'][] = $helpText; 27 | } else { 28 | echo_style('green', '.'); 29 | } 30 | } 31 | 32 | $checkPassed = empty($messages['error']); 33 | 34 | foreach ($symfonyRequirements->getRecommendations() as $req) { 35 | if ($helpText = get_error_message($req, $lineSize)) { 36 | echo_style('yellow', 'W'); 37 | $messages['warning'][] = $helpText; 38 | } else { 39 | echo_style('green', '.'); 40 | } 41 | } 42 | 43 | if ($checkPassed) { 44 | echo_block('success', 'OK', 'Your system is ready to run Symfony projects'); 45 | } else { 46 | echo_block('error', 'ERROR', 'Your system is not ready to run Symfony projects'); 47 | 48 | echo_title('Fix the following mandatory requirements', 'red'); 49 | 50 | foreach ($messages['error'] as $helpText) { 51 | echo ' * '.$helpText.PHP_EOL; 52 | } 53 | } 54 | 55 | if (!empty($messages['warning'])) { 56 | echo_title('Optional recommendations to improve your setup', 'yellow'); 57 | 58 | foreach ($messages['warning'] as $helpText) { 59 | echo ' * '.$helpText.PHP_EOL; 60 | } 61 | } 62 | 63 | echo PHP_EOL; 64 | echo_style('title', 'Note'); 65 | echo ' The command console could use a different php.ini file'.PHP_EOL; 66 | echo_style('title', '~~~~'); 67 | echo ' than the one used with your web server. To be on the'.PHP_EOL; 68 | echo ' safe side, please check the requirements from your web'.PHP_EOL; 69 | echo ' server using the '; 70 | echo_style('yellow', 'web/config.php'); 71 | echo ' script.'.PHP_EOL; 72 | echo PHP_EOL; 73 | 74 | exit($checkPassed ? 0 : 1); 75 | 76 | function get_error_message(Requirement $requirement, $lineSize) 77 | { 78 | if ($requirement->isFulfilled()) { 79 | return; 80 | } 81 | 82 | $errorMessage = wordwrap($requirement->getTestMessage(), $lineSize - 3, PHP_EOL.' ').PHP_EOL; 83 | $errorMessage .= ' > '.wordwrap($requirement->getHelpText(), $lineSize - 5, PHP_EOL.' > ').PHP_EOL; 84 | 85 | return $errorMessage; 86 | } 87 | 88 | function echo_title($title, $style = null) 89 | { 90 | $style = $style ?: 'title'; 91 | 92 | echo PHP_EOL; 93 | echo_style($style, $title.PHP_EOL); 94 | echo_style($style, str_repeat('~', strlen($title)).PHP_EOL); 95 | echo PHP_EOL; 96 | } 97 | 98 | function echo_style($style, $message) 99 | { 100 | // ANSI color codes 101 | $styles = array( 102 | 'reset' => "\033[0m", 103 | 'red' => "\033[31m", 104 | 'green' => "\033[32m", 105 | 'yellow' => "\033[33m", 106 | 'error' => "\033[37;41m", 107 | 'success' => "\033[37;42m", 108 | 'title' => "\033[34m", 109 | ); 110 | $supports = has_color_support(); 111 | 112 | echo($supports ? $styles[$style] : '').$message.($supports ? $styles['reset'] : ''); 113 | } 114 | 115 | function echo_block($style, $title, $message) 116 | { 117 | $message = ' '.trim($message).' '; 118 | $width = strlen($message); 119 | 120 | echo PHP_EOL.PHP_EOL; 121 | 122 | echo_style($style, str_repeat(' ', $width)); 123 | echo PHP_EOL; 124 | echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT)); 125 | echo PHP_EOL; 126 | echo_style($style, $message); 127 | echo PHP_EOL; 128 | echo_style($style, str_repeat(' ', $width)); 129 | echo PHP_EOL; 130 | } 131 | 132 | function has_color_support() 133 | { 134 | static $support; 135 | 136 | if (null === $support) { 137 | if (DIRECTORY_SEPARATOR == '\\') { 138 | $support = false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI'); 139 | } else { 140 | $support = function_exists('posix_isatty') && @posix_isatty(STDOUT); 141 | } 142 | } 143 | 144 | return $support; 145 | } 146 | -------------------------------------------------------------------------------- /app/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev'); 19 | $debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(array('--no-debug', '')) && $env !== 'prod'; 20 | 21 | $kernel = new AppKernel($env, $debug); 22 | $application = new Application($kernel); 23 | $application->run($input); -------------------------------------------------------------------------------- /app/phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | 17 | 18 | ../src/*/*Bundle/Tests 19 | ../src/*/Bundle/*Bundle/Tests 20 | 21 | 22 | 23 | 28 | 29 | 30 | 31 | ../src 32 | 33 | ../src/*/*Bundle/Resources 34 | ../src/*/*Bundle/Tests 35 | ../src/*/Bundle/*Bundle/Resources 36 | ../src/*/Bundle/*Bundle/Tests 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /bin/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all -------------------------------------------------------------------------------- /bin/build_code_changes_30.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | mode="side-by-side" 3 | basedir=`cd $(dirname "$BASH_SOURCE"); cd ..; pwd` 4 | outdir=`cd "$basedir"; cd ./web/code-changes/; pwd` 5 | datadir=`cd "$basedir"; cd ./data/code-changes/; pwd` 6 | latest="3.0.14" 7 | releases="3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.7-PL1 3.0.8 3.0.9 3.0.10 3.0.11 3.0.12 3.0.13 3.0.13-PL1" 8 | 9 | # Set up the file structure 10 | if [ ! -d "$datadir/repo" ]; 11 | then 12 | mkdir "$datadir"/repo 13 | fi 14 | 15 | if [ ! -d "$datadir/versions" ]; 16 | then 17 | mkdir "$datadir"/versions 18 | fi 19 | 20 | # Clone the repository 21 | if [ ! -d "$datadir/repo/phpBB" ]; 22 | then 23 | git clone git@github.com:phpbb/phpbb.git "$datadir"/repo 24 | code=$? 25 | if [ $code -ne 0 ]; 26 | then 27 | exit $code 28 | fi 29 | fi 30 | 31 | # Update the repository 32 | cd "$datadir"/repo 33 | rm -f log.txt # Clean up interrupted runs 34 | 35 | git fetch --quiet 36 | git reset --quiet --hard HEAD 37 | 38 | # Grab the latest version 39 | if [ ! -d "$datadir/versions/$latest" ]; 40 | then 41 | echo "Checking out latest version" 42 | git checkout release-$latest --quiet 43 | mkdir "$datadir"/versions/$latest 44 | cp -R phpBB/. "$datadir"/versions/$latest 45 | fi 46 | 47 | # Copy the older release files 48 | for tag in $releases 49 | do 50 | if [ ! -d "$datadir/versions/$tag" ]; 51 | then 52 | echo "Checking out $tag" 53 | git checkout release-$tag --quiet 54 | mkdir "$datadir"/versions/$tag 55 | cp -R phpBB/. "$datadir"/versions/$tag 56 | fi 57 | done 58 | 59 | # Generate the code changes 60 | for tag in $releases 61 | do 62 | echo "Building code changes for $tag-$latest" 63 | if [ ! -d "$outdir/$tag/$mode/$latest" ]; 64 | then 65 | mkdir -p "$outdir"/$tag/$mode/$latest 66 | fi 67 | 68 | git diff --name-status release-$tag release-$latest > "$datadir"/log.txt 69 | php "$basedir"/src/code-changes/create_diffs.php "$outdir" "$datadir" $tag $latest side-by-side "$datadir"/log.txt 70 | rm -f "$datadir"/log.txt 71 | done 72 | 73 | echo "Done" 74 | -------------------------------------------------------------------------------- /bin/build_code_changes_31.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | mode="side-by-side" 3 | basedir=`cd $(dirname "$BASH_SOURCE"); cd ..; pwd` 4 | outdir=`cd "$basedir"; cd ./web/code-changes/; pwd` 5 | datadir=`cd "$basedir"; cd ./data/code-changes/; pwd` 6 | latest="3.1.12" 7 | releases="3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.7-pl1 3.1.8 3.1.9 3.1.10 3.1.11" 8 | 9 | # Set up the file structure 10 | if [ ! -d "$datadir/repo" ]; 11 | then 12 | mkdir "$datadir"/repo 13 | fi 14 | 15 | if [ ! -d "$datadir/versions" ]; 16 | then 17 | mkdir "$datadir"/versions 18 | fi 19 | 20 | # Clone the repository 21 | if [ ! -d "$datadir/repo/phpBB" ]; 22 | then 23 | git clone git@github.com:phpbb/phpbb.git "$datadir"/repo 24 | code=$? 25 | if [ $code -ne 0 ]; 26 | then 27 | exit $code 28 | fi 29 | fi 30 | 31 | # Update the repository 32 | cd "$datadir"/repo 33 | rm -f log.txt # Clean up interrupted runs 34 | 35 | git fetch --quiet 36 | git reset --quiet --hard HEAD 37 | 38 | # Grab the latest version 39 | if [ ! -d "$datadir/versions/$latest" ]; 40 | then 41 | echo "Checking out latest version" 42 | git checkout release-$latest --quiet 43 | mkdir "$datadir"/versions/$latest 44 | cp -R phpBB/. "$datadir"/versions/$latest 45 | fi 46 | 47 | # Copy the older release files 48 | for tag in $releases 49 | do 50 | if [ ! -d "$datadir/versions/$tag" ]; 51 | then 52 | echo "Checking out $tag" 53 | git checkout release-$tag --quiet 54 | mkdir "$datadir"/versions/$tag 55 | cp -R phpBB/. "$datadir"/versions/$tag 56 | fi 57 | done 58 | 59 | # Generate the code changes 60 | for tag in $releases 61 | do 62 | echo "Building code changes for $tag-$latest" 63 | if [ ! -d "$outdir/$tag/$mode/$latest" ]; 64 | then 65 | mkdir -p "$outdir"/$tag/$mode/$latest 66 | fi 67 | 68 | git diff --name-status release-$tag release-$latest > "$datadir"/log.txt 69 | php "$basedir"/src/code-changes/create_diffs.php "$outdir" "$datadir" $tag $latest side-by-side "$datadir"/log.txt 70 | rm -f "$datadir"/log.txt 71 | done 72 | 73 | echo "Done" 74 | -------------------------------------------------------------------------------- /bin/build_code_changes_32.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | mode="side-by-side" 3 | basedir=`cd $(dirname "$BASH_SOURCE"); cd ..; pwd` 4 | outdir=`cd "$basedir"; cd ./web/code-changes/; pwd` 5 | datadir=`cd "$basedir"; cd ./data/code-changes/; pwd` 6 | latest="3.2.11" 7 | releases="3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 3.2.10" 8 | 9 | # Set up the file structure 10 | if [ ! -d "$datadir/repo" ]; 11 | then 12 | mkdir "$datadir"/repo 13 | fi 14 | 15 | if [ ! -d "$datadir/versions" ]; 16 | then 17 | mkdir "$datadir"/versions 18 | fi 19 | 20 | # Clone the repository 21 | if [ ! -d "$datadir/repo/phpBB" ]; 22 | then 23 | git clone git@github.com:phpbb/phpbb.git "$datadir"/repo 24 | code=$? 25 | if [ $code -ne 0 ]; 26 | then 27 | exit $code 28 | fi 29 | fi 30 | 31 | # Update the repository 32 | cd "$datadir"/repo 33 | rm -f log.txt # Clean up interrupted runs 34 | 35 | git fetch --quiet 36 | git reset --quiet --hard HEAD 37 | 38 | # Grab the latest version 39 | if [ ! -d "$datadir/versions/$latest" ]; 40 | then 41 | echo "Checking out latest version" 42 | git checkout release-$latest --quiet 43 | mkdir "$datadir"/versions/$latest 44 | cp -R phpBB/. "$datadir"/versions/$latest 45 | fi 46 | 47 | # Copy the older release files 48 | for tag in $releases 49 | do 50 | if [ ! -d "$datadir/versions/$tag" ]; 51 | then 52 | echo "Checking out $tag" 53 | git checkout release-$tag --quiet 54 | mkdir "$datadir"/versions/$tag 55 | cp -R phpBB/. "$datadir"/versions/$tag 56 | fi 57 | done 58 | 59 | # Generate the code changes 60 | for tag in $releases 61 | do 62 | echo "Building code changes for $tag-$latest" 63 | if [ ! -d "$outdir/$tag/$mode/$latest" ]; 64 | then 65 | mkdir -p "$outdir"/$tag/$mode/$latest 66 | fi 67 | 68 | git diff --name-status release-$tag release-$latest > "$datadir"/log.txt 69 | php "$basedir"/src/code-changes/create_diffs.php "$outdir" "$datadir" $tag $latest side-by-side "$datadir"/log.txt 70 | rm -f "$datadir"/log.txt 71 | done 72 | 73 | echo "Done" 74 | -------------------------------------------------------------------------------- /bin/build_code_changes_33.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | mode="side-by-side" 3 | basedir=`cd $(dirname "$BASH_SOURCE"); cd ..; pwd` 4 | outdir=`cd "$basedir"; cd ./web/code-changes/; pwd` 5 | datadir=`cd "$basedir"; cd ./data/code-changes/; pwd` 6 | latest="3.3.15" 7 | releases="3.3.0-b1 3.3.0-b2 3.3.0-RC1 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9 3.3.10 3.3.11 3.3.12 3.3.13 3.3.14" 8 | 9 | # Set up the file structure 10 | if [ ! -d "$datadir/repo" ]; 11 | then 12 | mkdir "$datadir"/repo 13 | fi 14 | 15 | if [ ! -d "$datadir/versions" ]; 16 | then 17 | mkdir "$datadir"/versions 18 | fi 19 | 20 | # Clone the repository 21 | if [ ! -d "$datadir/repo/phpBB" ]; 22 | then 23 | git clone git@github.com:phpbb/phpbb.git "$datadir"/repo 24 | code=$? 25 | if [ $code -ne 0 ]; 26 | then 27 | exit $code 28 | fi 29 | fi 30 | 31 | # Update the repository 32 | cd "$datadir"/repo 33 | rm -f log.txt # Clean up interrupted runs 34 | 35 | git fetch --quiet 36 | git reset --quiet --hard HEAD 37 | 38 | # Grab the latest version 39 | if [ ! -d "$datadir/versions/$latest" ]; 40 | then 41 | echo "Checking out latest version" 42 | git checkout release-$latest --quiet 43 | mkdir "$datadir"/versions/$latest 44 | cp -R phpBB/. "$datadir"/versions/$latest 45 | fi 46 | 47 | # Copy the older release files 48 | for tag in $releases 49 | do 50 | if [ ! -d "$datadir/versions/$tag" ]; 51 | then 52 | echo "Checking out $tag" 53 | git checkout release-$tag --quiet 54 | mkdir "$datadir"/versions/$tag 55 | cp -R phpBB/. "$datadir"/versions/$tag 56 | fi 57 | done 58 | 59 | # Generate the code changes 60 | for tag in $releases 61 | do 62 | echo "Building code changes for $tag-$latest" 63 | if [ ! -d "$outdir/$tag/$mode/$latest" ]; 64 | then 65 | mkdir -p "$outdir"/$tag/$mode/$latest 66 | fi 67 | 68 | git diff --name-status release-$tag release-$latest > "$datadir"/log.txt 69 | php "$basedir"/src/code-changes/create_diffs.php "$outdir" "$datadir" $tag $latest side-by-side "$datadir"/log.txt 70 | rm -f "$datadir"/log.txt 71 | done 72 | 73 | echo "Done" 74 | -------------------------------------------------------------------------------- /bin/build_docs.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | exec {BASH_XTRACEFD}>&1 3 | set -ex 4 | 5 | ROOT=`cd $(dirname "$BASH_SOURCE"); cd ..; pwd` 6 | DOCS="$ROOT/web/docs" 7 | PHPBBREPO="$ROOT/docs-phpbb" 8 | DOCREPO="$ROOT/documentation" 9 | 10 | # $1 local directory 11 | # $2 repo URL 12 | # $3 reference repository 13 | update_repo() 14 | { 15 | if [ -d "$1" ] 16 | then 17 | cd "$1" 18 | git remote update 19 | else 20 | if [ -d "$3/.git" ] 21 | then 22 | CLONEARGS="--reference $3" 23 | else 24 | CLONEARGS="" 25 | fi 26 | 27 | git clone "$2" "$1" $CLONEARGS 28 | cd "$1" 29 | git config branch.autosetuprebase always 30 | fi 31 | } 32 | 33 | # $1 repository directory 34 | # $2 branch name 35 | # $3 target directory 36 | copy_phpbb_docs() 37 | { 38 | cd $1 39 | mkdir -p "$3" 40 | git checkout --force "$2" 41 | git reset --hard "origin/$2" 42 | rsync -a --delete 'phpBB/docs/' "$3" 43 | } 44 | 45 | # $1 repository directory 46 | # $2 branch name 47 | update_sphinx_docs() 48 | { 49 | cd $1 50 | git checkout --force "$2" 51 | git reset --hard "origin/$2" 52 | } 53 | 54 | update_repo "$PHPBBREPO" 'https://github.com/phpbb/phpbb.git' "$ROOT/area51-phpbb3" 55 | update_repo "$DOCREPO" 'https://github.com/phpbb/documentation.git' 56 | 57 | update_sphinx_docs $DOCREPO "3.2.x" 58 | update_sphinx_docs $DOCREPO "3.3.x" 59 | update_sphinx_docs $DOCREPO "master" 60 | 61 | # Copy phpBB docs directory 62 | copy_phpbb_docs $PHPBBREPO "3.0.x" "$DOCS/30x/" 63 | copy_phpbb_docs $PHPBBREPO "3.1.x" "$DOCS/31x/" 64 | copy_phpbb_docs $PHPBBREPO "3.2.x" "$DOCS/32x/" 65 | copy_phpbb_docs $PHPBBREPO "3.3.x" "$DOCS/33x/" 66 | copy_phpbb_docs $PHPBBREPO "master" "$DOCS/master/" 67 | 68 | cd $DOCREPO 69 | # Create documentation and copy master to main directory. 70 | # Sphinx-multiversion does no longer create a copy of the master version 71 | # in the main directory so we have to redirect people with an index.html 72 | /usr/local/bin/sphinx-multiversion development "$DOCS/dev/" 73 | cp development/_templates/index.html "$DOCS/dev/" 74 | 75 | # Generate API documentation for 3.3.x and master 76 | cd $PHPBBREPO 77 | git checkout 3.3.x 78 | cd phpBB 79 | ../composer.phar install 80 | cd ../build 81 | ../phpBB/vendor/bin/phing docs-all 82 | rsync -a --delete api/output/ "$DOCS/code/" 83 | -------------------------------------------------------------------------------- /bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | getParameterOption(['--env', '-e'], null, true)) { 23 | putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env); 24 | } 25 | 26 | if ($input->hasParameterOption('--no-debug', true)) { 27 | putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); 28 | } 29 | 30 | require dirname(__DIR__).'/config/bootstrap.php'; 31 | 32 | if ($_SERVER['APP_DEBUG']) { 33 | umask(0000); 34 | 35 | if (class_exists(Debug::class)) { 36 | Debug::enable(); 37 | } 38 | } 39 | 40 | $kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); 41 | $application = new Application($kernel); 42 | $application->run($input); 43 | -------------------------------------------------------------------------------- /bin/patch-type-declarations: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | realpath = realpath($opened_path) ?: $opened_path; 34 | $opened_path = $this->realpath; 35 | $this->handle = fopen($this->realpath, $mode); 36 | $this->position = 0; 37 | 38 | return (bool) $this->handle; 39 | } 40 | 41 | public function stream_read($count) 42 | { 43 | $data = fread($this->handle, $count); 44 | 45 | if ($this->position === 0) { 46 | $data = preg_replace('{^#!.*\r?\n}', '', $data); 47 | } 48 | 49 | $this->position += strlen($data); 50 | 51 | return $data; 52 | } 53 | 54 | public function stream_cast($castAs) 55 | { 56 | return $this->handle; 57 | } 58 | 59 | public function stream_close() 60 | { 61 | fclose($this->handle); 62 | } 63 | 64 | public function stream_lock($operation) 65 | { 66 | return $operation ? flock($this->handle, $operation) : true; 67 | } 68 | 69 | public function stream_seek($offset, $whence) 70 | { 71 | if (0 === fseek($this->handle, $offset, $whence)) { 72 | $this->position = ftell($this->handle); 73 | return true; 74 | } 75 | 76 | return false; 77 | } 78 | 79 | public function stream_tell() 80 | { 81 | return $this->position; 82 | } 83 | 84 | public function stream_eof() 85 | { 86 | return feof($this->handle); 87 | } 88 | 89 | public function stream_stat() 90 | { 91 | return array(); 92 | } 93 | 94 | public function stream_set_option($option, $arg1, $arg2) 95 | { 96 | return true; 97 | } 98 | 99 | public function url_stat($path, $flags) 100 | { 101 | $path = substr($path, 17); 102 | if (file_exists($path)) { 103 | return stat($path); 104 | } 105 | 106 | return false; 107 | } 108 | } 109 | } 110 | 111 | if ( 112 | (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) 113 | || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) 114 | ) { 115 | return include("phpvfscomposer://" . __DIR__ . '/..'.'/vendor/symfony/error-handler/Resources/bin/patch-type-declarations'); 116 | } 117 | } 118 | 119 | return include __DIR__ . '/..'.'/vendor/symfony/error-handler/Resources/bin/patch-type-declarations'; 120 | -------------------------------------------------------------------------------- /bin/php-parse: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | realpath = realpath($opened_path) ?: $opened_path; 34 | $opened_path = $this->realpath; 35 | $this->handle = fopen($this->realpath, $mode); 36 | $this->position = 0; 37 | 38 | return (bool) $this->handle; 39 | } 40 | 41 | public function stream_read($count) 42 | { 43 | $data = fread($this->handle, $count); 44 | 45 | if ($this->position === 0) { 46 | $data = preg_replace('{^#!.*\r?\n}', '', $data); 47 | } 48 | 49 | $this->position += strlen($data); 50 | 51 | return $data; 52 | } 53 | 54 | public function stream_cast($castAs) 55 | { 56 | return $this->handle; 57 | } 58 | 59 | public function stream_close() 60 | { 61 | fclose($this->handle); 62 | } 63 | 64 | public function stream_lock($operation) 65 | { 66 | return $operation ? flock($this->handle, $operation) : true; 67 | } 68 | 69 | public function stream_seek($offset, $whence) 70 | { 71 | if (0 === fseek($this->handle, $offset, $whence)) { 72 | $this->position = ftell($this->handle); 73 | return true; 74 | } 75 | 76 | return false; 77 | } 78 | 79 | public function stream_tell() 80 | { 81 | return $this->position; 82 | } 83 | 84 | public function stream_eof() 85 | { 86 | return feof($this->handle); 87 | } 88 | 89 | public function stream_stat() 90 | { 91 | return array(); 92 | } 93 | 94 | public function stream_set_option($option, $arg1, $arg2) 95 | { 96 | return true; 97 | } 98 | 99 | public function url_stat($path, $flags) 100 | { 101 | $path = substr($path, 17); 102 | if (file_exists($path)) { 103 | return stat($path); 104 | } 105 | 106 | return false; 107 | } 108 | } 109 | } 110 | 111 | if ( 112 | (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) 113 | || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) 114 | ) { 115 | return include("phpvfscomposer://" . __DIR__ . '/..'.'/vendor/nikic/php-parser/bin/php-parse'); 116 | } 117 | } 118 | 119 | return include __DIR__ . '/..'.'/vendor/nikic/php-parser/bin/php-parse'; 120 | -------------------------------------------------------------------------------- /bin/phpunit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | realpath = realpath($opened_path) ?: $opened_path; 35 | $opened_path = 'phpvfscomposer://'.$this->realpath; 36 | $this->handle = fopen($this->realpath, $mode); 37 | $this->position = 0; 38 | 39 | return (bool) $this->handle; 40 | } 41 | 42 | public function stream_read($count) 43 | { 44 | $data = fread($this->handle, $count); 45 | 46 | if ($this->position === 0) { 47 | $data = preg_replace('{^#!.*\r?\n}', '', $data); 48 | } 49 | $data = str_replace('__DIR__', var_export(dirname($this->realpath), true), $data); 50 | $data = str_replace('__FILE__', var_export($this->realpath, true), $data); 51 | 52 | $this->position += strlen($data); 53 | 54 | return $data; 55 | } 56 | 57 | public function stream_cast($castAs) 58 | { 59 | return $this->handle; 60 | } 61 | 62 | public function stream_close() 63 | { 64 | fclose($this->handle); 65 | } 66 | 67 | public function stream_lock($operation) 68 | { 69 | return $operation ? flock($this->handle, $operation) : true; 70 | } 71 | 72 | public function stream_seek($offset, $whence) 73 | { 74 | if (0 === fseek($this->handle, $offset, $whence)) { 75 | $this->position = ftell($this->handle); 76 | return true; 77 | } 78 | 79 | return false; 80 | } 81 | 82 | public function stream_tell() 83 | { 84 | return $this->position; 85 | } 86 | 87 | public function stream_eof() 88 | { 89 | return feof($this->handle); 90 | } 91 | 92 | public function stream_stat() 93 | { 94 | return array(); 95 | } 96 | 97 | public function stream_set_option($option, $arg1, $arg2) 98 | { 99 | return true; 100 | } 101 | 102 | public function url_stat($path, $flags) 103 | { 104 | $path = substr($path, 17); 105 | if (file_exists($path)) { 106 | return stat($path); 107 | } 108 | 109 | return false; 110 | } 111 | } 112 | } 113 | 114 | if ( 115 | (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) 116 | || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) 117 | ) { 118 | return include("phpvfscomposer://" . __DIR__ . '/..'.'/vendor/phpunit/phpunit/phpunit'); 119 | } 120 | } 121 | 122 | return include __DIR__ . '/..'.'/vendor/phpunit/phpunit/phpunit'; 123 | -------------------------------------------------------------------------------- /bin/sql-formatter: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | realpath = realpath($opened_path) ?: $opened_path; 34 | $opened_path = $this->realpath; 35 | $this->handle = fopen($this->realpath, $mode); 36 | $this->position = 0; 37 | 38 | return (bool) $this->handle; 39 | } 40 | 41 | public function stream_read($count) 42 | { 43 | $data = fread($this->handle, $count); 44 | 45 | if ($this->position === 0) { 46 | $data = preg_replace('{^#!.*\r?\n}', '', $data); 47 | } 48 | 49 | $this->position += strlen($data); 50 | 51 | return $data; 52 | } 53 | 54 | public function stream_cast($castAs) 55 | { 56 | return $this->handle; 57 | } 58 | 59 | public function stream_close() 60 | { 61 | fclose($this->handle); 62 | } 63 | 64 | public function stream_lock($operation) 65 | { 66 | return $operation ? flock($this->handle, $operation) : true; 67 | } 68 | 69 | public function stream_seek($offset, $whence) 70 | { 71 | if (0 === fseek($this->handle, $offset, $whence)) { 72 | $this->position = ftell($this->handle); 73 | return true; 74 | } 75 | 76 | return false; 77 | } 78 | 79 | public function stream_tell() 80 | { 81 | return $this->position; 82 | } 83 | 84 | public function stream_eof() 85 | { 86 | return feof($this->handle); 87 | } 88 | 89 | public function stream_stat() 90 | { 91 | return array(); 92 | } 93 | 94 | public function stream_set_option($option, $arg1, $arg2) 95 | { 96 | return true; 97 | } 98 | 99 | public function url_stat($path, $flags) 100 | { 101 | $path = substr($path, 17); 102 | if (file_exists($path)) { 103 | return stat($path); 104 | } 105 | 106 | return false; 107 | } 108 | } 109 | } 110 | 111 | if ( 112 | (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) 113 | || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) 114 | ) { 115 | return include("phpvfscomposer://" . __DIR__ . '/..'.'/vendor/doctrine/sql-formatter/bin/sql-formatter'); 116 | } 117 | } 118 | 119 | return include __DIR__ . '/..'.'/vendor/doctrine/sql-formatter/bin/sql-formatter'; 120 | -------------------------------------------------------------------------------- /bin/update_phpbb.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | exec {BASH_XTRACEFD}>&1 3 | set -e 4 | 5 | REMOTE=origin 6 | BRANCH=master 7 | 8 | HERE=$(dirname "$0") 9 | cd "$HERE/../area51-phpbb3/phpBB" 10 | git fetch "$REMOTE" 11 | 12 | if [ `git rev-parse "$BRANCH"` != `git rev-parse "$REMOTE/$BRANCH"` ] 13 | then 14 | git reset --hard "$REMOTE/$BRANCH" 15 | ../composer.phar install --no-dev --optimize-autoloader 16 | bin/phpbbcli.php --safe-mode db:migrate 17 | bin/phpbbcli.php --safe-mode cache:purge 18 | rm cache/production/*.{lock,php} 19 | rm -r cache/production/twig/ 20 | fi 21 | -------------------------------------------------------------------------------- /bin/update_symfony.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | exec {BASH_XTRACEFD}>&1 3 | set -e 4 | 5 | REMOTE=origin 6 | BRANCH=master 7 | 8 | HERE=$(dirname "$0") 9 | cd "$HERE/../" 10 | git fetch "$REMOTE" 11 | 12 | if [ `git rev-parse "$BRANCH"` != `git rev-parse "$REMOTE/$BRANCH"` ] 13 | then 14 | git reset --hard "$REMOTE/$BRANCH" 15 | ./composer.phar install --no-dev --optimize-autoloader 16 | bin/console cache:clear --env=prod 17 | bin/console cache:warmup --env=prod 18 | chmod -R 777 var/cache/* 19 | rm -rf var/cache/prod/ 20 | mkdir var/cache/prod/ 21 | chmod -R 777 var/cache/* 22 | fi 23 | -------------------------------------------------------------------------------- /bin/var-dump-server: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | realpath = realpath($opened_path) ?: $opened_path; 34 | $opened_path = $this->realpath; 35 | $this->handle = fopen($this->realpath, $mode); 36 | $this->position = 0; 37 | 38 | return (bool) $this->handle; 39 | } 40 | 41 | public function stream_read($count) 42 | { 43 | $data = fread($this->handle, $count); 44 | 45 | if ($this->position === 0) { 46 | $data = preg_replace('{^#!.*\r?\n}', '', $data); 47 | } 48 | 49 | $this->position += strlen($data); 50 | 51 | return $data; 52 | } 53 | 54 | public function stream_cast($castAs) 55 | { 56 | return $this->handle; 57 | } 58 | 59 | public function stream_close() 60 | { 61 | fclose($this->handle); 62 | } 63 | 64 | public function stream_lock($operation) 65 | { 66 | return $operation ? flock($this->handle, $operation) : true; 67 | } 68 | 69 | public function stream_seek($offset, $whence) 70 | { 71 | if (0 === fseek($this->handle, $offset, $whence)) { 72 | $this->position = ftell($this->handle); 73 | return true; 74 | } 75 | 76 | return false; 77 | } 78 | 79 | public function stream_tell() 80 | { 81 | return $this->position; 82 | } 83 | 84 | public function stream_eof() 85 | { 86 | return feof($this->handle); 87 | } 88 | 89 | public function stream_stat() 90 | { 91 | return array(); 92 | } 93 | 94 | public function stream_set_option($option, $arg1, $arg2) 95 | { 96 | return true; 97 | } 98 | 99 | public function url_stat($path, $flags) 100 | { 101 | $path = substr($path, 17); 102 | if (file_exists($path)) { 103 | return stat($path); 104 | } 105 | 106 | return false; 107 | } 108 | } 109 | } 110 | 111 | if ( 112 | (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) 113 | || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) 114 | ) { 115 | return include("phpvfscomposer://" . __DIR__ . '/..'.'/vendor/symfony/var-dumper/Resources/bin/var-dump-server'); 116 | } 117 | } 118 | 119 | return include __DIR__ . '/..'.'/vendor/symfony/var-dumper/Resources/bin/var-dump-server'; 120 | -------------------------------------------------------------------------------- /bin/yaml-lint: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | realpath = realpath($opened_path) ?: $opened_path; 34 | $opened_path = $this->realpath; 35 | $this->handle = fopen($this->realpath, $mode); 36 | $this->position = 0; 37 | 38 | return (bool) $this->handle; 39 | } 40 | 41 | public function stream_read($count) 42 | { 43 | $data = fread($this->handle, $count); 44 | 45 | if ($this->position === 0) { 46 | $data = preg_replace('{^#!.*\r?\n}', '', $data); 47 | } 48 | 49 | $this->position += strlen($data); 50 | 51 | return $data; 52 | } 53 | 54 | public function stream_cast($castAs) 55 | { 56 | return $this->handle; 57 | } 58 | 59 | public function stream_close() 60 | { 61 | fclose($this->handle); 62 | } 63 | 64 | public function stream_lock($operation) 65 | { 66 | return $operation ? flock($this->handle, $operation) : true; 67 | } 68 | 69 | public function stream_seek($offset, $whence) 70 | { 71 | if (0 === fseek($this->handle, $offset, $whence)) { 72 | $this->position = ftell($this->handle); 73 | return true; 74 | } 75 | 76 | return false; 77 | } 78 | 79 | public function stream_tell() 80 | { 81 | return $this->position; 82 | } 83 | 84 | public function stream_eof() 85 | { 86 | return feof($this->handle); 87 | } 88 | 89 | public function stream_stat() 90 | { 91 | return array(); 92 | } 93 | 94 | public function stream_set_option($option, $arg1, $arg2) 95 | { 96 | return true; 97 | } 98 | 99 | public function url_stat($path, $flags) 100 | { 101 | $path = substr($path, 17); 102 | if (file_exists($path)) { 103 | return stat($path); 104 | } 105 | 106 | return false; 107 | } 108 | } 109 | } 110 | 111 | if ( 112 | (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) 113 | || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) 114 | ) { 115 | return include("phpvfscomposer://" . __DIR__ . '/..'.'/vendor/symfony/yaml/Resources/bin/yaml-lint'); 116 | } 117 | } 118 | 119 | return include __DIR__ . '/..'.'/vendor/symfony/yaml/Resources/bin/yaml-lint'; 120 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "phpbb/area51", 3 | "description": "phpBB's Area51 site", 4 | "autoload": { 5 | "psr-4": { 6 | "App\\": "src/" 7 | } 8 | }, 9 | "require": { 10 | "doctrine/orm": "~2.2,>=2.2.3", 11 | "doctrine/doctrine-bundle": "^2.1", 12 | "php": "^8.1", 13 | "symfony/monolog-bundle": "~3.8", 14 | "symfony/flex": "^2.4", 15 | "symfony/framework-bundle": "^6.3", 16 | "symfony/twig-bundle": "^6.3", 17 | "twig/extra-bundle": "^2.12|^3.0", 18 | "twig/twig": "^2.12|^3.0", 19 | "symfony/yaml": "^6.3", 20 | "sensio/framework-extra-bundle": "^6.2", 21 | "symfony/asset": "^6.3", 22 | "symfony/dotenv": "^6.3" 23 | }, 24 | "require-dev": { 25 | "phpunit/phpunit": "~9.6", 26 | "symfony/browser-kit": "^6.3", 27 | "symfony/css-selector": "^6.3" 28 | }, 29 | "conflict": { 30 | "symfony/symfony": "*" 31 | }, 32 | "config": { 33 | "bin-dir": "bin", 34 | "allow-plugins": { 35 | "symfony/flex": true 36 | } 37 | }, 38 | "extra": { 39 | "extra": { 40 | "public-dir": "web", 41 | "symfony-var-dir": "var", 42 | "symfony-bin-dir": "bin", 43 | "symfony-assets-install": "relative" 44 | } 45 | }, 46 | "minimum-stability": "stable", 47 | "scripts": { 48 | "auto-scripts": { 49 | "cache:clear": "symfony-cmd", 50 | "assets:install %PUBLIC_DIR%": "symfony-cmd" 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /composer.phar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/composer.phar -------------------------------------------------------------------------------- /config/bootstrap.php: -------------------------------------------------------------------------------- 1 | =1.2) 13 | if (is_array($env = @include dirname(__DIR__).'/.env.local.php') && (!isset($env['APP_ENV']) || ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'])) { 14 | (new Dotenv(false))->populate($env); 15 | } else { 16 | // load all the .env files 17 | (new Dotenv(false))->loadEnv(dirname(__DIR__).'/.env'); 18 | } 19 | 20 | $_SERVER += $_ENV; 21 | $_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; 22 | $_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; 23 | $_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; 24 | -------------------------------------------------------------------------------- /config/bundles.php: -------------------------------------------------------------------------------- 1 | ['all' => true], 5 | Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], 6 | Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], 7 | Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], 8 | Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], 9 | Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], 10 | ]; 11 | -------------------------------------------------------------------------------- /config/config.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: parameters.yml } 3 | # - { resource: security.yml } 4 | 5 | framework: 6 | secret: "%secret%" 7 | router: { resource: "%kernel.root_dir%/config/routing.yml" } 8 | form: true 9 | csrf_protection: true 10 | validation: { enable_annotations: true } 11 | templating: 12 | engines: ['twig'] 13 | assets: 14 | version: 111020132212 15 | version_format: "%%s?v%%s" 16 | session: ~ 17 | esi: { enabled: true } 18 | 19 | # Twig Configuration 20 | twig: 21 | debug: "%kernel.debug%" 22 | strict_variables: "%kernel.debug%" 23 | 24 | # Assetic Configuration 25 | assetic: 26 | debug: "%kernel.debug%" 27 | use_controller: false 28 | filters: 29 | cssrewrite: ~ 30 | # closure: 31 | # jar: %kernel.root_dir%/java/compiler.jar 32 | # yui_css: 33 | # jar: %kernel.root_dir%/java/yuicompressor-2.4.2.jar 34 | 35 | # Doctrine Configuration 36 | # doctrine: 37 | # dbal: 38 | # driver: %database_driver% 39 | # host: %database_host% 40 | # dbname: %database_name% 41 | # user: %database_user% 42 | # password: %database_password% 43 | # charset: UTF8 44 | 45 | # orm: 46 | # auto_generate_proxy_classes: %kernel.debug% 47 | # auto_mapping: true 48 | 49 | # Swiftmailer Configuration 50 | # swiftmailer: 51 | # transport: %mailer_transport% 52 | # host: %mailer_host% 53 | # username: %mailer_user% 54 | # password: %mailer_password% 55 | 56 | # jms_security_extra: 57 | # secure_controllers: true 58 | # secure_all_services: false 59 | 60 | sensio_framework_extra: 61 | cache: { annotations: true } 62 | 63 | services: 64 | tracker_chart_factory: 65 | class: App\TrackerChartFactory 66 | arguments: ["%tracker_chart.root_path%"] 67 | -------------------------------------------------------------------------------- /config/config_dev.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config.yml } 3 | 4 | framework: 5 | router: { resource: "%kernel.root_dir%/config/routing_dev.yml" } 6 | profiler: { only_exceptions: false } 7 | 8 | web_profiler: 9 | toolbar: true 10 | intercept_redirects: false 11 | 12 | monolog: 13 | handlers: 14 | main: 15 | type: stream 16 | path: "%kernel.logs_dir%/%kernel.environment%.log" 17 | level: debug 18 | firephp: 19 | type: firephp 20 | level: info 21 | 22 | assetic: 23 | use_controller: true 24 | -------------------------------------------------------------------------------- /config/config_prod.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config.yml } 3 | 4 | #doctrine: 5 | # metadata_cache_driver: apc 6 | # result_cache_driver: apc 7 | # query_cache_driver: apc 8 | 9 | monolog: 10 | handlers: 11 | main: 12 | type: fingers_crossed 13 | action_level: error 14 | handler: nested 15 | nested: 16 | type: stream 17 | path: %kernel.logs_dir%/%kernel.environment%.log 18 | level: debug 19 | -------------------------------------------------------------------------------- /config/config_test.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config_dev.yml } 3 | 4 | framework: 5 | test: ~ 6 | session: 7 | storage_id: session.storage.mock_file 8 | 9 | web_profiler: 10 | toolbar: false 11 | intercept_redirects: false 12 | -------------------------------------------------------------------------------- /config/packages/cache.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | cache: 3 | # Unique name of your app: used to compute stable namespaces for cache keys. 4 | #prefix_seed: your_vendor_name/app_name 5 | 6 | # The "app" cache stores to the filesystem by default. 7 | # The data in this cache should persist between deploys. 8 | # Other options include: 9 | 10 | # Redis 11 | #app: cache.adapter.redis 12 | #default_redis_provider: redis://localhost 13 | 14 | # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) 15 | #app: cache.adapter.apcu 16 | 17 | # Namespaced pools use the above "app" backend by default 18 | #pools: 19 | #my.dedicated.cache: null 20 | -------------------------------------------------------------------------------- /config/packages/dev/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: stream 5 | path: "%kernel.logs_dir%/%kernel.environment%.log" 6 | level: debug 7 | channels: ["!event"] 8 | # uncomment to get logging in your browser 9 | # you may have to allow bigger header sizes in your Web server configuration 10 | #firephp: 11 | # type: firephp 12 | # level: info 13 | #chromephp: 14 | # type: chromephp 15 | # level: info 16 | console: 17 | type: console 18 | process_psr_3_messages: false 19 | channels: ["!event", "!doctrine", "!console"] 20 | -------------------------------------------------------------------------------- /config/packages/doctrine.yaml: -------------------------------------------------------------------------------- 1 | doctrine: 2 | dbal: 3 | url: '%env(resolve:DATABASE_URL)%' 4 | 5 | # IMPORTANT: You MUST configure your server version, 6 | # either here or in the DATABASE_URL env var (see .env file) 7 | #server_version: '15' 8 | 9 | # only needed for MySQL 10 | charset: utf8mb4 11 | default_table_options: 12 | collate: utf8mb4_unicode_ci 13 | 14 | # backtrace queries in profiler (increases memory usage per request) 15 | #profiling_collect_backtrace: '%kernel.debug%' 16 | orm: 17 | auto_generate_proxy_classes: true 18 | naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware 19 | auto_mapping: true 20 | mappings: 21 | App: 22 | is_bundle: false 23 | type: annotation 24 | dir: '%kernel.project_dir%/src/Entity' 25 | prefix: 'App\Entity' 26 | alias: App 27 | -------------------------------------------------------------------------------- /config/packages/framework.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | secret: '%env(APP_SECRET)%' 3 | #csrf_protection: true 4 | #http_method_override: true 5 | 6 | # Enables session support. Note that the session will ONLY be started if you read or write from it. 7 | # Remove or comment this section to explicitly disable session support. 8 | session: 9 | handler_id: null 10 | cookie_samesite: lax 11 | 12 | #esi: true 13 | #fragments: true 14 | php_errors: 15 | log: true 16 | -------------------------------------------------------------------------------- /config/packages/prod/deprecations.yaml: -------------------------------------------------------------------------------- 1 | # As of Symfony 5.1, deprecations are logged in the dedicated "deprecation" channel when it exists 2 | #monolog: 3 | # channels: [deprecation] 4 | # handlers: 5 | # deprecation: 6 | # type: stream 7 | # channels: [deprecation] 8 | # path: "%kernel.logs_dir%/%kernel.environment%.deprecations.log" 9 | -------------------------------------------------------------------------------- /config/packages/prod/doctrine.yaml: -------------------------------------------------------------------------------- 1 | doctrine: 2 | orm: 3 | auto_generate_proxy_classes: false 4 | metadata_cache_driver: 5 | type: pool 6 | pool: doctrine.system_cache_pool 7 | query_cache_driver: 8 | type: pool 9 | pool: doctrine.system_cache_pool 10 | result_cache_driver: 11 | type: pool 12 | pool: doctrine.result_cache_pool 13 | 14 | framework: 15 | cache: 16 | pools: 17 | doctrine.result_cache_pool: 18 | adapter: cache.app 19 | doctrine.system_cache_pool: 20 | adapter: cache.system 21 | -------------------------------------------------------------------------------- /config/packages/prod/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: fingers_crossed 5 | action_level: error 6 | handler: nested 7 | excluded_http_codes: [404, 405] 8 | buffer_size: 50 # How many messages should be saved? Prevent memory leaks 9 | nested: 10 | type: stream 11 | path: "%kernel.logs_dir%/%kernel.environment%.log" 12 | level: debug 13 | console: 14 | type: console 15 | process_psr_3_messages: false 16 | channels: ["!event", "!doctrine"] 17 | -------------------------------------------------------------------------------- /config/packages/prod/routing.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | router: 3 | strict_requirements: null 4 | -------------------------------------------------------------------------------- /config/packages/sensio_framework_extra.yaml: -------------------------------------------------------------------------------- 1 | sensio_framework_extra: 2 | router: 3 | annotations: false 4 | -------------------------------------------------------------------------------- /config/packages/test/framework.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | test: true 3 | session: 4 | storage_factory_id: session.storage.factory.mock_file 5 | -------------------------------------------------------------------------------- /config/packages/test/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: fingers_crossed 5 | action_level: error 6 | handler: nested 7 | excluded_http_codes: [404, 405] 8 | channels: ["!event"] 9 | nested: 10 | type: stream 11 | path: "%kernel.logs_dir%/%kernel.environment%.log" 12 | level: debug 13 | -------------------------------------------------------------------------------- /config/packages/test/twig.yaml: -------------------------------------------------------------------------------- 1 | twig: 2 | strict_variables: true 3 | -------------------------------------------------------------------------------- /config/packages/twig.yaml: -------------------------------------------------------------------------------- 1 | twig: 2 | default_path: '%kernel.project_dir%/templates' 3 | debug: '%kernel.debug%' 4 | strict_variables: '%kernel.debug%' 5 | exception_controller: null 6 | -------------------------------------------------------------------------------- /config/routes.yaml: -------------------------------------------------------------------------------- 1 | #index: 2 | # path: / 3 | # controller: App\Controller\DefaultController::index 4 | -------------------------------------------------------------------------------- /config/routes/annotations.yaml: -------------------------------------------------------------------------------- 1 | controllers: 2 | resource: ../../src/Controller/ 3 | type: annotation 4 | 5 | kernel: 6 | resource: ../../src/Kernel.php 7 | type: annotation 8 | -------------------------------------------------------------------------------- /config/routing_dev.yml: -------------------------------------------------------------------------------- 1 | _assetic: 2 | resource: . 3 | type: assetic 4 | 5 | _wdt: 6 | resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml" 7 | prefix: /_wdt 8 | 9 | _profiler: 10 | resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml" 11 | prefix: /_profiler 12 | 13 | _main: 14 | resource: routing.yml 15 | -------------------------------------------------------------------------------- /config/security.yml: -------------------------------------------------------------------------------- 1 | security: 2 | encoders: 3 | Symfony\Component\Security\Core\User\User: plaintext 4 | 5 | role_hierarchy: 6 | ROLE_ADMIN: ROLE_USER 7 | ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 8 | 9 | providers: 10 | in_memory: 11 | users: 12 | user: { password: userpass, roles: [ 'ROLE_USER' ] } 13 | admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] } 14 | 15 | firewalls: 16 | dev: 17 | pattern: ^/(_(profiler|wdt)|css|images|js)/ 18 | security: false 19 | 20 | login: 21 | pattern: ^/demo/secured/login$ 22 | security: false 23 | 24 | secured_area: 25 | pattern: ^/demo/secured/ 26 | form_login: 27 | check_path: /demo/secured/login_check 28 | login_path: /demo/secured/login 29 | logout: 30 | path: /demo/secured/logout 31 | target: /demo/ 32 | #anonymous: ~ 33 | #http_basic: 34 | # realm: "Secured Demo Area" 35 | 36 | access_control: 37 | #- { path: /login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 38 | -------------------------------------------------------------------------------- /config/services.yaml: -------------------------------------------------------------------------------- 1 | # This file is the entry point to configure your own services. 2 | # Files in the packages/ subdirectory configure your dependencies. 3 | 4 | # Put parameters here that don't need to change on each machine where the app is deployed 5 | # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration 6 | parameters: 7 | 8 | services: 9 | # default configuration for services in *this* file 10 | _defaults: 11 | autowire: true # Automatically injects dependencies in your services. 12 | autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. 13 | public: false # Allows optimizing the container by removing unused services; this also means 14 | # fetching services directly from the container via $container->get() won't work. 15 | # The best practice is to be explicit about your dependencies anyway. 16 | 17 | # makes classes in src/ available to be used as services 18 | # this creates a service per class whose id is the fully-qualified class name 19 | App\: 20 | resource: '../src/*' 21 | exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' 22 | 23 | # controllers are imported separately to make sure services can be injected 24 | # as action arguments even if you don't extend any base controller class 25 | App\Controller\: 26 | resource: '../src/Controller' 27 | tags: ['controller.service_arguments'] 28 | 29 | # add more service definitions when explicit configuration is needed 30 | # please note that last definitions always *replace* previous ones 31 | -------------------------------------------------------------------------------- /data/code-changes/template/30_nav.html: -------------------------------------------------------------------------------- 1 | 20 | -------------------------------------------------------------------------------- /data/code-changes/template/31_nav.html: -------------------------------------------------------------------------------- 1 | 17 | -------------------------------------------------------------------------------- /data/code-changes/template/32_nav.html: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /data/code-changes/template/33_nav.html: -------------------------------------------------------------------------------- 1 | 22 | -------------------------------------------------------------------------------- /data/code-changes/template/overall_footer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 19 | 20 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /data/code-changes/template/overall_header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Code Changes 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 79 | 80 | 81 | 82 | 83 |
84 | 92 |
93 | phpBB 94 |
95 |
96 | 97 |
98 |

Code Changes

99 |
100 | 101 |
102 |
103 |
104 | 105 |
    106 | {TABS} 107 |
108 | {CURRENT_FILE} 109 |
110 |
111 |
112 | 113 |
114 |
115 | 118 |
-------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | src 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | tests 19 | 20 | 21 | 25 | 26 | -------------------------------------------------------------------------------- /src/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all -------------------------------------------------------------------------------- /src/Controller/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/src/Controller/.gitignore -------------------------------------------------------------------------------- /src/Controller/DefaultController.php: -------------------------------------------------------------------------------- 1 | render('default/index.html.twig', [ 19 | 'active_tab' => 'index', 20 | ]); 21 | } 22 | 23 | /** 24 | * @Route("/stats/", name="stats") 25 | */ 26 | public function statsAction(\App\TrackerChartFactory $factory): Response 27 | { 28 | $trackerStart = new \DateTime('2006-01-01T00:00:00+00:00'); 29 | 30 | $ascraeusCreatedVsResolved = $factory->create() 31 | ->selectAscraeus() 32 | ->createdVsResolved() 33 | ->daysSince($trackerStart) 34 | ->quarterly() 35 | ->cumulative(true) 36 | ->showUnresolvedTrend() 37 | ->get(); 38 | 39 | $ascraeusAvgAge = $factory->create() 40 | ->selectAscraeus() 41 | ->averageAge() 42 | ->daysSince($trackerStart) 43 | ->monthly() 44 | ->get(); 45 | 46 | $rheaCreatedVsResolved = $factory->create() 47 | ->selectRhea() 48 | ->createdVsResolved() 49 | ->daysSince($trackerStart) 50 | ->quarterly() 51 | ->cumulative(true) 52 | ->showUnresolvedTrend() 53 | ->get(); 54 | 55 | $rheaAvgAge = $factory->create() 56 | ->selectRhea() 57 | ->averageAge() 58 | ->daysSince($trackerStart) 59 | ->monthly() 60 | ->get(); 61 | 62 | $proteusCreatedVsResolved = $factory->create() 63 | ->selectProteus() 64 | ->createdVsResolved() 65 | ->daysSince($trackerStart) 66 | ->quarterly() 67 | ->cumulative(true) 68 | ->showUnresolvedTrend() 69 | ->get(); 70 | 71 | $proteusAvgAge = $factory->create() 72 | ->selectProteus() 73 | ->averageAge() 74 | ->daysSince($trackerStart) 75 | ->monthly() 76 | ->get(); 77 | 78 | return $this->render('default/stats.html.twig', [ 79 | 'active_tab' => 'stats', 80 | 81 | 'ascraeus_created_vs_resolved' => $ascraeusCreatedVsResolved, 82 | 'ascraeus_avg_age' => $ascraeusAvgAge, 83 | 'rhea_created_vs_resolved' => $rheaCreatedVsResolved, 84 | 'rhea_avg_age' => $rheaAvgAge, 85 | 'proteus_created_vs_resolved' => $proteusCreatedVsResolved, 86 | 'proteus_avg_age' => $proteusAvgAge, 87 | ]); 88 | } 89 | 90 | /** 91 | * @Route("/projects/", name="projects") 92 | */ 93 | public function projectsAction(): Response 94 | { 95 | return $this->render('default/projects.html.twig', [ 96 | 'active_tab' => 'projects', 97 | ]); 98 | } 99 | 100 | /** 101 | * @Route("/docs{path}", requirements={"path"=".*"}, defaults={"path"=""}) 102 | */ 103 | public function docsRedirectAction($path): RedirectResponse 104 | { 105 | if (str_starts_with($path, '/3')) { 106 | return $this->redirect('http://area51.phpbb.com/docs/30x'.$path, 301); 107 | } 108 | return $this->redirect($this->generateUrl('index'), 301); 109 | } 110 | 111 | /** 112 | * @Route("/downloads/", name="downloads") 113 | */ 114 | public function downloadsAction(): Response 115 | { 116 | // Make this false when the most recent release is not an RC/Alpha/Beta 117 | $latestDevelopment = false; 118 | 119 | $previousVersions = ['3.3.14', '3.3.13', '3.3.12', '3.3.11', '3.3.10', '3.3.9', '3.3.8', '3.3.7', '3.3.6', '3.3.5', '3.3.4', '3.3.3', '3.3.2', '3.3.1', '3.3.0', '3.2.10', '3.2.9', '3.2.8', '3.2.7', '3.2.6', '3.2.5', '3.2.4', '3.2.3', '3.2.2', '3.2.1', '3.2.0', '3.1.12', '3.1.11', '3.1.10', '3.1.9', '3.1.8', '3.1.7-pl1', '3.1.6', '3.1.5', '3.1.4', '3.1.3', '3.1.2', '3.1.1', '3.1.0']; 120 | $currentVersion = '3.3.15-RC1'; 121 | $mainPackageSha = 'c92312e28db0000fffa5d25acb73ff1fca967997aea2ca3754d515497cd25a82'; 122 | $currentBranch = '3.3/unstable'; 123 | $currentVersionFiles = 'https://download.phpbb.com/pub/release/' . $currentBranch 124 | . '/' . $currentVersion . '/'; 125 | $currentUpgradeFiles = 'https://download.phpbb.com/pub/release/' . $currentBranch 126 | . '/' . $currentVersion . '/'; 127 | 128 | return $this->render('default/downloads.html.twig', [ 129 | 'active_tab' => 'downloads', 130 | 'later' => false, 131 | 'latestDevelopment' => $latestDevelopment, 132 | 'previousVersions' => $previousVersions, 133 | 'currentVersion' => $currentVersion, 134 | 'currentVersionFiles' => $currentVersionFiles, 135 | 'currentUpgradeFiles' => $currentUpgradeFiles, 136 | 'mainPackageSha' => $mainPackageSha, 137 | ]); 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /src/DependencyInjection/PhpbbArea51Extension.php: -------------------------------------------------------------------------------- 1 | load('services.yml'); 16 | } 17 | 18 | public function getAlias() 19 | { 20 | return 'phpbb_area51'; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Entity/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/src/Entity/.gitignore -------------------------------------------------------------------------------- /src/Kernel.php: -------------------------------------------------------------------------------- 1 | getProjectDir().'/var/cache/'.$this->environment; 21 | } 22 | 23 | public function getLogDir(): string 24 | { 25 | return $this->getProjectDir().'/var/log'; 26 | } 27 | 28 | public function registerBundles(): iterable 29 | { 30 | $contents = require $this->getProjectDir().'/config/bundles.php'; 31 | foreach ($contents as $class => $envs) { 32 | if ($envs[$this->environment] ?? $envs['all'] ?? false) { 33 | yield new $class(); 34 | } 35 | } 36 | } 37 | 38 | protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader) 39 | { 40 | $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php')); 41 | // Feel free to remove the "container.autowiring.strict_mode" parameter 42 | // if you are using symfony/dependency-injection 4.0+ as it's the default behavior 43 | $container->setParameter('container.autowiring.strict_mode', true); 44 | $container->setParameter('container.dumper.inline_class_loader', true); 45 | $confDir = $this->getProjectDir().'/config'; 46 | 47 | $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob'); 48 | $loader->load($confDir.'/{packages}/'.$this->environment.'/*'.self::CONFIG_EXTS, 'glob'); 49 | $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob'); 50 | $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob'); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/Repository/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/src/Repository/.gitignore -------------------------------------------------------------------------------- /src/TrackerChart.php: -------------------------------------------------------------------------------- 1 | root_path = $root_path; 16 | $this->jira = 'https://tracker.phpbb.com/'; 17 | 18 | $this->query['versionLabels'] = 'all'; 19 | $this->query['selectedProjectId'] = '10010'; 20 | 21 | $this->query['width'] = '380'; 22 | $this->query['height'] = '300'; 23 | $this->query['timestamp-cache-expire'] = date('Y-z'); 24 | } 25 | 26 | public function width($width) 27 | { 28 | $this->query['width'] = $width; 29 | return $this; 30 | } 31 | 32 | public function height($height) 33 | { 34 | $this->query['height'] = $height; 35 | return $this; 36 | } 37 | 38 | public function showUnresolvedTrend() 39 | { 40 | $this->query['showUnresolvedTrend'] = 'true'; 41 | return $this; 42 | } 43 | 44 | public function createdVsResolved() 45 | { 46 | //$this->query['reportKey'] = 'com.atlassian.jira.plugin.system.reports:createdvsresolved-report'; 47 | $this->gadgetName = 'createdVsResolved'; 48 | return $this; 49 | } 50 | 51 | public function resolutionTime() 52 | { 53 | $this->gadgetName = 'resolutiontime'; 54 | return $this; 55 | } 56 | 57 | public function averageAge() 58 | { 59 | $this->gadgetName = 'averageage'; 60 | return $this; 61 | } 62 | 63 | public function authorPieChart($stat) 64 | { 65 | $this->gadgetName = 'piechart'; 66 | $this->data['statType'] = $stat; 67 | return $this; 68 | } 69 | 70 | public function selectOlympus() 71 | { 72 | $this->query['projectOrFilterId'] = 'filter-10201'; 73 | return $this; 74 | } 75 | 76 | public function selectAscraeus() 77 | { 78 | $this->query['projectOrFilterId'] = 'filter-10202'; 79 | return $this; 80 | } 81 | 82 | public function selectAscraeusResolved() 83 | { 84 | $this->query['projectOrFilterId'] = 'filter-10203'; 85 | return $this; 86 | } 87 | 88 | public function selectRhea() 89 | { 90 | $this->query['projectOrFilterId'] = 'filter-14995'; 91 | return $this; 92 | } 93 | 94 | public function selectRheaResolved() 95 | { 96 | $this->query['projectOrFilterId'] = 'filter-14996'; 97 | return $this; 98 | } 99 | 100 | public function selectProteus() 101 | { 102 | $this->query['projectOrFilterId'] = 'filter-15190'; 103 | return $this; 104 | } 105 | 106 | public function selectProteusResolved() 107 | { 108 | $this->query['projectOrFilterId'] = 'filter-15191'; 109 | return $this; 110 | } 111 | 112 | public function days($days) 113 | { 114 | $this->query['daysprevious'] = $days; 115 | return $this; 116 | } 117 | 118 | public function daysSince(\DateTime $date) 119 | { 120 | $this->query['daysprevious'] = $date->diff(new \DateTime())->days; 121 | return $this; 122 | } 123 | 124 | public function cumulative($cumulative) 125 | { 126 | $this->query['cumulative'] = 'true'; 127 | return $this; 128 | } 129 | 130 | public function yearly() 131 | { 132 | $this->query['periodName'] = 'yearly'; 133 | $this->cacheInterval = 24 * 60 * 60; // one day 134 | return $this; 135 | } 136 | 137 | public function quarterly() 138 | { 139 | $this->query['periodName'] = 'quarterly'; 140 | $this->cacheInterval = 24 * 60 * 60; // one day 141 | return $this; 142 | } 143 | 144 | public function monthly() 145 | { 146 | $this->query['periodName'] = 'monthly'; 147 | $this->cacheInterval = 24 * 60 * 60; // one day 148 | return $this; 149 | } 150 | 151 | public function weekly() 152 | { 153 | $this->query['periodName'] = 'weekly'; 154 | $this->cacheInterval = 24 * 60 * 60; // one day 155 | return $this; 156 | } 157 | 158 | public function daily() 159 | { 160 | $this->query['periodName'] = 'daily'; 161 | $this->cacheInterval = 24 * 60; // one hour 162 | return $this; 163 | } 164 | 165 | public function get() 166 | { 167 | $query = ''; 168 | foreach ($this->query as $key => $value) 169 | { 170 | $query .= urlencode($key) . '=' . urlencode($value) . '&'; 171 | } 172 | 173 | $targetPath = $this->root_path . 'writable/stats/' . md5($query) . '.png'; 174 | 175 | 176 | if (!file_exists($targetPath) || filemtime($targetPath) + $this->cacheInterval < time()) 177 | { 178 | @$this->download($targetPath, $query); 179 | } 180 | 181 | return $targetPath; 182 | } 183 | 184 | public function download($targetPath, $query) 185 | { 186 | $json = file_get_contents($this->jira . 'rest/gadget/1.0/' . $this->gadgetName . '/generate?' . $query); 187 | $data = json_decode($json); 188 | 189 | if ($data->location) 190 | { 191 | $imgUrl = $this->jira . 'charts?filename=' . $data->location; 192 | $imgData = file_get_contents($imgUrl); 193 | 194 | if ($imgData) 195 | { 196 | file_put_contents($targetPath, $imgData); 197 | } 198 | } 199 | } 200 | 201 | public function render() 202 | { 203 | return ''; 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /src/TrackerChartFactory.php: -------------------------------------------------------------------------------- 1 | root_path = $root_path; 16 | } 17 | 18 | public function create() 19 | { 20 | return new TrackerChart($this->root_path); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/code-changes/create_diffs.php: -------------------------------------------------------------------------------- 1 | '); 5 | } 6 | 7 | $base_dir = dirname(__FILE__); 8 | $out_dir = $argv[1]; //'/path/to/web/code-changes/' 9 | $data_dir = $argv[2]; //'/path/to/data/code-changes/' 10 | $from_version = $argv[3]; //'3.0.0'; 11 | $to_version = $argv[4]; //'3.0.10'; 12 | $diff_mode = $argv[5]; //'side-by-side'; 13 | $file = $argv[6]; //'file.txt' 14 | 15 | define('IN_PHPBB', true); 16 | include($base_dir . '/includes/diff.php'); 17 | include($base_dir . '/includes/engine.php'); 18 | include($base_dir . '/includes/renderer.php'); 19 | 20 | class user 21 | { 22 | var $lang = array( 23 | 'LINE' => 'Line', 24 | 'LINE_ADDED' => 'Added', 25 | 'LINE_MODIFIED' => 'Modified', 26 | 'LINE_REMOVED' => 'Removed', 27 | 'LINE_UNMODIFIED' => 'Unmodified', 28 | 'NO_VISIBLE_CHANGES' => 'No visible changes', 29 | ); 30 | } 31 | $user = new user(); 32 | 33 | /** 34 | * Compares two version of the given file path and generates a diff output file 35 | * 36 | * @param $path string The file path 37 | * 38 | * @return null 39 | */ 40 | function generate_diff_file($path) 41 | { 42 | global $data_dir, $out_dir, $diff_mode, $from_version, $to_version; 43 | 44 | if(file_exists($data_dir . '/versions/' . $from_version . '/' . $path)) 45 | { 46 | $file1 = file_get_contents($data_dir . '/versions/' . $from_version . '/' . $path); 47 | } 48 | else 49 | { 50 | $file1 = ''; 51 | } 52 | 53 | if(file_exists($data_dir . '/versions/' . $to_version . '/' . $path)) 54 | { 55 | $file2 = file_get_contents($data_dir . '/versions/' . $to_version . '/' . $path); 56 | } 57 | else 58 | { 59 | $file2 = ''; 60 | } 61 | 62 | $diff = new diff($file1, $file2); 63 | 64 | if($diff_mode == 'side-by-side') 65 | { 66 | $renderer = new diff_renderer_side_by_side();; 67 | } 68 | else if($diff_mode == 'inline') 69 | { 70 | $renderer = new diff_renderer_inline(); 71 | } 72 | 73 | $output = $renderer->get_diff_content($diff); 74 | 75 | $header = file_get_contents($data_dir . '/template/overall_header.html'); 76 | $footer = file_get_contents($data_dir . '/template/overall_footer.html'); 77 | 78 | $navigation_data = get_navigation_data($data_dir, $from_version); 79 | if (empty($navigation_data)) 80 | { 81 | exit; 82 | } 83 | 84 | $header = str_replace('{PREV_VERSIONS_NAV}', $navigation_data['nav'], $header); 85 | 86 | //Set the active version in the navigation 87 | $header = str_replace('
  • ', '
  • ', $header); 88 | 89 | //Set the current file being viewed 90 | $header = str_replace('{CURRENT_FILE}', '

    File: ' . $path . '

    ', $header); 91 | 92 | //Set the active tab 93 | $header = str_replace('{TABS}', $navigation_data['tabs'], $header); 94 | 95 | //Build the structure if necessary 96 | $dir = $out_dir . '/' . $from_version . '/' . $diff_mode . '/' . $to_version; 97 | if(!is_dir($dir)) 98 | { 99 | mkdir($dir, 0755, true); 100 | } 101 | 102 | //Write the file, prefix with phpbb- so that we can go to .htaccess files 103 | $file_name = 'phpbb-' . str_replace('/', '-', $path); 104 | $fh = fopen($dir . '/' . $file_name . '.html', 'wb+'); 105 | fwrite($fh, $header); 106 | fwrite($fh, $output); 107 | fwrite($fh, $footer); 108 | fclose($fh); 109 | } 110 | 111 | /** 112 | * Given a file, an icon is selected based on the file type and type of changes made to the file (added/modified/removed) 113 | * 114 | * @param $path string The file path 115 | * @param $folder bool If the file is actually a folder 116 | * 117 | * @return string The class name to use 118 | */ 119 | function get_icon($path, $folder = false) 120 | { 121 | global $status_info; 122 | 123 | if($folder) 124 | { 125 | return 'folder'; 126 | } 127 | else 128 | { 129 | $status = $status_info[$path]; 130 | return 'file ' . $status; 131 | } 132 | } 133 | 134 | /** 135 | * Determines if a file is a binary or text file 136 | * 137 | * @param $filename string The name of the target file 138 | * 139 | * @return boolean 140 | */ 141 | function is_binary($filename) 142 | { 143 | $binary_extensions = array('gif', 'jpg', 'jpeg', 'png', 'ttf'); 144 | 145 | if (strpos($filename, '.') === false) 146 | { 147 | return false; 148 | } 149 | 150 | $extension = explode('.', $filename); 151 | $extension = array_pop($extension); 152 | 153 | if (in_array($extension, $binary_extensions)) 154 | { 155 | return true; 156 | } 157 | else 158 | { 159 | return false; 160 | } 161 | } 162 | 163 | /** 164 | * Builds the index file structure and creates the file diffs 165 | * 166 | * @param &$array array The structure containing the file tree 167 | * @param $path string The current file being processed 168 | * @param &$output string The HTML output for the index file 169 | * 170 | * @return null 171 | */ 172 | function print_structure(&$array, $path, &$output) 173 | { 174 | global $diff_mode, $from_version, $to_version; 175 | 176 | $temp_path = $path; 177 | foreach($array as $key => &$folder) 178 | { 179 | if(is_array($folder)) 180 | { 181 | $path .= $key . '/'; 182 | $id = str_replace('/', '-', $path); 183 | 184 | if($id != '-') 185 | { 186 | $id = trim($id, '-'); 187 | } 188 | else 189 | { 190 | $id = 'root'; 191 | } 192 | 193 | $class = get_icon($path, true); 194 | $output .= '
  • ' . $key . '' . "\n
      "; 195 | 196 | print_structure($folder, $path, $output); 197 | $output .= '
  • '; 198 | 199 | $path = $temp_path; 200 | } 201 | else 202 | { 203 | $id = 'phpbb-' . str_replace('/', '-', $path . $folder); 204 | $modified = false; 205 | $class = get_icon($path . $folder, false); 206 | $output .= '
  • ' . $folder . '
  • ' . "\n"; 207 | 208 | //Generate the diff view that's being linked to 209 | generate_diff_file($path . $folder); 210 | } 211 | } 212 | } 213 | 214 | /** 215 | * Creates a directory structure from arrays 216 | * Folders are array keys, files are stored in an array in the value 217 | * 218 | * @param &$array array The array holding the directory structure 219 | * @param $entry array An array created from exploding a file path by its separator 220 | * @param $depth int The specific file/folder in the path to evaluate and add to the directory structure 221 | * 222 | * @return null 223 | */ 224 | function create_entry(&$array, $entry, $depth = 0) 225 | { 226 | if(!isset($array[$entry[$depth]])) 227 | { 228 | if(strpos($entry[$depth], '.') !== false) 229 | { 230 | $array[] = $entry[$depth]; 231 | } 232 | else 233 | { 234 | $array[$entry[$depth]] = array(); 235 | } 236 | } 237 | 238 | if($depth + 1 < sizeof($entry)) 239 | { 240 | create_entry($array[$entry[$depth]], $entry, ++$depth); 241 | } 242 | } 243 | 244 | /** 245 | * Sorts the directory structure created by calls to create_entry into nicely organized array. 246 | * Files are grouped together and folders are grouped together. 247 | * 248 | * @param &$array array The array holding the directory structure 249 | * 250 | * @return null 251 | */ 252 | function sort_array(&$array) 253 | { 254 | $files = array(); 255 | foreach($array as $key => &$row) 256 | { 257 | if(!is_array($row)) 258 | { 259 | $files[] = $row; 260 | unset($array[$key]); 261 | } 262 | else 263 | { 264 | sort_array($row); 265 | } 266 | } 267 | $array = array_merge($array, $files); 268 | } 269 | 270 | /** 271 | * Get data for displaying navigation 272 | * 273 | * @param string $data_dir Data directory 274 | * @param string $from_version From version for display 275 | * 276 | * @return array Array with tabs HTML in 'tabs' and navigation file HTML in 'nav' 277 | */ 278 | function get_navigation_data($data_dir, $from_version) 279 | { 280 | // Latest version info for navigation purposes. Always release before actual latest version. 281 | $latest_versions = [ 282 | '3.0' => '3.0.13-PL1', 283 | '3.1' => '3.1.11', 284 | '3.2' => '3.2.10', 285 | '3.3' => '', // default URL 286 | ]; 287 | 288 | //Set up the navigation menu 289 | if (strpos($from_version, '3.0') === 0) 290 | { 291 | $nav = file_get_contents($data_dir . '/template/30_nav.html'); 292 | $tabs = '
  • 3.0.x
  • 293 |
  • 3.1.x
  • 294 |
  • 3.2.x
  • 295 |
  • 3.3.x
  • '; 296 | } 297 | else if (strpos($from_version, '3.1') === 0) 298 | { 299 | $nav = file_get_contents($data_dir . '/template/31_nav.html'); 300 | $tabs = '
  • 3.0.x
  • 301 |
  • 3.1.x
  • 302 |
  • 3.2.x
  • 303 |
  • 3.3.x
  • '; 304 | } 305 | else if (strpos($from_version, '3.2') === 0) 306 | { 307 | $nav = file_get_contents($data_dir . '/template/32_nav.html'); 308 | $tabs = '
  • 3.0.x
  • 309 |
  • 3.1.x
  • 310 |
  • 3.2.x
  • 311 |
  • 3.3.x
  • '; 312 | } 313 | else if (strpos($from_version, '3.3') === 0) 314 | { 315 | $nav = file_get_contents($data_dir . '/template/33_nav.html'); 316 | $tabs = '
  • 3.0.x
  • 317 |
  • 3.1.x
  • 318 |
  • 3.2.x
  • 319 |
  • 3.3.x
  • '; 320 | } 321 | else 322 | { 323 | return []; 324 | } 325 | 326 | return [ 327 | 'nav' => $nav, 328 | 'tabs' => $tabs, 329 | ]; 330 | } 331 | 332 | $ignore_folders = array('develop', 'docs', 'install', 'vendor'); 333 | $ignore_files = array('config.php', 'composer.json', 'composer.lock'); 334 | 335 | $changes = array(); 336 | $status_info = array(); 337 | $output = ''; 338 | 339 | $file = file($file, FILE_IGNORE_NEW_LINES); 340 | foreach($file as $line) 341 | { 342 | //M phpBB/adm/index.php 343 | $info = explode("\t", $line); 344 | $status = $info[0]; 345 | 346 | $structure = explode('/', $info[1]); 347 | if($structure[0] != 'phpBB') 348 | { 349 | continue; 350 | } 351 | 352 | //Check ignored files and folders, only in the root level 353 | if(isset($structure[1]) && (in_array($structure[1], $ignore_folders) || in_array($structure[1], $ignore_files))) 354 | { 355 | continue; 356 | } 357 | 358 | //Skip binary files 359 | if(is_binary($info[1])) 360 | { 361 | continue; 362 | } 363 | 364 | array_shift($structure); 365 | $status_info[implode('/', $structure)] = $status; 366 | 367 | create_entry($changes, $structure); 368 | } 369 | 370 | sort_array($changes); 371 | print_structure($changes, '', $output); 372 | 373 | $header = file_get_contents($data_dir . '/template/overall_header.html'); 374 | 375 | $footer = ''; 376 | $footer .= file_get_contents($data_dir . '/template/overall_footer.html'); 377 | 378 | $navigation_data = get_navigation_data($data_dir, $from_version); 379 | 380 | $header = str_replace('{PREV_VERSIONS_NAV}', $navigation_data['nav'], $header); 381 | 382 | //Set up the active version in the navigation 383 | $header = str_replace('
  • ', '
  • ', $header); 384 | 385 | //Remove the file marker 386 | $header = str_replace('{CURRENT_FILE}', '', $header); 387 | 388 | //Set the active tab 389 | $header = str_replace('{TABS}', $navigation_data['tabs'], $header); 390 | 391 | $header .= '

    The following files have been changed in the update from ' . $from_version . ' to ' . $to_version . ':

    '; 392 | $header .= '
    44 | {% endif %} 45 |

    Latest repository builds

    46 | 56 |
  • 57 | {% endblock %} 58 | -------------------------------------------------------------------------------- /templates/default/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends "layout.html.twig" %} 2 | 3 | {% block body %} 4 |
    5 |

    Get Involved

    6 |

    You can help the project in many ways. Pick what suits your skills best, all contributions are much appreciated by the rest of the community. 7 | More detailed information on how to go about contributing is available on our Get Involved page.

    8 |
      9 |
    • 10 |

      Report bugs
      11 | phpBB can only be improved if the developers are aware of the problems users encounter. Detailed descriptions of problems help contributors solve them quickly.

      12 |
    • 13 |
    • 14 |

      Reproduce bugs and verify fixes
      15 | Help identify incorrectly reported bugs to speed up development. Test bugfixes to ensure they work as expected and do not have unintended side effects.

      16 |
    • 17 |
    • 18 |

      Submit patches
      19 | Know how to work with PHP, CSS or HTML? Fix a bug or implement a feature yourself and prepare your patch to be merged into phpBB.

      20 |
    • 21 |
    • 22 |

      Review patches
      23 | Help identify problems before they go into a released version of phpBB and reach our users. Review and test other contributors' patches to identify problems.

      24 |
    • 25 |
    • 26 |

      Discussing existing RFCs
      27 | RFCs are enhancement proposals for future versions of phpBB. You can provide comments on these proposals as well as collaborate on their implementation at the Development Discussion Board.

      28 |
    • 29 |
    • 30 |

      Create new RFCs
      31 | Propose a new feature or a change in behaviour for discussion with the rest of the community. All big changes need to go through this process on the Development Discussion Board.

      32 |
    • 33 |
    • 34 |

      Participate in development IRC channel and Area51
      35 | phpBB's development is public. When developers want to discuss something, have a question or want to request feedback they do it either in the development IRC channel (#phpbb-dev on libera.chat) or on the Development Discussion Board. Everyone is welcome to participate in these discussions to whatever extent they want.

      36 |
    • 37 |
    38 |
    39 | 40 |
    41 |

    Development Sites & Tools

    42 |
      43 |
    • 44 | Development Discussion 45 |

      Development Discussion

      46 |

      All proposals for new features and code changes are discussed in this forum. It runs the latest unstable version of phpBB allowing you to test upcoming features.

      47 |
    • 48 |
    • 49 | Tracker 50 |

      Issue Tracker

      51 |

      If you found a bug in phpBB this is the place to report it. If you're not sure if the behaviour you found is really a bug try asking for help in the Support Forum first.

      52 |
    • 53 |
    • 54 | GitHub 55 |

      GitHub

      56 |

      phpBB's source code is hosted in Git repositories at GitHub. You can also find a number of other tools for phpBB or MOD development there.

      57 |
    • 58 | 59 |
    • 60 | Continuous Integration 61 |

      Continuous Integration

      62 |

      phpBB is continuously tested against a large suite of automated tests to ensure we deliver a high quality product. Bamboo takes care of running the tests and packaging nightly development packages, while Travis tests proposed changes before merging them in.

      63 | 68 |
    • 69 |
    • 70 | Coding Guidelines 71 |

      Coding Guidelines

      72 |

      phpBB Coding Guidelines for each version.

      73 | 78 |
    • 79 |
    • 80 | API Documentation 81 |

      API Documentation

      82 |

      Automatically generated documentation for phpBB APIs - always up to date.

      83 | 88 |
    • 89 |
    • 90 | Code Changes 91 |

      Code Changes

      92 |

      The file changes that were made between each release of phpBB.

      93 |
    • 94 |
    95 |
    96 | {% endblock %} 97 | -------------------------------------------------------------------------------- /templates/default/projects.html.twig: -------------------------------------------------------------------------------- 1 | {% extends "layout.html.twig" %} 2 | 3 | {% block sub_menu %} 4 |
    5 |
    6 |

    Home of phpBB Development

    7 |
    8 |
    9 | {% endblock %} 10 | 11 | {% block body %} 12 |
    13 |

    Main Projects

    14 |

    These are the main projects that phpBB develops.

    15 | 31 |
    32 | 33 |
    34 |

    phpBB Sub-Projects

    35 |
      36 |
    • 37 | Titania
      38 |

      Titania is the customisation database that is used on www.phpbb.com and international support sites. 39 |
      40 | [GitHub Repository] 41 | [Tracker] 42 |

      43 |
    • 44 |
    • 45 | QuickInstall
      46 |

      QuickInstall allows you to create multiple pre-populated phpBB installations for testing or development purposes. 47 |
      48 | [GitHub Repository] 49 | [Tracker] 50 |

      51 |
    • 52 |
    • 53 | EPV
      54 |

      The Extension Pre-Validator is a validation tool used for pre validating extensions when submitting them to the database at phpBB.com. 55 |
      56 | [GitHub Repository] 57 | [Tracker] 58 |

      59 |
    • 60 |
    61 |
    62 | 63 |
    64 |

    Archived Sub-Projects

    65 |
      66 |
    • 67 | AutoMOD
      68 |

      AutoMOD was a tool for installing and removing phpBB MODifications on phpBB 3.0. It is no longer actively maintained. 69 |
      70 | [GitHub Repository] 71 |

      72 |
    • 73 |
    • 74 | Support Toolkit
      75 |

      The support toolkit was a tool that could be used to repair your board's database and files. It is no longer actively maintained. 76 |
      77 | [GitHub Repository] 78 |

      79 |
    • 80 |
    • 81 | MODX Creator phpBB
      82 |

      The phpBB MODX Creator adds a MODX install.xml file creation tool to your phpBB installation. It allows you to enter the information then turns it into an XML file. It is no longer actively maintained. 83 |
      84 | [GitHub Repository] 85 |

      86 |
    • 87 |
    • 88 | MODX Creator Offline
      89 |

      The Offline MODX Creator is a standalone MODX install.xml file creation tool. It allows you to enter the information then turns it into an XML file. It is no longer actively maintained. 90 |
      91 | [GitHub Repository] 92 |

      93 |
    • 94 |
    • 95 | UMIL
      96 |

      UMIL is a project that MODs use to create install files to execute SQL queries and purge cache. It is no longer actively maintained. 97 |
      98 | [GitHub Repository] 99 |

      100 |
    • 101 |
    • 102 | MODX
      103 |

      MODX is the standard for install instructions and meta-data file for phpBB Modifications. It is no longer actively maintained. 104 |
      105 | [GitHub Repository] 106 |

      107 |
    • 108 |
    • 109 | MPV
      110 |

      The Modification Pre-Validator is a validation tool that checks for common basic errors. It is no longer actively maintained. 111 |
      112 | [GitHub Repository] 113 |

      114 |
    • 115 |
    • 116 | MODX Editor
      117 |

      The MODX Editor is a desktop application that allows you to modify MODX files. It is no longer actively maintained. 118 |
      119 | [GitHub Repository] 120 |

      121 |
    • 122 |
    123 |
    124 | {% endblock %} 125 | -------------------------------------------------------------------------------- /templates/default/stats.html.twig: -------------------------------------------------------------------------------- 1 | {% extends "layout.html.twig" %} 2 | 3 | {% block body %} 4 |
    5 |

    phpBB "3.3" Proteus

    6 | Latest Code Coverage Report 7 |
      8 |
    • 9 | Created vs. Resolved Tickets 10 | 11 |
    • 12 |
    • 13 | Average Ticket Age 14 | 15 |
    • 16 |
    17 | 18 |

    phpBB "3.2" Rhea

    19 | Latest Code Coverage Report 20 |
      21 |
    • 22 | Created vs. Resolved Tickets 23 | 24 |
    • 25 |
    • 26 | Average Ticket Age 27 | 28 |
    • 29 |
    30 | 31 |

    phpBB "3.1" Ascraeus

    32 | Latest Code Coverage Report 33 |
      34 |
    • 35 | Created vs. Resolved Tickets 36 | 37 |
    • 38 |
    • 39 | Average Ticket Age 40 | 41 |
    • 42 |
    43 |
    44 | {% endblock %} 45 | -------------------------------------------------------------------------------- /templates/layout.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {% block title %}Area51 @ phpBB.com{% endblock %} 8 | 9 | 10 | {% block stylesheets %}{% endblock %} 11 | 12 | 13 | 14 |
    15 |
    16 | 25 |
    26 | phpBB 27 |
    28 |
    29 | 30 | {% block sub_menu %} 31 |
    32 |
    33 | {# Feed #} 34 | Downloads 35 | Statistics 36 | Main 37 |

    Home of phpBB Development

    38 |
    39 |
    40 | {% endblock %} 41 | 42 |
    43 |
    44 | {% block body %}{% endblock %} 45 | 46 |
    47 | Powered by 48 | Powered by Symfony2 49 |
    50 |
    51 |
    52 | 53 |
    54 | 55 | 56 | {% block javascripts %}{% endblock %} 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /tests/Controller/DefaultControllerTest.php: -------------------------------------------------------------------------------- 1 | createClient(); 12 | $crawler = $client->request('GET', '/'); 13 | $response = $client->getResponse(); 14 | 15 | $this->assertStringContainsString('Get Involved', $crawler->filter('#content h2')->text()); 16 | $this->assertEquals(200, $response->getStatusCode(), 'Response Code Check'); 17 | } 18 | 19 | /** 20 | * @dataProvider explosionProvider 21 | */ 22 | public function testExplosions($path, $check = true) 23 | { 24 | $client = $this->createClient(); 25 | $crawler = $client->request('GET', $path); 26 | $response = $client->getResponse(); 27 | 28 | if ($check) 29 | { 30 | $this->assertEquals(200, $response->getStatusCode(), 'Response Code Check'); 31 | } 32 | } 33 | 34 | public function explosionProvider(): array 35 | { 36 | return [ 37 | ['/'], 38 | ['/stats/'], 39 | ['/downloads/'], 40 | ['/projects/'], 41 | //array('/contributors/'), 42 | ]; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | bootEnv(dirname(__DIR__).'/.env'); 11 | } 12 | -------------------------------------------------------------------------------- /web/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | RewriteEngine On 3 | 4 | RewriteRule "^docs/code/develop-ascraeus/(.*)" "/docs/code/3.1.x/$1" [R=301,L] 5 | RewriteRule "^docs/code/develop-olympus/(.*)" "/docs/code/3.0.x/$1" [R=301,L] 6 | 7 | RewriteRule "^docs/dev/31x/(.*)" "/docs/dev/3.3.x/$1" [R=301,L] 8 | RewriteRule "^docs/dev/32x/(.*)" "/docs/dev/3.2.x/$1" [R=301,L] 9 | 10 | RewriteRule "^(.*/)?\.git/" - [F,L] 11 | 12 | RewriteRule ^/?$ index.php [QSA,L] 13 | 14 | RewriteCond %{REQUEST_FILENAME} !-f 15 | RewriteCond %{REQUEST_FILENAME} !-d 16 | RewriteRule ^(.*)$ index.php [QSA,L] 17 | 18 | -------------------------------------------------------------------------------- /web/analytics.js: -------------------------------------------------------------------------------- 1 | 2 | var _gaq = _gaq || []; 3 | _gaq.push(['_setAccount', 'UA-93879-3']); 4 | _gaq.push(['_setDomainName', 'area51.phpbb.com']); 5 | _gaq.push(['_trackPageview']); 6 | 7 | (function() { 8 | var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 9 | ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 10 | var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); 11 | })(); 12 | -------------------------------------------------------------------------------- /web/area51.css: -------------------------------------------------------------------------------- 1 | html { 2 | height:101%; 3 | } 4 | 5 | body { 6 | color:#484848; 7 | font-family:Verdana,sans-serif; 8 | font-size:12px; 9 | margin:0; 10 | min-width:900px; 11 | padding:0; 12 | } 13 | h1, h2, h3, h4 { 14 | font-family:"Trebuchet MS",Verdana,sans-serif; 15 | } 16 | h1 { 17 | font-size:20px; 18 | margin:0; 19 | padding:0; 20 | } 21 | 22 | #wrapper { 23 | -moz-background-clip:border; 24 | -moz-background-inline-policy:continuous; 25 | -moz-background-origin:padding; 26 | background:white none repeat scroll 0 0; 27 | } 28 | 29 | #content { 30 | background-color:#FFFFFF; 31 | /* border-right:1px solid #DDDDDD;*/ 32 | margin:0; 33 | padding:6px 10px 10px; 34 | width:800px; 35 | z-index:10; 36 | } 37 | 38 | * html #content { 39 | margin-top:0; 40 | padding:6px 10px 10px; 41 | width:600px; 42 | } 43 | 44 | html > body #content { 45 | min-height:600px; 46 | } 47 | 48 | * html body #content { 49 | height:600px; 50 | } 51 | 52 | a, a:link, a:visited { 53 | color:#2A5685; 54 | text-decoration:none; 55 | } 56 | a:hover, a:active { 57 | color:#C61A1A; 58 | text-decoration:underline; 59 | } 60 | a img { 61 | border:0 none; 62 | } 63 | 64 | a.issue.closed, a.issue.closed:link, a.issue.closed:visited { 65 | color:#999999; 66 | text-decoration:line-through; 67 | } 68 | 69 | .box { 70 | background-color:#F6F6F6; 71 | border:1px solid #E4E4E4; 72 | color:#505050; 73 | line-height:1.5em; 74 | margin-bottom:10px; 75 | padding:6px; 76 | } 77 | 78 | li p { 79 | margin-top: 0; 80 | } 81 | 82 | ul.section-list, ul.contribution-list { 83 | list-style:none; 84 | margin:0px; 85 | padding:0px; 86 | } 87 | 88 | .section-list li { 89 | float:left; 90 | width:180px; 91 | margin: 10px; 92 | } 93 | 94 | .contribution-list li { 95 | float:left; 96 | width: 380px; 97 | margin:10px; 98 | } 99 | 100 | .section-list li ul { 101 | padding-left:16px; 102 | } 103 | 104 | .section-list li li { 105 | float:none; 106 | width:auto; 107 | margin:0px; 108 | } 109 | 110 | .section-list h2 { 111 | font-size:15px; 112 | margin-top:8px; 113 | padding-left:4px; 114 | padding-right:4px; 115 | } 116 | 117 | li.line-break { 118 | clear:both; 119 | } 120 | 121 | li.full-line { 122 | width:780px; 123 | } 124 | 125 | .section-list img { 126 | display:block; 127 | width:180px; 128 | height:70px; 129 | background-color:#ccc; 130 | } 131 | 132 | .powered-symfony { 133 | text-align: center; 134 | margin-top: 30px; 135 | } 136 | 137 | .powered-symfony a { 138 | display: block; 139 | margin-top: 5px; 140 | } 141 | 142 | /* clearfix */ 143 | .clearfix:after { 144 | content: "."; 145 | display: block; 146 | clear: both; 147 | visibility: hidden; 148 | line-height: 0; 149 | height: 0; 150 | } 151 | .clearfix { 152 | display: inline-block; 153 | } 154 | html[xmlns] .clearfix { 155 | display: block; 156 | } 157 | * html .clearfix { 158 | height: 1%; 159 | } 160 | -------------------------------------------------------------------------------- /web/code-changes/css/code_changes.css: -------------------------------------------------------------------------------- 1 | #main { 2 | font-size: 1em; 3 | line-height: 0.7em; 4 | margin: 0 1% 0 1%; 5 | padding: 0; 6 | width: 76%; 7 | } 8 | 9 | #wrap { 10 | padding: 0 0 15px 0; 11 | min-width: 900px; 12 | margin-top:0px; 13 | margin-left: 10px; 14 | margin-right: 10px; 15 | margin-bottom: 15px; 16 | } 17 | 18 | #diff_content { 19 | padding: 30px 10px 10px; 20 | position: relative; 21 | } 22 | 23 | #menuSpacer { 24 | float: left; 25 | width: 20%; 26 | display:block; 27 | } 28 | 29 | #tabs { 30 | padding-top: 15px; 31 | } 32 | 33 | /** 34 | * Column Diff 35 | */ 36 | table.hrdiff { 37 | margin: 0 0 8px 5px; 38 | width: 100%; 39 | overflow: hidden; 40 | border-bottom: 1px solid #999; 41 | table-layout: fixed; 42 | background: transparent; 43 | } 44 | 45 | table.hrdiff th { 46 | text-align: left; 47 | width: 50%; 48 | color: #333; 49 | font-family: Verdana,Helvetica,sans-serif; 50 | font-size: 11px; 51 | border-bottom: 1px solid #999; 52 | border-right: 1px solid #999; 53 | background: #D9D9D9; 54 | } 55 | 56 | table.hrdiff thead th { 57 | font-weight: bold; 58 | font-size: 110%; 59 | padding: 2px; 60 | } 61 | 62 | table.hrdiff tr:first-child th { 63 | border-top: none; 64 | } 65 | 66 | table.hrdiff tbody th { 67 | /*padding: 2em 1px 1px 1px;*/ 68 | font-size: 80%; 69 | border-top: 1px solid #999; 70 | } 71 | 72 | table.hrdiff tbody td { 73 | border-right: 1px solid #999; 74 | } 75 | 76 | table.hrdiff td pre { 77 | font-family: "Consolas", monospace; 78 | font-size: 1.1em; 79 | white-space: pre-wrap; /* css-3 */ 80 | white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ 81 | white-space: -pre-wrap; /* Opera 4-6 */ 82 | white-space: -o-pre-wrap; /* Opera 7 */ 83 | word-wrap: break-word; /* Internet Explorer 5.5+ */ 84 | } 85 | 86 | table.hrdiff .unmodified { 87 | background: transparent; 88 | } 89 | 90 | table.hrdiff .added { 91 | background: #9f9; 92 | } 93 | 94 | table.hrdiff .added_empty { 95 | background: #cfc; 96 | } 97 | 98 | table.hrdiff .modified { 99 | background: #fd9; 100 | } 101 | 102 | table.hrdiff .removed { 103 | background: #f99; 104 | } 105 | 106 | table.hrdiff .removed_empty { 107 | background: #fcc; 108 | } 109 | 110 | table.hrdiff caption { 111 | caption-side: top; 112 | text-align: left; 113 | margin: 0 0 8px 5px; 114 | font-size: 90%; 115 | font-weight: bold; 116 | padding: 5px; 117 | } 118 | 119 | table.hrdiff caption span { 120 | height: 10px; 121 | width: 10px; 122 | line-height: 10px; 123 | letter-spacing: 10px; 124 | border: 1px solid #000; 125 | margin-left: 0.5em; 126 | vertical-align: baseline; 127 | } 128 | 129 | #main .treeview ul { 130 | margin-left:0em; 131 | } 132 | 133 | #main .treeview a { 134 | text-decoration: none; 135 | } 136 | 137 | .treeview, .treeview ul { 138 | padding: 0; 139 | margin: 0; 140 | list-style: none; 141 | } 142 | 143 | .treeview .hitarea { 144 | background: url(images/treeview-default.gif) -64px -25px no-repeat; 145 | height: 16px; 146 | width: 16px; 147 | margin-left: -16px; 148 | float: left; 149 | cursor: pointer; 150 | } 151 | /* fix for IE6 */ 152 | * html .hitarea { 153 | display: inline; 154 | float:none; 155 | } 156 | 157 | .treeview li { 158 | margin: 0; 159 | padding: 3px 0pt 3px 16px; 160 | line-height: normal; 161 | } 162 | 163 | .treeview a.selected { 164 | background-color: #eee; 165 | } 166 | 167 | #treecontrol { margin: 1em 0; display: none; } 168 | 169 | .treeview .hover { color: red; cursor: pointer; } 170 | 171 | .treeview li { background: url(images/treeview-default-line.gif) 0 0 no-repeat; } 172 | .treeview li.collapsable, .treeview li.expandable { background-position: 0 -176px; } 173 | 174 | .treeview .expandable-hitarea { background-position: -80px -3px; } 175 | 176 | .treeview li.last { background-position: 0 -1766px } 177 | .treeview li.lastCollapsable, .treeview li.lastExpandable { background-image: url(images/treeview-default.gif); } 178 | .treeview li.lastCollapsable { background-position: 0 -111px } 179 | .treeview li.lastExpandable { background-position: -32px -67px } 180 | 181 | .treeview div.lastCollapsable-hitarea, .treeview div.lastExpandable-hitarea { background-position: 0; } 182 | 183 | .filetree li { padding: 3px 0 2px 16px; } 184 | .filetree span.folder, .filetree span.file { padding: 1px 0 1px 18px; display: block; } 185 | .filetree span.folder { background: url(images/folder.png) 0 0 no-repeat; } 186 | .filetree span.folder.A { background: url(images/folder-A.png) 0 0 no-repeat; } 187 | .filetree span.folder.M { background: url(images/folder-M.png) 0 0 no-repeat; } 188 | .filetree span.folder.D { background: url(images/folder-D.png) 0 0 no-repeat; } 189 | 190 | .filetree li.expandable span.folder { background: url(images/folder-closed.png) 0 0 no-repeat; } 191 | .filetree li.expandable span.folder.A { background: url(images/folder-closed-A.png) 0 0 no-repeat; } 192 | .filetree li.expandable span.folder.M { background: url(images/folder-closed-M.png) 0 0 no-repeat; } 193 | .filetree li.expandable span.folder.D { background: url(images/folder-closed-D.png) 0 0 no-repeat; } 194 | 195 | .filetree span.file.A { background: url(images/file-A.png) 0 0 no-repeat; } 196 | .filetree span.file.M { background: url(images/file-M.png) 0 0 no-repeat; } 197 | .filetree span.file.D { background: url(images/file-D.png) 0 0 no-repeat; } -------------------------------------------------------------------------------- /web/code-changes/css/code_changes.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function() 2 | { 3 | $("#browser").treeview({ 4 | animated: "fast", 5 | persist: "location", 6 | collapsed: true 7 | }); 8 | }); -------------------------------------------------------------------------------- /web/code-changes/css/images/arrow_right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/arrow_right.gif -------------------------------------------------------------------------------- /web/code-changes/css/images/bg_tabs1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/bg_tabs1.gif -------------------------------------------------------------------------------- /web/code-changes/css/images/bg_tabs2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/bg_tabs2.gif -------------------------------------------------------------------------------- /web/code-changes/css/images/corners_left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/corners_left.gif -------------------------------------------------------------------------------- /web/code-changes/css/images/corners_right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/corners_right.gif -------------------------------------------------------------------------------- /web/code-changes/css/images/file-A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/file-A.png -------------------------------------------------------------------------------- /web/code-changes/css/images/file-D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/file-D.png -------------------------------------------------------------------------------- /web/code-changes/css/images/file-M.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/file-M.png -------------------------------------------------------------------------------- /web/code-changes/css/images/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/file.png -------------------------------------------------------------------------------- /web/code-changes/css/images/folder-A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/folder-A.png -------------------------------------------------------------------------------- /web/code-changes/css/images/folder-D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/folder-D.png -------------------------------------------------------------------------------- /web/code-changes/css/images/folder-M.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/folder-M.png -------------------------------------------------------------------------------- /web/code-changes/css/images/folder-closed-A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/folder-closed-A.png -------------------------------------------------------------------------------- /web/code-changes/css/images/folder-closed-D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/folder-closed-D.png -------------------------------------------------------------------------------- /web/code-changes/css/images/folder-closed-M.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/folder-closed-M.png -------------------------------------------------------------------------------- /web/code-changes/css/images/folder-closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/folder-closed.png -------------------------------------------------------------------------------- /web/code-changes/css/images/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/folder.png -------------------------------------------------------------------------------- /web/code-changes/css/images/innerbox_bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/innerbox_bg.gif -------------------------------------------------------------------------------- /web/code-changes/css/images/toggle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/toggle.gif -------------------------------------------------------------------------------- /web/code-changes/css/images/treeview-default-line.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/treeview-default-line.gif -------------------------------------------------------------------------------- /web/code-changes/css/images/treeview-default.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/code-changes/css/images/treeview-default.gif -------------------------------------------------------------------------------- /web/code-changes/index.php: -------------------------------------------------------------------------------- 1 | div:first-of-type { 154 | display: none; 155 | } 156 | } 157 | 158 | @media only screen and (max-width: 700px), only screen and (max-device-width: 700px) 159 | { 160 | #wrap { 161 | padding: 0 5px; 162 | margin-top: 0 !important; 163 | } 164 | 165 | #phpbb-header-bar .phpbb-menu li.phpbb-logo { 166 | display: block; 167 | overflow: hidden; 168 | } 169 | 170 | #phpbb-header-bar .phpbb-menu li.phpbb-logo a { 171 | float: none; 172 | margin: 0 auto; 173 | } 174 | 175 | #phpbb-header-bar .phpbb-menu li a { 176 | margin-top: 0; 177 | padding: 4px 0; 178 | min-width: 85px; 179 | } 180 | 181 | #phpbb-sub-header { 182 | padding-right: 10px; 183 | padding-left: 10px; 184 | } 185 | 186 | #search-box { 187 | display: none; 188 | } 189 | } 190 | -------------------------------------------------------------------------------- /web/images/api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/api.png -------------------------------------------------------------------------------- /web/images/area51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/area51.png -------------------------------------------------------------------------------- /web/images/back_phpbb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/back_phpbb.png -------------------------------------------------------------------------------- /web/images/ci.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/ci.png -------------------------------------------------------------------------------- /web/images/code-changes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/code-changes.png -------------------------------------------------------------------------------- /web/images/coding-style.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/coding-style.png -------------------------------------------------------------------------------- /web/images/development-discussion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/development-discussion.png -------------------------------------------------------------------------------- /web/images/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/github.png -------------------------------------------------------------------------------- /web/images/header_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/header_bg.png -------------------------------------------------------------------------------- /web/images/mainlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/mainlogo.png -------------------------------------------------------------------------------- /web/images/phpbb_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/phpbb_small.png -------------------------------------------------------------------------------- /web/images/sflogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/sflogo.png -------------------------------------------------------------------------------- /web/images/symfony.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/symfony.png -------------------------------------------------------------------------------- /web/images/tracker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/images/tracker.png -------------------------------------------------------------------------------- /web/index.php: -------------------------------------------------------------------------------- 1 | handle($request); 26 | $response->send(); 27 | $kernel->terminate($request, $response); 28 | -------------------------------------------------------------------------------- /web/phpBB: -------------------------------------------------------------------------------- 1 | ../area51-phpbb3/phpBB -------------------------------------------------------------------------------- /web/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: msnbot 2 | Crawl-delay: 600 3 | -------------------------------------------------------------------------------- /web/subSilver.css: -------------------------------------------------------------------------------- 1 | /* 2 | The original subSilver Theme for phpBB version 2+ 3 | Created by subBlue design 4 | http://www.subBlue.com 5 | */ 6 | 7 | 8 | /* General page style. The scroll bar colours only visible in IE5.5+ */ 9 | body { 10 | background-color: #E5E5E5; 11 | scrollbar-face-color: #DEE3E7; 12 | scrollbar-highlight-color: #FFFFFF; 13 | scrollbar-shadow-color: #DEE3E7; 14 | scrollbar-3dlight-color: #D1D7DC; 15 | scrollbar-arrow-color: #006699; 16 | scrollbar-track-color: #EFEFEF; 17 | scrollbar-darkshadow-color: #98AAB1; 18 | } 19 | 20 | /* General font families for common tags */ 21 | font,th,td,p { font-family: Verdana, Arial, Helvetica, sans-serif } 22 | a:link,a:active,a:visited { text-decoration: none; color : #006699; } 23 | a:hover { text-decoration: underline; color : #DD6900; } 24 | hr { height: 0px; border: solid #D1D7DC 0px; border-top-width: 1px;} 25 | 26 | p {font-size:10pt;} 27 | 28 | /* This is the border line & background colour round the entire page */ 29 | .bodyline { background-color: #FFFFFF; border: 1px #98AAB1 solid; } 30 | 31 | /* This is the outline round the main forum tables */ 32 | .forumline { background-color: #FFFFFF; border: 2px #006699 solid; } 33 | 34 | 35 | /* Main table cell colours and backgrounds */ 36 | td.row1 { background-color: #EFEFEF; } 37 | td.row2 { background-color: #DEE3E7; } 38 | td.row3 { background-color: #D1D7DC; } 39 | 40 | 41 | /* 42 | This is for the table cell above the Topics, Post & Last posts on the index.php page 43 | By default this is the fading out gradiated silver background. 44 | However, you could replace this with a bitmap specific for each forum 45 | */ 46 | td.rowpic { 47 | background-color: #FFFFFF; 48 | background-image: url(images/cellpic2.jpg); 49 | background-repeat: repeat-y; 50 | } 51 | 52 | /* Header cells - the blue and silver gradient backgrounds */ 53 | th { 54 | color: #FFA34F; font-size: 11px; font-weight : bold; 55 | background-color: #006699; height: 25px; 56 | background-image: url(images/cellpic3.gif); 57 | } 58 | 59 | td.cat,td.catHead,td.catSides,td.catLeft,td.catRight,td.catBottom { 60 | background-image: url(images/cellpic1.gif); 61 | background-color:#D1D7DC; border: #FFFFFF; border-style: solid; height: 28px; 62 | } 63 | 64 | 65 | /* 66 | Setting additional nice inner borders for the main table cells. 67 | The names indicate which sides the border will be on. 68 | Don't worry if you don't understand this, just ignore it :-) 69 | */ 70 | td.cat,td.catHead,td.catBottom { 71 | height: 29px; 72 | border-width: 0px 0px 0px 0px; 73 | } 74 | th.thHead,th.thSides,th.thTop,th.thLeft,th.thRight,th.thBottom,th.thCornerL,th.thCornerR { 75 | font-weight: bold; border: #FFFFFF; border-style: solid; height: 28px; } 76 | td.row3Right,td.spaceRow { 77 | background-color: #D1D7DC; border: #FFFFFF; border-style: solid; } 78 | 79 | th.thHead,td.catHead { font-size: 12px; border-width: 1px 1px 0px 1px; } 80 | th.thSides,td.catSides,td.spaceRow { border-width: 0px 1px 0px 1px; } 81 | th.thRight,td.catRight,td.row3Right { border-width: 0px 1px 0px 0px; } 82 | th.thLeft,td.catLeft { border-width: 0px 0px 0px 1px; } 83 | th.thBottom,td.catBottom { border-width: 0px 1px 1px 1px; } 84 | th.thTop { border-width: 1px 0px 0px 0px; } 85 | th.thCornerL { border-width: 1px 0px 0px 1px; } 86 | th.thCornerR { border-width: 1px 1px 0px 0px; } 87 | 88 | 89 | /* The largest text used in the index page title and toptic title etc. */ 90 | .maintitle,h1,h2 { 91 | font-weight: bold; font-size: 22px; font-family: "Trebuchet MS",Verdana, Arial, Helvetica, sans-serif; 92 | text-decoration: none; line-height : 120%; color : #000000; 93 | } 94 | 95 | h3 { 96 | font-family: Verdana,serif; 97 | font-weight: bold; 98 | font-size: 12pt; 99 | line-height: 120%; 100 | } 101 | 102 | /* General text */ 103 | .gen { font-size : 12px; } 104 | .genmed { font-size : 11px; } 105 | .gensmall { font-size : 10px; } 106 | .gen,.genmed,.gensmall { color : #000000; } 107 | a.gen,a.genmed,a.gensmall { color: #006699; text-decoration: none; } 108 | a.gen:hover,a.genmed:hover,a.gensmall:hover { color: #DD6900; text-decoration: underline; } 109 | 110 | 111 | /* The register, login, search etc links at the top of the page */ 112 | .mainmenu { font-size : 11px; color : #000000 } 113 | a.mainmenu { text-decoration: none; color : #006699; } 114 | a.mainmenu:hover{ text-decoration: underline; color : #DD6900; } 115 | 116 | 117 | /* Forum category titles */ 118 | .cattitle { font-weight: bold; font-size: 12px ; letter-spacing: 1px; color : #006699} 119 | a.cattitle { text-decoration: none; color : #006699; } 120 | a.cattitle:hover{ text-decoration: underline; } 121 | 122 | 123 | /* Forum title: Text and link to the forums used in: index.php */ 124 | .forumlink { font-weight: bold; font-size: 12px; color : #006699; } 125 | a.forumlink { text-decoration: none; color : #006699; } 126 | a.forumlink:hover{ text-decoration: underline; color : #DD6900; } 127 | 128 | 129 | /* Used for the navigation text, (Page 1,2,3 etc) and the navigation bar when in a forum */ 130 | .nav { font-weight: bold; font-size: 11px; color : #000000;} 131 | a.nav { text-decoration: none; color : #006699; } 132 | a.nav:hover { text-decoration: underline; } 133 | 134 | 135 | /* titles for the topics: could specify viewed link colour too */ 136 | .topictitle { font-weight: bold; font-size: 11px; color : #000000; } 137 | a.topictitle:link { text-decoration: none; color : #006699; } 138 | a.topictitle:visited { text-decoration: none; color : #5493B4; } 139 | a.topictitle:hover { text-decoration: underline; color : #DD6900; } 140 | 141 | 142 | /* Name of poster in viewmsg.php and viewtopic.php and other places */ 143 | .name { font-size : 11px; color : #000000;} 144 | 145 | /* Location, number of posts, post date etc */ 146 | .postdetails { font-size : 10px; color : #000000; } 147 | 148 | 149 | /* The content of the posts (body of text) */ 150 | .postbody { font-size : 12px;} 151 | a.postlink:link { text-decoration: none; color : #006699 } 152 | a.postlink:visited { text-decoration: none; color : #5493B4; } 153 | a.postlink:hover { text-decoration: underline; color : #DD6900} 154 | 155 | 156 | /* Quote & Code blocks */ 157 | .code { 158 | font-family: Courier, 'Courier New', sans-serif; font-size: 11px; color: #006600; 159 | background-color: #FAFAFA; border: #D1D7DC; border-style: solid; 160 | border-left-width: 1px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px 161 | } 162 | 163 | .quote { 164 | font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #444444; line-height: 125%; 165 | background-color: #FAFAFA; border: #D1D7DC; border-style: solid; 166 | border-left-width: 1px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px 167 | } 168 | 169 | 170 | /* Copyright and bottom info */ 171 | .copyright { font-size: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #444444; letter-spacing: -1px;} 172 | a.copyright { color: #444444; text-decoration: none;} 173 | a.copyright:hover { color: #000000; text-decoration: underline;} 174 | 175 | 176 | /* Form elements */ 177 | input,textarea, select { 178 | color : #000000; 179 | font: normal 11px Verdana, Arial, Helvetica, sans-serif; 180 | border-color : #000000; 181 | } 182 | 183 | /* The text input fields background colour */ 184 | input.post, textarea.post, select { 185 | background-color : #FFFFFF; 186 | } 187 | 188 | input { text-indent : 2px; } 189 | 190 | /* The buttons used for bbCode styling in message post */ 191 | input.button { 192 | background-color : #EFEFEF; 193 | color : #000000; 194 | font-size: 11px; font-family: Verdana, Arial, Helvetica, sans-serif; 195 | } 196 | 197 | /* The main submit button option */ 198 | input.mainoption { 199 | background-color : #FAFAFA; 200 | font-weight : bold; 201 | } 202 | 203 | /* None-bold submit button */ 204 | input.liteoption { 205 | background-color : #FAFAFA; 206 | font-weight : normal; 207 | } 208 | 209 | /* This is the line in the posting page which shows the rollover 210 | help line. This is actually a text box, but if set to be the same 211 | colour as the background no one will know ;) 212 | */ 213 | .helpline { background-color: #DEE3E7; border-style: none; } 214 | 215 | 216 | /* Import the fancy styles for IE only (NS4.x doesn't use the @import function) */ 217 | @import url("formIE.css"); 218 | -------------------------------------------------------------------------------- /web/writable/stats/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/area51/543dc09c88d7f6adbbae32a470dc4a0f3eb4f122/web/writable/stats/.keep --------------------------------------------------------------------------------