Compare commits

..

1 Commits

Author SHA1 Message Date
Siwa12100 811f6e686e test pour rendre le mdp invisible...
1 year ago

@ -1,79 +0,0 @@
kind: pipeline
type: docker
name: default
trigger:
event:
- push
steps:
- name: build
image: mcr.microsoft.com/dotnet/sdk:8.0
commands:
- cd VeraxShield
- dotnet restore VeraxShield.sln
- dotnet build VeraxShield.sln -c Release --no-restore
- dotnet publish VeraxShield.sln -c Release --no-restore -o $CI_PROJECT_DIR/build/release
- name: tests
image: mcr.microsoft.com/dotnet/sdk:8.0
commands:
- cd VeraxShield
- dotnet restore VeraxShield.sln
- dotnet test VeraxShield.sln --no-restore
depends_on: [build]
- name: code-inspection
image: hub.codefirst.iut.uca.fr/marc.chevaldonne/codefirst-dronesonarplugin-dotnet8
secrets: [ SECRET_SONAR_LOGIN ]
environment:
sonar_host: https://codefirst.iut.uca.fr/sonar/
sonar_token:
from_secret: SECRET_SONAR_LOGIN # Secret de Drone
project_key: VeraxShield
commands:
- cd VeraxShield/
- dotnet restore VeraxShield.sln
- dotnet sonarscanner begin /k:$${project_key} /d:sonar.host.url=$${sonar_host} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions="VeraxShield/wwwroot/**","VeraxShield/composants/**","VeraxShield/pages/**","VeraxShield/Properties/**","TestVeraxShield/**","VeraxShield/Program.cs","VeraxShield/services/UtilisateursDataService/UtilisateursDataServiceApi.cs","VeraxShield/services/UtilisateursDataService/UtilisateursDataServiceFactice.cs" /d:sonar.login=$${sonar_token}
- dotnet build VeraxShield.sln -c Release --no-restore
- dotnet test VeraxShield.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage"
- reportgenerator -reports:"**/coverage.cobertura.xml" -reporttypes:SonarQube -targetdir:"coveragereport"
- dotnet publish VeraxShield.sln -c Release --no-restore -o $CI_PROJECT_DIR/build/release
- dotnet sonarscanner end /d:sonar.login=$${sonar_token}
when:
branch:
- master
event:
- push
- pull_request
depends_on: [build,tests]
- name: docker-build-and-push
image: plugins/docker
settings:
dockerfile: dockerfile
context: .
registry: hub.codefirst.iut.uca.fr
repo: hub.codefirst.iut.uca.fr/louis.laborie/sae_2a_blazor
username:
from_secret: SECRET_REGISTRY_USERNAME
password:
from_secret: SECRET_REGISTRY_PASSWORD
when:
branch:
- master
- rebase
- name: deploy-container
image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dockerproxy-clientdrone:latest
environment:
IMAGENAME: hub.codefirst.iut.uca.fr/louis.laborie/sae_2a_blazor:latest
CONTAINERNAME: verax-blazor
COMMAND: create
OVERWRITE: true
CODEFIRST_CLIENTDRONE_ENV_ASPNETCORE_HTTP_PORTS: 80
ADMINS: louislaborie,tonyfages,noasillard,jeanmarcillac,shanacascarra
depends_on:
- docker-build-and-push

2
.gitignore vendored

@ -6,8 +6,6 @@
bin/ bin/
obj/ obj/
# Common node modules locations # Common node modules locations
/node_modules /node_modules
/wwwroot/node_modules /wwwroot/node_modules

