Browse Source

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.
tags/v1.8.90
Pierre Ossman 6 years ago
parent
commit
3630475369

+ 0
- 5
common/rfb/ServerCore.cxx View File

@@ -101,8 +101,3 @@ rfb::BoolParameter rfb::Server::queryConnect
("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);

+ 0
- 1
common/rfb/ServerCore.h View File

@@ -49,7 +49,6 @@ namespace rfb {
static BoolParameter sendCutText;
static BoolParameter acceptSetDesktopSize;
static BoolParameter queryConnect;
static IntParameter queryConnectTimeout;

};


+ 2
- 8
common/rfb/VNCSConnectionST.cxx View File

@@ -71,7 +71,7 @@ static Cursor emptyCursor(0, 0, Point(0, 0), NULL);
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 @@ void VNCSConnectionST::queryConnection(const char* userName)
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 @@ bool VNCSConnectionST::handleTimeout(Timer* t)
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());
}

+ 0
- 2
common/rfb/VNCSConnectionST.h View File

@@ -185,8 +185,6 @@ namespace rfb {
CharArray peerEndpoint;
bool reverseConnection;

Timer queryConnectTimer;

bool inProcessMessages;

bool pendingSyncFence, syncFence;

+ 23
- 4
unix/xserver/hw/vnc/XserverDesktop.cc View File

@@ -57,6 +57,11 @@ BoolParameter rawKeyboard("RawKeyboard",
"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 @@ XserverDesktop::XserverDesktop(int screenIndex_,
server(0), httpServer(0),
listeners(listeners_), httpListeners(httpListeners_),
directFbptr(true),
queryConnectId(0)
queryConnectId(0), queryConnectTimer(this)
{
format = pf;

@@ -301,7 +306,7 @@ XserverDesktop::queryConnection(network::Socket* sock,
{
int count;

if (queryConnectId) {
if (queryConnectTimer.isStarted()) {
*reason = strDup("Another connection is currently being queried.");
return rfb::VNCServerST::REJECT;
}
@@ -319,6 +324,8 @@ XserverDesktop::queryConnection(network::Socket* sock,
queryConnectId = (uint32_t)(intptr_t)sock;
queryConnectSocket = sock;

queryConnectTimer.start(queryConnectTimeout * 1000);

return rfb::VNCServerST::PENDING;
}

@@ -557,14 +564,14 @@ void XserverDesktop::getQueryConnect(uint32_t* opaqueId,
{
*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 @@ void XserverDesktop::approveConnection(uint32_t opaqueId, bool accept,
if (queryConnectId == opaqueId) {
server->approveConnection(queryConnectSocket, accept, rejectMsg);
queryConnectId = 0;
queryConnectTimer.stop();
}
}

@@ -783,3 +791,14 @@ void XserverDesktop::keyEvent(rdr::U32 keysym, rdr::U32 keycode, bool down)

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;
}

+ 5
- 1
unix/xserver/hw/vnc/XserverDesktop.h View File

@@ -47,7 +47,8 @@ namespace network { class TcpListener; class Socket; class SocketServer; }

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 @@ protected:
network::SocketServer* sockserv,
bool read, bool write);

virtual bool handleTimeout(rfb::Timer* t);

private:
rfb::ScreenSet computeScreenLayout();

@@ -127,6 +130,7 @@ private:
network::Socket* queryConnectSocket;
rfb::CharArray queryConnectAddress;
rfb::CharArray queryConnectUsername;
rfb::Timer queryConnectTimer;

#ifdef RANDR
typedef std::map<intptr_t, rdr::U32> OutputIdMap;

Loading…
Cancel
Save