Fixes permission calculation
authorMatthias Schmidt <gravatronics@live.com>
Fri, 4 Jan 2013 18:52:36 +0000 (19:52 +0100)
committerMatthias Schmidt <gravatronics@live.com>
Fri, 4 Jan 2013 18:52:36 +0000 (19:52 +0100)
This fix is relevant for user group option types that can have a list of values (e.g. list of usable attachments). In the database, only the difference between the default value and the user group's value is stored. This difference is calculated by `IUserGroupOptionType::diff()`. When the permissions for a certain type of user groups are calculated, the difference for all relevant user groups have to be merged, which is done by `IUserGroupOptionType::merge()`.

The code of the previous merge function is the same as the code of the new diff function. This worked fine when calculating the difference to store the values. But if the merge of two option values was calculated during the permission calculation for a certain type of user groups, again, the difference was calculated, not the merge. This had the effect, that if, for instance, the default value for the usable attachment types was "gif, jpg" and the value for the administrator group was "foo, jpg", administrators were only allowed to use "foo" attachments (which is the diff of the two) instead of "foo", "gif" and "jpg".

13 files changed:
wcfsetup/install/files/lib/acp/form/UserGroupAddForm.class.php
wcfsetup/install/files/lib/acp/form/UserGroupEditForm.class.php
wcfsetup/install/files/lib/acp/form/UserGroupOptionForm.class.php
wcfsetup/install/files/lib/system/option/user/group/BooleanUserGroupOptionType.class.php
wcfsetup/install/files/lib/system/option/user/group/FileSizeUserGroupOptionType.class.php
wcfsetup/install/files/lib/system/option/user/group/IUserGroupOptionType.class.php
wcfsetup/install/files/lib/system/option/user/group/InfiniteIntegerUserGroupOptionType.class.php
wcfsetup/install/files/lib/system/option/user/group/InfiniteInverseIntegerUserGroupOptionType.class.php
wcfsetup/install/files/lib/system/option/user/group/IntegerUserGroupOptionType.class.php
wcfsetup/install/files/lib/system/option/user/group/InverseIntegerUserGroupOptionType.class.php
wcfsetup/install/files/lib/system/option/user/group/TextUserGroupOptionType.class.php
wcfsetup/install/files/lib/system/option/user/group/TextareaUserGroupOptionType.class.php
wcfsetup/install/files/lib/system/option/user/group/UserGroupsUserGroupOptionType.class.php