@ -1,47 +1,2 @@
<h1 align="center">VeraxShield</h1> # Blazor_SAE
<p align="center">
<img src="https://img.shields.io/badge/C%23-239120.svg?style=for-the-badge&logo=c-sharp&logoColor=white" alt="C#"/>
<img src="https://img.shields.io/badge/Blazor-512BD4.svg?style=for-the-badge&logo=blazor&logoColor=white" alt="Blazor"/>
<img src="https://img.shields.io/badge/.NET-512BD4.svg?style=for-the-badge&logo=.net&logoColor=white" alt=".NET"/>
<img src="https://img.shields.io/badge/HTML5-E34F26.svg?style=for-the-badge&logo=html5&logoColor=white" alt="HTML5"/>
<img src="https://img.shields.io/badge/CSS3-1572B6.svg?style=for-the-badge&logo=css3&logoColor=white" alt="CSS3"/>
</p>
## Description
VeraxShield est une application web avancée développée avec Blazor, représentant la partie administration de notre projet plus large, [Verax](https://codefirst.iut.uca.fr/git/Verax/Verax). Conçue pour offrir une interface de gestion intuitive, VeraxShield permet aux administrateurs de gérer efficacement les différents aspects du système Verax.
### Fonctionnalités Clés
- **Gestion des Utilisateurs** : Permet aux administrateurs de créer, modifier et supprimer des comptes utilisateurs. Inclut la gestion des rôles et des permissions pour un contrôle d'accès granulaire.
- **Notifications et Suivis des Actions** : Envoie des notifications sur les différentes actions des modérateurs afin pour assurer une meilleure gestion du système.
### Objectif du Projet
L'objectif principal de VeraxShield est de fournir une plateforme centralisée pour la gestion et le contrôle administratif du système Verax, en rationalisant les processus administratifs et en offrant une vue d'ensemble claire des opérations.
## Installation et Configuration
1. Clonez le dépôt : `git clone (https://codefirst.iut.uca.fr/git/Verax/Blazor_SAE.git)`
2. Ouvrez le fichier `VeraxShield.sln` avec Visual Studio.
3. Restaurez les packages nécessaires.
4. Lancez le projet depuis Visual Studio.
<h2 align="center">Equipe de Développement</h2>
<p align="center" >
<a href="https://codefirst.iut.uca.fr/git/louis.laborie" style="margin-right: 20px;">
<img src="img/Louis.png" width="50" height="50" title="Louis Laborie" alt="Louis Laborie"/>
</a>
<a href="https://codefirst.iut.uca.fr/git/shana.cascarra" style="margin-right: 20px;">
<img src="img/Shana.png" width="50" height="50" title="Shana Cascarra" alt="Shana Cascarra"/>
</a>
<a href="https://codefirst.iut.uca.fr/git/jean.marcillac" style="margin-right: 20px;">
<img src="img/Jean.png" width="50" height="50" title="Jean Marcillac" alt="Jean Marcillac"/>
</a>
<a href="https://codefirst.iut.uca.fr/git/tony.fages" style="margin-right: 20px;">
<img src="img/Tony.png" width="50" height="50" title="Tony Fages" alt="Tony Fages"/>
</a>
<a href="https://codefirst.iut.uca.fr/git/noa.sillard" style="margin-right: 20px;">
<img src="img/Noa.png" width="50" height="50" title="Noa Sillard" alt="Noa Sillard"/>
</a>
<p>

@ -1,15 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/.idea.VeraxShield.iml
/contentModel.xml
/modules.xml
/projectSettingsUpdater.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# GitHub Copilot persisted chat sessions
/copilot/chatSessions

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders>
<Path>../../Blazor_SAE</Path>
</attachedFolders>
<explicitIncludes />
<explicitExcludes />
</component>
</project>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

@ -1,105 +0,0 @@
using System.Security.Claims;
using Moq;
using VeraxShield.composants.formulaires.modeles;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace TestVeraxShield;
public class AuthentificationServiceTests
{
private readonly AuthentificationService _authService;
private readonly Mock<IUtilisateursDataService> _mockDataService = new Mock<IUtilisateursDataService>();
public AuthentificationServiceTests()
{
_authService = new AuthentificationService(_mockDataService.Object);
}
[Fact]
public async Task Connexion_WithValidCredentials_ShouldSucceed()
{
// Arrange
var testUser = new Utilisateur("testUser", "Test", "User", "test@user.com", BCrypt.Net.BCrypt.HashPassword("password"), "User", false);
_mockDataService.Setup(s => s.getAllUtilisateurs())
.ReturnsAsync(new List<Utilisateur> { testUser });
var requete = new RequeteConnexion
{
Pseudo = "testUser",
MotDePasse = "password"
};
// Act & Assert
await _authService.Connexion(requete);
}
[Fact]
public async Task Connexion_WithInvalidCredentials_ShouldThrowException()
{
// Arrange
_mockDataService.Setup(s => s.getAllUtilisateurs())
.ReturnsAsync(new List<Utilisateur>());
var requete = new RequeteConnexion
{
Pseudo = "nonExistentUser",
MotDePasse = "wrongPassword"
};
// Act & Assert
await Assert.ThrowsAsync<Exception>(() => _authService.Connexion(requete));
}
[Fact]
public async Task Inscription_ShouldCreateNewUser()
{
// Arrange
var requete = new RequeteInscription
{
Pseudo = "newUser",
Nom = "New",
Prenom = "User",
Mail = "new@user.com",
MotDePasse = "newPassword"
};
// Setup the mock to verify that AjouterUtilisateur is called with a Utilisateur that matches the inscription details
_mockDataService.Setup(s => s.AjouterUtilisateur(It.IsAny<Utilisateur>()))
.Returns(Task.CompletedTask)
.Callback<Utilisateur>(u =>
{
Assert.Equal(requete.Pseudo, u.Pseudo);
Assert.True(BCrypt.Net.BCrypt.Verify(requete.MotDePasse, u.Mdp));
});
// Act
await _authService.Inscription(requete);
}
[Fact]
public async Task GetUtilisateur_ReturnsCorrectUser_WithClaims()
{
// Arrange
var expectedPseudo = "testUser";
var expectedRole = "User";
var testUser = new Utilisateur("testUser", "Test", "User", "test@user.com", BCrypt.Net.BCrypt.HashPassword("password"), "User", false);
var mockDataService = new Mock<IUtilisateursDataService>();
mockDataService.Setup(s => s.getAllUtilisateurs())
.ReturnsAsync(new List<Utilisateur> { testUser });
var authService = new AuthentificationService(mockDataService.Object);
// Act
var utilisateurCourant = await authService.GetUtilisateur(expectedPseudo);
utilisateurCourant.Claims.Add(ClaimTypes.Email, "test@user.com");
// Assert
Assert.NotNull(utilisateurCourant);
Assert.True(utilisateurCourant.EstAuthentifie);
Assert.Equal(expectedPseudo, utilisateurCourant.Pseudo);
}
}

@ -1,85 +0,0 @@
using Moq;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using VeraxShield.composants.formulaires.modeles;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
using Xunit;
namespace VeraxShield.UnitTests
{
public class DonneurEtatTests
{
private readonly DonneurEtat _donneurEtat;
private readonly Mock<IAuthentificationService> _mockAuthService;
private readonly Mock<IUtilisateursDataService> _mockUserDataService;
public DonneurEtatTests()
{
_mockAuthService = new Mock<IAuthentificationService>();
_mockUserDataService = new Mock<IUtilisateursDataService>();
_donneurEtat = new DonneurEtat(_mockAuthService.Object, _mockUserDataService.Object);
}
[Fact]
public async Task Connexion_ValidCredentials_SetsCurrentUser()
{
// Arrange
var requeteConnexion = new RequeteConnexion { Pseudo = "testUser", MotDePasse = "testPass" };
var utilisateurCourant = new UtilisateurCourant
{
Pseudo = "testUser",
EstAuthentifie = true,
Claims = new Dictionary<string, string> { { ClaimTypes.Role, "User" } }
};
_mockAuthService.Setup(x => x.GetUtilisateur(requeteConnexion.Pseudo)).ReturnsAsync(utilisateurCourant);
_mockAuthService.Setup(x => x.Connexion(requeteConnexion)).Returns(Task.CompletedTask);
// Act
await _donneurEtat.Connexion(requeteConnexion);
// Assert
Assert.NotNull(_donneurEtat._utilisateurCourant);
Assert.True(_donneurEtat._utilisateurCourant.EstAuthentifie);
_mockAuthService.Verify(x => x.Connexion(requeteConnexion), Times.Once);
_mockAuthService.Verify(x => x.GetUtilisateur(requeteConnexion.Pseudo), Times.Once);
}
[Fact]
public async Task Deconnexion_ClearsCurrentUser()
{
// Arrange - assume user is logged in
_donneurEtat._utilisateurCourant = new UtilisateurCourant { EstAuthentifie = true };
// Act
await _donneurEtat.Deconnexion();
// Assert
Assert.Null(_donneurEtat._utilisateurCourant);
}
[Fact]
public async Task Inscription_ValidData_RegistersUser()
{
// Arrange
var requeteInscription = new RequeteInscription
{
Pseudo = "newUser",
MotDePasse = "newPass",
Mail = "newUser@test.com",
Nom = "New",
Prenom = "User"
};
_mockAuthService.Setup(x => x.Inscription(requeteInscription)).Returns(Task.CompletedTask);
// Act
await _donneurEtat.Inscription(requeteInscription);
// Assert - Since Inscription does not automatically log in the user, we check if the method was called.
_mockAuthService.Verify(x => x.Inscription(requeteInscription), Times.Once);
}
}
}

@ -1,45 +0,0 @@
using Moq;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace TestVeraxShield;
public class IAuthentificationServiceTests
{
private readonly Mock<IUtilisateursDataService> _mockDataService;
private readonly AuthentificationService _authService;
public IAuthentificationServiceTests()
{
_mockDataService = new Mock<IUtilisateursDataService>();
_authService = new AuthentificationService(_mockDataService.Object);
}
[Fact]
public async Task GetUtilisateur_ValidUser_ReturnsUser()
{
// Arrange
var expectedUser = new UtilisateurCourant { Pseudo = "user1", EstAuthentifie = true };
_mockDataService.Setup(x => x.getAllUtilisateurs()).ReturnsAsync(new List<Utilisateur>
{
new Utilisateur("user1", "Name", "Surname", "user1@example.com", "password", "User", false)
});
// Act
var result = await _authService.GetUtilisateur("user1");
// Assert
Assert.Equal(expectedUser.Pseudo, result.Pseudo);
Assert.True(result.EstAuthentifie);
}
[Fact]
public async Task GetUtilisateur_NonExistentUser_ThrowsException()
{
// Arrange
_mockDataService.Setup(x => x.getAllUtilisateurs()).ReturnsAsync(new List<Utilisateur>());
// Act & Assert
await Assert.ThrowsAsync<Exception>(() => _authService.GetUtilisateur("user2"));
}
}

@ -1,25 +0,0 @@
using Moq;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace TestVeraxShield;
public class IUtilisateursDataServiceTests
{
private readonly Mock<IUtilisateursDataService> _service = new Mock<IUtilisateursDataService>();
[Fact]
public async Task AjouterUtilisateur_AddsUserSuccessfully()
{
// Arrange
var user = new Utilisateur("testUser", "User", "Test", "dez", "password", "User", false);
_service.Setup(s => s.AjouterUtilisateur(It.IsAny<Utilisateur>()))
.Returns(Task.CompletedTask)
.Callback<Utilisateur>(u => Assert.Equal("testUser", u.Pseudo));
// Act
await _service.Object.AjouterUtilisateur(user);
// Assert is handled by the Callback
}
}

@ -1,47 +0,0 @@
namespace TestVeraxShield;
public class ModeleAppUtilisateurTests
{
[Fact]
public void Constructeur_DoitInitialiserProprietes()
{
// Arrange & Act
var utilisateur = new ModeleAppUtilisateur("pseudoTest", "NomTest", "PrenomTest", "email@test.com", "motdepasse", "RoleTest");
// Assert
Assert.Equal("pseudoTest", utilisateur.Pseudo);
Assert.Equal("NomTest", utilisateur.Nom);
Assert.Equal("PrenomTest", utilisateur.Prenom);
Assert.Equal("email@test.com", utilisateur.Mail);
Assert.Equal("motdepasse", utilisateur.MotDePasse);
Assert.Contains("RoleTest", utilisateur.Roles);
}
[Fact]
public void AjouterRole_DoItAjouterNouveauRole()
{
// Arrange
var utilisateur = new ModeleAppUtilisateur("pseudoTest", "NomTest", "PrenomTest", "email@test.com", "motdepasse", "RoleTest");
// Act
utilisateur.ajouterRole("NouveauRole");
// Assert
Assert.Contains("NouveauRole", utilisateur.Roles);
}
[Fact]
public void SupprimerRole_DoItSupprimerRoleExistant()
{
// Arrange
var utilisateur = new ModeleAppUtilisateur("pseudoTest", "NomTest", "PrenomTest", "email@test.com", "motdepasse", "RoleTest");
utilisateur.ajouterRole("NouveauRole");
// Act
utilisateur.supprimerRole("RoleTest");
// Assert
Assert.DoesNotContain("RoleTest", utilisateur.Roles);
}
}

@ -1,57 +0,0 @@
namespace TestVeraxShield;
public class ModeleCurrentUserTests
{
[Fact]
public void InitializesCorrectly()
{
var utilisateur = new UtilisateurCourant();
Assert.Null(utilisateur.Claims);
Assert.False(utilisateur.EstAuthentifie);
Assert.Null(utilisateur.Pseudo);
}
[Fact]
public void AddsAndUpdatesClaimsCorrectly()
{
var utilisateur = new UtilisateurCourant { Claims = new Dictionary<string, string>() };
utilisateur.Claims.Add("role", "user");
Assert.Equal("user", utilisateur.Claims["role"]);
utilisateur.Claims["role"] = "admin";
Assert.Equal("admin", utilisateur.Claims["role"]);
}
[Fact]
public void RemovesClaimsCorrectly()
{
var utilisateur = new UtilisateurCourant { Claims = new Dictionary<string, string>() };
utilisateur.Claims.Add("role", "user");
utilisateur.Claims.Remove("role");
Assert.False(utilisateur.Claims.ContainsKey("role"));
}
[Fact]
public void TogglesAuthenticationState()
{
var utilisateur = new UtilisateurCourant();
utilisateur.EstAuthentifie = true;
Assert.True(utilisateur.EstAuthentifie);
utilisateur.EstAuthentifie = false;
Assert.False(utilisateur.EstAuthentifie);
}
[Fact]
public void UpdatesPseudoCorrectly()
{
var utilisateur = new UtilisateurCourant();
utilisateur.Pseudo = "TestUser";
Assert.Equal("TestUser", utilisateur.Pseudo);
}
}

@ -1,66 +0,0 @@
using VeraxShield.modele.utilisateurs;
namespace TestVeraxShield;
public class ModeleUtilisateurTests
{
[Fact]
public void ConstructorAssignsPropertiesCorrectly()
{
// Arrange
string expectedPseudo = "TestPseudo";
string expectedNom = "TestNom";
string expectedPrenom = "TestPrenom";
string expectedRole = "TestRole";
string expectedMdp = "TestMdp";
string expectedMail = "test@mail.com";
bool expectedIsBan = true;
// Act
Utilisateur utilisateur = new Utilisateur(expectedPseudo, expectedNom, expectedPrenom, expectedRole, expectedMdp, expectedMail, expectedIsBan);
// Assert
Assert.Equal(expectedPseudo, utilisateur.Pseudo);
Assert.Equal(expectedNom, utilisateur.Nom);
Assert.Equal(expectedPrenom, utilisateur.Prenom);
Assert.Equal(expectedRole, utilisateur.Role);
Assert.Equal(expectedMdp, utilisateur.Mdp);
Assert.Equal(expectedMail, utilisateur.Mail);
Assert.Equal(expectedIsBan, utilisateur.IsBan);
}
[Theory]
[InlineData("NewPseudo", "NewNom", "NewPrenom", "NewRole", "NewMdp", "new@mail.com", false)]
[InlineData("AnotherPseudo", "AnotherNom", "AnotherPrenom", "AnotherRole", "AnotherMdp", "another@mail.com", true)]
public void PropertiesUpdateCorrectly(string pseudo, string nom, string prenom, string role, string mdp, string mail, bool isBan)
{
// Arrange
Utilisateur utilisateur = new Utilisateur(pseudo, nom, prenom, role, mdp, mail, isBan);
// Act - changing values to test setter
string updatedPseudo = pseudo + "Update";
string updatedNom = nom + "Update";
string updatedPrenom = prenom + "Update";
string updatedRole = role + "Update";
string updatedMdp = mdp + "Update";
string updatedMail = "updated@" + mail;
bool updatedIsBan = !isBan;
utilisateur.Pseudo = updatedPseudo;
utilisateur.Nom = updatedNom;
utilisateur.Prenom = updatedPrenom;
utilisateur.Role = updatedRole;
utilisateur.Mdp = updatedMdp;
utilisateur.Mail = updatedMail;
utilisateur.IsBan = updatedIsBan;
// Assert
Assert.Equal(updatedPseudo, utilisateur.Pseudo);
Assert.Equal(updatedNom, utilisateur.Nom);
Assert.Equal(updatedPrenom, utilisateur.Prenom);
Assert.Equal(updatedRole, utilisateur.Role);
Assert.Equal(updatedMdp, utilisateur.Mdp);
Assert.Equal(updatedMail, utilisateur.Mail);
Assert.Equal(updatedIsBan, utilisateur.IsBan);
}
}

@ -1,47 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="bunit.web" Version="1.27.17" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0"/>
<PackageReference Include="Moq" Version="4.20.70" />
<PackageReference Include="RichardSzalay.MockHttp" Version="7.0.0" />
<PackageReference Include="xunit" Version="2.4.2"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="6.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\VeraxShield\VeraxShield.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Remove="factoriesTests\**" />
<Compile Remove="ModeleTests\**" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Remove="factoriesTests\**" />
<EmbeddedResource Remove="ModeleTests\**" />
</ItemGroup>
<ItemGroup>
<None Remove="factoriesTests\**" />
<None Remove="ModeleTests\**" />
</ItemGroup>
</Project>

@ -1,56 +0,0 @@
using Microsoft.AspNetCore.Components;
using Moq;
using Newtonsoft.Json;
using RichardSzalay.MockHttp;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace TestVeraxShield;
public class UtilisateursDataServiceApiTests
{
private readonly MockHttpMessageHandler _mockHttp;
private readonly HttpClient _clientHttp;
private readonly Mock<NavigationManager> _mockNavigationManager;
private readonly UtilisateursDataServiceApi _service;
public UtilisateursDataServiceApiTests()
{
_mockHttp = new MockHttpMessageHandler();
// Mock the response for the API call
_mockHttp.When("https://Verax.com/api/utilisateurs/recuperer")
.Respond("application/json", JsonConvert.SerializeObject(new List<Utilisateur>
{
new Utilisateur("testUser", "User", "Test", "dez", "password", "User", false)
}));
_clientHttp = _mockHttp.ToHttpClient();
_clientHttp.BaseAddress = new System.Uri("https://Verax.com");
_mockNavigationManager = new Mock<NavigationManager>();
_service = new UtilisateursDataServiceApi(_clientHttp, _mockNavigationManager.Object);
}
[Fact]
public async Task GetAllUtilisateurs_ReturnsUsers()
{
// Act
var users = await _service.getAllUtilisateurs();
// Assert
Assert.Single(users);
Assert.Equal("testUser", users[0].Pseudo);
}
[Fact]
public async Task GetUtilisateurFromPseudo_ReturnsUser()
{
// Act
var user = await _service.getUtilisateurFromPseudo("testUser");
// Assert
Assert.Equal("testUser", user.Pseudo);
}
}

@ -1,56 +0,0 @@
namespace TestVeraxShield.factoriesTests;
using Xunit;
using VeraxShield.factories;
using VeraxShield.composants.formulaires.modeles;
using VeraxShield.modele.utilisateurs;
public class UtilisateursFactoryTests
{
[Fact]
public void ConvertsToUtilisateur_WithNewPasswordHashing()
{
// Arrange
var modele = new FormulaireAjoutModele { Mdp = "newPassword", /* other properties */ };
// Act
var utilisateur = UtilisateursFactory.toUtilisateur(modele);
// Assert
Assert.NotEqual("newPassword", utilisateur.Mdp);
}
[Fact]
public void ConvertsToModele_FromUtilisateur()
{
// Arrange
var utilisateur = new Utilisateur("pseudo", "nom", "prenom", "role", "mdp", "mail", false);
// Act
var modele = UtilisateursFactory.toModele(utilisateur);
// Assert
}
[Fact]
public void ConvertsToModele_FromUtilisateurs()
{
// Arrange
var utilisateur = new Utilisateur("pseudo", "nom", "prenom", "role", "mdp", "mail", false);
// Act
var modele = UtilisateursFactory.toModele(utilisateur);
// Assert
Assert.Equal(utilisateur.Pseudo, modele.Pseudo);
Assert.Equal(utilisateur.Nom, modele.Nom);
Assert.Equal(utilisateur.Prenom, modele.Prenom);
Assert.Equal(utilisateur.Role, modele.Role);
Assert.Equal(utilisateur.Mail, modele.Mail);
Assert.Equal(utilisateur.IsBan, modele.IsBan);
}
}

@ -5,8 +5,6 @@ VisualStudioVersion = 17.8.34322.80
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VeraxShield", "VeraxShield\VeraxShield.csproj", "{40D16910-ADA7-496E-BA48-AA9D6FF1E502}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VeraxShield", "VeraxShield\VeraxShield.csproj", "{40D16910-ADA7-496E-BA48-AA9D6FF1E502}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestVeraxShield", "TestVeraxShield\TestVeraxShield.csproj", "{7924C3CD-C50B-41D1-8A93-C4E0AF0F1B3C}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -17,10 +15,6 @@ Global
{40D16910-ADA7-496E-BA48-AA9D6FF1E502}.Debug|Any CPU.Build.0 = Debug|Any CPU {40D16910-ADA7-496E-BA48-AA9D6FF1E502}.Debug|Any CPU.Build.0 = Debug|Any CPU
{40D16910-ADA7-496E-BA48-AA9D6FF1E502}.Release|Any CPU.ActiveCfg = Release|Any CPU {40D16910-ADA7-496E-BA48-AA9D6FF1E502}.Release|Any CPU.ActiveCfg = Release|Any CPU
{40D16910-ADA7-496E-BA48-AA9D6FF1E502}.Release|Any CPU.Build.0 = Release|Any CPU {40D16910-ADA7-496E-BA48-AA9D6FF1E502}.Release|Any CPU.Build.0 = Release|Any CPU
{7924C3CD-C50B-41D1-8A93-C4E0AF0F1B3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7924C3CD-C50B-41D1-8A93-C4E0AF0F1B3C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7924C3CD-C50B-41D1-8A93-C4E0AF0F1B3C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7924C3CD-C50B-41D1-8A93-C4E0AF0F1B3C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

@ -4,11 +4,26 @@
</Found> </Found>
<NotFound> <NotFound>
<CascadingAuthenticationState> <CascadingAuthenticationState>
<VeraxShield.pages.erreurs.ErreurParDefaut/> <LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</CascadingAuthenticationState> </CascadingAuthenticationState>
</NotFound> </NotFound>
</Router> </Router>
@* <Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<PageTitle>Not found</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router> *@

@ -13,17 +13,17 @@ var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages(); builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor(); builder.Services.AddServerSideBlazor();
// Ajout du client http par d<>faut :
builder.Services.AddHttpClient(); builder.Services.AddHttpClient();
// Service factice : // Ajout du service de gestion des utilisateurs :
// On le met scoped, car c'est comme <20>a qu'est le service du localStorage alors sinon <20>a marche pas...
builder.Services.AddScoped<IUtilisateursDataService, UtilisateursDataServiceFactice>(); builder.Services.AddScoped<IUtilisateursDataService, UtilisateursDataServiceFactice>();
// Utilisation de l'api : // Ajout du service pour le Blazored LocalStorage :
//builder.Services.AddScoped<IUtilisateursDataService, UtilisateursDataServiceApi>();
builder.Services.AddBlazoredLocalStorage(); builder.Services.AddBlazoredLocalStorage();
// Ajout de Blazorise :
builder.Services builder.Services
.AddBlazorise(options => .AddBlazorise(options =>
{ {
@ -32,6 +32,7 @@ builder.Services
.AddBootstrapProviders() .AddBootstrapProviders()
.AddFontAwesomeIcons(); .AddFontAwesomeIcons();
// Ajout de services pour l'authenfication :
builder.Services.AddOptions(); builder.Services.AddOptions();
builder.Services.AddAuthorizationCore(); builder.Services.AddAuthorizationCore();
builder.Services.AddScoped<DonneurEtat>(); builder.Services.AddScoped<DonneurEtat>();

@ -1,22 +1,28 @@
{ {
"iisSettings": {
"iisExpress": {
"applicationUrl": "http://localhost:38362",
"sslPort": 44368
}
},
"profiles": { "profiles": {
"http": { "http": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"applicationUrl": "http://localhost:5272",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
}, }
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5272"
}, },
"https": { "https": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"applicationUrl": "https://localhost:7112;http://localhost:5272",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
}, }
"dotnetRunMessages": true,
"applicationUrl": "https://localhost:7112;http://localhost:5272"
}, },
"IIS Express": { "IIS Express": {
"commandName": "IISExpress", "commandName": "IISExpress",
@ -24,24 +30,6 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"WSL": {
"commandName": "WSL2",
"launchBrowser": true,
"launchUrl": "https://localhost:7112",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_URLS": "https://localhost:7112;http://localhost:5272"
},
"distributionName": ""
}
},
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:38362",
"sslPort": 44368
} }
} }
} }

