[Spice-devel] [vdagent-windows v1] vdagent-win: check for locked session

Victor Toso victortoso at redhat.com
Fri May 6 11:50:31 UTC 2016


>From WTSRegisterSessionNotification() we are aware of session changes
(WM_WTSSESSION_CHANGE) such as Lock/Unlock events.

We can use that to disable features such as drag-and-drop.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1323628
---
 vdagent/vdagent.cpp | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp
index c976665..a01bc70 100644
--- a/vdagent/vdagent.cpp
+++ b/vdagent/vdagent.cpp
@@ -146,6 +146,7 @@ private:
     uint32_t _in_msg_pos;
     bool _pending_input;
     bool _running;
+    bool _session_is_locked;
     bool _desktop_switch;
     DesktopLayout* _desktop_layout;
     bool _updating_display_config;
@@ -205,6 +206,7 @@ VDAgent::VDAgent()
     , _in_msg_pos (0)
     , _pending_input (false)
     , _running (false)
+    , _session_is_locked (false)
     , _desktop_switch (false)
     , _desktop_layout (NULL)
     , _display_setting (VD_AGENT_REGISTRY_KEY)
@@ -1282,7 +1284,19 @@ void VDAgent::dispatch_message(VDAgentMessage* msg, uint32_t port)
     case VD_AGENT_ANNOUNCE_CAPABILITIES:
         res = handle_announce_capabilities((VDAgentAnnounceCapabilities*)msg->data, msg->size);
         break;
-    case VD_AGENT_FILE_XFER_START:
+    case VD_AGENT_FILE_XFER_START: {
+        VDAgentFileXferStatusMessage status;
+        if (_session_is_locked) {
+            VDAgentFileXferStartMessage *s = (VDAgentFileXferStartMessage *)msg->data;
+            status.id = s->id;
+            status.result = VD_AGENT_FILE_XFER_STATUS_ERROR;
+            vd_printf("Fail to start file-xfer %u due: Locked session", status.id);
+            write_message(VD_AGENT_FILE_XFER_STATUS, sizeof(status), &status);
+        } else if (_file_xfer.dispatch(msg, &status)) {
+            write_message(VD_AGENT_FILE_XFER_STATUS, sizeof(status), &status);
+        }
+        break;
+    }
     case VD_AGENT_FILE_XFER_STATUS:
     case VD_AGENT_FILE_XFER_DATA: {
         VDAgentFileXferStatusMessage status;
@@ -1489,6 +1503,10 @@ LRESULT CALLBACK VDAgent::wnd_proc(HWND hwnd, UINT message, WPARAM wparam, LPARA
     case WM_WTSSESSION_CHANGE:
         if (wparam == WTS_SESSION_LOGON) {
             a->set_control_event(CONTROL_LOGON);
+        } else if (wparam == WTS_SESSION_LOCK) {
+            a->_session_is_locked = true;
+        } else if (wparam == WTS_SESSION_UNLOCK) {
+            a->_session_is_locked = false;
         }
         break;
     default:
-- 
2.5.5



More information about the Spice-devel mailing list