/**
  * @param \Kdyby\Translation\Translator $translator
  * @return string|NULL
  */
 public function resolve(Kdyby\Translation\Translator $translator)
 {
     if ($this->request === NULL) {
         return NULL;
     }
     $params = $this->request->getParameters();
     return !empty($params['locale']) ? $params['locale'] : NULL;
 }
Пример #2
0
 /**
  * @param \Nette\Application\Application $application
  * @param \Nette\Application\Request $request
  */
 public function __invoke(Application $application, Request $request)
 {
     if (PHP_SAPI === 'cli') {
         newrelic_background_job(TRUE);
     }
     $params = $request->getParameters();
     $action = $request->getPresenterName();
     if (isset($params[$this->actionKey])) {
         $action = sprintf('%s:%s', $action, $params[$this->actionKey]);
     }
     if (!empty($this->map)) {
         foreach ($this->map as $pattern => $appName) {
             if ($pattern === '*') {
                 continue;
             }
             if (Strings::endsWith($pattern, '*')) {
                 $pattern = Strings::substring($pattern, 0, -1);
             }
             if (Strings::startsWith($pattern, ':')) {
                 $pattern = Strings::substring($pattern, 1);
             }
             if (Strings::startsWith($action, $pattern)) {
                 \VrtakCZ\NewRelic\Tracy\Bootstrap::setup($appName, $this->license);
                 break;
             }
         }
     }
     newrelic_name_transaction($action);
     newrelic_disable_autorum();
 }
Пример #3
0
 /**
  * Constructs absolute URL from Request object.
  * @return string|NULL
  */
 public function constructUrl(Application\Request $appRequest, Nette\Http\Url $refUrl)
 {
     if ($this->flags & self::ONE_WAY) {
         return NULL;
     }
     $params = $appRequest->getParameters();
     // presenter name
     $presenter = $appRequest->getPresenterName();
     if (strncmp($presenter, $this->module, strlen($this->module)) === 0) {
         $params[self::PRESENTER_KEY] = substr($presenter, strlen($this->module));
     } else {
         return NULL;
     }
     // remove default values; NULL values are retain
     foreach ($this->defaults as $key => $value) {
         if (isset($params[$key]) && $params[$key] == $value) {
             // intentionally ==
             unset($params[$key]);
         }
     }
     $url = ($this->flags & self::SECURED ? 'https://' : 'http://') . $refUrl->getAuthority() . $refUrl->getPath();
     $sep = ini_get('arg_separator.input');
     $query = http_build_query($params, '', $sep ? $sep[0] : '&');
     if ($query != '') {
         // intentionally ==
         $url .= '?' . $query;
     }
     return $url;
 }
Пример #4
0
 public function constructUrl(Request $appRequest, Url $refUrl)
 {
     // Module prefix not match.
     if ($this->module && !Strings::startsWith($appRequest->getPresenterName(), $this->module)) {
         return null;
     }
     $params = $appRequest->getParameters();
     $urlStack = [];
     // Module prefix
     $moduleFrags = explode(":", Strings::lower($appRequest->getPresenterName()));
     $resourceName = array_pop($moduleFrags);
     $urlStack += $moduleFrags;
     // Resource
     $urlStack[] = Strings::lower($resourceName);
     // Id
     if (isset($params['id']) && is_scalar($params['id'])) {
         $urlStack[] = $params['id'];
         unset($params['id']);
     }
     // Set custom action
     if (isset($params['action']) && $this->_isApiAction($params['action'])) {
         unset($params['action']);
     }
     $url = $refUrl->getBaseUrl() . implode('/', $urlStack);
     // Add query parameters
     if (!empty($params)) {
         $url .= "?" . http_build_query($params);
     }
     return $url;
 }
Пример #5
0
 /**
  * Template factory.
  * @param  string
  * @param  callable
  * @return Nette\Templating\ITemplate
  */
 public function createTemplate($class = NULL, $latteFactory = NULL)
 {
     $template = $class ? new $class() : new Nette\Templating\FileTemplate();
     $template->setParameters($this->request->getParameters());
     $template->presenter = $this;
     $template->context = $context = $this->context;
     $url = $context->getByType('Nette\\Http\\IRequest')->getUrl();
     $template->baseUrl = rtrim($url->getBaseUrl(), '/');
     $template->basePath = rtrim($url->getBasePath(), '/');
     $template->registerHelperLoader('Nette\\Templating\\Helpers::loader');
     $template->setCacheStorage($context->getService('nette.templateCacheStorage'));
     $template->onPrepareFilters[] = function ($template) use($latteFactory) {
         $template->registerFilter($latteFactory ? $latteFactory() : new Nette\Latte\Engine());
     };
     return $template;
 }
Пример #6
0
 /**
  * @param \Ark8\Security\Authorizators\Request $request
  * @return array
  * @throws \Nette\InvalidStateException
  */
 private function getSignal(Request $request)
 {
     $params = $request->getParameters();
     if ($this->httpRequest->isAjax()) {
         $params += $request->getPost();
     } elseif (($tmp = $request->getPost(Presenter::SIGNAL_KEY)) !== NULL) {
         $params[self::SIGNAL_KEY] = $tmp;
     }
     $signal = NULL;
     $signalReceiver = '';
     if (isset($params[Presenter::SIGNAL_KEY])) {
         $param = $params[Presenter::SIGNAL_KEY];
         $pos = strrpos($param, '-');
         if ($pos) {
             $signalReceiver = substr($param, 0, $pos);
             $signal = substr($param, $pos + 1);
         } else {
             $signalReceiver = $this->getUniqueId();
             $signal = $param;
         }
         if ($signal == NULL) {
             // intentionally ==
             $signal = NULL;
         }
     }
     return [$signal, explode('-', $signalReceiver)];
 }
