File indexing completed on 2023-12-03 09:19:04

0001 /*
0002     SPDX-FileCopyrightText: 2002 Jean-Baptiste Mardelle <bj@altern.org>
0003     SPDX-FileCopyrightText: 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Rolf Eike Beer <kde@opensource.sf-tec.de>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "kgpgoptions.h"
0008 
0009 #include "kgpg_general_debug.h"
0010 #include "kgpgsettings.h"
0011 #include "kgpginterface.h"
0012 #include "conf_encryption.h"
0013 #include "core/images.h"
0014 #include "model/gpgservermodel.h"
0015 #include "model/keylistproxymodel.h"
0016 #include "model/kgpgitemmodel.h"
0017 
0018 #include <kwidgetsaddons_version.h>
0019 #include <KConfig>
0020 #include <KConfigGroup>
0021 #include <KDesktopFile>
0022 #include <KFontChooser>
0023 #include <KLocalizedString>
0024 #include <KMessageBox>
0025 #include <KProcess>
0026 #include <QUrl>
0027 
0028 #include <QCheckBox>
0029 
0030 #include <QFile>
0031 #include <QFileDialog>
0032 #include <QInputDialog>
0033 #include <QTextStream>
0034 #include <QVBoxLayout>
0035 #include <QRegularExpression>
0036 #include <QStandardPaths>
0037 
0038 using namespace KgpgCore;
0039 
0040 //   main window
0041 kgpgOptions::kgpgOptions(QWidget *parent, KGpgItemModel *model)
0042            : KConfigDialog(parent, QLatin1String( "settings" ), KGpgSettings::self()),
0043        m_config(new KConfig( QLatin1String( "kgpgrc" ), KConfig::SimpleConfig)),
0044        m_page1(new Encryption()),
0045        m_page2(new Decryption()),
0046        m_page3(new UIConf()),
0047        m_page4(new GPGConf()),
0048        m_page6(new ServerConf()),
0049        m_page7(new MiscConf()),
0050        m_serverModel(new GpgServerModel(m_page6)),
0051        m_fontchooser(new KFontChooser(KFontChooser::NoDisplayFlags, m_page3->tabWidget3->widget(1))),
0052        m_model(model),
0053        m_combomodel(new KeyListProxyModel(this, KeyListProxyModel::SingleColumnIdFirst))
0054 {
0055     m_page7->EmailTemplateEdit->setPlainText(KGpgSettings::emailTemplate());
0056 
0057     m_combomodel->setKeyModel(m_model);
0058     m_combomodel->setTrustFilter(KgpgCore::TRUST_MARGINAL);
0059     m_combomodel->setEncryptionKeyFilter(true);
0060     m_combomodel->sort(0);
0061 
0062     // Initialize the default server and the default server list.
0063     defaultKeyServer = QLatin1String("hkp://keyserver.ubuntu.com");
0064     defaultServerList << defaultKeyServer
0065             << QLatin1String("hkp://keys.openpgp.org")
0066             << QLatin1String("hkp://subkeys.pgp.net")
0067             << QLatin1String("hkp://wwwkeys.pgp.net");
0068 
0069     // Read the default keyserver from the GnuPG settings.
0070     keyServer = KgpgInterface::getGpgSetting(QLatin1String( "keyserver" ), KGpgSettings::gpgConfigPath());
0071 
0072     // Read the servers stored in kgpgrc
0073     serverList = KGpgSettings::keyServers();
0074 
0075     // Remove everything after a whitespace. This will normally be
0076     // ' (Default)' from KDE 3.x.x
0077     serverList.replaceInStrings(QRegularExpression(QStringLiteral(" .*")), QString());
0078 
0079     m_serverModel->setStringList(serverList);
0080     // if the server from GnuPG config is set and is not in the list of servers put it there
0081     if (!keyServer.isEmpty() && !serverList.contains(keyServer))
0082         serverList.prepend(keyServer);
0083     m_page6->ServerBox->setModel(m_serverModel);
0084 
0085     defaultConfigPath = QUrl::fromLocalFile(gpgConfigPath).fileName();
0086     defaultHomePath = QUrl::fromLocalFile(gpgConfigPath).adjusted(QUrl::RemoveFilename).path();
0087     defaultBinPath = KGpgSettings::gpgBinaryPath();
0088 
0089     m_showsystray = KGpgSettings::showSystray();
0090     m_trayaction = KGpgSettings::leftClick();
0091     m_mailUats = KGpgSettings::mailUats();
0092 
0093     QVBoxLayout *fontlayout = new QVBoxLayout(m_page3->tabWidget3->widget(1));
0094 
0095     m_fontchooser->setObjectName( QLatin1String("kcfg_Font" ));
0096     fontlayout->addWidget(m_fontchooser);
0097 
0098     m_page3->kcfg_EmailSorting->addItem(i18n("Left to right, account first")); ///< KGpgSettings::EnumEmailSorting::Alphabetical
0099     m_page3->kcfg_EmailSorting->addItem(i18n("Right to left, TLD first")); ///< KGpgSettings::EnumEmailSorting::TLDfirst
0100     m_page3->kcfg_EmailSorting->addItem(i18n("Right to left, domain first")); ///< KGpgSettings::EnumEmailSorting::DomainFirst
0101     m_page3->kcfg_EmailSorting->addItem(i18n("Right to left, FQDN first")); ///< KGpgSettings::EnumEmailSorting::FQDNFirst
0102     m_emailSortingIndex = KGpgSettings::emailSorting();
0103 
0104     addPage(m_page1, i18n("Encryption"), QLatin1String( "document-encrypt" ));
0105     addPage(m_page2, i18n("Decryption"), QLatin1String( "document-decrypt") );
0106     addPage(m_page3, i18n("Appearance"), QLatin1String( "preferences-desktop-theme" ));
0107     addPage(m_page4, i18n("GnuPG Settings"), QLatin1String( "kgpg" ));
0108     addPage(m_page6, i18n("Key Servers"), QLatin1String( "network-wired" ));
0109     addPage(m_page7, i18n("Misc"), QLatin1String( "preferences-other" ));
0110 
0111     // The following widgets are managed manually.
0112     connect(m_page1->encrypt_to_always, &QCheckBox::toggled, this, &kgpgOptions::slotChangeEncryptTo);
0113     connect(m_page4->changeHome, &QPushButton::clicked, this, &kgpgOptions::slotChangeHome);
0114     connect(m_page6->server_add, &QPushButton::clicked, this, &kgpgOptions::slotAddKeyServer);
0115     connect(m_page6->server_del, &QPushButton::clicked, this, &kgpgOptions::slotDelKeyServer);
0116     connect(m_page6->server_edit, &QPushButton::clicked, this, QOverload<>::of(&kgpgOptions::slotEditKeyServer));
0117     connect(m_page6->server_default, &QPushButton::clicked, this, &kgpgOptions::slotDefaultKeyServer);
0118     connect(m_page6->ServerBox->selectionModel(), &QItemSelectionModel::selectionChanged, this, &kgpgOptions::slotChangeKeyServerButtonEnable);
0119     connect(m_page6->ServerBox, &QListView::doubleClicked, this, QOverload<const QModelIndex &>::of(&kgpgOptions::slotEditKeyServer));
0120     connect(m_page7->kcfg_ShowSystray, &QPushButton::clicked, this, &kgpgOptions::slotSystrayEnable);
0121 
0122     keyUltimate = KGpgSettings::colorUltimate();
0123     keyGood = KGpgSettings::colorGood();
0124     keyMarginal = KGpgSettings::colorMarginal();
0125     keyExpired = KGpgSettings::colorExpired();
0126     keyUnknown = KGpgSettings::colorUnknown();
0127     keyRev = KGpgSettings::colorRev();
0128     keyBad = KGpgSettings::colorBad();
0129 }
0130 
0131 kgpgOptions::~kgpgOptions()
0132 {
0133     delete m_config;
0134     delete m_page1;
0135     delete m_page2;
0136     delete m_page3;
0137     delete m_page4;
0138     delete m_page6;
0139     delete m_page7;
0140 }
0141 
0142 void kgpgOptions::slotChangeHome()
0143 {
0144     QString gpgHome = QFileDialog::getExistingDirectory(this, i18n("New GnuPG Home Location"), m_page4->gpg_home_path->text());
0145     if (gpgHome.isEmpty())
0146         return;
0147 
0148     if (!gpgHome.endsWith(QLatin1Char( '/' )))
0149         gpgHome.append(QLatin1Char( '/' ));
0150 
0151     QString confPath = QLatin1String( "options" );
0152     if (!QFile(gpgHome + confPath).exists()) {
0153         confPath = QLatin1String( "gpg.conf" );
0154         if (!QFile(gpgHome + confPath).exists()) {
0155             // Try to create config File by running gpg once
0156             if (KMessageBox::Yes == KMessageBox::questionYesNo(this,
0157                     i18n("No configuration file was found in the selected location.\nDo you want to create it now?\n\nWithout a configuration file, neither KGpg nor GnuPG will work properly."),
0158                     i18n("No Configuration File Found"),
0159                     KGuiItem(i18n("Create")),
0160                     KGuiItem(i18n("Ignore")))) {
0161                 // start GnuPG so that it will create a config file
0162                 QString gpgbin = m_page4->kcfg_GpgBinaryPath->text();
0163                 if (!QFile::exists(gpgbin))
0164                     gpgbin = QLatin1String( "gpg" );
0165 
0166                 KProcess p;
0167                 p << gpgbin << QLatin1String( "--homedir" ) << gpgHome << QLatin1String( "--no-tty" ) << QLatin1String( "--list-secret-keys" );
0168                 p.execute();
0169                 // end of creating config file
0170 
0171                 confPath = QLatin1String( "gpg.conf" );
0172                 QFile confFile(gpgHome + confPath);
0173                 if (!confFile.open(QIODevice::WriteOnly)) {
0174                     KMessageBox::error(this, i18n("Cannot create configuration file. Please check if destination media is mounted and if you have write access."));
0175                     return;
0176                 } else {
0177                     QTextStream stream(&confFile);
0178                     stream << "#  Config file created by KGpg\n\n";
0179                     confFile.close();
0180                 }
0181             } else {
0182                 confPath.clear();
0183             }
0184         }
0185     }
0186 
0187     m_page4->gpg_conf_path->setText(confPath);
0188     m_page4->gpg_home_path->setText(gpgHome);
0189 }
0190 
0191 bool kgpgOptions::isValidKeyserver(const QString &server)
0192 {
0193     if (server.isEmpty())
0194         return false;
0195 
0196     if (server.contains(QLatin1Char( ' ' ))) {
0197         KMessageBox::error(this, i18n("Key server URLs may not contain whitespace."));
0198         return false;
0199     }
0200 
0201     if (serverList.contains(server)) {
0202         KMessageBox::error(this, i18n("Key server already in the list."));
0203         return false;
0204     }
0205 
0206     return true;
0207 }
0208 
0209 void kgpgOptions::slotAddKeyServer()
0210 {
0211     const QString newServer(QInputDialog::getText(this, i18n("Add New Key Server"), i18n("Server URL:")));
0212 
0213     if (!isValidKeyserver(newServer))
0214         return;
0215 
0216     m_serverModel->setStringList(m_serverModel->stringList() << newServer);
0217     settingsChangedSlot();
0218 }
0219 
0220 void kgpgOptions::slotChangeEncryptTo()
0221 {
0222     settingsChangedSlot();
0223 }
0224 
0225 void kgpgOptions::slotDelKeyServer()
0226 {
0227     QModelIndex cur = m_page6->ServerBox->selectionModel()->currentIndex();
0228     m_serverModel->removeRows(cur.row(), 1);
0229 
0230     settingsChangedSlot();
0231 }
0232 
0233 void kgpgOptions::slotEditKeyServer()
0234 {
0235     slotEditKeyServer(m_page6->ServerBox->selectionModel()->currentIndex());
0236 }
0237 
0238 void kgpgOptions::slotEditKeyServer(const QModelIndex &index)
0239 {
0240     if (!index.isValid())
0241         return;
0242 
0243     m_page6->ServerBox->edit(index);
0244 
0245     settingsChangedSlot();
0246 }
0247 
0248 void kgpgOptions::slotDefaultKeyServer()
0249 {
0250     QModelIndex cur = m_page6->ServerBox->selectionModel()->currentIndex();
0251 
0252     m_serverModel->setDefault(cur.row());
0253 
0254     settingsChangedSlot();
0255 }
0256 
0257 void kgpgOptions::slotChangeKeyServerButtonEnable()
0258 {
0259     QModelIndex cur = m_page6->ServerBox->selectionModel()->currentIndex();
0260 
0261     m_page6->server_del->setEnabled(cur.isValid());
0262     m_page6->server_edit->setEnabled(cur.isValid());
0263     m_page6->server_default->setEnabled(cur.isValid() &&
0264             (cur.row() != m_serverModel->defaultRow()));
0265 }
0266 
0267 void kgpgOptions::updateWidgets()
0268 {
0269     alwaysKeyID = KgpgInterface::getGpgSetting(QLatin1String( "encrypt-to" ), KGpgSettings::gpgConfigPath());
0270 
0271     m_page7->EmailTemplateEdit->setPlainText(KGpgSettings::emailTemplate());
0272 
0273     m_encrypttoalways = !alwaysKeyID.isEmpty();
0274     m_defaultencrypttoalways = false;
0275 
0276     m_page1->encrypt_to_always->setChecked(m_encrypttoalways);
0277 
0278     listKeys();
0279     fileEncryptionKey = KGpgSettings::fileEncryptionKey();
0280     // the contents are totally mess. There were key id, name and email stored
0281     // try to extract the key id, that's the only thing we really need
0282     if (!fileEncryptionKey.isEmpty()) {
0283         int idpos = m_page1->file_key->findText(fileEncryptionKey);
0284         if (idpos == -1) {
0285             idpos = fileEncryptionKey.indexOf(QRegularExpression(QStringLiteral("([0-9A-Fa-f]{8})+")));
0286             if (idpos >= 0) {
0287                 QString fileId = fileEncryptionKey.mid(idpos);
0288                 idpos = fileId.indexOf(QRegularExpression(QStringLiteral("[^a-fA-F0-9]")));
0289                 if (idpos >= 0) {
0290                     fileId.truncate(idpos);
0291                     fileId.chop(fileId.length() % 8);
0292                 }
0293 
0294                 KGpgKeyNode *anode = m_combomodel->getModel()->findKeyNode(fileId);
0295 
0296                 if (anode != nullptr)
0297                     idpos = m_combomodel->nodeIndex(anode).row();
0298             }
0299         }
0300         m_page1->file_key->setCurrentIndex(idpos);
0301     }
0302 
0303     if (!alwaysKeyID.isEmpty()) {
0304         KGpgKeyNode *anode = m_combomodel->getModel()->findKeyNode(alwaysKeyID);
0305         if (anode != nullptr) {
0306             const QModelIndex midx(m_combomodel->nodeIndex(anode));
0307             m_page1->always_key->setCurrentIndex(midx.row());
0308         }
0309     }
0310 
0311     gpgConfigPath = KGpgSettings::gpgConfigPath();
0312     m_page4->gpg_conf_path->setText(QUrl::fromLocalFile(gpgConfigPath).fileName());
0313     m_page4->gpg_home_path->setText(QUrl::fromLocalFile(gpgConfigPath).adjusted(QUrl::RemoveFilename).path());
0314 
0315     m_useagent = KgpgInterface::getGpgBoolSetting(QLatin1String( "use-agent" ), KGpgSettings::gpgConfigPath());
0316     m_defaultuseagent = false;
0317 
0318     m_page4->use_agent->setChecked(m_useagent);
0319 
0320     m_emailSortingIndex = KGpgSettings::emailSorting();
0321     m_page3->kcfg_EmailSorting->setCurrentIndex(m_emailSortingIndex);
0322 
0323     m_serverModel->setStringList(serverList);
0324     if (!serverList.isEmpty())
0325         m_serverModel->setDefault(keyServer);
0326 
0327     qCDebug(KGPG_LOG_GENERAL) << "Finishing options";
0328 }
0329 
0330 void kgpgOptions::updateWidgetsDefault()
0331 {
0332     m_page7->EmailTemplateEdit->setPlainText(m_emailTemplate);
0333 
0334     m_page1->encrypt_to_always->setChecked(m_defaultencrypttoalways);
0335     m_page4->use_agent->setChecked(m_defaultuseagent);
0336 
0337     m_page4->gpg_conf_path->setText(defaultConfigPath);
0338     m_page4->gpg_home_path->setText(defaultHomePath);
0339 
0340     m_serverModel->setStringList(defaultServerList);
0341     m_serverModel->setDefault(0);
0342 
0343     m_page3->kcfg_EmailSorting->setCurrentIndex(KGpgSettings::EnumEmailSorting::Alphabetical);
0344 
0345     qCDebug(KGPG_LOG_GENERAL) << "Finishing default options" ;
0346 }
0347 
0348 void kgpgOptions::updateSettings()
0349 {
0350     // Update config path first!
0351     const QString newConfigFile = m_page4->gpg_home_path->text() + m_page4->gpg_conf_path->text();
0352     if (newConfigFile != gpgConfigPath) {
0353         KGpgSettings::setGpgConfigPath(newConfigFile);
0354         Q_EMIT homeChanged();
0355 
0356         gpgConfigPath = newConfigFile;
0357     }
0358 
0359     // save selected keys for file encryption & always encrypt with
0360     if (m_page1->kcfg_EncryptFilesTo->isChecked())
0361         fileEncryptionKey = m_page1->file_key->itemData(m_page1->file_key->currentIndex(), Qt::ToolTipRole).toString();
0362     else
0363         fileEncryptionKey.clear();
0364 
0365     if (fileEncryptionKey != KGpgSettings::fileEncryptionKey())
0366         KGpgSettings::setFileEncryptionKey(fileEncryptionKey);
0367 
0368     m_encrypttoalways = m_page1->encrypt_to_always->isChecked();
0369 
0370     if (m_encrypttoalways)
0371         alwaysKeyID = m_page1->always_key->itemData(m_page1->always_key->currentIndex(), Qt::ToolTipRole).toString();
0372     else
0373         alwaysKeyID.clear();
0374 
0375     KgpgInterface::setGpgSetting(QLatin1String( "encrypt-to" ), alwaysKeyID, KGpgSettings::gpgConfigPath());
0376 
0377     Q_EMIT changeFont(m_fontchooser->font());
0378 
0379     // install service menus
0380     if (m_page7->kcfg_SignMenu->currentIndex() == KGpgSettings::EnumSignMenu::AllFiles)
0381         slotInstallSign(QLatin1String( "application/octet-stream" ));
0382     else
0383         slotRemoveMenu(QLatin1String( "signfile.desktop" ));
0384 
0385     if (m_page7->kcfg_DecryptMenu->currentIndex() == KGpgSettings::EnumDecryptMenu::AllFiles)
0386         slotInstallDecrypt(QLatin1String( "application/octet-stream" ));
0387     else
0388     if (m_page7->kcfg_DecryptMenu->currentIndex() == KGpgSettings::EnumDecryptMenu::EncryptedFiles)
0389         slotInstallDecrypt(QLatin1String( "application/pgp-encrypted,application/pgp-signature,application/pgp-keys" ));
0390     else
0391         slotRemoveMenu(QLatin1String( "decryptfile.desktop" ));
0392 
0393     m_useagent = m_page4->use_agent->isChecked();
0394 
0395     if (m_useagent) {
0396         KgpgInterface::setGpgBoolSetting(QLatin1String( "use-agent" ), true, KGpgSettings::gpgConfigPath());
0397         KgpgInterface::setGpgBoolSetting(QLatin1String( "no-use-agent" ), false, KGpgSettings::gpgConfigPath());
0398     } else {
0399         KgpgInterface::setGpgBoolSetting(QLatin1String( "use-agent" ), false, KGpgSettings::gpgConfigPath());
0400     }
0401 
0402     // Store the default server in ~/.gnupg
0403     KgpgInterface::setGpgSetting(QLatin1String("keyserver"), m_serverModel->defaultServer(), KGpgSettings::gpgConfigPath());
0404 
0405     // Store additional servers in kgpgrc.
0406     serverList = m_serverModel->stringList();
0407     int defaultRow = m_serverModel->defaultRow();
0408     if (!serverList.isEmpty())
0409         serverList.move(defaultRow, 0);
0410 
0411     KGpgSettings::setKeyServers(serverList);
0412 
0413     if (keyUltimate != m_page3->kcfg_ColorUltimate->color())
0414         Q_EMIT refreshTrust(TRUST_ULTIMATE, m_page3->kcfg_ColorUltimate->color());
0415 
0416     if (keyGood != m_page3->kcfg_ColorGood->color())
0417         Q_EMIT refreshTrust(TRUST_FULL, m_page3->kcfg_ColorGood->color());
0418 
0419     if (keyExpired != m_page3->kcfg_ColorExpired->color())
0420         Q_EMIT refreshTrust(TRUST_EXPIRED, m_page3->kcfg_ColorExpired->color());
0421 
0422     if (keyMarginal != m_page3->kcfg_ColorMarginal->color())
0423         Q_EMIT refreshTrust(TRUST_MARGINAL, m_page3->kcfg_ColorMarginal->color());
0424 
0425     if (keyBad != m_page3->kcfg_ColorBad->color()) {
0426         Q_EMIT refreshTrust(TRUST_INVALID, m_page3->kcfg_ColorBad->color());
0427         Q_EMIT refreshTrust(TRUST_DISABLED, m_page3->kcfg_ColorBad->color());
0428     }
0429 
0430     if (keyUnknown != m_page3->kcfg_ColorUnknown->color()) {
0431         Q_EMIT refreshTrust(TRUST_UNDEFINED, m_page3->kcfg_ColorUnknown->color());
0432         Q_EMIT refreshTrust(TRUST_NONE, m_page3->kcfg_ColorUnknown->color());
0433         Q_EMIT refreshTrust(TRUST_UNKNOWN, m_page3->kcfg_ColorUnknown->color());
0434     }
0435 
0436     if (keyRev != m_page3->kcfg_ColorRev->color())
0437         Q_EMIT refreshTrust(TRUST_REVOKED, m_page3->kcfg_ColorRev->color());
0438 
0439     m_showsystray = m_page7->kcfg_ShowSystray->isChecked();
0440     KGpgSettings::setShowSystray(m_showsystray);
0441 
0442     m_trayaction = m_page7->kcfg_LeftClick->currentIndex();
0443     KGpgSettings::setLeftClick(m_trayaction);
0444 
0445     m_mailUats = m_page7->kcfg_MailUats->currentIndex();
0446     KGpgSettings::setMailUats(m_mailUats);
0447 
0448     m_emailTemplate = m_page7->EmailTemplateEdit->toPlainText();
0449     KGpgSettings::setEmailTemplate(m_emailTemplate);
0450 
0451     m_emailSortingIndex = m_page3->kcfg_EmailSorting->currentIndex();
0452     KGpgSettings::setEmailSorting(m_emailSortingIndex);
0453 
0454     KGpgSettings::self()->save();
0455     m_config->sync();
0456 
0457     Q_EMIT settingsUpdated();
0458 }
0459 
0460 void kgpgOptions::listKeys()
0461 {
0462     if (m_model->rowCount(QModelIndex()) == 0) {
0463         ids += QLatin1String("0");
0464         m_page1->file_key->addItem(i18nc("no key available", "none"));
0465         m_page1->file_key->setModel(nullptr);
0466         m_page1->always_key->addItem(i18nc("no key available", "none"));
0467         m_page1->always_key->setModel(nullptr);
0468     } else {
0469         m_page1->file_key->setModel(m_combomodel);
0470         m_page1->always_key->setModel(m_combomodel);
0471     }
0472 }
0473 
0474 void kgpgOptions::slotInstallDecrypt(const QString &mimetype)
0475 {
0476     const QString path(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/konqueror/servicemenus/decryptfile.desktop" ));
0477     KDesktopFile configl2(path);
0478     if (!configl2.isImmutable()) {
0479         KConfigGroup gr(configl2.group("Desktop Entry"));
0480 
0481         gr.writeXdgListEntry("MimeType", QStringList(mimetype));
0482         gr.writeEntry("X-KDE-ServiceTypes", "KonqPopupMenu/Plugin");
0483         gr.writeEntry("Actions", "decrypt");
0484 
0485         gr = configl2.group("Desktop Action decrypt");
0486         gr.writeEntry("Name", i18n("Decrypt File"));
0487         //gr.writeEntry("Icon", "decrypt_file");
0488         gr.writeEntry("Exec", "kgpg %U");
0489     }
0490 }
0491 
0492 void kgpgOptions::slotInstallSign(const QString &mimetype)
0493 {
0494     QString path(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/kde5/services/") + QLatin1String( "ServiceMenus/signfile.desktop" ));
0495     KDesktopFile configl2(path);
0496     if (!configl2.isImmutable()) {
0497         KConfigGroup gr = configl2.group("Desktop Entry");
0498         gr.writeXdgListEntry("MimeType", QStringList(mimetype));
0499         gr.writeEntry("X-KDE-ServiceTypes", "KonqPopupMenu/Plugin");
0500         gr.writeEntry("Actions", "sign");
0501 
0502         gr = configl2.group("Desktop Action sign");
0503         gr.writeEntry("Name", i18n("Sign File"));
0504         //gr.writeEntry("Icon", "sign_file");
0505         gr.writeEntry("Exec","kgpg -S %F");
0506     }
0507 }
0508 
0509 void kgpgOptions::slotRemoveMenu(const QString &menu)
0510 {
0511     QString path = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/kde5/services/") + QLatin1String( "ServiceMenus/" ) + menu;
0512     QFile qfile(path);
0513     if (qfile.exists())
0514         qfile.remove();
0515 }
0516 
0517 bool kgpgOptions::hasChanged()
0518 {
0519     if (m_page1->kcfg_EncryptFilesTo->isChecked() && (m_page1->file_key->currentText() != fileEncryptionKey))
0520         return true;
0521 
0522     if (m_page1->encrypt_to_always->isChecked() != m_encrypttoalways)
0523         return true;
0524 
0525     if (m_page1->encrypt_to_always->isChecked() &&
0526             (m_page1->always_key->itemData(m_page1->always_key->currentIndex(), Qt::ToolTipRole).toString()) != alwaysKeyID)
0527         return true;
0528 
0529     if (m_page4->gpg_conf_path->text() != QUrl::fromLocalFile(gpgConfigPath).fileName())
0530         return true;
0531 
0532     if (m_page4->gpg_home_path->text() != QUrl::fromLocalFile(gpgConfigPath).adjusted(QUrl::RemoveFilename).path())
0533         return true;
0534 
0535     if (m_page4->use_agent->isChecked() != m_useagent)
0536         return true;
0537 
0538     // Did the default server change
0539     if (m_serverModel->defaultServer() != keyServer)
0540         return true;
0541 
0542     // Did the servers change?
0543     if (m_serverModel->stringList() != serverList)
0544         return true;
0545 
0546     if (m_page7->kcfg_ShowSystray->isChecked() != m_showsystray)
0547         return true;
0548 
0549     if (m_page7->kcfg_LeftClick->currentIndex() != m_trayaction)
0550         return true;
0551 
0552     if (m_page7->kcfg_MailUats->currentIndex() != m_mailUats)
0553         return true;
0554 
0555     if (m_page3->kcfg_EmailSorting->currentIndex() != m_emailSortingIndex)
0556         return true;
0557 
0558     return false;
0559 }
0560 
0561 bool kgpgOptions::isDefault()
0562 {
0563     if (m_page1->encrypt_to_always->isChecked() != m_defaultencrypttoalways)
0564         return false;
0565 
0566     if (m_page4->gpg_conf_path->text() != defaultConfigPath)
0567         return false;
0568 
0569     if (m_page4->gpg_home_path->text() != defaultHomePath)
0570         return false;
0571 
0572     if (m_page4->use_agent->isChecked() != m_defaultuseagent)
0573         return false;
0574 
0575     if (m_serverModel->defaultServer() != defaultKeyServer)
0576         return false;
0577 
0578     if (m_serverModel->stringList() != defaultServerList)
0579         return false;
0580 
0581     if (m_page7->kcfg_ShowSystray->isChecked() != m_showsystray)
0582         return false;
0583 
0584     if (m_page7->kcfg_LeftClick->currentIndex() != KGpgSettings::EnumLeftClick::KeyManager)
0585         return false;
0586 
0587     if (m_page7->kcfg_MailUats->currentIndex() != KGpgSettings::EnumMailUats::All)
0588         return false;
0589 
0590     if (m_page3->kcfg_EmailSorting->currentIndex() != KGpgSettings::EnumEmailSorting::Alphabetical)
0591         return false;
0592 
0593     return true;
0594 }
0595 
0596 void kgpgOptions::slotSystrayEnable()
0597 {
0598     m_page7->kcfg_LeftClick->setEnabled(m_page7->kcfg_ShowSystray->isChecked());
0599 }