Browse Source

Remove Java web server

Applets don't work anymore so remove everything that has to do
with serving them.
tags/v1.9.90
Pierre Ossman 5 years ago
parent
commit
4a4453fc69

+ 0
- 102
common/rdr/SubstitutingInStream.h View File

@@ -1,102 +0,0 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/

#ifndef __RDR_SUBSTITUTINGINSTREAM_H__
#define __RDR_SUBSTITUTINGINSTREAM_H__

#include <rdr/InStream.h>
#include <rdr/Exception.h>

namespace rdr {

class Substitutor {
public:
virtual char* substitute(const char* varName) = 0;
};

class SubstitutingInStream : public InStream {
public:
SubstitutingInStream(InStream* underlying_, Substitutor* s,
int maxVarNameLen_)
: underlying(underlying_), dollar(0), substitutor(s), subst(0),
maxVarNameLen(maxVarNameLen_)
{
ptr = end = underlying->getptr();
varName = new char[maxVarNameLen+1];
}
~SubstitutingInStream() {
delete underlying;
delete [] varName;
delete [] subst;
}

int pos() { return underlying->pos(); }

virtual int overrun(int itemSize, int nItems, bool wait=true) {
if (itemSize != 1)
throw new rdr::Exception("SubstitutingInStream: itemSize must be 1");

if (subst) {
delete [] subst;
subst = 0;
} else {
underlying->setptr(ptr);
}

underlying->check(1);
ptr = underlying->getptr();
end = underlying->getend();
dollar = (const U8*)memchr(ptr, '$', end-ptr);
if (dollar) {
if (dollar == ptr) {
try {
int i = 0;
while (i < maxVarNameLen) {
varName[i++] = underlying->readS8();
varName[i] = 0;
subst = substitutor->substitute(varName);
if (subst) {
ptr = (U8*)subst;
end = (U8*)subst + strlen(subst);
break;
}
}
} catch (EndOfStream&) {
}

if (!subst)
dollar = (const U8*)memchr(ptr+1, '$', end-ptr-1);
}
if (!subst && dollar) end = dollar;
}

if (itemSize * nItems > end - ptr)
nItems = (end - ptr) / itemSize;

return nItems;
}

InStream* underlying;
const U8* dollar;
Substitutor* substitutor;
char* varName;
char* subst;
int maxVarNameLen;
};
}
#endif

+ 0
- 1
common/rfb/CMakeLists.txt View File

