diff options
| author | me_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac> | 2012-07-22 12:00:06 +0000 |
|---|---|---|
| committer | me_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac> | 2012-07-22 12:00:06 +0000 |
| commit | c7323aafac1769cb809da3f1d7ddd05383ace641 (patch) | |
| tree | ddd736fbbe600d6eacc1f324d98a3c3064244b89 /pica-client/dialogs/registeraccountdialog.cpp | |
| parent | f190872a4ab94577d1d9db343c0ca7643f40eae6 (diff) | |
| download | pica-pica-c7323aafac1769cb809da3f1d7ddd05383ace641.tar.gz pica-pica-c7323aafac1769cb809da3f1d7ddd05383ace641.zip | |
1) Automatic account registration implemented;
2) All openssl command line tools invocations moved to new class OpenSSLTool
git-svn-id: svn://localhost/project_picapica/trunk@150 fb96df88-216d-11de-830c-f3023f12d8ac
Diffstat (limited to 'pica-client/dialogs/registeraccountdialog.cpp')
| -rw-r--r-- | pica-client/dialogs/registeraccountdialog.cpp | 116 |
1 files changed, 115 insertions, 1 deletions
diff --git a/pica-client/dialogs/registeraccountdialog.cpp b/pica-client/dialogs/registeraccountdialog.cpp index b091a5f..1ce1cdb 100644 --- a/pica-client/dialogs/registeraccountdialog.cpp +++ b/pica-client/dialogs/registeraccountdialog.cpp @@ -1,5 +1,9 @@ #include "registeraccountdialog.h" +#include "globals.h" #include <QVBoxLayout> +#include <QDir> +#include <QMessageBox> + RegisterAccountDialog::RegisterAccountDialog(QWidget *parent) : QDialog(parent) @@ -9,9 +13,16 @@ RegisterAccountDialog::RegisterAccountDialog(QWidget *parent) : QLabel *lbNickname = new QLabel(tr("Name:")); nickname = new QLineEdit(); btRegister = new QPushButton(tr("Register")); - lbStatus = new QLabel(); + lbStatus = new QLabel(tr("Enter your name and press\n \"Register\" to get certificate")); btOK = new QPushButton(tr("OK")); + { + QFont f; + f= lbStatus->font(); + f.setBold(true); + lbStatus->setFont(f); + } + layout->addWidget(lbNickname); layout->addWidget(nickname); layout->addWidget(btRegister); @@ -20,16 +31,119 @@ RegisterAccountDialog::RegisterAccountDialog(QWidget *parent) : setLayout(layout); + vld = new QRegExpValidator(QRegExp("[^\\#/=\"\'\\$]+"), this); + nickname->setValidator(vld); + connect(btOK, SIGNAL(clicked()), this, SLOT(OK())); connect(btRegister, SIGNAL(clicked()), this, SLOT(Register())); } void RegisterAccountDialog::OK() { + done(0); } void RegisterAccountDialog::Register() { + //check name + QString name = nickname->text(); + + if (name.toUtf8().size() > 52) //64bytes -field size in x509 certificate, - 10 for number, -1 for #, 1 for terminating zero + { + QMessageBox mbx; + mbx.setText(tr("Name is too long")); + mbx.exec(); + return; + } + + //1 + lbStatus->setText(tr("1) generating RSA keypair...")); + + nickname->setEnabled(false); + btRegister->setEnabled(false); + + ost.GenRSAKeySignal(4096, config_dir + QDir::separator() + "privkey.pem", this, SLOT(stageGenCSR(int, QProcess::ExitStatus))); +} + +void RegisterAccountDialog::stageGenCSR(int retval, QProcess::ExitStatus) +{ + if (retval != 0) + { + lbStatus->setText(tr("Error:\n") + ost.ReadStdErr()); + return; + } + + lbStatus->setText(tr("2) Generating CSR...")); + + ost.GenCSRSignal(config_dir + QDir::separator() + "csr.pem", + config_dir + QDir::separator() + "privkey.pem", + nickname->text(), + this, + SLOT(stageConnect(int,QProcess::ExitStatus))); +} + +void RegisterAccountDialog::stageConnect(int retval,QProcess::ExitStatus) +{ + static const char *registrar_hosts[] = {"registrar.picapica.im","registrar.picapica.ge"}; + static unsigned char registrar_index; + + if (retval != 0) + { + lbStatus->setText(tr("Error:\n") + ost.ReadStdErr()); + return; + } + + lbStatus->setText(tr("3) Connecting to server...")); + + sock.connectToHost(registrar_hosts[(registrar_index++)%(sizeof(registrar_hosts)/sizeof(char*))], 2299); + + connect(&sock, SIGNAL(connected()), this, SLOT(stageGetCert())); +} + +void RegisterAccountDialog::stageGetCert() +{ + lbStatus->setText(tr("4) Connected. Waiting for certificate...")); + + QFile csr(config_dir + QDir::separator() + "csr.pem"); + csr.open(QIODevice::ReadOnly); + + QByteArray buf; + + buf = csr.readAll(); + + sock.write(buf.data(), buf.size()); + connect(&sock, SIGNAL(readyRead()), this, SLOT(stageReadCert())); + + cert_buf.clear(); +} + +void RegisterAccountDialog::stageReadCert() +{ + cert_buf.append(sock.readAll()); + + if (cert_buf.contains("-----END CERTIFICATE-----") || cert_buf.contains("-----END X509 CERTIFICATE-----")) + { + QFile cert(config_dir + QDir::separator() + "cert.pem"); + cert.open(QIODevice::WriteOnly | QIODevice::Truncate); + cert.write(cert_buf.data(),cert_buf.size()); + cert.close(); + + QFile::remove(config_dir + QDir::separator() + "csr.pem"); + + 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_; } |
