Page MenuHomeWikiOasis

No OneTemporary

Size
23 KB
Referenced Files
None
Subscribers
None
diff --git a/GlobalSettings.php b/GlobalSettings.php
old mode 100755
new mode 100644
index 4427d33..2699239
--- a/GlobalSettings.php
+++ b/GlobalSettings.php
@@ -18,6 +18,14 @@ $wgHooks['CreateWikiPhpBuilder'][] = 'MirahezeFunctions::onCreateWikiPhpBuilder'
$wgHooks['CreateWikiPhpGenerateDatabaseList'][] = 'MirahezeFunctions::onGenerateDatabaseLists';
$wgHooks['CreateWikiDataFactoryBuilder'][] = 'MirahezeFunctions::onCreateWikiDataFactoryBuilder';
+// ManageWiki hooks for primary-domain, article-path, and version selection.
+$wgHooks['ManageWikiCoreAddFormFields'][] = 'MirahezeFunctions::onManageWikiCoreAddFormFields';
+$wgHooks['ManageWikiCoreFormSubmission'][] = 'MirahezeFunctions::onManageWikiCoreFormSubmission';
+
+// Multiversion: inject wikiVersions.php overrides into the CreateWiki cache.
+require_once '/srv/mediawiki/config/MultiVersion.php';
+$wgHooks['CreateWikiPhpBuilder'][] = 'WikiFarmMultiVersion::onCreateWikiPhpBuilder';
+
wfLoadExtensions( [
'CentralAuth',
'GlobalPreferences',
diff --git a/LocalSettings.php b/LocalSettings.php
index dcc8325..8c421a0 100644
--- a/LocalSettings.php
+++ b/LocalSettings.php
@@ -487,7 +487,7 @@ $wgConf->settings += [
// Cache
'wgExtensionEntryPointListFiles' => [
'default' => [
- '/var/www/mediawiki/config/extension-list'
+ "/srv/mediawiki/config/extension-list"
],
],
@@ -675,7 +675,7 @@ $wgConf->settings += [
'default' => true,
],
'wgCreateWikiCacheDirectory' => [
- 'default' => '/var/www/mediawiki/cw_cache',
+ 'default' => '/srv/mediawiki/cw_cache',
],
'wgCreateWikiCacheType' => [
'default' => 'redis',
@@ -773,19 +773,19 @@ $wgConf->settings += [
],
'wgCreateWikiSQLFiles' => [
'default' => [
- "/var/www/mediawiki/maintenance/tables-generated.sql",
- "/var/www/mediawiki/extensions/AbuseFilter/db_patches/mysql/tables-generated.sql",
- "/var/www/mediawiki/extensions/AntiSpoof/sql/mysql/tables-generated.sql",
- "/var/www/mediawiki/extensions/BetaFeatures/sql/tables-generated.sql",
- "/var/www/mediawiki/extensions/CheckUser/schema/mysql/tables-generated.sql",
- "/var/www/mediawiki/extensions/CentralNotice/sql/mysql/tables-generated.sql",
- "/var/www/mediawiki/extensions/DataDump/sql/data_dump.sql",
- "/var/www/mediawiki/extensions/Echo/sql/mysql/tables-generated.sql",
- "/var/www/mediawiki/extensions/GlobalBlocking/sql/mysql/tables-generated-global_block_whitelist.sql",
- #"/var/www/mediawiki/extensions/LoginNotify/sql/mysql/tables-generated.sql",
- "/var/www/mediawiki/extensions/OATHAuth/sql/mysql/tables-generated.sql",
- "/var/www/mediawiki/extensions/OAuth/schema/mysql/tables-generated.sql",
- "/var/www/mediawiki/extensions/MediaModeration/schema/mysql/tables-generated.sql",
+ "$IP/maintenance/tables-generated.sql",
+ "$IP/extensions/AbuseFilter/db_patches/mysql/tables-generated.sql",
+ "$IP/extensions/AntiSpoof/sql/mysql/tables-generated.sql",
+ "$IP/extensions/BetaFeatures/sql/tables-generated.sql",
+ "$IP/extensions/CheckUser/schema/mysql/tables-generated.sql",
+ "$IP/extensions/CentralNotice/sql/mysql/tables-generated.sql",
+ "$IP/extensions/DataDump/sql/data_dump.sql",
+ "$IP/extensions/Echo/sql/mysql/tables-generated.sql",
+ "$IP/extensions/GlobalBlocking/sql/mysql/tables-generated-global_block_whitelist.sql",
+ #"$IP/extensions/LoginNotify/sql/mysql/tables-generated.sql",
+ "$IP/extensions/OATHAuth/sql/mysql/tables-generated.sql",
+ "$IP/extensions/OAuth/schema/mysql/tables-generated.sql",
+ "$IP/extensions/MediaModeration/schema/mysql/tables-generated.sql",
//"$IP/extensions/RottenLinks/sql/rottenlinks.sql",
//"$IP/extensions/UrlShortener/schemas/tables-generated.sql",
],
@@ -817,7 +817,7 @@ $wgConf->settings += [
],
],
'wgManageWikiCacheDirectory' => [
- 'default' => '/var/www/mediawiki/cw_cache',
+ 'default' => '/srv/mediawiki/cw_cache',
],
'wgManageWikiUseCustomDomains' => [
'default' => true,
@@ -1331,10 +1331,10 @@ $wgConf->settings += [
'default' => true,
],
'wgOAuth2PublicKey' => [
- 'default' => '/var/www/mediawiki/config/OAuth.key.pub',
+ 'default' => '/srv/mediawiki/config/OAuth.key.pub',
],
'wgOAuth2PrivateKey' => [
- 'default' => '/var/www/mediawiki/config/OAuth.key',
+ 'default' => '/srv/mediawiki/config/OAuth.key',
],
// PortableInfobox
@@ -2357,7 +2357,7 @@ $wgFileBackends['s3']['containerPaths'] = [
];
$wgUploadDirectory = false;
-$wgTmpDirectory = '/var/www/mediawiki/cache';
+$wgTmpDirectory = '/srv/mediawiki/cache';
if ( $cwPrivate ) {
$wmgUploadHostname = false;
@@ -2377,9 +2377,9 @@ if ( $wi->missing ) {
$host = strtolower( trim( preg_replace( '/:\d+$/', '', $host ) ) );
if ( $host !== '' && preg_match( '/(^|\.)skywiki\.org$/', $host ) ) {
- require_once '/var/www/mediawiki/config/MissingSkyWiki.php';
+ require_once '/srv/mediawiki/config/MissingSkyWiki.php';
} else {
- require_once '/var/www/mediawiki/config/MissingWiki.php';
+ require_once '/srv/mediawiki/config/MissingWiki.php';
}
}
}
@@ -2395,7 +2395,7 @@ if ( $cwDeleted ) {
}
function wfHandleDeletedWiki() {
- require_once '/var/www/mediawiki/config/DeletedWiki.php';
+ require_once '/srv/mediawiki/config/DeletedWiki.php';
}
require_once "$IP/config/GlobalSettings.php";
@@ -2404,8 +2404,9 @@ require_once "$IP/config/LocalWiki.php";
$wgCargoDBname = $wgDBname . 'cargo';
// Define last - Extension message files for loading extensions
-if (file_exists(__DIR__ . '/ExtensionMessageFiles-1.45.php') && !defined('MW_NO_EXTENSION_MESSAGES')) {
- require_once __DIR__ . '/ExtensionMessageFiles-1.45.php';
+$_mwVersion = MirahezeFunctions::getMediaWikiVersion();
+if (file_exists(__DIR__ . "/ExtensionMessageFiles-{$_mwVersion}.php") && !defined('MW_NO_EXTENSION_MESSAGES')) {
+ require_once __DIR__ . "/ExtensionMessageFiles-{$_mwVersion}.php";
// These are not loaded by mergeMessageFileList.php due to not being on ExtensionRegistry
$wgMessagesDirs['SocialProfile'] = $IP . '/extensions/SocialProfile/i18n';
$wgExtensionMessagesFiles['SocialProfileAlias'] = $IP . '/extensions/SocialProfile/SocialProfile.alias.php';
@@ -2413,11 +2414,12 @@ if (file_exists(__DIR__ . '/ExtensionMessageFiles-1.45.php') && !defined('MW_NO_
$wgExtensionMessagesFiles['SocialProfileNamespaces'] = $IP . '/extensions/SocialProfile/SocialProfile.namespaces.php';
$wgExtensionMessagesFiles['AvatarMagic'] = $IP . '/extensions/SocialProfile/UserProfile/includes/avatar/Avatar.i18n.magic.php';
}
+// Use a per-version subdirectory so multiple MW versions can coexist.
$wgLocalisationCacheConf['storeClass'] = LCStoreStaticArray::class;
-$wgLocalisationCacheConf['storeDirectory'] = "/var/www/mediawiki/cache";
+$wgLocalisationCacheConf['storeDirectory'] = "/srv/mediawiki/cache/" . MirahezeFunctions::getMediaWikiVersion();
$wgLocalisationCacheConf['manualRecache'] = true;
-if ( !file_exists( "/var/www/mediawiki/cache/en.l10n.php" ) ) {
+if ( !file_exists( $wgLocalisationCacheConf['storeDirectory'] . '/en.l10n.php' ) ) {
$wgLocalisationCacheConf['manualRecache'] = false;
}
diff --git a/MirahezeFunctions.php b/MirahezeFunctions.php
old mode 100755
new mode 100644
index f64f443..ee3b897
--- a/MirahezeFunctions.php
+++ b/MirahezeFunctions.php
@@ -37,7 +37,9 @@ class MirahezeFunctions {
private const BETA_HOSTNAME = 'staging11';
- public const CACHE_DIRECTORY = '/var/www/mediawiki/cw_cache';
+ public const CACHE_DIRECTORY = '/srv/mediawiki/cw_cache';
+
+ private const CONFIG_DIRECTORY = '/srv/mediawiki/config';
private const CENTRAL_DATABASE = [
'default' => 'metawiki',
@@ -59,7 +61,7 @@ class MirahezeFunctions {
'beta' => 'wikidbbeta',
];
- private const MEDIAWIKI_DIRECTORY = '/var/www/mediawiki';
+ private const MEDIAWIKI_DIRECTORY = '/srv/mediawiki/versions';
public const MEDIAWIKI_VERSIONS = [
'alpha' => '1.45',
@@ -83,7 +85,7 @@ class MirahezeFunctions {
exit( 2 );
}
- require_once self::MEDIAWIKI_DIRECTORY . '/config/MissingWiki.php';
+ require_once self::CONFIG_DIRECTORY . '/MissingWiki.php';
}
$this->wikiDBClusters = self::getDatabaseClusters();
@@ -167,7 +169,7 @@ class MirahezeFunctions {
MW_ENTRY_POINT !== 'cli' &&
in_array( $data['c'] ?? null, $wgDatabaseClustersMaintenance, true )
) {
- require_once self::MEDIAWIKI_DIRECTORY . '/config/DatabaseMaintenance.php';
+ require_once self::CONFIG_DIRECTORY . '/DatabaseMaintenance.php';
}
return true;
@@ -445,6 +447,11 @@ class MirahezeFunctions {
}
if ( $database ) {
+ // Check wikiVersions.php first (written by ManageWiki version selector)
+ $wikiVersions = @include self::CONFIG_DIRECTORY . '/wikiVersions.php';
+ if ( is_array( $wikiVersions ) && isset( $wikiVersions[$database] ) ) {
+ return self::resolveMediaWikiVersion( $wikiVersions[$database] );
+ }
$dbVersion = self::readDbListFile( 'databases', false, $database )['v']
?? self::MEDIAWIKI_VERSIONS[ self::getDefaultMediaWikiVersion() ];
@@ -453,7 +460,10 @@ class MirahezeFunctions {
if ( PHP_SAPI === 'cli' ) {
$parts = explode( '/', $_SERVER['SCRIPT_NAME'] );
- $version = $parts[3] ?? null;
+ // MEDIAWIKI_DIRECTORY = /srv/mediawiki/versions → 3 non-empty segments
+ // version lives one level deeper: /srv/mediawiki/versions/<version>/...
+ $mwDirDepth = count( array_filter( explode( '/', self::MEDIAWIKI_DIRECTORY ) ) );
+ $version = $parts[ $mwDirDepth + 1 ] ?? null;
if ( $version && in_array( $version, self::MEDIAWIKI_VERSIONS, true ) ) {
return self::resolveMediaWikiVersion( $version );
@@ -463,6 +473,16 @@ class MirahezeFunctions {
static $version = null;
self::$currentDatabase ??= self::getCurrentDatabase();
+
+ // Check wikiVersions.php first (written by ManageWiki version selector)
+ if ( $version === null ) {
+ $wikiVersions = @include self::CONFIG_DIRECTORY . '/wikiVersions.php';
+ if ( is_array( $wikiVersions ) && isset( $wikiVersions[ self::$currentDatabase ] ) ) {
+ $version = $wikiVersions[ self::$currentDatabase ];
+ return self::resolveMediaWikiVersion( $version );
+ }
+ }
+
$version ??= self::readDbListFile( 'databases', false, self::$currentDatabase )['v']
?? self::MEDIAWIKI_VERSIONS[ self::getDefaultMediaWikiVersion() ];
@@ -1017,7 +1037,7 @@ class MirahezeFunctions {
$versions = array_unique( array_filter(
self::MEDIAWIKI_VERSIONS,
static fn ( string $version ): bool => $mwVersion === $version ||
- is_dir( self::MEDIAWIKI_DIRECTORY . $version )
+ is_dir( self::MEDIAWIKI_DIRECTORY . '/' . $version )
) );
asort( $versions );
@@ -1076,7 +1096,7 @@ class MirahezeFunctions {
$version = self::getMediaWikiVersion( $dbname );
$mediawikiVersion = $formData['mediawiki-version'] ?? $version;
$mwCore = $moduleFactory->core( $dbname );
- if ( $mediawikiVersion !== $version && is_dir( self::MEDIAWIKI_DIRECTORY . $mediawikiVersion ) ) {
+ if ( $mediawikiVersion !== $version && is_dir( self::MEDIAWIKI_DIRECTORY . '/' . $mediawikiVersion ) ) {
$mwCore->setExtraFieldData(
'mediawiki-version', $mediawikiVersion, default: $version
);
diff --git a/MultiVersion.php b/MultiVersion.php
new file mode 100644
index 0000000..99c5254
--- /dev/null
+++ b/MultiVersion.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * MultiVersion.php
+ * Fast-path version overrides and CreateWiki cache bridge.
+ *
+ * wikiVersions.php is the source of truth for per-wiki version overrides set
+ * via Special:ManageWiki/core. This file:
+ *
+ * 1. Exposes static helpers to read/write wikiVersions.php atomically.
+ * 2. Implements onCreateWikiPhpBuilder to propagate version overrides into
+ * the databases.php cache so MirahezeFunctions::getMediaWikiVersion()
+ * can find them without re-reading the file on every request.
+ *
+ * The ManageWiki UI (onManageWikiCoreAddFormFields / onManageWikiCoreFormSubmission)
+ * is handled by MirahezeFunctions and stores the chosen version in the
+ * wiki_extra JSON column of cw_wikis via ManageWiki's setExtraFieldData().
+ * wikiVersions.php serves as a lightweight override that takes effect
+ * immediately (before the next full cache rebuild).
+ */
+
+class WikiFarmMultiVersion {
+
+ private const VERSIONS_FILE = '/srv/mediawiki/config/wikiVersions.php';
+
+ /** Return the version currently stored for a wiki, or the farm default. */
+ public static function getWikiVersion( string $dbname ): string {
+ $versions = @include self::VERSIONS_FILE;
+ if ( is_array( $versions ) && isset( $versions[$dbname] ) ) {
+ return $versions[$dbname];
+ }
+ return MirahezeFunctions::MEDIAWIKI_VERSIONS[
+ MirahezeFunctions::getDefaultMediaWikiVersion()
+ ];
+ }
+
+ /**
+ * Atomically write a new version mapping for $dbname into wikiVersions.php.
+ * Uses a tmp-file + rename to avoid partial reads during concurrent requests.
+ * Pass null to remove a wiki-specific override (revert to farm default).
+ */
+ public static function setWikiVersion( string $dbname, ?string $version ): void {
+ $versions = @include self::VERSIONS_FILE;
+ if ( !is_array( $versions ) ) {
+ $versions = [];
+ }
+
+ $default = MirahezeFunctions::MEDIAWIKI_VERSIONS[
+ MirahezeFunctions::getDefaultMediaWikiVersion()
+ ];
+
+ if ( $version === null || $version === $default ) {
+ unset( $versions[$dbname] );
+ } else {
+ $versions[$dbname] = $version;
+ }
+
+ $lines = "<?php\nreturn [\n";
+ foreach ( $versions as $db => $ver ) {
+ $lines .= "\t" . var_export( $db, true ) . ' => ' . var_export( $ver, true ) . ",\n";
+ }
+ $lines .= "];\n";
+
+ $tmp = self::VERSIONS_FILE . '.tmp.' . getmypid();
+ file_put_contents( $tmp, $lines, LOCK_EX );
+ rename( $tmp, self::VERSIONS_FILE );
+
+ // Invalidate the wiki's CreateWiki cache so databases.php picks up the
+ // updated 'v' key on the next rebuild.
+ $cacheFile = MirahezeFunctions::CACHE_DIRECTORY . "/$dbname.php";
+ if ( file_exists( $cacheFile ) ) {
+ @unlink( $cacheFile );
+ }
+ }
+
+ /**
+ * Hook: CreateWikiPhpBuilder
+ *
+ * Injects the 'v' (version) key from wikiVersions.php overrides into the
+ * CreateWiki databases cache so MirahezeFunctions::getMediaWikiVersion()
+ * can find it without reading wikiVersions.php on every request.
+ * Overrides any version set via wiki_extra / setExtraFieldData.
+ */
+ public static function onCreateWikiPhpBuilder(
+ string $dbname,
+ array &$cacheData
+ ): void {
+ $versions = @include self::VERSIONS_FILE;
+ if ( is_array( $versions ) && isset( $versions[$dbname] ) ) {
+ $cacheData['v'] = $versions[$dbname];
+ }
+ }
+}
diff --git a/initialise/entrypoints/api.php b/initialise/entrypoints/api.php
new file mode 100644
index 0000000..0c60995
--- /dev/null
+++ b/initialise/entrypoints/api.php
@@ -0,0 +1,20 @@
+<?php
+use MediaWiki\Api\ApiEntryPoint;
+use MediaWiki\Context\RequestContext;
+use MediaWiki\EntryPointEnvironment;
+use MediaWiki\MediaWikiServices;
+
+define( 'MW_API', true );
+define( 'MW_ENTRY_POINT', 'api' );
+
+require_once dirname( __DIR__, 2 ) . '/MirahezeFunctions.php';
+MirahezeFunctions::getMediaWiki( '' );
+global $IP;
+
+require "$IP/includes/WebStart.php";
+
+( new ApiEntryPoint(
+ RequestContext::getMain(),
+ new EntryPointEnvironment(),
+ MediaWikiServices::getInstance()
+) )->run();
diff --git a/initialise/entrypoints/img_auth.php b/initialise/entrypoints/img_auth.php
new file mode 100644
index 0000000..0eec368
--- /dev/null
+++ b/initialise/entrypoints/img_auth.php
@@ -0,0 +1,20 @@
+<?php
+use MediaWiki\Context\RequestContext;
+use MediaWiki\EntryPointEnvironment;
+use MediaWiki\FileRepo\AuthenticatedFileEntryPoint;
+use MediaWiki\MediaWikiServices;
+
+define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
+define( 'MW_ENTRY_POINT', 'img_auth' );
+
+require_once dirname( __DIR__, 2 ) . '/MirahezeFunctions.php';
+MirahezeFunctions::getMediaWiki( '' );
+global $IP;
+
+require "$IP/includes/WebStart.php";
+
+( new AuthenticatedFileEntryPoint(
+ RequestContext::getMain(),
+ new EntryPointEnvironment(),
+ MediaWikiServices::getInstance()
+) )->run();
diff --git a/initialise/entrypoints/index.php b/initialise/entrypoints/index.php
new file mode 100644
index 0000000..50fe8d9
--- /dev/null
+++ b/initialise/entrypoints/index.php
@@ -0,0 +1,22 @@
+<?php
+use MediaWiki\Actions\ActionEntryPoint;
+use MediaWiki\Context\RequestContext;
+use MediaWiki\EntryPointEnvironment;
+use MediaWiki\MediaWikiServices;
+
+define( 'MW_ENTRY_POINT', 'index' );
+
+require_once dirname( __DIR__, 2 ) . '/MirahezeFunctions.php';
+MirahezeFunctions::getMediaWiki( '' );
+global $IP;
+
+require_once "$IP/includes/PHPVersionCheck.php";
+wfEntryPointCheck( 'html', dirname( $_SERVER['SCRIPT_NAME'] ) );
+
+require "$IP/includes/WebStart.php";
+
+( new ActionEntryPoint(
+ RequestContext::getMain(),
+ new EntryPointEnvironment(),
+ MediaWikiServices::getInstance()
+) )->run();
diff --git a/initialise/entrypoints/load.php b/initialise/entrypoints/load.php
new file mode 100644
index 0000000..f9e9f4a
--- /dev/null
+++ b/initialise/entrypoints/load.php
@@ -0,0 +1,20 @@
+<?php
+use MediaWiki\Context\RequestContext;
+use MediaWiki\EntryPointEnvironment;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\ResourceLoader\ResourceLoaderEntryPoint;
+
+define( 'MW_NO_SESSION', 1 );
+define( 'MW_ENTRY_POINT', 'load' );
+
+require_once dirname( __DIR__, 2 ) . '/MirahezeFunctions.php';
+MirahezeFunctions::getMediaWiki( '' );
+global $IP;
+
+require "$IP/includes/WebStart.php";
+
+( new ResourceLoaderEntryPoint(
+ RequestContext::getMain(),
+ new EntryPointEnvironment(),
+ MediaWikiServices::getInstance()
+) )->run();
diff --git a/initialise/entrypoints/opensearch_desc.php b/initialise/entrypoints/opensearch_desc.php
new file mode 100644
index 0000000..cfdb66e
--- /dev/null
+++ b/initialise/entrypoints/opensearch_desc.php
@@ -0,0 +1,19 @@
+<?php
+define( 'MW_NO_SESSION', 1 );
+define( 'MW_ENTRY_POINT', 'opensearch_desc' );
+
+require_once dirname( __DIR__, 2 ) . '/MirahezeFunctions.php';
+MirahezeFunctions::getMediaWiki( '' );
+global $IP;
+
+require_once "$IP/includes/WebStart.php";
+
+$url = wfScript( 'rest' ) . '/v1/search';
+$ctype = $wgRequest->getRawVal( 'ctype' );
+
+if ( $ctype !== null ) {
+ $url = wfAppendQuery( $url, [ 'ctype' => $ctype ] );
+}
+
+$wgRequest->response()->header( 'Location: ' . $url, true, 308 );
+$wgRequest->response()->header( 'Cache-control: max-age=600' );
diff --git a/initialise/entrypoints/rest.php b/initialise/entrypoints/rest.php
new file mode 100644
index 0000000..7f38845
--- /dev/null
+++ b/initialise/entrypoints/rest.php
@@ -0,0 +1,21 @@
+<?php
+use MediaWiki\Context\RequestContext;
+use MediaWiki\EntryPointEnvironment;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Rest\EntryPoint;
+
+define( 'MW_REST_API', true );
+define( 'MW_ENTRY_POINT', 'rest' );
+
+require_once dirname( __DIR__, 2 ) . '/MirahezeFunctions.php';
+MirahezeFunctions::getMediaWiki( '' );
+global $IP;
+
+require "$IP/includes/WebStart.php";
+
+( new EntryPoint(
+ EntryPoint::getMainRequest(),
+ RequestContext::getMain(),
+ new EntryPointEnvironment(),
+ MediaWikiServices::getInstance()
+) )->run();
diff --git a/initialise/entrypoints/sitemap.php b/initialise/entrypoints/sitemap.php
new file mode 100644
index 0000000..ad9e666
--- /dev/null
+++ b/initialise/entrypoints/sitemap.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Serves the wiki sitemap index and individual sitemap files by proxying
+ * from the WikiOasis CDN.
+ */
+
+define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
+define( 'MW_ENTRY_POINT', 'index' );
+
+require_once dirname( __DIR__, 2 ) . '/MirahezeFunctions.php';
+MirahezeFunctions::getMediaWiki( '' );
+global $IP;
+
+require "$IP/includes/WebStart.php";
+
+global $wgDBname;
+
+$dbname = strtolower( $wgDBname );
+$requestedSitemap = $_GET['sitemap'] ?? '';
+
+if ( $requestedSitemap !== '' ) {
+ if ( !preg_match( '/^sitemap-' . preg_quote( $dbname, '/' ) . '-[\w\-]+\.xml$/', $requestedSitemap ) ) {
+ http_response_code( 400 );
+ header( 'Content-Type: text/plain; charset=UTF-8' );
+ echo 'Invalid sitemap filename.';
+ exit;
+ }
+ $cdnPath = "sitemaps/{$requestedSitemap}";
+} else {
+ $cdnPath = "sitemaps/sitemap-index-{$dbname}.xml";
+}
+
+$url = "https://cdn.wikioasis.org/{$dbname}/{$cdnPath}";
+
+$ch = curl_init( $url );
+curl_setopt_array( $ch, [
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_TIMEOUT => 10,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 3,
+] );
+
+$body = curl_exec( $ch );
+$httpCode = (int)curl_getinfo( $ch, CURLINFO_HTTP_CODE );
+$curlError = curl_error( $ch );
+curl_close( $ch );
+
+if ( $body === false || $curlError !== '' ) {
+ http_response_code( 503 );
+ header( 'Content-Type: text/plain; charset=UTF-8' );
+ echo 'Sitemap temporarily unavailable.';
+ exit;
+}
+
+if ( $httpCode === 404 ) {
+ http_response_code( 404 );
+ header( 'Content-Type: text/plain; charset=UTF-8' );
+ echo 'Sitemap not found.';
+ exit;
+}
+
+if ( $httpCode !== 200 ) {
+ http_response_code( 502 );
+ header( 'Content-Type: text/plain; charset=UTF-8' );
+ echo 'Upstream error.';
+ exit;
+}
+
+header( 'Content-Type: application/xml; charset=UTF-8' );
+echo $body;
diff --git a/initialise/entrypoints/thumb.php b/initialise/entrypoints/thumb.php
new file mode 100644
index 0000000..8e69c42
--- /dev/null
+++ b/initialise/entrypoints/thumb.php
@@ -0,0 +1,20 @@
+<?php
+use MediaWiki\Context\RequestContext;
+use MediaWiki\EntryPointEnvironment;
+use MediaWiki\FileRepo\ThumbnailEntryPoint;
+use MediaWiki\MediaWikiServices;
+
+define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
+define( 'MW_ENTRY_POINT', 'thumb' );
+
+require_once dirname( __DIR__, 2 ) . '/MirahezeFunctions.php';
+MirahezeFunctions::getMediaWiki( '' );
+global $IP;
+
+require "$IP/includes/WebStart.php";
+
+( new ThumbnailEntryPoint(
+ RequestContext::getMain(),
+ new EntryPointEnvironment(),
+ MediaWikiServices::getInstance()
+) )->run();
diff --git a/wikiVersions.php b/wikiVersions.php
new file mode 100644
index 0000000..98ae462
--- /dev/null
+++ b/wikiVersions.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Per-wiki MediaWiki version overrides.
+ * Managed via Special:ManageWiki/core (requires managewiki-restricted).
+ * Updated atomically by WikiFarmMultiVersion::setWikiVersion().
+ *
+ * Keys are database names, values are version strings matching
+ * MirahezeFunctions::MEDIAWIKI_VERSIONS values.
+ * Wikis not listed here use the farm default version.
+ */
+return [
+ // 'examplewiki' => '1.45',
+];

File Metadata

Mime Type
text/x-diff
Expires
Mon, May 25, 11:10 AM (1 d, 8 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
973
Default Alt Text
(23 KB)

Event Timeline