home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PCBOARD / PCBM102.ZIP / SOURCES.ZIP / SCANMAIL.C < prev    next >
C/C++ Source or Header  |  1994-01-22  |  12KB  |  347 lines

  1. /*
  2.  ┌────────────────────────────────────────────────────────────────────────┐
  3.  │                                                                        │
  4.  │    ▒▒▒▒▒▒▄ ▒▒▒▒▒▒▄ ▒▒▒▒▒▒▒▄ ▒▒▒▒▒▒▒▒▄ ▒▒▒▒▒▒▄ ▒▒▄      ▒▒▄ ▒▒▒▒▒▒▄     │
  5.  │    ▒▒█▀▒▒█ ▒▒█▀▀▀▀  ▒▒█▀▒▒█ ▒▒█▒▒█▒▒█ ▒▒█▀▒▒█  ▒▒█    ▒▒█▀ ▒▒█▀▀▀▀     │
  6.  │    ▒▒▒▒▒▒█ ▒▒█      ▒▒▒▒▒█▀ ▒▒█▒▒█▒▒█ ▒▒█ ▒▒█   ▒▒█  ▒▒█▀  ▒▒▒▒▄       │
  7.  │    ▒▒█▀▀▀▀ ▒▒█      ▒▒█▀▒▒█ ▒▒█ ▀▀▒▒█ ▒▒█ ▒▒█    ▒▒█▒▒█▀   ▒▒█▀▀       │
  8.  │    ▒▒█     ▒▒▒▒▒▒▄ ▒▒▒▒▒▒▒█ ▒▒█   ▒▒█ ▒▒▒▒▒▒█     ▒▒▒█▀    ▒▒▒▒▒▒▄     │
  9.  │     ▀▀      ▀▀▀▀▀▀  ▀▀▀▀▀▀▀  ▀▀    ▀▀  ▀▀▀▀▀▀      ▀▀▀      ▀▀▀▀▀▀     │
  10.  │                                                                        │
  11.  │      Module   :       SCANMAIL.C - extraction de mail de la base       │
  12.  │                       source pompée de GETMAIL, by René Cougnenc       │
  13.  │                                                                        │
  14.  └────────────────────────────────────────────────────────────────────────┘
  15. */
  16.  
  17.  
  18. #include <fcntl.h>
  19. #include <io.h>
  20. #include <malloc.h>
  21. #include <memory.h>
  22. #include <share.h>
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include "pcbmove.h"
  27. #include "mystring.h"
  28. #include "postmsg.h"
  29. #include "system.h"
  30. #include "scanmail.h"
  31. #include "strings.h"
  32.  
  33. int error;                /* flag si erreur lors d'un move */
  34. long LowNum;
  35.  
  36. int scan_mail (void)
  37. {
  38.   int fin;
  39.   int code_retour;
  40.   SingleBasic BAS_LowNum;
  41.  
  42.    if(  (fin = sopen(Config.MessageBase, O_RDWR | O_BINARY, SH_DENYNO )) == -1)
  43.    {
  44.         puterrorlog(_Strings[L_CanNotAccesMessage], Config.MessageBase);
  45.         return ERROR;
  46.    }
  47.  
  48.    lseek( fin, 4L, SEEK_SET );
  49.    read (fin, BAS_LowNum, sizeof (SingleBasic));
  50.    LowNum = BasNum (BAS_LowNum);    /* get LowerMessage number and */
  51.                                     /* convert from Basic          */
  52.    lseek( fin, 128L, SEEK_SET );   /* skip the message base header */
  53.  
  54.    printf(_Strings[M_ScanningMessage], Config.MessageBase);
  55.    putuselog (_Strings[L_ScanMessage], Config.MessageBase);
  56.  
  57.    code_retour = extract_mail (fin);
  58.    printf("\n");
  59.    close (fin);
  60.    return (code_retour);
  61.  
  62. }
  63. /*------------------------------------------------------------------------*/
  64. int extract_mail (int fin)
  65. {
  66.  
  67.     char buf[128] ;
  68.     long curpos ;
  69.     int len = strlen( Config.ToField );
  70.     char far *msgbuf ;
  71.  
  72.  
  73.     if(( msgbuf = (char *) malloc(MAXMSG)) == NULL )
  74.     {
  75.         puterrorlog (_Strings[L_MallocMessageError], MAXMSG);
  76.         return ERROR ;
  77.     }
  78.  
  79.     while(1)
  80.     {
  81.         curpos = tell( fin );
  82.         if( (read( fin, buf , 128 )) <= 0 )
  83.              break ;  /* end of file... */
  84.  
  85.         read( fin, msgbuf, (buf[9] -1) * 128 ); /* read the message..      */
  86.         if(! strncmp( buf +23, Config.ToField, len ) && buf[120] != 'Γ')
  87.         {                       /* User found and message isn"t killed: */
  88.             error = NON;
  89.             read_body(buf, msgbuf);          /* extract the message...       */
  90.             buf[120]  = 'Γ';                 /* Kill the message.            */
  91.             lseek( fin, curpos, SEEK_SET );  /* Go back to the header....    */
  92.             write( fin, buf , 128 ) ;        /* Write the header back...     */
  93.             mark_kill_in_index(buf);         /* Kill in index message base   */
  94.             read( fin, msgbuf, (buf[9] -1) * 128 ); /* skip the message..    */
  95.             if (*Config.DebugFlag == ON || error == OUI)
  96.                 putdebug (msgbuf, (buf[9] -1) * 128);
  97.         } /* fin if */
  98.     } /* boucle sans fin */
  99.  
  100.     free( msgbuf );
  101. }
  102.  
  103. /*--------------------------------------------------------------------------*/
  104. /*
  105.  *      READ_BODY : On analyse le corps du message
  106.  */
  107.  
  108. void read_body(char *buf, char *msgbuf)
  109. {
  110.        char far *fptr = msgbuf ;
  111.        char far *fptr2;
  112.        unsigned len, i, area_nbr;
  113.        int      code_retour;
  114.  
  115.        len = (buf[9] -1 ) * 128 ;       /* message length */
  116.  
  117.        strncpy(FromField, buf + 58, 25 );
  118.        strclean(FromField);
  119.        strupr (FromField);              /* on met au net le From */
  120.  
  121.        strncpy(DateField, buf + 10, 8 );
  122.        DateField[8] = 0;
  123.  
  124.        strncpy(HeureField, buf + 18, 5 );
  125.        HeureField[5] = 0;
  126.  
  127.        if (!strcmp (FromField, Config.ToField)) return;
  128.                         /* si From PCBMOVE : c'est une plaisanterie */
  129.        if (strcmp (FromField, "SYSOP"))    /* si SYSOP, no level test */
  130.        {                                   /* sinon, level test ...   */
  131.             i = getuserlevel (FromField);
  132.             if (i == ERROR)
  133.             {
  134.                  puterrorlog (_Strings[L_UnknownUser], FromField);
  135.                  error = OUI;
  136.                  return;
  137.             }
  138.             if ( i < atoi (Config.Security)
  139.                && Config.UserNeedForward)       /* si exist un message type */
  140.             {
  141.                fptr2 = msgbuf+len-1;            /* fptr2 = fin du message */
  142.                while (*fptr2 == ' ') *fptr2-- = '\0';
  143.                                                 /* mis au net fin du message */
  144.                forwardmove (msgbuf);             /* on fait le forward */
  145.                PostFile(Config.UserNeedForward); /* on dit que ca été forwardé*/
  146.                putuserlog(_Strings[L_Forward], FromField, Config.ForwardUser);
  147.                return;
  148.             }
  149.        } /* fin if */
  150.  
  151.        for( i = 0 ; i < len ; i++ )     /* Use ASCII format */
  152.        {
  153.            if( *fptr == 'π' )
  154.               *fptr = 0;
  155.            fptr++;
  156.        } /* fin for */
  157.        fptr--;
  158.  
  159.        while( *fptr == ' ' )            /* Cleanup the last block.*/
  160.        {
  161.           *fptr-- = '\0';
  162.           len--;
  163.        } /* fin while */
  164.  
  165.        fptr2 = fptr;
  166.        fptr = msgbuf;
  167.  
  168.        while( fptr < fptr2)     /* tant qu'on est pas à la fin du message */
  169.        {
  170.           strcpy (tampon, fptr);
  171.           i = sscanf (tampon, "%s %d %d", file_to_move, &area_ori, &area_tar);
  172.           if (*Config.DebugFlag == ON)
  173.               printf (_Strings[M_MoveFoundInMessage],
  174.                       FromField, file_to_move, area_ori, area_tar);
  175.           if (i == 3 && area_ori != area_tar)
  176.           {                            /* y'a bien 1 mot suivi de 2 nombres */
  177.             strupr (file_to_move);
  178.             code_retour = move ();                      /* on fait le move */
  179.             switch (code_retour) {
  180.               case NOTINLIST:                 /* pas trouvé là où spécifié */
  181.                 area_nbr = getmaxarea();
  182.                 for (i=1; i <= area_nbr ;i++ )
  183.                 {
  184.                     if (i == area_ori) i++;     /* si numéro d'origine, */
  185.                                                 /* on a déjà cherché    */
  186.                     getfilelist (i);    /* retourne le nom de la filelist */
  187.                                         /* dans tampon et regarde s'il */
  188.                                         /* n'est pas pas hasard là dedans */
  189.                     code_retour = is_file_in_list (tampon);
  190.                     if (code_retour == OUI)
  191.                     {                   /* fichier dans une autre area */
  192.                        if (i == area_tar) break;  /* il est déjà où il faut */
  193.                        AreaFound = i;
  194.                        PostFile(Config.UserOtherAreaError);
  195.                        break;
  196.                     } /* fin if */
  197.                 } /* fin for */
  198.                                         /* pas bon nom de fichier */
  199.                 if (i > area_nbr) PostFile(Config.UserFileNameError);
  200.                 break;
  201.  
  202.               case AREANOTEXIST:
  203.                 PostFile(Config.UserAreaError);
  204.                 break;
  205.  
  206.               case ORIFORBIDEN:
  207.                 PostFile(Config.UserAreaOriForbid);
  208.                 break;
  209.  
  210.               case TARFORBIDEN:
  211.                 PostFile(Config.UserAreaTarForbid);
  212.                 break;
  213.  
  214.               case ERROR:
  215.                 error = OUI;
  216.                 break;
  217.  
  218.             }  /* fin switch */
  219.  
  220.           } /* fin if */
  221.  
  222.           do fptr++; while (*fptr);      /* pour arriver au caractere NUL */
  223.           do fptr++; while (!*fptr);     /* pour arriver à la prochaine lettre*/
  224.  
  225.        }
  226. }
  227. /*--------------------------------------------------------------------------
  228.  * FORWARD : Renvoie le message d'une personne qui n'a pas un security level
  229.  *           suffisant à un tier désigné par le SYSOP (lui même habituellement)
  230.  */
  231.  
  232. void forwardmove (char *msg)
  233. {
  234.   char *message = _Strings[M_ForwardMessage];
  235.  
  236.   memmove (msg+strlen(message), msg, MAXMSG - strlen(message));
  237.   memcpy (msg, message, strlen(message));
  238.  
  239.  
  240.   PostMessage(PRIVATE, LOCAL,            /* "Postage" du message */
  241.               Config.ToField,Config.ForwardUser, FromField,
  242.               msg, Config.MessageBase);
  243. }
  244. /*--------------------------------------------------------------------------
  245.  * GETUSERLEVEL : retourne le niveau de sécurité de l'utilisateur passé en
  246.  *                paramètre
  247.  */
  248. int getuserlevel (char *FromField)
  249. {
  250.   FILE *fin;
  251.   char *userbuf;
  252.   int lenuser = 400;
  253.   int security;
  254.  
  255.    if ((fin = _fsopen(Config.UserBase, "rb", SH_DENYNO )) == NULL)
  256.    {
  257.         puterrorlog(_Strings[L_CanNotAccesMessage], Config.MessageBase);
  258.         return ERROR;
  259.    }
  260.  
  261.    if ((userbuf = (char *) malloc(lenuser)) == NULL )
  262.    {
  263.        puterrorlog (_Strings[L_MallocMessageError], lenuser);
  264.        return  ERROR ;
  265.    }
  266.  
  267.    while (fread(userbuf, 1, lenuser, fin) == lenuser){
  268.          *(userbuf+25) = 0;             /* marque la fin de la chaine */
  269.          if (!strncmp (FromField, strclean(strupr(userbuf)), 25)){
  270.             security = *(userbuf+107);
  271.             fclose (fin);
  272.             free (userbuf);
  273.             return (security);
  274.          } /* fin if */
  275.    } /* fin while */
  276.  
  277.    fclose (fin);
  278.    free (userbuf);
  279.    return ERROR;
  280. }
  281. /*--------------------------------------------------------------------------
  282.  * PUTDEBUG : sauve le message dans debug.msg avant de l'effacer
  283.  *
  284.  */
  285. void putdebug (char *buffer, int taille)
  286. {
  287.     FILE *fout;
  288.     int i;
  289.     char *fptr;
  290.  
  291.     if(( fout = fopen("debug.msg","ab")) == NULL )
  292.     {
  293.         puterrorlog(_Strings[L_CanNotOpenDebug]);
  294.         return;
  295.     }
  296.  
  297.     fprintf (fout, "\n===================================\n");
  298.     fprintf (fout, _Strings[M_DebugField1], FromField);
  299.     fprintf (fout, _Strings[M_DebugField2], DateField, HeureField);
  300.  
  301.     fptr = buffer;
  302.  
  303.     for( i = 0 ; i < taille ; i++ )     /* Use ASCII format */
  304.     {
  305.         if( *fptr == 'π' )
  306.            *fptr = '\n';
  307.         fptr++;
  308.     } /* fin for */
  309.  
  310.     while( *fptr == ' ' )            /* Cleanup the last block.*/
  311.     {
  312.        *fptr-- = '\0';
  313.        taille--;
  314.     }
  315.  
  316.     fwrite(buffer, taille, 1, fout);
  317.  
  318.     fclose (fout);
  319. }
  320.  
  321. /*--------------------------------------------------------------------------
  322.  * MARK_KILL_IN_INDEX : sauve le message dans debug.msg avant de l'effacer
  323.  *
  324.  */
  325. void mark_kill_in_index (char *buf)
  326. {
  327.    long MsgNum;
  328.    FILE *fidx;
  329.    long offset;
  330.  
  331.    MsgNum = BasNum (buf+1);     /* get Message number and convert from Basic */
  332.  
  333.    mkPCBnames( );              /* Retrouve le nom du fichier index */
  334.  
  335.    fidx = _fsopen(index_file,"r+b", SH_DENYNO);
  336.  
  337.    fseek (fidx,(MsgNum-LowNum)*sizeof(indextype),SEEK_SET);
  338.    fread (&offset, 4, 1, fidx);
  339.  
  340.    offset = ~(--offset) ;          /* get negative number */
  341.  
  342.    fseek (fidx,(MsgNum-LowNum)*sizeof(indextype),SEEK_SET);
  343.    fwrite (&offset, 4, 1, fidx);                /* put negative number for */
  344.                                                 /* inactive messages */
  345.    fclose(fidx );
  346. }
  347.