
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,a¢‡  ã                   @   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�r2zd dl5Z5W n. e6k
�rä   e7de j8d � e  9d¡ Y nX e5 :d!¡d" Z;ze 4e;¡ W n. e<k
�r0   e7d#e j8d � e  9d¡ Y nX z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   ú*/opt/alt/python38/lib64/python3.8/smtpd.pyÚwritef   ó    zDevnull.writec                 C   s   d S r   r   ©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 r   r   )Úxr   r   r   Ú<lambda>|   r   zSMTPChannel.<lambda>c                 C   s0   zt | j ¡ ƒW S  tk
r*   | j Y S X d S r   )ÚmaxÚcommand_size_limitsÚvaluesÚ
ValueErrorÚcommand_size_limitr   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 ¡ | _z| ¡ | _W nB tk
rø } z$|  ¡  |jd tjkrâ‚ W Y ¢d S d }~X Y nX tdt | jƒt!d� |  "d| jt#f ¡ d S )N©ÚmapúFdecode_data and enable_SMTPUTF8 cannot be set to True at the same timer   ú
Ú.r   ó   
ó   .ó   
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serverr9   r:   r;   r.   r<   Údecode_dataÚerrr   r   r   r7   …   s@    


zSMTPChannel.__init__c                 C   s.   | j | _d | _g | _d| _d| _|  d¡ d S )NFr   r2   )ÚCOMMANDÚ
smtp_stateÚmailfromÚrcpttosÚrequire_SMTPUTF8Ú	num_bytesÚset_terminatorr   r   r   r   Ú_set_post_data_state¬   s    z SMTPChannel._set_post_data_statec                 C   s   |   ¡  d| _g | _d S ©Nr   )r\   Úreceived_dataÚreceived_linesr   r   r   r   rD   µ   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   ÚDeprecationWarningr8   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' insteadr`   ra   ©r   Úvaluer   r   r   rc   Â   s
     ÿc                 C   s   t dtdƒ | jS )NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadr`   ©r   rb   r_   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' insteadr`   rf   rd   r   r   r   rg   Í   s
     ÿc                 C   s   t dtdƒ | jS )NzRAccess to __state attribute on SMTPChannel is deprecated, use 'smtp_state' insteadr`   ©r   rb   rV   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' insteadr`   rh   rd   r   r   r   ri   Ø   s
     ÿc                 C   s   t dtdƒ | jS )NzXAccess to __greeting attribute on SMTPChannel is deprecated, use 'seen_greeting' insteadr`   ©r   rb   rE   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' insteadr`   rj   rd   r   r   r   rk   ã   s
     ÿc                 C   s   t dtdƒ | jS )NzSAccess to __mailfrom attribute on SMTPChannel is deprecated, use 'mailfrom' insteadr`   ©r   rb   rW   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' insteadr`   rl   rd   r   r   r   rm   î   s
     ÿc                 C   s   t dtdƒ | jS )NzQAccess to __rcpttos attribute on SMTPChannel is deprecated, use 'rcpttos' insteadr`   ©r   rb   rX   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' insteadr`   rn   rd   r   r   r   ro   ù   s
     ÿc                 C   s   t dtdƒ | jS )NzTAccess to __data attribute on SMTPChannel is deprecated, use 'received_data' insteadr`   ©r   rb   r^   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' insteadr`   rp   rd   r   r   r   rq     s
     ÿc                 C   s   t dtdƒ | jS )NzKAccess to __fqdn attribute on SMTPChannel is deprecated, use 'fqdn' insteadr`   ©r   rb   rI   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' insteadr`   rr   rd   r   r   r   rs     s
     ÿc                 C   s   t dtdƒ | jS )NzKAccess to __peer attribute on SMTPChannel is deprecated, use 'peer' insteadr`   ©r   rb   rJ   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' insteadr`   rt   rd   r   r   r   ru     s
     ÿc                 C   s   t dtdƒ | jS )NzKAccess to __conn attribute on SMTPChannel is deprecated, use 'conn' insteadr`   ©r   rb   r9   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' insteadr`   rv   rd   r   r   r   rw   %  s
     ÿc                 C   s   t dtdƒ | jS )NzKAccess to __addr attribute on SMTPChannel is deprecated, use 'addr' insteadr`   ©r   rb   r:   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' insteadr`   rx   rd   r   r   r   ry   0  s
     ÿc                 C   s&   t j | t|d | jrdndƒ¡ d S )Nr0   úutf-8Úascii)r5   r6   rQ   ÚbytesrY   r   r   r   r   rQ   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 )Nrz   )rV   rU   r,   ÚDATAr;   rZ   Úlenr=   r_   Ú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 }| | j¡D ]:}	|	�r�|	d | jk�r�| |	dd … ¡ n
