Avoid broken markup due to conversion table DB queries in Installer:parse()
authorAaron Schulz <aschulz@wikimedia.org>
Sat, 27 Oct 2018 23:41:33 +0000 (16:41 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Sat, 27 Oct 2018 23:41:33 +0000 (16:41 -0700)
Bug: T207979
Change-Id: I6a196a64865533a073fadc4a07f5627b67924921

includes/cache/MessageCache.php

index 5dee0f6..5ada42f 100644 (file)
@@ -516,7 +516,7 @@ class MessageCache {
                foreach ( $res as $row ) {
                        $name = $this->contLang->lcfirst( $row->page_title );
                        // Include entries/stubs for all keys in $mostused in adaptive mode
-                       if ( $wgAdaptiveMessageCache || isset( $overridable[$name] ) ) {
+                       if ( $wgAdaptiveMessageCache || $this->isMainCacheable( $name, $overridable ) ) {
                                $cache[$row->page_title] = '!TOO BIG';
                        }
                        // At least include revision ID so page changes are reflected in the hash
@@ -538,7 +538,7 @@ class MessageCache {
                foreach ( $res as $row ) {
                        $name = $this->contLang->lcfirst( $row->page_title );
                        // Include entries/stubs for all keys in $mostused in adaptive mode
-                       if ( $wgAdaptiveMessageCache || isset( $overridable[$name] ) ) {
+                       if ( $wgAdaptiveMessageCache || $this->isMainCacheable( $name, $overridable ) ) {
                                $text = Revision::getRevisionText( $row );
                                if ( $text === false ) {
                                        // Failed to fetch data; possible ES errors?
@@ -574,6 +574,17 @@ class MessageCache {
                return $cache;
        }
 
+       /**
+        * @param string $name Message name with lowercase first letter
+        * @param array $overridable Map of (key => unused) for software-defined messages
+        * @return bool
+        */
+       private function isMainCacheable( $name, array $overridable ) {
+               // Include common conversion table pages. This also avoids problems with
+               // Installer::parse() bailing out due to disallowed DB queries (T207979).
+               return ( isset( $overridable[$name] ) || strpos( $name, 'conversiontable/' ) === 0 );
+       }
+
        /**
         * Updates cache as necessary when message page is changed
         *
@@ -1042,7 +1053,8 @@ class MessageCache {
                        );
                } else {
                        // Message page either does not exist or does not override a software message
-                       if ( !isset( $this->overridable[$this->contLang->lcfirst( $title )] ) ) {
+                       $name = $this->contLang->lcfirst( $title );
+                       if ( !$this->isMainCacheable( $name, $this->overridable ) ) {
                                // Message page does not override any software-defined message. A custom
                                // message might be defined to have content or settings specific to the wiki.
                                // Load the message page, utilizing the individual message cache as needed.