diff --git a/src/bridge/BridgeConnection.cpp b/src/bridge/BridgeConnection.cpp index 3253ce0..47cacff 100644 --- a/src/bridge/BridgeConnection.cpp +++ b/src/bridge/BridgeConnection.cpp @@ -43,6 +43,14 @@ void BridgeConnection::forwardMessage(QString msg){ if(SOCKET!=0 && SOCKET->isValid()){ SOCKET->sendTextMessage(msg); } } +bool BridgeConnection::isServer(){ + return serverconn; +} + +QStringList BridgeConnection::validKeySums(){ + return knownkeys; +} + //======================= // PRIVATE //======================= @@ -108,6 +116,13 @@ void BridgeConnection::HandleAPIMessage(QString msg){ QString id = JM.value("id").toString(); if(id=="sysadm_bridge_request_ident"){ 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()); + //Now see what has changed (if anything) + if(keys!=knownkeys){ + knownkeys = keys; + emit keysChanged(SockID, serverconn, knownkeys); + } } //no response needed }else{ @@ -140,6 +155,7 @@ void BridgeConnection::HandleAPIMessage(QString msg){ array.append(SockAuthToken); array.append(AUTHSYSTEM->checkAuthTimeoutSecs(SockAuthToken)); outargs = array; + QTimer::singleShot(10 ,this, SLOT(requestKeyList()) ); }else{ out.insert("name","error"); outargs = "unauthorized"; @@ -213,3 +229,30 @@ void BridgeConnection::SslError(const QList &err){ //sslErrors() sign // ====================== // PUBLIC SLOTS // ====================== +void BridgeConnection::requestKeyList(){ + if(!AUTHSYSTEM->checkAuth(SockAuthToken)){ return; } //not authorized yet + QJsonObject obj; + obj.insert("id","bridge_request_list_keys"); + obj.insert("namespace","rpc"); + obj.insert("name","settings"); + QJsonObject args; + args.insert("action","list_ssl_checksums"); + obj.insert("args",args); + + SOCKET->sendTextMessage( QJsonDocument(obj).toJson(QJsonDocument::Compact) ); +} + +void BridgeConnection::announceIDAvailability(QStringList IDs){ + if(!AUTHSYSTEM->checkAuth(SockAuthToken)){ return; } //not authorized yet + if(lastKnownConnections == IDs){ return; } //don't announce changes when nothing changed + lastKnownConnections = IDs; //save for comparison later + QJsonObject obj; + obj.insert("id",""); + obj.insert("namespace","events"); + obj.insert("name","bridge"); + QJsonObject args; + args.insert("available_connections",QJsonArray::fromStringList(IDs)); + obj.insert("args",args); + + SOCKET->sendTextMessage( QJsonDocument(obj).toJson(QJsonDocument::Compact) ); +} diff --git a/src/bridge/BridgeConnection.h b/src/bridge/BridgeConnection.h index 9bc4f8d..490e7e1 100644 --- a/src/bridge/BridgeConnection.h +++ b/src/bridge/BridgeConnection.h @@ -18,11 +18,15 @@ public: void forwardMessage(QString msg); bool isServer(); + QStringList validKeySums(); + private: QTimer *idletimer; QWebSocket *SOCKET; QString SockID, SockAuthToken, SockPeerIP; bool serverconn; + QStringList knownkeys; + QStringList lastKnownConnections; //Simplification functions QString JsonValueToString(QJsonValue); @@ -46,10 +50,13 @@ private slots: void SslError(const QList&); //sslErrors() signal public slots: + void requestKeyList(); + void announceIDAvailability(QStringList IDs); signals: void SocketClosed(QString); //ID - void SocketMessage(QString, QString); + void SocketMessage(QString, QString); //toID / Message + void keysChanged(QString, bool, QStringList); //ID, isServer, goodkeys }; #endif diff --git a/src/bridge/BridgeServer.cpp b/src/bridge/BridgeServer.cpp index 3adf362..66e8950 100644 --- a/src/bridge/BridgeServer.cpp +++ b/src/bridge/BridgeServer.cpp @@ -12,12 +12,11 @@ //======================= BridgeServer::BridgeServer() : QWebSocketServer("sysadm-bridge", QWebSocketServer::SecureMode){ //Setup all the various settings - //AUTH = new AuthorizationManager(); connect(AUTHSYSTEM, SIGNAL(BlockHost(QHostAddress)), this, SLOT(BlackListConnection(QHostAddress)) ); } BridgeServer::~BridgeServer(){ - //delete AUTH; + } bool BridgeServer::startServer(quint16 port){ @@ -125,6 +124,7 @@ void BridgeServer::NewSocketConnection(){ //qDebug() << "New Socket Connection"; connect(sock, SIGNAL(SocketClosed(QString)), this, SLOT(SocketClosed(QString)) ); connect(sock, SIGNAL(SocketMessage(QString, QString)), this, SLOT(SendMessage(QString, QString)) ); + connect(sock, SIGNAL(keysChanged(QString, bool, QStringList)), this, SLOT(announceKeyChange(QString, bool, QStringList)) ); OpenSockets << sock; } @@ -183,3 +183,24 @@ void BridgeServer::SocketClosed(QString ID){ } QTimer::singleShot(0,this, SLOT(NewSocketConnection()) ); //check for a new connection } + +// Connection Keys Changed +void BridgeServer::announceKeyChange(QString ID, bool isServer, QStringList keys){ + for(int c = 0; cisServer(); + QStringList keys = OpenSockets[c]->validKeySums(); + keys.removeDuplicates(); + QStringList IDs; + for(int i=0; iisServer() != server){ //look for a server/client pair + //compare keys to look for matches + QStringList chkkeys = OpenSockets[i ]->validKeySums(); + chkkeys.removeDuplicates(); + chkkeys << keys; + if(chkkeys.removeDuplicates() > 0){ IDs << OpenSockets[i]->ID(); } + } + }//end inner loop of sockets + OpenSockets[c]->announceIDAvailability(IDs); + } //end loop over sockets to check +} diff --git a/src/bridge/BridgeServer.h b/src/bridge/BridgeServer.h index 4961743..becc1f4 100644 --- a/src/bridge/BridgeServer.h +++ b/src/bridge/BridgeServer.h @@ -49,6 +49,8 @@ private slots: void PeerVerifyError(const QSslError&); //peerVerifyError() signal void SslErrors(const QList&); //sslErrors() signal void SocketClosed(QString ID); + // Connection Keys Changed + void announceKeyChange(QString ID, bool isServer, QStringList keys); signals: void ForwardMessage(QString, QString); //toID, msg