| |	¡ �qb| 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 syntaxrz   ú 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_optionsú250 OK)#r>   Újoinr_   r   rO   rP   rV   rU   rZ   rQ   r=   r€   ÚfindÚupperÚstriprF   r(   r+   Úgetattrr}   r;   Úsplitr?   r@   r   rB   r^   rJ   rW   rX   r…   r†   r8   Úprocess_messager\   )r   ÚlineZszÚiÚcommandÚargZmax_szÚmethodr�   ÚtextrM   ÚkwargsZstatusr   r   r   Úfound_terminatorL  sl    


ÿÿ


þzSMTPChannel.found_terminatorc                 C   sH   |s|   d¡ d S | jr&|   d¡ d S |  ¡  || _|   d| j ¡ d S )Nz501 Syntax: HELO hostnameú503 Duplicate HELO/EHLOz250 %s)rQ   rE   rD   rI   ©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 hostnamer—   Tz250-%sz250-SIZE %sÚMAILé   z250-8BITMIMEz250-SMTPUTF8é
   z250 HELP)	rQ   rE   rD   rF   rI   r;   r(   r=   r<   r˜   r   r   r   Ú	smtp_EHLO–  s&    



zSMTPChannel.smtp_EHLOc                 C   s   |r|   d¡ n
|   d¡ d S )Nz501 Syntax: NOOPr‡   ©rQ   r˜   r   r   r   Ú	smtp_NOOP¬  s    zSMTPChannel.smtp_NOOPc                 C   s   |   d¡ |  ¡  d S )Nz221 Bye)rQ   Zclose_when_doner˜   r   r   r   Ú	smtp_QUIT²  s    
zSMTPChannel.smtp_QUITc                 C   s0   t |ƒ}|d |…  ¡ |kr,||d …  ¡ S dS r]   )r~   rŠ   r‹   )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   sH   i }|D ]:}|  d¡\}}}| ¡ r,|r2|s2 d S |r:|nd||< q|S )Nú=T)Ú	partitionÚisalnum)r   ÚparamsÚresultZparamÚeqre   r   r   r   Ú
_getparamsÈ  s    zSMTPChannel._getparamsc                 C   s  |rôd}|  ¡ }|dkr$|  d¡ qþ|dkr8|  d¡ qþ|dkr^d}| jrR||7 }|  |¡ qþ|dkr„d	}| 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 )Nú [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>r}   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)rŠ   rQ   rF   )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¨   rQ   )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�rˆt|ƒ| jk�rˆ|  d¡ d S t| ¡ ƒdk�r¨|  d¡ d S || _td| jtd� |  d¡ d S )Nú503 Error: send HELO firstz	===> MAILr   z 501 Syntax: MAIL FROM: <address>r°   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:r‡   )rE   rQ   r   rP   rF   r¢   r¨   rW   rŠ   r�   r…   r¯   r=   Úpopr<   rY   Úisdigitr;   Úintr~   Ú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 )Nr³   z	===> RCPTr   z503 Error: need MAIL commandz501 Syntax: RCPT TO: <address>r°   zTO:r   z8555 RCPT TO parameters not recognized or not implementedzrecips:r‡   )rE   rQ   r   rP   rW   rF   r¢   r¨   rŠ   r�   r†   r¯   r~   r¸   rX   r   )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: RSETr‡   )rQ   rD   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 )Nr³   z503 Error: need RCPT commandz501 Syntax: DATAs   
.
z#354 End data with <CR><LF>.<CR><LF>)rE   rQ   rX   r}   rV   r[   r˜   r   r   r   Ú	smtp_DATAa  s    



