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