Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F1428064
UploadDef.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
UploadDef.php
View Options
<?php
namespace
Wikimedia\ParamValidator\TypeDef
;
use
InvalidArgumentException
;
use
Psr\Http\Message\UploadedFileInterface
;
use
UnexpectedValueException
;
use
Wikimedia\Message\MessageValue
;
use
Wikimedia\ParamValidator\ParamValidator
;
use
Wikimedia\ParamValidator\TypeDef
;
use
Wikimedia\ParamValidator\Util\UploadedFile
;
/**
* Type definition for upload types
*
* The result from validate() is an object implementing UploadedFileInterface.
*
* Failure codes:
* - 'badupload': The upload is not valid. Data:
* - 'code': A value indicating why the upload was not valid:
* - 'inisize': The upload exceeded the maximum in php.ini.
* - 'formsize': The upload exceeded the maximum in the form post.
* - 'partial': The file was only partially uploaded.
* - 'nofile': There was no file.
* - 'notmpdir': PHP has no temporary directory to store the upload.
* - 'cantwrite': PHP could not store the upload.
* - 'phpext': A PHP extension rejected the upload.
* - 'notupload': The field was present in the submission but was not encoded as an upload.
* - 'size': The configured size (in bytes), if 'code' is 'inisize'.
*
* @since 1.34
* @unstable
*/
class
UploadDef
extends
TypeDef
{
public
function
getValue
(
$name
,
array
$settings
,
array
$options
)
{
$ret
=
$this
->
callbacks
->
getUploadedFile
(
$name
,
$options
);
if
(
$ret
&&
$ret
->
getError
()
===
UPLOAD_ERR_NO_FILE
&&
!
$this
->
callbacks
->
hasParam
(
$name
,
$options
)
)
{
// This seems to be that the client explicitly specified "no file" for the field
// instead of just omitting the field completely. DWTM.
$ret
=
null
;
}
elseif
(
!
$ret
&&
$this
->
callbacks
->
hasParam
(
$name
,
$options
)
)
{
// The client didn't format their upload properly so it came in as an ordinary
// field. Convert it to an error.
$ret
=
new
UploadedFile
(
[
'name'
=>
''
,
'type'
=>
''
,
'tmp_name'
=>
''
,
'error'
=>
-
42
,
// PHP's UPLOAD_ERR_* are all positive numbers.
'size'
=>
0
,
]
);
}
return
$ret
;
}
/**
* Fetch the value of PHP's upload_max_filesize ini setting
*
* This method exists so it can be mocked by unit tests that can't
* affect ini_get() directly.
*
* @codeCoverageIgnore
* @return string|false
*/
protected
function
getIniSize
()
{
return
ini_get
(
'upload_max_filesize'
);
}
public
function
validate
(
$name
,
$value
,
array
$settings
,
array
$options
)
{
static
$codemap
=
[
-
42
=>
'notupload'
,
// Local from getValue()
UPLOAD_ERR_FORM_SIZE
=>
'formsize'
,
UPLOAD_ERR_PARTIAL
=>
'partial'
,
UPLOAD_ERR_NO_FILE
=>
'nofile'
,
UPLOAD_ERR_NO_TMP_DIR
=>
'notmpdir'
,
UPLOAD_ERR_CANT_WRITE
=>
'cantwrite'
,
UPLOAD_ERR_EXTENSION
=>
'phpext'
,
];
if
(
!
$value
instanceof
UploadedFileInterface
)
{
// Err?
$type
=
get_debug_type
(
$value
);
throw
new
InvalidArgumentException
(
"
\$
value must be UploadedFileInterface, got $type"
);
}
$err
=
$value
->
getError
();
if
(
$err
===
UPLOAD_ERR_OK
)
{
return
$value
;
}
elseif
(
$err
===
UPLOAD_ERR_INI_SIZE
)
{
static
$prefixes
=
[
'g'
=>
1024
**
3
,
'm'
=>
1024
**
2
,
'k'
=>
1024
**
1
,
];
$size
=
$this
->
getIniSize
();
$last
=
strtolower
(
substr
(
$size
,
-
1
)
);
$size
=
intval
(
$size
,
10
)
*
(
$prefixes
[
$last
]
??
1
);
$this
->
failure
(
$this
->
failureMessage
(
'badupload'
,
[
'code'
=>
'inisize'
,
'size'
=>
$size
,
],
'inisize'
)->
sizeParams
(
$size
),
$name
,
''
,
$settings
,
$options
);
}
elseif
(
isset
(
$codemap
[
$err
]
)
)
{
$this
->
failure
(
$this
->
failureMessage
(
'badupload'
,
[
'code'
=>
$codemap
[
$err
]
],
$codemap
[
$err
]
),
$name
,
''
,
$settings
,
$options
);
}
else
{
$constant
=
''
;
foreach
(
get_defined_constants
()
as
$c
=>
$v
)
{
// @phan-suppress-next-line PhanTypeComparisonFromArray
if
(
$v
===
$err
&&
str_starts_with
(
$c
,
'UPLOAD_ERR_'
)
)
{
$constant
=
" ($c?)"
;
}
}
throw
new
UnexpectedValueException
(
"Unrecognized PHP upload error value $err$constant"
);
}
}
public
function
checkSettings
(
string
$name
,
$settings
,
array
$options
,
array
$ret
):
array
{
$ret
=
parent
::
checkSettings
(
$name
,
$settings
,
$options
,
$ret
);
if
(
isset
(
$settings
[
ParamValidator
::
PARAM_DEFAULT
]
)
)
{
$ret
[
'issues'
][
ParamValidator
::
PARAM_DEFAULT
]
=
'Cannot specify a default for upload-type parameters'
;
}
if
(
!
empty
(
$settings
[
ParamValidator
::
PARAM_ISMULTI
]
)
&&
!
isset
(
$ret
[
'issues'
][
ParamValidator
::
PARAM_ISMULTI
]
)
)
{
$ret
[
'issues'
][
ParamValidator
::
PARAM_ISMULTI
]
=
'PARAM_ISMULTI cannot be used for upload-type parameters'
;
}
return
$ret
;
}
public
function
stringifyValue
(
$name
,
$value
,
array
$settings
,
array
$options
)
{
// Not going to happen.
return
null
;
}
public
function
getHelpInfo
(
$name
,
array
$settings
,
array
$options
)
{
$info
=
parent
::
getHelpInfo
(
$name
,
$settings
,
$options
);
$info
[
ParamValidator
::
PARAM_TYPE
]
=
MessageValue
::
new
(
'paramvalidator-help-type-upload'
);
return
$info
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Sat, May 16, 15:34 (13 h, 55 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
34/e8/554593978d1db157c39d99183651
Default Alt Text
UploadDef.php (4 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment