MediaWiki  master
RevDelFileItem.php
Go to the documentation of this file.
1 <?php
23 
27 class RevDelFileItem extends RevDelItem {
29  protected $list;
31  protected $file;
32 
33  public function __construct( $list, $row ) {
34  parent::__construct( $list, $row );
35  $this->file = static::initFile( $list, $row );
36  }
37 
45  protected static function initFile( $list, $row ) {
46  return RepoGroup::singleton()->getLocalRepo()->newFileFromRow( $row );
47  }
48 
49  public function getIdField() {
50  return 'oi_archive_name';
51  }
52 
53  public function getTimestampField() {
54  return 'oi_timestamp';
55  }
56 
57  public function getAuthorIdField() {
58  return 'oi_user';
59  }
60 
61  public function getAuthorNameField() {
62  return 'oi_user_text';
63  }
64 
65  public function getAuthorActorField() {
66  return 'oi_actor';
67  }
68 
69  public function getId() {
70  $parts = explode( '!', $this->row->oi_archive_name );
71 
72  return $parts[0];
73  }
74 
75  public function canView() {
76  return $this->file->userCan( File::DELETED_RESTRICTED, $this->list->getUser() );
77  }
78 
79  public function canViewContent() {
80  return $this->file->userCan( File::DELETED_FILE, $this->list->getUser() );
81  }
82 
83  public function getBits() {
84  return $this->file->getVisibility();
85  }
86 
87  public function setBits( $bits ) {
88  # Queue the file op
89  # @todo FIXME: Move to LocalFile.php
90  if ( $this->isDeleted() ) {
91  if ( $bits & File::DELETED_FILE ) {
92  # Still deleted
93  } else {
94  # Newly undeleted
95  $key = $this->file->getStorageKey();
96  $srcRel = $this->file->repo->getDeletedHashPath( $key ) . $key;
97  $this->list->storeBatch[] = [
98  $this->file->repo->getVirtualUrl( 'deleted' ) . '/' . $srcRel,
99  'public',
100  $this->file->getRel()
101  ];
102  $this->list->cleanupBatch[] = $key;
103  }
104  } elseif ( $bits & File::DELETED_FILE ) {
105  # Newly deleted
106  $key = $this->file->getStorageKey();
107  $dstRel = $this->file->repo->getDeletedHashPath( $key ) . $key;
108  $this->list->deleteBatch[] = [ $this->file->getRel(), $dstRel ];
109  }
110 
111  # Do the database operations
112  $dbw = wfGetDB( DB_MASTER );
113  $dbw->update( 'oldimage',
114  [ 'oi_deleted' => $bits ],
115  [
116  'oi_name' => $this->row->oi_name,
117  'oi_timestamp' => $this->row->oi_timestamp,
118  'oi_deleted' => $this->getBits()
119  ],
120  __METHOD__
121  );
122 
123  return (bool)$dbw->affectedRows();
124  }
125 
126  public function isDeleted() {
127  return $this->file->isDeleted( File::DELETED_FILE );
128  }
129 
135  protected function getLink() {
136  $date = $this->list->getLanguage()->userTimeAndDate(
137  $this->file->getTimestamp(), $this->list->getUser() );
138 
139  if ( !$this->isDeleted() ) {
140  # Regular files...
141  return Html::element( 'a', [ 'href' => $this->file->getUrl() ], $date );
142  }
143 
144  # Hidden files...
145  if ( !$this->canViewContent() ) {
146  $link = htmlspecialchars( $date );
147  } else {
148  $link = $this->getLinkRenderer()->makeLink(
149  SpecialPage::getTitleFor( 'Revisiondelete' ),
150  $date,
151  [],
152  [
153  'target' => $this->list->title->getPrefixedText(),
154  'file' => $this->file->getArchiveName(),
155  'token' => $this->list->getUser()->getEditToken(
156  $this->file->getArchiveName() )
157  ]
158  );
159  }
160 
161  return '<span class="history-deleted">' . $link . '</span>';
162  }
163 
168  protected function getUserTools() {
169  if ( $this->file->userCan( RevisionRecord::DELETED_USER, $this->list->getUser() ) ) {
170  $uid = $this->file->getUser( 'id' );
171  $name = $this->file->getUser( 'text' );
172  $link = Linker::userLink( $uid, $name ) . Linker::userToolLinks( $uid, $name );
173  } else {
174  $link = $this->list->msg( 'rev-deleted-user' )->escaped();
175  }
176  if ( $this->file->isDeleted( RevisionRecord::DELETED_USER ) ) {
177  return '<span class="history-deleted">' . $link . '</span>';
178  }
179 
180  return $link;
181  }
182 
189  protected function getComment() {
190  if ( $this->file->userCan( File::DELETED_COMMENT, $this->list->getUser() ) ) {
191  $block = Linker::commentBlock( $this->file->getDescription() );
192  } else {
193  $block = ' ' . $this->list->msg( 'rev-deleted-comment' )->escaped();
194  }
195  if ( $this->file->isDeleted( File::DELETED_COMMENT ) ) {
196  return "<span class=\"history-deleted\">$block</span>";
197  }
198 
199  return $block;
200  }
201 
202  public function getHTML() {
203  $data =
204  $this->list->msg( 'widthheight' )->numParams(
205  $this->file->getWidth(), $this->file->getHeight() )->text() .
206  ' (' . $this->list->msg( 'nbytes' )->numParams( $this->file->getSize() )->text() . ')';
207 
208  return '<li>' . $this->getLink() . ' ' . $this->getUserTools() . ' ' .
209  $data . ' ' . $this->getComment() . '</li>';
210  }
211 
212  public function getApiData( ApiResult $result ) {
213  $file = $this->file;
214  $user = $this->list->getUser();
215  $ret = [
216  'title' => $this->list->title->getPrefixedText(),
217  'archivename' => $file->getArchiveName(),
218  'timestamp' => wfTimestamp( TS_ISO_8601, $file->getTimestamp() ),
219  'width' => $file->getWidth(),
220  'height' => $file->getHeight(),
221  'size' => $file->getSize(),
222  'userhidden' => (bool)$file->isDeleted( RevisionRecord::DELETED_USER ),
223  'commenthidden' => (bool)$file->isDeleted( RevisionRecord::DELETED_COMMENT ),
224  'contenthidden' => (bool)$this->isDeleted(),
225  ];
226  if ( !$this->isDeleted() ) {
227  $ret += [
228  'url' => $file->getUrl(),
229  ];
230  } elseif ( $this->canViewContent() ) {
231  $ret += [
232  'url' => SpecialPage::getTitleFor( 'Revisiondelete' )->getLinkURL(
233  [
234  'target' => $this->list->title->getPrefixedText(),
235  'file' => $file->getArchiveName(),
236  'token' => $user->getEditToken( $file->getArchiveName() )
237  ]
238  ),
239  ];
240  }
241  if ( $file->userCan( RevisionRecord::DELETED_USER, $user ) ) {
242  $ret += [
243  'userid' => $file->user,
244  'user' => $file->user_text,
245  ];
246  }
247  if ( $file->userCan( RevisionRecord::DELETED_COMMENT, $user ) ) {
248  $ret += [
249  'comment' => $file->description,
250  ];
251  }
252 
253  return $ret;
254  }
255 
256  public function lock() {
257  return $this->file->acquireFileLock();
258  }
259 
260  public function unlock() {
261  return $this->file->releaseFileLock();
262  }
263 }
const DELETED_COMMENT
Definition: File.php:64
static element( $element, $attribs=[], $contents='')
Identical to rawElement(), but HTML-escapes $contents (like Xml::element()).
Definition: Html.php:231
getUserTools()
Generate a user tool link cluster if the current user is allowed to view it.
getLink()
Get the link to the file.
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
getSize()
Returns the size of the image file, in bytes.
Definition: LocalFile.php:932
Item class for an oldimage table row.
const DB_MASTER
Definition: defines.php:26
const DELETED_FILE
Definition: File.php:63
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
userCan( $field, User $user=null)
Determine if the current user is allowed to view a particular field of this image file...
$row
The database result row.
Abstract base class for deletable items.
Definition: RevDelItem.php:25
static userToolLinks( $userId, $userText, $redContribsWhenNoEdits=false, $flags=0, $edits=null, $useParentheses=true)
Generate standard user tool links (talk, contributions, block link, etc.)
Definition: Linker.php:943
static singleton()
Definition: RepoGroup.php:60
getApiData(ApiResult $result)
This class represents the result of the API operations.
Definition: ApiResult.php:35
static getTitleFor( $name, $subpage=false, $fragment='')
Get a localised Title object for a specified special page name If you don&#39;t need a full Title object...
Definition: SpecialPage.php:83
static userLink( $userId, $userName, $altUserName=false)
Make user link (or user contributions for unregistered users)
Definition: Linker.php:898
const DELETED_RESTRICTED
Definition: File.php:66
getUrl()
Return the URL of the file.
Definition: File.php:358
getLinkRenderer()
Returns an instance of LinkRenderer.
OldLocalFile $file
getHeight( $page=1)
Return the height of the image.
Definition: LocalFile.php:828
RevDelFileList $list
static initFile( $list, $row)
Create file object from $row sourced from $list.
getWidth( $page=1)
Return the width of the image.
Definition: LocalFile.php:796
static commentBlock( $comment, $title=null, $local=false, $wikiId=null, $useParentheses=true)
Wrap a comment in standard punctuation and formatting if it&#39;s non-empty, otherwise return empty strin...
Definition: Linker.php:1542
getUser( $type='text')
Returns user who uploaded the file.
Definition: LocalFile.php:861
__construct( $list, $row)
isDeleted( $field)
getComment()
Wrap and format the file&#39;s comment block, if the current user is allowed to view it.