aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gpg/GpgContext.cpp27
-rw-r--r--src/gpg/GpgKey.cpp5
-rw-r--r--src/gpg/GpgSubKey.cpp5
-rw-r--r--src/ui/KeyList.cpp46
-rwxr-xr-xsrc/ui/KeyMgmt.cpp34
-rw-r--r--src/ui/KeygenDialog.cpp73
6 files changed, 83 insertions, 107 deletions
diff --git a/src/gpg/GpgContext.cpp b/src/gpg/GpgContext.cpp
index d4a523cc..a423cfbf 100644
--- a/src/gpg/GpgContext.cpp
+++ b/src/gpg/GpgContext.cpp
@@ -31,10 +31,10 @@
#include <windows.h>
#endif
-const QVector<QString> GenKeyInfo::SupportedAlgo = {
+const QVector<QString> GenKeyInfo::SupportedKeyAlgo = {
"RSA",
"DSA",
- "ELG"
+ "ED25519"
};
namespace GpgME {
@@ -190,7 +190,7 @@ namespace GpgME {
auto userid_utf8 = params->getUserid().toUtf8();
const char *userid = userid_utf8.constData();
- auto algo_utf8 = (params->getAlgo() + QString::number(params->getKeySize())).toUtf8();
+ auto algo_utf8 = (params->getAlgo() + params->getKeySizeStr()).toUtf8();
const char *algo = algo_utf8.constData();
unsigned long expires = params->getExpired().toTime_t();
unsigned int flags = 0;
@@ -280,24 +280,15 @@ namespace GpgME {
GpgKeyList keys;
//TODO dont run the loop more often than necessary
// list all keys ( the 0 is for all )
+ gpgmeError = gpgme_set_keylist_mode(mCtx, GPGME_KEYLIST_MODE_LOCAL | GPGME_KEYLIST_MODE_WITH_SECRET);
+ checkErr(gpgmeError);
gpgmeError = gpgme_op_keylist_start(mCtx, nullptr, 0);
checkErr(gpgmeError);
while (!(gpgmeError = gpgme_op_keylist_next(mCtx, &key))) {
- GpgKey gpgkey;
-
if (!key->subkeys)
continue;
- gpgkey.id = key->subkeys->keyid;
- gpgkey.fpr = key->subkeys->fpr;
- gpgkey.expired = (key->expired != 0u);
- gpgkey.revoked = (key->revoked != 0u);
-
- if (key->uids) {
- gpgkey.name = QString::fromUtf8(key->uids->name);
- gpgkey.email = QString::fromUtf8(key->uids->email);
- }
- keys.append(gpgkey);
+ keys.append(GpgKey(key));
gpgme_key_unref(key);
}
gpgme_op_keylist_end(mCtx);
@@ -311,7 +302,7 @@ namespace GpgME {
GpgKeyList::iterator it = keys.begin();
while (it != keys.end()) {
if (key->subkeys->keyid == it->id.toStdString())
- it->privkey = true;
+ it->is_private_key = true;
it++;
}
@@ -807,7 +798,7 @@ namespace GpgME {
}
/**
- * note: privkey status is not returned
+ * note: is_private_key status is not returned
*/
GpgKey GpgContext::getKeyByFpr(const QString& fpr) {
@@ -822,7 +813,7 @@ namespace GpgME {
}
/**
- * note: privkey status is not returned
+ * note: is_private_key status is not returned
*/
GpgKey GpgContext::getKeyById(const QString& id) {
diff --git a/src/gpg/GpgKey.cpp b/src/gpg/GpgKey.cpp
new file mode 100644
index 00000000..c2454807
--- /dev/null
+++ b/src/gpg/GpgKey.cpp
@@ -0,0 +1,5 @@
+//
+// Created by eric on 2021/5/21.
+//
+
+#include "gpg/GpgKey.h"
diff --git a/src/gpg/GpgSubKey.cpp b/src/gpg/GpgSubKey.cpp
new file mode 100644
index 00000000..6b0ee3ca
--- /dev/null
+++ b/src/gpg/GpgSubKey.cpp
@@ -0,0 +1,5 @@
+//
+// Created by eric on 2021/5/21.
+//
+
+#include "gpg/GpgSubKey.h"
diff --git a/src/ui/KeyList.cpp b/src/ui/KeyList.cpp
index fa35d882..ab812b22 100644
--- a/src/ui/KeyList.cpp
+++ b/src/ui/KeyList.cpp
@@ -32,16 +32,12 @@ KeyList::KeyList(GpgME::GpgContext *ctx, QWidget *parent)
mCtx = ctx;
mKeyList = new QTableWidget(this);
- mKeyList->setColumnCount(6);
+ mKeyList->setColumnCount(7);
+ mKeyList->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
mKeyList->verticalHeader()->hide();
mKeyList->setShowGrid(false);
- mKeyList->setColumnWidth(0, 24);
- mKeyList->setColumnWidth(1, 20);
mKeyList->sortByColumn(2, Qt::AscendingOrder);
mKeyList->setSelectionBehavior(QAbstractItemView::SelectRows);
- // hide id and fingerprint of key
- mKeyList->setColumnHidden(4, true);
- mKeyList->setColumnHidden(5, true);
// tableitems not editable
mKeyList->setEditTriggers(QAbstractItemView::NoEditTriggers);
@@ -52,7 +48,8 @@ KeyList::KeyList(GpgME::GpgContext *ctx, QWidget *parent)
mKeyList->setAlternatingRowColors(true);
QStringList labels;
- labels << "" << "" << tr("Name") << tr("EMail") << "id" << "fpr";
+ labels << "" << tr("Type") << tr("Name") << tr("Email Address")
+ << tr("Usage") << tr("Validity") << tr("Finger Print");
mKeyList->setHorizontalHeaderLabels(labels);
mKeyList->horizontalHeader()->setStretchLastSection(true);
@@ -81,17 +78,25 @@ void KeyList::slotRefresh()
int row = 0;
GpgKeyList::iterator it = keys.begin();
+ buffered_keys.clear();
+
while (it != keys.end()) {
+ buffered_keys.push_back(*it);
+
auto *tmp0 = new QTableWidgetItem();
tmp0->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
tmp0->setCheckState(Qt::Unchecked);
mKeyList->setItem(row, 0, tmp0);
- if (it->privkey) {
- auto *tmp1 = new QTableWidgetItem(QIcon(":kgpg_key2.png"), "");
+ if (it->is_private_key) {
+ auto *tmp1 = new QTableWidgetItem("pub/sec");
+ mKeyList->setItem(row, 1, tmp1);
+ } else {
+ auto *tmp1 = new QTableWidgetItem("pub");
mKeyList->setItem(row, 1, tmp1);
}
+
auto *tmp2 = new QTableWidgetItem(it->name);
tmp2->setToolTip(it->name);
mKeyList->setItem(row, 2, tmp2);
@@ -105,10 +110,23 @@ void KeyList::slotRefresh()
tmp3->setFont(strike);
}
mKeyList->setItem(row, 3, tmp3);
- auto *tmp4 = new QTableWidgetItem(it->id);
- mKeyList->setItem(row, 4, tmp4);
- auto *tmp5 = new QTableWidgetItem(it->fpr);
- mKeyList->setItem(row, 5, tmp5);
+
+ QString usage;
+ QTextStream usage_steam(&usage);
+
+ if(it->can_certify)
+ usage_steam << "C";
+ if(it->can_encrypt)
+ usage_steam << "E";
+ if(it->can_sign)
+ usage_steam << "S";
+ if(it->can_authenticate)
+ usage_steam << "A";
+
+ auto *temp_usage = new QTableWidgetItem(usage);
+ mKeyList->setToolTip(usage);
+ temp_usage->setTextAlignment(Qt::AlignCenter);
+ mKeyList->setItem(row, 4, temp_usage);
it++;
@@ -123,7 +141,7 @@ QStringList *KeyList::getChecked()
auto *ret = new QStringList();
for (int i = 0; i < mKeyList->rowCount(); i++) {
if (mKeyList->item(i, 0)->checkState() == Qt::Checked) {
- *ret << mKeyList->item(i, 4)->text();
+ *ret << buffered_keys[i].id;
}
}
return ret;
diff --git a/src/ui/KeyMgmt.cpp b/src/ui/KeyMgmt.cpp
index afaaf308..2904dd0c 100755
--- a/src/ui/KeyMgmt.cpp
+++ b/src/ui/KeyMgmt.cpp
@@ -75,6 +75,16 @@ void KeyMgmt::createActions()
closeAct->setToolTip(tr("Close Key Management"));
connect(closeAct, SIGNAL(triggered()), this, SLOT(close()));
+ generateKeyPairAct = new QAction(tr("Generate KeyPair"), this);
+ generateKeyPairAct->setIcon(QIcon(":key_generate.png"));
+ generateKeyPairAct->setToolTip(tr("Generate KeyPair"));
+ connect(generateKeyPairAct, SIGNAL(triggered()), this, SLOT(slotGenerateKeyDialog()));
+
+ generateSubKeyAct = new QAction(tr("Generate SubKey"), this);
+ generateSubKeyAct->setIcon(QIcon(":key_generate.png"));
+ generateSubKeyAct->setToolTip(tr("Generate SubKey Of KeyPair"));
+ connect(generateSubKeyAct, SIGNAL(triggered()), this, SLOT(slotGenerateSubKey()));
+
importKeyFromFileAct = new QAction(tr("&File"), this);
importKeyFromFileAct->setIcon(QIcon(":import_key_from_file.png"));
importKeyFromFileAct->setToolTip(tr("Import New Key From File"));
@@ -109,11 +119,6 @@ void KeyMgmt::createActions()
deleteCheckedKeysAct->setIcon(QIcon(":button_cancel.png"));
connect(deleteCheckedKeysAct, SIGNAL(triggered()), this, SLOT(slotDeleteCheckedKeys()));
- generateKeyDialogAct = new QAction(tr("Generate Key"), this);
- generateKeyDialogAct->setToolTip(tr("Generate New Key"));
- generateKeyDialogAct->setIcon(QIcon(":key_generate.png"));
- connect(generateKeyDialogAct, SIGNAL(triggered()), this, SLOT(slotGenerateKeyDialog()));
-
showKeyDetailsAct = new QAction(tr("Show Keydetails"), this);
showKeyDetailsAct->setToolTip(tr("Show Details for this Key"));
connect(showKeyDetailsAct, SIGNAL(triggered()), this, SLOT(slotShowKeyDetails()));
@@ -125,6 +130,10 @@ void KeyMgmt::createMenus()
fileMenu->addAction(closeAct);
keyMenu = menuBar()->addMenu(tr("&Key"));
+ generateKeyMenu = keyMenu->addMenu(tr("&Generate Key"));
+ generateKeyMenu->addAction(generateKeyPairAct);
+ generateKeyMenu->addAction(generateSubKeyAct);
+
importKeyMenu = keyMenu->addMenu(tr("&Import Key From..."));
importKeyMenu->addAction(importKeyFromFileAct);
importKeyMenu->addAction(importKeyFromClipboardAct);
@@ -133,7 +142,6 @@ void KeyMgmt::createMenus()
keyMenu->addAction(exportKeyToClipboardAct);
keyMenu->addSeparator();
keyMenu->addAction(deleteCheckedKeysAct);
- keyMenu->addAction(generateKeyDialogAct);
}
void KeyMgmt::createToolBars()
@@ -142,6 +150,16 @@ void KeyMgmt::createToolBars()
keyToolBar->setObjectName("keytoolbar");
// add button with popup menu for import
+ auto* generateToolButton = new QToolButton(this);
+ generateToolButton->setMenu(generateKeyMenu);
+ generateToolButton->setPopupMode(QToolButton::InstantPopup);
+ generateToolButton->setIcon(QIcon(":key_generate.png"));
+ generateToolButton->setToolTip(tr("Generate key"));
+ generateToolButton->setText(tr("Generate key"));
+ generateToolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+ keyToolBar->addWidget(generateToolButton);
+
+ // add button with popup menu for import
auto* toolButton = new QToolButton(this);
toolButton->setMenu(importKeyMenu);
toolButton->setPopupMode(QToolButton::InstantPopup);
@@ -291,3 +309,7 @@ void KeyMgmt::closeEvent(QCloseEvent *event)
QMainWindow::closeEvent(event);
}
+
+void KeyMgmt::slotGenerateSubKey() {
+
+}
diff --git a/src/ui/KeygenDialog.cpp b/src/ui/KeygenDialog.cpp
index 6296f8b8..1ebe45f3 100644
--- a/src/ui/KeygenDialog.cpp
+++ b/src/ui/KeygenDialog.cpp
@@ -44,10 +44,10 @@ void KeyGenDialog::generateKeyDialog() {
keySizeSpinBox = new QSpinBox(this);
keyTypeComboBox = new QComboBox(this);
- for(auto &algo : GenKeyInfo::SupportedAlgo) {
+ for(auto &algo : GenKeyInfo::SupportedKeyAlgo) {
keyTypeComboBox->addItem(algo);
}
- if(!GenKeyInfo::SupportedAlgo.isEmpty()) {
+ if(!GenKeyInfo::SupportedKeyAlgo.isEmpty()) {
keyTypeComboBox->setCurrentIndex(0);
}
@@ -63,22 +63,9 @@ void KeyGenDialog::generateKeyDialog() {
expireCheckBox = new QCheckBox(this);
expireCheckBox->setCheckState(Qt::Unchecked);
- passwordEdit = new QLineEdit(this);
- repeatpwEdit = new QLineEdit(this);
-
- passwordEdit->setEchoMode(QLineEdit::Password);
- repeatpwEdit->setEchoMode(QLineEdit::Password);
-
noPassPhraseCheckBox = new QCheckBox(this);
noPassPhraseCheckBox->setCheckState(Qt::Unchecked);
- pwStrengthSlider = new QSlider(this);
- pwStrengthSlider->setOrientation(Qt::Horizontal);
- pwStrengthSlider->setMaximum(6);
- pwStrengthSlider->setDisabled(true);
- pwStrengthSlider->setToolTip(tr("Password Strength"));
- pwStrengthSlider->setTickPosition(QSlider::TicksBelow);
-
auto *vbox1 = new QGridLayout;
vbox1->addWidget(new QLabel(tr("Name:")), 0, 0);
@@ -88,10 +75,7 @@ void KeyGenDialog::generateKeyDialog() {
vbox1->addWidget(new QLabel(tr("Never Expire")), 3, 3);
vbox1->addWidget(new QLabel(tr("KeySize (in Bit):")), 4, 0);
vbox1->addWidget(new QLabel(tr("Key Type:")), 5, 0);
- vbox1->addWidget(new QLabel(tr("Non Pass Phrase")), 6, 3);
- vbox1->addWidget(new QLabel(tr("Pass Phrase:")), 6, 0);
- vbox1->addWidget(new QLabel(tr("Pass Phrase: Strength\nWeak -> Strong")), 7, 3);
- vbox1->addWidget(new QLabel(tr("Repeat Pass Phrase:")), 7, 0);
+ vbox1->addWidget(new QLabel(tr("Non Pass Phrase")), 6, 0);
vbox1->addWidget(nameEdit, 0, 1, 1, 3);
vbox1->addWidget(emailEdit, 1, 1, 1, 3);
@@ -100,10 +84,7 @@ void KeyGenDialog::generateKeyDialog() {
vbox1->addWidget(expireCheckBox, 3, 2);
vbox1->addWidget(keySizeSpinBox, 4, 1);
vbox1->addWidget(keyTypeComboBox, 5, 1);
- vbox1->addWidget(noPassPhraseCheckBox, 6, 2);
- vbox1->addWidget(passwordEdit, 6, 1);
- vbox1->addWidget(repeatpwEdit, 7, 1);
- vbox1->addWidget(pwStrengthSlider, 8, 3);
+ vbox1->addWidget(noPassPhraseCheckBox, 6, 1);
auto *groupGrid = new QGridLayout(this);
groupGrid->addLayout(vbox1, 0, 0);
@@ -136,9 +117,6 @@ void KeyGenDialog::slotKeyGenAccept() {
} if(emailEdit->text().isEmpty() || !check_email_address(emailEdit->text())) {
errorString.append(tr(" Please give a email address. \n"));
}
- if (passwordEdit->text() != repeatpwEdit->text()) {
- errorString.append(tr(" Password and Repeat don't match. "));
- }
/**
* primary keys should have a reasonable expiration date (no more than 2 years in the future)
@@ -157,8 +135,6 @@ void KeyGenDialog::slotKeyGenAccept() {
genKeyInfo.setKeySize(keySizeSpinBox->value());
- genKeyInfo.setPassPhrase(passwordEdit->text());
-
if (expireCheckBox->checkState()) {
genKeyInfo.setNonExpired(true);
} else {
@@ -217,42 +193,6 @@ void KeyGenDialog::slotExpireBoxChanged() {
}
}
-void KeyGenDialog::slotPasswordEditChanged() {
- pwStrengthSlider->setValue(checkPassWordStrength());
- update();
-}
-
-int KeyGenDialog::checkPassWordStrength() {
- int strength = 0;
-
- // increase strength by two, if password has more than 7 characters
- if ((passwordEdit->text()).length() > 7) {
- strength = strength + 2;
- }
-
- // increase strength by one, if password contains a digit
- if ((passwordEdit->text()).contains(QRegExp("\\d"))) {
- strength++;
- }
-
- // increase strength by one, if password contains a lowercase character
- if ((passwordEdit->text()).contains(QRegExp("[a-z]"))) {
- strength++;
- }
-
- // increase strength by one, if password contains an uppercase character
- if ((passwordEdit->text()).contains(QRegExp("[A-Z]"))) {
- strength++;
- }
-
- // increase strength by one, if password contains a non-word character
- if ((passwordEdit->text()).contains(QRegExp("\\W"))) {
- strength++;
- }
-
- return strength;
-}
-
QGroupBox *KeyGenDialog::create_key_usage_group_box() {
auto *groupBox = new QGroupBox(this);
@@ -395,7 +335,6 @@ void KeyGenDialog::set_signal_slot() {
connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
connect(expireCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotExpireBoxChanged()));
- connect(passwordEdit, SIGNAL(textChanged(QString)), this, SLOT(slotPasswordEditChanged()));
connect(keyUsageCheckBoxes[0], SIGNAL(stateChanged(int)), this, SLOT(slotEncryptionBoxChanged(int)));
connect(keyUsageCheckBoxes[1], SIGNAL(stateChanged(int)), this, SLOT(slotSigningBoxChanged(int)));
@@ -407,12 +346,8 @@ void KeyGenDialog::set_signal_slot() {
connect(noPassPhraseCheckBox, &QCheckBox::stateChanged, this, [this](int state) -> void {
if(state == 0) {
genKeyInfo.setNonPassPhrase(false);
- passwordEdit->setDisabled(false);
- repeatpwEdit->setDisabled(false);
} else {
genKeyInfo.setNonPassPhrase(true);
- passwordEdit->setDisabled(true);
- repeatpwEdit->setDisabled(true);
}
});