feat : sécurité password bcrypt
continuous-integration/drone/push Build is passing Details

Multiplayer_Php
Maxence GUITARD 1 year ago
commit 0daa67fc3c

@ -5,7 +5,7 @@
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<PageTitle>Not found</PageTitle>
<PageTitle>Not found </PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>

@ -28,6 +28,7 @@
<PackageReference Include="ChoETL.NETStandard" Version="1.2.1.64" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="8.0.0" />
<PackageReference Include="SuperConvert" Version="1.0.4.9" />
<PackageReference Include="System.Net.Http" Version="4.3.4" />
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
</ItemGroup>

@ -1,6 +1,29 @@

<div class="card text-center">
@CardHeader
@CardBody
@CardFooter
<BackButton RedirectionPage="/questions"></BackButton>
<div class="text-center pb-2">
<h3>Question n°@Question.Id</h3>
</div>
<div class="text-center pb-5 mt-3">
<h5>@Question.Content</h5>
</div>
<div class="container-fluid text-center justify-content-center row card-body">
@foreach (var answer in Answers)
{
<div class="col-3 text-center">
@if (answer.Id == Question.IdAnswerGood)
{
<p class="text-success"><strong>@answer.Content</strong></p>
}
else
{
<p class="text-danger">@answer.Content</p>
}
</div>
}
</div>
<div class="card-footer text-center text-muted">
Chapitre : @Question.ChapterName
</div>

@ -1,16 +1,15 @@
using Microsoft.AspNetCore.Components;
using Blazor.Pages;
using Blazor.ViewClasses;
using Microsoft.AspNetCore.Components;
namespace Blazor.Components
{
public partial class CardViewQuestion
{
[Parameter]
public RenderFragment CardBody { get; set; }
public Question Question { get; set; }
[Parameter]
public RenderFragment CardFooter { get; set; }
[Parameter]
public RenderFragment CardHeader { get; set; }
public List<Answer> Answers { get; set; }
}
}

@ -1,7 +1,7 @@
@page "/addAdministrator"
@using Blazor.Models
@using Blazor.Components
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<BackButton RedirectionPage="/administrators"></BackButton>
<div class="container text-center">
@ -24,7 +24,7 @@
<label for="hashedPassword" class="col-form-label">@Localizer["Password"] :</label>
</div>
<div class="col-7">
<InputText id="hashedPassword" @bind-Value="administratorModel.HashedPassword" class="form-control" />
<InputText id="hashedPassword" @bind-Value="administratorModel.HashedPassword" class="form-control" type="password"/>
</div>
</div>

@ -1,7 +1,7 @@
@page "/administrators"
@using Blazorise.DataGrid
@using Blazor.ViewClasses
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<h3>@Localizer["Title"]</h3>
<div>

@ -1,7 +1,7 @@
@page "/editAdministrator/{Id:int}"
@using Blazor.Components;
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<BackButton RedirectionPage="/administrators"></BackButton>
<div class="container text-center">
@ -25,7 +25,7 @@
<label for="hashedPassword" class="col-form-label">@Localizer["HashedPassword"] :</label>
</div>
<div class="col-7">
<InputText id="hashedPassword" @bind-Value="administratorModel.HashedPassword" class="form-control" />
<InputText id="hashedPassword" @bind-Value="administratorModel.HashedPassword" class="form-control" type="password"/>
</div>
</div>

@ -1,7 +1,7 @@
@page "/addChapter"
@using Blazor.Models
@using Blazor.Components
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<BackButton RedirectionPage="/chapters"></BackButton>
<div class="container text-center">

@ -2,7 +2,7 @@
@using Blazor.ViewClasses;
@using Blazorise.DataGrid
@using Blazored.Modal;
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<h3>@Localizer["Title"]</h3>
<div>
<NavLink class="btn btn-primary" href="addChapter" Match="NavLinkMatch.All">

@ -1,7 +1,7 @@
@page "/editChapter/{Id:int}"
@using Blazor.Components;
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<BackButton RedirectionPage="/chapters"></BackButton>

@ -3,7 +3,7 @@
<!DOCTYPE html>
<html lang="en">
<PageTitle>Error</PageTitle>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

@ -1,9 +1,9 @@
@page "/"
<PageTitle>Home</PageTitle>
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<div class="container row justify-content-center mb-5">
<img src="/images/mathseduc.png" alt="Logo MathsEduc" class=" col-4" />
<div class="container text-center mb-5">
<img src="/images/mathseduc.png" alt="Logo MathsEduc" height="150" />
</div>
<h1 class="text-center">@Localizer["Title"]</h1>

