Skip to content

Commit 51ed8c3

Browse files
committed
Pass ssl_context from the web_client to the websocket
1 parent 508caa2 commit 51ed8c3

File tree

4 files changed

+34
-2
lines changed

4 files changed

+34
-2
lines changed

slack_sdk/socket_mode/builtin/client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ def connect(self) -> None:
177177
on_message_listener=self._on_message,
178178
on_error_listener=self._on_error,
179179
on_close_listener=self._on_close,
180+
ssl_context=self.web_client.ssl,
180181
)
181182
current_session.connect()
182183

slack_sdk/socket_mode/builtin/connection.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ def __init__(
6464
on_error_listener: Optional[Callable[[Exception], None]] = None,
6565
on_close_listener: Optional[Callable[[int, Optional[str]], None]] = None,
6666
connection_type_name: str = "Socket Mode",
67+
ssl_context: Optional[ssl.SSLContext] = None,
6768
):
6869
self.url = url
6970
self.logger = logger
@@ -94,6 +95,8 @@ def __init__(
9495
self.on_close_listener = on_close_listener
9596
self.connection_type_name = connection_type_name
9697

98+
self.ssl_context = ssl_context
99+
97100
def connect(self) -> None:
98101
try:
99102
parsed_url = urlparse(self.url.strip())
@@ -114,6 +117,7 @@ def connect(self) -> None:
114117
proxy=self.proxy,
115118
proxy_headers=self.proxy_headers,
116119
trace_enabled=self.trace_enabled,
120+
ssl_context=self.ssl_context,
117121
)
118122

119123
# WebSocket handshake

slack_sdk/socket_mode/builtin/internals.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ def _parse_connect_response(sock: Socket) -> Tuple[Optional[int], str]:
3737
return status, "\n".join(lines)
3838

3939

40+
def _use_or_create_ssl_context(ssl_context: Optional[ssl.SSLContext] = None):
41+
return ssl_context if ssl_context is not None else ssl.create_default_context()
42+
43+
4044
def _establish_new_socket_connection(
4145
session_id: str,
4246
server_hostname: str,
@@ -47,7 +51,11 @@ def _establish_new_socket_connection(
4751
proxy: Optional[str],
4852
proxy_headers: Optional[Dict[str, str]],
4953
trace_enabled: bool,
54+
ssl_context: Optional[ssl.SSLContext] = None,
5055
) -> Union[ssl.SSLSocket, Socket]:
56+
57+
ssl_context = _use_or_create_ssl_context(ssl_context)
58+
5159
if proxy is not None:
5260
parsed_proxy = urlparse(proxy)
5361
proxy_host, proxy_port = parsed_proxy.hostname, parsed_proxy.port or 80
@@ -83,7 +91,7 @@ def _establish_new_socket_connection(
8391
f"Failed to connect to the proxy (proxy: {proxy}, connect status code: {status})"
8492
)
8593

86-
sock = ssl.create_default_context().wrap_socket(
94+
sock = ssl_context.wrap_socket(
8795
sock,
8896
do_handshake_on_connect=True,
8997
suppress_ragged_eofs=True,
@@ -100,7 +108,7 @@ def _establish_new_socket_connection(
100108
return sock
101109

102110
sock = socket.create_connection((server_hostname, server_port), receive_timeout)
103-
sock = ssl.create_default_context().wrap_socket(
111+
sock = ssl_context.wrap_socket(
104112
sock,
105113
do_handshake_on_connect=True,
106114
suppress_ragged_eofs=True,

tests/slack_sdk/socket_mode/test_builtin.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import logging
22
import socket
3+
import ssl
34
import time
45
import unittest
6+
from unittest.mock import sentinel
57
from threading import Thread
68

79
from slack_sdk import WebClient
@@ -13,6 +15,7 @@
1315
_to_readable_opcode,
1416
_build_data_frame_for_sending,
1517
_parse_connect_response,
18+
_use_or_create_ssl_context,
1619
)
1720
from slack_sdk.web.legacy_client import LegacyWebClient
1821
from .mock_web_api_server import (
@@ -85,6 +88,14 @@ def test_enqueue_message(self):
8588
)
8689
client.process_message()
8790

91+
def test_client_with_ssl(self):
92+
self.web_client.ssl = sentinel.ssl_context
93+
client = SocketModeClient(
94+
app_token="xapp-A111-222-xyz",
95+
web_client=self.web_client,
96+
)
97+
self.assertEqual(client.web_client.ssl, sentinel.ssl_context)
98+
8899
# ----------------------------------
89100
# Connection
90101

@@ -136,3 +147,11 @@ def test_parse_connect_response(self):
136147
self.assertEqual(text, "HTTP/1.1 200 Connection established")
137148
finally:
138149
sock.close()
150+
151+
def test_creating_ssl_context(self):
152+
ssl_context = _use_or_create_ssl_context(None)
153+
self.assertTrue(isinstance(ssl_context, ssl.SSLContext))
154+
155+
def test_using_supplied_ssl_context(self):
156+
ssl_context = _use_or_create_ssl_context(sentinel.ssl_context)
157+
self.assertEqual(ssl_context, sentinel.ssl_context)

0 commit comments

Comments
 (0)