/* * wizard.cpp * * Copyright 2008 gpg4usb-team * * This file is part of gpg4usb. * * Gpg4usb is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Gpg4usb is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gpg4usb. If not, see */ #include #include "wizard.h" #ifdef Q_OS_WIN #include "windows.h" #endif Wizard::Wizard(GpgME::GpgContext *ctx, KeyMgmt *keyMgmt, QWidget *parent) : QWizard(parent) { mCtx=ctx; mKeyMgmt=keyMgmt; setPage(Page_Intro,new IntroPage(this)); setPage(Page_Choose, new ChoosePage(this)); setPage(Page_ImportFromGpg4usb,new ImportFromGpg4usbPage(mCtx, mKeyMgmt, this)); setPage(Page_ImportFromGnupg,new ImportFromGnupgPage(mCtx, mKeyMgmt, this)); setPage(Page_GenKey,new KeyGenPage(mCtx, this)); setPage(Page_Conclusion,new ConclusionPage(this)); #ifndef Q_WS_MAC setWizardStyle(ModernStyle); #endif setWindowTitle(tr("First Start Wizard")); // http://www.flickr.com/photos/laureenp/6141822934/ setPixmap(QWizard::WatermarkPixmap, QPixmap(":/keys2.jpg")); setPixmap(QWizard::LogoPixmap, QPixmap(":/logo_small.png")); setPixmap(QWizard::BannerPixmap, QPixmap(":/banner.png")); QSettings settings; setStartId(settings.value("wizard/nextPage", -1).toInt()); settings.remove("wizard/nextPage"); connect(this, SIGNAL(accepted()), this, SLOT(slotWizardAccepted())); connect(this, SIGNAL(signalOpenHelp(QString)), parentWidget(), SLOT(signalOpenHelp(QString))); } void Wizard::slotWizardAccepted() { QSettings settings; // Don't show is mapped to show -> negation settings.setValue("wizard/showWizard", !field("showWizard").toBool()); if(field("openHelp").toBool()) { emit signalOpenHelp("docu.html#content"); } } bool Wizard::importPubAndSecKeysFromDir(const QString dir, KeyMgmt *keyMgmt) { QFile secRingFile(dir+"/secring.gpg"); QFile pubRingFile(dir+"/pubring.gpg"); // Return, if no keyrings are found in subdir of chosen dir if (!(pubRingFile.exists() or secRingFile.exists())) { QMessageBox::critical(0, tr("Import Error"), tr("Couldn't locate any keyring file in %1").arg(dir)); return false; } QByteArray inBuffer; if (secRingFile.exists()) { // write content of secringfile to inBuffer if (!secRingFile.open(QIODevice::ReadOnly)) { QMessageBox::critical(0, tr("Import error"), tr("Couldn't open private keyringfile: %1").arg(secRingFile.fileName())); return false; } inBuffer = secRingFile.readAll(); secRingFile.close(); } if (pubRingFile.exists()) { // try to import public keys if (!pubRingFile.open(QIODevice::ReadOnly)) { QMessageBox::critical(0, tr("Import error"), tr("Couldn't open public keyringfile: %1").arg(pubRingFile.fileName())); return false; } inBuffer.append(pubRingFile.readAll()); pubRingFile.close(); } keyMgmt->slotImportKeys(inBuffer); inBuffer.clear(); return true; } IntroPage::IntroPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Getting started...")); setSubTitle(tr("... with gpg4usb")); QLabel *topLabel = new QLabel(tr("To use gpg4usb for decrypting and signing messages, you need a " "private key. The next page will help you with " "key generation or import.

