Merge branch 'persistance' into developpement
continuous-integration/drone/push Build is failing Details

pull/15/head
Matheo THIERRY 2 years ago
commit f054b6c75d

@ -6,4 +6,8 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="NHibernate" Version="5.4.2" />
</ItemGroup>
</Project> </Project>

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.ComponentModel.Design; using System.ComponentModel.Design;
using System.Data;
using System.Linq; using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Text; using System.Text;
@ -9,7 +10,7 @@ using System.Threading.Tasks;
namespace Biblioteque_de_Class namespace Biblioteque_de_Class
{ {
[DataContract] [DataContract(IsReference = true)]
public class Database public class Database
{ {
[DataMember] [DataMember]
@ -18,17 +19,24 @@ namespace Biblioteque_de_Class
private List<Theme> ThemeList; private List<Theme> ThemeList;
[DataMember] [DataMember]
private List<User> UserList; private List<User> UserList;
[DataMember]
private Dictionary<User, List<Theme>> AddedThemeList;
public Database() public Database()
{ {
DefaultLogoList = new List<Logo>(); DefaultLogoList = new List<Logo>();
ThemeList = new List<Theme>(); ThemeList = new List<Theme>();
UserList = new List<User>(); UserList = new List<User>();
AddedThemeList = new Dictionary<User, List<Theme>>();
} }
public List<Logo> GetDefaultLogoList() { return DefaultLogoList; } public List<Logo> GetDefaultLogoList() { return DefaultLogoList; }
public List<Theme> GetThemeList() { return ThemeList; } public List<Theme> GetThemeList() { return ThemeList; }
public List<User> GetUserList() { return UserList; } public List<User> GetUserList() { return UserList; }
public Dictionary<User,List<Theme>> GetAddedThemeFromUser() { return AddedThemeList; }
public void SetDefaultLogoList(List<Logo> defaultLogoList) { DefaultLogoList = defaultLogoList; }
public void SetDefaultThemeList(List<Theme> defaultThemeList) { ThemeList = defaultThemeList; }
/// <summary> /// <summary>
/// recherche un utilisateur dans la liste d'utilisateur /// recherche un utilisateur dans la liste d'utilisateur
@ -204,5 +212,10 @@ namespace Biblioteque_de_Class
} }
} }
} }
public List<Theme> AddedThemeOfOneUser(User user)
{
return GetAddedThemeFromUser()[user];
}
} }
} }

@ -8,8 +8,11 @@ namespace Biblioteque_de_Class
{ {
public interface IManager public interface IManager
{ {
public void SaveDatabaseData(Database database); public void SaveDatabaseData(List<User> UserList, Dictionary<User, List<Theme>> AddedThemeFromUser);
public Database LoadDatabaseData(); public Database LoadDatabaseData();
public List<Theme> LoadDefaultTheme();
public List<Logo> LoadDefaultLogo();
} }
} }

