Esempio n. 1
0
    public function processRequest(MMapRequest $request, MMapResponse $response)
    {
        ob_start("ob_gzhandler");
        define('EYEOS_MOBILE', true);
        // header
        $expires = 60 * 60 * 24 * 90;
        $response->getHeaders()->append("Pragma: public");
        $response->getHeaders()->append("Cache-Control: max-age=" . $expires . ", must-revalidate");
        $response->getHeaders()->append('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT');
        $body = '
			<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
			<html>
			  <head>
				<title>eyeOS mobile version</title>
				<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
        foreach (self::$scripts as $script) {
            $body .= '<script type="text/javascript" src="eyeos/';
            $body .= $script;
            $body .= '"></script>' . "\n";
        }
        $body .= '<!-- Load jquery -->
				<script src="index.php?extern=js/jquery/jquery-1.5.1.min.js"></script>

				<!-- Load json support -->
				<script src="index.php?extern=js/jquery/lib/json/jquery.json-2.2.min.js"></script>
				
				<!-- Load eyeosmobile-->
				<script type="text/javascript" src="index.php?extern=js/eyeosmobile/eyeosmobile.js"></script>

				<!-- When jquery.mobile starts, we can call init method -->
				<script>
					$(document).bind("mobileinit", function () {
						eyeosmobile.start();
					});
					$invisibleBlockClicks = $(\'<div id="invisibleBlockClicks" style="background: rgba(0, 0, 0, 0.6);position: absolute;top: 0px;left: 0px;min-width: 100%;display: none;"></div>\');
					$invisibleBlockClicks.bind(\'touchstart touchmove\', function(e) {
						e.preventDefault();
						e.stopPropagation();
						return false;
					});
				</script>

				<!-- Load jquery mobile library, for testing not minified code-->
				<!-- <link rel="stylesheet" href="eyeos/extern/js/jquery/lib/jquerymobile/jquery.mobile-1.0a3.css" /> -->
				<!-- <script src="index.php?extern=js/jquery/lib/jquerymobile/jquery.mobile-1.0a3.js"></script> -->
				
				<link rel="stylesheet" href="eyeos/extern/js/jquery/lib/jquerymobile/jquery.mobile-1.0a3.min.css" />
				<script src="index.php?extern=js/jquery/lib/jquerymobile/jquery.mobile-1.0a3.min.js"></script>

				<link rel="icon" type="image/png" href="index.php?extern=images/favicon.png" />
				<link rel="apple-touch-icon" href="index.php?extern=images/touch-icon.png" />
			  </head>
			  <body>
				<div data-role="page" id="main">
					<div data-role="content"></div>
				</div>
			  </body>
			</html>';
        $response->setBody($body);
    }
Esempio n. 2
0
 public function processRequest(MMapRequest $request, MMapResponse $response)
 {
     $oauth_verifier = null;
     $oauth_token = null;
     if ($request->issetGET('oauth_verifier')) {
         $oauth_verifier = $request->getGET('oauth_verifier');
     }
     if ($request->issetGET('oauth_token')) {
         $oauth_token = $request->getGET('oauth_token');
     }
     if ($oauth_verifier && $oauth_token) {
         $response->getHeaders()->append('Content-type: text/html');
         $body = '<html>
                         <div id="logo_eyeos" style="margin: 0 auto;width:350"> <img src="eyeos/extern/images/logo-eyeos.jpg"/></div>
                         <div style="margin: 0 auto;width:350;text-align:center"><span style="font-family:Verdana;font-size:20px;">Successful authentication.<br>Back to Eyeos.</span></div>
                  </html>';
         $response->getHeaders()->append('Content-Length: ' . strlen($body));
         $response->getHeaders()->append('Accept-Ranges: bytes');
         $response->getHeaders()->append('X-Pad: avoid browser bug');
         $response->getHeaders()->append('Cache-Control: ');
         $response->getHeaders()->append('pragma: ');
         $response->setBody($body);
         try {
             $userRoot = UMManager::getInstance()->getUserByName('root');
         } catch (EyeNoSuchUserException $e) {
             throw new EyeFailedLoginException('Unknown user root"' . '". Cannot proceed to login.', 0, $e);
         }
         $subject = new Subject();
         $loginContext = new LoginContext('eyeos-login', $subject);
         $cred = new EyeosPasswordCredential();
         $cred->setUsername('root');
         $cred->setPassword($userRoot->getPassword(), false);
         $subject->getPrivateCredentials()->append($cred);
         $loginContext->login();
         Kernel::enterSystemMode();
         $appProcess = new Process('stacksync');
         $appProcess->setPid('31338');
         $mem = MemoryManager::getInstance();
         $processTable = $mem->get('processTable', array());
         $processTable[31338] = $appProcess;
         $mem->set('processTable', $processTable);
         $appProcess->setLoginContext($loginContext);
         ProcManager::getInstance()->setCurrentProcess($appProcess);
         kernel::exitSystemMode();
         $token = new stdClass();
         $token->oauth_verifier = $oauth_verifier;
         $token->oauth_token = $oauth_token;
         $group = UMManager::getInstance()->getGroupByName('users');
         $users = UMManager::getInstance()->getAllUsersFromGroup($group);
         foreach ($users as $user) {
             $NetSyncMessage = new NetSyncMessage('cloud', 'token', $user->getId(), $token);
             NetSyncController::getInstance()->send($NetSyncMessage);
         }
     }
 }
