Expose the online-list TLS column through list_online_hosts, search_hosts and get_host_detail. The value comes from the flag the client reports at login, so old clients always read false. Add list_network_connections and kill_network_connection on top of the connection manager sub-connection protocol. The kill path matches the original 110-byte record instead of rebuilding addresses, supports a dry run, refuses UDP/IPv6 targets, and verifies that the quadruple really disappeared instead of assuming success. Add a host_* family backed by the machine manager protocol: ten read tools covering every tab of the host management dialog, and four recoverable write tools for process freeze/thaw, window restore/hide/ maximize/minimize, service start/stop/pause/continue/restart, and scheduled task run/stop. Every write re-reads the snapshot before sending and re-checks afterwards, reporting -32009 for stale targets rather than acting blindly. The family is gated by McpMachine, the risky subset by McpMachineDangerous, and writes additionally require read-only mode to be off. Route managed sub-connections from MessageHandle and OfflineProc, keep the single-in-flight rule by sharing the pending table with a request kind, and move the shared JSON/lock/encoding helpers into McpInternal so both tool families use one implementation. Settings dialog, design docs and en_US/zh_TW/de_DE translations are updated accordingly. Co-Authored-By: deepseek-flash
60 lines
2.4 KiB
C++
60 lines
2.4 KiB
C++
#pragma once
|
||
|
||
// MCP 工具实现共享的内部辅助函数。
|
||
//
|
||
// 这些函数原先都定义在 McpServer.cpp 的匿名命名空间里;主机管理 / 连接管理
|
||
// 工具族(McpMachine.cpp)需要复用同一套 JSON、host id 解析与编码转换逻辑,
|
||
// 故抽出到独立编译单元,由 McpServer.cpp 与 McpMachine.cpp 共同引用。
|
||
//
|
||
// 约定:函数语义与实现与抽取前完全一致(McpServer.cpp 通过 using-directive
|
||
// 引入,调用点不变),不做行为改动。
|
||
|
||
#include <Windows.h>
|
||
#include "jsoncpp/json.h"
|
||
|
||
#include <string>
|
||
#include <cstdint>
|
||
|
||
class CMy2015RemoteDlg;
|
||
class context;
|
||
|
||
namespace McpInternal {
|
||
|
||
// Json::Value → 紧凑 JSON 字符串
|
||
std::string JsonToString(const Json::Value& v);
|
||
|
||
// JSON-RPC 2.0 成功 / 错误响应
|
||
std::string BuildResult(const Json::Value& id, const Json::Value& result);
|
||
std::string BuildError(const Json::Value& id, int code, const std::string& msg);
|
||
|
||
// 仅 ASCII 小写化;不区分大小写的子串匹配
|
||
std::string ToLowerAscii(const std::string& s);
|
||
bool ContainsCI(const std::string& haystack, const std::string& needle);
|
||
|
||
// 入参读取
|
||
std::string JsonStrField(const Json::Value& v, const char* key);
|
||
bool IsDigits(const std::string& s);
|
||
std::string GetStringArg(const Json::Value& args, const char* key);
|
||
bool GetIntArg(const Json::Value& args, const char* key, int& out);
|
||
bool ReadUInt64(const Json::Value& v, uint64_t& out);
|
||
bool ReadUInt64Arg(const Json::Value& args, const char* key, uint64_t& out);
|
||
|
||
// 解析 id 入参(必填、纯数字)为 uint64;非法返回 false 并写 err。
|
||
bool ParseHostIdArg(const Json::Value& args, uint64_t& out, std::string& err);
|
||
|
||
// 在 m_HostList 中按 clientID 找在线主 context(锁内遍历 m_cs)。
|
||
context* FindMainContext(CMy2015RemoteDlg* parent, uint64_t id);
|
||
|
||
// 有界 strlen:p 最多可读 avail 字节,返回 n < avail 表示遇到 '\0'。
|
||
size_t BoundedStrlen(const char* p, size_t avail);
|
||
|
||
// 编码转换:任意代码页 → UTF-8(输出 JSON 用);UTF-8 → 目标代码页(下发客户端用)。
|
||
std::string ToUtf8(const char* s, UINT cp);
|
||
std::string ToAnsi(const std::string& utf8, UINT cp);
|
||
|
||
// 写操作审计:PostMessageA(WM_SHOWERRORMSG) 落到服务端消息/审计日志(不可关闭)。
|
||
void AuditManageAction(CMy2015RemoteDlg* parent, uint64_t devId,
|
||
const std::string& tool, const std::string& detail);
|
||
|
||
} // namespace McpInternal
|