From e6aab2465493d6088c5218d888d9b77d069e514c Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Fri, 5 Oct 2018 16:59:22 +0200 Subject: [PATCH] Force common flow of connection queries Force queryConnection() to always call back to approveConnection() rather than return special values. This makes the flow easier to follow as it will be the same in all cases. --- common/rfb/VNCSConnectionST.cxx | 11 +---------- common/rfb/VNCSConnectionST.h | 9 +-------- common/rfb/VNCServerST.h | 25 ++++++++++--------------- unix/x0vncserver/x0vncserver.cxx | 10 ++++------ unix/xserver/hw/vnc/XserverDesktop.cc | 16 ++++++---------- unix/xserver/hw/vnc/XserverDesktop.h | 5 ++--- win/winvnc/VNCServerWin32.cxx | 16 ++++++++-------- win/winvnc/VNCServerWin32.h | 5 ++--- 8 files changed, 34 insertions(+), 63 deletions(-) diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index f1591f4c..cfefcca1 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -457,16 +457,7 @@ void VNCSConnectionST::queryConnection(const char* userName) } // - Get the server to display an Accept/Reject dialog, if required - // If a dialog is displayed, the result will be PENDING, and the - // server will call approveConnection at a later time - CharArray reason; - VNCServerST::queryResult qr = server->queryConnection(sock, userName, - &reason.buf); - if (qr == VNCServerST::PENDING) - return; - - // - If server returns ACCEPT/REJECT then pass result to SConnection - approveConnection(qr == VNCServerST::ACCEPT, reason.buf); + server->queryConnection(sock, userName); } void VNCSConnectionST::clientInit(bool shared) diff --git a/common/rfb/VNCSConnectionST.h b/common/rfb/VNCSConnectionST.h index dfc8bcb5..faa04793 100644 --- a/common/rfb/VNCSConnectionST.h +++ b/common/rfb/VNCSConnectionST.h @@ -78,6 +78,7 @@ namespace rfb { void serverCutTextOrClose(const char *str, int len); void setDesktopNameOrClose(const char *name); void setLEDStateOrClose(unsigned int state); + void approveConnectionOrClose(bool accept, const char* reason); // checkIdleTimeout() returns the number of milliseconds left until the // idle timeout expires. If it has expired, the connection is closed and @@ -110,14 +111,6 @@ namespace rfb { const char* getPeerEndpoint() const {return peerEndpoint.buf;} - // approveConnectionOrClose() is called some time after - // VNCServerST::queryConnection() has returned with PENDING to accept or - // reject the connection. The accept argument should be true for - // acceptance, or false for rejection, in which case a string reason may - // also be given. - - void approveConnectionOrClose(bool accept, const char* reason); - char* getStartTime(); void setStatus(int status); diff --git a/common/rfb/VNCServerST.h b/common/rfb/VNCServerST.h index b7845ddd..30a9c9ff 100644 --- a/common/rfb/VNCServerST.h +++ b/common/rfb/VNCServerST.h @@ -133,19 +133,13 @@ namespace rfb { // // queryConnection() is called when a connection has been // successfully authenticated. The sock and userName arguments identify - // the socket and the name of the authenticated user, if any. It should - // return ACCEPT if the connection should be accepted, REJECT if it should - // be rejected, or PENDING if a decision cannot yet be reached. If REJECT - // is returned, *reason can be set to a string describing the reason - this - // will be delete[]ed when it is finished with. If PENDING is returned, + // the socket and the name of the authenticated user, if any. // approveConnection() must be called some time later to accept or reject // the connection. - enum queryResult { ACCEPT, REJECT, PENDING }; struct QueryConnectionHandler { virtual ~QueryConnectionHandler() {} - virtual queryResult queryConnection(network::Socket* sock, - const char* userName, - char** reason) = 0; + virtual void queryConnection(network::Socket* sock, + const char* userName) = 0; }; void setQueryConnectionHandler(QueryConnectionHandler* qch) { queryConnectionHandler = qch; @@ -154,12 +148,13 @@ namespace rfb { // queryConnection is called as described above, and either passes the // request on to the registered handler, or accepts the connection if // no handler has been specified. - virtual queryResult queryConnection(network::Socket* sock, - const char* userName, - char** reason) { - return queryConnectionHandler - ? queryConnectionHandler->queryConnection(sock, userName, reason) - : ACCEPT; + virtual void queryConnection(network::Socket* sock, + const char* userName) { + if (queryConnectionHandler) { + queryConnectionHandler->queryConnection(sock, userName); + return; + } + approveConnection(sock, true, NULL); } // approveConnection() is called by the active QueryConnectionHandler, diff --git a/unix/x0vncserver/x0vncserver.cxx b/unix/x0vncserver/x0vncserver.cxx index c08572be..9b84ca29 100644 --- a/unix/x0vncserver/x0vncserver.cxx +++ b/unix/x0vncserver/x0vncserver.cxx @@ -87,12 +87,11 @@ public: ~QueryConnHandler() { delete queryConnectDialog; } // -=- VNCServerST::QueryConnectionHandler interface - virtual VNCServerST::queryResult queryConnection(network::Socket* sock, - const char* userName, - char** reason) { + virtual void queryConnection(network::Socket* sock, + const char* userName) { if (queryConnectSock) { - *reason = strDup("Another connection is currently being queried."); - return VNCServerST::REJECT; + server->approveConnection(sock, false, "Another connection is currently being queried."); + return; } if (!userName) userName = "(anonymous)"; queryConnectSock = sock; @@ -102,7 +101,6 @@ public: userName, queryConnectTimeout, this); queryConnectDialog->map(); - return VNCServerST::PENDING; } // -=- QueryResultCallback interface diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc index 04107dcb..89b55e69 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.cc +++ b/unix/xserver/hw/vnc/XserverDesktop.cc @@ -145,22 +145,20 @@ void XserverDesktop::refreshScreenLayout() server->setScreenLayout(::computeScreenLayout(&outputIdMap)); } -rfb::VNCServerST::queryResult -XserverDesktop::queryConnection(network::Socket* sock, - const char* userName, - char** reason) +void XserverDesktop::queryConnection(network::Socket* sock, + const char* userName) { int count; if (queryConnectTimer.isStarted()) { - *reason = strDup("Another connection is currently being queried."); - return rfb::VNCServerST::REJECT; + server->approveConnection(sock, false, "Another connection is currently being queried."); + return; } count = vncNotifyQueryConnect(); if (count == 0) { - *reason = strDup("Unable to query the local user to accept the connection."); - return rfb::VNCServerST::REJECT; + server->approveConnection(sock, false, "Unable to query the local user to accept the connection."); + return; } queryConnectAddress.replaceBuf(sock->getPeerAddress()); @@ -171,8 +169,6 @@ XserverDesktop::queryConnection(network::Socket* sock, queryConnectSocket = sock; queryConnectTimer.start(queryConnectTimeout * 1000); - - return rfb::VNCServerST::PENDING; } void XserverDesktop::bell() diff --git a/unix/xserver/hw/vnc/XserverDesktop.h b/unix/xserver/hw/vnc/XserverDesktop.h index 014fcb5f..6ea6104f 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.h +++ b/unix/xserver/hw/vnc/XserverDesktop.h @@ -96,9 +96,8 @@ public: virtual void grabRegion(const rfb::Region& r); // rfb::VNCServerST::QueryConnectionHandler callback - virtual rfb::VNCServerST::queryResult queryConnection(network::Socket* sock, - const char* userName, - char** reason); + virtual void queryConnection(network::Socket* sock, + const char* userName); protected: bool handleListenerEvent(int fd, diff --git a/win/winvnc/VNCServerWin32.cxx b/win/winvnc/VNCServerWin32.cxx index 9f6a954d..93bf5c0a 100644 --- a/win/winvnc/VNCServerWin32.cxx +++ b/win/winvnc/VNCServerWin32.cxx @@ -249,19 +249,19 @@ bool VNCServerWin32::setClientsStatus(rfb::ListConnInfo* LCInfo) { return queueCommand(SetClientsStatus, LCInfo, 0); } -VNCServerST::queryResult VNCServerWin32::queryConnection(network::Socket* sock, - const char* userName, - char** reason) +void VNCServerWin32::queryConnection(network::Socket* sock, + const char* userName) { - if (queryOnlyIfLoggedOn && CurrentUserToken().noUserLoggedOn()) - return VNCServerST::ACCEPT; + if (queryOnlyIfLoggedOn && CurrentUserToken().noUserLoggedOn()) { + vncServer.approveConnection(sock, true, NULL); + return; + } if (queryConnectDialog) { - *reason = rfb::strDup("Another connection is currently being queried."); - return VNCServerST::REJECT; + vncServer.approveConnection(sock, false, "Another connection is currently being queried."); + return; } queryConnectDialog = new QueryConnectDialog(sock, userName, this); queryConnectDialog->startDialog(); - return VNCServerST::PENDING; } void VNCServerWin32::queryConnectionComplete() { diff --git a/win/winvnc/VNCServerWin32.h b/win/winvnc/VNCServerWin32.h index 271cb76a..58c3f6c6 100644 --- a/win/winvnc/VNCServerWin32.h +++ b/win/winvnc/VNCServerWin32.h @@ -81,9 +81,8 @@ namespace winvnc { // VNCServerST::QueryConnectionHandler interface // Callback used to prompt user to accept or reject a connection. // CALLBACK IN VNCServerST "HOST" THREAD - virtual rfb::VNCServerST::queryResult queryConnection(network::Socket* sock, - const char* userName, - char** reason); + virtual void queryConnection(network::Socket* sock, + const char* userName); // SocketManager::AddressChangeNotifier interface // Used to keep tray icon up to date -- 2.39.5