/*
    Fichier cryptepass.c
    Auteur Bernard Chardonneau

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

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

    Droits d'utilisation également sur la page web :
    http://libremail.tuxfamily.org/voir.php?page=droits


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


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


/* programme principal */

int main (int nbarg, char *varg[])
{
    char ficonf [120]; // 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 [120];  // une ligne du fichier de configuration
    long posfic;       // position dans le fichier de configuration
    int  i;            // compteur


    // récupération du nom de l'exécutable
    memcom (*varg);

    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)
            // "Fichier %s protégé en lecture ou en écriture"
            aff_err_arg ("ACCES_FICH_RW", ficonf);
        else
            // "Fichier %s non trouvé"
            aff_err_arg ("FICH_ABSENT", ficonf);
    }
    else
        // "Syntaxe : %s fichier_configuration"
        psyntaxe ("SYNT_GENE_FICONF");

    return (0);
}