@ -1,34 +1,47 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Biblioteque_de_Class namespace Biblioteque_de_Class
{ {
[DataContract(IsReference = true)]
public class Note public class Note
{ {
[DataMember]
private string name; private string name;
[DataMember]
public string Name public string Name
{ {
get { return name; } get { return name; }
private set { if (value == null) { name = "Unnamed Note"; } else { name = value; } } private set { if (value == null) { name = "Unnamed Note"; } else { name = value; } }
} }
[DataMember]
private string Text { get; set; } = ""; private string Text { get; set; } = "";
[DataMember]
private string logoPath; private string logoPath;
[DataMember]
public string LogoPath public string LogoPath
{ {
get { return logoPath; } get { return logoPath; }
private set { if (value == null) { logoPath = "PATH TO DEFAULT LOGO"; } else { logoPath = value; } } private set { if (value == null) { logoPath = "PATH TO DEFAULT LOGO"; } else { logoPath = value; } }
} }
[DataMember]
private DateOnly CreationDate { get; } private DateOnly CreationDate { get; }
[DataMember]
private DateOnly ModificationDate { get; set; } private DateOnly ModificationDate { get; set; }
[DataMember]
private readonly List<NoteImage> ImageList; private readonly List<NoteImage> ImageList;
[DataMember]
private readonly List<User> Collaborators; private readonly List<User> Collaborators;
[DataMember]
private readonly List<User> Editors; private readonly List<User> Editors;
[DataMember]
private readonly User Owner; private readonly User Owner;
public Note(string name, string logoPath, User owner) public Note(string name, string logoPath, User owner)

@ -4,6 +4,8 @@ namespace Biblioteque_de_Class
{ {
public class PersistenceManager public class PersistenceManager
{ {
private Database db = new();
private readonly IManager persistence; private readonly IManager persistence;
public PersistenceManager(IManager pers) public PersistenceManager(IManager pers)
@ -13,12 +15,15 @@ namespace Biblioteque_de_Class
public void SaveDatabaseData(Database database) public void SaveDatabaseData(Database database)
{ {
persistence.SaveDatabaseData(database); persistence.SaveDatabaseData(database.GetUserList(), database.GetAddedThemeFromUser());
} }
public Database LoadDatabaseData() public Database LoadDatabaseData()
{ {
return persistence.LoadDatabaseData(); db = persistence.LoadDatabaseData();
db.SetDefaultThemeList(persistence.LoadDefaultTheme());
db.SetDefaultLogoList(persistence.LoadDefaultLogo());
return db;
} }
} }
} }

@ -5,7 +5,7 @@ using System.Runtime.Serialization;
namespace Biblioteque_de_Class namespace Biblioteque_de_Class
{ {
[DataContract] [DataContract(IsReference = true)]
public class User public class User
{ {
[DataMember] [DataMember]
@ -14,6 +14,9 @@ namespace Biblioteque_de_Class
private string Email { get; set; } private string Email { get; set; }
[DataMember] [DataMember]
private string Password { get; set; } private string Password { get; set; }
[DataMember]
private string Picture { get; set; }
[DataMember]
private Theme Theme; private Theme Theme;
[DataMember] [DataMember]
private List<Note> NoteList; private List<Note> NoteList;
@ -21,7 +24,7 @@ namespace Biblioteque_de_Class
private List<Tags> TagList; private List<Tags> TagList;
[DataMember] [DataMember]
private List<Note> FavList; private List<Note> FavList;
[DataMember] [DataMember(EmitDefaultValue = false)]
private bool IsConnected { get; set; } private bool IsConnected { get; set; }
[DataMember] [DataMember]
private Dictionary<Note, List<Tags>> NoteTagged; private Dictionary<Note, List<Tags>> NoteTagged;
@ -31,6 +34,7 @@ namespace Biblioteque_de_Class
Username = username; Username = username;
Email = email; Email = email;
Password = password; Password = password;
Picture = "defaultpicture.png";
NoteList = new List<Note>(); NoteList = new List<Note>();
TagList = new List<Tags>(); TagList = new List<Tags>();
FavList = new List<Note>(); FavList = new List<Note>();
@ -40,6 +44,7 @@ namespace Biblioteque_de_Class
public string GetUsername() { return Username; } public string GetUsername() { return Username; }
public string GetEmail() { return Email; } public string GetEmail() { return Email; }
public string GetPassword() { return Password; } public string GetPassword() { return Password; }
public string GetPicture() { return Picture;}
public Theme GetTheme() { return Theme; } public Theme GetTheme() { return Theme; }
public List<Note> GetNoteList() { return NoteList; } public List<Note> GetNoteList() { return NoteList; }
public List<Tags> GetTagList() { return TagList; } public List<Tags> GetTagList() { return TagList; }
@ -51,6 +56,7 @@ namespace Biblioteque_de_Class
public void SetUsername(string username) { Username = username; } public void SetUsername(string username) { Username = username; }
public void SetEmail(string email) { Email = email; } public void SetEmail(string email) { Email = email; }
public void SetPassword(string password) { Password = password; } public void SetPassword(string password) { Password = password; }
public void SetPicture(string picture) { Picture = picture; }
public void SetTheme(Theme theme) { Theme = theme; } public void SetTheme(Theme theme) { Theme = theme; }
public void SetIsConnected(bool isConnected) { IsConnected = isConnected; } public void SetIsConnected(bool isConnected) { IsConnected = isConnected; }

@ -7,10 +7,6 @@ using System.Text;
// load database // load database
PersistenceManager manager = new(new Stub()); PersistenceManager manager = new(new Stub());
Database db = manager.LoadDatabaseData(); Database db = manager.LoadDatabaseData();
foreach(User user in db.GetUserList())
{
user.SetPassword(GetSHA256Hash(user.GetPassword()));
}
// initialization zone============================================================================== // initialization zone==============================================================================
@ -139,22 +135,6 @@ List<string>? choix_couleur()
return colorList; return colorList;
} }
static string GetSHA256Hash(string input)
{
using (SHA256 sha256Hash = SHA256.Create())
{
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
builder.Append(bytes[i].ToString("x2"));
}
return builder.ToString();
}
}
while (menu) while (menu)
{ {
Console.WriteLine("\n|--------------------------------------|"); Console.WriteLine("\n|--------------------------------------|");
@ -190,7 +170,6 @@ while (menu)
Console.WriteLine("\nEntrez un password :"); Console.WriteLine("\nEntrez un password :");
string? password = Console.ReadLine(); string? password = Console.ReadLine();
if (password == null) { continue; } if (password == null) { continue; }
password = GetSHA256Hash(password);
try try
{ {
u = db.GetUser(nom); u = db.GetUser(nom);
@ -202,7 +181,7 @@ while (menu)
} }
if (!connection) if (!connection)
{ {
if (Database.ComparePassword(u, password)) if (Database.ComparePassword(u, password.GetHashCode().ToString()))
{ {
u.SetIsConnected(true); u.SetIsConnected(true);
Console.WriteLine("\nConnection réussie !\n"); Console.WriteLine("\nConnection réussie !\n");
@ -234,8 +213,7 @@ while (menu)
} }
catch (AlreadyUsedException) catch (AlreadyUsedException)
{ {
password = GetSHA256Hash(password); u = new User(nom, "", password.GetHashCode().ToString());
u = new User(nom, "", password);
db.AddUser(u); db.AddUser(u);
db.GetUser(nom).SetIsConnected(true); db.GetUser(nom).SetIsConnected(true);
Console.WriteLine("\nConnection réussie !\n"); Console.WriteLine("\nConnection réussie !\n");
@ -548,8 +526,7 @@ while (u.GetIsConnected())
Console.WriteLine("\nLe mot de passe doit contenir au moins 8 caractères.\n"); Console.WriteLine("\nLe mot de passe doit contenir au moins 8 caractères.\n");
break; break;
} }
wantedNewPassword = GetSHA256Hash(wantedNewPassword); if(wantedNewPassword.GetHashCode().ToString() == u.GetPassword()){
if(wantedNewPassword == u.GetPassword()){
Console.WriteLine("\nLe nouveau mot de passe doit être différent de l'ancien.\n"); Console.WriteLine("\nLe nouveau mot de passe doit être différent de l'ancien.\n");
break; break;
} }

@ -4,13 +4,30 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization.Json; using System.Runtime.Serialization.Json;
using System.Text; using System.Text;
using System.Security.Cryptography;
using System.Threading.Tasks; using System.Threading.Tasks;
static string GetSHA256Hash(string input)
{
using (SHA256 sha256Hash = SHA256.Create())
{
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
builder.Append(bytes[i].ToString("x2"));
}
return builder.ToString();
}
}
namespace Notus_Persistance namespace Notus_Persistance
{ {
public class Stub : IManager public class Stub : IManager
{ {
public void SaveDatabaseData(Database database) public void SaveDatabaseData(List<User> UserList, Dictionary<User, List<Theme>> AddedThemeFromUser)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
@ -59,10 +76,23 @@ namespace Notus_Persistance
colorListHexaCode = new("000000,FFFFFF,000000".Split(',')); colorListHexaCode = new("000000,FFFFFF,000000".Split(','));
database.AddTheme(new Theme("Theme_3", colorListHexaCode)); database.AddTheme(new Theme("Theme_3", colorListHexaCode));
foreach (User user in database.GetUserList())
{
user.SetPassword(GetSHA256Hash(user.GetPassword()));
}
return database; return database;
} }
public List<Theme> LoadDefaultTheme()
{
throw new NotImplementedException();
}
public List<Logo> LoadDefaultLogo()
{
throw new NotImplementedException();
}
} }
} }

@ -9,26 +9,18 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.IO; using System.IO;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization;
namespace Notus_Persistance namespace Notus_Persistance
{ {
public class ToJSON : IManager public class ToJSON : IManager
{ {
private const string DatabaseDataFilePath = "data.json"; private const string DatabaseDataFilePath = "data.json";
private const string UserDataFilePath = "userdata.json"; private const string DefaultThemePath = "";
private const string NoteDataFilePath = "notedata.json"; private const string DefaultLogoPath = "";
private const string ThemeDataFilePath = "themedata.json"; private static readonly DataContractJsonSerializer DatabasejsonSerializer = new(typeof(Database));
private const string LogoDataFilePath = "logodata.json";
private const string TagsDataFilePath = "tagsdata.json"; public void SaveDatabaseData(List<User> UserList, Dictionary<User, List<Theme>> AddedThemeFromUser)
private const string NoteImageDataFilePath = "noteImagedata.json";
private static DataContractJsonSerializer DatabasejsonSerializer = new DataContractJsonSerializer(typeof(Database));
private static DataContractJsonSerializer UserjsonSerializer = new DataContractJsonSerializer(typeof(User));
private static DataContractJsonSerializer NotejsonSerializer = new DataContractJsonSerializer(typeof(Note));
private static DataContractJsonSerializer ThemejsonSerializer = new DataContractJsonSerializer(typeof(Theme));
private static DataContractJsonSerializer LogojsonSerializer = new DataContractJsonSerializer(typeof(Logo));
private static DataContractJsonSerializer TagsjsonSerializer = new DataContractJsonSerializer(typeof(Tags));
private static DataContractJsonSerializer NoteImagejsonSerializer = new DataContractJsonSerializer(typeof(NoteImage));
public void SaveDatabaseData(Database database)
{ {
using (FileStream fileStream = File.Create(DatabaseDataFilePath)) using (FileStream fileStream = File.Create(DatabaseDataFilePath))
{ {
@ -38,7 +30,8 @@ namespace Notus_Persistance
false, false,
true))//<- this boolean says that we sant indentation true))//<- this boolean says that we sant indentation
{ {
DatabasejsonSerializer.WriteObject(writer, database); DatabasejsonSerializer.WriteObject(writer, UserList);
DatabasejsonSerializer.WriteObject(writer, AddedThemeFromUser);
} }
} }
} }
@ -65,5 +58,50 @@ namespace Notus_Persistance
throw new FileException("No data file found."); throw new FileException("No data file found.");
} }
} }
public List<Theme> LoadDefaultTheme()
{
if (File.Exists(DefaultThemePath))
{
using (FileStream fileStream = File.OpenRead(DefaultThemePath))
{
List<Theme>? DefaultThemeList = (List<Theme>?)DatabasejsonSerializer.ReadObject(fileStream);
if (DefaultThemeList == null)
{
throw new FileException("Failed to Default Theme. The loaded object is null.");
}
else
{
return DefaultThemeList;
}
}
}
else
{
throw new FileException("No data file found.");
}
}
public List<Logo> LoadDefaultLogo()
{
if (File.Exists(DefaultLogoPath))
{
using (FileStream fileStream = File.OpenRead(DefaultLogoPath))
{
List<Logo>? DefaultLogoList = (List<Logo>?)DatabasejsonSerializer.ReadObject(fileStream);
if (DefaultLogoList == null)
{
throw new FileException("Failed to Default Logo. The loaded object is null.");
}
else
{
return DefaultLogoList;
}
}
}
else
{
throw new FileException("No data file found.");
}
}
} }
} }

