
    \jw                         d Z ddlZddlZddlZddlZddlmZm	Z	m
Z
 ddlZ ej                  e      ZdZ	 dZdZd Zd Zd	 Zd
 Zd ZddddeddfdZy)z Implements I/O streams over FTP.    N)FTPFTP_TLSerror_reply)ftpftps   )zftp://username@host/path/filez&ftp://username:password@host/path/filez+ftp://username:password@host:port/path/filezftps://username@host/path/filez'ftps://username:password@host/path/filez,ftps://username:password@host:port/path/filec                 H    | xr t         j                  j                  |       S N)urllibparseunquote)texts    8/root/env/lib/python3.12/site-packages/smart_open/ftp.py_unquoter   $   s    .FLL((..    c           
      Z   t         j                  j                  |       }|j                  t        v sJ t        |j                  t        |j                        t        |j                        |j                  t        |j                  xs t              t        |j                              S )N)schemeuri_pathuserhostportpassword)r   r   urlsplitr   SCHEMESdictr   pathusernamehostnameintr   DEFAULT_PORTr   )uri_as_string	split_uris     r   	parse_urir#   (   s    %%m4Iw&&&)..)i(()/<0),,- r   c                     t         j                  j                  t        |       t	        |       }|j                  d      }|j                  d      }|dk(  rdnd}t        ||f||d|S )Nr   r   r   TF)secure_connectiontransport_params)
smart_openutilscheck_kwargsopenr#   pop)urimoder&   
parsed_urir   r   secure_conns          r   open_urir0   5   sv    !!$(893J~~j)H^^H%F F*$K &)	
  r   c                     g d}| D cg c]	  }||vs| }}| j                         D ci c]  \  }}||v s|| }}}|rt        j                  d|       |S c c}w c c}}w )N)timeoutsource_addressencodingz.ignoring unsupported ftp keyword arguments: %r)itemsloggerwarning)r&   supported_keywordskunsupported_keywordsvkwargss         r    convert_transport_params_to_argsr=   D   sy    
 (8W!1DV;VAWW!1!7!7!9Uv1QBT=TadUFU<>R	
 M XUs   	AAA A c                    t        |      }|r<t        j                  t        j                  j                        }t        dd|i|}nt        di |}	 |j                  | |       	 |j                  ||       |r|j                          |S # t        $ r}	t        j                  d       |	d }	~	ww xY w# t        $ r}	t        j                  d       |	d }	~	ww xY w)N)purposecontextz@Unable to connect to FTP server: try checking the host and port!zFUnable to login to FTP server: try checking the username and password! )r=   sslcreate_default_contextPurposeSERVER_AUTHr   r   connect	Exceptionr6   errorloginr   prot_p)
r   r   r   r   r%   r&   r<   ssl_contextr   es
             r   _connectrM   U   s    -.>?F009P9PQ4k4V4mFmHd#		(H% 

J  WX
  T	
 	s0   B )B7 	B4B//B47	C CCrbFc                    |st        d      |st        d      |si }t        ||||||      }dddd}		 |	|   \  }
}|	|   \  }
}|j                  d       |j	                  |
 d	|        }|j                  |      }d
 }|j                  |_        ||_        ||_	        t        j                  ||      |_        |S # t        $ r t        d|      w xY w)ai  Open a file for reading or writing via FTP/FTPS.

    Parameters
    ----------
    path: str
        The path on the remote server
    mode: str
        Must be "rb" or "wb"
    host: str
        The host to connect to
    user: str
        The username to use for the connection
    password: str
        The password for the specified username
    port: int
        The port to connect to
    secure_connection: bool
        True for FTPS, False for FTP
    transport_params: dict
        Additional parameters for the FTP connection.
        Currently supported parameters: timeout, source_address, encoding.
    z'you must specify the host to connect tozyou must specify the user)RETRrN   )STORwb)APPErR   )rN   rR   abzunsupported mode: zTYPE I c                     | j                          | j                  j                          | j                  j                          y r
   )
orig_closesocketcloseconn)selfs    r   
full_closezopen.<locals>.full_close   s*    		r   )
ValueErrorrM   KeyErrorvoidcmdtransfercmdmakefilerY   rW   rX   rZ   types
MethodType)r   r-   r   r   r   r   r%   r&   rZ   mode_to_ftp_cmdsftp_modefile_obj_moderX   fobjr\   s                  r   r*   r*   m   s
   @ BCC455D$h0ACSTD
8"24"8- /t4HmLL
!D623F??=)D
 jjDODKDI!!*d3DJK!  8-dX6778s   B= =C)__doc__loggingrB   urllib.parser   smart_open.utilsr'   ftplibr   r   r   rb   	getLogger__name__r6   r   r    URI_EXAMPLESr   r#   r0   r=   rM   r*   rA   r   r   <module>rp      sz    '  
   , , 			8	$
 /
"4 
			>r   