Skip to content

Commit 152dba4

Browse files
fix: redact bot_access_tokens from the debug logs of socket mode (#1519)
1 parent aa3c792 commit 152dba4

File tree

7 files changed

+42
-3
lines changed

7 files changed

+42
-3
lines changed

slack_sdk/socket_mode/builtin/client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from slack_sdk.web import WebClient
2121
from .connection import Connection, ConnectionState
2222
from ..interval_runner import IntervalRunner
23+
from ..logger.messages import debug_redacted_message_string
2324
from ...errors import SlackClientConfigurationError, SlackClientNotConnectedError
2425
from ...proxy_env_variable_loader import load_http_proxy_from_env
2526

@@ -231,7 +232,7 @@ def close(self):
231232

232233
def _on_message(self, message: str):
233234
if self.logger.level <= logging.DEBUG:
234-
self.logger.debug(f"on_message invoked: (message: {message})")
235+
self.logger.debug(f"on_message invoked: (message: {debug_redacted_message_string(message)})")
235236
self.enqueue_message(message)
236237
for listener in self.on_message_listeners:
237238
listener(message)

slack_sdk/socket_mode/logger/__init__.py

Whitespace-only changes.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import re
2+
3+
4+
def debug_redacted_message_string(message: str) -> str:
5+
xwfp_token_pattern = re.compile(r"\"xwfp-[A-Za-z0-9\-]+\"") # ex: "xwfp-abc-ABC-1234"
6+
return re.sub(xwfp_token_pattern, "[[REDACTED]]", message)

slack_sdk/socket_mode/websocket_client/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
from slack_sdk.socket_mode.request import SocketModeRequest
2525
from slack_sdk.web import WebClient
2626

27+
from ..logger.messages import debug_redacted_message_string
28+
2729

2830
class SocketModeClient(BaseSocketModeClient):
2931
logger: Logger
@@ -147,7 +149,7 @@ def on_open(ws: WebSocketApp):
147149

148150
def on_message(ws: WebSocketApp, message: str):
149151
if self.logger.level <= logging.DEBUG:
150-
self.logger.debug(f"on_message invoked: (message: {message})")
152+
self.logger.debug(f"on_message invoked: (message: {debug_redacted_message_string(message)})")
151153
self.enqueue_message(message)
152154
for listener in self.on_message_listeners:
153155
listener(ws, message)

slack_sdk/socket_mode/websockets/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
from slack_sdk.socket_mode.request import SocketModeRequest
2727
from slack_sdk.web.async_client import AsyncWebClient
2828

29+
from ..logger.messages import debug_redacted_message_string
30+
2931

3032
class SocketModeClient(AsyncBaseSocketModeClient):
3133
logger: Logger
@@ -149,7 +151,9 @@ async def receive_messages(self) -> None:
149151
if isinstance(message, bytes):
150152
message = message.decode("utf-8")
151153
if self.logger.level <= logging.DEBUG:
152-
self.logger.debug(f"Received message: {message}, session: {session_id}")
154+
self.logger.debug(
155+
f"Received message: {debug_redacted_message_string(message)}, session: {session_id}"
156+
)
153157
await self.enqueue_message(message)
154158
consecutive_error_count = 0
155159
except Exception as e:

tests/slack_sdk/socket_mode/logger/__init__.py

Whitespace-only changes.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import unittest
2+
3+
from slack_sdk.socket_mode.logger.messages import debug_redacted_message_string
4+
5+
6+
class TestRequest(unittest.TestCase):
7+
def setUp(self):
8+
pass
9+
10+
def tearDown(self):
11+
pass
12+
13+
def test_debug_redacted_message_string(self):
14+
message = """{"envelope_id":"abc-123","payload":{"token":"xxx","team_id":"T123","api_app_id":"A123","event":{"type":"function_executed","function":{"id":"Fn123","callback_id":"sample_function","title":"Sample function","description":"","type":"app","input_parameters":[],"output_parameters":[],"app_id":"A123","date_created":1719416102,"date_released":0,"date_updated":1719426759,"date_deleted":0,"form_enabled":false},"inputs":{"user_id":"U123"},"function_execution_id":"Fx123","workflow_execution_id":"Wx079QN9CT8E","event_ts":"1719427571.129426","bot_access_token":"xwfp-123-abc"},"type":"event_callback","event_id":"Ev123","event_time":1719427571},"type":"events_api","accepts_response_payload":false,"retry_attempt":0,"retry_reason":""}"""
15+
redacted_message = debug_redacted_message_string(message)
16+
self.assertEqual(redacted_message.count('"bot_access_token":[[REDACTED]]'), 1)
17+
18+
def test_debug_redacted_message_string_no_changes(self):
19+
message = """{"envelope_id":"abc-123","payload":{"token":"xxx","team_id":"T123","api_app_id":"A123","event":{"type":"function_executed","function":{"id":"Fn123","callback_id":"sample_function","title":"Sample function","description":"","type":"app","input_parameters":[],"output_parameters":[],"app_id":"A123","date_created":1719416102,"date_released":0,"date_updated":1719426759,"date_deleted":0,"form_enabled":false},"inputs":{"user_id":"U123"},"function_execution_id":"Fx123","workflow_execution_id":"Wx079QN9CT8E","event_ts":"1719427571.129426"},"type":"event_callback","event_id":"Ev123","event_time":1719427571},"type":"events_api","accepts_response_payload":false,"retry_attempt":0,"retry_reason":""}"""
20+
redacted_message = debug_redacted_message_string(message)
21+
self.assertEqual(redacted_message.count('"bot_access_token":[[REDACTED]]'), 0)
22+
23+
def test_debug_redacted_message_string_simple(self):
24+
message = '"bot_access_token": "xwfp-123-abc"'
25+
redacted_message = debug_redacted_message_string(message)
26+
self.assertEqual(redacted_message.count('"bot_access_token": [[REDACTED]]'), 1)

0 commit comments

Comments
 (0)