/** * Copyright (C) 2021 Saturneric * * This file is part of GpgFrontend. * * GpgFrontend 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. * * GpgFrontend 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 GpgFrontend. If not, see . * * The initial version of the source code is inherited from * the gpg4usb project, which is under GPL-3.0-or-later. * * All the source code of GpgFrontend was modified and released by * Saturneric starting on May 12, 2021. * * SPDX-License-Identifier: GPL-3.0-or-later * */ #include "SettingsSendMail.h" #include "ui/struct/SettingsObject.h" #include "ui/thread/SMTPConnectionTestThread.h" #include "ui/thread/SMTPSendMailThread.h" #include "ui_SendMailSettings.h" namespace GpgFrontend::UI { SendMailTab::SendMailTab(QWidget* parent) : QWidget(parent), ui_(std::make_shared()) { ui_->setupUi(this); connect(ui_->enableCheckBox, &QCheckBox::stateChanged, this, [=](int state) { switch_ui_enabled(state == Qt::Checked); }); #ifdef SMTP_SUPPORT connect(ui_->checkConnectionButton, &QPushButton::clicked, this, &SendMailTab::slot_check_connection); connect(ui_->senTestMailButton, &QPushButton::clicked, this, &SendMailTab::slot_send_test_mail); #endif connect(ui_->identityCheckBox, &QCheckBox::stateChanged, this, [=](int state) { switch_ui_identity_enabled(state == Qt::Checked); }); connect(ui_->connextionSecurityComboBox, &QComboBox::currentTextChanged, this, [=](const QString& current_text) { if (current_text == "SSL") { connection_type_ = SmtpClient::ConnectionType::SslConnection; } else if (current_text == "TLS" || current_text == "STARTTLS") { connection_type_ = SmtpClient::ConnectionType::TlsConnection; } else { connection_type_ = SmtpClient::ConnectionType::TcpConnection; } }); ui_->generalGroupBox->setTitle(_("General")); ui_->identityGroupBox->setTitle(_("Identity Information")); ui_->preferenceGroupBox->setTitle(_("Preference")); ui_->operationsGroupBox->setTitle(_("Operations")); ui_->enableCheckBox->setText(_("Enable Send Mail Ability")); ui_->identityCheckBox->setText(_("Need Auth")); ui_->smtpServerAddressLabel->setText(_("SMTP Server Address")); ui_->smtpServerPortLabel->setText(_("SMTP Server Port")); ui_->connectionSecurityLabel->setText(_("SMTP Connection Security")); ui_->usernameLabel->setText(_("Username")); ui_->passwordLabel->setText(_("Password")); ui_->senderLabel->setText(_("Default Sender Email")); ui_->checkConnectionButton->setText(_("Check Connection")); ui_->senTestMailButton->setText(_("Send Test Email")); ui_->gpgkeyIdLabel->setText(_("Default Sender GPG Key ID")); ui_->tipsLabel->setText( _("Tips: It is recommended that you build your own mail server or use " "a trusted mail server. If you don't know the detailed configuration " "information, you can get it from the mail service provider.")); ui_->senTestMailButton->setDisabled(true); auto* email_validator = new QRegularExpressionValidator(re_email_, ui_->defaultSenderEmailEdit); ui_->defaultSenderEmailEdit->setValidator(email_validator); SetSettings(); } void SendMailTab::SetSettings() { auto smtp_passport = SettingsObject("smtp_passport"); ui_->smtpServerAddressEdit->setText( std::string{smtp_passport.Check("smtp_address", "")}.c_str()); ui_->usernameEdit->setText( std::string{smtp_passport.Check("username", "")}.c_str()); ui_->passwordEdit->setText( std::string{smtp_passport.Check("password", "")}.c_str()); ui_->portSpin->setValue(int{smtp_passport.Check("port", 25)}); ui_->connextionSecurityComboBox->setCurrentText( std::string{smtp_passport.Check("connection_type", "None")}.c_str()); ui_->defaultSenderEmailEdit->setText( std::string{smtp_passport.Check("default_sender", "")}.c_str()); ui_->gpgKeyIDEdit->setText( std::string{smtp_passport.Check("default_sender_gpg_key_id", "")} .c_str()); ui_->identityCheckBox->setChecked( bool{smtp_passport.Check("identity_enable", false)}); ui_->enableCheckBox->setChecked(bool{smtp_passport.Check("enable", false)}); { auto state = ui_->identityCheckBox->checkState(); switch_ui_identity_enabled(state == Qt::Checked); } { auto state = ui_->enableCheckBox->checkState(); switch_ui_enabled(state == Qt::Checked); } } void SendMailTab::ApplySettings() { try { auto smtp_passport = SettingsObject("smtp_passport"); smtp_passport["smtp_address"] = ui_->smtpServerAddressEdit->text().toStdString(); smtp_passport["username"] = ui_->usernameEdit->text().toStdString(); smtp_passport["password"] = ui_->passwordEdit->text().toStdString(); smtp_passport["port"] = ui_->portSpin->value(); smtp_passport["connection_type"] = ui_->connextionSecurityComboBox->currentText().toStdString(); smtp_passport["default_sender"] = ui_->defaultSenderEmailEdit->text().toStdString(); smtp_passport["default_sender_gpg_key_id"] = ui_->gpgKeyIDEdit->text().toStdString(); smtp_passport["identity_enable"] = ui_->identityCheckBox->isChecked(); smtp_passport["enable"] = ui_->enableCheckBox->isChecked(); } catch (...) { LOG(ERROR) << _("apply settings failed"); } } #ifdef SMTP_SUPPORT void SendMailTab::slot_check_connection() { auto host = ui_->smtpServerAddressEdit->text().toStdString(); auto port = ui_->portSpin->value(); auto connection_type = connection_type_; bool identity_needed = ui_->identityCheckBox->isChecked(); auto username = ui_->usernameEdit->text().toStdString(); auto password = ui_->passwordEdit->text().toStdString(); auto thread = new SMTPConnectionTestThread( host, port, connection_type, identity_needed, username, password); // Waiting Dialog auto* waiting_dialog = new QProgressDialog(this); waiting_dialog->setMaximum(0); waiting_dialog->setMinimum(0); auto waiting_dialog_label = new QLabel(QString(_("Test SMTP Connection...")) + "

