summaryrefslogtreecommitdiffstats
path: root/pica-client/dialogs
diff options
context:
space:
mode:
authorme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2012-07-22 12:00:06 +0000
committerme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2012-07-22 12:00:06 +0000
commitc7323aafac1769cb809da3f1d7ddd05383ace641 (patch)
treeddd736fbbe600d6eacc1f324d98a3c3064244b89 /pica-client/dialogs
parentf190872a4ab94577d1d9db343c0ca7643f40eae6 (diff)
downloadpica-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.cpp116
-rw-r--r--pica-client/dialogs/registeraccountdialog.h16
-rw-r--r--pica-client/dialogs/viewcertdialog.cpp22
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()