@ -3,7 +3,7 @@
@using Blazor.Components
<BackButton RedirectionPage="/players"></BackButton>
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<div class="container text-center">
<div class="border border-dark p-4 d-inline-block">
<h3>@Localizer["Title"]</h3>
@ -25,7 +25,7 @@
<label for="hashedPassword" class="col-form-label">@Localizer["HashedPassword"] :</label>
</div>
<div class="col-7">
<InputText id="hashedPassword" @bind-Value="playerModel.HashedPassword" class="form-control"/>
<InputText id="hashedPassword" @bind-Value="playerModel.HashedPassword" class="form-control" type="password" />
</div>
</div>

@ -3,7 +3,7 @@
@using Blazor.Components;
<BackButton RedirectionPage="/players"></BackButton>
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<div class="container text-center">
<div class="border border-dark p-4 d-inline-block">
<h3>@Localizer["Title"]</h3>
@ -24,7 +24,7 @@
<label for="hashedPassword" class="col-form-label">@Localizer["HashedPassword"] :</label>
</div>
<div class="col-7">
<InputText id="hashedPassword" @bind-Value="playerModel.HashedPassword" class="form-control" />
<InputText id="hashedPassword" @bind-Value="playerModel.HashedPassword" class="form-control" type="password"/>
</div>
</div>

@ -2,7 +2,7 @@
@using Blazor.ViewClasses;
@using Blazorise.DataGrid
@using Blazored.Modal;
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<h3>@Localizer["Title"]</h3>
<div>
<NavLink class="btn btn-primary" href="addPlayer" Match="NavLinkMatch.All">

@ -3,7 +3,7 @@
@using Blazor.Components
<BackButton RedirectionPage="/questions"></BackButton>
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<div class="container text-center">
<div class="border border-dark p-4 d-inline-block">
<h3>@Localizer["Title"]</h3>

@ -2,36 +2,4 @@
@using Blazor.Components;
<CardViewQuestion>
<CardHeader>
<div class="text-center pb-2">
<h3>Question n°@question.Id</h3>
</div>
<div class="text-center pb-5 mt-3">
<h5>@question.Content</h5>
</div>
</CardHeader>
<CardBody>
<div class="container-fluid text-center justify-content-center row">
@foreach (var answer in answers)
{
<div class="col-3 text-center">
@if (answer.Id == question.IdAnswerGood)
{
<p class="text-success"><strong>@answer.Content</strong></p>
}
else
{
<p class="text-danger">@answer.Content</p>
}
</div>
}
</div>
</CardBody>
<CardFooter>
<div class="card-footer text-muted">
Chapitre : @question.ChapterName
</div>
<BackButton RedirectionPage="/questions"></BackButton>
</CardFooter>
</CardViewQuestion>
<CardViewQuestion Question="@question" Answers="@answers"></CardViewQuestion>