zSMTPChannel.smtp_DATAc                 C   s   |   d¡ d S )Nz502 EXPN not implementedrž   r˜   r   r   r   Ú	smtp_EXPNp  s    zSMTPChannel.smtp_EXPN),r   r   r   rU   r}   r+   ÚcollectionsÚdefaultdictr(   Úpropertyr,   ÚDATA_SIZE_DEFAULTr7   r\   rD   Z_SMTPChannel__serverÚsetterZ_SMTPChannel__lineZ_SMTPChannel__stateZ_SMTPChannel__greetingZ_SMTPChannel__mailfromZ_SMTPChannel__rcpttosZ_SMTPChannel__dataZ_SMTPChannel__fqdnZ_SMTPChannel__peerZ_SMTPChannel__connZ_SMTPChannel__addrrQ   rƒ   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� zNt	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 )	Nr/   r-   Útyper   r$   é   z0%s started at %s
	Local addr: %s
	Remote addr:%sr   )Z
_localaddrÚ_remoteaddrr;   r<   r=   r*   ÚasyncoreÚ
dispatcherr7   rH   ZgetaddrinfoZSOCK_STREAMZcreate_socketZset_reuse_addrZbindZlistenrL   r   Ú	__class__r   ÚtimeÚctimerP   )r   Z	localaddrZ
remoteaddrr;   r.   r<   rS   Zgai_resultsr   r   r   r7   x  s6    ÿ
  þþzSMTPServer.__init__c              	   C   s6   t dt|ƒ td� |  | ||| j| j| j| j¡}d S )NzIncoming connection from %sr   )r   rO   rP   Úchannel_classr;   Ú_mapr<   r=   )r   r9   r:   Zchannelr   r   r   Úhandle_accepted”  s    úzSMTPServer.handle_acceptedc                 K   s   t ‚d S r   )ÚNotImplementedError©r   rJ   rW   rX   r�   r•   r   r   r   rŽ   Ÿ  s    zSMTPServer.process_message)	r   r   r   r   rÎ   rÄ   r7   rÐ   rŽ   r   r   r   r   r   t  s     þ
c                   @   s   e Zd Zdd„ Zdd„ ZdS )r   c                 C   sl   d}|  ¡ }|D ]V}|rL|sLd|d  }t|tƒs@t| d¡ƒ}t|ƒ d}t|tƒs^t|ƒ}t|ƒ qd S )Nr$   zX-Peer: r   rz   )Ú
splitlinesÚ
isinstancer€   rO   Úencoder   )r   rJ   r�   Z	inheadersÚlinesr�   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 ----------r…   zmail options: %sr†   zrcpt options: %s
z%------------ END MESSAGE ------------)r   Úgetr×   rÒ   r   r   r   rŽ   Ô  s    

zDebuggingServer.process_messageN)r   r   r   r×   rŽ   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 )Nr<   z$PureProxy does not support SMTPUTF8.©r*   Úsuperr   r7   ©r   rM   r•   ©rË   r   r   r7   à  s    zPureProxy.__init__c           	      C   sf   |  d¡}d}|D ]}|s q(|d7 }q| |d|d  ¡ t |¡}|  |||¡}td|td� d S )Nr   r   r$   z
X-Peer: %szwe got some refusals:r   )r�   ÚinsertrA   rˆ   Ú_deliverr   rP   )	r   rJ   rW   rX   r�   rÖ   r�   r�   Úrefusedr   r   r   rŽ   å  s    


zPureProxy.process_messagec              
   C   sî   dd l }i }zB| ¡ }| | jd | jd ¡ z| |||¡}W 5 | ¡  X W nš |jk