index 6576e6ddf4fe7ff39c58a0d44054d134c8806b04..d101e978cd9fcffa5a3e72001fe755605bbecbf1 100755 (executable)
@@ -127,7 +127,7 @@ class UserGroupAddForm extends AbstractOptionListForm {
                        $defaultValue = $defaultGroup->getGroupOption($option->optionName);
                        $typeObject = $this->optionHandler->getTypeObject($option->optionType);
                        
-                       $newValue = $typeObject->merge($defaultValue, $optionValues[$option->optionID]);
+                       $newValue = $typeObject->diff($defaultValue, $optionValues[$option->optionID]);
                        if ($newValue !== null) {
                                $saveOptions[$option->optionID] = $newValue;
                        }
index 8296e828426e8ad5f43d798f55e8d70a3d984590..aa954abed8d5317c456a7a6d322cc57f522686e2 100755 (executable)
@@ -133,7 +133,7 @@ class UserGroupEditForm extends UserGroupAddForm {
                                $defaultValue = $defaultGroup->getGroupOption($option->optionName);
                                $typeObject = $this->optionHandler->getTypeObject($option->optionType);
                                        
-                               $newValue = $typeObject->merge($defaultValue, $optionValues[$option->optionID]);
+                               $newValue = $typeObject->diff($defaultValue, $optionValues[$option->optionID]);
                                if ($newValue !== null) {
                                        $saveOptions[$option->optionID] = $newValue;
                                }
index 56416c776d51ba6c0fe626bc7ff46fe7a92bfcfa..51e13ab8ab3f9b7492969aeb4f82d9012f097183 100644 (file)
@@ -199,7 +199,7 @@ class UserGroupOptionForm extends AbstractForm {
                        
                        // check if not editing default value
                        if ($groupID != $this->groupEveryone->groupID) {
-                               $newValue = $this->optionType->merge($this->defaultValue, $optionValue);
+                               $newValue = $this->optionType->diff($this->defaultValue, $optionValue);
                                if ($newValue === null) {
                                        unset($this->values[$groupID]);
                                }
index d2ac2acb9b539c0d75db4c9274b440cb0a7a1d27..2db22d68a807160ee9601ca33c690dba1ea092ea 100644 (file)
@@ -6,7 +6,7 @@ use wcf\system\option\BooleanOptionType;
  * User group option type implementation for boolean values.
  * 
  * The merge of option values returns true, if at least one value is true.
- *
+ * 
  * @author     Marcel Werk
  * @copyright  2001-2012 WoltLab GmbH
  * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
@@ -15,6 +15,13 @@ use wcf\system\option\BooleanOptionType;
  * @category   Community Framework
  */
 class BooleanUserGroupOptionType extends BooleanOptionType implements IUserGroupOptionType {
+       /**
+        * @see wcf\system\option\user\group\IUserGroupOptionType::diff()
+        */
+       public function diff($defaultValue, $groupValue) {
+               return $this->merge($defaultValue, $groupValue);
+       }
+       
        /**
         * @see wcf\system\option\user\group\IUserGroupOptionType::merge()
         */
index 8387aca5161520aac3720878374b1606337bd7e7..14bbfa2c3e4079f8ea40f849355c663b89c0377d 100644 (file)
@@ -15,6 +15,13 @@ use wcf\system\option\FileSizeOptionType;
  * @category   Community Framework
  */
 class FileSizeUserGroupOptionType extends FileSizeOptionType implements IUserGroupOptionType {
+       /**
+        * @see wcf\system\option\user\group\IUserGroupOptionType::diff()
+        */
+       public function diff($defaultValue, $groupValue) {
+               return $this->merge($defaultValue, $groupValue);
+       }
+       
        /**
         * @see wcf\system\option\user.group\IUserGroupOptionType::merge()
         */
index 05af310b299a34889d879a1be9343c827370b9fe..19e336df714ef7312fa9465797bac4e1d5ec9e32 100644 (file)
@@ -13,6 +13,16 @@ use wcf\system\option\IOptionType;
  * @category   Community Framework
  */
 interface IUserGroupOptionType extends IOptionType {
+       /**
+        * Returns the value which results by calculating the difference of the
+        * given values.
+        * 
+        * @param       mixed           $defaultValue
+        * @param       mixed           $groupValue
+        * @return      mixed
+        */
+       public function diff($defaultValue, $groupValue);
+       
        /**
         * Returns the value which results by merging or null if nothing should be saved.
         * 
index 1a8bc7cdd29fe37f43b1f1ccc5bb390bb8386aba..3b584b41c14417ecac9fd292a6a80761bc7d8af6 100644 (file)
@@ -16,6 +16,13 @@ namespace wcf\system\option\user\group;
  * @category   Community Framework
  */
 class InfiniteIntegerUserGroupOptionType extends IntegerUserGroupOptionType {
+       /**
+        * @see wcf\system\option\user\group\IUserGroupOptionType::diff()
+        */
+       public function diff($defaultValue, $groupValue) {
+               return $this->merge($defaultValue, $groupValue);
+       }
+       
        /**
         * @see wcf\system\option\user\group\IUserGroupOptionType::merge()
         */
index f7d9c2b74203aebda348bbe1789ba33cb2ac16af..63674121147dc462e530abfbe9e3ac25bc4261b6 100644 (file)
@@ -15,6 +15,13 @@ namespace wcf\system\option\user\group;
  * @category   Community Framework
  */
 class InfiniteInverseIntegerUserGroupOptionType extends InverseIntegerUserGroupOptionType {
+       /**
+        * @see wcf\system\option\user\group\IUserGroupOptionType::diff()
+        */
+       public function diff($defaultValue, $groupValue) {
+               return $this->merge($defaultValue, $groupValue);
+       }
+       
        /**
         * @see wcf\system\option\user\group\IUserGroupOptionType::merge()
         */
index abdd28bb7c2f97e18d0116b25fe9782b5bfdecd8..fc5febb71ba31f58aefe50cc54d3868fc31247e6 100644 (file)
@@ -15,6 +15,13 @@ use wcf\system\option\IntegerOptionType;
  * @category   Community Framework
  */
 class IntegerUserGroupOptionType extends IntegerOptionType implements IUserGroupOptionType {
+       /**
+        * @see wcf\system\option\user\group\IUserGroupOptionType::diff()
+        */
+       public function diff($defaultValue, $groupValue) {
+               return $this->merge($defaultValue, $groupValue);
+       }
+       
        /**
         * @see wcf\system\option\user.group\IUserGroupOptionType::merge()
         */
index 47819d84263b12b458152106754f6963663d70ba..15bbd53db1b429a1aca86dfaebdb61b6ce7ea752 100644 (file)
@@ -15,6 +15,13 @@ use wcf\system\option\IntegerOptionType;
  * @category   Community Framework
  */
 class InverseIntegerUserGroupOptionType extends IntegerOptionType implements IUserGroupOptionType {
+       /**
+        * @see wcf\system\option\user\group\IUserGroupOptionType::diff()
+        */
+       public function diff($defaultValue, $groupValue) {
+               return $this->merge($defaultValue, $groupValue);
+       }
+       
        /**
         * @see wcf\system\option\user\group\IUserGroupOptionType::merge()
         */
index cf102b2bfdb0a7c5b18b07be9ed388ee8fa388fc..73d323df665b818af6fecd4649c878dcbf2ddf5a 100644 (file)
@@ -14,12 +14,15 @@ use wcf\util\StringUtil;
  * @package    com.woltlab.wcf
  * @subpackage system.option.user.group
  * @category   Community Framework
+ * 
+ * @todo       text options types can't have line breaks, why use them to split
+ *             values? what to do?
  */
 class TextUserGroupOptionType extends TextOptionType implements IUserGroupOptionType {
        /**
-        * @see wcf\system\option\user\group\IUserGroupOptionType::merge()
+        * @see wcf\system\option\user\group\IUserGroupOptionType::diff()
         */
-       public function merge($defaultValue, $groupValue) {
+       public function diff($defaultValue, $groupValue) {
                $defaultValue = explode("\n", StringUtil::unifyNewlines($defaultValue));
                $groupValue = explode("\n", StringUtil::unifyNewlines($groupValue));
                
@@ -30,4 +33,14 @@ class TextUserGroupOptionType extends TextOptionType implements IUserGroupOption
                
                return implode("\n", $result);
        }
+       
+       /**
+        * @see wcf\system\option\user\group\IUserGroupOptionType::merge()
+        */
+       public function merge($defaultValue, $groupValue) {
+               $defaultValue = empty($defaultValue) ? array() : explode("\n", StringUtil::unifyNewlines($defaultValue));
+               $groupValue = empty($groupValue) ? array() : explode("\n", StringUtil::unifyNewlines($groupValue));
+               
+               return implode("\n", array_unique(array_merge($defaultValue, $groupValue)));
+       }
 }
index c7c078db8dcc93577fea3178a77f467173a0d562..b4087a30f88f90903718ec0bfc2ca27e45d07fbc 100644 (file)
@@ -17,17 +17,27 @@ use wcf\util\StringUtil;
  */
 class TextareaUserGroupOptionType extends TextareaOptionType implements IUserGroupOptionType {
        /**
-        * @see wcf\system\option\user\group\IUserGroupOptionType::merge()
+        * @see wcf\system\option\user\group\IUserGroupOptionType::diff()
         */
-       public function merge($defaultValue, $groupValue) {
+       public function diff($defaultValue, $groupValue) {
                $defaultValue = explode("\n", StringUtil::unifyNewlines($defaultValue));
                $groupValue = explode("\n", StringUtil::unifyNewlines($groupValue));
-       
+               
                $result = array_diff($groupValue, $defaultValue);
                if (empty($result)) {
                        return null;
                }
-       
+               
                return implode("\n", $result);
        }
+       
+       /**
+        * @see wcf\system\option\user\group\IUserGroupOptionType::merge()
+        */
+       public function merge($defaultValue, $groupValue) {
+               $defaultValue = empty($defaultValue) ? array() : explode("\n", StringUtil::unifyNewlines($defaultValue));
+               $groupValue = empty($groupValue) ? array() : explode("\n", StringUtil::unifyNewlines($groupValue));
+               
+               return implode("\n", array_unique(array_merge($defaultValue, $groupValue)));
+       }
 }
index 441fc4251f2255891ff5e045856d5b651fd5b77b..3336fca803710e5e0e536d620a6dada38a149e36 100644 (file)
@@ -67,9 +67,9 @@ class UserGroupsUserGroupOptionType extends AbstractOptionType implements IUserG
        }
        
        /**
-        * @see wcf\system\option\user\group\IUserGroupOptionType::merge()
+        * @see wcf\system\option\user\group\IUserGroupOptionType::diff()
         */
-       public function merge($defaultValue, $groupValue) {
+       public function diff($defaultValue, $groupValue) {
                $defaultValue = explode(',', $defaultValue);
                $groupValue = explode(',', $groupValue);
                
@@ -80,4 +80,14 @@ class UserGroupsUserGroupOptionType extends AbstractOptionType implements IUserG
                
                return implode(',', $result);
        }
+       
+       /**
+        * @see wcf\system\option\user\group\IUserGroupOptionType::merge()
+        */
+       public function merge($defaultValue, $groupValue) {
+               $defaultValue = empty($defaultValue) ? array() : explode(',', StringUtil::unifyNewlines($defaultValue));
+               $groupValue = empty($groupValue) ? array() : explode(',', StringUtil::unifyNewlines($groupValue));
+               
+               return implode(',', array_unique(array_merge($defaultValue, $groupValue)));
+       }
 }