/*
    Fichier copiedepl.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


    Bibliothèque des fonctions communes aux commandes deplacemail
    deplpartaille et deplpartiel .
*/


#include <stdio.h>
#include <string.h>
#include "messages.h"
#include "buflect.h"
#include "pop.h"
#include "smtp.h"
#include "copiedepl.h"



/* récupère une adresse email dans le fichier de configuration dont
   le descripteur fconf est passé en paramètre, extrait l'adresse
   entre les < > s'ils existent et la mémorise dans bufadr */


void mem_adr (char *bufadr, FILE *fconf)
{
    char fin_adr [120]; // partie droite de l'adresse expéditeur reconstituée
    long posit;         // position dans le fichier de configuration
    int  i, j;          // compteurs


    // lire une ligne du fichier de configuration
    fgets (buf_lect, sizeof (buf_lect), fconf);

    // rechercher le @ dans la ligne lue
    i = 0;

    while (buf_lect [i] != '@' && buf_lect [i])
        i++;

    // si trouvé
    if (buf_lect [i] == '@')
    {
        // se positionner au début de l'adresse email
        do
            i--;
        while (i > 0 && buf_lect [i] != '<' && buf_lect [i] != ' '
                                            && buf_lect [i] != '\t');

        if (buf_lect [i] == '<' || buf_lect [i] == ' ' || buf_lect [i] == '\t')
            i++;

        // mémoriser l'adresse email
        j = 0;

        while (buf_lect [i] != '\n' && buf_lect [i] != '>' && buf_lect [i])
            bufadr [j++] = buf_lect [i++];

        bufadr [j] = '\0';
    }
    // sinon pour l'adresse de l'expéditeur
    // si fichier de configuration classique
    else if (bufadr == adr_exped && *buf_lect == '/')
    {
        // on va fabriquer une adresse d'expéditeur à partir
        // des 2 premières lignes du fichier de configuration

        // mémoriser la position courante dans le fichier de configuration
        posit = ftell (fconf);

        // et revenir au début de ce fichier
        rewind (fconf);

        // lire le nom du serveur pop
        fgets (buf_lect, sizeof (buf_lect), fconf);

        // si ce nom commence par pop
        if (*buf_lect == 'p' && buf_lect [1] == 'o' && buf_lect [2] == 'p')
        {
            // sauter le premier mot
            i = 3;

            while (buf_lect [i++] != '.')
                ;  // en sortant on est positionné après le '.'
        }
        else
            i = 0;

        // mémoriser la fin de l'adresse email
        fin_adr [0] = '@';

        j = 1;

        do
            fin_adr [j++] = buf_lect [i++];
        while (buf_lect [i] != '\n' && buf_lect [i]);

        fin_adr [j] = '\0';

        // lire le nom de l'utilisateur
        fgets (buf_lect, sizeof (buf_lect), fconf);

        // sauter la zone user dans la ligne lue
        i = 4;

        while (buf_lect [i] > ' ')
            i++;

        while (buf_lect [i] == ' ')
            i++;

        // fabriquer le début de l'adresse email
        j = 0;

        while (buf_lect [i] != '\n' && buf_lect [i])
            bufadr [j] = buf_lect [i];

        // rajouter la fin de cette adresse
        strcpy (bufadr + j, fin_adr);

        // se repositionner comme avant dans le fichier de configuration
        fseek (fconf, posit, SEEK_SET);
    }
    // sinon erreur non récupérable
    else
        // "Adresse Email erronée dans le fichier de configuration"
        errfatale ("ERR_ADR_MAIL", NULL);
}



/* réexpédie le mail sélectionné à sa nouvelle adresse */

void copiemail (int numail)
{
    char bufw [120];  // buffer d'envoi d'une requête


    // initialisation de l'envoi SMTP

    // expéditeur du message
    sprintf (bufw, "MAIL FROM: <%s>", adr_exped);
    envoie_smtp (bufw);
    lire_smtp ();

    // destinataire principal du message
    sprintf (bufw, "RCPT TO: <%s>", adr_dest);
    envoie_smtp (bufw);
    lire_smtp ();

    // si destinataire refusé, on le signale
    if (buf_lect [0] != '2')
    {
        // Affichage de l'adresse à problème
        // "Destinataire %s refusé\n"
        printf (message ("REFUS_DEST"), adr_dest);
        puts (buf_lect);

        // et on n'envoie aucun mail d'avertissement
        envoie_smtp ("RSET");
        lire_smtp ();
        return;  // mail non envoyé
    }

    // préparation de l'envoi du message
    envoie_smtp ("DATA");
    lire_smtp ();

    // demande de lecture du message et réception de l'acquittement
    sprintf (bufw, "RETR %d", numail);
    env_pop (bufw);
    lire_pop ();

    // terminé pour ce mail si erreur d'envoi coté serveur
    if (memcmp (buf_lect, "-ERR ", 5) == 0)
    {
        // Erreur serveur pour l'accès au mail
        aff_err_argnum ("ERREUR_SERVEUR", numail);
    }

    // réexpédition du mail
    do
    {
        // lire une ligne du mail
        lire_pop ();

        // expédier la ligne lue à l'autre serveur
        envoie_smtp (buf_lect);
    }
    while (buf_lect [0] != '.' || buf_lect [1] != '\0');

    // récupérer l'acquitement du serveur smrp
    lire_smtp ();
}



/* supprime le mail sélectionné du serveur courant */

void detruitmail (int numail)
{
    char bufw [120]; // buffer d'envoi d'une requête de destruction


    // demande de destruction du mail sur le serveur initial
    sprintf (bufw, "DELE %d", numail);
    env_pop (bufw);
    lire_pop ();
}