MediaWiki  master
ImportableUploadRevisionImporter.php
Go to the documentation of this file.
1 <?php
2 
5 
10 
14  private $logger;
15 
19  private $enableUploads;
20 
24  private $shouldCreateNullRevision = true;
25 
30  public function __construct(
32  LoggerInterface $logger
33  ) {
34  $this->enableUploads = $enableUploads;
35  $this->logger = $logger;
36  }
37 
45  $this->shouldCreateNullRevision = $shouldCreateNullRevision;
46  }
47 
51  private function newNotOkStatus() {
52  $statusValue = new StatusValue();
53  $statusValue->setOK( false );
54  return $statusValue;
55  }
56 
57  public function import( ImportableUploadRevision $importableRevision ) {
58  # Construct a file
59  $archiveName = $importableRevision->getArchiveName();
60  if ( $archiveName ) {
61  $this->logger->debug( __METHOD__ . "Importing archived file as $archiveName\n" );
62  $file = OldLocalFile::newFromArchiveName( $importableRevision->getTitle(),
63  RepoGroup::singleton()->getLocalRepo(), $archiveName );
64  } else {
65  $file = MediaWikiServices::getInstance()->getRepoGroup()->getLocalRepo()
66  ->newFile( $importableRevision->getTitle() );
67  $file->load( File::READ_LATEST );
68  $this->logger->debug( __METHOD__ . 'Importing new file as ' . $file->getName() . "\n" );
69  if ( $file->exists() && $file->getTimestamp() > $importableRevision->getTimestamp() ) {
70  $archiveName = $importableRevision->getTimestamp() . '!' . $file->getName();
71  $file = OldLocalFile::newFromArchiveName( $importableRevision->getTitle(),
72  RepoGroup::singleton()->getLocalRepo(), $archiveName );
73  $this->logger->debug( __METHOD__ . "File already exists; importing as $archiveName\n" );
74  }
75  }
76  if ( !$file ) {
77  $this->logger->debug( __METHOD__ . ': Bad file for ' . $importableRevision->getTitle() . "\n" );
78  return $this->newNotOkStatus();
79  }
80 
81  # Get the file source or download if necessary
82  $source = $importableRevision->getFileSrc();
83  $autoDeleteSource = $importableRevision->isTempSrc();
84  if ( !strlen( $source ) ) {
85  $source = $this->downloadSource( $importableRevision );
86  $autoDeleteSource = true;
87  }
88  if ( !strlen( $source ) ) {
89  $this->logger->debug( __METHOD__ . ": Could not fetch remote file.\n" );
90  return $this->newNotOkStatus();
91  }
92 
93  $tmpFile = new TempFSFile( $source );
94  if ( $autoDeleteSource ) {
95  $tmpFile->autocollect();
96  }
97 
98  $sha1File = ltrim( sha1_file( $source ), '0' );
99  $sha1 = $importableRevision->getSha1();
100  if ( $sha1 && ( $sha1 !== $sha1File ) ) {
101  $this->logger->debug( __METHOD__ . ": Corrupt file $source.\n" );
102  return $this->newNotOkStatus();
103  }
104 
105  $user = $importableRevision->getUserObj()
106  ?: User::newFromName( $importableRevision->getUser(), false );
107 
108  # Do the actual upload
109  if ( $file instanceof OldLocalFile ) {
110  $status = $file->uploadOld(
111  $source,
112  $importableRevision->getTimestamp(),
113  $importableRevision->getComment(),
114  $user
115  );
116  } else {
117  $flags = 0;
118  $status = $file->upload(
119  $source,
120  $importableRevision->getComment(),
121  $importableRevision->getComment(),
122  $flags,
123  false,
124  $importableRevision->getTimestamp(),
125  $user,
126  [],
128  );
129  }
130 
131  if ( $status->isGood() ) {
132  $this->logger->debug( __METHOD__ . ": Successful\n" );
133  } else {
134  $this->logger->debug( __METHOD__ . ': failed: ' . $status->getHTML() . "\n" );
135  }
136 
137  return $status;
138  }
139 
150  public function downloadSource( ImportableUploadRevision $wikiRevision ) {
151  if ( !$this->enableUploads ) {
152  return false;
153  }
154 
155  $tempo = tempnam( wfTempDir(), 'download' );
156  $f = fopen( $tempo, 'wb' );
157  if ( !$f ) {
158  $this->logger->debug( "IMPORT: couldn't write to temp file $tempo\n" );
159  return false;
160  }
161 
162  // @todo FIXME!
163  $src = $wikiRevision->getSrc();
164  $data = MediaWikiServices::getInstance()->getHttpRequestFactory()->
165  get( $src, [], __METHOD__ );
166  if ( !$data ) {
167  $this->logger->debug( "IMPORT: couldn't fetch source $src\n" );
168  fclose( $f );
169  unlink( $tempo );
170  return false;
171  }
172 
173  fwrite( $f, $data );
174  fclose( $f );
175 
176  return $tempo;
177  }
178 
179 }
downloadSource(ImportableUploadRevision $wikiRevision)
if(PHP_SAPI !='cli-server') if(!isset( $_SERVER['SCRIPT_FILENAME'])) $file
Item class for a filearchive table row.
Definition: router.php:42
static newFromArchiveName( $title, $repo, $archiveName)
$source
Class to represent a file in the oldimage table.
setNullRevisionCreation( $shouldCreateNullRevision)
Setting this to false will deactivate the creation of a null revision as part of the upload process l...
wfTempDir()
Tries to get the system directory for temporary files.
static singleton()
Definition: RepoGroup.php:60
__construct( $enableUploads, LoggerInterface $logger)
static newFromName( $name, $validate='valid')
Static factory method for creation from username.
Definition: User.php:519