@ -11,12 +11,11 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
<PackageReference Include="Blazored.LocalStorage" Version="4.4.0" /> <PackageReference Include="Blazored.LocalStorage" Version="4.4.0" />
<PackageReference Include="Blazorise.Bootstrap" Version="1.4.1" /> <PackageReference Include="Blazorise.Bootstrap" Version="1.4.0" />
<PackageReference Include="Blazorise.Components" Version="1.4.0" /> <PackageReference Include="Blazorise.Components" Version="1.4.0" />
<PackageReference Include="Blazorise.DataGrid" Version="1.4.1" /> <PackageReference Include="Blazorise.DataGrid" Version="1.4.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.4.1" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.4.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -1,33 +0,0 @@
@inherits LayoutComponentBase
<head>
<link rel="stylesheet" href="css/composants/navBar/NavBarPrincipale.css" />
</head>
<Bar Breakpoint="Breakpoint.Desktop" class="bar-container">
<BarBrand>
<img class="logo" src="/ressources/images/logo/logo.png" Text="Logo de Verax" Fluid @onclick="@NavAccueil"/>
</BarBrand>
<BarToggler />
<BarMenu class="bar-menu">
<BarItem>
<BarLink class="bar-link" @onclick="@NavUtilisateurs">Utilisateurs</BarLink>
</BarItem>
<BarItem>
<BarLink class="bar-link" @onclick="@NavArticles">Articles</BarLink>
</BarItem>
<BarItem>
<BarLink class="bar-link" @onclick="@NavModerateurs">Modérateurs</BarLink>
</BarItem>
</BarMenu>
<BarEnd>
<BarItem class="bar-role">
@DonneurEtat.getUtilisateurCourant().Pseudo
</BarItem>
<BarItem>
<Button Color="Color.Primary" @onclick="@Deconnecter">Deconnexion</Button>
</BarItem>
</BarEnd>
</Bar>
@Body

@ -1,39 +0,0 @@
using Microsoft.AspNetCore.Components;
namespace VeraxShield.composants.affichages.navBar
{
public partial class NavBarPrincipale
{
[Inject]
private DonneurEtat DonneurEtat { get; set; }
[Inject]
private NavigationManager NavigationManager { get; set; }
private async Task NavUtilisateurs()
{
NavigationManager.NavigateTo("/utilisateurs/liste");
}
private async Task NavArticles()
{
NavigationManager.NavigateTo("/articles/liste");
}
private async Task NavModerateurs()
{
NavigationManager.NavigateTo("/moderateurs/liste");
}
private async Task Deconnecter()
{
await DonneurEtat.Deconnexion();
NavigationManager.NavigateTo("/connexion");
}
private async Task NavAccueil()
{
NavigationManager.NavigateTo("/");
}
}
}

@ -1,18 +1,10 @@
@using VeraxShield.modele.utilisateurs; @using VeraxShield.modele.utilisateurs;
@using Microsoft.AspNetCore.Components; @using Microsoft.AspNetCore.Components;
@using VeraxShield.composants.modals; @using VeraxShield.composants.modals;
@using VeraxShield.composants.affichages.navBar;
@layout NavBarPrincipale
<head>
<link rel="stylesheet" href="css/composants/affichages/utilisateurs/datagridUtilisateurs.css">
</head>
<DataGrid TItem="Utilisateur" <DataGrid TItem="Utilisateur"
Data="@Utilisateurs" Data="@Utilisateurs"
@bind-SelectedRow="@UtilisateurSelectionne" @bind-SelectedRow="@utilisateurSelectionne"
Responsive Responsive
ShowPager ShowPager
ShowPageSizes ShowPageSizes
@ -27,48 +19,30 @@
<DataGridColumn Field="@nameof(Utilisateur.Pseudo)" Caption="Pseudo" Sortable="false" /> <DataGridColumn Field="@nameof(Utilisateur.Pseudo)" Caption="Pseudo" Sortable="false" />
<DataGridColumn Field="@nameof(Utilisateur.Prenom)" Caption="Prenom" Editable /> <DataGridColumn Field="@nameof(Utilisateur.Prenom)" Caption="Prenom" Editable />
<DataGridColumn Field="@nameof(Utilisateur.Nom)" Caption="Nom" Editable /> <DataGridColumn Field="@nameof(Utilisateur.Nom)" Caption="Nom" Editable />
<DataGridColumn Field="@nameof(Utilisateur.IsBan)" Caption="Banissement" Editable > <DataGridColumn Field="@nameof(Utilisateur.IsBan)" Caption="Banissement" Editable />
<DisplayTemplate>
@if (context.IsBan)
{
<Badge Color="Color.Danger" Pill>Ban</Badge>
} else
{
<Badge Color="Color.Success" Pill>Valide</Badge>
}
</DisplayTemplate>
</DataGridColumn>
<DataGridColumn Field="@nameof(Utilisateur.Role)" Caption="role" Editable />
<DataGridColumn Field="@nameof(Utilisateur.Mail)" Caption="mail" Editable />
<DataGridColumn Field="@nameof(Utilisateur.Pseudo)" Caption="Gerer"> <DataGridColumn Field="@nameof(Utilisateur.Pseudo)" Caption="Gerer">
<DisplayTemplate> <DisplayTemplate>
<button type="button" class="btn btn-primary editButton" @onclick="() => onClickBoutonSuppression(context.Pseudo)"><i class="fa fa-trash"></i> </button> <button type="button" class="btn btn-primary" @onclick="() => onClickBoutonSuppression(context.Pseudo)"><i class="fa fa-trash"></i> Supprimer</button>
<button type="button" class="btn btn-primary editButton" @onclick="() => onClickBoutonModification(context.Pseudo)"><i class="fa fa-edit"></i> </button> <button type="button" class="btn btn-primary" @onclick="() => onClickBoutonModification(context.Pseudo)"><i class="fa fa-trash"></i> Modifier</button>
</DisplayTemplate> </DisplayTemplate>
</DataGridColumn> </DataGridColumn>
</DataGridColumns> </DataGridColumns>
<PageButtonTemplate> <PageButtonTemplate>
<Span class="darkBlue"> <Span TextColor="TextColor.Success">
@context.PageNumber @context.PageNumber
</Span> </Span>
</PageButtonTemplate> </PageButtonTemplate>
<NextPageButtonTemplate><Icon Name="IconName.StepForward" class="darkBlue" /></NextPageButtonTemplate> <NextPageButtonTemplate><Icon Name="IconName.StepForward" TextColor="TextColor.Success" /></NextPageButtonTemplate>
<PreviousPageButtonTemplate><Icon Name="IconName.StepBackward" class="darkBlue" /></PreviousPageButtonTemplate> <PreviousPageButtonTemplate><Icon Name="IconName.StepBackward" TextColor="TextColor.Success" /></PreviousPageButtonTemplate>
<LastPageButtonTemplate><Icon Name="IconName.Forward" class="darkBlue" /></LastPageButtonTemplate> <LastPageButtonTemplate><Icon Name="IconName.Forward" TextColor="TextColor.Success" /></LastPageButtonTemplate>
<FirstPageButtonTemplate><Icon Name="IconName.Backward" class="darkBlue" /></FirstPageButtonTemplate> <FirstPageButtonTemplate><Icon Name="IconName.Backward" TextColor="TextColor.Success" /></FirstPageButtonTemplate>
<TotalItemsTemplate><Badge class="darkBlue">@context.TotalItems utilisateurs</Badge></TotalItemsTemplate> <TotalItemsTemplate><Badge Color="Color.Success">@context.TotalItems total items</Badge></TotalItemsTemplate>
<TotalItemsShortTemplate><Badge class="darkBlue">@context.TotalItems</Badge></TotalItemsShortTemplate> <TotalItemsShortTemplate><Badge Color="Color.Success">@context.TotalItems</Badge></TotalItemsShortTemplate>
<ButtonRowTemplate>
<Button Class="editButton biggest" Clicked="boutonclick">+</Button>
</ButtonRowTemplate>
<ItemsPerPageTemplate></ItemsPerPageTemplate> <ItemsPerPageTemplate></ItemsPerPageTemplate>
@ -84,7 +58,7 @@
</PageSelectorTemplate> </PageSelectorTemplate>
<PageSizesTemplate> <PageSizesTemplate>
<Select class="darkBlue" @bind-SelectedValue="@context.CurrentPageSize" Size="Size.Small"> <Select TextColor="TextColor.Success" @bind-SelectedValue="@context.CurrentPageSize" Size="Size.Small">
@foreach (var curPageSize in context.PageSizes) @foreach (var curPageSize in context.PageSizes)
{ {
<SelectItem Value="@curPageSize">@curPageSize</SelectItem> <SelectItem Value="@curPageSize">@curPageSize</SelectItem>
@ -93,9 +67,15 @@
</PageSizesTemplate> </PageSizesTemplate>
</DataGrid> </DataGrid>
<div>
<NavLink class="btn btn-primary" href="/utilisateurs/ajouter" Match="NavLinkMatch.All">
<i class="fa fa-plus"></i> Ajouter
</NavLink>
</div>
<div> <div>
<ModalSuppressionUtilisateur <ModalSuppressionUtilisateur
utilisateur="@UtilisateurSelectionne" utilisateur="@utilisateurSelectionne"
@ref="Modal" @ref="Modal"
modalFerme="fermetureModal" /> modalFerme="fermetureModal" />
</div> </div>

@ -10,45 +10,44 @@ namespace VeraxShield.composants.affichages.utilisateurs
public partial class DatagridUtilisateurs public partial class DatagridUtilisateurs
{ {
[Inject] [Inject]
private IUtilisateursDataService UtilisateursDataService { get; set; } private IUtilisateursDataService utilisateursDataService { get; set; }
public static List<Utilisateur> Utilisateurs { get; set; } public List<Utilisateur> Utilisateurs { get; set; }
[Inject] [Inject]
private NavigationManager NavigationManager { get; set; } private NavigationManager NavigationManager { get; set; }
[Inject] private Utilisateur? utilisateurSelectionne;
private DonneurEtat DonneurEtat {get; set;}
public static Utilisateur? UtilisateurSelectionne { get; set; }
[Parameter] [Parameter]
public ModalSuppressionUtilisateur Modal {get; set;} public ModalSuppressionUtilisateur Modal {get; set;}
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
DatagridUtilisateurs.UtilisateurSelectionne = null; //await this.utilisateursDataService.resetDataUtilisateurs();
DatagridUtilisateurs.Utilisateurs = await this.UtilisateursDataService.getAllUtilisateurs();
this.utilisateurSelectionne = null;
this.Utilisateurs = await this.utilisateursDataService.getAllUtilisateurs();
await base.OnInitializedAsync(); await base.OnInitializedAsync();
} }
private async Task HandleUtilisateurSupprime() private async Task HandleUtilisateurSupprime()
{ {
DatagridUtilisateurs.Utilisateurs = await this.UtilisateursDataService.getAllUtilisateurs(); this.Utilisateurs = await this.utilisateursDataService.getAllUtilisateurs();
StateHasChanged(); StateHasChanged(); // Actualiser la vue
} }
public async Task fermetureModal(bool suppressionConfirmee) { public async Task fermetureModal(bool val) {
if (suppressionConfirmee) { if (val) {
await this.supprimerUtilisateur(DatagridUtilisateurs.UtilisateurSelectionne); await this.supprimerUtilisateur(this.utilisateurSelectionne);
} }
} }
public async Task supprimerUtilisateur(Utilisateur u) public async Task supprimerUtilisateur(Utilisateur u)
{ {
await this.UtilisateursDataService.SupprimerUtilisateur(u); await this.utilisateursDataService.SupprimerUtilisateur(u);
DatagridUtilisateurs.Utilisateurs = await this.UtilisateursDataService.getAllUtilisateurs(); this.Utilisateurs = await this.utilisateursDataService.getAllUtilisateurs();
this.NavigationManager.NavigateTo("/utilisateurs/liste"); this.NavigationManager.NavigateTo("/utilisateurs/liste");
} }
@ -62,31 +61,22 @@ namespace VeraxShield.composants.affichages.utilisateurs
public void modifierUtilisateur() public void modifierUtilisateur()
{ {
if (DatagridUtilisateurs.UtilisateurSelectionne != null) if (this.utilisateurSelectionne != null)
{ {
this.NavigationManager.NavigateTo("/utilisateurs/modifier/" + DatagridUtilisateurs.UtilisateurSelectionne.Pseudo); this.NavigationManager.NavigateTo("/utilisateurs/modifier/" + utilisateurSelectionne.Pseudo);
} }
} }
public async Task onClickBoutonSuppression(String pseudo) public async Task onClickBoutonSuppression(String Pseudo)
{ {
DatagridUtilisateurs.UtilisateurSelectionne= await this.UtilisateursDataService.getUtilisateurFromPseudo(pseudo); this.utilisateurSelectionne = await this.utilisateursDataService.getUtilisateurFromPseudo(Pseudo);
await this.afficherModal();
if (this.DonneurEtat._utilisateurCourant.Pseudo != DatagridUtilisateurs.UtilisateurSelectionne.Pseudo)
{
await this.afficherModal();
}
} }
public async Task onClickBoutonModification(String pseudo) public async Task onClickBoutonModification(String Pseudo)
{ {
DatagridUtilisateurs.UtilisateurSelectionne = await this.UtilisateursDataService.getUtilisateurFromPseudo(pseudo); this.utilisateurSelectionne = await this.utilisateursDataService.getUtilisateurFromPseudo(Pseudo);
this.modifierUtilisateur(); this.modifierUtilisateur();
} }
public async Task boutonclick()
{
NavigationManager.NavigateTo("/utilisateurs/ajouter");
}
} }
} }