Пример #7
0
 /**
  * @param Application\Request $appRequest
  * @param Nette\Http\Url $refUrl
  * @return NULL|string
  */
 public function constructUrl(Application\Request $appRequest, Nette\Http\Url $refUrl)
 {
     $parameters = $appRequest->getParameters();
     if (isset($parameters['action']) && $parameters['action'] == FALSE) {
         $parameters['action'] = NULL;
     }
     $appRequest->setParameters($parameters);
     return parent::constructUrl($appRequest, $refUrl);
 }
 public function handleApplicationRequest(Application\Application $application, Application\Request $request)
 {
     if ($request->getPresenterName() === 'Kdyby:Cli') {
         $parameters = $request->getParameters();
         if (isset($parameters['output']) && ($output = $parameters['output']) instanceof OutputInterface) {
             $this->outputWriter->setOutputInterface($output);
         }
     }
 }
Пример #9
0
 /**
  * Conditional redirect to canonicalized URI.
  *
  * @return void
  * @throws Nette\Application\AbortException
  */
 public function canonicalize()
 {
     if (!$this->isAjax() && ($this->request->isMethod('get') || $this->request->isMethod('head'))) {
         try {
             $url = $this->createRequest($this, $this->action, $this->getGlobalState() + $this->request->getParameters(), 'redirectX');
         } catch (InvalidLinkException $e) {
         }
         if (isset($url) && !$this->getHttpRequest()->getUrl()->isEqual($url)) {
             $this->sendResponse(new Responses\RedirectResponse($url, Http\IResponse::S301_MOVED_PERMANENTLY));
         }
     }
 }
 public function onRequest(Application $app, Request $request)
 {
     if (!extension_loaded('newrelic')) {
         return;
     }
     if (PHP_SAPI === 'cli') {
         newrelic_name_transaction('$ ' . basename($_SERVER['argv'][0]) . ' ' . implode(' ', array_slice($_SERVER['argv'], 1)));
         newrelic_background_job(TRUE);
         return;
     }
     $params = $request->getParameters();
     newrelic_name_transaction($request->getPresenterName() . (isset($params['action']) ? ':' . $params['action'] : ''));
 }
Пример #11
0
 /**
  * Constructs absolute URL from Request object
  *
  * @param \Nette\Application\Request $appRequest
  * @param \Nette\Http\Url $refUrl
  * @return string|NULL
  */
 public function constructUrl(Application\Request $appRequest, \Nette\Http\Url $refUrl)
 {
     if ($appRequest->getPresenterName() != $this->getTargetPresenter()) {
         return NULL;
     }
     $params = $appRequest->getParameters();
     if (!isset($params['id']) && isset($params[0])) {
         $params['id'] = $params[0];
         unset($params[0]);
         $appRequest->setParameters($params);
     }
     return parent::constructUrl($appRequest, $refUrl);
 }
Пример #12
0
 /**
  * Template factory.
  * @param  string
  * @return Application\UI\ITemplate
  */
 public function createTemplate($class = NULL, callable $latteFactory = NULL)
 {
     $latte = $latteFactory ? $latteFactory() : $this->getContext()->getByType(Nette\Bridges\ApplicationLatte\ILatteFactory::class)->create();
     $template = $class ? new $class() : new Nette\Bridges\ApplicationLatte\Template($latte);
     $template->setParameters($this->request->getParameters());
     $template->presenter = $this;
     $template->context = $this->context;
     if ($this->httpRequest) {
         $url = $this->httpRequest->getUrl();
         $template->baseUrl = rtrim($url->getBaseUrl(), '/');
         $template->basePath = rtrim($url->getBasePath(), '/');
     }
     return $template;
 }
Пример #13
0
 /**
  * @param Nette\Application\Application $app
  * @param Nette\Application\Request $request
  */
 public function onRequest(Nette\Application\Application $app, Nette\Application\Request $request)
 {
     if (Consumerr::isConsole()) {
         Consumerr::setBackgroundJob(TRUE);
         Consumerr::setName('$ ' . basename($_SERVER['argv'][0]) . ' ' . implode(' ', array_slice($_SERVER['argv'], 1)));
     } else {
         $params = $request->getParameters();
         if ($request->method === 'FORWARD' && $request->getPresenterName() === $app->errorPresenter) {
             return;
             //do not replace presenter name with error presenter
         }
         Consumerr::setName($request->getPresenterName() . (isset($params['action']) ? ':' . $params['action'] : ''));
     }
 }