r„ } ztdtd� |j	}W 5 d }~X Y nf t
|jfk
rè } zBtd|jtd� t|ddƒ}t|dd	ƒ}	|D ]}
||	f||
< qÆW 5 d }~X Y nX |S )
Nr   r$   zgot SMTPRecipientsRefusedr   ZgotZ	smtp_codeéÿÿÿÿZ
smtp_errorÚignore)ÚsmtplibZSMTPZconnectrÈ   ÚquitZsendmailZSMTPRecipientsRefusedr   rP   Z
recipientsrK   ZSMTPExceptionrË   rŒ   )r   rW   rX   r�   râ   rß   ÚsÚeZerrcodeÚerrmsgÚrr   r   r   rÞ   ó  s$     zPureProxy._deliver)r   r   r   r7   rŽ   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 )Nr<   z'MailmanProxy does not support SMTPUTF8.rÙ   rÛ   rÜ   r   r   r7     s    zMailmanProxy.__init__c                 C   s*  ddl m} ddlm} ddlm} ddlm} g }	|D ]t}
|
 ¡  d¡d }| d¡}t|ƒdkrfq8|d }t|ƒdkr„|d	 }nd
}| 	|¡r8|dkrœq8|	 
|
||f¡ q8|	D ]\}
}}| |
¡ q²tdd |¡td� |rü|  |||¡}td|td� i }||ƒ}| |¡}| d¡�s&||d< | d¡�sDt t ¡ ¡|d< |	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�rH|dk�rd|d < nd!|d < |j|d	d� �qHd S )"Nr   )ÚStringIO)ÚUtils)ÚMessage)ÚMailListú@ú-r`   r$   r   )r   ÚadminÚownerÚrequestrˆ   Úleavezforwarding recips:r„   r   zwe got refusals:ÚfromZFromÚdateZDatezsending message to)Úlock)Útolistrï   )Ztoadminrð   )Ztoownerrñ   )Z	torequest)rˆ   rò   rˆ   Z	subscribeZSubjectZunsubscribe)Úioré   ZMailmanrê   rë   rì   Úlowerr�   r~   Zlist_existsr   Úremover   rˆ   rP   rÞ   rØ   rÌ   rÍ   ZEnqueue)r   rJ   rW   rX   r�   ré   rê   rë   rì   Z	listnamesZrcptZlocalÚpartsZlistnamer‘   rß   Zmlistsrä   r   Zmlistr   r   r   rŽ     sb    










zMailmanProxy.process_message)r   r   r   r7   rŽ   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_limitr<   r   r   r   r   rû   _  s   rû   c            
      C   sp  z.t   tjdd … dddddddd	g¡\} }W n. t jk
r\ } ztd|ƒ W 5 d }~X Y nX tƒ }| D ]º\}}|d
kr‚tdƒ qh|dkržttƒ t d¡ qh|dkr®d|_	qh|dkr¾||_
qh|dkrÎtjaqh|dkrÞd|_qh|dkrhzt|ƒ}||_W qh   td| tjd� t d¡ Y qhX qht|ƒdk �r<d}d}nPt|ƒdk �rX|d }d}n4t|ƒdk �rx|d }|d }ntddt |¡ ƒ | d¡}	|	dk �r®tdd| ƒ |d |	… |_zt||	d d … ƒ|_W n$ tk
�rú   tdd| ƒ Y nX | d¡}	|	dk �rtdd| ƒ |d |	… |_zt||	d d … ƒ|_W n$ tk
�rj   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:25r`   é   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   rR   r!   rü   rý   r    rP   r<   r·   rþ   r~   Ú
COMMASPACErˆ   r‰   Ú	localhostÚ	localportr*   Ú
remotehostÚ
remoteport)
ZoptsrM   rå   ÚoptionsÚoptr’   Zint_sizeZ	localspecZ
remotespecr�   r   r   r   Ú	parseargsf  sv     ÿþ






r  Ú__main__r1   r$   )r<   z7Cannot import module "pwd"; try running with -n option.r   Únobodyr`   z3Cannot setuid "nobody"; try running with -n option.)r   )?r   ÚosrN   r  rÌ   rH   rÉ   r5   rÁ   Úwarningsr   Zemail._header_value_parserr   r   Ú__all__r  ZprogramrR   r
   rP   rA   r  rÄ   r#   r6   r   rÊ   r   r   r   r	   rû   r  r   r  rý   ÚrfindZlastdotÚ
__import__r   ÚlocalsÚmodr  rŒ   Zclass_r  r	  r
  r  rþ   r<   Úproxyrü   ÚpwdÚImportErrorr   r    r!   Úgetpwnamr  ÚPermissionErrorZloopÚKeyboardInterruptr   r   r   r   Ú<module>P   s‚      þ

    M-SB




 þ