@ -7,22 +7,76 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml.Serialization;
namespace Notus_Persistance namespace Notus_Persistance
{ {
public class ToXML : IManager public class ToXML : IManager
{ {
private const string DataFilePath = "data.xml"; private const string DataFilePath = "data.xml";
private const string XmlDataFilePath = "userdata.xml"; private const string DefaultThemePath = "";
private const string DefaultLogoPath = "";
private static readonly DataContractSerializer DatabaseXmlSerializer = new(typeof(Database));
public void SaveDatabaseData(Database database) public void SaveDatabaseData(List<User> UserList, Dictionary<User, List<Theme>> AddedThemeFromUser)
{ {
throw new NotImplementedException(); XmlWriterSettings settings = new() { Indent = true };
using TextWriter tw = File.CreateText(DataFilePath);
using XmlWriter writer = XmlWriter.Create(tw, settings);
DatabaseXmlSerializer.WriteObject(writer, UserList);
DatabaseXmlSerializer.WriteObject(writer, AddedThemeFromUser);
} }
public Database LoadDatabaseData() public Database LoadDatabaseData()
{ {
throw new NotImplementedException(); if (File.Exists(DataFilePath))
{
using (FileStream fileStream = File.OpenRead(DataFilePath))
{
return DatabaseXmlSerializer.ReadObject(fileStream) is not Database database
? throw new FileException("Failed to load the database. The loaded object is null.")
: database;
} }
} }
else
{
throw new FileException("No data file found.");
}
}
public List<Theme> LoadDefaultTheme()
{
if (File.Exists(DefaultThemePath))
{
using (FileStream fileStream = File.OpenRead(DefaultThemePath))
{
return DatabaseXmlSerializer.ReadObject(fileStream) is not List<Theme> DefaultThemeList
? throw new FileException("Failed to load Default Theme. The loaded object is null.")
: DefaultThemeList;
}
}
else
{
throw new FileException("No data file found.");
}
}
public List<Logo> LoadDefaultLogo()
{
if (File.Exists(DefaultLogoPath))
{
using (FileStream fileStream = File.OpenRead(DefaultLogoPath))
{
return DatabaseXmlSerializer.ReadObject(fileStream) is not List<Logo> DefaultLogoList
? throw new FileException("Failed to load Default Logo. The loaded object is null.")
: DefaultLogoList;
}
}
else
{
throw new FileException("No data file found.");
}
}
}
} }

Loading…
Cancel
Save