diff --git a/composer.json b/composer.json index 476a327ad..e33befd39 100644 --- a/composer.json +++ b/composer.json @@ -18,6 +18,6 @@ ] }, "extra": { - "phan-taint-check-plugin": "1.1.0" + "phan-taint-check-plugin": "1.5.0" } } diff --git a/includes/Cite.php b/includes/Cite.php index 52eafd51e..316bdb773 100644 --- a/includes/Cite.php +++ b/includes/Cite.php @@ -251,7 +251,7 @@ class Cite { list( $key, $group, $follow, $dir ) = $this->refArg( $argv ); // empty string indicate invalid dir if ( $dir === '' && $str !== '' ) { - $str .= $this->error( 'cite_error_ref_invalid_dir', $argv['dir'], 'noparse' ); + $str .= $this->plainError( 'cite_error_ref_invalid_dir', $argv['dir'] ); } # Split these into groups. if ( $group === null ) { @@ -301,8 +301,8 @@ class Cite { ) { // two refs with same key and different content // add error message to the original ref - $this->mRefs[$group][$key]['text'] .= ' ' . $this->error( - 'cite_error_references_duplicate_key', $key, 'noparse' + $this->mRefs[$group][$key]['text'] .= ' ' . $this->plainError( + 'cite_error_references_duplicate_key', $key ); } else { # Assign the text to corresponding ref @@ -399,6 +399,7 @@ class Cite { * @param string[] $argv The argument vector * @return mixed false on invalid input, a string on valid * input and null on no input + * @return-taint tainted */ private function refArg( array $argv ) { $cnt = count( $argv ); @@ -553,8 +554,8 @@ class Cite { if ( $str != null && $str !== '' && $str !== $this->mRefs[$group][$key]['text'] ) { // two refs with same key and different content // add error message to the original ref - $this->mRefs[$group][$key]['text'] .= ' ' . $this->error( - 'cite_error_references_duplicate_key', $key, 'noparse' + $this->mRefs[$group][$key]['text'] .= ' ' . $this->plainError( + 'cite_error_references_duplicate_key', $key ); } $this->mRefCallStack[] = [ 'increment', $call, $str, $key, $group, @@ -916,7 +917,7 @@ class Cite { if ( $this->mParser->getOptions()->getIsSectionPreview() ) { return $this->warning( 'cite_warning_sectionpreview_no_text', $key, 'noparse' ); } - return $this->error( 'cite_error_references_no_text', $key, 'noparse' ); + return $this->plainError( 'cite_error_references_no_text', $key ); } return '' . rtrim( $text, "\n" ) . "\n"; } @@ -958,7 +959,7 @@ class Cite { return $this->mBacklinkLabels[$offset]; } else { // Feed me! - return $this->error( 'cite_error_references_no_backlink_label', null, 'noparse' ); + return $this->plainError( 'cite_error_references_no_backlink_label', null ); } } @@ -988,7 +989,7 @@ class Cite { return $this->mLinkLabels[$group][$offset - 1]; } else { // Feed me! - return $this->error( 'cite_error_no_link_label_group', [ $group, $message ], 'noparse' ); + return $this->plainError( 'cite_error_no_link_label_group', [ $group, $message ] ); } } @@ -1031,6 +1032,7 @@ class Cite { * Generate a link ( element from a key * and return XHTML ready for output * + * @suppress SecurityCheck-DoubleEscaped * @param string $group * @param string $key The key for the link * @param int $count The index of the key, used for distinguishing @@ -1302,14 +1304,26 @@ class Cite { } /** - * Return an error message based on an error ID + * Return an error message based on an error ID and parses it * * @param string $key Message name for the error * @param string[]|string|null $param Parameter to pass to the message - * @param string $parse Whether to parse the message ('parse') or not ('noparse') - * @return string XHTML or wikitext ready for output + * @return string HTML ready for output */ - private function error( $key, $param = null, $parse = 'parse' ) { + private function error( $key, $param = null ) { + $error = $this->plainError( $key, $param ); + return $this->mParser->recursiveTagParse( $error ); + } + + /** + * Return an error message based on an error ID as unescaped plaintext. + * + * @param string $key Message name for the error + * @param string[]|string|null $param Parameter to pass to the message + * @return string wikitext ready for output + * @return-taint tainted + */ + private function plainError( $key, $param = null ) { # For ease of debugging and because errors are rare, we # use the user language and split the parser cache. $lang = $this->mParser->getOptions()->getUserLangObj(); @@ -1337,10 +1351,6 @@ class Cite { $msg ); - if ( $parse === 'parse' ) { - $ret = $this->mParser->recursiveTagParse( $ret ); - } - return $ret; }