aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gpg/GpgContext.cpp30
-rw-r--r--src/gpg/Signature.cpp2
-rw-r--r--src/gpg/UID.cpp1
-rw-r--r--src/ui/keypair_details/KeyPairUIDTab.cpp66
-rw-r--r--src/ui/keypair_details/KeySignDialog.cpp22
-rw-r--r--src/ui/widgets/KeyList.cpp49
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]);
}
}