Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2332 connectés 

  FORUM HardWare.fr
  Programmation
  Ada

  Création et maintenance d'un fichier de configuration.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Création et maintenance d'un fichier de configuration.

n°2031733
Profil sup​primé
Posté le 23-10-2010 à 19:18:30  answer
 

Bonjour.
J'ai écrit quelque lignes pour créer et maintenir un fichier de configuration dont les informations sont lus dans l'environnement à défaut de spécification particulière protégé par mot de passe contenue dans le fichier même.
Pourriez-vous, selon vos connaissances, apporter quelque critique sur ce programme, son principe, l'algorithme... Ce programme n'ayant aucun autre objet.
S'il vous plaie.
 
Voici les codes.
 
Le paquetage User fournit le type et une variable initialisé du type T_User.
 

Code :
  1. with System.Os_Lib;
  2. use System;
  3.  
  4. package Np.user is
  5.   type Env_Type is (Password, Home, Logname, Mail , Group);
  6.   type Variable is
  7.      record
  8.         Name : env_Type;
  9.         Value : Os_Lib.String_Access;
  10.      end record;
  11.   type Personality_type is array (env_Type'Range) of Variable;
  12.   type User_Type is
  13.      record
  14.         Personality : Personality_Type;
  15.      end record;
  16.   Current_User : User_Type :=
  17.     (
  18.      personality =>
  19.        (
  20.         HOME =>
  21.           (
  22.            Home,
  23.            (Os_Lib.Getenv("HOME" ))
  24.           ),
  25.         LOGNAME =>
  26.           (
  27.            Logname,
  28.            (Os_Lib.Getenv("LOGNAME" ))
  29.           ),
  30.         MAIL =>
  31.           (
  32.            Mail,
  33.            (Os_Lib.Getenv("MAIL" ))
  34.           ),
  35.         PASSWORD =>
  36.           (
  37.            Password,
  38.            (Os_Lib.Getenv("PASSWORD" ))
  39.           ),
  40.         GROUP =>
  41.           (
  42.            Group,
  43.            (Os_Lib.Getenv("GROUP" ))
  44.           )
  45.        )
  46.     );
  47. end Np.user;


 
 
Le programme principal, crée et modifie le fichier ".conf" dans le répertoire personnel de l'utilisateur.
 

Code :
  1. with System.Os_Lib;
  2. use System.Os_Lib;
  3. with Text_Io;
  4. use Text_Io;
  5. with Ada.Strings.Fixed;
  6. use Ada.Strings.Fixed;
  7. with Np, Np.User;
  8. use Np, Np.User;
  9. procedure Main  is
  10.  
  11.   function Get_Password return String_Access;
  12.   -- Saisir le mot de passe.
  13.  
  14.   function Get_Password return String_Access is
  15.      Passwd : String_Access := new String ' ("" );
  16.      Buffer : String_access := new String ' ("" );
  17.      Char : Character;
  18.   begin
  19.      loop
  20.         Get_Immediate(Char);
  21.         case Char is
  22.            when Character'Val(127) =>
  23.               if Passwd'Length  > 1 then
  24.                  Free(Buffer);
  25.                  Buffer := new String ' (Passwd(1..Passwd'Length-1));
  26.               else
  27.                  Free(Buffer);
  28.                  Buffer := new String ' ("" );
  29.               end if;
  30.            when Character'Val(10) | Character'Val(13) =>
  31.               exit;
  32.            when others =>
  33.               Free(Buffer);
  34.               Buffer := new String ' (Passwd.all & Char);
  35.         end case;
  36.         Free(Passwd);
  37.         Passwd := new String ' (Buffer.all);
  38.      end loop;
  39.      return new String ' (Digest(Passwd.all));
  40.   end Get_Password;
  41.  
  42.  
  43.   subtype T_Password is String(1..32);
  44.   File : File_Type;
  45.   Env : Env_Type;
  46.   Expr : String(1..256);
  47.   Last : Natural;
  48.   New_Value : array (Env_Type'Range) of boolean := (others => False);
  49.   Rewrite : Boolean := False;
  50. begin
  51.  
  52.   if Argument_Count /= 0 then
  53.   -- lire les arguments
  54.  
  55.      for Argv in 1..Argument_Count-1 loop
  56.         if Argument(Argv) = "-h" and then
  57.           Argument(Argv+1)'Length /= 0 then
  58.            Current_User.Personality(Home).Value :=
  59.              new String ' (Argument(Argv+1));
  60.            New_Value(Home) := True;
  61.            exit;
  62.         end if;
  63.      end loop;
  64.      for Argv in 1..Argument_Count-1 loop
  65.         if Argument(Argv) = "-l" and then
  66.           Argument(Argv+1)'Length /= 0 then
  67.            Current_User.Personality(logname).Value :=
  68.              new String ' (Argument(Argv+1));
  69.            New_Value(Logname) := True;
  70.            exit;
  71.         end if;
  72.      end loop;
  73.      for Argv in 1..Argument_Count-1 loop
  74.         if Argument(Argv) = "-m" and then
  75.           Argument(Argv+1)'Length /= 0 then
  76.            Current_User.Personality(mail).Value :=
  77.              new String ' (Argument(Argv+1));
  78.            New_Value(Mail) := True;
  79.            exit;
  80.         end if;
  81.      end loop;
  82.      for Argv in 1..Argument_Count-1 loop
  83.         if Argument(Argv) = "-g" and then
  84.           Argument(Argv+1)'Length /= 0 then
  85.            Current_User.Personality(group).Value :=
  86.              new String ' (Argument(Argv+1));
  87.            New_Value(Group) := True;
  88.            exit;
  89.         end if;
  90.      end loop;
  91.   end if;
  92.  
  93.   for Env in Env_Type'Range loop
  94.      if New_Value(Env) then
  95.         Rewrite := True;
  96.         -- réécrire le fichier de configuration;
  97.         exit;
  98.      end if;
  99.   end loop;
  100.   if Is_Regular_File(Getenv("HOME" ).all & "/.conf" ) then
  101.      -- Lire le fichier de configuration si il existe.
  102.  
  103.      Open(File, In_File, Getenv("HOME" ).all & "/.conf" );
  104.      while not End_Of_File(File) loop
  105.         Get_Line(File, Expr, Last);
  106.         if Last /= 0 then
  107.            Env := Env_Type'Value(Expr(1..Index(Expr(1..Last), "=" )- 1));
  108.            case Env is
  109.               when Home | Logname | Mail | Group =>
  110.                  if New_Value(Env) then
  111.                     Put_Line("Setting " & Env_Type'Image(Env) & " to new value." );
  112.                  else
  113.                     Current_User.Personality(Env).Value :=
  114.                       new String ' (Expr(Index(Expr(1..Last), "=" )+1..last));
  115.                  end if;
  116.               when Password =>
  117.                  Current_User.Personality(Env).Value :=
  118.                    new String ' (Expr(Index(Expr(1..Last), "=" )+1..last));
  119.                  Put("password:" );
  120.                  if Current_User.Personality(env).Value.all = Get_Password.all then
  121.                     New_Line;
  122.                  else
  123.                     Put_Line("Bad password." );
  124.                     return;
  125.                  end if;
  126.            end case;
  127.         end if;
  128.      end loop;
  129.      Close(File);
  130.   else
  131.      Rewrite := True;
  132.   end if;
  133.  
  134.   if Rewrite then
  135.      Create(File, Out_File, Getenv("HOME" ).all & "/.conf" );
  136.      -- Ecraser le fichier de configuration
  137.  
  138.      for I in User.env_Type'Range loop
  139.         if Current_User.Personality(I).Value'Length = 0 then
  140.            case I is
  141.               when Home | Logname | Mail =>
  142.                  raise Program_Error;
  143.               when Password  =>
  144.                  if Current_User.Personality(I).Value'Length = 0 then
  145.                     Put("password:" );
  146.                     Current_User.Personality(I).Value := Get_Password;
  147.                     New_Line;
  148.                  end if;
  149.                  Put("password:" );
  150.                  if Current_User.Personality(I).Value.all = Get_Password.all then
  151.                     Put_line(File, Env_Type'Image(I) & "=" & Current_User.Personality(I).Value.all);
  152.                  else
  153.                     Put_Line("Bad password." );
  154.                     Delete(File);
  155.                     return;
  156.                  end if;
  157.                  New_Line;
  158.               when Group =>
  159.                  null;
  160.            end case;
  161.         else
  162.            Put_line(File, Env_Type'Image(I) & "=" & Current_User.Personality(I).Value.all);
  163.         end if;
  164.      end loop;
  165.      Close(File);
  166.   end if;
  167.   Put_Line("Hello " & Current_User.Personality(Logname).Value.all & " !" );
  168.   -- nous disons ""Bonjour"" à l'utilisateur.
  169. end Main;


 
Peut-on faire mieux ou pire ? Merci.

mood
Publicité
Posté le 23-10-2010 à 19:18:30  profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Ada

  Création et maintenance d'un fichier de configuration.

 

Sujets relatifs
[Résolu] Impossible télécharger un fichier *.icoexporter une table en fichier texte csv[résolu]
Aide pour passage fichier dans hash MD5SAX pour Java - écriture d'un fichier HTML
Passer un argument à un batch sans passer par un fichierCréer un fichier XML à partir d'un formulaire
Copie de feuilles sur un fichier globalRécupérer taille réelle d'un fichier gzcompressé sans le décompresser
Comment créer des fichier de dependence avec microsoft compilerSelectionner un fichier tous les N fichiers
Plus de sujets relatifs à : Création et maintenance d'un fichier de configuration.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR