/** * This file is part of the KDE project * Copyright (C) 2013 Valentin Rusu * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "knewwalletdialog.h" #include #include #include #include #include #include #include #include #include #include #include #include Q_DECLARE_METATYPE(GpgME::Key) namespace KWallet { KNewWalletDialog::KNewWalletDialog(const QString &appName, const QString &walletName, QWidget* parent): QWizard(parent), _intro(0), _introId(0), _gpg(0), _gpgId(0) { setOption(HaveFinishButtonOnEarlyPages); _intro = new KNewWalletDialogIntro(appName, walletName, this); _introId = addPage(_intro); _gpg = new KNewWalletDialogGpg(appName, walletName, this); _gpgId = addPage(_gpg); } bool KNewWalletDialog::isBlowfish() const { return _intro->isBlowfish(); } GpgME::Key KNewWalletDialog::gpgKey() const { QVariant varKey = field("key"); return varKey.value< GpgME::Key >(); } KNewWalletDialogIntro::KNewWalletDialogIntro(const QString& appName, const QString& walletName, QWidget* parent): QWizardPage(parent) { _ui.setupUi(this); if (appName.isEmpty()){ _ui.labelIntro->setText(i18n("KDE has requested to create a new wallet named '%1'. This is used to store sensitive data in a secure fashion. Please choose the new wallet's type below or click cancel to deny the application's request.", Qt::escape(walletName))); } else { _ui.labelIntro->setText(i18n("The application '%1' has requested to create a new wallet named '%2'. This is used to store sensitive data in a secure fashion. Please choose the new wallet's type below or click cancel to deny the application's request.", Qt::escape(appName), Qt::escape(walletName))); } } void KNewWalletDialogIntro::onBlowfishToggled(bool blowfish) { setFinalPage(blowfish); } bool KNewWalletDialogIntro::isBlowfish() const { return _ui.radioBlowfish->isChecked(); } int KNewWalletDialogIntro::nextId() const { if (isBlowfish()){ return -1; } else { return qobject_cast< const KNewWalletDialog* >(wizard())->gpgId(); } } KNewWalletDialogGpg::KNewWalletDialogGpg(const QString& appName, const QString& walletName, QWidget* parent): QWizardPage(parent), _alreadyInitialized(false), _complete(false) { _ui.setupUi(this); } struct AddKeyToList { QTableWidget *_list; int _row; AddKeyToList(QTableWidget *list) : _list(list), _row(0) {} void operator()( const GpgME::Key &k) { GpgME::UserID uid = k.userID(0); QString name(uid.name()); if (uid.comment()){ name = QString("%1 (%2)").arg(name).arg(uid.comment()); } _list->setItem(_row, 0, new QTableWidgetItem(name)); _list->setItem(_row, 1, new QTableWidgetItem(uid.email())); _list->setItem(_row, 2, new QTableWidgetItem(k.shortKeyID())); QVariant varKey; varKey.setValue(k); _list->item(_row, 0)->setData(Qt::UserRole, varKey); ++_row; } }; void KNewWalletDialogGpg::initializePage() { if (_alreadyInitialized) return; registerField("key", this); GpgME::initializeLibrary(); GpgME::Error err = GpgME::checkEngine(GpgME::OpenPGP); if (err){ kDebug() << "OpenPGP not supported on your system!"; KMessageBox::error(this, i18n("The QGpgME library failed to initialize for the OpenPGP protocol. Please check your system's configuration then try again.")); emit completeChanged(); return; } boost::shared_ptr< GpgME::Context > _ctx( GpgME::Context::createForProtocol(GpgME::OpenPGP) ); if (0 == _ctx) { KMessageBox::error(this, i18n("The QGpgME library failed to initialize for the OpenPGP protocol. Please check your system's configuration then try again.")); emit completeChanged(); return; } _ctx->setKeyListMode(GpgME::Local); std::vector< GpgME::Key > keys; int row =0; err = _ctx->startKeyListing(); while (!err) { GpgME::Key k = _ctx->nextKey(err); if (err) break; if (!k.isInvalid() && k.canEncrypt() && (k.ownerTrust() == GpgME::Key::Ultimate)) { keys.push_back(k); } } _ctx->endKeyListing(); if (keys.size() == 0) { KMessageBox::error(this, i18n("Seems that your system has no keys suitable for encryption. Please set-up at least an encryption key, then try again.")); emit completeChanged(); return; } _ui.listCertificates->setRowCount(keys.size()); std::for_each(keys.begin(), keys.end(), AddKeyToList(_ui.listCertificates)); _ui.listCertificates->resizeColumnsToContents(); _ui.listCertificates->setCurrentCell(0, 0); _alreadyInitialized = true; } void KNewWalletDialogGpg::onItemSelectionChanged() { _complete = _ui.listCertificates->currentRow() >= 0; QVariant varKey = _ui.listCertificates->item(_ui.listCertificates->currentRow(), 0)->data(Qt::UserRole); setField("key", varKey); emit completeChanged(); } bool KNewWalletDialogGpg::isComplete() const { return _complete; } bool KNewWalletDialogGpg::validateCurrentPage() { return false; } } // namespace #include "moc_knewwalletdialog.cpp"