Пример #14
0
	/**
	 * Initializes $this->globalParams, $this->signal & $this->signalReceiver, $this->action, $this->view. Called by run().
	 * @return void
	 * @throws Nette\Application\BadRequestException if action name is not valid
	 */
	private function initGlobalParameters()
	{
		// init $this->globalParams
		$this->globalParams = array();
		$selfParams = array();

		$params = $this->request->getParameters();
		if ($this->isAjax()) {
			$params += $this->request->getPost();
		}
		if (isset($this->request->post[self::SIGNAL_KEY])) {
			$params[self::SIGNAL_KEY] = $this->request->post[self::SIGNAL_KEY];
		}

		foreach ($params as $key => $value) {
			if (!preg_match('#^((?:[a-z0-9_]+-)*)((?!\d+\z)[a-z0-9_]+)\z#i', $key, $matches)) {
				continue;
			} elseif (!$matches[1]) {
				$selfParams[$key] = $value;
			} else {
				$this->globalParams[substr($matches[1], 0, -1)][$matches[2]] = $value;
			}
		}

		// init & validate $this->action & $this->view
		$this->changeAction(isset($selfParams[self::ACTION_KEY]) ? $selfParams[self::ACTION_KEY] : self::DEFAULT_ACTION);

		// init $this->signalReceiver and key 'signal' in appropriate params array
		$this->signalReceiver = $this->getUniqueId();
		if (isset($selfParams[self::SIGNAL_KEY])) {
			$param = $selfParams[self::SIGNAL_KEY];
			if (!is_string($param)) {
				$this->error('Signal name is not string.');
			}
			$pos = strrpos($param, '-');
			if ($pos) {
				$this->signalReceiver = substr($param, 0, $pos);
				$this->signal = substr($param, $pos + 1);
			} else {
				$this->signalReceiver = $this->getUniqueId();
				$this->signal = $param;
			}
			if ($this->signal == NULL) { // intentionally ==
				$this->signal = NULL;
			}
		}

		$this->loadState($selfParams);
	}
 public function onRequest(Application $app, Request $request)
 {
     if (!extension_loaded('newrelic')) {
         return;
     }
     if (PHP_SAPI === 'cli') {
         // uložit v čitelném formátu
         newrelic_name_transaction('$ ' . basename($_SERVER['argv'][0]) . ' ' . implode(' ', array_slice($_SERVER['argv'], 1)));
         // označit jako proces na pozadí
         newrelic_background_job(TRUE);
         return;
     }
     // pojmenování požadavku podle presenteru a akce
     $params = $request->getParameters();
     newrelic_name_transaction($_SERVER['HTTP_HOST'] . " | " . $request->getPresenterName() . (isset($params['action']) ? ':' . $params['action'] : ''));
 }
Пример #16
0
 /**
  * Initializes $this->globalParams, $this->signal & $this->signalReceiver, $this->action, $this->view. Called by run().
  * @return void
  * @throws Nette\Application\BadRequestException if action name is not valid
  */
 private function initGlobalParameters()
 {
     // init $this->globalParams
     $this->globalParams = array();
     $selfParams = array();
     $params = $this->request->getParameters();
     if ($this->isAjax()) {
         $params += $this->request->getPost();
     }
     foreach ($params as $key => $value) {
         $a = strlen($key) > 2 ? strrpos($key, self::NAME_SEPARATOR, -2) : FALSE;
         if (!$a) {
             $selfParams[$key] = $value;
         } else {
             $this->globalParams[substr($key, 0, $a)][substr($key, $a + 1)] = $value;
         }
     }
     // init & validate $this->action & $this->view
     $this->changeAction(isset($selfParams[self::ACTION_KEY]) ? $selfParams[self::ACTION_KEY] : self::DEFAULT_ACTION);
     // init $this->signalReceiver and key 'signal' in appropriate params array
     $this->signalReceiver = $this->getUniqueId();
     if (isset($selfParams[self::SIGNAL_KEY])) {
         $param = $selfParams[self::SIGNAL_KEY];
         if (!is_string($param)) {
             $this->error('Signal name is not string.');
         }
         $pos = strrpos($param, '-');
         if ($pos) {
             $this->signalReceiver = substr($param, 0, $pos);
             $this->signal = substr($param, $pos + 1);
         } else {
             $this->signalReceiver = $this->getUniqueId();
             $this->signal = $param;
         }
         if ($this->signal == NULL) {
             // intentionally ==
             $this->signal = NULL;
         }
     }
     $this->loadState($selfParams);
 }
Пример #17
0
 /**
  * @param FormInterface $form
  * @param Request       $request
  */
 public function handleRequest(FormInterface $form, $request = null)
 {
     if (!$request instanceof Request) {
         throw new UnexpectedTypeException($request, 'Nette\\Application\\Request');
     }
     $name = $form->getName();
     if ($name === '') {
         throw new InvalidArgumentException('Forms are not allowed to have an emtpy string as name.');
     }
     $method = $form->getConfig()->getMethod();
     if ($method !== $request->getMethod()) {
         return;
     }
     if ($method === 'GET') {
         $get = $request->getParameters();
         // Don't submit GET requests if the form's name does not exist in the request.
         if (!isset($get[$name])) {
             return;
         }
         $data = $get[$name];
     } else {
         $post = $request->getPost();
         $files = $request->getFiles();
         $default = $form->getConfig()->getCompound() ? [] : null;
         $postData = isset($post[$name]) ? $post[$name] : $default;
         $filesData = isset($files[$name]) ? $files[$name] : $default;
         if (is_array($postData) && is_array($filesData)) {
             $data = array_replace_recursive($postData, $filesData);
         } else {
             $data = $postData ?: $filesData;
         }
         // Don't submit the form if it is not present in the request.
         if (!$data) {
             return;
         }
     }
     $form->submit($data, $method !== 'PATCH');
 }
