diff options
Diffstat (limited to 'src/keygendialog.cpp')
-rw-r--r-- | src/keygendialog.cpp | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/src/keygendialog.cpp b/src/keygendialog.cpp new file mode 100644 index 0000000..2aa5f81 --- /dev/null +++ b/src/keygendialog.cpp @@ -0,0 +1,255 @@ +/* + * + * keygendialog.cpp + * + * Copyright 2008 gpg4usb-team <[email protected]> + * + * This file is part of gpg4usb. + * + * Gpg4usb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Gpg4usb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gpg4usb. If not, see <http://www.gnu.org/licenses/> + */ + +#include "keygendialog.h" + +KeyGenDialog::KeyGenDialog(GpgME::GpgContext *ctx, QWidget *parent) + : QDialog(parent) +{ + mCtx = ctx; + buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + + this->setWindowTitle(tr("Generate Key")); + this->setModal(true); + generateKeyDialog(); +} + +void KeyGenDialog::generateKeyDialog() +{ + errorLabel = new QLabel(tr("")); + nameEdit = new QLineEdit(this); + emailEdit = new QLineEdit(this); + commentEdit = new QLineEdit(this); + + keySizeSpinBox = new QSpinBox(this); + keySizeSpinBox->setRange(1024, 4096); + keySizeSpinBox->setValue(2048); + + keySizeSpinBox->setSingleStep(1024); + + keyTypeComboBox = new QComboBox(this); + keyTypeComboBox->addItem("RSA"); + keyTypeComboBox->addItem("DSA/Elgamal"); + keyTypeComboBox->setCurrentIndex(0); + dateEdit = new QDateEdit(QDate::currentDate().addYears(5), this); + dateEdit->setMinimumDate(QDate::currentDate()); + dateEdit->setDisplayFormat("dd/MM/yyyy"); + dateEdit->setCalendarPopup(true); + dateEdit->setEnabled(true); + + expireCheckBox = new QCheckBox(this); + expireCheckBox->setCheckState(Qt::Unchecked); + + passwordEdit = new QLineEdit(this); + repeatpwEdit = new QLineEdit(this); + + passwordEdit->setEchoMode(QLineEdit::Password); + repeatpwEdit->setEchoMode(QLineEdit::Password); + + pwStrengthSlider = new QSlider(this); + pwStrengthSlider->setOrientation(Qt::Horizontal); + pwStrengthSlider->setMaximum(6); + pwStrengthSlider->setDisabled(true); + pwStrengthSlider->setToolTip(tr("Password Strength")); + pwStrengthSlider->setTickPosition(QSlider::TicksBelow); + + QGridLayout *vbox1 = new QGridLayout; + + vbox1->addWidget(new QLabel(tr("Name:")), 0, 0); + vbox1->addWidget(new QLabel(tr("E-Mailaddress:")), 1, 0); + vbox1->addWidget(new QLabel(tr("Comment:")), 2, 0); + vbox1->addWidget(new QLabel(tr("Expiration Date:")), 3, 0); + 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("Password:")), 6, 0); + vbox1->addWidget(new QLabel(tr("Password: Strength\nWeak -> Strong")), 6, 3); + vbox1->addWidget(new QLabel(tr("Repeat Password:")), 7, 0); + + vbox1->addWidget(nameEdit, 0, 1); + vbox1->addWidget(emailEdit, 1, 1); + vbox1->addWidget(commentEdit, 2, 1); + vbox1->addWidget(dateEdit, 3, 1); + vbox1->addWidget(expireCheckBox, 3, 2); + vbox1->addWidget(keySizeSpinBox, 4, 1); + vbox1->addWidget(keyTypeComboBox,5, 1); + vbox1->addWidget(passwordEdit, 6, 1); + vbox1->addWidget(repeatpwEdit, 7, 1); + vbox1->addWidget(pwStrengthSlider, 7, 3); + + QWidget *nameList = new QWidget(this); + nameList->setLayout(vbox1); + + QVBoxLayout *vbox2 = new QVBoxLayout(); + vbox2->addWidget(nameList); + vbox2->addWidget(errorLabel); + vbox2->addWidget(buttonBox); + + connect(buttonBox, SIGNAL(accepted()), this, SLOT(slotKeyGenAccept())); + connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + + connect(expireCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotExpireBoxChanged())); + connect(passwordEdit, SIGNAL(textChanged(QString)), this, SLOT(slotPasswordEditChanged())); +// connect(keyTypeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotKeyTypeChanged())); +// connect(keySizeSpinBox, SIGNAL(valueChanged(int)), this, SLOT(slotKeySizeChanged())); + this->setLayout(vbox2); +} + +void KeyGenDialog::slotKeyGenAccept() +{ + QString errorString = ""; + QString keyGenParams = ""; + /** + * check for errors in keygen dialog input + */ + if ((nameEdit->text()).size() < 5) { + errorString.append(tr(" Name must contain at least five characters. \n")); + } + if (passwordEdit->text() != repeatpwEdit->text()) { + errorString.append(tr(" Password and Repeat don't match. ")); + } + + if (errorString.isEmpty()) { + /** + * create the string for key generation + */ + + if(keyTypeComboBox->currentText() == "RSA") { + keyGenParams = "<GnupgKeyParms format=\"internal\">\n" + "Key-Type: RSA\n" + "Key-Usage: sign\n" + "Key-Length: " + keySizeSpinBox->cleanText() + "\n" + "Subkey-Type: RSA\n" + "Subkey-Length: " + keySizeSpinBox->cleanText() + "\n" + "Subkey-Usage: encrypt\n"; + } else { + keyGenParams = "<GnupgKeyParms format=\"internal\">\n" + "Key-Type: DSA\n" + "Key-Length: " + keySizeSpinBox->cleanText() + "\n" + "Subkey-Type: ELG-E\n" + "Subkey-Length: " + keySizeSpinBox->cleanText() + "\n"; + } + + keyGenParams += "Name-Real: " + nameEdit->text().toUtf8() + "\n"; + if (!(commentEdit->text().isEmpty())) { + keyGenParams += "Name-Comment: " + commentEdit->text().toUtf8() + "\n"; + } + if (!(emailEdit->text().isEmpty())) { + keyGenParams += "Name-Email: " + emailEdit->text().toUtf8() + "\n"; + } + if (expireCheckBox->checkState()) { + keyGenParams += "Expire-Date: 0\n"; + } else { + keyGenParams += "Expire-Date: " + dateEdit->sectionText(QDateTimeEdit::YearSection) + "-" + dateEdit->sectionText(QDateTimeEdit::MonthSection) + "-" + dateEdit->sectionText(QDateTimeEdit::DaySection) + "\n"; + } + if (!(passwordEdit->text().isEmpty())) { + keyGenParams += "Passphrase: " + passwordEdit->text() + "\n"; + } + keyGenParams += "</GnupgKeyParms>"; + + KeyGenThread *kg = new KeyGenThread(keyGenParams, mCtx); + kg->start(); + + this->accept(); + + QDialog *dialog = new QDialog(this, Qt::CustomizeWindowHint | Qt::WindowTitleHint); + dialog->setModal(true); + dialog->setWindowTitle(tr("Generating Key...")); + + QLabel *waitMessage = new QLabel(tr("Collecting random data for key generation.\n This may take a while.\n To speed up the process use your computer\n (e.g. browse the net, listen to music,...)")); + QProgressBar *pb = new QProgressBar(); + pb->setRange(0, 0); + + QVBoxLayout *layout = new QVBoxLayout(dialog); + layout->addWidget(waitMessage); + layout->addWidget(pb); + dialog->setLayout(layout); + + dialog->show(); + + while (kg->isRunning()) { + QCoreApplication::processEvents(); + } + + dialog->close(); + QMessageBox::information(0,tr("Success"),tr("New key created")); + } else { + /** + * create error message + */ + errorLabel->setAutoFillBackground(true); + QPalette error = errorLabel->palette(); + error.setColor(QPalette::Background, "#ff8080"); + errorLabel->setPalette(error); + errorLabel->setText(errorString); + + this->show(); + } +} + +void KeyGenDialog::slotExpireBoxChanged() +{ + if (expireCheckBox->checkState()) { + dateEdit->setEnabled(false); + } else { + dateEdit->setEnabled(true); + } +} + +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; +} + |