Compare commits

...

34 Commits

Author SHA1 Message Date
Simon Sessingø 1fd13ed2aa Merge pull request #311 from skipperbent/v3-development
V3 development
2017-11-10 13:02:49 +01:00
Simon Sessingø fde77969c0 Merge pull request #310 from skipperbent/v3-csrftoken-update
Csrf-token are now refreshed on each page-load to avoid timeout.
2017-11-10 13:02:23 +01:00
Simon Sessingø c3072e8886 Csrf-token are now refreshed on each page-load to avoid timeout. 2017-11-10 12:59:59 +01:00
Simon Sessingø 9d5c4a2ed1 Merge pull request #308 from skipperbent/v3-development
3.4.5.4
2017-11-10 08:24:55 +01:00
Simon Sessingø 97753f5370 Minor optimisations. 2017-11-10 08:23:15 +01:00
Simon Sessingø b8634bcf79 Merge pull request #307 from skipperbent/revert-306-revert-305-v3-development
Revert "Revert "V3 development""
2017-11-08 04:11:50 +01:00
Simon Sessingø 6ad22a3816 Revert "Revert "V3 development"" 2017-11-08 04:11:40 +01:00
Simon Sessingø ed41cd55af Merge pull request #306 from skipperbent/revert-305-v3-development
Revert "V3 development"
2017-11-08 04:09:55 +01:00
Simon Sessingø ebeca952cf Revert "V3 development" 2017-11-08 04:09:41 +01:00
Simon Sessingø 0672e85fd7 Merge pull request #305 from skipperbent/v3-development
V3 development
2017-11-08 04:09:31 +01:00
Simon Sessingø 927f8d7b3c Merge pull request #304 from jatubio/patch-3
Documentation: Add IIS Trooubleshooting section.
2017-11-08 04:09:14 +01:00
Juan Antonio Tubio 74177a2082 Update README.md 2017-11-04 00:59:52 +01:00
Juan Antonio Tubio 2221bced4f Update README.md 2017-11-04 00:27:13 +01:00
Juan Antonio Tubio 6559278511 Documentation: Add file exception rules samples to IIS web.config 2017-11-04 00:19:51 +01:00
Simon Sessingø 8b9698229d Merge pull request #302 from skipperbent/v3
V3
2017-10-23 22:08:23 +02:00
Simon Sessingø a565f66c4c Merge pull request #301 from skipperbent/v3-development
Version 3.4.5.3
2017-10-23 22:08:09 +02:00
Simon Sessingø 832ef992a3 Merge pull request #300 from skipperbent/csrf-documentation
Added CSRF form-example in documentation (issue: #299)
2017-10-23 22:05:41 +02:00
Simon Sessingø cc5e417db9 Update README.md 2017-10-23 22:05:27 +02:00
Simon Sessingø 2cc90e28d0 Update README.md 2017-10-23 22:04:28 +02:00
Simon Sessingø eb63a5d6ba Added CSRF form-example in documentation (issue: #299) 2017-10-23 22:01:19 +02:00
Simon Sessingø a07b30a80d Merge pull request #298 from jatubio/patch-2
Added more info on route or method not allowed exception
2017-10-12 15:53:03 +02:00
Juan Antonio Tubio c45cd6347a Added more info on route or method not allowed exception 2017-10-11 16:02:26 +02:00
Simon Sessingø 4a353efc97 Merge pull request #296 from skipperbent/v3
V3
2017-10-07 17:53:27 +02:00
Simon Sessingø f7ce440c56 Merge pull request #295 from skipperbent/v3-development
Fixed: try next exception-handler if one throws error.
2017-10-07 17:53:17 +02:00
Simon Sessingø 41705f030a Fixed: try next exception-handler if one throws error. 2017-10-07 12:33:24 +01:00
Simon Sessingø 18fa0f9610 Merge pull request #294 from skipperbent/v3
V3
2017-09-25 08:51:13 +02:00
Simon Sessingø 66ecf0ee33 Merge pull request #293 from skipperbent/v3-development
Readded csrf_token helper function - don't run away this time.
2017-09-25 08:51:02 +02:00
Simon Sessingø 4ba15033d9 Readded csrf_token helper function - don't run away this time. 2017-09-09 01:40:44 +01:00
Simon Sessingø 60393a3722 Merge pull request #291 from skipperbent/v3
V3
2017-09-03 19:43:22 +02:00
Simon Sessingø 3df3ef36ef Merge pull request #288 from skipperbent/v3
V3
2017-08-31 13:05:45 +02:00
Simon Sessingø c723ca7e61 Merge pull request #283 from skipperbent/v3
V3
2017-08-24 16:53:29 +02:00
Simon Sessingø e3b6899375 Merge pull request #280 from skipperbent/v3
V3
2017-08-24 03:13:06 +02:00
Simon Sessingø a179450018 Merge pull request #277 from skipperbent/v3
V3
2017-08-23 23:50:26 +02:00
Simon Sessingø ac3e9ed2ac Merge pull request #274 from skipperbent/v3
V3
2017-08-23 22:31:00 +02:00
6 changed files with 109 additions and 54 deletions
+46 -6
View File
@@ -212,6 +212,18 @@ Simply create a new `web.config` file in your projects `public` directory and pa
</configuration>
```
#### Troubleshoting
If you do not have a favicon.ico file in your project, you can get `404 Router::notFoundException()` constantly.
To add `favicon.ico` as exception, you can add this line to the `<conditions>` group:
```<add input="{REQUEST_FILENAME}" negate="true" pattern="favicon.ico" ignoreCase="true" />```
You can also make one exception for files with some extensions:
```<add input="{REQUEST_FILENAME}" pattern="\.ico|\.png|\.css|\.jpg" negate="true" ignoreCase="true" />```
If you are using `$_SERVER['ORIG_PATH_INFO']`, you will get `\index.php\` as part of the returned value. By sample:
```/index.php/test/mypage.php```
### Configuration
Create a new file, name it `routes.php` and place it in your library folder. This will be the file where you define all the routes for your project.
@@ -249,7 +261,8 @@ We recommend that you add these helper functions to your project. These will all
To implement the functions below, simply copy the code to a new file and require the file before initializing the router or copy the `helpers.php` we've included in this library.
```php
<?php
use Pecee\SimpleRouter\SimpleRouter as Router;
/**
* Get url for a route by using either name/alias, class or method name.
*
@@ -269,7 +282,7 @@ To implement the functions below, simply copy the code to a new file and require
*/
function url($name = null, $parameters = null, $getParams = null)
{
return SimpleRouter::getUrl($name, $parameters, $getParams);
return Router::getUrl($name, $parameters, $getParams);
}
/**
@@ -277,7 +290,7 @@ function url($name = null, $parameters = null, $getParams = null)
*/
function response()
{
return SimpleRouter::response();
return Router::response();
}
/**
@@ -285,7 +298,7 @@ function response()
*/
function request()
{
return SimpleRouter::request();
return Router::request();
}
/**
@@ -297,8 +310,7 @@ function request()
*/
function input($index = null, $defaultValue = null, $methods = null)
{
if($index !== null)
{
if ($index !== null) {
return request()->getInput()->get($index, $defaultValue, $methods);
}
@@ -313,6 +325,20 @@ function redirect($url, $code = null)
response()->redirect($url);
}
/**
* Get current csrf-token
* @return string|null
*/
function csrf_token()
{
$baseVerifier = Router::router()->getCsrfVerifier();
if ($baseVerifier !== null) {
return $baseVerifier->getToken();
}
return null;
}
```
---
@@ -695,6 +721,20 @@ You can get the CSRF-token by calling the helper method:
csrf_token();
```
The default name/key for the input-field is `csrf_token` and is defined in the `POST_KEY` constant in the `BaseCsrfVerifier` class.
You can change the key by overwriting the constant in your own CSRF-verifier class.
**Example:**
The example below will post to the current url with a hidden field "`csrf_token`".
```html
<form method="post" action="<?= url(); ?>">
<input type="hidden" name="csrf_token" value="<?= csrf_token(); ?>">
<!-- other input elements here -->
</form>
```
---
# Middlewares
+14
View File
@@ -63,4 +63,18 @@ function redirect($url, $code = null)
}
response()->redirect($url);
}
/**
* Get current csrf-token
* @return string|null
*/
function csrf_token()
{
$baseVerifier = Router::router()->getCsrfVerifier();
if ($baseVerifier !== null) {
return $baseVerifier->getToken();
}
return null;
}
+19 -7
View File
@@ -1,4 +1,5 @@
<?php
namespace Pecee;
class CsrfToken
@@ -15,7 +16,7 @@ class CsrfToken
*/
public static function generateToken()
{
if (function_exists('random_bytes')) {
if (function_exists('random_bytes') === true) {
return bin2hex(random_bytes(32));
}
@@ -46,25 +47,36 @@ class CsrfToken
/**
* Set csrf token cookie
* Overwrite this method to save the token to another storage like session etc.
*
* @param $token
* @param string $token
*/
public function setToken($token)
{
$this->token = $token;
setcookie(static::CSRF_KEY, $token, time() + 60 * 120, '/');
}
/**
* Get csrf token
* @param string|null $defaultValue
* @return string|null
*/
public function getToken()
public function getToken($defaultValue = null)
{
if ($this->hasToken() === true) {
return $_COOKIE[static::CSRF_KEY];
}
$this->token = ($this->hasToken() === true) ? $_COOKIE[static::CSRF_KEY] : null;
return null;
return ($this->token !== null) ? $this->token : $defaultValue;
}
/**
* Refresh existing token
*/
public function refresh()
{
if ($this->token !== null) {
$this->setToken($this->token);
}
}
/**
@@ -1,4 +1,5 @@
<?php
namespace Pecee\Http\Middleware;
use Pecee\CsrfToken;
@@ -19,7 +20,7 @@ class BaseCsrfVerifier implements IMiddleware
$this->csrfToken = new CsrfToken();
// Generate or get the CSRF-Token from Cookie.
$this->token = ($this->hasToken() === false) ? $this->generateToken() : $this->csrfToken->getToken();
$this->token = $this->csrfToken->getToken($this->generateToken());
}
/**
@@ -72,6 +73,9 @@ class BaseCsrfVerifier implements IMiddleware
}
// Refresh existing token
$this->csrfToken->refresh();
}
public function generateToken()
+3 -25
View File
@@ -1,4 +1,5 @@
<?php
namespace Pecee\Http;
use Pecee\Http\Input\Input;
@@ -42,13 +43,7 @@ class Request
{
$this->headers = [];
$max = count($_SERVER) - 1;
$keys = array_keys($_SERVER);
for ($i = $max; $i >= 0; $i--) {
$key = $keys[$i];
$value = $_SERVER[$key];
foreach ($_SERVER as $key => $value) {
$this->headers[strtolower($key)] = $value;
$this->headers[strtolower(str_replace('_', '-', $key))] = $value;
}
@@ -167,24 +162,7 @@ class Request
*/
public function getHeader($name, $defaultValue = null)
{
if (array_key_exists(strtolower($name), $this->headers) === true) {
return $this->headers[strtolower($name)];
}
$max = count($_SERVER) - 1;
$keys = array_keys($_SERVER);
for ($i = $max; $i >= 0; $i--) {
$key = $keys[$i];
$name = $_SERVER[$key];
if ($key === $name) {
return $name;
}
}
return $defaultValue;
return isset($this->headers[strtolower($name)]) ? $this->headers[strtolower($name)] : $defaultValue;
}
/**
+22 -15
View File
@@ -285,7 +285,8 @@ class Router
}
if ($routeNotAllowed === true) {
$this->handleException(new HttpException('Route or method not allowed', 403));
$message = sprintf('Route "%s" or method "%s" not allowed.', $this->request->getUri()->getPath(), $this->request->getMethod());
$this->handleException(new HttpException($message, 403));
}
if ($this->request->getLoadedRoute() === null) {
@@ -329,25 +330,31 @@ class Router
throw new HttpException('Exception handler must implement the IExceptionHandler interface.', 500);
}
if ($handler->handleError($this->request, $e) !== null) {
try {
$rewriteRoute = $this->request->getRewriteRoute();
if ($handler->handleError($this->request, $e) !== null) {
if ($rewriteRoute !== null) {
$rewriteRoute->loadMiddleware($this->request);
$rewriteRoute = $this->request->getRewriteRoute();
return $rewriteRoute->renderRoute($this->request);
if ($rewriteRoute !== null) {
$rewriteRoute->loadMiddleware($this->request);
return $rewriteRoute->renderRoute($this->request);
}
$rewriteUrl = $this->request->getRewriteUrl();
/* If the request has changed */
if ($rewriteUrl !== null && $rewriteUrl !== $url) {
unset($this->exceptionHandlers[$i]);
$this->exceptionHandlers = array_values($this->exceptionHandlers);
return $this->routeRequest(true);
}
}
$rewriteUrl = $this->request->getRewriteUrl();
} catch (\Exception $e) {
/* If the request has changed */
if ($rewriteUrl !== null && $rewriteUrl !== $url) {
unset($this->exceptionHandlers[$i]);
$this->exceptionHandlers = array_values($this->exceptionHandlers);
return $this->routeRequest(true);
}
}
}
@@ -588,4 +595,4 @@ class Router
return $this;
}
}
}