Пример #18
0
 /**
  * @param \Nette\Application\Request
  * @return array
  */
 private function getRequestParams(\Nette\Application\Request $appRequest)
 {
     $params = $appRequest->getParameters();
     $metadata = $this->getDefaults();
     $presenter = $appRequest->getPresenterName();
     $params[self::PRESENTER_KEY] = $presenter;
     if (isset($metadata[self::MODULE_KEY])) {
         // try to split into module and [submodule:]presenter parts
         $module = $metadata[self::MODULE_KEY];
         if (isset($module['fixity']) && strncasecmp($presenter, $module[self::VALUE] . ':', strlen($module[self::VALUE]) + 1) === 0) {
             $a = strlen($module[self::VALUE]);
         } else {
             $a = strrpos($presenter, ':');
         }
         if ($a === FALSE) {
             $params[self::MODULE_KEY] = '';
         } else {
             $params[self::MODULE_KEY] = substr($presenter, 0, $a);
             $params[self::PRESENTER_KEY] = substr($presenter, $a + 1);
         }
     }
     return $params;
 }
Пример #19
0
 /**
  * Constructs absolute URL from Request object.
  *
  * @return string|NULL
  */
 public function constructUrl(AppRequest $appRequest, Url $refUrl)
 {
     if ($this->flags & self::ONE_WAY) {
         return NULL;
     }
     $params = $appRequest->getParameters();
     if (!isset($params['action']) || !is_string($params['action'])) {
         return NULL;
     }
     $key = $appRequest->getPresenterName() . ':' . $params['action'];
     if (!isset($this->tableOut[$key])) {
         return NULL;
     }
     if ($this->lastRefUrl !== $refUrl) {
         $this->lastBaseUrl = $refUrl->getBaseUrl();
         $this->lastRefUrl = $refUrl;
     }
     unset($params['action']);
     $slug = $this->tableOut[$key];
     $query = ($tmp = http_build_query($params)) ? '?' . $tmp : '';
     $url = $this->lastBaseUrl . $slug . $query;
     return $url;
 }
 /**
  * Constructs absolute URL from Request object.
  * @return string|NULL
  */
 public function constructUrl(Application\Request $appRequest, Nette\Http\Url $refUrl)
 {
     if ($this->flags & self::ONE_WAY) {
         return NULL;
     }
     $params = $appRequest->getParameters();
     $metadata = $this->metadata;
     $presenter = $appRequest->getPresenterName();
     $params[self::PRESENTER_KEY] = $presenter;
     if (isset($metadata[NULL][self::FILTER_OUT])) {
         $params = call_user_func($metadata[NULL][self::FILTER_OUT], $params);
         if ($params === NULL) {
             return NULL;
         }
     }
     if (isset($metadata[self::MODULE_KEY])) {
         // try split into module and [submodule:]presenter parts
         $module = $metadata[self::MODULE_KEY];
         if (isset($module['fixity']) && strncasecmp($presenter, $module[self::VALUE] . ':', strlen($module[self::VALUE]) + 1) === 0) {
             $a = strlen($module[self::VALUE]);
         } else {
             $a = strrpos($presenter, ':');
         }
         if ($a === FALSE) {
             $params[self::MODULE_KEY] = '';
         } else {
             $params[self::MODULE_KEY] = substr($presenter, 0, $a);
             $params[self::PRESENTER_KEY] = substr($presenter, $a + 1);
         }
     }
     foreach ($metadata as $name => $meta) {
         if (!isset($params[$name])) {
             continue;
             // retains NULL values
         }
         if (isset($meta['fixity'])) {
             if ($params[$name] === FALSE) {
                 $params[$name] = '0';
             }
             if (is_scalar($params[$name]) ? strcasecmp($params[$name], $meta[self::VALUE]) === 0 : $params[$name] === $meta[self::VALUE]) {
                 // remove default values; NULL values are retain
                 unset($params[$name]);
                 continue;
             } elseif ($meta['fixity'] === self::CONSTANT) {
                 return NULL;
                 // missing or wrong parameter '$name'
             }
         }
         if (is_scalar($params[$name]) && isset($meta['filterTable2'][$params[$name]])) {
             $params[$name] = $meta['filterTable2'][$params[$name]];
         } elseif (isset($meta['filterTable2']) && !empty($meta[self::FILTER_STRICT])) {
             return NULL;
         } elseif (isset($meta[self::FILTER_OUT])) {
             $params[$name] = call_user_func($meta[self::FILTER_OUT], $params[$name]);
         }
         if (isset($meta[self::PATTERN]) && !preg_match($meta[self::PATTERN], rawurldecode($params[$name]))) {
             return NULL;
             // pattern not match
         }
     }
     // compositing path
     $sequence = $this->sequence;
     $brackets = array();
     $required = NULL;
     // NULL for auto-optional
     $url = '';
     $i = count($sequence) - 1;
     do {
         $url = $sequence[$i] . $url;
         if ($i === 0) {
             break;
         }
         $i--;
         $name = $sequence[$i];
         $i--;
         // parameter name
         if ($name === ']') {
             // opening optional part
             $brackets[] = $url;
         } elseif ($name[0] === '[') {
             // closing optional part
             $tmp = array_pop($brackets);
             if ($required < count($brackets) + 1) {
                 // is this level optional?
                 if ($name !== '[!') {
                     // and not "required"-optional
                     $url = $tmp;
                 }
             } else {
                 $required = count($brackets);
             }
         } elseif ($name[0] === '?') {
             // "foo" parameter
             continue;
         } elseif (isset($params[$name]) && $params[$name] != '') {
             // intentionally ==
             $required = count($brackets);
             // make this level required
             $url = $params[$name] . $url;
             unset($params[$name]);
         } elseif (isset($metadata[$name]['fixity'])) {
             // has default value?
             if ($required === NULL && !$brackets) {
                 // auto-optional
                 $url = '';
             } else {
                 $url = $metadata[$name]['defOut'] . $url;
             }
         } else {
             return NULL;
             // missing parameter '$name'
         }
     } while (TRUE);
     // absolutize path
     if ($this->type === self::RELATIVE) {
         $url = '//' . $refUrl->getAuthority() . $refUrl->getBasePath() . $url;
     } elseif ($this->type === self::PATH) {
         $url = '//' . $refUrl->getAuthority() . $url;
     } else {
         $host = $refUrl->getHost();
         $host = ip2long($host) ? array($host) : array_reverse(explode('.', $host));
         $url = strtr($url, array('/%basePath%/' => $refUrl->getBasePath(), '%tld%' => $host[0], '%domain%' => isset($host[1]) ? "{$host['1']}.{$host['0']}" : $host[0]));
     }
     if (strpos($url, '//', 2) !== FALSE) {
         return NULL;
     }
     $url = ($this->flags & self::SECURED ? 'https:' : 'http:') . $url;
     // build query string
     if ($this->xlat) {
         $params = self::renameKeys($params, $this->xlat);
     }
     $sep = ini_get('arg_separator.input');
     $query = http_build_query($params, '', $sep ? $sep[0] : '&');
     if ($query != '') {
         // intentionally ==
         $url .= '?' . $query;
     }
     return $url;
 }
