/**
  * Handles request in order to authenticate.
  *
  * @param \AppserverIo\Psr\Servlet\Http\HttpServletRequestInterface  $servletRequest  The request instance
  * @param \AppserverIo\Psr\Servlet\Http\HttpServletResponseInterface $servletResponse The response instance
  *
  * @return boolean TRUE if the authentication has been successful, else FALSE
  *
  * @throws \Exception
  */
 public function handleRequest(HttpServletRequestInterface $servletRequest, HttpServletResponseInterface $servletResponse)
 {
     // iterate over all servlets and return the matching one
     /**
      * @var string $urlPattern
      * @var \AppserverIo\Http\Authentication\AuthenticationInterface $authenticationAdapter
      */
     foreach ($this->authenticationAdapters as $urlPattern => $authenticationAdapter) {
         // we'll match our URI against the URL pattern
         if (fnmatch($urlPattern, $servletRequest->getServletPath() . $servletRequest->getPathInfo())) {
             // the URI pattern matches, init the adapter and try to authenticate
             // check if auth header is not set in coming request headers
             if (!$servletRequest->hasHeader(Protocol::HEADER_AUTHORIZATION)) {
                 // send header for challenge authentication against client
                 $servletResponse->addHeader(HttpProtocol::HEADER_WWW_AUTHENTICATE, $authenticationAdapter->getAuthenticateHeader());
             }
             // initialize the adapter with the current request
             $authenticationAdapter->init($servletRequest->getHeader(HttpProtocol::HEADER_AUTHORIZATION), $servletRequest->getMethod());
             // try to authenticate the request
             $authenticated = $authenticationAdapter->authenticate();
             if (!$authenticated) {
                 // send header for challenge authentication against client
                 $servletResponse->addHeader(HttpProtocol::HEADER_WWW_AUTHENTICATE, $authenticationAdapter->getAuthenticateHeader());
             }
             return $authenticated;
         }
     }
     // we did not find an adapter for that URI pattern, no authentication required then
     return true;
 }
Exemplo n.º 2
0
 /**
  * Try to authenticate the user making this request, based on the specified login configuration.
  *
  * Return TRUE if any specified constraint has been satisfied, or FALSE if we have created a response
  * challenge already.
  *
  * @param \AppserverIo\Psr\Servlet\Http\HttpServletRequestInterface  $servletRequest  The servlet request instance
  * @param \AppserverIo\Psr\Servlet\Http\HttpServletResponseInterface $servletResponse The servlet response instance
  *
  * @return boolean TRUE if authentication has already been processed on a request before, else FALSE
  * @throws \AppserverIo\Http\Authentication\AuthenticationException Is thrown if the request can't be authenticated
  */
 public function authenticate(HttpServletRequestInterface $servletRequest, HttpServletResponseInterface $servletResponse)
 {
     // check if auth header is not set in coming request headers
     if ($servletRequest->hasHeader(Protocol::HEADER_AUTHORIZATION) === false) {
         // stop processing immediately
         $servletRequest->setDispatched(true);
         $servletResponse->setStatusCode(401);
         $servletResponse->addHeader(Protocol::HEADER_WWW_AUTHENTICATE, $this->getAuthenticateHeader());
         return false;
     }
     // load the raw login credentials
     $rawAuthData = $servletRequest->getHeader(Protocol::HEADER_AUTHORIZATION);
     // set auth hash got from auth data request header and check if username and password has been passed
     if (strstr($credentials = base64_decode(trim(strstr($rawAuthData, " "))), ':') === false) {
         // stop processing immediately
         $servletRequest->setDispatched(true);
         $servletResponse->setStatusCode(401);
         $servletResponse->addHeader(Protocol::HEADER_WWW_AUTHENTICATE, $this->getAuthenticateHeader());
         return false;
     }
     // get out username and password
     list($username, $password) = explode(':', $credentials);
     // query whether or not a username and a password has been passed
     if ($password === null || $username === null) {
         // stop processing immediately
         $servletRequest->setDispatched(true);
         $servletResponse->setStatusCode(401);
         $servletResponse->addHeader(Protocol::HEADER_WWW_AUTHENTICATE, $this->getAuthenticateHeader());
         return false;
     }
     // set username and password
     $this->username = new String($username);
     $this->password = new String($password);
     // load the realm to authenticate this request for
     /** @var AppserverIo\Appserver\ServletEngine\Security\RealmInterface $realm */
     $realm = $this->getAuthenticationManager()->getRealm($this->getRealmName());
     // authenticate the request and initialize the user principal
     $userPrincipal = $realm->authenticate($this->getUsername(), $this->getPassword());
     // query whether or not the realm returned an authenticated user principal
     if ($userPrincipal == null) {
         // stop processing immediately
         $servletRequest->setDispatched(true);
         $servletResponse->setStatusCode(401);
         $servletResponse->setBodyStream('Unauthorized');
         $servletResponse->addHeader(Protocol::HEADER_WWW_AUTHENTICATE, $this->getAuthenticateHeader());
         return false;
     }
     // add the user principal and the authentication type to the request
     $servletRequest->setUserPrincipal($userPrincipal);
     $servletRequest->setAuthType($this->getAuthType());
     return true;
 }
