aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/keypair_details/KeyPairSubkeyTab.cpp
diff options
context:
space:
mode:
authorSaturneric <[email protected]>2021-05-29 19:28:40 +0000
committerSaturneric <[email protected]>2021-05-29 19:28:40 +0000
commitfe67bfb777a79b25149efa3e045dc043dc144ad0 (patch)
tree4d75a10f210b86d7e116d188569bc08e4e72adb7 /src/ui/keypair_details/KeyPairSubkeyTab.cpp
parentMake eligible keys enter the signature candidate list. (diff)
downloadGpgFrontend-fe67bfb777a79b25149efa3e045dc043dc144ad0.tar.gz
GpgFrontend-fe67bfb777a79b25149efa3e045dc043dc144ad0.zip
New page and function for generating subkeys.
Define the interface and functions of the subkey management tab. When there is an item in the UID list, the first item is selected by default. Compile the API for generating sub-keys and the corresponding calling thread. Set GpgGenKeyInfo to apply to the subkey Generate a subkey for the selected key pair of the management key pair interface. Adjust the project structure and add a new classification key generation category. Double-click the item in KeyList in the key pair management interface to enter the key details page. Adjust the title of the key pair management interface. Optimize part of the code of KeyGenThread. Signed-off-by: Saturneric <[email protected]>
Diffstat (limited to 'src/ui/keypair_details/KeyPairSubkeyTab.cpp')
-rw-r--r--src/ui/keypair_details/KeyPairSubkeyTab.cpp143
1 files changed, 142 insertions, 1 deletions
diff --git a/src/ui/keypair_details/KeyPairSubkeyTab.cpp b/src/ui/keypair_details/KeyPairSubkeyTab.cpp
index 2f2a49cf..a67c119e 100644
--- a/src/ui/keypair_details/KeyPairSubkeyTab.cpp
+++ b/src/ui/keypair_details/KeyPairSubkeyTab.cpp
@@ -24,14 +24,72 @@
#include "ui/keypair_details/KeyPairSubkeyTab.h"
-KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QWidget *parent) : mCtx(ctx), key(key), QWidget(parent) {
+KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QWidget *parent) : mCtx(ctx), mKey(key), QWidget(parent) {
+ creatSubkeyList();
+
+ listBox = new QGroupBox("Subkey List");
+ detailBox = new QGroupBox("Detail of Selected Subkey");
+
+ auto uidButtonsLayout = new QGridLayout();
+
+ auto addSubkeyButton = new QPushButton(tr("Add New Subkey"));
+ if(!mKey.is_private_key) {
+ addSubkeyButton->setDisabled(true);
+ setHidden(addSubkeyButton);
+ }
+
+ uidButtonsLayout->addWidget(addSubkeyButton, 0, 1);
+
+ auto *baseLayout = new QVBoxLayout();
+
+ auto subkeyListLayout = new QGridLayout();
+ subkeyListLayout->addWidget(subkeyList, 0, 0);
+ subkeyListLayout->addLayout(uidButtonsLayout, 1, 0);
+
+ auto *subkeyDetailLayout = new QGridLayout();
+
+ subkeyDetailLayout->addWidget(new QLabel(tr("Key ID: ")), 0, 0);
+ subkeyDetailLayout->addWidget(new QLabel(tr("Algorithm: ")), 1, 0);
+ subkeyDetailLayout->addWidget(new QLabel(tr("Key size:")), 2, 0);
+ subkeyDetailLayout->addWidget(new QLabel(tr("Usage: ")), 3, 0);
+ subkeyDetailLayout->addWidget(new QLabel(tr("Expires on: ")), 4, 0);
+ subkeyDetailLayout->addWidget(new QLabel(tr("Last Update: ")), 5, 0);
+
+ keyidVarLabel = new QLabel();
+ keySizeVarLabel = new QLabel();
+ expireVarLabel = new QLabel();
+ algorithmVarLabel = new QLabel();
+ createdVarLabel = new QLabel();
+ usageVarLabel = new QLabel();
+
+ subkeyDetailLayout->addWidget(keyidVarLabel, 0, 1);
+ subkeyDetailLayout->addWidget(keySizeVarLabel, 2, 1);
+ subkeyDetailLayout->addWidget(expireVarLabel, 4, 1);
+ subkeyDetailLayout->addWidget(algorithmVarLabel, 1, 1);
+ subkeyDetailLayout->addWidget(createdVarLabel, 5, 1);
+ subkeyDetailLayout->addWidget(usageVarLabel, 3, 1);
+
+ listBox->setLayout(subkeyListLayout);
+ detailBox->setLayout(subkeyDetailLayout);
+
+ baseLayout->addWidget(listBox);
+ baseLayout->addWidget(detailBox);
+
+ connect(addSubkeyButton, SIGNAL(clicked(bool)), this, SLOT(slotAddSubkey()));
+ connect(mCtx, SIGNAL(signalKeyInfoChanged()), this, SLOT(slotRefreshSubkeyList()));
+ connect(subkeyList, SIGNAL(itemSelectionChanged()), this, SLOT(slotRefreshSubkeyDetail()));
+
+ setLayout(baseLayout);
setAttribute(Qt::WA_DeleteOnClose, true);
+ slotRefreshSubkeyList();
+
}
void KeyPairSubkeyTab::creatSubkeyList() {
subkeyList = new QTableWidget(this);
+
subkeyList->setColumnCount(5);
subkeyList->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
subkeyList->verticalHeader()->hide();
@@ -52,3 +110,86 @@ void KeyPairSubkeyTab::creatSubkeyList() {
subkeyList->setHorizontalHeaderLabels(labels);
subkeyList->horizontalHeader()->setStretchLastSection(true);
}
+
+void KeyPairSubkeyTab::slotRefreshSubkeyList() {
+ int row = 0;
+
+ subkeyList->setSelectionMode(QAbstractItemView::SingleSelection);
+
+ this->buffered_subkeys.clear();
+
+ for(const auto &subkeys : mKey.subKeys) {
+ if(subkeys.disabled || subkeys.revoked) {
+ continue;
+ }
+ this->buffered_subkeys.push_back(&subkeys);
+ }
+
+ subkeyList->setRowCount(buffered_subkeys.size());
+
+ for(const auto& subkeys : buffered_subkeys) {
+
+ auto *tmp0 = new QTableWidgetItem(subkeys->id);
+ tmp0->setTextAlignment(Qt::AlignCenter);
+ subkeyList->setItem(row, 0, tmp0);
+
+ auto *tmp1 = new QTableWidgetItem(QString::number(subkeys->length));
+ tmp1->setTextAlignment(Qt::AlignCenter);
+ subkeyList->setItem(row, 1, tmp1);
+
+ auto *tmp2 = new QTableWidgetItem(subkeys->pubkey_algo);
+ tmp2->setTextAlignment(Qt::AlignCenter);
+ subkeyList->setItem(row, 2, tmp2);
+
+ auto *tmp3= new QTableWidgetItem(subkeys->timestamp.toString());
+ tmp3->setTextAlignment(Qt::AlignCenter);
+ subkeyList->setItem(row, 3, tmp3);
+
+ auto *tmp4= new QTableWidgetItem(subkeys->expires.toString());
+ tmp4->setTextAlignment(Qt::AlignCenter);
+ subkeyList->setItem(row, 4, tmp4);
+
+ row++;
+ }
+
+ if(subkeyList->rowCount() > 0) {
+ subkeyList->selectRow(0);
+ }
+}
+
+void KeyPairSubkeyTab::slotAddSubkey() {
+ auto dialog = new SubkeyGenerateDialog(mCtx, mKey, this);
+ dialog->show();
+}
+
+void KeyPairSubkeyTab::slotRefreshSubkeyDetail() {
+
+ int row = 0;
+
+ for(int i = 0 ; i < subkeyList->rowCount(); i++) {
+ if(subkeyList->item(row, 0)->isSelected()) break;
+ row++;
+ }
+
+ auto key = buffered_subkeys[row];
+
+ keyidVarLabel->setText(key->id);
+ keySizeVarLabel->setText(QString::number(key->length));
+ expireVarLabel->setText(key->expires.toString());
+ algorithmVarLabel->setText(key->pubkey_algo);
+ createdVarLabel->setText(key->timestamp.toString());
+
+ QString usage;
+ QTextStream usage_steam(&usage);
+
+ if(key->can_certify)
+ usage_steam << "Cert ";
+ if(key->can_encrypt)
+ usage_steam << "Encr ";
+ if(key->can_sign)
+ usage_steam << "Sign ";
+ if(key->can_authenticate)
+ usage_steam << "Auth ";
+
+ usageVarLabel->setText(usage);
+}