diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gpg/GpgContext.cpp | 30 | ||||
-rw-r--r-- | src/gpg/Signature.cpp | 2 | ||||
-rw-r--r-- | src/gpg/UID.cpp | 1 | ||||
-rw-r--r-- | src/ui/keypair_details/KeyPairUIDTab.cpp | 66 | ||||
-rw-r--r-- | src/ui/keypair_details/KeySignDialog.cpp | 22 | ||||
-rw-r--r-- | src/ui/widgets/KeyList.cpp | 49 |
6 files changed, 111 insertions, 59 deletions
diff --git a/src/gpg/GpgContext.cpp b/src/gpg/GpgContext.cpp index 3e1f59c1..e665fdea 100644 --- a/src/gpg/GpgContext.cpp +++ b/src/gpg/GpgContext.cpp @@ -99,6 +99,7 @@ namespace GpgME { } connect(this, SIGNAL(signalKeyDBChanged()), this, SLOT(slotRefreshKeyList()), Qt::DirectConnection); + connect(this, SIGNAL(signalKeyUpdated(QString)), this, SLOT(slotUpdateKeyList(QString))); slotRefreshKeyList(); } @@ -268,7 +269,12 @@ namespace GpgME { auto &keys = mKeyList; auto &keys_map = mKeyMap; - gpgmeError = gpgme_set_keylist_mode(mCtx, GPGME_KEYLIST_MODE_LOCAL | GPGME_KEYLIST_MODE_WITH_SECRET); + gpgmeError = gpgme_set_keylist_mode(mCtx, + GPGME_KEYLIST_MODE_LOCAL + | GPGME_KEYLIST_MODE_WITH_SECRET + | GPGME_KEYLIST_MODE_SIGS + | GPGME_KEYLIST_MODE_SIG_NOTATIONS + | GPGME_KEYLIST_MODE_WITH_TOFU); if (gpg_err_code(gpgmeError) != GPG_ERR_NO_ERROR) { checkErr(gpgmeError); return; @@ -871,7 +877,7 @@ namespace GpgME { return QString(gpgme_check_version(nullptr)); } - void GpgContext::signKey(const GpgKey &target, const QString &uid, const QDateTime *expires) { + bool GpgContext::signKey(const GpgKey &target, const QString &uid, const QDateTime *expires) { unsigned int flags = 0; @@ -885,9 +891,13 @@ namespace GpgME { auto gpgmeError = gpgme_op_keysign(mCtx, target.key_refer, uid.toUtf8().constData(), expires_time_t, flags); - checkErr(gpgmeError); - - emit signalKeyUpdated(target.id); + if(gpgmeError == GPG_ERR_NO_ERROR) { + emit signalKeyUpdated(target.id); + return true; + } else { + checkErr(gpgmeError); + return false; + } } const GpgKeyList &GpgContext::getKeys() const { @@ -913,14 +923,16 @@ namespace GpgME { gpgme_signers_clear(mCtx); unsigned int count = 0; for (const auto &key : keys) { - count = gpgme_signers_add(mCtx, key.key_refer); + auto gpgmeError = gpgme_signers_add(mCtx, key.key_refer); + checkErr(gpgmeError); + gpgme_key_unref(key.key_refer); } - if (keys.length() != count) { - qDebug() << "Now All Keys Added"; + if (keys.length() != gpgme_signers_count(mCtx)) { + qDebug() << "No All Keys Added"; } } - void GpgContext::slotUpdateKeyList(const QString &key_id) { + void GpgContext::slotUpdateKeyList(QString key_id) { auto it = mKeyMap.find(key_id); if (it != mKeyMap.end()) { it.value()->parse(it.value()->key_refer); diff --git a/src/gpg/Signature.cpp b/src/gpg/Signature.cpp index f9762501..8e82c507 100644 --- a/src/gpg/Signature.cpp +++ b/src/gpg/Signature.cpp @@ -27,7 +27,7 @@ Signature::Signature(gpgme_key_sig_t key_sig) : revoked(key_sig->revoked), expired(key_sig->expired), invalid(key_sig->invalid), exportable(key_sig->exportable), pubkey_algo(gpgme_pubkey_algo_name(key_sig->pubkey_algo)), - name(key_sig->name), email(key_sig->email), comment(key_sig->comment), + uid(key_sig->uid), name(key_sig->name), email(key_sig->email), comment(key_sig->comment), create_time(QDateTime::fromTime_t(key_sig->timestamp)), expire_time(QDateTime::fromTime_t(key_sig->expires)){ } diff --git a/src/gpg/UID.cpp b/src/gpg/UID.cpp index a1147eec..62632e8f 100644 --- a/src/gpg/UID.cpp +++ b/src/gpg/UID.cpp @@ -11,6 +11,7 @@ UID::UID(gpgme_user_id_t user_id) : while (sig != nullptr) { signatures.push_back(Signature(sig)); + sig = sig->next; } }
\ No newline at end of file diff --git a/src/ui/keypair_details/KeyPairUIDTab.cpp b/src/ui/keypair_details/KeyPairUIDTab.cpp index f9f4d496..e10912fc 100644 --- a/src/ui/keypair_details/KeyPairUIDTab.cpp +++ b/src/ui/keypair_details/KeyPairUIDTab.cpp @@ -10,36 +10,38 @@ KeyPairUIDTab::KeyPairUIDTab(GpgME::GpgContext *ctx, const GpgKey &key, QWidget createUIDList(); createSignList(); + createManageUIDMenu(); auto uidButtonsLayout = new QGridLayout(); auto addUIDButton = new QPushButton(tr("New UID")); auto manageUIDButton = new QPushButton(tr("Manage UID")); + manageUIDButton->setMenu(manageUIDMenu); + uidButtonsLayout->addWidget(addUIDButton, 0, 1); uidButtonsLayout->addWidget(manageUIDButton, 0, 2); - auto sigButtonsLayout = new QGridLayout(); - - auto addSigButton = new QPushButton("New Signature"); - auto manageSigButton = new QPushButton(tr("Manage Signature")); - - sigButtonsLayout->addWidget(addSigButton, 0, 1); - sigButtonsLayout->addWidget(manageSigButton, 0, 2); +// auto sigButtonsLayout = new QGridLayout(); +// auto manageSigButton = new QPushButton(tr("Manage Signature")); +// +// sigButtonsLayout->addWidget(addSigButton, 0, 1); +// sigButtonsLayout->addWidget(manageSigButton, 0, 2); auto gridLayout = new QGridLayout(); gridLayout->addWidget(uidList, 0, 0); gridLayout->addLayout(uidButtonsLayout, 1, 0); gridLayout->addWidget(sigList, 2, 0); - gridLayout->addLayout(sigButtonsLayout, 3, 0); +// gridLayout->addLayout(sigButtonsLayout, 3, 0); setLayout(gridLayout); connect(mCtx, SIGNAL(signalKeyDBChanged()), this, SLOT(slotRefreshUIDList())); connect(mCtx, SIGNAL(signalKeyDBChanged()), this, SLOT(slotRefreshSigList())); - connect(addSigButton, SIGNAL(clicked(bool)), this, SLOT(slotAddSign())); + connect(uidList, SIGNAL(itemSelectionChanged()), this, SLOT(slotRefreshSigList())); +// connect(addSigButton, SIGNAL(clicked(bool)), this, SLOT(slotAddSign())); slotRefreshUIDList(); slotRefreshSigList(); @@ -52,6 +54,7 @@ void KeyPairUIDTab::createUIDList() { uidList->verticalHeader()->hide(); uidList->setShowGrid(false); uidList->setSelectionBehavior(QAbstractItemView::SelectRows); + uidList->setSelectionMode( QAbstractItemView::SingleSelection ); // tableitems not editable uidList->setEditTriggers(QAbstractItemView::NoEditTriggers); @@ -69,7 +72,7 @@ void KeyPairUIDTab::createUIDList() { void KeyPairUIDTab::createSignList() { sigList = new QTableWidget(this); - sigList->setColumnCount(5); + sigList->setColumnCount(4); sigList->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); sigList->verticalHeader()->hide(); sigList->setShowGrid(false); @@ -84,7 +87,7 @@ void KeyPairUIDTab::createSignList() { sigList->setAlternatingRowColors(true); QStringList labels; - labels << tr("Type") << tr("Name") << tr("Pubkey Id") << tr("Create Time") << tr("Valid Time"); + labels << tr("Type") << tr("Pubkey Id") << tr("Create Time") << tr("Valid Time"); sigList->setHorizontalHeaderLabels(labels); sigList->horizontalHeader()->setStretchLastSection(true); @@ -120,40 +123,36 @@ void KeyPairUIDTab::slotRefreshUIDList() { } void KeyPairUIDTab::slotRefreshSigList() { - int row = 0; sigList->clearContents(); - for(const auto& uid : mKey.uids) { - row += uid.signatures.size(); - } - sigList->setRowCount(row); - - row = 0; + int row = 0; for(const auto& uid : mKey.uids) { // Only Show Selected UID's Signatures if(!uidList->item(row, 0)->isSelected()) continue; + sigList->setRowCount(uid.signatures.size()); + for(const auto &sig : uid.signatures) { auto *tmp0 = new QTableWidgetItem(sig.pubkey_algo); - uidList->setItem(row, 0, tmp0); - - auto *tmp1 = new QTableWidgetItem(sig.name); - uidList->setItem(row, 1, tmp1); + sigList->setItem(row, 0, tmp0); auto *tmp2 = new QTableWidgetItem(sig.uid); - uidList->setItem(row, 2, tmp2); + sigList->setItem(row, 1, tmp2); auto *tmp3 = new QTableWidgetItem(sig.create_time.toString()); - uidList->setItem(row, 3, tmp3); + sigList->setItem(row, 2, tmp3); auto *tmp4 = new QTableWidgetItem(sig.expire_time.toString()); - uidList->setItem(row, 4, tmp4); + sigList->setItem(row, 3, tmp4); row++; } + + break; + } } @@ -163,6 +162,13 @@ void KeyPairUIDTab::slotAddSign() { getUIDChecked(selected_uids); + if(selected_uids.isEmpty()) { + auto emptyUIDMsg = new QMessageBox(); + emptyUIDMsg->setText("Please select one or more UIDs before doing this operation."); + emptyUIDMsg->exec(); + return; + } + auto keySignDialog = new KeySignDialog(mCtx, mKey, selected_uids, this); keySignDialog->show(); } @@ -177,3 +183,13 @@ void KeyPairUIDTab::getUIDChecked(QVector<UID> &selected_uids) { } } } + +void KeyPairUIDTab::createManageUIDMenu() { + + manageUIDMenu = new QMenu(this); + + auto *signUIDAct = new QAction(tr("Sign Selected UID(s)"), this); + connect(signUIDAct, SIGNAL(triggered()), this, SLOT(slotAddSign())); + + manageUIDMenu->addAction(signUIDAct); +} diff --git a/src/ui/keypair_details/KeySignDialog.cpp b/src/ui/keypair_details/KeySignDialog.cpp index 5a9b9118..e9ac9476 100644 --- a/src/ui/keypair_details/KeySignDialog.cpp +++ b/src/ui/keypair_details/KeySignDialog.cpp @@ -5,7 +5,7 @@ #include "ui/keypair_details/KeySignDialog.h" KeySignDialog::KeySignDialog(GpgME::GpgContext *ctx, const GpgKey &key, const QVector<UID> &uid, QWidget *parent) : - mCtx(ctx), mUids(uid), QDialog(parent), mKey(key) { + mKey(key), mCtx(ctx), mUids(uid), QDialog(parent) { mKeyList = new KeyList(ctx, KeyListRow::ONLY_SECRET_KEY, @@ -47,18 +47,30 @@ KeySignDialog::KeySignDialog(GpgME::GpgContext *ctx, const GpgKey &key, const QV timeLayout->addWidget(nonExpireCheck, 0, 2); layout->addLayout(timeLayout, 1, 0); + connect(signKeyButton, SIGNAL(clicked(bool)), this, SLOT(slotSignKey(bool))); + this->setLayout(layout); this->setModal(true); - this->setWindowTitle(tr("Sign For Key's UID")); + this->setWindowTitle(tr("Sign For Key's UID(s)")); this->adjustSize(); } -void KeySignDialog::slotSignKey() { +void KeySignDialog::slotSignKey(bool clicked) { + QVector<GpgKey> keys; mKeyList->getCheckedKeys(keys); mCtx->setSigners(keys); const auto expires = expiresEdit->dateTime(); - for(const auto &uid : mUids) - mCtx->signKey(mKey, uid.uid, &expires); + for(const auto &uid : mUids) { + for(const auto &key : keys) { + if (!mCtx->signKey(mKey, uid.uid, &expires)) { + auto msg = QMessageBox(); + msg.setText(QString("%1 <%2> failed to sign.").arg(key.name, key.email)); + msg.exec(); + } + } + } + + this->close(); } diff --git a/src/ui/widgets/KeyList.cpp b/src/ui/widgets/KeyList.cpp index 2fdec43e..0e59c9a0 100644 --- a/src/ui/widgets/KeyList.cpp +++ b/src/ui/widgets/KeyList.cpp @@ -34,6 +34,7 @@ KeyList::KeyList(GpgME::GpgContext *ctx, { mCtx = ctx; + mKeyList = new QTableWidget(this); mKeyList->setColumnCount(7); mKeyList->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); @@ -98,38 +99,47 @@ void KeyList::slotRefresh() mKeyList->clearContents(); GpgKeyList keys = mCtx->getKeys(); - mKeyList->setRowCount(keys.size()); - int row = 0; - GpgKeyList::iterator it = keys.begin(); - buffered_keys.clear(); + auto it = keys.begin(); - while (it != keys.end()) { + int row_count = 0; - if(mSelectType == KeyListRow::ONLY_SECRET_KEY && !it->is_private_key) { - it++; + while (it != keys.end()) { + if (mSelectType == KeyListRow::ONLY_SECRET_KEY && !it->is_private_key) { + it = keys.erase(it); continue; } + row_count++; + it++; + } + + mKeyList->setRowCount(row_count); + + int row_index = 0; + it = keys.begin(); + buffered_keys.clear(); + + while (it != keys.end()) { buffered_keys.push_back(*it); - auto *tmp0 = new QTableWidgetItem(QString::number(row)); + auto *tmp0 = new QTableWidgetItem(QString::number(row_index)); tmp0->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); tmp0->setTextAlignment(Qt::AlignCenter); tmp0->setCheckState(Qt::Unchecked); - mKeyList->setItem(row, 0, tmp0); + mKeyList->setItem(row_index, 0, tmp0); if (it->is_private_key) { auto *tmp1 = new QTableWidgetItem("pub/sec"); - mKeyList->setItem(row, 1, tmp1); + mKeyList->setItem(row_index, 1, tmp1); } else { auto *tmp1 = new QTableWidgetItem("pub"); - mKeyList->setItem(row, 1, tmp1); + mKeyList->setItem(row_index, 1, tmp1); } auto *tmp2 = new QTableWidgetItem(it->name); tmp2->setToolTip(it->name); - mKeyList->setItem(row, 2, tmp2); + mKeyList->setItem(row_index, 2, tmp2); auto *tmp3 = new QTableWidgetItem(it->email); tmp3->setToolTip(it->email); // strike out expired keys @@ -139,7 +149,7 @@ void KeyList::slotRefresh() tmp2->setFont(strike); tmp3->setFont(strike); } - mKeyList->setItem(row, 3, tmp3); + mKeyList->setItem(row_index, 3, tmp3); QString usage; QTextStream usage_steam(&usage); @@ -155,20 +165,21 @@ void KeyList::slotRefresh() auto *temp_usage = new QTableWidgetItem(usage); temp_usage->setTextAlignment(Qt::AlignCenter); - mKeyList->setItem(row, 4, temp_usage); + mKeyList->setItem(row_index, 4, temp_usage); auto *temp_validity = new QTableWidgetItem(it->owner_trust); temp_validity->setTextAlignment(Qt::AlignCenter); - mKeyList->setItem(row, 5, temp_validity); + mKeyList->setItem(row_index, 5, temp_validity); auto *temp_fpr = new QTableWidgetItem(it->fpr); temp_fpr->setTextAlignment(Qt::AlignCenter); - mKeyList->setItem(row, 6, temp_fpr); + mKeyList->setItem(row_index, 6, temp_fpr); it++; - ++row; + ++row_index; } - // mKeyList->setSortingEnabled(true); + + setChecked(keyList); } @@ -391,7 +402,7 @@ void KeyList::getCheckedKeys(QVector<GpgKey> &keys) { keys.clear(); for (int i = 0; i < mKeyList->rowCount(); i++) { - if (mKeyList->item(i, 0)->isSelected() == 1) { + if (mKeyList->item(i, 0)->checkState() == Qt::Checked) { keys.push_back(buffered_keys[i]); } } |