Пример #21
0
 /**
  * @return Nette\Application\IResponse
  */
 protected function process(Nette\Application\Request $request)
 {
     // Query output content type -------------------------------------------
     // Accept header is comma separated fallback sequence
     // @todo sequence should be actually sorted by the degree of specificity
     // @todo make support for version options (ie. application/json;version=2)
     // 		see: RESTful Web Services Cookbook page 250
     $cTypes = preg_split('/,/', $this->httpRequest->getHeader('Accept'), 0, PREG_SPLIT_NO_EMPTY);
     foreach ($cTypes as $cType) {
         // We ignore all the options
         $cType = preg_replace('/;.*/', '', $cType);
         if (strcasecmp($cType, 'text/html') === 0 || strcmp($cType, '*/*') === 0) {
             $this->outputContentType = 'text/html';
             $this->httpResponse->setContentType('text/html', 'utf-8');
             break;
         } elseif (strcasecmp($cType, 'application/json') === 0) {
             $this->outputContentType = 'application/json';
             $this->httpResponse->setContentType('application/json', 'utf-8');
             break;
         }
     }
     if ($this->outputContentType === NULL) {
         $this->terminateWithError(self::ERROR_INVALID_REQUEST, "Accept header is missing or not satisfiable.", 406);
     }
     // Process Content-Language header -------------------------------------
     // Process Authorization header ----------------------------------------
     if (($authHeader = $this->httpRequest->getHeader('Authorization')) !== NULL) {
         if (preg_match('/^Bearer\\s([^\\s,;]+)/i', $authHeader, $matches)) {
             $tokenHash = $matches[1];
             // If connection is not secured return error and invalidate sent token
             // just in case
             if (!$request->hasFlag(Nette\Application\Request::SECURED) && $this->isInProductionMode()) {
                 $this->tokenManager->invalidateToken($tokenHash);
                 $this->terminateWithError(self::ERROR_INVALID_REQUEST, "Secured connection required", 400);
             }
             if (!$this->attemptLogger->getRemainingAttempts(self::ATTEMPT_IP_TOKEN, $this->httpRequest->getRemoteAddress())) {
                 $this->terminateWithError(OAuth2ResourceProvider::ERROR_MAXIMUM_ATTEMPTS_EXCEEDED, 'Maximum number of authorization attempts exceeded.', 403);
             }
             $token = $this->tokenManager->getToken($tokenHash);
             if (!$token) {
                 $this->attemptLogger->logFail(self::ATTEMPT_IP_TOKEN, $this->httpRequest->getRemoteAddress());
                 $this->httpResponse->addHeader('WWW-Authenticate', 'Bearer realm="' . $this->link() . '"');
                 $this->terminateWithError(OAuth2ResourceProvider::ERROR_INVALID_GRANT, 'Given authorization token is not valid.', 401);
             }
             $this->attemptLogger->logSuccess(self::ATTEMPT_IP_TOKEN, $this->httpRequest->getRemoteAddress());
             if (isset($token->parameters->userIdentity)) {
                 $this->user->login(User::AUTHN_METHOD_INVALID, User::AUTHN_SOURCE_ALL, $token->parameters->userIdentity);
             }
             if (isset($token->parameters->client)) {
                 $this->client = $token->parameters->client;
             }
         }
     }
     // Find request handler ------------------------------------------------
     // Gather resource path
     $parameters = $request->getParameters();
     $resourcePath = isset($parameters[self::PARAM_KEY_PATH]) ? trim($parameters[self::PARAM_KEY_PATH]) : NULL;
     if (!$resourcePath) {
         $this->terminateWithError(self::ERROR_INVALID_REQUEST, "No resource path given.", 400);
     }
     // Request router expects leading slash
     if ($resourcePath[0] != '/') {
         $resourcePath = "/{$resourcePath}";
     }
     // Request router: find resource handler
     try {
         /** @var vBuilder\RestApi\Request */
         $this->resourceRequest = $handlerRequest = $this->requestRouter->createRequest($this->httpRequest->getMethod(), $resourcePath);
     } catch (RequestException $e) {
         $this->terminateWithError(self::ERROR_INVALID_REQUEST, $e->getMessage(), $e->getCode() == RequestException::METHOD_NOT_ALLOWED ? 405 : 404);
     }
     // Request authorization -----------------------------------------------
     $handlerMethodAnnotations = $handlerRequest->getMethodReflection()->getAnnotations();
     if (!isset($handlerMethodAnnotations['NoAuthorization']) || !$handlerMethodAnnotations['NoAuthorization'][0]) {
         if (!$this->client) {
             $this->httpResponse->addHeader('WWW-Authenticate', 'Bearer realm="' . $this->link() . '"');
             $this->terminateWithError(self::ERROR_UNAUTHORIZED, 'Requested resource requires authorization. Please add Authorization header with correct security token.', 401);
         }
     }
     // Decode POST data ----------------------------------------------------
     if ($this->httpRequest->isPost()) {
         $cType = $this->httpRequest->getHeader('Content-Type');
         if (strcasecmp($cType, 'application/json') === 0) {
             try {
                 $this->postData = Nette\Utils\Json::decode(file_get_contents('php://input'), Nette\Utils\Json::FORCE_ARRAY);
             } catch (Nette\Utils\JsonException $e) {
                 $this->terminateWithError(self::ERROR_INVALID_REQUEST, "Malformed POST data (JSON expected).", 400);
             }
         } elseif (strcasecmp($cType, 'application/x-www-form-urlencoded') === 0) {
             $this->postData = $this->httpRequest->getPost();
         } elseif ($cType === NULL) {
             $this->terminateWithError(self::ERROR_INVALID_REQUEST, "Missing Content-Type header, which is mandatory for POST requests.", 400);
         } else {
             $this->terminateWithError(self::ERROR_INVALID_REQUEST, "Request content type of POST data is not supported.", 415);
         }
     }
     // Create resource instance and prepare all dependencies ---------------
     $class = $handlerRequest->getResourceClassName();
     $resource = new $class();
     $resource->presenter = $this;
     $this->systemContainer->callInjects($resource);
     // Prepare and order invoke parameters ---------------------------------
     $mReflection = $handlerRequest->getMethodReflection();
     $invokeParams = array();
     $requestParams = $handlerRequest->getParameters();
     $definedParams = $mReflection->getParameters();
     $index = 0;
     foreach ($definedParams as $pReflection) {
         $index++;
         // Parameter not given in URL?
         if (!isset($requestParams[$pReflection->getName()])) {
             // Default value where available
             if ($pReflection->isDefaultValueAvailable()) {
                 $invokeParams[$pReflection->getName()] = $pReflection->getDefaultValue();
                 continue;
             }
             $this->terminateWithError(self::ERROR_INVALID_REQUEST, "Missing #{$index} parameter for resource handler {$class}::" . $mReflection->getName() . '().', 400);
         }
         $invokeParams[$pReflection->getName()] = $requestParams[$pReflection->getName()];
     }
     // Perform startup
     $resource->startup();
     // Invoke handler method on resource instance
     $responsePayload = $mReflection->invokeArgs($resource, $invokeParams);
     // Automatically set HTTP 204 No Content if necessary
     if ($responsePayload === NULL && $this->httpResponse->getCode() == 200) {
         $this->httpResponse->setCode(204);
     }
     return $responsePayload === NULL ? $this->createResponse() : $this->createResponse($responsePayload);
 }
 /**
  * @param Request $request
  */
 public function run(Request $request)
 {
     if ($request->isMethod('get') && isset($request->getParameters()[RequestStorage::REQUEST_KEY])) {
         $stored = $this->requestStorage->loadRequest($request->getParameters()[RequestStorage::REQUEST_KEY]);
         /** @var Request $stored */
         if ($stored && $stored->getPresenterName() === $request->getPresenterName()) {
             $stored->setFlag(Request::RESTORED, true);
             $parameters = $stored->getParameters();
             if (isset($request->getParameters()[Presenter::FLASH_KEY])) {
                 $parameters[Presenter::FLASH_KEY] = $request->getParameters()[Presenter::FLASH_KEY];
             } else {
                 unset($parameters[Presenter::FLASH_KEY]);
             }
             $stored->setParameters($parameters);
             $request = $stored;
         }
     }
     return parent::run($request);
 }
