************************ Développement .NET C# ************************* --> TP noté - Programmation ContactManager | S1 ZZ2 F2 ------------------------------------------------------------------------ Code écrit par Anaël Courjaud en Janvier 2023 Dernière modification le 29/01/2023 par Anaël Courjaud ------------------------------------------------------------------------ Enseignant référent : Maxence LAURENT Brève description de ma solution : Ceci est une application console gestionnaire de contacts codée en c# sur Visual Studio 2019. La console propose une invite de commande semblable à celle d'un terminal UNIX. Certaines commandes basiques sont également ressemblantes. Les différentes commandes permettentd de se balader dans l'arborescence, créer des contacts et des dossiers, charger des fichiers, sauvegarder son arbre actuel ou alors un contact particulier. Il est également possible de protéger ses données avec un mot de passe qui permet de chiffrer/déchiffrer les données. Les fichiers résultant d'une sérialisation ou d'une sérialisation + chiffrement sont tous rangés dans le dossier "_ReceptionFichiersDeSauvegarde" à différents endroits de l'arborescence de ce fichier, en fonction de leurs caractéristiques (chiffré ou non, objet de type Dossier ou Contact, sérialisation XML ou binaire). Solutions techniques : Pour la sérialisation xml, j'ai utilisé XmlSerializer. Pour la sérialisation binaire, j'ai utilisé BinaryFormatter (apparemment c'est maintenant obsolète). Et pour tout ce qui concerne le chiffrement/déchiffrement, j'ai utilisé CryptoStream et l'algorithme de chiffrement réversible AES. Voici le résultat de la commande 'man' : //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// MAN --> pas de paramètres : Affiche le détail des commandes existantes avec des explications. TREE --> pas de paramètres : Affiche l'arborescence fille du dossier courant. LS --> pas de paramètres : Affiche le contenu du dossier courant (dossiers fils et contacts fils). LSDATE --> pas de paramètres : Affiche le contenu du dossier courant en précisant les dates de création et de modification. MKDIR --> un nom (string) : Crée un dossier avec le nom donné en paramètre dans le dossier courant. MKCONTACT --> pas de paramètres : Crée un contact dans le dossier courant et ouvre un formulaire pour entrer les infos du contact. EXIT --> pas de paramètres : Quitte proprement le programme et ferme la présente console. CD --> pas de paramètres OU un indice (int) : Change de dossier, indice négatif pour dossiers parents, positif pour dossiers fils, pas d'indice pour racine. *Les 3 commandes globales suivantes permettent d'accéder facilement aux 24 commandes d'après, très précises mais très longues à taper. En revanche, les noms des commandes sont plutôt explicites.* *Vous pouvez aussi taper directement le nom complet des longues commandes. Dans tous les cas, n'oubliez pas d'ajouter la bonne composition de paramètres.* SAUV --> pas de paramètres OU un indice (int) OU un nom (string) OU (un indice (int) ET un nom (string)) SHOW --> pas de paramètres GET --> un nom (string) *Commandes découlant de SAUV* SAUVDOSSIERXML --> pas de paramètres OU un indice (int) OU un nom (string) OU (un indice (int) ET un nom (string)) SAUVENCRYPTDOSSIERXML --> pas de paramètres OU un indice (int) OU un nom (string) OU (un indice (int) ET un nom (string)) SAUVDOSSIERBIN --> pas de paramètres OU un indice (int) OU un nom (string) OU (un indice (int) ET un nom (string)) SAUVENCRYPTDOSSIERBIN --> pas de paramètres OU un indice (int) OU un nom (string) OU (un indice (int) ET un nom (string)) SAUVCONTACTXML --> un indice (int) OU (un indice (int) ET un nom (string)) SAUVENCRYPTCONTACTXML --> un indice (int) OU (un indice (int) ET un nom (string)) SAUVCONTACTBIN --> un indice (int) OU (un indice (int) ET un nom (string)) SAUVENCRYPTCONTACTBIN --> un indice (int) OU (un indice (int) ET un nom (string)) *Commandes découlant de SHOW* SHOWDOSSIERSXML --> pas de paramètres SHOWCRYPTEDDOSSIERSXML --> pas de paramètres SHOWDOSSIERSBIN --> pas de paramètres SHOWCRYPTEDDOSSIERSBIN --> pas de paramètres SHOWCONTACTSXML --> pas de paramètres SHOWCRYPTEDCONTACTSXML --> pas de paramètres SHOWCONTACTSBIN --> pas de paramètres SHOWCRYPTEDCONTACTSBIN --> pas de paramètres *Commandes découlant de GET* GETDOSSIERXML --> un nom (string) GETDECRYPTDOSSIERXML --> un nom (string) GETDOSSIERBIN --> un nom (string) GETDECRYPTDOSSIERBIN --> un nom (string) GETCONTACTXML --> un nom (string) GETDECRYPTCONTACTXML --> un nom (string) GETCONTACTBIN --> un nom (string) GETDECRYPTCONTACTBIN --> un nom (string) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Gros problèmes rencontrés : - La référence circulaire lors de la sérialisation : Chaque élément de l'arborescence possède à minima un dossier parent et possiblement des éléments fils.Les éléments fils causent donc forcément des références circulaires avec leur parent. Il a donc fallu ajouter l'attribut [System.Xml.Serialization.XmlIgnore] devant la déclaration de l'attribut "dossierParent" de la classe ElementArborescence afin que les fonctions de sérialisation ne prennent pas en compte cet attribut. Le problème de dépendance circulaire a ainsi été résolu. - Le problème de désérialisation après chiffrement/déchiffrement d'un fichier binaire : Au début, mes fonctions de chiffrage/déchiffrage agissaient uniquement sur des fichiers contenant des objets déjà sérialisés. Comme je ne faisais pas assez de tests sur les sérialisations binaires, je me suis rendu compte très tardivement que la moindre modification sur un fichier binaire corrompait son contenu en modifiant involontairement mais automatiquement les caractères spéciaux présent dans le fichier binaire (Cet effet n'existait pas sur les fichiers xml). Même un Ctrl+S sans aucune modification sur un fichier binaire dans un éditeur de texte avait pour effet de corrompre le fichier. Ce bug n'étant pas très intuitif, j'ai mis longtemeps à le comprendre et j'en ai déduis que la sérialisation/chiffrement et le déchiffrement/déserialisation d'un objet en binaire devait se faire simultanément sous peine d'avoir un fichier corrompu lors de la déserialisation. J'ai donc dû changer beaucoup de choses dans le code et j'ai finalement appliqué le même modèle pour le mode xml. On ne peut donc désormais plus chiffrer/déchiffrer des objets déjà sérialisés depuis l'application console mais ce n'est vraiment pas grave. La solution actuelle est même carrément plus pratique car elle fait tout en même temps ! Perspectives d'amélioration : Les fonctions de création d'objets, de navigation, de sauvegarde et de chargement de fichiers sont satisfaisantes. Le gros point noir est pour moi le manque de fonctions de suppressions ou de modifications. On ne peut pas modifier ou supprimer un objet (contact ou dossier) existant, ni faire de copié-collés pour modifier l'arborescence. C'est pour moi une des grandes raisons qui rend cette application console quasiment inutilisable au quotidien. Une interface graphique serait également la bienvenue.