@@ -21,7 +21,6 @@ set(RFB_SOURCES
d3des.c
EncodeManager.cxx
Encoder.cxx
HTTPServer.cxx
HextileDecoder.cxx
HextileEncoder.cxx
JpegCompressor.cxx

+ 0
- 424
common/rfb/HTTPServer.cxx View File

@@ -1,424 +0,0 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/

#include <rfb/HTTPServer.h>
#include <rfb/LogWriter.h>
#include <rfb/util.h>
#include <rdr/MemOutStream.h>


using namespace rfb;
using namespace rdr;

static LogWriter vlog("HTTPServer");

const int clientWaitTimeMillis = 20000;
const int idleTimeoutSecs = 5 * 60;


//
// -=- LineReader
// Helper class which is repeatedly called until a line has been read
// (lines end in \n or \r\n).
// Returns true when line complete, and resets internal state so that
// next read() call will start reading a new line.
// Only one buffer is kept - process line before reading next line!
//

class LineReader : public CharArray {
public:
LineReader(InStream& is_, int l)
: CharArray(l), is(is_), pos(0), len(l), bufferOverrun(false) {}

// Returns true if line complete, false otherwise
bool read() {
while (is.checkNoWait(1)) {
char c = is.readU8();

if (c == '\n') {
if (pos && (buf[pos-1] == '\r'))
pos--;
bufferOverrun = false;
buf[pos++] = 0;
pos = 0;
return true;
}

if (pos == (len-1)) {
bufferOverrun = true;
buf[pos] = 0;
return true;
}

buf[pos++] = c;
}

return false;
}
bool didBufferOverrun() const {return bufferOverrun;}
protected:
InStream& is;
int pos, len;
bool bufferOverrun;
};


//
// -=- HTTPServer::Session
// Manages the internal state for an HTTP session.
// processHTTP returns true when request has completed,
// indicating that socket & session data can be deleted.
//

class rfb::HTTPServer::Session {
public:
Session(network::Socket& s, rfb::HTTPServer& srv)
: contentType(0), contentLength(-1), lastModified(-1),
line(s.inStream(), 256), sock(s),
server(srv), state(ReadRequestLine), lastActive(time(0)) {
}
~Session() {
}

void writeResponse(int result, const char* text);
bool writeResponse(int code);

bool processHTTP();

network::Socket* getSock() const {return &sock;}

int checkIdleTimeout();
protected:
CharArray uri;
const char* contentType;
int contentLength;
time_t lastModified;
LineReader line;
network::Socket& sock;
rfb::HTTPServer& server;
enum {ReadRequestLine, ReadHeaders, WriteResponse} state;
enum {GetRequest, HeadRequest} request;
time_t lastActive;
};


// - Internal helper routines

void
copyStream(InStream& is, OutStream& os) {
try {
while (1) {
os.writeU8(is.readU8());
}
} catch (rdr::EndOfStream&) {
}
}

void writeLine(OutStream& os, const char* text) {
os.writeBytes(text, strlen(text));
os.writeBytes("\r\n", 2);
}


// - Write an HTTP-compliant response to the client


void
HTTPServer::Session::writeResponse(int result, const char* text) {
char buffer[1024];
if (strlen(text) > 512)
throw new rdr::Exception("Internal error - HTTP response text too big");
sprintf(buffer, "%s %d %s", "HTTP/1.1", result, text);
OutStream& os=sock.outStream();
writeLine(os, buffer);
writeLine(os, "Server: TigerVNC/4.0");
time_t now = time(0);
struct tm* tm = gmtime(&now);
strftime(buffer, 1024, "Date: %a, %d %b %Y %H:%M:%S GMT", tm);
writeLine(os, buffer);
if (lastModified == (time_t)-1 || lastModified == 0)
lastModified = now;
tm = gmtime(&lastModified);
strftime(buffer, 1024, "Last-Modified: %a, %d %b %Y %H:%M:%S GMT", tm);
writeLine(os, buffer);
if (contentLength != -1) {
sprintf(buffer,"Content-Length: %d",contentLength);
writeLine(os, buffer);
}
writeLine(os, "Connection: close");
os.writeBytes("Content-Type: ", 14);
if (result == 200) {
if (!contentType)
contentType = guessContentType(uri.buf, "text/html");
os.writeBytes(contentType, strlen(contentType));
} else {
os.writeBytes("text/html", 9);
}
os.writeBytes("\r\n", 2);
writeLine(os, "");
if (result != 200) {
writeLine(os, "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">");
writeLine(os, "<HTML><HEAD>");
sprintf(buffer, "<TITLE>%d %s</TITLE>", result, text);
writeLine(os, buffer);
writeLine(os, "</HEAD><BODY><H1>");
writeLine(os, text);
writeLine(os, "</H1></BODY></HTML>");
sock.outStream().flush();
}
}

bool
HTTPServer::Session::writeResponse(int code) {
switch (code) {
case 200: writeResponse(code, "OK"); break;
case 400: writeResponse(code, "Bad Request"); break;
case 404: writeResponse(code, "Not Found"); break;
case 501: writeResponse(code, "Not Implemented"); break;
default: writeResponse(500, "Unknown Error"); break;
};

// This return code is passed straight out of processHTTP().
// true indicates that the request has been completely processed.
return true;
}

// - Main HTTP request processing routine

bool
HTTPServer::Session::processHTTP() {
lastActive = time(0);

while (sock.inStream().checkNoWait(1)) {

switch (state) {

// Reading the Request-Line
case ReadRequestLine:

// Either read a line, or run out of incoming data
if (!line.read())
return false;

// We have read a line! Skip it if it's blank
if (strlen(line.buf) == 0)
continue;

// The line contains a request to process.
{
char method[16], path[128], version[16];
int matched = sscanf(line.buf, "%15s%127s%15s",
method, path, version);
if (matched != 3)
return writeResponse(400);

// Store the required "method"
if (strcmp(method, "GET") == 0)
request = GetRequest;
else if (strcmp(method, "HEAD") == 0)
request = HeadRequest;
else
return writeResponse(501);

// Store the URI to the "document"
uri.buf = strDup(path);
}

// Move on to reading the request headers
state = ReadHeaders;
break;

// Reading the request headers
case ReadHeaders:

// Try to read a line
if (!line.read())
return false;

// Skip headers until we hit a blank line
if (strlen(line.buf) != 0)
continue;

// Headers ended - write the response!
{
CharArray address(sock.getPeerAddress());
vlog.info("getting %s for %s", uri.buf, address.buf);
contentLength = -1;
lastModified = -1;
InStream* data = server.getFile(uri.buf, &contentType, &contentLength,
&lastModified);
if (!data)
return writeResponse(404);

try {
writeResponse(200);
if (request == GetRequest)
copyStream(*data, sock.outStream());
sock.outStream().flush();
} catch (rdr::Exception& e) {
vlog.error("error writing HTTP document:%s", e.str());
}
delete data;
}

// The operation is complete!
return true;

default:
throw rdr::Exception("invalid HTTPSession state!");
};

}

// Indicate that we're still processing the HTTP request.
return false;
}

int HTTPServer::Session::checkIdleTimeout() {
time_t now = time(0);
int timeout = (lastActive + idleTimeoutSecs) - now;
if (timeout > 0)
return secsToMillis(timeout);
sock.shutdown();
return 0;
}

// -=- Constructor / destructor

HTTPServer::HTTPServer() {
}

HTTPServer::~HTTPServer() {
std::list<Session*>::iterator i;
for (i=sessions.begin(); i!=sessions.end(); i++)
delete *i;
}


// -=- SocketServer interface implementation

void
HTTPServer::addSocket(network::Socket* sock, bool) {
Session* s = new Session(*sock, *this);
if (!s) {
sock->shutdown();
} else {
sock->inStream().setTimeout(clientWaitTimeMillis);
sock->outStream().setTimeout(clientWaitTimeMillis);
sessions.push_front(s);
}
}

void
HTTPServer::removeSocket(network::Socket* sock) {
std::list<Session*>::iterator i;
for (i=sessions.begin(); i!=sessions.end(); i++) {
if ((*i)->getSock() == sock) {
delete *i;
sessions.erase(i);
return;
}
}
}

void
HTTPServer::processSocketReadEvent(network::Socket* sock) {
std::list<Session*>::iterator i;
for (i=sessions.begin(); i!=sessions.end(); i++) {
if ((*i)->getSock() == sock) {
try {
if ((*i)->processHTTP()) {
vlog.info("completed HTTP request");
sock->shutdown();
}
} catch (rdr::Exception& e) {
vlog.error("untrapped: %s", e.str());
sock->shutdown();
}
return;
}
}
throw rdr::Exception("invalid Socket in HTTPServer");
}

void
HTTPServer::processSocketWriteEvent(network::Socket* sock) {
std::list<Session*>::iterator i;
for (i=sessions.begin(); i!=sessions.end(); i++) {
if ((*i)->getSock() == sock) {
try {
sock->outStream().flush();
} catch (rdr::Exception& e) {
vlog.error("untrapped: %s", e.str());
sock->shutdown();
}
return;
}
}
throw rdr::Exception("invalid Socket in HTTPServer");
}

void HTTPServer::getSockets(std::list<network::Socket*>* sockets)
{
sockets->clear();
std::list<Session*>::iterator ci;
for (ci = sessions.begin(); ci != sessions.end(); ci++) {
sockets->push_back((*ci)->getSock());
}
}

int HTTPServer::checkTimeouts() {
std::list<Session*>::iterator ci;
int timeout = 0;
for (ci = sessions.begin(); ci != sessions.end(); ci++) {
soonestTimeout(&timeout, (*ci)->checkIdleTimeout());
}
return timeout;
}


// -=- Default getFile implementation

InStream*
HTTPServer::getFile(const char* name, const char** contentType,
int* contentLength, time_t* lastModified)
{
return 0;
}

const char*
HTTPServer::guessContentType(const char* name, const char* defType) {
CharArray file, ext;
if (!strSplit(name, '.', &file.buf, &ext.buf))
return defType;
if (strcasecmp(ext.buf, "html") == 0 ||
strcasecmp(ext.buf, "htm") == 0) {
return "text/html";
} else if (strcasecmp(ext.buf, "txt") == 0) {
return "text/plain";
} else if (strcasecmp(ext.buf, "gif") == 0) {
return "image/gif";
} else if (strcasecmp(ext.buf, "jpg") == 0) {
return "image/jpeg";
} else if (strcasecmp(ext.buf, "jar") == 0) {
return "application/java-archive";
} else if (strcasecmp(ext.buf, "exe") == 0) {
return "application/octet-stream";
}
return defType;
}

+ 0
- 111
common/rfb/HTTPServer.h View File

@@ -1,111 +0,0 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/

// -=- HTTPServer.h

// Single-threaded HTTP server implementation.
// All I/O is handled by the processSocketEvent routine,
// which is called by the main-loop of the VNC server whenever
// there is an event on an HTTP socket.

#ifndef __RFB_HTTP_SERVER_H__
#define __RFB_HTTP_SERVER_H__

#include <rdr/MemInStream.h>
#include <rfb/UpdateTracker.h>
#include <rfb/Configuration.h>
#include <network/Socket.h>
#include <time.h>

namespace rfb {

class HTTPServer : public network::SocketServer {
public:
// -=- Constructors

// - HTTPServer(files)
// Create an HTTP server which will use the getFile method
// to satisfy HTTP GET requests.
HTTPServer();

virtual ~HTTPServer();

// SocketServer interface

// addSocket()
// This causes the server to perform HTTP protocol on the
// supplied socket.
virtual void addSocket(network::Socket* sock, bool outgoing=false);

// removeSocket()
// Could clean up socket-specific resources here.
virtual void removeSocket(network::Socket* sock);

// getSockets() gets a list of sockets. This can be used to generate an
// fd_set for calling select().
virtual void getSockets(std::list<network::Socket*>* sockets);

// processSocketReadEvent()
// The platform-specific side of the server implementation calls
// this method whenever data arrives on one of the active
// network sockets.
virtual void processSocketReadEvent(network::Socket* sock);

// processSocketWriteEvent()
// Similar to processSocketReadEvent(), but called when it is
// possible to write more data to a socket.
virtual void processSocketWriteEvent(network::Socket* sock);

// Check for socket timeouts
virtual int checkTimeouts();


// -=- File interface

// - getFile is passed the path portion of a URL and returns an
// InStream containing the data to return. If the requested
// file is available then the contentType should be set to the
// type of the file, or left untouched if the file type is to
// be determined automatically by HTTPServer.
// If the file is not available then null is returned.
// Overridden getFile functions should call the default version
// if they do not recognise a path name.
// NB: The caller assumes ownership of the returned InStream.
// NB: The contentType is statically allocated by the getFile impl.
// NB: contentType is *guaranteed* to be valid when getFile is called.

virtual rdr::InStream* getFile(const char* name, const char** contentType,
int* contentLength, time_t* lastModified);

// - guessContentType is passed the name of a file and returns the
// name of an HTTP content type, based on the file's extension. If
// the extension isn't recognised then defType is returned. This can
// be used from getFile to easily default to the supplied contentType,
// or by passing zero in to determine whether a type is recognised or
// not.

static const char* guessContentType(const char* name, const char* defType);

protected:
class Session;
std::list<Session*> sessions;
};
}

#endif


+ 0
- 40
contrib/packages/rpm/el5/SPECS/tigervnc.spec View File

@@ -115,7 +115,6 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

# xorg requires newer versions of automake, & autoconf than are available with el5. Use el6 versions.
BuildRequires: automake >= 1.11, autoconf >= 2.60, libtool >= 1.4, gettext >= 0.14.4, gettext-devel >= 0.14.4, bison-devel, python26
BuildRequires: java-devel, jpackage-utils
BuildRequires: pam-devel
BuildRequires: cmake28
BuildRequires: pkgconfig >= 0.20
@@ -247,18 +246,6 @@ variety of platforms. This package contains minimal installation
of TigerVNC server, allowing others to access the desktop on your
machine.

%package server-applet
Summary: Java TigerVNC viewer applet for TigerVNC server
Group: User Interface/X
Requires: tigervnc-server, java, jpackage-utils
%if 0%{?fedora} >= 10 || 0%{?rhel} >= 6 || 0%{?centos} >= 6
BuildArch: noarch
%endif

%description server-applet
The Java TigerVNC viewer applet for web browsers. Install this package to allow
clients to use web browser when connect to the TigerVNC server.

%package license
Summary: License of TigerVNC suite
Group: User Interface/X
@@ -915,21 +902,6 @@ pushd media
make
popd

# Build Java applet
pushd java
%{cmake28} \
%if !%{_self_signed}
-DJAVA_KEYSTORE=%{_keystore} \
-DJAVA_KEYSTORE_TYPE=%{_keystore_type} \
-DJAVA_KEY_ALIAS=%{_key_alias} \
-DJAVA_STOREPASS=":env STOREPASS" \
-DJAVA_KEYPASS=":env KEYPASS" \
-DJAVA_TSA_URL=https://timestamp.geotrust.com/tsa .
%endif

JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8" make
popd

%install
make install DESTDIR=$RPM_BUILD_ROOT

@@ -948,13 +920,6 @@ mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
install -m644 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/init.d/vncserver
install -m644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/vncservers

# Install Java applet
pushd java
mkdir -p $RPM_BUILD_ROOT%{_datadir}/vnc/classes
install -m755 VncViewer.jar $RPM_BUILD_ROOT%{_datadir}/vnc/classes
install -m644 com/tigervnc/vncviewer/index.vnc $RPM_BUILD_ROOT%{_datadir}/vnc/classes
popd

%find_lang %{name} %{name}.lang

%if %{_bootstrap}
@@ -1024,11 +989,6 @@ fi
%{_mandir}/man1/vncconfig.1*
%{_libdir}/*

%files server-applet
%defattr(-,root,root,-)
%doc java/com/tigervnc/vncviewer/README
%{_datadir}/vnc/classes/*

%files license
%defattr(-,root,root,-)
%doc LICENCE.TXT

+ 0
- 38
contrib/packages/rpm/el6/SPECS/tigervnc.spec View File

@@ -37,7 +37,6 @@ BuildRequires: libdrm-devel, libXt-devel, pixman-devel libXfont-devel
BuildRequires: libxkbfile-devel, openssl-devel, libpciaccess-devel
BuildRequires: mesa-libGL-devel, libXinerama-devel, ImageMagick
BuildRequires: freetype-devel, libXdmcp-devel
BuildRequires: java-devel, jpackage-utils
BuildRequires: libjpeg-turbo-devel, pam-devel
BuildRequires: cmake >= 2.8
%if !%{_bootstrap}
@@ -120,16 +119,6 @@ This package contains libvnc.so module to X server, allowing others
to access the desktop on your machine.
%endif

%package server-applet
Summary: Java TigerVNC viewer applet for TigerVNC server
Group: User Interface/X
Requires: tigervnc-server, java, jpackage-utils
BuildArch: noarch

%description server-applet
The Java TigerVNC viewer applet for web browsers. Install this package to allow
clients to use web browser when connect to the TigerVNC server.

%package license
Summary: License of TigerVNC suite
Group: User Interface/X
@@ -326,21 +315,6 @@ pushd media
make
popd

# Build Java applet
pushd java
%{cmake} \
%if !%{_self_signed}
-DJAVA_KEYSTORE=%{_keystore} \
-DJAVA_KEYSTORE_TYPE=%{_keystore_type} \
-DJAVA_KEY_ALIAS=%{_key_alias} \
-DJAVA_STOREPASS=":env STOREPASS" \
-DJAVA_KEYPASS=":env KEYPASS" \
-DJAVA_TSA_URL=http://timestamp.geotrust.com/tsa .
%endif

make
popd

%install
%if %{_bootstrap}
for l in gmp libtasn1 nettle gnutls libpng fltk; do
@@ -364,13 +338,6 @@ mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
install -m644 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/init.d/vncserver
install -m644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/vncservers

# Install Java applet
pushd java
mkdir -p $RPM_BUILD_ROOT%{_datadir}/vnc/classes
install -m755 VncViewer.jar $RPM_BUILD_ROOT%{_datadir}/vnc/classes
install -m644 com/tigervnc/vncviewer/index.vnc $RPM_BUILD_ROOT%{_datadir}/vnc/classes
popd

%find_lang %{name} %{name}.lang

# remove unwanted files
@@ -433,11 +400,6 @@ fi
%{_libdir}/xorg/modules/extensions/libvnc.so
%endif

%files server-applet
%defattr(-,root,root,-)
%doc java/com/tigervnc/vncviewer/README
%{_datadir}/vnc/classes/*

%files license
%defattr(-,root,root,-)
%doc LICENCE.TXT

+ 0
- 38
contrib/packages/rpm/el7/SPECS/tigervnc.spec View File

@@ -32,7 +32,6 @@ BuildRequires: libdrm-devel, libXt-devel, pixman-devel libXfont-devel
BuildRequires: libxkbfile-devel, openssl-devel, libpciaccess-devel
BuildRequires: mesa-libGL-devel, libXinerama-devel, ImageMagick
BuildRequires: freetype-devel, libXdmcp-devel, libXfont2-devel
BuildRequires: java-devel, jpackage-utils
BuildRequires: libjpeg-turbo-devel, gnutls-devel, pam-devel
BuildRequires: systemd, cmake

@@ -114,16 +113,6 @@ This package contains libvnc.so module to X server, allowing others
to access the desktop on your machine.
%endif

%package server-applet
Summary: Java TigerVNC viewer applet for TigerVNC server
Group: User Interface/X
Requires: tigervnc-server, java, jpackage-utils
BuildArch: noarch

%description server-applet
The Java TigerVNC viewer applet for web browsers. Install this package to allow
clients to use web browser when connect to the TigerVNC server.

%package license
Summary: License of TigerVNC suite
Group: User Interface/X
@@ -250,21 +239,6 @@ pushd media
make
popd

# Build Java applet
pushd java
%{cmake} \
%if !%{_self_signed}
-DJAVA_KEYSTORE=%{_keystore} \
-DJAVA_KEYSTORE_TYPE=%{_keystore_type} \
-DJAVA_KEY_ALIAS=%{_key_alias} \
-DJAVA_STOREPASS=":env STOREPASS" \
-DJAVA_KEYPASS=":env KEYPASS" \
-DJAVA_TSA_URL=http://timestamp.geotrust.com/tsa .
%endif

make
popd

%install
%if %{_bootstrap}
for l in fltk; do
@@ -291,13 +265,6 @@ rm -rf %{buildroot}%{_initrddir}
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
install -m644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/vncservers

# Install Java applet
pushd java
mkdir -p $RPM_BUILD_ROOT%{_datadir}/vnc/classes
install -m755 VncViewer.jar $RPM_BUILD_ROOT%{_datadir}/vnc/classes
install -m644 com/tigervnc/vncviewer/index.vnc $RPM_BUILD_ROOT%{_datadir}/vnc/classes
popd

%find_lang %{name} %{name}.lang

# remove unwanted files
@@ -370,11 +337,6 @@ fi
%config %{_sysconfdir}/X11/xorg.conf.d/10-libvnc.conf
%endif

%files server-applet
%defattr(-,root,root,-)
%doc java/com/tigervnc/vncviewer/README
%{_datadir}/vnc/classes/*

%files license
%doc %{_docdir}/%{name}-%{version}/LICENCE.TXT


+ 0
- 9
java/CMakeLists.txt View File

@@ -177,12 +177,3 @@ add_custom_command(OUTPUT VncViewer.jar
-P ${SRCDIR}/cmake/SignJar.cmake)

add_custom_target(java ALL DEPENDS VncViewer.jar)

if(NOT WIN32)
install(FILES
${BINDIR}/VncViewer.jar
${SRCDIR}/${CLASSPATH}/README
${SRCDIR}/${CLASSPATH}/index.vnc
${SRCDIR}/${CLASSPATH}/favicon.ico
DESTINATION ${DATA_DIR}/vnc/classes)
endif()

+ 9
- 71
java/com/tigervnc/vncviewer/README View File

@@ -27,86 +27,24 @@ available.
Installation
============

There are three basic ways to use the TigerVNC Java Viewer:
The TigerVNC Java Viewer requires installation of either a JRE (Java
Runtime Environment) or a JDK (Java Development Kit). If VncViewer.jar is
in the current directory, then the TigerVNC Java Viewer can be launched
with the following command line:

1. Running the applet as part of a TigerVNC Server installation.
java -jar VncViewer.jar [parameters]

Both the Unix and Windows versions of the TigerVNC Server include a small
built-in HTTP server that can serve the TigerVNC Java Viewer to web
clients. This enables easy access to the shared desktop without the need
to install any software on the client machine.

The Unix TigerVNC Server (Xvnc) is able to serve up any set of files that
are present in a particular directory, which is specified in the -httpd
argument to Xvnc. The default version of the vncserver script will look
for a directory called vnc/classes, one level up from the directory
containing the vncserver script, then it will look for a directory called
/usr/share/vnc/classes, then /usr/local/vnc/classes. It will set the
-httpd argument to Xvnc to the first one of these VNC classes directories
it finds. Thus, one can easily deploy a modified version of the TigerVNC
Java Viewer by simply copying a new version of VncViewer.jar and/or
index.vnc into the VNC classes directory.

On Windows and Linux, the embedded applet can be drag-undocked from the
browser window and converted to a standalone application. The drag
gesture ALT+drag on Windows, and SHIFT+drag on Linux.

In the case of the Windows TigerVNC Server, VncViewer.jar and index.vnc
are embedded as resources in the WinVNC executable, so deploying a
modified version of the TigerVNC Java Viewer on a Windows server requires
rebuilding WinVNC.

2. Running the applet from a standalone web server.

Another possibility for using the TigerVNC Java Viewer is to install it
under a fully-functional HTTP server, such as Apache or IIS. Due to Java
security restrictions, the applet must be signed in order for it to
connect to a VNC server running on a different machine from the HTTP
server.

One can install the TigerVNC Java Viewer by simply copying the .class and
.jar files into a directory that is under the control of the HTTP server.
Also, an HTML page should be created to act as a the base document for the
TigerVNC Java Viewer applet (an example named index.html is provided in
this directory. Modify this file to suit your specific needs.)

3. Running the viewer as a standalone application.

Finally, the TigerVNC Java Viewer can be executed locally on the client
machine, but this method requires installation of either a JRE (Java
Runtime Environment) or a JDK (Java Development Kit). If VncViewer.jar is
in the current directory, then the TigerVNC Java Viewer can be launched
with the following command line:

java -jar VncViewer.jar [parameters]

Add an argument of -? to the above command line to print a list of
optional parameters supported by VncViewer.
Add an argument of -? to the above command line to print a list of
optional parameters supported by VncViewer.


Parameters
==========

The TigerVNC Java Viewer accepts a number of optional parameters, allowing you
to customize its behavior.

Parameters can be specified in one of the two ways, depending on how the
TigerVNC Java Viewer is used:

1. When the TigerVNC Java Viewer is run as an applet (embedded within an HTML
document), parameters should be specified using the <PARAM> HTML tags
within the appropriate <APPLET> section. Example:

<APPLET CODE=com.tigervnc.vncviewer.VncViewer ARCHIVE=VncViewer.jar
WIDTH=400 HEIGHT=300>
<PARAM NAME="PORT" VALUE=5901>
<PARAM NAME="ScalingFactor" VALUE=50>
</APPLET>

2. When run as a standalone application, the TigerVNC Java Viewer reads
parameters from the command line. Example:
to customize its behavior. Example:

java -jar VncViewer.jar Port=5901 ScalingFactor=50
java -jar VncViewer.jar Port=5901 ScalingFactor=50

Both parameter names and their values are case-insensitive.


BIN
java/com/tigervnc/vncviewer/favicon.ico View File


+ 0
- 20
java/com/tigervnc/vncviewer/index.html View File

@@ -1,20 +0,0 @@
<!--
index.html - an example HTML page for the TigerVNC Java Viewer applet, to
be used with a standalone web server. Before using this example, please
MAKE SURE to check the following:

* the CODE and ARCHIVE attributes of the <APPLET> tag should point to
the correct directory (this example assumes that this page is in the
same directory as VncViewer.jar);
-->

<HTML>
<TITLE>
TigerVNC desktop
</TITLE>
<APPLET CODE="com.tigervnc.vncviewer.VncViewer" ARCHIVE="VncViewer.jar"
WIDTH=500>
</APPLET>
<BR>
<A href="http://www.tigervnc.org/">TigerVNC site</A>
</HTML>

+ 0
- 22
java/com/tigervnc/vncviewer/index.vnc View File

@@ -1,22 +0,0 @@
<!--
index.vnc - default HTML page for TigerVNC Java viewer applet, to be
used with Xvnc. On any file ending in .vnc, the HTTP server embedded in
Xvnc will substitute the following variables when preceded by a dollar:
USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT,
Use two dollar signs ($$) to get a dollar sign in the generated
HTML page.
-->

<HTML>
<TITLE>
$USER's $DESKTOP desktop ($DISPLAY)
</TITLE>
<APPLET CODE=com.tigervnc.vncviewer.VncViewer ARCHIVE=VncViewer.jar
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
<param name=PORT value=$PORT>
<param name="Embed" value="true">
<param name="draggable" value="true">
</APPLET>
<BR>
<A href="http://www.tigervnc.org/">TigerVNC site</A>
</HTML>

+ 0
- 8
unix/vncserver View File

@@ -33,8 +33,6 @@ if($slashndx>=0) {
$exedir = substr($0, 0, $slashndx+1);
}

$vncClasses = "";

&SanityCheck();

#
@@ -44,9 +42,6 @@ $vncClasses = "";

$geometry = "1024x768";
#$depth = 16;
$vncJavaFiles = (((-d "$vncClasses") && "$vncClasses") ||
((-d "/usr/share/vnc/classes") && "/usr/share/vnc/classes") ||
((-d "/usr/local/vnc/classes") && "/usr/local/vnc/classes"));

$vncUserDir = "$ENV{HOME}/.vnc";
$vncUserConfig = "$vncUserDir/config";
@@ -206,7 +201,6 @@ my %config;
# We set some reasonable defaults. Config file settings
# override these where present.
$default_opts{desktop} = &quotedString($desktopName);
$default_opts{httpd} = $vncJavaFiles if ($vncJavaFiles);
$default_opts{auth} = &quotedString($xauthorityFile);
$default_opts{geometry} = $geometry if ($geometry);
$default_opts{depth} = $depth if ($depth);
@@ -848,7 +842,6 @@ sub SanityCheck
foreach $cmd ("Xvnc","vncpasswd") {
for (split(/:/,$ENV{PATH})) {
if (-x "$_/$cmd") {
$vncClasses = "$_/../vnc/classes";
next cmd2;
}
}
@@ -860,7 +853,6 @@ sub SanityCheck
foreach $cmd ($exedir."Xvnc",$exedir."vncpasswd") {
for (split(/:/,$ENV{PATH})) {
if (-x "$cmd") {
$vncClasses = $exedir."../vnc/classes";
next cmd3;
}
}

+ 1
- 126
unix/xserver/hw/vnc/XserverDesktop.cc View File

@@ -35,7 +35,6 @@
#include <network/Socket.h>
#include <rfb/Exception.h>
#include <rfb/VNCServerST.h>
#include <rfb/HTTPServer.h>
#include <rfb/LogWriter.h>
#include <rfb/Configuration.h>
#include <rfb/ServerCore.h>
@@ -67,54 +66,14 @@ IntParameter queryConnectTimeout("QueryConnectTimeout",
"rejecting the connection",
10);

class FileHTTPServer : public rfb::HTTPServer {
public:
FileHTTPServer(XserverDesktop* d) : desktop(d) {}
virtual ~FileHTTPServer() {}

virtual rdr::InStream* getFile(const char* name, const char** contentType,
int* contentLength, time_t* lastModified)
{
if (name[0] != '/' || strstr(name, "..") != 0) {
vlog.info("http request was for invalid file name");
return 0;
}

if (strcmp(name, "/") == 0) name = "/index.vnc";

CharArray httpDirStr(httpDir.getData());
CharArray fname(strlen(httpDirStr.buf)+strlen(name)+1);
sprintf(fname.buf, "%s%s", httpDirStr.buf, name);
int fd = open(fname.buf, O_RDONLY);
if (fd < 0) return 0;
rdr::InStream* is = new rdr::FdInStream(fd, -1, 0, true);
*contentType = guessContentType(name, *contentType);
if (strlen(name) > 4 && strcasecmp(&name[strlen(name)-4], ".vnc") == 0) {
is = new rdr::SubstitutingInStream(is, desktop, 20);
*contentType = "text/html";
} else {
struct stat st;
if (fstat(fd, &st) == 0) {
*contentLength = st.st_size;
*lastModified = st.st_mtime;
}
}
return is;
}

XserverDesktop* desktop;
};


XserverDesktop::XserverDesktop(int screenIndex_,
std::list<network::SocketListener*> listeners_,
std::list<network::SocketListener*> httpListeners_,
const char* name, const rfb::PixelFormat &pf,
int width, int height,
void* fbptr, int stride)
: screenIndex(screenIndex_),
server(0), httpServer(0),
listeners(listeners_), httpListeners(httpListeners_),
server(0), listeners(listeners_),
directFbptr(true),
queryConnectId(0), queryConnectTimer(this)
{
@@ -124,20 +83,11 @@ XserverDesktop::XserverDesktop(int screenIndex_,
setFramebuffer(width, height, fbptr, stride);
server->setQueryConnectionHandler(this);

if (!httpListeners.empty ())
httpServer = new FileHTTPServer(this);

for (std::list<SocketListener*>::iterator i = listeners.begin();
i != listeners.end();
i++) {
vncSetNotifyFd((*i)->getFd(), screenIndex, true, false);
}

for (std::list<SocketListener*>::iterator i = httpListeners.begin();
i != httpListeners.end();
i++) {
vncSetNotifyFd((*i)->getFd(), screenIndex, true, false);
}
}

XserverDesktop::~XserverDesktop()
@@ -147,14 +97,8 @@ XserverDesktop::~XserverDesktop()
delete listeners.back();
listeners.pop_back();
}
while (!httpListeners.empty()) {
vncRemoveNotifyFd(listeners.back()->getFd());
delete httpListeners.back();
httpListeners.pop_back();
}
if (!directFbptr)
delete [] data;
delete httpServer;
delete server;
}

@@ -201,56 +145,6 @@ void XserverDesktop::refreshScreenLayout()
server->setScreenLayout(::computeScreenLayout(&outputIdMap));
}

char* XserverDesktop::substitute(const char* varName)
{
if (strcmp(varName, "$$") == 0) {
return rfb::strDup("$");
}
if (strcmp(varName, "$PORT") == 0) {
char* str = new char[10];
sprintf(str, "%d", listeners.empty () ? 0 : (*listeners.begin ())->getMyPort());
return str;
}
if (strcmp(varName, "$WIDTH") == 0) {
char* str = new char[10];
sprintf(str, "%d", width());
return str;
}
if (strcmp(varName, "$HEIGHT") == 0) {
char* str = new char[10];
sprintf(str, "%d", height());
return str;
}
if (strcmp(varName, "$APPLETWIDTH") == 0) {
char* str = new char[10];
sprintf(str, "%d", width());
return str;
}
if (strcmp(varName, "$APPLETHEIGHT") == 0) {
char* str = new char[10];
sprintf(str, "%d", height());
return str;
}
if (strcmp(varName, "$DESKTOP") == 0) {
return rfb::strDup(server->getName());
}
if (strcmp(varName, "$DISPLAY") == 0) {
struct utsname uts;
uname(&uts);
char* str = new char[256];
strncpy(str, uts.nodename, 240);
str[239] = '\0'; /* Ensure string is zero-terminated */
strcat(str, ":");
strncat(str, vncGetDisplay(), 10);
return str;
}
if (strcmp(varName, "$USER") == 0) {
struct passwd* user = getpwuid(getuid());
return rfb::strDup(user ? user->pw_name : "?");
}
return 0;
}