Пример #23
0
Application\Request($presenter,$httpRequest->getMethod(),$params,$httpRequest->getPost(),$httpRequest->getFiles(),array(Application\Request::SECURED=>$httpRequest->isSecured()));}function
constructUrl(Application\Request$appRequest,Nette\Http\Url$refUrl){if($this->flags&self::ONE_WAY){return
NULL;}$params=$appRequest->getParameters();$presenter=$appRequest->getPresenterName();if(strncasecmp($presenter,$this->module,strlen($this->module))===0){$params[self::PRESENTER_KEY]=substr($presenter,strlen($this->module));}else{return
NULL;}foreach($this->defaults
as$key=>$value){if(isset($params[$key])&&$params[$key]==$value){unset($params[$key]);}}$url=($this->flags&self::SECURED?'https://':'http://').$refUrl->getAuthority().$refUrl->getPath();$sep=ini_get('arg_separator.input');$query=http_build_query($params,'',$sep?$sep[0]:'&');if($query!=''){$url.='?'.$query;}return$url;}function
Пример #24
0
 /**
  * Constructs absolute URL from Request object.
  *
  * @param \Nette\Application\Request $appRequest
  * @param \Nette\Http\Url $refUrl
  * @throws \Nette\InvalidStateException
  * @return string|NULL
  */
 public function constructUrl(Request $appRequest, Url $refUrl)
 {
     // Module prefix not match.
     if ($this->module && !Strings::startsWith($appRequest->getPresenterName(), $this->module)) {
         return null;
     }
     $parameters = $appRequest->getParameters();
     $urlStack = array();
     // Module prefix.
     $moduleFrags = explode(":", $appRequest->getPresenterName());
     if (count($moduleFrags)) {
         foreach ($moduleFrags as &$fragment) {
             $fragment = $this->presenter2path($fragment);
         }
     }
     $resourceName = array_pop($moduleFrags);
     $urlStack += $moduleFrags;
     if (isset($parameters['associations']) && is_array($parameters['associations'])) {
         $associations =& $parameters['associations'];
         foreach ($associations as $key => $value) {
             $urlStack[] = $key;
             $urlStack[] = $value;
         }
     }
     $urlStack[] = $resourceName;
     if (isset($parameters['specific_action']) && $parameters['specific_action']) {
         $urlStack[] = $this->action2path($parameters['specific_action']);
     }
     if (isset($parameters['id']) && is_scalar($parameters['id'])) {
         $urlStack[] = $parameters['id'];
     }
     $url = $q = $refUrl->getBaseUrl() . implode('/', $urlStack);
     if (isset($parameters['query']) && count($parameters['query'])) {
         $sep = ini_get('arg_separator.input');
         $query = http_build_query($parameters['query'], '', $sep ? $sep[0] : '&');
         $url .= '?' . $query;
     }
     return $url;
 }
