88import logging
99from typing import Any , Dict , List , Optional
1010
11- from cryptography .fernet import Fernet
1211from sqlalchemy import Column , DateTime , Integer , String , Text
1312
14- from derisk ._private .config import Config
1513from derisk .storage .metadata import BaseDao , Model
1614
1715logger = logging .getLogger (__name__ )
@@ -182,28 +180,37 @@ def _mask_providers_for_display(
182180 provider ["client_secret" ] = "****"
183181 return masked
184182
185- def get_config (self , config_key : str = "global" , mask_secrets : bool = True ) -> Optional [Dict [str , Any ]]:
183+ def get_config (
184+ self , config_key : str = "global" , mask_secrets : bool = True
185+ ) -> Optional [Dict [str , Any ]]:
186186 """Get OAuth2 config from database.
187187
188188 Args:
189189 config_key: Configuration key (default: global)
190190 mask_secrets: If True, mask client_secret in providers for display
191191 """
192- entity = self .get_by_key (config_key )
193- if not entity :
194- return None
192+ with self .session () as session :
193+ entity = (
194+ session .query (OAuth2ConfigEntity )
195+ .filter (OAuth2ConfigEntity .config_key == config_key )
196+ .first ()
197+ )
198+ if not entity :
199+ return None
200+
201+ # Read ORM attributes before the session closes to avoid
202+ # detached-instance access during JSON conversion.
203+ enabled = bool (entity .enabled )
204+ admin_users_json = entity .admin_users_json or "[]"
205+ providers_json = entity .providers_json or "[]"
195206
196207 try :
197- admin_users = (
198- json .loads (entity .admin_users_json )
199- if entity .admin_users_json
200- else []
201- )
208+ admin_users = json .loads (admin_users_json ) if admin_users_json else []
202209 except json .JSONDecodeError :
203210 admin_users = []
204211
205212 try :
206- providers = json .loads (entity . providers_json or "[]" )
213+ providers = json .loads (providers_json )
207214 except json .JSONDecodeError :
208215 providers = []
209216
@@ -212,12 +219,14 @@ def get_config(self, config_key: str = "global", mask_secrets: bool = True) -> O
212219 providers = self ._mask_providers_for_display (providers )
213220
214221 return {
215- "enabled" : bool ( entity . enabled ) ,
222+ "enabled" : enabled ,
216223 "providers" : providers ,
217224 "admin_users" : admin_users ,
218225 }
219226
220- def get_config_with_secrets (self , config_key : str = "global" ) -> Optional [Dict [str , Any ]]:
227+ def get_config_with_secrets (
228+ self , config_key : str = "global"
229+ ) -> Optional [Dict [str , Any ]]:
221230 """Get OAuth2 config with actual secrets (for internal use only)."""
222231 return self .get_config (config_key , mask_secrets = False )
223232
@@ -242,7 +251,9 @@ def load_with_secrets(self) -> Optional[Dict[str, Any]]:
242251 """Load OAuth2 config with actual secrets (for internal use only)."""
243252 return self .dao .get_config_with_secrets ("global" )
244253
245- def save (self , enabled : bool , providers : List [Dict ], admin_users : List [str ]) -> bool :
254+ def save (
255+ self , enabled : bool , providers : List [Dict ], admin_users : List [str ]
256+ ) -> bool :
246257 """Save OAuth2 config to database."""
247258 try :
248259 self .dao .save_or_update (enabled , providers , admin_users , "global" )
0 commit comments