From d7b49a3d06cfa243a5a60b112da98d730182cd8b Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Fri, 16 Oct 2026 13:16:33 +0200 Subject: [PATCH] Feat: Add whitelist action to log-list right-click menu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a "白å��å�•" item after "解除å°�ç¦�" in the message-log context menu. It extracts the IP from each selected log entry, asks for confirmation, then adds it to the shared IPWhitelist singleton — which IOCPServer and the DLL rate limiter already consult live — so the entry takes effect on new connections immediately, without a restart. The whitelist is persisted to settings\IPWhitelist the same way the Network dialog does. - An IP already in the whitelist is reported as such and skipped. - An IP in the IP blacklist (banned) is reported as banned and skipped, rather than silently removed from the blacklist. - Menu item, confirmation, and result strings are added to the en_US/zh_TW/de_DE language files. Co-Authored-By: deepseek-v4-pro --- server/2015Remote/2015RemoteDlg.cpp | 81 ++++++++++++++++++++++++++++- server/2015Remote/2015RemoteDlg.h | 1 + server/2015Remote/lang/de_DE.ini | 5 ++ server/2015Remote/lang/en_US.ini | 5 ++ server/2015Remote/lang/zh_TW.ini | 5 ++ server/2015Remote/resource.h | 3 +- 6 files changed, 98 insertions(+), 2 deletions(-) diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 5da7d5c..eefe2e6 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -1036,6 +1036,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(ID_MSGLOG_LOGIN_NOTIFY, &CMy2015RemoteDlg::OnMsglogLoginNotify) ON_COMMAND(ID_MSGLOG_BAN_IP, &CMy2015RemoteDlg::OnMsglogBanIP) ON_COMMAND(ID_MSGLOG_UNBAN_IP, &CMy2015RemoteDlg::OnMsglogUnbanIP) + ON_COMMAND(ID_MSGLOG_WHITELIST_IP, &CMy2015RemoteDlg::OnMsglogWhitelistIP) ON_COMMAND(ID_ONLINE_ADD_WATCH, &CMy2015RemoteDlg::OnOnlineAddWatch) ON_COMMAND(ID_ONLINE_LOGIN_NOTIFY, &CMy2015RemoteDlg::OnOnlineLoginNotify) ON_NOTIFY(NM_CUSTOMDRAW, IDC_ONLINE, &CMy2015RemoteDlg::OnNMCustomdrawOnline) @@ -10236,14 +10237,16 @@ void CMy2015RemoteDlg::OnRClickMessage(NMHDR* pNMHDR, LRESULT* pResult) menu.AppendMenu(MF_STRING, ID_MSGLOG_LOGIN_NOTIFY, _TR("上线æ��醒")); menu.AppendMenu(MF_STRING, ID_MSGLOG_BAN_IP, _TR("å°�ç¦�IP")); menu.AppendMenu(MF_STRING, ID_MSGLOG_UNBAN_IP, _TR("解除å°�ç¦�")); + menu.AppendMenu(MF_STRING, ID_MSGLOG_WHITELIST_IP, _TR("白å��å�•")); - // 没有选中项时ç¦�用"删除选中"ã€�"å¤�制选中"ã€�"上线æ��醒"ã€�"å°�ç¦�IP"å’Œ"解除å°�ç¦�" + // 没有选中项时ç¦�用"删除选中"ã€�"å¤�制选中"ã€�"上线æ��醒"ã€�"å°�ç¦�IP"ã€�"解除å°�ç¦�"å’Œ"白å��å�•" if (m_CList_Message.GetSelectedCount() == 0) { menu.EnableMenuItem(ID_MSGLOG_DELETE, MF_GRAYED); menu.EnableMenuItem(ID_MSGLOG_COPY, MF_GRAYED); menu.EnableMenuItem(ID_MSGLOG_LOGIN_NOTIFY, MF_GRAYED); menu.EnableMenuItem(ID_MSGLOG_BAN_IP, MF_GRAYED); menu.EnableMenuItem(ID_MSGLOG_UNBAN_IP, MF_GRAYED); + menu.EnableMenuItem(ID_MSGLOG_WHITELIST_IP, MF_GRAYED); } // PowerShellä¸�å�¯ç”¨æ—¶ç¦�用"上线æ��醒" if (!GetNotifyManager().IsPowerShellAvailable()) { @@ -10630,6 +10633,82 @@ void CMy2015RemoteDlg::OnMsglogUnbanIP() MessageBoxL(details, _TR("解除å°�ç¦�"), MB_ICONINFORMATION); } +void CMy2015RemoteDlg::OnMsglogWhitelistIP() +{ + // Get selected log messages and extract IP addresses from them + std::vector ipsToAdd; + + POSITION pos = m_CList_Message.GetFirstSelectedItemPosition(); + while (pos) { + int row = m_CList_Message.GetNextSelectedItem(pos); + // Column 2 is the message content ("ä¿¡æ�¯å†…容") + CString msgText = m_CList_Message.GetItemText(row, 2); + + CString extractedIP; + if (ExtractFirstIPFromMessage(msgText, extractedIP)) { + std::string ipUtf8 = CT2A(extractedIP, CP_UTF8); + ipsToAdd.push_back(ipUtf8); + } + } + + if (ipsToAdd.empty()) { + MessageBoxL(_TR("所选日志消æ�¯ä¸­æœªæ£€æµ‹åˆ°æœ‰æ•ˆçš„ IP 地å�€"), _TR("æ��示"), MB_ICONINFORMATION); + return; + } + + // 二次确认 + if (IDYES != MessageBoxL(_TR("确定将选中日志中的 IP 加入白å��å�•å�—?"), _TR("æ��示"), MB_ICONQUESTION | MB_YESNO)) { + return; + } + + // Process each extracted IP + int addedCount = 0; + int alreadyCount = 0; + int bannedCount = 0; + + for (const auto& ip : ipsToAdd) { + // Already whitelisted + if (IPWhitelist::getInstance().IsWhitelisted(ip)) { + alreadyCount++; + continue; + } + // Banned IPs cannot be whitelisted + if (IPBlacklist::getInstance().IsBlacklisted(ip)) { + bannedCount++; + continue; + } + + IPWhitelist::getInstance().AddIP(ip); + addedCount++; + } + + // Persist to config + if (addedCount > 0) { + std::string whitelistStr = IPWhitelist::getInstance().Export(); + THIS_CFG.SetStr("settings", "IPWhitelist", whitelistStr.c_str()); + } + + // Build result message + CString details; + if (addedCount > 0) { + details.AppendFormat(_TR("已将 %d 个 IP 加入白å��å�•"), addedCount); + } + if (alreadyCount > 0) { + if (!details.IsEmpty()) details += _T("\n"); + details.AppendFormat(_TR("%d 个 IP 已在白å��å�•中"), alreadyCount); + } + if (bannedCount > 0) { + if (!details.IsEmpty()) details += _T("\n"); + details.AppendFormat(_TR("%d 个 IP å·²å°�ç¦�,无法加入白å��å�•"), bannedCount); + } + + if (details.IsEmpty()) { + details = _TR("未执行任何æ“�作"); + } + + MessageBoxL(details, _TR("白å��å�•"), MB_ICONINFORMATION); +} + void CMy2015RemoteDlg::OnOnlineAddWatch() { EnterCriticalSection(&m_cs); diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 2972cb6..9a3997e 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -630,6 +630,7 @@ public: afx_msg void OnMsglogLoginNotify(); afx_msg void OnMsglogBanIP(); afx_msg void OnMsglogUnbanIP(); + afx_msg void OnMsglogWhitelistIP(); afx_msg void OnOnlineAddWatch(); afx_msg void OnNMCustomdrawOnline(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnOnlineRunAsAdmin(); diff --git a/server/2015Remote/lang/de_DE.ini b/server/2015Remote/lang/de_DE.ini index b036bf5..9503804 100644 --- a/server/2015Remote/lang/de_DE.ini +++ b/server/2015Remote/lang/de_DE.ini @@ -2087,3 +2087,8 @@ TLS È·¶¨È¡ÏûÑ¡ÖÐÖ÷»úµÄ TLS ´«ÊäÂ𣿣¨¿Í»§¶ËÏÂ´ÎÆô¶¯ÉúЧ£©=TLS-Transport fuer die ausgewaehlten Hosts deaktivieren? (wirkt nach Client-Neustart) ·þÎñ¶ËδÆôÓà TLS Ö¤Ê飬ÎÞ·¨Çл»¿Í»§¶Ë TLS ´«Êä=Server-TLS-Zertifikat ist nicht aktiviert; TLS-Transport der Clients kann nicht umgeschaltet werden ¶ÁÈ¡·þÎñ¶Ë TLS Ö¤Êéʧ°Ü£¬ÎÞ·¨Ï·¢=Server-TLS-Zertifikat konnte nicht gelesen werden; Verteilung nicht moeglich +°×Ãûµ¥=Whitelist +È·¶¨½«Ñ¡ÖÐÈÕÖ¾ÖÐµÄ IP ¼ÓÈë°×Ãûµ¥Âð£¿=IP aus den ausgewaehlten Log-Eintraegen zur Whitelist hinzufuegen? +Òѽ« %d ¸ö IP ¼ÓÈë°×Ãûµ¥=%d IP(s) zur Whitelist hinzugefuegt +%d ¸ö IP ÒÑÔÚ°×Ãûµ¥ÖÐ=%d IP(s) bereits in der Whitelist +%d ¸ö IP ÒÑ·â½û£¬ÎÞ·¨¼ÓÈë°×Ãûµ¥=%d IP(s) sind gesperrt und koennen nicht zur Whitelist hinzugefuegt werden diff --git a/server/2015Remote/lang/en_US.ini b/server/2015Remote/lang/en_US.ini index c4f6f96..7fcb9a5 100644 --- a/server/2015Remote/lang/en_US.ini +++ b/server/2015Remote/lang/en_US.ini @@ -2102,3 +2102,8 @@ TLS È·¶¨È¡ÏûÑ¡ÖÐÖ÷»úµÄ TLS ´«ÊäÂ𣿣¨¿Í»§¶ËÏÂ´ÎÆô¶¯ÉúЧ£©=Disable TLS transport for the selected host? (takes effect after the client restarts) ·þÎñ¶ËδÆôÓà TLS Ö¤Ê飬ÎÞ·¨Çл»¿Í»§¶Ë TLS ´«Êä=Server TLS certificate is not enabled; cannot toggle client TLS transport ¶ÁÈ¡·þÎñ¶Ë TLS Ö¤Êéʧ°Ü£¬ÎÞ·¨Ï·¢=Failed to read the server TLS certificate; cannot distribute +°×Ãûµ¥=Whitelist +È·¶¨½«Ñ¡ÖÐÈÕÖ¾ÖÐµÄ IP ¼ÓÈë°×Ãûµ¥Âð£¿=Add the IP from the selected log entries to the whitelist? +Òѽ« %d ¸ö IP ¼ÓÈë°×Ãûµ¥=Added %d IP(s) to the whitelist +%d ¸ö IP ÒÑÔÚ°×Ãûµ¥ÖÐ=%d IP(s) already in the whitelist +%d ¸ö IP ÒÑ·â½û£¬ÎÞ·¨¼ÓÈë°×Ãûµ¥=%d IP(s) are banned and cannot be added to the whitelist diff --git a/server/2015Remote/lang/zh_TW.ini b/server/2015Remote/lang/zh_TW.ini index b1f9f71..d71b08a 100644 --- a/server/2015Remote/lang/zh_TW.ini +++ b/server/2015Remote/lang/zh_TW.ini @@ -2093,3 +2093,8 @@ TLS È·¶¨È¡ÏûÑ¡ÖÐÖ÷»úµÄ TLS ´«ÊäÂ𣿣¨¿Í»§¶ËÏÂ´ÎÆô¶¯ÉúЧ£©=´_¶¨È¡ÏûßxÈ¡Ö÷™CµÄ TLS ‚÷Ý”†á£¿£¨ÓÑô¶ËÏ´Ά¢„ÓÉúЧ£© ·þÎñ¶ËδÆôÓà TLS Ö¤Ê飬ÎÞ·¨Çл»¿Í»§¶Ë TLS ´«Êä=ËÅ·þÆ÷δ†¢Óà TLS ‘{×C£¬Ÿo·¨ÇГQÓÑô¶Ë TLS ‚÷Ý” ¶ÁÈ¡·þÎñ¶Ë TLS Ö¤Êéʧ°Ü£¬ÎÞ·¨Ï·¢=×xÈ¡ËÅ·þÆ÷ TLS ‘{×Cʧ”¡£¬Ÿo·¨Ï°l +°×Ãûµ¥=°×Ãû†Î +È·¶¨½«Ñ¡ÖÐÈÕÖ¾ÖÐµÄ IP ¼ÓÈë°×Ãûµ¥Âð£¿=´_¶¨Œ¢ßxÈ¡ÈÕÕIÖÐµÄ IP ¼ÓÈë°×Ãû†Î†á£¿ +Òѽ« %d ¸ö IP ¼ÓÈë°×Ãûµ¥=ÒÑŒ¢ %d ‚€ IP ¼ÓÈë°×Ãû†Î +%d ¸ö IP ÒÑÔÚ°×Ãûµ¥ÖÐ=%d ‚€ IP ÒÑÔÚ°×Ãû†ÎÖÐ +%d ¸ö IP ÒÑ·â½û£¬ÎÞ·¨¼ÓÈë°×Ãûµ¥=%d ‚€ IP ÒÑ·â½û£¬Ÿo·¨¼ÓÈë°×Ãû†Î diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index 4485874..d59041d 100644 --- a/server/2015Remote/resource.h +++ b/server/2015Remote/resource.h @@ -1010,6 +1010,7 @@ #define ID_MSGLOG_LOGIN_NOTIFY 33079 #define ID_MSGLOG_BAN_IP 33080 #define ID_MSGLOG_UNBAN_IP 33081 +#define ID_MSGLOG_WHITELIST_IP 33096 #define ID_WEB_REMOTE_CONTROL 33044 #define ID_TOOL_PLUGIN_SETTINGS 33045 #define ID_MCP_SETTINGS 33077 @@ -1120,7 +1121,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 412 -#define _APS_NEXT_COMMAND_VALUE 33096 +#define _APS_NEXT_COMMAND_VALUE 33097 #define _APS_NEXT_CONTROL_VALUE 2620 #define _APS_NEXT_SYMED_VALUE 105 #endif