1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-09-28 19:05:55 +08:00
ULib/examples/PEC_log/PEC_report.h
2015-01-23 17:24:36 +01:00

307 lines
15 KiB
C++

// PEC_report.h
#ifndef PEC_report_H
#define PEC_report_H 1
/*
TIPOLOGIE: 8 + 1
accettazione
------------------------------------------------------------------------------------------------------------------------------------------
Sep 21 17:54:23 PEC_Milter root [1957]: 20060921175422.380241@pec.internal.domain: tipo=accettazione (Accettazione): mittente=user1@pec.internal.domain: destinatari=user2@pec.internal.domain (certificato), user1@pec.internal.domain (certificato): oggetto=MESSAGGIO CON PIU DESTINATARI: message-id=20060921175423.866599@pec.internal.domain: gestore=TMail PEC test
------------------------------------------------------------------------------------------------------------------------------------------
non-accettazione
------------------------------------------------------------------------------------------------------------------------------------------
gen 19 16:41:09 PEC_Milter root [5808]: 20070119164109.997272@pec.internal.domain: queueid=l0JFf8Uh005807: tipo=non-accettazione (NonAccettazione): mittente=user1@pec.internal.domain: destinatari=user2@pec.internal.domain (certificato): oggetto=MESSAGGIO CON PIU DESTINATARI: message-id=20070119164109.718137@pec.internal.domain: gestore=TMail PEC test: errore=altro: errore-esteso=Sono state riscontrate le seguenti anomalie:
- non e' stata utilizzata la cifratura del canale
Mar 5 10:26:31 2007 PEC_Milter root [15033]: 20070305102630.525133@actaliscertymail.it: tipo=non-accettazione (NonAccettazioneVirus): mittente=teststudioinfo1@actaliscertymail.it: destinatari=sandro.chierici@gmail.com (esterno): oggetto=test: message-id=20070305102631.786126@actaliscertymail.it: gestore=Actalis Certymail: errore=virus: virus=Encrypted.Zip
------------------------------------------------------------------------------------------------------------------------------------------
avvenuta-consegna
------------------------------------------------------------------------------------------------------------------------------------------
gen 19 15:09:19 PEC_Milter root [4621]: 20070119150915.938835@pec.internal.domain: queueid=l0JE9EDP004620: tipo=avvenuta-consegna (Consegna): mittente=user1@pec.internal.domain: destinatari=user2@pec.internal.domain (certificato), user1@pec.internal.domain (certificato): oggetto=MESSAGGIO CON PIU DESTINATARI: message-id=20070119150919.318531@pec.internal.domain: gestore=TMail PEC test: tipo_ricevuta=completa: consegna=user2@pec.internal.domain
------------------------------------------------------------------------------------------------------------------------------------------
rilevazione-virus
------------------------------------------------------------------------------------------------------------------------------------------
mag 10 11:01:59 PEC_Milter root [4063]: 20060510110152.637634@pec.internal.domain: tipo=rilevazione-virus (RilevazioneVirus): mittente=user1@pec.internal.domain: destinatari=user1@pec.internal.domain (certificato), user2@anotherpec.external.domain (certificato), user3@pec.internal.domain (certificato), user4@nonpec.external.domain (esterno): oggetto=Test con euro nel subject: message-id=20060510110154.278581@anotherpec.external.domain: gestore=TMail AnotherPEC test: ricezione=user2@anotherpec.external.domain: errore=virus: virus=ClamAV-Test-File
------------------------------------------------------------------------------------------------------------------------------------------
posta-certificata
------------------------------------------------------------------------------------------------------------------------------------------
mag 10 11:04:54 PEC_Milter root [4063]: 20060510110446.583732@pec.internal.domain: tipo=posta-certificata (BustaTrasporto): mittente=user1@pec.internal.domain: destinatari=user2@pec.internal.domain (certificato): oggetto=Test con euro nel subject e caratteri speciali �@�#��^~?`'�"�$%&|\<>-_: message-id=20060510110152.637634@pec.unirel.test: gestore=TMail PEC test: tipo_ricevuta=completa
------------------------------------------------------------------------------------------------------------------------------------------
errore-consegna
------------------------------------------------------------------------------------------------------------------------------------------
gen 19 16:45:47 PEC_Milter root [5989]: 20070119164543.063754@pec.internal.domain: queueid=l0JFjgrx005988: tipo=errore-consegna (MancataConsegna): mittente=user1@pec.internal.domain: destinatari=user2@pec.internal.domain (certificato), USER1@pec.internal.domain (certificato): oggetto=MESSAGGIO CON PIU DESTINATARI: message-id=20070119164547.838736@pec.internal.domain: gestore=TMail PEC test: consegna=USER1@pec.internal.domain: errore=no-dest: errore-esteso=Casella del destinatario inesistente
mag 10 11:01:59 PEC_Milter root [4063]: 20060510110152.637634@pec.internal.domain: tipo=errore-consegna (MancataConsegnaVirus): mittente=user1@pec.internal.domain: destinatari=user1@pec.internal.domain (certificato), user2@anotherpec.external.domain (certificato), user3@pec.internal.domain (certificato), user4@nonpec.external.domain (esterno): oggetto=Test con euro nel subject: message-id=20060510110155.602802@anotherpec.external.domain: gestore=TMail AnotherPEC test: tipo_ricevuta=completa: consegna=user2@anotherpec.external.domain: errore=virus: virus=ClamAV-Test-File
------------------------------------------------------------------------------------------------------------------------------------------
presa-in-carico
------------------------------------------------------------------------------------------------------------------------------------------
mag 10 11:01:54 PEC_Milter root [4063]: 20060510110152.637634@pec.internal.domain: tipo=presa-in-carico (PresaInCarico): mittente=user1@pec.internal.domain: destinatari=user1@pec.internal.domain (certificato), user2@anotherpec.external.domain (certificato), user3@pec.internal.domain (certificato), user4@nonpec.external.domain (esterno): oggetto=Test con euro nel subject: message-id=20060510110154.278581@pec.internal.domain: gestore=TMail PEC test: ricezione=user1@pec.internal.domain, user3@pec.internal.domain
------------------------------------------------------------------------------------------------------------------------------------------
preavviso-errore-consegna
------------------------------------------------------------------------------------------------------------------------------------------
mag 10 15:48:52 PEC_Notify root [26148]: 20060510154758.522061@pec.internal.domain: tipo=preavviso-errore-consegna (MancataConsegna12h): mittente=user1@pec.internal.domain: destinatari=user2@pec.external.domain (certificato): oggetto=Test 19 ���������� ò@ç#°ù§^~?`'ì"£$%&|\<>-_: message-id=20060510154852.289790@pec.internal.domain: gestore=TMail PEC test: consegna=user2@pec.external.domain
mag 10 15:51:05 PEC_Notify root [26409]: 20060510154758.522061@pec.internal.domain: tipo=preavviso-errore-consegna (MancataConsegna24h): mittente=user1@pec.internal.domain: destinatari=user2@pec.external.domain (certificato): oggetto=Test 19 ���������� ò@ç#°ù§^~?`'ì"£$%&|\<>-_: message-id=20060510155105.396263@pec.internal.domain: gestore=TMail PEC test: consegna=user2@pec.external.domain
------------------------------------------------------------------------------------------------------------------------------------------
* ANOMALIA *
------------------------------------------------------------------------------------------------------------------------------------------
set 20 19:48:03 PEC_Milter root [2504]: 20060920194803.492346@pec.internal.domain: tipo= (BustaAnomalia): mittente=user1@nonpec.unirel.test: destinatari=user1@pec.internal.domain (certificato): oggetto=Test: message-id=: gestore=TMail PEC test: eccezioni=domino mittente non di posta certificata
------------------------------------------------------------------------------------------------------------------------------------------
*/
#include <ulib/date.h>
#include <ulib/timeval.h>
#include <ulib/tokenizer.h>
#include <ulib/ssl/pkcs7.h>
#include <ulib/file_config.h>
#include <ulib/container/vector.h>
#include <ulib//utility/services.h>
#include <ulib//utility/xml_escape.h>
#include <ulib/application.h>
// -----------------------------------------------------
// line
// -----------------------------------------------------
#define U_LINEDATA (sizeof("feb 22")-1)
#define U_LINESTART (sizeof("feb 22 15:03:40")-1)
// -----------------------------------------------------
// line fields
// -----------------------------------------------------
#define U_stat 0
#define U_reject 1
#define U_dsn 2
#define U_tipo 0
#define U_mittente 1
#define U_destinatari 2
#define U_consegna 3
#define U_ricezione 4
#define U_errore 5
// -----------------------------------------------------
// line tipology
// -----------------------------------------------------
#define U_accettazione 0
#define U_non_accettazione 1
#define U_avvenuta_consegna 2
#define U_rilevazione_virus 3
#define U_posta_certificata 4
#define U_errore_consegna 5
#define U_presa_in_carico 6
#define U_preavviso_errore_consegna 7
#define U_busta_anomalia 8
// -----------------------------------------------------
// id
// -----------------------------------------------------
#define U_MaxID 16
#define U_DIMENSIONE_MEDIA_RECORD_LOG 300LL
typedef bool (*bPFstr)(const UString&);
class PEC_report : public UApplication {
public:
static vPF parse;
static vPF end_func;
static vPF start_func;
static vPF change_file;
static UApplication* pthis;
static char cnt[2];
static uint64_t bytes;
static time_t nseconds;
static char buffer[4096];
static bool failed;
static bool rejected;
static bool checklink;
static bool non_firmati;
static int rejected_type;
static UString* last_dominio;
static int last_field;
static UString* last_value_field;
static UTimeDate* to;
static UTimeDate* fix;
static UTimeDate* from;
static UTimeDate* date;
static UTimeDate* date1;
static UFile* file;
static UTokenizer* t;
static UString* title;
static UString* content;
static UString* filename;
static UString* scan_form;
static UString* consegna;
static UString* directory;
static UString* filter;
static UString* filter_ext;
static UHashMap<UString>* tfile;
// ---------------------------------
static UString* domain;
static UVector<UString>* vdomain;
// ---------------------------------
// line
// ---------------------------------
static int day, year;
static char time[32];
static char data[128];
static char month[32];
static bool year_present;
static UString* line;
static UString* mittente;
static UString* identifier;
// ---------------------------------
// line tipology
// ---------------------------------
static uint32_t index;
static bool tipology[9];
static UString* vtipos;
static const char* ptipo;
static UVector<UString>* vtipo;
// ---------------------------------
// line fields
// ---------------------------------
static UString* vfields;
static UVector<UString>* vfield;
// ---------------------------------
// id
// ---------------------------------
static bool id_all;
static UString* id;
static uint32_t id_index;
static UVector<UString>* vid;
PEC_report()
{
U_TRACE(5, "PEC_report::PEC_report()")
pthis = this;
}
~PEC_report();
// SERVICES
static const char* getData()
{
U_TRACE(5, "PEC_report::getData()")
(void) sprintf(data, "%s %2d %s %4d", month, day, time, year);
U_RETURN(data);
}
static time_t getTime()
{
U_TRACE(5, "PEC_report::getTime()")
U_INTERNAL_DUMP("line->c_pointer(U_LINEDATA+1) = %.*S", 20, line->c_pointer(U_LINEDATA+1))
time_t _t = UTimeDate::getSecondFromTime(line->c_pointer(U_LINEDATA+1));
U_RETURN(_t);
}
static bool setLineID(); // find and check id content...
static bool setLineMittente(); // find sender content...
static bool setLineTipology(); // find line tipology...
static void setLineIdentifier(); // find identifier content...
// check if line contain <field>...
static uint32_t findField(int field);
static uint32_t sizeField(uint32_t start, char c = ':') __pure;
static UString getValueField(int field);
static UString getValueLastField(const char* field, uint32_t size);
static UString getValuePrevField(const char* pfield, uint32_t psize, const char* field, uint32_t size);
static bool checkValueField(int field, const UString& value)
{
U_TRACE(5, "PEC_report::checkValueField(%d,%.*S)", field, U_STRING_TO_TRACE(value))
if (getValueField(field) == value) U_RETURN(true);
U_RETURN(false);
}
static bool callForAllEntryField(int field, bPFstr function);
static bool callForAllEntryField(const UString& value, bPFstr function);
// check se tra i vari indirizzi c'e' un dominio APPARTENENTE ai domini specificati...
static bool isDomainField(int field)
{
U_TRACE(5, "PEC_report::isDomainField(%d)", field)
if (callForAllEntryField(field, PEC_report::isDomainAddress)) U_RETURN(true);
U_RETURN(false);
}
static bool isDomainAddress(const UString& address); // only one e-mail address...
// dipendenze da content...
static void clearData()
{
U_TRACE(5, "PEC_report::clearData()")
identifier->clear();
mittente->clear();
last_dominio->clear();
last_field = -1;
last_value_field->clear();
line->clear();
}
// MAIN
void run(int argc, char* argv[], char* env[]) // MUST BE INLINE...
{
U_TRACE(5, "PEC_report::run(%d,%p,%p)", argc, argv, env)
UApplication::run(argc, argv, env);
// manage options
if (UApplication::isOptions() == false) U_ERROR("you must specify at least parameters directory and title report");
manageOptions();
if (checklink == false) startReport(); // start report
// process all filenames in parameter directory...
loadFiles();
if (checklink == false) endReport(); // end report
}
protected:
UFileConfig cfg;
UString cfg_str, cfg_suffix, cfg_domain, cfg_id, cfg_from, cfg_to;
void endReport();
void startReport();
void manageOptions();
static bool setLine();
static void loadFiles();
static bool readContent();
static void processFiles();
static bool processFile(UStringRep* key, void* elem);
static inline const char* next(const char* start, char c = '=') U_NO_EXPORT;
static inline const char* next(const char* start, uint32_t size) U_NO_EXPORT;
static inline const char* prev(const char* start) U_NO_EXPORT;
static inline const char* prev(const char* start, uint32_t size) U_NO_EXPORT;
};
#endif