[BUGFIX] Remove early return in PageTreeDataProvider
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_lock.php
index 1ca4030..07a66d1 100644 (file)
@@ -2,7 +2,7 @@
 /***************************************************************
  *  Copyright notice
  *
- *  (c) 2008-2010 Michael Stucki (michael@typo3.org)
+ *  (c) 2008-2011 Michael Stucki (michael@typo3.org)
  *  All rights reserved
  *
  *  This script is part of the TYPO3 project. The TYPO3 project is
@@ -27,8 +27,6 @@
 /**
  * Class for providing locking features in TYPO3
  *
- * $Id$
- *
  * @author     Michael Stucki <michael@typo3.org>
  */
 
  * @see        class.t3lib_tstemplate.php, class.tslib_fe.php
  */
 class t3lib_lock {
+
+       /**
+        * @var string Locking method: One of 'simple', 'flock', 'semaphore' or 'disable'
+        */
        protected $method;
-       protected $id; // Identifier used for this lock
-       protected $resource; // Resource used for this lock (can be a file or a semaphore resource)
+
+       /**
+        * @var mixed Identifier used for this lock
+        */
+       protected $id;
+
+       /**
+        * @var mixed Resource used for this lock (can be a file or a semaphore resource)
+        */
+       protected $resource;
+
+       /**
+        * @var resource File pointer if using flock method
+        */
        protected $filepointer;
+
+       /**
+        * @var boolean True if lock is acquired
+        */
        protected $isAcquired = FALSE;
 
-       protected $loops = 150; // Number of times a locked resource is tried to be acquired. This is only used by manual locks like the "simple" method.
-       protected $step = 200; // Milliseconds after lock acquire is retried. $loops * $step results in the maximum delay of a lock. Only used by manual locks like the "simple" method.
+       /**
+        * @var integer Number of times a locked resource is tried to be acquired. Only used in manual locks method "simple".
+        */
+       protected $loops = 150;
+
+       /**
+        * @var integer Milliseconds after lock acquire is retried. $loops * $step results in the maximum delay of a lock. Only used in manual lock method "simple".
+        */
+       protected $step = 200;
+
+       /**
+        * @var string Logging facility
+        */
+       protected $syslogFacility = 'cms';
+
+       /**
+        * @var boolean True if locking should be logged
+        */
+       protected $isLoggingEnabled = TRUE;
 
 
        /**
         * Constructor:
         * initializes locking, check input parameters and set variables accordingly.
         *
-        * @param       string          ID to identify this lock in the system
-        * @param       string          Define which locking method to use. Defaults to "simple".
-        * @param       integer         Number of times a locked resource is tried to be acquired. This is only used by manual locks like the "simple" method.
-        * @param       integer         Milliseconds after lock acquire is retried. $loops * $step results in the maximum delay of a lock. Only used by manual locks like the "simple" method.
-        * @return      boolean         Returns true unless something went wrong
+        * @param string $id ID to identify this lock in the system
+        * @param string $method Define which locking method to use. Defaults to "simple".
+        * @param integer $loops Number of times a locked resource is tried to be acquired. Only used in manual locks method "simple".
+        * @param integer step Milliseconds after lock acquire is retried. $loops * $step results in the maximum delay of a lock. Only used in manual lock method "simple".
         */
-       public function __construct($id, $method = '', $loops = 0, $step = 0) {
+       public function __construct($id, $method = 'simple', $loops = 0, $step = 0) {
+                       // Force ID to be string
+               $id = (string) $id;
 
-                       // Input checks
-               $id = (string) $id; // Force ID to be string
                if (intval($loops)) {
                        $this->loops = intval($loops);
                }
@@ -77,14 +111,8 @@ class t3lib_lock {
                        $this->step = intval($step);
                }
 
-                       // Detect locking method
-               if (in_array($method, array('disable', 'simple', 'flock', 'semaphore'))) {
-                       $this->method = $method;
-               } else {
-                       throw new Exception('No such method "' . $method . '"');
-               }
+               $this->method = $method;
 
-               $success = FALSE;
                switch ($this->method) {
                        case 'simple':
                        case 'flock':
@@ -94,20 +122,24 @@ class t3lib_lock {
                                }
                                $this->id = md5($id);
                                $this->resource = $path . $this->id;
-                               $success = TRUE;
                        break;
                        case 'semaphore':
                                $this->id = abs(crc32($id));
-                               if (($this->resource = sem_get($this->id, 1)) == TRUE) {
-                                       $success = TRUE;
+                               if (($this->resource = sem_get($this->id, 1)) === FALSE) {
+                                       throw new Exception(
+                                               'Unable to get semaphore',
+                                               1313828196
+                                       );
                                }
                        break;
                        case 'disable':
-                               return FALSE;
                        break;
+                       default:
+                               throw new InvalidArgumentException(
+                                       'No such method "' . $method . '"',
+                                       1294586097
+                               );
                }
-
-               return $success;
        }
 
        /**
@@ -125,7 +157,7 @@ class t3lib_lock {
         *
         * It is important to know that the lock will be acquired in any case, even if the request was blocked first. Therefore, the lock needs to be released in every situation.
         *
-        * @return      boolean         Returns true if lock could be acquired without waiting, false otherwise.
+        * @return      boolean         Returns TRUE if lock could be acquired without waiting, FALSE otherwise.
         */
        public function acquire() {
                $noWait = TRUE; // Default is TRUE, which means continue without caring for other clients. In the case of TYPO3s cache management, this has no negative effect except some resource overhead.
@@ -157,12 +189,14 @@ class t3lib_lock {
                                }
 
                                if (!$isAcquired) {
-                                       throw new Exception('Lock file could not be created');
+                                       throw new RuntimeException('Lock file could not be created', 1294586098);
                                }
+
+                               t3lib_div::fixPermissions($this->resource);
                        break;
                        case 'flock':
                                if (($this->filepointer = fopen($this->resource, 'w+')) == FALSE) {
-                                       throw new Exception('Lock file could not be opened');
+                                       throw new RuntimeException('Lock file could not be opened', 1294586099);
                                }
 
                                if (flock($this->filepointer, LOCK_EX | LOCK_NB) == TRUE) { // Lock without blocking
@@ -170,7 +204,7 @@ class t3lib_lock {
                                } elseif (flock($this->filepointer, LOCK_EX) == TRUE) { // Lock with blocking (waiting for similar locks to become released)
                                        $noWait = FALSE;
                                } else {
-                                       throw new Exception('Could not lock file "' . $this->resource . '"');
+                                       throw new RuntimeException('Could not lock file "' . $this->resource . '"', 1294586100);
                                }
                        break;
                        case 'semaphore':
@@ -202,8 +236,10 @@ class t3lib_lock {
                $success = TRUE;
                switch ($this->method) {
                        case 'simple':
-                               if (unlink($this->resource) == FALSE) {
-                                       $success = FALSE;
+                               if (t3lib_div::isAllowedAbsPath($this->resource) && t3lib_div::isFirstPartOfStr($this->resource, PATH_site . 'typo3temp/locks/')) {
+                                       if (unlink($this->resource) == FALSE) {
+                                               $success = FALSE;
+                                       }
                                }
                        break;
                        case 'flock':
@@ -211,7 +247,9 @@ class t3lib_lock {
                                        $success = FALSE;
                                }
                                fclose($this->filepointer);
-                               unlink($this->resource);
+                               if (t3lib_div::isAllowedAbsPath($this->resource) && t3lib_div::isFirstPartOfStr($this->resource, PATH_site . 'typo3temp/locks/')) {
+                                       unlink($this->resource);
+                               }
                        break;
                        case 'semaphore':
                                if (@sem_release($this->resource)) {
@@ -267,6 +305,24 @@ class t3lib_lock {
        }
 
        /**
+        * Sets the facility (extension name) for the syslog entry.
+        *
+        * @param string $syslogFacility
+        */
+       public function setSyslogFacility($syslogFacility) {
+               $this->syslogFacility = $syslogFacility;
+       }
+
+       /**
+        * Enable/ disable logging
+        *
+        * @param boolean $isLoggingEnabled
+        */
+       public function setEnableLogging($isLoggingEnabled) {
+               $this->isLoggingEnabled = $isLoggingEnabled;
+       }
+
+       /**
         * Adds a common log entry for this locking API using t3lib_div::sysLog().
         * Example: 25-02-08 17:58 - cms: Locking [simple::0aeafd2a67a6bb8b9543fb9ea25ecbe2]: Acquired
         *
@@ -275,12 +331,14 @@ class t3lib_lock {
         * @return      void
         */
        public function sysLog($message, $severity = 0) {
-               t3lib_div::sysLog('Locking [' . $this->method . '::' . $this->id . ']: ' . trim($message), 'cms', $severity);
+               if ($this->isLoggingEnabled) {
+                       t3lib_div::sysLog('Locking [' . $this->method . '::' . $this->id . ']: ' . trim($message), $this->syslogFacility, $severity);
+               }
        }
 }
 
 
-if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_lock.php']) {
-       include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_lock.php']);
+if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_lock.php'])) {
+       include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_lock.php']);
 }
 ?>
\ No newline at end of file