Aude has uploaded a new change for review.
https://gerrit.wikimedia.org/r/63787
Change subject: (bug 48473) validate claim guid in api and return error
......................................................................
(bug 48473) validate claim guid in api and return error
Change-Id: Id388b510a18ddd3ccd899b78c97c77650df4dd2b
---
M lib/WikibaseLib.classes.php
M lib/WikibaseLib.hooks.php
A lib/includes/ClaimGuidValidator.php
A lib/tests/phpunit/ClaimGuidValidatorTest.php
M repo/includes/api/GetClaims.php
M repo/includes/api/RemoveClaims.php
M repo/includes/api/RemoveQualifiers.php
M repo/includes/api/RemoveReferences.php
M repo/includes/api/SetClaimValue.php
M repo/includes/api/SetQualifier.php
M repo/includes/api/SetReference.php
M repo/includes/api/SetStatementRank.php
12 files changed, 177 insertions(+), 5 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/87/63787/5
diff --git a/lib/WikibaseLib.classes.php b/lib/WikibaseLib.classes.php
index 6dd483d..ec3aaec 100644
--- a/lib/WikibaseLib.classes.php
+++ b/lib/WikibaseLib.classes.php
@@ -44,6 +44,7 @@
'Wikibase\Lib\V4GuidGenerator' => 'includes/GuidGenerator.php',
'Wikibase\Lib\EntityRetrievingDataTypeLookup' =>
'includes/EntityRetrievingDataTypeLookup.php',
'Wikibase\Lib\ClaimGuidGenerator' =>
'includes/GuidGenerator.php',
+ 'Wikibase\Lib\ClaimGuidValidator' =>
'includes/ClaimGuidValidator.php',
'Wikibase\Lib\InMemoryDataTypeLookup' =>
'includes/InMemoryDataTypeLookup.php',
'Wikibase\LibRegistry' => 'includes/LibRegistry.php',
'Wikibase\Template' => 'includes/TemplateRegistry.php',
diff --git a/lib/WikibaseLib.hooks.php b/lib/WikibaseLib.hooks.php
index dafd214..ed1c5a5 100644
--- a/lib/WikibaseLib.hooks.php
+++ b/lib/WikibaseLib.hooks.php
@@ -70,6 +70,7 @@
'ByPropertyIdArray',
'ChangesTable',
'ClaimDifference',
+ 'ClaimGuidValidator',
'ReferencedEntitiesFinder',
'EntityRetrievingDataTypeLookup',
'InMemoryDataTypeLookup',
diff --git a/lib/includes/ClaimGuidValidator.php
b/lib/includes/ClaimGuidValidator.php
new file mode 100644
index 0000000..a991f37
--- /dev/null
+++ b/lib/includes/ClaimGuidValidator.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Wikibase\Lib;
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 0.4
+ *
+ * @file
+ * @ingroup WikibaseLib
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < [email protected] >
+ */
+class ClaimGuidValidator {
+
+ /**
+ * Validates a claim guid
+ *
+ * @since 0.4
+ *
+ * @param string $guid
+ *
+ * @return boolean
+ */
+ public function validate( $guid ) {
+ if ( ! is_string( $guid ) ) {
+ return false;
+ }
+
+ $keyParts = explode( '$', $guid );
+
+ if ( count( $keyParts ) !== 2 ) {
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/lib/tests/phpunit/ClaimGuidValidatorTest.php
b/lib/tests/phpunit/ClaimGuidValidatorTest.php
new file mode 100644
index 0000000..166c976
--- /dev/null
+++ b/lib/tests/phpunit/ClaimGuidValidatorTest.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace Wikibase\Lib\Test;
+
+use Wikibase\Lib\ClaimGuidValidator;
+
+/**
+ * Tests for the ClaimGuidValidator class.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
USA
+ *
+ * @file
+ * @since 0.4
+ *
+ * @ingroup Wikibase
+ * @ingroup Test
+ *
+ * @group Wikibase
+ * @group WikibaseLib
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < [email protected] >
+ */
+class ClaimGuidValidatorTest extends \PHPUnit_Framework_TestCase {
+
+ public function validateProvider() {
+ return array(
+ array( 'q60$5083E43C-228B-4E3E-B82A-4CB20A22A3FB', true
),
+ array( 'q60$5083E43C-228B-4E3E-B82A-$4CB20A22A3FB',
false ),
+ array( '$q60$5083E43C-228B-4E3E-B82A-4CB20A22A3FB',
false ),
+ array( '5083E43C-228B-4E3E-B82A-4CB20A22A3FB', false ),
+ array( 9000, false )
+ );
+ }
+
+ /**
+ * @dataProvider validateProvider
+ */
+ public function testValidate( $guid, $expected ) {
+ $claimGuidValidator = new ClaimGuidValidator();
+ $isValid = $claimGuidValidator->validate( $guid );
+
+ $this->assertEquals( $expected, $isValid );
+ }
+
+}
diff --git a/repo/includes/api/GetClaims.php b/repo/includes/api/GetClaims.php
index 72d998c..75490b9 100644
--- a/repo/includes/api/GetClaims.php
+++ b/repo/includes/api/GetClaims.php
@@ -5,6 +5,7 @@
use ApiBase;
use MWException;
+use Wikibase\Lib\ClaimGuidValidator;
use Wikibase\Lib\Serializers\ClaimSerializer;
use Wikibase\Lib\Serializers\SerializerFactory;
use Wikibase\EntityId;
@@ -167,6 +168,12 @@
$claimGuid = null;
+ $claimGuidValidator = new ClaimGuidValidator();
+
+ if ( isset( $params['claim'] ) &&
$claimGuidValidator->validate( $params['claim'] ) === false ) {
+ $this->dieUsage( 'Claim guid is invalid',
'getclaims-invalid-guid' );
+ }
+
if ( isset( $params['entity'] ) && isset( $params['claim'] ) ) {
$entityId = Entity::getIdFromClaimGuid(
$params['claim'] );
diff --git a/repo/includes/api/RemoveClaims.php
b/repo/includes/api/RemoveClaims.php
index 814454c..9ff4018 100644
--- a/repo/includes/api/RemoveClaims.php
+++ b/repo/includes/api/RemoveClaims.php
@@ -14,6 +14,8 @@
use Wikibase\Summary;
use Wikibase\PropertyValueSnak;
+use Wikibase\Lib\ClaimGuidValidator;
+
/**
* API module for removing claims.
*
@@ -147,14 +149,18 @@
$guids = array();
+ $claimGuidValidator = new ClaimGuidValidator();
+
foreach ( $params['claim'] as $guid ) {
- $entityId = Entity::getIdFromClaimGuid( $guid );
+ if ( $claimGuidValidator->validate( $guid ) ) {
+ $entityId = Entity::getIdFromClaimGuid( $guid );
- if ( !array_key_exists( $entityId, $guids ) ) {
- $guids[$entityId] = array();
+ if ( !array_key_exists( $entityId, $guids ) ) {
+ $guids[$entityId] = array();
+ }
+
+ $guids[$entityId][] = $guid;
}
-
- $guids[$entityId][] = $guid;
}
return $guids;
diff --git a/repo/includes/api/RemoveQualifiers.php
b/repo/includes/api/RemoveQualifiers.php
index 40b506d..86858d2 100644
--- a/repo/includes/api/RemoveQualifiers.php
+++ b/repo/includes/api/RemoveQualifiers.php
@@ -13,6 +13,8 @@
use Wikibase\Claims;
use Wikibase\Settings;
+use Wikibase\Lib\ClaimGuidValidator;
+
/**
* API module for removing qualifiers from a claim.
*
@@ -72,6 +74,12 @@
protected function getEntityContent() {
$params = $this->extractRequestParams();
+ $claimGuidValidator = new ClaimGuidValidator();
+
+ if ( $claimGuidValidator->validate( $params['claim'] ) ===
false ) {
+ $this->dieUsage( 'Invalid claim guid',
'removequalifiers-invalid-guid' );
+ }
+
$entityId = EntityId::newFromPrefixedId(
Entity::getIdFromClaimGuid( $params['claim'] ) );
$entityTitle =
EntityContentFactory::singleton()->getTitleForId( $entityId );
diff --git a/repo/includes/api/RemoveReferences.php
b/repo/includes/api/RemoveReferences.php
index 7f745ac..9dcbce8 100644
--- a/repo/includes/api/RemoveReferences.php
+++ b/repo/includes/api/RemoveReferences.php
@@ -13,6 +13,8 @@
use Wikibase\Settings;
use Wikibase\Claims;
+use Wikibase\Lib\ClaimGuidValidator;
+
/**
* API module for removing one or more references of the same statement.
*
@@ -82,6 +84,12 @@
protected function getEntityContent() {
$params = $this->extractRequestParams();
+ $claimGuidValidator = new ClaimGuidValidator();
+
+ if ( $claimGuidValidator->validate( $params['statement'] ) ===
false ) {
+ $this->dieUsage( 'Invalid claim guid',
'removereferences-invalid-guid' );
+ }
+
$entityId = EntityId::newFromPrefixedId(
Entity::getIdFromClaimGuid( $params['statement'] ) );
$entityTitle =
EntityContentFactory::singleton()->getTitleForId( $entityId );
diff --git a/repo/includes/api/SetClaimValue.php
b/repo/includes/api/SetClaimValue.php
index 3033b60..d76b4a4 100644
--- a/repo/includes/api/SetClaimValue.php
+++ b/repo/includes/api/SetClaimValue.php
@@ -13,6 +13,8 @@
use Wikibase\Claim;
use Wikibase\Claims;
+use Wikibase\Lib\ClaimGuidValidator;
+
/**
* API module for setting the DataValue contained by the main snak of a claim.
*
@@ -80,6 +82,12 @@
protected function getEntityContent() {
$params = $this->extractRequestParams();
+ $claimGuidValidator = new ClaimGuidValidator();
+
+ if ( $claimGuidValidator->validate( $params['claim'] ) ===
false ) {
+ $this->dieUsage( 'Invalid claim guid',
'setclaimvalue-invalid-guid' );
+ }
+
$entityId = EntityId::newFromPrefixedId(
Entity::getIdFromClaimGuid( $params['claim'] ) );
$entityTitle =
EntityContentFactory::singleton()->getTitleForId( $entityId );
diff --git a/repo/includes/api/SetQualifier.php
b/repo/includes/api/SetQualifier.php
index a19e09a..04e0b12 100644
--- a/repo/includes/api/SetQualifier.php
+++ b/repo/includes/api/SetQualifier.php
@@ -18,6 +18,7 @@
use Wikibase\LibRegistry;
use Wikibase\Settings;
+use Wikibase\Lib\ClaimGuidValidator;
/**
* API module for creating a qualifier or setting the value of an existing one.
@@ -118,6 +119,12 @@
protected function getEntityContent() {
$params = $this->extractRequestParams();
+ $claimGuidValidator = new ClaimGuidValidator();
+
+ if ( $claimGuidValidator->validate( $params['claim'] ) ===
false ) {
+ $this->dieUsage( 'Invalid claim guid',
'setqualifier-invalid-guid' );
+ }
+
$entityId = EntityId::newFromPrefixedId(
Entity::getIdFromClaimGuid( $params['claim'] ) );
$entityTitle =
EntityContentFactory::singleton()->getTitleForId( $entityId );
diff --git a/repo/includes/api/SetReference.php
b/repo/includes/api/SetReference.php
index 3bfb47b..4e5d5b0 100644
--- a/repo/includes/api/SetReference.php
+++ b/repo/includes/api/SetReference.php
@@ -14,6 +14,7 @@
use Wikibase\SnakList;
use Wikibase\Claims;
use Wikibase\Settings;
+use Wikibase\Lib\ClaimGuidValidator;
/**
* API module for creating a reference or setting the value of an existing one.
@@ -81,6 +82,12 @@
protected function getEntityContent() {
$params = $this->extractRequestParams();
+ $claimGuidValidator = new ClaimGuidValidator();
+
+ if ( $claimGuidValidator->validate( $params['statement'] ) ===
false ) {
+ $this->dieUsage( 'Invalid guid',
'setreference-invalid-guid' );
+ }
+
$entityId = EntityId::newFromPrefixedId(
Entity::getIdFromClaimGuid( $params['statement'] ) );
if ( $entityId === null ) {
diff --git a/repo/includes/api/SetStatementRank.php
b/repo/includes/api/SetStatementRank.php
index dc61b11..94f04c2 100644
--- a/repo/includes/api/SetStatementRank.php
+++ b/repo/includes/api/SetStatementRank.php
@@ -12,6 +12,7 @@
use Wikibase\Statement;
use Wikibase\Settings;
+use Wikibase\Lib\ClaimGuidValidator;
use Wikibase\Lib\Serializers\ClaimSerializer;
/**
@@ -85,6 +86,12 @@
protected function getEntityContent() {
$params = $this->extractRequestParams();
+ $claimGuidValidator = new ClaimGuidValidator();
+
+ if ( $claimGuidValidator->validate( $params['statement'] ) ===
false ) {
+ $this->dieUsage( 'Invalid claim guid',
'setstatementrank-invalid-guid' );
+ }
+
$entityId = EntityId::newFromPrefixedId(
Entity::getIdFromClaimGuid( $params['statement'] ) );
$entityTitle =
EntityContentFactory::singleton()->getTitleForId( $entityId );
--
To view, visit https://gerrit.wikimedia.org/r/63787
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Id388b510a18ddd3ccd899b78c97c77650df4dd2b
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Aude <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits