vdi-cloud/terminal/moonlight/patches/0004-vdi-power-key-policy.patch

65 lines
2.3 KiB
Diff

diff --git a/app/streaming/input/keyboard.cpp b/app/streaming/input/keyboard.cpp
index 29e218d..2b3911d 100644
--- a/app/streaming/input/keyboard.cpp
+++ b/app/streaming/input/keyboard.cpp
@@ -182,6 +182,43 @@ void SdlInputHandler::performSpecialKeyCombo(KeyCombo combo)
}
}
+namespace {
+
+// The terminal is a kiosk. These keys can stop, restart, lock, or expose the
+// guest session, so they must never be forwarded to any cloud desktop. The
+// modifier tests intentionally apply to both key-down and key-up events so a
+// blocked shortcut cannot leave a partial action in the guest.
+static bool isBlockedPowerKeyEvent(const SDL_KeyboardEvent* event)
+{
+ const SDL_Keymod modifiers = static_cast<SDL_Keymod>(event->keysym.mod);
+ const bool ctrlAlt = (modifiers & KMOD_CTRL) && (modifiers & KMOD_ALT);
+ const bool alt = (modifiers & KMOD_ALT) != 0;
+ const bool gui = (modifiers & KMOD_GUI) != 0;
+
+ switch (event->keysym.scancode) {
+ case SDL_SCANCODE_SLEEP:
+ // SDL2 maps the physical power/sleep button to this consumer code.
+ return true;
+ case SDL_SCANCODE_DELETE:
+ // Windows secure attention and systemd's Ctrl+Alt+Del action.
+ return ctrlAlt;
+ case SDL_SCANCODE_F4:
+ // On a desktop, Alt+F4 opens the shutdown dialog; it is also a
+ // common way to close the only shell/application in a kiosk image.
+ return alt;
+ case SDL_SCANCODE_L:
+ // Locking the guest breaks the kiosk session and can strand the user.
+ return gui;
+ case SDL_SCANCODE_X:
+ // Windows quick-link menu contains shutdown/restart actions.
+ return gui;
+ default:
+ return false;
+ }
+}
+
+} // namespace
+
void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
{
short keyCode;
@@ -189,6 +226,15 @@ void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
char flags;
bool shouldNotConvertToScanCodeOnServer = false;
+ if (isBlockedPowerKeyEvent(event)) {
+ if (event->state == SDL_PRESSED) {
+ SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
+ "Blocked guest power/session shortcut (scancode=%d)",
+ event->keysym.scancode);
+ }
+ return;
+ }
+
if (event->repeat) {
// Ignore repeat key down events
SDL_assert(event->state == SDL_PRESSED);