Page MenuHomePhabricator

privatelogs.patch

Authored By
bzimport
Nov 21 2014, 10:07 PM
Size
23 KB
Referenced Files
None
Subscribers
None

privatelogs.patch

Index: includes/DefaultSettings.php
===================================================================
--- includes/DefaultSettings.php (revision 32619)
+++ includes/DefaultSettings.php (working copy)
@@ -1145,17 +1145,23 @@
$wgGroupPermissions['sysop']['suppressredirect'] = true;
$wgGroupPermissions['sysop']['apihighlimits'] = true;
$wgGroupPermissions['sysop']['browsearchive'] = true;
-#$wgGroupPermissions['sysop']['mergehistory'] = true;
+$wgGroupPermissions['sysop']['mergehistory'] = true;
// Permission to change users' group assignments
$wgGroupPermissions['bureaucrat']['userrights'] = true;
// Permission to change users' groups assignments across wikis
#$wgGroupPermissions['bureaucrat']['userrights-interwiki'] = true;
-// Experimental permissions, not ready for production use
-//$wgGroupPermissions['sysop']['deleterevision'] = true;
-//$wgGroupPermissions['bureaucrat']['hiderevision'] = true;
+#$wgGroupPermissions['sysop']['deleterevision'] = true;
+// To hide usernames
+#$wgGroupPermissions['oversight']['hideuser'] = true;
+// To see hidden revs and unhide revs hidden from Sysops
+#$wgGroupPermissions['oversight']['hiderevision'] = true;
+// For private log access
+#$wgGroupPermissions['oversight']['oversight'] = true;
+$wgAllowLogDeletion = false;
+
/**
* The developer group is deprecated, but can be activated if need be
* to use the 'lockdb' and 'unlockdb' special pages. Those require
@@ -2394,9 +2400,20 @@
'import',
'patrol',
'merge',
+ 'oversight',
);
/**
+ * This restricts log access to those who have a certain right
+ * Users without this will not see it in the option menu and can not view it
+ * Restricted logs are not added to recent changes
+ * Logs should remain non-transcludable
+ */
+$wgLogRestrictions = array(
+ 'oversight' => 'oversight'
+);
+
+/**
* Lists the message key string for each log type. The localized messages
* will be listed in the user interface.
*
@@ -2413,6 +2430,7 @@
'import' => 'importlogpage',
'patrol' => 'patrol-log-page',
'merge' => 'mergelog',
+ 'oversight' => 'oversightlog',
);
/**
@@ -2432,6 +2450,8 @@
'import' => 'importlogpagetext',
'patrol' => 'patrol-log-header',
'merge' => 'mergelogpagetext',
+ 'oversight' => 'overlogpagetext',
+ 'merge' => 'mergelogpagetext',
);
/**
@@ -2458,6 +2478,12 @@
'import/upload' => 'import-logentry-upload',
'import/interwiki' => 'import-logentry-interwiki',
'merge/merge' => 'pagemerge-logentry',
+ 'oversight/revision' => 'revdelete-logentry',
+ 'oversight/file' => 'revdelete-logentry',
+ 'oversight/event' => 'logdelete-logentry',
+ 'oversight/delete' => 'suppressedarticle',
+ 'oversight/block' => 'blocklogentry',
+ 'merge/merge' => 'pagemerge-logentry',
);
/**
Index: includes/LogPage.php
===================================================================
--- includes/LogPage.php (revision 32619)
+++ includes/LogPage.php (working copy)
@@ -54,7 +54,7 @@
function saveContent() {
if( wfReadOnly() ) return false;
- global $wgUser;
+ global $wgUser, $wgLogRestrictions;
$fname = 'LogPage::saveContent';
$dbw = wfGetDB( DB_MASTER );
@@ -72,20 +72,18 @@
'log_comment' => $this->comment,
'log_params' => $this->params
);
-
- # log_id doesn't exist on Wikimedia servers yet, and it's a tricky
- # schema update to do. Hack it for now to ignore the field on MySQL.
- if ( !is_null( $log_id ) ) {
- $data['log_id'] = $log_id;
- }
$dbw->insert( 'logging', $data, $fname );
+ $newId = $dbw->insertId();
# And update recentchanges
- if ( $this->updateRecentChanges ) {
- $titleObj = SpecialPage::getTitleFor( 'Log', $this->type );
- $rcComment = $this->getRcComment();
- RecentChange::notifyLog( $now, $titleObj, $wgUser, $rcComment, '',
- $this->type, $this->action, $this->target, $this->comment, $this->params );
+ if( $this->updateRecentChanges ) {
+ # Don't add private logs to RC!
+ if( !isset($wgLogRestrictions[$this->type]) || $wgLogRestrictions[$this->type]=='*' ) {
+ $titleObj = SpecialPage::getTitleFor( 'Log', $this->type );
+ $rcComment = $this->getRcComment();
+ RecentChange::notifyLog( $now, $titleObj, $wgUser, $rcComment, '',
+ $this->type, $this->action, $this->target, $this->comment, $this->params, $newId );
+ }
}
return true;
}
@@ -137,7 +135,7 @@
*/
static function logHeader( $type ) {
global $wgLogHeaders;
- return wfMsg( $wgLogHeaders[$type] );
+ return wfMsgHtml( $wgLogHeaders[$type] );
}
/**
@@ -208,7 +206,7 @@
}
} else {
array_unshift( $params, $titleLink );
- if ( $key == 'block/block' ) {
+ if ( $key == 'block/block' || $key == 'oversight/block' ) {
if ( $skin ) {
$params[1] = '<span title="' . htmlspecialchars( $params[1] ). '">' . $wgLang->translateBlockExpiry( $params[1] ) . '</span>';
} else {
@@ -328,7 +326,7 @@
$permission = ( $row->log_deleted & self::DELETED_RESTRICTED ) == self::DELETED_RESTRICTED
? 'hiderevision'
: 'deleterevision';
- wfDebug( "Checking for $permission due to $field match on $event->log_deleted\n" );
+ wfDebug( "Checking for $permission due to $field match on $row->log_deleted\n" );
return $wgUser->isAllowed( $permission );
} else {
return true;
Index: includes/RecentChange.php
===================================================================
--- includes/RecentChange.php (revision 32619)
+++ includes/RecentChange.php (working copy)
@@ -296,7 +296,12 @@
'rc_patrolled' => 0,
'rc_new' => 0, # obsolete
'rc_old_len' => $oldSize,
- 'rc_new_len' => $newSize
+ 'rc_new_len' => $newSize,
+ 'rc_deleted' => 0,
+ 'rc_logid' => 0,
+ 'rc_log_type' => null,
+ 'rc_log_action' => '',
+ 'rc_params' => ''
);
$rc->mExtra = array(
@@ -343,9 +348,14 @@
'rc_moved_to_title' => '',
'rc_ip' => $ip,
'rc_patrolled' => 0,
- 'rc_new' => 1, # obsolete
+ 'rc_new' => 1, # obsolete
'rc_old_len' => 0,
- 'rc_new_len' => $size
+ 'rc_new_len' => $size,
+ 'rc_deleted' => 0,
+ 'rc_logid' => 0,
+ 'rc_log_type' => null,
+ 'rc_log_action' => '',
+ 'rc_params' => ''
);
$rc->mExtra = array(
@@ -392,6 +402,11 @@
'rc_patrolled' => 1,
'rc_old_len' => NULL,
'rc_new_len' => NULL,
+ 'rc_deleted' => 0,
+ 'rc_logid' => 0, # notifyMove not used anymore
+ 'rc_log_type' => null,
+ 'rc_log_action' => '',
+ 'rc_params' => ''
);
$rc->mExtra = array(
@@ -410,10 +425,9 @@
RecentChange::notifyMove( $timestamp, $oldTitle, $newTitle, $user, $comment, $ip, true );
}
- # A log entry is different to an edit in that previous revisions are
- # not kept
+ # A log entry is different to an edit in that previous revisions are not kept
public static function notifyLog( $timestamp, &$title, &$user, $comment, $ip='',
- $type, $action, $target, $logComment, $params )
+ $type, $action, $target, $logComment, $params, $newId=0 )
{
global $wgRequest;
@@ -428,14 +442,14 @@
$rc->mAttribs = array(
'rc_timestamp' => $timestamp,
'rc_cur_time' => $timestamp,
- 'rc_namespace' => $title->getNamespace(),
- 'rc_title' => $title->getDBkey(),
+ 'rc_namespace' => $target->getNamespace(),
+ 'rc_title' => $target->getDBkey(),
'rc_type' => RC_LOG,
'rc_minor' => 0,
- 'rc_cur_id' => $title->getArticleID(),
+ 'rc_cur_id' => $target->getArticleID(),
'rc_user' => $user->getID(),
'rc_user_text' => $user->getName(),
- 'rc_comment' => $comment,
+ 'rc_comment' => $logComment,
'rc_this_oldid' => 0,
'rc_last_oldid' => 0,
'rc_bot' => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot' , true ) : 0,
@@ -446,6 +460,11 @@
'rc_new' => 0, # obsolete
'rc_old_len' => NULL,
'rc_new_len' => NULL,
+ 'rc_deleted' => 0,
+ 'rc_logid' => $newId,
+ 'rc_log_type' => $type,
+ 'rc_log_action' => $action,
+ 'rc_params' => $params
);
$rc->mExtra = array(
'prefixedDBkey' => $title->getPrefixedDBkey(),
Index: includes/SpecialLog.php
===================================================================
--- includes/SpecialLog.php (revision 32619)
+++ includes/SpecialLog.php (working copy)
@@ -80,10 +80,33 @@
/**
* Set the log reader to return only entries of the given type.
+ * Type restrictions enforced here
* @param string $type A log type ('upload', 'delete', etc)
* @private
*/
function limitType( $type ) {
+ global $wgLogRestrictions, $wgUser;
+ // Reset the array, clears extra "where" clauses when $par is used
+ $this->whereClauses = $hiddenLogs = array();
+ // Exclude logs this user can't see
+ if( isset($wgLogRestrictions) ) {
+ if( isset($wgLogRestrictions[$type]) && !$wgUser->isAllowed( $wgLogRestrictions[$type] ) ) {
+ $this->whereClauses[] = "1 = 0";
+ return false;
+ }
+ // Don't show private logs to unpriviledged users or
+ // when not specifically requested.
+ foreach( $wgLogRestrictions as $logtype => $right ) {
+ if( !$wgUser->isAllowed( $right ) || empty($type) ) {
+ $safetype = $this->db->strencode( $logtype );
+ $hiddenLogs[] = "'$safetype'";
+ }
+ }
+ if( !empty($hiddenLogs) ) {
+ $this->whereClauses[] = 'log_type NOT IN('.implode(',',$hiddenLogs).')';
+ }
+ }
+
if( empty( $type ) ) {
return false;
}
@@ -162,11 +185,16 @@
* @private
*/
function getQuery() {
+ global $wgAllowLogDeletion;
+
$logging = $this->db->tableName( "logging" );
$sql = "SELECT /*! STRAIGHT_JOIN */ log_type, log_action, log_timestamp,
- log_user, user_name,
- log_namespace, log_title, page_id,
- log_comment, log_params FROM $logging ";
+ log_user, user_name, log_namespace, log_title, page_id,
+ log_comment, log_params, log_deleted ";
+ if( $wgAllowLogDeletion )
+ $sql .= ", log_id ";
+
+ $sql .= "FROM $logging ";
if( !empty( $this->joinClauses ) ) {
$sql .= implode( ' ', $this->joinClauses );
}
@@ -260,8 +288,22 @@
global $wgUser;
$this->skin = $wgUser->getSkin();
$this->reader =& $reader;
+ $this->preCacheMessages();
$this->flags = $flags;
}
+
+ /**
+ * As we use the same small set of messages in various methods and that
+ * they are called often, we call them once and save them in $this->message
+ */
+ function preCacheMessages() {
+ // Precache various messages
+ if( !isset( $this->message ) ) {
+ foreach( explode(' ', 'viewpagelogs revhistory filehist rev-delundel' ) as $msg ) {
+ $this->message[$msg] = wfMsgExt( $msg, array( 'escape') );
+ }
+ }
+ }
/**
* Take over the whole output page in $wgOut with the log display.
@@ -355,7 +397,6 @@
$skin = $wgUser->getSkin();
$title = Title::makeTitle( $s->log_namespace, $s->log_title );
$time = $wgLang->timeanddate( wfTimestamp(TS_MW, $s->log_timestamp), true );
-
// Enter the existence or non-existence of this page into the link cache,
// for faster makeLinkObj() in LogPage::actionText()
$linkCache =& LinkCache::singleton();
@@ -364,16 +405,33 @@
} else {
$linkCache->addBadLinkObj( $title );
}
-
- $userLink = $this->skin->userLink( $s->log_user, $s->user_name ) . $this->skin->userToolLinksRedContribs( $s->log_user, $s->user_name );
- $comment = $wgContLang->getDirMark() . $this->skin->commentBlock( $s->log_comment );
+ // User links
+ if( LogPage::isDeleted($s,LogPage::DELETED_USER) ) {
+ $userLink = '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
+ } else {
+ $userLink = $this->skin->userLink( $s->log_user, $s->user_name ) .
+ $this->skin->userToolLinksRedContribs( $s->log_user, $s->user_name );
+ }
+ // Comment
+ if( $s->log_action == 'create2' ) {
+ $comment = ''; // Suppress from old account creations, useless and can contain incorrect links
+ } else if( LogPage::isDeleted($s,LogPage::DELETED_COMMENT) ) {
+ $comment = '<span class="history-deleted">' . wfMsgHtml('rev-deleted-comment') . '</span>';
+ } else {
+ $comment = $wgContLang->getDirMark() . $this->skin->commentBlock( $s->log_comment );
+ }
+ // Extract extra parameters
$paramArray = LogPage::extractParams( $s->log_params );
- $revert = '';
- // show revertmove link
- if ( !( $this->flags & self::NO_ACTION_LINK ) ) {
- if ( $s->log_type == 'move' && isset( $paramArray[0] ) && $wgUser->isAllowed( 'move' ) ) {
+ $revert = $del = '';
+ // Some user can hide log items and have review links
+ if( $wgUser->isAllowed( 'deleterevision' ) ) {
+ $del = "<tt>".$this->showhideLinks( $s )."</tt> ";
+ }
+ // Add review links and such...
+ if( !($this->flags & self::NO_ACTION_LINK) && !($s->log_deleted & LogPage::DELETED_ACTION) ) {
+ if( $s->log_type == 'move' && isset( $paramArray[0] ) && $wgUser->isAllowed( 'move' ) ) {
$destTitle = Title::newFromText( $paramArray[0] );
- if ( $destTitle ) {
+ if( $destTitle ) {
$revert = '(' . $this->skin->makeKnownLinkObj( SpecialPage::getTitleFor( 'Movepage' ),
wfMsg( 'revertmove' ),
'wpOldTitle=' . urlencode( $destTitle->getPrefixedDBkey() ) .
@@ -382,17 +440,17 @@
'&wpMovetalk=0' ) . ')';
}
// show undelete link
- } elseif ( $s->log_action == 'delete' && $wgUser->isAllowed( 'delete' ) ) {
+ } elseif( $s->log_action == 'delete' && $wgUser->isAllowed( 'delete' ) ) {
$revert = '(' . $this->skin->makeKnownLinkObj( SpecialPage::getTitleFor( 'Undelete' ),
wfMsg( 'undeletelink' ) ,
'target='. urlencode( $title->getPrefixedDBkey() ) ) . ')';
// show unblock link
- } elseif ( $s->log_action == 'block' && $wgUser->isAllowed( 'block' ) ) {
+ } elseif( $s->log_action == 'block' && $wgUser->isAllowed( 'block' ) ) {
$revert = '(' . $skin->makeKnownLinkObj( SpecialPage::getTitleFor( 'Ipblocklist' ),
wfMsg( 'unblocklink' ),
'action=unblock&ip=' . urlencode( $s->log_title ) ) . ')';
// show change protection link
- } elseif ( ( $s->log_action == 'protect' || $s->log_action == 'modify' ) && $wgUser->isAllowed( 'protect' ) ) {
+ } elseif( ( $s->log_action == 'protect' || $s->log_action == 'modify' ) && $wgUser->isAllowed( 'protect' ) ) {
$revert = '(' . $skin->makeKnownLinkObj( $title, wfMsg( 'protect_change' ), 'action=unprotect' ) . ')';
// Show unmerge link
} elseif ( $s->log_action == 'merge' ) {
@@ -402,16 +460,77 @@
array('target' => $paramArray[0], 'dest' => $title->getPrefixedText(), 'mergepoint' => $paramArray[1] )
)
) . ')';
+ // If an edit was hidden from a page give a review link to the history
+ } else if( $s->log_action == 'revision' && $wgUser->isAllowed( 'deleterevision' ) ) {
+ $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
+ // Different revision types use different URL params...
+ $subtype = isset($paramArray[2]) ? $paramArray[1] : '';
+ // Link to each hidden object ID, $paramArray[1] is the url param. List if several...
+ $Ids = explode( ',', $paramArray[2] );
+ if( count($Ids) == 1 ) {
+ $revert = $this->skin->makeKnownLinkObj( $revdel, wfMsgHtml('revdel-restore'),
+ wfArrayToCGI( array('target' => $paramArray[0], $paramArray[1] => $Ids[0] ) ) );
+ } else {
+ $revert .= wfMsgHtml('revdel-restore').':';
+ foreach( $Ids as $n => $id ) {
+ $revert .= ' '.$this->skin->makeKnownLinkObj( $revdel, '#'.($n+1),
+ wfArrayToCGI( array('target' => $paramArray[0], $paramArray[1] => $id ) ) );
+ }
+ }
+ $revert = "($revert)";
+ // Hidden log items, give review link
+ } else if( $s->log_action == 'event' && $wgUser->isAllowed( 'deleterevision' ) ) {
+ $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
+ $revert .= wfMsgHtml('revdel-restore');
+ $Ids = explode( ',', $paramArray[0] );
+ if( count($Ids) == 1 ) {
+ $revert = $this->skin->makeKnownLinkObj( $revdel, wfMsgHtml('revdel-restore'),
+ wfArrayToCGI( array('logid' => $Ids[0] ) ) );
+ } else {
+ foreach( $Ids as $n => $id ) {
+ $revert .= $this->skin->makeKnownLinkObj( $revdel, '#'.($n+1),
+ wfArrayToCGI( array('logid' => $id ) ) );
+ }
+ }
+ $revert = "($revert)";
} elseif ( wfRunHooks( 'LogLine', array( $s->log_type, $s->log_action, $title, $paramArray, &$comment, &$revert, $s->log_timestamp ) ) ) {
// wfDebug( "Invoked LogLine hook for " $s->log_type . ", " . $s->log_action . "\n" );
// Do nothing. The implementation is handled by the hook modifiying the passed-by-ref parameters.
}
}
-
- $action = LogPage::actionText( $s->log_type, $s->log_action, $title, $this->skin, $paramArray, true );
- $out = "<li>$time $userLink $action $comment $revert</li>\n";
- return $out;
+ // Event description
+ if( $s->log_deleted & LogPage::DELETED_ACTION )
+ $action = '<span class="history-deleted">' . wfMsgHtml('rev-deleted-event') . '</span>';
+ else
+ $action = LogPage::actionText( $s->log_type, $s->log_action, $title, $this->skin, $paramArray, true );
+
+ return "<li>$del$time $userLink $action $comment $revert</li>";
}
+
+ /**
+ * @param Row $s
+ * @private
+ */
+ function showhideLinks( $s ) {
+ global $wgAllowLogDeletion;
+
+ if( !$wgAllowLogDeletion )
+ return "";
+
+ $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
+ // If event was hidden from sysops
+ if( !LogPage::userCan( $s, Revision::DELETED_RESTRICTED ) ) {
+ $del = $this->message['rev-delundel'];
+ } else if( $s->log_type == 'oversight' ) {
+ return ''; // No one should be hiding from the oversight log
+ } else {
+ $del = $this->skin->makeKnownLinkObj( $revdel, $this->message['rev-delundel'], 'logid='.$s->log_id );
+ // Bolden oversighted content
+ if( LogPage::isDeleted( $s, Revision::DELETED_RESTRICTED ) )
+ $del = "<strong>$del</strong>";
+ }
+ return "(<small>$del</small>)";
+ }
/**
* @param OutputPage &$out where to send output
@@ -451,6 +570,8 @@
* @private
*/
function getTypeMenu() {
+ global $wgLogRestrictions, $wgUser;
+
$out = "<select name='type'>\n";
$validTypes = LogPage::validTypes();
@@ -468,7 +589,14 @@
// Third pass generates sorted XHTML content
foreach( $m as $text => $type ) {
$selected = ($type == $this->reader->queryType());
- $out .= Xml::option( $text, $type, $selected ) . "\n";
+ // Restricted types
+ if ( isset($wgLogRestrictions[$type]) ) {
+ if ( $wgUser->isAllowed( $wgLogRestrictions[$type] ) ) {
+ $out .= Xml::option( $text, $type, $selected ) . "\n";
+ }
+ } else {
+ $out .= Xml::option( $text, $type, $selected ) . "\n";
+ }
}
$out .= '</select>';
@@ -525,3 +653,4 @@
$out->addHTML( '<p>' . $html . '</p>' );
}
}
+
Index: includes/SpecialWatchlist.php
===================================================================
--- includes/SpecialWatchlist.php (revision 32619)
+++ includes/SpecialWatchlist.php (working copy)
@@ -163,7 +163,8 @@
$andLatest='';
$limitWatchlist = 'LIMIT ' . intval( $wgUser->getOption( 'wllimit' ) );
} else {
- $andLatest= 'AND rc_this_oldid=page_latest';
+ # Top log Ids for a page are not stored
+ $andLatest = 'AND (rc_this_oldid=page_latest OR rc_type=' . RC_LOG . ') ';
$limitWatchlist = '';
}
Index: languages/messages/MessagesEn.php
===================================================================
--- languages/messages/MessagesEn.php (revision 32619)
+++ languages/messages/MessagesEn.php (working copy)
@@ -1189,19 +1189,20 @@
there may be details in the [{{fullurl:Special:Log/delete|page={{FULLPAGENAMEE}}}} deletion log].</div>',
'rev-delundel' => 'show/hide',
'revisiondelete' => 'Delete/undelete revisions',
-'revdelete-nooldid-title' => 'No target revision',
-'revdelete-nooldid-text' => 'You have not specified target revision or revisions to perform this function on.',
-'revdelete-selected' => "{{PLURAL:$2|Selected revision|Selected revisions}} of '''$1:'''",
-'logdelete-selected' => "{{PLURAL:$2|Selected log event|Selected log events}} for '''$1:'''",
+'revdelete-nooldid-title' => 'Invalid target revision',
+'revdelete-nooldid-text' => 'You have either not specified a target revision(s) to perform this
+function, the specified revision does not exist, or you are attempting to hide the current revision.',
+'revdelete-selected' => "{{PLURAL:$2|Selected revision|Selected revisions}} of [[:$1]]:",
+'logdelete-selected' => "{{PLURAL:$1|Selected log event|Selected log events}}:",
'revdelete-text' => 'Deleted revisions and events will still appear in the page history and logs, but parts of their content will be inaccessible to the public.
Other admins on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.',
-'revdelete-legend' => 'Set restrictions:',
+'revdelete-legend' => 'Set restrictions',
'revdelete-hide-text' => 'Hide revision text',
'revdelete-hide-name' => 'Hide action and target',
'revdelete-hide-comment' => 'Hide edit comment',
'revdelete-hide-user' => "Hide editor's username/IP",
-'revdelete-hide-restricted' => 'Apply these restrictions to sysops as well as others',
+'revdelete-hide-restricted' => 'Apply these restrictions to Sysops and lock this interface',
'revdelete-suppress' => 'Suppress data from sysops as well as others',
'revdelete-hide-image' => 'Hide file content',
'revdelete-unsuppress' => 'Remove restrictions on restored revisions',
@@ -1210,14 +1211,18 @@
'revdelete-logentry' => 'changed revision visibility of [[$1]]',
'logdelete-logentry' => 'changed event visibility of [[$1]]',
'revdelete-logaction' => '$1 {{PLURAL:$1|revision|revisions}} set to mode $2',
-'logdelete-logaction' => '$1 {{PLURAL:$1|event|events}} to [[$3]] set to mode $2',
-'revdelete-success' => 'Revision visibility successfully set.',
-'logdelete-success' => 'Event visibility successfully set.',
+'logdelete-logaction' => '$1 {{PLURAL:$1|event|events}} set to mode $2',
+'revdelete-success' => "'''Revision visibility successfully set.'''",
+'logdelete-success' => "'''Log visibility successfully set.'''",
+'revdel-restore' => 'Change visiblity',
'pagehist' => 'Page history',
'deletedhist' => 'Deleted history',
+'pagehist' => 'Page history',
+'deletedhist' => 'Deleted history',
+
# Oversight log
-'oversightlog' => 'Oversight log',
+'oversightlog' => 'Suppression log',
'overlogpagetext' => 'Below is a list of the most recent deletions and blocks involving content hidden from sysops. See the [[Special:Ipblocklist|IP block list]] for the list of currently operational bans and blocks.',
# History merging
@@ -1416,6 +1421,11 @@
'grouppage-sysop' => '{{ns:project}}:Administrators',
'grouppage-bureaucrat' => '{{ns:project}}:Bureaucrats',
+'oversight' => 'Oversight',
+'group-oversight' => 'Oversights',
+'group-oversight-member' => 'Oversight',
+'grouppage-oversight' => '{{ns:project}}:Oversight',
+
# User rights log
'rightslog' => 'User rights log',
'rightslogtext' => 'This is a log of changes to user rights.',
@@ -1825,7 +1835,7 @@
'specialloguserlabel' => 'User:',
'speciallogtitlelabel' => 'Title:',
'log' => 'Logs',
-'all-logs-page' => 'All logs',
+'all-logs-page' => 'All public logs',
'log-search-legend' => 'Search for logs',
'log-search-submit' => 'Go',
'alllogstext' => 'Combined display of all available logs of {{SITENAME}}.
@@ -1969,6 +1979,7 @@
'deletedtext' => '"<nowiki>$1</nowiki>" has been deleted.
See $2 for a record of recent deletions.',
'deletedarticle' => 'deleted "[[$1]]"',
+'suppressedarticle' => 'suppressed "[[$1]]"',
'dellogpage' => 'Deletion log',
'dellogpagetext' => 'Below is a list of the most recent deletions.',
'deletionlog' => 'deletion log',

File Metadata

Mime Type
text/x-diff
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4352
Default Alt Text
privatelogs.patch (23 KB)

Event Timeline