@ -1,8 +1,6 @@
using Blazor.Models;
using Blazor.Pages;
using Blazor.ViewClasses;
using Blazor.ViewClasses;
using Microsoft.AspNetCore.Components;
using static System.Net.WebRequestMethods;
using Microsoft.Extensions.Localization;
namespace Blazor.Pages.Questions
{
@ -15,7 +13,8 @@ namespace Blazor.Pages.Questions
private List<Answer> answers = new();
public List<Question> questions = new();
[Inject]
public IStringLocalizer<DisplayQuestions> Localizer { get; set; }
[Inject]
public required HttpClient Http { get; set; }

@ -2,7 +2,7 @@
<BackButton RedirectionPage="/questions"></BackButton>
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<div class="container text-center">
<div class="border border-dark p-4 d-inline-block">
<h3>@Localizer["Title"]</h3>

@ -2,7 +2,7 @@
@using Blazor.ViewClasses;
@using Blazorise.DataGrid
@using Blazored.Modal;
<PageTitle>@Localizer["PageTitle"]</PageTitle>
<h3>@Localizer["Title"]</h3>
<div>

@ -13,6 +13,7 @@ using Blazored.Modal;
using System.Text.RegularExpressions;
using Blazor.Components;
using Microsoft.Extensions.Localization;
using SuperConvert.Extensions;
namespace Blazor.Pages.Questions;
@ -100,8 +101,10 @@ public partial class Questions
selectedQuestions.Add(questions[i]);
}
questions = selectedQuestions;
totalQuestion = response[0].total_questions;
if (!response.IsNullOrEmpty())
{
totalQuestion = response[0].total_questions;
}
}
}
@ -110,15 +113,9 @@ public partial class Questions
StringBuilder sb = new StringBuilder();
HttpResponseMessage response = await Http.GetAsync(API.API_URL+"questionsExport/"+API.TOKEN);
var json = await response.Content.ReadAsStringAsync();
using (var jsonFile = ChoJSONReader.LoadText(json))
{
using (var csvFile = new ChoCSVWriter(sb).WithFirstLineHeader())
{
csvFile.Write(jsonFile);
}
}
var sentFile = new MemoryStream(Encoding.Unicode.GetBytes(sb.ToString()));
byte[] csv = json.ToCsv(';');
string csvString = Encoding.Unicode.GetString(csv);
var sentFile = new MemoryStream(Encoding.Unicode.GetBytes(csvString));
using (var streamRef = new DotNetStreamReference(stream: sentFile))
{
await IJSRuntime.InvokeVoidAsync("downloadFileFromStream", "data.csv", streamRef);
@ -131,22 +128,24 @@ public partial class Questions
{
await e.File.OpenReadStream().CopyToAsync(ms);
var bytes = ms.ToArray();
string s = Encoding.UTF8.GetString(bytes);
string s = Encoding.Unicode.GetString(bytes);
s = s.Replace("\r\n", "\n");
s = s.Replace("\"", string.Empty);
s = s.Replace("\0", string.Empty);
var rows = s.Split('\n');
rows = rows.Skip(1).ToArray();
foreach (var row in rows)
{
var field = row.Split(';');
field[1] = field[1].Replace(" ", "+");
var formData = new List<KeyValuePair<string, string>>();
formData.Add(new KeyValuePair<string, string>("content", field[0]));
formData.Add(new KeyValuePair<string, string>("answerContent1", field[2]));
formData.Add(new KeyValuePair<string, string>("answerContent2", field[3]));
formData.Add(new KeyValuePair<string, string>("answerContent3", field[4]));
formData.Add(new KeyValuePair<string, string>("answerContent4", field[5]));
formData.Add(new KeyValuePair<string, string>("idanswergood", field[6]));
formData.Add(new KeyValuePair<string, string>("answerContent1", field[3]));
formData.Add(new KeyValuePair<string, string>("answerContent2", field[4]));
formData.Add(new KeyValuePair<string, string>("answerContent3", field[5]));
formData.Add(new KeyValuePair<string, string>("answerContent4", field[6]));
formData.Add(new KeyValuePair<string, string>("idanswergood", field[2]));
string apiUri = API.API_URL+"chapters/name/"+field[1] + "/" + API.TOKEN;
@ -167,7 +166,7 @@ public partial class Questions
}
var formContent = new FormUrlEncodedContent(formData);
apiUri = API.API_URL+"add/questions/"+API.TOKEN;
apiUri = API.API_URL+"add/question/"+API.TOKEN;
response = await Http.PostAsync(apiUri, formContent);

@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="PageTitle" xml:space="preserve">
<value>Ajouter administrateur</value>
</data>
<data name="Password" xml:space="preserve">
<value>Mot de passe</value>
</data>

@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="PageTitle" xml:space="preserve">
<value>Add Admnistrator</value>
</data>
<data name="Password" xml:space="preserve">
<value>Password</value>
</data>

@ -126,6 +126,9 @@
<data name="Edit" xml:space="preserve">
<value>Editer</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Administrateurs</value>
</data>
<data name="Title" xml:space="preserve">
<value>Administrateurs</value>
</data>

@ -126,6 +126,9 @@
<data name="Edit" xml:space="preserve">
<value>Edit</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Administrators</value>
</data>
<data name="Title" xml:space="preserve">
<value>Administrators</value>
</data>

@ -120,6 +120,9 @@
<data name="HashedPassword" xml:space="preserve">
<value>Mot de passe</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Editer Administrateur</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Valider</value>
</data>

@ -120,6 +120,9 @@
<data name="HashedPassword" xml:space="preserve">
<value>Password</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Edit Administrator</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Submit</value>
</data>

@ -120,6 +120,9 @@
<data name="Name" xml:space="preserve">
<value>Nom</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Ajouter Chapitre</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Valider</value>
</data>

@ -120,6 +120,9 @@
<data name="Name" xml:space="preserve">
<value>Name</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Add Chapter</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Submit</value>
</data>

@ -132,6 +132,9 @@
<data name="Name" xml:space="preserve">
<value>Nom</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Chapitres</value>
</data>
<data name="Title" xml:space="preserve">
<value>Chapitres</value>
</data>

@ -132,6 +132,9 @@
<data name="Name" xml:space="preserve">
<value>Name</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Chapters</value>
</data>
<data name="Title" xml:space="preserve">
<value>Chapters</value>
</data>

@ -120,6 +120,9 @@
<data name="Name" xml:space="preserve">
<value>Nom</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Editer Chapitre</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Valider</value>
</data>

@ -120,6 +120,9 @@
<data name="Name" xml:space="preserve">
<value>Name</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Edit Chapter</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Submit</value>
</data>

@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="PageTitle" xml:space="preserve">
<value>Acceuil</value>
</data>
<data name="Text" xml:space="preserve">
<value>C'est la partie administrateur de l'application MathsEduc. Vous pouvez modifier/ajouter/supprimer des questions ou gérer les joueurs, les administrateurs et les chapitres.</value>
</data>

@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="PageTitle" xml:space="preserve">
<value>Home</value>
</data>
<data name="Text" xml:space="preserve">
<value>This is the administrator part of the MathsEduc application. You can edit/add/delete questions or manage players, admins and chapters.</value>
</data>

@ -123,6 +123,9 @@
<data name="Nickname" xml:space="preserve">
<value>Pseudo</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Ajouter Joueur</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Envoyer</value>
</data>

@ -123,6 +123,9 @@
<data name="Nickname" xml:space="preserve">
<value>Nickname</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Add Player</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Submit</value>
</data>

@ -123,6 +123,9 @@
<data name="Nickname" xml:space="preserve">
<value>Pseudo</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Editer Joueur</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Valider</value>
</data>

@ -123,6 +123,9 @@
<data name="Nickname" xml:space="preserve">
<value>Nickname</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Edit Player</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Submit</value>
</data>

@ -129,6 +129,9 @@
<data name="Nickname" xml:space="preserve">
<value>Pseudo</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Joueurs</value>
</data>
<data name="Title" xml:space="preserve">
<value>Joueurs</value>
</data>

@ -129,6 +129,9 @@
<data name="Nickname" xml:space="preserve">
<value>Nickname</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Players</value>
</data>
<data name="Title" xml:space="preserve">
<value>Players</value>
</data>

@ -126,6 +126,9 @@
<data name="Content" xml:space="preserve">
<value>Contenu</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Ajouter Question</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Valider</value>
</data>

@ -127,6 +127,9 @@
<data name="Content" xml:space="preserve">
<value>Content</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Add Question</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Submit</value>
</data>

@ -129,6 +129,9 @@
<data name="Correct" xml:space="preserve">
<value>Correcte</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Editer Question</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Valider</value>
</data>

@ -129,6 +129,9 @@
<data name="Correct" xml:space="preserve">
<value>Correct</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Edit Question</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Submit</value>
</data>

@ -135,6 +135,9 @@
<data name="Export" xml:space="preserve">
<value>Exporter</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Questions</value>
</data>
<data name="Show" xml:space="preserve">
<value>Afficher</value>
</data>

@ -135,6 +135,9 @@
<data name="Export" xml:space="preserve">
<value>Export</value>
</data>
<data name="PageTitle" xml:space="preserve">
<value>Questions</value>
</data>
<data name="Show" xml:space="preserve">
<value>Show</value>
</data>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -6,6 +6,7 @@ namespace Test
[TestMethod]
public void TestMethod1()
{
Assert.IsTrue(true);
}
}
}

@ -43,6 +43,14 @@ Les principaux objectifs incluent :
- Intégrer des fonctionnalités de suivi des progrès pour que les étudiants puissent mesurer leur compréhension au fil du temps.
- Assurer la compatibilité avec différents dispositifs et navigateurs pour une accessibilité optimale.
## Le backoffice
Une partie administrateur est disponible pour gérer l'ajout/la suppression des questions, des chapitres, des administrateurs et des joueurs.
Un export/import des questions au format csv est disponible.
Nous avons créé un composant complexe pour afficher les détails des questions.
Le blazor, utilisant une api, un fichier de configuration API.cs est nécessaire (n'hésitez à nous le demander).
## Les Parties Prenantes et leurs Rôles
1. **GUITARD Maxence** - Développeur polyvalent

Loading…
Cancel
Save