" "For more information have a look at the concepts " "(by clicking the link, the page will open in the main window).
")); topLabel->setWordWrap(true); connect(topLabel, SIGNAL(linkActivated(const QString&)), parentWidget()->parentWidget(), SLOT(openHelp(const QString&))); // QComboBox for language selection QLabel *langLabel = new QLabel(tr("Choose a Language")); langLabel->setWordWrap(true); languages = SettingsDialog::listLanguages(); QComboBox *langSelectBox = new QComboBox(); foreach(QString l, languages) { langSelectBox->addItem(l); } // selected entry from config QSettings settings; QString langKey = settings.value("int/lang").toString(); QString langValue = languages.value(langKey); if (langKey != "") { langSelectBox->setCurrentIndex(langSelectBox->findText(langValue)); } connect(langSelectBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotLangChange(QString))); // set layout and add widgets QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(topLabel); layout->addWidget(langLabel); layout->addWidget(langSelectBox); setLayout(layout); } void IntroPage::slotLangChange(QString lang) { QSettings settings; settings.setValue("int/lang", languages.key(lang)); settings.setValue("wizard/nextPage", this->wizard()->currentId()); qApp->exit(RESTART_CODE); } int IntroPage::nextId() const { return Wizard::Page_Choose; } ChoosePage::ChoosePage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Choose your action...")); setSubTitle(tr("...by clicking on the apropriate link.")); QLabel *keygenLabel = new QLabel(tr("If you have never used gpg4usb before and also don't own a gpg key yet you " "may possibly want to ")+"" +tr("create a new keypair")+"
"); keygenLabel->setWordWrap(true); connect(keygenLabel, SIGNAL(linkActivated(const QString&)), this, SLOT(slotJumpPage(const QString&))); QLabel *importGpg4usbLabel = new QLabel(tr("If you upgrade from an older version of gpg4usb you may want to ") +"" +tr("import settings and/or keys from gpg4usb")+""); importGpg4usbLabel->setWordWrap(true); connect(importGpg4usbLabel, SIGNAL(linkActivated(const QString&)), this, SLOT(slotJumpPage(const QString&))); QLabel *importGnupgLabel = new QLabel(tr("If you are already using GnuPG you may want to ") +"" +tr("import keys from GnuPG")+"
"); importGnupgLabel->setWordWrap(true); connect(importGnupgLabel, SIGNAL(linkActivated(const QString&)), this, SLOT(slotJumpPage(const QString&))); QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(keygenLabel); layout->addWidget(importGnupgLabel); layout->addWidget(importGpg4usbLabel); setLayout(layout); nextPage=Wizard::Page_Conclusion; } int ChoosePage::nextId() const { return nextPage; } void ChoosePage::slotJumpPage(const QString& page) { QMetaObject qmo = Wizard::staticMetaObject; int index = qmo.indexOfEnumerator("WizardPages"); QMetaEnum m = qmo.enumerator(index); nextPage = m.keyToValue(page.toAscii().data()); wizard()->next(); } ImportFromGpg4usbPage::ImportFromGpg4usbPage(GpgME::GpgContext *ctx, KeyMgmt *keyMgmt, QWidget *parent) : QWizardPage(parent) { mCtx=ctx; mKeyMgmt=keyMgmt; setTitle(tr("Import from...")); setSubTitle(tr("...existing gpg4usb")); QLabel *topLabel = new QLabel(tr("You can import keys and/or settings from existing gpg4usb.

" "Just check what you want to import, click the import button and choose " "the directory of your other gpg4usb in the appearing file dialog."), this); topLabel->setWordWrap(true); gpg4usbKeyCheckBox = new QCheckBox(); gpg4usbKeyCheckBox->setChecked(true); QLabel *keyLabel = new QLabel(tr("Keys")); gpg4usbConfigCheckBox = new QCheckBox(); gpg4usbConfigCheckBox->setChecked(true); QLabel *configLabel = new QLabel(tr("Configuration")); QPushButton *importFromGpg4usbButton = new QPushButton(tr("Import from gpg4usb")); connect(importFromGpg4usbButton, SIGNAL(clicked()), this, SLOT(slotImportFromOlderGpg4usb())); QGridLayout *gpg4usbLayout = new QGridLayout(); gpg4usbLayout->addWidget(topLabel,1,1,1,2); gpg4usbLayout->addWidget(gpg4usbKeyCheckBox,2,1,Qt::AlignRight); gpg4usbLayout->addWidget(keyLabel,2,2); gpg4usbLayout->addWidget(gpg4usbConfigCheckBox,3,1,Qt::AlignRight); gpg4usbLayout->addWidget(configLabel,3,2); gpg4usbLayout->addWidget(importFromGpg4usbButton,4,2); this->setLayout(gpg4usbLayout); } void ImportFromGpg4usbPage::slotImportFromOlderGpg4usb() { QString dir = QFileDialog::getExistingDirectory(this,tr("Other gpg4usb directory")); // Return, if cancel was hit if (dir.isEmpty()) { return; } // try to import keys, if appropriate box is checked, return, if import was unsuccessful if (gpg4usbKeyCheckBox->isChecked()) { if (!Wizard::importPubAndSecKeysFromDir(dir+"/keydb",mKeyMgmt)) { return; } } // try to import config, if appropriate box is checked if (gpg4usbConfigCheckBox->isChecked()) { slotImportConfFromGpg4usb(dir); QSettings settings; settings.setValue("wizard/nextPage", this->nextId()); QMessageBox::information(0,tr("Configuration Imported"),tr("Imported Configuration from old gpg4usb.
" "Will now restart to activate the configuration.")); // TODO: edit->maybesave? qApp->exit(RESTART_CODE); } wizard()->next(); } bool ImportFromGpg4usbPage::slotImportConfFromGpg4usb(QString dir) { QString path = dir+"/conf/gpg4usb.ini"; QSettings oldconf(path, QSettings::IniFormat, this); QSettings actualConf; foreach(QString key, oldconf.allKeys()) { actualConf.setValue(key, oldconf.value(key)); } return true; } int ImportFromGpg4usbPage::nextId() const { return Wizard::Page_Conclusion; } ImportFromGnupgPage::ImportFromGnupgPage(GpgME::GpgContext *ctx, KeyMgmt *keyMgmt, QWidget *parent) : QWizardPage(parent) { mCtx=ctx; mKeyMgmt=keyMgmt; setTitle(tr("Import keys...")); setSubTitle(tr("...from existing GnuPG installation")); QLabel *gnupgLabel = new QLabel(tr("You can import keys from a locally installed GnuPG.

The location is read " "from registry in Windows or assumed to be the .gnupg folder in the your home directory in Linux.
")); gnupgLabel->setWordWrap(true); importFromGnupgButton = new QPushButton(tr("Import keys from GnuPG")); connect(importFromGnupgButton, SIGNAL(clicked()), this, SLOT(slotrImportKeysFromGnupg())); QGridLayout *layout = new QGridLayout(); layout->addWidget(gnupgLabel); layout->addWidget(importFromGnupgButton); this->setLayout(layout); } void ImportFromGnupgPage::slotrImportKeysFromGnupg() { // first get gnupghomedir and check, if it exists QString gnuPGHome = getGnuPGHome(); if (gnuPGHome == NULL) { QMessageBox::critical(0, tr("Import Error"), tr("Couldn't locate GnuPG home directory")); return; } // Try to import the keyring files and return the return value of the method Wizard::importPubAndSecKeysFromDir(gnuPGHome,mKeyMgmt); wizard()->next(); } QString ImportFromGnupgPage::getGnuPGHome() { QString gnuPGHome=""; #ifdef _WIN32 bool existsAndSuccess = false; HKEY hKey; existsAndSuccess = (RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\GNU\\GNUPG", 0, KEY_READ, &hKey) == ERROR_SUCCESS); if (existsAndSuccess) { QSettings gnuPGsettings("HKEY_CURRENT_USER\\Software\\GNU\\GNUPG", QSettings::NativeFormat); if (gnuPGsettings.contains("HomeDir")) { gnuPGHome = gnuPGsettings.value("HomeDir").toString(); } else { return NULL; } } #else gnuPGHome=QDir::homePath()+"/.gnupg"; if (! QFile(gnuPGHome).exists()) { return NULL; } #endif return gnuPGHome; } int ImportFromGnupgPage::nextId() const { return Wizard::Page_Conclusion; } KeyGenPage::KeyGenPage(GpgME::GpgContext *ctx, QWidget *parent) : QWizardPage(parent) { mCtx=ctx; setTitle(tr("Create a keypair...")); setSubTitle(tr("...for decrypting and signing messages")); QLabel *topLabel = new QLabel(tr("You should create a new keypair." "The pair consists of a public and a private key.
" "Other users can use the public key to encrypt messages for you " "and verify messages signed by you." "You can use the private key to decrypt and sign messages.
" "For more information have a look at the offline tutorial (which then is shown in the main window):")); topLabel->setWordWrap(true); QLabel *linkLabel = new QLabel(""+tr("Offline tutorial")+""); //linkLabel->setOpenExternalLinks(true); connect(linkLabel, SIGNAL(linkActivated(const QString&)), parentWidget()->parentWidget(), SLOT(openHelp(const QString&))); QWidget *createKeyButtonBox = new QWidget(this); QHBoxLayout *createKeyButtonBoxLayout = new QHBoxLayout(createKeyButtonBox); QPushButton *createKeyButton = new QPushButton(tr("Create New Key")); createKeyButtonBoxLayout->addWidget(createKeyButton); createKeyButtonBoxLayout->addStretch(1); QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(topLabel); layout->addWidget(linkLabel); layout->addWidget(createKeyButtonBox); connect(createKeyButton, SIGNAL(clicked()), this, SLOT(slotGenerateKeyDialog())); setLayout(layout); } int KeyGenPage::nextId() const { return Wizard::Page_Conclusion; } void KeyGenPage::slotGenerateKeyDialog() { KeyGenDialog *keyGenDialog = new KeyGenDialog(mCtx, this); keyGenDialog->exec(); wizard()->next(); } ConclusionPage::ConclusionPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Ready.")); setSubTitle(tr("Have fun with gpg4usb!")); QLabel *bottomLabel = new QLabel(tr("You are ready to use gpg4usb now.

" "The offline help will get you started with gpg4usb. " "It will open in the main window.
")); bottomLabel->setWordWrap(true); openHelpCheckBox = new QCheckBox(tr("Open offline help.")); openHelpCheckBox->setChecked(Qt::Checked); dontShowWizardCheckBox = new QCheckBox(tr("Dont show the wizard again.")); dontShowWizardCheckBox->setChecked(Qt::Checked); registerField("showWizard", dontShowWizardCheckBox); registerField("openHelp", openHelpCheckBox); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(bottomLabel); layout->addWidget(openHelpCheckBox); layout->addWidget(dontShowWizardCheckBox); setLayout(layout); setVisible(true); } int ConclusionPage::nextId() const { return -1; }