@ -17,7 +17,7 @@
<Field Horizontal> <Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Pseudo</FieldLabel> <FieldLabel ColumnSize="ColumnSize.Is2">Pseudo</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10"> <FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre pseudo" @bind-Text="@Requete.Pseudo"> <TextEdit Placeholder="Entrez votre pseudo" @bind-Text="@Requete.Nom">
<Feedback> <Feedback>
<ValidationError /> <ValidationError />
</Feedback> </Feedback>
@ -32,17 +32,17 @@
<Field Horizontal> <Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Mot de passe</FieldLabel> <FieldLabel ColumnSize="ColumnSize.Is2">Mot de passe</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10"> <FieldBody ColumnSize="ColumnSize.Is10">
<div class="input-group"> <TextEdit Role="TextRole.Password" autocomplete="new-password"
<TextEdit @bind-Text="@Requete.MotDePasse" type="@GetPasswordInputType()"
Type="@(showPassword ? "text" : "password")" Placeholder="Entrez votre pseudo"
Class="form-control" Placeholder="Mot De Passe"/> @bind-Text="@Requete.MotDePasse">
<span class="input-group-btn"> <Append>
<button class="btn btn-default" type="button" @onclick="ToggleShowPassword"> <Button Class="btn-append" Clicked="@TogglePasswordVisibility">
<i class="@(showPassword ? "fa fa-eye-slash" : "fa fa-eye")"></i> <Icon IconName="@GetEyeIcon()" />
</button> </Button>
</span> </Append>
</div> </TextEdit>
</FieldBody> </FieldBody>
</Field> </Field>
@ -50,13 +50,8 @@
</div> </div>
<div class="btn-container"> <div class="btn-container">
<Button Class="btn-se-connecter" Clicked="@OnSubmit"> <Button Class="btn-se-connecter" Clicked="@OnSubmit">Se connecter</Button>
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.Seedling" /> <Button Class="btn-s-inscrire" Clicked="@OnSubmit">S'inscrire</Button>
Se connecter</Button>
<Button Class="btn-s-inscrire" Clicked="@RedirectionInscription">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.CreditCard" />
S'inscrire</Button>
</div> </div>

@ -20,13 +20,13 @@ namespace VeraxShield.composants.authentification
public String Erreur {get; set; } public String Erreur {get; set; }
public bool showPassword = false; private bool showPassword = false;
private string eyeIcon = "fas fa-eye";
private string eyeSlashIcon = "fas fa-eye-slash";
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
this.Requete = new RequeteConnexion(); this.Requete = new RequeteConnexion();
await base.OnInitializedAsync();
} }
public async Task OnSubmit() public async Task OnSubmit()
@ -45,14 +45,19 @@ namespace VeraxShield.composants.authentification
} }
} }
public async Task RedirectionInscription() private void TogglePasswordVisibility()
{ {
this.NavigationManager.NavigateTo("/inscription"); showPassword = !showPassword;
} }
private void ToggleShowPassword() private string GetPasswordInputType()
{ {
showPassword = !showPassword; return showPassword ? "text" : "password";
}
private string GetEyeIcon()
{
return showPassword ? eyeSlashIcon : eyeIcon;
} }
} }
} }

@ -1,131 +0,0 @@
@using Blazorise.Components;
@using System.ComponentModel.DataAnnotations;
<head>
<link rel="stylesheet" href="css/composants/authentification/FormulaireConnexion.css" />
</head>
<div class="connexion-container">
<h1 class="title-spacing"> S'inscrire </h1>
<Validations @ref="Validations" Mode="ValidationMode.Manual" Model="Requete">
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Pseudo</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre pseudo" @bind-Text="@Requete.Pseudo">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Prenom</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre prenom" @bind-Text="@Requete.Prenom">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Nom</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre nom" @bind-Text="@Requete.Nom">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Mail</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre mail" @bind-Text="@Requete.Mail">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Mot de passe</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<div class="input-group">
<TextEdit @bind-Text="@Requete.MotDePasse"
Type="@(showPassword ? "text" : "password")"
Class="form-control" Placeholder="Mot de passe" />
<span class="input-group-btn">
<button class="btn btn-default" type="button" @onclick="ToggleShowPassword">
<i class="@(showPassword ? "fa fa-eye-slash" : "fa fa-eye")"></i>
</button>
</span>
</div>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Confirmer le mot de passe</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<div class="input-group">
<TextEdit @bind-Text="@Requete.MotDePasseConfirmation"
Type="@(showPasswordConf ? "text" : "password")"
Class="form-control" Placeholder="Confirmez mot de passe" />
<span class="input-group-btn">
<button class="btn btn-default" type="button" @onclick="ToggleShowPasswordConf">
<i class="@(showPasswordConf ? "fa fa-eye-slash" : "fa fa-eye")"></i>
</button>
</span>
</div>
</FieldBody>
</Field>
</Validation>
</div>
<div class="btn-container">
<Button Class="btn-se-connecter" Clicked="@OnSubmit">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.CheckCircle" />
S'inscrire</Button>
<Button Class="btn-s-inscrire" Clicked="@OnAnnulation">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.Reply" />
Annuler</Button>
</div>
<label class="text-danger">@Erreur</label>
</Validations>
</div>

@ -1,63 +0,0 @@
using Blazorise;
using Microsoft.AspNetCore.Components;
using VeraxShield.composants.affichages.utilisateurs;
using VeraxShield.composants.formulaires.modeles;
using VeraxShield.services.UtilisateursDataService;
namespace VeraxShield.composants.authentification
{
public partial class FormulaireInscription
{
[Parameter]
public Validations Validations {get; set;}
public RequeteInscription Requete {get; set;}
[Inject]
private NavigationManager NavigationManager {get; set;}
[Inject]
private DonneurEtat DonneurEtat {get; set;}
[Inject]
private IUtilisateursDataService UtilisateursDataService {get; set;}
public String Erreur {get; set; }
public bool showPassword {get; set;}
public bool showPasswordConf {get; set;}
protected override async Task OnInitializedAsync()
{
this.showPassword = false;
this.showPasswordConf = false;
this.Requete = new RequeteInscription();
DatagridUtilisateurs.Utilisateurs = await this.UtilisateursDataService.getAllUtilisateurs();
await base.OnInitializedAsync();
}
public async Task OnSubmit()
{
if (await this.Validations.ValidateAll())
{
await DonneurEtat.Inscription(this.Requete);
NavigationManager.NavigateTo("/connexion");
}
}
public async Task OnAnnulation()
{
this.NavigationManager.NavigateTo("/connexion");
}
private void ToggleShowPassword()
{
showPassword = !showPassword;
}
private void ToggleShowPasswordConf()
{
showPasswordConf = !showPasswordConf;
}
}
}

@ -8,6 +8,6 @@ namespace VeraxShield.composants.formulaires.modeles
public string MotDePasse { get; set; } public string MotDePasse { get; set; }
[Required(ErrorMessage="le champ est obligatoire !")] [Required(ErrorMessage="le champ est obligatoire !")]
public string Pseudo { get; set; } public string Nom { get; set; }
} }
} }

@ -1,12 +1,10 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using VeraxShield.composants.formulaires.modeles.attributsValidationCustoms;
namespace VeraxShield.composants.formulaires.modeles namespace VeraxShield.composants.formulaires.modeles
{ {
public class RequeteInscription public class RequeteInscription
{ {
[Required] [Required]
[RegularExpression("^[a-zA-Z0-9]+$", ErrorMessage = "Le mot de passe doit contenir uniquement des caractères alphanumériques.")]
public string MotDePasse { get; set; } public string MotDePasse { get; set; }
[Required] [Required]
@ -14,23 +12,6 @@ namespace VeraxShield.composants.formulaires.modeles
public string MotDePasseConfirmation { get; set; } public string MotDePasseConfirmation { get; set; }
[Required] [Required]
[RegularExpression("^[a-zA-Z]+$", ErrorMessage = "Le nom doit contenir uniquement des lettres.")]
[StringLength(20, ErrorMessage = "Le nom ne doit pas dépasser 20 caractères !")]
public string Nom { get; set; } public string Nom { get; set; }
[Required]
[StringLength(20, ErrorMessage = "Le prénom ne doit pas dépasser 20 caractères !")]
[RegularExpression("^[a-zA-Z]+$", ErrorMessage = "Le prénom doit contenir uniquement des lettres.")]
public string Prenom {get; set;}
[Required]
[StringLength(20, ErrorMessage = "Le pseudo ne doit pas dépasser 20 caractères !")]
[RegularExpression("^[a-zA-Z0-9_]+$", ErrorMessage = "Le pseudo contient des caractères interdits.")]
[PseudoCorrect]
public string Pseudo { get; set; }
[Required]
[EmailAddress(ErrorMessage = "Veuillez entrer une adresse email valide.")]
public string Mail { get; set;}
} }
} }

