#include "registeraccountdialog.h" #include "../globals.h" #include #include #include RegisterAccountDialog::RegisterAccountDialog(QWidget *parent) : QDialog(parent) { QVBoxLayout *layout = new QVBoxLayout(this); QLabel *lbNickname = new QLabel(tr("Name:")); lbPassword = new QLabel(tr("Password:")); lbRepeatPassword = new QLabel(tr("Repeat password:")); nickname = new QLineEdit(); btRegister = new QPushButton(tr("Create")); #ifndef WIN32 cbUseDevRandom = new QCheckBox(tr("Use /dev/random as random data source")); #endif cbSetPassword = new QCheckBox(tr("Set password for secret key")); password = new QLineEdit(); repeatPassword = new QLineEdit(); lbStatus = new QLabel(tr("Enter your name and press\n \"Create\" to create new Pica Pica certificate")); //btOK = new QPushButton(tr("OK")); password->setEchoMode(QLineEdit::Password); repeatPassword->setEchoMode(QLineEdit::Password); { QFont f; f= lbStatus->font(); f.setBold(true); lbStatus->setFont(f); } layout->addWidget(lbNickname); layout->addWidget(nickname); #ifndef WIN32 layout->addWidget(cbUseDevRandom); #endif layout->addWidget(cbSetPassword); layout->addWidget(lbPassword); layout->addWidget(password); layout->addWidget(lbRepeatPassword); layout->addWidget(repeatPassword); layout->addWidget(btRegister); layout->addWidget(lbStatus); //layout->addWidget(btOK); setLayout(layout); vld = new QRegExpValidator(QRegExp("[^\\#\\$&\"\'=\\(\\)\\\\/\\|`!<>\\{\\}\\[\\]\\+]+"), this); nickname->setValidator(vld); //connect(btOK, SIGNAL(clicked()), this, SLOT(OK())); connect(btRegister, SIGNAL(clicked()), this, SLOT(Register())); connect(cbSetPassword, SIGNAL(clicked()), this, SLOT(setPasswordClick())); #ifndef WIN32 connect(cbUseDevRandom, SIGNAL(clicked()), this, SLOT(useDevRandomClick())); #endif setPasswordClick(); } void RegisterAccountDialog::useDevRandomClick() { #ifndef WIN32 if (cbUseDevRandom->isChecked()) { QMessageBox mbx; mbx.setText(tr("Using /dev/random is more preferable for generating long-term high-value cryptographic keys, but it can take 5 - 10 minutes to collect required amount of entropy. You'll have to press random keys on keyboard and move mouse randomly to provide random data. ")); mbx.exec(); } #endif } void RegisterAccountDialog::setPasswordClick() { if (cbSetPassword->isChecked()) { password -> setDisabled(false); repeatPassword -> setDisabled(false); password->show(); repeatPassword->show(); lbPassword->show(); lbRepeatPassword->show(); } else { password -> setDisabled(true); repeatPassword -> setDisabled(true); password->setHidden(true); repeatPassword->setHidden(true); lbPassword->hide(); lbRepeatPassword->hide(); } adjustSize(); } //void RegisterAccountDialog::OK() //{ // done(0); //} void RegisterAccountDialog::Register() { //check name QString name = nickname->text(); QString rand = QString::null; if (name.toUtf8().size() > 63) //64 bytes - CN length in X509 certificate { QMessageBox mbx; mbx.setText(tr("Name is too long")); mbx.exec(); return; } if (name.isEmpty()) { QMessageBox mbx; mbx.setText(tr("You must enter name for account")); mbx.exec(); return; } if (cbSetPassword->isChecked()) { if (password->text() != repeatPassword->text()) { QMessageBox mbx; mbx.setText(tr("Passwords do not match")); mbx.exec(); return; } } #ifndef WIN32 if (cbUseDevRandom->isChecked()) { rand = "/dev/random"; } cbUseDevRandom -> setDisabled(true); #endif cbSetPassword -> setDisabled(true); //1 lbStatus->setText(tr("1) generating RSA keypair...")); nickname->setEnabled(false); btRegister->setEnabled(false); ost.GenRSAKeySignal(4096, config_dir + QDir::separator() + "privkey.pem", cbSetPassword->isChecked(), password->text(),rand, this, SLOT(stageSignCert(int,QProcess::ExitStatus))); } void RegisterAccountDialog::stageSignCert(int retval,QProcess::ExitStatus) { if (retval != 0) { lbStatus->setText(tr("Error:\n") + ost.ReadStdErr()); return; } lbStatus->setText(tr("2) Signing certificate...")); ost.GenCertSignal(config_dir + QDir::separator() + "cert.pem", config_dir + QDir::separator() + "privkey.pem", password->text(),nickname->text(), this,SLOT(stageFinished(int,QProcess::ExitStatus))); } void RegisterAccountDialog::stageFinished(int retval, QProcess::ExitStatus) { if (retval != 0) { lbStatus->setText(tr("Error:\n") + ost.ReadStdErr()); return; } CertFilename_ = config_dir + QDir::separator() + "cert.pem"; PkeyFilename_ = config_dir + QDir::separator() + "privkey.pem"; done(1); } QString RegisterAccountDialog::GetCertFilename() { return CertFilename_; } QString RegisterAccountDialog::GetPkeyFilename() { return PkeyFilename_; }