68 return MediaWikiServices::getInstance()->getLogFormatterFactory()->newFromEntry( $entry );
80 return self::newFromEntry( DatabaseLogEntry::newFromRow( $row ) );
110 private $linkRenderer;
113 private $contentLanguage;
116 private $commentFormatter;
119 private $userEditTracker;
133 $this->entry = $entry;
134 $this->context = RequestContext::getMain();
142 $this->context = $context;
150 $this->linkRenderer = $linkRenderer;
158 if ( $this->linkRenderer !==
null ) {
159 return $this->linkRenderer;
161 wfDeprecated( static::class .
" without all required services",
'1.42' );
162 return MediaWikiServices::getInstance()->getLinkRenderer();
172 $this->contentLanguage = $contentLanguage;
180 if ( $this->contentLanguage === null ) {
181 wfDeprecated( static::class .
" without all required services",
'1.42' );
182 $this->contentLanguage = MediaWikiServices::getInstance()->getContentLanguage();
184 return $this->contentLanguage;
193 $this->commentFormatter = $commentFormatter;
201 if ( $this->commentFormatter === null ) {
202 wfDeprecated( static::class .
" without all required services",
'1.42' );
203 $this->commentFormatter = MediaWikiServices::getInstance()->getCommentFormatter();
205 return $this->commentFormatter;
214 $this->userEditTracker = $userEditTracker;
222 if ( $this->userEditTracker === null ) {
223 wfDeprecated( static::class .
" without all required services",
'1.42' );
224 $this->userEditTracker = MediaWikiServices::getInstance()->getUserEditTracker();
226 return $this->userEditTracker;
236 $this->audience = ( $audience == self::FOR_THIS_USER )
237 ? self::FOR_THIS_USER
248 $logRestrictions = $this->context->getConfig()->get( MainConfigNames::LogRestrictions );
249 $type = $this->entry->getType();
250 return !isset( $logRestrictions[$type] )
251 || $this->context->getAuthority()->isAllowed( $logRestrictions[$type] );
260 if ( $this->audience == self::FOR_THIS_USER ) {
261 return LogEventsList::userCanBitfield(
262 $this->entry->getDeleted(), $field, $this->context->getAuthority() ) &&
263 self::canViewLogType();
265 return !$this->entry->isDeleted( $field ) && self::canViewLogType();
276 $this->linkFlood = $value;
288 $this->plaintext =
true;
289 $text = $this->getActionText();
290 $this->plaintext =
false;
302 $actionComment = $this->getIRCActionText();
303 $comment = $this->entry->getComment();
305 if ( $comment !=
'' ) {
306 if ( $actionComment ==
'' ) {
307 $actionComment = $comment;
309 $actionComment .=
wfMessage(
'colon-separator' )->inContentLanguage()->text() . $comment;
313 return $actionComment;
324 $this->plaintext =
true;
325 $this->irctext =
true;
327 $entry = $this->entry;
328 $parameters = $entry->getParameters();
331 $target = $entry->getTarget()->getPrefixedText();
333 $contLang = $this->getContentLanguage();
334 switch ( $entry->getType() ) {
336 switch ( $entry->getSubtype() ) {
338 $movesource = $parameters[
'4::target'];
340 ->rawParams( $target, $movesource )->inContentLanguage()->escaped();
343 $movesource = $parameters[
'4::target'];
345 ->rawParams( $target, $movesource )->inContentLanguage()->escaped();
347 case 'move-noredirect':
349 case 'move_redir-noredirect':
355 switch ( $entry->getSubtype() ) {
358 ->rawParams( $target )->inContentLanguage()->escaped();
362 ->rawParams( $target )->inContentLanguage()->escaped();
370 if ( $entry->getSubtype() ===
'patrol' ) {
371 $diffLink = htmlspecialchars(
372 wfMessage(
'patrol-log-diff', $parameters[
'4::curid'] )
373 ->inContentLanguage()->text() );
374 $text =
wfMessage(
'patrol-log-line', $diffLink,
"[[$target]]",
"" )
375 ->inContentLanguage()->text();
382 switch ( $entry->getSubtype() ) {
385 ->rawParams( $target .
' ' . $parameters[
'4::description'] )
386 ->inContentLanguage()
390 $text =
wfMessage(
'unprotectedarticle' )
391 ->rawParams( $target )->inContentLanguage()->escaped();
394 $text =
wfMessage(
'modifiedarticleprotection' )
395 ->rawParams( $target .
' ' . $parameters[
'4::description'] )
396 ->inContentLanguage()
400 $text =
wfMessage(
'movedarticleprotection' )
401 ->rawParams( $target, $parameters[
'4::oldtitle'] )->inContentLanguage()->escaped();
407 switch ( $entry->getSubtype() ) {
410 $text =
wfMessage(
'newuserlog-create-entry' )
411 ->inContentLanguage()->escaped();
415 $text =
wfMessage(
'newuserlog-create2-entry' )
416 ->rawParams( $target )->inContentLanguage()->escaped();
419 $text =
wfMessage(
'newuserlog-autocreate-entry' )
420 ->inContentLanguage()->escaped();
426 switch ( $entry->getSubtype() ) {
429 ->rawParams( $target )->inContentLanguage()->escaped();
434 ->rawParams( $target )->inContentLanguage()->escaped();
440 if ( count( $parameters[
'4::oldgroups'] ) ) {
441 $oldgroups = implode(
', ', $parameters[
'4::oldgroups'] );
443 $oldgroups =
wfMessage(
'rightsnone' )->inContentLanguage()->escaped();
445 if ( count( $parameters[
'5::newgroups'] ) ) {
446 $newgroups = implode(
', ', $parameters[
'5::newgroups'] );
448 $newgroups =
wfMessage(
'rightsnone' )->inContentLanguage()->escaped();
450 switch ( $entry->getSubtype() ) {
453 ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
456 $text =
wfMessage(
'rightslogentry-autopromote' )
457 ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
463 $text =
wfMessage(
'pagemerge-logentry' )
464 ->rawParams( $target, $parameters[
'4::dest'], $parameters[
'5::mergepoint'] )
465 ->inContentLanguage()->escaped();
469 switch ( $entry->getSubtype() ) {
473 if ( $entry->isLegacy() ) {
474 $rawDuration = $parameters[0];
475 $rawFlags = $parameters[1] ??
'';
477 $rawDuration = $parameters[
'5::duration'];
478 $rawFlags = $parameters[
'6::flags'];
480 $duration = $contLang->translateBlockExpiry(
483 (
int)
wfTimestamp( TS_UNIX, $entry->getTimestamp() )
485 $flags = BlockLogFormatter::formatBlockFlags( $rawFlags, $contLang );
487 ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
491 ->rawParams( $target )->inContentLanguage()->escaped();
494 $duration = $contLang->translateBlockExpiry(
495 $parameters[
'5::duration'],
497 (
int)
wfTimestamp( TS_UNIX, $entry->getTimestamp() )
499 $flags = BlockLogFormatter::formatBlockFlags( $parameters[
'6::flags'],
502 ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
508 switch ( $entry->getSubtype() ) {
510 $text =
wfMessage(
'import-logentry-upload' )
511 ->rawParams( $target )->inContentLanguage()->escaped();
514 $text =
wfMessage(
'import-logentry-interwiki' )
515 ->rawParams( $target )->inContentLanguage()->escaped();
523 $this->plaintext =
false;
524 $this->irctext =
false;
526 return $text ?? $this->getPlainActionText();
537 if ( $this->canView( LogPage::DELETED_ACTION ) ) {
538 $element = $this->getActionMessage();
539 if ( $element instanceof
Message ) {
540 $element = $this->plaintext ? $element->text() : $element->escaped();
542 if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
543 $element = $this->styleRestrictedElement( $element );
546 $sep = $this->msg(
'word-separator' );
547 $sep = $this->plaintext ? $sep->text() : $sep->escaped();
548 $performer = $this->getPerformerElement();
549 $element = $performer . $sep . $this->getRestrictedElement(
'rev-deleted-event' );
562 $message = $this->msg( $this->getMessageKey() );
563 $message->params( $this->getMessageParameters() );
577 $type = $this->entry->getType();
578 $subtype = $this->entry->getSubtype();
580 return "logentry-$type-$subtype";
600 $entry = $this->entry;
603 if ( $entry->isLegacy() ) {
604 foreach ( $entry->getParameters() as $index => $value ) {
610 foreach ( $entry->getParameters() as $key => $value ) {
611 if ( strpos( $key,
':' ) ===
false ) {
614 [ $index, $type, ] = explode(
':', $key, 3 );
615 if ( ctype_digit( $index ) ) {
616 $params[(int)$index - 1] = $this->formatParameterValue( $type, $value );
625 $max = max( array_keys(
$params ) );
627 for ( $i = 3; $i < $max; $i++ ) {
655 if ( isset( $this->parsedParameters ) ) {
656 return $this->parsedParameters;
659 $entry = $this->entry;
660 $params = $this->extractParameters();
661 $params[0] = Message::rawParam( $this->getPerformerElement() );
662 $params[1] = $this->canView( LogPage::DELETED_USER ) ? $entry->getPerformerIdentity()->getName() :
'';
663 $params[2] = Message::rawParam( $this->makePageLink( $entry->getTarget() ) );
668 $this->parsedParameters =
$params;
669 return $this->parsedParameters;
699 $saveLinkFlood = $this->linkFlood;
701 switch ( strtolower( trim( $type ) ) ) {
703 $value = Message::rawParam( $value );
706 $value = $this->context->getLanguage()->commaList( $value );
709 $value = $this->msg( $value )->text();
712 $value = $this->msg( $value )->inContentLanguage()->text();
715 $value = Message::numParam( $value );
718 $user = User::newFromName( $value );
719 $value = $user->getName();
722 $this->setShowUserToolLinks(
false );
724 $user = User::newFromName( $value );
727 $value = $this->msg(
'empty-username' )->text();
729 $value = Message::rawParam( $this->makeUserLink( $user ) );
730 $this->setShowUserToolLinks( $saveLinkFlood );
734 $title = Title::newFromText( $value );
735 $value = $title->getPrefixedText();
738 $title = Title::newFromText( $value );
739 $value = Message::rawParam( $this->makePageLink( $title ) );
761 if ( !$title instanceof
Title ) {
762 $msg = $this->msg(
'invalidtitle' )->text();
763 if ( $this->plaintext ) {
766 return Html::element(
'span', [
'class' =>
'mw-invalidtitle' ], $msg );
770 if ( $this->plaintext ) {
771 $link =
'[[' . $title->getPrefixedText() .
']]';
773 $html = $html !==
null ?
new HtmlArmor( $html ) : $html;
774 $link = $this->getLinkRenderer()->makeLink( $title, $html, [], $parameters );
787 if ( $this->canView( LogPage::DELETED_USER ) ) {
788 $performerIdentity = $this->entry->getPerformerIdentity();
789 $element = $this->makeUserLink( $performerIdentity );
790 if ( $this->entry->isDeleted( LogPage::DELETED_USER ) ) {
791 $element = $this->styleRestrictedElement( $element );
794 $element = $this->getRestrictedElement(
'rev-deleted-user' );
806 if ( $this->canView( LogPage::DELETED_COMMENT ) ) {
807 $comment = $this->getCommentFormatter()
808 ->formatBlock( $this->entry->getComment() );
810 $element = ltrim( $comment );
811 if ( $this->entry->isDeleted( LogPage::DELETED_COMMENT ) ) {
812 $element = $this->styleRestrictedElement( $element );
815 $element = $this->getRestrictedElement(
'rev-deleted-comment' );
828 if ( $this->plaintext ) {
829 return $this->msg( $message )->text();
832 return $this->styleRestrictedElement( $this->msg( $message )->escaped() );
841 if ( $this->plaintext ) {
844 $attribs = [
'class' => [
'history-deleted' ] ];
845 if ( $this->entry->isDeleted( LogPage::DELETED_RESTRICTED ) ) {
846 $attribs[
'class'][] =
'mw-history-suppressed';
849 return Html::rawElement(
'span', $attribs, $content );
859 return $this->context->msg( $key, ...
$params );
869 if ( $this->plaintext ) {
872 $element = Linker::userLink(
876 if ( $this->linkFlood ) {
877 $editCount = $this->getUserEditTracker()->getUserEditCount( $user );
879 $element .= Linker::userToolLinks(
909 return $this->getMessageParameters();
919 return $this->entry->getParameters();
939 foreach ( $this->getParametersForApi() as $key => $value ) {
940 $vals = explode(
':', $key, 3 );
941 if ( count( $vals ) !== 3 ) {
942 if ( $value instanceof __PHP_Incomplete_Class ) {
943 wfLogWarning(
'Log entry of type ' . $this->entry->getFullType() .
944 ' contains unrecoverable extra parameters.' );
947 $logParams[$key] = $value;
950 $logParams += $this->formatParameterValueForApi( $vals[2], $vals[1], $value );
952 ApiResult::setIndexedTagName( $logParams,
'param' );
953 ApiResult::setArrayType( $logParams,
'assoc' );
968 $type = strtolower( trim( $type ) );
971 $value = (bool)$value;
975 if ( is_int( $value ) || ctype_digit( (
string)$value ) ) {
976 $value = (int)$value;
978 $value = (float)$value;
985 if ( is_array( $value ) ) {
986 ApiResult::setArrayType( $value, $type );
996 $msg = $this->msg( $value );
997 if ( $type ===
'msg-content' ) {
998 $msg->inContentLanguage();
1001 $value[
"{$name}_key"] = $msg->getKey();
1002 if ( $msg->getParams() ) {
1003 $value[
"{$name}_params"] = $msg->getParams();
1005 $value[
"{$name}_text"] = $msg->text();
1010 $title = Title::newFromText( $value );
1012 $title = SpecialPage::getTitleFor(
'Badtitle', $value );
1015 ApiQueryBase::addTitleInfo( $value, $title,
"{$name}_" );
1020 $user = User::newFromName( $value );
1022 $value = $user->getName();
1031 return [ $name => $value ];
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.
array $params
The job parameters.
if(!defined('MW_SETUP_CALLBACK'))
Marks HTML that shouldn't be escaped.
Base class for language-specific code.
Extends the LogEntry Interface with some basic functionality.
Group all the pieces relevant to the context of a request into one instance.
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.