@ -1,115 +1,58 @@
@using Blazorise.Components 
@using System.ComponentModel.DataAnnotations; <EditForm Model="@Modele" OnValidSubmit="@ajouterUtilisateur">
<head> <DataAnnotationsValidator />
<link rel="stylesheet" href="css/composants/formulaires/FormulaireAjout.css" /> <Microsoft.AspNetCore.Components.Forms.ValidationSummary />
</head>
<p>
<div class="formulaire-conteneur"> <label for="pseudo">
Pseudo :
<h1 class="title-spacing"> Ajouter un utilisateur </h1> <InputText id="pseudo" @bind-Value="Modele.Pseudo" />
</label>
<Validations @ref="Validations" Mode="ValidationMode.Manual" Model="Modele"> </p>
<div class="field-container"> <p>
<Validation> <label for="prenom">
<Field Horizontal> Prénom :
<FieldLabel ColumnSize="ColumnSize.Is2" Class="field-label">Pseudo</FieldLabel> <InputText id="prenom" @bind-Value="Modele.Prenom" />
<FieldBody ColumnSize="ColumnSize.Is10"> </label>
<TextEdit Placeholder="Entrez son pseudo" @bind-Text="@Modele.Pseudo"> </p>
<Feedback>
<ValidationError /> <p>
</Feedback> <label for="nom">
</TextEdit> Nom :
</FieldBody> <InputText id="nom" @bind-Value="Modele.Nom" />
</Field> </label>
</Validation> </p>
</div>
<p>
<div class="field-container"> <label for="role">
<Validation> Role :
<Field Horizontal> <InputText id="role" @bind-Value="Modele.Role" />
<FieldLabel ColumnSize="ColumnSize.Is2" Class="field-label">Prenom</FieldLabel> </label>
<FieldBody ColumnSize="ColumnSize.Is10"> </p>
<TextEdit Placeholder="Entrez son prénom" @bind-Text="@Modele.Prenom">
<Feedback> <p>
<ValidationError /> <label for="mail">
</Feedback> Email :
</TextEdit> <InputText id="mail" @bind-Value="Modele.Mail" />
</FieldBody> </label>
</Field> </p>
</Validation>
</div> <p>
<label for="mdp">
<div class="field-container"> Mot de passe :
<Validation> <InputText id="mdp" @bind-Value="Modele.Mdp" />
<Field Horizontal> </label>
<FieldLabel ColumnSize="ColumnSize.Is2" Class="field-label">Nom</FieldLabel> </p>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez son nom" @bind-Text="@Modele.Nom"> <p>
<Feedback> <label>
<ValidationError /> Utilisateur banni :
</Feedback> <InputCheckbox @bind-Value="Modele.IsBan" />
</TextEdit> </label>
</FieldBody> </p>
</Field>
</Validation> <button Type="Submit">Valider la création</button>
</div>
</EditForm>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2" Class="field-label">Mail</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez son mail" @bind-Text="@Modele.Mail">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2" Class="field-label">Role</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez son role" @bind-Text="@Modele.Role">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2" Class="field-label">Mot de passe</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez son mot de passe" @bind-Text="@Modele.Mdp">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="btn-container">
<Button Class="btn-se-connecter" Clicked="@OnSubmit">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.CheckCircle" />
Ajouter</Button>
<Button Class="btn-s-inscrire" Clicked="@OnAnnulation">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.Reply" />
Annuler</Button>
</div>
</Validations>
</div>

@ -1,4 +1,4 @@
using Blazorise; using System.Runtime.InteropServices;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using VeraxShield.composants.formulaires.modeles; using VeraxShield.composants.formulaires.modeles;
using VeraxShield.factories; using VeraxShield.factories;
@ -9,41 +9,34 @@ namespace VeraxShield.composants.formulaires
{ {
public partial class FormulaireAjout public partial class FormulaireAjout
{ {
[Parameter]
public Validations Validations {get; set;}
public FormulaireAjoutModele Modele {get; set;}
[Inject] [Inject]
private NavigationManager NavigationManager {get; set;} private NavigationManager NavigationManager { get; set; }
private FormulaireAjoutModele Modele { get; set; }
[Inject] [Inject]
private IUtilisateursDataService utilisateursDataService { get; set; } private IUtilisateursDataService utilisateursDataService { get; set; }
public FormulaireAjout()
{
}
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
this.Modele = new FormulaireAjoutModele(); this.Modele = new FormulaireAjoutModele();
this.Modele.IsBan = false;
await base.OnInitializedAsync(); await base.OnInitializedAsync();
} }
public async Task OnSubmit() public async void ajouterUtilisateur()
{ {
if (await this.Validations.ValidateAll()) Utilisateur nouvelUtilisateur = UtilisateursFactory.toUtilisateur(this.Modele);
{ await this.utilisateursDataService.AjouterUtilisateur(nouvelUtilisateur);
if(this.Modele.Mdp == null)
{ //Console.WriteLine("Utilisateur bien ajouté !");
this.Modele.Mdp = this.Modele.Pseudo;
}
Utilisateur nouvelUtilisateur = UtilisateursFactory.toUtilisateur(this.Modele);
await this.utilisateursDataService.AjouterUtilisateur(nouvelUtilisateur);
this.NavigationManager.NavigateTo("/utilisateurs/liste");
}
}
public async Task OnAnnulation()
{
this.NavigationManager.NavigateTo("/utilisateurs/liste"); this.NavigationManager.NavigateTo("/utilisateurs/liste");
} }
} }

@ -1,119 +1,58 @@
<head>
<link rel="stylesheet" href="css/composants/formulaires/FormulaireModification.css">
</head>
<div class="formulaire-conteneur"> <EditForm Model="@Modele" OnValidSubmit="@modifierUtilisateur">
<h1 class="title-spacing"> Modifier l'utilisateur</h1> <DataAnnotationsValidator />
<Microsoft.AspNetCore.Components.Forms.ValidationSummary />
<Validations @ref="Validations" Mode="ValidationMode.Manual" Model="Modele">
<p>
<div class="field-container"> <label for="pseudo">
<Validation> Pseudo :
<Field Horizontal> <InputText id="pseudo" @bind-Value="Modele.Pseudo" />
<FieldLabel ColumnSize="ColumnSize.Is2">Pseudo</FieldLabel> </label>
<FieldBody ColumnSize="ColumnSize.Is10"> </p>
<TextEdit Placeholder="Entrez votre pseudo" @bind-Text="@Modele.Pseudo">
<Feedback> <p>
<ValidationError /> <label for="prenom">
</Feedback> Prénom :
</TextEdit> <InputText id="prenom" @bind-Value="Modele.Prenom" />
</FieldBody> </label>
</Field> </p>
</Validation>
</div> <p>
<label for="nom">
<div class="field-container"> Nom :
<Validation> <InputText id="nom" @bind-Value="Modele.Nom" />
<Field Horizontal> </label>
<FieldLabel ColumnSize="ColumnSize.Is2">Prenom</FieldLabel> </p>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre prenom" @bind-Text="@Modele.Prenom"> <p>
<Feedback> <label for="role">
<ValidationError /> Role :
</Feedback> <InputText id="role" @bind-Value="Modele.Role" />
</TextEdit> </label>
</FieldBody> </p>
</Field>
</Validation> <p>
</div> <label for="mail">
Email :
<div class="field-container"> <InputText id="mail" @bind-Value="Modele.Mail" />
<Validation> </label>
<Field Horizontal> </p>
<FieldLabel ColumnSize="ColumnSize.Is2">Nom</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10"> <p>
<TextEdit Placeholder="Entrez votre nom" @bind-Text="@Modele.Nom"> <label for="mdp">
<Feedback> Mot de passe :
<ValidationError /> <InputText id="mdp" @bind-Value="Modele.Mdp" />
</Feedback> </label>
</TextEdit> </p>
</FieldBody>
</Field> <p>
</Validation> <label>
</div> Utilisateur banni :
<InputCheckbox @bind-Value="Modele.IsBan" />
<div class="field-container"> </label>
<Validation> </p>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Mail</FieldLabel> <button Type="Submit">Valider la modification </button>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre mail" @bind-Text="@Modele.Mail"> </EditForm>
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Role</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez le role" @bind-Text="@Modele.Role">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Modifier Mot de passe</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Nouveau mot de passe (facultatif)" @bind-Text="@Modele.Mdp">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div>
<Validation>
<Switch TValue="bool" @bind-Checked="@Modele.IsBan" Color="Color.Primary">Utilisateur banni</Switch>
</Validation>
</div>
<div class="btn-container">
<Button Class="btn-se-connecter" Clicked="@modifierUtilisateur">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.CheckCircle" />
Modifier</Button>
<Button Class="btn-s-inscrire" Clicked="@OnAnnulation">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.Reply" />
Annuler</Button>
</div>
</Validations>
</div>

@ -1,7 +1,5 @@
using Blazorise;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using VeraxShield.composants.formulaires.modeles; using VeraxShield.composants.formulaires.modeles;
using VeraxShield.composants.formulaires.modeles.attributsValidationCustoms;
using VeraxShield.factories; using VeraxShield.factories;
using VeraxShield.modele.utilisateurs; using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService; using VeraxShield.services.UtilisateursDataService;
@ -13,9 +11,6 @@ namespace VeraxShield.composants.formulaires
[Parameter] [Parameter]
public Utilisateur Utilisateur {get; set;} public Utilisateur Utilisateur {get; set;}
[Parameter]
public Validations Validations {get; set;}
public FormulaireAjoutModele Modele {get; set;} public FormulaireAjoutModele Modele {get; set;}
[Inject] [Inject]
@ -26,47 +21,33 @@ namespace VeraxShield.composants.formulaires
protected override async Task OnParametersSetAsync() protected override async Task OnParametersSetAsync()
{ {
if (this.Utilisateur != null) if (this.Utilisateur != null)
{ {
Console.WriteLine("Le mec encore trouvé : " + this.Utilisateur.Pseudo);
Utilisateur temp = new Utilisateur(" ", " ", " ", " ", " ", " ", true); Utilisateur temp = new Utilisateur(" ", " ", " ", " ", " ", " ", true);
this.Modele = UtilisateursFactory.toModele(this.Utilisateur); this.Modele = UtilisateursFactory.toModele(this.Utilisateur);
} else } else
{ {
Console.WriteLine("Le mec nul cette fois...");
Utilisateur temp = new Utilisateur(" ", " ", " ", " ", " ", " ", true); Utilisateur temp = new Utilisateur(" ", " ", " ", " ", " ", " ", true);
this.Modele = UtilisateursFactory.toModele(temp); this.Modele = UtilisateursFactory.toModele(temp);
} }
await base.OnParametersSetAsync();
}
protected async Task modifierUtilisateur()
{
if (await this.Validations.ValidateAll()) Console.WriteLine("Fin du onParameterEnfant");
{ await base.OnParametersSetAsync();
if (this.Modele.Mdp == null)
{
this.Modele.Mdp = Utilisateur.Mdp;
}
Utilisateur temp = UtilisateursFactory.toUtilisateur(this.Modele);
if (this.Utilisateur.Pseudo != this.Modele.Pseudo)
{
await this.utilisateursDataService.MettreAJourUtilisateur(this.Utilisateur, temp);
}
else
{
await this.utilisateursDataService.MettreAJourUtilisateur(temp);
}
this.NavigationManager.NavigateTo("/utilisateurs/liste");
}
} }
protected async Task OnAnnulation()
protected async Task modifierUtilisateur()
{ {
Utilisateur temp = UtilisateursFactory.toUtilisateur(this.Modele);
await this.utilisateursDataService.MettreAJourUtilisateur(temp);
this.NavigationManager.NavigateTo("/utilisateurs/liste"); this.NavigationManager.NavigateTo("/utilisateurs/liste");
} }
} }

@ -1,8 +1,4 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Components;
using VeraxShield.composants.formulaires.modeles.attributsValidationCustoms;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace VeraxShield.composants.formulaires.modeles namespace VeraxShield.composants.formulaires.modeles
{ {
@ -10,29 +6,23 @@ namespace VeraxShield.composants.formulaires.modeles
{ {
[Required] [Required]
[StringLength(20, ErrorMessage = "Le pseudo ne doit pas dépasser 20 caractères !")] [StringLength(20, ErrorMessage = "Le pseudo ne doit pas dépasser 20 caractères !")]
[RegularExpression("^[a-zA-Z0-9_]+$", ErrorMessage = "Le pseudo contient des caractères interdits.")] public String Pseudo { get; set; }
[PseudoCorrect]
public string Pseudo { get; set; }
[Required] [Required]
[StringLength(20, ErrorMessage = "Le nom ne doit pas dépasser 20 caractères !")] [StringLength(20, ErrorMessage = "Le nom ne doit pas dépasser 20 caractères !")]
[RegularExpression("^[a-zA-Z]+$", ErrorMessage = "Le nom doit contenir uniquement des lettres.")]
public String Nom { get; set; } public String Nom { get; set; }
[Required] [Required]
[StringLength(20, ErrorMessage = "Le prénom ne doit pas dépasser 20 caractères !")] [StringLength(20, ErrorMessage = "Le prénom ne doit pas dépasser 20 caractères !")]
[RegularExpression("^[a-zA-Z]+$", ErrorMessage = "Le prénom doit contenir uniquement des lettres.")]
public String Prenom { get; set; } public String Prenom { get; set; }
[Required] [Required]
[EmailAddress(ErrorMessage = "Veuillez entrer une adresse email valide.")]
public String Mail { get; set; } public String Mail { get; set; }
[RegularExpression("^[a-zA-Z0-9]+$", ErrorMessage = "Le mot de passe doit contenir uniquement des caractères alphanumériques.")] [Required]
public String Mdp { get; set; } public String Mdp { get; set; }
[Required] [Required]
[RoleExistant]
public String Role { get; set; } public String Role { get; set; }
[Required] [Required]
@ -50,7 +40,12 @@ namespace VeraxShield.composants.formulaires.modeles
public FormulaireAjoutModele() public FormulaireAjoutModele()
{ {
Mdp = null; //Pseudo = "temporairementVide";
//Nom = "temporairementVide";
//Prenom = "temporairementVide";
//Mail = "temporairementVide";
//Mdp = "temporairementVide";
//IsBan = true;
} }
} }
} }

