summaryrefslogtreecommitdiff
path: root/modules/gallery
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gallery')
-rw-r--r--modules/gallery/libraries/MY_Kohana_Exception.php57
-rw-r--r--modules/gallery/tests/Kohana_Exception_Test.php170
-rw-r--r--modules/gallery/views/kohana/error.php4
3 files changed, 229 insertions, 2 deletions
diff --git a/modules/gallery/libraries/MY_Kohana_Exception.php b/modules/gallery/libraries/MY_Kohana_Exception.php
index d6f1f467..1712d895 100644
--- a/modules/gallery/libraries/MY_Kohana_Exception.php
+++ b/modules/gallery/libraries/MY_Kohana_Exception.php
@@ -92,4 +92,61 @@ class Kohana_Exception extends Kohana_Exception_Core {
}
print $view;
}
+
+ /**
+ * @see Kohana_Exception::dump()
+ */
+ public static function dump($value, $length=128, $max_level=5) {
+ return self::safe_dump($value, null, $length, $max_level);
+ }
+
+ /**
+ * A safer version of dump(), eliding sensitive information in the dumped
+ * data, such as session ids and passwords / hashes.
+ */
+ public static function safe_dump($value, $key, $length=128, $max_level=5) {
+ return parent::dump(self::_sanitize_for_dump($value, $key), $length, $max_level);
+ }
+
+ /**
+ * Elides sensitive data which shouldn't be echoed to the client,
+ * such as passwords, and other secrets.
+ */
+ /* Visible for testing*/ static function _sanitize_for_dump($value, $key=null) {
+ // Better elide too much than letting something through.
+ // Note: unanchored match is intended.
+ $sensitive_info_pattern =
+ '/(password|pass|email|hash|private_key|session_id|session|g3sid|csrf|secret)/i';
+ if (preg_match($sensitive_info_pattern, $key) ||
+ (is_string($value) && preg_match('/[a-f0-9]{20,}/i', $value))) {
+ return 'removed for display';
+ } else if (is_object($value)) {
+ if ($value instanceof Database) {
+ // Elide database password, host, name, user, etc.
+ return get_class($value) . ' object - details omitted for display';
+ } else if ($value instanceof User_Model) {
+ return get_class($value) . ' object for "' . $value->name . '" - details omitted for display';
+ }
+ return self::_sanitize_for_dump((array) $value, $key);
+ } else if (is_array($value)) {
+ $result = array();
+ foreach ($value as $k => $v) {
+ $actual_key = $k;
+ $key_for_display = $k;
+ if ($k[0] === "\x00") {
+ // Remove the access level from the variable name
+ $actual_key = substr($k, strrpos($k, "\x00") + 1);
+ $access = $k[1] === '*' ? 'protected' : 'private';
+ $key_for_display = "$access: $actual_key";
+ }
+ if (is_object($v)) {
+ $key_for_display .= ' (type: ' . get_class($v) . ')';
+ }
+ $result[$key_for_display] = self::_sanitize_for_dump($v, $actual_key);
+ }
+ } else {
+ $result = $value;
+ }
+ return $result;
+ }
} \ No newline at end of file
diff --git a/modules/gallery/tests/Kohana_Exception_Test.php b/modules/gallery/tests/Kohana_Exception_Test.php
new file mode 100644
index 00000000..d2dbb4dc
--- /dev/null
+++ b/modules/gallery/tests/Kohana_Exception_Test.php
@@ -0,0 +1,170 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2009 Bharat Mediratta
+ *
+ * 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.
+ */
+class Kohana_Exception_Test extends Gallery_Unit_Test_Case {
+
+ public function dump_test() {
+ // Verify the override.
+ $this->assert_equal('<small>string</small><span>(19)</span> "removed for display"',
+ Kohana_Exception::dump("1a62761b836138c6198313911"));
+ $this->assert_equal('<small>string</small><span>(14)</span> "original value"',
+ Kohana_Exception::dump("original value"));
+ }
+
+ public function safe_dump_test() {
+ // Verify the delegation.
+ $this->assert_equal('<small>string</small><span>(19)</span> "removed for display"',
+ Kohana_Exception::safe_dump("original value", "password"));
+ $this->assert_equal('<small>string</small><span>(14)</span> "original value"',
+ Kohana_Exception::safe_dump("original value", "meow"));
+ }
+
+ public function sanitize_for_dump_match_key_test() {
+ $this->assert_equal("removed for display",
+ Kohana_Exception::_sanitize_for_dump("original value", "password"));
+ $this->assert_equal("original value",
+ Kohana_Exception::_sanitize_for_dump("original value", "meow"));
+ }
+
+ public function sanitize_for_dump_match_key_loosely_test() {
+ $this->assert_equal("removed for display",
+ Kohana_Exception::_sanitize_for_dump("original value", "this secret key"));
+ }
+
+ public function sanitize_for_dump_match_value_test() {
+ // Looks like a hash / secret value.
+ $this->assert_equal("removed for display",
+ Kohana_Exception::_sanitize_for_dump("p$2a178b841c6391d6368f131", "meow"));
+ $this->assert_equal("original value",
+ Kohana_Exception::_sanitize_for_dump("original value", "meow"));
+ }
+
+ public function sanitize_for_dump_array_test() {
+ $var = array("safe" => "original value 1",
+ "some hash" => "original value 2",
+ "three" => "2a3728788982938293b9292");
+ $expected = array("safe" => "original value 1",
+ "some hash" => "removed for display",
+ "three" => "removed for display");
+
+ $this->assert_equal($expected,
+ Kohana_Exception::_sanitize_for_dump($var, "ignored"));
+ }
+
+ public function sanitize_for_dump_nested_array_test() {
+ $var = array("safe" => "original value 1",
+ "safe 2" => array("some hash" => "original value 2"));
+ $expected = array("safe" => "original value 1",
+ "safe 2" => array("some hash" => "removed for display"));
+ $this->assert_equal($expected,
+ Kohana_Exception::_sanitize_for_dump($var, "ignored"));
+ }
+
+ public function sanitize_for_dump_user_test() {
+ $user = new User_Model();
+ $user->name = "john";
+ $user->hash = "value 1";
+ $user->email = "value 2";
+ $user->full_name = "value 3";
+ $this->assert_equal('User_Model object for "john" - details omitted for display',
+ Kohana_Exception::_sanitize_for_dump($user, "ignored"));
+ }
+
+ public function sanitize_for_dump_database_test() {
+ $db = new Kohana_Exception_Test_Database(
+ array("connection" => array("user" => "john", "name" => "gallery_3"),
+ "cache" => array()));
+ $this->assert_equal("Kohana_Exception_Test_Database object - details omitted for display",
+ Kohana_Exception::_sanitize_for_dump($db, "ignored"));
+ }
+
+ public function sanitize_for_dump_nested_database_test() {
+ $db = new Kohana_Exception_Test_Database(
+ array("connection" => array("user" => "john", "name" => "gallery_3"),
+ "cache" => array()));
+ $var = array("some" => "foo",
+ "bar" => $db);
+ $this->assert_equal(
+ array("some" => "foo",
+ "bar (type: Kohana_Exception_Test_Database)" =>
+ "Kohana_Exception_Test_Database object - details omitted for display"),
+ Kohana_Exception::_sanitize_for_dump($var, "ignored"));
+ }
+
+ public function sanitize_for_dump_object_test() {
+ $obj = new Kohana_Exception_Test_Class();
+ $obj->password = "original value";
+ $expected = array("var_1" => "val 1",
+ "protected: var_2" => "val 2",
+ "private: var_3" => "val 3",
+ "protected: hash" => "removed for display",
+ "private: email_address" => "removed for display",
+ "password" => "removed for display");
+ $this->assert_equal($expected,
+ Kohana_Exception::_sanitize_for_dump($obj, "ignored"));
+ }
+
+ public function sanitize_for_dump_nested_object_test() {
+ $user = new User_Model();
+ $user->name = "john";
+ $obj = new Kohana_Exception_Test_Class();
+ $obj->meow = new Kohana_Exception_Test_Class();
+ $obj->woof = "original value";
+ $obj->foo = array("bar" => $user);
+ $expected = array("var_1" => "val 1",
+ "protected: var_2" => "val 2",
+ "private: var_3" => "val 3",
+ "protected: hash" => "removed for display",
+ "private: email_address" => "removed for display",
+ "meow (type: Kohana_Exception_Test_Class)" =>
+ array("var_1" => "val 1",
+ "protected: var_2" => "val 2",
+ "private: var_3" => "val 3",
+ "protected: hash" => "removed for display",
+ "private: email_address" => "removed for display"),
+ "woof" => "original value",
+ "foo" => array("bar (type: User_Model)" =>
+ 'User_Model object for "john" - details omitted for display'));
+ $this->assert_equal($expected,
+ Kohana_Exception::_sanitize_for_dump($obj, "ignored"));
+ }
+}
+
+class Kohana_Exception_Test_Database extends Database {
+ function __construct($config) { parent::__construct($config); }
+ public function connect() {}
+ public function disconnect() {}
+ public function set_charset($charset) {}
+ public function query_execute($sql) {}
+ public function escape($value) {}
+ public function list_constraints($table) {}
+ public function list_fields($table) {}
+ public function list_tables() {}
+}
+
+class Kohana_Exception_Test_Class {
+ public $var_1 = "val 1";
+ protected $var_2 = "val 2";
+ private $var_3 = "val 3";
+ protected $hash = "val 4";
+ private $email_address = "val 5";
+ function __set($name, $val) {
+ $this->$name = $val;
+ }
+} \ No newline at end of file
diff --git a/modules/gallery/views/kohana/error.php b/modules/gallery/views/kohana/error.php
index 26628cf2..d55105a0 100644
--- a/modules/gallery/views/kohana/error.php
+++ b/modules/gallery/views/kohana/error.php
@@ -204,7 +204,7 @@
<pre><?= $name?></pre>
</td>
<td class="value">
- <pre><?= Kohana_Exception::dump($arg) ?></pre>
+ <pre><?= Kohana_Exception::safe_dump($arg, $name) ?></pre>
</td>
</tr>
<? endforeach?>
@@ -265,7 +265,7 @@
</code>
</td>
<td class="value">
- <pre><?= Kohana_Exception::dump($value) ?></pre>
+ <pre><?= Kohana_Exception::safe_dump($value, $key) ?></pre>
</td>
</tr>
<? endforeach?>