Skip to content

Commit a0bb9e5

Browse files
committed
Fixed as per review comments
1 parent d15b00a commit a0bb9e5

File tree

3 files changed

+50
-8
lines changed

3 files changed

+50
-8
lines changed

ibis-server/app/model/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
from abc import ABC
4+
from enum import Enum
45

56
from pydantic import BaseModel, Field, SecretStr
67
from starlette.status import (
@@ -197,3 +198,9 @@ class UnprocessableEntityError(CustomHttpError):
197198

198199
class NotFoundError(CustomHttpError):
199200
status_code = HTTP_404_NOT_FOUND
201+
202+
203+
class SSLMode(str, Enum):
204+
DISABLED = "disabled"
205+
ENABLED = "enabled"
206+
VERIFY_CA = "verify_ca"

ibis-server/app/model/data_source.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,11 @@
2828
QuerySnowflakeDTO,
2929
QueryTrinoDTO,
3030
SnowflakeConnectionInfo,
31+
SSLMode,
3132
TrinoConnectionInfo,
3233
)
3334

3435

35-
class SSLMode(str, Enum):
36-
DISABLE = "Disable"
37-
REQUIRE = "Require"
38-
VERIFY_CA = "Verify CA"
39-
40-
4136
class DataSource(StrEnum):
4237
bigquery = auto()
4338
canner = auto()
@@ -187,13 +182,13 @@ def _create_ssl_context(info: ConnectionInfo) -> Optional[ssl.SSLContext]:
187182
info.ssl_mode.get_secret_value() if hasattr(info, "ssl_mode") else None
188183
)
189184

190-
if not ssl_mode or ssl_mode == SSLMode.DISABLE:
185+
if not ssl_mode or ssl_mode == SSLMode.DISABLED:
191186
return None
192187

193188
ctx = ssl.create_default_context()
194189
ctx.check_hostname = False
195190

196-
if ssl_mode == SSLMode.REQUIRE:
191+
if ssl_mode == SSLMode.ENABLED:
197192
ctx.verify_mode = ssl.CERT_NONE
198193
elif ssl_mode == SSLMode.VERIFY_CA:
199194
ctx.verify_mode = ssl.CERT_REQUIRED

ibis-server/tests/routers/v2/connector/test_mysql.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from sqlalchemy import text
88
from testcontainers.mysql import MySqlContainer
99

10+
from app.model import SSLMode
1011
from app.model.validator import rules
1112
from tests.conftest import file_path
1213

@@ -111,6 +112,13 @@ def mysql(request) -> MySqlContainer:
111112
return mysql
112113

113114

115+
@pytest.fixture(scope="module")
116+
def mysql_ssl_off(request) -> MySqlContainer:
117+
mysql = MySqlContainer(image="mysql:8.0.40").with_command("--ssl=0").start()
118+
request.addfinalizer(mysql.stop)
119+
return mysql
120+
121+
114122
async def test_query(client, manifest_str, mysql: MySqlContainer):
115123
connection_info = _to_connection_info(mysql)
116124
response = await client.post(
@@ -404,6 +412,38 @@ async def test_metadata_db_version(client, mysql: MySqlContainer):
404412
assert response.text == '"8.0.40"'
405413

406414

415+
@pytest.mark.parametrize(
416+
"ssl_mode, expected_error",
417+
[
418+
(SSLMode.ENABLED, "Bad handshake"),
419+
(SSLMode.VERIFY_CA, "cafile, capath and cadata cannot be all omitted"),
420+
],
421+
)
422+
async def test_connection_invalid_ssl_mode(
423+
client, mysql_ssl_off: MySqlContainer, ssl_mode, expected_error
424+
):
425+
connection_info = _to_connection_info(mysql_ssl_off)
426+
connection_info["sslMode"] = ssl_mode
427+
428+
with pytest.raises(Exception) as excinfo:
429+
await client.post(
430+
url=f"{base_url}/metadata/version",
431+
json={"connectionInfo": connection_info},
432+
)
433+
assert expected_error in str(excinfo.value)
434+
435+
436+
async def test_connection_valid_ssl_mode(client, mysql_ssl_off: MySqlContainer):
437+
connection_info = _to_connection_info(mysql_ssl_off)
438+
connection_info["sslMode"] = SSLMode.DISABLED
439+
response = await client.post(
440+
url=f"{base_url}/metadata/version",
441+
json={"connectionInfo": connection_info},
442+
)
443+
assert response.status_code == 200
444+
assert response.text == '"8.0.40"'
445+
446+
407447
def _to_connection_info(mysql: MySqlContainer):
408448
return {
409449
"host": mysql.get_container_host_ip(),

0 commit comments

Comments
 (0)