MediaWiki  1.27.2
ArchivedFile.php
Go to the documentation of this file.
1 <?php
29 class ArchivedFile {
31  private $id;
32 
34  private $name;
35 
37  private $group;
38 
40  private $key;
41 
43  private $size;
44 
46  private $bits;
47 
49  private $width;
50 
52  private $height;
53 
55  private $metadata;
56 
58  private $mime;
59 
61  private $media_type;
62 
64  private $description;
65 
67  private $user;
68 
70  private $user_text;
71 
73  private $timestamp;
74 
76  private $dataLoaded;
77 
79  private $deleted;
80 
82  private $sha1;
83 
87  private $pageCount;
88 
90  private $archive_name;
91 
93  protected $handler;
94 
96  protected $title; # image title
97 
105  function __construct( $title, $id = 0, $key = '', $sha1 = '' ) {
106  $this->id = -1;
107  $this->title = false;
108  $this->name = false;
109  $this->group = 'deleted'; // needed for direct use of constructor
110  $this->key = '';
111  $this->size = 0;
112  $this->bits = 0;
113  $this->width = 0;
114  $this->height = 0;
115  $this->metadata = '';
116  $this->mime = "unknown/unknown";
117  $this->media_type = '';
118  $this->description = '';
119  $this->user = 0;
120  $this->user_text = '';
121  $this->timestamp = null;
122  $this->deleted = 0;
123  $this->dataLoaded = false;
124  $this->exists = false;
125  $this->sha1 = '';
126 
127  if ( $title instanceof Title ) {
128  $this->title = File::normalizeTitle( $title, 'exception' );
129  $this->name = $title->getDBkey();
130  }
131 
132  if ( $id ) {
133  $this->id = $id;
134  }
135 
136  if ( $key ) {
137  $this->key = $key;
138  }
139 
140  if ( $sha1 ) {
141  $this->sha1 = $sha1;
142  }
143 
144  if ( !$id && !$key && !( $title instanceof Title ) && !$sha1 ) {
145  throw new MWException( "No specifications provided to ArchivedFile constructor." );
146  }
147  }
148 
154  public function load() {
155  if ( $this->dataLoaded ) {
156  return true;
157  }
158  $conds = [];
159 
160  if ( $this->id > 0 ) {
161  $conds['fa_id'] = $this->id;
162  }
163  if ( $this->key ) {
164  $conds['fa_storage_group'] = $this->group;
165  $conds['fa_storage_key'] = $this->key;
166  }
167  if ( $this->title ) {
168  $conds['fa_name'] = $this->title->getDBkey();
169  }
170  if ( $this->sha1 ) {
171  $conds['fa_sha1'] = $this->sha1;
172  }
173 
174  if ( !count( $conds ) ) {
175  throw new MWException( "No specific information for retrieving archived file" );
176  }
177 
178  if ( !$this->title || $this->title->getNamespace() == NS_FILE ) {
179  $this->dataLoaded = true; // set it here, to have also true on miss
180  $dbr = wfGetDB( DB_SLAVE );
181  $row = $dbr->selectRow(
182  'filearchive',
183  self::selectFields(),
184  $conds,
185  __METHOD__,
186  [ 'ORDER BY' => 'fa_timestamp DESC' ]
187  );
188  if ( !$row ) {
189  // this revision does not exist?
190  return null;
191  }
192 
193  // initialize fields for filestore image object
194  $this->loadFromRow( $row );
195  } else {
196  throw new MWException( 'This title does not correspond to an image page.' );
197  }
198  $this->exists = true;
199 
200  return true;
201  }
202 
209  public static function newFromRow( $row ) {
210  $file = new ArchivedFile( Title::makeTitle( NS_FILE, $row->fa_name ) );
211  $file->loadFromRow( $row );
212 
213  return $file;
214  }
215 
220  static function selectFields() {
221  return [
222  'fa_id',
223  'fa_name',
224  'fa_archive_name',
225  'fa_storage_key',
226  'fa_storage_group',
227  'fa_size',
228  'fa_bits',
229  'fa_width',
230  'fa_height',
231  'fa_metadata',
232  'fa_media_type',
233  'fa_major_mime',
234  'fa_minor_mime',
235  'fa_description',
236  'fa_user',
237  'fa_user_text',
238  'fa_timestamp',
239  'fa_deleted',
240  'fa_deleted_timestamp', /* Used by LocalFileRestoreBatch */
241  'fa_sha1',
242  ];
243  }
244 
251  public function loadFromRow( $row ) {
252  $this->id = intval( $row->fa_id );
253  $this->name = $row->fa_name;
254  $this->archive_name = $row->fa_archive_name;
255  $this->group = $row->fa_storage_group;
256  $this->key = $row->fa_storage_key;
257  $this->size = $row->fa_size;
258  $this->bits = $row->fa_bits;
259  $this->width = $row->fa_width;
260  $this->height = $row->fa_height;
261  $this->metadata = $row->fa_metadata;
262  $this->mime = "$row->fa_major_mime/$row->fa_minor_mime";
263  $this->media_type = $row->fa_media_type;
264  $this->description = $row->fa_description;
265  $this->user = $row->fa_user;
266  $this->user_text = $row->fa_user_text;
267  $this->timestamp = $row->fa_timestamp;
268  $this->deleted = $row->fa_deleted;
269  if ( isset( $row->fa_sha1 ) ) {
270  $this->sha1 = $row->fa_sha1;
271  } else {
272  // old row, populate from key
273  $this->sha1 = LocalRepo::getHashFromKey( $this->key );
274  }
275  if ( !$this->title ) {
276  $this->title = Title::makeTitleSafe( NS_FILE, $row->fa_name );
277  }
278  }
279 
285  public function getTitle() {
286  if ( !$this->title ) {
287  $this->load();
288  }
289  return $this->title;
290  }
291 
297  public function getName() {
298  if ( $this->name === false ) {
299  $this->load();
300  }
301 
302  return $this->name;
303  }
304 
308  public function getID() {
309  $this->load();
310 
311  return $this->id;
312  }
313 
317  public function exists() {
318  $this->load();
319 
320  return $this->exists;
321  }
322 
327  public function getKey() {
328  $this->load();
329 
330  return $this->key;
331  }
332 
337  public function getStorageKey() {
338  return $this->getKey();
339  }
340 
345  public function getGroup() {
346  return $this->group;
347  }
348 
353  public function getWidth() {
354  $this->load();
355 
356  return $this->width;
357  }
358 
363  public function getHeight() {
364  $this->load();
365 
366  return $this->height;
367  }
368 
373  public function getMetadata() {
374  $this->load();
375 
376  return $this->metadata;
377  }
378 
383  public function getSize() {
384  $this->load();
385 
386  return $this->size;
387  }
388 
393  public function getBits() {
394  $this->load();
395 
396  return $this->bits;
397  }
398 
403  public function getMimeType() {
404  $this->load();
405 
406  return $this->mime;
407  }
408 
413  function getHandler() {
414  if ( !isset( $this->handler ) ) {
415  $this->handler = MediaHandler::getHandler( $this->getMimeType() );
416  }
417 
418  return $this->handler;
419  }
420 
426  function pageCount() {
427  if ( !isset( $this->pageCount ) ) {
428  if ( $this->getHandler() && $this->handler->isMultiPage( $this ) ) {
429  $this->pageCount = $this->handler->pageCount( $this );
430  } else {
431  $this->pageCount = false;
432  }
433  }
434 
435  return $this->pageCount;
436  }
437 
443  public function getMediaType() {
444  $this->load();
445 
446  return $this->media_type;
447  }
448 
454  public function getTimestamp() {
455  $this->load();
456 
457  return wfTimestamp( TS_MW, $this->timestamp );
458  }
459 
466  function getSha1() {
467  $this->load();
468 
469  return $this->sha1;
470  }
471 
482  public function getUser( $type = 'text' ) {
483  $this->load();
484 
485  if ( $type == 'text' ) {
486  return $this->user_text;
487  } elseif ( $type == 'id' ) {
488  return (int)$this->user;
489  }
490 
491  throw new MWException( "Unknown type '$type'." );
492  }
493 
500  public function getUserText() {
501  wfDeprecated( __METHOD__, '1.23' );
502  $this->load();
503  if ( $this->isDeleted( File::DELETED_USER ) ) {
504  return 0;
505  } else {
506  return $this->user_text;
507  }
508  }
509 
515  public function getDescription() {
516  $this->load();
517  if ( $this->isDeleted( File::DELETED_COMMENT ) ) {
518  return 0;
519  } else {
520  return $this->description;
521  }
522  }
523 
529  public function getRawUser() {
530  $this->load();
531 
532  return $this->user;
533  }
534 
540  public function getRawUserText() {
541  $this->load();
542 
543  return $this->user_text;
544  }
545 
551  public function getRawDescription() {
552  $this->load();
553 
554  return $this->description;
555  }
556 
561  public function getVisibility() {
562  $this->load();
563 
564  return $this->deleted;
565  }
566 
573  public function isDeleted( $field ) {
574  $this->load();
575 
576  return ( $this->deleted & $field ) == $field;
577  }
578 
586  public function userCan( $field, User $user = null ) {
587  $this->load();
588 
589  $title = $this->getTitle();
590  return Revision::userCanBitfield( $this->deleted, $field, $user, $title ?: null );
591  }
592 }
int $user
User ID of uploader.
MediaHandler $handler
getDescription()
Return upload description.
string $media_type
Media type.
static normalizeTitle($title, $exception=false)
Given a string or Title object return either a valid Title object with namespace NS_FILE or null...
Definition: File.php:183
wfGetDB($db, $groups=[], $wiki=false)
Get a Database object.
const DELETED_COMMENT
Definition: File.php:53
getRawUser()
Return the user ID of the uploader.
int $deleted
Bitfield akin to rev_deleted.
loadFromRow($row)
Load ArchivedFile object fields from a DB row.
width
getRawUserText()
Return the user name of the uploader.
int $bits
Size in bytes.
getStorageKey()
Return the FileStore key (overriding base File class)
bool $dataLoaded
Whether or not all this has been loaded from the database (loadFromXxx)
string $group
FileStore storage group.
getSha1()
Get the SHA-1 base 36 hash of the file.
getUserText()
Return the user name of the uploader.
getHeight()
Return the height of the image.
Represents a title within MediaWiki.
Definition: Title.php:34
getMetadata()
Get handler-specific metadata.
getHandler()
Get a MediaHandler instance for this file.
string $timestamp
Time of upload.
getName()
Return the file name.
getGroup()
Return the FileStore storage group.
string $description
Upload description.
getWidth()
Return the width of the image.
pageCount()
Returns the number of pages of a multipage document, or false for documents which aren't multipage do...
wfTimestamp($outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
string $mime
MIME type.
Class representing a row of the 'filearchive' table.
getTitle()
Return the associated title object.
design txt This is a brief overview of the new design More thorough and up to date information is available on the documentation wiki at etc Handles the details of getting and saving to the user table of the and dealing with sessions and cookies OutputPage Encapsulates the entire HTML page that will be sent in response to any server request It is used by calling its functions to add in any and then calling but I prefer the flexibility This should also do the output encoding The system allocates a global one in $wgOut Title Represents the title of an and does all the work of translating among various forms such as plain database key
Definition: design.txt:25
getSize()
Return the size of the image file, in bytes.
getDBkey()
Get the main part with underscores.
Definition: Title.php:911
static selectFields()
Fields in the filearchive table.
__construct($title, $id=0, $key= '', $sha1= '')
string $user_text
User name of uploader.
getMediaType()
Return the type of the media in the file.
This document is intended to provide useful advice for parties seeking to redistribute MediaWiki to end users It s targeted particularly at maintainers for Linux since it s been observed that distribution packages of MediaWiki often break We ve consistently had to recommend that users seeking support use official tarballs instead of their distribution s and this often solves whatever problem the user is having It would be nice if this could such and we might be restricted by PHP settings such as safe mode or open_basedir We cannot assume that the software even has read access anywhere useful Many shared hosts run all users web applications under the same user
Wikitext formatted, in the key only.
Definition: distributors.txt:9
wfDeprecated($function, $version=false, $component=false, $callerOffset=2)
Throws a warning that $function is deprecated.
static makeTitleSafe($ns, $title, $fragment= '', $interwiki= '')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:548
title
const DB_SLAVE
Definition: Defines.php:46
const NS_FILE
Definition: Defines.php:75
string $sha1
SHA-1 hash of file content.
getKey()
Return the FileStore key.
static newFromRow($row)
Loads a file object from the filearchive table.
int $size
File size in bytes.
int $width
Width.
string $metadata
Metadata string.
const DELETED_USER
Definition: File.php:54
this hook is for auditing only or null if authentication failed before getting that far or null if we can t even determine that probably a stub it is not rendered in wiki pages or galleries in category pages allow injecting custom HTML after the section Any uses of the hook need to handle escaping see BaseTemplate::getToolbox and BaseTemplate::makeListItem for details on the format of individual items inside of this array or by returning and letting standard HTTP rendering take place modifiable or by returning false and taking over the output modifiable modifiable after all normalizations have been except for the $wgMaxImageArea check set to true or false to override the $wgMaxImageArea check result gives extension the possibility to transform it themselves set to a MediaTransformOutput the error message to be returned in an array you should do so by altering $wgNamespaceProtection and $wgNamespaceContentModels outside the handler
Definition: hooks.txt:762
const TS_MW
MediaWiki concatenated string timestamp (YYYYMMDDHHMMSS)
string $key
FileStore SHA-1 key.
injection txt This is an overview of how MediaWiki makes use of dependency injection The design described here grew from the discussion of RFC T384 The term dependency this means that anything an object needs to operate should be injected from the the object itself should only know narrow no concrete implementation of the logic it relies on The requirement to inject everything typically results in an architecture that based on two main types of and essentially stateless service objects that use other service objects to operate on the value objects As of the beginning MediaWiki is only starting to use the DI approach Much of the code still relies on global state or direct resulting in a highly cyclical dependency which acts as the top level factory for services in MediaWiki which can be used to gain access to default instances of various services MediaWikiServices however also allows new services to be defined and default services to be redefined Services are defined or redefined by providing a callback the instantiator that will return a new instance of the service When it will create an instance of MediaWikiServices and populate it with the services defined in the files listed by thereby bootstrapping the DI framework Per $wgServiceWiringFiles lists includes ServiceWiring php
Definition: injection.txt:35
static getHashFromKey($key)
Gets the SHA1 hash from a storage key.
Definition: LocalRepo.php:181
string $archive_name
Original base filename.
design txt This is a brief overview of the new design More thorough and up to date information is available on the documentation wiki at name
Definition: design.txt:12
int $height
Height.
static getHandler($type)
Get a MediaHandler for a given MIME type from the instance cache.
string $name
File name.
static userCanBitfield($bitfield, $field, User $user=null, Title $title=null)
Determine if the current user is allowed to view a particular field of this revision, if it's marked as deleted.
Definition: Revision.php:1710
isDeleted($field)
for file or revision rows
int $id
Filearchive row ID.
string $pageCount
Number of pages of a multipage document, or false for documents which aren't multipage documents...
load()
Loads a file object from the filearchive table.
getRawDescription()
Return upload description.
getUser($type= 'text')
Returns ID or name of user who uploaded the file.
do that in ParserLimitReportFormat instead use this to modify the parameters of the image and a DIV can begin in one section and end in another Make sure your code can handle that case gracefully See the EditSectionClearerLink extension for an example zero but section is usually empty its values are the globals values before the output is cached one of or reset my talk my contributions etc etc otherwise the built in rate limiting checks are if enabled allows for interception of redirect as a string mapping parameter names to values & $type
Definition: hooks.txt:2338
getTimestamp()
Return upload timestamp.
static & makeTitle($ns, $title, $fragment= '', $interwiki= '')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:524
userCan($field, User $user=null)
Determine if the current user is allowed to view a particular field of this FileStore image file...
getMimeType()
Returns the MIME type of the file.
getBits()
Return the bits of the image file, in bytes.
getVisibility()
Returns the deletion bitfield.