aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/settings/SettingsKeyServer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/settings/SettingsKeyServer.cpp')
-rw-r--r--src/ui/settings/SettingsKeyServer.cpp252
1 files changed, 170 insertions, 82 deletions
diff --git a/src/ui/settings/SettingsKeyServer.cpp b/src/ui/settings/SettingsKeyServer.cpp
index f05ad7fb..1d520e35 100644
--- a/src/ui/settings/SettingsKeyServer.cpp
+++ b/src/ui/settings/SettingsKeyServer.cpp
@@ -25,64 +25,81 @@
#include "SettingsKeyServer.h"
#include "GlobalSettingStation.h"
+#include "ui_KeyServerSettings.h"
namespace GpgFrontend::UI {
-KeyserverTab::KeyserverTab(QWidget* parent) : QWidget(parent) {
- auto generalGroupBox = new QGroupBox(_("General"));
- auto generalLayout = new QVBoxLayout();
-
- keyServerTable = new QTableWidget();
- keyServerTable->setColumnCount(3);
- keyServerTable->horizontalHeader()->setSectionResizeMode(
- QHeaderView::ResizeToContents);
- keyServerTable->horizontalHeader()->setStretchLastSection(false);
- keyServerTable->verticalHeader()->hide();
- keyServerTable->setShowGrid(false);
- keyServerTable->sortByColumn(0, Qt::AscendingOrder);
- keyServerTable->setSelectionBehavior(QAbstractItemView::SelectRows);
- keyServerTable->setSelectionMode(QAbstractItemView::SingleSelection);
-
- // tableitems not editable
- keyServerTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
- // no focus (rectangle around tableitems)
- // may be it should focus on whole row
- keyServerTable->setFocusPolicy(Qt::NoFocus);
- keyServerTable->setAlternatingRowColors(true);
-
- QStringList labels;
- labels << _("No.") << _("Address") << _("Available");
- keyServerTable->setHorizontalHeaderLabels(labels);
-
- auto* mainLayout = new QVBoxLayout(this);
- auto* label = new QLabel(QString(_("Default Key Server for Import")) + ": ");
-
- comboBox = new QComboBox;
- comboBox->setEditable(false);
- comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
-
- auto* addKeyServerBox = new QWidget(this);
- auto* addKeyServerLayout = new QHBoxLayout(addKeyServerBox);
- auto* http = new QLabel("URL: ");
- newKeyServerEdit = new QLineEdit(this);
- auto* newKeyServerButton = new QPushButton(_("Add"), this);
- connect(newKeyServerButton, SIGNAL(clicked()), this, SLOT(addKeyServer()));
- addKeyServerLayout->addWidget(http);
- addKeyServerLayout->addWidget(newKeyServerEdit);
- addKeyServerLayout->addWidget(newKeyServerButton);
-
- generalLayout->addWidget(label);
- generalLayout->addWidget(comboBox);
- generalLayout->addWidget(keyServerTable);
- generalLayout->addWidget(addKeyServerBox);
- generalLayout->addStretch(0);
-
- generalGroupBox->setLayout(generalLayout);
- mainLayout->addWidget(generalGroupBox);
- mainLayout->addStretch(0);
-
- setLayout(mainLayout);
- // Read keylist from ini-file and fill it into combobox
+KeyserverTab::KeyserverTab(QWidget* parent)
+ : QWidget(parent), ui(std::make_shared<Ui_KeyServerSettings>()) {
+ ui->setupUi(this);
+ ui->keyServerListTable->setSizeAdjustPolicy(
+ QAbstractScrollArea::AdjustToContents);
+
+ connect(ui->addKeyServerPushButton, &QPushButton::clicked, this,
+ &KeyserverTab::addKeyServer);
+ connect(ui->testKeyServerButton, &QPushButton::clicked, this,
+ &KeyserverTab::slotTestListedKeyServer);
+
+ ui->keyServerListGroupBox->setTitle(_("Keyserver List"));
+ ui->operationsGroupBox->setTitle(_("Operations"));
+
+ ui->keyServerListTable->horizontalHeaderItem(0)->setText(_("Default"));
+ ui->keyServerListTable->horizontalHeaderItem(1)->setText(
+ _("Keyserver Address"));
+ ui->keyServerListTable->horizontalHeaderItem(2)->setText(_("Security"));
+ ui->keyServerListTable->horizontalHeaderItem(3)->setText(_("Available"));
+
+ ui->addKeyServerPushButton->setText(_("Add"));
+ ui->testKeyServerButton->setText(_("Test Listed Keyserver"));
+
+ ui->tipsLabel->setText(_("Tips: Please Double-click table item to edit it."));
+ ui->actionDelete_Selected_Key_Server->setText(_("Delete Selected"));
+ ui->actionDelete_Selected_Key_Server->setToolTip(
+ _("Delete Selected Key Server"));
+ ui->actionSet_As_Default->setText(_("Set As Default"));
+ ui->actionSet_As_Default->setToolTip(_("Set As Default"));
+
+ popupMenu = new QMenu(this);
+ popupMenu->addAction(ui->actionSet_As_Default);
+ popupMenu->addAction(ui->actionDelete_Selected_Key_Server);
+
+ connect(ui->keyServerListTable, &QTableWidget::itemChanged,
+ [=](QTableWidgetItem* item) {
+ LOG(INFO) << "item edited" << item->column();
+ if (item->column() != 1) return;
+ const auto row_size = ui->keyServerListTable->rowCount();
+ // Update Actions
+ if (row_size > 0) {
+ keyServerStrList.clear();
+ for (int i = 0; i < row_size; i++) {
+ const auto key_server =
+ ui->keyServerListTable->item(i, 1)->text();
+ keyServerStrList.append(key_server);
+ }
+ }
+ });
+
+ connect(ui->actionSet_As_Default, &QAction::triggered, [=]() {
+ const auto row_size = ui->keyServerListTable->rowCount();
+ for (int i = 0; i < row_size; i++) {
+ const auto item = ui->keyServerListTable->item(i, 1);
+ if (!item->isSelected()) continue;
+ this->defaultKeyServer = item->text();
+ }
+ this->refreshTable();
+ });
+
+ connect(ui->actionDelete_Selected_Key_Server, &QAction::triggered, [=]() {
+ const auto row_size = ui->keyServerListTable->rowCount();
+ for (int i = 0; i < row_size; i++) {
+ const auto item = ui->keyServerListTable->item(i, 1);
+ if (!item->isSelected()) continue;
+ this->keyServerStrList.removeAt(i);
+ }
+ this->refreshTable();
+ });
+
+ // Read key-list from ini-file and fill it into combobox
setSettings();
refreshTable();
}
@@ -100,7 +117,6 @@ void KeyserverTab::setSettings() {
const auto server_list_size = server_list.getLength();
for (int i = 0; i < server_list_size; i++) {
std::string server_url = server_list[i];
- comboBox->addItem(server_url.c_str());
keyServerStrList.append(server_url.c_str());
}
} catch (...) {
@@ -109,28 +125,46 @@ void KeyserverTab::setSettings() {
try {
std::string default_server = settings.lookup("keyserver.default_server");
- comboBox->setCurrentText(default_server.c_str());
+ if (!keyServerStrList.contains(default_server.c_str()))
+ keyServerStrList.append(default_server.c_str());
+ defaultKeyServer = QString::fromStdString(default_server);
} catch (...) {
LOG(ERROR) << _("Setting Operation Error") << _("default_server");
}
}
void KeyserverTab::addKeyServer() {
- QString targetUrl;
- if (newKeyServerEdit->text().startsWith("http://") ||
- newKeyServerEdit->text().startsWith("https://"))
- targetUrl = newKeyServerEdit->text();
- else
- targetUrl = "http://" + newKeyServerEdit->text();
- keyServerStrList.append(targetUrl);
- comboBox->addItem(targetUrl);
+ auto target_url = ui->addKeyServerEdit->text();
+ if (url_reg.match(target_url).hasMatch()) {
+ if (target_url.startsWith("https://")) {
+ ;
+ } else if (target_url.startsWith("http://")) {
+ QMessageBox::warning(
+ this, _("Insecure keyserver address"),
+ _("For security reasons, using HTTP as the communication protocol "
+ "with "
+ "the key server is not recommended. It is recommended to use "
+ "HTTPS."));
+ }
+ keyServerStrList.append(ui->addKeyServerEdit->text());
+ } else {
+ auto ret = QMessageBox::warning(
+ this, _("Warning"),
+ _("You may not use HTTPS or HTTP as the protocol for communicating "
+ "with the key server, which may not be wrong. But please check the "
+ "address you entered again to make sure it is correct. Are you "
+ "sure "
+ "that want to add it into the keyserver list?"),
+ QMessageBox::Ok | QMessageBox::Cancel);
+
+ if (ret == QMessageBox::Cancel)
+ return;
+ else
+ keyServerStrList.append(ui->addKeyServerEdit->text());
+ }
refreshTable();
}
-/***********************************
- * get the values of the buttons and
- * write them to settings-file
- *************************************/
void KeyserverTab::applySettings() {
auto& settings = GlobalSettingStation::GetInstance().GetUISettings();
@@ -140,43 +174,97 @@ void KeyserverTab::applySettings() {
auto& keyserver = settings["keyserver"];
- if (keyserver.exists("server_list"))
- keyserver.remove("server_list");
+ if (keyserver.exists("server_list")) keyserver.remove("server_list");
keyserver.add("server_list", libconfig::Setting::TypeList);
+ const auto row_size = ui->keyServerListTable->rowCount();
auto& server_list = keyserver["server_list"];
- for (const auto& key_server_url : keyServerStrList) {
- server_list.add(libconfig::Setting::TypeString) =
- key_server_url.toStdString();
+ for (int i = 0; i < row_size; i++) {
+ const auto key_server = ui->keyServerListTable->item(i, 1)->text();
+ server_list.add(libconfig::Setting::TypeString) = key_server.toStdString();
}
if (!keyserver.exists("default_server")) {
keyserver.add("default_server", libconfig::Setting::TypeString) =
- comboBox->currentText().toStdString();
+ defaultKeyServer.toStdString();
} else {
- keyserver["default_server"] = comboBox->currentText().toStdString();
+ keyserver["default_server"] = defaultKeyServer.toStdString();
}
}
void KeyserverTab::refreshTable() {
LOG(INFO) << "Start Refreshing Key Server Table";
- keyServerTable->setRowCount(keyServerStrList.size());
+ ui->keyServerListTable->blockSignals(true);
+ ui->keyServerListTable->setRowCount(keyServerStrList.size());
int index = 0;
for (const auto& server : keyServerStrList) {
- auto* tmp1 = new QTableWidgetItem(QString::number(index));
+ auto* tmp1 =
+ new QTableWidgetItem(server == defaultKeyServer ? "*" : QString{});
tmp1->setTextAlignment(Qt::AlignCenter);
- keyServerTable->setItem(index, 0, tmp1);
+ ui->keyServerListTable->setItem(index, 0, tmp1);
+ tmp1->setFlags(tmp1->flags() ^ Qt::ItemIsEditable);
+
auto* tmp2 = new QTableWidgetItem(server);
tmp2->setTextAlignment(Qt::AlignCenter);
- keyServerTable->setItem(index, 1, tmp2);
- auto* tmp3 = new QTableWidgetItem();
+ ui->keyServerListTable->setItem(index, 1, tmp2);
+
+ auto* tmp3 = new QTableWidgetItem(server.startsWith("https") ? _("true")
+ : _("false"));
tmp3->setTextAlignment(Qt::AlignCenter);
- keyServerTable->setItem(index, 2, tmp3);
+ ui->keyServerListTable->setItem(index, 2, tmp3);
+ tmp3->setFlags(tmp3->flags() ^ Qt::ItemIsEditable);
+
+ auto* tmp4 = new QTableWidgetItem(_("unknown"));
+ tmp4->setTextAlignment(Qt::AlignCenter);
+ ui->keyServerListTable->setItem(index, 3, tmp4);
+ tmp4->setFlags(tmp3->flags() ^ Qt::ItemIsEditable);
index++;
}
+ const auto column_count = ui->keyServerListTable->columnCount();
+ for (int i = 0; i < column_count; i++) {
+ ui->keyServerListTable->resizeColumnToContents(i);
+ }
+ ui->keyServerListTable->blockSignals(false);
+}
+
+void KeyserverTab::slotTestListedKeyServer() {
+ ui->keyServerListTable->blockSignals(true);
+ auto timeout =
+ QInputDialog::getInt(this, _("Set TCP Timeout"), tr("timeout(ms): "),
+ QLineEdit::Normal, 500, 2000);
+
+ const auto row_size = ui->keyServerListTable->rowCount();
+ for (int i = 0; i < row_size; i++) {
+ const auto keyserver = ui->keyServerListTable->item(i, 1)->text();
+ const auto status = ui->keyServerListTable->item(i, 3);
+ if (keyserver == nullptr || status == nullptr) continue;
+
+ auto key_url = QUrl{keyserver};
+
+ LOG(INFO) << "key domain" << key_url.host().toStdString();
+
+ QTcpSocket socket(this);
+ socket.abort();
+ socket.connectToHost(key_url.host(), 80);
+ if (socket.waitForConnected(timeout)) {
+ status->setText(_("Reachable"));
+ status->setForeground(QBrush(QColor::fromRgb(0, 255, 0)));
+ } else {
+ status->setText(_("Not Reachable"));
+ status->setForeground(QBrush(QColor::fromRgb(255, 0, 0)));
+ }
+ socket.close();
+ }
+ ui->keyServerListTable->blockSignals(false);
+}
+void KeyserverTab::contextMenuEvent(QContextMenuEvent* event) {
+ QWidget::contextMenuEvent(event);
+ if (ui->keyServerListTable->selectedItems().length() > 0) {
+ popupMenu->exec(event->globalPos());
+ }
}
} // namespace GpgFrontend::UI