121 private $linkRenderer;
124 private $contentLanguage;
127 private $commentFormatter;
130 private $userEditTracker;
145 $this->context = RequestContext::getMain();
160 $this->linkRenderer = $linkRenderer;
168 if ( $this->linkRenderer !==
null ) {
169 return $this->linkRenderer;
171 wfDeprecated( static::class .
" without all required services",
'1.42' );
182 $this->contentLanguage = $contentLanguage;
190 if ( $this->contentLanguage === null ) {
191 wfDeprecated( static::class .
" without all required services",
'1.42' );
194 return $this->contentLanguage;
203 $this->commentFormatter = $commentFormatter;
211 if ( $this->commentFormatter === null ) {
212 wfDeprecated( static::class .
" without all required services",
'1.42' );
215 return $this->commentFormatter;
224 $this->userEditTracker = $userEditTracker;
232 if ( $this->userEditTracker === null ) {
233 wfDeprecated( static::class .
" without all required services",
'1.42' );
234 $this->userEditTracker = MediaWikiServices::getInstance()->getUserEditTracker();
236 return $this->userEditTracker;
246 $this->audience = ( $audience == self::FOR_THIS_USER )
247 ? self::FOR_THIS_USER
258 $logRestrictions = $this->context->getConfig()->get( MainConfigNames::LogRestrictions );
259 $type = $this->entry->getType();
260 return !isset( $logRestrictions[$type] )
261 || $this->context->getAuthority()->isAllowed( $logRestrictions[$type] );
270 if ( $this->audience == self::FOR_THIS_USER ) {
271 return LogEventsList::userCanBitfield(
272 $this->entry->getDeleted(), $field, $this->context->getAuthority() ) &&
273 self::canViewLogType();
275 return !$this->entry->isDeleted( $field ) && self::canViewLogType();
286 $this->linkFlood = $value;
298 $this->plaintext =
true;
299 $text = $this->getActionText();
300 $this->plaintext =
false;
312 $actionComment = $this->getIRCActionText();
313 $comment = $this->entry->getComment();
315 if ( $comment !=
'' ) {
316 if ( $actionComment ==
'' ) {
317 $actionComment = $comment;
319 $actionComment .=
wfMessage(
'colon-separator' )->inContentLanguage()->text() . $comment;
323 return $actionComment;
334 $this->plaintext =
true;
335 $this->irctext =
true;
337 $entry = $this->entry;
338 $parameters = $entry->getParameters();
341 $target = $entry->getTarget()->getPrefixedText();
343 $contLang = $this->getContentLanguage();
344 switch ( $entry->getType() ) {
346 switch ( $entry->getSubtype() ) {
348 $movesource = $parameters[
'4::target'];
350 ->rawParams( $target, $movesource )->inContentLanguage()->escaped();
353 $movesource = $parameters[
'4::target'];
355 ->rawParams( $target, $movesource )->inContentLanguage()->escaped();
357 case 'move-noredirect':
359 case 'move_redir-noredirect':
365 switch ( $entry->getSubtype() ) {
368 ->rawParams( $target )->inContentLanguage()->escaped();
372 ->rawParams( $target )->inContentLanguage()->escaped();
380 if ( $entry->getSubtype() ===
'patrol' ) {
381 $diffLink = htmlspecialchars(
382 wfMessage(
'patrol-log-diff', $parameters[
'4::curid'] )
383 ->inContentLanguage()->text() );
384 $text =
wfMessage(
'patrol-log-line', $diffLink,
"[[$target]]",
"" )
385 ->inContentLanguage()->text();
392 switch ( $entry->getSubtype() ) {
395 ->rawParams( $target .
' ' . $parameters[
'4::description'] )
396 ->inContentLanguage()
400 $text =
wfMessage(
'unprotectedarticle' )
401 ->rawParams( $target )->inContentLanguage()->escaped();
404 $text =
wfMessage(
'modifiedarticleprotection' )
405 ->rawParams( $target .
' ' . $parameters[
'4::description'] )
406 ->inContentLanguage()
410 $text =
wfMessage(
'movedarticleprotection' )
411 ->rawParams( $target, $parameters[
'4::oldtitle'] )->inContentLanguage()->escaped();
417 switch ( $entry->getSubtype() ) {
420 $text =
wfMessage(
'newuserlog-create-entry' )
421 ->inContentLanguage()->escaped();
425 $text =
wfMessage(
'newuserlog-create2-entry' )
426 ->rawParams( $target )->inContentLanguage()->escaped();
429 $text =
wfMessage(
'newuserlog-autocreate-entry' )
430 ->inContentLanguage()->escaped();
436 switch ( $entry->getSubtype() ) {
439 ->rawParams( $target )->inContentLanguage()->escaped();
444 ->rawParams( $target )->inContentLanguage()->escaped();
450 if ( count( $parameters[
'4::oldgroups'] ) ) {
451 $oldgroups = implode(
', ', $parameters[
'4::oldgroups'] );
453 $oldgroups =
wfMessage(
'rightsnone' )->inContentLanguage()->escaped();
455 if ( count( $parameters[
'5::newgroups'] ) ) {
456 $newgroups = implode(
', ', $parameters[
'5::newgroups'] );
458 $newgroups =
wfMessage(
'rightsnone' )->inContentLanguage()->escaped();
460 switch ( $entry->getSubtype() ) {
463 ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
466 $text =
wfMessage(
'rightslogentry-autopromote' )
467 ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
473 switch ( $entry->getSubtype() ) {
475 $text =
wfMessage(
'pagemerge-logentry' )
476 ->rawParams( $target, $parameters[
'4::dest'], $parameters[
'5::mergepoint'] )
477 ->inContentLanguage()->escaped();
487 switch ( $entry->getSubtype() ) {
491 if ( $entry->isLegacy() ) {
492 $rawDuration = $parameters[0];
493 $rawFlags = $parameters[1] ??
'';
495 $rawDuration = $parameters[
'5::duration'];
496 $rawFlags = $parameters[
'6::flags'];
498 $duration = $contLang->translateBlockExpiry(
501 (
int)
wfTimestamp( TS_UNIX, $entry->getTimestamp() )
503 $flags = BlockLogFormatter::formatBlockFlags( $rawFlags, $contLang );
505 ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
509 ->rawParams( $target )->inContentLanguage()->escaped();
512 $duration = $contLang->translateBlockExpiry(
513 $parameters[
'5::duration'],
515 (
int)
wfTimestamp( TS_UNIX, $entry->getTimestamp() )
517 $flags = BlockLogFormatter::formatBlockFlags( $parameters[
'6::flags'],
520 ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
526 switch ( $entry->getSubtype() ) {
528 $text =
wfMessage(
'import-logentry-upload' )
529 ->rawParams( $target )->inContentLanguage()->escaped();
532 $text =
wfMessage(
'import-logentry-interwiki' )
533 ->rawParams( $target )->inContentLanguage()->escaped();
541 $this->plaintext =
false;
542 $this->irctext =
false;
544 return $text ?? $this->getPlainActionText();
555 if ( $this->canView( LogPage::DELETED_ACTION ) ) {
556 $element = $this->getActionMessage();
557 if ( $element instanceof
Message ) {
558 $element = $this->plaintext ? $element->text() : $element->escaped();
560 if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
561 $element = $this->styleRestrictedElement( $element );
564 $sep = $this->msg(
'word-separator' );
565 $sep = $this->plaintext ? $sep->text() : $sep->escaped();
566 $performer = $this->getPerformerElement();
567 $element = $performer . $sep . $this->getRestrictedElement(
'rev-deleted-event' );
580 $message = $this->msg( $this->getMessageKey() );
581 $message->params( $this->getMessageParameters() );
595 $type = $this->entry->getType();
596 $subtype = $this->entry->getSubtype();
598 return "logentry-$type-$subtype";
618 $entry = $this->entry;
621 if ( $entry->isLegacy() ) {
622 foreach ( $entry->getParameters() as $index => $value ) {
623 $params[$index + 3] = $value;
628 foreach ( $entry->getParameters() as $key => $value ) {
629 if ( strpos( $key,
':' ) ===
false ) {
632 [ $index, $type, ] = explode(
':', $key, 3 );
633 if ( ctype_digit( $index ) ) {
634 $params[(int)$index - 1] = $this->formatParameterValue( $type, $value );
642 if ( count( $params ) ) {
643 $max = max( array_keys( $params ) );
645 for ( $i = 3; $i < $max; $i++ ) {
646 if ( !isset( $params[$i] ) ) {
673 if ( $this->parsedParameters !==
null ) {
674 return $this->parsedParameters;
677 $entry = $this->entry;
678 $params = $this->extractParameters();
679 $params[0] = Message::rawParam( $this->getPerformerElement() );
680 $params[1] = $this->canView( LogPage::DELETED_USER ) ? $entry->getPerformerIdentity()->getName() :
'';
681 $params[2] = Message::rawParam( $this->makePageLink( $entry->getTarget() ) );
686 $this->parsedParameters = $params;
687 return $this->parsedParameters;
717 $saveLinkFlood = $this->linkFlood;
719 switch ( strtolower( trim( $type ) ) ) {
721 $value = Message::rawParam( $value );
724 $value = $this->context->getLanguage()->commaList( $value );
727 $value = $this->msg( $value )->text();
730 $value = $this->msg( $value )->inContentLanguage()->text();
733 $value = Message::numParam( $value );
736 $user = User::newFromName( $value );
737 $value = $user->getName();
740 $this->setShowUserToolLinks(
false );
742 $user = User::newFromName( $value );
745 $value = $this->msg(
'empty-username' )->text();
747 $value = Message::rawParam( $this->makeUserLink( $user ) );
748 $this->setShowUserToolLinks( $saveLinkFlood );
752 $title = Title::newFromText( $value );
753 $value = $title->getPrefixedText();
756 $title = Title::newFromText( $value );
757 $value = Message::rawParam( $this->makePageLink( $title ) );
779 if ( !$title instanceof
Title ) {
780 $msg = $this->msg(
'invalidtitle' )->text();
781 if ( $this->plaintext ) {
784 return Html::element(
'span', [
'class' =>
'mw-invalidtitle' ], $msg );
788 if ( $this->plaintext ) {
789 $link =
'[[' . $title->getPrefixedText() .
']]';
791 $html = $html !==
null ?
new HtmlArmor( $html ) : $html;
792 $link = $this->getLinkRenderer()->makeLink( $title, $html, [], $parameters );
805 if ( $this->canView( LogPage::DELETED_USER ) ) {
806 $performerIdentity = $this->entry->getPerformerIdentity();
807 $element = $this->makeUserLink( $performerIdentity );
808 if ( $this->entry->isDeleted( LogPage::DELETED_USER ) ) {
809 $element = $this->styleRestrictedElement( $element );
812 $element = $this->getRestrictedElement(
'rev-deleted-user' );
824 if ( $this->canView( LogPage::DELETED_COMMENT ) ) {
825 $comment = $this->getCommentFormatter()
826 ->formatBlock( $this->entry->getComment() );
828 $element = ltrim( $comment );
829 if ( $this->entry->isDeleted( LogPage::DELETED_COMMENT ) ) {
830 $element = $this->styleRestrictedElement( $element );
833 $element = $this->getRestrictedElement(
'rev-deleted-comment' );
846 if ( $this->plaintext ) {
847 return $this->msg( $message )->text();
850 return $this->styleRestrictedElement( $this->msg( $message )->escaped() );
859 if ( $this->plaintext ) {
862 $attribs = [
'class' => [
'history-deleted' ] ];
863 if ( $this->entry->isDeleted( LogPage::DELETED_RESTRICTED ) ) {
864 $attribs[
'class'][] =
'mw-history-suppressed';
867 return Html::rawElement(
'span', $attribs, $content );
878 protected function msg( $key, ...$params ) {
879 return $this->context->msg( $key, ...$params );
889 if ( $this->plaintext ) {
892 $element = Linker::userLink(
896 if ( $this->linkFlood ) {
897 $editCount = $this->getUserEditTracker()->getUserEditCount( $user );
899 $element .= Linker::userToolLinks(
929 return $this->getMessageParameters();
939 return $this->entry->getParameters();
959 foreach ( $this->getParametersForApi() as $key => $value ) {
960 $vals = explode(
':', $key, 3 );
961 if ( count( $vals ) !== 3 ) {
962 if ( $value instanceof \__PHP_Incomplete_Class ) {
963 wfLogWarning(
'Log entry of type ' . $this->entry->getFullType() .
964 ' contains unrecoverable extra parameters.' );
967 $logParams[$key] = $value;
970 $logParams += $this->formatParameterValueForApi( $vals[2], $vals[1], $value );
972 ApiResult::setIndexedTagName( $logParams,
'param' );
973 ApiResult::setArrayType( $logParams,
'assoc' );
988 $type = strtolower( trim( $type ) );
991 $value = (bool)$value;
995 if ( is_int( $value ) || ctype_digit( (
string)$value ) ) {
996 $value = (int)$value;
998 $value = (float)$value;
1005 if ( is_array( $value ) ) {
1006 ApiResult::setArrayType( $value, $type );
1016 $msg = $this->msg( $value );
1017 if ( $type ===
'msg-content' ) {
1018 $msg->inContentLanguage();
1021 $value[
"{$name}_key"] = $msg->getKey();
1022 if ( $msg->getParams() ) {
1023 $value[
"{$name}_params"] = $msg->getParams();
1025 $value[
"{$name}_text"] = $msg->text();
1030 $title = Title::newFromText( $value );
1032 $title = SpecialPage::getTitleFor(
'Badtitle', $value );
1035 ApiQueryBase::addTitleInfo( $value, $title,
"{$name}_" );
1040 $user = User::newFromName( $value );
1042 $value = $user->getName();
1051 return [ $name => $value ];
1056class_alias( LogFormatter::class,
'LogFormatter' );
wfLogWarning( $msg, $callerOffset=1, $level=E_USER_WARNING)
Send a warning as a PHP error and the debug log.
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
wfDeprecated( $function, $version=false, $component=false, $callerOffset=2)
Logs a warning that a deprecated feature was used.
if(!defined('MW_SETUP_CALLBACK'))
Group all the pieces relevant to the context of a request into one instance.
static newFromRow( $row)
Constructs new LogEntry from database result row.
Extends the LogEntry Interface with some basic functionality.
A class containing constants representing the names of configuration variables.
Parent class for all special pages.
Interface for objects which can provide a MediaWiki context on request.