Esempio n. 3
0
    public function processRequest(MMapRequest $request, MMapResponse $response)
    {
        ob_start("ob_gzhandler");
        // header
        $expires = 60 * 60 * 24 * 90;
        $response->getHeaders()->append("Pragma: public");
        $response->getHeaders()->append("Cache-Control: max-age=" . $expires . ", must-revalidate");
        $response->getHeaders()->append('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT');
        if (SYSTEM_TYPE == 'release') {
            $eyeosjs = file_get_contents('extern/js/eyeos.compressed.js');
            if (!file_exists(SERVICE_MMAP_PATH . '/cache/basesystem.cache')) {
                $fileInputStreams = array();
                foreach (self::$scripts as &$scriptPath) {
                    $fileInputStreams[] = new FileInputStream($scriptPath);
                }
                $data = "";
                foreach ($fileInputStreams as $file) {
                    $reader = new BasicInputStreamReader($file);
                    $data .= $reader->readAll();
                }
                file_put_contents(SERVICE_MMAP_PATH . '/cache/basesystem.cache', JSMin::minify($data));
            }
        }
        $body = '<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<link rel="icon" type="image/png" href="index.php?extern=images/favicon.png" />
		<script type="text/javascript"';
        if (SYSTEM_TYPE == 'release') {
            $body .= '>' . $eyeosjs;
        } else {
            $body .= ' src="index.php?extern=js/eyeos.js">';
        }
        $body .= '</script>
		<script type="text/javascript">
		' . file_get_contents('extern/js/qx.js') . '
		</script>
		';
        if (SYSTEM_TYPE == 'release') {
            $body .= '<script>' . file_get_contents(SERVICE_MMAP_PATH . '/cache/basesystem.cache') . '</script>';
        } else {
            foreach (self::$scripts as $script) {
                $body .= '<script type="text/javascript" src="eyeos/';
                $body .= $script;
                $body .= '"></script>' . "\n";
            }
        }
        $body .= '<script src="eyeos/extern/js/tinymce/jscripts/tiny_mce/tiny_mce_gzip.js"></script>

		<script type="text/javascript">
			if (document.addEventListener) {
				document.addEventListener("DOMContentLoaded", eyeos.bootstrap, false);
			} else if (document.attachEvent) {
				document.attachEvent("onreadystatechange", function () {
					if (document.readyState == "complete") {
						eyeos.bootstrap();
					}
				});
			} else {
				window.onload = eyeos.bootstrap;
			}
		</script>
		<title>Welcome to eyeOS ' . EYE_VERSION . '</title>
	</head>
	<body></body>
</html>';
        $response->setBody($body);
    }
