B
    u9a                 @   sZ  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZmZ dddddgZe jd  Zd	ZG d
d dZe adZdZdZd$ddZG dd dejZG dd dejZG dd deZG dd deZG dd deZG dd dZdd Z e!dkrVe  Z"e"j#Z#de#krle#$dZ%e&e#de% e' e( dgZ)e#e%d d Z#nd dl*Z)e+e)e#Z,e,e"j-e"j.fe"j/e"j0fe"j1e"j2dZ3e"j4r2yd dl5Z5W n. e6k
r   e7de j8d  e 9d Y nX e5:d!d" Z;ye4e; W n. e<k
r0   e7d#e j8d  e 9d Y nX ye=  W n e>k
rT   Y nX dS )%    N)warn)get_addr_specget_angle_addrSMTPChannel
SMTPServerDebuggingServer	PureProxyMailmanProxyzPython SMTP proxy version 0.3c               @   s   e Zd Zdd Zdd ZdS )Devnullc             C   s   d S )N )selfmsgr   r   /usr/lib/python3.7/smtpd.pywritef       zDevnull.writec             C   s   d S )Nr   )r   r   r   r   flushg   r   zDevnull.flushN)__name__
__module____qualname__r   r   r   r   r   r   r
   e   s   r
   
z, i    c             C   s4   t tt  tjd |r&t |tjd t|  d S )N)file)print__doc__globalssysstderrexit)coder   r   r   r   usagep   s    r   c               @   s  e Zd ZdZdZdZeefddZe	dd Z
edd	d	fd
dZdd Zdd Ze	dd Zejdd Ze	dd Zejdd Ze	dd Zejdd Ze	dd Zejdd Ze	dd Zejdd Ze	dd  Zejd!d  Ze	d"d# Zejd$d# Ze	d%d& Zejd'd& Ze	d(d) Zejd*d) Ze	d+d, Zejd-d, Ze	d.d/ Zejd0d/ Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dS )Sr   r      i   c             C   s   | S )Nr   )xr   r   r   <lambda>|   r   zSMTPChannel.<lambda>c             C   s*   yt | j S  tk
r$   | jS X d S )N)maxcommand_size_limitsvalues
ValueErrorcommand_size_limit)r   r   r   r   max_command_size_limit~   s    z"SMTPChannel.max_command_size_limitNFc       	   
   C   s   t jj| ||d || _|| _|| _|| _|| _|| _|rF|rFt	d|rdd| _
d| _d| _t| _nd| _
d| _td| _d	| _|   d| _d
| _| j  t | _y| | _W n< tk
r } z|   |jd tjkr d S d }~X Y nX tdt | jt!d | "d| jt#f  d S )N)mapzFdecode_data and enable_SMTPUTF8 cannot be set to True at the same timer   z
.r   s   
   .   
Fr   zPeer:)r   z	220 %s %s)$asynchat
async_chat__init__smtp_serverconnaddrdata_size_limitenable_SMTPUTF8_decode_datar&   _emptystring_linesep_dotsepNEWLINE_newlineord_set_rset_stateseen_greetingextended_smtpr$   clearsocketZgetfqdnfqdnZgetpeernamepeerOSErrorcloseargserrnoZENOTCONNr   reprDEBUGSTREAMpush__version__)	r   Zserverr1   r2   r3   r)   r4   decode_dataerrr   r   r   r/      s@    