@ -1,37 +0,0 @@
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Components;
using VeraxShield.composants.affichages.utilisateurs;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace VeraxShield.composants.formulaires.modeles.attributsValidationCustoms
{
public class PseudoCorrectAttribute : ValidationAttribute
{
protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
{
bool pseudoExisteDeja = false;
var pseudo = (string)value;
foreach (Utilisateur u in DatagridUtilisateurs.Utilisateurs)
{
if ((u.Pseudo == pseudo))
{
if (DatagridUtilisateurs.UtilisateurSelectionne == null) {
return new ValidationResult("Le pseudo existe deja, choississez en un autre.");
}
if (DatagridUtilisateurs.UtilisateurSelectionne != null)
{
if (u.Pseudo != DatagridUtilisateurs.UtilisateurSelectionne.Pseudo)
{
return new ValidationResult("Le pseudo existe deja, choississez en un autre.");
}
}
}
}
return ValidationResult.Success;
}
}
}

@ -1,33 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace VeraxShield.composants.formulaires.modeles.attributsValidationCustoms
{
public class RoleExistantAttribute : ValidationAttribute
{
private List<string> RolesExistants {get; set;}
public RoleExistantAttribute()
{
this.RolesExistants = new List<string>();
this.RolesExistants.Add("admin");
this.RolesExistants.Add("modo");
this.RolesExistants.Add("invite");
this.RolesExistants.Add("redacteur");
}
protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
{
var role = (string)value;
foreach (string roleListe in this.RolesExistants)
{
if (roleListe == role)
{
return ValidationResult.Success;;
}
}
return new ValidationResult("Le role n'existe pas.");
}
}
}