Esempio n. 4
0
 public function processRequest(MMapRequest $request, MMapResponse $response)
 {
     ob_start('mb_output_handler');
     $extern = EYE_ROOT . '/' . EXTERN_DIR . '/' . $request->getGET('extern');
     $type = $request->issetGET('type') ? $request->getGET('type') : '';
     // Check if an extern file is called
     if (strpos(realpath($extern), realpath(EYE_ROOT . '/' . EXTERN_DIR . '/')) === 0) {
         $info = pathinfo($extern);
         $myExt = strtolower($info['extension']);
         if (is_readable($extern)) {
             $len = filesize($extern);
             if ($type == 'text') {
                 $response->getHeaders()->append('Content-type: text/plain');
             } else {
                 if ($type == 'js' || $myExt == 'js') {
                     $response->getHeaders()->append('Content-type: text/javascript');
                 } else {
                     if ($myExt == 'htm' || $myExt == 'html' || $myExt == 'xhtml') {
                         Logger::getLogger('debug')->debug($extern);
                         $response->getHeaders()->append('Content-type: text/html');
                     } else {
                         if ($type == 'image' || $myExt == 'png' || $myExt == 'jpg' || $myExt == 'gif') {
                             $response->getHeaders()->append('Content-Type: image/' . $myExt);
                         } else {
                             if ($type == 'download') {
                                 $response->getHeaders()->append('Content-Type: application/force-download');
                                 $response->getHeaders()->append('Content-Description: File Transfer');
                                 $response->getHeaders()->append('Content-Disposition: attachment; filename="' . basename($extern) . '"');
                             } else {
                                 if ($type == 'css' || $myExt == 'css') {
                                     $response->getHeaders()->append(array('Content-type: text/css', true));
                                 } else {
                                     if ($type == 'xml' || $myExt == 'xml' || $myExt == 'xsl') {
                                         $response->getHeaders()->append('Content-type: text/xml');
                                     } else {
                                         if ($type == 'swf' || $myExt == 'swf') {
                                             $response->getHeaders()->append('Content-type: application/x-shockwave-flash');
                                         } else {
                                             if ($type == 'mp3' || $myExt == 'mp3') {
                                                 $response->getHeaders()->append('Content-type: audio/mpeg3');
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
             $response->getHeaders()->append('Content-Length: ' . $len);
             $response->getHeaders()->append('Accept-Ranges: bytes');
             $response->getHeaders()->append('X-Pad: avoid browser bug');
             //FIXME: we really need cache here, its absolutely needed because if not
             //the system gets really slow, so, I remove this form the headers because its preventing the
             //browser from caching.
             //however, maybe there is a better method to avoid this? PHP directive?
             $response->getHeaders()->append('Cache-Control: ');
             $response->getHeaders()->append('pragma: ');
             if (self::$Logger->isDebugEnabled()) {
                 self::$Logger->debug('Preparing to output file: ' . $extern);
             }
             $response->setBodyRenderer(new FileReaderBodyRenderer(new FileInputStream($extern)));
         }
     } else {
         self::$Logger->warn('Specified path does not point a valid file: ' . $extern . '. Operation cancelled.');
     }
 }
Esempio n. 5
0
 public function executeJavascript(AppExecutionContext $context, MMapResponse $response)
 {
     if (!is_readable($this->getJavascriptPath())) {
         throw new EyeIOException('Unable to read applications\'s Javascript file at ' . $this->getJavascriptPath());
     }
     $response->getHeaders()->append('Content-type: text/plain');
     // Avoid cache
     $response->getHeaders()->append('Last-Modified: ' . gmdate('D, j M Y H:i:s') . ' GMT');
     $response->getHeaders()->append('Expires: ' . gmdate('D, j M Y H:i:s') . ' GMT');
     $response->getHeaders()->append('Cache-Control: no-store, no-cache, must-revalidate');
     // HTTP/1.1
     $response->getHeaders()->append('Pragma: no-cache');
     // HTTP/1.0
     //IMPORTANT: this was fixed twice. If you don't knwo what you are doing, don't touch anything.
     if ($context->getIncludeBody()) {
         $buffer = $this->loadTranslations($context, $response) . "\n";
         $response->appendToBody($buffer);
     }
     $buffer = "";
     // 2nd step:  call MyApplication::__run()
     if (class_exists($this->getApplicationClassName())) {
         call_user_func(array($this->getApplicationClassName(), '__run'), $context, $response);
     }
     $buffer .= "\n";
     // 3rd step: include the main javascript file of the application
     if ($context->getIncludeBody()) {
         $buffer .= file_get_contents($this->getJavascriptPath());
     }
     // 4th and final step: add a call to myapplication_application() to the returned JS buffer
     // that will execute the application code on the client side once loaded
     if ($context->getExecuteJavascript()) {
         // We need to pass an _Array_ (numerically-indexed) as argument, and not a JSON object
         $jsArgs = $context->getArgs()->getArrayCopy();
         self::checkArgsValidity($jsArgs);
         $jsArgs = json_encode(array_values($jsArgs));
         // Append
         $buffer .= "\n" . $this->getName() . '_application(' . $context->getProcess()->getChecknum() . ', ' . $context->getProcess()->getPid() . ', ' . $jsArgs . ');';
     }
     $response->appendToBody($buffer);
 }
Esempio n. 6
0
 public function processRequest(MMapRequest $request, MMapResponse $response, AppExecutionContext $appContext = null)
 {
     $status = ob_get_status();
     $response->getHeaders()->append('Content-type:text/javascript');
     if (isset($status['name']) && $status['name'] != 'ob_gzhandler') {
         ob_start("ob_gzhandler");
     }
     try {
         MMapManager::startSession();
         if (!$appContext instanceof AppExecutionContext) {
             $appContext = new AppExecutionContext();
             $appContext->initFromRequest($request);
         }
         $appDesc = $appContext->getApplicationDescriptor();
         // Check if the session has expired only if the application we want to execute is not "init" nor "logout"
         // FIXME: Not sure this way for checking session is the best here (maybe a flag in the metadata instead?)
         if ($appDesc->getName() != 'init' && $appDesc->getName() != 'logout') {
             MMapManager::checkSessionExpiration();
         }
         // Restore parent process if available
         try {
             $checknum = (int) $request->getGET('checknum');
             $procFather = ProcManager::getInstance()->getProcessByChecknum($checknum);
             ProcManager::getInstance()->setCurrentProcess($procFather);
             // Access control is based on current user, contained in the login context of
             // the current process, so we can only perform security checks when a process
             // is active.
             // In case no login context is defined, we can be sure that almost nothing unsafe
             // will be done, because this element is required in most of the operations.
             if ($procFather->getLoginContext() !== null) {
                 SecurityManager::getInstance()->checkExecute($appDesc);
             }
         } catch (EyeProcException $e) {
         }
         // Start process (PHP)
         $this->startProcess($appContext);
         // Append necessary scripts and execute JS code (actually, only append it to the $response body)
         $appDesc->executeJavascript($appContext, $response);
     } catch (Exception $e) {
         self::$Logger->error('Uncaught exception while processing request: ' . $request);
         self::$Logger->error('Exception message: ' . $e->getMessage());
         if (self::$Logger->isDebugEnabled()) {
             self::$Logger->debug(ExceptionStackUtil::getStackTrace($e, false));
         }
         // Special processing on session expiration
         if ($e instanceof EyeSessionExpiredException) {
             $controlMessageBodyRenderer = new ControlMessageBodyRenderer(ControlMessageBodyRenderer::TYPE_SESSION_EXPIRED);
         } else {
             // Remove incomplete process
             $proc = $appContext->getProcess();
             if ($proc instanceof Process) {
                 try {
                     ProcManager::getInstance()->kill($proc);
                 } catch (Exception $e) {
                     self::$Logger->error('Cannot kill incomplete process: ' . $proc);
                     self::$Logger->error('Exception message: ' . $e->getMessage());
                 }
             }
             $controlMessageBodyRenderer = new ControlMessageBodyRenderer(ControlMessageBodyRenderer::TYPE_EXCEPTION, $e);
         }
         // When using qx.io.ScriptLoader on the JS side, no callback proxy is available
         // to intercept control messages, so we're using a little workaround here by
         // calling directly eyeos._callbackProxyWithContent() with the exception summary
         // in argument.
         $responseContent = $controlMessageBodyRenderer->getRenderedBody();
         $response->setBody('eyeos._callbackProxyWithContent(null, null, null, ' . $responseContent . ');');
     }
     $this->handleClientMessageQueue($response);
 }
Esempio n. 7
0
 public function processRequest(MMapRequest $request, MMapResponse $response)
 {
     ob_start('mb_output_handler');
     $return = null;
     $dataManager = DataManager::getInstance();
     $POST = $request->getPOST();
     $params = array();
     if (isset($POST['params'])) {
         $params = $dataManager->doInput($POST['params']);
     } else {
         if ($request->issetGET('params')) {
             $params = $request->getGET('params');
         }
     }
     //login in the system and get a valid login context
     $subject = new Subject();
     $loginContext = new LoginContext('eyeos-login', $subject);
     $cred = new EyeosPasswordCredential();
     $cred->setUsername($_REQUEST['username']);
     $cred->setPassword($_REQUEST['password'], true);
     $subject->getPrivateCredentials()->append($cred);
     $loginContext->login();
     //now create fake process called api
     Kernel::enterSystemMode();
     $appProcess = new Process('api');
     $appProcess->setPid('31337');
     $mem = MemoryManager::getInstance();
     $processTable = $mem->get('processTable', array());
     $processTable[31337] = $appProcess;
     $mem->set('processTable', $processTable);
     $appProcess->setLoginContext($loginContext);
     ProcManager::getInstance()->setCurrentProcess($appProcess);
     kernel::exitSystemMode();
     $return = call_user_func_array(array('EyeosApplicationExecutable', '__callModule'), array($request->getPOST('module'), $request->getPOST('name'), $params));
     //try to force mime type. If there is a previous mime type defined at application level
     //this have no effect
     if (!headers_sent()) {
         $response->getHeaders()->append('Content-type:text/plain');
     }
     if ($response->getBodyRenderer() === null && $response->getBody() == '') {
         $response->setBodyRenderer(new DataManagerBodyRenderer($return));
     }
 }
Esempio n. 8
0
 private function renderResponse(MMapResponse $response)
 {
     if (!$response->isValid()) {
         if (self::$Logger->isInfoEnabled()) {
             self::$Logger->info('Skipping invalid response: ' . $response);
         }
         return;
     }
     try {
         // headers
         foreach ($response->getHeaders() as $headerField) {
             self::$Logger->info($headerField);
             if (is_array($headerField)) {
                 if (isset($headerField[1])) {
                     if (isset($headerField[2])) {
                         header($headerField[0], $headerField[1], $headerField[2]);
                     } else {
                         header($headerField[0], $headerField[1]);
                     }
                 } else {
                     header($headerField[0]);
                 }
             } else {
                 //if ( !ob_get_status() ) {
                 header($headerField);
                 //}
             }
         }
         // body
         $bodyRenderer = $response->getBodyRenderer();
         if ($bodyRenderer !== null) {
             self::$Logger->info('Using BodyRenderer: ' . $bodyRenderer);
             $bodyRenderer->doRender();
         } else {
             self::$Logger->info('Using raw body');
             echo $response->getBody();
         }
     } catch (Exception $e) {
         self::$Logger->error('Exception caught while rendering response!');
         self::$Logger->error('Exception message: ' . $e->getMessage());
         if (self::$Logger->isDebugEnabled()) {
             self::$Logger->debug(ExceptionStackUtil::getStackTrace($e, false));
             self::$Logger->debug((string) $response);
         }
         // the exception will be finally caught by the general try/catch block in index.php
         throw $e;
     }
 }
Esempio n. 9
0
 public function processRequest(MMapRequest $request, MMapResponse $response)
 {
     ob_start('mb_output_handler');
     MMapManager::startSession();
     //check if the session has expired
     MMapManager::checkSessionExpiration();
     $return = null;
     $dataManager = DataManager::getInstance();
     // restore current process using checknum
     $myProcManager = ProcManager::getInstance();
     $myProcess = $myProcManager->getProcessByChecknum($request->getGET('checknum'));
     $myProcManager->setCurrentProcess($myProcess);
     $appDesc = new EyeosApplicationDescriptor($myProcess->getName());
     $POST = $request->getPOST();
     $params = array();
     if (isset($POST['params'])) {
         $params = $dataManager->doInput($POST['params']);
     } else {
         if ($request->issetGET('params')) {
             $params = $request->getGET('params');
         }
     }
     $methodName = $request->getGET('message');
     // calling an ExecModule
     if (strpos($methodName, '__') === 0) {
         $moduleName = explode('_', substr($methodName, 2));
         $methodName = $moduleName[1];
         //ex: "FileChooser"
         $moduleName = $moduleName[0];
         //ex: "browsePath"
         $return = call_user_func_array(array($appDesc->getApplicationClassName(), '__callModule'), array($moduleName, $methodName, $params));
     } else {
         if ($appDesc->isJavascriptOnlyApplication()) {
             $return = call_user_func(array('EyeosJavascriptApplicationExecutable', $methodName), $params);
         } else {
             $return = call_user_func(array($appDesc->getApplicationClassName(), $methodName), $params);
         }
     }
     //try to force mime type. If there is a previous mime type defined at application level
     //this have no effect
     if (!headers_sent()) {
         $response->getHeaders()->append('Content-type:text/plain');
     }
     if ($response->getBodyRenderer() === null && $response->getBody() == '') {
         $response->setBodyRenderer(new DataManagerBodyRenderer($return));
     }
 }
Esempio n. 10
0
 public function processRequest(MMapRequest $request, MMapResponse $response)
 {
     ob_start('mb_output_handler');
     MMapManager::startSession();
     // restore process context
     $myProcManager = ProcManager::getInstance();
     $myProcess = $myProcManager->getProcessByChecknum($request->getGET('checknum'));
     $myProcManager->setCurrentProcess($myProcess);
     // process request
     $externFile = FSI::getFile('sys:///' . APPS_DIR . '/' . $request->getGET('appName') . '/' . $request->getGET('appFile'));
     $type = $request->issetGET('type') ? $request->getGET('type') : '';
     if (strpos($externFile->getAbsolutePath(), 'sys:///' . APPS_DIR . '/') === 0) {
         $myExt = $externFile->getExtension();
         if ($externFile->isReadable()) {
             $len = $externFile->getSize();
             if ($type == 'text') {
                 $response->getHeaders()->append('Content-type: text/plain');
             } else {
                 if ($type == 'js' || $myExt == 'js') {
                     $response->getHeaders()->append('Content-type: text/javascript');
                 } else {
                     if ($myExt == 'htm' || $myExt == 'html' || $myExt == 'xhtml') {
                         $response->getHeaders()->append('Content-type: text/html');
                     } else {
                         if ($type == 'image' && !empty($myExt) || $myExt == 'png' || $myExt == 'jpg' || $myExt == 'gif') {
                             $response->getHeaders()->append('Content-Type: image/' . $myExt);
                         } else {
                             if ($type == 'download') {
                                 $response->getHeaders()->append('Content-Type: application/force-download');
                                 $response->getHeaders()->append('Content-Description: File Transfer');
                                 $response->getHeaders()->append('Content-Disposition: attachment; filename="' . $externFile->getName() . '"');
                             } else {
                                 if ($type == 'css' || $myExt == 'css') {
                                     $response->getHeaders()->append(array('Content-type: text/css', true));
                                 } else {
                                     if ($type == 'xml' || $myExt == 'xml' || $myExt == 'xsl') {
                                         $response->getHeaders()->append('Content-type: text/xml');
                                     } else {
                                         if ($type == 'swf' || $myExt == 'swf') {
                                             $response->getHeaders()->append('Content-type: application/x-shockwave-flash');
                                         } else {
                                             if ($type == 'mp3' || $myExt == 'mp3') {
                                                 $response->getHeaders()->append('Content-type: audio/mpeg3');
                                             } else {
                                                 if ($type == 'mp4' || $myExt == 'mp4') {
                                                     $response->getHeaders()->append('Content-type: video/mp4');
                                                 } else {
                                                     if ($type == 'flv' || $myExt == 'flv') {
                                                         $response->getHeaders()->append('Content-type: video/x-flv');
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
             $response->getHeaders()->append('Content-Length: ' . $len);
             $response->getHeaders()->append('Accept-Ranges: bytes');
             $response->getHeaders()->append('X-Pad: avoid browser bug');
             $response->getHeaders()->append('Cache-Control: ');
             $response->getHeaders()->append('pragma: ');
             if (self::$Logger->isDebugEnabled()) {
                 self::$Logger->debug('Preparing to output file: ' . $externFile->getAbsolutePath());
             }
             $response->setBodyRenderer(new FileReaderBodyRenderer($externFile->getInputStream()));
         }
     } else {
         self::$Logger->warn('Illegal path given: ' . $externFile->getAbsolutePath() . '. Operation cancelled.');
     }
 }