/*
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);
}