[MediaWiki-commits] [Gerrit] Fix JsonEncode/Decode, error detection - change (mediawiki...ZeroPortal)

2014-11-26 Thread Yurik (Code Review)
Yurik has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/176023

Change subject: Fix JsonEncode/Decode, error detection
..

Fix JsonEncode/Decode, error detection

* jsonDecode  jsonEncode - recodes 1-based to 0-based
* getRawParameter() - better parameter error detection

Change-Id: I1d7376358fa70805fc9dbb02f535eeb7ef4ec5ed
---
M includes/LuaLibrary.php
1 file changed, 42 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/ZeroPortal 
refs/changes/23/176023/1

diff --git a/includes/LuaLibrary.php b/includes/LuaLibrary.php
index 116b312..0746080 100644
--- a/includes/LuaLibrary.php
+++ b/includes/LuaLibrary.php
@@ -80,6 +80,26 @@
}
}
 
+   private static function recurseValue( array $value, $isEncoding ) {
+   $isAssoc = false;
+   foreach ( $value as $k = $val ) {
+   if ( is_array( $val ) ) {
+   $val = self::recurseValue( $val, $isEncoding );
+   }
+   $isIntKey = is_int( $k ) || is_string( $k )  strval( 
intval( $k ) ) === $k;
+   if ( !$isIntKey ) {
+   $isAssoc = true;
+   }
+   }
+   if ( $isAssoc ) {
+   return $value;
+   } elseif ( $isEncoding ) {
+   return array_values( $value );
+   } else {
+   return array_combine( range( 1, count( $value ) ), 
$value );
+   }
+   }
+
public function register() {
$title = $this-getTitle();
if ( $title  $title-inNamespace( NS_SPECIAL )  
$title-getText() === 'ZeroPortal' ) {
@@ -138,13 +158,16 @@
/**
 * Get a value from the request (GET or POST). Do not echo this value, 
as it gets sent from the client
 * @param string $name
-* @param mixed $default
-* @return mixed[]
+* @param string|null $default
+* @return string[]|null[]
 * @throws Scribunto_LuaError
 */
public function getRawParameter( $name = null, $default = null ) {
$funcName = self::luaNamespace . __FUNCTION__;
$this-checkType( $funcName, 1, $name, 'string' );
+   if ( $default !== null ) {
+   $this-checkType( $funcName, 2, $default, 'string' );
+   }
if ( substr( $name, 0, 2 ) !== 'zp' ) {
throw new Scribunto_LuaError( bad argument #1 to 
'$funcName' (name must start with 'zp') );
}
@@ -186,24 +209,34 @@
 * Decode value as a JSON string.
 * NOTE: this function uses FormatJson::decode() for simplicity sake.
 * TODO: remove this function once Scribunto gets its own json 
encode/decode
-* @param mixed $value
+* @param string $value
+* @param bool $preserveKeys
+* @return \mixed[]
 * @throws Scribunto_LuaError
-* @return mixed[]
 */
-   public function jsonDecode( $value = null ) {
+   public function jsonDecode( $value = null, $preserveKeys = null ) {
$this-checkType( self::luaNamespace . __FUNCTION__, 1, $value, 
'string' );
-   return array( FormatJson::decode( $value, true ) );
+   $this-checkTypeOptional( self::luaNamespace . __FUNCTION__, 2, 
$preserveKeys, 'boolean', false );
+   $val = FormatJson::decode( $value, true );
+   if ( !$preserveKeys  is_array( $val ) ) {
+   $val = self::recurseValue( $val, false );
+   }
+   return array( $val );
}
 
/**
 * Encode value as a JSON string.
 * TODO: remove this function once Scribunto gets its own json 
encode/decode
 * @param mixed $value
-* @throws Scribunto_LuaError
+* @param bool $preserveKeys
 * @return string
+* @throws Scribunto_LuaError
 */
-   public function jsonEncode( $value = null ) {
-   $this-checkTypeOptional( self::luaNamespace . __FUNCTION__, 2, 
$escapeHtml, 'boolean', false );
+   public function jsonEncode( $value = null, $preserveKeys = null ) {
+   $this-checkTypeOptional( self::luaNamespace . __FUNCTION__, 2, 
$preserveKeys, 'boolean', false );
+   if ( !$preserveKeys  is_array( $value ) ) {
+   $value = self::recurseValue( $value, true );
+   }
$result = FormatJson::encode( $value, false, FormatJson::ALL_OK 
);
if ( $result === false ) {
throw new Scribunto_LuaError( 'Unable to encode value' 
);

-- 
To view, visit https://gerrit.wikimedia.org/r/176023
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings


[MediaWiki-commits] [Gerrit] Fix JsonEncode/Decode, error detection - change (mediawiki...ZeroPortal)

2014-11-26 Thread jenkins-bot (Code Review)
jenkins-bot has submitted this change and it was merged.

Change subject: Fix JsonEncode/Decode, error detection
..


Fix JsonEncode/Decode, error detection

* jsonDecode  jsonEncode - recodes 1-based to 0-based
* getRawParameter() - better parameter error detection

Change-Id: I1d7376358fa70805fc9dbb02f535eeb7ef4ec5ed
---
M includes/LuaLibrary.php
1 file changed, 42 insertions(+), 9 deletions(-)

Approvals:
  Dr0ptp4kt: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/includes/LuaLibrary.php b/includes/LuaLibrary.php
index 116b312..0746080 100644
--- a/includes/LuaLibrary.php
+++ b/includes/LuaLibrary.php
@@ -80,6 +80,26 @@
}
}
 
+   private static function recurseValue( array $value, $isEncoding ) {
+   $isAssoc = false;
+   foreach ( $value as $k = $val ) {
+   if ( is_array( $val ) ) {
+   $val = self::recurseValue( $val, $isEncoding );
+   }
+   $isIntKey = is_int( $k ) || is_string( $k )  strval( 
intval( $k ) ) === $k;
+   if ( !$isIntKey ) {
+   $isAssoc = true;
+   }
+   }
+   if ( $isAssoc ) {
+   return $value;
+   } elseif ( $isEncoding ) {
+   return array_values( $value );
+   } else {
+   return array_combine( range( 1, count( $value ) ), 
$value );
+   }
+   }
+
public function register() {
$title = $this-getTitle();
if ( $title  $title-inNamespace( NS_SPECIAL )  
$title-getText() === 'ZeroPortal' ) {
@@ -138,13 +158,16 @@
/**
 * Get a value from the request (GET or POST). Do not echo this value, 
as it gets sent from the client
 * @param string $name
-* @param mixed $default
-* @return mixed[]
+* @param string|null $default
+* @return string[]|null[]
 * @throws Scribunto_LuaError
 */
public function getRawParameter( $name = null, $default = null ) {
$funcName = self::luaNamespace . __FUNCTION__;
$this-checkType( $funcName, 1, $name, 'string' );
+   if ( $default !== null ) {
+   $this-checkType( $funcName, 2, $default, 'string' );
+   }
if ( substr( $name, 0, 2 ) !== 'zp' ) {
throw new Scribunto_LuaError( bad argument #1 to 
'$funcName' (name must start with 'zp') );
}
@@ -186,24 +209,34 @@
 * Decode value as a JSON string.
 * NOTE: this function uses FormatJson::decode() for simplicity sake.
 * TODO: remove this function once Scribunto gets its own json 
encode/decode
-* @param mixed $value
+* @param string $value
+* @param bool $preserveKeys
+* @return \mixed[]
 * @throws Scribunto_LuaError
-* @return mixed[]
 */
-   public function jsonDecode( $value = null ) {
+   public function jsonDecode( $value = null, $preserveKeys = null ) {
$this-checkType( self::luaNamespace . __FUNCTION__, 1, $value, 
'string' );
-   return array( FormatJson::decode( $value, true ) );
+   $this-checkTypeOptional( self::luaNamespace . __FUNCTION__, 2, 
$preserveKeys, 'boolean', false );
+   $val = FormatJson::decode( $value, true );
+   if ( !$preserveKeys  is_array( $val ) ) {
+   $val = self::recurseValue( $val, false );
+   }
+   return array( $val );
}
 
/**
 * Encode value as a JSON string.
 * TODO: remove this function once Scribunto gets its own json 
encode/decode
 * @param mixed $value
-* @throws Scribunto_LuaError
+* @param bool $preserveKeys
 * @return string
+* @throws Scribunto_LuaError
 */
-   public function jsonEncode( $value = null ) {
-   $this-checkTypeOptional( self::luaNamespace . __FUNCTION__, 2, 
$escapeHtml, 'boolean', false );
+   public function jsonEncode( $value = null, $preserveKeys = null ) {
+   $this-checkTypeOptional( self::luaNamespace . __FUNCTION__, 2, 
$preserveKeys, 'boolean', false );
+   if ( !$preserveKeys  is_array( $value ) ) {
+   $value = self::recurseValue( $value, true );
+   }
$result = FormatJson::encode( $value, false, FormatJson::ALL_OK 
);
if ( $result === false ) {
throw new Scribunto_LuaError( 'Unable to encode value' 
);

-- 
To view, visit https://gerrit.wikimedia.org/r/176023
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: