%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/MobileFrontend/includes/ |
| Current File : //www/varak.net/wiki.varak.net/extensions/MobileFrontend/includes/WMFBaseDomainExtractor.php |
<?php
namespace MobileFrontend;
/**
* Utility class to find base domain for given host.
*
* This class contains a hardcoded list of all WMF hosts and WMF specific domain logic. As we never
* experienced any bug requests from users and we do not change domains too often there is no need
* to put that hosts list into settings.
*
* @see T148975
*/
class WMFBaseDomainExtractor implements BaseDomainExtractorInterface {
/**
* @var string[]
*/
private $wmfWikiHosts = [
'wikipedia.org',
'wikibooks.org',
'wikiversity.org',
'wikinews.org',
'wiktionary.org',
'wikisource.org',
'wikiquote.org',
'wikivoyage.org',
'wikidata.org',
'mediawiki.org',
// local vagrant instances
'local.wmftest.net'
];
/**
* @var string[]
*/
private $wmfMultiDomainWikiHosts = [
// commons, office, meta, outreach, wikimania, incubator, etc...
'.wikimedia.org',
// beta cluster
'.beta.wmflabs.org',
// all other labs
'.wmflabs.org'
];
/**
* Try to extract the WMF base domain from $server
* Returns $server if no WMF base domain is found.
*
* Although some browsers will accept cookies without the initial . in domain
* RFC 2109 requires it to be included.
*
* @param string $server URL
* @return string Hostname
*/
public function getCookieDomain( $server ) {
$parsedUrl = wfParseUrl( $server );
$host = $parsedUrl['host'];
$wikiHost = $this->matchBaseHostname( $host, $this->wmfWikiHosts );
if ( $wikiHost !== false ) {
return '.' . $wikiHost;
}
$multiWikiHost = $this->matchBaseHostname( $host, $this->wmfMultiDomainWikiHosts );
if ( $multiWikiHost !== false ) {
return '.' . $this->extractSubdomain( $host, $multiWikiHost );
}
return $host;
}
/**
* Find out whether $hostname matches or is subdomain of any host from $hosts array
*
* @param string $hostname Visited host
* @param string[] $hosts Array of all wikimedia hosts
* @return bool|string Returns wikimedia host basedomain, false when not found
*/
private function matchBaseHostname( $hostname, array $hosts ) {
foreach ( $hosts as $wmfHost ) {
if ( $this->endsWith( $hostname, $wmfHost ) ) {
return $wmfHost;
}
}
return false;
}
/**
* Parse $host and return $baseDomain with first subdomain
* ex: extractSubdomain('en.commons.wikimedia.org', '.wikimedia.org') => 'commons.wikimedia.org'
*
* This function assumes that $fullHostname is a subdomain of $basedomain. Please
* do the endsWith() check first before calling this function
*
* @param string $fullHostname
* @param string $baseDomain
* @return string
*/
private function extractSubdomain( $fullHostname, $baseDomain ) {
$length = strlen( $baseDomain );
$subdomains = explode( '.', substr( $fullHostname, 0, -$length ) );
if ( count( $subdomains ) == 0 ) {
return $baseDomain;
}
$subdomain = array_pop( $subdomains );
return $subdomain . $baseDomain;
}
/**
* Check that $haystack ends with $needle
*
* @param string $haystack
* @param string $needle
* @return bool
*/
private function endsWith( $haystack, $needle ) {
$length = strlen( $needle );
if ( $length === 0 ) {
return true;
}
return substr( $haystack, -$length ) === $needle;
}
}