Push query connect timeout back in to Xvnc
It was moved to the common code in f8e3b34c6, but it was unreliable
because the state could sometimes get out of sync. Push it back in
to Xvnc since it isn't necessarily something all servers will have.
diff --git a/common/rfb/ServerCore.cxx b/common/rfb/ServerCore.cxx
index 59a7cff..b1097a3 100644
--- a/common/rfb/ServerCore.cxx
+++ b/common/rfb/ServerCore.cxx
@@ -101,8 +101,3 @@
("QueryConnect",
"Prompt the local user to accept or reject incoming connections.",
false);
-rfb::IntParameter rfb::Server::queryConnectTimeout
-("QueryConnectTimeout",
- "Number of seconds to show the Accept Connection dialog before "
- "rejecting the connection",
- 10);
diff --git a/common/rfb/ServerCore.h b/common/rfb/ServerCore.h
index 37923cc..f915c7a 100644
--- a/common/rfb/ServerCore.h
+++ b/common/rfb/ServerCore.h
@@ -49,7 +49,6 @@
static BoolParameter sendCutText;
static BoolParameter acceptSetDesktopSize;
static BoolParameter queryConnect;
- static IntParameter queryConnectTimeout;
};
diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx
index b183c05..d9bb281 100644
--- a/common/rfb/VNCSConnectionST.cxx
+++ b/common/rfb/VNCSConnectionST.cxx
@@ -71,7 +71,7 @@
VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s,
bool reverse)
: sock(s), reverseConnection(reverse),
- queryConnectTimer(this), inProcessMessages(false),
+ inProcessMessages(false),
pendingSyncFence(false), syncFence(false), fenceFlags(0),
fenceDataLen(0), fenceData(NULL),
baseRTT(-1), congWindow(0), ackedOffset(0), sentOffset(0),
@@ -485,10 +485,8 @@
CharArray reason;
VNCServerST::queryResult qr = server->queryConnection(sock, userName,
&reason.buf);
- if (qr == VNCServerST::PENDING) {
- queryConnectTimer.start(rfb::Server::queryConnectTimeout * 1000);
+ if (qr == VNCServerST::PENDING)
return;
- }
// - If server returns ACCEPT/REJECT then pass result to SConnection
approveConnection(qr == VNCServerST::ACCEPT, reason.buf);
@@ -870,10 +868,6 @@
try {
if (t == &congestionTimer)
updateCongestion();
- else if (t == &queryConnectTimer) {
- if (state() == RFBSTATE_QUERYING)
- approveConnection(false, "The attempt to prompt the user to accept the connection failed");
- }
} catch (rdr::Exception& e) {
close(e.str());
}
diff --git a/common/rfb/VNCSConnectionST.h b/common/rfb/VNCSConnectionST.h
index 9b7b14b..42eb85a 100644
--- a/common/rfb/VNCSConnectionST.h
+++ b/common/rfb/VNCSConnectionST.h
@@ -185,8 +185,6 @@
CharArray peerEndpoint;
bool reverseConnection;
- Timer queryConnectTimer;
-
bool inProcessMessages;
bool pendingSyncFence, syncFence;
diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc
index dd1d4ca..c68a077 100644
--- a/unix/xserver/hw/vnc/XserverDesktop.cc
+++ b/unix/xserver/hw/vnc/XserverDesktop.cc
@@ -57,6 +57,11 @@
"Send keyboard events straight through and "
"avoid mapping them to the current keyboard "
"layout", false);
+IntParameter queryConnectTimeout("QueryConnectTimeout",
+ "Number of seconds to show the "
+ "Accept Connection dialog before "
+ "rejecting the connection",
+ 10);
class FileHTTPServer : public rfb::HTTPServer {
public:
@@ -107,7 +112,7 @@
server(0), httpServer(0),
listeners(listeners_), httpListeners(httpListeners_),
directFbptr(true),
- queryConnectId(0)
+ queryConnectId(0), queryConnectTimer(this)
{
format = pf;
@@ -301,7 +306,7 @@
{
int count;
- if (queryConnectId) {
+ if (queryConnectTimer.isStarted()) {
*reason = strDup("Another connection is currently being queried.");
return rfb::VNCServerST::REJECT;
}
@@ -319,6 +324,8 @@
queryConnectId = (uint32_t)(intptr_t)sock;
queryConnectSocket = sock;
+ queryConnectTimer.start(queryConnectTimeout * 1000);
+
return rfb::VNCServerST::PENDING;
}
@@ -557,14 +564,14 @@
{
*opaqueId = queryConnectId;
- if (queryConnectId == 0) {
+ if (!queryConnectTimer.isStarted()) {
*address = "";
*username = "";
*timeout = 0;
} else {
*address = queryConnectAddress.buf;
*username = queryConnectUsername.buf;
- *timeout = rfb::Server::queryConnectTimeout;
+ *timeout = queryConnectTimeout;
}
}
@@ -574,6 +581,7 @@
if (queryConnectId == opaqueId) {
server->approveConnection(queryConnectSocket, accept, rejectMsg);
queryConnectId = 0;
+ queryConnectTimer.stop();
}
}
@@ -783,3 +791,14 @@
vncKeyboardEvent(keysym, keycode, down);
}
+
+bool XserverDesktop::handleTimeout(Timer* t)
+{
+ if (t == &queryConnectTimer) {
+ server->approveConnection(queryConnectSocket, false,
+ "The attempt to prompt the user to "
+ "accept the connection failed");
+ }
+
+ return false;
+}
diff --git a/unix/xserver/hw/vnc/XserverDesktop.h b/unix/xserver/hw/vnc/XserverDesktop.h
index 9e7dfd1..2a378ea 100644
--- a/unix/xserver/hw/vnc/XserverDesktop.h
+++ b/unix/xserver/hw/vnc/XserverDesktop.h
@@ -47,7 +47,8 @@
class XserverDesktop : public rfb::SDesktop, public rfb::FullFramePixelBuffer,
public rdr::Substitutor,
- public rfb::VNCServerST::QueryConnectionHandler {
+ public rfb::VNCServerST::QueryConnectionHandler,
+ public rfb::Timer::Callback {
public:
XserverDesktop(int screenIndex,
@@ -113,6 +114,8 @@
network::SocketServer* sockserv,
bool read, bool write);
+ virtual bool handleTimeout(rfb::Timer* t);
+
private:
rfb::ScreenSet computeScreenLayout();
@@ -127,6 +130,7 @@
network::Socket* queryConnectSocket;
rfb::CharArray queryConnectAddress;
rfb::CharArray queryConnectUsername;
+ rfb::Timer queryConnectTimer;
#ifdef RANDR
typedef std::map<intptr_t, rdr::U32> OutputIdMap;