From 4ac208010963fc91925ac238c76c2542691c0250 Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 13 Oct 2014 17:35:44 -0300 Subject: [PATCH] Implementação da classe checkmodules. Quase completa, só realizar o teste na intra e corrigir os bugs --- cacic-daemon/cacicD/cacictimer.cpp | 8 +------- cacic-daemon/cacicD/cacictimer.h | 1 - cacic-teste/testcacic.cpp | 5 +++-- src/cacic_comm.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++-------------- src/cacic_comm.h | 24 ++++++++++++++---------- src/ccacic.cpp | 16 ++++++++++++++++ src/ccacic.h | 3 +++ src/checkmodules.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/checkmodules.h | 3 +++ 9 files changed, 151 insertions(+), 35 deletions(-) diff --git a/cacic-daemon/cacicD/cacictimer.cpp b/cacic-daemon/cacicD/cacictimer.cpp index 7e8fba7..e95e339 100644 --- a/cacic-daemon/cacicD/cacictimer.cpp +++ b/cacic-daemon/cacicD/cacictimer.cpp @@ -177,13 +177,7 @@ void CacicTimer::setApplicationDirPath(const QString &value) } -bool CacicTimer::Md5IsEqual(QVariant document01,QVariant document02){ - QString getconfigMD5 = QString(QCryptographicHash::hash( - (document01.toByteArray()),QCryptographicHash::Md5).toHex()); - QString getconfigMD52 = QString(QCryptographicHash::hash( - (document02.toByteArray()),QCryptographicHash::Md5).toHex()); - return getconfigMD5 == getconfigMD52; -} + void CacicTimer::iniciarInstancias(){ logManager = QLogger::QLoggerManager::getInstance(); diff --git a/cacic-daemon/cacicD/cacictimer.h b/cacic-daemon/cacicD/cacictimer.h index f186f68..6b44bb8 100644 --- a/cacic-daemon/cacicD/cacictimer.h +++ b/cacic-daemon/cacicD/cacictimer.h @@ -28,7 +28,6 @@ public: void iniciarTimer(); bool getTest(); bool getConfig(); - bool Md5IsEqual(QVariant document01,QVariant document02); void setApplicationDirPath(const QString &value); QString getApplicationDirPath(); void setDirProgram(const QString &value); diff --git a/cacic-teste/testcacic.cpp b/cacic-teste/testcacic.cpp index c049257..0bc5bc2 100644 --- a/cacic-teste/testcacic.cpp +++ b/cacic-teste/testcacic.cpp @@ -333,12 +333,13 @@ void CTestCacic::testEnviaColeta() void CTestCacic::testGetModulesValues() { oCheckModules = new CheckModules(QDir::currentPath()); + oCheckModules->start(); QVERIFY(false); } void CTestCacic::cleanupTestCase() { - // OCacic.deleteFile("gpl-2.0.txt"); + OCacic.deleteFile("gpl-2.0.txt"); OCacic.deleteFile("log01.txt"); OCacic.deleteFile("./log02.txt"); OCacic.deleteFile("../log03.txt"); @@ -349,5 +350,5 @@ void CTestCacic::cleanupTestCase() OCacic.deleteFolder("../logs"); OCacic.deleteFile("configRequest.json"); OCacic.deleteFile("teste.json"); -// OCacic.deleteFile("getConfig.json"); + OCacic.deleteFile("getConfig.json"); } diff --git a/src/cacic_comm.cpp b/src/cacic_comm.cpp index 44e0c96..40c04e8 100644 --- a/src/cacic_comm.cpp +++ b/src/cacic_comm.cpp @@ -4,10 +4,10 @@ CacicComm::CacicComm () { } -CacicComm::CacicComm (QString urlGerente, QString operatingSystem, QString computerSystem, QString csCipher, - QString csDebug, QString csCompress, QString httpUserAgent, QString moduleFolderName, - QString moduleProgramName, QString networkConfiguration,QString phpAuthPw, QString phpAuthUser, - QString so, QString cacicVersion, QString gercolsVersion) +CacicComm::CacicComm (const QString &urlGerente, const QString &operatingSystem, const QString &computerSystem, const QString &csCipher, + const QString &csDebug, const QString &csCompress, const QString &httpUserAgent, const QString &moduleFolderName, + const QString &moduleProgramName, const QString &networkConfiguration,const QString &phpAuthPw, const QString &phpAuthUser, + const QString &so, const QString &cacicVersion, const QString &gercolsVersion) { this->setUrlGerente(urlGerente); params.addQueryItem("OperatingSystem", operatingSystem); @@ -159,6 +159,11 @@ bool CacicComm::fileDownload(const QString &mode, const QString &path, const QSt QUrl url(urlGerente); url.setScheme(mode); url.setPath(path); + if (!this->ftpUser.isEmpty()) + url.setUserName(ftpUser); + if (!this->ftpPass.isEmpty()) + url.setPassword(ftpPass); + request.setUrl(url); reply = manager.get(request); @@ -196,6 +201,11 @@ bool CacicComm::fileDownload(const QString &mode, const QString &urlServer, cons QUrl url(urlServer); url.setScheme(mode); url.setPath(path); + if (!this->ftpUser.isEmpty()) + url.setUserName(ftpUser); + if (!this->ftpPass.isEmpty()) + url.setPassword(ftpPass); + request.setUrl(url); reply = manager.get(request); @@ -208,6 +218,38 @@ bool CacicComm::fileDownload(const QString &mode, const QString &urlServer, cons return true; } +void CacicComm::fileDownloadFinished(QNetworkReply* reply) +{ + if (reply->size() > 0){ + QTextStream out(fileHandler); + out << reply->readAll(); + fileHandler->close(); + reply->close(); + } else { + qDebug() << "Falha ao baixar arquivo."; + } +} + +QString CacicComm::getFtpPass() const +{ + return ftpPass; +} + +void CacicComm::setFtpPass(const QString &value) +{ + ftpPass = value; +} + +QString CacicComm::getFtpUser() const +{ + return ftpUser; +} + +void CacicComm::setFtpUser(const QString &value) +{ + ftpUser = value; +} + bool CacicComm::ftpDownload( const QString &path, const QString &pathDownload ){ return fileDownload("ftp", path, pathDownload); } @@ -228,7 +270,7 @@ QString CacicComm::getUrlSsl (){ return this->urlSsl; } -void CacicComm::setUrlSsl(QString value){ +void CacicComm::setUrlSsl(const QString &value){ this->urlSsl = value; } @@ -251,7 +293,7 @@ QString CacicComm::getPassword() return this->password; } -void CacicComm::setPassword(QString value) +void CacicComm::setPassword(const QString &value) { this->password = value; } @@ -260,15 +302,9 @@ QString CacicComm::getUsuario() return this->usuario; } -void CacicComm::setUsuario(QString value) +void CacicComm::setUsuario(const QString &value) { this->usuario = value; } -void CacicComm::fileDownloadFinished(QNetworkReply* reply) -{ - QTextStream out(fileHandler); - out << reply->readAll(); - fileHandler->close(); - reply->close(); -} + diff --git a/src/cacic_comm.h b/src/cacic_comm.h index d1e7c60..9b30c6e 100644 --- a/src/cacic_comm.h +++ b/src/cacic_comm.h @@ -20,10 +20,10 @@ class CacicComm : public QObject{ public: CacicComm (); - CacicComm (QString urlGerente, QString operatingSystem, QString computerSystem, QString csCipher, - QString csDebug, QString csCompress, QString httpUserAgent, QString moduleFolderName, - QString moduleProgramName, QString networkConfiguration,QString phpAuthPw, QString phpAuthUser, - QString so, QString cacicVersion, QString gercolsVersion); + CacicComm (const QString &urlGerente, const QString &operatingSystem, const QString &computerSystem, const QString &csCipher, + const QString &csDebug, const QString &csCompress, const QString &httpUserAgent, const QString &moduleFolderName, + const QString &moduleProgramName, const QString &networkConfiguration,const QString &phpAuthPw, const QString &phpAuthUser, + const QString &so, const QString &cacicVersion, const QString &gercolsVersion); QJsonObject comm(QString route, bool *ok, const QJsonObject &json = QJsonObject(), bool isSsl = false); bool commStatus(); QJsonObject login(bool *ok); @@ -32,18 +32,20 @@ public: bool httpDownload(const QString &path, const QString &pathDownload); bool httpDownload(const QString &urlServer, const QString &path,const QString &pathDownload); QString getUrlSsl (); - void setUrlSsl(QString value); + void setUrlSsl(const QString &value); QString getUrlGerente (); void setUrlGerente(QString value); QString getPassword(); - void setPassword(QString value); + void setPassword(const QString &value); QString getUsuario(); - void setUsuario(QString value); - - + void setUsuario(const QString &value); + QString getFtpUser() const; + void setFtpUser(const QString &value); + QString getFtpPass() const; + void setFtpPass(const QString &value); signals: -// void finished(QNetworkReply* reply); + void finished(QNetworkReply* reply); private slots: @@ -60,6 +62,8 @@ private: QString usuario; QString password; QString session; + QString ftpUser; + QString ftpPass; QFile *fileHandler; diff --git a/src/ccacic.cpp b/src/ccacic.cpp index 21e9338..c4fe53c 100644 --- a/src/ccacic.cpp +++ b/src/ccacic.cpp @@ -199,6 +199,22 @@ QString CCacic::deCrypt(std::string str_in, std::string iv) { return QString::fromStdString(str_out); } +bool CCacic::Md5IsEqual(QVariant document01,QVariant document02){ + QString file1 = QString(QCryptographicHash::hash( + (document01.toByteArray()),QCryptographicHash::Md5).toHex()); + QString file2 = QString(QCryptographicHash::hash( + (document02.toByteArray()),QCryptographicHash::Md5).toHex()); + return file1 == file2; +} + +bool CCacic::Md5IsEqual(QVariant document01,QString document02){ + QString file1 = QString(QCryptographicHash::hash( + (document01.toByteArray()),QCryptographicHash::Md5).toHex()); + QString file2 = document02; + return file1 == file2; +} + + QString CCacic::startProcess(QString pathprogram, bool wait, bool *ok, QStringList arguments) { QProcess process; diff --git a/src/ccacic.h b/src/ccacic.h index c4125f1..6df1246 100644 --- a/src/ccacic.h +++ b/src/ccacic.h @@ -17,6 +17,7 @@ #include "../src/crypto++/include/aes.h" #include "../src/crypto++/include/base64.h" #include "../src/crypto++/include/modes.h" +#include class CCacic { @@ -60,6 +61,8 @@ public: QString getChaveCrypt() const; void setChaveCrypt(const QString &value); + bool Md5IsEqual(QVariant document01, QVariant document02); + bool Md5IsEqual(QVariant document01, QString document02); private: QString cacicMainFolder; QString mainModuleName; diff --git a/src/checkmodules.cpp b/src/checkmodules.cpp index 5e7ba5c..a1432df 100644 --- a/src/checkmodules.cpp +++ b/src/checkmodules.cpp @@ -2,23 +2,83 @@ CheckModules::CheckModules(const QString &workingPath) { + oCacic.setCacicMainFolder(workingPath); QJsonObject configFile; configFile = oCacic.getJsonFromFile(workingPath + "/getConfig.json"); if (!configFile.isEmpty()) { + //pega url do gerente. + this->applicationUrl = configFile["agentcomputer"].toObject()["applicationUrl"].toString(); QJsonArray modulos; + //pega o jsonarray dos módulos modulos = configFile["agentcomputer"].toObject()["modulos"].toArray(); foreach (QJsonValue modulo, modulos){ + //grava o nome com o hash de cada modulo modules[modulo.toObject()["nome"].toString()] = modulo.toObject()["hash"].toString(); } } //TODO: Completar constructor. Agora que tenho os nomes dos módulos e os hashs, fazer a verificação. - qDebug() << modules; + + QDir tempPath(oCacic.getCacicMainFolder() + "/temp"); + if (!tempPath.exists()){ + qDebug() << "criando diretório temporário"; + tempPath.mkdir(oCacic.getCacicMainFolder() + "/temp"); + } } bool CheckModules::start(){ + if (!modules.isEmpty()){ + QVariantMap::const_iterator i = modules.constBegin(); + while (i != modules.constEnd()){ + qDebug() << "Módulo: " << i.key() << " | Hash: " << i.value().toString(); + this->verificaModulo(i.key(), i.value().toString()); + i++; + } + } return true; } +bool CheckModules::verificaModulo(const QString &moduloName, const QString &moduloHash) +{ + QFile *modulo; + bool downloadOk = false; + //pega o arquivo do módulo selecionado + modulo = new QFile(oCacic.getCacicMainFolder() + "/" + moduloName); + //verifica se o módulo existe, se o tamaho é maior que 1 byte e se o hash é igual ao informado pelo json + if (!(modulo->exists() && modulo->size()>1 && oCacic.Md5IsEqual(QVariant::fromValue(modulo), moduloHash))){ + QFile *novoModulo; + QJsonObject metodoDownload; + //verifica o tipo de download e tenta baixar o módulo para a pasta temporária. + metodoDownload = oCacic.getJsonFromFile("getConfig.json")["agentcomputer"].toObject()["metodoDownload"].toObject(); + oCacicComm.setFtpUser(metodoDownload["usuario"].toString()); + oCacicComm.setFtpPass(metodoDownload["senha"].toString()); + if(metodoDownload["tipo"].toString() == "ftp"){ + qDebug() << moduloName << "ftp download"; + downloadOk = oCacicComm.ftpDownload(this->applicationUrl, + metodoDownload["path"].toString() + "/" + moduloName, + oCacic.getCacicMainFolder() + "/temp/"); + } else if (metodoDownload["tipo"].toString() == "http"){ + qDebug() << moduloName << "http download"; + downloadOk = oCacicComm.httpDownload(this->applicationUrl, + metodoDownload["path"].toString() + "/" + moduloName, + oCacic.getCacicMainFolder() + "/temp/"); + } else { + qDebug() << moduloName << "metodo de download incorreto"; + return false; + } + //faz uma verificação do novo módulo. + novoModulo = new QFile(oCacic.getCacicMainFolder() + "/temp/" + moduloName); + if (!(novoModulo->exists() && novoModulo->size()>1 && oCacic.Md5IsEqual(QVariant::fromValue(modulo), moduloHash))){ + qDebug() << moduloName << "falha no download.."; + novoModulo->remove(); + return false; + } else { + qDebug() << moduloName << "Sucesso!"; + return true; + } + + } +} + //QStringList CheckModules::verificaModulos(){ // // Compara o novo arquivo de configuração com um antigo e se forem diferentes // // mantem o mais recente; caso iguais simplesmente apaga o novo. diff --git a/src/checkmodules.h b/src/checkmodules.h index b542881..f70e739 100644 --- a/src/checkmodules.h +++ b/src/checkmodules.h @@ -13,7 +13,10 @@ public: bool start(); private: CCacic oCacic; + CacicComm oCacicComm; + QString applicationUrl; QVariantMap modules; //modules["name"] = hash; + bool verificaModulo(const QString &moduloName, const QString &moduloHash); // void lerArquivoConfig(const QJsonObject& jsonConfig); }; -- libgit2 0.21.2