@@ -638,9 +638,17 @@ class FTP_TLS(FTP):
638638 ssl_version = ssl .PROTOCOL_TLSv1
639639
640640 def __init__ (self , host = '' , user = '' , passwd = '' , acct = '' , keyfile = None ,
641- certfile = None , timeout = _GLOBAL_DEFAULT_TIMEOUT ):
641+ certfile = None , context = None ,
642+ timeout = _GLOBAL_DEFAULT_TIMEOUT ):
643+ if context is not None and keyfile is not None :
644+ raise ValueError ("context and keyfile arguments are mutually "
645+ "exclusive" )
646+ if context is not None and certfile is not None :
647+ raise ValueError ("context and certfile arguments are mutually "
648+ "exclusive" )
642649 self .keyfile = keyfile
643650 self .certfile = certfile
651+ self .context = context
644652 self ._prot_p = False
645653 FTP .__init__ (self , host , user , passwd , acct , timeout )
646654
@@ -657,8 +665,12 @@ def auth(self):
657665 resp = self .voidcmd ('AUTH TLS' )
658666 else :
659667 resp = self .voidcmd ('AUTH SSL' )
660- self .sock = ssl .wrap_socket (self .sock , self .keyfile , self .certfile ,
661- ssl_version = self .ssl_version )
668+ if self .context is not None :
669+ self .sock = self .context .wrap_socket (self .sock )
670+ else :
671+ self .sock = ssl .wrap_socket (self .sock , self .keyfile ,
672+ self .certfile ,
673+ ssl_version = self .ssl_version )
662674 self .file = self .sock .makefile (mode = 'r' , encoding = self .encoding )
663675 return resp
664676
@@ -689,8 +701,11 @@ def prot_c(self):
689701 def ntransfercmd (self , cmd , rest = None ):
690702 conn , size = FTP .ntransfercmd (self , cmd , rest )
691703 if self ._prot_p :
692- conn = ssl .wrap_socket (conn , self .keyfile , self .certfile ,
693- ssl_version = self .ssl_version )
704+ if self .context is not None :
705+ conn = self .context .wrap_socket (conn )
706+ else :
707+ conn = ssl .wrap_socket (conn , self .keyfile , self .certfile ,
708+ ssl_version = self .ssl_version )
694709 return conn , size
695710
696711 def retrbinary (self , cmd , callback , blocksize = 8192 , rest = None ):
0 commit comments