From 2ac91c7c70aa8a31055925181f8ace00a3774712 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 23 May 2016 10:31:49 -0400 Subject: [PATCH] Get all the MD5 key generation/matching functional for the server/bridge. Also add an internal 1 minute timer to the bridge connections just to check/remove any broken connections as necessary. --- src/bridge/BridgeConnection.cpp | 22 ++++++++++++++++++---- src/bridge/BridgeConnection.h | 4 +++- src/bridge/BridgeServer.cpp | 11 ++++++----- src/server/AuthorizationManager.cpp | 8 +++++++- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/bridge/BridgeConnection.cpp b/src/bridge/BridgeConnection.cpp index c3f80d1..f2a1ef6 100644 --- a/src/bridge/BridgeConnection.cpp +++ b/src/bridge/BridgeConnection.cpp @@ -26,6 +26,10 @@ BridgeConnection::BridgeConnection(QObject *parent, QWebSocket *sock, QString ID idletimer->start(); requestIdentify(); QTimer::singleShot(30000, this, SLOT(checkAuth())); + connCheckTimer = new QTimer(this); + connCheckTimer->setInterval(60000); //every 1 minute + connect(connCheckTimer, SIGNAL(timeout()), this, SLOT(checkConnection()) ); + connCheckTimer->start(); } BridgeConnection::~BridgeConnection(){ @@ -49,6 +53,10 @@ bool BridgeConnection::isServer(){ return serverconn; } +bool BridgeConnection::isActive(){ + return (SOCKET!=0 && SOCKET->isValid()); +} + QStringList BridgeConnection::validKeySums(){ return knownkeys; } @@ -119,7 +127,7 @@ void BridgeConnection::HandleAPIMessage(QString msg){ // - Return messages first (check ID) QString id = JM.value("id").toString(); if(id=="sysadm_bridge_request_ident"){ - qDebug() << "Got ident reply:" << JM; + //qDebug() << "Got ident reply:" << JM; serverconn = (JM.value("args").toObject().value("type").toString() == "server"); }else if("bridge_request_list_keys"){ QStringList keys = JsonArrayToStringList(JM.value("args").toObject().value("md5_keys").toArray()); @@ -149,7 +157,7 @@ void BridgeConnection::HandleAPIMessage(QString msg){ }else if(namesp == "rpc" && name=="auth_ssl"){ if(!args.contains("encrypted_string")){ //Stage 1 - send a random string to encrypt - qDebug() << "Connection Auth Init:" << SockID; + //qDebug() << "Connection Auth Init:" << SockID; QString key = AUTHSYSTEM->GenerateEncCheckString(); QJsonObject obj; obj.insert("test_string", key); outargs = obj; @@ -173,7 +181,7 @@ void BridgeConnection::HandleAPIMessage(QString msg){ //Valid auth - a couple more API calls available here }else{ - out.insert("name","error"); //unknown API call + out.insert("name","error"); //unkeys[i] << known API call } out.insert("args",outargs); SOCKET->sendTextMessage( QJsonDocument(out).toJson(QJsonDocument::Compact) ); @@ -183,6 +191,12 @@ void BridgeConnection::HandleAPIMessage(QString msg){ // ===================== // PRIVATE SLOTS // ===================== +void BridgeConnection::checkConnection(){ + if(SOCKET==0 && !SOCKET->isValid()){ + emit SocketClosed(SockID); + } +} + void BridgeConnection::checkIdle(){ if(SOCKET !=0){ if(SOCKET->isValid()){ @@ -260,7 +274,7 @@ void BridgeConnection::requestKeyList(){ QJsonObject args; args.insert("action","list_ssl_checksums"); obj.insert("args",args); - qDebug() << "Request Key List"; + //qDebug() << "Request Key List"; SOCKET->sendTextMessage( QJsonDocument(obj).toJson(QJsonDocument::Compact) ); } diff --git a/src/bridge/BridgeConnection.h b/src/bridge/BridgeConnection.h index dc22a5f..7b3a15f 100644 --- a/src/bridge/BridgeConnection.h +++ b/src/bridge/BridgeConnection.h @@ -17,11 +17,12 @@ public: QString ID(); void forwardMessage(QString msg); bool isServer(); + bool isActive(); QStringList validKeySums(); private: - QTimer *idletimer; + QTimer *idletimer, *connCheckTimer; QWebSocket *SOCKET; QString SockID, SockAuthToken, SockPeerIP; bool serverconn; @@ -36,6 +37,7 @@ private: void HandleAPIMessage(QString msg); private slots: + void checkConnection(); //Check if the connection was closed without announcement somehow void checkIdle(); //see if the currently-connected client is idle void checkAuth(); //see if the currently-connected client has authed yet void SocketClosing(); diff --git a/src/bridge/BridgeServer.cpp b/src/bridge/BridgeServer.cpp index 619d57c..4c3d1cd 100644 --- a/src/bridge/BridgeServer.cpp +++ b/src/bridge/BridgeServer.cpp @@ -115,7 +115,7 @@ QString BridgeServer::generateID(QString name){ void BridgeServer::NewSocketConnection(){ BridgeConnection *sock = 0; if(this->hasPendingConnections()){ - qDebug() << "New incoming connection.."; + //qDebug() << "New incoming connection.."; QWebSocket *ws = this->nextPendingConnection(); if(allowConnection(ws->peerAddress()) ){ QString name = ws->peerName(); @@ -200,15 +200,16 @@ void BridgeServer::announceKeyChange(QString ID, bool isServer, QStringList keys QStringList IDs; for(int i=0; iisActive()){ continue; } //skip right now (probably waiting on a signal that the connection closed) else if(OpenSockets[i]->isServer() != server){ //look for a server/client pair //compare keys to look for matches - /*QStringList chkkeys = OpenSockets[i ]->validKeySums(); + QStringList chkkeys = OpenSockets[i ]->validKeySums(); chkkeys.removeDuplicates(); - qDebug() << "Known Keys for ID:" << OpenSockets[i]->ID() << chkkeys; + //qDebug() << "Known Keys for ID:" << OpenSockets[i]->ID() << chkkeys; chkkeys << keys; - if(chkkeys.removeDuplicates() > 0){ */ + if(chkkeys.removeDuplicates() > 0){ IDs << OpenSockets[i]->ID(); - //} + } } }//end inner loop of sockets OpenSockets[c]->announceIDAvailability(IDs); diff --git a/src/server/AuthorizationManager.cpp b/src/server/AuthorizationManager.cpp index 02d5612..1e402ea 100644 --- a/src/server/AuthorizationManager.cpp +++ b/src/server/AuthorizationManager.cpp @@ -142,10 +142,16 @@ void AuthorizationManager::ListCertificateChecksums(QJsonObject *out){ keys.sort(); QJsonArray arr; QCryptographicHash chash(QCryptographicHash::Md5); + //qDebug() << "MD5 Generation:"; for(int i=0; iinsert("md5_keys", arr);