zSMTPChannel.__init__c             C   s.   | j | _d | _g | _d| _d| _| d d S )NFr   s   
)COMMAND
smtp_statemailfromrcpttosrequire_SMTPUTF8	num_bytesset_terminator)r   r   r   r   _set_post_data_state   s    z SMTPChannel._set_post_data_statec             C   s   |    d| _g | _d S )Nr   )rT   received_datareceived_lines)r   r   r   r   r<      s    zSMTPChannel._set_rset_statec             C   s   t dtd | jS )NzTAccess to __server attribute on SMTPChannel is deprecated, use 'smtp_server' instead   )r   DeprecationWarningr0   )r   r   r   r   __server   s    zSMTPChannel.__serverc             C   s   t dtd || _d S )NzRSetting __server attribute on SMTPChannel is deprecated, set 'smtp_server' insteadrW   )r   rX   r0   )r   valuer   r   r   rY      s    c             C   s   t dtd | jS )NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadrW   )r   rX   rV   )r   r   r   r   __line   s    zSMTPChannel.__linec             C   s   t dtd || _d S )NzSSetting __line attribute on SMTPChannel is deprecated, set 'received_lines' insteadrW   )r   rX   rV   )r   rZ   r   r   r   r[      s    c             C   s   t dtd | jS )NzRAccess to __state attribute on SMTPChannel is deprecated, use 'smtp_state' insteadrW   )r   rX   rN   )r   r   r   r   __state   s    zSMTPChannel.__statec             C   s   t dtd || _d S )NzPSetting __state attribute on SMTPChannel is deprecated, set 'smtp_state' insteadrW   )r   rX   rN   )r   rZ   r   r   r   r\      s    c             C   s   t dtd | jS )NzXAccess to __greeting attribute on SMTPChannel is deprecated, use 'seen_greeting' insteadrW   )r   rX   r=   )r   r   r   r   
__greeting   s    zSMTPChannel.__greetingc             C   s   t dtd || _d S )NzVSetting __greeting attribute on SMTPChannel is deprecated, set 'seen_greeting' insteadrW   )r   rX   r=   )r   rZ   r   r   r   r]      s    c             C   s   t dtd | jS )NzSAccess to __mailfrom attribute on SMTPChannel is deprecated, use 'mailfrom' insteadrW   )r   rX   rO   )r   r   r   r   
__mailfrom   s    zSMTPChannel.__mailfromc             C   s   t dtd || _d S )NzQSetting __mailfrom attribute on SMTPChannel is deprecated, set 'mailfrom' insteadrW   )r   rX   rO   )r   rZ   r   r   r   r^      s    c             C   s   t dtd | jS )NzQAccess to __rcpttos attribute on SMTPChannel is deprecated, use 'rcpttos' insteadrW   )r   rX   rP   )r   r   r   r   	__rcpttos   s    zSMTPChannel.__rcpttosc             C   s   t dtd || _d S )NzOSetting __rcpttos attribute on SMTPChannel is deprecated, set 'rcpttos' insteadrW   )r   rX   rP   )r   rZ   r   r   r   r_      s    c             C   s   t dtd | jS )NzTAccess to __data attribute on SMTPChannel is deprecated, use 'received_data' insteadrW   )r   rX   rU   )r   r   r   r   __data   s    zSMTPChannel.__datac             C   s   t dtd || _d S )NzRSetting __data attribute on SMTPChannel is deprecated, set 'received_data' insteadrW   )r   rX   rU   )r   rZ   r   r   r   r`     s    c             C   s   t dtd | jS )NzKAccess to __fqdn attribute on SMTPChannel is deprecated, use 'fqdn' insteadrW   )r   rX   rA   )r   r   r   r   __fqdn
  s    zSMTPChannel.__fqdnc             C   s   t dtd || _d S )NzISetting __fqdn attribute on SMTPChannel is deprecated, set 'fqdn' insteadrW   )r   rX   rA   )r   rZ   r   r   r   ra     s    c             C   s   t dtd | jS )NzKAccess to __peer attribute on SMTPChannel is deprecated, use 'peer' insteadrW   )r   rX   rB   )r   r   r   r   __peer  s    zSMTPChannel.__peerc             C   s   t dtd || _d S )NzISetting __peer attribute on SMTPChannel is deprecated, set 'peer' insteadrW   )r   rX   rB   )r   rZ   r   r   r   rb     s    c             C   s   t dtd | jS )NzKAccess to __conn attribute on SMTPChannel is deprecated, use 'conn' insteadrW   )r   rX   r1   )r   r   r   r   __conn   s    zSMTPChannel.__connc             C   s   t dtd || _d S )NzISetting __conn attribute on SMTPChannel is deprecated, set 'conn' insteadrW   )r   rX   r1   )r   rZ   r   r   r   rc   %  s    c             C   s   t dtd | jS )NzKAccess to __addr attribute on SMTPChannel is deprecated, use 'addr' insteadrW   )r   rX   r2   )r   r   r   r   __addr+  s    zSMTPChannel.__addrc             C   s   t dtd || _d S )NzISetting __addr attribute on SMTPChannel is deprecated, set 'addr' insteadrW   )r   rX   r2   )r   rZ   r   r   r   rd   0  s    c             C   s&   t j| t|d | jrdnd d S )Nz
zutf-8ascii)r-   r.   rI   bytesrQ   )r   r   r   r   r   rI   7  s    
zSMTPChannel.pushc             C   s|   d }| j | jkr| j}n| j | jkr*| j}|r<| j|kr<d S |rR|  jt|7  _| jrl| j	t
|d n| j	| d S )Nzutf-8)rN   rM   r(   DATAr3   rR   lenr5   rV   appendstr)r   datalimitr   r   r   collect_incoming_data<  s    z!SMTPChannel.collect_incoming_datac             C   s  | j | j}tdt|td g | _| j| jkr| jd }| _|sT| 	d d S | j
sdt|d}|d}|dk r| }d }n$|d |  }||d d   }| jr| j| n| j}||kr| 	d d S t| d	| d }|s| 	d
|  d S || d S | j| jkr(| 	d d| _d S | jrR| j| jkrR| 	d d| _d S g }xJ|| jD ]:}	|	r|	d | jkr||	dd   n
||	 qdW | j|| _| j| j| j| jf}
i }| j
s| j| jd}| j j!|
|}| "  |s| 	d n
| 	| d S )NzData:)r   r   z500 Error: bad syntaxzutf-8 r    z500 Error: line too longZsmtp_z&500 Error: command "%s" not recognizedz451 Internal confusionz552 Error: Too much mail data)mail_optionsrcpt_optionsz250 OK)#r6   joinrV   r   rG   rH   rN   rM   rR   rI   r5   rj   findupperstripr>   r$   r'   getattrrg   r3   splitr7   r8   ri   r:   rU   rB   rO   rP   ro   rp   r0   process_messagerT   )r   lineZszicommandargZmax_szmethodrk   textrE   kwargsstatusr   r   r   found_terminatorL  sd    






zSMTPChannel.found_terminatorc             C   sH   |s|  d d S | jr&|  d d S |   || _|  d| j  d S )Nz501 Syntax: HELO hostnamez503 Duplicate HELO/EHLOz250 %s)rI   r=   r<   rA   )r   r{   r   r   r   	smtp_HELO  s    

zSMTPChannel.smtp_HELOc             C   s   |s|  d d S | jr&|  d d S |   || _d| _|  d| j  | jrr|  d| j  | jd  d7  < | js|  d | jr|  d	 | jd  d
7  < |  d d S )Nz501 Syntax: EHLO hostnamez503 Duplicate HELO/EHLOTz250-%sz250-SIZE %sMAIL   z250-8BITMIMEz250-SMTPUTF8
   z250 HELP)	rI   r=   r<   r>   rA   r3   r$   r5   r4   )r   r{   r   r   r   	smtp_EHLO  s&    



zSMTPChannel.smtp_EHLOc             C   s   |r|  d n
|  d d S )Nz501 Syntax: NOOPz250 OK)rI   )r   r{   r   r   r   	smtp_NOOP  s    zSMTPChannel.smtp_NOOPc             C   s   |  d |   d S )Nz221 Bye)rI   Zclose_when_done)r   r{   r   r   r   	smtp_QUIT  s    
zSMTPChannel.smtp_QUITc             C   s0   t |}|d |  |kr,||d   S dS )Nr   )rh   rs   rt   )r   keywordr{   Zkeylenr   r   r   _strip_command_keyword  s    z"SMTPChannel._strip_command_keywordc             C   sF   |sdS |  dr$t|\}}nt|\}}|s<||fS |j|fS )N)r   r   <)lstrip
startswithr   r   Z	addr_spec)r   r{   addressrestr   r   r   _getaddr  s    zSMTPChannel._getaddrc             C   sJ   i }x@|D ]8}| d\}}}| r.|r2|s2d S |r:|nd||< q
W |S )N=T)	partitionisalnum)r   paramsresultZparameqrZ   r   r   r   
_getparams  s    
zSMTPChannel._getparamsc             C   s  |rd}|  }|dkr$| d q|dkr8| d q|dkr^d}| jrR||7 }| | q|dkrd	}| jrx||7 }| | q|d
kr| d q|dkr| d q|dkr| d q|dkr| d q|dkr| d q| d n
| d d S )Nz [SP <mail-parameters>]ZEHLOz250 Syntax: EHLO hostnameZHELOz250 Syntax: HELO hostnamer   z 250 Syntax: MAIL FROM: <address>ZRCPTz250 Syntax: RCPT TO: <address>rg   z250 Syntax: DATAZRSETz250 Syntax: RSETZNOOPz250 Syntax: NOOPZQUITz250 Syntax: QUITZVRFYz250 Syntax: VRFY <address>zD501 Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFYzD250 Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)rs   rI   r>   )r   r{   ZextendedZlc_argr   r   r   r   	smtp_HELP  s:    zSMTPChannel.smtp_HELPc             C   s@   |r2|  |\}}|r"| d q<| d|  n
| d d S )NzB252 Cannot VRFY user, but will accept message and attempt deliveryz502 Could not VRFY %sz501 Syntax: VRFY <address>)r   rI   )r   r{   r   r   r   r   r   	smtp_VRFY  s    zSMTPChannel.smtp_VRFYc             C   s  | j s| d d S td|td d}| jr4|d7 }|d krJ| | d S | d|}| |\}}|sv| | d S | js|r| | d S | jr| d d S | 	 | _
| | j
}|d kr| | d S | js|dd	}|d
kr| d d S | jr8|dd}|dkr d| _n|dk	r8| d d S |dd }|r| sb| | d S | jrt|| jkr| d d S t| dkr| d d S || _td| jtd | d d S )Nz503 Error: send HELO firstz	===> MAIL)r   z 501 Syntax: MAIL FROM: <address>z [SP <mail-parameters>]zFROM:z503 Error: nested MAIL commandZBODY7BIT)r   Z8BITMIMEz1501 Error: BODY can only be one of 7BIT, 8BITMIMEZSMTPUTF8FTz&501 Error: SMTPUTF8 takes no argumentsZSIZEz:552 Error: message size exceeds fixed maximum message sizer   z:555 MAIL FROM parameters not recognized or not implementedzsender:z250 OK)r=   rI   r   rH   r>   r   r   rO   rs   rv   ro   r   r5   popr4   rQ   isdigitr3   intrh   keys)r   r{   	syntaxerrr   r   Zbodysmtputf8sizer   r   r   	smtp_MAIL  sh    














zSMTPChannel.smtp_MAILc             C   s  | j s| d d S td|td | js6| d d S d}| jrH|d7 }|d kr^| | d S | d|}| |\}}|s| | d S | js|r| | d S | 	 | _
| | j
}|d kr| | d S t| dkr| d	 d S | j| td
| jtd | d d S )Nz503 Error: send HELO firstz	===> RCPT)r   z503 Error: need MAIL commandz501 Syntax: RCPT TO: <address>z [SP <mail-parameters>]zTO:r   z8555 RCPT TO parameters not recognized or not implementedzrecips:z250 OK)r=   rI   r   rH   rO   r>   r   r   rs   rv   rp   r   rh   r   rP   ri   )r   r{   r   r   r   r   r   r   	smtp_RCPT7  s@    







zSMTPChannel.smtp_RCPTc             C   s(   |r|  d d S |   |  d d S )Nz501 Syntax: RSETz250 OK)rI   r<   )r   r{   r   r   r   	smtp_RSETZ  s
    
zSMTPChannel.smtp_RSETc             C   sZ   | j s| d d S | js(| d d S |r:| d d S | j| _| d | d d S )Nz503 Error: send HELO firstz503 Error: need RCPT commandz501 Syntax: DATAs   
.
z#354 End data with <CR><LF>.<CR><LF>)r=   rI   rP   rg   rN   rS   )r   r{   r   r   r   	smtp_DATAa  s    



zSMTPChannel.smtp_DATAc             C   s   |  d d S )Nz502 EXPN not implemented)rI   )r   r{   r   r   r   	smtp_EXPNp  s    zSMTPChannel.smtp_EXPN),r   r   r   rM   rg   r'   collectionsdefaultdictr$   propertyr(   DATA_SIZE_DEFAULTr/   rT   r<   Z_SMTPChannel__serversetterZ_SMTPChannel__lineZ_SMTPChannel__stateZ_SMTPChannel__greetingZ_SMTPChannel__mailfromZ_SMTPChannel__rcpttosZ_SMTPChannel__dataZ_SMTPChannel__fqdnZ_SMTPChannel__peerZ_SMTPChannel__connZ_SMTPChannel__addrrI   rm   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   w   s`   &	>#6#c               @   s2   e Zd ZeZedddfddZdd Zdd ZdS )	r   NFc             C   s   || _ || _|| _|| _|| _|r.|r.tdtjj| |d yNt	j
|dt	ji}| |d d |d d  |   | | | d W n   |    Y n(X td| jjtt ||f td d S )	NzFdecode_data and enable_SMTPUTF8 cannot be set to True at the same time)r)   typer   r       z0%s started at %s
	Local addr: %s
	Remote addr:%s)r   )Z
