1- from  typing  import  Any , ClassVar , Union , List , Type 
1+ import  base64 
2+ from  typing  import  Any , ClassVar , Union , List , Type , Optional 
23import  logging 
34
45import  attrs 
@@ -103,7 +104,7 @@ class Snowflake(Database):
103104
104105 _conn : Any 
105106
106-  def  __init__ (self , * , schema : str , ** kw ):
107+  def  __init__ (self , * , schema : str , key :  Optional [ str ]  =   None ,  key_content :  Optional [ str ]  =   None ,  ** kw ):
107108 super ().__init__ ()
108109 snowflake , serialization , default_backend  =  import_snowflake ()
109110 logging .getLogger ("snowflake.connector" ).setLevel (logging .WARNING )
@@ -113,20 +114,29 @@ def __init__(self, *, schema: str, **kw):
113114 logging .getLogger ("snowflake.connector.network" ).disabled  =  True 
114115
115116 assert  '"'  not  in   schema , "Schema name should not contain quotes!" 
117+  if  key_content  and  key :
118+  raise  ConnectError ("Only key value or key file path can be specified, not both" )
119+ 
120+  key_bytes  =  None 
121+  if  key :
122+  with  open (key , "rb" ) as  f :
123+  key_bytes  =  f .read ()
124+  if  key_content :
125+  key_bytes  =  base64 .b64decode (key_content )
126+ 
116127 # If a private key is used, read it from the specified path and pass it as "private_key" to the connector. 
117-  if  "key"  in  kw :
118-  with  open (kw .get ("key" ), "rb" ) as  key :
119-  if  "password"  in  kw :
120-  raise  ConnectError ("Cannot use password and key at the same time" )
121-  if  kw .get ("private_key_passphrase" ):
122-  encoded_passphrase  =  kw .get ("private_key_passphrase" ).encode ()
123-  else :
124-  encoded_passphrase  =  None 
125-  p_key  =  serialization .load_pem_private_key (
126-  key .read (),
127-  password = encoded_passphrase ,
128-  backend = default_backend (),
129-  )
128+  if  key_bytes :
129+  if  "password"  in  kw :
130+  raise  ConnectError ("Cannot use password and key at the same time" )
131+  if  kw .get ("private_key_passphrase" ):
132+  encoded_passphrase  =  kw .get ("private_key_passphrase" ).encode ()
133+  else :
134+  encoded_passphrase  =  None 
135+  p_key  =  serialization .load_pem_private_key (
136+  key_bytes ,
137+  password = encoded_passphrase ,
138+  backend = default_backend (),
139+  )
130140
131141 kw ["private_key" ] =  p_key .private_bytes (
132142 encoding = serialization .Encoding .DER ,
0 commit comments