MediaWiki
REL1_40
PublishStashedFileJob.php
Go to the documentation of this file.
1
<?php
21
use
MediaWiki\Title\Title
;
22
use Wikimedia\ScopedCallback;
23
30
class
PublishStashedFileJob
extends
Job
{
31
public
function
__construct
(
Title
$title
, array $params ) {
32
parent::__construct(
'PublishStashedFile'
,
$title
, $params );
33
$this->removeDuplicates =
true
;
34
}
35
36
public
function
run
() {
37
$scope = RequestContext::importScopedSession( $this->params[
'session'
] );
38
$this->
addTeardownCallback
(
static
function
() use ( &$scope ) {
39
ScopedCallback::consume( $scope );
// T126450
40
} );
41
42
$context = RequestContext::getMain();
43
$user = $context->getUser();
44
try
{
45
if
( !$user->isRegistered() ) {
46
$this->
setLastError
(
"Could not load the author user from session."
);
47
48
return
false
;
49
}
50
51
UploadBase::setSessionStatus(
52
$user,
53
$this->params[
'filekey'
],
54
[
'result'
=>
'Poll'
,
'stage'
=>
'publish'
,
'status'
=> Status::newGood() ]
55
);
56
57
$upload =
new
UploadFromStash
( $user );
58
// @todo initialize() causes a GET, ideally we could frontload the antivirus
59
// checks and anything else to the stash stage (which includes concatenation and
60
// the local file is thus already there). That way, instead of GET+PUT, there could
61
// just be a COPY operation from the stash to the public zone.
62
$upload->initialize( $this->params[
'filekey'
], $this->params[
'filename'
] );
63
64
// Check if the local file checks out (this is generally a no-op)
65
$verification = $upload->verifyUpload();
66
if
( $verification[
'status'
] !== UploadBase::OK ) {
67
$status = Status::newFatal(
'verification-error'
);
68
$status->value = [
'verification'
=> $verification ];
69
UploadBase::setSessionStatus(
70
$user,
71
$this->params[
'filekey'
],
72
[
'result'
=>
'Failure'
,
'stage'
=>
'publish'
,
'status'
=> $status ]
73
);
74
$this->
setLastError
(
"Could not verify upload."
);
75
76
return
false
;
77
}
78
79
// Upload the stashed file to a permanent location
80
$status = $upload->performUpload(
81
$this->params[
'comment'
],
82
$this->params[
'text'
],
83
$this->params[
'watch'
],
84
$user,
85
$this->params[
'tags'
] ?? [],
86
$this->params[
'watchlistexpiry'
] ??
null
87
);
88
if
( !$status->isGood() ) {
89
UploadBase::setSessionStatus(
90
$user,
91
$this->params[
'filekey'
],
92
[
'result'
=>
'Failure'
,
'stage'
=>
'publish'
,
'status'
=> $status ]
93
);
94
$this->
setLastError
( $status->getWikiText(
false
,
false
,
'en'
) );
95
96
return
false
;
97
}
98
99
// Build the image info array while we have the local reference handy
100
$apiMain =
new
ApiMain
();
// dummy object (XXX)
101
$imageInfo = $upload->getImageInfo( $apiMain->getResult() );
102
103
// Cleanup any temporary local file
104
$upload->cleanupTempFile();
105
106
// Cache the info so the user doesn't have to wait forever to get the final info
107
UploadBase::setSessionStatus(
108
$user,
109
$this->params[
'filekey'
],
110
[
111
'result'
=>
'Success'
,
112
'stage'
=>
'publish'
,
113
'filename'
=> $upload->getLocalFile()->getName(),
114
'imageinfo'
=> $imageInfo,
115
'status'
=> Status::newGood()
116
]
117
);
118
}
catch
( Exception $e ) {
119
UploadBase::setSessionStatus(
120
$user,
121
$this->params[
'filekey'
],
122
[
123
'result'
=>
'Failure'
,
124
'stage'
=>
'publish'
,
125
'status'
=> Status::newFatal(
'api-error-publishfailed'
)
126
]
127
);
128
$this->
setLastError
( get_class( $e ) .
": "
. $e->getMessage() );
129
// To prevent potential database referential integrity issues.
130
// See T34551.
131
MWExceptionHandler::rollbackPrimaryChangesAndLog( $e );
132
133
return
false
;
134
}
135
136
return
true
;
137
}
138
139
public
function
getDeduplicationInfo
() {
140
$info = parent::getDeduplicationInfo();
141
if
( is_array( $info[
'params'
] ) ) {
142
$info[
'params'
] = [
'filekey'
=> $info[
'params'
][
'filekey'
] ];
143
}
144
145
return
$info;
146
}
147
148
public
function
allowRetries
() {
149
return
false
;
150
}
151
}
ApiMain
This is the main API class, used for both external and internal processing.
Definition
ApiMain.php:58
Job
Class to both describe a background job and handle jobs.
Definition
Job.php:39
Job\setLastError
setLastError( $error)
Definition
Job.php:429
Job\addTeardownCallback
addTeardownCallback( $callback)
Definition
Job.php:355
MediaWiki\Title\Title
Represents a title within MediaWiki.
Definition
Title.php:82
PublishStashedFileJob
Upload a file from the upload stash into the local file repo.
Definition
PublishStashedFileJob.php:30
PublishStashedFileJob\allowRetries
allowRetries()
bool Whether this job can be retried on failure by job runners 1.21to override
Definition
PublishStashedFileJob.php:148
PublishStashedFileJob\getDeduplicationInfo
getDeduplicationInfo()
Subclasses may need to override this to make duplication detection work.
Definition
PublishStashedFileJob.php:139
PublishStashedFileJob\__construct
__construct(Title $title, array $params)
Definition
PublishStashedFileJob.php:31
PublishStashedFileJob\run
run()
Run the job.
Definition
PublishStashedFileJob.php:36
UploadFromStash
Implements uploading from previously stored file.
Definition
UploadFromStash.php:33
$title
$title
Definition
testCompression.php:39
includes
jobqueue
jobs
PublishStashedFileJob.php
Generated on Thu Jun 27 2024 14:03:00 for MediaWiki by
1.10.0