@ -1,6 +1,4 @@
using Blazorise.DataGrid; using VeraxShield.composants.formulaires.modeles;
using VeraxShield.composants.affichages.utilisateurs;
using VeraxShield.composants.formulaires.modeles;
using VeraxShield.modele.utilisateurs; using VeraxShield.modele.utilisateurs;
namespace VeraxShield.factories namespace VeraxShield.factories
@ -9,21 +7,6 @@ namespace VeraxShield.factories
{ {
public static Utilisateur toUtilisateur(FormulaireAjoutModele modele) public static Utilisateur toUtilisateur(FormulaireAjoutModele modele)
{ {
if (DatagridUtilisateurs.UtilisateurSelectionne != null )
{
if (DatagridUtilisateurs.UtilisateurSelectionne.Mdp != modele.Mdp)
{
var motDePasseClair = modele.Mdp;
modele.Mdp = BCrypt.Net.BCrypt.HashPassword(motDePasseClair);
}
}
else
{
var motDePasseClair = modele.Mdp;
modele.Mdp = BCrypt.Net.BCrypt.HashPassword(motDePasseClair);
}
Utilisateur temp = new Utilisateur( Utilisateur temp = new Utilisateur(
modele.Pseudo, modele.Pseudo,
modele.Nom, modele.Nom,
@ -42,11 +25,7 @@ namespace VeraxShield.factories
temp.Pseudo = u.Pseudo; temp.Pseudo = u.Pseudo;
temp.Nom = u.Nom; temp.Nom = u.Nom;
temp.Prenom = u.Prenom; temp.Prenom = u.Prenom;
temp.Mdp = u.Mdp;
// ici dehash
//temp.Mdp = u.Mdp;
temp.Role = u.Role; temp.Role = u.Role;
temp.Mail = u.Mail; temp.Mail = u.Mail;
temp.IsBan = u.IsBan; temp.IsBan = u.IsBan;

@ -1,19 +1,12 @@
public class ModeleAppUtilisateur public class AppUtilisateur
{ {
public string MotDePasse { get; set; } public string MotDePasse { get; set; }
public List<string> Roles { get; set; } public List<string> Roles { get; set; }
public string Pseudo { get; set; }
public string Prenom { get; set; }
public string Nom { get; set; } public string Nom { get; set; }
public string Mail { get; set; }
public AppUtilisateur(string nom, string mdp, String premierRole)
public ModeleAppUtilisateur(string pseudo,string nom, string prenom, string mail, string mdp, String premierRole)
{ {
this.MotDePasse = mdp; this.MotDePasse = mdp;
this.Pseudo = pseudo;
this.Mail = mail;
this.Prenom = prenom;
this.Nom = nom; this.Nom = nom;
this.Roles = new List<string>(); this.Roles = new List<string>();

@ -2,5 +2,5 @@ public class UtilisateurCourant
{ {
public Dictionary<string, string> Claims { get; set; } public Dictionary<string, string> Claims { get; set; }
public bool EstAuthentifie { get; set; } public bool EstAuthentifie { get; set; }
public string Pseudo { get; set; } public string Nom { get; set; }
} }

@ -1,49 +1,15 @@
@using VeraxShield.composants.affichages.navBar; @page "/"
@page "/"
<head> <h1>VeraxShield</h1>
<link rel="stylesheet" href="css/index.css">
</head>
<AuthorizeView> <button type="button" class="btn btn-link ml-md-auto" @onclick="@SeConnecter">Connexion</button>
<NotAuthorized>
<body>
<header>
<h1>VeraxShield</h1>
</header>
<main>
<div class="center-box">
<div class="button-container">
<button type="button" class="btn btn-link" @onclick="@SeConnecter">Connexion</button>
</div>
<div class="button-container">
<button type="button" class="btn btn-link" @onclick="@RetourVerax">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.LocationArrow" />
Retourner sur Verax
</button>
</div>
</div>
</main>
<footer>
.
</footer>
</body>
</NotAuthorized>
<Authorized>
<body> <AuthorizeView>
<h1> Adiu : @context.User.Identity.Name!</h1>
<NavBarPrincipale/> <p>Podètz veire aquest contengut solament se sètz autentificat ! </p>
<main> <NavLink href="/utilisateurs/liste"> --> Liste des utilisateurs</NavLink>
<div class="home-center-box">
<h1> Adiu : @context.User.Identity.Name!</h1>
<p>Podètz veire aquest contengut solament se sètz autentificat ! </p>
</div>
</main>
</body>
</Authorized>
<button type="button" class="btn btn-link ml-md-auto" @onclick="@SeDeconnecter">Deconnexion</button>
</AuthorizeView> </AuthorizeView>

@ -9,7 +9,6 @@ namespace VeraxShield.pages
[Inject] [Inject]
private NavigationManager NavigationManager {get; set;} private NavigationManager NavigationManager {get; set;}
private async Task SeDeconnecter() private async Task SeDeconnecter()
{ {
await DonneurEtat.Deconnexion(); await DonneurEtat.Deconnexion();
@ -20,10 +19,5 @@ namespace VeraxShield.pages
{ {
NavigationManager.NavigateTo("/connexion"); NavigationManager.NavigateTo("/connexion");
} }
private void RetourVerax()
{
NavigationManager.NavigateTo("https://www.verax.com");
}
} }
} }

@ -1,14 +0,0 @@
@using VeraxShield.composants.authentification;
@page "/inscription"
<head>
<link rel="stylesheet" href="css/pages/authentification/Inscription.css" />
</head>
<div class="centrer-composant">
<div class="formulaire-inscription">
<FormulaireInscription />
</div>
</div>

@ -1,17 +0,0 @@
<head>
<link rel="stylesheet" href="css/pages/erreurs/ErreurParDefaut.css">
</head>
<Div Margin="Margin.IsAuto.OnX" TextAlignment="TextAlignment.Center">
<Div Padding="Padding.Is5.OnY">
<DisplayHeading Size="DisplayHeadingSize.Is1" TextWeight="TextWeight.Bold" TextColor="TextColor.Primary" Margin="Margin.Is4.FromBottom">
500
</DisplayHeading>
<Paragraph TextSize="TextSize.ExtraLarge" Margin="Margin.Is4.FromBottom">
Error intern dau servidor.
</Paragraph>
<Paragraph Margin="Margin.Is4.FromBottom">
Aquesta pagina existís pas
</Paragraph>
</Div>
</Div>

@ -1,18 +1,9 @@
@using VeraxShield.composants.formulaires @using VeraxShield.composants.formulaires
@page "/utilisateurs/ajouter" @page "/utilisateurs/ajouter"
<h1>Ajouter un utilisateur</h1>
<head> <FormulaireAjout/>
<link rel="stylesheet" href="css/pages/utilisateurs/AjouterUtilisateur.css">
</head>
<div class="container">
<div class="formulaire-modification">
<FormulaireAjout/>
</div>
</div>

@ -4,22 +4,9 @@
@page "/utilisateurs/liste" @page "/utilisateurs/liste"
@attribute [Authorize(Roles = "admin, modo")] @attribute [Authorize(Roles = "admin, modo")]
<head> <h1>Utilisateurs de Verax</h1>
<link rel="stylesheet" href="css/pages/utilisateurs/listeUtilisateurs.css">
</head>
<body>
<div class="center-box">
<h1> Utilisateurs de Verax</h1>
<p class="margin10">Vous retrouverez ici les utilisateurs de Verax ainsi que les actions associées </p>
</div>
<div class="dataGrid"><DatagridUtilisateurs/></div>
</body>
<DatagridUtilisateurs/>

@ -1,12 +1,6 @@
@page "/utilisateurs/modifier/{pseudo}" @page "/utilisateurs/modifier/{pseudo}"
<head> <h1> Modifier l'utilisateur </h1>
<link rel="stylesheet" href="css/pages/utilisateurs/ModifierUtilisateur.css">
</head>
<div class="container"> <FormulaireModification Utilisateur="@Utilisateur" />
<div class="formulaire-modification">
<FormulaireModification Utilisateur="@Utilisateur"/>
</div>
</div>

@ -14,9 +14,24 @@ namespace VeraxShield.pages.utilisateurs
[Inject] [Inject]
private IUtilisateursDataService utilisateursDataService {get; set;} private IUtilisateursDataService utilisateursDataService {get; set;}
private Utilisateur utilisateur {get; set;}
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
Console.WriteLine("Passage dans le OnInitializedAsync...");
this.Utilisateur = await this.utilisateursDataService.getUtilisateurFromPseudo(this.Pseudo); this.Utilisateur = await this.utilisateursDataService.getUtilisateurFromPseudo(this.Pseudo);
if (Utilisateur != null)
{
Console.WriteLine("Pseudo du mec : " + this.Utilisateur.Pseudo);
}
else
{
Console.WriteLine("L'utilisateur est null...");
}
Console.WriteLine("Fin du OnInitializedParent");
await base.OnInitializedAsync(); await base.OnInitializedAsync();
} }
} }

@ -1,3 +0,0 @@
@using VeraxShield.composants.affichages.navBar;
@layout NavBarPrincipale

@ -8,12 +8,12 @@ namespace VeraxShield.services.UtilisateursDataService
public Task SaveAllUtilisateurs(List<Utilisateur> list); public Task SaveAllUtilisateurs(List<Utilisateur> list);
public Task resetDataUtilisateurs();
public Task AjouterUtilisateur(Utilisateur u); public Task AjouterUtilisateur(Utilisateur u);
public Task SupprimerUtilisateur(Utilisateur u); public Task SupprimerUtilisateur(Utilisateur u);
public Task MettreAJourUtilisateur(Utilisateur u); public Task MettreAJourUtilisateur(Utilisateur u);
public Task MettreAJourUtilisateur(Utilisateur ancienneVersion, Utilisateur nouvelleVersion);
public Task<Utilisateur> getUtilisateurFromPseudo(String pseudo); public Task<Utilisateur> getUtilisateurFromPseudo(String pseudo);
} }

@ -1,102 +0,0 @@
using Microsoft.AspNetCore.Components;
using VeraxShield.modele.utilisateurs;
namespace VeraxShield.services.UtilisateursDataService
{
public class UtilisateursDataServiceApi : IUtilisateursDataService
{
[Inject]
private HttpClient _clientHttp { get; set; }
[Inject]
public NavigationManager _navigationManager { get; set; }
private string EmplacementModification {get; set;}
private string EmplacementRecuperation {get; set;}
public UtilisateursDataServiceApi(HttpClient clientHttp, NavigationManager navigationManager)
{
this._clientHttp = clientHttp;
this._navigationManager = navigationManager;
// Le site PHP n'étant pas encore mis en ligne. Ces urls n'existent pas encore à l'heure actuelle...
this.EmplacementModification = "https://Verax.com/api/utilisateurs/modifier";
this.EmplacementRecuperation = "https://Verax.com/api/utilisateurs/recuperer";
}
public async Task AjouterUtilisateur(Utilisateur u)
{
List<Utilisateur> data = await this.getAllUtilisateurs();
data.Add(u);
await this.SaveAllUtilisateurs(data);
}
public async Task<List<Utilisateur>> getAllUtilisateurs()
{
List<Utilisateur> lUtilisateurs = new List<Utilisateur>();
var data = await this._clientHttp.GetFromJsonAsync<Utilisateur[]>(this.EmplacementRecuperation);
if (data != null)
{
lUtilisateurs = data.ToList();
}
return lUtilisateurs;
}
public async Task<Utilisateur> getUtilisateurFromPseudo(string pseudo)
{
List<Utilisateur> utilisateurs = await this.getAllUtilisateurs();
Utilisateur utilisateurTemporaire = null;
foreach (Utilisateur u in utilisateurs)
{
if (u.Pseudo == pseudo)
{
utilisateurTemporaire = u;
}
}
return utilisateurTemporaire;
}
public async Task MettreAJourUtilisateur(Utilisateur u)
{
await this.SupprimerUtilisateur(u);
await this.AjouterUtilisateur(u);
}
public async Task MettreAJourUtilisateur(Utilisateur ancienneVersion, Utilisateur nouvelleVersion)
{
await this.SupprimerUtilisateur(ancienneVersion);
await this.AjouterUtilisateur(nouvelleVersion);
}
public async Task SaveAllUtilisateurs(List<Utilisateur> list)
{
await this._clientHttp.PutAsJsonAsync(this.EmplacementModification, list);
}
public async Task SupprimerUtilisateur(Utilisateur u)
{
List<Utilisateur> data = await this.getAllUtilisateurs();
int index = -1;
foreach(Utilisateur temp in data)
{
if (temp.Pseudo == u.Pseudo)
{
index = data.IndexOf(temp);
}
}
if (index != -1)
{
data.RemoveAt(index);
}
await this.SaveAllUtilisateurs(data);
}
}
}

@ -38,19 +38,23 @@ namespace VeraxShield.services.UtilisateursDataService
if (lUtilisateurs.Count == 0) if (lUtilisateurs.Count == 0)
{ {
lUtilisateurs = await this.getUtilisateursFromJson(this.EmplacementJson); lUtilisateurs = await this.getUtilisateursFromJson(this.EmplacementJson);
await this.saveUtilisateursLocalStorage(lUtilisateurs);
foreach (var user in lUtilisateurs) Console.WriteLine("--> Le contenu du local storage a été écrasé !");
{
var motDePasseClair = user.Mdp;
user.Mdp = BCrypt.Net.BCrypt.HashPassword(motDePasseClair);
}
await this.saveUtilisateursLocalStorage(lUtilisateurs);
} }
return lUtilisateurs; return lUtilisateurs;
} }
public async Task resetDataUtilisateurs()
{
List<Utilisateur> lUtilisateurs = new List<Utilisateur>();
lUtilisateurs = await this.getUtilisateursFromJson(this.EmplacementJson);
await this.saveUtilisateursLocalStorage(lUtilisateurs);
Console.WriteLine("Local storage reset !");
}
public async Task SaveAllUtilisateurs(List<Utilisateur> list) public async Task SaveAllUtilisateurs(List<Utilisateur> list)
{ {
await this.saveUtilisateursLocalStorage(list); await this.saveUtilisateursLocalStorage(list);
@ -66,22 +70,39 @@ namespace VeraxShield.services.UtilisateursDataService
public async Task SupprimerUtilisateur(Utilisateur u) public async Task SupprimerUtilisateur(Utilisateur u)
{ {
List<Utilisateur> data = await this.getAllUtilisateurs(); List<Utilisateur> data = await this.getAllUtilisateurs();
foreach (Utilisateur temp in data)
{
Console.WriteLine(" - d : " + temp.Pseudo);
}
int index = -1; int index = -1;
foreach(Utilisateur utilisateurTemporaire in data) foreach(Utilisateur temp in data)
{ {
if (utilisateurTemporaire.Pseudo == u.Pseudo) if (temp.Pseudo == u.Pseudo)
{ {
index = data.IndexOf(utilisateurTemporaire); index = data.IndexOf(temp);
} }
} }
Console.WriteLine("Index : " + index);
if (index != -1) if (index != -1)
{ {
data.RemoveAt(index); data.RemoveAt(index);
} }
await this.SaveAllUtilisateurs(data); await this.SaveAllUtilisateurs(data);
Console.WriteLine("L'utilisateur " + u.Pseudo + "supprimé !");
data = await this.getAllUtilisateurs();
foreach (Utilisateur temp in data)
{
Console.WriteLine(temp.Pseudo);
}
} }
public async Task MettreAJourUtilisateur(Utilisateur u) public async Task MettreAJourUtilisateur(Utilisateur u)
@ -90,12 +111,6 @@ namespace VeraxShield.services.UtilisateursDataService
await this.AjouterUtilisateur(u); await this.AjouterUtilisateur(u);
} }
public async Task MettreAJourUtilisateur(Utilisateur ancienneVersion, Utilisateur nouvelleVersion)
{
await this.SupprimerUtilisateur(ancienneVersion);
await this.AjouterUtilisateur(nouvelleVersion);
}
private async Task<List<Utilisateur>> getUtilisateursFromJson(String cheminVersJson) private async Task<List<Utilisateur>> getUtilisateursFromJson(String cheminVersJson)
{ {
List<Utilisateur> utilisateursDeserialise = new List<Utilisateur> (); List<Utilisateur> utilisateursDeserialise = new List<Utilisateur> ();
@ -109,7 +124,9 @@ namespace VeraxShield.services.UtilisateursDataService
private async Task<List<Utilisateur>> getUtilisateursFromLocalStorage() private async Task<List<Utilisateur>> getUtilisateursFromLocalStorage()
{ {
List<Utilisateur> utilisateursFromLocalStorage = null; List<Utilisateur> utilisateursFromLocalStorage = null;
var data = await _localStorage.GetItemAsync<Utilisateur[]>(EmplacementLocalStorage); var data = await _localStorage.GetItemAsync<Utilisateur[]>(EmplacementLocalStorage);
//utilisateursFromLocalStorage = data.ToList();
if (data == null) if (data == null)
{ {
@ -125,20 +142,30 @@ namespace VeraxShield.services.UtilisateursDataService
public async Task<Utilisateur> getUtilisateurFromPseudo(String pseudo) public async Task<Utilisateur> getUtilisateurFromPseudo(String pseudo)
{ {
Console.WriteLine("Passage dans le getFromPseudo...");
List<Utilisateur> utilisateurs = await this.getAllUtilisateurs(); List<Utilisateur> utilisateurs = await this.getAllUtilisateurs();
Utilisateur utilisateurTemporaire = null; Utilisateur temp = null;
foreach (Utilisateur u in utilisateurs) foreach (Utilisateur u in utilisateurs)
{ {
if (u.Pseudo == pseudo) if (u.Pseudo == pseudo)
{ {
utilisateurTemporaire = u; temp = u;
} }
} }
return utilisateurTemporaire; if (temp == null)
{
Console.WriteLine("Aucun u. par pseudo trouve...");
} else
{
Console.WriteLine("Utilisateur trouvé : " + temp.Pseudo);
}
return temp;
} }
private async Task saveUtilisateursLocalStorage(List<Utilisateur> lUtilisateurs) private async Task saveUtilisateursLocalStorage(List<Utilisateur> lUtilisateurs)
{ {
await _localStorage.SetItemAsync(this.EmplacementLocalStorage, lUtilisateurs); await _localStorage.SetItemAsync(this.EmplacementLocalStorage, lUtilisateurs);

@ -1,24 +1,22 @@
using System.Security.Claims; using System.Security.Claims;
using VeraxShield.composants.formulaires.modeles; using VeraxShield.composants.formulaires.modeles;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
public class AuthentificationService : IAuthentificationService public class AuthentificationService : IAuthentificationService
{ {
private List<Utilisateur> UtilisateursApplication { get; set; }
private IUtilisateursDataService _utilisateursDataService;
public AuthentificationService(IUtilisateursDataService utilisateursDataService) private static readonly List<AppUtilisateur> utilisateursApplication;
static AuthentificationService()
{ {
Console.WriteLine("Passage dans le constructeur !"); utilisateursApplication = new List<AppUtilisateur>();
this._utilisateursDataService = utilisateursDataService; utilisateursApplication.Add(new AppUtilisateur("Admin", "Admin", "admin"));
this.UtilisateursApplication = new List<Utilisateur>();
} }
public async Task Connexion(RequeteConnexion requete) public void Connexion(RequeteConnexion requete)
{ {
await this.MajUtilisateurs(); var utilisateur = utilisateursApplication.FirstOrDefault(w => w.Nom == requete.Nom && w.MotDePasse == requete.MotDePasse);
var utilisateur = this.UtilisateursApplication.FirstOrDefault(w => w.Pseudo == requete.Pseudo && BCrypt.Net.BCrypt.Verify(requete.MotDePasse, w.Mdp));
if (utilisateur == null) if (utilisateur == null)
{ {
@ -26,10 +24,9 @@ public class AuthentificationService : IAuthentificationService
} }
} }
public async Task<UtilisateurCourant> GetUtilisateur(string pseudo) public UtilisateurCourant GetUtilisateur(string nom)
{ {
await this.MajUtilisateurs(); var utilisateur = utilisateursApplication.FirstOrDefault(w => w.Nom == nom);
var utilisateur = this.UtilisateursApplication.FirstOrDefault(w => w.Pseudo == pseudo);
if (utilisateur == null) if (utilisateur == null)
{ {
@ -37,32 +34,18 @@ public class AuthentificationService : IAuthentificationService
} }
var claims = new List<Claim>(); var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Role, utilisateur.Role)); claims.AddRange(utilisateur.Roles.Select(s => new Claim(ClaimTypes.Role, s)));
return new UtilisateurCourant return new UtilisateurCourant
{ {
EstAuthentifie = true, EstAuthentifie = true,
Pseudo = utilisateur.Pseudo, Nom = utilisateur.Nom,
Claims = claims.ToDictionary(c => c.Type, c => c.Value) Claims = claims.ToDictionary(c => c.Type, c => c.Value)
}; };
} }
public async Task Inscription(RequeteInscription requete) public void Inscription(RequeteInscription requete)
{
var motDePasseClair = requete.MotDePasse;
// Hach du mot de passe
var motDePasseHache = BCrypt.Net.BCrypt.HashPassword(motDePasseClair);
await this._utilisateursDataService.AjouterUtilisateur(new Utilisateur(requete.Pseudo, requete.Nom, requete.Prenom, "invite",
motDePasseHache, requete.Mail, false));
await this.MajUtilisateurs();
}
public async Task MajUtilisateurs()
{ {
this.UtilisateursApplication = await this._utilisateursDataService.getAllUtilisateurs(); utilisateursApplication.Add(new AppUtilisateur(requete.Nom, requete.MotDePasse, "invite" ));
} }
} }

@ -1,19 +1,14 @@
using System.Security.Claims; using System.Security.Claims;
using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Authorization;
using VeraxShield.composants.formulaires.modeles; using VeraxShield.composants.formulaires.modeles;
using VeraxShield.factories;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
public class DonneurEtat : AuthenticationStateProvider public class DonneurEtat : AuthenticationStateProvider
{ {
private IAuthentificationService _serviceAuthentification; private IAuthentificationService _serviceAuthentification;
public UtilisateurCourant _utilisateurCourant; private UtilisateurCourant _utilisateurCourant;
private IUtilisateursDataService _utilisateursDataService;
public DonneurEtat(IAuthentificationService service, IUtilisateursDataService utilisateursDataService) public DonneurEtat(IAuthentificationService service)
{ {
this._utilisateursDataService = utilisateursDataService;
this._serviceAuthentification = service; this._serviceAuthentification = service;
} }
@ -27,7 +22,7 @@ public class DonneurEtat : AuthenticationStateProvider
if (userInfo.EstAuthentifie) if (userInfo.EstAuthentifie)
{ {
var claims = new[] { new Claim(ClaimTypes.Name, this._utilisateurCourant.Pseudo) }.Concat(this._utilisateurCourant.Claims.Select(c => new Claim(c.Key, c.Value))); var claims = new[] { new Claim(ClaimTypes.Name, this._utilisateurCourant.Nom) }.Concat(this._utilisateurCourant.Claims.Select(c => new Claim(c.Key, c.Value)));
identite = new ClaimsIdentity(claims, "Server authentication"); identite = new ClaimsIdentity(claims, "Server authentication");
} }
} }
@ -39,7 +34,7 @@ public class DonneurEtat : AuthenticationStateProvider
return Task.FromResult(new AuthenticationState(new ClaimsPrincipal(identite))); return Task.FromResult(new AuthenticationState(new ClaimsPrincipal(identite)));
} }
public UtilisateurCourant getUtilisateurCourant() private UtilisateurCourant getUtilisateurCourant()
{ {
if (this._utilisateurCourant != null && this._utilisateurCourant.EstAuthentifie) if (this._utilisateurCourant != null && this._utilisateurCourant.EstAuthentifie)
{ {
@ -51,10 +46,10 @@ public class DonneurEtat : AuthenticationStateProvider
public async Task Connexion(RequeteConnexion requete) public async Task Connexion(RequeteConnexion requete)
{ {
await this._serviceAuthentification.Connexion(requete); this._serviceAuthentification.Connexion(requete);
// No error - Login the user // No error - Login the user
var user = await this._serviceAuthentification.GetUtilisateur(requete.Pseudo); var user = this._serviceAuthentification.GetUtilisateur(requete.Nom);
this._utilisateurCourant = user; this._utilisateurCourant = user;
NotifyAuthenticationStateChanged(GetAuthenticationStateAsync()); NotifyAuthenticationStateChanged(GetAuthenticationStateAsync());
@ -68,13 +63,12 @@ public class DonneurEtat : AuthenticationStateProvider
public async Task Inscription(RequeteInscription requete) public async Task Inscription(RequeteInscription requete)
{ {
await this._serviceAuthentification.Inscription(requete); this._serviceAuthentification.Inscription(requete);
// No error - Login the user // No error - Login the user
// var user = await this._serviceAuthentification.GetUtilisateur(requete.Nom); var user = this._serviceAuthentification.GetUtilisateur(requete.Nom);
// this._utilisateurCourant = user; this._utilisateurCourant = user;
NotifyAuthenticationStateChanged(GetAuthenticationStateAsync()); NotifyAuthenticationStateChanged(GetAuthenticationStateAsync());
} }
} }

@ -2,7 +2,7 @@ using VeraxShield.composants.formulaires.modeles;
public interface IAuthentificationService public interface IAuthentificationService
{ {
public Task<UtilisateurCourant> GetUtilisateur(String nom); public UtilisateurCourant GetUtilisateur(String nom);
public Task Connexion(RequeteConnexion requete); public void Connexion(RequeteConnexion requete);
public Task Inscription(RequeteInscription requete); public void Inscription(RequeteInscription requete);
} }

@ -0,0 +1,7 @@
@inherits LayoutComponentBase
<div class="main">
<div class="content px-4">
@Body
</div>
</div>

@ -1,16 +0,0 @@
.darkBlue {
color: #053679;
}
.editButton {
background-color: #053679;
border: none;
color: white;
}
.biggest{
font-weight: bold;
font-size:120%;
}

@ -2,46 +2,50 @@
background-color: white; background-color: white;
padding: 20px; padding: 20px;
border-radius: 10px; border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* Ajoute une ombre légère */ box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
} }
.field-container { .field-container {
margin-bottom: 15px; margin-bottom: 15px;
position: relative; /* Ajoutez cette ligne pour positionner le bouton correctement */
} }
.textedit-container { .textedit-container {
border-radius: 20px; border-radius: 20px;
border: 1px solid black; border: 1px solid black;
width: 80%; /* Ajuste la largeur des champs de saisie */ width: 80%;
position: relative; /* Ajoutez cette ligne pour positionner le bouton correctement */
} }
.btn-container { .btn-container {
display: flex; display: flex;
justify-content: center; justify-content: center;
gap: 10px; /* Ajoute de l'espace entre les boutons */ gap: 10px;
} }
.btn-se-connecter, .btn-se-connecter,
.btn-s-inscrire { .btn-s-inscrire {
width: 150px; /* Ajuste la largeur des boutons */ width: 150px;
} }
.title-spacing { .title-spacing {
margin-bottom: 20px; /* Ajoute plus d'espace entre le titre et les éléments suivants */ margin-bottom: 20px;
} }
.btn-se-connecter { .btn-se-connecter {
background-color: #053679; background-color: darkblue;
color: white; color: white;
} }
.btn-se-connecter:hover, .btn-s-inscrire:hover {
background-color: #afc1db;
color: #053679;
}
.btn-s-inscrire { .btn-s-inscrire {
background-color: grey; background-color: grey;
color: white; color: white;
} }
/* Ajoutez cette règle pour positionner le bouton à droite */
.textedit-container .btn-append {
position: absolute;
top: 50%;
right: 10px;
transform: translateY(-50%);
}

@ -1,51 +0,0 @@
.formulaire-conteneur {
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* Ajoute une ombre au formulaire */
border-radius: 10px; /* Ajoute des bords arrondis au formulaire */
/* background-color: black; */
background-color: #8BC6EC;
background-image: linear-gradient(135deg, #8BC6EC 0%, #9599E2 100%);
color: white; /* Définit la couleur du texte à blanc */
padding: 20px; /* Ajoute une marge intérieure pour plus de lisibilité */
}
.title-spacing {
margin-bottom: 20px; /* Ajoute une séparation entre le titre et le reste du contenu */
}
.field-container {
margin-bottom: 15px; /* Ajoute une séparation entre chaque champ */
}
/* Rend les labels en gras et blancs */
.field-label {
font-weight: bold;
color: white;
}
.btn-container {
display: flex;
justify-content: center;
margin-top: 20px; /* Ajoute une séparation entre les champs et les boutons */
}
.btn-se-connecter {
/* background-color: darkblue; */
/*background: #F3904F; fallback for old browsers */
/*background: -webkit-linear-gradient(to right, #3B4371, #F3904F); Chrome 10-25, Safari 5.1-6 */
/*background: linear-gradient(to right, #3B4371, #F3904F); W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
background: white;
color: black;
margin-right: 10px; /* Ajoute un espace entre les deux boutons */
}
.btn-s-inscrire {
background-color: white;
/* color: white; */
color: black;
}

@ -1,52 +0,0 @@
/* Ajoutez ces styles à votre fichier CSS associé au composant (FormulaireModification.css) */
.formulaire-conteneur {
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* Ajoute une ombre au formulaire */
border-radius: 10px; /* Ajoute des bords arrondis au formulaire */
/* background-color: black; */
background-color: #8BC6EC;
background-image: linear-gradient(135deg, #8BC6EC 0%, #9599E2 100%);
color: white; /* Définit la couleur du texte à blanc */
padding: 20px; /* Ajoute une marge intérieure pour plus de lisibilité */
}
.title-spacing {
margin-bottom: 20px; /* Ajoute une séparation entre le titre et le reste du contenu */
}
.field-container {
margin-bottom: 15px; /* Ajoute une séparation entre chaque champ */
}
/* Rend les labels en gras et blancs */
.field-label {
font-weight: bold;
color: white;
}
.btn-container {
display: flex;
justify-content: center;
margin-top: 20px; /* Ajoute une séparation entre les champs et les boutons */
}
.btn-se-connecter {
/* background-color: darkblue; */
/*background: #F3904F; fallback for old browsers */
/*background: -webkit-linear-gradient(to right, #3B4371, #F3904F); Chrome 10-25, Safari 5.1-6 */
/*background: linear-gradient(to right, #3B4371, #F3904F); W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
background: white;
color: black;
margin-right: 10px; /* Ajoute un espace entre les deux boutons */
}
.btn-s-inscrire {
background-color: white;
/* color: white; */
color: black;
}

@ -1,62 +0,0 @@
body{
font-size : 17px;
}
.nav-link{
color : white;
margin : 0;
}
.bar-container {
display : flex;
justify-content : space-between;
align-items : center;
background-color : #053679;
}
.bar-menu {
display : flex;
justify-content : space-around;
align-items : center;
flex-grow : 1;
}
.bar-menu .bar-item:first-child {
margin-left : 0;
}
.bar-menu .bar-item:last-child {
margin-right : 0;
}
.bar-menu .bar-link:hover {
text-decoration : none;
color : #D4DBE6;
transform : scale(1.1);
}
.btn-primary {
background-color : #E5E5E5;
color : #053679;
border-color: #053679;
}
.bar-role{
color : black;
font-weight : 500;
font-size : 15px;
margin-right : 20px;
align-self : center;
border : 2px solid black;
padding : 3px;
border-radius : 5px;
}
.logo {
width : 55px;
}

@ -1,89 +0,0 @@
/*Not Authorized
---------------------------------------------------
*/
body {
background-color: white;
margin: 0;
padding: 0;
font-family: Arial, sans-serif;
width: 100%;
}
header {
color: #053679;
text-align: center;
padding: 10px;
margin: 0;
background-color: #afc1db;
}
main {
display: flex;
justify-content: center;
align-items: center;
height: 80vh;
margin-top:10vh;
}
.center-box {
/* background-color: #afc1db; */
background-color: #8BC6EC;
background-image: linear-gradient(135deg, #8BC6EC 0%, #9599E2 100%);
padding: 20px;
text-align: center;
border-radius: 10px;
}
.button-container {
margin-top: 10px;
display: flex;
justify-content: center;
align-items: center;
}
.btn-link {
color: white;
background-color: #053679;
margin: 5px;
padding: 10px;
border: none;
border-radius: 5px;
display: block;
cursor: pointer;
width:100%;
}
.btn-link:hover {
background-color: white;
color: #053679;
}
/*Authorized
---------------------------------------------------
*/
.navbar {
background-color: #053679;
}
.btn-navbar {
color: white;
background-color: none;
}
.btn-navbar:hover {
color: #afc1db;
}
.home-center-box {
background-color: #afc1db;
padding: 40px;
text-align: center;
border-radius: 10px;
width: 80%;
}

@ -1,20 +0,0 @@
.centrer-composant {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.formulaire-inscription {
width: 53%;
/* border: 2px solid black;
border-radius: 10px; */
/* padding: 20px; */
}
body {
background-image: url('/ressources/images/fondPages/fondConnexion.webp');
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}

@ -1,4 +0,0 @@
/* body {
background-color: #8BC6EC;
background-image: linear-gradient(135deg, #8BC6EC 0%, #9599E2 100%);
} */

@ -1,14 +0,0 @@
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh; /* 100% de la hauteur de la vue */
}
.formulaire-modification {
width: 50%;
/* background-color: green;
padding: 20px; */
/*box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); Ajoute une ombre au formulaire */
/* border-radius: 10px; Ajoute des bords arrondis au formulaire */
}

@ -1,14 +0,0 @@
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh; /* 100% de la hauteur de la vue */
}
.formulaire-modification {
width: 50%;
/* background-color: green;
padding: 20px; */
/*box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); Ajoute une ombre au formulaire */
/* border-radius: 10px; Ajoute des bords arrondis au formulaire */
}

@ -1,32 +0,0 @@
.h1{
text-align:center;
margin: 50px;
}
.margin10{
margin: 10px;
}
.center-box {
padding: 20px;
margin: 20px auto;
text-align: center;
border-radius: 10px;
/* background-color: #afc1db; */
background-color: #8BC6EC;
background-image: linear-gradient(135deg, #8BC6EC 0%, #9599E2 100%);
width: 80%;
}
.dataGrid {
margin: 10px auto;
width: 80%;
}
.btn:hover {
background-color: #afc1db;
color: #053679;
}

@ -17,15 +17,6 @@
"Mdp": "SecretPassword456", "Mdp": "SecretPassword456",
"IsBan": true "IsBan": true
}, },
{
"Pseudo": "Admin",
"Mail": "Admin.admin@admin.com",
"Nom": "Admin",
"Prenom": "Admin",
"Role": "admin",
"Mdp": "Admin",
"IsBan": false
},
{ {
"Pseudo": "alice_jones", "Pseudo": "alice_jones",
"Mail": "alice.jones@example.com", "Mail": "alice.jones@example.com",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

@ -1,34 +0,0 @@
# Première étape : Créer l'image de base
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
# Deuxième étape : Construire l'application
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
# Copier les fichiers nécessaires pour la restauration des dépendances
COPY ["dockerfile", "."]
COPY ["VeraxShield/VeraxShield/VeraxShield.csproj", "VeraxShield/"]
RUN dotnet restore "VeraxShield/VeraxShield.csproj"
# Copier le reste des fichiers
COPY . .
WORKDIR "/src/VeraxShield/VeraxShield"
RUN dotnet build "VeraxShield.csproj" -c Release -o /app/build
# Troisième étape : Publier l'application
FROM build AS publish
RUN dotnet publish "VeraxShield.csproj" -c Release -o /app/publish
# Quatrième étape : Créer l'image finale
FROM base AS final
WORKDIR /app
# Copier les fichiers publiés dans l'image finale
COPY --from=publish /app/publish .
# Définir le point d'entrée de l'application
ENTRYPOINT ["dotnet", "VeraxShield.dll"]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Loading…
Cancel
Save