Page Menu
Home
WikiOasis
Search
Configure Global Search
Log In
Files
F1256
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
23 KB
Referenced Files
None
Subscribers
None
View Options
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
Details
Attached
Mime Type
text/x-diff
Expires
Mon, May 25, 11:10 AM (1 d, 10 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
973
Default Alt Text
(23 KB)
Attached To
Mode
rMWC mw-config
Attached
Detach File
Event Timeline
Log In to Comment