From 38c2d4da35b6c00e2ef2f6b271eda2c020974eee Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Fri, 23 Dec 2011 02:24:11 -0500 Subject: [ticket/10428] Compare $data to false strictly. Users may pass 0 or '' for $data, this should cause the user-specified $data code path to be taken. PHPBB3-10428 --- phpBB/includes/acp/acp_users.php | 8 ++++---- phpBB/includes/session.php | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'phpBB/includes') diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index 4f58434a43..724d450c99 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -2345,7 +2345,7 @@ class acp_users { global $user; - $var = ($data) ? $data : $user_row['user_options']; + $var = ($data !== false) ? $data : $user_row['user_options']; if ($value && !($var & 1 << $user->keyoptions[$key])) { @@ -2357,10 +2357,10 @@ class acp_users } else { - return ($data) ? $var : false; + return ($data !== false) ? $var : false; } - if (!$data) + if ($data === false) { $user_row['user_options'] = $var; return true; @@ -2378,7 +2378,7 @@ class acp_users { global $user; - $var = ($data) ? $data : $user_row['user_options']; + $var = ($data !== false) ? $data : $user_row['user_options']; return ($var & 1 << $user->keyoptions[$key]) ? true : false; } } diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index caadcbafaa..50b6ac7406 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -2343,7 +2343,7 @@ class user extends session { if (!isset($this->keyvalues[$key])) { - $var = ($data) ? $data : $this->data['user_options']; + $var = ($data !== false) ? $data : $this->data['user_options']; $this->keyvalues[$key] = ($var & 1 << $this->keyoptions[$key]) ? true : false; } @@ -2355,7 +2355,7 @@ class user extends session */ function optionset($key, $value, $data = false) { - $var = ($data) ? $data : $this->data['user_options']; + $var = ($data !== false) ? $data : $this->data['user_options']; if ($value && !($var & 1 << $this->keyoptions[$key])) { @@ -2367,10 +2367,10 @@ class user extends session } else { - return ($data) ? $var : false; + return ($data !== false) ? $var : false; } - if (!$data) + if ($data === false) { $this->data['user_options'] = $var; return true; -- cgit v1.2.1 From 16ae99eec8e34ec6d542c1e4d82bd288bc0d0026 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Fri, 23 Dec 2011 02:29:48 -0500 Subject: [ticket/10428] Dispose of $this->keyvalues cache for optionget. It does not work properly when custom $data is provided, and making it work will make the code so complicated that any benefits from having this cache in the first place will be nullified. Just get rid of it. PHPBB3-10428 --- phpBB/includes/session.php | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'phpBB/includes') diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index 50b6ac7406..d988426a87 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1507,7 +1507,6 @@ class user extends session // Able to add new options (up to id 31) var $keyoptions = array('viewimg' => 0, 'viewflash' => 1, 'viewsmilies' => 2, 'viewsigs' => 3, 'viewavatars' => 4, 'viewcensors' => 5, 'attachsig' => 6, 'bbcode' => 8, 'smilies' => 9, 'popuppm' => 10, 'sig_bbcode' => 15, 'sig_smilies' => 16, 'sig_links' => 17); - var $keyvalues = array(); /** * Constructor to set the lang path @@ -2341,13 +2340,8 @@ class user extends session */ function optionget($key, $data = false) { - if (!isset($this->keyvalues[$key])) - { - $var = ($data !== false) ? $data : $this->data['user_options']; - $this->keyvalues[$key] = ($var & 1 << $this->keyoptions[$key]) ? true : false; - } - - return $this->keyvalues[$key]; + $var = ($data !== false) ? $data : $this->data['user_options']; + return ($var & 1 << $this->keyoptions[$key]) ? true : false; } /** -- cgit v1.2.1 From 99c102344ebe3b4a6c18e36c8bea8f3bdd997f2e Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Fri, 23 Dec 2011 12:52:51 -0500 Subject: [ticket/10428] Use phpbb_optionget/set in optionget/set for DRYness. PHPBB3-10428 --- phpBB/includes/acp/acp_users.php | 28 ++++++++++++---------------- phpBB/includes/session.php | 28 ++++++++++++---------------- 2 files changed, 24 insertions(+), 32 deletions(-) (limited to 'phpBB/includes') diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index 724d450c99..e433c46db3 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -2347,27 +2347,23 @@ class acp_users $var = ($data !== false) ? $data : $user_row['user_options']; - if ($value && !($var & 1 << $user->keyoptions[$key])) - { - $var += 1 << $user->keyoptions[$key]; - } - else if (!$value && ($var & 1 << $user->keyoptions[$key])) - { - $var -= 1 << $user->keyoptions[$key]; - } - else - { - return ($data !== false) ? $var : false; - } + $new_var = phpbb_optionset($user->keyoptions[$key], $value, $var); if ($data === false) { - $user_row['user_options'] = $var; - return true; + if ($new_var != $var) + { + $user_row['user_options'] = $new_var; + return true; + } + else + { + return false; + } } else { - return $var; + return $new_var; } } @@ -2379,7 +2375,7 @@ class acp_users global $user; $var = ($data !== false) ? $data : $user_row['user_options']; - return ($var & 1 << $user->keyoptions[$key]) ? true : false; + return phpbb_optionget($user->keyoptions[$key], $var); } } diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index d988426a87..457071e01e 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -2341,7 +2341,7 @@ class user extends session function optionget($key, $data = false) { $var = ($data !== false) ? $data : $this->data['user_options']; - return ($var & 1 << $this->keyoptions[$key]) ? true : false; + return phpbb_optionget($this->keyoptions[$key], $var); } /** @@ -2351,27 +2351,23 @@ class user extends session { $var = ($data !== false) ? $data : $this->data['user_options']; - if ($value && !($var & 1 << $this->keyoptions[$key])) - { - $var += 1 << $this->keyoptions[$key]; - } - else if (!$value && ($var & 1 << $this->keyoptions[$key])) - { - $var -= 1 << $this->keyoptions[$key]; - } - else - { - return ($data !== false) ? $var : false; - } + $new_var = phpbb_optionset($this->keyoptions[$key], $value, $var); if ($data === false) { - $this->data['user_options'] = $var; - return true; + if ($new_var != $var) + { + $this->data['user_options'] = $new_var; + return true; + } + else + { + return false; + } } else { - return $var; + return $new_var; } } -- cgit v1.2.1 From 10453b67525a0e26a3c859df4dab46907189af72 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Fri, 23 Dec 2011 22:59:55 -0500 Subject: [ticket/10428] Documentation for optionget/optionset functions. PHPBB3-10428 --- phpBB/includes/acp/acp_users.php | 23 +++++++++++++++++++++-- phpBB/includes/session.php | 17 +++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) (limited to 'phpBB/includes') diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index e433c46db3..363c900edc 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -2339,7 +2339,19 @@ class acp_users } /** - * Optionset replacement for this module based on $user->optionset + * Set option bit field for user options in a user row array. + * + * Optionset replacement for this module based on $user->optionset. + * + * @param array $user_row Row from the users table. + * @param int $key Option key, as defined in $user->keyoptions property. + * @param bool $value True to set the option, false to clear the option. + * @param int $data Current bit field value, or false to use $user_row['user_options'] + * @return int|bool If $data is false, the bit field is modified and + * written back to $user_row['user_options'], and + * return value is true if the bit field changed and + * false otherwise. If $data is not false, the new + * bitfield value is returned. */ function optionset(&$user_row, $key, $value, $data = false) { @@ -2368,7 +2380,14 @@ class acp_users } /** - * Optionget replacement for this module based on $user->optionget + * Get option bit field from user options in a user row array. + * + * Optionget replacement for this module based on $user->optionget. + * + * @param array $user_row Row from the users table. + * @param int $key option key, as defined in $user->keyoptions property. + * @param int $data bit field value to use, or false to use $user_row['user_options'] + * @return bool true if the option is set in the bit field, false otherwise */ function optionget(&$user_row, $key, $data = false) { diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index 457071e01e..a894242a39 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -2336,7 +2336,11 @@ class user extends session } /** - * Get option bit field from user options + * Get option bit field from user options. + * + * @param int $key option key, as defined in $keyoptions property. + * @param int $data bit field value to use, or false to use $this->data['user_options'] + * @return bool true if the option is set in the bit field, false otherwise */ function optionget($key, $data = false) { @@ -2345,7 +2349,16 @@ class user extends session } /** - * Set option bit field for user options + * Set option bit field for user options. + * + * @param int $key Option key, as defined in $keyoptions property. + * @param bool $value True to set the option, false to clear the option. + * @param int $data Current bit field value, or false to use $this->data['user_options'] + * @return int|bool If $data is false, the bit field is modified and + * written back to $this->data['user_options'], and + * return value is true if the bit field changed and + * false otherwise. If $data is not false, the new + * bitfield value is returned. */ function optionset($key, $value, $data = false) { -- cgit v1.2.1