Пример #25
0
 /**
  * Constructs absolute URL from Request object.
  * @param \Nette\Application\Request $appRequest
  * @param \Nette\Http\Url $refUrl
  * @throws \Nette\InvalidStateException
  * @return string|NULL
  */
 public function constructUrl(Request $appRequest, Url $refUrl)
 {
     // Module prefix not match.
     if ($this->module && !Strings::startsWith($appRequest->getPresenterName(), $this->module)) {
         return NULL;
     }
     $parameters = $appRequest->getParameters();
     $url = $refUrl->getBaseUrl();
     $urlStack = [];
     // Module prefix.
     $moduleFrags = explode(":", $appRequest->getPresenterName());
     $moduleFrags = array_map('\\AdamStipak\\Support\\Inflector::spinalCase', $moduleFrags);
     $resourceName = array_pop($moduleFrags);
     $urlStack += $moduleFrags;
     // Associations.
     if (isset($parameters['associations']) && Validators::is($parameters['associations'], 'array')) {
         $associations = $parameters['associations'];
         unset($parameters['associations']);
         foreach ($associations as $key => $value) {
             $urlStack[] = $key;
             $urlStack[] = $value;
         }
     }
     // Resource.
     $urlStack[] = $resourceName;
     // Id.
     if (isset($parameters['id']) && Validators::is($parameters['id'], 'scalar')) {
         $urlStack[] = $parameters['id'];
         unset($parameters['id']);
     }
     $url = $url . implode('/', $urlStack);
     $sep = ini_get('arg_separator.input');
     if (isset($parameters['query'])) {
         $query = http_build_query($parameters['query'], '', $sep ? $sep[0] : '&');
         if ($query != '') {
             $url .= '?' . $query;
         }
     }
     return $url;
 }
Пример #26
0
 /**
  * Constructs absolute URL from Request object.
  * @param \Nette\Application\Request $appRequest
  * @param \Nette\Http\Url $refUrl
  * @throws \Nette\InvalidStateException
  * @return string|NULL
  */
 public function constructUrl(Request $appRequest, Url $refUrl)
 {
     // Module prefix not match.
     if ($this->module && !Strings::startsWith($appRequest->getPresenterName(), $this->module)) {
         return NULL;
     }
     $parameters = $appRequest->getParameters();
     $url = $refUrl->getBaseUrl();
     $urlStack = array();
     // Module prefix.
     $moduleFrags = explode(":", Strings::lower($appRequest->getPresenterName()));
     $resourceName = array_pop($moduleFrags);
     $urlStack += $moduleFrags;
     // Associations.
     if (isset($parameters['associations']) && Validators::is($parameters['associations'], 'array')) {
         $associations =& $parameters['associations'];
         if (count($associations) % 2 !== 0) {
             throw new InvalidStateException("Number of associations is not even");
         }
         foreach ($associations as $key => $value) {
             $urlStack[] = $key;
             $urlStack[] = $value;
         }
     }
     // Resource.
     $urlStack[] = Strings::lower($resourceName);
     // Id.
     if (isset($parameters['id']) && Validators::is($parameters['id'], 'scalar')) {
         $urlStack[] = $parameters['id'];
     }
     return $url . implode('/', $urlStack);
 }
