summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2013-08-30 13:34:02 +0000
committerme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2013-08-30 13:34:02 +0000
commit0ef7c1d7471ce20fe54729c27858db864aedee91 (patch)
tree3a71b713febdbea19fc7358af68d9f6cfa3c3158
parentbfd5528f28264772a245dc29f41d4bb5d29fb1eb (diff)
downloadpica-pica-0ef7c1d7471ce20fe54729c27858db864aedee91.tar.gz
pica-pica-0ef7c1d7471ce20fe54729c27858db864aedee91.zip
updated pica-client to make it handle new id format. quint32 type for id is replaced with QByteArray in most places. Implemented verification callbacks in client and node that allow self-signed certificates
git-svn-id: svn://localhost/project_picapica/trunk@266 fb96df88-216d-11de-830c-f3023f12d8ac
-rwxr-xr-xPICA_client.c39
-rwxr-xr-xPICA_node.c40
-rw-r--r--pica-client/accounts.cpp6
-rw-r--r--pica-client/accounts.h6
-rw-r--r--pica-client/accountswindow.cpp30
-rw-r--r--pica-client/askpassword.cpp8
-rw-r--r--pica-client/askpassword.h2
-rw-r--r--pica-client/chatwindow.cpp22
-rw-r--r--pica-client/chatwindow.h8
-rw-r--r--pica-client/contactlistwidget.cpp16
-rw-r--r--pica-client/contacts.cpp16
-rw-r--r--pica-client/contacts.h18
-rw-r--r--pica-client/dialogs/addaccountdialog.cpp4
-rw-r--r--pica-client/dialogs/forgedcertdialog.cpp4
-rw-r--r--pica-client/dialogs/forgedcertdialog.h2
-rw-r--r--pica-client/globals.h4
-rw-r--r--pica-client/history.cpp16
-rw-r--r--pica-client/history.h14
-rw-r--r--pica-client/main.cpp14
-rw-r--r--pica-client/mainwindow.cpp2
-rw-r--r--pica-client/msguirouter.cpp22
-rw-r--r--pica-client/msguirouter.h14
-rw-r--r--pica-client/openssltool.cpp20
-rw-r--r--pica-client/skynet.cpp72
-rw-r--r--pica-client/skynet.h46
-rwxr-xr-xtests/test_clientbin34578 -> 35035 bytes
-rwxr-xr-xtests/test_client.c2
27 files changed, 259 insertions, 188 deletions
diff --git a/PICA_client.c b/PICA_client.c
index 61bc8ef..40d708e 100755
--- a/PICA_client.c
+++ b/PICA_client.c
@@ -124,8 +124,41 @@ if (!x)
return PICA_id_from_X509(x, id);
}
-static int verify_callback(int preverify_ok, X509_STORE_CTX *x509_ctx)
+static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
{ //return 1 for self-signed certificates
+char buf[256];
+X509 *err_cert;
+int err, depth;
+SSL *ssl;
+
+err_cert = X509_STORE_CTX_get_current_cert(ctx);
+err = X509_STORE_CTX_get_error(ctx);
+depth = X509_STORE_CTX_get_error_depth(ctx);
+
+
+X509_NAME_oneline(X509_get_subject_name(err_cert), buf, 256);
+
+if (err == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT && depth == 0)
+ preverify_ok = 1;
+
+if (!preverify_ok) {
+ printf("verify error:num=%d:%s:depth=%d:%s\n", err,
+ X509_verify_cert_error_string(err), depth, buf);
+ }
+
+
+ /*
+ * At this point, err contains the last verification error. We can use
+ * it for something special
+ */
+ if (!preverify_ok && (err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT))
+ {
+ X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert), buf, 256);
+ printf("issuer= %s\n", buf);
+ }
+
+
+
return preverify_ok;
}
@@ -246,8 +279,8 @@ ret=SSL_accept(chnl->ssl);
if (ret!=1)
{
- //printf("ret=%i of SSL_connect or accept\n",ret);//debug
- //printf("SSL_get_error says:%i\n",SSL_get_error(chnl->ssl,ret));//debug
+ //printf("ret=%i of SSL_connect or accept\n",ret);//debug
+ //printf("SSL_get_error says:%i\n",SSL_get_error(chnl->ssl,ret));//debug
err_ret=PICA_ERRSSL;
goto error_ret_;
}
diff --git a/PICA_node.c b/PICA_node.c
index 09a3197..e123fce 100755
--- a/PICA_node.c
+++ b/PICA_node.c
@@ -153,7 +153,28 @@ struct PICA_msginfo _msginfo_newconn[]={
{PICA_PROTO_NODECONNREQ,PICA_MSG_FIXED_SIZE,PICA_PROTO_NODECONNREQ_SIZE,procmsg_NODECONNREQ}
};
+static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
+{ //return 1 for self-signed certificates
+char buf[256];
+X509 *err_cert;
+int err, depth;
+err_cert = X509_STORE_CTX_get_current_cert(ctx);
+err = X509_STORE_CTX_get_error(ctx);
+depth = X509_STORE_CTX_get_error_depth(ctx);
+
+X509_NAME_oneline(X509_get_subject_name(err_cert), buf, 256);
+
+if (err == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT && depth == 0)
+ preverify_ok = 1;
+
+if (!preverify_ok)
+{
+PICA_info("certificate verification error:num=%d:%s:depth=%d:%s\n", err, X509_verify_cert_error_string(err), depth, buf);
+}
+
+ return preverify_ok;
+}
unsigned int procmsg_INITREQ(unsigned char* buf,unsigned int size,void* ptr)
{
@@ -352,18 +373,25 @@ struct client *i,*o;//i - указатель на вызывающего клиÐ
unsigned char *callee_id;
struct PICA_proto_msg *mp;
-PICA_debug1("received CONNREQOUTG");
-
i=(struct client *)ptr;
+PICA_debug1("received CONNREQOUTG from %s", PICA_id_to_base64(i->id, NULL));
+
callee_id = buf+2;
if ((o = client_tree_search(callee_id)))
{
- #warning "duplicated connections" // сделать проверку на наличие уже имеющегося соединения между клиентами
- // и если оно есть, то разрывать его, либо... ???? надо подумать
+ if (cclink_list_search(i->id, callee_id))
+ {
+ PICA_info("duplicate request for existing channel is ignored");
+ return 1;
+ }
- #warning "self" // а еще - если клиент вызывает сам себя?
+ if (memcmp(i->id, callee_id, PICA_ID_SIZE) == 0)
+ {
+ PICA_info("request to create channel to self is ignored");
+ return 1;
+ }
//отправить o _CONNREQINC
if ((mp = client_wbuf_push(o,PICA_PROTO_CONNREQINC,PICA_PROTO_CONNREQINC_SIZE)))
@@ -1325,7 +1353,7 @@ ret = SSL_CTX_load_verify_locations(ctx, nodecfg.CA_cert_file, 0);
if (!ret)
PICA_fatal("call to SSL_CTX_load_verify_locations failed(). Check if %s exists and is accesible", nodecfg.CA_cert_file);
-SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
+SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, verify_callback);
return 1;
}
diff --git a/pica-client/accounts.cpp b/pica-client/accounts.cpp
index eb7b035..4b70b47 100644
--- a/pica-client/accounts.cpp
+++ b/pica-client/accounts.cpp
@@ -34,7 +34,7 @@ void Accounts::Add(AccountRecord &acc)
lasterr=query.lastError();
}
-void Accounts::Delete(quint32 id)
+void Accounts::Delete(QByteArray id)
{
QSqlQuery query;
@@ -61,7 +61,7 @@ QList<Accounts::AccountRecord> Accounts::GetAccounts()
while(query.next())
{
- r.id = query.value(0).toUInt();
+ r.id = query.value(0).toByteArray();
r.name = query.value(1).toString();
r.cert_file = query.value(2).toString();
r.pkey_file = query.value(3).toString();
@@ -73,7 +73,7 @@ QList<Accounts::AccountRecord> Accounts::GetAccounts()
return L;
}
-QString Accounts::GetName(quint32 id)
+QString Accounts::GetName(QByteArray id)
{
QSqlQuery query;
diff --git a/pica-client/accounts.h b/pica-client/accounts.h
index f51eace..9389906 100644
--- a/pica-client/accounts.h
+++ b/pica-client/accounts.h
@@ -11,7 +11,7 @@ class Accounts
public:
struct AccountRecord
{
- quint32 id;
+ QByteArray id;
QString name;
QString cert_file;
QString pkey_file;
@@ -20,9 +20,9 @@ public:
Accounts(QString storage);
void Add(AccountRecord& acc);
- void Delete(quint32 id);
+ void Delete(QByteArray id);
QList<AccountRecord> GetAccounts();
- QString GetName(quint32 id);
+ QString GetName(QByteArray id);
bool isOK();
QString GetLastError();
diff --git a/pica-client/accountswindow.cpp b/pica-client/accountswindow.cpp
index 4ad1c75..d83bf31 100644
--- a/pica-client/accountswindow.cpp
+++ b/pica-client/accountswindow.cpp
@@ -9,6 +9,7 @@
#include "openssltool.h"
#include <QMessageBox>
#include <QApplication>
+#include <cstring>
AccountsWindow::AccountsWindow(QWidget *parent) :
QMainWindow(parent),
@@ -66,7 +67,7 @@ void AccountsWindow::LoadAccounts()
else
{
for (int i=0;i<L.count();i++)
- cb_accounts->addItem(QString("(%1) %2").arg(L[i].id).arg(L[i].name),L[i].id);
+ cb_accounts->addItem(QString("(%1) %2").arg(L[i].id.toBase64().constData()).arg(L[i].name),L[i].id);
bt_login->setEnabled(true);
}
@@ -75,13 +76,12 @@ void AccountsWindow::LoadAccounts()
void AccountsWindow::login_click()
{
- account_id = (cb_accounts->itemData(cb_accounts->currentIndex())).toUInt();
-
+ memcpy(account_id,(cb_accounts->itemData(cb_accounts->currentIndex())).toByteArray().constData(), PICA_ID_SIZE);
int L_index;
for (int i=0;i<L.count();i++)
{
- if (L[i].id==account_id)
+ if (L[i].id== QByteArray((const char*)account_id, PICA_ID_SIZE))
{
L_index = i;
break;
@@ -108,12 +108,12 @@ void AccountsWindow::login_click()
void AccountsWindow::CreateAccount(QString CertFilename, QString PkeyFilename, bool copyfiles)
{
- quint32 id;
+ QByteArray id(PICA_ID_SIZE, 0);
int ret;
- ret = PICA_get_id_from_cert(CertFilename.toUtf8().constData(),&id);
+ ret = PICA_get_id_from_cert_file(CertFilename.toUtf8().constData(), (unsigned char*)id.data());
- if (0 == id || 0 == ret)
+ if (0 == ret)
{
QMessageBox mbx;
mbx.setText("Invalid certificate");
@@ -124,16 +124,16 @@ void AccountsWindow::CreateAccount(QString CertFilename, QString PkeyFilename, b
QString name = OpenSSLTool::NameFromCertFile(CertFilename);
Accounts::AccountRecord rec;
- QString certfilename,pkeyfilename;
+ QString certfilename, pkeyfilename;
if (copyfiles)
{
QDir dir(config_dir);
- dir.mkdir(QString::number(id));
- dir.cd(QString::number(id));
+ dir.mkdir(name + id.toHex().constData());
+ dir.cd(name + id.toHex().constData());
- certfilename=dir.absolutePath()+"/"+QString::number(id)+"_cert.pem";
- pkeyfilename=dir.absolutePath()+"/"+QString::number(id)+"_pkey.pem";
+ certfilename=dir.absolutePath()+"/" + id.toHex().constData() + "_cert.pem";
+ pkeyfilename=dir.absolutePath()+"/" + id.toHex().constData() + "_pkey.pem";
QFile::copy(CertFilename,certfilename);
QFile::copy(PkeyFilename,pkeyfilename);
@@ -148,7 +148,7 @@ void AccountsWindow::CreateAccount(QString CertFilename, QString PkeyFilename, b
rec.name=name;
rec.cert_file=certfilename;
rec.pkey_file=pkeyfilename;
- rec.CA_file= config_defaultCA;
+ rec.CA_file= certfilename;//config_defaultCA;
accounts.Add(rec);
@@ -188,10 +188,10 @@ void AccountsWindow::add_click()
void AccountsWindow::delete_click()
{
- quint32 id = (cb_accounts->itemData(cb_accounts->currentIndex())).toUInt();
+ QByteArray id = (cb_accounts->itemData(cb_accounts->currentIndex())).toByteArray();
if (QMessageBox::No==
- QMessageBox::question(this,tr("Deleting account"),tr("Are you sure you want to delete account %1 ?").arg(id),QMessageBox::Yes,QMessageBox::No))
+ QMessageBox::question(this,tr("Deleting account"),tr("Are you sure you want to delete account %1 ?").arg(id.toBase64().constData()),QMessageBox::Yes,QMessageBox::No))
return;
//TODO ask user if he wants to wipe certificate and private key too
diff --git a/pica-client/askpassword.cpp b/pica-client/askpassword.cpp
index 0629502..05c0c83 100644
--- a/pica-client/askpassword.cpp
+++ b/pica-client/askpassword.cpp
@@ -4,7 +4,7 @@
#include <QInputDialog>
QMutex AskPassword::passwd_mutex;
-QMap<quint32,QString> AskPassword::idpasswd;
+QMap<QByteArray,QString> AskPassword::idpasswd;
AskPassword::AskPassword(QObject *parent) :
QObject(parent)
@@ -15,7 +15,7 @@ AskPassword::AskPassword(QObject *parent) :
int AskPassword::ask_password_cb(char *buf, int size, int rwflag, void *userdata)
{
QString pswd;
- quint32 id = *((quint32*)userdata);
+ QByteArray id = QByteArray((const char*) userdata, PICA_ID_SIZE);
passwd_mutex.lock();
@@ -44,9 +44,9 @@ void AskPassword::password_dialog()
{
bool ok;
QString title = QObject::tr("Enter private key passphrase");
- QString text = QObject::tr(QString("Passphrase for (%1)").arg(account_id).toUtf8().constData());
+ QString text = QObject::tr(QString("Passphrase for (%1)").arg(QByteArray((const char*)account_id, PICA_ID_SIZE).toBase64().constData()).toUtf8().constData());
QString psw = QInputDialog::getText((QWidget*)mainwindow,title,text,QLineEdit::Password,QString(),&ok);
if (ok)
- idpasswd[account_id] = psw;
+ idpasswd[QByteArray((const char*)account_id, PICA_ID_SIZE)] = psw;
}
diff --git a/pica-client/askpassword.h b/pica-client/askpassword.h
index c841693..6abc009 100644
--- a/pica-client/askpassword.h
+++ b/pica-client/askpassword.h
@@ -14,7 +14,7 @@ public:
private:
void emit_sig();
- static QMap<quint32,QString> idpasswd;
+ static QMap<QByteArray,QString> idpasswd;
static QMutex passwd_mutex;
signals:
diff --git a/pica-client/chatwindow.cpp b/pica-client/chatwindow.cpp
index 0366c86..1a7c141 100644
--- a/pica-client/chatwindow.cpp
+++ b/pica-client/chatwindow.cpp
@@ -10,8 +10,8 @@
#include <QDateTime>
#include <QMessageBox>
-ChatWindow::ChatWindow(quint32 peer_id) :
- QWidget(0), peer_id_(peer_id), hist(config_dbname, account_id)
+ChatWindow::ChatWindow(QByteArray peer_id) :
+ QWidget(0), peer_id_(peer_id), hist(config_dbname, QByteArray((const char*)account_id, PICA_ID_SIZE))
{
QVBoxLayout *layout;
@@ -33,7 +33,7 @@ ChatWindow::ChatWindow(quint32 peer_id) :
setLayout(layout);
- setWindowTitle(QString::number(peer_id));
+ setWindowTitle(peer_id.toBase64());
setWindowIcon(picapica_ico_sit);
QWidget::setAttribute(Qt::WA_DeleteOnClose);
@@ -60,24 +60,24 @@ ChatWindow::ChatWindow(quint32 peer_id) :
layout->insertSpacing(0, menu->size().height());
{
- Contacts ct(config_dbname, account_id);
+ Contacts ct(config_dbname, QByteArray((const char*)account_id, PICA_ID_SIZE));
peer_name_ = ct.GetContactName(peer_id_);
if (peer_name_.isEmpty())
- peer_name_ = QString::number(peer_id_);
+ peer_name_ = peer_id_.toBase64();
}
{
Accounts ac(config_dbname);
- my_name_ = ac.GetName(account_id);
+ my_name_ = ac.GetName(QByteArray((const char*)account_id, PICA_ID_SIZE));
if (my_name_.isEmpty())
- my_name_ = QString::number(account_id);
+ my_name_ = QByteArray((const char*)account_id, PICA_ID_SIZE).toBase64();
}
}
-void ChatWindow::put_message(QString msg, quint32 id, bool is_me)
+void ChatWindow::put_message(QString msg, QByteArray id, bool is_me)
{
QString color, name;
QTextCharFormat fmt;
@@ -95,7 +95,7 @@ void ChatWindow::put_message(QString msg, quint32 id, bool is_me)
if (id == peer_id_)
name = peer_name_;
else
- name = QString::number(id);
+ name = id.toBase64();
}
pos = draw_message(msg, name, QDateTime::currentDateTime().toString(), color, false);
@@ -159,7 +159,7 @@ void ChatWindow::print_history(QList<History::HistoryRecord> H)
if (r.peer_id == peer_id_)
name = peer_name_;
else
- name = QString::number(r.peer_id);
+ name = r.peer_id.toBase64();
}
dt.setTime_t(r.timestamp);
@@ -210,7 +210,7 @@ void ChatWindow::msg_informational(QString text)
void ChatWindow::send_message()
{
- put_message(sendtextw->toPlainText(), account_id, true);
+ put_message(sendtextw->toPlainText(), QByteArray((const char*)account_id, PICA_ID_SIZE), true);
hist.Add(peer_id_, sendtextw->toPlainText(), true);
if (!hist.isOK())
diff --git a/pica-client/chatwindow.h b/pica-client/chatwindow.h
index 4036e43..0be8ea0 100644
--- a/pica-client/chatwindow.h
+++ b/pica-client/chatwindow.h
@@ -25,9 +25,9 @@ class ChatWindow : public QWidget
{
Q_OBJECT
public:
- explicit ChatWindow(quint32 peer_id);
+ explicit ChatWindow(QByteArray peer_id);
- quint32 getPeerId() { return peer_id_;};
+ QByteArray getPeerId() { return peer_id_;};
signals:
void msg_input(QString msg, ChatWindow *sender_window);
@@ -42,7 +42,7 @@ public slots:
private:
QTextEdit *chatw;
TextSend *sendtextw;
- quint32 peer_id_;
+ QByteArray peer_id_;
QList<int> undelivered_msgs;
History hist;
QMenuBar *menu;
@@ -52,7 +52,7 @@ private:
QString peer_name_;
QString my_name_;
- void put_message(QString msg, quint32 id, bool is_me);
+ void put_message(QString msg, QByteArray id, bool is_me);
int draw_message(QString msg, QString nickname, QString datetime, QString color, bool is_delivered);
void print_history(QList<History::HistoryRecord> H);
diff --git a/pica-client/contactlistwidget.cpp b/pica-client/contactlistwidget.cpp
index 130357f..c3096d8 100644
--- a/pica-client/contactlistwidget.cpp
+++ b/pica-client/contactlistwidget.cpp
@@ -27,7 +27,7 @@ ContactListWidget::ContactListWidget(QWidget *parent) :
connect(this, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(start_chat()));
- setContactsStorage(new Contacts(config_dbname, account_id));
+ setContactsStorage(new Contacts(config_dbname, QByteArray((const char*)account_id, PICA_ID_SIZE)));
}
ContactListWidget::~ContactListWidget()
@@ -63,9 +63,9 @@ void ContactListWidget::setContactsStorage(Contacts *ct)
for (int i=0;i<contact_records.size();i++)
{
- addItem(QString("(%1) ").arg(contact_records[i].id)+contact_records[i].name);
+ addItem(QString("(%1) ").arg(contact_records[i].id.toBase64()+contact_records[i].name));
wgitem_to_recs[this->item(i)]=&contact_records[i];
- this->item(i)->setStatusTip(QString().setNum(contact_records[i].id));
+ this->item(i)->setStatusTip(contact_records[i].id.toBase64());
}
}
@@ -76,9 +76,9 @@ void ContactListWidget::add_contact()
if (ok && !input.isEmpty())
{
- quint32 user_id=input.toUInt(&ok);
+ QByteArray user_id = QByteArray::fromBase64(input.toAscii()).left(PICA_ID_SIZE);
- if (!ok)
+ if (user_id.size() != PICA_ID_SIZE)
{
QMessageBox mbx;
mbx.setIcon(QMessageBox::Warning);
@@ -92,7 +92,7 @@ void ContactListWidget::add_contact()
{
QMessageBox mbx;
mbx.setIcon(QMessageBox::Warning);
- mbx.setText(tr("User \"(%1) %2\" already exists").arg(user_id).arg(contact_records[i].name));
+ mbx.setText(tr("User \"(%1) %2\" already exists").arg(user_id.toBase64().constData()).arg(contact_records[i].name));
mbx.exec();
return;
}
@@ -113,7 +113,7 @@ void ContactListWidget::add_contact()
return;
}
- addItem(QString("(%1) ").arg(user_id));
+ addItem(QString("(%1) ").arg(user_id.toBase64().constData()));
contact_records.append(r);
wgitem_to_recs[this->item(this->count()-1)]=&contact_records.last();
@@ -132,7 +132,7 @@ mbx.setDefaultButton(QMessageBox::No);
if (QMessageBox::Yes==mbx.exec())
{
- quint32 rm_id;
+ QByteArray rm_id;
QListWidgetItem *rm_ptr;
storage->Delete(rm_id = wgitem_to_recs[currentItem()]->id);
diff --git a/pica-client/contacts.cpp b/pica-client/contacts.cpp
index 9e87298..fb482d2 100644
--- a/pica-client/contacts.cpp
+++ b/pica-client/contacts.cpp
@@ -3,7 +3,7 @@
//#include <QMessageBox>
-Contacts::Contacts(QString storage, quint32 user_account_id)
+Contacts::Contacts(QString storage, QByteArray user_account_id)
: account_id_(user_account_id)
{
dbconn=QSqlDatabase::addDatabase("QSQLITE");
@@ -35,7 +35,7 @@ QString Contacts::GetLastError()
return lasterr.text();
}
-void Contacts::Add(quint32 id)
+void Contacts::Add(QByteArray id)
{
QSqlQuery query;
@@ -47,7 +47,7 @@ void Contacts::Add(quint32 id)
lasterr=query.lastError();
}
-void Contacts::Delete(quint32 id)
+void Contacts::Delete(QByteArray id)
{
QSqlQuery query;
@@ -76,7 +76,7 @@ QList<Contacts::ContactRecord> Contacts::GetContacts()
while(query.next())
{
- r.id=query.value(0).toUInt();
+ r.id=query.value(0).toByteArray();
r.name=query.value(1).toString();
//CSTRL.append(" ("+query.value(0).toString()+") "+query.value(1).toString());
L<<r;
@@ -85,7 +85,7 @@ QList<Contacts::ContactRecord> Contacts::GetContacts()
return L;
}
-QString Contacts::GetContactCert(quint32 id)
+QString Contacts::GetContactCert(QByteArray id)
{
QSqlQuery query;
@@ -104,7 +104,7 @@ QString Contacts::GetContactCert(quint32 id)
return query.value(0).toString();
}
-QString Contacts::GetContactName(quint32 id)
+QString Contacts::GetContactName(QByteArray id)
{
QSqlQuery query;
@@ -123,7 +123,7 @@ QString Contacts::GetContactName(quint32 id)
return query.value(0).toString();
}
-void Contacts::SetContactCert(quint32 id, QString &cert_pem)
+void Contacts::SetContactCert(QByteArray id, QString &cert_pem)
{
QSqlQuery query;
@@ -137,7 +137,7 @@ void Contacts::SetContactCert(quint32 id, QString &cert_pem)
}
-void Contacts::SetContactName(quint32 id, QString name)
+void Contacts::SetContactName(QByteArray id, QString name)
{
QSqlQuery query;
diff --git a/pica-client/contacts.h b/pica-client/contacts.h
index 47f6cd8..f3f7663 100644
--- a/pica-client/contacts.h
+++ b/pica-client/contacts.h
@@ -11,25 +11,25 @@ class Contacts
public:
struct ContactRecord
{
- quint32 id;
+ QByteArray id;
QString name;
};
- Contacts(QString storage, quint32 user_account_id);
+ Contacts(QString storage, QByteArray user_account_id);
- void Add(quint32 id);
- void Delete(quint32 id);
+ void Add(QByteArray id);
+ void Delete(QByteArray id);
QList<ContactRecord> GetContacts();
- QString GetContactCert(quint32 id);
- QString GetContactName(quint32 id);
- void SetContactCert(quint32 id, QString &cert_pem);
- void SetContactName(quint32 id, QString name);
+ QString GetContactCert(QByteArray id);
+ QString GetContactName(QByteArray id);
+ void SetContactCert(QByteArray id, QString &cert_pem);
+ void SetContactName(QByteArray id, QString name);
QString GetLastError();
bool isOK();
private:
QSqlDatabase dbconn;
QSqlError lasterr;
- quint32 account_id_;
+ QByteArray account_id_;
};
#endif // CONTACTS_H
diff --git a/pica-client/dialogs/addaccountdialog.cpp b/pica-client/dialogs/addaccountdialog.cpp
index 97e8851..8d31ca4 100644
--- a/pica-client/dialogs/addaccountdialog.cpp
+++ b/pica-client/dialogs/addaccountdialog.cpp
@@ -68,9 +68,9 @@ void AddAccountDialog::OK()
return;
}
- quint32 id;
+ QByteArray id(PICA_ID_SIZE, 0);
- if (!PICA_get_id_from_cert(cert_filename->text().toUtf8().constData(),&id))
+ if (!PICA_get_id_from_cert_file(cert_filename->text().toUtf8().constData(), (unsigned char*)id.data()))
{
QMessageBox mbx;
mbx.setText(tr("Invalid certificate file"));
diff --git a/pica-client/dialogs/forgedcertdialog.cpp b/pica-client/dialogs/forgedcertdialog.cpp
index 5ca7f23..ccf144f 100644
--- a/pica-client/dialogs/forgedcertdialog.cpp
+++ b/pica-client/dialogs/forgedcertdialog.cpp
@@ -3,7 +3,7 @@
#include <QGridLayout>
#include <QLabel>
-ForgedCertDialog::ForgedCertDialog(quint32 peer_id, QString received_cert, QString stored_cert, QWidget *parent) :
+ForgedCertDialog::ForgedCertDialog(QByteArray peer_id, QString received_cert, QString stored_cert, QWidget *parent) :
QDialog(parent),
received_cert_(received_cert),
stored_cert_(stored_cert)
@@ -14,7 +14,7 @@ ForgedCertDialog::ForgedCertDialog(quint32 peer_id, QString received_cert, QStri
"Previously stored and currently present certificates for user %1 do not match.\n\
This means that probably someone is trying to eavesdrop your communication\n\
using man-in-the-middle attack or impersonate the user.\n\
-Connection aborted.").arg(peer_id));
+Connection aborted.").arg(peer_id.toBase64().constData()));
btOK = new QPushButton(tr("OK"));
btShow_stored_cert = new QPushButton(tr("View Stored Certificate..."));
diff --git a/pica-client/dialogs/forgedcertdialog.h b/pica-client/dialogs/forgedcertdialog.h
index bc259d4..5386f14 100644
--- a/pica-client/dialogs/forgedcertdialog.h
+++ b/pica-client/dialogs/forgedcertdialog.h
@@ -9,7 +9,7 @@ class ForgedCertDialog : public QDialog
{
Q_OBJECT
public:
- explicit ForgedCertDialog(quint32 peer_id, QString received_cert, QString stored_cert, QWidget *parent = 0);
+ explicit ForgedCertDialog(QByteArray peer_id, QString received_cert, QString stored_cert, QWidget *parent = 0);
private:
QString received_cert_;
diff --git a/pica-client/globals.h b/pica-client/globals.h
index 5202548..82eec86 100644
--- a/pica-client/globals.h
+++ b/pica-client/globals.h
@@ -10,13 +10,15 @@
#endif
+#include "../PICA_id.h"
+
//variables are defined in main.cpp
extern class QString config_dir;
extern class QString config_dbname;
extern class QString config_defaultCA;
extern class SkyNet *skynet;
extern class MainWindow *mainwindow;
-extern unsigned int account_id;
+extern unsigned char account_id[PICA_ID_SIZE];
extern class AskPassword *askpassword;
extern class MsgUIRouter *msguirouter;
extern class QIcon picapica_ico_sit;
diff --git a/pica-client/history.cpp b/pica-client/history.cpp
index 31a4e22..b3883dd 100644
--- a/pica-client/history.cpp
+++ b/pica-client/history.cpp
@@ -1,7 +1,7 @@
#include "history.h"
#include <QDebug>
-History::History(QString storage, quint32 my_id)
+History::History(QString storage, QByteArray my_id)
: me_(my_id)
{
dbconn=QSqlDatabase::addDatabase("QSQLITE");
@@ -20,7 +20,7 @@ History::History(QString storage, quint32 my_id)
//check result, if foreign keys support is on
}
-void History::Add(quint32 peer_id, QString message, bool is_me)
+void History::Add(QByteArray peer_id, QString message, bool is_me)
{
QSqlQuery query;
@@ -50,7 +50,7 @@ void History::Add(quint32 peer_id, QString message, bool is_me)
lasterr=query.lastError();
}
-void History::SetDelivered(quint32 peer_id)
+void History::SetDelivered(QByteArray peer_id)
{
QSqlQuery query;
@@ -66,7 +66,7 @@ void History::SetDelivered(quint32 peer_id)
lasterr=query.lastError();
}
-QList<History::HistoryRecord> History::GetMessages(quint32 peer_id, quint32 start_timestamp, quint32 end_timestamp)
+QList<History::HistoryRecord> History::GetMessages(QByteArray peer_id, quint32 start_timestamp, quint32 end_timestamp)
{
QList<HistoryRecord> L;
HistoryRecord r;
@@ -90,7 +90,7 @@ QList<History::HistoryRecord> History::GetMessages(quint32 peer_id, quint32 star
while(query.next())
{
- r.peer_id = query.value(0).toUInt();
+ r.peer_id = query.value(0).toByteArray();
r.is_me = query.value(1).toBool();
r.is_delivered = query.value(2).toBool();
r.timestamp = query.value(3).toUInt();
@@ -102,9 +102,9 @@ QList<History::HistoryRecord> History::GetMessages(quint32 peer_id, quint32 star
return L;
}
-QMap<quint32, QList<QString> > History::GetUndeliveredMessages()
+QMap<QByteArray, QList<QString> > History::GetUndeliveredMessages()
{
- QMap<quint32, QList<QString> > M;
+ QMap<QByteArray, QList<QString> > M;
QSqlQuery query;
query.setForwardOnly(true);
@@ -122,7 +122,7 @@ QMap<quint32, QList<QString> > History::GetUndeliveredMessages()
while(query.next())
{
- M[query.value(0).toUInt()] << query.value(1).toString();
+ M[query.value(0).toByteArray()] << query.value(1).toString();
}
return M;
diff --git a/pica-client/history.h b/pica-client/history.h
index ebf6dbd..6fc1e08 100644
--- a/pica-client/history.h
+++ b/pica-client/history.h
@@ -12,18 +12,18 @@ class History
public:
struct HistoryRecord
{
- quint32 peer_id;
+ QByteArray peer_id;
bool is_me;
bool is_delivered;
quint32 timestamp;
QString message;
};
- History(QString storage, quint32 my_id);
- void Add(quint32 peer_id, QString message, bool is_me);//is_me - true - message from me to peer, false - from peer to me
- void SetDelivered(quint32 peer_id); //mark first undelivered message from me to peer as delivered
- QList<HistoryRecord> GetMessages(quint32 peer_id, quint32 start_timestamp, quint32 end_timestamp);
- QMap<quint32, QList<QString> > GetUndeliveredMessages();
+ History(QString storage, QByteArray my_id);
+ void Add(QByteArray peer_id, QString message, bool is_me);//is_me - true - message from me to peer, false - from peer to me
+ void SetDelivered(QByteArray peer_id); //mark first undelivered message from me to peer as delivered
+ QList<HistoryRecord> GetMessages(QByteArray peer_id, quint32 start_timestamp, quint32 end_timestamp);
+ QMap<QByteArray, QList<QString> > GetUndeliveredMessages();
bool isOK();
QString GetLastError();
@@ -31,7 +31,7 @@ private:
QSqlDatabase dbconn;
QSqlError lasterr;
- quint32 me_;
+ QByteArray me_;
};
#endif // HISTORY_H
diff --git a/pica-client/main.cpp b/pica-client/main.cpp
index b4a71e8..9dd93fe 100644
--- a/pica-client/main.cpp
+++ b/pica-client/main.cpp
@@ -17,7 +17,7 @@ QString config_dir;
QString config_dbname;
SkyNet *skynet;
MainWindow *mainwindow;
-unsigned int account_id;
+unsigned char account_id[PICA_ID_SIZE];
class AskPassword *askpassword;
class MsgUIRouter *msguirouter;
@@ -59,7 +59,7 @@ static bool create_database()
query.exec("create table accounts \
(\
- id int primary key, \
+ id blob primary key, \
name varchar(64), \
cert_file varchar(255) not null, \
pkey_file varchar(255) not null, \
@@ -71,10 +71,10 @@ static bool create_database()
query.exec("create table contacts \
(\
- id int,\
+ id blob,\
name varchar(64), \
cert_pem text(2048), \
- account_id int not null, \
+ account_id blob not null, \
primary key(id, account_id),\
foreign key(account_id) references accounts(id) on delete cascade\
);");
@@ -101,8 +101,8 @@ static bool create_database()
query.exec("create table history \
(\
id integer primary key autoincrement, \
- contact_id int not null, \
- account_id int not null, \
+ contact_id blob not null, \
+ account_id blob not null, \
timestamp int not null, \
is_me int not null, \
is_delivered int not null, \
@@ -124,7 +124,7 @@ static bool create_database()
if (query.lastError().isValid())
goto showerror;
- query.exec("insert into schema_version values (1, strftime('%s','now'));"); //current schema version. update when needed
+ query.exec("insert into schema_version values (2, strftime('%s','now'));"); //current schema version. update when needed
if (query.lastError().isValid())
showerror:
diff --git a/pica-client/mainwindow.cpp b/pica-client/mainwindow.cpp
index 40b2544..a0bfc44 100644
--- a/pica-client/mainwindow.cpp
+++ b/pica-client/mainwindow.cpp
@@ -85,7 +85,7 @@ void MainWindow::SetStatus(bool connected)
if (connected)
{
status->setCurrentIndex(0);
- setWindowTitle(tr("Pica Pica Messenger - ") + QString::number(account_id));
+ setWindowTitle(tr("Pica Pica Messenger - ") + QByteArray((const char*)account_id, PICA_ID_SIZE).toBase64());
}
else
{
diff --git a/pica-client/msguirouter.cpp b/pica-client/msguirouter.cpp
index 9750d4d..d4a62c4 100644
--- a/pica-client/msguirouter.cpp
+++ b/pica-client/msguirouter.cpp
@@ -17,15 +17,15 @@
MsgUIRouter::MsgUIRouter(QObject *parent) :
QObject(parent)
{
- connect(skynet, SIGNAL(MessageReceived(quint32,QString)), this, SLOT(msg_from_peer(quint32,QString)));
- connect(skynet, SIGNAL(UnableToDeliver(quint32,QString)), this, SLOT(delivery_failed(quint32,QString)));
- connect(skynet, SIGNAL(Delivered(quint32)), this, SLOT(delivered(quint32)));
- connect(skynet, SIGNAL(CertificateForged(quint32,QString,QString)), this, SLOT(scary_cert_message(quint32,QString,QString)));
+ connect(skynet, SIGNAL(MessageReceived(QByteArray,QString)), this, SLOT(msg_from_peer(QByteArray,QString)));
+ connect(skynet, SIGNAL(UnableToDeliver(QByteArray,QString)), this, SLOT(delivery_failed(QByteArray,QString)));
+ connect(skynet, SIGNAL(Delivered(QByteArray)), this, SLOT(delivered(QByteArray)));
+ connect(skynet, SIGNAL(CertificateForged(QByteArray,QString,QString)), this, SLOT(scary_cert_message(QByteArray,QString,QString)));
connect(skynet, SIGNAL(ErrMsgFromNode(QString)), this, SLOT(notification(QString)));
}
-void MsgUIRouter::create_chatwindow(quint32 peer_id)
+void MsgUIRouter::create_chatwindow(QByteArray peer_id)
{
ChatWindow *cw;
@@ -39,7 +39,7 @@ void MsgUIRouter::create_chatwindow(quint32 peer_id)
cw->show();
}
-void MsgUIRouter::msg_from_peer(quint32 from, QString msg)
+void MsgUIRouter::msg_from_peer(QByteArray from, QString msg)
{
if ( ! chatwindows.contains(from))
@@ -56,7 +56,7 @@ void MsgUIRouter::msg_to_peer(QString msg, ChatWindow *sender_window)
skynet->SendMessage(sender_window->getPeerId(), msg);
}
-void MsgUIRouter::start_chat(quint32 peer_id)
+void MsgUIRouter::start_chat(QByteArray peer_id)
{
if ( ! chatwindows.contains(peer_id))
{
@@ -73,7 +73,7 @@ void MsgUIRouter::chatwindow_closed(ChatWindow *sender_window)
chatwindows.remove(sender_window->getPeerId());
}
-void MsgUIRouter::delivery_failed(quint32 to, QString msg)
+void MsgUIRouter::delivery_failed(QByteArray to, QString msg)
{
// if (chatwindows.contains(to))
// {
@@ -81,7 +81,7 @@ void MsgUIRouter::delivery_failed(quint32 to, QString msg)
// }
}
-void MsgUIRouter::delivered(quint32 to)
+void MsgUIRouter::delivered(QByteArray to)
{
if (chatwindows.contains(to))
{
@@ -89,13 +89,13 @@ void MsgUIRouter::delivered(quint32 to)
}
else
{
- History h(config_dbname, account_id);
+ History h(config_dbname, QByteArray((const char*)account_id, PICA_ID_SIZE));
h.SetDelivered(to);
}
}
-void MsgUIRouter::scary_cert_message(quint32 peer_id, QString received_cert, QString stored_cert)
+void MsgUIRouter::scary_cert_message(QByteArray peer_id, QString received_cert, QString stored_cert)
{
ForgedCertDialog fcd(peer_id, received_cert, stored_cert);
fcd.exec();
diff --git a/pica-client/msguirouter.h b/pica-client/msguirouter.h
index 2ae0007..eafa54b 100644
--- a/pica-client/msguirouter.h
+++ b/pica-client/msguirouter.h
@@ -18,20 +18,20 @@ signals:
public slots:
void msg_to_peer(QString msg, ChatWindow *sender_window);
- void msg_from_peer(quint32 from, QString msg);
+ void msg_from_peer(QByteArray from, QString msg);
void chatwindow_closed(ChatWindow *sender_window);
- void start_chat(quint32 peer_id);
+ void start_chat(QByteArray peer_id);
- void delivery_failed(quint32 to, QString msg);
- void delivered(quint32 to);
+ void delivery_failed(QByteArray to, QString msg);
+ void delivered(QByteArray to);
- void scary_cert_message(quint32 peer_id, QString received_cert, QString stored_cert);
+ void scary_cert_message(QByteArray peer_id, QString received_cert, QString stored_cert);
void notification(QString text);
private:
- QMap<quint32,ChatWindow*> chatwindows;
+ QMap<QByteArray,ChatWindow*> chatwindows;
- void create_chatwindow(quint32 peer_id);
+ void create_chatwindow(QByteArray peer_id);
};
diff --git a/pica-client/openssltool.cpp b/pica-client/openssltool.cpp
index 2c19223..705437e 100644
--- a/pica-client/openssltool.cpp
+++ b/pica-client/openssltool.cpp
@@ -20,12 +20,16 @@ QString OpenSSLTool::NameFromCertFile(QString cert_file)
return QString();
QByteArray result = openssl.readAll();
- QRegExp rx("CN = [0-9]+\\#([^\\s\\#]+)");
-
+ QRegExp rxOld("CN = [0-9]+\\#([^\\s\\#]+)");
+ QRegExp rx("CN = ([^\\s\\#]+)");
QString name=QString::fromUtf8( result.constData());
- if (name.contains(rx))
+ if (name.contains(rxOld))
+ {
+ name=rxOld.cap(1);
+ }
+ else if (name.contains(rx))
{
name=rx.cap(1);
}
@@ -48,12 +52,16 @@ QString OpenSSLTool::NameFromCertString(QString cert_pem)
return QString();
QByteArray result = openssl.readAll();
- QRegExp rx("CN = [0-9]+\\#([^\\s\\#]+)");
-
+ QRegExp rxOld("CN = [0-9]+\\#([^\\s\\#]+)");
+ QRegExp rx("CN = ([^\\s\\#]+)");
QString name=QString::fromUtf8( result.constData());
- if (name.contains(rx))
+ if (name.contains(rxOld))
+ {
+ name=rxOld.cap(1);
+ }
+ else if (name.contains(rx))
{
name=rx.cap(1);
}
diff --git a/pica-client/skynet.cpp b/pica-client/skynet.cpp
index c86c22c..111b79a 100644
--- a/pica-client/skynet.cpp
+++ b/pica-client/skynet.cpp
@@ -30,7 +30,7 @@ PICA_client_init(&cbs);
nodelink = NULL;
-connect(this, SIGNAL(PeerCertificateReceived(quint32,QString,bool*)), this, SLOT(verify_peer_cert(quint32,QString,bool*)),Qt::DirectConnection);
+connect(this, SIGNAL(PeerCertificateReceived(QByteArray,QString,bool*)), this, SLOT(verify_peer_cert(QByteArray,QString,bool*)),Qt::DirectConnection);
}
@@ -60,12 +60,12 @@ void SkyNet::nodethread_connected(QString addr, quint16 port, NodeThread *thread
emit BecameSelfAware();
//restore old peer connections, if any
- QList<quint32> c2c_peer_ids;
+ QList<QByteArray> c2c_peer_ids;
//load undelivered messages from history
if (msgqueues.isEmpty())
{
- History h(config_dbname, account_id);
+ History h(config_dbname, QByteArray((const char*)account_id, PICA_ID_SIZE));
msgqueues = h.GetUndeliveredMessages();
}
@@ -78,7 +78,7 @@ void SkyNet::nodethread_connected(QString addr, quint16 port, NodeThread *thread
write_mutex.lock();
struct PICA_chaninfo *chan = NULL;
- ret = PICA_create_channel(nodelink, c2c_peer_ids[i], &chan);
+ ret = PICA_create_channel(nodelink, (const unsigned char*)c2c_peer_ids[i].constData(), &chan);
qDebug()<<"restoring channel to "<<c2c_peer_ids[i]<<" ret ="<<ret<<"\n";
write_mutex.unlock();
@@ -95,12 +95,12 @@ void SkyNet::node_status_changed(QString addr, quint16 port, bool alive)
nodes.UpdateStatus(nr, alive);
}
-void SkyNet::verify_peer_cert(quint32 peer_id, QString cert_pem, bool *verified)
+void SkyNet::verify_peer_cert(QByteArray peer_id, QString cert_pem, bool *verified)
{
// ViewCertDialog vcd;
// vcd.SetCert(cert_pem);
// vcd.exec();
- Contacts cnt(config_dbname, account_id);
+ Contacts cnt(config_dbname, QByteArray((const char*)account_id, PICA_ID_SIZE));
QString stored_cert;
if ((stored_cert = cnt.GetContactCert(peer_id)).isEmpty())
@@ -148,7 +148,7 @@ void SkyNet::timerEvent(QTimerEvent *e)
{
if (self_aware)
{
- QList<quint32> c2c_peer_ids = msgqueues.keys();
+ QList<QByteArray> c2c_peer_ids = msgqueues.keys();
write_mutex.lock();
@@ -160,7 +160,7 @@ if (self_aware)
struct PICA_chaninfo *chan = NULL;
- ret = PICA_create_channel(nodelink, c2c_peer_ids[i], &chan);
+ ret = PICA_create_channel(nodelink, (const unsigned char*)c2c_peer_ids[i].constData(), &chan);
qDebug()<<"restoring channel to "<<c2c_peer_ids[i]<<" ret ="<<ret<<" in timer event\n";
@@ -213,7 +213,7 @@ bool SkyNet::isSelfAware()
return self_aware;
}
-void SkyNet::SendMessage(quint32 to, QString msg)
+void SkyNet::SendMessage(QByteArray to, QString msg)
{
int ret = PICA_OK;
struct PICA_chaninfo *iptr;
@@ -242,7 +242,7 @@ if ( (iptr = find_active_chan(to)) )
{
struct PICA_chaninfo *chan = NULL;
- ret = PICA_create_channel(nodelink, to, &chan);
+ ret = PICA_create_channel(nodelink, (const unsigned char*)to.constData(), &chan);
QList<QString> l;
l.append(msg);
@@ -257,7 +257,7 @@ write_mutex.unlock();//>>
}
-void SkyNet::flush_msgqueue(quint32 to)
+void SkyNet::flush_msgqueue(QByteArray to)
{
struct PICA_chaninfo *chan;
int ret;
@@ -288,7 +288,7 @@ void SkyNet::flush_msgqueue(quint32 to)
}
}
-struct PICA_chaninfo * SkyNet::find_active_chan(quint32 peer_id)
+struct PICA_chaninfo * SkyNet::find_active_chan(QByteArray peer_id)
{
if (!nodelink)
return NULL;
@@ -297,7 +297,7 @@ struct PICA_chaninfo *iptr = nodelink->chan_list_head;
while(iptr)
{
- if (iptr->state == PICA_CHANSTATE_ACTIVE && iptr->peer_id == peer_id)
+ if (iptr->state == PICA_CHANSTATE_ACTIVE && QByteArray((const char*)iptr->peer_id, PICA_ID_SIZE) == peer_id)
break;
iptr = iptr->next;
@@ -306,9 +306,9 @@ while(iptr)
return iptr;
}
-QList<quint32> SkyNet::filter_existing_chans(QList<quint32> peer_ids)
+QList<QByteArray> SkyNet::filter_existing_chans(QList<QByteArray> peer_ids)
{
- QList<quint32> ret = peer_ids;
+ QList<QByteArray> ret = peer_ids;
if (!nodelink)
return ret;
@@ -317,8 +317,8 @@ QList<quint32> SkyNet::filter_existing_chans(QList<quint32> peer_ids)
while(iptr)
{
- if (peer_ids.contains(iptr->peer_id))
- ret.removeOne(iptr->peer_id);
+ if (peer_ids.contains(QByteArray((const char*)iptr->peer_id, PICA_ID_SIZE)))
+ ret.removeOne((const char*)iptr->peer_id);
iptr = iptr->next;
}
@@ -326,22 +326,22 @@ QList<quint32> SkyNet::filter_existing_chans(QList<quint32> peer_ids)
return ret;
}
-void SkyNet::emit_Delivered(quint32 to)
+void SkyNet::emit_Delivered(QByteArray to)
{
emit Delivered(to);
}
-void SkyNet::emit_MessageReceived(quint32 from, QString msg)
+void SkyNet::emit_MessageReceived(QByteArray from, QString msg)
{
emit MessageReceived(from, msg);
}
-void SkyNet::emit_UnableToDeliver(quint32 to, QString msg)
+void SkyNet::emit_UnableToDeliver(QByteArray to, QString msg)
{
emit UnableToDeliver(to, msg);
}
-void SkyNet::emit_PeerCertificateReceived(quint32 peer_id, QString cert_pem, bool *verified)
+void SkyNet::emit_PeerCertificateReceived(QByteArray peer_id, QString cert_pem, bool *verified)
{
emit PeerCertificateReceived(peer_id, cert_pem, verified);
}
@@ -351,36 +351,36 @@ void SkyNet::emit_PeerCertificateReceived(quint32 peer_id, QString cert_pem, boo
//all callbacks are executed in separate thread, created in Nodethread instance, REMEMBER THAT !!!
// write_mutex is locked
-void SkyNet::newmsg_cb(unsigned int peer_id, char *msgbuf, unsigned int nb, int type)
+void SkyNet::newmsg_cb(const unsigned char *peer_id, char *msgbuf, unsigned int nb, int type)
{
QString msg = QString::fromUtf8(msgbuf, nb);
-skynet->emit_MessageReceived(peer_id, msg);
+skynet->emit_MessageReceived(QByteArray((const char*)peer_id, PICA_ID_SIZE), msg);
}
-void SkyNet::msgok_cb(unsigned int peer_id)
+void SkyNet::msgok_cb(const unsigned char *peer_id)
{
-skynet->emit_Delivered(peer_id);
+skynet->emit_Delivered(QByteArray((const char*)peer_id, PICA_ID_SIZE));
}
-void SkyNet::channel_established_cb(unsigned int peer_id)
+void SkyNet::channel_established_cb(const unsigned char *peer_id)
{
-skynet->flush_msgqueue(peer_id);
+skynet->flush_msgqueue(QByteArray((const char*)peer_id, PICA_ID_SIZE));
}
-void SkyNet::channel_failed(unsigned int peer_id)
+void SkyNet::channel_failed(const unsigned char *peer_id)
{
- qDebug()<<"channel failed ("<<peer_id<<")\n";
+ qDebug()<<"channel failed ("<<QByteArray((const char*)peer_id, PICA_ID_SIZE).toBase64()<<")\n";
}
-int SkyNet::accept_cb(unsigned int caller_id)
+int SkyNet::accept_cb(const unsigned char *caller_id)
{
return 1; //implement black list
}
-void SkyNet::notfound_cb(unsigned int callee_id)
+void SkyNet::notfound_cb(const unsigned char *callee_id)
{
- qDebug()<<"not found ("<<callee_id<<")\n";
+ qDebug()<<"not found ("<<QByteArray((const char*)callee_id, PICA_ID_SIZE).toBase64()<<")\n";
/*
if (skynet->msgqueues.contains(callee_id))
@@ -395,9 +395,9 @@ void SkyNet::notfound_cb(unsigned int callee_id)
*/
}
-void SkyNet::channel_closed_cb(unsigned int peer_id, int reason)
+void SkyNet::channel_closed_cb(const unsigned char *peer_id, int reason)
{
- qDebug()<<"channel closed ("<<peer_id<<")\n";
+ qDebug()<<"channel closed ("<<QByteArray((const char*)peer_id, PICA_ID_SIZE).toBase64()<<")\n";
}
@@ -407,11 +407,11 @@ void SkyNet::nodelist_cb(int type, void *addr_bin, const char *addr_str, unsigne
skynet->nodes.Add(nr);
}
-int SkyNet::peer_cert_verify_cb(unsigned int peer_id, const char *cert_pem, unsigned int nb)
+int SkyNet::peer_cert_verify_cb(const unsigned char *peer_id, const char *cert_pem, unsigned int nb)
{
bool verified = true;
- skynet->emit_PeerCertificateReceived(peer_id, QString::fromAscii(cert_pem, nb), &verified);
+ skynet->emit_PeerCertificateReceived(QByteArray((const char*)peer_id, PICA_ID_SIZE), QString::fromAscii(cert_pem, nb), &verified);
if (!verified)
return 0;
diff --git a/pica-client/skynet.h b/pica-client/skynet.h
index 4612e35..b9029a1 100644
--- a/pica-client/skynet.h
+++ b/pica-client/skynet.h
@@ -19,17 +19,17 @@ public:
QString& Status();
void Exit();
- void SendMessage(quint32 to, QString msg);
+ void SendMessage(QByteArray to, QString msg);
Accounts::AccountRecord CurrentAccount() {return skynet_account;};
signals:
- void MessageReceived(quint32 from, QString msg);
- void UnableToDeliver(quint32 to, QString msg);
- void Delivered(quint32 to);
+ void MessageReceived(QByteArray from, QString msg);
+ void UnableToDeliver(QByteArray to, QString msg);
+ void Delivered(QByteArray to);
void BecameSelfAware();
void LostSelfAwareness();
- void PeerCertificateReceived(quint32 peer_id, QString cert_pem, bool *verified);
- void CertificateForged(quint32 peer_id, QString received_cert, QString stored_cert);
+ void PeerCertificateReceived(QByteArray peer_id, QString cert_pem, bool *verified);
+ void CertificateForged(QByteArray peer_id, QString received_cert, QString stored_cert);
void ErrMsgFromNode(QString msg);
private:
@@ -40,44 +40,44 @@ private:
struct PICA_conninfo *nodelink;
Accounts::AccountRecord skynet_account;
QMutex write_mutex;
- QMap<quint32, QList<QString> > msgqueues;
+ QMap<QByteArray, QList<QString> > msgqueues;
int timer_id;
void timerEvent(QTimerEvent * e);
- void flush_msgqueue(quint32 to);
- struct PICA_chaninfo *find_active_chan(quint32 peer_id);
- QList<quint32> filter_existing_chans(QList<quint32> peer_ids);
+ void flush_msgqueue(QByteArray to);
+ struct PICA_chaninfo *find_active_chan(QByteArray peer_id);
+ QList<QByteArray> filter_existing_chans(QList<QByteArray> peer_ids);
- void emit_MessageReceived(quint32 from, QString msg);
- void emit_UnableToDeliver(quint32 to, QString msg);
- void emit_Delivered(quint32 to);
- void emit_PeerCertificateReceived(quint32 peer_id, QString cert_pem, bool *verified);
+ void emit_MessageReceived(QByteArray from, QString msg);
+ void emit_UnableToDeliver(QByteArray to, QString msg);
+ void emit_Delivered(QByteArray to);
+ void emit_PeerCertificateReceived(QByteArray peer_id, QString cert_pem, bool *verified);
//получение сообщения.
- static void newmsg_cb(unsigned int peer_id,char* msgbuf,unsigned int nb,int type);
+ static void newmsg_cb(const unsigned char *peer_id,char* msgbuf,unsigned int nb,int type);
//получение подтверждения о доставке сообщения
- static void msgok_cb(unsigned int peer_id);
+ static void msgok_cb(const unsigned char *peer_id);
//создание канала с собеседником
- static void channel_established_cb(unsigned int peer_id);
+ static void channel_established_cb(const unsigned char *peer_id);
//создать канал не удалось
- static void channel_failed(unsigned int peer_id);
+ static void channel_failed(const unsigned char *peer_id);
//входящий запрос на создание канала от пользователя с номером caller_id
- static int accept_cb(unsigned int caller_id);
+ static int accept_cb(const unsigned char *caller_id);
//запрошенный пользователь не найден, в оффлайне или отказался от общения
- static void notfound_cb(unsigned int callee_id);
+ static void notfound_cb(const unsigned char *callee_id);
- static void channel_closed_cb(unsigned int peer_id, int reason);
+ static void channel_closed_cb(const unsigned char *peer_id, int reason);
static void nodelist_cb(int type, void *addr_bin, const char *addr_str, unsigned int port);
- static int peer_cert_verify_cb(unsigned int peer_id, const char *cert_pem, unsigned int nb);
+ static int peer_cert_verify_cb(const unsigned char *peer_id, const char *cert_pem, unsigned int nb);
private slots:
void nodethread_finished();
void nodethread_connected(QString addr, quint16 port, NodeThread *thread);
void node_status_changed(QString addr,quint16 port,bool alive);
- void verify_peer_cert(quint32 peer_id, QString cert_pem, bool *verified);
+ void verify_peer_cert(QByteArray peer_id, QString cert_pem, bool *verified);
};
diff --git a/tests/test_client b/tests/test_client
index 1af0445..e900e8d 100755
--- a/tests/test_client
+++ b/tests/test_client
Binary files differ
diff --git a/tests/test_client.c b/tests/test_client.c
index dad82ae..f8ef157 100755
--- a/tests/test_client.c
+++ b/tests/test_client.c
@@ -125,7 +125,7 @@ PICA_client_init(&cbs);
printf("making connection...\n");
//PICA_new_connection(const char *nodeaddr, unsigned int port, const char *CA_file, const char *cert_file, const char *pkey_file, const char* password, struct PICA_conninfo **ci)
-ret=PICA_new_connection(argv[1], atoi(argv[2]), "trusted_CA.pem", argv[3],argv[3],NULL,&c);
+ret=PICA_new_connection(argv[1], atoi(argv[2]), /*"trusted_CA.pem"*/ argv[3], argv[3],argv[3],NULL,&c);
ERR_print_errors_fp(stdout);