diff --git a/.fmf/version b/.fmf/version deleted file mode 100644 index d00491f..0000000 --- a/.fmf/version +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/.gitignore b/.gitignore index 586a68d..a59cc2b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -/gnome-remote-desktop-*.tar.xz -/gnome-remote-desktop-*-build +/gnome-remote-desktop-0.1.*.tar.xz diff --git a/0001-vnc-Copy-pixels-using-the-right-destination-stride.patch b/0001-vnc-Copy-pixels-using-the-right-destination-stride.patch new file mode 100644 index 0000000..fc5c830 --- /dev/null +++ b/0001-vnc-Copy-pixels-using-the-right-destination-stride.patch @@ -0,0 +1,71 @@ +From 81172effba7c70d3b2932c67be79a2924eae9d73 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Mon, 12 Oct 2020 17:34:30 +0200 +Subject: [PATCH] vnc: Copy pixels using the right destination stride + +We're copying the pixels in a separate thread managed by PipeWire, and +in this thread, accessing the VNC framebuffer dimension and stride is +racy. Instead of fetching the dimension directly, pass the expected +width and get the stride it will eventually have. + +Already before this patch, when the copied pixel end up on the main +thread and the dimension still doesn't match up, the frame will be +dropped. +--- + src/grd-session-vnc.c | 5 +++-- + src/grd-session-vnc.h | 3 ++- + src/grd-vnc-pipewire-stream.c | 5 +++-- + 3 files changed, 8 insertions(+), 5 deletions(-) + +diff --git a/src/grd-session-vnc.c b/src/grd-session-vnc.c +index 69fb33d..f4835aa 100644 +--- a/src/grd-session-vnc.c ++++ b/src/grd-session-vnc.c +@@ -535,9 +535,10 @@ grd_session_vnc_get_fd (GrdSessionVnc *session_vnc) + } + + int +-grd_session_vnc_get_framebuffer_stride (GrdSessionVnc *session_vnc) ++grd_session_vnc_get_stride_for_width (GrdSessionVnc *session_vnc, ++ int width) + { +- return session_vnc->rfb_screen->paddedWidthInBytes; ++ return width * BGRX_BYTES_PER_PIXEL; + } + + rfbClientPtr +diff --git a/src/grd-session-vnc.h b/src/grd-session-vnc.h +index 0d01ad3..ccd046c 100644 +--- a/src/grd-session-vnc.h ++++ b/src/grd-session-vnc.h +@@ -60,7 +60,8 @@ void grd_session_vnc_move_cursor (GrdSessionVnc *session_vnc, + + int grd_session_vnc_get_fd (GrdSessionVnc *session_vnc); + +-int grd_session_vnc_get_framebuffer_stride (GrdSessionVnc *session_vnc); ++int grd_session_vnc_get_stride_for_width (GrdSessionVnc *session_vnc, ++ int width); + + gboolean grd_session_vnc_is_client_gone (GrdSessionVnc *session_vnc); + +diff --git a/src/grd-vnc-pipewire-stream.c b/src/grd-vnc-pipewire-stream.c +index 96dd7c9..82ceb9b 100644 +--- a/src/grd-vnc-pipewire-stream.c ++++ b/src/grd-vnc-pipewire-stream.c +@@ -326,10 +326,11 @@ process_buffer (GrdVncPipeWireStream *stream, + int height; + int y; + +- src_stride = buffer->datas[0].chunk->stride; +- dst_stride = grd_session_vnc_get_framebuffer_stride (stream->session); + height = stream->spa_format.size.height; + width = stream->spa_format.size.width; ++ src_stride = buffer->datas[0].chunk->stride; ++ dst_stride = grd_session_vnc_get_stride_for_width (stream->session, ++ width); + + frame->data = g_malloc (height * dst_stride); + for (y = 0; y < height; y++) +-- +2.28.0 + diff --git a/0001-vnc-Drop-frames-if-client-is-gone.patch b/0001-vnc-Drop-frames-if-client-is-gone.patch new file mode 100644 index 0000000..59dde2a --- /dev/null +++ b/0001-vnc-Drop-frames-if-client-is-gone.patch @@ -0,0 +1,80 @@ +From ab97841629f5f3f4fab9993b6255b6ae04828b9c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Wed, 9 Sep 2020 10:14:20 +0200 +Subject: [PATCH] vnc: Drop frames if client is gone + +Frames from PipeWire are posted asynchronously from a I/O thread to the +main thread where they are turned into VNC frame updates and cursor +movements. On the other hand, sessions are closed asynchronously when +the VNC client disappears. If a frame ended up on the main thread after +a client disappeared but before the session and stream was closed, we'd +try to turn the new frames into VNC updates without a client being +available, causing use after free. + +Fix this by dropping frames that happens during this time frame. + +Closes: https://gitlab.gnome.org/GNOME/gnome-remote-desktop/-/issues/43 +--- + src/grd-session-vnc.c | 7 +++++++ + src/grd-session-vnc.h | 2 ++ + src/grd-vnc-pipewire-stream.c | 8 ++++++++ + 3 files changed, 17 insertions(+) + +diff --git a/src/grd-session-vnc.c b/src/grd-session-vnc.c +index 813838a..a06d34d 100644 +--- a/src/grd-session-vnc.c ++++ b/src/grd-session-vnc.c +@@ -209,6 +209,12 @@ maybe_queue_close_session_idle (GrdSessionVnc *session_vnc) + g_idle_add (close_session_idle, session_vnc); + } + ++gboolean ++grd_session_vnc_is_client_gone (GrdSessionVnc *session_vnc) ++{ ++ return !session_vnc->rfb_client; ++} ++ + static void + handle_client_gone (rfbClientPtr rfb_client) + { +@@ -218,6 +224,7 @@ handle_client_gone (rfbClientPtr rfb_client) + + grd_session_vnc_detach_source (session_vnc); + maybe_queue_close_session_idle (session_vnc); ++ session_vnc->rfb_client = NULL; + } + + static void +diff --git a/src/grd-session-vnc.h b/src/grd-session-vnc.h +index 579a12a..07678c8 100644 +--- a/src/grd-session-vnc.h ++++ b/src/grd-session-vnc.h +@@ -57,4 +57,6 @@ void grd_session_vnc_move_cursor (GrdSessionVnc *session_vnc, + + int grd_session_vnc_get_framebuffer_stride (GrdSessionVnc *session_vnc); + ++gboolean grd_session_vnc_is_client_gone (GrdSessionVnc *session_vnc); ++ + #endif /* GRD_SESSION_VNC_H */ +diff --git a/src/grd-vnc-pipewire-stream.c b/src/grd-vnc-pipewire-stream.c +index 78793c4..96dd7c9 100644 +--- a/src/grd-vnc-pipewire-stream.c ++++ b/src/grd-vnc-pipewire-stream.c +@@ -234,6 +234,14 @@ do_render (struct spa_loop *loop, + if (!frame) + return 0; + ++ if (grd_session_vnc_is_client_gone (stream->session)) ++ { ++ g_free (frame->data); ++ g_clear_pointer (&frame->rfb_cursor, rfbFreeCursor); ++ g_free (frame); ++ return 0; ++ } ++ + if (frame->rfb_cursor) + grd_session_vnc_set_cursor (stream->session, frame->rfb_cursor); + +-- +2.26.2 + diff --git a/gnome-remote-desktop.spec b/gnome-remote-desktop.spec index 5d15c82..459f967 100644 --- a/gnome-remote-desktop.spec +++ b/gnome-remote-desktop.spec @@ -1,72 +1,41 @@ -%global systemd_unit_handover gnome-remote-desktop-handover.service -%global systemd_unit_headless gnome-remote-desktop-headless.service -%global systemd_unit_system gnome-remote-desktop.service -%global systemd_unit_user gnome-remote-desktop.service - -%global tarball_version %%(echo %{version} | tr '~' '.') - -%bcond rdp %[0%{?fedora} || 0%{?rhel} >= 10] -%bcond vnc %[0%{?fedora} || 0%{?rhel} < 10] - -%global libei_version 1.0.901 -%global pipewire_version 0.3.49 +%global systemd_unit gnome-remote-desktop.service Name: gnome-remote-desktop -Version: 49.2 -Release: %autorelease +Version: 0.1.9 +Release: 3%{?dist} Summary: GNOME Remote Desktop screen share service -License: GPL-2.0-or-later -URL: https://gitlab.gnome.org/GNOME/gnome-remote-desktop -Source0: https://download.gnome.org/sources/%{name}/49/%{name}-%{tarball_version}.tar.xz +License: GPLv2+ +URL: https://gitlab.gnome.org/jadahl/gnome-remote-desktop +Source0: https://download.gnome.org/sources/gnome-remote-desktop/0.1/gnome-remote-desktop-0.1.9.tar.xz + +# Avoid race condition on disconnect +Patch0: 0001-vnc-Drop-frames-if-client-is-gone.patch # Adds encryption support (requires patched LibVNCServer) -Patch0: gnutls-anontls.patch +Patch1: gnutls-anontls.patch -BuildRequires: asciidoc +# Copy using the right destination stride +Patch2: 0001-vnc-Copy-pixels-using-the-right-destination-stride.patch + +BuildRequires: git BuildRequires: gcc -BuildRequires: meson >= 0.47.0 -BuildRequires: systemd-rpm-macros +BuildRequires: meson >= 0.36.0 +BuildRequires: pkgconfig BuildRequires: pkgconfig(cairo) -BuildRequires: pkgconfig(epoxy) -BuildRequires: pkgconfig(dbus-1) -BuildRequires: pkgconfig(ffnvcodec) -%if %{with rdp} -BuildRequires: glslc -BuildRequires: spirv-tools -BuildRequires: pkgconfig(fdk-aac) -BuildRequires: pkgconfig(freerdp3) -BuildRequires: pkgconfig(fuse3) -BuildRequires: pkgconfig(libva) -BuildRequires: pkgconfig(opus) -BuildRequires: pkgconfig(polkit-gobject-1) -BuildRequires: pkgconfig(vulkan) -BuildRequires: pkgconfig(winpr3) -%endif -BuildRequires: pkgconfig(gbm) -BuildRequires: pkgconfig(glib-2.0) >= 2.68 -BuildRequires: pkgconfig(gio-unix-2.0) -BuildRequires: pkgconfig(gnutls) -BuildRequires: pkgconfig(gudev-1.0) -BuildRequires: pkgconfig(libdrm) -BuildRequires: pkgconfig(libei-1.0) >= %{libei_version} -BuildRequires: pkgconfig(libnotify) -BuildRequires: pkgconfig(libpipewire-0.3) -BuildRequires: pkgconfig(libsecret-1) -%if %{with vnc} +BuildRequires: pkgconfig(glib-2.0) >= 2.32 +BuildRequires: pkgconfig(gio-unix-2.0) >= 2.32 +BuildRequires: pkgconfig(libpipewire-0.3) >= 0.3.0 BuildRequires: pkgconfig(libvncserver) >= 0.9.11-7 -%endif -BuildRequires: pkgconfig(systemd) -BuildRequires: pkgconfig(xkbcommon) -BuildRequires: pkgconfig(tss2-esys) -BuildRequires: pkgconfig(tss2-mu) -BuildRequires: pkgconfig(tss2-rc) -BuildRequires: pkgconfig(tss2-tctildr) +BuildRequires: pkgconfig(freerdp2) +BuildRequires: pkgconfig(libsecret-1) +BuildRequires: pkgconfig(libnotify) +BuildRequires: pkgconfig(gnutls) -Requires: libei%{?_isa} >= %{libei_version} -Requires: pipewire%{?_isa} >= %{pipewire_version} +%{?systemd_requires} +BuildRequires: systemd -Obsoletes: vino < 3.22.0-21 +Requires: pipewire >= 0.3.0 %description GNOME Remote Desktop is a remote desktop and screen sharing service for the @@ -74,81 +43,103 @@ GNOME desktop environment. %prep -%autosetup -p1 -n %{name}-%{tarball_version} +%autosetup -S git %build -%meson \ -%if %{with rdp} - -Drdp=true \ -%else - -Drdp=false \ -%endif -%if %{with vnc} - -Dvnc=true \ -%else - -Dvnc=false \ -%endif - -Dsystemd=true \ - -Dtests=false +%meson %meson_build %install %meson_install -%find_lang %{name} - %post -%systemd_post %{systemd_unit_system} -%systemd_user_post %{systemd_unit_handover} -%systemd_user_post %{systemd_unit_headless} -%systemd_user_post %{systemd_unit_user} +%systemd_user_post %{systemd_unit} %preun -%systemd_preun %{systemd_unit_system} -%systemd_user_preun %{systemd_unit_handover} -%systemd_user_preun %{systemd_unit_headless} -%systemd_user_preun %{systemd_unit_user} +%systemd_user_preun %{systemd_unit} %postun -%systemd_postun_with_restart %{systemd_unit_system} -%systemd_user_postun_with_restart %{systemd_unit_handover} -%systemd_user_postun_with_restart %{systemd_unit_headless} -%systemd_user_postun_with_restart %{systemd_unit_user} +%systemd_user_postun_with_restart %{systemd_unit} -%files -f %{name}.lang +%files %license COPYING -%doc README.md -%{_bindir}/grdctl +%doc README %{_libexecdir}/gnome-remote-desktop-daemon -%{_libexecdir}/gnome-remote-desktop-enable-service -%{_libexecdir}/gnome-remote-desktop-configuration-daemon -%{_userunitdir}/%{systemd_unit_user} -%{_userunitdir}/%{systemd_unit_headless} -%{_userunitdir}/%{systemd_unit_handover} -%{_unitdir}/%{systemd_unit_system} -%{_unitdir}/gnome-remote-desktop-configuration.service -%{_datadir}/applications/org.gnome.RemoteDesktop.Handover.desktop -%{_datadir}/dbus-1/system-services/org.gnome.RemoteDesktop.Configuration.service -%{_datadir}/dbus-1/system.d/org.gnome.RemoteDesktop.conf +%{_userunitdir}/gnome-remote-desktop.service %{_datadir}/glib-2.0/schemas/org.gnome.desktop.remote-desktop.gschema.xml %{_datadir}/glib-2.0/schemas/org.gnome.desktop.remote-desktop.enums.xml -%{_datadir}/polkit-1/actions/org.gnome.remotedesktop.configure-system-daemon.policy -%{_datadir}/polkit-1/actions/org.gnome.remotedesktop.enable-system-daemon.policy -%{_datadir}/polkit-1/rules.d/20-gnome-remote-desktop.rules -%{_sysusersdir}/gnome-remote-desktop-sysusers.conf -%{_tmpfilesdir}/gnome-remote-desktop-tmpfiles.conf - -%if %{with rdp} -%{_datadir}/gnome-remote-desktop/ -%endif -%{_mandir}/man1/grdctl.1* %changelog -%autochangelog +* Wed Nov 10 2021 Simone Caronni - 0.1.9-3 +- Rebuild for updated FreeRDP. + +* Mon Sep 14 2020 Jonas Ådahl - 0.1.9-2 +- Copy using the right destination stride + +* Mon Sep 14 2020 Jonas Ådahl - 0.1.9-1 +- Update to 0.1.9 +- Backport race condition crash fix +- Rebase anon-tls patches + +* Sat Aug 01 2020 Fedora Release Engineering - 0.1.7-5 +- Second attempt - Rebuilt for + https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Mon Jul 27 2020 Fedora Release Engineering - 0.1.7-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Tue Jan 28 2020 Fedora Release Engineering - 0.1.7-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Thu Jul 25 2019 Fedora Release Engineering - 0.1.7-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Mon Mar 4 2019 Jonas Ådahl - 0.1.7-1 +- Update to 0.1.7 + +* Thu Jan 31 2019 Fedora Release Engineering - 0.1.6-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Tue Oct 2 2018 Jonas Ådahl - 0.1.6-2 +- Don't crash when PipeWire disconnects (rhbz#1632781) + +* Tue Aug 7 2018 Jonas Ådahl - 0.1.6 +- Update to 0.1.6 +- Apply ANON-TLS patch +- Depend on pipewire 0.2.2 + +* Fri Jul 13 2018 Fedora Release Engineering - 0.1.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed May 30 2018 Jonas Ådahl - 0.1.4-1 +- Update to new version + +* Fri Feb 09 2018 Igor Gnatenko - 0.1.2-5 +- Escape macros in %%changelog + +* Wed Feb 07 2018 Fedora Release Engineering - 0.1.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Aug 29 2017 Jonas Ådahl - 0.1.2-3 +- Use %%autosetup +- Install licence file + +* Tue Aug 22 2017 Jonas Ådahl - 0.1.2-2 +- Remove gschema compilation step as that had been deprecated + +* Mon Aug 21 2017 Jonas Ådahl - 0.1.2-1 +- Update to 0.1.2 +- Changed tabs to spaces +- Added systemd user macros +- Install to correct systemd user unit directory +- Compile gsettings schemas after install and uninstall + +* Mon Aug 21 2017 Jonas Ådahl - 0.1.1-1 +- First packaged version diff --git a/gnutls-anontls.patch b/gnutls-anontls.patch index 6151d72..6c6db61 100644 --- a/gnutls-anontls.patch +++ b/gnutls-anontls.patch @@ -1,7 +1,7 @@ -From 005617f3e2cb59241dc02c2db714c2b934553acb Mon Sep 17 00:00:00 2001 +From 546151b4e15fd45901f38172435cd9aa63893727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Thu, 14 Jun 2018 12:21:37 +0200 -Subject: [PATCH 1/7] vnc: Add anonymous TLS encryption support +Subject: [PATCH 1/6] vnc: Add anonymous TLS encryption support Add support for encrypting the VNC connection using anonymous TLS. In effect this means that the channel is encrypted using TLS but that no @@ -11,36 +11,36 @@ VNC connection. --- meson.build | 1 + src/grd-enums.h | 6 + - src/grd-session-vnc.c | 120 ++++- - src/grd-session-vnc.h | 17 + - src/grd-settings-user.c | 4 + - src/grd-settings.c | 18 + - src/grd-vnc-server.c | 49 ++ + src/grd-session-vnc.c | 98 +++- + src/grd-session-vnc.h | 15 + + src/grd-settings.c | 28 ++ + src/grd-settings.h | 2 + + src/grd-vnc-server.c | 45 ++ src/grd-vnc-tls.c | 444 ++++++++++++++++++ src/grd-vnc-tls.h | 28 ++ - src/meson.build | 3 + + src/meson.build | 5 +- ...nome.desktop.remote-desktop.gschema.xml.in | 10 + - 11 files changed, 674 insertions(+), 26 deletions(-) + 11 files changed, 666 insertions(+), 16 deletions(-) create mode 100644 src/grd-vnc-tls.c create mode 100644 src/grd-vnc-tls.h diff --git a/meson.build b/meson.build -index 5dcb77c3..269238c0 100644 +index af423a4..813c97f 100644 --- a/meson.build +++ b/meson.build -@@ -70,6 +70,7 @@ endif - if have_vnc - libvncclient_dep = dependency('libvncclient') - libvncserver_dep = dependency('libvncserver') -+ gnutls_dep = dependency('gnutls') - endif +@@ -20,6 +20,7 @@ libvncclient_dep = dependency('libvncclient') + libsecret_dep = dependency('libsecret-1') + libnotify_dep = dependency('libnotify') + winpr_dep = dependency('winpr2', version: freerdp_req) ++gnutls_dep = dependency('gnutls') - prefix = get_option('prefix') + cdata = configuration_data() + cdata.set_quoted('GETTEXT_PACKAGE', 'gnome-remote-desktop') diff --git a/src/grd-enums.h b/src/grd-enums.h -index 25b42661..f4438764 100644 +index ffab821..4333863 100644 --- a/src/grd-enums.h +++ b/src/grd-enums.h -@@ -32,6 +32,12 @@ typedef enum +@@ -27,4 +27,10 @@ typedef enum GRD_VNC_AUTH_METHOD_PASSWORD } GrdVncAuthMethod; @@ -50,14 +50,12 @@ index 25b42661..f4438764 100644 + GRD_VNC_ENCRYPTION_TLS_ANON = 1 << 1, +} GrdVncEncryption; + - typedef enum - { - GRD_VNC_SCREEN_SHARE_MODE_MIRROR_PRIMARY, + #endif /* GRD_ENUMS_H */ diff --git a/src/grd-session-vnc.c b/src/grd-session-vnc.c -index f7e14080..b5e4fe13 100644 +index a06d34d..d014315 100644 --- a/src/grd-session-vnc.c +++ b/src/grd-session-vnc.c -@@ -46,7 +46,9 @@ struct _GrdSessionVnc +@@ -44,7 +44,9 @@ struct _GrdSessionVnc { GrdSession parent; @@ -67,7 +65,7 @@ index f7e14080..b5e4fe13 100644 GSource *source; rfbScreenInfoPtr rfb_screen; rfbClientPtr rfb_client; -@@ -608,6 +610,12 @@ check_rfb_password (rfbClientPtr rfb_client, +@@ -518,12 +520,30 @@ check_rfb_password (rfbClientPtr rfb_client, } } @@ -78,10 +76,9 @@ index f7e14080..b5e4fe13 100644 +} + int - grd_session_vnc_get_stride_for_width (GrdSessionVnc *session_vnc, - int width) -@@ -615,6 +623,18 @@ grd_session_vnc_get_stride_for_width (GrdSessionVnc *session_vnc, - return width * BGRX_BYTES_PER_PIXEL; + grd_session_vnc_get_framebuffer_stride (GrdSessionVnc *session_vnc) + { + return session_vnc->rfb_screen->paddedWidthInBytes; } +rfbClientPtr @@ -99,7 +96,7 @@ index f7e14080..b5e4fe13 100644 static void init_vnc_session (GrdSessionVnc *session_vnc) { -@@ -689,44 +709,85 @@ init_vnc_session (GrdSessionVnc *session_vnc) +@@ -564,33 +584,74 @@ init_vnc_session (GrdSessionVnc *session_vnc) rfbProcessEvents (rfb_screen, 0); } @@ -134,17 +131,6 @@ index f7e14080..b5e4fe13 100644 + session_vnc->pending_framebuffer_width, + session_vnc->pending_framebuffer_height); + session_vnc->pending_framebuffer_resize = FALSE; -+ -+ /** -+ * This is a workaround. libvncserver is unable to handle clipboard -+ * changes early and either disconnects the client or crashes g-r-d -+ * if it receives rfbSendServerCutText too early altough the -+ * authentification process is already done. -+ * Doing this after resizing the framebuffer, seems to work fine, -+ * so enable the clipboard here and not when the remote desktop -+ * session proxy is acquired. -+ */ -+ grd_clipboard_vnc_maybe_enable_clipboard (session_vnc->clipboard_vnc); + } + } + @@ -186,17 +172,6 @@ index f7e14080..b5e4fe13 100644 - session_vnc->pending_framebuffer_width, - session_vnc->pending_framebuffer_height); - session_vnc->pending_framebuffer_resize = FALSE; -- -- /** -- * This is a workaround. libvncserver is unable to handle clipboard -- * changes early and either disconnects the client or crashes g-r-d -- * if it receives rfbSendServerCutText too early altough the -- * authentification process is already done. -- * Doing this after resizing the framebuffer, seems to work fine, -- * so enable the clipboard here and not when the remote desktop -- * session proxy is acquired. -- */ -- grd_clipboard_vnc_maybe_enable_clipboard (session_vnc->clipboard_vnc); - } + grd_session_stop (session); } @@ -210,7 +185,7 @@ index f7e14080..b5e4fe13 100644 } return G_SOURCE_CONTINUE; -@@ -739,7 +800,10 @@ grd_session_vnc_attach_source (GrdSessionVnc *session_vnc) +@@ -603,7 +664,10 @@ grd_session_vnc_attach_source (GrdSessionVnc *session_vnc) socket = g_socket_connection_get_socket (session_vnc->connection); session_vnc->source = g_socket_create_source (socket, @@ -222,23 +197,18 @@ index f7e14080..b5e4fe13 100644 NULL); g_source_set_callback (session_vnc->source, (GSourceFunc) handle_socket_data, -@@ -780,6 +844,7 @@ grd_session_vnc_new (GrdVncServer *vnc_server, +@@ -629,8 +693,10 @@ grd_session_vnc_new (GrdVncServer *vnc_server, "context", context, NULL); + session_vnc->vnc_server = vnc_server; session_vnc->connection = g_object_ref (connection); - settings = grd_context_get_settings (context); -@@ -792,6 +857,7 @@ grd_session_vnc_new (GrdVncServer *vnc_server, - G_CALLBACK (on_view_only_changed), - session_vnc); - + grd_session_vnc_grab_socket (session_vnc, vnc_socket_grab_func); grd_session_vnc_attach_source (session_vnc); init_vnc_session (session_vnc); -@@ -806,6 +872,8 @@ grd_session_vnc_dispose (GObject *object) +@@ -645,6 +711,8 @@ grd_session_vnc_dispose (GObject *object) g_assert (!session_vnc->rfb_screen); @@ -248,12 +218,12 @@ index f7e14080..b5e4fe13 100644 G_OBJECT_CLASS (grd_session_vnc_parent_class)->dispose (object); diff --git a/src/grd-session-vnc.h b/src/grd-session-vnc.h -index 8fc71850..3c08f812 100644 +index 07678c8..bba3d56 100644 --- a/src/grd-session-vnc.h +++ b/src/grd-session-vnc.h @@ -36,6 +36,9 @@ G_DECLARE_FINAL_TYPE (GrdSessionVnc, GRD, SESSION_VNC, - GrdSession) + GrdSession); +typedef gboolean (* GrdVncSocketGrabFunc) (GrdSessionVnc *session_vnc, + GError **error); @@ -261,16 +231,16 @@ index 8fc71850..3c08f812 100644 GrdSessionVnc *grd_session_vnc_new (GrdVncServer *vnc_server, GSocketConnection *connection); -@@ -62,4 +65,18 @@ void grd_session_vnc_set_client_clipboard_text (GrdSessionVnc *session_vnc, - int grd_session_vnc_get_stride_for_width (GrdSessionVnc *session_vnc, - int width); +@@ -55,8 +58,20 @@ void grd_session_vnc_move_cursor (GrdSessionVnc *session_vnc, + int x, + int y); +int grd_session_vnc_get_fd (GrdSessionVnc *session_vnc); + -+int grd_session_vnc_get_framebuffer_stride (GrdSessionVnc *session_vnc); -+ + int grd_session_vnc_get_framebuffer_stride (GrdSessionVnc *session_vnc); + gboolean grd_session_vnc_is_client_gone (GrdSessionVnc *session_vnc); -+ + +rfbClientPtr grd_session_vnc_get_rfb_client (GrdSessionVnc *session_vnc); + +void grd_session_vnc_grab_socket (GrdSessionVnc *session_vnc, @@ -280,81 +250,96 @@ index 8fc71850..3c08f812 100644 + GrdVncSocketGrabFunc grab_func); + +GrdVncServer * grd_session_vnc_get_vnc_server (GrdSessionVnc *session_vnc); -diff --git a/src/grd-settings-user.c b/src/grd-settings-user.c -index 1bd679e4..c54e0b80 100644 ---- a/src/grd-settings-user.c -+++ b/src/grd-settings-user.c -@@ -91,6 +91,10 @@ grd_settings_user_constructed (GObject *object) - g_settings_bind (settings->vnc_settings, "screen-share-mode", - settings, "vnc-screen-share-mode", - G_SETTINGS_BIND_DEFAULT); -+ g_settings_bind (settings->vnc_settings, "encryption", -+ settings, "vnc-encryption", -+ G_SETTINGS_BIND_DEFAULT); + - - G_OBJECT_CLASS (grd_settings_user_parent_class)->constructed (object); - } + #endif /* GRD_SESSION_VNC_H */ diff --git a/src/grd-settings.c b/src/grd-settings.c -index 8393ace5..a65385ef 100644 +index 3af87be..f37f2da 100644 --- a/src/grd-settings.c +++ b/src/grd-settings.c -@@ -58,6 +58,7 @@ enum - PROP_RDP_SERVER_CERT_PATH, - PROP_RDP_SERVER_KEY_PATH, - PROP_VNC_AUTH_METHOD, -+ PROP_VNC_ENCRYPTION, - }; - - typedef struct _GrdSettingsPrivate -@@ -84,6 +85,7 @@ typedef struct _GrdSettingsPrivate +@@ -60,6 +60,7 @@ struct _GrdSettings gboolean view_only; - GrdVncScreenShareMode screen_share_mode; GrdVncAuthMethod auth_method; + int port; + GrdVncEncryption encryption; } vnc; - } GrdSettingsPrivate; + }; -@@ -426,6 +428,9 @@ grd_settings_get_property (GObject *object, - else - g_value_set_enum (value, priv->vnc.auth_method); - break; -+ case PROP_VNC_ENCRYPTION: -+ g_value_set_flags (value, priv->vnc.encryption); -+ break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - } -@@ -563,6 +568,9 @@ grd_settings_set_property (GObject *object, - case PROP_VNC_AUTH_METHOD: - priv->vnc.auth_method = g_value_get_enum (value); - break; -+ case PROP_VNC_ENCRYPTION: -+ priv->vnc.encryption = g_value_get_flags (value); -+ break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - } -@@ -744,4 +752,14 @@ grd_settings_class_init (GrdSettingsClass *klass) - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); -+ g_object_class_install_property (object_class, -+ PROP_VNC_ENCRYPTION, -+ g_param_spec_flags ("vnc-encryption", -+ "vnc encryption", -+ "vnc encryption", -+ GRD_TYPE_VNC_ENCRYPTION, -+ GRD_VNC_ENCRYPTION_TLS_ANON, -+ G_PARAM_READWRITE | -+ G_PARAM_CONSTRUCT | -+ G_PARAM_STATIC_STRINGS)); +@@ -232,6 +233,12 @@ grd_settings_get_vnc_auth_method (GrdSettings *settings) + return settings->vnc.auth_method; } + ++GrdVncEncryption ++grd_settings_get_vnc_encryption (GrdSettings *settings) ++{ ++ return settings->vnc.encryption; ++} ++ + static void + update_rdp_tls_cert (GrdSettings *settings) + { +@@ -267,6 +274,13 @@ update_vnc_auth_method (GrdSettings *settings) + "auth-method"); + } + ++static void ++update_vnc_encryption (GrdSettings *settings) ++{ ++ settings->vnc.encryption = g_settings_get_flags (settings->vnc.settings, ++ "encryption"); ++} ++ + static void + on_rdp_settings_changed (GSettings *rdp_settings, + const char *key, +@@ -304,6 +318,11 @@ on_vnc_settings_changed (GSettings *vnc_settings, + update_vnc_auth_method (settings); + g_signal_emit (settings, signals[VNC_AUTH_METHOD_CHANGED], 0); + } ++ else if (strcmp (key, "encryption") == 0) ++ { ++ update_vnc_encryption (settings); ++ g_signal_emit (settings, signals[VNC_ENCRYPTION_CHANGED], 0); ++ } + } + + static void +@@ -335,6 +354,8 @@ grd_settings_init (GrdSettings *settings) + + settings->rdp.port = GRD_RDP_SERVER_PORT; + settings->vnc.port = GRD_VNC_SERVER_PORT; ++ ++ update_vnc_encryption (settings); + } + + static void +@@ -379,4 +400,11 @@ grd_settings_class_init (GrdSettingsClass *klass) + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 0); ++ signals[VNC_ENCRYPTION_CHANGED] = ++ g_signal_new ("vnc-encryption-changed", ++ G_TYPE_FROM_CLASS (klass), ++ G_SIGNAL_RUN_LAST, ++ 0, ++ NULL, NULL, NULL, ++ G_TYPE_NONE, 0); + } +diff --git a/src/grd-settings.h b/src/grd-settings.h +index e12e47e..b940fdb 100644 +--- a/src/grd-settings.h ++++ b/src/grd-settings.h +@@ -64,4 +64,6 @@ gboolean grd_settings_get_vnc_view_only (GrdSettings *settings); + + GrdVncAuthMethod grd_settings_get_vnc_auth_method (GrdSettings *settings); + ++GrdVncEncryption grd_settings_get_vnc_encryption (GrdSettings *settings); ++ + #endif /* GRD_SETTINGS_H */ diff --git a/src/grd-vnc-server.c b/src/grd-vnc-server.c -index 83220655..2f8229b2 100644 +index a6d95cb..f9c68db 100644 --- a/src/grd-vnc-server.c +++ b/src/grd-vnc-server.c -@@ -24,6 +24,7 @@ +@@ -24,11 +24,13 @@ #include "grd-vnc-server.h" @@ -362,15 +347,13 @@ index 83220655..2f8229b2 100644 #include #include -@@ -31,6 +32,7 @@ - #include "grd-debug.h" + #include "grd-context.h" #include "grd-session-vnc.h" - #include "grd-utils.h" +#include "grd-vnc-tls.h" + enum - { -@@ -130,6 +132,45 @@ on_incoming (GSocketService *service, +@@ -130,6 +132,43 @@ on_incoming (GSocketService *service, return TRUE; } @@ -382,9 +365,7 @@ index 83220655..2f8229b2 100644 + GrdVncEncryption encryption; + + tls_security_handler = grd_vnc_tls_get_security_handler (); -+ g_object_get (G_OBJECT (settings), -+ "vnc-encryption", &encryption, -+ NULL); ++ encryption = grd_settings_get_vnc_encryption (settings); + + if (encryption == (GRD_VNC_ENCRYPTION_NONE | GRD_VNC_ENCRYPTION_TLS_ANON)) + { @@ -416,19 +397,18 @@ index 83220655..2f8229b2 100644 gboolean grd_vnc_server_start (GrdVncServer *vnc_server, GError **error) -@@ -242,11 +283,19 @@ grd_vnc_server_dispose (GObject *object) - static void +@@ -220,12 +259,18 @@ static void grd_vnc_server_constructed (GObject *object) { -+ GrdVncServer *vnc_server = GRD_VNC_SERVER (object); + GrdVncServer *vnc_server = GRD_VNC_SERVER (object); + GrdSettings *settings = grd_context_get_settings (vnc_server->context); -+ - if (grd_get_debug_flags () & GRD_DEBUG_VNC) + + if (grd_context_get_debug_flags (vnc_server->context) & GRD_DEBUG_VNC) rfbLogEnable (1); else rfbLogEnable (0); -+ g_signal_connect (settings, "notify::vnc-encryption", ++ g_signal_connect (settings, "vnc-encryption-changed", + G_CALLBACK (on_vnc_encryption_changed), + vnc_server); + sync_encryption_settings (vnc_server); @@ -438,7 +418,7 @@ index 83220655..2f8229b2 100644 diff --git a/src/grd-vnc-tls.c b/src/grd-vnc-tls.c new file mode 100644 -index 00000000..ec4758e0 +index 0000000..ec4758e --- /dev/null +++ b/src/grd-vnc-tls.c @@ -0,0 +1,444 @@ @@ -888,7 +868,7 @@ index 00000000..ec4758e0 +} diff --git a/src/grd-vnc-tls.h b/src/grd-vnc-tls.h new file mode 100644 -index 00000000..135ef8c7 +index 0000000..135ef8c --- /dev/null +++ b/src/grd-vnc-tls.h @@ -0,0 +1,28 @@ @@ -921,29 +901,34 @@ index 00000000..135ef8c7 + +#endif /* GRD_VNC_TLS_H */ diff --git a/src/meson.build b/src/meson.build -index 1b2cb93d..6b8b517e 100644 +index 1b6425d..17579b1 100644 --- a/src/meson.build +++ b/src/meson.build -@@ -274,10 +274,13 @@ if have_vnc - 'grd-vnc-pipewire-stream.h', - 'grd-vnc-server.c', - 'grd-vnc-server.h', -+ 'grd-vnc-tls.c', -+ 'grd-vnc-tls.h', - ]) - - deps += [ - libvncserver_dep, -+ gnutls_dep, - ] - endif +@@ -33,6 +33,8 @@ daemon_sources = files([ + 'grd-vnc-pipewire-stream.h', + 'grd-vnc-server.c', + 'grd-vnc-server.h', ++ 'grd-vnc-tls.c', ++ 'grd-vnc-tls.h', + ]) + gen_daemon_sources = [] +@@ -66,7 +68,8 @@ executable('gnome-remote-desktop-daemon', + libvncserver_dep, + libsecret_dep, + libnotify_dep, +- winpr_dep], ++ winpr_dep, ++ gnutls_dep], + include_directories: [configinc], + install: true, + install_dir: libexecdir) diff --git a/src/org.gnome.desktop.remote-desktop.gschema.xml.in b/src/org.gnome.desktop.remote-desktop.gschema.xml.in -index 2986a0e5..a0169789 100644 +index 4b6e593..0086d99 100644 --- a/src/org.gnome.desktop.remote-desktop.gschema.xml.in +++ b/src/org.gnome.desktop.remote-desktop.gschema.xml.in -@@ -173,6 +173,16 @@ - configuration updates. +@@ -49,5 +49,15 @@ + * password - by requiring the remote client to provide a known password + @@ -957,16 +942,15 @@ index 2986a0e5..a0169789 100644 + + - - + -- -2.51.0 +2.26.2 -From bc65e13fb3687b2f79433c880525333810d6ba31 Mon Sep 17 00:00:00 2001 +From 2e46518f421fd8704770bb6742accfacba3570aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 27 Nov 2019 11:02:09 +0100 -Subject: [PATCH 2/7] session-vnc: Add paused/resumed signals +Subject: [PATCH 2/6] session-vnc: Add paused/resumed signals Paused is when the socket sourec is detached, and resumed when attached. Meant to be used by the TLS channel security to a attach/detach @@ -976,10 +960,10 @@ out-of-socket source. 1 file changed, 65 insertions(+), 7 deletions(-) diff --git a/src/grd-session-vnc.c b/src/grd-session-vnc.c -index b5e4fe13..79de30d4 100644 +index d014315..7edd407 100644 --- a/src/grd-session-vnc.c +++ b/src/grd-session-vnc.c -@@ -42,14 +42,27 @@ +@@ -40,14 +40,27 @@ #define BGRX_SAMPLES_PER_PIXEL 3 #define BGRX_BYTES_PER_PIXEL 4 @@ -1007,8 +991,8 @@ index b5e4fe13..79de30d4 100644 rfbScreenInfoPtr rfb_screen; rfbClientPtr rfb_client; -@@ -81,7 +94,7 @@ struct _GrdSessionVnc - G_DEFINE_TYPE (GrdSessionVnc, grd_session_vnc, GRD_TYPE_SESSION) +@@ -73,7 +86,7 @@ struct _GrdSessionVnc + G_DEFINE_TYPE (GrdSessionVnc, grd_session_vnc, GRD_TYPE_SESSION); static void -grd_session_vnc_detach_source (GrdSessionVnc *session_vnc); @@ -1016,7 +1000,7 @@ index b5e4fe13..79de30d4 100644 static gboolean close_session_idle (gpointer user_data); -@@ -248,7 +261,8 @@ handle_client_gone (rfbClientPtr rfb_client) +@@ -224,7 +237,8 @@ handle_client_gone (rfbClientPtr rfb_client) g_debug ("VNC client gone"); @@ -1026,16 +1010,16 @@ index b5e4fe13..79de30d4 100644 maybe_queue_close_session_idle (session_vnc); session_vnc->rfb_client = NULL; } -@@ -338,7 +352,7 @@ handle_new_client (rfbClientPtr rfb_client) - { - case GRD_VNC_AUTH_METHOD_PROMPT: - show_sharing_desktop_prompt (session_vnc, rfb_client->host); +@@ -293,7 +307,7 @@ handle_new_client (rfbClientPtr rfb_client) + session_vnc->prompt_cancellable, + prompt_response_callback, + session_vnc); - grd_session_vnc_detach_source (session_vnc); + grd_session_vnc_pause (session_vnc); return RFB_CLIENT_ON_HOLD; case GRD_VNC_AUTH_METHOD_PASSWORD: session_vnc->rfb_screen->passwordCheck = check_rfb_password; -@@ -601,7 +615,7 @@ check_rfb_password (rfbClientPtr rfb_client, +@@ -511,7 +525,7 @@ check_rfb_password (rfbClientPtr rfb_client, if (memcmp (challenge_encrypted, response_encrypted, len) == 0) { grd_session_start (GRD_SESSION (session_vnc)); @@ -1044,8 +1028,8 @@ index b5e4fe13..79de30d4 100644 return TRUE; } else -@@ -821,6 +835,36 @@ grd_session_vnc_detach_source (GrdSessionVnc *session_vnc) - g_clear_pointer (&session_vnc->source, g_source_unref); +@@ -681,6 +695,36 @@ grd_session_vnc_detach_source (GrdSessionVnc *session_vnc) + g_clear_pointer (&session_vnc->source, g_source_destroy); } +gboolean @@ -1078,10 +1062,10 @@ index b5e4fe13..79de30d4 100644 + g_signal_emit (session_vnc, signals[RESUMED], 0); +} + - static void - on_view_only_changed (GrdSettings *settings, - GParamSpec *pspec, -@@ -859,6 +903,7 @@ grd_session_vnc_new (GrdVncServer *vnc_server, + GrdSessionVnc * + grd_session_vnc_new (GrdVncServer *vnc_server, + GSocketConnection *connection) +@@ -698,6 +742,7 @@ grd_session_vnc_new (GrdVncServer *vnc_server, grd_session_vnc_grab_socket (session_vnc, vnc_socket_grab_func); grd_session_vnc_attach_source (session_vnc); @@ -1089,16 +1073,16 @@ index b5e4fe13..79de30d4 100644 init_vnc_session (session_vnc); -@@ -893,7 +938,7 @@ grd_session_vnc_stop (GrdSession *session) - g_clear_object (&session_vnc->stream); - } +@@ -727,7 +772,7 @@ grd_session_vnc_stop (GrdSession *session) + + g_clear_object (&session_vnc->pipewire_stream); - grd_session_vnc_detach_source (session_vnc); + grd_session_vnc_pause (session_vnc); g_clear_object (&session_vnc->connection); - g_clear_object (&session_vnc->clipboard_vnc); -@@ -984,8 +1029,8 @@ on_stream_ready (GrdStream *stream, + g_clear_pointer (&session_vnc->rfb_screen->frameBuffer, g_free); +@@ -783,8 +828,8 @@ grd_session_vnc_stream_ready (GrdSession *session, G_CALLBACK (on_pipewire_stream_closed), session_vnc); @@ -1109,10 +1093,10 @@ index b5e4fe13..79de30d4 100644 } static void -@@ -1021,4 +1066,17 @@ grd_session_vnc_class_init (GrdSessionVncClass *klass) +@@ -803,4 +848,17 @@ grd_session_vnc_class_init (GrdSessionVncClass *klass) session_class->stop = grd_session_vnc_stop; - session_class->on_stream_created = grd_session_vnc_on_stream_created; + session_class->stream_ready = grd_session_vnc_stream_ready; + + signals[PAUSED] = g_signal_new ("paused", + G_TYPE_FROM_CLASS (klass), @@ -1128,13 +1112,13 @@ index b5e4fe13..79de30d4 100644 + G_TYPE_NONE, 0); } -- -2.51.0 +2.26.2 -From aabc0245e247fbffe9ae6b8281cbf2bccc9ab882 Mon Sep 17 00:00:00 2001 +From b59c36ccf73939d32ccf5ab4eb47460a9fe415f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 27 Nov 2019 11:03:46 +0100 -Subject: [PATCH 3/7] session-vnc: Add grd_session_vnc_dispatch() helper +Subject: [PATCH 3/6] session-vnc: Add grd_session_vnc_dispatch() helper To be used by the TLS channel security to dispatch when there is data available that is not visible to the socket source. @@ -1144,10 +1128,10 @@ available that is not visible to the socket source. 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/grd-session-vnc.c b/src/grd-session-vnc.c -index 79de30d4..b48b9017 100644 +index 7edd407..29c94a1 100644 --- a/src/grd-session-vnc.c +++ b/src/grd-session-vnc.c -@@ -771,6 +771,21 @@ vnc_socket_grab_func (GrdSessionVnc *session_vnc, +@@ -635,6 +635,21 @@ vnc_socket_grab_func (GrdSessionVnc *session_vnc, return TRUE; } @@ -1169,7 +1153,7 @@ index 79de30d4..b48b9017 100644 static gboolean handle_socket_data (GSocket *socket, GIOCondition condition, -@@ -787,16 +802,7 @@ handle_socket_data (GSocket *socket, +@@ -651,16 +666,7 @@ handle_socket_data (GSocket *socket, } else if (condition & G_IO_IN) { @@ -1188,24 +1172,26 @@ index 79de30d4..b48b9017 100644 else { diff --git a/src/grd-session-vnc.h b/src/grd-session-vnc.h -index 3c08f812..f230887e 100644 +index bba3d56..58f635c 100644 --- a/src/grd-session-vnc.h +++ b/src/grd-session-vnc.h -@@ -79,4 +79,6 @@ void grd_session_vnc_grab_socket (GrdSessionVnc *session_vnc, +@@ -72,6 +72,8 @@ void grd_session_vnc_grab_socket (GrdSessionVnc *session_vnc, void grd_session_vnc_ungrab_socket (GrdSessionVnc *session_vnc, GrdVncSocketGrabFunc grab_func); +void grd_session_vnc_dispatch (GrdSessionVnc *session_vnc); + GrdVncServer * grd_session_vnc_get_vnc_server (GrdSessionVnc *session_vnc); + + #endif /* GRD_SESSION_VNC_H */ -- -2.51.0 +2.26.2 -From 2d43f0586ae24b202beda4d283b25fec3e722af7 Mon Sep 17 00:00:00 2001 +From 966b2ddbd1c03c9e20dc66e5ea9a2dfb39ba4bfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 27 Nov 2019 11:05:13 +0100 -Subject: [PATCH 4/7] vnc/tls: Add some logging +Subject: [PATCH 4/6] vnc/tls: Add some logging Uses the log utility from libvncserver as it is related to the RFB protocol rather than the session itself. @@ -1214,7 +1200,7 @@ protocol rather than the session itself. 1 file changed, 9 insertions(+) diff --git a/src/grd-vnc-tls.c b/src/grd-vnc-tls.c -index ec4758e0..ac6c35f6 100644 +index ec4758e..ac6c35f 100644 --- a/src/grd-vnc-tls.c +++ b/src/grd-vnc-tls.c @@ -67,6 +67,7 @@ grd_vnc_tls_context_new (void) @@ -1276,13 +1262,13 @@ index ec4758e0..ac6c35f6 100644 { g_warning ("TLS handshake failed: %s", error->message); -- -2.51.0 +2.26.2 -From 62e04d794eaf2c0acfc16af0b0968fead4bb4df1 Mon Sep 17 00:00:00 2001 +From e01d27dc9911f4d7ecfd232c7e389f4dabfd87de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 27 Nov 2019 11:07:40 +0100 -Subject: [PATCH 5/7] vnc/tls: Dispatch also when data is pending outside of +Subject: [PATCH 5/6] vnc/tls: Dispatch also when data is pending outside of the socket gnutls may have data available in its buffers, and we have our own peek @@ -1296,10 +1282,10 @@ long as there is data to read in those buffers. 2 files changed, 86 insertions(+), 6 deletions(-) diff --git a/src/grd-session-vnc.h b/src/grd-session-vnc.h -index f230887e..9dd33442 100644 +index 58f635c..0d01ad3 100644 --- a/src/grd-session-vnc.h +++ b/src/grd-session-vnc.h -@@ -79,6 +79,8 @@ void grd_session_vnc_grab_socket (GrdSessionVnc *session_vnc, +@@ -72,6 +72,8 @@ void grd_session_vnc_grab_socket (GrdSessionVnc *session_vnc, void grd_session_vnc_ungrab_socket (GrdSessionVnc *session_vnc, GrdVncSocketGrabFunc grab_func); @@ -1309,7 +1295,7 @@ index f230887e..9dd33442 100644 GrdVncServer * grd_session_vnc_get_vnc_server (GrdSessionVnc *session_vnc); diff --git a/src/grd-vnc-tls.c b/src/grd-vnc-tls.c -index ac6c35f6..312b6b92 100644 +index ac6c35f..312b6b9 100644 --- a/src/grd-vnc-tls.c +++ b/src/grd-vnc-tls.c @@ -41,6 +41,12 @@ typedef enum _GrdTlsHandshakeState @@ -1446,13 +1432,13 @@ index ac6c35f6..312b6b92 100644 } -- -2.51.0 +2.26.2 -From 799e2b287bd055c46709d0063436b819894200e6 Mon Sep 17 00:00:00 2001 +From 682f3b4a8e985f00a00e761a086a15cb5e2b9b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 27 Nov 2019 16:48:00 +0100 -Subject: [PATCH 6/7] session-vnc: Set our own password handling function up +Subject: [PATCH 6/6] session-vnc: Set our own password handling function up front libvncserver decides whether to register a auth security handler @@ -1468,10 +1454,10 @@ password prompt. 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/grd-session-vnc.c b/src/grd-session-vnc.c -index b48b9017..87cc7d86 100644 +index 29c94a1..ebe1540 100644 --- a/src/grd-session-vnc.c +++ b/src/grd-session-vnc.c -@@ -99,11 +99,6 @@ grd_session_vnc_pause (GrdSessionVnc *session_vnc); +@@ -91,11 +91,6 @@ grd_session_vnc_pause (GrdSessionVnc *session_vnc); static gboolean close_session_idle (gpointer user_data); @@ -1483,7 +1469,7 @@ index b48b9017..87cc7d86 100644 static void swap_uint8 (uint8_t *a, uint8_t *b) -@@ -355,7 +350,6 @@ handle_new_client (rfbClientPtr rfb_client) +@@ -310,7 +305,6 @@ handle_new_client (rfbClientPtr rfb_client) grd_session_vnc_pause (session_vnc); return RFB_CLIENT_ON_HOLD; case GRD_VNC_AUTH_METHOD_PASSWORD: @@ -1491,9 +1477,9 @@ index b48b9017..87cc7d86 100644 /* * authPasswdData needs to be non NULL in libvncserver to trigger * password authentication. -@@ -719,6 +713,8 @@ init_vnc_session (GrdSessionVnc *session_vnc) - session_vnc->monitor_config->connectors = connectors; - } +@@ -594,6 +588,8 @@ init_vnc_session (GrdSessionVnc *session_vnc) + rfb_screen->frameBuffer = g_malloc0 (screen_width * screen_height * 4); + memset (rfb_screen->frameBuffer, 0x1f, screen_width * screen_height * 4); + rfb_screen->passwordCheck = check_rfb_password; + @@ -1501,41 +1487,5 @@ index b48b9017..87cc7d86 100644 rfbProcessEvents (rfb_screen, 0); } -- -2.51.0 - - -From b74286bdb8876d27d279c725357d73a23a3316b4 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -Date: Mon, 12 Oct 2020 17:34:30 +0200 -Subject: [PATCH 7/7] vnc: Copy pixels using the right destination stride - -We're copying the pixels in a separate thread managed by PipeWire, and -in this thread, accessing the VNC framebuffer dimension and stride is -racy. Instead of fetching the dimension directly, pass the expected -width and get the stride it will eventually have. - -Already before this patch, when the copied pixel end up on the main -thread and the dimension still doesn't match up, the frame will be -dropped. ---- - src/grd-session-vnc.h | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/src/grd-session-vnc.h b/src/grd-session-vnc.h -index 9dd33442..98c73451 100644 ---- a/src/grd-session-vnc.h -+++ b/src/grd-session-vnc.h -@@ -67,7 +67,8 @@ int grd_session_vnc_get_stride_for_width (GrdSessionVnc *session_vnc, - - int grd_session_vnc_get_fd (GrdSessionVnc *session_vnc); - --int grd_session_vnc_get_framebuffer_stride (GrdSessionVnc *session_vnc); -+int grd_session_vnc_get_stride_for_width (GrdSessionVnc *session_vnc, -+ int width); - - gboolean grd_session_vnc_is_client_gone (GrdSessionVnc *session_vnc); - --- -2.51.0 - +2.26.2 diff --git a/plans/main.fmf b/plans/main.fmf deleted file mode 100644 index ae0c305..0000000 --- a/plans/main.fmf +++ /dev/null @@ -1,6 +0,0 @@ -summary: Run all tests -execute: - how: tmt -discover: - how: fmf - diff --git a/sources b/sources index d817ea5..65eca64 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (gnome-remote-desktop-49.2.tar.xz) = b678ee125e1b5f6d58e85f57a332cf02ee6b5dee654469e66f496f9467e6512a701a3e37a9580562e0b064320380d2df4ca6b15e20bd35b1605b4bd9de73827c +SHA512 (gnome-remote-desktop-0.1.9.tar.xz) = 6ac2962c824634cd5322785b6d251e899ea38668010b18b1b50124497895d9c00752904abf01490e27b74e1661aeae39d83fbbd77b841329b1e0fd381c3ea440 diff --git a/tests/got-audit/got-audit.gdb b/tests/got-audit/got-audit.gdb deleted file mode 100644 index 6661297..0000000 --- a/tests/got-audit/got-audit.gdb +++ /dev/null @@ -1,2 +0,0 @@ -gef config gef.disable_color True -got-audit --all diff --git a/tests/got-audit/main.fmf b/tests/got-audit/main.fmf deleted file mode 100644 index 25caf1d..0000000 --- a/tests/got-audit/main.fmf +++ /dev/null @@ -1,10 +0,0 @@ -summary: Audit the GOT for signs of tampering -description: | - Pointers in the server process GOT will be checked to ensure that - each function pointer's value is within a shared object file - that exports a symbol of that name, and that no shared object - files export conflicting symbols. -contact: Gordon Messmer -require+: - - gdb-gef # needed to test got-audit - - gnome-remote-desktop diff --git a/tests/got-audit/runtest.sh b/tests/got-audit/runtest.sh deleted file mode 100755 index c4b9b29..0000000 --- a/tests/got-audit/runtest.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# -# runtest.sh of /CoreOS/gnome-remote-desktop/Sanity/got-audit -# Description: Check pointers in the server process GOT for signs of tampering -# Author: Gordon Messmer -# - -# Include Beaker environment -. /usr/share/beakerlib/beakerlib.sh || exit 1 - -rlJournalStart - rlPhaseStartSetup - rlRun "systemctl start --user gnome-remote-desktop-headless" - rlRun "TestDir=\$(pwd)" - rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory" - rlRun "pushd $TmpDir" - rlRun "auditfile=\$(mktemp --tmpdir=${TmpDir})" - rlPhaseEnd - - rlPhaseStartTest "Run GEF got-audit" - rlRun "SERVICE_PID=\$( systemctl show --property=MainPID --user gnome-remote-desktop-headless.service | cut -f2 -d= )" - rlRun "echo SERVICE_PID is '$SERVICE_PID'" - [ -n "$SERVICE_PID" ] || rlFail "No service pid was found" - rlRun "gdb-gef --pid '$SERVICE_PID' --command='$TestDir'/got-audit.gdb --batch > '$auditfile'" - # Basic test: ensure that at least one symbol is found in libc.so, - # to verify that the report looks plausible. - rlAssertGrep " : /.*/libc.so" "$auditfile" - # Ensure the got-audit did not report any errors - rlAssertNotGrep " :: ERROR" "$auditfile" - rlRun "cp '$auditfile' '$TMT_TEST_DATA'/got-audit.txt" - rlPhaseEnd - - rlPhaseStartCleanup - rlRun "systemctl stop --user gnome-remote-desktop-headless" - rlRun "popd" - rlRun "rm -r $TmpDir" 0 "Removing tmp directory" - rlPhaseEnd -rlJournalPrintText -rlJournalEnd diff --git a/tests/main.fmf b/tests/main.fmf deleted file mode 100644 index f225a72..0000000 --- a/tests/main.fmf +++ /dev/null @@ -1,2 +0,0 @@ -test: ./runtest.sh -framework: beakerlib