mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-09-28 14:30:51 +00:00
XOMW: Start XomwRequestContext [#632]
This commit is contained in:
parent
f9cf49c160
commit
b0e02979ac
25
100_core/src/gplx/core/primitives/ObjectWrapperRef.java
Normal file
25
100_core/src/gplx/core/primitives/ObjectWrapperRef.java
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.primitives;
|
||||
|
||||
import gplx.Object_;
|
||||
|
||||
public class ObjectWrapperRef {
|
||||
public ObjectWrapperRef() {}
|
||||
public Object Val() {return val;} public ObjectWrapperRef Val_(Object v) {val = v; return this;} private Object val;
|
||||
public ObjectWrapperRef Val_null_() {return Val_(null);}
|
||||
@Override public String toString() {return Object_.Xto_str_strict_or_null(val);}
|
||||
}
|
@ -89,4 +89,11 @@ public class XophpObject_ {
|
||||
public static boolean is_object(Object o) {
|
||||
return o != null;
|
||||
}
|
||||
|
||||
// REF.PHP:https://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary
|
||||
// equivalent to ?:
|
||||
public static Object Elvis(Object o, Object or) {return is_true(o) ? o : or;}
|
||||
|
||||
// equivalent to ??
|
||||
public static Object Coalesce(Object o, Object or) {return isset_obj(o) ? o : or;}
|
||||
}
|
||||
|
@ -19,7 +19,6 @@ package gplx.xowa.mediawiki.includes;
|
||||
import gplx.xowa.mediawiki.XomwEnv;
|
||||
import gplx.xowa.mediawiki.includes.interwiki.XomwInterwikiLookup;
|
||||
import gplx.xowa.mediawiki.includes.title.XomwMediaWikiTitleCodec;
|
||||
import gplx.xowa.mediawiki.includes.title.XomwTitleFormatter;
|
||||
import gplx.xowa.mediawiki.languages.XomwLanguage;
|
||||
|
||||
/**
|
||||
|
@ -283,7 +283,7 @@ class XomwMessage { // implements MessageSpecifier, Serializable
|
||||
this.parameters = XophpArray_.array_values(params);
|
||||
// User language is only resolved in getLanguage(). This helps preserve the
|
||||
// semantic intent of "user language" across serialize() and unserialize().
|
||||
this.language = XophpObject_.is_true(language) ? language : null;
|
||||
this.language = (XomwLanguage)XophpObject_.Elvis(language, null);
|
||||
}
|
||||
|
||||
// /**
|
||||
@ -391,18 +391,19 @@ class XomwMessage { // implements MessageSpecifier, Serializable
|
||||
// wfDeprecated(__METHOD__, '1.29');
|
||||
// return this.format;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Returns the Language of the Message.
|
||||
// *
|
||||
// * @since 1.23
|
||||
// *
|
||||
// * @return Language
|
||||
// */
|
||||
// public function getLanguage() {
|
||||
// // Defaults to false which means current user language
|
||||
// return this.language ?: RequestContext::getMain().getLanguage();
|
||||
// }
|
||||
|
||||
/**
|
||||
* Returns the Language of the Message.
|
||||
*
|
||||
* @since 1.23
|
||||
*
|
||||
* @return Language
|
||||
*/
|
||||
public XomwLanguage getLanguage() {
|
||||
// Defaults to false which means current user language
|
||||
// return XophpObject_.Elvis(this.language, XomwRequestContext.getMain().getLanguage());
|
||||
return null;
|
||||
}
|
||||
//
|
||||
// /**
|
||||
// * Factory function that is just wrapper for the real constructor. It is
|
||||
@ -852,19 +853,20 @@ class XomwMessage { // implements MessageSpecifier, Serializable
|
||||
//
|
||||
// return this.content;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Returns the message parsed from wikitext to HTML.
|
||||
// *
|
||||
// * @since 1.17
|
||||
// *
|
||||
// * @param string|null $format One of the FORMAT_* constants. Null means use whatever was used
|
||||
// * the last time (this is for B/C and should be avoided).
|
||||
// *
|
||||
// * @return string HTML
|
||||
// * @suppress SecurityCheck-DoubleEscaped phan false positive
|
||||
// */
|
||||
// public function toString($format = null) {
|
||||
|
||||
/**
|
||||
* Returns the message parsed from wikitext to HTML.
|
||||
*
|
||||
* @since 1.17
|
||||
*
|
||||
* @param string|null $format One of the FORMAT_* constants. Null means use whatever was used
|
||||
* the last time (this is for B/C and should be avoided).
|
||||
*
|
||||
* @return string HTML
|
||||
* @suppress SecurityCheck-DoubleEscaped phan false positive
|
||||
*/
|
||||
public String toString() {return toString(null);}
|
||||
public String toString(String format) {
|
||||
// if ($format === null) {
|
||||
// $ex = new LogicException(__METHOD__ . ' using implicit format: ' . this.format);
|
||||
// \MediaWiki\Logger\LoggerFactory::getInstance('message-format').warning(
|
||||
@ -913,7 +915,8 @@ class XomwMessage { // implements MessageSpecifier, Serializable
|
||||
// $string = this.replaceParameters($string, 'after', $format);
|
||||
//
|
||||
// return $string;
|
||||
// }
|
||||
return null;
|
||||
}
|
||||
//
|
||||
// /**
|
||||
// * Magic method implementation of the above (for PHP >= 5.2.0), so we can do, eg:
|
||||
@ -1302,34 +1305,36 @@ class XomwMessage { // implements MessageSpecifier, Serializable
|
||||
// this.title
|
||||
// );
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Wrapper for what ever method we use to get message contents.
|
||||
// *
|
||||
// * @since 1.17
|
||||
// *
|
||||
// * @return string
|
||||
// * @throws MWException If message key array is empty.
|
||||
// */
|
||||
// protected function fetchMessage() {
|
||||
// if (this.message === null) {
|
||||
// $cache = MessageCache::singleton();
|
||||
//
|
||||
// foreach (this.keysToTry as $key) {
|
||||
// $message = $cache.get($key, this.useDatabase, this.getLanguage());
|
||||
// if ($message !== false && $message !== '') {
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // NOTE: The constructor makes sure keysToTry isn't empty,
|
||||
// // so we know that $key and $message are initialized.
|
||||
// this.key = $key;
|
||||
// this.message = $message;
|
||||
// }
|
||||
// return this.message;
|
||||
// }
|
||||
//
|
||||
|
||||
/**
|
||||
* Wrapper for what ever method we use to get message contents.
|
||||
*
|
||||
* @since 1.17
|
||||
*
|
||||
* @return string
|
||||
* @throws MWException If message key array is empty.
|
||||
*/
|
||||
protected String fetchMessage() {
|
||||
if (XophpObject_.is_null(this.message)) {
|
||||
// cache = MessageCache::singleton();
|
||||
|
||||
int len = keysToTry.Len();
|
||||
for (int i = 0; i < len; i++) {
|
||||
String key = keysToTry.Get_at_str(i);
|
||||
// message = cache.get(key, this.useDatabase, this.getLanguage());
|
||||
if (!XophpObject_.is_false(message) && XophpString_.eq_not(message, "")) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE: The constructor makes sure keysToTry isn't empty,
|
||||
// so we know that $key and $message are initialized.
|
||||
this.key = key;
|
||||
this.message = message;
|
||||
}
|
||||
return this.message;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Formats a message parameter wrapped with 'plaintext'. Ensures that
|
||||
// * the entire string is displayed unchanged when displayed in the output
|
||||
|
4241
400_xowa/src/gplx/xowa/mediawiki/includes/XomwOutputPage.java
Normal file
4241
400_xowa/src/gplx/xowa/mediawiki/includes/XomwOutputPage.java
Normal file
File diff suppressed because it is too large
Load Diff
1329
400_xowa/src/gplx/xowa/mediawiki/includes/XomwWebRequest.java
Normal file
1329
400_xowa/src/gplx/xowa/mediawiki/includes/XomwWebRequest.java
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,28 @@
|
||||
package gplx.xowa.mediawiki.includes.config;
|
||||
|
||||
// MW.SRC:1.33.1
|
||||
/**
|
||||
* Interface for configuration instances
|
||||
*
|
||||
* @since 1.23
|
||||
*/
|
||||
public interface XomwConfig {
|
||||
|
||||
/**
|
||||
* Get a configuration variable such as "Sitename" or "UploadMaintenance."
|
||||
*
|
||||
* @param string $name Name of configuration option
|
||||
* @return mixed Value configured
|
||||
* @throws ConfigException
|
||||
*/
|
||||
public Object get(String name);
|
||||
|
||||
/**
|
||||
* Check whether a configuration option is set for the given name
|
||||
*
|
||||
* @param string $name Name of configuration option
|
||||
* @return bool
|
||||
* @since 1.24
|
||||
*/
|
||||
public boolean has(String name);
|
||||
}
|
@ -0,0 +1,611 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.xowa.mediawiki.includes.context;
|
||||
|
||||
import gplx.xowa.mediawiki.XophpObject_;
|
||||
import gplx.xowa.mediawiki.includes.XomwOutputPage;
|
||||
import gplx.xowa.mediawiki.includes.XomwTitle;
|
||||
import gplx.xowa.mediawiki.includes.XomwWebRequest;
|
||||
import gplx.xowa.mediawiki.includes.config.XomwConfig;
|
||||
import gplx.xowa.mediawiki.includes.page.XomwWikiPage;
|
||||
import gplx.xowa.mediawiki.includes.user.XomwUser;
|
||||
import gplx.xowa.mediawiki.languages.XomwLanguage;
|
||||
|
||||
/**
|
||||
* Group all the pieces relevant to the context of a request into one instance
|
||||
*/
|
||||
public class XomwRequestContext { // implements IContextSource, MutableContext
|
||||
/**
|
||||
* @var WebRequest
|
||||
*/
|
||||
private XomwWebRequest request;
|
||||
|
||||
/**
|
||||
* @var Title
|
||||
*/
|
||||
private XomwTitle title;
|
||||
|
||||
/**
|
||||
* @var WikiPage
|
||||
*/
|
||||
private XomwWikiPage wikipage;
|
||||
|
||||
/**
|
||||
* @var OutputPage
|
||||
*/
|
||||
private XomwOutputPage output;
|
||||
|
||||
/**
|
||||
* @var User
|
||||
*/
|
||||
private XomwUser user;
|
||||
|
||||
/**
|
||||
* @var Language
|
||||
*/
|
||||
private XomwLanguage lang;
|
||||
|
||||
// /**
|
||||
// * @var Skin
|
||||
// */
|
||||
// private $skin;
|
||||
//
|
||||
// /**
|
||||
// * @var Timing
|
||||
// */
|
||||
// private $timing;
|
||||
|
||||
/**
|
||||
* @var Config
|
||||
*/
|
||||
private XomwConfig config;
|
||||
|
||||
/**
|
||||
* @var RequestContext
|
||||
*/
|
||||
private static XomwRequestContext instance = null;
|
||||
|
||||
/**
|
||||
* @param Config $config
|
||||
*/
|
||||
public void setConfig(XomwConfig cconfig) {
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return Config
|
||||
// */
|
||||
// public function getConfig() {
|
||||
// if (this.config === null) {
|
||||
// // @todo In the future, we could move this to WebStart.php so
|
||||
// // the Config object is ready for when initialization happens
|
||||
// this.config = MediaWikiServices::getInstance().getMainConfig();
|
||||
// }
|
||||
//
|
||||
// return this.config;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @param WebRequest $request
|
||||
// */
|
||||
// public function setRequest(WebRequest $request) {
|
||||
// this.request = $request;
|
||||
// }
|
||||
|
||||
// /**
|
||||
// * @return WebRequest
|
||||
// */
|
||||
// public XomwWebRequest getRequest() {
|
||||
// if (this.request === null) {
|
||||
// global $wgCommandLineMode;
|
||||
// // create the WebRequest object on the fly
|
||||
// if ($wgCommandLineMode) {
|
||||
// this.request = new FauxRequest([]);
|
||||
// } else {
|
||||
// this.request = new WebRequest();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return this.request;
|
||||
// }
|
||||
|
||||
// /**
|
||||
// * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
|
||||
// *
|
||||
// * @return IBufferingStatsdDataFactory
|
||||
// */
|
||||
// public function getStats() {
|
||||
// return MediaWikiServices::getInstance().getStatsdDataFactory();
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @return Timing
|
||||
// */
|
||||
// public function getTiming() {
|
||||
// if (this.timing === null) {
|
||||
// this.timing = new Timing([
|
||||
// 'logger' => LoggerFactory::getInstance('Timing')
|
||||
// ]);
|
||||
// }
|
||||
// return this.timing;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @param Title|null $title
|
||||
// */
|
||||
// public function setTitle(Title $title = null) {
|
||||
// this.title = $title;
|
||||
// // Erase the WikiPage so a new one with the new title gets created.
|
||||
// this.wikipage = null;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @return Title|null
|
||||
// */
|
||||
// public function getTitle() {
|
||||
// if (this.title === null) {
|
||||
// global $wgTitle; # fallback to $wg till we can improve this
|
||||
// this.title = $wgTitle;
|
||||
// wfDebugLog(
|
||||
// 'GlobalTitleFail',
|
||||
// __METHOD__ . ' called by ' . wfGetAllCallers(5) . ' with no title set.'
|
||||
// );
|
||||
// }
|
||||
//
|
||||
// return this.title;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Check, if a Title object is set
|
||||
// *
|
||||
// * @since 1.25
|
||||
// * @return bool
|
||||
// */
|
||||
// public function hasTitle() {
|
||||
// return this.title !== null;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Check whether a WikiPage object can be get with getWikiPage().
|
||||
// * Callers should expect that an exception is thrown from getWikiPage()
|
||||
// * if this method returns false.
|
||||
// *
|
||||
// * @since 1.19
|
||||
// * @return bool
|
||||
// */
|
||||
// public function canUseWikiPage() {
|
||||
// if (this.wikipage) {
|
||||
// // If there's a WikiPage object set, we can for sure get it
|
||||
// return true;
|
||||
// }
|
||||
// // Only pages with legitimate titles can have WikiPages.
|
||||
// // That usually means pages in non-virtual namespaces.
|
||||
// $title = this.getTitle();
|
||||
// return $title ? $title.canExist() : false;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @since 1.19
|
||||
// * @param WikiPage $wikiPage
|
||||
// */
|
||||
// public function setWikiPage(WikiPage $wikiPage) {
|
||||
// $pageTitle = $wikiPage.getTitle();
|
||||
// if (!this.hasTitle() || !$pageTitle.equals(this.getTitle())) {
|
||||
// this.setTitle($pageTitle);
|
||||
// }
|
||||
// // Defer this to the end since setTitle sets it to null.
|
||||
// this.wikipage = $wikiPage;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Get the WikiPage object.
|
||||
// * May throw an exception if there's no Title object set or the Title object
|
||||
// * belongs to a special namespace that doesn't have WikiPage, so use first
|
||||
// * canUseWikiPage() to check whether this method can be called safely.
|
||||
// *
|
||||
// * @since 1.19
|
||||
// * @throws MWException
|
||||
// * @return WikiPage
|
||||
// */
|
||||
// public function getWikiPage() {
|
||||
// if (this.wikipage === null) {
|
||||
// $title = this.getTitle();
|
||||
// if ($title === null) {
|
||||
// throw new MWException(__METHOD__ . ' called without Title object set');
|
||||
// }
|
||||
// this.wikipage = WikiPage::factory($title);
|
||||
// }
|
||||
//
|
||||
// return this.wikipage;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @param OutputPage $output
|
||||
// */
|
||||
// public function setOutput(OutputPage $output) {
|
||||
// this.output = $output;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @return OutputPage
|
||||
// */
|
||||
// public function getOutput() {
|
||||
// if (this.output === null) {
|
||||
// this.output = new OutputPage($this);
|
||||
// }
|
||||
//
|
||||
// return this.output;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @param User $user
|
||||
// */
|
||||
// public function setUser(User $user) {
|
||||
// this.user = $user;
|
||||
// // Invalidate cached user interface language
|
||||
// this.lang = null;
|
||||
// }
|
||||
|
||||
/**
|
||||
* @return User
|
||||
*/
|
||||
public XomwUser getUser() {
|
||||
if (XophpObject_.is_null(this.user)) {
|
||||
// this.user = XomwUser.newFromSession(this.getRequest());
|
||||
}
|
||||
|
||||
return this.user;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Accepts a language code and ensures it's sane. Outputs a cleaned up language
|
||||
// * code and replaces with $wgLanguageCode if not sane.
|
||||
// * @param string $code Language code
|
||||
// * @return string
|
||||
// */
|
||||
// public static function sanitizeLangCode($code) {
|
||||
// global $wgLanguageCode;
|
||||
//
|
||||
// // BCP 47 - letter case MUST NOT carry meaning
|
||||
// $code = strtolower($code);
|
||||
//
|
||||
// # Validate $code
|
||||
// if (!$code || !Language::isValidCode($code) || $code === 'qqq') {
|
||||
// $code = $wgLanguageCode;
|
||||
// }
|
||||
//
|
||||
// return $code;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @param Language|string $language Language instance or language code
|
||||
// * @throws MWException
|
||||
// * @since 1.19
|
||||
// */
|
||||
// public function setLanguage($language) {
|
||||
// if ($language instanceof Language) {
|
||||
// this.lang = $language;
|
||||
// } elseif (is_string($language)) {
|
||||
// $language = self::sanitizeLangCode($language);
|
||||
// $obj = Language::factory($language);
|
||||
// this.lang = $obj;
|
||||
// } else {
|
||||
// throw new MWException(__METHOD__ . " was passed an invalid type of data.");
|
||||
// }
|
||||
// }
|
||||
|
||||
/**
|
||||
* Get the Language object.
|
||||
* Initialization of user or request objects can depend on this.
|
||||
* @return Language
|
||||
* @throws Exception
|
||||
* @since 1.19
|
||||
*/
|
||||
private boolean recursion = false; // XOMW:appears to be auto-declared in MW
|
||||
public XomwLanguage getLanguage() {
|
||||
// if (isset(this.recursion)) {
|
||||
// trigger_error("Recursion detected in " . __METHOD__, E_USER_WARNING);
|
||||
// $e = new Exception;
|
||||
// wfDebugLog('recursion-guard', "Recursion detected:\n" . $e.getTraceAsString());
|
||||
//
|
||||
// $code = this.getConfig().get('LanguageCode') ?: 'en';
|
||||
// this.lang = Language::factory($code);
|
||||
// } elseif (this.lang === null) {
|
||||
this.recursion = true;
|
||||
|
||||
try {
|
||||
// $request = this.getRequest();
|
||||
// $user = this.getUser();
|
||||
//
|
||||
// $code = $request.getVal('uselang', 'user');
|
||||
// if ($code === 'user') {
|
||||
// $code = $user.getOption('language');
|
||||
// }
|
||||
// $code = self::sanitizeLangCode($code);
|
||||
//
|
||||
// XomwHooks.run("UserGetLanguageObject", XophpArray.New(user, &$code, this));
|
||||
//
|
||||
// if ($code === this.getConfig().get('LanguageCode')) {
|
||||
// this.lang = MediaWikiServices::getInstance().getContentLanguage();
|
||||
// } else {
|
||||
// $obj = Language::factory($code);
|
||||
// this.lang = $obj;
|
||||
// }
|
||||
} finally {
|
||||
this.recursion = false; // XOMW:`unset(this.recursion);`
|
||||
}
|
||||
// }
|
||||
//
|
||||
return this.lang;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @param Skin $skin
|
||||
// */
|
||||
// public function setSkin(Skin $skin) {
|
||||
// this.skin = clone $skin;
|
||||
// this.skin.setContext($this);
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @return Skin
|
||||
// */
|
||||
// public function getSkin() {
|
||||
// if (this.skin === null) {
|
||||
// $skin = null;
|
||||
// Hooks::run('RequestContextCreateSkin', [ $this, &$skin ]);
|
||||
// $factory = SkinFactory::getDefaultInstance();
|
||||
//
|
||||
// // If the hook worked try to set a skin from it
|
||||
// if ($skin instanceof Skin) {
|
||||
// this.skin = $skin;
|
||||
// } elseif (is_string($skin)) {
|
||||
// // Normalize the key, just in case the hook did something weird.
|
||||
// $normalized = Skin::normalizeKey($skin);
|
||||
// this.skin = $factory.makeSkin($normalized);
|
||||
// }
|
||||
//
|
||||
// // If this is still null (the hook didn't run or didn't work)
|
||||
// // then go through the normal processing to load a skin
|
||||
// if (this.skin === null) {
|
||||
// if (!in_array('skin', this.getConfig().get('HiddenPrefs'))) {
|
||||
// # get the user skin
|
||||
// $userSkin = this.getUser().getOption('skin');
|
||||
// $userSkin = this.getRequest().getVal('useskin', $userSkin);
|
||||
// } else {
|
||||
// # if we're not allowing users to override, then use the default
|
||||
// $userSkin = this.getConfig().get('DefaultSkin');
|
||||
// }
|
||||
//
|
||||
// // Normalize the key in case the user is passing gibberish
|
||||
// // or has old preferences (T71566).
|
||||
// $normalized = Skin::normalizeKey($userSkin);
|
||||
//
|
||||
// // Skin::normalizeKey will also validate it, so
|
||||
// // this won't throw an exception
|
||||
// this.skin = $factory.makeSkin($normalized);
|
||||
// }
|
||||
//
|
||||
// // After all that set a context on whatever skin got created
|
||||
// this.skin.setContext($this);
|
||||
// }
|
||||
//
|
||||
// return this.skin;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Get a Message object with context set
|
||||
// * Parameters are the same as wfMessage()
|
||||
// *
|
||||
// * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
|
||||
// * or a MessageSpecifier.
|
||||
// * @param mixed $args,...
|
||||
// * @return Message
|
||||
// */
|
||||
// public function msg($key) {
|
||||
// $args = func_get_args();
|
||||
//
|
||||
// return wfMessage(...$args).setContext($this);
|
||||
// }
|
||||
|
||||
/**
|
||||
* Get the RequestContext object associated with the main request
|
||||
*
|
||||
* @return RequestContext
|
||||
*/
|
||||
public static XomwRequestContext getMain() {
|
||||
if (instance == null) {
|
||||
instance = new XomwRequestContext();
|
||||
}
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Get the RequestContext object associated with the main request
|
||||
// * and gives a warning to the log, to find places, where a context maybe is missing.
|
||||
// *
|
||||
// * @param string $func
|
||||
// * @return RequestContext
|
||||
// * @since 1.24
|
||||
// */
|
||||
// public static function getMainAndWarn($func = __METHOD__) {
|
||||
// wfDebug($func . ' called without context. ' .
|
||||
// "Using RequestContext::getMain() for sanity\n");
|
||||
//
|
||||
// return self::getMain();
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Resets singleton returned by getMain(). Should be called only from unit tests.
|
||||
// */
|
||||
// public static function resetMain() {
|
||||
// if (!(defined('MW_PHPUNIT_TEST') || defined('MW_PARSER_TEST'))) {
|
||||
// throw new MWException(__METHOD__ . '() should be called only from unit tests!');
|
||||
// }
|
||||
// instance = null;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Export the resolved user IP, HTTP headers, user ID, and session ID.
|
||||
// * The result will be reasonably sized to allow for serialization.
|
||||
// *
|
||||
// * @return array
|
||||
// * @since 1.21
|
||||
// */
|
||||
// public function exportSession() {
|
||||
// $session = MediaWiki\Session\SessionManager::getGlobalSession();
|
||||
// return [
|
||||
// 'ip' => this.getRequest().getIP(),
|
||||
// 'headers' => this.getRequest().getAllHeaders(),
|
||||
// 'sessionId' => $session.isPersistent() ? $session.getId() : '',
|
||||
// 'userId' => this.getUser().getId()
|
||||
// ];
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Import an client IP address, HTTP headers, user ID, and session ID
|
||||
// *
|
||||
// * This sets the current session, $wgUser, and $wgRequest from $params.
|
||||
// * Once the return value falls out of scope, the old context is restored.
|
||||
// * This method should only be called in contexts where there is no session
|
||||
// * ID or end user receiving the response (CLI or HTTP job runners). This
|
||||
// * is partly enforced, and is done so to avoid leaking cookies if certain
|
||||
// * error conditions arise.
|
||||
// *
|
||||
// * This is useful when background scripts inherit context when acting on
|
||||
// * behalf of a user. In general the 'sessionId' parameter should be set
|
||||
// * to an empty string unless session importing is *truly* needed. This
|
||||
// * feature is somewhat deprecated.
|
||||
// *
|
||||
// * @note suhosin.session.encrypt may interfere with this method.
|
||||
// *
|
||||
// * @param array $params Result of RequestContext::exportSession()
|
||||
// * @return ScopedCallback
|
||||
// * @throws MWException
|
||||
// * @since 1.21
|
||||
// */
|
||||
// public static function importScopedSession(array $params) {
|
||||
// if (strlen($params['sessionId']) &&
|
||||
// MediaWiki\Session\SessionManager::getGlobalSession().isPersistent()
|
||||
// ) {
|
||||
// // Sanity check to avoid sending random cookies for the wrong users.
|
||||
// // This method should only called by CLI scripts or by HTTP job runners.
|
||||
// throw new MWException("Sessions can only be imported when none is active.");
|
||||
// } elseif (!IP::isValid($params['ip'])) {
|
||||
// throw new MWException("Invalid client IP address '{$params['ip']}'.");
|
||||
// }
|
||||
//
|
||||
// if ($params['userId']) { // logged-in user
|
||||
// $user = User::newFromId($params['userId']);
|
||||
// $user.load();
|
||||
// if (!$user.getId()) {
|
||||
// throw new MWException("No user with ID '{$params['userId']}'.");
|
||||
// }
|
||||
// } else { // anon user
|
||||
// $user = User::newFromName($params['ip'], false);
|
||||
// }
|
||||
//
|
||||
// $importSessionFunc = function (User $user, array $params) {
|
||||
// global $wgRequest, $wgUser;
|
||||
//
|
||||
// $context = RequestContext::getMain();
|
||||
//
|
||||
// // Commit and close any current session
|
||||
// if (MediaWiki\Session\PHPSessionHandler::isEnabled()) {
|
||||
// session_write_close(); // persist
|
||||
// session_id(''); // detach
|
||||
// $_SESSION = []; // clear in-memory array
|
||||
// }
|
||||
//
|
||||
// // Get new session, if applicable
|
||||
// $session = null;
|
||||
// if (strlen($params['sessionId'])) { // don't make a new random ID
|
||||
// $manager = MediaWiki\Session\SessionManager::singleton();
|
||||
// $session = $manager.getSessionById($params['sessionId'], true)
|
||||
// ?: $manager.getEmptySession();
|
||||
// }
|
||||
//
|
||||
// // Remove any user IP or agent information, and attach the request
|
||||
// // with the new session.
|
||||
// $context.setRequest(new FauxRequest([], false, $session));
|
||||
// $wgRequest = $context.getRequest(); // b/c
|
||||
//
|
||||
// // Now that all private information is detached from the user, it should
|
||||
// // be safe to load the new user. If errors occur or an exception is thrown
|
||||
// // and caught (leaving the main context in a mixed state), there is no risk
|
||||
// // of the User object being attached to the wrong IP, headers, or session.
|
||||
// $context.setUser($user);
|
||||
// $wgUser = $context.getUser(); // b/c
|
||||
// if ($session && MediaWiki\Session\PHPSessionHandler::isEnabled()) {
|
||||
// session_id($session.getId());
|
||||
// Wikimedia\quietCall('session_start');
|
||||
// }
|
||||
// $request = new FauxRequest([], false, $session);
|
||||
// $request.setIP($params['ip']);
|
||||
// foreach ($params['headers'] as $name => $value) {
|
||||
// $request.setHeader($name, $value);
|
||||
// }
|
||||
// // Set the current context to use the new WebRequest
|
||||
// $context.setRequest($request);
|
||||
// $wgRequest = $context.getRequest(); // b/c
|
||||
// };
|
||||
//
|
||||
// // Stash the old session and load in the new one
|
||||
// $oUser = self::getMain().getUser();
|
||||
// $oParams = self::getMain().exportSession();
|
||||
// $oRequest = self::getMain().getRequest();
|
||||
// $importSessionFunc($user, $params);
|
||||
//
|
||||
// // Set callback to save and close the new session and reload the old one
|
||||
// return new ScopedCallback(
|
||||
// function () use ($importSessionFunc, $oUser, $oParams, $oRequest) {
|
||||
// global $wgRequest;
|
||||
// $importSessionFunc($oUser, $oParams);
|
||||
// // Restore the exact previous Request object (instead of leaving FauxRequest)
|
||||
// RequestContext::getMain().setRequest($oRequest);
|
||||
// $wgRequest = RequestContext::getMain().getRequest(); // b/c
|
||||
// }
|
||||
// );
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Create a new extraneous context. The context is filled with information
|
||||
// * external to the current session.
|
||||
// * - Title is specified by argument
|
||||
// * - Request is a FauxRequest, or a FauxRequest can be specified by argument
|
||||
// * - User is an anonymous user, for separation IPv4 localhost is used
|
||||
// * - Language will be based on the anonymous user and request, may be content
|
||||
// * language or a uselang param in the fauxrequest data may change the lang
|
||||
// * - Skin will be based on the anonymous user, should be the wiki's default skin
|
||||
// *
|
||||
// * @param Title $title Title to use for the extraneous request
|
||||
// * @param WebRequest|array $request A WebRequest or data to use for a FauxRequest
|
||||
// * @return RequestContext
|
||||
// */
|
||||
// public static function newExtraneousContext(Title $title, $request = []) {
|
||||
// $context = new self;
|
||||
// $context.setTitle($title);
|
||||
// if ($request instanceof WebRequest) {
|
||||
// $context.setRequest($request);
|
||||
// } else {
|
||||
// $context.setRequest(new FauxRequest($request));
|
||||
// }
|
||||
// $context.user = User::newFromName('127.0.0.1', false);
|
||||
//
|
||||
// return $context;
|
||||
// }
|
||||
}
|
@ -18,7 +18,7 @@ package gplx.xowa.mediawiki.includes.page; import gplx.*; import gplx.xowa.*; im
|
||||
/**
|
||||
* Special handling for category pages
|
||||
*/
|
||||
public class XomwWikiCategoryPage extends XomwWikiPage { public XomwWikiCategoryPage(XomwTitleOld title) {super(title);
|
||||
public class XomwWikiCategoryPage extends XomwWikiPage { public XomwWikiCategoryPage(XomwTitle title) {super(title);
|
||||
}
|
||||
//
|
||||
// /**
|
||||
|
@ -29,7 +29,7 @@ public class XomwWikiFilePage extends XomwWikiPage { // /** @var File */
|
||||
// /** @var array */
|
||||
// protected $mDupes = null;
|
||||
|
||||
public XomwWikiFilePage(XomwTitleOld title) {super(title);
|
||||
public XomwWikiFilePage(XomwTitle title) {super(title);
|
||||
// $this->mDupes = null;
|
||||
// $this->mRepo = null;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user