@@ -93,13 +93,14 @@ def get_default_credentials_dir():
9393
9494def _find_any_credentials (
9595 base_dir : str = DEFAULT_CREDENTIALS_DIR ,
96- ) -> Optional [Credentials ]:
96+ ) -> tuple [ Optional [Credentials ], Optional [ str ] ]:
9797 """
9898 Find and load any valid credentials from the credentials directory.
9999 Used in single-user mode to bypass session-to-OAuth mapping.
100100
101101 Returns:
102- First valid Credentials object found, or None if none exist.
102+ Tuple of (Credentials, user_email) or (None, None) if none exist.
103+ Returns the user email to enable saving refreshed credentials.
103104 """
104105 try :
105106 store = get_credential_store ()
@@ -108,7 +109,7 @@ def _find_any_credentials(
108109 logger .info (
109110 "[single-user] No users found with credentials via credential store"
110111 )
111- return None
112+ return None , None
112113
113114 # Return credentials for the first user found
114115 first_user = users [0 ]
@@ -117,7 +118,7 @@ def _find_any_credentials(
117118 logger .info (
118119 f"[single-user] Found credentials for { first_user } via credential store"
119120 )
120- return credentials
121+ return credentials , first_user
121122 else :
122123 logger .warning (
123124 f"[single-user] Could not load credentials for { first_user } via credential store"
@@ -129,7 +130,7 @@ def _find_any_credentials(
129130 )
130131
131132 logger .info ("[single-user] No valid credentials found via credential store" )
132- return None
133+ return None , None
133134
134135
135136def save_credentials_to_session (session_id : str , credentials : Credentials ):
@@ -620,27 +621,20 @@ def get_credentials(
620621 logger .info (
621622 "[get_credentials] Single-user mode: bypassing session mapping, finding any credentials"
622623 )
623- credentials = _find_any_credentials (credentials_base_dir )
624+ credentials , found_user_email = _find_any_credentials (credentials_base_dir )
624625 if not credentials :
625626 logger .info (
626627 f"[get_credentials] Single-user mode: No credentials found in { credentials_base_dir } "
627628 )
628629 return None
629630
630- # In single-user mode, if user_google_email wasn't provided, try to get it from user info
631- # This is needed for proper credential saving after refresh
632- if not user_google_email and credentials .valid :
633- try :
634- user_info = get_user_info (credentials )
635- if user_info and "email" in user_info :
636- user_google_email = user_info ["email" ]
637- logger .debug (
638- f"[get_credentials] Single-user mode: extracted user email { user_google_email } from credentials"
639- )
640- except Exception as e :
641- logger .debug (
642- f"[get_credentials] Single-user mode: could not extract user email: { e } "
643- )
631+ # Use the email from the credential file if not provided
632+ # This ensures we can save refreshed credentials even when the token is expired
633+ if not user_google_email and found_user_email :
634+ user_google_email = found_user_email
635+ logger .debug (
636+ f"[get_credentials] Single-user mode: using email { user_google_email } from credential file"
637+ )
644638 else :
645639 credentials : Optional [Credentials ] = None
646640
0 commit comments