rfb::VNCServerST::queryResult
XserverDesktop::queryConnection(network::Socket* sock,
const char* userName,
@@ -370,14 +264,10 @@ void XserverDesktop::handleSocketEvent(int fd, bool read, bool write)
if (read) {
if (handleListenerEvent(fd, &listeners, server))
return;
if (handleListenerEvent(fd, &httpListeners, httpServer))
return;
}

if (handleSocketEvent(fd, server, read, write))
return;
if (handleSocketEvent(fd, httpServer, read, write))
return;

vlog.error("Cannot find file descriptor for socket event");
} catch (rdr::Exception& e) {
@@ -458,21 +348,6 @@ void XserverDesktop::blockHandler(int* timeout)
vncSetNotifyFd(fd, screenIndex, true, (*i)->outStream().bufferUsage() > 0);
}
}
if (httpServer) {
httpServer->getSockets(&sockets);
for (i = sockets.begin(); i != sockets.end(); i++) {
int fd = (*i)->getFd();
if ((*i)->isShutdown()) {
vlog.debug("http client gone, sock %d",fd);
vncRemoveNotifyFd(fd);
httpServer->removeSocket(*i);
delete (*i);
} else {
/* Update existing NotifyFD to listen for write (or not) */
vncSetNotifyFd(fd, screenIndex, true, (*i)->outStream().bufferUsage() > 0);
}
}
}

