From 1be93bc24bbc6c1e81709edded896fc2db927141 Mon Sep 17 00:00:00 2001 From: c4ch3c4d3 Date: Wed, 19 Aug 2026 00:07:08 -0500 Subject: [PATCH] fix: MCP pineap.set_filter supports delete/clear/allow_all The tool only accepted set_mode/add, so entries added via MCP could never be removed. Now passes the full action set through to the same endpoint the UI uses and returns the resulting mode/entries. Verified on device: add -> delete round trip leaves the filter empty. --- payload/user/remote_access/pager-webui/server.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/payload/user/remote_access/pager-webui/server.py b/payload/user/remote_access/pager-webui/server.py index d8fec4b..e1173b4 100644 --- a/payload/user/remote_access/pager-webui/server.py +++ b/payload/user/remote_access/pager-webui/server.py @@ -3781,15 +3781,19 @@ def _mcp_tools(): return {'error': 'kind must be ssid or client'} action = (args.get('action') or '').strip() payload = {'action': action} - if action == 'set_mode': + if action in ('set_mode', 'add'): payload['mode'] = (args.get('mode') or 'deny').strip() - elif action == 'add': + if action == 'add': + payload['value'] = (args.get('value') or '').strip() + if not payload['value']: + return {'error': 'value required'} + elif action == 'delete': payload['mode'] = (args.get('mode') or 'deny').strip() payload['value'] = (args.get('value') or '').strip() if not payload['value']: return {'error': 'value required'} - else: - return {'error': 'action must be set_mode or add'} + elif action not in ('clear', 'allow_all'): + return {'error': 'action must be set_mode, add, delete, clear or allow_all'} status, resp = h_filter_post(_Ctx_args(payload), kind) return resp if status == 200 else {'error': resp.get('error', 'filter failed')} @@ -3833,9 +3837,9 @@ def _mcp_tools(): _mcp_tool('recon.isearch', 'Find APs matching an SSID in the recon database.', {'ssid': {'type': 'string'}}, recon_isearch), _mcp_tool('recon.devices', 'Recent observed client devices from recon.', {'limit': {'type': 'number'}}, recon_devices), _mcp_tool('pineap.kick_client', 'Disconnect a client from a PineAP/evil-twin AP.', {'mac': {'type': 'string'}}, kick), - _mcp_tool('pineap.set_filter', 'Set the SSID/client filter: action=set_mode (mode=deny|allow) or add (value).', + _mcp_tool('pineap.set_filter', 'Set the SSID/client filter: action=set_mode (mode=deny|allow), add (mode, value), delete (mode, value), clear, or allow_all. Returns the current mode and entries.', {'kind': {'type': 'string', 'enum': ['ssid', 'client']}, - 'action': {'type': 'string', 'enum': ['set_mode', 'add']}, + 'action': {'type': 'string', 'enum': ['set_mode', 'add', 'delete', 'clear', 'allow_all']}, 'mode': {'type': 'string', 'enum': ['allow', 'deny']}, 'value': {'type': 'string'}}, set_filter), ]