Skip to content

Commit 6461302

Browse files
author
MrAnyx
committed
[feat] Added session handler & authorization
1 parent 5d4d48c commit 6461302

File tree

5 files changed

+211
-59
lines changed

5 files changed

+211
-59
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace TimePHP\Exception;
4+
5+
class SessionHandlerException extends \Exception {
6+
7+
public function __construct($message = null, $code = 1000) {
8+
if (!$message) {
9+
throw new $this('Unknown ' . get_class($this));
10+
}
11+
parent::__construct($message, $code);
12+
}
13+
14+
public function __toString(): string {
15+
return __CLASS__ . "[{$this->code}] : {$this->message} at line {$this->line}";
16+
}
17+
}

src/Foundation/AbstractController.php

Lines changed: 37 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@
99
namespace TimePHP\Foundation;
1010

1111
use Twig\Environment;
12+
use TimePHP\UrlParser\Parser;
1213
use TimePHP\Foundation\Router;
1314
use TimePHP\Security\CsrfToken;
15+
use TimePHP\Foundation\Authorization;
16+
use TimePHP\Foundation\SessionHandler;
1417
use TimePHP\Exception\SessionException;
1518
use TimePHP\Exception\RedirectionException;
1619

@@ -27,8 +30,18 @@ abstract class AbstractController
2730
*/
2831
protected $twig;
2932

