Skip to content

Commit cc8219e

Browse files
committed
Security classes have been implemented at the framework level, classes for RSA, AES, JWT and Security have been implemented, 2 filters have been implemented through middleware to validate Bearer JWT input and JWT Authorization.
1 parent e58f8fd commit cc8219e

34 files changed

+1106
-233
lines changed

.env.example

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
SERVER_URL="---"
2+
SERVER_URL_AUD="---"
3+
SERVER_TOKEN_TIME_EXP=0
4+
5+
DB_HOST="---"
6+
DB_NAME="---"
7+
DB_USER="---"
8+
DB_PASSWORD="---"
9+
DB_CHARSET="---"
10+
11+
MAIL_DEBUG=0
12+
MAIL_HOST="---"
13+
MAIL_PORT=0
14+
MAIL_EMAIL="---"
15+
MAIL_PASSWORD="---"
16+
MAIL_USER_NAME="---"
17+
18+
RSA_PATH="---"
19+
RSA_PRIVATE_KEY_BITS=0
20+
RSA_DEFAULT_MD="---"
21+
22+
JWT_DEFAULT_MD="---"
23+
24+
AES_METHOD="---"
25+
AES_KEY="---"
26+
AES_IV="---"

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/vendor/
22
/public/
33
.env
4-
/app/Server/Secret/
4+
composer.lock
5+
/app/Server/

README.md

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@ composer require lion-framework/lion-route
2626
composer require lion-framework/lion-mailer
2727
```
2828

29+
##### [PHRoute](https://github.com/mrjgreen/phroute)
30+
```powershell
31+
composer require phroute/phroute
32+
```
33+
34+
##### [PHP-JWT](https://github.com/firebase/php-jwt)
35+
```powershell
36+
composer require firebase/php-jwt
37+
```
38+
2939
##### [Valitron](https://github.com/vlucas/valitron)
3040
```powershell
3141
composer require vlucas/valitron
@@ -36,11 +46,6 @@ composer require vlucas/valitron
3646
composer require vlucas/phpdotenv
3747
```
3848

39-
##### [PHRoute](https://github.com/mrjgreen/phroute)
40-
```powershell
41-
composer require phroute/phroute
42-
```
43-
4449
##### [PHPMailer](https://github.com/PHPMailer/PHPMailer)
4550
```powershell
4651
composer require phpmailer/phpmailer
@@ -51,7 +56,17 @@ composer require phpmailer/phpmailer
5156
composer require phpoffice/phpspreadsheet
5257
```
5358

59+
##### [PHPWord](https://github.com/PHPOffice/PHPWord)
60+
```powershell
61+
composer require phpoffice/phpword
62+
```
63+
5464
##### [Dompdf](https://github.com/dompdf/dompdf)
5565
```powershell
5666
composer require dompdf/dompdf
67+
```
68+
69+
##### [Carbon](https://github.com/briannesbitt/Carbon)
70+
```powershell
71+
composer require nesbot/carbon
5772
```
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Auth;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Models\Auth\DocumentTypesModel;
7+
use App\Models\Class\DocumentTypes;
8+
9+
class DocumentTypesController extends Controller {
10+
11+
private DocumentTypesModel $documentTypesModel;
12+
13+
public function __construct() {
14+
$this->documentTypesModel = new DocumentTypesModel();
15+
}
16+
17+
public function readDocumentTypes(): array {
18+
$list = [];
19+
foreach ($this->documentTypesModel->readDocumentTypesDB() as $key => $documentType) {
20+
$list[$key] = new DocumentTypes(
21+
$documentType['iddocument_types'],
22+
$documentType['document_types_name']
23+
);
24+
}
25+
26+
return $list;
27+
}
28+
29+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Auth;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Functions\{ Security, AES, JWT, RSA };
7+
use App\Models\Class\{ Request, Login };
8+
use App\Models\Auth\LoginModel;
9+
10+
class LoginController extends Controller {
11+
12+
private LoginModel $loginModel;
13+
private Login $login;
14+
15+
public function __construct() {
16+
$this->loginModel = new LoginModel();
17+
}
18+
19+
public function auth(): Request {
20+
$aesDec = AES::decode(self::$request, 'AES_KEY', 'AES_IV');
21+
22+
if (Security::validate((array) $aesDec, Login::getValidate('LoginController', 'auth'))) {
23+
$this->login = new Login($aesDec->users_email, $aesDec->users_password);
24+
$rsaDecode = RSA::decode((object) $this->loginModel->validateAccount($this->login));
25+
26+
if (Security::passwordVerify($this->login->getUsersPassword(), $rsaDecode->users_password)) {
27+
$idusersDB = $this->loginModel->readUserDataDB($this->login);
28+
$idusers = AES::encode((object) $idusersDB, 'AES_KEY', 'AES_IV');
29+
30+
return new Request('success', 'Autenticación exitosa.', [
31+
'jwt' => JWT::encode((array) $idusers, $_ENV['SERVER_TOKEN_TIME_EXP'])
32+
]);
33+
} else {
34+
return new Request('error', "El email/password no son correctos.");
35+
}
36+
} else {
37+
return new Request('error', "Todos los campos deben cumplir sus requerimientos.");
38+
}
39+
}
40+
41+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Auth;
4+
5+
use App\Http\Controllers\Controller;
6+
7+
class LogoutController extends Controller {
8+
9+
public function __construct() {
10+
11+
}
12+
13+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Auth;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Functions\{ Security, AES, RSA };
7+
use App\Models\Auth\RegisterModel;
8+
use App\Models\Class\{ Request, Users, DocumentTypes };
9+
10+
class RegisterController extends Controller {
11+
12+
private RegisterModel $registerModel;
13+
14+
public function __construct() {
15+
$this->registerModel = new RegisterModel();
16+
}
17+
18+
public function createUser() {
19+
$aesDec = AES::decode(self::$request, 'AES_KEY', 'AES_IV');
20+
$aesDec->iddocument_types = (int) $aesDec->iddocument_types;
21+
22+
if (Security::validate((array) $aesDec, Users::getValidate('RegisterController', 'createUser'))) {
23+
$rsaEnc = RSA::encode((object) [
24+
'users_password' => Security::passwordHash($aesDec->users_password),
25+
]);
26+
27+
$users = new Users(null, $aesDec->users_email, $rsaEnc->users_password, $aesDec->users_name, $aesDec->users_last_name, $aesDec->users_document, new DocumentTypes($aesDec->iddocument_types), $aesDec->users_phone);
28+
29+
$columns = ['users_email' => $users->getUsersEmail(), 'users_document' => $users->getUsersDocument(), 'users_phone' => $users->getUsersPhone()];
30+
foreach ($columns as $key => $column) {
31+
$existence = $this->registerModel->validateUserExistenceDB($key, $column);
32+
if ($existence['files'] != 0) {
33+
return new Request('error', "Ya existe '{$column}' dentro del sistema.");
34+
break;
35+
}
36+
}
37+
38+
$request_create = $this->registerModel->createUserDB($users);
39+
return new Request($request_create['status'], $request_create['message']);
40+
} else {
41+
return new Request('error', "Todos los campos deben cumplir sus requerimientos.");
42+
}
43+
}
44+
45+
}

app/Http/Controllers/Authentication/LoginController.php

Lines changed: 0 additions & 17 deletions
This file was deleted.

app/Http/Controllers/Controller.php

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@
22

33
namespace App\Http\Controllers;
44

5-
use Valitron\Validator;
65
use LionMailer\Mailer;
7-
use PHPMailer\PHPMailer\PHPMailer;
8-
use PHPMailer\PHPMailer\SMTP;
9-
use App\Http\Functions\Security;
6+
use PHPMailer\PHPMailer\{ PHPMailer, SMTP };
107

118
class Controller {
129

@@ -33,17 +30,9 @@ public static function init(): void {
3330
]);
3431
}
3532

36-
public static function content(bool $option = true): void {
37-
if ($option) {
38-
self::$request = (object) ($_POST + $_FILES + $_GET + $_SESSION + $_ENV);
39-
} else {
40-
self::$request = (object) json_decode(file_get_contents("php://input"), true);
41-
}
42-
}
43-
44-
public static function validate(Validator $validator, array $rules) {
45-
$validator->rules($rules);
46-
return $validator->validate();
33+
public static function content(): void {
34+
$content = json_decode(file_get_contents("php://input"), true);
35+
self::$request = $content === null ? (object) ($_POST + $_FILES + $_GET) : (object) $content;
4736
}
4837

4938
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Models\Class\Request;
7+
8+
class HomeController extends Controller {
9+
10+
public function __construct() {
11+
12+
}
13+
14+
public function index(): Request {
15+
return new Request('warning', 'Page not found. [index]');
16+
}
17+
18+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Users;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Models\Class\Request;
7+
8+
class ProfileController extends Controller {
9+
10+
public function __construct() {
11+
12+
}
13+
14+
public function info() {
15+
return new Request('success', 'Authorize', [
16+
'info' => self::$request
17+
]);
18+
}
19+
20+
}

app/Http/Functions/AES.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace App\Http\Functions;
4+
5+
class AES {
6+
7+
public function __construct() {
8+
9+
}
10+
11+
public static function encode(object $files, string $select_key, string $select_iv): object {
12+
$data_list = [];
13+
14+
foreach ($files as $key => $file) {
15+
$data_list[$key] = base64_encode(
16+
openssl_encrypt($file, $_ENV['AES_METHOD'], md5($_ENV[$select_key]), OPENSSL_RAW_DATA, $_ENV[$select_iv])
17+
);
18+
}
19+
20+
return (object) $data_list;
21+
}
22+
23+
public static function decode(object $files, string $select_key, string $select_iv): object {
24+
$data_list = [];
25+
26+
foreach ($files as $key => $file) {
27+
$data_list[$key] = openssl_decrypt(
28+
base64_decode($file), $_ENV['AES_METHOD'], md5($_ENV[$select_key]), OPENSSL_RAW_DATA, $_ENV[$select_iv]
29+
);
30+
}
31+
32+
return (object) $data_list;
33+
}
34+
35+
}

app/Http/Functions/Excel.php

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,17 @@
22

33
namespace App\Http\Functions;
44

5-
use PhpOffice\PhpSpreadsheet\Spreadsheet;
5+
use PhpOffice\PhpSpreadsheet\{ Spreadsheet, IOFactory };
6+
use PhpOffice\PhpSpreadsheet\Worksheet\{ Worksheet, Drawing };
7+
use PhpOffice\PhpSpreadsheet\Style\{ Fill, Color };
68
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
7-
use PhpOffice\PhpSpreadsheet\IOFactory;
89
use PhpOffice\PhpSpreadsheet\Reader\Xls;
9-
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
10-
use PhpOffice\PhpSpreadsheet\Style\Fill;
11-
use PhpOffice\PhpSpreadsheet\Style\Color;
12-
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
1310
use App\Http\Functions\Files;
1411

15-
1612
class Excel {
1713

18-
private static Spreadsheet $spreadsheet;
19-
private static Worksheet $worksheet;
14+
private static ?Spreadsheet $spreadsheet = null;
15+
private static ?Worksheet $worksheet = null;
2016
private static array $list_push = [];
2117

2218
public function __construct() {

0 commit comments

Comments
 (0)