Exemplo n.º 3
0
 /**
  * Encodes the request using the configured encoding method, e. g. JSON.
  *
  * @param \AppserverIo\Psr\Servlet\Http\HttpServletRequestInterface  $servletRequest  The request instance
  * @param \AppserverIo\Psr\Servlet\Http\HttpServletResponseInterface $servletResponse The response instance
  *
  * @return void
  */
 public function encode(HttpServletRequestInterface $servletRequest, HttpServletResponseInterface $servletResponse)
 {
     // load the servlet response status code
     $statusCode = $servletResponse->getStatusCode();
     // load the result to be encoded, but only if we've NO redirect response (response code 300 - 399)
     if (($statusCode < 299 || $statusCode > 399) && ($result = $servletRequest->getAttribute(RequestKeys::RESULT))) {
         // encode the result with the configured encoder
         $viewData = $this->getEncodingHandler()->encode($result);
         // add the header for the content type and append the encoded content
         $servletResponse->addHeader(HttpProtocol::HEADER_CONTENT_TYPE, $viewData->getContentType());
         $servletResponse->appendBodyStream($viewData->getData());
     }
 }
Exemplo n.º 4
0
 /**
  * Forward's the request to the configured error page.
  *
  * @param \AppserverIo\Psr\Servlet\Http\HttpServletRequestInterface  $servletRequest  The servlet request instance
  * @param \AppserverIo\Psr\Servlet\Http\HttpServletResponseInterface $servletResponse The servlet response instance
  *
  * @return void
  */
 protected function forwardToErrorPage(HttpServletRequestInterface $servletRequest, HttpServletResponseInterface $servletResponse)
 {
     // query whether or not we've an error page configured
     if ($formLoginConfig = $this->getConfigData()->getFormLoginConfig()) {
         if ($formErrorPage = $formLoginConfig->getFormErrorPage()) {
             // initialize the location to redirect to
             $location = $formErrorPage->__toString();
             if ($baseModifier = $servletRequest->getBaseModifier()) {
                 $location = $baseModifier . $location;
             }
             // redirect to the configured error page
             $servletRequest->setDispatched(true);
             $servletResponse->setStatusCode(307);
             $servletResponse->addHeader(Protocol::HEADER_LOCATION, $location);
             return;
         }
     }
     // redirect to the default error page
     $servletRequest->setAttribute(RequestHandlerKeys::ERROR_MESSAGE, 'Please configure a form-error-page when using auth-method \'Form\' in the login-config of your application\'s web.xml');
     $servletRequest->setDispatched(true);
     $servletResponse->setStatusCode(500);
 }
