Mercurial > trustbridge
view ui/downloader.h @ 31:37fc66967517
Implement signature verification wiht polarssl
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Thu, 13 Mar 2014 18:12:16 +0000 |
parents | 62cd56cea09b |
children | d8e93fa1fc93 |
line wrap: on
line source
#ifndef DOWNLOADER_H #define DOWNLOADER_H /** * @file downloader.h * @brief High level API to download necessary data. * */ #include <QThread> #include <QString> #include <QByteArray> #include <QDateTime> #include <QUrl> #include <polarssl/x509_crt.h> #include <polarssl/entropy.h> #include <polarssl/ctr_drbg.h> #include <polarssl/ssl.h> class Downloader: public QThread { Q_OBJECT public: /** * @brief Construct a downloader with a specific certificate * * The downloader will check the last-modified date of the * certificate list / sw on the server at the specified url * and download those accordingly. If newestSW or newestList is * are valid datetimes only files modified after the respective date * are downloaded. * * Downloaded files are placed in QStandardPaths::DataLocation * * @param[in] parent the parent object. * @param[in] url the Url to download data from * @param[in] certificate optional certificate to validate https connection * @param[in] newestSW datetime after which software should be downloaded * @param[in] newestList datetime after which the list should be downloaded */ Downloader(QObject* parent, const QString& url, const QByteArray& certificate = QByteArray(), const QDateTime& newestSW = QDateTime(), const QDateTime& newestList = QDateTime()); ~Downloader(); enum ErrorCode { NoError, NoConnection, InvalidCertificate, InvalidPinnedCertificate, ConnectionLost, Timeout, ErrUnknown }; /** * @brief get the directory where the downloader saves data * * If the directory does not exist this function ensures that it * is created. * * @returns The directory in which downloaded files are placed. **/ QString getDataDirectory(); /** * @brief get the current error state * * @returns The current error state. **/ ErrorCode getErrorState(); protected: void run(); private: QUrl mUrl; QByteArray mPinnedCert; x509_crt mX509PinnedCert; entropy_context mEntropy; ctr_drbg_context mCtr_drbg; ssl_context mSSL; QDateTime mLastModSW; QDateTime mLastModList; /* Convienience to avoid having to parse all * PolarSSL errors */ ErrorCode mErrorState; bool mInitialized; int mServerFD; /* @brief: Initialize polarssl structures * * This wraps polarssl initialization functions * that can return an error. * Sets the error state accordingly. * * @returns: 0 on success a polarssl error otherwise. */ int init(); /** @brief: Establish the connection * * @returns 0 on success otherwise a polarssl error or -1 is returned */ int establishSSLConnection(); #ifdef Q_OS_WIN #endif Q_SIGNALS: /** * @brief software update is available */ void newSoftwareAvailable(const QString &fileName, const QDateTime &lastMod); /** * @brief new certificate list available */ void newListAvailable(const QString &fileName, const QDateTime &lastMod); /** * @brief Some progress has been made. * * @param[out] message: A message to show. Can be empty. * @param[out] current: Value of current progress. * @param[out] total: Total value of possible progress */ void progress(const QString &message, int current, int total); /** * @brief An error happened * * @param[out] message: A message to show. Can be empty. * @param[out] errorCode: ErrorCode of this error. */ void error(const QString &message, Downloader::ErrorCode error); }; #endif