_localaddr_remoteaddrr3   r4   r5   r&   asyncore
dispatcherr/   r@   ZgetaddrinfoZSOCK_STREAMZcreate_socketZset_reuse_addrZbindZlistenrD   r   	__class__r   timectimerH   )r   Z	localaddrZ
remoteaddrr3   r)   r4   rK   Zgai_resultsr   r   r   r/   x  s*    

zSMTPServer.__init__c          	   C   s6   t dt| td | | ||| j| j| j| j}d S )NzIncoming connection from %s)r   )r   rG   rH   channel_classr3   Z_mapr4   r5   )r   r1   r2   Zchannelr   r   r   handle_accepted  s    zSMTPServer.handle_acceptedc             K   s   t d S )N)NotImplementedError)r   rB   rO   rP   rk   r~   r   r   r   rw     s    zSMTPServer.process_message)	r   r   r   r   r   r   r/   r   rw   r   r   r   r   r   t  s
   c               @   s   e Zd Zdd Zdd ZdS )r   c             C   sp   d}|  }x^|D ]V}|rN|sNd|d  }t|tsBt|d}t| d}t|ts`t|}t| qW d S )Nr    zX-Peer: r   zutf-8)
splitlines
isinstancerj   rG   encoder   )r   rB   rk   Z	inheaderslinesrx   Z
peerheaderr   r   r   _print_message_content  s    


z&DebuggingServer._print_message_contentc             K   sX   t d |r@|dr&t d|d   |dr@t d|d   | || t d d S )Nz%---------- MESSAGE FOLLOWS ----------ro   zmail options: %srp   zrcpt options: %s
z%------------ END MESSAGE ------------)r   getr   )r   rB   rO   rP   rk   r~   r   r   r   rw     s    

zDebuggingServer.process_messageN)r   r   r   r   rw   r   r   r   r   r     s   c                   s,   e Zd Z fddZdd Zdd Z  ZS )r   c                s.   d|kr|d rt dtt| j|| d S )Nr4   z$PureProxy does not support SMTPUTF8.)r&   superr   r/   )r   rE   r~   )r   r   r   r/     s    zPureProxy.__init__c       	      C   sh   | d}d}x|D ]}|sP |d7 }qW ||d|d   t|}| |||}td|td d S )Nr   r   r    z
X-Peer: %szwe got some refusals:)r   )rv   insertr9   rq   _deliverr   rH   )	r   rB   rO   rP   rk   r   ry   rx   refusedr   r   r   rw     s    


zPureProxy.process_messagec          
   C   s   dd l }i }yB| }|| jd | jd  z||||}W d |  X W n |jk
r } ztdtd |j	}W d d }~X Y nj t
|jfk
r } zFtd|jtd t|dd}t|dd	}	x|D ]}
||	f||
< qW W d d }~X Y nX |S )
Nr   r    zgot SMTPRecipientsRefused)r   ZgotZ	smtp_codeZ
smtp_errorignore)smtplibZSMTPZconnectr   ZsendmailquitZSMTPRecipientsRefusedr   rH   Z
recipientsrC   ZSMTPExceptionr   ru   )r   rO   rP   rk   r   r   seZerrcodeerrmsgrr   r   r   r     s$    
"zPureProxy._deliver)r   r   r   r/   rw   r   __classcell__r   r   )r   r   r     s   c                   s$   e Zd Z fddZdd Z  ZS )r	   c                s.   d|kr|d rt dtt| j|| d S )Nr4   z'MailmanProxy does not support SMTPUTF8.)r&   r   r   r/   )r   rE   r~   )r   r   r   r/     s    zMailmanProxy.__init__c             C   s8  ddl m} ddlm} ddlm} ddlm} g }	x||D ]t}
|
 dd }|d}t|dkrhq:|d }t|dkr|d	 }nd
}|	|r:|dkrq:|	
|
||f q:W x|	D ]\}
}}||
 qW tdd|td |r| |||}td|td i }||}||}|ds0||d< |dsNtt |d< x|	D ]\}
}}td|
td ||}|s|j|dd}|||< |d
kr|j|d	d n|dkr|j|d	d nh|dkr|j|d	d nN|dkr|j|d	d n4|dkrT|dkrd|d < nd!|d < |j|d	d qTW d S )"Nr   )StringIO)Utils)Message)MailList@-rW   r    r   )r   adminownerrequestrq   leavezforwarding recips:rn   )r   zwe got refusals:fromZFromZdateZDatezsending message to)lock)tolistr   )Ztoadminr   )Ztoownerr   )Z	torequest)rq   r   rq   Z	subscribeZSubjectZunsubscribe)ior   ZMailmanr   r   r   lowerrv   rh   Zlist_existsri   remover   rq   rH   r   r   r   r   ZEnqueue)r   rB   rO   rP   rk   r   r   r   r   Z	listnamesZrcptZlocalpartsZlistnamerz   r   Zmlistsr   r   Zmlistr   r   r   rw     sd    











zMailmanProxy.process_message)r   r   r   r/   rw   r   r   r   )r   r   r	     s   c               @   s   e Zd ZdZdZdZdZdS )OptionsTr   NF)r   r   r   setuid	classname
size_limitr4   r   r   r   r   r   _  s   r   c        
      C   st  y.t  tjdd  dddddddd	g\} }W n. t jk
r\ } ztd| W d d }~X Y nX t }x| D ]\}}|d
krtd qj|dkrtt td qj|dkrd|_	qj|dkr||_
qj|dkrtjaqj|dkrd|_qj|dkrjyt|}||_W qj   td| tjd td Y qjX qjW t|dk r@d}d}nPt|dk r\|d }d}n4t|dk r||d }|d }ntddt|  |d}	|	dk rtdd|  |d |	 |_yt||	d d  |_W n$ tk
r   tdd|  Y nX |d}	|	dk r"tdd|  |d |	 |_yt||	d d  |_W n$ tk
rn   tdd|  Y nX |S ) Nr    z	nVhc:s:duzclass=Znosetuidversionhelpzsize=debugr   )z-hz--helpr   )z-Vz	--version)z-nz
--nosetuidF)z-cz--class)z-dz--debug)z-uz
--smtputf8T)z-sz--sizezInvalid size: )r   zlocalhost:8025zlocalhost:25rW      zInvalid arguments: %s:zBad local spec: %szBad local port: %szBad remote spec: %szBad remote port: %s)getoptr   argverrorr   r   r   rJ   r   r   r   r   rH   r4   r   r   rh   
COMMASPACErq   rr   	localhost	localportr&   
remotehost
remoteport)
ZoptsrE   r   optionsoptr{   Zint_sizeZ	localspecZ
remotespecry   r   r   r   	parseargsf  sp    






r   __main__r*   r    )r4   z7Cannot import module "pwd"; try running with -n option.)r   nobodyrW   z3Cannot setuid "nobody"; try running with -n option.)r   )?r   osrF   r   r   r@   r   r-   r   warningsr   Zemail._header_value_parserr   r   __all__r   ZprogramrJ   r
   rH   r9   r   r   r   r.   r   r   r   r   r   r	   r   r   r   r   r   rfindZlastdot
__import__r   localsmodr   ru   class_r   r   r   r   r   r4   proxyr   pwdImportErrorr   r   r   getpwnamr   PermissionErrorZloopKeyboardInterruptr   r   r   r   <module>P   sv   

    M-SB