" + _("If the process does not end for a long time, please check " "again whether your SMTP server configuration is correct.")); waiting_dialog_label->setWordWrap(true); waiting_dialog->setLabel(waiting_dialog_label); waiting_dialog->resize(420, 120); connect(thread, &SMTPConnectionTestThread::SignalSMTPConnectionTestResult, this, &SendMailTab::slot_test_smtp_connection_result); connect(thread, &QThread::finished, [=]() { waiting_dialog->finished(0); waiting_dialog->deleteLater(); }); connect(waiting_dialog, &QProgressDialog::canceled, [=]() { LOG(INFO) << "cancel clicked"; if (thread->isRunning()) thread->terminate(); }); // Show Waiting Dialog waiting_dialog->show(); waiting_dialog->setFocus(); thread->start(); QEventLoop loop; connect(thread, &QThread::finished, &loop, &QEventLoop::quit); loop.exec(); } #endif #ifdef SMTP_SUPPORT void SendMailTab::slot_send_test_mail() { auto host = ui_->smtpServerAddressEdit->text().toStdString(); auto port = ui_->portSpin->value(); auto connection_type = connection_type_; bool identity_needed = ui_->identityCheckBox->isChecked(); auto username = ui_->usernameEdit->text().toStdString(); auto password = ui_->passwordEdit->text().toStdString(); auto sender_address = ui_->defaultSenderEmailEdit->text(); auto thread = new SMTPSendMailThread(host, port, connection_type, identity_needed, username, password); // Waiting Dialog auto* waiting_dialog = new QProgressDialog(this); waiting_dialog->setMaximum(0); waiting_dialog->setMinimum(0); auto waiting_dialog_label = new QLabel(QString(_("Test SMTP Send Mail Ability...")) + "

" + _("If the process does not end for a long time, please check " "again whether your SMTP server configuration is correct.")); waiting_dialog_label->setWordWrap(true); waiting_dialog->setLabel(waiting_dialog_label); waiting_dialog->resize(420, 120); connect(thread, &SMTPSendMailThread::SignalSMTPResult, this, &SendMailTab::slot_test_smtp_connection_result); connect(thread, &QThread::finished, [=]() { waiting_dialog->finished(0); waiting_dialog->deleteLater(); }); connect(waiting_dialog, &QProgressDialog::canceled, [=]() { LOG(INFO) << "cancel clicked"; if (thread->isRunning()) thread->terminate(); }); thread->SetSender(sender_address); thread->SetRecipient(sender_address); thread->SetSubject(_("Test Email from GpgFrontend")); thread->AddTextContent( _("Hello, this is a test email from GpgFrontend. If you receive this " "email, it means that you have configured the correct SMTP server " "parameters.")); // Show Waiting Dialog waiting_dialog->show(); waiting_dialog->setFocus(); thread->start(); QEventLoop loop; connect(thread, &QThread::finished, &loop, &QEventLoop::quit); loop.exec(); } void SendMailTab::slot_test_smtp_connection_result(const QString& result) { if (result == "Fail to connect SMTP server") { QMessageBox::critical(this, _("Fail"), _("Fail to Connect SMTP Server.")); ui_->senTestMailButton->setDisabled(true); } else if (result == "Fail to login") { QMessageBox::critical(this, _("Fail"), _("Fail to Login.")); ui_->senTestMailButton->setDisabled(true); } else if (result == "Fail to send mail") { QMessageBox::critical(this, _("Fail"), _("Fail to Login.")); ui_->senTestMailButton->setDisabled(true); } else if (result == "Succeed in testing connection") { QMessageBox::information(this, _("Success"), _("Succeed in connecting and login")); ui_->senTestMailButton->setDisabled(false); } else if (result == "Succeed in sending a test email") { QMessageBox::information( this, _("Success"), _("Succeed in sending a test email to the SMTP Server")); ui_->senTestMailButton->setDisabled(false); } else { QMessageBox::critical(this, _("Fail"), _("Unknown error.")); ui_->senTestMailButton->setDisabled(true); } } void SendMailTab::switch_ui_enabled(bool enabled) { ui_->smtpServerAddressEdit->setDisabled(!enabled); ui_->portSpin->setDisabled(!enabled); ui_->connextionSecurityComboBox->setDisabled(!enabled); ui_->identityCheckBox->setDisabled(!enabled); ui_->usernameEdit->setDisabled(!enabled); ui_->passwordEdit->setDisabled(!enabled); ui_->defaultSenderEmailEdit->setDisabled(!enabled); ui_->gpgKeyIDEdit->setDisabled(!enabled); ui_->checkConnectionButton->setDisabled(!enabled); } void SendMailTab::switch_ui_identity_enabled(bool enabled) { ui_->usernameEdit->setDisabled(!enabled); ui_->passwordEdit->setDisabled(!enabled); } #endif } // namespace GpgFrontend::UI