Dan-nl has uploaded a new change for review.
https://gerrit.wikimedia.org/r/96510
Change subject: input-field-size
......................................................................
input-field-size
aaron schulz requested that we validate input sizes for sanity. i also added a
method to
XmlDetectHandler.php that will display field labels for mediawiki template
parameters
without the - or _ and without gwtoolset- for script added gwtoolset fields.
Change-Id: If02a21bbb2c35210c778b40d6fe1084debcacb3b
---
M GWToolset.i18n.php
M includes/Handlers/Forms/MetadataDetectHandler.php
M includes/Handlers/Forms/MetadataMappingHandler.php
M includes/Handlers/Xml/XmlDetectHandler.php
M includes/functions/functions.php
5 files changed, 93 insertions(+), 43 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/GWToolset
refs/changes/10/96510/1
diff --git a/GWToolset.i18n.php b/GWToolset.i18n.php
index 2baae58..3cbca02 100644
--- a/GWToolset.i18n.php
+++ b/GWToolset.i18n.php
@@ -43,6 +43,7 @@
'gwtoolset-no-accepted-types' => 'No accepted types provided',
'gwtoolset-no-callback' => 'No callback passed to this method.',
'gwtoolset-no-comment' => "<code>user_options['comment']</code> not
set.",
+ 'gwtoolset-no-field-size' => 'No field size was specified for the field
($1).',
'gwtoolset-no-file-backend-name' => 'No file backend name provided.',
'gwtoolset-no-file-backend-container' => 'No file backend container
name provided.',
'gwtoolset-no-file-url' => 'No <code>file_url</code> provided to
parse.',
@@ -349,6 +350,7 @@
'gwtoolset-no-callback' => 'Hint to the developer that appears when no
callback is given.',
'gwtoolset-no-change' => 'Appears when there has been no change to a
wiki page.',
'gwtoolset-no-comment' => "Hint to the developer that appears when
user_options['comment'] is not set.",
+ 'gwtoolset-no-field-size' => 'Developer message that appears when no
field size was specified for the field ($1).',
'gwtoolset-no-file' => 'User error message that appears when no file
was received by the upload form. Parameter $1, when provided is a hint to the
developer as to where the problem occured in the application.',
'gwtoolset-no-file-backend-name' => 'Message that appears when a web
admin does not provide a file backend name.',
'gwtoolset-no-file-backend-container' => 'Message that appears wher no
file backend container name was provided.',
diff --git a/includes/Handlers/Forms/MetadataDetectHandler.php
b/includes/Handlers/Forms/MetadataDetectHandler.php
index b347782..8779913 100644
--- a/includes/Handlers/Forms/MetadataDetectHandler.php
+++ b/includes/Handlers/Forms/MetadataDetectHandler.php
@@ -27,13 +27,13 @@
* @var {array}
*/
protected $_expected_post_fields = array(
- 'gwtoolset-form',
- 'MAX_FILE_SIZE',
- 'gwtoolset-mediawiki-template-name',
- 'gwtoolset-metadata-file-upload',
- 'gwtoolset-metadata-mapping-url',
- 'gwtoolset-record-element-name',
- 'wpEditToken'
+ array( 'gwtoolset-form' => array( 'size' => 255 ) ),
+ array( 'MAX_FILE_SIZE' => array( 'size' => 255 ) ),
+ array( 'gwtoolset-mediawiki-template-name' => array( 'size' =>
255 ) ),
+ array( 'gwtoolset-metadata-file-upload' => array( 'size' => 255
) ),
+ array( 'gwtoolset-metadata-mapping-url' => array( 'size' => 255
) ),
+ array( 'gwtoolset-record-element-name' => array( 'size' => 255
) ),
+ array( 'wpEditToken' => array( 'size' => 255 ) )
);
/**
diff --git a/includes/Handlers/Forms/MetadataMappingHandler.php
b/includes/Handlers/Forms/MetadataMappingHandler.php
index 91c545a..4d05d46 100644
--- a/includes/Handlers/Forms/MetadataMappingHandler.php
+++ b/includes/Handlers/Forms/MetadataMappingHandler.php
@@ -38,25 +38,25 @@
* @var {array}
*/
protected $_expected_post_fields = array(
- 'gwtoolset-category',
- 'gwtoolset-category-phrase',
- 'gwtoolset-category-metadata',
- 'gwtoolset-form',
- 'gwtoolset-preview',
- 'gwtoolset-mediawiki-template-name',
- 'gwtoolset-metadata-file-mwstore',
- 'gwtoolset-metadata-file-sha1',
- 'gwtoolset-metadata-file-url',
- 'gwtoolset-metadata-mapping-name',
- 'gwtoolset-metadata-mapping-subpage',
- 'gwtoolset-metadata-mapping-url',
- 'gwtoolset-metadata-namespace',
- 'gwtoolset-partner-template-url',
- 'gwtoolset-record-begin',
- 'gwtoolset-record-count',
- 'gwtoolset-record-element-name',
- 'wpEditToken',
- 'wpSummary'
+ array( 'gwtoolset-category' => array( 'size' => 255 ) ),
+ array( 'gwtoolset-category-phrase' => array( 'size' => 255 ) ),
+ array( 'gwtoolset-category-metadata' => array( 'size' => 255 )
),
+ array( 'gwtoolset-form' => array( 'size' => 255 ) ),
+ array( 'gwtoolset-preview' => array( 'size' => 255 ) ),
+ array( 'gwtoolset-mediawiki-template-name' => array( 'size' =>
255 ) ),
+ array( 'gwtoolset-metadata-file-mwstore' => array( 'size' =>
255 ) ),
+ array( 'gwtoolset-metadata-file-sha1' => array( 'size' => 255 )
),
+ array( 'gwtoolset-metadata-file-url' => array( 'size' => 255 )
),
+ array( 'gwtoolset-metadata-mapping-name' => array( 'size' =>
255 ) ),
+ array( 'gwtoolset-metadata-mapping-subpage' => array( 'size' =>
255 ) ),
+ array( 'gwtoolset-metadata-mapping-url' => array( 'size' => 255
) ),
+ array( 'gwtoolset-metadata-namespace' => array( 'size' => 255 )
),
+ array( 'gwtoolset-partner-template-url' => array( 'size' => 255
) ),
+ array( 'gwtoolset-record-begin' => array( 'size' => 255 ) ),
+ array( 'gwtoolset-record-count' => array( 'size' => 255 ) ),
+ array( 'gwtoolset-record-element-name' => array( 'size' => 255
) ),
+ array( 'wpEditToken' => array( 'size' => 255 ) ),
+ array( 'wpSummary' => array( 'size' => 255 ) )
);
/**
@@ -473,7 +473,12 @@
$this->_MediawikiTemplate->getMediaWikiTemplate(
$_POST['gwtoolset-mediawiki-template-name'] );
foreach ( $this->_MediawikiTemplate->mediawiki_template_array
as $key => $value ) {
- $this->_expected_post_fields[] = Filter::evaluate( $key
);
+ // MediaWiki template parameters sometimes contain
spaces
+ $key = \GWToolset\normalizeSpace( $key );
+
+ $this->_expected_post_fields[] = array(
+ Filter::evaluate( $key ) => array( 'size' =>
255 )
+ );
}
$this->_whitelisted_post = \GWToolset\getWhitelistedPost(
$this->_expected_post_fields );
diff --git a/includes/Handlers/Xml/XmlDetectHandler.php
b/includes/Handlers/Xml/XmlDetectHandler.php
index 783175a..f82886b 100644
--- a/includes/Handlers/Xml/XmlDetectHandler.php
+++ b/includes/Handlers/Xml/XmlDetectHandler.php
@@ -193,7 +193,7 @@
return sprintf(
$template,
Filter::evaluate( $parameter_as_id ),
- Filter::evaluate( $parameter ),
+ $this->getFormLabel( $parameter ),
$required,
Filter::evaluate( $parameter ),
Filter::evaluate( $parameter_as_id ),
@@ -224,7 +224,7 @@
return sprintf(
$template,
Filter::evaluate( $parameter_as_id ),
- Filter::evaluate( $parameter ),
+ $this->getFormLabel( $parameter ),
$required,
Filter::evaluate( $parameter ),
Filter::evaluate( $parameter_as_id ),
@@ -256,6 +256,25 @@
}
/**
+ * normalizes form field names so that - _ and gwtoolset are removed
from the form label
+ *
+ * @param {string}
+ *
+ * @return {string}
+ * the string has been sanitized
+ */
+ protected function getFormLabel( $parameter ) {
+ $result = Filter::evaluate( $parameter );
+ $result = str_replace(
+ array( '_', '-', 'gwtoolset' ),
+ array( ' ', ' ', '' ),
+ $result
+ );
+
+ return $result;
+ }
+
+ /**
* a decorator method that creates table rows based on the example
* DOMElement, $this->_metadata_example_dom_element. the table rows
* are extracted metadata elements and their values
diff --git a/includes/functions/functions.php b/includes/functions/functions.php
index c7786b5..12a7fb4 100644
--- a/includes/functions/functions.php
+++ b/includes/functions/functions.php
@@ -109,6 +109,7 @@
if ( empty( $page_title ) ) {
throw new MWException(
+ __METHOD__ . ': ' .
wfMessage( 'gwtoolset-developer-issue' )
->params( wfMessage( 'gwtoolset-no-page-title'
)->escaped() )
->parse()
@@ -156,10 +157,15 @@
/**
* cycles over the $_POST and returns a “whitelisted-post” that:
* - contains only the posted fields expected
- * - sanitizes those fields
- * - if the field is an array, field[], only goes into it one level
+ * - if the field is an array, only one level is applied
+ * - sanitizes those fields with
+ * - FILTER_SANITIZE_STRING
+ * @see http://php.net/manual/en/filter.filters.sanitize.php
+ * - shorterns strings > $metadata['size'], the max size expected of a field
value
*
* @param {array} $expected_post_fields
+ *
+ * @throws {MWException}
*
* @return {array}
* the values within the array have been sanitized
@@ -167,21 +173,39 @@
function getWhitelistedPost( array $expected_post_fields = array() ) {
$result = array();
- foreach ( $expected_post_fields as $field ) {
- $field = normalizeSpace( $field );
+ foreach ( $expected_post_fields as $metadata ) {
+ $field = key( $metadata );
- if ( isset( $_POST[$field] ) ) {
- if ( is_array( $_POST[$field] ) ) {
- $result[$field] = array();
- foreach ( $_POST[$field] as $subfield )
{
- // avoid field[][]
- if ( !is_array( $subfield ) ) {
- $result[$field][] =
Filter::evaluate( $subfield );
- }
+ if ( !isset( $_POST[$field] ) ) {
+ continue;
+ }
+
+ if ( !isset( $metadata[$field]['size'] ) ) {
+ throw new MWException(
+ __METHOD__ . ': ' .
+ wfMessage( 'gwtoolset-developer-issue' )
+ ->params(
+ wfMessage(
'gwtoolset-no-field-size' )
+ ->params(
$field )
+ ->escaped()
+ )
+ ->parse()
+ );
+ }
+
+ if ( is_array( $_POST[$field] ) ) {
+ $result[$field] = array();
+
+ foreach ( $_POST[$field] as $value ) {
+ // avoid field[][]
+ if ( !is_array( $value ) ) {
+ $value = substr( $value, 0,
$metadata[$field]['size'] );
+ $result[$field][] =
Filter::evaluate( $value );
}
- } else {
- $result[$field] = Filter::evaluate(
$_POST[$field] );
}
+ } else {
+ $value = substr( $_POST[$field], 0,
$metadata[$field]['size'] );
+ $result[$field] = Filter::evaluate( $value );
}
}
--
To view, visit https://gerrit.wikimedia.org/r/96510
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: If02a21bbb2c35210c778b40d6fe1084debcacb3b
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/GWToolset
Gerrit-Branch: master
Gerrit-Owner: Dan-nl <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits