Sécurisation, déploiement CI/CD Gitea et documentation INFCDAAL3
CD - Déploiement continu / deploy (push) Successful in 6m44s
CI - Intégration continue / quality-and-tests (push) Failing after 2m30s

- CI/CD Gitea Actions: ci.yml (Pint + PHPUnit), deploy.yml (déploiement SSH)
- Suppression de l'ancien workflow GitHub cassé
- En-têtes de sécurité: ajout CSP et Permissions-Policy
- RGPD: droit à l'effacement (anonymisation du compte) + tests
- Correctifs: ForceHttps hors env testing, timestamps du modèle Utilisateur,
  suppression des migrations en doublon (migrate échouait sur base neuve)
- Qualité: formatage Laravel Pint sur l'ensemble du code
- Documentation dossier technique (docs/) + .docx + .pptx

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-06 11:09:34 +02:00
parent de45e62d20
commit e5e6f72f92
38 changed files with 756 additions and 291 deletions
+68
View File
@@ -0,0 +1,68 @@
<?php
namespace Tests\Feature;
use App\Models\Role;
use App\Models\Utilisateur;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Hash;
use Tests\TestCase;
class SecuriteTest extends TestCase
{
use RefreshDatabase;
/**
* Vérifie que les en-têtes de sécurité sont bien présents sur les réponses.
*/
public function test_les_entetes_de_securite_sont_presents(): void
{
$response = $this->get('/');
$response->assertStatus(200);
$response->assertHeader('X-Content-Type-Options', 'nosniff');
$response->assertHeader('X-Frame-Options', 'SAMEORIGIN');
$response->assertHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
$response->assertHeader('Content-Security-Policy');
$response->assertHeader('Permissions-Policy');
}
/**
* Vérifie que les pages protégées redirigent un visiteur non authentifié
* vers la page de connexion (contrôle d'accès).
*/
public function test_les_pages_protegees_exigent_une_authentification(): void
{
$response = $this->get('/profile/settings');
$response->assertRedirect('/login');
}
/**
* Vérifie le droit à l'effacement RGPD : la suppression du compte
* anonymise bien les données personnelles de l'utilisateur.
*/
public function test_la_suppression_de_compte_anonymise_les_donnees(): void
{
$role = Role::create(['Nom' => 'Utilisateur']);
$user = Utilisateur::create([
'Pseudo' => 'JeanDupont',
'Email' => 'jean.dupont@example.com',
'MotDePasse' => Hash::make('motdepasse123'),
'ID_Role' => $role->ID_Role,
'Statut' => 'Actif',
]);
$response = $this->actingAs($user)->delete('/profile', [
'MotDePasse_Confirmation' => 'motdepasse123',
]);
$response->assertRedirect('/');
$user->refresh();
$this->assertSame('Utilisateur supprimé', $user->Pseudo);
$this->assertSame('Inactif', $user->Statut);
$this->assertStringNotContainsString('jean.dupont', $user->Email);
}
}