From 15253d1995ea49b114ef5c627e15b661dbd602b2 Mon Sep 17 00:00:00 2001 From: "Javier S. Pedro" Date: Sun, 30 Sep 2012 19:41:17 +0200 Subject: add some trivial authentication --- distfoldd/clientagent.cc | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'distfoldd/clientagent.cc') diff --git a/distfoldd/clientagent.cc b/distfoldd/clientagent.cc index f77a21a..8eb6c44 100644 --- a/distfoldd/clientagent.cc +++ b/distfoldd/clientagent.cc @@ -2,14 +2,15 @@ #include "clientagent.h" -ClientAgent::ClientAgent(const QHostAddress& addr, uint port, const QDir& local_dir, SyncFlags flags, QObject *parent) : - Agent(new QSslSocket, local_dir, flags, parent) +ClientAgent::ClientAgent(const QHostAddress& addr, uint port, const QDir& local_dir, const QString& passwd, SyncFlags flags, QObject *parent) : + Agent(new QSslSocket, local_dir, passwd, flags, parent), + _state(STATE_HELLO), _challenge(generateChallenge()) { qDebug() << "Starting client agent at" << QDateTime::currentDateTime(); - _socket->setParent(this); // Can't set parent until QObject constructed + _socket->setParent(this); + _socket->setPeerVerifyMode(QSslSocket::QueryPeer); _socket->connectToHostEncrypted(addr.toString(), port); - sendMessage(MSG_HELLO); - _state = STATE_HELLO; + sendMessage(MSG_HELLO, encodeHelloMessage(_challenge)); } void ClientAgent::handleMessage(MessageType msg, const QByteArray &data) @@ -19,6 +20,18 @@ void ClientAgent::handleMessage(MessageType msg, const QByteArray &data) case MSG_HELLO_REPLY: Q_ASSERT(_state == STATE_HELLO); qDebug() << "Hello reply"; + Q_ASSERT(_socket->isEncrypted()); + _state = STATE_AUTH; + sendMessage(MSG_AUTH, generateChallengeResponse(data, _challenge)); + break; + case MSG_AUTH_REPLY: + Q_ASSERT(_state == STATE_AUTH); + qDebug() << "Auth reply"; + if (decodeAuthReply(data) != AUTH_OK) { + qWarning() << "Authentication failed!"; + _socket->close(); + return; + } _state = STATE_FILE_LIST; sendFileList(); break; -- cgit v1.2.3