summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@sbcglobal.net>2015-02-25 23:38:25 -0500
committerLuke Shumaker <lukeshu@sbcglobal.net>2015-02-25 23:38:25 -0500
commitb0e5922cdadff2b394100dc8977bc2d526c04595 (patch)
treef1c19b1aaf0988cdef72f978b9f16c5d631d3727
parentad2b9dc3e492af9d550532817f34f865a97a8f63 (diff)
parentb88ab0086858470dd1f644e64cb4e4f62bb2be9b (diff)
Merge commit 'b88ab'
-rw-r--r--RELEASE-NOTES-1.2298
-rw-r--r--extensions/ConfirmEdit/Asirra.class.php55
-rw-r--r--extensions/ConfirmEdit/Asirra.i18n.php549
-rw-r--r--extensions/ConfirmEdit/Asirra.php42
-rw-r--r--extensions/ConfirmEdit/README4
-rw-r--r--extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js54
-rw-r--r--extensions/PdfHandler/CreatePdfThumbnailsJob.class.php126
-rw-r--r--extensions/PdfHandler/PdfHandler.i18n.php1186
-rw-r--r--extensions/PdfHandler/PdfHandler.image.php309
-rw-r--r--extensions/PdfHandler/PdfHandler.php64
-rw-r--r--extensions/PdfHandler/PdfHandler_body.php362
-rw-r--r--extensions/SimpleAntiSpam/SimpleAntiSpam.php5
-rw-r--r--extensions/Vector/README9
-rw-r--r--extensions/Vector/Vector.php6
-rw-r--r--includes/DefaultSettings.php23
-rw-r--r--includes/EditPage.php18
-rw-r--r--includes/ImagePage.php2
-rw-r--r--includes/OutputHandler.php6
-rw-r--r--includes/OutputPage.php63
-rw-r--r--includes/Sanitizer.php51
-rw-r--r--includes/User.php1
-rw-r--r--includes/XmlTypeCheck.php57
-rw-r--r--includes/api/ApiBase.php1
-rw-r--r--includes/api/ApiEditPage.php3
-rw-r--r--includes/api/ApiFormatJson.php14
-rw-r--r--includes/api/ApiFormatPhp.php19
-rw-r--r--includes/api/ApiMain.php2
-rw-r--r--includes/api/ApiQueryLogEvents.php8
-rw-r--r--includes/db/DatabaseOracle.php4
-rw-r--r--includes/filerepo/file/LocalFile.php2
-rw-r--r--includes/installer/Installer.php7
-rw-r--r--includes/parser/ParserOutput.php13
-rw-r--r--includes/upload/UploadBase.php104
-rw-r--r--languages/messages/MessagesEn.php6
-rw-r--r--languages/messages/MessagesQqq.php2
-rw-r--r--resources/Resources.php6
-rw-r--r--resources/mediawiki.page/mediawiki.page.image.pagination.js11
-rw-r--r--thumb.php10
38 files changed, 491 insertions, 2811 deletions
diff --git a/RELEASE-NOTES-1.22 b/RELEASE-NOTES-1.22
index be1d96a7..9d10f222 100644
--- a/RELEASE-NOTES-1.22
+++ b/RELEASE-NOTES-1.22
@@ -3,6 +3,104 @@
Security reminder: MediaWiki does not require PHP's register_globals. If you
have it on, turn it '''off''' if you can.
+== MediaWiki 1.22.15 ==
+
+This is a security and maintenance release of the MediaWiki 1.22 branch.
+
+=== Changes since 1.22.14 ===
+
+* (bug T76686) [SECURITY] thumb.php outputs wikitext message as raw HTML, which
+ could lead to xss. Permission to edit MediaWiki namespace is required to
+ exploit this.
+* (bug T77028) [SECURITY] Malicious site can bypass CORS restrictions in
+ $wgCrossSiteAJAXdomains in API calls if it only included an allowed domain as
+ part of its name.
+* (bug T74222) The original patch for T74222 was reverted as unnecessary.
+
+== MediaWiki 1.22.14 ==
+
+This is a security and maintenance release of the MediaWiki 1.22 branch.
+
+=== Changes since 1.22.13 ===
+
+* (bugs 66776, 71478) SECURITY: User PleaseStand reported a way to inject code
+ into API clients that used format=php to process pages that underwent flash
+ policy mangling. This was fixed along with improving how the mangling was done
+ for format=json, and allowing sites to disable the mangling using
+ $wgMangleFlashPolicy.
+* (bug 70901) SECURITY: User Jackmcbarn reported that the ability to update
+ the content model for a page could allow an unprivileged attacker to edit
+ another user's common.js under certain circumstances. The user right
+ "editcontentmodel" was added, and is needed to change a revision's content
+ model.
+* (bug 72222) SECURITY: Do not show log action when the entry is revdeleted with
+ DELETED_ACTION. NOTICE: this may be reverted in a future release pending a
+ public RFC about the desired functionality. This issue was reported by user
+ Bawolff.
+* (bug 71621) Make allowing site-wide styles on restricted special pages a
+ config option.
+* $wgMangleFlashPolicy was added to make MediaWiki's mangling of anything that
+ might be a flash policy directive configurable.
+
+== MediaWiki 1.22.13 ==
+
+This is a maintenance release of the MediaWiki 1.22 branch.
+
+=== Changes since 1.22.12 ===
+
+* (Bug 67440) Allow classes to be registered properly from installer
+
+== MediaWiki 1.22.12 ==
+
+This is a security release of the MediaWiki 1.22 branch.
+
+=== Changes since 1.22.11 ===
+
+* (bug 70672) SECURITY: OutputPage: Remove separation of css and js module
+ allowance.
+
+== MediaWiki 1.22.11 ==
+
+This is a security release of the MediaWiki 1.22 branch.
+
+=== Changes since 1.22.10 ===
+* (bug 69008) SECURITY: Enhance CSS filtering in SVG files. Filter <style>
+ elements; normalize style elements and attributes before filtering; add
+ checks for attributes that contain css; add unit tests for html5sec and
+ reported bugs.
+
+== MediaWiki 1.22.10 ==
+
+This is a maintenance release of the MediaWiki 1.22 branch.
+
+=== Changes since 1.22.9 ===
+
+* (bug 64970) Fix support for blobs on DatabaseOracle::update
+* (bug 60719) In MediaWiki 1.22, the job queue execution on each page
+ request was changed (Gerrit change 59797) so, instead of executing
+ the job inside the same PHP process that's rendering the page, a new
+ PHP cli command is spawned to execute runJobs.php in the
+ background. It will only work if $wgPhpCli is set to an actual path
+ or safe mode is off, otherwise, the old method will be used.
+
+ https://www.mediawiki.org/wiki/Manual:Job_queue#Changes_introduced_in_MediaWiki_1.22
+ for more infomation. This change was in earlier releases of 1.22
+ but was not noted here until now.
+
+== MediaWiki 1.22.9 ==
+
+This is a security and maintenance release of the MediaWiki 1.22 branch.
+
+=== Changes since 1.22.8 ===
+
+* (bug 68187) SECURITY: Prepend jsonp callback with comment.
+* (bug 66608) SECURITY: Fix for XSS issue in bug 66608: Generate the URL used
+ for loading a new page in Javascript,instead of relying on the URL in the link
+ that has been clicked.
+* (bug 65778) SECURITY: Copy prevent-clickjacking between OutputPage and
+ ParserOutput.
+* (bug 59147) The img_metadata field was not being decoded from bytea into text.
+
== MediaWiki 1.22.8 ==
This is a security and maintenance release of the MediaWiki 1.22 branch.
diff --git a/extensions/ConfirmEdit/Asirra.class.php b/extensions/ConfirmEdit/Asirra.class.php
deleted file mode 100644
index ae1178a1..00000000
--- a/extensions/ConfirmEdit/Asirra.class.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-/**
- * @author Bachsau
- * @author Niklas Laxström
- */
-
-class Asirra extends SimpleCaptcha {
- public $asirra_clientscript = '//challenge.asirra.com/js/AsirraClientSide.js';
-
- // As we don't have to store anything but some other things to do,
- // we're going to replace that constructor completely.
- function __construct() {
- global $wgExtensionAssetsPath;
- $this->asirra_localpath = "$wgExtensionAssetsPath/ConfirmEdit";
- }
-
- function getForm() {
- global $wgOut;
-
- $wgOut->addModules( 'ext.confirmEdit.asirra' );
- $js = Html::linkedScript( $this->asirra_clientscript );
-
- $message = Xml::encodeJsVar( wfMessage( 'asirra-createaccount-fail' )->plain() );
- $js .= Html::inlineScript( <<<JAVASCRIPT
-var asirra_js_failed = '$message';
-JAVASCRIPT
- );
- $js .= '<noscript>' . wfMessage( 'asirra-nojs' )->parse() . '</noscript>';
- return $js;
- }
-
- function getMessage( $action ) {
- $name = 'asirra-' . $action;
- $text = wfMessage( $name )->text();
- # Obtain a more tailored message, if possible, otherwise, fall
- # back to the default for edits
- return wfMessage( $name, $text )->isDisabled() ? wfMessage( 'asirra-edit' )->text() : $text;
- }
-
- function passCaptcha() {
- global $wgRequest;
-
- $ticket = $wgRequest->getVal( 'Asirra_Ticket' );
- $api = 'http://challenge.asirra.com/cgi/Asirra?';
- $params = array(
- 'action' => 'ValidateTicket',
- 'ticket' => $ticket,
- );
-
- $response = Http::get( $api . wfArrayToCgi( $params ) );
- $xml = simplexml_load_string( $response );
- $result = $xml->xpath( '/AsirraValidation/Result' );
- return strval( $result[0] ) === 'Pass';
- }
-}
diff --git a/extensions/ConfirmEdit/Asirra.i18n.php b/extensions/ConfirmEdit/Asirra.i18n.php
deleted file mode 100644
index 23190c29..00000000
--- a/extensions/ConfirmEdit/Asirra.i18n.php
+++ /dev/null
@@ -1,549 +0,0 @@
-<?php
-/**
- * Internationalisation file for the Asirra module of the ConfirmEdit
- * extension.
- *
- * @file
- * @ingroup Extensions
- */
-
-$messages = array();
-
-$messages['en'] = array(
- 'asirra-desc' => 'Asirra module for ConfirmEdit',
- 'asirra-edit' => 'To protect the wiki against automated edit spam, we kindly ask you to select just the cat photos in the box below:',
- 'asirra-addurl' => 'Your edit includes new external links. To protect the wiki against automated edit spam, we kindly ask you to select just the cat photos in the box below:',
- 'asirra-badlogin' => 'To protect the wiki against automated password cracking, we kindly ask you to select just the cat photos in the box below:',
- 'asirra-createaccount' => 'To protect the wiki against automated account creation, we kindly ask you to select just the cat photos in the box below:',
- 'asirra-createaccount-fail' => "Please correctly identify the cats.",
- 'asirra-create' => 'To protect the wiki against automated page creation, we kindly ask you to select just the cat photos in the box below:',
- 'asirra-nojs' => '\'\'\'Please enable JavaScript and resubmit the page.\'\'\'',
- 'asirra-failed' => 'Please identify all cat images',
-);
-
-/** Message documentation (Message documentation)
- * @author 2nd-player
- * @author Beta16
- * @author Raymond
- * @author Shirayuki
- */
-$messages['qqq'] = array(
- 'asirra-desc' => '{{desc|name=Asirra|url=http://www.mediawiki.org/wiki/Extension:Asirra}}',
- 'asirra-edit' => '{{Related|ConfirmEdit-edit}}',
- 'asirra-addurl' => '{{Related|ConfirmEdit-addurl}}',
- 'asirra-badlogin' => '{{Related|ConfirmEdit-badlogin}}',
- 'asirra-createaccount' => '{{Related|ConfirmEdit-createaccount}}',
- 'asirra-createaccount-fail' => 'Used as failure message in JavaScript code.
-{{Related|ConfirmEdit-createaccount-fail}}',
- 'asirra-create' => '{{Related|ConfirmEdit-create}}',
- 'asirra-nojs' => 'Used in HTML <code><nowiki><noscript></nowiki></code> tag.',
- 'asirra-failed' => 'Used as alert message in JavaScript code.',
-);
-
-/** Asturian (asturianu)
- * @author Xuacu
- */
-$messages['ast'] = array(
- 'asirra-desc' => 'Módulu Asirra pa ConfirmEdit',
- 'asirra-edit' => "Pa protexer la wiki escontra'l spam d'edición automáticu, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
- 'asirra-addurl' => "La so edición incluye enllaces esternos nuevos. Pa protexer la wiki escontra'l spam automáticu, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
- 'asirra-badlogin' => "Pa protexer la wiki escontra'l frayamientu de claves automáticu, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
- 'asirra-createaccount' => "Pa protexer la wiki escontra la creación de cuentes automática, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
- 'asirra-createaccount-fail' => 'Identifique correutamente los gatos.',
- 'asirra-create' => "Pa protexer la wiki escontra la creación de páxines automática, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
- 'asirra-nojs' => "'''Por favor active JavaScript y vuelva a unviar la páxina.'''",
- 'asirra-failed' => 'Identifique toles imaxes de gatos',
-);
-
-/** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
- * @author EugeneZelenko
- * @author Jim-by
- * @author Wizardist
- */
-$messages['be-tarask'] = array(
- 'asirra-desc' => 'Модуль Asirra для ConfirmEdit',
- 'asirra-edit' => 'Для абароны супраць спаму, калі ласка, выберыце толькі фота з катом ў полі ніжэй:', # Fuzzy
- 'asirra-addurl' => 'Вашае рэдагаваньне ўтрымлівае новыя вонкавыя спасылкі. Для абароны супраць спаму, калі ласка, выберыце толькі фота з катом ў полі ніжэй:', # Fuzzy
- 'asirra-badlogin' => 'Для абароны супраць аўтаматычнага падбору паролю, калі ласка, выберыце толькі фота з катом ў полі ніжэй:', # Fuzzy
- 'asirra-createaccount' => 'Для абароны супраць аўтаматычнага стварэньня рахункаў, калі ласка, выберыце толькі фота з катом ў полі ніжэй:', # Fuzzy
- 'asirra-createaccount-fail' => 'Калі ласка, слушна выберыце катоў.',
- 'asirra-create' => 'Для абароны супраць аўтаматычнага стварэньня старонак, калі ласка, выберыце толькі фота з катом ў полі ніжэй:', # Fuzzy
- 'asirra-nojs' => "'''Калі ласка, дазвольце JavaScript і дашліце старонку зноў.'''",
- 'asirra-failed' => 'Калі ласка, вызначце ўсе выявы з катамі',
-);
-
-/** Breton (brezhoneg)
- * @author Fohanno
- */
-$messages['br'] = array(
- 'asirra-nojs' => "'''Gweredekait JavaScript, mar plij, hag adkasit ar bajenn.'''",
-);
-
-/** Czech (česky)
- * @author Vks
- */
-$messages['cs'] = array(
- 'asirra-createaccount-fail' => 'Prosíme, správně identifikujte kočky.',
-);
-
-/** German (Deutsch)
- * @author Kghbln
- * @author Metalhead64
- */
-$messages['de'] = array(
- 'asirra-desc' => 'Ermöglicht die Nutzung des Anti-Spam-Moduls Asirra',
- 'asirra-edit' => 'Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
- 'asirra-addurl' => 'Deine Bearbeitung enthält neue externe Links. Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
- 'asirra-badlogin' => 'Zum Schutz des Wikis gegen automatisiertes Knacken von Passwörtern bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
- 'asirra-createaccount' => 'Zum Schutz des Wikis gegen automatisiertes Erstellen von Benutzerkonten bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
- 'asirra-createaccount-fail' => 'Bitte wähle nur die Fotos mit Katzen aus.',
- 'asirra-create' => 'Zum Schutz des Wikis gegen automatisiertes Erstellen von Seiten bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
- 'asirra-nojs' => "'''Bitte JavaScript aktivieren und die Seiten nochmals Speichern.'''",
- 'asirra-failed' => 'Bitte wähle nur die Fotos mit Katzen aus.',
-);
-
-/** German (formal address) (Deutsch (Sie-Form)‎)
- * @author Kghbln
- */
-$messages['de-formal'] = array(
- 'asirra-addurl' => 'Ihre Bearbeitung enthält neue externe Links. Zum Schutz vor automatisiertem Spam bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:', # Fuzzy
- 'asirra-badlogin' => 'Zum Schutz gegen automatisiertes Knacken von Passwörtern bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:', # Fuzzy
- 'asirra-createaccount' => 'Zum Schutz gegen automatisiertes Erstellen von Benutzerkonten bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:', # Fuzzy
- 'asirra-createaccount-fail' => 'Bitte wählen Sie nur die Fotos mit Katzen aus.',
- 'asirra-create' => 'Zum Schutz gegen automatisiertes Erstellen von Seiten bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:', # Fuzzy
- 'asirra-failed' => 'Bitte wählen Sie nur die Fotos mit Katzen aus.',
-);
-
-/** Zazaki (Zazaki)
- * @author Erdemaslancan
- */
-$messages['diq'] = array(
- 'asirra-desc' => 'Qandê Asirra modulê RaştkerdenVurnen',
-);
-
-/** Spanish (español)
- * @author Armando-Martin
- */
-$messages['es'] = array(
- 'asirra-desc' => 'Módulo de Asirra para ConfirmEdit',
- 'asirra-edit' => 'Para ayudar a protegernos contra el spam de edición automática, seleccione sólo las fotos de gatos en el cuadro siguiente:', # Fuzzy
- 'asirra-addurl' => 'Su edición incluye nuevos enlaces externos. Para ayudar a protegernos contra el spam automatizado, por favor, seleccione solo las fotos de gato en el cuadro siguiente:', # Fuzzy
- 'asirra-badlogin' => 'Para ayudar a protegernos del robo automatizado de contraseñas, seleccione sólo las fotos de gatos en el cuadro siguiente:', # Fuzzy
- 'asirra-createaccount' => 'Para ayudar a protegernos contra la creación automatizada de cuentas, seleccione sólo las fotos de gato en el cuadro siguiente:', # Fuzzy
- 'asirra-createaccount-fail' => 'Identifique correctamente los gatos.',
- 'asirra-create' => 'Para ayudar a protegernos contra la creación automática de páginas, seleccione sólo las fotos de gato en el cuadro siguiente:', # Fuzzy
- 'asirra-nojs' => "'''Por favor active JavaScript y vuelva a la página.'''",
- 'asirra-failed' => 'Identifique todas las imágenes de gatos',
-);
-
-/** Finnish (suomi)
- * @author VezonThunder
- */
-$messages['fi'] = array(
- 'asirra-desc' => 'Asirra-moduuli muokkauksen varmennukseen',
- 'asirra-edit' => 'Suojana automaattisia roskamuokkauksia vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
- 'asirra-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä. Suojana automaattista roskapostia vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
- 'asirra-badlogin' => 'Suojana automaattisia salasanamurtoja vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
- 'asirra-createaccount' => 'Suojana automaattista tunnusten luontia vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
- 'asirra-createaccount-fail' => 'Tunnista kissat.',
- 'asirra-create' => 'Suojana automaattista sivujen luontia vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
- 'asirra-nojs' => "'''Salli JavaScript ja lähetä uudelleen.'''",
- 'asirra-failed' => 'Tunnista kaikki kissan kuvat',
-);
-
-/** French (français)
- * @author Gomoko
- * @author Nicolas NALLET
- * @author Seb35
- */
-$messages['fr'] = array(
- 'asirra-desc' => 'Module Asirra pour ConfirmEdit',
- 'asirra-edit' => 'Pour protéger le wiki contre le spam d’édition automatique, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
- 'asirra-addurl' => 'Votre édition contient des liens externes. Pour protéger le wiki contre le spam de modification automatique, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
- 'asirra-badlogin' => 'Pour protéger le wiki des essais automatiques de cassage de mot de passe, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
- 'asirra-createaccount' => 'Pour protéger le wiki contre la création automatique de comptes, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
- 'asirra-createaccount-fail' => 'Veuillez identifier correctement les chats.',
- 'asirra-create' => 'Pour protéger le wiki contre la création automatique de pages, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
- 'asirra-nojs' => "'''Veuillez activer le JavaScript et re-soumettre la page.'''",
- 'asirra-failed' => 'Veuillez identifier toutes les images de chat',
-);
-
-/** Galician (galego)
- * @author Toliño
- */
-$messages['gl'] = array(
- 'asirra-desc' => 'Módulo Asirra para ConfirmEdit',
- 'asirra-edit' => 'Para protexer o wiki contra o spam automático, seleccione só as fotos de gatos na caixa:',
- 'asirra-addurl' => 'A súa edición inclúe novas ligazóns externas. Para protexer o wiki contra o spam automático, seleccione só as fotos de gatos na caixa:',
- 'asirra-badlogin' => 'Para protexer o wiki contra o roubo de contrasinais, seleccione só as fotos de gatos na caixa:',
- 'asirra-createaccount' => 'Para protexer o wiki contra a creación automática de contas, seleccione só as fotos de gatos na caixa:',
- 'asirra-createaccount-fail' => 'Identifique correctamente os gatos.',
- 'asirra-create' => 'Para protexer o wiki contra a creación automática de páxinas, seleccione só as fotos de gatos na caixa:',
- 'asirra-nojs' => "'''Active o JavaScript e volva enviar a páxina.'''",
- 'asirra-failed' => 'Identifique todas as fotos de gatos',
-);
-
-/** Upper Sorbian (hornjoserbsce)
- * @author Michawiki
- */
-$messages['hsb'] = array(
- 'asirra-desc' => 'Modul Asirra za ConfirmEdit',
- 'asirra-edit' => 'Za škit přećiwo awtomatizowanemu spamej, prošu wubjer jenož fota kóčkow w slědowacym polu:', # Fuzzy
- 'asirra-addurl' => 'Twoja změna wobsahuje nowe eksterne wotkazy. Za škit přećiwo awtomatizowanemu spamej, prošu wubjer jenož fota kóčkow w slědowacym polu:', # Fuzzy
- 'asirra-badlogin' => 'Za škit přećiwo awtomatizowanemu złamanju hesłow, prošu wubjer jenož fota kóčkow w slědowacym polu:', # Fuzzy
- 'asirra-createaccount' => 'Za škit přećiwo awtomatiskemu wutworjenju konta, prošu wubjer jenož fota kóčkow w slědowacym polu:', # Fuzzy
- 'asirra-createaccount-fail' => 'Prošu identifikuj kóčki.',
- 'asirra-create' => 'Za škit přećiwo awtomatiskemu wutworjenju strony, prošu wubjer jenož fota kóčkow w slědowacym polu:', # Fuzzy
- 'asirra-nojs' => "'''Prošu zmóžń JavaScript a składuj stronu hišće raz.'''",
- 'asirra-failed' => 'Prošu identifikuj wšě wobrazy z kóčkami',
-);
-
-/** Interlingua (interlingua)
- * @author McDutchie
- */
-$messages['ia'] = array(
- 'asirra-desc' => 'Modulo de Asirra pro ConfirmEdit',
- 'asirra-edit' => 'Pro adjutar a proteger le wiki contra le spam automatisate, per favor selige solmente le photos de cattos in le quadro sequente:',
- 'asirra-addurl' => 'Iste modification include nove ligamines externe. Pro adjutar a proteger le wiki contra le spam automatisate, per favor selige solmente le photos de cattos in le quadro sequente:',
- 'asirra-badlogin' => 'Pro adjutar a proteger le wiki contra le furto automatisate de contrasignos, per favor selige solmente le photos de cattos in le quadro sequente:',
- 'asirra-createaccount' => 'Pro adjutar a proteger le wiki contra le creation automatisate de contos, per favor selige solmente le photos de cattos in le quadro sequente:',
- 'asirra-createaccount-fail' => 'Per favor identifica correctemente le cattos.',
- 'asirra-create' => 'Pro adjutar a proteger le wiki contra le creation automatisate de paginas, per favor selige solmente le photos de cattos in le quadro sequente:',
- 'asirra-nojs' => "'''Per favor activa JavaScript e resubmitte le pagina.'''",
- 'asirra-failed' => 'Per favor identifica tote le imagines de cattos',
-);
-
-/** Italian (italiano)
- * @author Beta16
- */
-$messages['it'] = array(
- 'asirra-desc' => 'Modulo ASIRRA per ConfirmEdit',
- 'asirra-edit' => 'Per proteggere il wiki dalle modifiche automatiche che aggiungono spam, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
- 'asirra-addurl' => 'La tua modifica aggiunge qualche nuovo collegamento esterno. Per proteggere il wiki dallo spam automatico, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
- 'asirra-badlogin' => 'Per proteggere il wiki dalla forzatura automatica delle password, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
- 'asirra-createaccount' => 'Per proteggere il wiki dalla creazione automatica di nuovi accessi, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
- 'asirra-createaccount-fail' => 'Identifica correttamente i gatti.',
- 'asirra-create' => 'Per proteggere il wiki dalla creazione automatica di pagine, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
- 'asirra-nojs' => "'''Attiva JavaScript ed invia di nuovo la pagina.'''",
- 'asirra-failed' => 'Identifica tutte le immagini di gatti',
-);
-
-/** Japanese (日本語)
- * @author 2nd-player
- * @author Shirayuki
- */
-$messages['ja'] = array(
- 'asirra-desc' => 'ConfirmEdit 用 Asirra モジュール',
- 'asirra-edit' => 'ウィキでの自動編集のスパム攻撃を防ぐため、お手数をおかけしますが猫が写っている画像を以下から選択してください:',
- 'asirra-addurl' => 'あなたは新しい外部リンクを追加しようとしています。ウィキへの自動スパム攻撃を防ぐため、お手数をおかけしますが猫が写っている画像を以下から選択してください:',
- 'asirra-badlogin' => 'ウィキへの自動パスワードクラック攻撃を防ぐため、お手数をおかけしますが猫が写っている画像を以下から選択してください:',
- 'asirra-createaccount' => 'ウィキでのアカウント自動作成を防ぐため、お手数をおかけしますが猫が写っている画像を以下から選択してください:',
- 'asirra-createaccount-fail' => '猫を正しく選択してください。',
- 'asirra-create' => 'ウィキでのページ自動作成を防ぐため、お手数をおかけしますが猫が写っている画像を以下から選択してください:',
- 'asirra-nojs' => "'''JavaScript を有効にしてページを再読込してください。'''",
- 'asirra-failed' => '猫が写っている画像をすべて選択してください',
-);
-
-/** Korean (한국어)
- * @author 아라
- */
-$messages['ko'] = array(
- 'asirra-desc' => 'ConfirmEdit에 대한 Asirra 모듈',
- 'asirra-edit' => '자동화된 편집 스팸으로부터 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:', # Fuzzy
- 'asirra-addurl' => '편집에 새로운 바깥 링크가 포함되어 있습니다. 자동화된 스팸으로부터 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:', # Fuzzy
- 'asirra-badlogin' => '비밀번호 깨기로부터 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:', # Fuzzy
- 'asirra-createaccount' => '자동화된 계정 만들기로부터 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:', # Fuzzy
- 'asirra-createaccount-fail' => '고양이를 올바르게 선택하세요.',
- 'asirra-create' => '자동화된 문서 만들기로부터 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:', # Fuzzy
- 'asirra-nojs' => "'''자바스크립트를 활성화하고 문서를 다시 제출하세요.'''",
- 'asirra-failed' => '고양이 그림을 모두 선택하세요',
-);
-
-/** Colognian (Ripoarisch)
- * @author Purodha
- */
-$messages['ksh'] = array(
- 'asirra-desc' => 'Dä Zohsaz <i lang="en">Asirra</i> för et Zohsazprojramm <i lang="en">ConfirmEdit</i>.',
- 'asirra-edit' => 'Heh dat Wiki well sesch jääje <i lang="en">SPAM</i> schöze. Dröm moß mer beim Ändere noch en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
- 'asirra-addurl' => 'Heh dat Wiki well sesch jääje <i lang="en">SPAM</i> schöze. Dröm moß mer, wam_mer lengks noh ußerhallef enfööje well, noch en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
- 'asirra-badlogin' => 'Heh dat Wiki well sesch jääje et automattesche Paßwoot_Knacke schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
- 'asirra-createaccount' => 'Heh dat Wiki well sesch jääje automattesch aanjelaate „Metmaacher“ schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
- 'asirra-createaccount-fail' => 'Bes esu jood un don de Kazebelder ußwähle.',
- 'asirra-create' => 'Heh dat Wiki well sesch jääje automattesch neu aanjelaate Sigge schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
- 'asirra-nojs' => "'''Bes esu jood un donn JavaSkrep en Dingem Brauser aanschallde un scheck heh di Sigg norr_ens af.'''",
- 'asirra-failed' => 'Bes esu jood un don all de Kazebelder ußwähle.',
-);
-
-/** Luxembourgish (Lëtzebuergesch)
- * @author Robby
- */
-$messages['lb'] = array(
- 'asirra-desc' => 'Asirra-Modul fir ConfirmEdit',
- 'asirra-edit' => "Fir d'Wiki géint automatiséierte Spam ze schützen froe mir Iech just d'Fotoe mat Kazen, déi Dir an der Këscht ënnendrënner gesitt, erauszesichen:",
- 'asirra-addurl' => "An Ärer Ännerung sinn nei extern Linken. Fir d'Wiki géint automatiséierte Spam ze schützen, froe mir Iech d'Kategorie vun de Fotoen an der Këscht ënnendrënner erauszesichen:",
- 'asirra-createaccount-fail' => "Identifizéiert d'Kaze w.e.g. richteg.",
- 'asirra-nojs' => "'''Aktivéiert w.e.g. JavaScript a schéckt d'Säit nachemol.'''",
- 'asirra-failed' => 'Identifizéiert w.e.g. all Biller wou Kazen drop sinn',
-);
-
-/** Macedonian (македонски)
- * @author Bjankuloski06
- */
-$messages['mk'] = array(
- 'asirra-desc' => 'Asirra-модул за ПотврдиУредување',
- 'asirra-edit' => 'Како заштитна мерка против автоматизиран спам, би ве замолиле да ги изберете само сликите со мачка прикажани во полето:',
- 'asirra-addurl' => 'Во вашите измени има нови надворешни врски. Како заштитна мерка против автоматизиран спам, би ве замолиле да ги изберете само сликите со мачка прикажани во полето:',
- 'asirra-badlogin' => 'Како заштитна мерка против автоматизирано провалување на лозинки, би ве замолиле да ги изберете само сликите со мачка прикажани во полето:',
- 'asirra-createaccount' => 'Како заштитна мерка против автоматизирано создавање на сметки, би ве замолиле да ги изберете само сликите со мачка прикажани во полето:',
- 'asirra-createaccount-fail' => 'Посочете кои од следниве се мачки.',
- 'asirra-create' => 'Како заштитна мерка против автоматизирано создавање на страници, би ве замолиле да ги изберете само сликите со мачка прикажани во полето:',
- 'asirra-nojs' => "'''Овозможете JavaScript и поднесете ја страницата повторно.'''",
- 'asirra-failed' => 'Изберете ги сликите што имаат мачка',
-);
-
-/** Malay (Bahasa Melayu)
- * @author Anakmalaysia
- */
-$messages['ms'] = array(
- 'asirra-desc' => 'Modul Asirra untuk ConfirmEdit',
- 'asirra-edit' => 'Untuk mencegah suntingan spam automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
- 'asirra-addurl' => 'Suntingan anda mengandungi pautan luar yang baru. Untuk mencegah spam janaan automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
- 'asirra-badlogin' => 'Untuk mencegah pemecahan kata laluan automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
- 'asirra-createaccount' => 'Untuk mencegah pembukaan akaun automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
- 'asirra-createaccount-fail' => 'Sila kenal pasti kucing-kucing dengan betul.',
- 'asirra-create' => 'Untuk mencegah pembukaan halaman automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
- 'asirra-nojs' => "'''Sila hidupkan JavaScript dan hantar semula halaman ini.'''",
- 'asirra-failed' => 'Sila kenal pasti semua gambar kucing',
-);
-
-/** Maltese (Malti)
- * @author Chrisportelli
- */
-$messages['mt'] = array(
- 'asirra-desc' => 'Modulu ASIRRA għal ConfirmEdit',
- 'asirra-edit' => "Sabiex tgħinna nipproteġu kontra l-modifiki li jżidu spam, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
- 'asirra-addurl' => "Il-modifika tiegħek tinkludi ħoloq esterni ġodda. Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
- 'asirra-badlogin' => "Sabiex tgħinna nipproteġu kontra l-infurzar awtomatiku tal-passwords, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
- 'asirra-createaccount' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' kontijiet ġodda, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
- 'asirra-createaccount-fail' => 'Sib il-qtates.',
- 'asirra-create' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' paġni, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
- 'asirra-nojs' => "'''Jekk jogħġbok attiva l-JavaScript u erġa' ibgħat din il-paġna.'''",
- 'asirra-failed' => 'Sib l-istampi kollha tal-qtates',
-);
-
-/** Norwegian Bokmål (norsk bokmål)
- * @author Event
- */
-$messages['nb'] = array(
- 'asirra-desc' => 'Assirra-modulen for ConfirmEdit',
- 'asirra-edit' => 'Som beskyttelse mot automatisk redigert spam, vennligst velg kun kattebildene i boksen under:', # Fuzzy
- 'asirra-addurl' => 'Din redigering inneholder nye eksterne lenker. Som beskyttelse mot automatisk redigert spam, vennligst velg kun kattebildene i boksen under:', # Fuzzy
- 'asirra-badlogin' => 'Som beskyttelse mot automatisk passordknekking, vennligst velg kun kattebildene i boksen under:', # Fuzzy
- 'asirra-createaccount' => 'Som beskyttelse mot automatisk opprettelse av brukerkonto, vennligst velg kun kattebildene i boksen under:', # Fuzzy
- 'asirra-createaccount-fail' => 'Vennligst angi hva som er katter.',
- 'asirra-create' => 'Som beskyttelse mot automatisk opprettelse av sider, vennligst velg kun kattebildene i boksen under:', # Fuzzy
- 'asirra-nojs' => "'''Vennligst åpne for JavaScript og lagre siden en gang til.'''",
- 'asirra-failed' => 'Vennligst merk alle kattebilder',
-);
-
-/** Dutch (Nederlands)
- * @author HanV
- * @author SPQRobin
- * @author Siebrand
- */
-$messages['nl'] = array(
- 'asirra-desc' => 'Asirra-module voor ConfirmEdit',
- 'asirra-edit' => 'Kies ter bescherming tegen geautomatiseerde spam de afbeeldingen met een poes in het onderstaande venster:',
- 'asirra-addurl' => "Uw bewerking bevat nieuwe externe koppelingen. Selecteer de foto's van katten in het vak hieronder om de wiki te beschermen tegen geautomatiseerde spam:",
- 'asirra-badlogin' => 'Kies ter bescherming tegen het automatisch kraken van wachtwoorden de afbeeldingen met een poes in het onderstaande venster:',
- 'asirra-createaccount' => 'Kies om het automatisch aanmaken van gebruikers tegen te gaan de afbeeldingen met een poes in het onderstaande venster:',
- 'asirra-createaccount-fail' => 'Identificeer de katten juist.',
- 'asirra-create' => 'Kies om het automatisch aanmaken van een pagina tegen te gaan de afbeeldingen met een poes in het onderstaande venster:',
- 'asirra-nojs' => "'''Schakel JavaScript in en probeer de pagina opnieuw op te slaan.'''",
- 'asirra-failed' => 'Identificeer alle afbeeldingen van katten.',
-);
-
-/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
- * @author Siebrand
- */
-$messages['nl-informal'] = array(
- 'asirra-addurl' => "Je bewerking bevat nieuwe externe koppelingen. Selecteer de foto's van katten in het vak hieronder om te helpen beschermen tegen geautomatiseerde spam:", # Fuzzy
-);
-
-/** Polish (polski)
- * @author BeginaFelicysym
- */
-$messages['pl'] = array(
- 'asirra-desc' => 'Moduł Asirra dla ConfirmEdit',
- 'asirra-edit' => 'Aby uchronić się przed automatami wprowadzającymi spam, proszę wybrać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
- 'asirra-addurl' => 'Wprowadzony przez ciebie tekst zawiera linki zewnętrzne. Aby uchronić nas przed automatycznym spamem, proszę wskazać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
- 'asirra-badlogin' => 'Aby uchronić się przed zautomatyzowanym łamaniem haseł, proszę wybrać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
- 'asirra-createaccount' => 'Aby uchronić się przed automatycznym tworzeniem kont, proszę wybrać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
- 'asirra-createaccount-fail' => 'Prosimy prawidłowo zidentyfikować koty.',
- 'asirra-create' => 'Aby uchronić się przed automatycznym tworzeniem stron, proszę wybrać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
- 'asirra-nojs' => "'''Prosimy włączyć obsługę języka JavaScript i ponowne przesłanie strony.'''",
- 'asirra-failed' => 'Prosimy wskazać wszystkie obrazy kotów',
-);
-
-/** Piedmontese (Piemontèis)
- * @author Borichèt
- * @author Dragonòt
- */
-$messages['pms'] = array(
- 'asirra-desc' => 'Mòdul Asirra për ConfirmEdit',
- 'asirra-edit' => "Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:", # Fuzzy
- 'asirra-addurl' => "Soa modìfica a conten dle liure esterne neuve. Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:", # Fuzzy
- 'asirra-badlogin' => "Për giuté a protege contra la forsadura automatisà ëd le ciav, për piasì ch'a selession-a mach la fòto dël gat ant ël quàder sì-sota:", # Fuzzy
- 'asirra-createaccount' => "Për giuté a protege contra la creassion automatisà ëd cont, për piasì ch'a selession-a mach la fòto dël gat ant ël quàder sì-sota:", # Fuzzy
- 'asirra-createaccount-fail' => 'Për piasì identifica coretament ij gat.',
- 'asirra-create' => "Për giuté a protege contra la creassion automatisà ëd pàgine, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:", # Fuzzy
- 'asirra-nojs' => "'''Për piasì, ch'a abìlita JavaScript e ch'a spedissa torna la pàgina.'''",
- 'asirra-failed' => 'Për piasì identìfica tute le figure ëd gat',
-);
-
-/** Portuguese (português)
- * @author Hamilton Abreu
- * @author Luckas
- */
-$messages['pt'] = array(
- 'asirra-desc' => 'Módulo Asirra para o ConfirmEdit',
- 'asirra-edit' => "Como prevenção contra sistemas automatizados de inserção de ''spam'', selecione só as fotografias de gatos na caixa abaixo:", # Fuzzy
- 'asirra-addurl' => "A sua edição contém links externos novos. Como prevenção contra sistemas automatizados de inserção de ''spam'', selecione só as fotografias de gatos na caixa abaixo:", # Fuzzy
- 'asirra-badlogin' => 'Como prevenção com sistemas automatizados de descoberta de palavras-chave, selecione só as fotografias de gatos na caixa abaixo:', # Fuzzy
- 'asirra-createaccount' => 'Como prevenção contra sistemas automatizados de criação de contas, selecione só as fotografias de gatos na caixa abaixo:', # Fuzzy
- 'asirra-createaccount-fail' => 'Identifique corretamente os gatos, por favor.',
- 'asirra-create' => 'Como prevenção contra sistemas automatizados de criação de páginas, selecione só as fotografias de gatos na caixa abaixo:', # Fuzzy
- 'asirra-nojs' => "'''Possibilite o uso de JavaScript e reenvie a página, por favor.'''",
-);
-
-/** tarandíne (tarandíne)
- * @author Joetaras
- */
-$messages['roa-tara'] = array(
- 'asirra-desc' => 'Module Asirra pe confermà le cangiaminde',
- 'asirra-edit' => "Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scacchie ìa categorije de le fote jndr'à buatte aqquà sotte:", # Fuzzy
- 'asirra-addurl' => "Le cangiaminde tune 'ngludone collegaminde de fore nuève. Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scacchie 'a categorije d'a fote 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
- 'asirra-badlogin' => "Pe darne 'na màne a proteggere condre le futteminde automatece de le passuord, pe piacere scacchie 'a categorije de le fote jndr'à buatte aqquà sotte:", # Fuzzy
- 'asirra-createaccount' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le cunde, pe piacere scacchie 'a categorije de le fote jndr'à buatte aqquà sotte:", # Fuzzy
- 'asirra-createaccount-fail' => 'Pe piacere idendifiche correttamende le categorije.',
- 'asirra-create' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le pàggene, pe piacere scacchie 'a categorije de le fote jndr'à buatte aqquà sotte:", # Fuzzy
- 'asirra-nojs' => "'''Pe piacere abbilite JavaScript e conferme arrete 'a pàgene.'''",
- 'asirra-failed' => 'Pe piacere idendifiche tutte le categorije de le immaggine',
-);
-
-/** Russian (русский)
- * @author DCamer
- * @author Lockal
- * @author Okras
- */
-$messages['ru'] = array(
- 'asirra-desc' => 'Модуль Asirra для ConfirmEdit',
- 'asirra-edit' => 'В целях защиты проекта от автоматического спама в правках, просим вас выбрать среди нижеприведённых изображений только фотографии кошек:',
- 'asirra-addurl' => 'Ваша правка содержит новые внешние ссылки. В целях защиты проекта от автоматического спама в правках просим вас выбрать среди нижеприведённых изображений только фотографии кошек:',
- 'asirra-badlogin' => 'В целях защиты от автоматического подбора пароля просим вас выбрать среди нижеприведённых изображений только фотографии кошек:',
- 'asirra-createaccount' => 'В целях защиты от автоматического создания учётных записей просим вас выбрать среди нижеприведённых изображений только фотографии кошек:',
- 'asirra-createaccount-fail' => 'Пожалуйста правильно идентифицируйте котов.',
- 'asirra-create' => 'В целях защиты от автоматического создания страниц просим вас выбрать среди нижеприведённых изображений только фотографии кошек:',
- 'asirra-nojs' => "'''Пожалуйста, включите JavaScript и обновите страницу.'''",
- 'asirra-failed' => 'Пожалуйста, идентифицируйте все фотографии кота',
-);
-
-/** Sinhala (සිංහල)
- * @author පසිඳු කාවින්ද
- */
-$messages['si'] = array(
- 'asirra-desc' => 'ConfirmEdit සඳහා Asirra මොඩියුලය',
- 'asirra-failed' => 'කරුණාකර සියලුම cat පින්තූරයන් හඳුනාගන්න',
-);
-
-/** Swedish (svenska)
- * @author Jopparn
- * @author Rotsee
- * @author WikiPhoenix
- */
-$messages['sv'] = array(
- 'asirra-edit' => 'För att skydda wikin mot spam ber vi dig att markera de fotografier som föreställer katter i rutan nedan:',
- 'asirra-addurl' => 'Din redigering innehåller nya externa länkar. För att skydda wikin mot automatiserat redigerings-spam ber vi dig att endast markera fotografierna på katter i rutan nedan:',
- 'asirra-badlogin' => 'För att skydda wikin mot automatiserade försök att knäcka lösenord ber vi dig att endast markera fotografierna på katter i rutan nedan:',
- 'asirra-createaccount' => 'För att skydda wikin mot automatiserat kontoskapande ber vi dig att endast markera fotografierna på katter i rutan nedan:',
- 'asirra-create' => 'För att skydda wikin mot automatiserat sidskapande ber vi dig att endast markera fotografierna på katter i rutan nedan:',
- 'asirra-nojs' => "'''Var god aktivera JavaScript och hämta sidan igen.'''",
- 'asirra-failed' => 'Var god identifiera alla kattbilder',
-);
-
-/** Tagalog (Tagalog)
- * @author AnakngAraw
- */
-$messages['tl'] = array(
- 'asirra-desc' => 'Modyul ng Asirra para sa ConfirmEdit',
- 'asirra-edit' => 'Upang makatulong sa pagprutekta laban sa kusang basurang pamamatnugot, paki piliin iyong mga litrato lamang ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
- 'asirra-addurl' => 'Ang pagbabago mo ay nagsasama ng bagong panlabas na mga kawing. Upang makatulong sa pagprutekta laban sa kusang paglusob ng basurang-liham, paki piliin iyong mga litrato lamang ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
- 'asirra-badlogin' => 'Upang makatulong sa pagprutekta laban sa kusang pag-alam ng hudyat, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
- 'asirra-createaccount' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng akawnt, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
- 'asirra-createaccount-fail' => 'Paki kilalanin ng tama ang mga pusa.',
- 'asirra-create' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng pahina, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
- 'asirra-nojs' => "'''Paki paganahin ang JavaScript at muling ipasa ang pahina.'''",
- 'asirra-failed' => 'Paki kilalanin ang lahat ng mga imahe ng pusa',
-);
-
-/** Ukrainian (українська)
- * @author Andriykopanytsia
- * @author Base
- */
-$messages['uk'] = array(
- 'asirra-desc' => 'Модуль Asirra для ConfirmEdit',
- 'asirra-edit' => 'З метою захисту вікі від автоматичного спаму у статтях, просимо вас обрати фотографії кота, у блоці нижче:',
- 'asirra-addurl' => 'Ваше повідомлення включає нові зовнішні посилання. З метою захисту вікі проти автоматичного спаму у статтях, просимо вас обрати фотографії кота, у блоці нижче:',
- 'asirra-badlogin' => 'З метою захисту вікі проти автоматичного підбору паролю, просимо вас обрати фотографії кота у блоці нижче:',
- 'asirra-createaccount' => 'З метою захисту вікі проти автоматичного створення облікових записів просимо вас обрати фотографії кота у блоці нижче:',
- 'asirra-createaccount-fail' => 'Будь ласка, правильно ідентифікуйте котів.',
- 'asirra-create' => 'З метою захисту вікі проти автоматичного створення статей просимо вас обрати фотографії кота у блоці нижче:',
- 'asirra-nojs' => "'''Будь ласка увімкніть JavaScript і оновіть сторінку.'''",
- 'asirra-failed' => 'Будь ласка, ідентифікуйте усі фотографії кота',
-);
-
-/** Walloon (walon)
- * @author Srtxg
- */
-$messages['wa'] = array(
- 'asirra-desc' => "Module Asirra pol passete d' acertinaedje des candjmints (ConfirmEdit)",
- 'asirra-edit' => "Po s' mete a houte des des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
- 'asirra-addurl' => "Dins vos candjmints i gn a des dfoûtrinnès hårdêyes (URL).
-Po s' mete a houte des des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
- 'asirra-badlogin' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
- 'asirra-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
- 'asirra-createaccount-fail' => 'Tchoezixhoz comifåt les tchets (les biesses ki gnawèt).',
- 'asirra-create' => "Po s' mete a houte des des robots k' ahivèt des pådjes otomaticmint, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
- 'asirra-nojs' => "'''Metoz s' i vs plait en alaedje li JavaScrit et s' revoyî l' pådje.'''",
- 'asirra-failed' => 'Idintifyî totes les imådjes avou des tchets',
-);
-
-/** Simplified Chinese (中文(简体)‎)
- * @author Fantasticfears
- * @author Hzy980512
- */
-$messages['zh-hans'] = array(
- 'asirra-desc' => 'ConfirmEdit的Asirra模块',
- 'asirra-edit' => '为了防止垃圾编辑攻击,请在下面的方框中选出猫的图片:',
- 'asirra-addurl' => '您的编辑包含新的外部链接。为了帮助防止垃圾编辑攻击,请在下面的方框中选出猫的图片:',
- 'asirra-badlogin' => '为防止自动程序破解密码,请在下面的方框中选出猫的图片:',
- 'asirra-createaccount' => '为了防止自动程序创建帐户,请在下面的方框中选出猫的图片:',
- 'asirra-createaccount-fail' => '请正确辨认出猫的图片。',
- 'asirra-create' => '为了防止自动程序创建页面,请在下面的方框中选出猫的图片:',
- 'asirra-nojs' => "'''请启动JavaScript后再提交页面。'''",
- 'asirra-failed' => '请选出所有猫的图片',
-);
-
-/** Traditional Chinese (中文(繁體)‎)
- */
-$messages['zh-hant'] = array(
- 'asirra-desc' => 'ConfirmEdit的Asirra模塊',
- 'asirra-edit' => '為了防止垃圾編輯攻擊,請在下面的方框中選出貓的圖片:', # Fuzzy
- 'asirra-addurl' => '您的編輯包含新的外部鏈接。為了幫助防止自動垃圾郵件,請在下面的方框中選出貓的圖片:', # Fuzzy
- 'asirra-badlogin' => '為防止自動程序破解密碼,請在下面的方框中選出貓的圖片:', # Fuzzy
- 'asirra-createaccount' => '為了防止自動程序創建帳戶,請在下面的方框中選出貓的圖片:', # Fuzzy
- 'asirra-createaccount-fail' => '請正確辨認出貓的圖片。',
- 'asirra-create' => '為了防止自動程序創建頁面,請在下面的方框中選出貓的圖片:', # Fuzzy
- 'asirra-nojs' => "'''請啟動JavaScript後再提交頁面。'''",
- 'asirra-failed' => '請選出所有貓的圖片',
-);
diff --git a/extensions/ConfirmEdit/Asirra.php b/extensions/ConfirmEdit/Asirra.php
deleted file mode 100644
index 923b0b9e..00000000
--- a/extensions/ConfirmEdit/Asirra.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * Asirra CAPTCHA module for the ConfirmEdit MediaWiki extension.
- * @author Bachsau
- * @author Niklas Laxström
- *
- * Makes use of the Asirra (Animal Species Image Recognition for
- * Restricting Access) CAPTCHA service, developed by John Douceur, Jeremy
- * Elson and Jon Howell at Microsoft Research.
- *
- * Asirra uses a large set of images from http://petfinder.com.
- *
- * For more information about Asirra, see:
- * http://research.microsoft.com/en-us/um/redmond/projects/asirra/
- *
- * This MediaWiki code is released into the public domain, without any
- * warranty. YOU CAN DO WITH IT WHATEVER YOU LIKE!
- *
- * @file
- * @ingroup Extensions
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
- exit;
-}
-
-$dir = __DIR__;
-require_once( $dir . '/ConfirmEdit.php' );
-
-$wgCaptchaClass = 'Asirra';
-$wgExtensionMessagesFiles['Asirra'] = $dir . '/Asirra.i18n.php';
-$wgAutoloadClasses['Asirra'] = $dir . '/Asirra.class.php';
-
-$wgResourceModules['ext.confirmEdit.asirra'] = array(
- 'localBasePath' => $dir . '/resources',
- 'remoteExtPath' => 'ConfirmEdit/resources',
- 'scripts' => 'ext.confirmEdit.asirra.js',
- 'messages' => array(
- 'asirra-failed',
- ),
-);
-
diff --git a/extensions/ConfirmEdit/README b/extensions/ConfirmEdit/README
index acfe481a..7a331e6b 100644
--- a/extensions/ConfirmEdit/README
+++ b/extensions/ConfirmEdit/README
@@ -19,8 +19,6 @@ in a stylized way
questions defined by the administrator(s)
* ReCaptcha - users have to identify a series of characters, either
visually or audially, from a widget provided by the reCAPTCHA service
-* Asirra - users have to identify the cats in a set of photos of cats
-and dogs, from a widget provided by the Microsoft Asirra service
== License ==
@@ -37,8 +35,6 @@ The QuestyCaptcha module was written by Benjamin Lees.
The reCAPTCHA module was written by Mike Crawford and Ben Maurer.
-The Asirra module was written by Bachsau.
-
Additional maintenance work was done by Yaron Koren.
== Changelog ==
diff --git a/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js b/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js
deleted file mode 100644
index 34296d03..00000000
--- a/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*======================================================================*\
-|| #################################################################### ||
-|| # Asirra module for ConfirmEdit by Bachsau # ||
-|| # ---------------------------------------------------------------- # ||
-|| # This code is released into public domain, in the hope that it # ||
-|| # will be useful, but without any warranty. # ||
-|| # ------------ YOU CAN DO WITH IT WHATEVER YOU LIKE! ------------- # ||
-|| #################################################################### ||
-\*======================================================================*/
-
-jQuery( function( $ ) {
- // Selectors for create account, login, and page edit forms.
- var asirraform = $( 'form#userlogin2, #userloginForm form, form#editform' );
- var submitButtonClicked = document.createElement("input");
- var passThroughFormSubmit = false;
-
- function PrepareSubmit() {
- submitButtonClicked.type = "hidden";
- var inputFields = asirraform.find( "input" );
- for (var i=0; i<inputFields.length; i++) {
- if (inputFields[i].type === "submit") {
- inputFields[i].onclick = function(event) {
- submitButtonClicked.name = this.name;
- submitButtonClicked.value = this.value;
- }
- }
- }
-
- asirraform.submit( function() {
- return MySubmitForm();
- } );
- }
-
- function MySubmitForm() {
- if (passThroughFormSubmit) {
- return true;
- }
- Asirra_CheckIfHuman(HumanCheckComplete);
- return false;
- }
-
- function HumanCheckComplete(isHuman) {
- if (!isHuman) {
- window.alert( mediaWiki.msg( 'asirra-failed' ) );
- } else {
- asirraform.append(submitButtonClicked);
- passThroughFormSubmit = true;
- asirraform.submit();
- }
- }
-
- PrepareSubmit();
-
-} );
diff --git a/extensions/PdfHandler/CreatePdfThumbnailsJob.class.php b/extensions/PdfHandler/CreatePdfThumbnailsJob.class.php
deleted file mode 100644
index aba204f2..00000000
--- a/extensions/PdfHandler/CreatePdfThumbnailsJob.class.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-
-class CreatePdfThumbnailsJob extends Job {
- /**
- * Flags for thumbnail jobs
- */
- const BIG_THUMB = 1;
- const SMALL_THUMB = 2;
-
- /**
- * Construct a thumbnail job
- *
- * @param $title Title Title object
- * @param $params array Associative array of options:
- * page: page number for which the thumbnail will be created
- * jobtype: CreatePDFThumbnailsJob::BIG_THUMB or CreatePDFThumbnailsJob::SMALL_THUMB
- * BIG_THUMB will create a thumbnail visible for full thumbnail view,
- * SMALL_THUMB will create a thumbnail shown in "previous page"/"next page" boxes
- *
- */
- public function __construct( $title, $params ) {
- parent::__construct( 'createPdfThumbnailsJob', $title, $params );
- }
-
- /**
- * Run a thumbnail job on a given PDF file.
- * @return bool true
- */
- public function run() {
- if ( !isset( $this->params['page'] ) ) {
- wfDebugLog('thumbnails', 'A page for thumbnails job of ' . $this->title->getText() . ' was not specified! That should never happen!');
- return true; // no page set? that should never happen
- }
-
- $file = wfLocalFile( $this->title ); // we just want a local file
- if ( !$file ) {
- return true; // Just silently fail, perhaps the file was already deleted, don't bother
- }
-
- switch ($this->params['jobtype']) {
- case self::BIG_THUMB:
- global $wgImageLimits;
- // Ignore user preferences, do default thumbnails
- // everything here shamelessy copied and reused from includes/ImagePage.php
- $sizeSel = User::getDefaultOption( 'imagesize' );
-
- // The user offset might still be incorrect, specially if
- // $wgImageLimits got changed (see bug #8858).
- if ( !isset( $wgImageLimits[$sizeSel] ) ) {
- // Default to the first offset in $wgImageLimits
- $sizeSel = 0;
- }
- $max = $wgImageLimits[$sizeSel];
- $maxWidth = $max[0];
- $maxHeight = $max[1];
-
- $width_orig = $file->getWidth( $this->params['page'] );
- $width = $width_orig;
- $height_orig = $file->getHeight( $this->params['page'] );
- $height = $height_orig;
- if ( $width > $maxWidth || $height > $maxHeight ) {
- # Calculate the thumbnail size.
- # First case, the limiting factor is the width, not the height.
- if ( $width / $height >= $maxWidth / $maxHeight ) {
- //$height = round( $height * $maxWidth / $width );
- $width = $maxWidth;
- # Note that $height <= $maxHeight now.
- } else {
- $newwidth = floor( $width * $maxHeight / $height );
- //$height = round( $height * $newwidth / $width );
- $width = $newwidth;
- # Note that $height <= $maxHeight now, but might not be identical
- # because of rounding.
- }
- $transformParams = array( 'page' => $this->params['page'], 'width' => $width );
- $file->transform( $transformParams );
- }
- break;
-
- case self::SMALL_THUMB:
- Linker::makeThumbLinkObj( $this->title, $file, '', '', 'none', array( 'page' => $this->params['page'] ) );
- break;
- }
-
- return true;
- }
-
- /**
- * @param $upload UploadBase
- * @param $mime
- * @param $error
- * @return bool
- */
- public static function insertJobs( $upload, $mime, &$error ) {
- global $wgPdfCreateThumbnailsInJobQueue;
- if ( !$wgPdfCreateThumbnailsInJobQueue ) {
- return true;
- }
- if (!MimeMagic::singleton()->isMatchingExtension('pdf', $mime)) {
- return true; // not a PDF, abort
- }
-
- $title = $upload->getTitle();
- $uploadFile = $upload->getLocalFile();
- if ( is_null( $uploadFile ) ) {
- wfDebugLog('thumbnails', '$uploadFile seems to be null, should never happen...');
- return true; // should never happen, but it's better to be secure
- }
-
- $metadata = $uploadFile->getMetadata();
- $unserialized = unserialize( $metadata );
- $pages = intval( $unserialized['Pages'] );
-
- $jobs = array();
- for ( $i = 1; $i <= $pages; $i++ ) {
- $jobs[] = new CreatePdfThumbnailsJob( $title,
- array( 'page' => $i, 'jobtype' => self::BIG_THUMB )
- );
- $jobs[] = new CreatePdfThumbnailsJob( $title,
- array( 'page' => $i, 'jobtype' => self::SMALL_THUMB )
- );
- }
- Job::batchInsert( $jobs );
- return true;
- }
-}
diff --git a/extensions/PdfHandler/PdfHandler.i18n.php b/extensions/PdfHandler/PdfHandler.i18n.php
deleted file mode 100644
index 06143e7b..00000000
--- a/extensions/PdfHandler/PdfHandler.i18n.php
+++ /dev/null
@@ -1,1186 +0,0 @@
-<?php
-/**
- * Internationalisation file for extension PdfHandler.
- *
- * @file
- * @ingroup Extensions
- */
-
-$messages = array();
-
-$messages['en'] = array(
- 'pdf-desc' => 'Handler for viewing PDF files in image mode.',
- 'pdf_no_metadata' => 'Cannot get metadata from PDF.',
- 'pdf_page_error' => 'Page number not in range.',
- 'exif-pdf-producer' => 'Conversion program',
- 'exif-pdf-version' => 'Version of PDF format',
- 'exif-pdf-encrypted' => 'Encrypted',
- 'exif-pdf-pagesize' => 'Page size',
-);
-
-/** Message documentation (Message documentation)
- * @author Purodha
- * @author Shirayuki
- * @author The Evil IP address
- */
-$messages['qqq'] = array(
- 'pdf-desc' => '{{desc|name=Pdf Handler|url=http://www.mediawiki.org/wiki/Extension:PdfHandler}}',
- 'pdf_no_metadata' => 'Error message given when metadata cannot be retrieved from a PDF file',
- 'pdf_page_error' => 'Error message given when a PDF does not have the requested page number',
- 'exif-pdf-producer' => 'The label used in the metadata table at the bottom of the file description page for the program used to convert this PDF file into a PDF.
-
-This is separate from the program used to create the original file (Which is labeled by {{msg-mw|Exif-software}}).',
- 'exif-pdf-version' => 'Label for the version of the pdf file format in the metadata table at the bottom of an image description page. Usually a number between 1.2 and 1.6',
- 'exif-pdf-encrypted' => 'Label for field in metadata table at bottom of an image description page to denote if the PDF file is encrypted. The value of the field this references is either "no" (most common) or something like "yes (print:yes copy:no change:no addNotes:no)"',
- 'exif-pdf-pagesize' => 'Label for the field in the metadata table at the bottom of an image description page to denote the size of the pages in the pdf. If there is more than one size of page used in this document, each size is listed once.',
-);
-
-/** Afrikaans (Afrikaans)
- * @author Naudefj
- * @author පසිඳු කාවින්ද
- */
-$messages['af'] = array(
- 'pdf-desc' => 'Handler vir die lees van PDF-lêers in beeld af',
- 'pdf_no_metadata' => 'Kan nie metadata uit PDF kry nie',
- 'pdf_page_error' => 'Bladsynommer kom nie in dokument voor nie',
-);
-
-/** Gheg Albanian (Gegë)
- * @author Mdupont
- */
-$messages['aln'] = array(
- 'pdf-desc' => 'Mbajtës për shikimin PDF files në imazh mode',
- 'pdf_no_metadata' => 'Nuk mund të merrni nga metadata PDF',
- 'pdf_page_error' => 'numrin e faqes nuk është në varg',
-);
-
-/** Aragonese (aragonés)
- * @author Juanpabl
- */
-$messages['an'] = array(
- 'pdf-desc' => 'Maneyador ta veyer fichers PDF en modo imachen',
- 'pdf_no_metadata' => "No s'obtenioron metadatos d'o PDF",
- 'pdf_page_error' => 'Numero de pachina difuera de rango',
-);
-
-/** Arabic (العربية)
- * @author Meno25
- * @author Mido
- * @author أحمد
- */
-$messages['ar'] = array(
- 'pdf-desc' => 'معالج عرض ملفات PDF في طور الصور',
- 'pdf_no_metadata' => 'تعذّر استخراج البيانات الفوقية من ملف PDF',
- 'pdf_page_error' => 'رقم الصفحة خارج عن النطاق',
- 'exif-pdf-producer' => 'برمجية التحويل',
- 'exif-pdf-version' => 'إصدارة صيغة PDF',
- 'exif-pdf-encrypted' => 'مُعمّى',
- 'exif-pdf-pagesize' => 'حجم الصفحة',
-);
-
-/** Egyptian Spoken Arabic (مصرى)
- * @author Meno25
- */
-$messages['arz'] = array(
- 'pdf-desc' => 'متحكم لرؤية ملفات PDF فى نمط صورة',
- 'pdf_no_metadata' => 'لم يمكن أخذ معلومات ميتا من PDF',
- 'pdf_page_error' => 'رقم الصفحة ليس فى النطاق',
-);
-
-/** Assamese (অসমীয়া)
- * @author Bishnu Saikia
- */
-$messages['as'] = array(
- 'pdf-desc' => 'পিডিএফ ফাইল ছবি হিচাপে ব্যৱহাৰৰ পদ্ধতি',
- 'pdf_no_metadata' => 'পি.ডি.এফ.ৰ পৰা মেটাডাটা উপলদ্ধ নহয়',
- 'pdf_page_error' => 'পৃষ্ঠাৰ নম্বৰ সীমাৰ ভিতৰত নাই',
- 'exif-pdf-producer' => 'ৰূপান্তৰক প্ৰগ্ৰাম',
- 'exif-pdf-version' => 'পি.ডি.এফ. ৰূপত সংস্কৰণ',
- 'exif-pdf-pagesize' => 'পৃষ্ঠাৰ আকাৰ',
-);
-
-/** Asturian (asturianu)
- * @author Xuacu
- */
-$messages['ast'] = array(
- 'pdf-desc' => "Xestor pa ver los ficheros PDF en mou d'imaxe",
- 'pdf_no_metadata' => 'Nun se pudieron sacar los metadatos del PDF',
- 'pdf_page_error' => 'El númberu de la páxina nun ta nel rangu',
- 'exif-pdf-producer' => 'Programa de conversión',
- 'exif-pdf-version' => 'Versión del formatu PDF',
- 'exif-pdf-encrypted' => 'Cifráu',
- 'exif-pdf-pagesize' => 'Tamañu de la páxina',
-);
-
-/** South Azerbaijani (تورکجه)
- * @author Amir a57
- */
-$messages['azb'] = array(
- 'exif-pdf-pagesize' => 'صحیفه اولچوسو',
-);
-
-/** Bashkir (башҡортса)
- * @author Assele
- */
-$messages['ba'] = array(
- 'pdf-desc' => 'PDF файлдарҙы рәсемдәр рәүешендә ҡарау өсөн эшкәртеүсе ҡорал',
- 'pdf_no_metadata' => 'PDF-тан мета-мәғлүмәтте алыу мөмкин түгел',
- 'pdf_page_error' => 'Бит һаны биттәр һанынан ашҡан',
-);
-
-/** Bikol Central (Bikol Central)
- * @author Geopoet
- */
-$messages['bcl'] = array(
- 'pdf-desc' => 'An tagapagkapot para sa pagtatanaw kan PDF na mga sagunson na yaon sa moda nin imahe.',
- 'pdf_no_metadata' => 'Dae makakakua nin datos na meta gikan sa PDF.',
- 'pdf_page_error' => 'An numero kan pahina dae tabi abot.',
- 'exif-pdf-producer' => 'Programa nin kombersyon',
- 'exif-pdf-version' => 'Bersyon kan PDF pormat',
- 'exif-pdf-encrypted' => 'Enkriptado',
- 'exif-pdf-pagesize' => 'Sukol kan pahina',
-);
-
-/** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
- * @author EugeneZelenko
- * @author Jim-by
- * @author Wizardist
- */
-$messages['be-tarask'] = array(
- 'pdf-desc' => 'Апрацоўшчык для прагляду PDF-файлаў у выглядзе выяваў',
- 'pdf_no_metadata' => 'Немагчыма атрымаць мэта-зьвесткі з PDF-файла',
- 'pdf_page_error' => 'Нумар старонкі паза дыяпазонам',
- 'exif-pdf-producer' => 'Праграма канвэртацыі',
- 'exif-pdf-version' => 'Вэрсія фармату PDF',
- 'exif-pdf-encrypted' => 'Зашыфравана',
- 'exif-pdf-pagesize' => 'Памер старонкі',
-);
-
-/** Bulgarian (български)
- * @author DCLXVI
- * @author Stanqo
- * @author Turin
- */
-$messages['bg'] = array(
- 'pdf_no_metadata' => 'невъзможно е да бъдат извлечени метаданни от PDF',
- 'pdf_page_error' => 'Номерът на страница е извън обхвата',
- 'exif-pdf-encrypted' => 'Криптиране',
- 'exif-pdf-pagesize' => 'Размер на страницата',
-);
-
-/** Bengali (বাংলা)
- * @author Nasir8891
- * @author Wikitanvir
- */
-$messages['bn'] = array(
- 'pdf-desc' => 'পিডিএফ ফাইল ছবি হিসাবে ব্যবহারের পদ্ধতি',
- 'pdf_no_metadata' => 'পিডিএফ থেকে মেটাডেটা পাওয়া যায়নি',
- 'pdf_page_error' => 'পাতার নম্বর সীমার মধ্যে নেই',
-);
-
-/** Breton (brezhoneg)
- * @author Fohanno
- * @author Fulup
- */
-$messages['br'] = array(
- 'pdf-desc' => 'Maveg evit gwelet ar restroù PDF e mod skeudenn',
- 'pdf_no_metadata' => 'Dibosupl tapout meta-roadennoù digant ar restr PDF',
- 'pdf_page_error' => "N'emañ ket niverenn ar bajenn er skeuliad",
- 'exif-pdf-producer' => 'Program amdreiñ',
- 'exif-pdf-pagesize' => 'Ment ar bajenn',
-);
-
-/** Bosnian (bosanski)
- * @author CERminator
- */
-$messages['bs'] = array(
- 'pdf-desc' => 'Uređivač za pregled PDF datoteka u modu za slike',
- 'pdf_no_metadata' => 'Ne mogu se naći metapodaci u PDFu',
- 'pdf_page_error' => 'Broj stranice nije u rasponu',
-);
-
-/** Catalan (català)
- * @author Aleator
- */
-$messages['ca'] = array(
- 'pdf-desc' => 'Gestor per a visualitzar arxius PDF en mode imatge',
- 'pdf_no_metadata' => "No s'han pogut obtenir metadades del PDF",
- 'pdf_page_error' => "Número de pàgina fora d'abast",
-);
-
-/** Chechen (нохчийн)
- * @author Sasan700
- * @author Умар
- */
-$messages['ce'] = array(
- 'pdf-desc' => 'Хьажа аттон кечйо PDF-файлаш суьрта куьцехь',
- 'pdf_no_metadata' => 'схьацаэцало чура бух оцу PDF',
- 'pdf_page_error' => 'Агlон терахь дозан чулацамца дац',
- 'exif-pdf-pagesize' => 'АгӀона барам',
-);
-
-/** Sorani Kurdish (کوردی)
- * @author Calak
- */
-$messages['ckb'] = array(
- 'exif-pdf-pagesize' => 'قەبارەی پەڕە',
-);
-
-/** Czech (česky)
- * @author Matěj Grabovský
- * @author Mormegil
- */
-$messages['cs'] = array(
- 'pdf-desc' => 'Ovladač pro prohlížení PDF souborů jako obrázků',
- 'pdf_no_metadata' => 'Z PDF se nepodařilo získat metadata',
- 'pdf_page_error' => 'Číslo stránky mimo rozsah',
- 'exif-pdf-producer' => 'Konverzní program',
- 'exif-pdf-version' => 'Verze formátu PDF',
- 'exif-pdf-encrypted' => 'Šifrovaný',
- 'exif-pdf-pagesize' => 'Velikost stránky',
-);
-
-/** Welsh (Cymraeg)
- * @author Lloffiwr
- */
-$messages['cy'] = array(
- 'pdf-desc' => 'Teclyn i weld ffeiliau PDF ar lun delwedd',
- 'pdf_no_metadata' => "Yn methu cael y metadata o'r PDF",
- 'pdf_page_error' => "Nid yw'r rhif hwn oddi mewn i ystod rhifau'r tudalennau",
- 'exif-pdf-producer' => 'Rhaglen trosi',
- 'exif-pdf-version' => 'Fersiwn y fformat PDF',
- 'exif-pdf-encrypted' => 'Amgriptiwyd',
- 'exif-pdf-pagesize' => 'Maint y dudalen',
-);
-
-/** Danish (dansk)
- * @author Peter Alberti
- */
-$messages['da'] = array(
- 'pdf-desc' => 'Håndtering af PDF-visning i billedtilstand',
- 'pdf_no_metadata' => 'Kan ikke hente metadata fra PDF',
- 'pdf_page_error' => 'Sidetallet er større end antallet af sider i dokumentet',
- 'exif-pdf-producer' => 'Konverteringsprogram',
- 'exif-pdf-version' => 'Version af PDF-format',
- 'exif-pdf-encrypted' => 'Krypteret',
- 'exif-pdf-pagesize' => 'Sidestørrelse',
-);
-
-/** German (Deutsch)
- * @author Kghbln
- * @author Metalhead64
- * @author Raimond Spekking
- */
-$messages['de'] = array(
- 'pdf-desc' => 'Stellt eine Schnittstelle zur Ansicht von PDF-Dateien im Bildermodus bereit',
- 'pdf_no_metadata' => 'Keine Metadaten im PDF vorhanden.',
- 'pdf_page_error' => 'Seitenzahl außerhalb des Dokumentes.',
- 'exif-pdf-producer' => 'Umwandlungsprogramm',
- 'exif-pdf-version' => 'Version des PDF-Formats',
- 'exif-pdf-encrypted' => 'Verschlüsselt',
- 'exif-pdf-pagesize' => 'Seitengröße',
-);
-
-/** Swiss High German (Schweizer Hochdeutsch)
- * @author Geitost
- */
-$messages['de-ch'] = array(
- 'pdf_page_error' => 'Seitenzahl ausserhalb des Dokumentes.',
-);
-
-/** Zazaki (Zazaki)
- * @author Aspar
- * @author Erdemaslancan
- */
-$messages['diq'] = array(
- 'pdf-desc' => 'şuxulnayoxo ke dosyayê PDFyan modê mocnayiş de mocneno',
- 'pdf_no_metadata' => 'PDF ra metadata nêgeriyeno',
- 'pdf_page_error' => 'numreyê peli benate de niyo',
- 'exif-pdf-producer' => 'Programa çerxiney',
- 'exif-pdf-version' => 'Versiyona babet da PDF',
- 'exif-pdf-encrypted' => 'Kodıno',
- 'exif-pdf-pagesize' => 'Ebata perer',
-);
-
-/** Lower Sorbian (dolnoserbski)
- * @author Michawiki
- */
-$messages['dsb'] = array(
- 'pdf-desc' => 'Źěłowy rěd za woglědowanje PDF-datajow we wobrazowem modusu',
- 'pdf_no_metadata' => 'Metadaty njedaju se z PDF dobyś',
- 'pdf_page_error' => 'Bokowe cysło zwenka wobcerka',
- 'exif-pdf-producer' => 'Konwertěrowański program',
- 'exif-pdf-version' => 'Wersija PDF-formata',
- 'exif-pdf-encrypted' => 'Skoděrowany',
- 'exif-pdf-pagesize' => 'Wjelikosć boka',
-);
-
-/** Greek (Ελληνικά)
- * @author Omnipaedista
- */
-$messages['el'] = array(
- 'pdf-desc' => 'Διαχειριστής για την εμφάνιση αρχείων PDF σε μορφή εικόνας',
- 'pdf_no_metadata' => 'Αδύνατη η απόκτηση μεταδεδομένων από PDF',
- 'pdf_page_error' => 'Αριθμός σελίδας εκτός ορίου',
-);
-
-/** British English (British English)
- * @author Shirayuki
- */
-$messages['en-gb'] = array(
- 'exif-pdf-producer' => 'Conversion programme',
-);
-
-/** Esperanto (Esperanto)
- * @author Yekrats
- */
-$messages['eo'] = array(
- 'pdf-desc' => 'Ilo por vidi PDF-dosierojn en bilda reĝimo',
- 'pdf_no_metadata' => 'Ne povas preni metadatenon el PDF',
- 'pdf_page_error' => 'Paĝnombro ekster valida intervalo',
- 'exif-pdf-version' => 'Versio de PDF-formato',
- 'exif-pdf-encrypted' => 'Ĉifrita',
- 'exif-pdf-pagesize' => 'Grandeco de paĝo',
-);
-
-/** Spanish (español)
- * @author Armando-Martin
- * @author Sanbec
- */
-$messages['es'] = array(
- 'pdf-desc' => 'Manejador para ver archivos PDF en modo imagen',
- 'pdf_no_metadata' => 'No se obtuvieron metadatos del PDF',
- 'pdf_page_error' => 'Número de página fuera de rango',
- 'exif-pdf-producer' => 'Programa de conversión',
- 'exif-pdf-version' => 'Versión del formato PDF',
- 'exif-pdf-encrypted' => 'Cifrado',
- 'exif-pdf-pagesize' => 'Tamaño de página',
-);
-
-/** Estonian (eesti)
- * @author Avjoska
- * @author Pikne
- */
-$messages['et'] = array(
- 'pdf-desc' => 'Töötleja PDF-failide piltidena kuvamiseks',
- 'pdf_no_metadata' => 'Ei õnnestu PDF-faili meta-andmeid saada',
- 'pdf_page_error' => 'Leheküljenumber pole vahemikus.',
- 'exif-pdf-producer' => 'Teisendusprogramm',
- 'exif-pdf-version' => 'PDF-vormingu versioon',
- 'exif-pdf-encrypted' => 'Krüptitud',
- 'exif-pdf-pagesize' => 'Lehe suurus',
-);
-
-/** Persian (فارسی)
- * @author Ebraminio
- * @author Huji
- * @author Reza1615
- * @author Sahim
- * @author Wayiran
- */
-$messages['fa'] = array(
- 'pdf-desc' => 'گرداننده‌ای برای مشاهدهٔ پرونده‌های پی‌دی‌اف در حالت تصویر',
- 'pdf_no_metadata' => 'نمی‌توان فراداده‌ها را از پی‌دی‌اف گرفت',
- 'pdf_page_error' => 'شماره صفحه در محدوده نیست',
- 'exif-pdf-producer' => 'برنامهٔ مبدل',
- 'exif-pdf-version' => 'نسخهٔ قالب پی‌دی‌اف',
- 'exif-pdf-encrypted' => 'رمز شده',
- 'exif-pdf-pagesize' => 'حجم صفحه',
-);
-
-/** Finnish (suomi)
- * @author Crt
- * @author Kulmalukko
- * @author Nike
- * @author VezonThunder
- * @author Vililikku
- */
-$messages['fi'] = array(
- 'pdf-desc' => 'Käsittelijä PDF-tiedostojen katsomiseen kuvatilassa.',
- 'pdf_no_metadata' => 'Metatietojen hakeminen PDF-tiedostosta epäonnistui',
- 'pdf_page_error' => 'Sivunumero ei ole alueella.',
- 'exif-pdf-producer' => 'Muunto-ohjelma',
- 'exif-pdf-version' => 'PDF-muodon versio',
- 'exif-pdf-encrypted' => 'Salattu',
- 'exif-pdf-pagesize' => 'Sivun koko',
-);
-
-/** French (français)
- * @author Crochet.david
- * @author Gomoko
- * @author Grondin
- * @author Verdy p
- */
-$messages['fr'] = array(
- 'pdf-desc' => 'Gestionnaire permettant de visualiser les fichiers PDF en mode image',
- 'pdf_no_metadata' => 'Impossible d’obtenir les métadonnées du fichier PDF',
- 'pdf_page_error' => 'Le numéro de page est hors de l’étendue.',
- 'exif-pdf-producer' => 'Programme de conversion',
- 'exif-pdf-version' => 'Version du format PDF',
- 'exif-pdf-encrypted' => 'Crypté',
- 'exif-pdf-pagesize' => 'Taille de la page',
-);
-
-/** Franco-Provençal (arpetan)
- * @author ChrisPtDe
- */
-$messages['frp'] = array(
- 'pdf-desc' => 'Utilitèro por vêre los fichiérs PDF en fôrma émâge.',
- 'pdf_no_metadata' => 'Pôt pas avêr les mètabalyês du fichiér PDF.',
- 'pdf_page_error' => 'Lo numerô de pâge est en defôr de la portâ.',
-);
-
-/** Galician (galego)
- * @author Alma
- * @author Toliño
- */
-$messages['gl'] = array(
- 'pdf-desc' => 'Manipulador para ver ficheiros PDF no modo de imaxe',
- 'pdf_no_metadata' => 'Non se puideron obter os metadatos do PDF.',
- 'pdf_page_error' => 'O número da páxina non está no rango.',
- 'exif-pdf-producer' => 'Programa de conversión',
- 'exif-pdf-version' => 'Versión en formato PDF',
- 'exif-pdf-encrypted' => 'Cifrado',
- 'exif-pdf-pagesize' => 'Tamaño da páxina',
-);
-
-/** Ancient Greek (Ἀρχαία ἑλληνικὴ)
- * @author Omnipaedista
- */
-$messages['grc'] = array(
- 'pdf_no_metadata' => 'Ἀδύνατον τὸ ἀποκομίζειν μεταδεδομένα ἐκ PDF',
- 'pdf_page_error' => 'Ἀριθμὸς δέλτου ἐκτὸς ἐμβελείας',
-);
-
-/** Swiss German (Alemannisch)
- * @author Als-Holder
- */
-$messages['gsw'] = array(
- 'pdf-desc' => 'Schnittstell fir d Aasicht vu PDF-Dateien im Bilder-Modus',
- 'pdf_no_metadata' => 'Kei Metadate im PDF vorhande.',
- 'pdf_page_error' => 'Sytezahl usserhalb vum Dokumänt.',
- 'exif-pdf-producer' => 'Umwandligsprogramm',
- 'exif-pdf-version' => 'Version vum PDF-Format',
- 'exif-pdf-encrypted' => 'Verschlisslet',
- 'exif-pdf-pagesize' => 'Sytegreßi',
-);
-
-/** Gujarati (ગુજરાતી)
- * @author KartikMistry
- * @author Sushant savla
- */
-$messages['gu'] = array(
- 'pdf-desc' => 'PDF ફાઈલોને ચિત્ર સ્વરૂપે જોવાનું સાધન',
- 'pdf_no_metadata' => 'PDFમાંથી મેટા ડાટા ન મેળવી શકાયો',
- 'pdf_page_error' => 'પાનાં ક્રમાંક અવધિમાં નથી',
-);
-
-/** Hebrew (עברית)
- * @author Amire80
- * @author Rotemliss
- * @author YaronSh
- */
-$messages['he'] = array(
- 'pdf-desc' => 'טיפול בצפייה בקובצי PDF במצב תמונה',
- 'pdf_no_metadata' => 'לא ניתן לאחזר את נתוני המסמך מה־PDF',
- 'pdf_page_error' => 'מספר הדף אינו בטווח',
- 'exif-pdf-producer' => 'תוכנת המרה',
- 'exif-pdf-version' => 'הגרסה של תסדיר PDF',
- 'exif-pdf-encrypted' => 'מוצפן',
- 'exif-pdf-pagesize' => 'גודל דף',
-);
-
-/** Hindi (हिन्दी)
- * @author Kaustubh
- */
-$messages['hi'] = array(
- 'pdf-desc' => 'चित्र मोड में पीडीएफ फ़ाईल देखनेके लिये आवश्यक प्रणाली',
- 'pdf_no_metadata' => 'पीडीएफ से मेटाडाटा ले नहीं पायें',
- 'pdf_page_error' => 'पन्ने का क्रमांक सीमामें नहीं हैं',
-);
-
-/** Croatian (hrvatski)
- * @author Ex13
- */
-$messages['hr'] = array(
- 'pdf-desc' => 'Program za gledanje PDF datoteka u slikovnom modu',
- 'pdf_no_metadata' => 'Nije moguće dobiti metapodatke iz PDF',
- 'pdf_page_error' => 'Broj stranice nije u opsegu',
-);
-
-/** Upper Sorbian (hornjoserbsce)
- * @author Michawiki
- */
-$messages['hsb'] = array(
- 'pdf-desc' => 'Program za wobhladowanje datajow PDF we wobrazowym modusu',
- 'pdf_no_metadata' => 'W PDF žane metadaty njejsu.',
- 'pdf_page_error' => 'Ličba strony zwonka dokumenta.',
- 'exif-pdf-producer' => 'Konwertowanski program',
- 'exif-pdf-version' => 'Wersija PDF-formata',
- 'exif-pdf-encrypted' => 'Zaklučowany',
- 'exif-pdf-pagesize' => 'Wulkosć strony',
-);
-
-/** Hungarian (magyar)
- * @author Dani
- * @author Dj
- */
-$messages['hu'] = array(
- 'pdf-desc' => 'PDF fájlok megjelenítse képként',
- 'pdf_no_metadata' => 'nem sikerült lekérni a PDF metaadatait',
- 'pdf_page_error' => 'Az oldalszám a tartományon kívül esik',
- 'exif-pdf-producer' => 'Konvertáló program',
- 'exif-pdf-version' => 'PDF formátum verziója',
- 'exif-pdf-encrypted' => 'Titkosított',
- 'exif-pdf-pagesize' => 'Lapméret',
-);
-
-/** Interlingua (interlingua)
- * @author McDutchie
- */
-$messages['ia'] = array(
- 'pdf-desc' => 'Gestor pro visualisar files PDF in modo de imagine',
- 'pdf_no_metadata' => 'Non pote obtener metadatos ab PDF',
- 'pdf_page_error' => 'Numero de pagina foras del intervallo',
-);
-
-/** Indonesian (Bahasa Indonesia)
- * @author Bennylin
- */
-$messages['id'] = array(
- 'pdf-desc' => 'Yang menangani tampilan berkas PDF dalam mode gambar',
- 'pdf_no_metadata' => 'Tidak dapat membaca metadata dari PDF',
- 'pdf_page_error' => 'Nomor halaman di luar batas',
-);
-
-/** Iloko (Ilokano)
- * @author Lam-ang
- */
-$messages['ilo'] = array(
- 'pdf-desc' => 'Panagtengngel para iti panagkita kadagiti PDF a papeles iti moda a ladawan',
- 'pdf_no_metadata' => 'Saan a makaala ti metadata manipud idiay PDF.',
- 'pdf_page_error' => 'Saan a masakupan ti numero ti panid.',
- 'exif-pdf-producer' => 'Konbersion a programa',
- 'exif-pdf-version' => 'Bersion iti PDF a pormat',
- 'exif-pdf-encrypted' => 'Naenkripto',
- 'exif-pdf-pagesize' => 'Kadakkel ti panid',
-);
-
-/** Italian (italiano)
- * @author Beta16
- * @author Darth Kule
- */
-$messages['it'] = array(
- 'pdf-desc' => 'Gestore per la visualizzazione di file PDF in modalità immagine',
- 'pdf_no_metadata' => 'Impossibile ottenere i metadati da PDF',
- 'pdf_page_error' => "Numero di pagina non compreso nell'intervallo",
- 'exif-pdf-producer' => 'Programma di conversione',
- 'exif-pdf-version' => 'Versione del formato PDF',
- 'exif-pdf-encrypted' => 'Crittografato',
- 'exif-pdf-pagesize' => 'Dimensioni pagina',
-);
-
-/** Japanese (日本語)
- * @author Fryed-peach
- * @author Shirayuki
- */
-$messages['ja'] = array(
- 'pdf-desc' => '画像モードで PDF ファイルを表示するためのハンドラー',
- 'pdf_no_metadata' => 'PDF ファイルからメタデータを取得できません',
- 'pdf_page_error' => 'ページ番号が正しい範囲内にありません。',
- 'exif-pdf-producer' => '変換プログラム',
- 'exif-pdf-version' => 'PDF 形式のバージョン',
- 'exif-pdf-encrypted' => '暗号化済み',
- 'exif-pdf-pagesize' => 'ページのサイズ',
-);
-
-/** Javanese (Basa Jawa)
- * @author Meursault2004
- * @author NoiX180
- */
-$messages['jv'] = array(
- 'pdf-desc' => 'Sing nadhangi kanggo ndelok berkas PDF mawa modé gambar',
- 'pdf_no_metadata' => 'Ora bisa olèh metadata saka PDF',
- 'pdf_page_error' => 'Nomèr kaca nèng njaba wates',
-);
-
-/** Georgian (ქართული)
- * @author BRUTE
- * @author David1010
- */
-$messages['ka'] = array(
- 'pdf-desc' => 'დამამუშავებელი PDF-ფაილების სურათების სახით დასათვალიერებლად',
- 'pdf_no_metadata' => 'შეუძლებელია PDF-დან მეტამონაცემების მიღება',
- 'pdf_page_error' => 'გვერდის ნომერი არ არის დიაპაზონში',
- 'exif-pdf-producer' => 'პროგრამის გარდაქმნა',
- 'exif-pdf-version' => 'ვერსია PDF ფორმატში',
- 'exif-pdf-encrypted' => 'დაშიფრული',
- 'exif-pdf-pagesize' => 'გვერდის ზომა',
-);
-
-/** Khmer (ភាសាខ្មែរ)
- * @author Chhorran
- * @author Lovekhmer
- * @author Thearith
- * @author គីមស៊្រុន
- */
-$messages['km'] = array(
- 'pdf-desc' => 'កម្មវិធីសំរាប់បើកមើលឯកសារ PDF ជាទំរង់រូបភាព',
- 'pdf_no_metadata' => 'មិនអាចទទួលយកទិន្នន័យមេតាពី PDF បានទេ',
- 'pdf_page_error' => 'គ្មានលេខទំព័រ ក្នុងដែនកំណត់',
-);
-
-/** Korean (한국어)
- * @author Kwj2772
- * @author 아라
- */
-$messages['ko'] = array(
- 'pdf-desc' => 'PDF 파일을 이미지 방식으로 볼 수 있게 하는 핸들러',
- 'pdf_no_metadata' => 'PDF 파일에서 메타데이터를 추출할 수 없습니다.',
- 'pdf_page_error' => '쪽수가 범위 안에 있지 않습니다.',
- 'exif-pdf-producer' => '변환 프로그램',
- 'exif-pdf-version' => 'PDF 형식 버전',
- 'exif-pdf-encrypted' => '암호화함',
- 'exif-pdf-pagesize' => '문서 크기',
-);
-
-/** Colognian (Ripoarisch)
- * @author Purodha
- */
-$messages['ksh'] = array(
- 'pdf-desc' => 'Määd et möjjelesch, PDF-Dateie wie Bellder ze beloore.',
- 'pdf_no_metadata' => 'Kann de Metta-Date nit fun dä PDF-Datei holle.',
- 'pdf_page_error' => 'En Sigge-Nommer es ußerhallef',
- 'exif-pdf-producer' => 'Ömwandelongsprojramm',
- 'exif-pdf-version' => 'PDF-Fommaat-Version',
- 'exif-pdf-encrypted' => 'Verschlößelt',
- 'exif-pdf-pagesize' => 'Dä Sigg(e) ier Jrüüße', # Fuzzy
-);
-
-/** Kyrgyz (Кыргызча)
- * @author Chorobek
- */
-$messages['ky'] = array(
- 'pdf-desc' => 'PDF файлдарды сүрөт түрүндө көрсөткүч',
- 'pdf_no_metadata' => 'PDF-тин метамаалыматтарын алуу мүмкүн эмес',
-);
-
-/** Luxembourgish (Lëtzebuergesch)
- * @author Robby
- */
-$messages['lb'] = array(
- 'pdf-desc' => '"Programm" den et erméiglecht PDF-Fichieren als Bild ze kucken',
- 'pdf_no_metadata' => 'Meta-Informatiounen aus dem PDF Dokument kënnen net gelies ginn',
- 'pdf_page_error' => "D'Säitenzuel ass net an dem Beräich.",
- 'exif-pdf-version' => 'Versioun vum PDF-Format',
- 'exif-pdf-encrypted' => 'Verschlësselt',
- 'exif-pdf-pagesize' => 'Gréisst vun der Säit',
-);
-
-/** Limburgish (Limburgs)
- * @author Ooswesthoesbes
- */
-$messages['li'] = array(
- 'pdf-desc' => "Hanjeltj PDF-bestenj aaf en maak 't meugelik die es aafbeildjing te zeen",
- 'pdf_no_metadata' => 'Kèn gein metadata vanne PDF kriege',
- 'pdf_page_error' => 'paginanómmer besteit neet',
-);
-
-/** Lithuanian (lietuvių)
- * @author Matasg
- */
-$messages['lt'] = array(
- 'pdf-desc' => 'Įrankis PDF failų peržiūrai vaizdo režime',
- 'pdf_no_metadata' => 'Nepavyko gauti metaduomenų iš PDF',
- 'pdf_page_error' => 'Puslapis numeris nėra diapazone',
-);
-
-/** Macedonian (македонски)
- * @author Bjankuloski06
- * @author Brest
- */
-$messages['mk'] = array(
- 'pdf-desc' => 'Ракувач за прегледување PDF податотеки во сликовен режим',
- 'pdf_no_metadata' => 'Не може да се земат метаподатоци од PDF',
- 'pdf_page_error' => 'Бројот на страница е надвор од опсег',
- 'exif-pdf-producer' => 'Програм за претворање',
- 'exif-pdf-version' => 'Верзија на PDF-форматот',
- 'exif-pdf-encrypted' => 'Шифрирано',
- 'exif-pdf-pagesize' => 'Големина на страницата',
-);
-
-/** Malayalam (മലയാളം)
- * @author Praveenp
- * @author Shijualex
- */
-$messages['ml'] = array(
- 'pdf-desc' => 'പി.ഡി.എഫ്. പ്രമാണങ്ങൾ ചിത്രരൂപത്തിൽ കാണുന്നതിനുള്ള കൈകാര്യോപകരണം',
- 'pdf_no_metadata' => 'PDF-ൽ നിന്നു മെറ്റാഡാറ്റ ലഭിച്ചില്ല',
- 'pdf_page_error' => 'താളിന്റെ ക്രമസംഖ്യ പരിധിയിലധികമാണ്',
- 'exif-pdf-producer' => 'പരിവർത്തന പ്രോഗ്രാം',
- 'exif-pdf-version' => 'പി.ഡി.എഫ്. തരത്തിന്റെ പതിപ്പ്',
- 'exif-pdf-encrypted' => 'നിഗൂഢീകരിക്കപ്പെട്ടത്',
- 'exif-pdf-pagesize' => 'താളിന്റെ വലിപ്പം',
-);
-
-/** Marathi (मराठी)
- * @author Kaustubh
- * @author Sankalpdravid
- */
-$messages['mr'] = array(
- 'pdf-desc' => 'चित्र मोडमध्ये पीडीएफ संचिका पाहण्यासाठी आवश्यक प्रणाली',
- 'pdf_no_metadata' => 'पीडीएफमधून मेटाडाटा घेऊ शकत नाही',
- 'pdf_page_error' => 'पान क्रमांक सीमेमध्ये नाही',
-);
-
-/** Malay (Bahasa Melayu)
- * @author Anakmalaysia
- */
-$messages['ms'] = array(
- 'pdf-desc' => 'Pengendali untuk melihat fail PDF dalam mod imej',
- 'pdf_no_metadata' => 'Metadata tidak boleh diperoleh dari PDF',
- 'pdf_page_error' => 'Nombor halaman tiada dalam julat',
- 'exif-pdf-producer' => 'Program penukaran',
- 'exif-pdf-version' => 'Versi format PDF',
- 'exif-pdf-encrypted' => 'Disulitkan',
- 'exif-pdf-pagesize' => 'Saiz halaman',
-);
-
-/** Maltese (Malti)
- * @author Chrisportelli
- */
-$messages['mt'] = array(
- 'pdf_page_error' => 'In-numru tal-paġna ma jinsabx fl-intervall',
-);
-
-/** Norwegian Bokmål (norsk bokmål)
- * @author Jsoby
- */
-$messages['nb'] = array(
- 'pdf-desc' => 'Håndtering av PDF-visning i bildemodus',
- 'pdf_no_metadata' => 'kan ikke hente metadata fra PDF',
- 'pdf_page_error' => 'Sidenummer overstiger antall sider i dokumentet',
- 'exif-pdf-producer' => 'Koverteringsprogram',
- 'exif-pdf-version' => 'Versjon av PDF-format',
- 'exif-pdf-encrypted' => 'Kryptert',
- 'exif-pdf-pagesize' => 'Sidestørrelse',
-);
-
-/** Dutch (Nederlands)
- * @author Siebrand
- * @author Wiki13
- */
-$messages['nl'] = array(
- 'pdf-desc' => 'Handelt pdfbestanden af en maakt het mogelijk ze als afbeeldingen te bekijken',
- 'pdf_no_metadata' => 'De metadata van het pdfbestand kan niet uitgelezen worden',
- 'pdf_page_error' => 'Het paginanummer ligt niet binnen het bereik',
- 'exif-pdf-producer' => 'Conversieprogramma',
- 'exif-pdf-version' => 'Versie van pdfopmaak',
- 'exif-pdf-encrypted' => 'Versleuteld',
- 'exif-pdf-pagesize' => 'Papierformaat',
-);
-
-/** Norwegian Nynorsk (norsk nynorsk)
- * @author Harald Khan
- * @author Njardarlogar
- */
-$messages['nn'] = array(
- 'pdf-desc' => 'Handering av PDF-vising i biletmodus',
- 'pdf_no_metadata' => 'Kan ikkje henta metadata frå PDF',
- 'pdf_page_error' => 'Sidenummer overstig talet på sider i dokumentet',
-);
-
-/** Occitan (occitan)
- * @author Cedric31
- */
-$messages['oc'] = array(
- 'pdf-desc' => 'Utilitari per visualizar los fichièrs PDF en mòde imatge',
- 'pdf_no_metadata' => 'Pòt pas obténer las metadonadas del fichièr PDF',
- 'pdf_page_error' => 'Lo numèro de pagina es pas dins la gama.',
- 'exif-pdf-producer' => 'Programa de conversion',
- 'exif-pdf-version' => 'Version del format PDF',
- 'exif-pdf-encrypted' => 'Chifrat',
- 'exif-pdf-pagesize' => 'Talha de la pagina',
-);
-
-/** Oriya (ଓଡ଼ିଆ)
- * @author Jnanaranjan Sahu
- * @author Psubhashish
- */
-$messages['or'] = array(
- 'pdf-desc' => 'PDF ଫାଇଲକୁ ଛବି ମୋଡ଼ରେ ଦେଖିବାର ପରିଚାଳକ',
- 'pdf_no_metadata' => 'ପି.ଡ଼ି.ଏଫ.ରୁ ମେଟାଡାଟା ବାହାର କରିପାରିଲୁଁ ନାହିଁ',
- 'pdf_page_error' => 'ପୃଷ୍ଠା ସଂଖ୍ୟା ସୀମା ଭିତରେ ନାହିଁ',
- 'exif-pdf-producer' => 'ବଦଳ କାର୍ଯ୍ୟ',
- 'exif-pdf-version' => 'PDF ପ୍ରକାରର ସଂସ୍କରଣ',
- 'exif-pdf-encrypted' => 'ଏନକ୍ରିପ୍ଟ ହୋଇଥିବା',
- 'exif-pdf-pagesize' => 'ପୃଷ୍ଠା ଆକାର',
-);
-
-/** Deitsch (Deitsch)
- * @author Xqt
- */
-$messages['pdc'] = array(
- 'pdf_no_metadata' => 'Keene Meta-Daade im PDF',
-);
-
-/** Polish (polski)
- * @author Holek
- * @author Matma Rex
- * @author Sp5uhe
- */
-$messages['pl'] = array(
- 'pdf-desc' => 'Konwerter graficznego podglądu plików PDF',
- 'pdf_no_metadata' => 'nie można pobrać metadanych z pliku PDF',
- 'pdf_page_error' => 'Numer strony poza zakresem',
- 'exif-pdf-producer' => 'Program użyty do konwersji',
- 'exif-pdf-version' => 'Wersja formatu PDF',
- 'exif-pdf-encrypted' => 'Zaszyfrowany',
- 'exif-pdf-pagesize' => 'Wymiary strony',
-);
-
-/** Piedmontese (Piemontèis)
- * @author Borichèt
- * @author Dragonòt
- */
-$messages['pms'] = array(
- 'pdf-desc' => 'Ël gestor për vëdde ij file PDF an manera image',
- 'pdf_no_metadata' => 'as peulo nen pijesse ij metadat dal PDF',
- 'pdf_page_error' => "Ël nùmer ëd pàgina a l'é pa ant ël range",
- 'exif-pdf-producer' => 'Programa ëd conversion',
- 'exif-pdf-version' => 'Version dël formà PDF',
- 'exif-pdf-encrypted' => 'Criptà',
- 'exif-pdf-pagesize' => 'Dimension dla pàgina',
-);
-
-/** Western Punjabi (پنجابی)
- * @author Khalid Mahmood
- */
-$messages['pnb'] = array(
- 'pdf-desc' => 'پی ڈی ایف فائلاں امیج موڈ چ ویکھن لئی ہینڈلر',
- 'pdf_no_metadata' => 'پی ڈی ایف توں میٹاڈیٹا نئیں مل سکیا۔',
- 'pdf_page_error' => 'صفہ نمبر ولگن چ نئیں۔',
-);
-
-/** Portuguese (português)
- * @author Hamilton Abreu
- * @author Malafaya
- */
-$messages['pt'] = array(
- 'pdf-desc' => 'Manuseador de visionamento de ficheiros PDF em modo de imagem',
- 'pdf_no_metadata' => 'não foi possível obter os metadados do PDF',
- 'pdf_page_error' => 'Número de página fora do intervalo',
-);
-
-/** Brazilian Portuguese (português do Brasil)
- * @author Eduardo.mps
- * @author 555
- */
-$messages['pt-br'] = array(
- 'pdf-desc' => 'Ferramenta de visualização de arquivos PDF em modo de imagem',
- 'pdf_no_metadata' => 'Não foi possível obter os metadados do PDF',
- 'pdf_page_error' => 'Número de página fora do intervalo',
- 'exif-pdf-producer' => 'Programa de conversão',
- 'exif-pdf-version' => 'Versão do formato PDF',
- 'exif-pdf-encrypted' => 'Criptografado',
- 'exif-pdf-pagesize' => 'Tamanho da página',
-);
-
-/** Romanian (română)
- * @author Stelistcristi
- */
-$messages['ro'] = array(
- 'pdf-desc' => 'Operator pentru vizualizarea fișierelor PDF în modul de imagine',
- 'pdf_no_metadata' => 'Nu se poate obține metadate din PDF',
- 'pdf_page_error' => 'Numărul paginii nu e în șir',
- 'exif-pdf-pagesize' => 'Dimensiunea paginii',
-);
-
-/** tarandíne (tarandíne)
- * @author Joetaras
- */
-$messages['roa-tara'] = array(
- 'pdf-desc' => 'Gestore pe vedè le file PDF in mode immaggine',
- 'pdf_no_metadata' => "Non ge pozze pigghià le metadata da 'u PDF",
- 'pdf_page_error' => "Numere de pàgene fore da l'indervalle",
- 'exif-pdf-producer' => 'Programme de conversione',
- 'exif-pdf-version' => "Versione d'u formate PDF",
- 'exif-pdf-encrypted' => 'Criptate',
- 'exif-pdf-pagesize' => "Dimenzione d'a pàgene",
-);
-
-/** Russian (русский)
- * @author DCamer
- * @author Александр Сигачёв
- */
-$messages['ru'] = array(
- 'pdf-desc' => 'Обработчик для просмотра PDF-файлов в виде изображений',
- 'pdf_no_metadata' => 'невозможно получить метаданные из PDF',
- 'pdf_page_error' => 'Номер страницы вне диапазона',
- 'exif-pdf-producer' => 'Программа преобразования',
- 'exif-pdf-version' => 'Версия в формате PDF',
- 'exif-pdf-encrypted' => 'Шифрование',
- 'exif-pdf-pagesize' => 'Размер страницы',
-);
-
-/** Rusyn (русиньскый)
- * @author Gazeb
- */
-$messages['rue'] = array(
- 'pdf-desc' => 'Овладач про перегляд PDF файлів як образків',
- 'pdf_no_metadata' => 'Не годен обтримати метадата з PDF',
- 'pdf_page_error' => 'Чісло сторінкы не є в россягу',
-);
-
-/** Sanskrit (संस्कृतम्)
- * @author Shubha
- */
-$messages['sa'] = array(
- 'pdf-desc' => 'सुलेख(PDF)सञ्चिकाः चित्रदशायां दर्शनाय अपेक्षिता प्रणाली',
- 'pdf_no_metadata' => 'सुलेखात् मेटादत्तांशः प्राप्तुम् अशक्यः',
- 'pdf_page_error' => 'पृष्ठक्रमाङ्कः सीमायां न विद्यते',
-);
-
-/** Sakha (саха тыла)
- * @author HalanTul
- */
-$messages['sah'] = array(
- 'pdf-desc' => 'PDF билэлэри ойуу курдук көрдөрөөччү',
- 'pdf_no_metadata' => 'PDF-тан мета дааннайдарын ылар кыах суох',
- 'pdf_page_error' => 'Сирэй нүөмэрэ диапазоҥҥа киирбэт',
-);
-
-/** Sinhala (සිංහල)
- * @author Budhajeewa
- * @author පසිඳු කාවින්ද
- */
-$messages['si'] = array(
- 'pdf-desc' => 'PDF ගොනු රූප මාදිලියෙන් හසුරුවනය',
- 'pdf_no_metadata' => 'PDF ගොනුවෙන් මෙටාදත්ත ගත නොහැක',
- 'pdf_page_error' => 'පිටු අංකය නිවැරදි පරාසයේ නොමැත',
- 'exif-pdf-producer' => 'හැරවුම් වැඩසටහන',
- 'exif-pdf-version' => 'PDF ආකෘතියේ අනුවාදය',
- 'exif-pdf-encrypted' => 'ගුප්තකේතීකරණය වූ',
- 'exif-pdf-pagesize' => 'පිටු ප්‍රමාණය',
-);
-
-/** Slovak (slovenčina)
- * @author Helix84
- */
-$messages['sk'] = array(
- 'pdf-desc' => 'Obsluha zobrazovania PDF súborov v režime obrázkov',
- 'pdf_no_metadata' => 'nie je možné získať metadáta z PDF',
- 'pdf_page_error' => 'Číslo stránky nie je v intervale',
-);
-
-/** Slovenian (slovenščina)
- * @author Dbc334
- */
-$messages['sl'] = array(
- 'pdf-desc' => 'Upravljavec ogledovanja datotek PDF v slikovnem načinu',
- 'pdf_no_metadata' => 'Ne morem pridobiti metapodatkov iz PDF',
- 'pdf_page_error' => 'Številka strani ni v dosegu',
- 'exif-pdf-producer' => 'Pretvorbeni program',
- 'exif-pdf-version' => 'Različica oblike PDF',
- 'exif-pdf-encrypted' => 'Šifrirano',
- 'exif-pdf-pagesize' => 'Velikost strani',
-);
-
-/** Albanian (shqip)
- * @author Olsi
- */
-$messages['sq'] = array(
- 'pdf-desc' => 'Mbajtës për pamjen e skedave PDF në mënyrën e figurave',
- 'pdf_no_metadata' => 'Nuk mund të merren metadata nga PDF',
- 'pdf_page_error' => 'Numri i faqes nuk është në varg',
-);
-
-/** Serbian (Cyrillic script) (српски (ћирилица)‎)
- * @author Rancher
- * @author Михајло Анђелковић
- */
-$messages['sr-ec'] = array(
- 'pdf-desc' => 'Програм за прегледање PDF докумената у сликовном режиму',
- 'pdf_no_metadata' => 'Не могу да преузмем метаподатке из PDF-а',
- 'pdf_page_error' => 'Број страница ван опсега',
-);
-
-/** Serbian (Latin script) (srpski (latinica)‎)
- * @author Michaello
- */
-$messages['sr-el'] = array(
- 'pdf-desc' => 'Handler za pregled PDF fajlova kao slika',
- 'pdf_no_metadata' => 'Ne mogu se dobiti meta-podaci iz PDF-a',
- 'pdf_page_error' => 'Broj strane izlazi van opsega',
-);
-
-/** Seeltersk (Seeltersk)
- * @author Pyt
- */
-$messages['stq'] = array(
- 'pdf-desc' => 'Snitsteede foar dät Bekiekjen fon PDF-Doatäie in dän Bielde-Modus',
- 'pdf_no_metadata' => 'Neen Metadoaten in dät PDF deer.',
- 'pdf_page_error' => 'Siedentaal buute Riege.',
-);
-
-/** Swedish (svenska)
- * @author Ainali
- * @author M.M.S.
- */
-$messages['sv'] = array(
- 'pdf-desc' => 'Hantering av PDF-visning i bildläge',
- 'pdf_no_metadata' => 'Kan inte hämta metadata från PDF',
- 'pdf_page_error' => 'Sidnummer överstiger antal sidor i dokumentet',
- 'exif-pdf-producer' => 'Konverteringsprogram',
- 'exif-pdf-version' => 'Version av PDF-format',
- 'exif-pdf-encrypted' => 'Krypterad',
- 'exif-pdf-pagesize' => 'Sidstorlek',
-);
-
-/** Tamil (தமிழ்)
- * @author Shanmugamp7
- * @author TRYPPN
- * @author மதனாஹரன்
- */
-$messages['ta'] = array(
- 'pdf-desc' => 'PDF கோப்புகளை உருவ முறையில் பார்க்க கையாளுனர்',
- 'pdf_no_metadata' => 'PDF இருந்து மேல்தரவை பெற இயலவில்லை',
- 'pdf_page_error' => 'பக்கத்தின் எண் குறிப்பிட்ட வரையறையில் இல்லை',
- 'exif-pdf-producer' => 'மாற்றனிரல்',
- 'exif-pdf-pagesize' => 'பக்க அளவு',
-);
-
-/** Telugu (తెలుగు)
- * @author Veeven
- */
-$messages['te'] = array(
- 'pdf_page_error' => 'పుట సంఖ్య అవధిలో లేదు',
-);
-
-/** Turkmen (Türkmençe)
- * @author Hanberke
- */
-$messages['tk'] = array(
- 'pdf-desc' => 'PDF faýllaryny görkeziş režiminde görkezmek üçin işleýji',
- 'pdf_no_metadata' => 'PDF-den meta-maglumat alyp bolanok',
- 'pdf_page_error' => 'Sahypa belgisi diapazonda däl',
-);
-
-/** Tagalog (Tagalog)
- * @author AnakngAraw
- */
-$messages['tl'] = array(
- 'pdf-desc' => 'Tagapaghawak para sa pagtanaw ng mga talaksang PDF na nasa modalidad na panglarawan',
- 'pdf_no_metadata' => 'Hindi makuha ang dato ng meta mula sa PDF',
- 'pdf_page_error' => 'Wala sa sakop ang bilang ng pahina',
-);
-
-/** Turkish (Türkçe)
- * @author Joseph
- */
-$messages['tr'] = array(
- 'pdf-desc' => 'PDF dosyalarını görüntü modunda görüntülemek için işleyici',
- 'pdf_no_metadata' => "PDF'den metadata alınamıyor",
- 'pdf_page_error' => 'Sayfa numarası aralıkta değil',
-);
-
-/** Uyghur (Arabic script) (ئۇيغۇرچە)
- * @author Sahran
- */
-$messages['ug-arab'] = array(
- 'exif-pdf-encrypted' => 'شىفىرلانغان',
- 'exif-pdf-pagesize' => 'بەت چوڭلۇقى',
-);
-
-/** Ukrainian (українська)
- * @author Base
- * @author Prima klasy4na
- */
-$messages['uk'] = array(
- 'pdf-desc' => 'Оброблювач для перегляду PDF-файлів в режимі зображень',
- 'pdf_no_metadata' => 'Не виходить отримати метадані з PDF',
- 'pdf_page_error' => 'Номер сторінки не в діапазоні',
- 'exif-pdf-producer' => 'програма конвертації',
- 'exif-pdf-version' => 'Версія формату PDF',
- 'exif-pdf-encrypted' => 'Зашифровано',
- 'exif-pdf-pagesize' => 'Розмір сторінки',
-);
-
-/** Urdu (اردو)
- * @author පසිඳු කාවින්ද
- */
-$messages['ur'] = array(
- 'pdf_page_error' => 'صفحہ نمبر رینج میں نہیں',
-);
-
-/** vèneto (vèneto)
- * @author Candalua
- * @author GatoSelvadego
- */
-$messages['vec'] = array(
- 'pdf-desc' => 'Handler par vardar i file PDF in modalità imagine',
- 'pdf_no_metadata' => 'No se riesse a recuperar i metadati dal PDF',
- 'pdf_page_error' => "Nùmaro de pagina mia conpreso in te l'intervalo",
- 'exif-pdf-producer' => 'Programa de conversion',
- 'exif-pdf-version' => 'Version del formato PDF',
- 'exif-pdf-encrypted' => 'Critigrafà',
- 'exif-pdf-pagesize' => 'Dimension pàjina',
-);
-
-/** Vietnamese (Tiếng Việt)
- * @author Minh Nguyen
- * @author Vinhtantran
- */
-$messages['vi'] = array(
- 'pdf-desc' => 'Bộ xử lý để xem tập tin PDF ở dạng hình ảnh',
- 'pdf_no_metadata' => 'Không thấy truy xuất siêu dữ liệu từ PDF',
- 'pdf_page_error' => 'Số trang không nằm trong giới hạn',
- 'exif-pdf-producer' => 'Chương trình chuyển đổi',
- 'exif-pdf-version' => 'Phiên bản định dạng PDF',
- 'exif-pdf-encrypted' => 'Mã hóa',
- 'exif-pdf-pagesize' => 'Kích thước trang',
-);
-
-/** Yoruba (Yorùbá)
- * @author Demmy
- */
-$messages['yo'] = array(
- 'pdf_no_metadata' => 'Dátà-àtẹ̀yìnwá kó ṣe é mú láti inú PDF',
-);
-
-/** Cantonese (粵語)
- */
-$messages['yue'] = array(
- 'pdf-desc' => '響圖像模式睇PDF檔嘅處理器',
- 'pdf_no_metadata' => '唔能夠響PDF度拎metadata',
- 'pdf_page_error' => '頁數唔響範圍度',
-);
-
-/** Simplified Chinese (中文(简体)‎)
- * @author Shirayuki
- * @author Yfdyh000
- */
-$messages['zh-hans'] = array(
- 'pdf-desc' => '在图像模式中查看PDF文件的处理器。',
- 'pdf_no_metadata' => '无法在PDF中获取元数据。',
- 'pdf_page_error' => '页数不在范围内。',
- 'exif-pdf-producer' => '转换程序',
- 'exif-pdf-version' => 'PDF格式的版本',
- 'exif-pdf-encrypted' => '加密',
- 'exif-pdf-pagesize' => '页面大小',
-);
-
-/** Traditional Chinese (中文(繁體)‎)
- * @author Justincheng12345
- * @author Mark85296341
- * @author Simon Shek
- */
-$messages['zh-hant'] = array(
- 'pdf-desc' => '在圖片模式中查看PDF檔案的處理器',
- 'pdf_no_metadata' => '無法在 PDF 中擷取元數據',
- 'pdf_page_error' => '頁數不在範圍中',
- 'exif-pdf-producer' => '轉換程式',
- 'exif-pdf-version' => 'PDF格式的版本',
- 'exif-pdf-encrypted' => '加密',
- 'exif-pdf-pagesize' => '頁面大小',
-);
diff --git a/extensions/PdfHandler/PdfHandler.image.php b/extensions/PdfHandler/PdfHandler.image.php
deleted file mode 100644
index 49da7f4e..00000000
--- a/extensions/PdfHandler/PdfHandler.image.php
+++ /dev/null
@@ -1,309 +0,0 @@
-<?php
-/**
- *
- * Copyright © 2007 Xarax <jodeldi@gmx.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-/**
- * inspired by djvuimage from Brion Vibber
- * modified and written by xarax
- */
-
-class PdfImage {
-
- /**
- * @param $filename
- */
- function __construct( $filename ) {
- $this->mFilename = $filename;
- }
-
- /**
- * @return bool
- */
- public function isValid() {
- return true;
- }
-
- /**
- * @return array|bool
- */
- public function getImageSize() {
- $data = $this->retrieveMetadata();
- $size = self::getPageSize( $data, 1 );
-
- if( $size ) {
- $width = $size['width'];
- $height = $size['height'];
- return array( $width, $height, 'Pdf',
- "width=\"$width\" height=\"$height\"" );
- }
- return false;
- }
-
- /**
- * @param $data array
- * @param $page
- * @return array|bool
- */
- public static function getPageSize( $data, $page ) {
- global $wgPdfHandlerDpi;
-
- if( isset( $data['pages'][$page]['Page size'] ) ) {
- $o = $data['pages'][$page]['Page size'];
- } elseif( isset( $data['Page size'] ) ) {
- $o = $data['Page size'];
- } else {
- $o = false;
- }
-
- if ( $o ) {
- if( isset( $data['pages'][$page]['Page rot'] ) ) {
- $r = $data['pages'][$page]['Page rot'];
- } elseif( isset( $data['Page rot'] ) ) {
- $r = $data['Page rot'];
- } else {
- $r = 0;
- }
- $size = explode( 'x', $o, 2 );
-
- if ( $size ) {
- $width = intval( trim( $size[0] ) / 72 * $wgPdfHandlerDpi );
- $height = explode( ' ', trim( $size[1] ), 2 );
- $height = intval( trim( $height[0] ) / 72 * $wgPdfHandlerDpi );
- if ( ( $r/90 ) & 1 ) {
- // Swap width and height for landscape pages
- $t = $width;
- $width = $height;
- $height = $t;
- }
-
- return array(
- 'width' => $width,
- 'height' => $height
- );
- }
- }
-
- return false;
- }
-
- /**
- * @return array|bool|null
- */
- public function retrieveMetaData() {
- global $wgPdfInfo, $wgPdftoText;
-
- if ( $wgPdfInfo ) {
- wfProfileIn( 'pdfinfo' );
- $cmd = wfEscapeShellArg( $wgPdfInfo ) .
- " -enc UTF-8 " . # Report metadata as UTF-8 text...
- " -l 9999999 " . # Report page sizes for all pages
- " -meta " . # Report XMP metadata
- wfEscapeShellArg( $this->mFilename );
- $retval = '';
- $dump = wfShellExec( $cmd, $retval );
- $data = $this->convertDumpToArray( $dump );
- wfProfileOut( 'pdfinfo' );
- } else {
- $data = null;
- }
-
- # Read text layer
- if ( isset( $wgPdftoText ) ) {
- wfProfileIn( 'pdftotext' );
- $cmd = wfEscapeShellArg( $wgPdftoText ) . ' '. wfEscapeShellArg( $this->mFilename ) . ' - ';
- wfDebug( __METHOD__.": $cmd\n" );
- $retval = '';
- $txt = wfShellExec( $cmd, $retval );
- wfProfileOut( 'pdftotext' );
- if( $retval == 0 ) {
- $txt = str_replace( "\r\n", "\n", $txt );
- $pages = explode( "\f", $txt );
- foreach( $pages as $page => $pageText ) {
- # Get rid of invalid UTF-8, strip control characters
- # Note we need to do this per page, as \f page feed would be stripped.
- $pages[$page] = UtfNormal::cleanUp( $pageText );
- }
- $data['text'] = $pages;
- }
- }
- return $data;
- }
-
- /**
- * @param $dump string
- * @return array|bool
- */
- protected function convertDumpToArray( $dump ) {
- if ( strval( $dump ) == '' ) {
- return false;
- }
-
- $lines = explode( "\n", $dump );
- $data = array();
-
- // Metadata is always the last item, and spans multiple lines.
- $inMetadata = false;
-
- // Basically this loop will go through each line, splitting key value
- // pairs on the colon, until it gets to a "Metadata:\n" at which point
- // it will gather all remaining lines into the xmp key.
- foreach( $lines as $line ) {
- if ( $inMetadata ) {
- # Handle XMP differently due to diffence in line break
- $data['xmp'] .= "\n$line";
- continue;
- }
- $bits = explode( ':', $line, 2 );
- if( count( $bits ) > 1 ) {
- $key = trim( $bits[0] );
- if ( $key === 'Metadata' ) {
- $inMetadata = true;
- $data['xmp'] = '';
- continue;
- }
- $value = trim( $bits[1] );
- $matches = array();
- // "Page xx rot" will be in poppler 0.20's pdfinfo output
- // See https://bugs.freedesktop.org/show_bug.cgi?id=41867
- if( preg_match( '/^Page +(\d+) (size|rot)$/', $key, $matches ) ) {
- $data['pages'][$matches[1]][$matches[2] == 'size' ? 'Page size' : 'Page rot'] = $value;
- } else {
- $data[$key] = $value;
- }
- }
- }
- $data = $this->postProcessDump( $data );
- return $data;
- }
-
- /**
- * Postprocess the metadata (convert xmp into useful form, etc)
- *
- * This is used to generate the metadata table at the bottom
- * of the image description page.
- *
- * @param $data Array metadata
- * @return Array post-processed metadata
- */
- protected function postProcessDump( array $data ) {
-
- $meta = new BitmapMetadataHandler();
- $items = array();
- foreach( $data as $key => $val ) {
- switch ( $key ) {
- case 'Title':
- $items['ObjectName'] = $val;
- break;
- case 'Subject':
- $items['ImageDescription'] = $val;
- break;
- case 'Keywords':
- // Sometimes we have empty keywords. This seems
- // to be a product of how pdfinfo deals with keywords
- // with spaces in them. Filter such empty keywords
- $keyList = array_filter( explode( ' ', $val ) );
- if ( count( $keyList ) > 0 ) {
- $items['Keywords'] = $keyList;
- }
- break;
- case 'Author':
- $items['Artist'] = $val;
- break;
- case 'Creator':
- // Program used to create file.
- // Different from program used to convert to pdf.
- $items['Software'] = $val;
- break;
- case 'Producer':
- // Conversion program
- $items['pdf-Producer'] = $val;
- break;
- case 'ModTime':
- $timestamp = wfTimestamp( TS_EXIF, $val );
- if ( $timestamp ) {
- // 'if' is just paranoia
- $items['DateTime'] = $timestamp;
- }
- break;
- case 'CreationTime':
- $timestamp = wfTimestamp( TS_EXIF, $val );
- if ( $timestamp ) {
- $items['DateTimeDigitized'] = $timestamp;
- }
- break;
- // These last two (version and encryption) I was unsure
- // if we should include in the table, since they aren't
- // all that useful to editors. I leaned on the side
- // of including. However not including if file
- // is optimized/linearized since that is really useless
- // to an editor.
- case 'PDF version':
- $items['pdf-Version'] = $val;
- break;
- case 'Encrypted':
- // @todo: The value isn't i18n-ised. The appropriate
- // place to do that is in FormatMetadata.php
- // should add a hook a there.
- // For reference, if encrypted this fields value looks like:
- // "yes (print:yes copy:no change:no addNotes:no)"
- $items['pdf-Encrypted'] = $val;
- break;
- // Note 'pages' and 'Pages' are different keys (!)
- case 'pages':
- // A pdf document can have multiple sized pages in it.
- // (However 95% of the time, all pages are the same size)
- // get a list of all the unique page sizes in document.
- // This doesn't do anything with rotation as of yet,
- // mostly because I am unsure of what a good way to
- // present that information to the user would be.
- $pageSizes = array();
- foreach( $val as $page ) {
- if( isset( $page['Page size'] ) ) {
- $pageSizes[ $page['Page size'] ] = true;
- }
- }
-
- $pageSizeArray = array_keys( $pageSizes );
- if ( count( $pageSizeArray ) > 0 ) {
- $items['pdf-PageSize'] = $pageSizeArray;
- }
- break;
- }
-
- }
- $meta->addMetadata( $items, 'native' );
-
- if ( isset( $data['xmp'] ) && function_exists( 'xml_parser_create_ns' ) ) {
- // func exists verifies that the xml extension required for XMPReader
- // is present (Almost always is present)
- // @todo: This only handles generic xmp properties. Would be improved
- // by handling pdf xmp properties (pdf and pdfx) via XMPInfo hook.
- $xmp = new XMPReader();
- $xmp->parse( $data['xmp'] );
- $xmpRes = $xmp->getResults();
- foreach ( $xmpRes as $type => $xmpSection ) {
- $meta->addMetadata( $xmpSection, $type );
- }
- }
- unset( $data['xmp'] );
- $data['mergedMetadata'] = $meta->getMetadataArray();
- return $data;
- }
-}
diff --git a/extensions/PdfHandler/PdfHandler.php b/extensions/PdfHandler/PdfHandler.php
deleted file mode 100644
index dbae091f..00000000
--- a/extensions/PdfHandler/PdfHandler.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-/**
- * PDF Handler extension -- handler for viewing PDF files in image mode.
- *
- * @file
- * @ingroup Extensions
- * @author Martin Seidel (Xarax) <jodeldi@gmx.de>
- * @copyright Copyright © 2007 Martin Seidel (Xarax) <jodeldi@gmx.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-# Not a valid entry point, skip unless MEDIAWIKI is defined
-if ( !defined( 'MEDIAWIKI' ) ) {
- echo 'PdfHandler extension';
- exit( 1 );
-}
-
-$wgExtensionCredits['media'][] = array(
- 'path' => __FILE__,
- 'name' => 'PDF Handler',
- 'author' => array( 'Martin Seidel', 'Mike Połtyn' ),
- 'descriptionmsg' => 'pdf-desc',
- 'url' => 'https://www.mediawiki.org/wiki/Extension:PdfHandler',
-);
-
-// External program requirements...
-$wgPdfProcessor = 'gs';
-$wgPdfPostProcessor = 'convert';
-$wgPdfInfo = 'pdfinfo';
-$wgPdftoText = 'pdftotext';
-
-$wgPdfOutputExtension = 'jpg';
-$wgPdfHandlerDpi = 150;
-
-// This setting, if enabled, will put creating thumbnails into a job queue,
-// so they do not have to be created on-the-fly,
-// but rather inconspicuously during normal wiki browsing
-$wgPdfCreateThumbnailsInJobQueue = false;
-
-// To upload new PDF files you'll need to do this too:
-// $wgFileExtensions[] = 'pdf';
-
-$dir = dirname( __FILE__ ) . '/';
-$wgExtensionMessagesFiles['PdfHandler'] = $dir . 'PdfHandler.i18n.php';
-$wgAutoloadClasses['PdfImage'] = $dir . 'PdfHandler.image.php';
-$wgAutoloadClasses['PdfHandler'] = $dir . 'PdfHandler_body.php';
-$wgAutoloadClasses['CreatePdfThumbnailsJob'] = $dir . 'CreatePdfThumbnailsJob.class.php';
-$wgMediaHandlers['application/pdf'] = 'PdfHandler';
-$wgJobClasses['createPdfThumbnailsJob'] = 'CreatePdfThumbnailsJob';
-$wgHooks['UploadVerifyFile'][] = 'CreatePdfThumbnailsJob::insertJobs';
diff --git a/extensions/PdfHandler/PdfHandler_body.php b/extensions/PdfHandler/PdfHandler_body.php
deleted file mode 100644
index d9ed4884..00000000
--- a/extensions/PdfHandler/PdfHandler_body.php
+++ /dev/null
@@ -1,362 +0,0 @@
-<?php
-/**
- * Copyright © 2007 Martin Seidel (Xarax) <jodeldi@gmx.de>
- *
- * Inspired by djvuhandler from Tim Starling
- * Modified and written by Xarax
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class PdfHandler extends ImageHandler {
-
- /**
- * @return bool
- */
- function isEnabled() {
- global $wgPdfProcessor, $wgPdfPostProcessor, $wgPdfInfo;
-
- if ( !isset( $wgPdfProcessor ) || !isset( $wgPdfPostProcessor ) || !isset( $wgPdfInfo ) ) {
- wfDebug( "PdfHandler is disabled, please set the following\n" );
- wfDebug( "variables in LocalSettings.php:\n" );
- wfDebug( "\$wgPdfProcessor, \$wgPdfPostProcessor, \$wgPdfInfo\n" );
- return false;
- }
- return true;
- }
-
- /**
- * @param $file
- * @return bool
- */
- function mustRender( $file ) {
- return true;
- }
-
- /**
- * @param $file
- * @return bool
- */
- function isMultiPage( $file ) {
- return true;
- }
-
- /**
- * @param $name
- * @param $value
- * @return bool
- */
- function validateParam( $name, $value ) {
- if ( in_array( $name, array( 'width', 'height', 'page' ) ) ) {
- return ( $value > 0 );
- }
- return false;
- }
-
- /**
- * @param $params array
- * @return bool|string
- */
- function makeParamString( $params ) {
- $page = isset( $params['page'] ) ? $params['page'] : 1;
- if ( !isset( $params['width'] ) ) {
- return false;
- }
- return "page{$page}-{$params['width']}px";
- }
-
- /**
- * @param $str string
- * @return array|bool
- */
- function parseParamString( $str ) {
- $m = false;
-
- if ( preg_match( '/^page(\d+)-(\d+)px$/', $str, $m ) ) {
- return array( 'width' => $m[2], 'page' => $m[1] );
- }
-
- return false;
- }
-
- /**
- * @param $params array
- * @return array
- */
- function getScriptParams( $params ) {
- return array(
- 'width' => $params['width'],
- 'page' => $params['page'],
- );
- }
-
- /**
- * @return array
- */
- function getParamMap() {
- return array(
- 'img_width' => 'width',
- 'img_page' => 'page',
- );
- }
-
- /**
- * @param $width
- * @param $height
- * @param $msg
- * @return MediaTransformError
- */
- protected function doThumbError( $width, $height, $msg ) {
- return new MediaTransformError( 'thumbnail_error',
- $width, $height, wfMessage( $msg )->inContentLanguage()->text() );
- }
-
- /**
- * @param $image File
- * @param $dstPath string
- * @param $dstUrl string
- * @param $params array
- * @param $flags int
- * @return MediaTransformError|MediaTransformOutput|ThumbnailImage|TransformParameterError
- */
- function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
- global $wgPdfProcessor, $wgPdfPostProcessor, $wgPdfHandlerDpi;
-
- $metadata = $image->getMetadata();
-
- if ( !$metadata ) {
- return $this->doThumbError(
- isset( $params['width'] ) ? $params['width'] : null,
- isset( $params['height'] ) ? $params['height'] : null,
- 'pdf_no_metadata'
- );
- }
-
- if ( !$this->normaliseParams( $image, $params ) ) {
- return new TransformParameterError( $params );
- }
-
- $width = $params['width'];
- $height = $params['height'];
- $page = $params['page'];
-
- if ( $page > $this->pageCount( $image ) ) {
- return $this->doThumbError( $width, $height, 'pdf_page_error' );
- }
-
- if ( $flags & self::TRANSFORM_LATER ) {
- return new ThumbnailImage( $image, $dstUrl, $width, $height, false, $page );
- }
-
- if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
- return $this->doThumbError( $width, $height, 'thumbnail_dest_directory' );
- }
-
- $srcPath = $image->getLocalRefPath();
-
- $cmd = '(' . wfEscapeShellArg(
- $wgPdfProcessor,
- "-sDEVICE=jpeg",
- "-sOutputFile=-",
- "-dFirstPage={$page}",
- "-dLastPage={$page}",
- "-r{$wgPdfHandlerDpi}",
- "-dBATCH",
- "-dNOPAUSE",
- "-q",
- $srcPath
- );
- $cmd .= " | " . wfEscapeShellArg(
- $wgPdfPostProcessor,
- "-depth",
- "8",
- "-resize",
- $width,
- "-",
- $dstPath
- );
- $cmd .= ") 2>&1";
-
- wfProfileIn( 'PdfHandler' );
- wfDebug( __METHOD__ . ": $cmd\n" );
- $retval = '';
- $err = wfShellExec( $cmd, $retval );
- wfProfileOut( 'PdfHandler' );
-
- $removed = $this->removeBadFile( $dstPath, $retval );
-
- if ( $retval != 0 || $removed ) {
- wfDebugLog( 'thumbnail',
- sprintf( 'thumbnail failed on %s: error %d "%s" from "%s"',
- wfHostname(), $retval, trim( $err ), $cmd ) );
- return new MediaTransformError( 'thumbnail_error', $width, $height, $err );
- } else {
- return new ThumbnailImage( $image, $dstUrl, $width, $height, $dstPath, $page );
- }
- }
-
- /**
- * @param $image File
- * @param $path string
- * @return PdfImage
- */
- function getPdfImage( $image, $path ) {
- if ( !$image ) {
- $pdfimg = new PdfImage( $path );
- } elseif ( !isset( $image->pdfImage ) ) {
- $pdfimg = $image->pdfImage = new PdfImage( $path );
- } else {
- $pdfimg = $image->pdfImage;
- }
-
- return $pdfimg;
- }
-
- /**
- * @param $image File
- * @return bool
- */
- function getMetaArray( $image ) {
- if ( isset( $image->pdfMetaArray ) ) {
- return $image->pdfMetaArray;
- }
-
- $metadata = $image->getMetadata();
-
- if ( !$this->isMetadataValid( $image, $metadata ) ) {
- wfDebug( "Pdf metadata is invalid or missing, should have been fixed in upgradeRow\n" );
- return false;
- }
-
- wfProfileIn( __METHOD__ );
- wfSuppressWarnings();
- $image->pdfMetaArray = unserialize( $metadata );
- wfRestoreWarnings();
- wfProfileOut( __METHOD__ );
-
- return $image->pdfMetaArray;
- }
-
- /**
- * @param $image File
- * @param $path string
- * @return array|bool
- */
- function getImageSize( $image, $path ) {
- return $this->getPdfImage( $image, $path )->getImageSize();
- }
-
- /**
- * @param $ext
- * @param $mime string
- * @param $params null
- * @return array
- */
- function getThumbType( $ext, $mime, $params = null ) {
- global $wgPdfOutputExtension;
- static $mime;
-
- if ( !isset( $mime ) ) {
- $magic = MimeMagic::singleton();
- $mime = $magic->guessTypesForExtension( $wgPdfOutputExtension );
- }
- return array( $wgPdfOutputExtension, $mime );
- }
-
- /**
- * @param $image File
- * @param $path string
- * @return string
- */
- function getMetadata( $image, $path ) {
- return serialize( $this->getPdfImage( $image, $path )->retrieveMetaData() );
- }
-
- /**
- * @param $image File
- * @param $metadata string
- * @return bool
- */
- function isMetadataValid( $image, $metadata ) {
- if ( !$metadata || $metadata === serialize(array()) ) {
- return self::METADATA_BAD;
- } elseif ( strpos( $metadata, 'mergedMetadata' ) === false ) {
- return self::METADATA_COMPATIBLE;
- }
- return self::METADATA_GOOD;
- }
-
- /**
- * @param $image File
- * @return bool|int
- */
- function formatMetadata( $image ) {
- $meta = $image->getMetadata();
-
- if ( !$meta ) {
- return false;
- }
- wfSuppressWarnings();
- $meta = unserialize( $meta );
- wfRestoreWarnings();
-
- if ( !isset( $meta['mergedMetadata'] )
- || !is_array( $meta['mergedMetadata'] )
- || count( $meta['mergedMetadata'] ) < 1
- ) {
- return false;
- }
-
- // Inherited from MediaHandler.
- return $this->formatMetadataHelper( $meta['mergedMetadata'] );
- }
-
- /**
- * @param $image
- * @return bool|int
- */
- function pageCount( $image ) {
- $data = $this->getMetaArray( $image );
- if ( !$data || !isset( $data['Pages'] ) ) {
- return false;
- }
- return intval( $data['Pages'] );
- }
-
- /**
- * @param $image File
- * @param $page int
- * @return array|bool
- */
- function getPageDimensions( $image, $page ) {
- $data = $this->getMetaArray( $image );
- return PdfImage::getPageSize( $data, $page );
- }
-
- /**
- * @param $image File
- * @param $page int
- * @return bool
- */
- function getPageText( $image, $page ) {
- $data = $this->getMetaArray( $image, true );
- if ( !$data || !isset( $data['text'] ) || !isset( $data['text'][$page - 1] ) ) {
- return false;
- }
- return $data['text'][$page - 1];
- }
-
-}
diff --git a/extensions/SimpleAntiSpam/SimpleAntiSpam.php b/extensions/SimpleAntiSpam/SimpleAntiSpam.php
new file mode 100644
index 00000000..9a70ad9f
--- /dev/null
+++ b/extensions/SimpleAntiSpam/SimpleAntiSpam.php
@@ -0,0 +1,5 @@
+<?php
+// The SimpleAntiSpam extension has been discontinued and its
+// functionality was moved into MediaWiki core in version 1.22. If you
+//see this file, you should remove the extension from your MediaWiki
+// installation.
diff --git a/extensions/Vector/README b/extensions/Vector/README
new file mode 100644
index 00000000..386c3c6d
--- /dev/null
+++ b/extensions/Vector/README
@@ -0,0 +1,9 @@
+The Vector extension has been discontinued and most of its
+functionality was moved into MediaWiki core. If you see this file,
+you should remove the extension from your MediaWiki installation.
+
+It used to provide enhancements to the Vector skin, some experimental,
+some well-established. The good parts have been integrated and the
+failed experiments were removed.
+
+See: https://www.mediawiki.org/wiki/Extension:Vector
diff --git a/extensions/Vector/Vector.php b/extensions/Vector/Vector.php
new file mode 100644
index 00000000..041d5c84
--- /dev/null
+++ b/extensions/Vector/Vector.php
@@ -0,0 +1,6 @@
+<?php
+// The Vector extension has been discontinued and most of its
+// functionality was moved into MediaWiki core. If you see this file,
+// you should remove the extension from your MediaWiki installation.
+//
+// See: https://www.mediawiki.org/wiki/Extension:Vector
diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php
index 4eb979ac..78568107 100644
--- a/includes/DefaultSettings.php
+++ b/includes/DefaultSettings.php
@@ -63,7 +63,7 @@ $wgConf = new SiteConfiguration;
* MediaWiki version number
* @since 1.2
*/
-$wgVersion = '1.22.8';
+$wgVersion = '1.22.15';
/**
* Name of the site. It must be changed in LocalSettings.php
@@ -3322,6 +3322,27 @@ $wgResourceLoaderLESSImportPaths = array(
"$IP/resources/mediawiki.less/",
);
+/**
+ * Whether to allow site-wide CSS (MediaWiki:Common.css and friends) on
+ * restricted pages like Special:UserLogin or Special:Preferences where
+ * JavaScript is disabled for security reasons. As it is possible to
+ * execute JavaScript through CSS, setting this to true opens up a
+ * potential security hole. Some sites may "skin" their wiki by using
+ * site-wide CSS, causing restricted pages to look unstyled and different
+ * from the rest of the site.
+ *
+ * @since 1.25
+ */
+$wgAllowSiteCSSOnRestrictedPages = false;
+
+/**
+ * When OutputHandler is used, mangle any output that contains
+ * <cross-domain-policy>. Without this, an attacker can send their own
+ * cross-domain policy unless it is prevented by the crossdomain.xml file at
+ * the domain root.
+ */
+$wgMangleFlashPolicy = true;
+
/** @} */ # End of resource loader settings }
/*************************************************************************//**
diff --git a/includes/EditPage.php b/includes/EditPage.php
index 16d9a5a4..4dd83845 100644
--- a/includes/EditPage.php
+++ b/includes/EditPage.php
@@ -156,6 +156,12 @@ class EditPage {
const AS_IMAGE_REDIRECT_LOGGED = 234;
/**
+ * Status: user tried to modify the content model, but is not allowed to do that
+ * ( User::isAllowed('editcontentmodel') == false )
+ */
+ const AS_NO_CHANGE_CONTENT_MODEL = 235;
+
+ /**
* Status: can't parse content
*/
const AS_PARSE_ERROR = 240;
@@ -1289,6 +1295,9 @@ class EditPage {
$permission = $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage';
throw new PermissionsError( $permission );
+ case self::AS_NO_CHANGE_CONTENT_MODEL:
+ throw new PermissionsError( 'editcontentmodel' );
+
default:
// We don't recognize $status->value. The only way that can happen
// is if an extension hook aborted from inside ArticleSave.
@@ -1503,6 +1512,15 @@ class EditPage {
}
}
+ if ( $this->contentModel !== $this->mTitle->getContentModel()
+ && !$wgUser->isAllowed( 'editcontentmodel' )
+ ) {
+ $status->setResult( false, self::AS_NO_CHANGE_CONTENT_MODEL );
+ wfProfileOut( __METHOD__ . '-checks' );
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
if ( wfReadOnly() ) {
$status->fatal( 'readonlytext' );
$status->value = self::AS_READ_ONLY_PAGE;
diff --git a/includes/ImagePage.php b/includes/ImagePage.php
index 7ea06b0e..d696a17c 100644
--- a/includes/ImagePage.php
+++ b/includes/ImagePage.php
@@ -420,6 +420,8 @@ class ImagePage extends Article {
if ( $page > 1 ) {
$label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
+ // on the client side, this link is generated in ajaxifyPageNavigation()
+ // in the mediawiki.page.image.pagination module
$link = Linker::linkKnown(
$this->getTitle(),
$label,
diff --git a/includes/OutputHandler.php b/includes/OutputHandler.php
index 3860b8e2..65bb86e7 100644
--- a/includes/OutputHandler.php
+++ b/includes/OutputHandler.php
@@ -28,8 +28,10 @@
* @return string
*/
function wfOutputHandler( $s ) {
- global $wgDisableOutputCompression, $wgValidateAllHtml;
- $s = wfMangleFlashPolicy( $s );
+ global $wgDisableOutputCompression, $wgValidateAllHtml, $wgMangleFlashPolicy;
+ if ( $wgMangleFlashPolicy ) {
+ $s = wfMangleFlashPolicy( $s );
+ }
if ( $wgValidateAllHtml ) {
$headers = headers_list();
$isHTML = false;
diff --git a/includes/OutputPage.php b/includes/OutputPage.php
index 7f0454f6..e6d4339f 100644
--- a/includes/OutputPage.php
+++ b/includes/OutputPage.php
@@ -151,9 +151,11 @@ class OutputPage extends ContextSource {
var $mFeedLinksAppendQuery = null;
- # What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
- # @see ResourceLoaderModule::$origin
- # ResourceLoaderModule::ORIGIN_ALL is assumed unless overridden;
+ /** @var array
+ * What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
+ * @see ResourceLoaderModule::$origin
+ * ResourceLoaderModule::ORIGIN_ALL is assumed unless overridden;
+ */
protected $mAllowedModules = array(
ResourceLoaderModule::TYPE_COMBINED => ResourceLoaderModule::ORIGIN_ALL,
);
@@ -1273,12 +1275,29 @@ class OutputPage extends ContextSource {
/**
* Do not allow scripts which can be modified by wiki users to load on this page;
* only allow scripts bundled with, or generated by, the software.
+ * Site-wide styles are controlled by a config setting, since they can be
+ * used to create a custom skin/theme, but not user-specific ones.
+ *
+ * @todo this should be given a more accurate name
*/
public function disallowUserJs() {
+ global $wgAllowSiteCSSOnRestrictedPages;
$this->reduceAllowedModules(
ResourceLoaderModule::TYPE_SCRIPTS,
ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL
);
+
+ // Site-wide styles are controlled by a config setting, see bug 71621
+ // for background on why. User styles are never allowed.
+ if ( $wgAllowSiteCSSOnRestrictedPages ) {
+ $styleOrigin = ResourceLoaderModule::ORIGIN_USER_SITEWIDE;
+ } else {
+ $styleOrigin = ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL;
+ }
+ $this->reduceAllowedModules(
+ ResourceLoaderModule::TYPE_STYLES,
+ $styleOrigin
+ );
}
/**
@@ -1293,10 +1312,11 @@ class OutputPage extends ContextSource {
}
/**
- * Show what level of JavaScript / CSS untrustworthiness is allowed on this page
+ * Get the level of JavaScript / CSS untrustworthiness allowed on this page.
+ *
* @see ResourceLoaderModule::$origin
* @param string $type ResourceLoaderModule TYPE_ constant
- * @return Int ResourceLoaderModule ORIGIN_ class constant
+ * @return int ResourceLoaderModule ORIGIN_ class constant
*/
public function getAllowedModules( $type ) {
if ( $type == ResourceLoaderModule::TYPE_COMBINED ) {
@@ -1310,17 +1330,26 @@ class OutputPage extends ContextSource {
/**
* Set the highest level of CSS/JS untrustworthiness allowed
- * @param $type String ResourceLoaderModule TYPE_ constant
- * @param $level Int ResourceLoaderModule class constant
+ *
+ * @deprecated since 1.24 Raising level of allowed untrusted content is no longer supported.
+ * Use reduceAllowedModules() instead
+ *
+ * @param string $type ResourceLoaderModule TYPE_ constant
+ * @param int $level ResourceLoaderModule class constant
*/
public function setAllowedModules( $type, $level ) {
- $this->mAllowedModules[$type] = $level;
+ wfDeprecated( __METHOD__, '1.24' );
+ $this->reduceAllowedModules( $type, $level );
}
/**
- * As for setAllowedModules(), but don't inadvertently make the page more accessible
- * @param $type String
- * @param $level Int ResourceLoaderModule class constant
+ * Limit the highest level of CSS/JS untrustworthiness allowed.
+ *
+ * If passed the same or a higher level than the current level of untrustworthiness set, the
+ * level will remain unchanged.
+ *
+ * @param string $type
+ * @param int $level ResourceLoaderModule class constant
*/
public function reduceAllowedModules( $type, $level ) {
$this->mAllowedModules[$type] = min( $this->getAllowedModules( $type ), $level );
@@ -1574,6 +1603,8 @@ class OutputPage extends ContextSource {
$this->addModuleScripts( $parserOutput->getModuleScripts() );
$this->addModuleStyles( $parserOutput->getModuleStyles() );
$this->addModuleMessages( $parserOutput->getModuleMessages() );
+ $this->mPreventClickjacking = $this->mPreventClickjacking
+ || $parserOutput->preventClickjacking();
// Template versioning...
foreach ( (array)$parserOutput->getTemplateIds() as $ns => $dbks ) {
@@ -1874,6 +1905,16 @@ class OutputPage extends ContextSource {
}
/**
+ * Get the prevent-clickjacking flag
+ *
+ * @since 1.24
+ * @return boolean
+ */
+ public function getPreventClickjacking() {
+ return $this->mPreventClickjacking;
+ }
+
+ /**
* Get the X-Frame-Options header value (without the name part), or false
* if there isn't one. This is used by Skin to determine whether to enable
* JavaScript frame-breaking, for clients that don't support X-Frame-Options.
diff --git a/includes/Sanitizer.php b/includes/Sanitizer.php
index 9e9ac38b..3ca66443 100644
--- a/includes/Sanitizer.php
+++ b/includes/Sanitizer.php
@@ -819,24 +819,16 @@ class Sanitizer {
}
/**
- * Pick apart some CSS and check it for forbidden or unsafe structures.
- * Returns a sanitized string. This sanitized string will have
- * character references and escape sequences decoded and comments
- * stripped (unless it is itself one valid comment, in which case the value
- * will be passed through). If the input is just too evil, only a comment
- * complaining about evilness will be returned.
- *
- * Currently URL references, 'expression', 'tps' are forbidden.
- *
- * NOTE: Despite the fact that character references are decoded, the
- * returned string may contain character references given certain
- * clever input strings. These character references must
- * be escaped before the return value is embedded in HTML.
- *
- * @param $value String
- * @return String
+ * Normalize CSS into a format we can easily search for hostile input
+ * - decode character references
+ * - decode escape sequences
+ * - convert characters that IE6 interprets into ascii
+ * - remove comments, unless the entire value is one single comment
+ * @param string $value the css string
+ * @return string normalized css
*/
- static function checkCss( $value ) {
+ public static function normalizeCss( $value ) {
+
// Decode character references like &#123;
$value = Sanitizer::decodeCharReferences( $value );
@@ -922,6 +914,31 @@ class Sanitizer {
$value
);
+ return $value;
+ }
+
+
+ /**
+ * Pick apart some CSS and check it for forbidden or unsafe structures.
+ * Returns a sanitized string. This sanitized string will have
+ * character references and escape sequences decoded and comments
+ * stripped (unless it is itself one valid comment, in which case the value
+ * will be passed through). If the input is just too evil, only a comment
+ * complaining about evilness will be returned.
+ *
+ * Currently URL references, 'expression', 'tps' are forbidden.
+ *
+ * NOTE: Despite the fact that character references are decoded, the
+ * returned string may contain character references given certain
+ * clever input strings. These character references must
+ * be escaped before the return value is embedded in HTML.
+ *
+ * @param string $value
+ * @return string
+ */
+ static function checkCss( $value ) {
+ $value = self::normalizeCss( $value );
+
// Reject problematic keywords and control characters
if ( preg_match( '/[\000-\010\013\016-\037\177]/', $value ) ) {
return '/* invalid control char */';
diff --git a/includes/User.php b/includes/User.php
index 62324043..4c7a39df 100644
--- a/includes/User.php
+++ b/includes/User.php
@@ -122,6 +122,7 @@ class User {
'deletelogentry',
'deleterevision',
'edit',
+ 'editcontentmodel',
'editinterface',
'editprotected',
'editmyoptions',
diff --git a/includes/XmlTypeCheck.php b/includes/XmlTypeCheck.php
index eb98a4ad..aca857e9 100644
--- a/includes/XmlTypeCheck.php
+++ b/includes/XmlTypeCheck.php
@@ -40,6 +40,23 @@ class XmlTypeCheck {
public $rootElement = '';
/**
+ * A stack of strings containing the data of each xml element as it's processed. Append
+ * data to the top string of the stack, then pop off the string and process it when the
+ * element is closed.
+ */
+ protected $elementData = array();
+
+ /**
+ * A stack of element names and attributes, as we process them.
+ */
+ protected $elementDataContext = array();
+
+ /**
+ * Current depth of the data stack.
+ */
+ protected $stackDepth = 0;
+
+ /**
* Additional parsing options
*/
private $parserOptions = array(
@@ -51,7 +68,7 @@ class XmlTypeCheck {
* @param callable $filterCallback (optional)
* Function to call to do additional custom validity checks from the
* SAX element handler event. This gives you access to the element
- * namespace, name, and attributes, but not to text contents.
+ * namespace, name, attributes, and text contents.
* Filter should return 'true' to toggle on $this->filterMatch
* @param boolean $isFile (optional) indicates if the first parameter is a
* filename (default, true) or if it is a string (false)
@@ -179,7 +196,12 @@ class XmlTypeCheck {
$this->rootElement = $name;
if ( is_callable( $this->filterCallback ) ) {
- xml_set_element_handler( $parser, array( $this, 'elementOpen' ), false );
+ xml_set_element_handler(
+ $parser,
+ array( $this, 'elementOpen' ),
+ array( $this, 'elementClose' )
+ );
+ xml_set_character_data_handler( $parser, array( $this, 'elementData' ) );
$this->elementOpen( $parser, $name, $attribs );
} else {
// We only need the first open element
@@ -193,7 +215,26 @@ class XmlTypeCheck {
* @param $attribs
*/
private function elementOpen( $parser, $name, $attribs ) {
- if ( call_user_func( $this->filterCallback, $name, $attribs ) ) {
+ $this->elementDataContext[] = array( $name, $attribs );
+ $this->elementData[] = '';
+ $this->stackDepth++;
+ }
+
+ /**
+ * @param $parser
+ * @param $name
+ */
+ private function elementClose( $parser, $name ) {
+ list( $name, $attribs ) = array_pop( $this->elementDataContext );
+ $data = array_pop( $this->elementData );
+ $this->stackDepth--;
+
+ if ( call_user_func(
+ $this->filterCallback,
+ $name,
+ $attribs,
+ $data
+ ) ) {
// Filter hit!
$this->filterMatch = true;
}
@@ -201,6 +242,16 @@ class XmlTypeCheck {
/**
* @param $parser
+ * @param $data
+ */
+ private function elementData( $parser, $data ) {
+ // xml_set_character_data_handler breaks the data on & characters, so
+ // we collect any data here, and we'll run the callback in elementClose
+ $this->elementData[ $this->stackDepth - 1 ] .= trim( $data );
+ }
+
+ /**
+ * @param $parser
* @param $target
* @param $data
*/
diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php
index ce6ecda6..c1454e76 100644
--- a/includes/api/ApiBase.php
+++ b/includes/api/ApiBase.php
@@ -1351,6 +1351,7 @@ abstract class ApiBase extends ContextSource {
'permdenied-undelete' => array( 'code' => 'permissiondenied', 'info' => "You don't have permission to restore deleted revisions" ),
'createonly-exists' => array( 'code' => 'articleexists', 'info' => "The article you tried to create has been created already" ),
'nocreate-missing' => array( 'code' => 'missingtitle', 'info' => "The article you tried to edit doesn't exist" ),
+ 'cantchangecontentmodel' => array( 'code' => 'cantchangecontentmodel', 'info' => "You don't have permission to change the content model of a page" ),
'nosuchrcid' => array( 'code' => 'nosuchrcid', 'info' => "There is no change with rcid \"\$1\"" ),
'protect-invalidaction' => array( 'code' => 'protect-invalidaction', 'info' => "Invalid protection type \"\$1\"" ),
'protect-invalidlevel' => array( 'code' => 'protect-invalidlevel', 'info' => "Invalid protection level \"\$1\"" ),
diff --git a/includes/api/ApiEditPage.php b/includes/api/ApiEditPage.php
index bd61895b..51c9efc6 100644
--- a/includes/api/ApiEditPage.php
+++ b/includes/api/ApiEditPage.php
@@ -423,6 +423,9 @@ class ApiEditPage extends ApiBase {
case EditPage::AS_NO_CREATE_PERMISSION:
$this->dieUsageMsg( 'nocreate-loggedin' );
+ case EditPage::AS_NO_CHANGE_CONTENT_MODEL:
+ $this->dieUsageMsg( 'cantchangecontentmodel' );
+
case EditPage::AS_BLANK_ARTICLE:
$this->dieUsageMsg( 'blankpage' );
diff --git a/includes/api/ApiFormatJson.php b/includes/api/ApiFormatJson.php
index 342a580f..47d82124 100644
--- a/includes/api/ApiFormatJson.php
+++ b/includes/api/ApiFormatJson.php
@@ -62,10 +62,22 @@ class ApiFormatJson extends ApiFormatBase {
$this->getIsHtml(),
$params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK
);
+
+ // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+ // Flash, but what it does isn't friendly for the API, so we need to
+ // work around it.
+ if ( preg_match( '/\<\s*cross-domain-policy\s*\>/i', $json ) ) {
+ $json = preg_replace(
+ '/\<(\s*cross-domain-policy\s*)\>/i', '\\u003C$1\\u003E', $json
+ );
+ }
+
$callback = $params['callback'];
if ( $callback !== null ) {
$callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback );
- $this->printText( "$callback($json)" );
+ # Prepend a comment to try to avoid attacks against content
+ # sniffers, such as bug 68187.
+ $this->printText( "/**/$callback($json)" );
} else {
$this->printText( $json );
}
diff --git a/includes/api/ApiFormatPhp.php b/includes/api/ApiFormatPhp.php
index b2d1f044..bda1c180 100644
--- a/includes/api/ApiFormatPhp.php
+++ b/includes/api/ApiFormatPhp.php
@@ -35,7 +35,24 @@ class ApiFormatPhp extends ApiFormatBase {
}
public function execute() {
- $this->printText( serialize( $this->getResultData() ) );
+ global $wgMangleFlashPolicy;
+ $text = serialize( $this->getResultData() );
+
+ // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+ // Flash, but what it does isn't friendly for the API. There's nothing
+ // we can do here that isn't actively broken in some manner, so let's
+ // just be broken in a useful manner.
+ if ( $wgMangleFlashPolicy &&
+ in_array( 'wfOutputHandler', ob_list_handlers(), true ) &&
+ preg_match( '/\<\s*cross-domain-policy\s*\>/i', $text )
+ ) {
+ $this->dieUsage(
+ 'This response cannot be represented using format=php. See https://bugzilla.wikimedia.org/show_bug.cgi?id=66776',
+ 'internalerror'
+ );
+ }
+
+ $this->printText( $text );
}
public function getDescription() {
diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php
index c11f16cb..ea2fcc78 100644
--- a/includes/api/ApiMain.php
+++ b/includes/api/ApiMain.php
@@ -510,7 +510,7 @@ class ApiMain extends ApiBase {
array( '.*?', '.' ),
$wildcard
);
- return "/https?:\/\/$wildcard/";
+ return "/^https?:\/\/$wildcard$/";
}
protected function sendCacheHeaders() {
diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php
index 26774ef4..ecd117e4 100644
--- a/includes/api/ApiQueryLogEvents.php
+++ b/includes/api/ApiQueryLogEvents.php
@@ -36,7 +36,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
}
private $fld_ids = false, $fld_title = false, $fld_type = false,
- $fld_action = false, $fld_user = false, $fld_userid = false,
+ $fld_user = false, $fld_userid = false,
$fld_timestamp = false, $fld_comment = false, $fld_parsedcomment = false,
$fld_details = false, $fld_tags = false;
@@ -49,7 +49,6 @@ class ApiQueryLogEvents extends ApiQueryBase {
$this->fld_ids = isset( $prop['ids'] );
$this->fld_title = isset( $prop['title'] );
$this->fld_type = isset( $prop['type'] );
- $this->fld_action = isset( $prop['action'] );
$this->fld_user = isset( $prop['user'] );
$this->fld_userid = isset( $prop['userid'] );
$this->fld_timestamp = isset( $prop['timestamp'] );
@@ -304,6 +303,9 @@ class ApiQueryLogEvents extends ApiQueryBase {
if ( LogEventsList::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
$vals['actionhidden'] = '';
} else {
+ if ( $this->fld_type ) {
+ $vals['action'] = $row->log_action;
+ }
if ( $this->fld_title ) {
ApiQueryBase::addTitleInfo( $vals, $title );
}
@@ -313,7 +315,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
}
}
- if ( $this->fld_type || $this->fld_action ) {
+ if ( $this->fld_type ) {
$vals['type'] = $row->log_type;
$vals['action'] = $row->log_action;
}
diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php
index fb2d4359..9009b328 100644
--- a/includes/db/DatabaseOracle.php
+++ b/includes/db/DatabaseOracle.php
@@ -1304,6 +1304,10 @@ class DatabaseOracle extends DatabaseBase {
throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
}
+ if ( is_object( $val ) ) {
+ $val = $val->getData();
+ }
+
if ( $col_type == 'BLOB' ) {
$lob[$col]->writeTemporary( $val );
oci_bind_by_name( $stmt, ":$col", $lob[$col], - 1, SQLT_BLOB );
diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php
index fe769be2..d18f42e4 100644
--- a/includes/filerepo/file/LocalFile.php
+++ b/includes/filerepo/file/LocalFile.php
@@ -423,6 +423,8 @@ class LocalFile extends File {
$decoded['timestamp'] = wfTimestamp( TS_MW, $decoded['timestamp'] );
+ $decoded['metadata'] = $this->repo->getSlaveDB()->decodeBlob( $decoded['metadata'] );
+
if ( empty( $decoded['major_mime'] ) ) {
$decoded['mime'] = 'unknown/unknown';
} else {
diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php
index f248d859..a9908134 100644
--- a/includes/installer/Installer.php
+++ b/includes/installer/Installer.php
@@ -515,6 +515,13 @@ abstract class Installer {
public static function getExistingLocalSettings() {
global $IP;
+ // You might be wondering why this is here. Well if you don't do this
+ // then some poorly-formed extensions try to call their own classes
+ // after immediately registering them. We really need to get extension
+ // registration out of the global scope and into a real format.
+ // @see https://bugzilla.wikimedia.org/67440
+ global $wgAutoloadClasses;
+
wfSuppressWarnings();
$_lsExists = file_exists( "$IP/LocalSettings.php" );
wfRestoreWarnings();
diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php
index 502f0fd1..460f3211 100644
--- a/includes/parser/ParserOutput.php
+++ b/includes/parser/ParserOutput.php
@@ -55,6 +55,7 @@ class ParserOutput extends CacheTime {
private $mExtensionData = array(); # extra data used by extensions
private $mLimitReportData = array(); # Parser limit report data
private $mParseStartTime = array(); # Timestamps for getTimeSinceStart()
+ private $mPreventClickjacking = false; # Whether to emit X-Frame-Options: DENY
const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
@@ -330,6 +331,7 @@ class ParserOutput extends CacheTime {
$this->addModuleMessages( $out->getModuleMessages() );
$this->mHeadItems = array_merge( $this->mHeadItems, $out->getHeadItemsArray() );
+ $this->mPreventClickjacking = $this->mPreventClickjacking || $out->getPreventClickjacking();
}
/**
@@ -629,4 +631,15 @@ class ParserOutput extends CacheTime {
function setLimitReportData( $key, $value ) {
$this->mLimitReportData[$key] = $value;
}
+
+ /**
+ * Get or set the prevent-clickjacking flag
+ *
+ * @since 1.24
+ * @param boolean|null $flag New flag value, or null to leave it unchanged
+ * @return boolean Old flag value
+ */
+ public function preventClickjacking( $flag = null ) {
+ return wfSetVar( $this->mPreventClickjacking, $flag );
+ }
}
diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php
index 40b3b19a..8268f8e3 100644
--- a/includes/upload/UploadBase.php
+++ b/includes/upload/UploadBase.php
@@ -1201,7 +1201,8 @@ abstract class UploadBase {
* @param $attribs array
* @return bool
*/
- public function checkSvgScriptCallback( $element, $attribs ) {
+ public function checkSvgScriptCallback( $element, $attribs, $data = null ) {
+
list( $namespace, $strippedElement ) = $this->splitXmlNamespace( $element );
static $validNamespaces = array(
@@ -1274,6 +1275,14 @@ abstract class UploadBase {
return true;
}
+ # Check <style> css
+ if ( $strippedElement == 'style'
+ && self::checkCssFragment( Sanitizer::normalizeCss( $data ) )
+ ) {
+ wfDebug( __METHOD__ . ": hostile css in style element.\n" );
+ return true;
+ }
+
foreach ( $attribs as $attrib => $value ) {
$stripped = $this->stripXmlNamespace( $attrib );
$value = strtolower( $value );
@@ -1294,8 +1303,8 @@ abstract class UploadBase {
wfDebug( __METHOD__ . ": Found href attribute <$strippedElement "
. "'$attrib'='$value' in uploaded file.\n" );
- return true;
- }
+ return true;
+ }
}
# href with embedded svg as target
@@ -1310,6 +1319,18 @@ abstract class UploadBase {
return true;
}
+ # Change href with animate from (http://html5sec.org/#137). This doesn't seem
+ # possible without embedding the svg, but filter here in case.
+ if ( $stripped == 'from'
+ && $strippedElement === 'animate'
+ && !preg_match( '!^https?://!im', $value )
+ ) {
+ wfDebug( __METHOD__ . ": Found animate that might be changing href using from "
+ . "\"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+
+ return true;
+ }
+
# use set/animate to add event-handler attribute to parent
if ( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
@@ -1335,14 +1356,23 @@ abstract class UploadBase {
}
# use CSS styles to bring in remote code
- # catch url("http:..., url('http:..., url(http:..., but not url("#..., url('#..., url(#....
- if ( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
- foreach ( $matches[1] as $match ) {
- if ( !preg_match( '!(?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
- wfDebug( __METHOD__ . ": Found svg setting a style with remote url '$attrib'='$value' in uploaded file.\n" );
- return true;
- }
- }
+ if ( $stripped == 'style'
+ && self::checkCssFragment( Sanitizer::normalizeCss( $value ) )
+ ) {
+ wfDebug( __METHOD__ . ": Found svg setting a style with "
+ . "remote url '$attrib'='$value' in uploaded file.\n" );
+ return true;
+ }
+
+ # Several attributes can include css, css character escaping isn't allowed
+ $cssAttrs = array( 'font', 'clip-path', 'fill', 'filter', 'marker',
+ 'marker-end', 'marker-mid', 'marker-start', 'mask', 'stroke' );
+ if ( in_array( $stripped, $cssAttrs )
+ && self::checkCssFragment( $value )
+ ) {
+ wfDebug( __METHOD__ . ": Found svg setting a style with "
+ . "remote url '$attrib'='$value' in uploaded file.\n" );
+ return true;
}
# image filters can pull in url, which could be svg that executes scripts
@@ -1357,6 +1387,58 @@ abstract class UploadBase {
}
/**
+ * Check a block of CSS or CSS fragment for anything that looks like
+ * it is bringing in remote code.
+ * @param string $value a string of CSS
+ * @param bool $propOnly only check css properties (start regex with :)
+ * @return bool true if the CSS contains an illegal string, false if otherwise
+ */
+ private static function checkCssFragment( $value ) {
+
+ # Forbid external stylesheets, for both reliability and to protect viewer's privacy
+ if ( strpos( $value, '@import' ) !== false ) {
+ return true;
+ }
+
+ # We allow @font-face to embed fonts with data: urls, so we snip the string
+ # 'url' out so this case won't match when we check for urls below
+ $pattern = '!(@font-face\s*{[^}]*src:)url(\("data:;base64,)!im';
+ $value = preg_replace( $pattern, '$1$2', $value );
+
+ # Check for remote and executable CSS. Unlike in Sanitizer::checkCss, the CSS
+ # properties filter and accelerator don't seem to be useful for xss in SVG files.
+ # Expression and -o-link don't seem to work either, but filtering them here in case.
+ # Additionally, we catch remote urls like url("http:..., url('http:..., url(http:...,
+ # but not local ones such as url("#..., url('#..., url(#....
+ if ( preg_match( '!expression
+ | -o-link\s*:
+ | -o-link-source\s*:
+ | -o-replace\s*:!imx', $value ) ) {
+ return true;
+ }
+
+ if ( preg_match_all(
+ "!(\s*(url|image|image-set)\s*\(\s*[\"']?\s*[^#]+.*?\))!sim",
+ $value,
+ $matches
+ ) !== 0
+ ) {
+ # TODO: redo this in one regex. Until then, url("#whatever") matches the first
+ foreach ( $matches[1] as $match ) {
+ if ( !preg_match( "!\s*(url|image|image-set)\s*\(\s*(#|'#|\"#)!im", $match ) ) {
+ return true;
+ }
+ }
+ }
+
+ if ( preg_match( '/[\000-\010\013\016-\037\177]/', $value ) ) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
* Divide the element name passed by the xml parser to the callback into URI and prifix.
* @param $name string
* @return array containing the namespace URI and prefix
diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php
index 7b500f20..65371ad7 100644
--- a/languages/messages/MessagesEn.php
+++ b/languages/messages/MessagesEn.php
@@ -1657,7 +1657,7 @@ Try [[Special:Search|searching on the wiki]] for relevant new pages.',
# Revision deletion
'rev-deleted-comment' => '(edit summary removed)',
'rev-deleted-user' => '(username removed)',
-'rev-deleted-event' => '(log action removed)',
+'rev-deleted-event' => '(log details removed)',
'rev-deleted-user-contribs' => '[username or IP address removed - edit hidden from contributions]',
'rev-deleted-text-permission' => "This page revision has been '''deleted'''.
Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
@@ -1709,7 +1709,7 @@ Other administrators on {{SITENAME}} will still be able to access the hidden con
'revdelete-legend' => 'Set visibility restrictions',
'revdelete-hide-text' => 'Revision text',
'revdelete-hide-image' => 'Hide file content',
-'revdelete-hide-name' => 'Hide action and target',
+'revdelete-hide-name' => 'Hide target and parameters',
'revdelete-hide-comment' => 'Edit summary',
'revdelete-hide-user' => "Editor's username/IP address",
'revdelete-hide-restricted' => 'Suppress data from administrators as well as others',
@@ -2114,6 +2114,7 @@ Your email address is not revealed when other users contact you.',
'right-protect' => 'Change protection levels and edit cascade-protected pages',
'right-editprotected' => 'Edit pages protected as "{{int:protect-level-sysop}}"',
'right-editsemiprotected' => 'Edit pages protected as "{{int:protect-level-autoconfirmed}}"',
+'right-editcontentmodel' => 'Edit the content model of a page',
'right-editinterface' => 'Edit the user interface',
'right-editusercssjs' => "Edit other users' CSS and JavaScript files",
'right-editusercss' => "Edit other users' CSS files",
@@ -2190,6 +2191,7 @@ Your email address is not revealed when other users contact you.',
'action-viewmywatchlist' => 'view your watchlist',
'action-viewmyprivateinfo' => 'view your private information',
'action-editmyprivateinfo' => 'edit your private information',
+'action-editcontentmodel' => 'edit the content model of a page',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|change|changes}}',
diff --git a/languages/messages/MessagesQqq.php b/languages/messages/MessagesQqq.php
index e201ad47..6aed268b 100644
--- a/languages/messages/MessagesQqq.php
+++ b/languages/messages/MessagesQqq.php
@@ -3459,6 +3459,7 @@ Refers to {{msg-mw|Protect-level-autoconfirmed}}.
See also:
* {{msg-mw|Right-editprotected}}',
+'right-editcontentmodel' => '{{doc-right|editcontentmodel}}',
'right-editinterface' => '{{doc-right|editinterface}}',
'right-editusercssjs' => '{{doc-right|editusercssjs}}',
'right-editusercss' => '{{doc-right|editusercss}}
@@ -3558,6 +3559,7 @@ This action allows editing of all of the "user rights", not just the rights of t
{{Identical|View your watchlist}}',
'action-viewmyprivateinfo' => '{{doc-action|viewmyprivateinfo}}',
'action-editmyprivateinfo' => '{{doc-action|editmyprivateinfo}}',
+'action-editcontentmodel' => '{{doc-action|editcontentmodel}}',
# Recent changes
'nchanges' => 'Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to a diff of the changes.
diff --git a/resources/Resources.php b/resources/Resources.php
index 06120008..3b06e1be 100644
--- a/resources/Resources.php
+++ b/resources/Resources.php
@@ -981,7 +981,11 @@ return array(
),
'mediawiki.page.image.pagination' => array(
'scripts' => 'resources/mediawiki.page/mediawiki.page.image.pagination.js',
- 'dependencies' => array( 'jquery.spinner' )
+ 'dependencies' => array(
+ 'mediawiki.Uri',
+ 'mediawiki.util',
+ 'jquery.spinner',
+ )
),
/* MediaWiki Special pages */
diff --git a/resources/mediawiki.page/mediawiki.page.image.pagination.js b/resources/mediawiki.page/mediawiki.page.image.pagination.js
index fb44a76f..11ed0ae4 100644
--- a/resources/mediawiki.page/mediawiki.page.image.pagination.js
+++ b/resources/mediawiki.page/mediawiki.page.image.pagination.js
@@ -31,7 +31,16 @@
function ajaxifyPageNavigation() {
// Intercept the default action of the links in the thumbnail navigation
$( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
- loadPage( this.href );
+ var page, uri;
+
+ // Generate the same URL on client side as the one generated in ImagePage::openShowImage.
+ // We avoid using the URL in the link directly since it could have been manipulated (bug 66608)
+ page = Number( mw.util.getParamValue( 'page', this.href ) );
+ uri = new mw.Uri( mw.util.wikiScript() )
+ .extend( { title: mw.config.get( 'wgPageName' ), page: page } )
+ .toString();
+
+ loadPage( uri );
e.preventDefault();
} );
diff --git a/thumb.php b/thumb.php
index 913adc18..dc3093c0 100644
--- a/thumb.php
+++ b/thumb.php
@@ -131,12 +131,12 @@ function wfStreamThumb( array $params ) {
// Format is <timestamp>!<name>
$bits = explode( '!', $fileName, 2 );
if ( count( $bits ) != 2 ) {
- wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
+ wfThumbError( 404, wfMessage( 'badtitletext' )->parse() );
return;
}
$title = Title::makeTitleSafe( NS_FILE, $bits[1] );
if ( !$title ) {
- wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
+ wfThumbError( 404, wfMessage( 'badtitletext' )->parse() );
return;
}
$img = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $title, $fileName );
@@ -146,7 +146,7 @@ function wfStreamThumb( array $params ) {
// Check the source file title
if ( !$img ) {
- wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
+ wfThumbError( 404, wfMessage( 'badtitletext' )->parse() );
return;
}
@@ -306,7 +306,7 @@ function wfStreamThumb( array $params ) {
$user = RequestContext::getMain()->getUser();
if ( $user->pingLimiter( 'renderfile' ) ) {
- wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
+ wfThumbError( 500, wfMessage( 'actionthrottledtext' )->parse() );
return;
}
@@ -452,7 +452,7 @@ function wfExtractThumbParams( $file, $params ) {
* Output a thumbnail generation error message
*
* @param $status integer
- * @param $msg string
+ * @param string $msg HTML
* @return void
*/
function wfThumbError( $status, $msg ) {