Merge "Enable email in TemporaryPasswordPrimaryAuthenticationProviderTest"
[lhc/web/wiklou.git] / includes / MagicWordArray.php
index 7461191..73d5173 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class for handling an array of magic words
@@ -32,6 +33,9 @@ class MagicWordArray {
        /** @var array */
        public $names = [];
 
+       /** @var MagicWordFactory */
+       private $factory;
+
        /** @var array */
        private $hash;
 
@@ -41,9 +45,11 @@ class MagicWordArray {
 
        /**
         * @param array $names
+        * @param MagicWordFactory|null $factory
         */
-       public function __construct( $names = [] ) {
+       public function __construct( $names = [], MagicWordFactory $factory = null ) {
                $this->names = $names;
+               $this->factory = $factory ?: MediaWikiServices::getInstance()->getMagicWordFactory();
        }
 
        /**
@@ -72,14 +78,13 @@ class MagicWordArray {
         */
        public function getHash() {
                if ( is_null( $this->hash ) ) {
-                       global $wgContLang;
                        $this->hash = [ 0 => [], 1 => [] ];
                        foreach ( $this->names as $name ) {
-                               $magic = MagicWord::get( $name );
+                               $magic = $this->factory->get( $name );
                                $case = intval( $magic->isCaseSensitive() );
                                foreach ( $magic->getSynonyms() as $syn ) {
                                        if ( !$case ) {
-                                               $syn = $wgContLang->lc( $syn );
+                                               $syn = $this->factory->getContentLanguage()->lc( $syn );
                                        }
                                        $this->hash[$case][$syn] = $name;
                                }
@@ -95,13 +100,22 @@ class MagicWordArray {
        public function getBaseRegex() {
                if ( is_null( $this->baseRegex ) ) {
                        $this->baseRegex = [ 0 => '', 1 => '' ];
+                       $allGroups = [];
                        foreach ( $this->names as $name ) {
-                               $magic = MagicWord::get( $name );
+                               $magic = $this->factory->get( $name );
                                $case = intval( $magic->isCaseSensitive() );
                                foreach ( $magic->getSynonyms() as $i => $syn ) {
                                        // Group name must start with a non-digit in PCRE 8.34+
                                        $it = strtr( $i, '0123456789', 'abcdefghij' );
-                                       $group = "(?P<{$it}_{$name}>" . preg_quote( $syn, '/' ) . ')';
+                                       $groupName = $it . '_' . $name;
+                                       $group = '(?P<' . $groupName . '>' . preg_quote( $syn, '/' ) . ')';
+                                       // look for same group names to avoid same named subpatterns in the regex
+                                       if ( isset( $allGroups[$groupName] ) ) {
+                                               throw new MWException(
+                                                       __METHOD__ . ': duplicate internal name in magic word array: ' . $name
+                                               );
+                                       }
+                                       $allGroups[$groupName] = true;
                                        if ( $this->baseRegex[$case] === '' ) {
                                                $this->baseRegex[$case] = $group;
                                        } else {
@@ -194,7 +208,9 @@ class MagicWordArray {
         */
        public function parseMatch( $m ) {
                reset( $m );
-               while ( list( $key, $value ) = each( $m ) ) {
+               while ( ( $key = key( $m ) ) !== null ) {
+                       $value = current( $m );
+                       next( $m );
                        if ( $key === 0 || $value === '' ) {
                                continue;
                        }
@@ -248,12 +264,8 @@ class MagicWordArray {
                if ( isset( $hash[1][$text] ) ) {
                        return $hash[1][$text];
                }
-               global $wgContLang;
-               $lc = $wgContLang->lc( $text );
-               if ( isset( $hash[0][$lc] ) ) {
-                       return $hash[0][$lc];
-               }
-               return false;
+               $lc = $this->factory->getContentLanguage()->lc( $text );
+               return $hash[0][$lc] ?? false;
        }
 
        /**