wiki.techinc.nl/includes/logging/ProtectLogFormatter.php
umherirrender d6961552b3 Migrate protect log to new log system
This localize the protect type, level and expiry on Special:Log/protect.
To allow i18n there are some details stored in the log params of new log
items, these details also shown on API output.
The details cannot get from the old existing data, because there are
containing L10n strings therefore i18n works only for new items.
In the api and for IRC the old description text is still stored in the
log params for backward compatibility.

This allows use of gender on Special:Log. Old messages are kept for use
in IRC. Tests already exists to ensure an unchanged IRC message.

Bug: T47988
Change-Id: I3bb85c61b857972e66c99c499d7d785c88cafb25
2015-09-25 17:07:50 +02:00

213 lines
6.1 KiB
PHP

<?php
/**
* Formatter for protect log entries.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
* @since 1.26
*/
/**
* This class formats protect log entries.
*
* @since 1.26
*/
class ProtectLogFormatter extends LogFormatter {
public function getPreloadTitles() {
$subtype = $this->entry->getSubtype();
if ( $subtype === 'move_prot' ) {
$params = $this->extractParameters();
return array( Title::newFromText( $params[3] ) );
}
return array();
}
protected function getMessageKey() {
$key = parent::getMessageKey();
$params = $this->extractParameters();
if ( isset( $params[4] ) && $params[4] ) {
// Messages: logentry-protect-protect-cascade, logentry-protect-modify-cascade
$key .= '-cascade';
}
return $key;
}
protected function getMessageParameters() {
$params = parent::getMessageParameters();
$subtype = $this->entry->getSubtype();
if ( $subtype === 'protect' || $subtype === 'modify' ) {
$rawParams = $this->entry->getParameters();
if ( isset( $rawParams['details'] ) ) {
$params[3] = $this->createProtectDescription( $rawParams['details'] );
} elseif ( isset( $params[3] ) ) {
// Old way of Restrictions and expiries
$params[3] = $this->context->getLanguage()->getDirMark() . $params[3];
} else {
// Very old way (nothing set)
$params[3] = '';
}
// Cascading flag
if ( isset( $params[4] ) ) {
// handled in getMessageKey
unset( $params[4] );
}
} elseif ( $subtype === 'move_prot' ) {
$oldname = $this->makePageLink( Title::newFromText( $params[3] ), array( 'redirect' => 'no' ) );
$params[3] = Message::rawParam( $oldname );
}
return $params;
}
public function getActionLinks() {
$subtype = $this->entry->getSubtype();
if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
|| $subtype === 'move_prot' // the move log entry has the right action link
) {
return '';
}
// Show history link for all changes after the protection
$title = $this->entry->getTarget();
$links = array(
Linker::link( $title,
$this->msg( 'hist' )->escaped(),
array(),
array(
'action' => 'history',
'offset' => $this->entry->getTimestamp(),
)
)
);
// Show change protection link
if ( $this->context->getUser()->isAllowed( 'protect' ) ) {
$links[] = Linker::linkKnown(
$title,
$this->msg( 'protect_change' )->escaped(),
array(),
array( 'action' => 'protect' )
);
}
return $this->msg( 'parentheses' )->rawParams(
$this->context->getLanguage()->pipeList( $links ) )->escaped();
}
protected function getParametersForApi() {
$entry = $this->entry;
$subtype = $this->entry->getSubtype();
$params = $entry->getParameters();
$map = array();
if ( $subtype === 'protect' || $subtype === 'modify' ) {
$map = array(
'4::description',
'5:bool:cascade',
'details' => ':array:details',
);
} elseif ( $subtype === 'move_prot' ) {
$map = array(
'4:title:oldtitle',
'4::oldtitle' => '4:title:oldtitle',
);
}
foreach ( $map as $index => $key ) {
if ( isset( $params[$index] ) ) {
$params[$key] = $params[$index];
unset( $params[$index] );
}
}
// Change string to explicit boolean
if ( isset( $params['5:bool:cascade'] ) && is_string( $params['5:bool:cascade'] ) ) {
$params['5:bool:cascade'] = $params['5:bool:cascade'] === 'cascade';
}
return $params;
}
public function formatParametersForApi() {
global $wgContLang;
$ret = parent::formatParametersForApi();
if ( isset( $ret['details'] ) && is_array( $ret['details'] ) ) {
foreach ( $ret['details'] as &$detail ) {
if ( isset( $detail['expiry'] ) ) {
$detail['expiry'] = $wgContLang->formatExpiry( $detail['expiry'], TS_ISO_8601, 'infinite' );
}
}
}
return $ret;
}
/**
* Create the protect description to show in the log formatter
*
* @param array $details
* @return string
*/
public function createProtectDescription( array $details ) {
$protectDescription = '';
foreach ( $details as $param ) {
$expiryText = $this->formatExpiry( $param['expiry'] );
// Messages: restriction-edit, restriction-move, restriction-create,
// restriction-upload
$action = $this->context->msg( 'restriction-' . $param['type'] )->escaped();
$protectionLevel = $param['level'];
// Messages: protect-level-autoconfirmed, protect-level-sysop
$message = $this->context->msg( 'protect-level-' . $protectionLevel );
if ( $message->isDisabled() ) {
// Require "$1" permission
$restrictions = $this->context->msg( "protect-fallback", $protectionLevel )->parse();
} else {
$restrictions = $message->escaped();
}
if ( $protectDescription !== '' ) {
$protectDescription .= $this->context->msg( 'word-separator' )->escaped();
}
$protectDescription .= $this->context->msg( 'protect-summary-desc' )
->params( $action, $restrictions, $expiryText )->escaped();
}
return $protectDescription;
}
private function formatExpiry( $expiry ) {
if ( wfIsInfinity( $expiry ) ) {
return $this->context->msg( 'protect-expiry-indefinite' )->text();
}
$lang = $this->context->getLanguage();
$user = $this->context->getUser();
return $this->context->msg(
'protect-expiring-local',
$lang->userTimeAndDate( $expiry, $user ),
$lang->userDate( $expiry, $user ),
$lang->userTime( $expiry, $user )
)->text();
}
}