1313from botocore .awsrequest import AWSRequest
1414from botocore .utils import InstanceMetadataRegionFetcher
1515
16- from .errorcode import ER_WIF_CREDENTIALS_NOT_FOUND
16+ from .errorcode import ER_INVALID_WIF_SETTINGS , ER_WIF_CREDENTIALS_NOT_FOUND
1717from .errors import ProgrammingError
1818from .session_manager import SessionManager
1919
@@ -38,7 +38,13 @@ class AttestationProvider(Enum):
3838 @staticmethod
3939 def from_string (provider : str ) -> AttestationProvider :
4040 """Converts a string to a strongly-typed enum value of AttestationProvider."""
41- return AttestationProvider [provider .upper ()]
41+ try :
42+ return AttestationProvider [provider .upper ()]
43+ except KeyError :
44+ raise ProgrammingError (
45+ msg = f"Unknown workload_identity_provider: '{ provider } '. Expected one of: { ', ' .join (AttestationProvider .all_string_values ())} " ,
46+ errno = ER_INVALID_WIF_SETTINGS ,
47+ )
4248
4349 @staticmethod
4450 def all_string_values () -> list [str ]:
@@ -65,7 +71,13 @@ def extract_iss_and_sub_without_signature_verification(jwt_str: str) -> tuple[st
6571
6672 Any errors during token parsing will be bubbled up. Missing 'iss' or 'sub' claims will also raise an error.
6773 """
68- claims = jwt .decode (jwt_str , options = {"verify_signature" : False })
74+ try :
75+ claims = jwt .decode (jwt_str , options = {"verify_signature" : False })
76+ except jwt .InvalidTokenError as e :
77+ raise ProgrammingError (
78+ msg = f"Invalid JWT token: { e } " ,
79+ errno = ER_INVALID_WIF_SETTINGS ,
80+ )
6981
7082 if not ("iss" in claims and "sub" in claims ):
7183 raise ProgrammingError (
@@ -179,14 +191,20 @@ def create_gcp_attestation(
179191
180192 If the application isn't running on GCP or no credentials were found, raises an error.
181193 """
182- res = session_manager .request (
183- method = "GET" ,
184- url = f"http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/identity?audience={ SNOWFLAKE_AUDIENCE } " ,
185- headers = {
186- "Metadata-Flavor" : "Google" ,
187- },
188- )
189- res .raise_for_status ()
194+ try :
195+ res = session_manager .request (
196+ method = "GET" ,
197+ url = f"http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/identity?audience={ SNOWFLAKE_AUDIENCE } " ,
198+ headers = {
199+ "Metadata-Flavor" : "Google" ,
200+ },
201+ )
202+ res .raise_for_status ()
203+ except Exception as e :
204+ raise ProgrammingError (
205+ msg = f"Error fetching GCP metadata: { e } . Ensure the application is running on GCP." ,
206+ errno = ER_WIF_CREDENTIALS_NOT_FOUND ,
207+ )
190208
191209 jwt_str = res .content .decode ("utf-8" )
192210 _ , subject = extract_iss_and_sub_without_signature_verification (jwt_str )
@@ -230,12 +248,18 @@ def create_azure_attestation(
230248 if managed_identity_client_id :
231249 query_params += f"&client_id={ managed_identity_client_id } "
232250
233- res = session_manager .request (
234- method = "GET" ,
235- url = f"{ url_without_query_string } ?{ query_params } " ,
236- headers = headers ,
237- )
238- res .raise_for_status ()
251+ try :
252+ res = session_manager .request (
253+ method = "GET" ,
254+ url = f"{ url_without_query_string } ?{ query_params } " ,
255+ headers = headers ,
256+ )
257+ res .raise_for_status ()
258+ except Exception as e :
259+ raise ProgrammingError (
260+ msg = f"Error fetching Azure metadata: { e } . Ensure the application is running on Azure." ,
261+ errno = ER_WIF_CREDENTIALS_NOT_FOUND ,
262+ )
239263
240264 jwt_str = res .json ().get ("access_token" )
241265 if not jwt_str :
0 commit comments