/*
    Fichier cryptepass.c
    Auteur Bernard Chardonneau

    Logiciel libre, droits d'utilisation précisés en français
    dans le fichier : licence.fr

    Traductions des droits d'utilisation dans les fichiers :
    licence.de , licence.en , licence.es , licence.it
    licence.nl , licence.pt , licence.eo , licence.eo-utf


    Utilitaire de cryptage des mots de passe contenus dans les fichiers
    de configuration.
*/

#include <stdio.h>
#include <string.h>
#include "clecrypt.h"


/* programme principal */

int main (int nbarg, char *varg[])
{
    char ficonf [80]; // fichier de configuration du système de mail
    FILE *fconf;      // descripteur du fichier de configuration
    int  car;         // caractère du fichier de configuration
    char ligne [80];  // une ligne du fichier de configuration
    long posfic;      // position dans le fichier de configuration
    int  i;           // compteur


    if (--nbarg == 1)
    {
        // récupérer le nom du fichier de configuration
        strcpy (ficonf, varg [1]);

        if (ficonf [strlen (ficonf) - 4] != '.')
            strcat (ficonf, ".cfg");

        // ouvrir le fichier de configuration
        fconf = fopen (ficonf, "r+");

        if (fconf)
        {
            // on saute les 2 premières lignes du fichier de configuration
            for (i = 1; i <= 2; i++)
            {
                do
                    car = getc (fconf);
                while (car != '\n' && car != EOF);
            }

            // si cryptage du mot de passe
            if (getc (fconf) == '%')
            {
                // se positionner sur le 2ème mot de la ligne
                do
                    car = getc (fconf);
                while (car != ' ' && car != EOF);

                // s'il y a d'autres blancs, on les cryptera
                // en même temps que le mot de passe

                // récupérer la position dans le fichier
                posfic = ftell (fconf);

                // lire le mot de passe
                fgets (ligne, sizeof (ligne), fconf);
                ligne [strlen (ligne) - 1] = '\0';

                // crypter le mot de passe
                // simple ou exclusif sur les 5 derniers bits de chaque
                // caractère. Les bits de poids fort restent inchangés
                // pour éviter qu'un caractère soit transformé en '\n'
                for (i = 0; ligne [i] != 0; i++)
                    ligne [i] = ligne [i] ^ (clecrypt [i & 0x0F] & 0x1F);

                // mettre à jour le fichier
                fseek (fconf, posfic, SEEK_SET);
                fputs (ligne, fconf);
            }

            // on n'a plus besoin du fichier de configuration
            fclose (fconf);
        }
        else if (access (ficonf, 0) == 0)
            fprintf (stderr, "Fichier %s protégé en lecture ou en écriture\n",
                                                                       ficonf);
        else
            fprintf (stderr, "Fichier %s non trouvé\n", ficonf);
    }
    else
        fprintf (stderr, "Syntaxe : %s  fichier_configuration\n", varg [0]);

    return (0);
}
