/*
(c) Copyright 2012 - 2018 Anton Sviridenko
https://picapica.im
This program 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.
This program 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 this program. If not, see .
*/
#include "registeraccountdialog.h"
#include "../globals.h"
#include
#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 a random data source"));
#endif
cbSetPassword = new QCheckBox(tr("Set passphrase for the 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 account name"));
mbx.exec();
return;
}
if (cbSetPassword->isChecked())
{
if (password->text() != repeatPassword->text())
{
QMessageBox mbx;
mbx.setText(tr("Passphrases 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(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;
}
QFile::setPermissions(config_dir + QDir::separator() + "privkey.pem", QFile::ReadOwner | QFile::WriteOwner);
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_;
}