|
2 | 2 |
|
3 | 3 | This document provides a list of notable changes introduced in Devolutions Gateway service, installer and Jetsocat. |
4 | 4 |
|
| 5 | +## 2026.1.1 (2026-04-01) |
| 6 | + |
| 7 | +### Features |
| 8 | + |
| 9 | +- _installer_: warn on, instead of hiding, unvalidated certificates ([#1697](https://github.com/Devolutions/devolutions-gateway/issues/1697)) ([40a4247279](https://github.com/Devolutions/devolutions-gateway/commit/40a424727916c0a27fef6fd6bb3bb1f8e2d0c8f0)) ([DGW-356](https://devolutions.atlassian.net/browse/DGW-356)) |
| 10 | + |
| 11 | + When searching for a certificate in the system store we call |
| 12 | + `X509Certificate2Collection.Find` with the `validOnly` parameter set to |
| 13 | + `true`. |
| 14 | + |
| 15 | + > validOnly |
| 16 | + Boolean |
| 17 | + true to allow only valid certificates to be returned from the search; |
| 18 | + otherwise, false. |
| 19 | + |
| 20 | + The performs basic validation, and only returns valid certificates. |
| 21 | + |
| 22 | + However, the result is confusing for users as they don't realize that |
| 23 | + the certificate they are searching for is invalid, they think that the |
| 24 | + search isn't working. |
| 25 | + |
| 26 | + Instead, we now return _all_ certificates but if the certificate is |
| 27 | + determined to be invalid, we flag it in the UI with a warning icon and a |
| 28 | + text explanation. |
| 29 | + |
| 30 | +- _installer_: add a German localization ([cb63344500](https://github.com/Devolutions/devolutions-gateway/commit/cb63344500ef0deed595c4f77a7229a5d3da52a7)) ([DGW-357](https://devolutions.atlassian.net/browse/DGW-357)) |
| 31 | + |
| 32 | +- _jetsocat_: add warning field to doctor diagnostic output ([1f8e7a0441](https://github.com/Devolutions/devolutions-gateway/commit/1f8e7a0441880cdfd18715bc3af4761c0ab0a055)) |
| 33 | + |
| 34 | + Adds support for surfacing warnings in the doctor tool's diagnostic |
| 35 | + output, allowing external tools to distinguish between complete success, |
| 36 | + success with warnings, and failure. |
| 37 | + |
| 38 | + The diagnostic JSON output now includes an optional "warning" field, and |
| 39 | + the human-readable output displays a warning emoji (⚠️) instead of a |
| 40 | + success checkmark (✅) when warnings are present. |
| 41 | + |
| 42 | + This enables better integration with external monitoring and diagnostic |
| 43 | + tools that need to detect and report warning conditions even when the |
| 44 | + overall diagnostic succeeds. |
| 45 | + |
| 46 | +- _jetsocat_: add SAN and EKU diagnostics to doctor module ([251795b0f5](https://github.com/Devolutions/devolutions-gateway/commit/251795b0f51c09cdedcfb351e0fb9f3c0d882bde)) ([DGW-350](https://devolutions.atlassian.net/browse/DGW-350)) |
| 47 | + |
| 48 | + Add certificate extension checks mirroring the gateway's TlsVerifyStrict |
| 49 | + validation. Each TLS backend (rustls, openssl, schannel) now runs two new |
| 50 | + diagnostics on the end-entity certificate: |
| 51 | + |
| 52 | + - check_san_extension: verifies the Subject Alternative Name extension is present |
| 53 | + - check_server_auth_eku: verifies the Extended Key Usage includes serverAuth |
| 54 | + |
| 55 | +- _dgw_: add periodic keyframe forcing for improved seekability ([#1705](https://github.com/Devolutions/devolutions-gateway/issues/1705)) ([9619444aea](https://github.com/Devolutions/devolutions-gateway/commit/9619444aea53cbc9a94c9e712d2fdc581806aef6)) ([DGW-358](https://devolutions.atlassian.net/browse/DGW-358)) |
| 56 | + |
| 57 | +- _jetsocat_: detect missing intermediate certificate in doctor ([#1727](https://github.com/Devolutions/devolutions-gateway/issues/1727)) ([ea52ff75ca](https://github.com/Devolutions/devolutions-gateway/commit/ea52ff75ca950e9e8ba8f1e5123a3e05e229dec9)) ([DGW-349](https://devolutions.atlassian.net/browse/DGW-349)) |
| 58 | + |
| 59 | + When a TLS server presents only the leaf certificate (or leaf + root CA |
| 60 | + but no intermediate), clients fail with an opaque "unknown issuer" error |
| 61 | + that is hard to diagnose. |
| 62 | + |
| 63 | + The doctor command now performs a structural analysis of the presented |
| 64 | + chain before invoking the trust engine: |
| 65 | + |
| 66 | + - If the chain contains only a leaf and no certificate whose Subject |
| 67 | + matches the leaf's Issuer, a warning "an intermediate certificate is |
| 68 | + likely missing" is attached to the read-chain diagnostic. |
| 69 | + - On chain verification failure (UnknownIssuer / |
| 70 | + CERT_TRUST_IS_PARTIAL_CHAIN / CERT_TRUST_IS_UNTRUSTED_ROOT), actionable |
| 71 | + help "intermediate certificate is likely missing" is shown instead of |
| 72 | + the generic "unknown issuer" message. |
| 73 | + - Omitting the root CA (the normal server configuration) does not |
| 74 | + trigger the warning. |
| 75 | + - Self-signed (root-only) certificates are also not flagged. |
| 76 | + |
| 77 | +- _dgw_: encrypt in-memory credentials at rest with ChaCha20-Poly1305 ([#1689](https://github.com/Devolutions/devolutions-gateway/issues/1689)) ([86775146ed](https://github.com/Devolutions/devolutions-gateway/commit/86775146edd59e0cfae4a017520beb757a6f2b04)) ([DGW-326](https://devolutions.atlassian.net/browse/DGW-326)) |
| 78 | + |
| 79 | + Add ChaCha20-Poly1305 encryption for credentials stored in the |
| 80 | + credential store. Passwords are encrypted at rest with a randomly generated 256-bit |
| 81 | + master key held in a protected page. |
| 82 | + |
| 83 | + The page protection hardening is performed using the best available OS |
| 84 | + hardening in a best-effort basis: |
| 85 | + |
| 86 | + - Windows: VirtualLock, guard pages (PAGE_NOACCESS), PAGE_READONLY after |
| 87 | + write, WerRegisterExcludedMemoryBlock for WER crash report exclusion. |
| 88 | + - Linux: mlock, guard pages (PROT_NONE), PROT_READ after write, |
| 89 | + madvise(MADV_DONTDUMP) for core dump exclusion. |
| 90 | + - All: zeroize-before-free on drop; plain heap fallback with |
| 91 | + zeroize-on-drop on unsupported platforms. |
| 92 | + |
| 93 | + In concrete terms: this protects users from leaking important secrets in |
| 94 | + the event of a memory dump captured for debugging purposes. |
| 95 | + |
| 96 | +### Bug Fixes |
| 97 | + |
| 98 | +- _dgw_: fix adaptive frame skipping during EOF waits in session shadowing ([#1678](https://github.com/Devolutions/devolutions-gateway/issues/1678)) ([a1566fd0f9](https://github.com/Devolutions/devolutions-gateway/commit/a1566fd0f94394c992818a0c7ab08a0989ce2f4f)) ([DGW-341](https://devolutions.atlassian.net/browse/DGW-341)) |
| 99 | + |
| 100 | + Fixes video playback freezing permanently during live session shadowing. |
| 101 | + After brief pauses in the recording stream (e.g., during network hiccups |
| 102 | + or slow file writes), the shadow player would stop rendering new frames |
| 103 | + entirely, requiring a session restart. |
| 104 | + |
| 105 | + With this fix, shadow sessions now recover gracefully from temporary |
| 106 | + recording pauses, maintaining smooth video playback throughout the |
| 107 | + session. |
| 108 | + |
| 109 | +- _installer_: prevent issues with deferred properties containing semi-colons ([e031fa32b1](https://github.com/Devolutions/devolutions-gateway/commit/e031fa32b1d094ac26556d867a31d1fd901f316a)) ([DGW-359](https://devolutions.atlassian.net/browse/DGW-359)) |
| 110 | + |
| 111 | +- _dgw_: add codec-aware VP9 keyframe detection ([#1702](https://github.com/Devolutions/devolutions-gateway/issues/1702)) ([737b750425](https://github.com/Devolutions/devolutions-gateway/commit/737b7504253c395dd540cc987eda432de8d35792)) |
| 112 | + |
| 113 | + Add VP9 keyframe detection alongside existing VP8 support, based on |
| 114 | + the VP9 bitstream specification (profiles 0-3). Thread the `VpxCodec` |
| 115 | + type through the iterator and block tag layers so keyframe checks use |
| 116 | + the correct codec-specific logic. Set `VpxEncoderPreset::BestPerformance` |
| 117 | + on the re-encoding encoder for improved throughput during session shadowing. |
| 118 | + |
| 119 | +- _dgw_: improve unified shutdown correctness ([#1703](https://github.com/Devolutions/devolutions-gateway/issues/1703)) ([9e417f9006](https://github.com/Devolutions/devolutions-gateway/commit/9e417f9006cfb1cd986eb9f4d8baa873adac539c)) |
| 120 | + |
| 121 | + Replace scattered shutdown mechanisms with a single `tokio::sync::watch` |
| 122 | + channel as the source of truth. Handle task now signals `ClientDisconnected` |
| 123 | + on client disconnect and uses `select!` on `ws_frame.next()` for shutdown |
| 124 | + awareness. Bridge task is aborted on `webm_stream` exit to prevent |
| 125 | + `control_task` from hanging indefinitely. |
| 126 | + |
| 127 | +- _dgw_: update cadeau native library to v2026.3.13.0 ([#1708](https://github.com/Devolutions/devolutions-gateway/issues/1708)) ([836bbedbf8](https://github.com/Devolutions/devolutions-gateway/commit/836bbedbf8e31a308055a5c53430ee1d98ed7fcf)) ([DVLS-14057](https://devolutions.atlassian.net/browse/DVLS-14057)) ([DGW-363](https://devolutions.atlassian.net/browse/DGW-363)) |
| 128 | + |
| 129 | +- _dgw_: fix service subcommand parsing ([#1710](https://github.com/Devolutions/devolutions-gateway/issues/1710)) ([aa8805aa87](https://github.com/Devolutions/devolutions-gateway/commit/aa8805aa87f7dee287d21b76ce09f98266cdfcd6)) ([DGW-360](https://devolutions.atlassian.net/browse/DGW-360)) |
| 130 | + |
| 131 | +- _dgw_: fix minimum glibc version in deb manifest ([#1716](https://github.com/Devolutions/devolutions-gateway/issues/1716)) ([674818a4d0](https://github.com/Devolutions/devolutions-gateway/commit/674818a4d01c09cb3d77c13d5aca48d253886d73)) ([DGW-361](https://devolutions.atlassian.net/browse/DGW-361)) |
| 132 | + |
| 133 | + We cross-compile against an ubuntu-18.04 sysroot (via cbake), which |
| 134 | + ships glibc 2.27, not 2.31. |
| 135 | + |
| 136 | +- _dgw_: fix RPM webapp directories installed under wrong names ([#1717](https://github.com/Devolutions/devolutions-gateway/issues/1717)) ([1cbb8b9f59](https://github.com/Devolutions/devolutions-gateway/commit/1cbb8b9f59e2a4ef883de35952d7f3adf3c8b22a)) ([DGW-362](https://devolutions.atlassian.net/browse/DGW-362)) |
| 137 | + |
| 138 | + fpm installs a source directory *by name* inside the destination when |
| 139 | + given a bare directory path. Specifying explicit target paths ensures |
| 140 | + webapp/client and webapp/player are consistent with the DEB package. |
| 141 | + |
| 142 | +- _jetsocat_: fix schannel doctor backend ([de4747c937](https://github.com/Devolutions/devolutions-gateway/commit/de4747c937831540a4b61eda56fd7e904e205a8c)) |
| 143 | + |
| 144 | + Set end_entity_info in schannel_read_chain for the leaf certificate, so |
| 145 | + that cert checks work when loading a chain from a PEM file. |
| 146 | + |
| 147 | +- _dgw_: fix RPM webapp directories installed under wrong names ([#1722](https://github.com/Devolutions/devolutions-gateway/issues/1722)) ([5668b18384](https://github.com/Devolutions/devolutions-gateway/commit/5668b18384a84696db7bca0e574ee41ff5051427)) ([DGW-362](https://devolutions.atlassian.net/browse/DGW-362)) |
| 148 | + |
| 149 | + fpm installs a source directory *by name* inside the destination when |
| 150 | + given a bare directory path. This is identical to #1717 but targets the |
| 151 | + currently active code path found in tlk.ps1. |
| 152 | + |
| 153 | +- _dgw_: reduce log noise for missing recording storage disk ([#1728](https://github.com/Devolutions/devolutions-gateway/issues/1728)) ([cceb72b21f](https://github.com/Devolutions/devolutions-gateway/commit/cceb72b21fb9086a93509719bee3f605c9a63333)) ([DGW-353](https://devolutions.atlassian.net/browse/DGW-353)) |
| 154 | + |
| 155 | + When the recording storage disk cannot be found during a heartbeat or |
| 156 | + preflight check, only the first occurrence is now logged at WARN. |
| 157 | + Subsequent repeated occurrences are downgraded to DEBUG until the disk |
| 158 | + becomes available again, at which point the condition can surface at |
| 159 | + WARN once more. The recording path is included in the log event for |
| 160 | + context. |
| 161 | + |
| 162 | +- _dgw_: support network drives and UNC paths for recording storage space on Windows ([#1729](https://github.com/Devolutions/devolutions-gateway/issues/1729)) ([f2da923b1e](https://github.com/Devolutions/devolutions-gateway/commit/f2da923b1ef4c4cf627b1f562d924f7d9a254218)) ([DGW-354](https://devolutions.atlassian.net/browse/DGW-354)) |
| 163 | + |
| 164 | +- _dgw_: use statvfs for recording storage space on Unix ([#1730](https://github.com/Devolutions/devolutions-gateway/issues/1730)) ([b5de812542](https://github.com/Devolutions/devolutions-gateway/commit/b5de812542a8ccc4c5d000fe886edf15f9e12664)) ([DGW-355](https://devolutions.atlassian.net/browse/DGW-355)) |
| 165 | + |
| 166 | + Replaces the sysinfo disk-enumeration approach on Linux/macOS with a |
| 167 | + direct statvfs(2) call against the configured recording path. This fixes |
| 168 | + incorrect or missing space values for network filesystems (NFS, |
| 169 | + CIFS/Samba) and any mount point the previous heuristic could not |
| 170 | + resolve. |
| 171 | + |
| 172 | +### Build |
| 173 | + |
| 174 | +- _jetsocat_: enable detect-proxy for Windows jetsocat builds ([#1721](https://github.com/Devolutions/devolutions-gateway/issues/1721)) ([d51d0c4cec](https://github.com/Devolutions/devolutions-gateway/commit/d51d0c4cecafc90bef91763a00c094e59d2f3d5a)) |
| 175 | + |
5 | 176 | ## 2026.1.0 (2026-02-23) |
6 | 177 |
|
7 | 178 | ### Features |
|
0 commit comments