Exemplo n.º 5
0
 /**
  * Tries to load the requested file and adds the content to the response.
  *
  * @param \AppserverIo\Psr\Servlet\Http\HttpServletRequestInterface  $servletRequest  The request instance
  * @param \AppserverIo\Psr\Servlet\Http\HttpServletResponseInterface $servletResponse The response instance
  *
  * @return void
  */
 public function doGet(HttpServletRequestInterface $servletRequest, HttpServletResponseInterface $servletResponse)
 {
     // load \Mage
     $this->load();
     // init globals
     $this->initGlobals($servletRequest);
     // run \Mage and set content
     $servletResponse->appendBodyStream($this->run($servletRequest));
     // add the status code we've caught from the legacy app
     $servletResponse->setStatusCode(appserver_get_http_response_code());
     // add this header to prevent .php request to be cached
     $servletResponse->addHeader(Protocol::HEADER_EXPIRES, '19 Nov 1981 08:52:00 GMT');
     $servletResponse->addHeader(Protocol::HEADER_CACHE_CONTROL, 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
     $servletResponse->addHeader(Protocol::HEADER_PRAGMA, 'no-cache');
     // set per default text/html mimetype
     $servletResponse->addHeader(Protocol::HEADER_CONTENT_TYPE, 'text/html');
     // grep headers and set to response object
     foreach (appserver_get_headers(true) as $i => $h) {
         // set headers defined in sapi headers
         $h = explode(':', $h, 2);
         if (isset($h[1])) {
             // load header key and value
             $key = trim($h[0]);
             $value = trim($h[1]);
             // if no status, add the header normally
             if ($key === Protocol::HEADER_STATUS) {
                 // set status by Status header value which is only used by fcgi sapi's normally
                 $servletResponse->setStatusCode($value);
             } elseif ($key === Protocol::HEADER_SET_COOKIE) {
                 $servletResponse->addHeader($key, $value, true);
             } else {
                 $servletResponse->addHeader($key, $value);
             }
         }
     }
 }
Exemplo n.º 6
0
 /**
  * Tries to load the requested thumbnail from the applications WEB-INF directory
  * and adds it to the response.
  *
  * @param \AppserverIo\Psr\Servlet\Http\HttpServletRequestInterface  $servletRequest  The request instance
  * @param \AppserverIo\Psr\Servlet\Http\HttpServletResponseInterface $servletResponse The response instance
  *
  * @return void
  * @see \AppserverIo\Psr\Servlet\Http\HttpServlet::doGet()
  *
  * @SWG\Get(
  *   path="/thumbnails.do/{id}",
  *   tags={"applications"},
  *   summary="The application's thumbnail",
  *   produces={"image/png"},
  *   @SWG\Parameter(
  *      name="id",
  *      in="path",
  *      description="The name of the application to load the thumbnail for",
  *      required=true,
  *      type="string"
  *   ),
  *   @SWG\Response(
  *     response=200,
  *     description="The application's thumbnail"
  *   ),
  *   @SWG\Response(
  *     response=500,
  *     description="Internal Server Error"
  *   )
  * )
  */
 public function doGet(HttpServletRequestInterface $servletRequest, HttpServletResponseInterface $servletResponse)
 {
     // load the requested path info, e. g. /api/thumbnails.do/example/
     $pathInfo = trim($servletRequest->getPathInfo(), '/');
     // extract the entity and the ID, if available
     list($id, ) = explode('/', $pathInfo);
     // load file information and return the file object if possible
     $fileInfo = new \SplFileInfo($path = $this->getApplicationProcessor()->thumbnail($id));
     if ($fileInfo->isDir()) {
         throw new FoundDirInsteadOfFileException(sprintf("Requested file %s is a directory", $path));
     }
     if ($fileInfo->isFile() === false) {
         throw new FileNotFoundException(sprintf('File %s not not found', $path));
     }
     if ($fileInfo->isReadable() === false) {
         throw new FileNotReadableException(sprintf('File %s is not readable', $path));
     }
     // open the file itself
     $file = $fileInfo->openFile();
     // set mimetypes to header
     $servletResponse->addHeader(HttpProtocol::HEADER_CONTENT_TYPE, MimeTypes::getMimeTypeByExtension(pathinfo($file->getFilename(), PATHINFO_EXTENSION)));
     // set last modified date from file
     $servletResponse->addHeader(HttpProtocol::HEADER_LAST_MODIFIED, gmdate('D, d M Y H:i:s \\G\\M\\T', $file->getMTime()));
     // set expires date
     $servletResponse->addHeader(HttpProtocol::HEADER_EXPIRES, gmdate('D, d M Y H:i:s \\G\\M\\T', time() + 3600));
     // check if If-Modified-Since header info is set
     if ($servletRequest->getHeader(HttpProtocol::HEADER_IF_MODIFIED_SINCE)) {
         // check if file is modified since header given header date
         if (strtotime($servletRequest->getHeader(HttpProtocol::HEADER_IF_MODIFIED_SINCE)) >= $file->getMTime()) {
             // send 304 Not Modified Header information without content
             $servletResponse->addHeader(HttpProtocol::HEADER_STATUS, 'HTTP/1.1 304 Not Modified');
             $servletResponse->appendBodyStream(PHP_EOL);
             return;
         }
     }
     // add the thumbnail as response content
     $servletResponse->appendBodyStream(file_get_contents($file->getRealPath()));
 }
 public function prepareResponse(HttpServletRequestInterface $servletRequest, HttpServletResponseInterface $servletResponse)
 {
     error_log("Now in " . __METHOD__ . " handling request " . $servletRequest->getUri());
     // load the session and persist the data from $_SESSION
     $session = $servletRequest->getSession();
     if ($session != null && isset($_SESSION)) {
         foreach ($_SESSION as $namespace => $data) {
             if ($namespace !== 'identifier') {
                 error_log("Now add data for session {$session->getId()} and namespace {$namespace}: " . PHP_EOL . var_export($data, true));
                 $session->putData($namespace, $data);
             }
         }
     }
     // add the status code we've caught from the legacy app
     $servletResponse->setStatusCode(appserver_get_http_response_code());
     // add this header to prevent .php request to be cached
     $servletResponse->addHeader(Protocol::HEADER_EXPIRES, '19 Nov 1981 08:52:00 GMT');
     $servletResponse->addHeader(Protocol::HEADER_CACHE_CONTROL, 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
     $servletResponse->addHeader(Protocol::HEADER_PRAGMA, 'no-cache');
     // set per default text/html mimetype
     $servletResponse->addHeader(Protocol::HEADER_CONTENT_TYPE, 'text/html');
     error_log("============= RESPONSE before appserver_get_headers(true) =================");
     error_log(var_export($servletResponse, true));
     // grep headers and set to response object
     foreach (appserver_get_headers(true) as $i => $h) {
         // set headers defined in sapi headers
         $h = explode(':', $h, 2);
         if (isset($h[1])) {
             // load header key and value
             $key = trim($h[0]);
             $value = trim($h[1]);
             // if no status, add the header normally
             if ($key === Protocol::HEADER_STATUS) {
                 // set status by Status header value which is only used by fcgi sapi's normally
                 $servletResponse->setStatus($value);
             } elseif ($key === Protocol::HEADER_SET_COOKIE) {
                 $servletResponse->addHeader($key, $value, true);
             } else {
                 $servletResponse->addHeader($key, $value);
             }
         }
     }
     error_log("============= RESPONSE after appserver_get_headers(true) =================");
     error_log(var_export($servletResponse, true));
 }