Feature: Exclude human Web viewing from MCP remote control sessions
Complete the bidirectional mutual exclusion between MCP remote control and human Web viewing (§8.2). Direction 1 (remote_open rejected while a human session holds the screen sub-connection) already existed; this adds direction 2: a human Web viewer is now rejected while an MCP session owns the device. Add a m_McpTriggeredDevices marker (mirroring m_MfcTriggeredDevices) that is set when an MCP session is created (BeginScreenCtrlOpen) and cleared at every session-erasure site (CloseScreenCtrlSession, SweepIdleScreenCtrl, OnScreenControlClosed, EndScreenCtrlAction), so the marker cannot go stale and permanently block humans. HandleConnect checks IsMcpTriggered before mutating client state or starting the remote desktop. Co-Authored-By: deepseek-v4-pro
This commit was merged in pull request #4.
This commit is contained in:
@@ -643,6 +643,15 @@ void CWebService::HandleConnect(void* ws_ptr, const std::string& token, uint64_t
|
||||
}
|
||||
}
|
||||
|
||||
// Bidirectional mutex (direction 2, §8.2): reject human Web viewing while an MCP
|
||||
// remote control session owns this host's screen sub-connection (SetMcpTriggered on
|
||||
// remote_open, cleared on session teardown), so AI input cannot be injected into a
|
||||
// picture a human is watching/controlling.
|
||||
if (IsMcpTriggered(device_id)) {
|
||||
SendText(ws_ptr, BuildJsonResponse("connect_result", false, "Device busy: remote control session active"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Check max clients per device
|
||||
int current_count = GetWebClientCount(device_id);
|
||||
if (current_count >= m_nMaxClientsPerDevice) {
|
||||
@@ -2150,6 +2159,21 @@ void CWebService::ClearMfcTriggered(uint64_t device_id) {
|
||||
m_MfcTriggeredDevices.erase(device_id);
|
||||
}
|
||||
|
||||
void CWebService::SetMcpTriggered(uint64_t device_id) {
|
||||
std::lock_guard<std::mutex> lock(m_McpTriggeredMutex);
|
||||
m_McpTriggeredDevices.insert(device_id);
|
||||
}
|
||||
|
||||
bool CWebService::IsMcpTriggered(uint64_t device_id) {
|
||||
std::lock_guard<std::mutex> lock(m_McpTriggeredMutex);
|
||||
return m_McpTriggeredDevices.find(device_id) != m_McpTriggeredDevices.end();
|
||||
}
|
||||
|
||||
void CWebService::ClearMcpTriggered(uint64_t device_id) {
|
||||
std::lock_guard<std::mutex> lock(m_McpTriggeredMutex);
|
||||
m_McpTriggeredDevices.erase(device_id);
|
||||
}
|
||||
|
||||
bool CWebService::HasActiveSession(uint64_t device_id) {
|
||||
std::lock_guard<std::mutex> lock(m_ScreenContextsMutex);
|
||||
return m_ScreenContexts.find(device_id) != m_ScreenContexts.end();
|
||||
|
||||
Reference in New Issue
Block a user