view ui/mainwindow.h @ 648:e41a2537b84d

Implement root installation We now iterate over all users that do not obviously have their login shell disabled and look for NSS directories in their home directory, dropping our privileges to do so.
author Andre Heinecke <andre.heinecke@intevation.de>
date Wed, 25 Jun 2014 12:44:47 +0200
parents 292c590ba9cb
children 129e611eaf50
line wrap: on
line source
/* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU GPL (v>=2)
 * and comes with ABSOLUTELY NO WARRANTY!
 * See LICENSE.txt for details.
 */
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

/**
 * @file mainwindow.h
 * @brief Main UI controller
 */

#include <QSystemTrayIcon>
#include <QMainWindow>
#include <QSettings>
#include <QMenuBar>
#include <QListWidget>
#include <QTextEdit>
#include <QPushButton>
#include <QLabel>
#include <QCheckBox>

#include "downloader.h"
#include "certificatelist.h"
class QMenu;
class QAction;
class QTimer;

Q_DECLARE_METATYPE(Certificate);

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    /**@brief create a new Main Window object
     *
     * In tray mode this window is not shown and only shows
     * notification messages if there is some actionable state
     * reached. If tray mode is true it also exits after
     * an update check.
     *
     * @param[in] trayMode set the tray mode
     * */
    MainWindow(bool trayMode);

    void setMessage(const QString message) {mCurMessage = message;}
    QString getMessage() {return mCurMessage;}

    enum CurrentState {
        BeforeDownload,
        NewListAvailable,
        NewSoftwareAvailable,
        DownloadingSW,
        TransferError,
        NothingChanged
    };
    CurrentState getState() {return mCurState;}
    void setState(CurrentState state) {mCurState = state;}

private slots:
    void showMessage();
    void iconActivated(QSystemTrayIcon::ActivationReason reason);
    void checkUpdates(bool downloadSW = false);
    void handleNewList(const QString& fileName, const QDateTime& modDate);
    void handleNewSW(const QString& fileName, const QDateTime& modDate);
    void downloaderError(const QString &message, SSLConnection::ErrorCode error);
    /** @brief Trigger the appropiate action depending on the state */
    void messageClicked();
    void showHelp();
    void showAbout();
    void showDetails(QListWidgetItem*);
    void resizeButtons();
    void installerError(const QString& errMsg);
    void installerSuccess();
    void installCerts();

    void saveAutoUpdate(int state);
    void saveAutoStart(int state);

    /** @brief check for running software that needs to close before installing
     *
     * This function calls installCerts if no software is running otherwise
     * it informs the user about the software that still needs to be closed.
     */
    void checkAndInstallCerts();

    /** @brief get the last modified date on the download server for
     * the current version.
     *
     * After the initial installation this function can be used to
     * determine the DateTime that corresponds to the currently installed
     * version on the download server.
     *
     * Calls setLastModifiedSWDate on success. Otherwise downloaderError
     * is triggered. */
    void getLastModForCurrentVersion();

    /** @brief set the last modified software date/time
     *
     * The last modifiedSWDate is the corresponding last modified
     * timestamp from the download server vor the currently installed version.
     */
    void setLastModifiedSWDate(const QDateTime &date);

    /** @brief saves the currently unselected certificates
     *
     * This creates / updates a qsettings section that
     * [unselected] that contains the certificates that
     * were unselected previously.
     *
     * Unselected are certificates that are unchecked
     * in the certListWidget
     *
     * Returns false on error.
     */
    bool saveUnselectedCertificates();

    /** @brief loads previously unselected certificates from settings
     *
     * The certificates are strored in the list mPreviouslyUnselected.
     *
     * On error mPreviouslyUnselected is empty after this call.
     */
    void loadUnselectedCertificates();

protected slots:
    /** @brief cleanup and close the main window
     *
     * Perform a clean exit (saving state etc.) and close
     * the application */
    virtual void closeApp();

    /* @brief Execute the file fileName to install the softwareupdate.
     *
     * Once the installer process is started this function terminates
     * the application. */
    void installNewSW(const QString& fileName, const QDateTime& modDate);

private:
    /** @brief check the integrity of available certificate lists.
     *
     * Note: Do not use this as a local trust check as this only works on
     * FileNames where the underlying files can change. This
     * is just meant to check if the downloaded data was somehow
     * removed or corrupted. It also initializes mListToInstall
     * and mInstalledList.
     */
    void verifyListData();

    /** @brief check the integrity of available software updates.
     *
     * Note: Do not use this as a local trust check as this only works on
     * FileNames where the underlying files can change. This
     * is just meant to check if the downloaded data was somehow
     * removed or corrupted.
     */
    void verifySWData();

    void createTrayIcon();
    void createActions();
    void createMenuBar();
    void createContent();
    void loadCertificateList();

    /** @brief Create a separator item for the certificate list.
     *
     * The item uses a SeparatorItemDelegate for layout and styling at the given
     * index.
     *
     * @param[in] text  The text for the item.
     * @param[in] index The index of the item.
     *
     * @return The new separator item.
     */
    QListWidgetItem* createSeparator(const QString &text, int index);

    /** @brief Create a certificate list item for the list.
     *
     * The item uses a CertificateItemDelegate for layout and styling.
     *
     * @param[in] text   The certificate to display.
     * @param[in] status The certificate status.
     * @param[in] index  The index of the item.
     *
     * @return The new separator item.
     */
    QListWidgetItem* createListItem(const Certificate &certificate,
        Certificate::Status status, int index);

    /* Are we running in tray mode ?*/
    const bool mTrayMode;
    /* The message currently shown at intervals */
    QString mCurMessage;
    QString mInstalledSWVersion;
    QString mInstalledListVersion;

    QSettings mSettings;

    QSystemTrayIcon *mTrayIcon;
    QTimer *mMessageTimer;
    QMenu *mTrayMenu;
    QAction *mCheckUpdates;
    QAction *mQuitAction;
    CurrentState mCurState;
    QMenuBar *mMenuBar;

    /* The current list that should be installed */
    CertificateList mListToInstall;
    /* The last list that we installed */
    CertificateList mInstalledList;
    /* Previously made "unselect" choices in the form of
     * base64lines with I:/R: prefix */
    QStringList mPreviouslyUnselected;

    QListWidget *mCertListWidget;

    QLabel *mSubjectCN;
    QLabel *mSubjectO;
    QLabel *mIssuerCN;
    QLabel *mIssuerO;
    QLabel *mValidFrom;
    QLabel *mValidTo;
    QLabel *mFingerprint;

    QLabel *mCurrentListDate;
    QLabel *mNewListDate;

    QCheckBox *mAutoUpdateOption;
    QCheckBox *mAutoStartOption;

    QPushButton *installButton;
    QPushButton *quitButton;
};

#endif // MAINWINDOW_H

http://wald.intevation.org/projects/trustbridge/