// We are responsible for propagating mouse movement between clients
int cursorX, cursorY;

+ 0
- 9
unix/xserver/hw/vnc/XserverDesktop.h View File

@@ -32,11 +32,9 @@
#include <stdint.h>

#include <rfb/SDesktop.h>
#include <rfb/HTTPServer.h>
#include <rfb/PixelBuffer.h>
#include <rfb/Configuration.h>
#include <rfb/VNCServerST.h>
#include <rdr/SubstitutingInStream.h>
#include <unixcommon.h>
#include "Input.h"

@@ -47,14 +45,12 @@ namespace rfb {
namespace network { class SocketListener; class Socket; class SocketServer; }

class XserverDesktop : public rfb::SDesktop, public rfb::FullFramePixelBuffer,
public rdr::Substitutor,
public rfb::VNCServerST::QueryConnectionHandler,
public rfb::Timer::Callback {
public:

XserverDesktop(int screenIndex,
std::list<network::SocketListener*> listeners_,
std::list<network::SocketListener*> httpListeners_,
const char* name, const rfb::PixelFormat &pf,
int width, int height, void* fbptr, int stride);
virtual ~XserverDesktop();
@@ -99,9 +95,6 @@ public:
// rfb::PixelBuffer callbacks
virtual void grabRegion(const rfb::Region& r);

// rdr::Substitutor callback
virtual char* substitute(const char* varName);

// rfb::VNCServerST::QueryConnectionHandler callback
virtual rfb::VNCServerST::queryResult queryConnection(network::Socket* sock,
const char* userName,
@@ -121,9 +114,7 @@ private:

int screenIndex;
rfb::VNCServerST* server;
rfb::HTTPServer* httpServer;
std::list<network::SocketListener*> listeners;
std::list<network::SocketListener*> httpListeners;
bool directFbptr;

uint32_t queryConnectId;

+ 0
- 13
unix/xserver/hw/vnc/Xvnc.man View File

@@ -107,19 +107,6 @@ viewer has finished sending or receiving a message - note that this does not
mean an update will be aborted after this time. Default is 20000 (20 seconds).
.
.TP
.B \-httpd \fIdirectory\fP
Run a mini-HTTP server which serves files from the given directory. Normally
the directory will contain the classes for the Java viewer. In addition, files
with a .vnc extension will have certain substitutions made so that a single
installation of the Java VNC viewer can be served by separate instances of
Xvnc.
.
.TP
.B \-httpPort \fIport\fP
Specifies the port on which the mini-HTTP server runs. Default is 5800 plus
the display number.
.
.TP
.B \-rfbauth \fIpasswd-file\fP, \-PasswordFile \fIpasswd-file\fP
Password file for VNC authentication. There is no default, you should
specify the password file explicitly. Password file should be created with

+ 0
- 21
unix/xserver/hw/vnc/vncExtInit.cc View File

@@ -73,10 +73,6 @@ struct CaseInsensitiveCompare {
typedef std::set<std::string, CaseInsensitiveCompare> ParamSet;
static ParamSet allowOverrideSet;

rfb::StringParameter httpDir("httpd",
"Directory containing files to serve via HTTP",
"");
rfb::IntParameter httpPort("httpPort", "TCP port to listen for HTTP",0);
rfb::AliasParameter rfbwait("rfbwait", "Alias for ClientWaitTimeMillis",
&rfb::Server::clientWaitTimeMillis);
rfb::IntParameter rfbport("rfbport", "TCP port to listen for RFB protocol",0);
@@ -177,7 +173,6 @@ void vncExtensionInit(void)

if (!desktop[scr]) {
std::list<network::SocketListener*> listeners;
std::list<network::SocketListener*> httpListeners;
if (scr == 0 && vncInetdSock != -1) {
if (network::isSocketListening(vncInetdSock))
{
@@ -214,21 +209,6 @@ void vncExtensionInit(void)
vlog.info("Listening for VNC connections on %s interface(s), port %d",
localhostOnly ? "local" : (const char*)interface,
port);

CharArray httpDirStr(httpDir.getData());
if (httpDirStr.buf[0]) {
port = httpPort;
if (port == 0) port = 5800 + atoi(vncGetDisplay());
port += 1000 * scr;
if (localhostOnly)
network::createLocalTcpListeners(&httpListeners, port);
else
network::createTcpListeners(&httpListeners, addr, port);

vlog.info("Listening for HTTP connections on %s interface(s), port %d",
localhostOnly ? "local" : (const char*)interface,
port);
}
}

CharArray desktopNameStr(desktopName.getData());
@@ -237,7 +217,6 @@ void vncExtensionInit(void)
vncSetGlueContext(scr);
desktop[scr] = new XserverDesktop(scr,
listeners,
httpListeners,
desktopNameStr.buf,
pf,
vncGetScreenWidth(),

+ 0
- 7
unix/xserver/hw/vnc/vncExtInit.h View File

@@ -23,13 +23,6 @@
#include <stddef.h>
#include <sys/select.h>

// Only from C++
#ifdef __cplusplus
namespace rfb { class StringParameter; };

extern rfb::StringParameter httpDir;
#endif

#ifdef __cplusplus
extern "C" {
#endif

+ 0
- 15
win/rfb_win32/SDisplay.cxx View File

@@ -314,21 +314,6 @@ void SDisplay::clientCutText(const char* text, int len) {
}


Point SDisplay::getFbSize() {
bool startAndStop = !core;

// If not started, do minimal initialisation to get desktop size.
if (startAndStop)
recreatePixelBuffer();
Point result = Point(pb->width(), pb->height());

// Destroy the initialised structures.
if (startAndStop)
stopCore();
return result;
}


void
SDisplay::notifyClipboardChanged(const char* text, int len) {
vlog.debug("clipboard text changed");

+ 0
- 6
win/rfb_win32/SDisplay.h View File

@@ -86,12 +86,6 @@ namespace rfb {

void setStatusLocation(bool* status) {statusLocation = status;}

// -=- Used (indirectly) by JavaViewer to get desktop size

Point getFbSize();

friend class SDisplayCore;

static IntParameter updateMethod;
static BoolParameter disableLocalInputs;
static StringParameter disconnectAction;

+ 0
- 31
win/vncconfig/Connections.h View File

@@ -27,8 +27,6 @@
#include <rfb/Blacklist.h>
#include <network/TcpSocket.h>

static rfb::IntParameter http_port("HTTPPortNumber",
"TCP/IP port on which the server will serve the Java applet VNC Viewer ", 5800);
static rfb::IntParameter port_number("PortNumber",
"TCP/IP port on which the server will accept connections", 5900);
static rfb::StringParameter hosts("Hosts",
@@ -96,10 +94,6 @@ namespace rfb {
setItemInt(IDC_PORT, port_number ? port_number : 5900);
setItemChecked(IDC_RFB_ENABLE, port_number != 0);
setItemInt(IDC_IDLE_TIMEOUT, rfb::Server::idleTimeout);
vlog.debug("set IDC_HTTP_PORT %d", (int)http_port);
setItemInt(IDC_HTTP_PORT, http_port ? http_port : 5800);
setItemChecked(IDC_HTTP_ENABLE, http_port != 0);
enableItem(IDC_HTTP_PORT, http_port != 0);
setItemChecked(IDC_LOCALHOST, localHost);

HWND listBox = GetDlgItem(handle, IDC_HOSTS);
@@ -133,26 +127,14 @@ namespace rfb {
return true;

case IDC_PORT:
if (cmd == EN_CHANGE) {
try {
setItemInt(IDC_HTTP_PORT, rfbPortToHTTP(getItemInt(IDC_PORT)));
} catch (...) {
}
}
case IDC_HTTP_PORT:
case IDC_IDLE_TIMEOUT:
if (cmd == EN_CHANGE)
setChanged(isChanged());
return false;

case IDC_HTTP_ENABLE:
case IDC_RFB_ENABLE:
case IDC_LOCALHOST:
{
// HTTP port
enableItem(IDC_HTTP_PORT, isItemChecked(IDC_HTTP_ENABLE) && isItemChecked(IDC_RFB_ENABLE));
enableItem(IDC_HTTP_ENABLE, isItemChecked(IDC_RFB_ENABLE));

// RFB port
enableItem(IDC_PORT, isItemChecked(IDC_RFB_ENABLE));

@@ -245,8 +227,6 @@ namespace rfb {
bool onOk() {
regKey.setInt(_T("PortNumber"), isItemChecked(IDC_RFB_ENABLE) ? getItemInt(IDC_PORT) : 0);
regKey.setInt(_T("IdleTimeout"), getItemInt(IDC_IDLE_TIMEOUT));
regKey.setInt(_T("HTTPPortNumber"), isItemChecked(IDC_HTTP_ENABLE) && isItemChecked(IDC_RFB_ENABLE)
? getItemInt(IDC_HTTP_PORT) : 0);
regKey.setInt(_T("LocalHost"), isItemChecked(IDC_LOCALHOST));
regKey.setString(_T("Hosts"), TCharArray(getHosts()).buf);
return true;
@@ -258,8 +238,6 @@ namespace rfb {
return (strcmp(new_hosts.buf, old_hosts.buf) != 0) ||
(localHost != isItemChecked(IDC_LOCALHOST)) ||
(port_number != getItemInt(IDC_PORT)) ||
(http_port != getItemInt(IDC_HTTP_PORT)) ||
((http_port!=0) != (isItemChecked(IDC_HTTP_ENABLE)!=0)) ||
(rfb::Server::idleTimeout != getItemInt(IDC_IDLE_TIMEOUT));
} catch (rdr::Exception&) {
return false;
@@ -281,15 +259,6 @@ namespace rfb {
}
return strDup(hosts_str.buf);
}
int rfbPortToHTTP(int rfbPort) {
int offset = -100;
if (http_port)
offset = http_port - port_number;
int httpPort = rfbPort + offset;
if (httpPort <= 0)
httpPort = rfbPort;
return httpPort;
}

protected:
RegKey regKey;

+ 0
- 4
win/vncconfig/Legacy.cxx View File

@@ -192,10 +192,6 @@ void LegacyPage::LoadPrefs()

void LegacyPage::LoadUserPrefs(const RegKey& key)
{
if (key.getBool(_T("HTTPConnect"), true))
regKey.setInt(_T("HTTPPortNumber"), key.getInt(_T("PortNumber"), 5900)-100);
else
regKey.setInt(_T("HTTPPortNumber"), 0);
regKey.setInt(_T("PortNumber"), key.getBool(_T("SocketConnect")) ? key.getInt(_T("PortNumber"), 5900) : 0);
if (key.getBool(_T("AutoPortSelect"), false)) {
MsgBox(0, _T("The AutoPortSelect setting is not supported by this release.")

+ 0
- 2
win/vncconfig/resource.h View File

@@ -52,8 +52,6 @@
#define IDC_BUILDTIME 1040
#define IDC_VERSION 1041
#define IDC_COPYRIGHT 1042
#define IDC_HTTP_ENABLE 1043
#define IDC_HTTP_PORT 1044
#define IDC_BL_THRESHOLD 1046
#define IDC_BL_TIMEOUT 1047
#define IDC_AFFECT_SCREENSAVER 1048

+ 0
- 3
win/vncconfig/vncconfig.rc View File

@@ -110,9 +110,6 @@ BEGIN
LTEXT "Disconnect idle clients after (seconds):",IDC_STATIC,7,
25,138,15,SS_CENTERIMAGE
EDITTEXT IDC_IDLE_TIMEOUT,150,25,61,15,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "Serve Java viewer via HTTP on port:",IDC_HTTP_ENABLE,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,40,138,15
EDITTEXT IDC_HTTP_PORT,150,40,61,15,ES_AUTOHSCROLL | ES_NUMBER
GROUPBOX "Access Control",IDC_STATIC,7,55,204,135
CONTROL "Only accept connections from the local machine",
IDC_LOCALHOST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,

+ 1
- 12
win/winvnc/CMakeLists.txt View File

@@ -1,29 +1,18 @@
include_directories(${CMAKE_BINARY_DIR}/win ${CMAKE_CURRENT_SOURCE_DIR})

set(VNCVIEWER_JAR_PATH ${CMAKE_BINARY_DIR}/java/VncViewer.jar)
set(INDEX_VNC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/index.vnc)

configure_file(winvnc.rc.in winvnc.rc)

add_executable(winvnc4 WIN32
buildTime.cxx
ControlPanel.cxx
JavaViewer.cxx
ManagedListener.cxx
QueryConnectDialog.cxx
STrayIcon.cxx
VNCServerService.cxx
VNCServerWin32.cxx
winvnc.cxx
${CMAKE_CURRENT_BINARY_DIR}/winvnc.rc)
winvnc.rc)

target_link_libraries(winvnc4 rfb rfb_win32 network rdr ws2_32.lib)

if(BUILD_JAVA)
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/winvnc.rc
PROPERTIES OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/java/VncViewer.jar)
endif()

install(TARGETS winvnc4
RUNTIME DESTINATION ${BIN_DIR}
)

+ 0
- 107
win/winvnc/JavaViewer.cxx View File

@@ -1,107 +0,0 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/

#include <winvnc/JavaViewer.h>
#include <winvnc/VNCServerWin32.h>
#include <winvnc/resource.h>
#include <rdr/MemInStream.h>
#include <rfb/LogWriter.h>
#include <rfb/VNCServerST.h>
#include <rfb_win32/TCharArray.h>

#include <windows.h>

using namespace winvnc;
using namespace rfb;


static rfb::LogWriter vlog("JavaViewerServer");

JavaViewerServer::JavaViewerServer(VNCServerWin32* svr) : server(svr) {
}

JavaViewerServer::~JavaViewerServer() {
}

rdr::InStream* JavaViewerServer::getFile(const char* name,
const char** contentType,
int* contentLength,
time_t* lastModified)
{
if (strcmp(name, "/") == 0)
name = "/index.vnc";
if (strcmp(name, "/VncViewer.jar") == 0)
name = "VncViewer.jar";
if (strcmp(name, "/index.vnc") == 0)
name = "index.vnc";

HRSRC resource = FindResource(0, TStr(name), _T("HTTPFILE"));
if (!resource) return 0;
HGLOBAL handle = LoadResource(0, resource);
if (!handle) return 0;
void* buf = LockResource(handle);
int len = SizeofResource(0, resource);

rdr::InStream* is = new rdr::MemInStream(buf, len);
if (strlen(name) > 4 && strcasecmp(&name[strlen(name)-4], ".vnc") == 0) {
is = new rdr::SubstitutingInStream(is, this, 20);
*contentType = "text/html";
}
return is;
}

char* JavaViewerServer::substitute(const char* varName)
{
if (strcmp(varName, "$$") == 0) {
return rfb::strDup("$");
}
if (strcmp(varName, "$PORT") == 0) {
char* str = new char[10];
sprintf(str, "%d", rfbPort);
return str;
}
if (strcmp(varName, "$WIDTH") == 0) {
char* str = new char[10];
sprintf(str, "%d", server->getDesktopSize().x);
return str;
}
if (strcmp(varName, "$HEIGHT") == 0) {
char* str = new char[10];
sprintf(str, "%d", server->getDesktopSize().y);
return str;
}
if (strcmp(varName, "$APPLETWIDTH") == 0) {
char* str = new char[10];
sprintf(str, "%d", server->getDesktopSize().x);
return str;
}
if (strcmp(varName, "$APPLETHEIGHT") == 0) {
char* str = new char[10];
sprintf(str, "%d", server->getDesktopSize().y);
return str;
}
if (strcmp(varName, "$DESKTOP") == 0) {
return rfb::strDup(server->getName());
}
if (strcmp(varName, "$USER") == 0) {
char tempStr[256]; DWORD tempStrLen = 256;
GetUserName(tempStr, &tempStrLen);
return rfb::strDup(tempStr);
}
return 0;
}

+ 0
- 56
win/winvnc/JavaViewer.h View File

@@ -1,56 +0,0 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/

// -=- JavaViewer.h

// Custom HTTPServer-derived class which serves the Java VNC Viewer
// to clients, using resource files compiled in to the WinVNC executable.

#ifndef WINVNC_JAVA_VIEWER
#define WINVNC_JAVA_VIEWER

#include <rfb/HTTPServer.h>
#include <rdr/SubstitutingInStream.h>

namespace winvnc {

class VNCServerWin32;

class JavaViewerServer : public rfb::HTTPServer, public rdr::Substitutor {
public:
JavaViewerServer(VNCServerWin32* desktop);
virtual ~JavaViewerServer();

virtual rdr::InStream* getFile(const char* name, const char** contentType,
int* contentLength, time_t* lastModified);

// rdr::Substitutor callback
virtual char* substitute(const char* varName);

void setRFBport(int port) {
rfbPort = port;
}
protected:
int rfbPort;
VNCServerWin32* server;
};

};

#endif


+ 1
- 10
win/winvnc/VNCServerWin32.cxx View File

@@ -42,8 +42,6 @@ static LogWriter vlog("VNCServerWin32");
const TCHAR* winvnc::VNCServerWin32::RegConfigPath = _T("Software\\TigerVNC\\WinVNC4");


static IntParameter http_port("HTTPPortNumber",
"TCP/IP port on which the server will serve the Java applet VNC Viewer ", 5800);
static IntParameter port_number("PortNumber",
"TCP/IP port on which the server will accept connections", 5900);
static StringParameter hosts("Hosts",
@@ -63,8 +61,7 @@ VNCServerWin32::VNCServerWin32()
CreateEvent(0, FALSE, FALSE, "Global\\SessionEventTigerVNC") : 0),
vncServer(CStr(ComputerName().buf), &desktop),
thread_id(-1), runServer(false), isDesktopStarted(false),
httpServer(this), config(&sockMgr),
rfbSock(&sockMgr), httpSock(&sockMgr), trayIcon(0),
config(&sockMgr), rfbSock(&sockMgr), trayIcon(0),
queryConnectDialog(0)
{
commandLock = new os::Mutex;
@@ -148,16 +145,10 @@ void VNCServerWin32::regConfigChanged() {
// -=- Make sure we're listening on the right ports.
rfbSock.setServer(&vncServer);
rfbSock.setPort(port_number, localHost);
httpSock.setServer(&httpServer);
httpSock.setPort(http_port, localHost);

// -=- Update the Java viewer's web page port number.
httpServer.setRFBport(rfbSock.isListening() ? port_number : 0);

// -=- Update the TCP address filter for both ports, if open.
CharArray pattern(hosts.getData());
rfbSock.setFilter(pattern.buf);
httpSock.setFilter(pattern.buf);

// -=- Update the tray icon tooltip text with IP addresses
processAddressChange();

+ 0
- 7
win/winvnc/VNCServerWin32.h View File

@@ -27,7 +27,6 @@
#include <rfb_win32/SocketManager.h>
#include <rfb_win32/TCharArray.h>
#include <winvnc/QueryConnectDialog.h>
#include <winvnc/JavaViewer.h>
#include <winvnc/ManagedListener.h>

namespace os {
@@ -78,10 +77,6 @@ namespace winvnc {

bool setClientsStatus(rfb::ListConnInfo* LCInfo);

// Used by JavaViewerServer
const char* getName() {return vncServer.getName();}
rfb::Point getDesktopSize() {return desktop.getFbSize();}

protected:
// VNCServerST::QueryConnectionHandler interface
// Callback used to prompt user to accept or reject a connection.
@@ -121,12 +116,10 @@ namespace winvnc {
DWORD thread_id;
bool runServer;
bool isDesktopStarted;
JavaViewerServer httpServer;
rfb::win32::SocketManager sockMgr;
rfb::win32::RegConfig config;

ManagedListener rfbSock;
ManagedListener httpSock;
STrayIconThread* trayIcon;

QueryConnectDialog* queryConnectDialog;

+ 0
- 22
win/winvnc/index.vnc View File

@@ -1,22 +0,0 @@
<!--
index.vnc - default HTML page for TigerVNC Java viewer applet, to be
used with WinVNC. On any file ending in .vnc, the HTTP server embedded in
WinVNC will substitute the following variables when preceded by a dollar:
USER, DESKTOP, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT,
Use two dollar signs ($$) to get a dollar sign in the generated
HTML page.
-->

<HTML>
<TITLE>
$USER's $DESKTOP desktop
</TITLE>
<APPLET CODE=com.tigervnc.vncviewer.VncViewer ARCHIVE=VncViewer.jar
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
<param name=PORT value=$PORT>
<param name="Embed" value="true">
<param name="draggable" value="true">
</APPLET>
<BR>
<A href="http://www.tigervnc.org/">TigerVNC site</A>
</HTML>

+ 0
- 1
win/winvnc/resource.h View File

@@ -8,7 +8,6 @@
#define IDD_DIALOG1 103
#define IDD_ABOUT 104
#define IDI_CONNECTED 105
#define IDR_VNCVIEWER_JAR 106
#define IDD_QUERY_CONNECT 107
#define IDD_ADD_NEW_CLIENT 108
#define IDB_BITMAP 109

win/winvnc/winvnc.rc.in → win/winvnc/winvnc.rc View File

@@ -215,18 +215,6 @@ BEGIN
END


/////////////////////////////////////////////////////////////////////////////
//
// HTTPFILE
//

#cmakedefine BUILD_JAVA

#ifdef BUILD_JAVA
VNCVIEWER.JAR HTTPFILE DISCARDABLE "@VNCVIEWER_JAR_PATH@"
INDEX.VNC HTTPFILE DISCARDABLE "@INDEX_VNC_PATH@"
#endif

/////////////////////////////////////////////////////////////////////////////
//
// 24

Loading…
Cancel
Save