Skip to content

Commit 8c6ce6b

Browse files
Mats-SXDarthMax
andcommitted
Allow passing in root certificates and disable server verification
Co-authored-by: Max Kießling <max.kiessling@neotechnology.com>
1 parent 59252c6 commit 8c6ce6b

File tree

4 files changed

+76
-0
lines changed

4 files changed

+76
-0
lines changed

changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44

55
## New features
66

7+
- `sessions.get_or_create()` now supports passing in a manual selection of root certificates for verifying server certificate
8+
- `sessions.get_or_create()` now supports disabling server certificate verification
9+
10+
711
## Bug fixes
812

913
- Fix reporting error based on http responses from the Aura-API with an invalid JSON body. Earlier the client would report JSONDecodeError instead of showing the actual issue.

graphdatascience/session/dedicated_sessions.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ def get_or_create(
6363
cloud_location: Optional[CloudLocation] = None,
6464
timeout: Optional[int] = None,
6565
neo4j_driver_options: Optional[dict[str, Any]] = None,
66+
tls_root_certs: Optional[bytes] = None,
67+
disable_server_verification: bool = False,
6668
) -> AuraGraphDataScience:
6769
if db_connection is None:
6870
if not cloud_location:
@@ -104,6 +106,8 @@ def get_or_create(
104106
session_bolt_connection_info=session_bolt_connection_info,
105107
arrow_authentication=arrow_authentication,
106108
db_runner=db_runner,
109+
tls_root_certs=tls_root_certs,
110+
disable_server_verification=disable_server_verification,
107111
)
108112

109113
def _create_db_runner(
@@ -209,10 +213,14 @@ def _construct_client(
209213
session_bolt_connection_info: DbmsConnectionInfo,
210214
arrow_authentication: ArrowAuthentication,
211215
db_runner: Optional[Neo4jQueryRunner],
216+
tls_root_certs: Optional[bytes],
217+
disable_server_verification: bool,
212218
) -> AuraGraphDataScience:
213219
return AuraGraphDataScience.create(
214220
session_bolt_connection_info=session_bolt_connection_info,
215221
arrow_authentication=arrow_authentication,
216222
db_endpoint=db_runner,
217223
delete_fn=lambda: self._aura_api.delete_session(session_id=session_id),
224+
arrow_tls_root_certs=tls_root_certs,
225+
arrow_disable_server_verification=disable_server_verification,
218226
)

graphdatascience/session/gds_sessions.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ def get_or_create(
106106
cloud_location: Optional[CloudLocation] = None,
107107
timeout: Optional[int] = None,
108108
neo4j_driver_config: Optional[dict[str, Any]] = None,
109+
tls_root_certs: Optional[bytes] = None,
110+
disable_server_verification: bool = False,
109111
) -> AuraGraphDataScience:
110112
"""
111113
Retrieves an existing session with the given session name and database connection,
@@ -122,6 +124,8 @@ def get_or_create(
122124
cloud_location (Optional[CloudLocation]): The cloud location. Required if the GDS session is for a self-managed database.
123125
timeout (Optional[int]): Optional timeout (in seconds) when waiting for session to become ready. If unset the method will wait forever. If set and session does not become ready an exception will be raised. It is user responsibility to ensure resource gets cleaned up in this situation.
124126
neo4j_driver_config (Optional[dict[str, Any]]): Optional configuration for the Neo4j driver.
127+
tls_root_certs (Optional[bytes]): Manually specify PEM-encoded root certificates used for verifying server certificate. If not specified, platform-specific default root certificates will be used.
128+
disable_server_verification (bool): Set to True to disable server certificate verification. Use with caution.
125129
Returns:
126130
AuraGraphDataScience: The session.
127131
"""
@@ -133,6 +137,8 @@ def get_or_create(
133137
cloud_location=cloud_location,
134138
timeout=timeout,
135139
neo4j_driver_options=neo4j_driver_config,
140+
tls_root_certs=tls_root_certs,
141+
disable_server_verification=disable_server_verification,
136142
)
137143

138144
def delete(self, *, session_name: Optional[str] = None, session_id: Optional[str] = None) -> bool:

graphdatascience/tests/unit/test_dedicated_sessions.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,60 @@ def test_create_attached_session(mocker: MockerFixture, aura_api: AuraApi) -> No
365365
uri="neo4j+s://foo.bar", username="client-id", password="client_secret"
366366
),
367367
"session_id": "ffff0-ffff1",
368+
"disable_server_verification": False,
369+
"tls_root_certs": None,
370+
}
371+
372+
assert isinstance(arrow_authentication, AuraApiTokenAuthentication)
373+
374+
assert len(sessions.list()) == 1
375+
actual_session = sessions.list()[0]
376+
377+
assert actual_session.name == "my-session"
378+
assert actual_session.user_id == "user-1"
379+
assert actual_session.ttl == ttl
380+
381+
382+
def test_create_attached_session_passthrough_tls_settings(mocker: MockerFixture, aura_api: AuraApi) -> None:
383+
_setup_db_instance(aura_api)
384+
385+
sessions = DedicatedSessions(aura_api)
386+
387+
patch_construct_client(mocker)
388+
patch_neo4j_query_runner(mocker)
389+
390+
ttl = timedelta(hours=42)
391+
fake_certs = bytes(1)
392+
gds_parameters = sessions.get_or_create(
393+
"my-session",
394+
SessionMemory.m_8GB,
395+
DbmsConnectionInfo("neo4j+s://ffff0.databases.neo4j.io", "dbuser", "db_pw"),
396+
ttl=ttl,
397+
disable_server_verification=True,
398+
tls_root_certs=fake_certs,
399+
)
400+
401+
arrow_authentication = gds_parameters["arrow_authentication"] # type: ignore
402+
del gds_parameters["arrow_authentication"]
403+
404+
dbms_authentication = gds_parameters["db_runner"].pop("auth") # type: ignore
405+
406+
assert (dbms_authentication.principal, dbms_authentication.credentials) == ("dbuser", "db_pw")
407+
408+
assert gds_parameters == { # type: ignore
409+
"db_runner": {
410+
"endpoint": "neo4j+s://ffff0.databases.neo4j.io",
411+
"aura_ds": True,
412+
"database": None,
413+
"show_progress": False,
414+
"config": None,
415+
},
416+
"session_bolt_connection_info": DbmsConnectionInfo(
417+
uri="neo4j+s://foo.bar", username="client-id", password="client_secret"
418+
),
419+
"session_id": "ffff0-ffff1",
420+
"disable_server_verification": True,
421+
"tls_root_certs": fake_certs,
368422
}
369423

370424
assert isinstance(arrow_authentication, AuraApiTokenAuthentication)
@@ -412,6 +466,8 @@ def test_create_standalone_session(mocker: MockerFixture, aura_api: AuraApi) ->
412466
uri="neo4j+s://foo.bar", username="client-id", password="client_secret"
413467
),
414468
"session_id": "None-ffff0",
469+
"disable_server_verification": False,
470+
"tls_root_certs": None,
415471
}
416472

417473
assert isinstance(arrow_authentication, AuraApiTokenAuthentication)
@@ -465,6 +521,8 @@ def test_get_or_create(mocker: MockerFixture, aura_api: AuraApi) -> None:
465521
uri="neo4j+s://foo.bar", username="client-id", password="client_secret"
466522
),
467523
"session_id": "ffff0-ffff1",
524+
"disable_server_verification": False,
525+
"tls_root_certs": None,
468526
}
469527

470528
assert gds_args1 == gds_args2

0 commit comments

Comments
 (0)