30-
public function __construct(Environment $twig){
33+
34+
/**
35+
* @var Parser
36+
*/
37+
protected $request;
38+
39+
public function __construct(Environment $twig)
40+
{
3141
$this->twig = $twig;
42+
$this->request = new Parser();
43+
$this->session = new SessionHandler();
44+
$this->authorization = new Authorization();
3245
}
3346

3447
/**
@@ -38,7 +51,8 @@ public function __construct(Environment $twig){
3851
* @param array $parameters
3952
* @return void
4053
*/
41-
public function render(string $view, array $parameters = []){
54+
public function render(string $view, array $parameters = [])
55+
{
4256
echo $this->twig->render($view, $parameters);
4357
}
4458

@@ -50,25 +64,29 @@ public function render(string $view, array $parameters = []){
5064
* @param array|null $flags (optionel) correspond au parametres à donner a l'url
5165
* @return string
5266
*/
53-
public function generate(string $name, array $params = [], array $flags = []): string {
67+
public function generate(string $name, array $params = [], array $flags = []): string
68+
{
5469
return Router::generate($name, $params, $flags);
5570
}
5671

5772
/**
5873
* Create a session based on parameters
5974
*
75+
* @param object $user
6076
* @param array $params
6177
* @return void
6278
*/
63-
public function createSession(array $params): void {
64-
if($params === null || empty($params) || empty($params)){
79+
public function createSession( \App\Bundle\Entity\User $user, ?array $params = []): void
80+
{
81+
if ($user === null || empty($user)) {
6582
throw new SessionException("createSession function requires an array, null given", 1001);
66-
} else if(!empty($_SESSION)) {
83+
} else if (!empty($this->session->get())) {
6784
throw new SessionException('A session has already been started', 1002);
6885
} else {
69-
$_SESSION["csrf_token"] = CsrfToken::generate();
70-
foreach($params as $key => $value){
71-
$_SESSION[$key] = $value;
86+
$this->session->set("csrf_token", CsrfToken::generate())
87+
->set("user", $user);
88+
foreach ($params as $key => $value) {
89+
$this->session->set($key, $value);
7290
}
7391
}
7492
}
@@ -78,35 +96,24 @@ public function createSession(array $params): void {
7896
*
7997
* @return void
8098
*/
81-
public function closeSession(): void {
82-
if(empty($_SESSION) === 0){
99+
public function closeSession(): void
100+
{
101+
if (empty($this->session->get())) {
83102
throw new SessionException('No session was created. $_SESSION is empty', 1003);
84103
} else {
85104
session_unset();
86105
session_destroy();
87106
}
88107
}
89108

90-
/**
91-
* Return the ucrrent session
92-
*
93-
* @return array|null
94-
*/
95-
public function getSession(): ?array {
96-
if(empty($_SESSION)) {
97-
return null;
98-
} else {
99-
return $_SESSION;
100-
}
101-
}
102-
103109
/**
104110
* Redirect to a url using a specific url
105111
*
106112
* @param string $url
107113
* @return void
108114
*/
109-
public function redirectUrl(string $url): void {
115+
public function redirectUrl(string $url): void
116+
{
110117
header("Location: $url");
111118
}
112119

@@ -118,41 +125,13 @@ public function redirectUrl(string $url): void {
118125
* @param array $flags
119126
* @return void
120127
*/
121-
public function redirectRouteName(string $routeName, array $params = [], array $flags = []): void {
122-
if(is_string($routeName)) {
123-
header("Location: {$this->generate($routeName, $params, $flags)}");
128+
public function redirectRouteName(string $routeName, array $params = [], array $flags = []): void
129+
{
130+
if (is_string($routeName)) {
131+
header("Location: {$this->generate($routeName,$params,$flags)}");
124132
} else {
125133
throw new RedirectionException("$routeName doesn't exists");
126134
}
127135
}
128136

129-
130-
/**
131-
* Return a value from $_POST for a specific index
132-
*
133-
* @param string $index
134-
* @return mixed|null
135-
*/
136-
public function post(string $index){
137-
return isset($_POST[$index]) ? $_POST[$index] : null;
138-
}
139-
140-
/**
141-
* Return a value from $_GET for a specific index
142-
*
143-
* @param string $index
144-
* @return mixed|null
145-
*/
146-
public function get(string $index) {
147-
if(isset($_GET[$index])){
148-
if(is_numeric($_GET[$index])){
149-
return (int) $_GET[$index];
150-
} else {
151-
return $_GET[$index];
152-
}
153-
} else {
154-
return null;
155-
}
156-
}
157-
158-
}
137+
}

src/Foundation/Authorization.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
namespace TimePHP\Foundation;
4+
5+
use TimePHP\Foundation\SessionHandler;
6+
7+
class Authorization
8+
{
9+
10+
/**
11+
* session handler
12+
*
13+
* @var SessionHandler
14+
*/
15+
private $session;
16+
17+
18+
public function __construct()
19+
{
20+
$this->session = new SessionHandler();
21+
}
22+
23+
/**
24+
* Check if the current user is admin
25+
*
26+
* @return boolean
27+
*/
28+
public function isAdmin(): bool
29+
{
30+
if ($this->session->get("user")->role === "admin") return true;
31+
else return false;
32+
}
33+
34+
/**
35+
* Check if the current user is a user
36+
*
37+
* @return boolean
38+
*/
39+
public function isUser(): bool
40+
{
41+
if ($this->session->get("user")->role === "user") return true;
42+
else return false;
43+
}
44+
45+
/**
46+
* Check if the current user is a user
47+
*
48+
* @return boolean
49+
*/
50+
public function isConnected(): bool
51+
{
52+
if ($this->session->get("csrf_token") !== null) return true;
53+
else return false;
54+
}
55+
}

src/Foundation/SessionHandler.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
namespace TimePHP\Foundation;
4+
5+
use TimePHP\Exception\SessionHandlerException;
6+
7+
class SessionHandler
8+
{
9+
10+
/**
11+
* Return a value from $_SESSION for a specific index
12+
*
13+
* @param string $index
14+
* @return mixed|null
15+
*/
16+
public function get(string $index = null)
17+
{
18+
if ($index === null) {
19+
$list = [];
20+
foreach ($_SESSION as $key => $value) {
21+
if (filter_var($value, FILTER_VALIDATE_INT)) $list[$key] = (int)$value;
22+
elseif (filter_var($value, FILTER_VALIDATE_FLOAT)) $list[$key] = (float)$value;
23+
elseif (filter_var($value, FILTER_VALIDATE_BOOLEAN)) $list[$key] = (bool)$value;
24+
else $list[$key] = $value;
25+
}
26+
return $list;
27+
} else {
28+
if (array_key_exists($index, $_SESSION)) {
29+
if (filter_var($_SESSION[$index], FILTER_VALIDATE_INT)) return (int)$_SESSION[$index];
30+
elseif (filter_var($_SESSION[$index], FILTER_VALIDATE_FLOAT)) return (float)$_SESSION[$index];
31+
elseif (filter_var($_SESSION[$index], FILTER_VALIDATE_BOOLEAN)) return (bool)$_SESSION[$index];
32+
else return $_SESSION[$index];
33+
} else {
34+
return null;
35+
}
36+
}
37+
}
38+
39+
/**
40+
* Set a $_SESSION value for a specifid index
41+
*
42+
* @param mixed $index
43+
* @param mixed $object
44+
* @return self
45+
*/
46+
public function set(string $index, $object): self
47+
{
48+
if($object === null || empty($object)){
49+
throw new SessionHandlerException("set function must have 1 parameter", 7001);
50+
} else {
51+
$_SESSION[$index] = $object;
52+
return $this;
53+
}
54+
}
55+
}

src/Foundation/Twig.php

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
namespace TimePHP\Foundation;
44

55
use Closure;
6+
use DateTime;
7+
use Illuminate\Support\Facades\Session;
68
use Twig\Markup;
79
use Twig\TwigFilter;
810
use Twig\Environment;
911
use Twig\TwigFunction;
12+
use TimePHP\UrlParser\Parser;
1013
use Twig\Loader\FilesystemLoader;
1114
use TimePHP\Exception\TwigException;
15+
use TimePHP\Foundation\SessionHandler;
1216

1317
class Twig
1418
{
@@ -20,6 +24,22 @@ class Twig
2024
*/
2125
private $twig;
2226

27+
28+
/**
29+
* session handler
30+
*
31+
* @var SessionHandler
32+
*/
33+
private $session;
34+
35+
36+
/**
37+
* Url parser
38+
*
39+
* @var Parser
40+
*/
41+
private $request;
42+
2343
/**
2444
* array of custom options
2545
*
@@ -28,6 +48,9 @@ class Twig
2848
public function __construct(array $options)
2949
{
3050

51+
$this->session = new SessionHandler();
52+
$this->request = new Parser();
53+
3154
$this->twig = new Environment(new FilesystemLoader(__DIR__ . "/../../../../../App/Bundle/Views"));
3255

3356
$this->twig->addFunction(new TwigFunction('asset', function ($asset): string {
@@ -40,13 +63,36 @@ public function __construct(array $options)
4063
return sprintf(Router::generate($nameUrl, $params, $flags));
4164
}));
4265
$this->twig->addFunction(new TwigFunction('provideCsrf', function (string $csrfInputName = "csrf_token"): string {
43-
return !empty($_SESSION) ? new Markup("<input type=\"hidden\" name=\"$csrfInputName\" value\"".$_SESSION["csrf_token"]."\"/>", "utf-8") : "";
66+
return !empty($_SESSION) ? new Markup("<input type=\"hidden\" name=\"$csrfInputName\" value=\"{$_SESSION["csrf_token"]}\"/>", "utf-8") : "";
4467
}, ['is_safe' => ['html']]));
4568
$this->twig->addFunction(new TwigFunction('dump', function ($object): string {
4669
ob_start();
4770
dump($object);
4871
return ob_get_clean();
4972
}));
73+
$this->twig->addFunction(new TwigFunction("get", function (string $param) {
74+
return $this->request->get($param) !== null ? $this->request->get($param) : null;
75+
}));
76+
$this->twig->addFunction(new TwigFunction("isConnected", function () {
77+
return $this->session->get("csrf_token") !== null;
78+
}));
79+
$this->twig->addFunction(new TwigFunction("isAdmin", function () {
80+
return $this->session->get("csrf_token") !== null && $this->session->get("user")->role === "admin";
81+
}));
82+
$this->twig->addFunction(new TwigFunction("isUser", function () {
83+
return $this->session->get("csrf_token") !== null && $this->session->get("user")->role === "user";
84+
}));
85+
86+
87+
88+
$this->twig->addFilter(new TwigFilter("truncate", function (string $text, int $length) {
89+
return substr($text, 0, $length);
90+
}));
91+
$this->twig->addFilter(new TwigFilter("formatDate", function (DateTime $date, string $format) {
92+
$date = new DateTime($date);
93+
return $date->format($format);
94+
}));
95+
5096

5197
foreach ($options["twig"] as $function) {
5298

0 commit comments

Comments
 (0)