Пример #27
0
 /**
  * Constructs absolute URL from Request object.
  * @return string|NULL
  */
 public function constructUrl(Nette\Application\Request $appRequest, Nette\Http\Url $refUrl)
 {
     $this->loadLocales();
     $appPath = $appRequest->getPresenterName() . ':' . $appRequest->getParameter('action') . ':' . $appRequest->getParameter('internal_id');
     /** @var Url $urlEntity */
     $cachedResult = $this->cache->load($appPath, function (&$dependencies) use($appRequest) {
         $presenter = $appRequest->getPresenterName();
         $action = $appRequest->getParameter('action');
         $internal_id = $appRequest->getParameter('internal_id');
         $fallback = false;
         if (isset($internal_id)) {
             /** @var Url $url */
             $urlEntity = $this->getUrlEntity($presenter, $action, $internal_id);
             if ($urlEntity === null) {
                 $fallback = true;
                 $urlEntity = $this->getUrlEntity($presenter, $action);
             }
         } else {
             $urlEntity = $this->getUrlEntity($presenter, $action);
         }
         if ($urlEntity === null) {
             $this->logger->addWarning(sprintf('No route found
                               | presenter: %s
                               | action: %s
                               | id %s', $presenter, $action, $internal_id));
             return null;
         }
         $dependencies = [Nette\Caching\Cache::TAGS => $urlEntity->getCacheKey()];
         return [$urlEntity, $fallback];
     });
     $urlEntity = $cachedResult[0];
     $fallback = $cachedResult[1];
     if ($urlEntity === null) {
         return null;
     }
     $baseUrl = 'http://' . $refUrl->getAuthority() . $refUrl->getBasePath();
     if ($urlEntity->getActualUrlToRedirect() === null) {
         $path = $urlEntity->getUrlPath();
     } else {
         $path = $urlEntity->getActualUrlToRedirect()->getUrlPath();
     }
     $params = $appRequest->getParameters();
     unset($params['action']);
     if ($fallback === false) {
         unset($params['internal_id']);
     }
     $defaultLocale = array_search(true, $this->locales);
     $locale = isset($params['locale']) ? $params['locale'] : $defaultLocale;
     unset($params['locale']);
     if ($defaultLocale === $locale) {
         $locale = '';
     } else {
         $locale .= '/';
     }
     $resultUrl = $baseUrl . $locale . Nette\Utils\Strings::webalize($path, '/.');
     $this->urlParametersConverter->out($urlEntity, $params);
     // todo
     $q = http_build_query($params, null, '&');
     if ($q != '') {
         $resultUrl .= '?' . $q;
     }
     return $resultUrl;
 }
Пример #28
0
 /**
  * @param Request $appRequest
  * @param Url $refUrl
  * @return null|string
  */
 public function constructUrl(Request $appRequest, Url $refUrl)
 {
     // one way can't generate link
     if ($this->options['oneWay']) {
         return NULL;
     }
     $params = $this->clearParameters($appRequest->getParameters());
     $action = new Action($appRequest->getPresenterName() . ':' . $appRequest->getParameter('action'), $params);
     // ISource return NULL, not found url to generate
     if (($seoUrl = $this->source->toUrl($action)) === NULL) {
         return NULL;
     }
     if (!$seoUrl instanceof Url) {
         $seoUrl = new Url($seoUrl);
     }
     // host
     if ($seoUrl->getHost()) {
         $host = $refUrl->getHost();
         $parts = ip2long($host) ? [$host] : array_reverse(explode('.', $host));
         $host = strtr($seoUrl->getHost(), ['%tld%' => $parts[0], '%domain%' => isset($parts[1]) ? "{$parts['1']}.{$parts['0']}" : $parts[0], '%sld%' => isset($parts[1]) ? $parts[1] : '', '%host%' => $refUrl->getHost()]);
     } else {
         $host = $refUrl->getHost();
     }
     // path
     $path = $seoUrl->getPath();
     // query
     $query = $seoUrl->getQueryParameters() + $params;
     ksort($query);
     $seoUrl->setQuery($query);
     $query = $seoUrl->getQuery();
     // fragment
     $fragment = $seoUrl->getFragment();
     return ($this->options['secured'] ? 'https' : 'http') . '://' . $host . $refUrl->getBasePath() . ($path === '/' ? '' : $path) . ($query ? '?' . $query : '') . ($fragment ? '#' . $fragment : '');
 }
Пример #29
0
 /**
  * Constructs absolute URL from Request object.
  *
  * @return string|NULL
  */
 public function constructUrl(App\Request $appRequest, Http\Url $refUrl)
 {
     $params = $appRequest->getParameters();
     $query = $params;
     unset($query['action'], $query['page_id'], $query['slug'], $query['id'], $query['locale'], $query['prefix']);
     if (isset($params['slug'])) {
         $slug = strtolower($params['slug']);
     } else {
         if (isset($params['page_id'])) {
             $row = $this->slugManager->getSlugById($params['page_id']);
             // todo peekay Change cs for selected language
             if (isset($query['locale'])) {
                 unset($params['locale']);
             }
             if ($row) {
                 if (isset($params['locale'])) {
                     $slug = $row->{'slug_' . $params['locale']};
                 } else {
                     $slug = $row->{'slug'};
                 }
             } else {
                 return NULL;
             }
         } else {
             return NULL;
         }
     }
     if (isset($params['locale'])) {
         $locale = $params['locale'] . '/';
     } else {
         $locale = null;
     }
     if (isset($params['prefix'])) {
         $prefix = $params['prefix'] . '/';
     } else {
         $prefix = null;
     }
     $url = $refUrl->getScheme() . '://' . $refUrl->getHost() . $refUrl->getPath() . $locale . $prefix . $slug;
     $params = $appRequest->getParameters();
     if (isset($params['action']) && $params['action'] !== 'default') {
         $url .= $refUrl->getPath();
     }
     if (isset($params['id'])) {
         if ($params['action'] == 'default' && isset($params['action'])) {
             $url .= $refUrl->getPath();
         }
         $url .= $refUrl->getPath() . $params['id'];
     }
     if (count($query) > 0) {
         $queryString = '?';
         foreach ($query as $key => $parameter) {
             $queryString .= $key . '=' . $parameter . '&';
         }
         $finalQueryString = substr($queryString, 0, -1);
         $url .= $finalQueryString;
     }
     return $url;
 }
Пример #30
0
 /**
  * @return array
  */
 public function getParameters()
 {
     return $this->request->getParameters();
 }