Filemanager - pin protected folders fix
authorPaul Mehrer <p.mehrer@metaways.de>
Fri, 21 Jul 2017 09:07:47 +0000 (11:07 +0200)
committerPaul Mehrer <p.mehrer@metaways.de>
Fri, 21 Jul 2017 11:00:03 +0000 (13:00 +0200)
after a pin protection is set during an update a final get is done. But
now the folder is pin protected and the get may fail. Fixed that.

Change-Id: I1ed7ab2b2f5f3bb87c5b47dd739cae1f0e2cb19d
Reviewed-on: http://gerrit.tine20.com/customers/5280
Reviewed-by: Paul Mehrer <p.mehrer@metaways.de>
Tested-by: Paul Mehrer <p.mehrer@metaways.de>
tine20/Tinebase/FileSystem.php

index 9e01ed0..42f2656 100644 (file)
@@ -94,6 +94,15 @@ class Tinebase_FileSystem implements
      * @var array
      */
     protected $_statCache = array();
+
+    /**
+     * class cache to remember secondFactor check per node id. This is required as the "state" might change
+     * during an update for example. Node is not pin protected, gets updated, becomes pin protected -> the final get
+     * at the end of the update process fails -> pin protection will only be checked once, the first time in a request
+     *
+     * @var array
+     */
+    protected $_secondFactorCache = array();
     
     /**
      * holds the instance of the singleton
@@ -2588,7 +2597,8 @@ class Tinebase_FileSystem implements
     {
         // always refetch node to have current acl_node value
         $node = $this->get($_containerId);
-        if (null !== $node->acl_node && !Tinebase_Auth_SecondFactor_Abstract::hasValidSecondFactor()) {
+        if (!isset($this->_secondFactorCache[$node->getId()]) &&
+            null !== $node->acl_node && !Tinebase_Auth_SecondFactor_Abstract::hasValidSecondFactor()) {
             if ($node->getId() !== $node->acl_node) {
                 $acl_node = $this->get($node->acl_node);
             } else {
@@ -2598,6 +2608,7 @@ class Tinebase_FileSystem implements
                 return false;
             }
         }
+        $this->_secondFactorCache[$node->getId()] = true;
         /** @noinspection PhpUndefinedMethodInspection */
         $account = $_accountId instanceof Tinebase_Model_FullUser
             ? $_accountId