summaryrefslogtreecommitdiff
path: root/distfoldd/clientagent.cc
diff options
context:
space:
mode:
Diffstat (limited to 'distfoldd/clientagent.cc')
-rw-r--r--distfoldd/clientagent.cc23
1 files changed, 18 insertions, 5 deletions
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;