File indexing completed on 2024-04-21 05:50:49

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