diff options
author | Saturneric <[email protected]> | 2021-05-29 19:28:40 +0000 |
---|---|---|
committer | Saturneric <[email protected]> | 2021-05-29 19:28:40 +0000 |
commit | fe67bfb777a79b25149efa3e045dc043dc144ad0 (patch) | |
tree | 4d75a10f210b86d7e116d188569bc08e4e72adb7 /src/ui/keypair_details/KeyPairSubkeyTab.cpp | |
parent | Make eligible keys enter the signature candidate list. (diff) | |
download | GpgFrontend-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 '')
-rw-r--r-- | src/ui/keypair_details/KeyPairSubkeyTab.cpp | 143 |
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); +} |