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 | |
| 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')
| -rw-r--r-- | pica-client/dialogs/registeraccountdialog.cpp | 116 | ||||
| -rw-r--r-- | pica-client/dialogs/registeraccountdialog.h | 16 | ||||
| -rw-r--r-- | pica-client/dialogs/viewcertdialog.cpp | 22 |
3 files changed, 133 insertions, 21 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_; } diff --git a/pica-client/dialogs/registeraccountdialog.h b/pica-client/dialogs/registeraccountdialog.h index e1a8fd5..696f1ee 100644 --- a/pica-client/dialogs/registeraccountdialog.h +++ b/pica-client/dialogs/registeraccountdialog.h @@ -5,6 +5,10 @@ #include <QPushButton> #include <QLineEdit> #include <QLabel> +#include <QRegExpValidator> +#include <QtNetwork> +#include <QTcpSocket> +#include "openssltool.h" class RegisterAccountDialog : public QDialog { @@ -20,11 +24,23 @@ private: QLineEdit *nickname; QLabel *lbStatus; + QRegExpValidator *vld; + OpenSSLTool ost; + QTcpSocket sock; + QByteArray cert_buf; + + QString CertFilename_; + QString PkeyFilename_; signals: public slots: void OK(); void Register(); + + void stageGenCSR(int,QProcess::ExitStatus); + void stageConnect(int,QProcess::ExitStatus); + void stageGetCert(); + void stageReadCert(); }; #endif // REGISTERACCOUNTDIALOG_H diff --git a/pica-client/dialogs/viewcertdialog.cpp b/pica-client/dialogs/viewcertdialog.cpp index 8b096c2..7f4e24a 100644 --- a/pica-client/dialogs/viewcertdialog.cpp +++ b/pica-client/dialogs/viewcertdialog.cpp @@ -1,7 +1,6 @@ #include "viewcertdialog.h" +#include "openssltool.h" #include <QVBoxLayout> -#include <QProcess> - #include <QMessageBox> #include <unistd.h> @@ -42,24 +41,7 @@ ViewCertDialog::ViewCertDialog(QWidget *parent) : void ViewCertDialog::SetCert(QString cert_pem) { - QProcess openssl(this); - qint64 ret; - char *data; - QByteArray ba; - - openssl.start("openssl", QStringList()<<"x509"<<"-noout"<<"-text"<<"-nameopt"<<"multiline,-esc_msb,utf8"); - - if (!openssl.waitForStarted()) - return; - - ba = cert_pem.toAscii(); - ret = openssl.write(data = (char*)ba.constData()); - openssl.closeWriteChannel(); - - if (!openssl.waitForFinished()) - return; - - cert_text->setPlainText(QString::fromUtf8(openssl.readAllStandardOutput().constData())); + cert_text->setPlainText(OpenSSLTool::CertTextFromString(cert_pem)); } void ViewCertDialog::OK() |
