Name: coffeerdp Version: 0.1.4 Release: 2%{?dist} Summary: RDP client with durable Entra ID login, built on FreeRDP's SDL3 client License: Apache-2.0 URL: https://github.com/CodeNeedsCoffee/CoffeeRDP # .copr/Makefile builds this from `git archive` at the commit COPR checks # out -- there is no tagged upstream release tarball yet, see PACKAGING.md. Source0: %{name}-%{version}.tar.gz BuildRequires: cmake BuildRequires: ninja-build BuildRequires: gcc-c++ BuildRequires: pkgconfig # FreeRDP is vendored in-tree (vendor/freerdp, a git submodule -- see # FREERDP_VENDORING.md) and built as part of this package via # add_subdirectory() rather than linked against the system freerdp-devel/ # libwinpr-devel packages. That means users get our FreeRDP fixes without a # second, differently-patched FreeRDP install, but it also means *this spec* # needs FreeRDP's own build dependencies instead. The list below is FreeRDP # 3.30's build deps (per its own Fedora packaging) trimmed to what our # client-only CMake flag set in the top-level CMakeLists.txt actually # builds: no BuildRequires for anything gated behind WITH_SERVER/ # WITH_SHADOW/WITH_PROXY/WITH_SAMPLE/WITH_CLIENT_SDL3 (all OFF -- the SDL3 # client is CoffeeRDP's own, not FreeRDP's bundled one) or CHANNEL_URBDRC # (USB redirection, also OFF -- untested/undocumented feature not worth the # libusb dependency). SDL3(-ttf)-devel are already required above for # CoffeeRDP's own client, so they aren't repeated here even though FreeRDP's # own CMake would otherwise ask for them too. BuildRequires: alsa-lib-devel BuildRequires: cmake(json-c) BuildRequires: uriparser-devel BuildRequires: cups-devel BuildRequires: gsm-devel BuildRequires: lame-devel BuildRequires: libicu-devel # libpng/libjpeg/libwebp: WinPR clipboard image conversion (PNG/JPEG/WebP <-> # DIB), forced ON in the top-level CMakeLists.txt. BuildRequires: libpng-devel BuildRequires: libjpeg-turbo-devel BuildRequires: turbojpeg-devel BuildRequires: libX11-devel BuildRequires: libXcursor-devel BuildRequires: libXdamage-devel BuildRequires: libXext-devel BuildRequires: libXi-devel BuildRequires: libXinerama-devel BuildRequires: libxkbfile-devel BuildRequires: libXrandr-devel BuildRequires: libXtst-devel BuildRequires: libXv-devel BuildRequires: pkgconfig(aom) BuildRequires: pkgconfig(cairo) BuildRequires: pkgconfig(fdk-aac) BuildRequires: pkgconfig(fuse3) BuildRequires: pkgconfig(krb5) BuildRequires: pkgconfig(libcbor) BuildRequires: pkgconfig(libfido2) BuildRequires: pkgconfig(libpcsclite) BuildRequires: pkgconfig(libpulse) BuildRequires: pkgconfig(libsystemd) BuildRequires: pkgconfig(libwebp) BuildRequires: pkgconfig(libyuv) BuildRequires: pkgconfig(openh264) BuildRequires: pkgconfig(openssl) BuildRequires: pkgconfig(opus) BuildRequires: pkgconfig(soxr) BuildRequires: pkgconfig(sso-mib) BuildRequires: pkgconfig(wayland-client) BuildRequires: pkgconfig(wayland-scanner) BuildRequires: pkgconfig(xkbcommon) # WITH_FFMPEG/WITH_VIDEO_FFMPEG are forced ON in the top-level CMakeLists.txt # (the flag set validated during the multimon/quality-preset crash # investigation) so that WITH_VAAPI -- hardware H.264 decode -- can be ON at # all; FreeRDP's own CMake makes WITH_VAAPI a cmake_dependent_option() on # WITH_VIDEO_FFMPEG. Fedora's own repos can't carry ffmpeg-devel (patent/ # licensing), so this COPR project's chroot needs RPM Fusion Free enabled as # an external repo (Project Settings) for this to resolve. BuildRequires: ffmpeg-devel BuildRequires: zlib-devel BuildRequires: SDL3-devel BuildRequires: SDL3_ttf-devel BuildRequires: gtk4-devel BuildRequires: libadwaita-devel BuildRequires: webkitgtk6.0-devel # gdbus-codegen (the resident auth helper's GDBus interface, PLAN.md Phase # 7.5) and gio-2.0/gio-unix-2.0 already come in transitively via gtk4-devel, # but this project talks to them directly, not just through GTK, so it's # named explicitly rather than left implicit. BuildRequires: glib2-devel # XDG Background portal client (run in the background past the manager # window closing, so the resident auth helper survives it too), Phase 7.5. BuildRequires: libportal-gtk4-devel # %%check: validates the .desktop file and AppStream metadata at build time # so a broken one fails the package build, not a GNOME Software listing # after the fact. BuildRequires: desktop-file-utils BuildRequires: appstream # The session client renders through the GPU (or the compositor's software # fallback) via SDL3, same runtime story as any other SDL/GTK application -- # no separate Requires needed beyond what the dependent libraries above # already pull in transitively. # coffee-rdp-op-askpass shells out to `op` (the 1Password CLI) when a # profile has a 1Password reference set, but only then -- profiles without # one never touch it, and the helper itself degrades to "no autofill" # rather than failing if `op` isn't on PATH. Recommends rather than # Requires: the whole feature is opt-in per profile. Recommends: 1password-cli %description CoffeeRDP is a minimal RDP client for Linux, built on FreeRDP's SDL3 client with a GTK4 connection manager on top of it. Features: * Wayland-first, with an automatic X11 fallback when Wayland can't deliver * Persistent Entra ID (Azure AD) login instead of a full MFA challenge every connection, reusing one signed-in session for as long as coffeerdp keeps running (optionally in the background past closing its window) * An idle keep-alive so sessions don't disconnect while you're away * An in-session control bar: disconnect, minimize, fullscreen/restore, keyboard capture, Ctrl+Alt+Del, Send Super, connection quality, and a local-shortcuts toggle * Selectable connection quality presets * A connection manager with saved profiles and in-place .rdp file editing This package installs four binaries: coffeerdp (the GTK4 connection manager -- the one with a desktop launcher), coffee-rdp-session (the SDL3 session client it launches per connection), coffee-rdp-auth (a WebKitGTK-based Entra ID sign-in helper), and coffee-rdp-op-askpass (a FREERDP_ASKPASS helper that resolves a profile's NLA/RDP password via the 1Password CLI when the profile has a reference configured for it). coffeerdp starts coffee-rdp-auth as a resident helper on first connect and keeps it running, over its own private connection, for as long as coffeerdp is open; closing the window offers to keep it running in the background (via the XDG Background portal) so that session survives past the window too. %prep %autosetup -p1 %build %cmake -GNinja -DCOFFEERDP_BUILD_REVISION=%{version}-%{release} %cmake_build %install %cmake_install %check %ctest desktop-file-validate %{buildroot}%{_datadir}/applications/com.codeneedscoffee.coffeerdp.manager.desktop desktop-file-validate %{buildroot}%{_datadir}/applications/com.codeneedscoffee.coffeerdp.session.desktop appstreamcli validate --no-net --pedantic \ %{buildroot}%{_datadir}/metainfo/com.codeneedscoffee.coffeerdp.manager.metainfo.xml %files %license LICENSE %doc README.md %{_bindir}/coffeerdp %{_bindir}/coffee-rdp-session %{_bindir}/coffee-rdp-auth %{_bindir}/coffee-rdp-op-askpass # Vendored FreeRDP (freerdp/freerdp-client/winpr), built from vendor/freerdp # and installed to a private, coffeerdp-owned directory rather than the # system libdir -- see FREERDP_VENDORING.md and the COFFEERDP_VENDOR_LIBDIR # comment in the top-level CMakeLists.txt. Never the system libdir: that # would file-conflict with a real freerdp-libs package if a user has one. %{_libdir}/coffeerdp/ %{_datadir}/applications/com.codeneedscoffee.coffeerdp.manager.desktop %{_datadir}/applications/com.codeneedscoffee.coffeerdp.session.desktop %{_datadir}/metainfo/com.codeneedscoffee.coffeerdp.manager.metainfo.xml %{_datadir}/icons/hicolor/*/apps/com.codeneedscoffee.coffeerdp.manager.png %{_datadir}/coffeerdp/resources %changelog * Tue Oct 13 2026 CodeNeedsCoffee - 0.1.4-2 - Fix screenshots (image/png) pasting as "nothing / empty clipboard" in both directions. The vendored WinPR was built with PNG, JPEG and WebP conversion all OFF, so it could only move image/bmp: Windows screenshots were offered to Linux apps without image/png, and a Linux screenshot was announced to Windows as CF_DIB and then answered "no image" when Windows asked for it. Force WINPR_UTILS_IMAGE_PNG/JPEG/WEBP ON (new libpng-devel BuildRequires), advertise only image formats this build can convert, and add test-coffee-image-support so the package build fails if they ever drop out. - Line-buffer stdout in coffee-rdp-session. WinPR logs INFO to stdout, which is fully buffered under the journal, so the 0.1.4-1 clipboard transfer summaries (and every other INFO line) only appeared when the session exited. WARN/ERROR were unaffected (stderr). * Tue Oct 13 2026 CodeNeedsCoffee - 0.1.4-1 - Fix Windows-to-Linux paste returning stale text: after the server asked for Linux clipboard data, that data lingered in the shared clipboard store and ClipDataCb's "convert from existing data" shortcut could hand it back as if it were the new server clipboard. The shortcut now only runs when the store holds data fetched from the server for the current format list. - Retry a refused (CB_RESPONSE_FAIL) clipboard data request for every mime type, not just files. Text pastes were failing on the first server refusal with no second try. A refusal also suppresses identical requests for one second, so a consumer re-asking for sibling mimes (text/plain, UTF8_STRING, STRING...) doesn't repeat the whole retry sequence per mime on the UI thread. - Stop logging a WinPR "No synthesizer for format CF_RAW" ERROR on every paste; it only meant the local clipboard store was empty. - clearServerFormats() now takes the clipboard and state locks it was previously racing ClipDataCb on. - Log the client name, version and package release as the first line of every session, so a shadowed or stale install is visible in the journal. - Clipboard diagnostics: one INFO line per transfer in both directions ("clipboard server->local / local->server mime=... outcome=... bytes=... attempts=... elapsed=...", WARN when it failed, with a reason such as refused-by-server-gave-up or sdl-clipboard-empty), a summary of every server format-list change, and channel init/ready/close events. Failure paths that used to return silently now say why. Contents are never logged. * Fri Sep 04 2026 CodeNeedsCoffee - 0.1.3-3 - Fix SIGSEGV crash during clipboard file-copy: the 0.1.3-2 CB_RESPONSE_FAIL retry loop could still be sleeping/waiting on a retry when the CLIPRDR channel disconnected (e.g. session teardown or reconnect mid-copy), and the next retry then dereferenced a clipboard channel context already nulled out by teardown. The channel-context field is now cleared under the same lock the retry loop holds around it, requests fail cleanly instead of dereferencing null once the channel is gone, and the between- retry delay now watches the disconnect signal instead of blindly sleeping through it. * Thu Sep 03 2026 CodeNeedsCoffee - 0.1.3-2 - Fix intermittent silent clipboard file-paste failures: retry a bounded few times when a file-clipboard data request comes back CB_RESPONSE_FAIL during a burst of rapid Windows-side ServerFormatList updates, instead of giving up on the first race lost. - Add missing ffmpeg-devel BuildRequires (WITH_FFMPEG/WITH_VIDEO_FFMPEG are forced ON for VAAPI hardware decode support) so Copr builds resolve it; requires RPM Fusion Free enabled as an external repo on affected chroots. * Wed Sep 02 2026 CodeNeedsCoffee - 0.1.3-1 - Add 1Password integration: NLA password autofill via FREERDP_ASKPASS/coffee-rdp-op-askpass, AAD WebView password and MFA/OTP autofill in coffee-rdp-auth, and shared-item username derivation when a profile has no explicit username set. * Mon Aug 31 2026 CodeNeedsCoffee - 0.1.2-1 - Version bump: clipboard image copy/paste fix (local<->remote CF_DIB/DIB format resolution), fix SIGSEGV on disconnect (floatbar TTF_Font teardown ordering), fix floatbar connect-time event handling and reveal-zone width (no longer steals clicks outside its own footprint), add GPU (VAAPI/NVDEC) H.264 decode with a /hw-decode:auto|off runtime toggle. * Mon Aug 31 2026 CodeNeedsCoffee - 0.1.1-5 - Fix the in-session floatbar/dropdown rendering blank on every installed build: SDL_RESOURCE_ROOT was baked in as CMAKE_SOURCE_DIR/resources, an absolute path into the Copr mock chroot's throwaway builddir that no longer exists once the build finishes, so every icon lookup failed at runtime. Now installs resources/ to %{_datadir}/coffeerdp/resources and checks that path first, falling back to the source tree for uninstalled dev builds run in place. * Wed Aug 26 2026 CodeNeedsCoffee - 0.1.1 - Give CoffeeRDP a version bump * Fri Aug 21 2026 CodeNeedsCoffee - 0.1.0-4 - Give coffee-rdp-session a NoDisplay desktop entry matching its Wayland app_id/X11 WM_CLASS (com.codeneedscoffee.coffeerdp.session), reusing the manager's icon. Without it, GNOME had nothing to resolve that id against and showed the raw string with a generic icon in the dock, alt-tab, and window tooltips instead of the CoffeeRDP name and icon. * Fri Aug 21 2026 CodeNeedsCoffee - 0.1.0-3 - Fix the build failing in a clean chroot (Copr build 10889775, all three targets): WinPR's CMake config declares an imported target for the winpr-makecert binary, which lives in the main `freerdp` package rather than freerdp-devel, so configure hard-failed where it had always succeeded on a dev box that happened to have `freerdp` installed. Added the missing BuildRequires. * Fri Aug 21 2026 CodeNeedsCoffee - 0.1.0-2 - Resident coffee-rdp-auth helper (Phase 7.5): coffeerdp now starts and owns a long-lived auth helper on first connect instead of a fresh one per connection, so a reconnect while it's open reuses the same signed-in WebView. Adds an XDG Background portal request on window close so that helper can keep running past the window closing too. New build/runtime dependency: libportal-gtk4(-devel). * Thu Aug 20 2026 CodeNeedsCoffee - 0.1.0-1 - First packaged release: session client, quality presets, idle keep-alive, the in-session floatbar, persistent Entra ID login, and the GTK4 connection manager.