/**
  * Initializes the manager
  *
  * @return void
  * @author Robert Lemke <*****@*****.**>
  */
 public function initializeObject()
 {
     $this->lockPathAndFilename = $this->environment->getPathToTemporaryDirectory() . 'FLOW3.lock';
     if (file_exists($this->lockPathAndFilename)) {
         if (filemtime($this->lockPathAndFilename) < time() - self::LOCKFILE_MAXIMUM_AGE) {
             unlink($this->lockPathAndFilename);
         } else {
             $this->siteLocked = TRUE;
         }
     }
 }
 /**
  * Initializes the identifier prefix when setting the cache.
  *
  * @param \F3\FLOW3\Cache\Frontend\FrontendInterface $cache
  * @return void
  * @author Robert Lemke <*****@*****.**>
  */
 public function setCache(\F3\FLOW3\Cache\Frontend\FrontendInterface $cache)
 {
     parent::setCache($cache);
     $processUser = extension_loaded('posix') ? posix_getpwuid(posix_geteuid()) : array('name' => 'default');
     $pathHash = substr(md5(FLOW3_PATH_WEB . $this->environment->getSAPIName() . $processUser['name'] . $this->context), 0, 12);
     $this->identifierPrefix = 'FLOW3_' . $pathHash;
 }
 /**
  * Takes the raw request data and - depending on the request method
  * maps them into the request object. Afterwards all mapped arguments
  * can be retrieved by the getArgument(s) method, no matter if they
  * have been GET, POST or PUT arguments before.
  *
  * @param \F3\FLOW3\MVC\Web\Request $request The web request which will contain the arguments
  * @return void
  * @author Robert Lemke <*****@*****.**>
  */
 protected function setArgumentsFromRawRequestData(\F3\FLOW3\MVC\Web\Request $request)
 {
     foreach ($request->getRequestUri()->getArguments() as $argumentName => $argumentValue) {
         $request->setArgument($argumentName, $argumentValue);
     }
     switch ($request->getMethod()) {
         case 'POST':
             foreach ($this->environment->getRawPostArguments() as $argumentName => $argumentValue) {
                 $request->setArgument($argumentName, $argumentValue);
             }
             foreach ($this->environment->getUploadedFiles() as $argumentName => $argumentValue) {
                 if ($request->hasArgument($argumentName)) {
                     $existingArgumentValue = $request->getArgument($argumentName);
                     if (is_array($existingArgumentValue)) {
                         $request->setArgument($argumentName, \F3\FLOW3\Utility\Arrays::arrayMergeRecursiveOverrule($existingArgumentValue, $argumentValue));
                     }
                 } else {
                     $request->setArgument($argumentName, $argumentValue);
                 }
             }
             break;
             #			case 'PUT' :
             #				$putArguments = array();
             #				parse_str(file_get_contents("php://input"), $putArguments);
             #				foreach ($putArguments as $argumentName => $argumentValue) {
             #					$request->setArgument($argumentName, $argumentValue);
             #				}
             #			break;
     }
 }
 /**
  * Saves data in a cache file.
  *
  * @param string $entryIdentifier An identifier for this specific cache entry
  * @param string $data The data to be stored
  * @param array $tags Tags to associate with this cache entry
  * @param integer $lifetime Lifetime of this cache entry in seconds. If NULL is specified, the default lifetime is used. "0" means unlimited lifetime.
  * @return void
  * @throws \F3\FLOW3\Cache\Exception if the directory does not exist or is not writable or exceeds the maximum allowed path length, or if no cache frontend has been set.
  * @author Robert Lemke <*****@*****.**>
  * @api
  */
 public function set($entryIdentifier, $data, array $tags = array(), $lifetime = NULL)
 {
     if (!$this->cache instanceof \F3\FLOW3\Cache\Frontend\FrontendInterface) {
         throw new \F3\FLOW3\Cache\Exception('No cache frontend has been set yet via setCache().', 1204111375);
     }
     if (!is_string($data)) {
         throw new \F3\FLOW3\Cache\Exception\InvalidDataException('The specified data is of type "' . gettype($data) . '" but a string is expected.', 1204481674);
     }
     $this->remove($entryIdentifier);
     $temporaryCacheEntryPathAndFilename = $this->cacheDirectory . uniqid() . '.temp';
     if (strlen($temporaryCacheEntryPathAndFilename) > $this->environment->getMaximumPathLength()) {
         throw new \F3\FLOW3\Cache\Exception('The length of the temporary cache file path "' . $temporaryCacheEntryPathAndFilename . '" is ' . strlen($temporaryCacheEntryPathAndFilename) . ' characters long and exceeds the maximum path length of ' . $this->environment->getMaximumPathLength() . '. Please consider setting the temporaryDirectoryBase option to a shorter path. ', 1248710426);
     }
     $expiryTime = $lifetime === NULL ? 0 : time() + $lifetime;
     $metaData = str_pad($expiryTime, self::EXPIRYTIME_LENGTH) . implode(' ', $tags) . str_pad(strlen($data), self::DATASIZE_DIGITS);
     $result = file_put_contents($temporaryCacheEntryPathAndFilename, $data . $metaData);
     if ($result === FALSE) {
         throw new \F3\FLOW3\Cache\Exception('The temporary cache file "' . $temporaryCacheEntryPathAndFilename . '" could not be written.', 1204026251);
     }
     $i = 0;
     $cacheEntryPathAndFilename = $this->cacheDirectory . $entryIdentifier;
     while (!rename($temporaryCacheEntryPathAndFilename, $cacheEntryPathAndFilename) && $i < 5) {
         $i++;
     }
     if ($result === FALSE) {
         throw new \F3\FLOW3\Cache\Exception('The cache file "' . $cacheEntryPathAndFilename . '" could not be written.', 1222361632);
     }
     $this->systemLogger->log(sprintf('Cache %s: set entry "%s".', $this->cacheIdentifier, $entryIdentifier), LOG_DEBUG);
 }
 /**
  * Builds a CLI request object from the raw command call
  *
  * @return \F3\FLOW3\MVC\CLI\Request The CLI request as an object
  * @author Karsten Dambekalns <*****@*****.**>
  * @author Robert Lemke <*****@*****.**>
  * @author Andreas Förthner <*****@*****.**>
  */
 public function build()
 {
     $request = $this->objectFactory->create('F3\\FLOW3\\MVC\\CLI\\Request');
     if ($this->environment->getCommandLineArgumentCount() < 2) {
         $request->setControllerPackageKey('FLOW3');
         $request->setControllerSubpackageKey('MVC');
         $request->setControllerName('Standard');
         return $request;
     }
     $rawCommandLineArguments = $this->environment->getCommandLineArguments();
     array_shift($rawCommandLineArguments);
     $commandLineArguments = $this->parseRawCommandLineArguments($rawCommandLineArguments);
     $this->setControllerOptions($request, $commandLineArguments['command']);
     $request->setArguments($commandLineArguments['options']);
     $request->setCommandLineArguments($commandLineArguments['arguments']);
     return $request;
 }
 /**
  * Updates the username and password credentials from the POST vars, if the POST parameters
  * are available. Sets the authentication status to REAUTHENTICATION_NEEDED, if credentials have been sent.
  *
  * @return void
  * @author Andreas Förthner <*****@*****.**>
  */
 public function updateCredentials()
 {
     $postArguments = $this->environment->getRawPostArguments();
     if (isset($postArguments['F3\\FLOW3\\Security\\Authentication\\Token\\UsernamePassword::username']) && isset($postArguments['F3\\FLOW3\\Security\\Authentication\\Token\\UsernamePassword::password'])) {
         $this->credentials['username'] = $postArguments['F3\\FLOW3\\Security\\Authentication\\Token\\UsernamePassword::username'];
         $this->credentials['password'] = $postArguments['F3\\FLOW3\\Security\\Authentication\\Token\\UsernamePassword::password'];
         $this->setAuthenticationStatus(self::AUTHENTICATION_NEEDED);
     }
 }
 /**
  * Tries to detect the base URI of this request and returns it.
  *
  * @param \F3\FLOW3\Property\DataType\Uri $requestUri URI of this web request
  * @return \F3\FLOW3\Property\DataType\Uri The detected base URI
  * @author Robert Lemke <*****@*****.**>
  */
 protected function detectBaseUri(\F3\FLOW3\Property\DataType\Uri $requestUri)
 {
     $baseUri = clone $requestUri;
     $baseUri->setQuery(NULL);
     $baseUri->setFragment(NULL);
     $requestPathSegments = explode('/', $this->environment->getScriptRequestPathAndName());
     array_pop($requestPathSegments);
     $baseUri->setPath(implode('/', $requestPathSegments) . '/');
     return $baseUri;
 }
 /**
  * Detects the (resources) base URI and stores it as a protected
  * class variable.
  *
  * This functionality somewhat duplicates the detection used in the Web
  * Request Builder but for the time being this should be good enough.
  *
  * $this->resourcesPublishingPath must be set prior to calling this method.
  *
  * @return void
  * @author Robert Lemke <*****@*****.**>
  */
 protected function detectResourcesBaseUri()
 {
     $uri = $this->environment->getRequestUri();
     if ($uri === FALSE) {
         return;
     }
     $uri->setQuery(NULL);
     $uri->setFragment(NULL);
     $requestPathSegments = explode('/', $this->environment->getScriptRequestPathAndName());
     array_pop($requestPathSegments);
     $uri->setPath(implode('/', $requestPathSegments) . '/');
     $this->resourcesBaseUri = $uri . substr($this->resourcesPublishingPath, strlen(FLOW3_PATH_WEB));
 }
 /**
  * Starts the session, if is has not been already started
  *
  * @return void
  * @author Andreas Förthner <*****@*****.**>
  */
 public function start()
 {
     if ($this->started === FALSE) {
         if (empty($this->settings['PHPSession']['savePath'])) {
             $sessionsPath = \F3\FLOW3\Utility\Files::concatenatePaths(array($this->environment->getPathToTemporaryDirectory(), 'Sessions'));
         } else {
             $sessionsPath = $this->settings['PHPSession']['savePath'];
         }
         if (!file_exists($sessionsPath)) {
             mkdir($sessionsPath);
         }
         session_save_path($sessionsPath);
         session_start();
         $this->sessionId = session_id();
         $this->started = TRUE;
     }
 }
 /**
  * @test
  * @author Bastian Waidelich <*****@*****.**>
  */
 public function buildSetsPOSTArgumentsFromRequest()
 {
     $this->setUpRequestBuilder();
     $argument = NULL;
     $setArgumentCallback = function () use(&$argument) {
         $args = func_get_args();
         if ($args[0] === 'someArgument') {
             $argument = $args[1];
         }
     };
     $this->mockRequest->expects($this->any())->method('getMethod')->will($this->returnValue('POST'));
     $this->mockEnvironment->expects($this->any())->method('getRawPostArguments')->will($this->returnValue(array('someArgument' => 'POSTArgument')));
     $this->mockEnvironment->expects($this->any())->method('getUploadedFiles')->will($this->returnValue(array()));
     $this->mockRequest->expects($this->exactly(2))->method('setArgument')->will($this->returnCallback($setArgumentCallback));
     $this->builder->build();
     $this->assertEquals('POSTArgument', $argument);
 }
 /**
  * Imports a resource (file) from the given location as a persistent resource.
  * On a successful import this method returns a Resource object representing the
  * newly imported persistent resource.
  *
  * @param string $uri An URI (can also be a path and filename) pointing to the resource to import
  * @return mixed A resource object representing the imported resource or FALSE if an error occurred.
  * @author Robert Lemke <*****@*****.**>
  * @api
  */
 public function importResource($uri)
 {
     $pathInfo = pathinfo($uri);
     if (!isset($pathInfo['extension']) || substr(strtolower($pathInfo['extension']), -3, 3) === 'php') {
         return FALSE;
     }
     $temporaryTargetPathAndFilename = $this->environment->getPathToTemporaryDirectory() . uniqid('FLOW3_ResourceImport_');
     if (copy($uri, $temporaryTargetPathAndFilename) === FALSE) {
         return FALSE;
     }
     $hash = sha1_file($temporaryTargetPathAndFilename);
     $finalTargetPathAndFilename = $this->persistentResourcesStorageBaseUri . $hash;
     if (rename($temporaryTargetPathAndFilename, $finalTargetPathAndFilename) === FALSE) {
         unlink($temporaryTargetPathAndFilename);
         return FALSE;
     }
     return $this->objectFactory->create('F3\\FLOW3\\Resource\\Resource', $hash, $pathInfo['extension']);
 }
    /**
     * Saves the current configuration into a cache file and creates a cache inclusion script
     * in the context's Configuration directory.
     *
     * @return void
     * @author Robert Lemke <*****@*****.**>
     */
    protected function saveConfigurationCache()
    {
        $configurationCachePath = $this->environment->getPathToTemporaryDirectory() . 'Configuration/';
        if (!file_exists($configurationCachePath)) {
            \F3\FLOW3\Utility\Files::createDirectoryRecursively($configurationCachePath);
        }
        $cachePathAndFilename = $configurationCachePath . $this->context . 'Configurations.php';
        $currentRevision = \F3\FLOW3\Core\Bootstrap::REVISION;
        $includeCachedConfigurationsCode = <<<EOD
<?php
\tif (file_exists('{$cachePathAndFilename}') && \\F3\\FLOW3\\Core\\Bootstrap::REVISION === '{$currentRevision}') {
\t\treturn require '{$cachePathAndFilename}';
\t} else {
\t\tunlink(__FILE__);
\t\treturn array();
\t}
?>
EOD;
        file_put_contents($cachePathAndFilename, '<?php return ' . var_export($this->configurations, TRUE) . '?>');
        file_put_contents($this->includeCachedConfigurationsPathAndFilename, $includeCachedConfigurationsCode);
    }
 /**
  * Builds the URI
  *
  * @return string The URI
  * @api
  * @author Bastian Waidelich <*****@*****.**>
  */
 public function build()
 {
     $arguments = array();
     if ($this->addQueryString === TRUE) {
         $arguments = $this->request->getArguments();
         foreach ($this->argumentsToBeExcludedFromQueryString as $argumentToBeExcluded) {
             unset($arguments[$argumentToBeExcluded]);
         }
     }
     $arguments = \F3\FLOW3\Utility\Arrays::arrayMergeRecursiveOverrule($arguments, $this->arguments);
     $uri = $this->router->resolve($arguments);
     $this->lastArguments = $arguments;
     if ($this->section !== '') {
         $uri .= '#' . $this->section;
     }
     if (!$this->environment->isRewriteEnabled()) {
         $uri = 'index.php/' . $uri;
     }
     if ($this->createAbsoluteUri === TRUE) {
         $uri = $this->request->getBaseUri() . $uri;
     }
     return $uri;
 }
 /**
  * Initializes the identifier prefix when setting the cache.
  *
  * @param \F3\FLOW3\Cache\Frontend\FrontendInterface $cache
  * @return void
  * @author Karsten Dambekalns <*****@*****.**>
  */
 public function setCache(\F3\FLOW3\Cache\Frontend\FrontendInterface $cache)
 {
     parent::setCache($cache);
     $this->identifierPrefix = 'FLOW3_' . md5($cache->getIdentifier() . $this->environment->getScriptPathAndFilename() . $this->environment->getSAPIName()) . '_';
 }
 /**
  * This request handler can handle any web request.
  *
  * @return boolean If the request is a web request, TRUE otherwise FALSE
  * @author Robert Lemke <*****@*****.**>
  */
 public function canHandleRequest()
 {
     return $this->utilityEnvironment->getRequestMethod() !== NULL;
 }