Rewrite fetchList.php to not require MediaWiki to be installed

So I can more easily set up a cronjob to update it regularly.

Change-Id: Ie2012e8bf02fb0edb3d52d6076a4a7fb99c743d5
This commit is contained in:
Kunal Mehta 2019-07-17 17:00:28 -04:00
parent 8d12e524b1
commit 793b54d8fc

View file

@ -18,40 +18,38 @@
namespace MediaWiki\SecureLinkFixer; namespace MediaWiki\SecureLinkFixer;
use Maintenance;
use Wikimedia\StaticArrayWriter; use Wikimedia\StaticArrayWriter;
$IP = getenv( 'MW_INSTALL_PATH' ); $IP = getenv( 'MW_INSTALL_PATH' );
if ( $IP === false ) { if ( $IP === false ) {
$IP = __DIR__ . '/../../..'; $IP = __DIR__ . '/../../..';
} }
require_once "$IP/maintenance/Maintenance.php";
require_once "$IP/includes/libs/StaticArrayWriter.php";
/** /**
* Downloads Mozilla's HSTS preload list and builds it into a CDB * Downloads Mozilla's HSTS preload list and builds it into a PHP file.
*
* We explicitly don't use Maintenance here so that this script
* can be run without needing all of MediaWiki to be installed.
*/ */
class FetchList extends Maintenance { function main() {
public function __construct() { // phpcs:ignore Generic.Files.LineLength
parent::__construct(); $feedUrl = 'https://hg.mozilla.org/mozilla-central/atom-log/tip/security/manager/ssl/nsSTSPreloadList.inc';
$this->mDescription = 'Fetch HSTS preload list and build database'; $feed = file_get_contents( $feedUrl );
preg_match( '!"https://hg.mozilla.org/mozilla-central/rev/([a-f0-9]*?)"!', $feed, $matches );
if ( !isset( $matches[1] ) ) {
echo "Unable to parse revision id for HSTS preload list\n";
die( 1 );
} }
$rev = $matches[1];
public function execute() { echo "Downloading the HSTS preload list (revision $rev)...";
// phpcs:ignore Generic.Files.LineLength // phpcs:ignore Generic.Files.LineLength
$feedUrl = 'https://hg.mozilla.org/mozilla-central/atom-log/tip/security/manager/ssl/nsSTSPreloadList.inc'; $url = "https://hg.mozilla.org/mozilla-central/raw-file/$rev/security/manager/ssl/nsSTSPreloadList.inc";
$feed = file_get_contents( $feedUrl ); $lines = explode( "\n", file_get_contents( $url ) );
preg_match( '!"https://hg.mozilla.org/mozilla-central/rev/([a-f0-9]*?)"!', $feed, $matches ); echo "done\n";
if ( !isset( $matches[1] ) ) { $inList = false;
$this->fatalError( 'Unable to parse revision id for HSTS preload list' ); $header = <<<HEADER
}
$rev = $matches[1];
$this->output( "Downloading the HSTS preload list (revision $rev)..." );
// phpcs:ignore Generic.Files.LineLength
$url = "https://hg.mozilla.org/mozilla-central/raw-file/$rev/security/manager/ssl/nsSTSPreloadList.inc";
$lines = explode( "\n", file_get_contents( $url ) );
$this->output( "done\n" );
$inList = false;
$header = <<<HEADER
Generated by fetchList.php using mozilla-central@$rev Generated by fetchList.php using mozilla-central@$rev
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this
@ -59,25 +57,23 @@ file, You can obtain one at https://mozilla.org/MPL/2.0/.
phpcs:ignoreFile phpcs:ignoreFile
HEADER; HEADER;
// XXX: Should we care about gPreloadListExpirationTime? // XXX: Should we care about gPreloadListExpirationTime?
$data = []; $data = [];
foreach ( $lines as $line ) { foreach ( $lines as $line ) {
if ( $line === '%%' ) { if ( $line === '%%' ) {
$inList = !$inList; $inList = !$inList;
continue; continue;
} }
if ( $inList ) { if ( $inList ) {
$exploded = explode( ', ', $line ); $exploded = explode( ', ', $line );
$data[$exploded[0]] = (int)$exploded[1]; $data[$exploded[0]] = (int)$exploded[1];
}
} }
$writer = new StaticArrayWriter();
$code = $writer->create( $data, $header );
file_put_contents( __DIR__ . '/../domains.php', $code );
$this->output( "Updated domains.php\n" );
} }
$writer = new StaticArrayWriter();
$code = $writer->create( $data, $header );
file_put_contents( __DIR__ . '/../domains.php', $code );
echo "Updated domains.php\n";
} }
$maintClass = FetchList::class; main();
require_once RUN_MAINTENANCE_IF_MAIN;