Hello community, here is the log from the commit of package tigervnc for openSUSE:Factory checked in at 2015-07-21 13:26:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/tigervnc (Old) and /work/SRC/openSUSE:Factory/.tigervnc.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "tigervnc" Changes: -------- --- /work/SRC/openSUSE:Factory/tigervnc/tigervnc.changes 2015-04-27 22:06:43.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.tigervnc.new/tigervnc.changes 2015-07-21 13:26:07.000000000 +0200 @@ -1,0 +2,19 @@ +Wed Jul 15 11:52:02 UTC 2015 - [email protected] + +- Updated to tigervnc 1.5.0. +- Dropped no longer needed patches: + * tigervnc-sf3495623.patch + * u_syslog.patch + * u_tigervnc-build-with-xserver-1.17.patch + * tigervnc-gnutls-3.4-required.patch + * u_tigervnc-dont-send-ascii-control-characters.patch + * u_terminate_instead_of_ignoring_restart.patch +- Dropped no longer needed index.vnc. +- Use encryption everywhere. (fate#318936) + * u_tigervnc-display-SHA-1-fingerprint-of-untrusted-certificate.patch + * u_tigervnc-use-default-trust-manager-in-java-viewer-if-custom.patch + * u_tigervnc-add-autoaccept-parameter.patch +- Work with fltk 1.3.2. + * N_tigervnc_revert_fltk_1_3_3_requirements.patch + +------------------------------------------------------------------- Old: ---- index.vnc tigervnc-gnutls-3.4-required.patch tigervnc-sf3495623.patch u_syslog.patch u_terminate_instead_of_ignoring_restart.patch u_tigervnc-build-with-xserver-1.17.patch u_tigervnc-dont-send-ascii-control-characters.patch v1.4.3.tar.gz New: ---- N_tigervnc_revert_fltk_1_3_3_requirements.patch u_tigervnc-add-autoaccept-parameter.patch u_tigervnc-display-SHA-1-fingerprint-of-untrusted-certificate.patch u_tigervnc-use-default-trust-manager-in-java-viewer-if-custom.patch v1.5.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ tigervnc.spec ++++++ --- /var/tmp/diff_new_pack.wwnu0G/_old 2015-07-21 13:26:08.000000000 +0200 +++ /var/tmp/diff_new_pack.wwnu0G/_new 2015-07-21 13:26:08.000000000 +0200 @@ -16,8 +16,14 @@ # +%define vncgroup vnc +%define vncuser vnc + +%define tlskey %{_sysconfdir}/vnc/tls.key +%define tlscert %{_sysconfdir}/vnc/tls.cert + Name: tigervnc -Version: 1.4.3 +Version: 1.5.0 Release: 0 Provides: tightvnc = 1.3.9 Obsoletes: tightvnc < 1.3.9 @@ -92,7 +98,6 @@ License: GPL-2.0 and MIT Group: System/X11/Servers/XF86_4 Source1: https://github.com/TigerVNC/tigervnc/archive/v%{version}.tar.gz -Source2: index.vnc Source3: vnc.xinetd Source4: 10-libvnc.conf Source5: vnc-server.firewall @@ -102,18 +107,15 @@ Source9: vncpasswd.arg Patch1: tigervnc-newfbsize.patch Patch2: tigervnc-clean-pressed-key-on-exit.patch -Patch3: tigervnc-sf3495623.patch -Patch4: u_tigervnc-dont-send-ascii-control-characters.patch -Patch5: u_tigervnc-ignore-epipe-on-write.patch -Patch6: n_tigervnc-date-time.patch -Patch7: U_include-vencrypt-only-if-any-subtype-present.patch -Patch8: u_tigervnc-use_preferred_mode.patch -Patch9: u_tigervnc-cve-2014-8240.patch -Patch10: u_tigervnc-build-with-xserver-1.17.patch -Patch11: u_terminate_instead_of_ignoring_restart.patch -# Require and build against gnutls 3.x -Patch12: tigervnc-gnutls-3.4-required.patch -Patch13: u_syslog.patch +Patch3: u_tigervnc-ignore-epipe-on-write.patch +Patch4: n_tigervnc-date-time.patch +Patch5: U_include-vencrypt-only-if-any-subtype-present.patch +Patch6: u_tigervnc-use_preferred_mode.patch +Patch7: u_tigervnc-cve-2014-8240.patch +Patch8: u_tigervnc-use-default-trust-manager-in-java-viewer-if-custom.patch +Patch9: u_tigervnc-display-SHA-1-fingerprint-of-untrusted-certificate.patch +Patch10: u_tigervnc-add-autoaccept-parameter.patch +Patch11: N_tigervnc_revert_fltk_1_3_3_requirements.patch %description TigerVNC is a high-performance, platform-neutral implementation of VNC (Virtual Network Computing), @@ -123,6 +125,11 @@ TigerVNC also provides extensions for advanced authentication methods and TLS encryption. %package -n xorg-x11-Xvnc +# Needed to generate certificates +Requires(post): openssl +# Needed to serve java applet +Requires: python +Requires: python-pyOpenSSL Requires: xinetd Requires: xkeyboard-config Summary: TigerVNC implementation of Xvnc @@ -137,20 +144,18 @@ %patch1 -p1 %patch2 -p1 -%patch3 -p1 -%patch4 -p0 +%patch3 -p0 +%patch4 -p1 %patch5 -p0 -%patch6 -p1 -%patch7 -p0 -%patch8 -p0 +%patch6 -p0 +%patch7 -p1 +%patch8 -p1 %patch9 -p1 %patch10 -p1 %patch11 -p1 -%patch12 -p1 -%patch13 -p1 pushd unix/xserver -patch -p1 < ../xserver116.patch +patch -p1 < ../xserver117.patch popd %build @@ -203,7 +208,6 @@ install -m755 VncViewer.jar $RPM_BUILD_ROOT%{_datadir}/vnc/classes popd -install -D -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_datadir}/vnc/classes install -D -m 644 %{SOURCE3} $RPM_BUILD_ROOT/etc/xinetd.d/vnc %ifnarch s390x install -D -m 644 %{SOURCE4} $RPM_BUILD_ROOT/etc/X11/xorg.conf.d/10-libvnc.conf @@ -218,22 +222,40 @@ ln -s -f %{_sysconfdir}/alternatives/vncviewer.1.gz $RPM_BUILD_ROOT%{_mandir}/man1/vncviewer.1.gz %endif +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/vnc + rm -rf $RPM_BUILD_ROOT/usr/share/doc/tigervnc-* %find_lang '%{name}' -%if 0%{?suse_version} >= 1315 +%pre -n xorg-x11-Xvnc +getent group %{vncgroup} > /dev/null || groupadd -r %{vncgroup} +getent passwd %{vncuser} > /dev/null || useradd -r -g %{vncgroup} -d /var/lib/empty -s /sbin/nologin -c "user for VNC" %{vncuser} + +%post -n xorg-x11-Xvnc +if ! test -e %{tlskey} ; then + (umask 077 && openssl genrsa -out %{tlskey} 2048) + chown %{vncuser}:%{vncgroup} %{tlskey} +fi +if ! test -e %{tlscert} ; then + cn="Automatically generated certificate for the VNC service" + openssl req -new -x509 -extensions usr_cert \ + -key %{tlskey} -out %{tlscert} -days 7305 -subj "/CN=$cn/" + chown %{vncuser}:%{vncgroup} %{tlscert} +fi %post +%if 0%{?suse_version} >= 1315 %_sbindir/update-alternatives \ --install %{_bindir}/vncviewer vncviewer %{_bindir}/vncviewer-tigervnc 20 \ --slave %{_mandir}/man1/vncviewer.1.gz vncviewer.1.gz %{_mandir}/man1/vncviewer-tigervnc.1.gz +%endif %postun +%if 0%{?suse_version} >= 1315 if [ "$1" = 0 ] ; then "%_sbindir/update-alternatives" --remove vncviewer /usr/bin/vncviewer-tigervnc fi - %endif %files -f %{name}.lang @@ -298,4 +320,8 @@ %doc java/com/tigervnc/vncviewer/README %{_datadir}/vnc +%dir %{_sysconfdir}/vnc +%ghost %attr(0600,%{vncuser},%{vncuser}) %config(noreplace) %{tlskey} +%ghost %attr(0644,%{vncuser},%{vncuser}) %config(noreplace) %{tlscert} + %changelog ++++++ N_tigervnc_revert_fltk_1_3_3_requirements.patch ++++++ ++++ 1005 lines (skipped) ++++++ tigervnc-clean-pressed-key-on-exit.patch ++++++ --- /var/tmp/diff_new_pack.wwnu0G/_old 2015-07-21 13:26:08.000000000 +0200 +++ /var/tmp/diff_new_pack.wwnu0G/_new 2015-07-21 13:26:08.000000000 +0200 @@ -1,8 +1,8 @@ -Index: tigervnc-1.4.1/vncviewer/DesktopWindow.cxx +Index: tigervnc-1.5.0/vncviewer/DesktopWindow.cxx =================================================================== ---- tigervnc-1.4.1.orig/vncviewer/DesktopWindow.cxx -+++ tigervnc-1.4.1/vncviewer/DesktopWindow.cxx -@@ -188,6 +188,8 @@ DesktopWindow::~DesktopWindow() +--- tigervnc-1.5.0.orig/vncviewer/DesktopWindow.cxx ++++ tigervnc-1.5.0/vncviewer/DesktopWindow.cxx +@@ -177,6 +177,8 @@ DesktopWindow::~DesktopWindow() OptionsDialog::removeCallback(handleOptions); @@ -11,11 +11,11 @@ // FLTK automatically deletes all child widgets, so we shouldn't touch // them ourselves here } -Index: tigervnc-1.4.1/vncviewer/Viewport.cxx +Index: tigervnc-1.5.0/vncviewer/Viewport.cxx =================================================================== ---- tigervnc-1.4.1.orig/vncviewer/Viewport.cxx -+++ tigervnc-1.4.1/vncviewer/Viewport.cxx -@@ -144,6 +144,11 @@ Viewport::Viewport(int w, int h, const r +--- tigervnc-1.5.0.orig/vncviewer/Viewport.cxx ++++ tigervnc-1.5.0/vncviewer/Viewport.cxx +@@ -139,6 +139,11 @@ Viewport::Viewport(int w, int h, const r Viewport::~Viewport() { @@ -27,23 +27,23 @@ // Unregister all timeouts in case they get a change tro trigger // again later when this object is already gone. Fl::remove_timeout(handlePointerTimeout, this); -Index: tigervnc-1.4.1/vncviewer/vncviewer.cxx +Index: tigervnc-1.5.0/vncviewer/vncviewer.cxx =================================================================== ---- tigervnc-1.4.1.orig/vncviewer/vncviewer.cxx -+++ tigervnc-1.4.1/vncviewer/vncviewer.cxx -@@ -88,6 +88,8 @@ char vncServerName[VNCSERVERNAMELEN] = { - static bool exitMainloop = false; - static const char *exitError = NULL; +--- tigervnc-1.5.0.orig/vncviewer/vncviewer.cxx ++++ tigervnc-1.5.0/vncviewer/vncviewer.cxx +@@ -107,6 +107,8 @@ static const char *about_text() + return buffer; + } +static CConn *cc; + void exit_vncviewer(const char *error) { // Prioritise the first error we get as that is probably the most -@@ -114,6 +116,16 @@ static void CleanupSignalHandler(int sig +@@ -158,6 +160,16 @@ static void CleanupSignalHandler(int sig // CleanupSignalHandler allows C++ object cleanup to happen because it calls // exit() rather than the default which is to abort. - vlog.info(_("CleanupSignalHandler called")); + vlog.info(_("Termination signal %d has been received. TigerVNC Viewer will now exit."), sig); + delete cc; + exit(1); +} @@ -57,7 +57,7 @@ exit(1); } -@@ -392,11 +404,19 @@ int main(int argc, char** argv) +@@ -460,11 +472,19 @@ int main(int argc, char** argv) init_fltk(); @@ -77,7 +77,7 @@ Configuration::enableViewerParams(); /* Load the default parameter settings */ -@@ -497,7 +517,7 @@ int main(int argc, char** argv) +@@ -577,7 +597,7 @@ int main(int argc, char** argv) #endif } ++++++ tigervnc-newfbsize.patch ++++++ --- /var/tmp/diff_new_pack.wwnu0G/_old 2015-07-21 13:26:08.000000000 +0200 +++ /var/tmp/diff_new_pack.wwnu0G/_new 2015-07-21 13:26:08.000000000 +0200 @@ -1,8 +1,8 @@ -Index: tigervnc-1.4.1/vncviewer/CConn.cxx +Index: tigervnc-1.5.0/vncviewer/CConn.cxx =================================================================== ---- tigervnc-1.4.1.orig/vncviewer/CConn.cxx -+++ tigervnc-1.4.1/vncviewer/CConn.cxx -@@ -424,6 +424,8 @@ void CConn::dataRect(const Rect& r, int +--- tigervnc-1.5.0.orig/vncviewer/CConn.cxx ++++ tigervnc-1.5.0/vncviewer/CConn.cxx +@@ -427,6 +427,8 @@ void CConn::dataRect(const Rect& r, int if (encoding != encodingCopyRect) lastServerEncoding = encoding; @@ -10,4 +10,4 @@ + setDesktopSize( r.width(), r.height() ); if (!Decoder::supported(encoding)) { - vlog.error(_("Unknown rect encoding %d"), encoding); + // TRANSLATORS: Refers to a VNC protocol encoding type ++++++ u_tigervnc-add-autoaccept-parameter.patch ++++++ diff --git a/java/com/tigervnc/rfb/CSecurityTLS.java b/java/com/tigervnc/rfb/CSecurityTLS.java index 6014502..9b886b5 100644 --- a/java/com/tigervnc/rfb/CSecurityTLS.java +++ b/java/com/tigervnc/rfb/CSecurityTLS.java @@ -47,6 +47,9 @@ public class CSecurityTLS extends CSecurity { public static StringParameter x509crl = new StringParameter("x509crl", "X509 CRL file", "", Configuration.ConfigurationObject.ConfViewer); + public static StringParameter x509autoaccept + = new StringParameter("x509autoaccept", + "X509 Certificate SHA-1 fingerprint", "", Configuration.ConfigurationObject.ConfViewer); private void initGlobal() { @@ -71,6 +74,7 @@ public class CSecurityTLS extends CSecurity { setDefaults(); cafile = x509ca.getData(); crlfile = x509crl.getData(); + certautoaccept = x509autoaccept.getData(); } public static String getDefaultCA() { @@ -247,34 +251,46 @@ public class CSecurityTLS extends CSecurity { try { tm.checkServerTrusted(chain, authType); } catch (CertificateException e) { - Object[] answer = {"Proceed", "Exit"}; - - StringBuilder message = new StringBuilder(); - message.append(e.getCause().getLocalizedMessage()); - message.append("\nContinue connecting to this host?"); + String fingerprint = null; try { + StringBuilder fingerprintBuilder = new StringBuilder(); + MessageDigest sha1 = MessageDigest.getInstance("SHA1"); sha1.update(chain[0].getEncoded()); - message.append("\nSHA-1 fingerprint: "); - for(byte B : sha1.digest()) { - message.append(Integer.toHexString(0xff & B)); - message.append(':'); + fingerprintBuilder.append(String.format("%02x", /*0xff & */B)); + fingerprintBuilder.append(':'); } - message.deleteCharAt(message.length() - 1); + fingerprintBuilder.deleteCharAt(fingerprintBuilder.length() - 1); + + fingerprint = fingerprintBuilder.toString(); } catch (NoSuchAlgorithmException noSuchAlgorithmException) { // No fingerprint then... } - int ret = JOptionPane.showOptionDialog(null, - message.toString(), - "Confirm certificate exception?", - JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, - null, answer, answer[0]); - if (ret == JOptionPane.NO_OPTION) - System.exit(1); + if(fingerprint == null || certautoaccept == null || !fingerprint.equalsIgnoreCase(certautoaccept)) { + Object[] answer = {"Proceed", "Exit"}; + + StringBuilder message = new StringBuilder(); + message.append(e.getCause().getLocalizedMessage()); + message.append("\nContinue connecting to this host?"); + if(fingerprint != null) { + message.append("\nSHA-1 fingerprint: "); + message.append(fingerprint); + message.append("\nBle: "); + message.append(certautoaccept); + } + + int ret = JOptionPane.showOptionDialog(null, + message.toString(), + "Confirm certificate exception?", + JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, + null, answer, answer[0]); + if (ret == JOptionPane.NO_OPTION) + System.exit(1); + } } catch (java.lang.Exception e) { throw new Exception(e.toString()); } @@ -301,7 +317,7 @@ public class CSecurityTLS extends CSecurity { private SSLEngineManager manager; private boolean anon; - private String cafile, crlfile; + private String cafile, crlfile, certautoaccept; private FdInStream is; private FdOutStream os; diff --git a/java/com/tigervnc/vncviewer/VncViewer.java b/java/com/tigervnc/vncviewer/VncViewer.java index cc21c2e..6786636 100644 --- a/java/com/tigervnc/vncviewer/VncViewer.java +++ b/java/com/tigervnc/vncviewer/VncViewer.java @@ -354,6 +354,8 @@ public class VncViewer extends javax.swing.JApplet parent.setFocusTraversalKeysEnabled(false); setLookAndFeel(); setBackground(Color.white); + + SecurityClient.setDefaults(); } private void getTimestamp() { @@ -375,6 +377,7 @@ public class VncViewer extends javax.swing.JApplet if (embed.getValue() && nViewers == 0) { alwaysShowServerDialog.setParam(false); Configuration.global().readAppletParams(this); + Configuration.viewer().readAppletParams(this); fullScreen.setParam(false); scalingFactor.setParam("100"); String host = getCodeBase().getHost(); ++++++ u_tigervnc-display-SHA-1-fingerprint-of-untrusted-certificate.patch ++++++ >From af09e89d54b57649cf60363d03f84d129baecd27 Mon Sep 17 00:00:00 2001 From: Michal Srb <[email protected]> Date: Tue, 7 Jul 2015 02:38:18 +0300 Subject: [PATCH 2/2] Display SHA-1 fingerprint of untrusted certificate in java client. --- java/com/tigervnc/rfb/CSecurityTLS.java | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/java/com/tigervnc/rfb/CSecurityTLS.java b/java/com/tigervnc/rfb/CSecurityTLS.java index 7633f08..6014502 100644 --- a/java/com/tigervnc/rfb/CSecurityTLS.java +++ b/java/com/tigervnc/rfb/CSecurityTLS.java @@ -248,9 +248,28 @@ public class CSecurityTLS extends CSecurity { tm.checkServerTrusted(chain, authType); } catch (CertificateException e) { Object[] answer = {"Proceed", "Exit"}; + + StringBuilder message = new StringBuilder(); + message.append(e.getCause().getLocalizedMessage()); + message.append("\nContinue connecting to this host?"); + + try { + MessageDigest sha1 = MessageDigest.getInstance("SHA1"); + sha1.update(chain[0].getEncoded()); + + message.append("\nSHA-1 fingerprint: "); + + for(byte B : sha1.digest()) { + message.append(Integer.toHexString(0xff & B)); + message.append(':'); + } + message.deleteCharAt(message.length() - 1); + } catch (NoSuchAlgorithmException noSuchAlgorithmException) { + // No fingerprint then... + } + int ret = JOptionPane.showOptionDialog(null, - e.getCause().getLocalizedMessage()+"\n"+ - "Continue connecting to this host?", + message.toString(), "Confirm certificate exception?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, answer, answer[0]); -- 2.1.4 ++++++ u_tigervnc-use-default-trust-manager-in-java-viewer-if-custom.patch ++++++ >From d6d847633660abb99764192f73da7be5adf3da9c Mon Sep 17 00:00:00 2001 From: Michal Srb <[email protected]> Date: Tue, 7 Jul 2015 02:09:21 +0300 Subject: [PATCH 1/2] Use default trust manager in java viewer if custom CA is not specified. --- java/com/tigervnc/rfb/CSecurityTLS.java | 34 +++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/java/com/tigervnc/rfb/CSecurityTLS.java b/java/com/tigervnc/rfb/CSecurityTLS.java index 6f799bb..7633f08 100644 --- a/java/com/tigervnc/rfb/CSecurityTLS.java +++ b/java/com/tigervnc/rfb/CSecurityTLS.java @@ -207,24 +207,26 @@ public class CSecurityTLS extends CSecurity { try { ks.load(null, null); File cacert = new File(cafile); - if (!cacert.exists() || !cacert.canRead()) - return; - InputStream caStream = new FileInputStream(cafile); - X509Certificate ca = (X509Certificate)cf.generateCertificate(caStream); - ks.setCertificateEntry("CA", ca); - PKIXBuilderParameters params = new PKIXBuilderParameters(ks, new X509CertSelector()); - File crlcert = new File(crlfile); - if (!crlcert.exists() || !crlcert.canRead()) { - params.setRevocationEnabled(false); + if (!cacert.exists() || !cacert.canRead()) { + tmf.init((KeyStore)null); // Use default trust manager } else { - InputStream crlStream = new FileInputStream(crlfile); - Collection<? extends CRL> crls = cf.generateCRLs(crlStream); - CertStoreParameters csp = new CollectionCertStoreParameters(crls); - CertStore store = CertStore.getInstance("Collection", csp); - params.addCertStore(store); - params.setRevocationEnabled(true); + InputStream caStream = new FileInputStream(cafile); + X509Certificate ca = (X509Certificate)cf.generateCertificate(caStream); + ks.setCertificateEntry("CA", ca); + PKIXBuilderParameters params = new PKIXBuilderParameters(ks, new X509CertSelector()); + File crlcert = new File(crlfile); + if (!crlcert.exists() || !crlcert.canRead()) { + params.setRevocationEnabled(false); + } else { + InputStream crlStream = new FileInputStream(crlfile); + Collection<? extends CRL> crls = cf.generateCRLs(crlStream); + CertStoreParameters csp = new CollectionCertStoreParameters(crls); + CertStore store = CertStore.getInstance("Collection", csp); + params.addCertStore(store); + params.setRevocationEnabled(true); + } + tmf.init(new CertPathTrustManagerParameters(params)); } - tmf.init(new CertPathTrustManagerParameters(params)); } catch (java.io.FileNotFoundException e) { vlog.error(e.toString()); } catch (java.io.IOException e) { -- 2.1.4 ++++++ u_tigervnc-use_preferred_mode.patch ++++++ --- /var/tmp/diff_new_pack.wwnu0G/_old 2015-07-21 13:26:08.000000000 +0200 +++ /var/tmp/diff_new_pack.wwnu0G/_new 2015-07-21 13:26:08.000000000 +0200 @@ -6,22 +6,21 @@ If there is any resolution specified with -geometry or -screen parameters, report this resolution as preferred one. That way desktop environments won't change it immediately after start. -Index: unix/xserver/hw/vnc/xvnc.cc +Index: unix/xserver/hw/vnc/xvnc.c =================================================================== ---- unix/xserver/hw/vnc/xvnc.cc (revision 5186) -+++ unix/xserver/hw/vnc/xvnc.cc (working copy) -@@ -1319,12 +1319,22 @@ - /* Make sure the CRTC has this output set */ +--- unix/xserver/hw/vnc/xvnc.c.orig ++++ unix/xserver/hw/vnc/xvnc.c +@@ -1296,12 +1296,24 @@ static RRCrtcPtr vncRandRCrtcCreate(Scre vncRandRCrtcSet(pScreen, crtc, NULL, 0, 0, RR_Rotate_0, 1, &output); -- /* Populate a list of default modes */ -- RRModePtr modes[sizeof(vncRandRWidths)/sizeof(*vncRandRWidths)]; -- int num_modes; -+ /* Populate a list of modes */ -+ RRModePtr modes[sizeof(vncRandRWidths)/sizeof(*vncRandRWidths) + 1]; -+ int num_modes = 0; + /* Populate a list of default modes */ +- modes = malloc(sizeof(RRModePtr)*sizeof(vncRandRWidths)/sizeof(*vncRandRWidths)); ++ modes = malloc(sizeof(RRModePtr)*sizeof(vncRandRWidths)/sizeof(*vncRandRWidths) + 1); + if (modes == NULL) + return NULL; -- num_modes = 0; + num_modes = 0; ++ + /* Start with requested mode */ + mode = vncRandRModeGet(pScreen->width, pScreen->height); + if(mode != NULL) { @@ -30,19 +29,19 @@ + } + + /* Add default modes */ - for (int i = 0;i < sizeof(vncRandRWidths)/sizeof(*vncRandRWidths);i++) { + for (i = 0;i < sizeof(vncRandRWidths)/sizeof(*vncRandRWidths);i++) { + if (vncRandRWidths[i] == pScreen->width && vncRandRHeights[i] == pScreen->height) + continue; + mode = vncRandRModeGet(vncRandRWidths[i], vncRandRHeights[i]); if (mode != NULL) { modes[num_modes] = mode; -@@ -1332,7 +1342,7 @@ +@@ -1309,7 +1321,7 @@ static RRCrtcPtr vncRandRCrtcCreate(Scre } } - RROutputSetModes(output, modes, num_modes, 0); + RROutputSetModes(output, modes, num_modes, 1); - return crtc; - } + free(modes); + ++++++ v1.4.3.tar.gz -> v1.5.0.tar.gz ++++++ ++++ 48310 lines of diff (skipped) ++++++ vnc.xinetd ++++++ --- /var/tmp/diff_new_pack.wwnu0G/_old 2015-07-21 13:26:08.000000000 +0200 +++ /var/tmp/diff_new_pack.wwnu0G/_new 2015-07-21 13:26:08.000000000 +0200 @@ -8,9 +8,9 @@ socket_type = stream protocol = tcp wait = no - user = nobody + user = vnc server = /usr/bin/Xvnc - server_args = -noreset -inetd -once -query localhost -geometry 1024x768 -securitytypes none -log *:syslog:30 + server_args = -noreset -inetd -once -query localhost -geometry 1024x768 -securitytypes X509None,None -X509Key /etc/vnc/tls.key -X509Cert /etc/vnc/tls.cert -log *:syslog:30 disable = yes } # default: off @@ -23,9 +23,9 @@ socket_type = stream protocol = tcp wait = no - user = nobody + user = vnc server = /usr/bin/Xvnc - server_args = -noreset -inetd -once -query localhost -geometry 1280x1024 -securitytypes none -log *:syslog:30 + server_args = -noreset -inetd -once -query localhost -geometry 1280x1024 -securitytypes X509None,None -X509Key /etc/vnc/tls.key -X509Cert /etc/vnc/tls.cert -log *:syslog:30 disable = yes } # default: off @@ -38,9 +38,9 @@ socket_type = stream protocol = tcp wait = no - user = nobody + user = vnc server = /usr/bin/Xvnc - server_args = -noreset -inetd -once -query localhost -geometry 1600x1200 -securitytypes none -log *:syslog:30 + server_args = -noreset -inetd -once -query localhost -geometry 1600x1200 -securitytypes X509None,None -X509Key /etc/vnc/tls.key -X509Cert /etc/vnc/tls.cert -log *:syslog:30 disable = yes } # default: off @@ -53,7 +53,7 @@ socket_type = stream protocol = tcp wait = no - user = nobody + user = vnc server = /usr/bin/vnc_inetd_httpd server_args = 1024 768 5901 disable = yes @@ -68,7 +68,7 @@ socket_type = stream protocol = tcp wait = no - user = nobody + user = vnc server = /usr/bin/vnc_inetd_httpd server_args = 1280 1024 5902 disable = yes @@ -83,7 +83,7 @@ socket_type = stream protocol = tcp wait = no - user = nobody + user = vnc server = /usr/bin/vnc_inetd_httpd server_args = 1600 1200 5903 disable = yes ++++++ vnc_inetd_httpd ++++++ --- /var/tmp/diff_new_pack.wwnu0G/_old 2015-07-21 13:26:08.000000000 +0200 +++ /var/tmp/diff_new_pack.wwnu0G/_new 2015-07-21 13:26:08.000000000 +0200 @@ -1,62 +1,114 @@ -#!/bin/bash -read request url httptype || exit 0 -url="${url/ /}" -httptype="${httptype/ /}" - -width=$1 -height=$2 -port=$3 - -if [ "x$httptype" != "x" ]; then - line="x" - while [ -n "$line" ]; do - read line || exit 0 - line="${line/ /}" - done -fi -case "$url" in -/) - # We need the size of the display for the current applet. - # The VNC menubar is 20 pixels high ... - height=$((height+20)) - ctype="text/html" - content=" -<HTML><HEAD><TITLE>Remote Desktop</TITLE></HEAD> -<BODY> -<APPLET CODE=\"com.tigervnc.vncviewer.VncViewer\" ARCHIVE=\"VncViewer.jar\" WIDTH=\"$width\" HEIGHT=\"$height\"> - <PARAM name=\"Port\" value=\"$port\"> - <param name=\"Embed\" value=\"true\"> - <param name=\"AlwaysShowServerDialog\" value=\"false\"> -</APPLET> -</BODY></HTML>" - ;; -*.jar|*.class) - # Use basename to make sure we have just a filename, not ../../... - url=${url/.*\/} - ctype="application/octet-stream" - cfile="/usr/share/vnc/classes/$url" - content="FILE" - ;; -esac - -if [ "x$httptype" != "x" ]; then - echo "HTTP/1.0 200 OK" - echo "Content-Type: $ctype" - if [ "$content" == "FILE" ]; then - clen=`wc -c "$cfile"` - else - clen=`echo "$content"|wc -c` - fi - echo "Content-Length: $clen" - echo "Connection: close" - echo -fi - -if [ "$request" == "GET" ]; then - if [ "$content" == "FILE" ]; then - cat "$cfile" - else - echo "$content" - fi -fi -exit 0 +#!/usr/bin/env python + +# This is simple stupid WWW server intended to serve VNC java applet. +# It is made to be called by xinetd. +# It handles both HTTP and HTTPS on the same port. If HTTPS is allowed, any HTTP requests is responded with redirect to HTTPS. + +import re +import sys +import socket +import time + +from OpenSSL import SSL, crypto + +TLS_KEY = "/etc/vnc/tls.key" +TLS_CERT = "/etc/vnc/tls.cert" +JAR_FILE = "/usr/share/vnc/classes/VncViewer.jar" +TIMEOUT = 10 + +WIDTH = int(sys.argv[1]) +HEIGHT = int(sys.argv[2]) +VNC_PORT = int(sys.argv[3]) +USE_HTTPS = not (len(sys.argv) >= 5 and sys.argv[4] == "NoHTTPS") + + +# Take the stdin as our input socket (given from xinetd) +conn = sock = socket.fromfd(sys.stdin.fileno(), socket.AF_INET, socket.SOCK_STREAM) + +# If we are supposed to use HTTPS, load certificate and replace conn with SSL connection. +if USE_HTTPS: + cert = crypto.load_certificate(crypto.FILETYPE_PEM, open(TLS_CERT, 'r').read()) + + context = SSL.Context(SSL.SSLv23_METHOD) + context.use_privatekey_file(TLS_KEY) + context.use_certificate(cert) + + conn = SSL.Connection(context, sock) + conn.set_accept_state() + +# Send normal response +def send_response(connection, ctype, response): + connection.sendall( + "HTTP/1.0 200 OK\n" + + "Content-Type: " + ctype + "\n" + + "Content-Length: " + str(len(response)) + "\n" + + "Connection: close\n" + + "\n" + + response + ) + +# Send redirect +def send_redirect(connection, ctype, response, location): + connection.sendall( + "HTTP/1.0 301 Moved Permanently\n" + + "Location: " + location + "\n" + + "Content-Type: " + ctype + "\n" + + "Content-Length: " + str(len(response)) + "\n" + + "Connection: close\n" + + "\n" + + response + ) + + +# Try to read and parse HTTP request +try: + start_time = time.time() + buffer = '' + while True: + buffer += conn.recv(1024) + + if buffer.endswith("\r\n\r\n") or start_time + TIMEOUT < time.time(): + break + + method, url = buffer.split(" ", 2)[0:2] + + if url == '/VncViewer.jar': + with open(JAR_FILE, 'r') as file: + send_response(conn, "application/octet-stream", file.read()) + else: + response = \ + """<html> + <head> + <title>Remote Desktop</title> + </head> + <body> + <embed type="application/x-java-applet;version=1.6" code="com.tigervnc.vncviewer.VncViewer" archive="VncViewer.jar" width="%d" height="%d" + Port="%d" + Embed="true" + AlwaysShowServerDialog="false" + SecurityTypes="%s" + x509autoaccept="%s" + > + </body> + </html> + """%(WIDTH, HEIGHT, VNC_PORT, 'X509None' if USE_HTTPS else 'TLSNone', cert.digest('SHA1') if USE_HTTPS else '') + + send_response(conn, "text/html", response) + +except SSL.Error: + # If SSL failed, it is most probably because the browser is actually trying to do normal HTTP request. + + # We have now a partially consumed HTTP request in sock, let's try if we can get Host header out of it + partial_request = sock.recv(8000) # Arbitrary big number, if the request is longer than this, we will just skip the rest. + + host = None + match = re.search(r"\r\nHost: ([^\r]+)\r\n", partial_request) + if match: + host = match.group(1) + + if host: + # If we got host header, we can redirect nicely with HTTP 301. + send_redirect(sock, "text.html", "<html><body>Use https.</body></html>", "https://" + host) + else: + # If we don't know the host header, redirect using javascript. + send_response(sock, "text.html", "<html><head><script>document.location.protocol = 'https';</script></head><body>Use https.</body></html>")
