???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................
]"                 @   s  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 g Z e  j d  Z d Z Gd	 d
   d
  Z e   a d Z d Z d Z d d d  Z Gd d   d e j  Z Gd d   d e j  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d  Z d d   Z  e! d k re    Z" e" j# Z# d e# k re# j$ 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" j0 f e" j1 d e" j2 Z3 e" j4 ry d  d l5 Z5 Wn2 e6 k
 re7 d d  e  j8 e  j9 d  Yn Xe5 j: d!  d" Z; y e j4 e;  Wn2 e< k
 re7 d# d  e  j8 e  j9 d  Yn Xy e j=   Wn e> k
 rYn Xd S)$    N)warn)get_addr_specget_angle_addr
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/python35/lib64/python3.5/smtpd.pywritec   s    zDevnull.writec             C   s   d  S)Nr
   )r   r
   r
   r   flushd   s    zDevnull.flushN)__name__
__module____qualname__r   r   r
   r
   r
   r   r	   b   s   r	   
z, i    c             C   sD   t  t t   d t j | r3 t  | d t j t j |   d  S)Nfile)print__doc__globalssysstderrexit)coder   r
   r
   r   usagem   s    r   c               @   s  e  Z d  Z d Z d Z d Z e j e d d   Z e	 d d    Z
 e d d	 d 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 d0 d/    Z d1 d2   Z d3 d4   Z d5 d6   Z d7 d8   Z d9 d:   Z d; d<   Z  d= d>   Z! d? d@   Z" dA dB   Z# dC dD   Z$ dE dF   Z% dG dH   Z& dI dJ   Z' dK dL   Z( dM dN   Z) dO dP   Z* dQ dR   Z+ d S)SSMTPChannelr      i   c             C   s   |  S)Nr
   )xr
   r
   r   <lambda>y   s    zSMTPChannel.<lambda>c             C   s7   y t  |  j j    SWn t k
 r2 |  j SYn Xd  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 | | |  _ | |  _ | |  _ | |  _ | |  _ | rd | r^ t d   d } | d  k r t	 d t
 d  d } | |  _ | r d |  _ d |  _ d	 |  _ t |  _ n* d
 |  _ d |  _ t d  |  _ d |  _ |  j   d |  _ d |  _ |  j j   t j   |  _ y | j   |  _ WnL t k
 r} z, |  j   | j d t j  k ri  d  SWYd  d  } ~ Xn Xt! d t" |  j  d t# |  j$ d |  j t% f  d  S)NmapzFdecode_data and enable_SMTPUTF8 cannot be set to True at the same timeFzgThe decode_data default of True will change to False in 3.6; specify an explicit value for this keyword   Tr   z
.    s   
   .s   
r   zPeer:r   z	220 %s %s)&asynchat
async_chat__init__smtp_serverconnaddrdata_size_limitenable_SMTPUTF8r%   r   DeprecationWarning_decode_data_emptystring_linesep_dotsepNEWLINE_newlineord_set_rset_stateseen_greetingextended_smtpr#   clearsocketgetfqdnfqdngetpeernamepeerOSErrorcloseargserrnoZENOTCONNr   reprDEBUGSTREAMpush__version__)	r   Zserverr1   r2   r3   r(   r4   decode_dataerrr
   r
   r   r/      sL    					
							
		
zSMTPChannel.__init__c             C   sA   |  j  |  _ d  |  _ g  |  _ d |  _ d |  _ |  j 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    |  j    d |  _ g  |  _ d  S)Nr   )rW   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' insteadr)   )r   r5   r0   )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)   )r   r5   r0   )r   valuer
   r
   r   rZ      s    
c             C   s   t  d t d  |  j S)NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadr)   )r   r5   rY   )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)   )r   r5   rY   )r   r[   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' insteadr)   )r   r5   rQ   )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)   )r   r5   rQ   )r   r[   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' insteadr)   )r   r5   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' insteadr)   )r   r5   r>   )r   r[   r
   r
   r   r^      s    
c             C   s   t  d t d  |  j S)NzSAccess to __mailfrom attribute on SMTPChannel is deprecated, use 'mailfrom' insteadr)   )r   r5   rR   )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)   )r   r5   rR   )r   r[   r
   r
   r   r_      s    
c             C   s   t  d t d  |  j S)NzQAccess to __rcpttos attribute on SMTPChannel is deprecated, use 'rcpttos' insteadr)   )r   r5   rS   )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)   )r   r5   rS   )r   r[   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' insteadr)   )r   r5   rX   )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)   )r   r5   rX   )r   r[   r
   r
   r   ra     s    
c             C   s   t  d t d  |  j S)NzKAccess to __fqdn attribute on SMTPChannel is deprecated, use 'fqdn' insteadr)   )r   r5   rC   )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)   )r   r5   rC   )r   r[   r
   r
   r   rb     s    
c             C   s   t  d t d  |  j S)NzKAccess to __peer attribute on SMTPChannel is deprecated, use 'peer' insteadr)   )r   r5   rE   )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)   )r   r5   rE   )r   r[   r
   r
   r   rc     s    
c             C   s   t  d t d  |  j S)NzKAccess to __conn attribute on SMTPChannel is deprecated, use 'conn' insteadr)   )r   r5   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' insteadr)   )r   r5   r1   )r   r[   r
   r
   r   rd   )  s    
c             C   s   t  d t d  |  j S)NzKAccess to __addr attribute on SMTPChannel is deprecated, use 'addr' insteadr)   )r   r5   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' insteadr)   )r   r5   r2   )r   r[   r
   r
   r   re   4  s    
c             C   s3   t  j j |  t | d |  j r% d n d   d  S)Nz
zutf-8ascii)r-   r.   rL   bytesrT   )r   r   r
   r
   r   rL   ;  s    zSMTPChannel.pushc             C   s   d  } |  j  |  j k r$ |  j } n |  j  |  j k r? |  j } | rX |  j | k rX d  S| rs |  j t |  7_ |  j r |  j j	 t
 | d   n |  j j	 |  d  S)Nzutf-8)rQ   rP   r'   DATAr3   rU   lenr6   rY   appendstr)r   datalimitr
   r
   r   collect_incoming_data@  s    		z!SMTPChannel.collect_incoming_datac             C   s  |  j  j |  j  } t d t |  d t g  |  _ |  j |  j k rf|  j d } |  _ | ss |  j	 d  d  S|  j
 s t | d  } | j d  } | d k  r | j   } d  } n0 | d  |  j   } | | d d   j   } |  j r|  j | n |  j } | | k r'|  j	 d  d  St |  d	 | d   } | sX|  j	 d
 |  d  S| |  d  S|  j |  j k r|  j	 d  d |  _ d  S|  j r|  j |  j k r|  j	 d  d |  _ d  Sg  } xZ | j |  j  D]F }	 |	 r|	 d |  j k r| j |	 d d    q| j |	  qW|  j j |  |  _ |  j |  j |  j |  j f }
 i  } |  j
 sd |  j d |  j i } |  j  j! |
 |   } |  j"   | s|  j	 d  n |  j	 |  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)#r7   joinrY   r   rJ   rK   rQ   rP   rU   rL   r6   rk   findupperstripr?   r#   r&   getattrrh   r3   splitr8   r9   rj   r;   rX   rE   rR   rS   rp   rq   r0   process_messagerW   )r   lineZszicommandargZmax_szmethodrl   textrH   kwargsstatusr
   r
   r   found_terminatorP  sd    			
				
zSMTPChannel.found_terminatorc             C   s\   | s |  j  d  d  S|  j r1 |  j  d  d  S|  j   | |  _ |  j  d |  j  d  S)Nz501 Syntax: HELO hostnamez503 Duplicate HELO/EHLOz250 %s)rL   r>   r=   rC   )r   r|   r
   r
   r   	smtp_HELO  s    	
	zSMTPChannel.smtp_HELOc             C   s   | s |  j  d  d  S|  j r1 |  j  d  d  S|  j   | |  _ d |  _ |  j  d |  j  |  j r |  j  d |  j  |  j d d 7<|  j s |  j  d  |  j r |  j  d	  |  j d d
 7<|  j  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)	rL   r>   r=   r?   rC   r3   r#   r6   r4   )r   r|   r
   r
   r   	smtp_EHLO  s&    	
					zSMTPChannel.smtp_EHLOc             C   s'   | r |  j  d  n |  j  d  d  S)Nz501 Syntax: NOOPz250 OK)rL   )r   r|   r
   r
   r   	smtp_NOOP  s    zSMTPChannel.smtp_NOOPc             C   s   |  j  d  |  j   d  S)Nz221 Bye)rL   Zclose_when_done)r   r|   r
   r
   r   	smtp_QUIT  s    zSMTPChannel.smtp_QUITc             C   s@   t  |  } | d  |  j   | k r< | | d   j   Sd S)Nr   )ri   rt   ru   )r   keywordr|   Zkeylenr
   r
   r   _strip_command_keyword  s    z"SMTPChannel._strip_command_keywordc             C   sc   | s
 d S| j    j d  r4 t |  \ } } n t |  \ } } | sV | | f S| j | f S)Nr   <)r   r   )lstrip
startswithr   r   Z	addr_spec)r   r|   addressrestr
   r
   r   _getaddr  s    
zSMTPChannel._getaddrc             C   sg   i  } xZ | D]R } | j  d  \ } } } | j   sE | rI | rI d  S| rU | n d | | <q W| S)N=T)	partitionisalnum)r   paramsresultZparameqr[   r
   r
   r   
_getparams  s    zSMTPChannel._getparamsc             C   sg  | rVd } | j    } | d k r4 |  j d  qc| d k rP |  j d  qc| d k r d } |  j ru | | 7} |  j |  qc| d k r d	 } |  j r | | 7} |  j |  qc| d
 k r |  j d  qc| d k r |  j d  qc| d k r|  j d  qc| d k r*|  j d  qc| d k rF|  j d  qc|  j d  n |  j 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>rh   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)rt   rL   r?   )r   r|   ZextendedZlc_argr   r
   r
   r   	smtp_HELP  s:    	
	
zSMTPChannel.smtp_HELPc             C   sV   | rE |  j  |  \ } } | r1 |  j d  qR |  j d |  n |  j d  d  S)NzB252 Cannot VRFY user, but will accept message and attempt deliveryz502 Could not VRFY %sz501 Syntax: VRFY <address>)r   rL   )r   r|   r   r   r
   r
   r   	smtp_VRFY  s    zSMTPChannel.smtp_VRFYc             C   se  |  j  s |  j d  d  St d | d t d } |  j rF | d 7} | d  k rc |  j |  d  S|  j d |  } |  j |  \ } } | s |  j |  d  S|  j r | r |  j |  d  S|  j r |  j d  d  S| j   j	   |  _
 |  j |  j
  } | d  k r |  j |  d  S|  j sX| j d d	  } | d k rX|  j d  d  S|  j r| j d d  } | d k rd |  _ n | d k	 r|  j d  d  S| j d d   } | r| j   s|  j |  d  S|  j rt |  |  j k r|  j d  d  St | j    d k r5|  j d  d  S| |  _ t d |  j d t |  j d  d  S)Nz503 Error: send HELO firstz	===> MAILr   z 501 Syntax: MAIL FROM: <address>z [SP <mail-parameters>]zFROM:z503 Error: nested MAIL commandZBODY7BIT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   r   )r>   rL   r   rK   r?   r   r   rR   rt   rw   rp   r   r6   popr4   rT   isdigitr3   intri   keys)r   r|   	syntaxerrr   r   Zbodysmtputf8sizer
   r
   r   	smtp_MAIL  sh    		
				zSMTPChannel.smtp_MAILc             C   s  |  j  s |  j d  d  St d | d t |  j sG |  j d  d  Sd } |  j r` | d 7} | d  k r} |  j |  d  S|  j d |  } |  j |  \ } } | s |  j |  d  S|  j r | r |  j |  d  S| j   j	   |  _
 |  j |  j
  } | d  k r |  j |  d  St | j    d k rI|  j d	  d  S|  j j |  t d
 |  j d t |  j d  d  S)Nz503 Error: send HELO firstz	===> RCPTr   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>   rL   r   rK   rR   r?   r   r   rt   rw   rq   r   ri   r   rS   rj   )r   r|   r   r   r   r
   r
   r   	smtp_RCPT;  s@    			
zSMTPChannel.smtp_RCPTc             C   s2   | r |  j  d  d  S|  j   |  j  d  d  S)Nz501 Syntax: RSETz250 OK)rL   r=   )r   r|   r
   r
   r   	smtp_RSET^  s
    
zSMTPChannel.smtp_RSETc             C   su   |  j  s |  j d  d  S|  j s4 |  j d  d  S| rK |  j d  d  S|  j |  _ |  j d  |  j 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>   rL   rS   rh   rQ   rV   )r   r|   r
   r
   r   	smtp_DATAe  s    		zSMTPChannel.smtp_DATAc             C   s   |  j  d  d  S)Nz502 EXPN not implemented)rL   )r   r|   r
   r
   r   	smtp_EXPNt  s    zSMTPChannel.smtp_EXPN),r   r   r   rP   rh   r&   collectionsdefaultdictr#   propertyr'   DATA_SIZE_DEFAULTr/   rW   r=   Z_SMTPChannel__serversetterZ_SMTPChannel__lineZ_SMTPChannel__stateZ_SMTPChannel__greetingZ_SMTPChannel__mailfromZ_SMTPChannel__rcpttosZ_SMTPChannel__dataZ_SMTPChannel__fqdnZ_SMTPChannel__peerZ_SMTPChannel__connZ_SMTPChannel__addrrL   rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   r   t   s`   -	>#6#r   c               @   sF   e  Z d  Z e Z e d d d d d  Z d d   Z d d   Z d S)	r   NFc             C   s4  | |  _  | |  _ | |  _ | |  _ | rB | r< t d   d } | d  k rd t d t d  d } | |  _ t j	 j
 |  d | y` t j | d t j  } |  j | d d | d d	  |  j   |  j |  |  j d
  Wn |  j     Yn6 Xt d |  j j t j t j    | | f d t d  S)NzVThe decode_data and enable_SMTPUTF8 parameters cannot be set to True at the same time.FzgThe decode_data default of True will change to False in 3.6; specify an explicit value for this keywordr)   Tr(   typer   r      z0%s started at %s
	Local addr: %s
	Remote addr:%sr   )Z
_localaddr_remoteaddrr3   r4   r%   r   r5   r6   asyncore
dispatcherr/   rA   getaddrinfoSOCK_STREAMZcreate_socketZset_reuse_addrbindlistenrG   r   	__class__r   timectimerK   )r   Z	localaddrZ
remoteaddrr3   r(   r4   rN   Zgai_resultsr
   r
   r   r/   |  s6    				
	 

zSMTPServer.__init__c             C   sK   t  d t |  d t |  j |  | | |  j |  j |  j |  j  } d  S)NzIncoming connection from %sr   )r   rJ   rK   channel_classr3   _mapr4   r6   )r   r1   r2   Zchannelr
   r
   r   handle_accepted  s    	zSMTPServer.handle_acceptedc             K   s
   t   d  S)N)NotImplementedError)r   rE   rR   rS   rl   r   r
   r
   r   rx     s    zSMTPServer.process_message)	r   r   r   r   r   r   r/   r   rx   r
   r
   r
   r   r   x  s
   "c               @   s(   e  Z d  Z d d   Z d d   Z d S)r   c             C   s   d } | j    } x | D]z } | rn | rn d | d } t | t  s^ t | j d   } t |  d } t | t  s t |  } t |  q Wd  S)Nr   zX-Peer: r   zutf-8)
splitlines
isinstancerk   rJ   encoder   )r   rE   rl   Z	inheaderslinesry   Z
peerheaderr
   r
   r   _print_message_content  s    
z&DebuggingServer._print_message_contentc             K   sp   t  d  | rR | j d  r1 t  d | d  | j d  rR t  d | d  |  j | |  t  d  d  S)Nz%---------- MESSAGE FOLLOWS ----------rp   zmail options: %srq   zrcpt options: %s
z%------------ END MESSAGE ------------)r   getr   )r   rE   rR   rS   rl   r   r
   r
   r   rx     s    
zDebuggingServer.process_messageN)r   r   r   r   rx   r
   r
   r
   r   r     s   c                   s:   e  Z d  Z   f d d   Z d d   Z d d   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   rH   r   )r   r
   r   r/     s    zPureProxy.__init__c       	      C   s   | j  d  } d } x | D] } | s) P| d 7} q W| j | d | d  t j |  } |  j | | |  } t d | d t d  S)Nr   r   r   z
X-Peer: %szwe got some refusals:r   )rw   insertr:   rr   _deliverr   rK   )	r   rE   rR   rS   rl   r   rz   ry   refusedr
   r
   r   rx     s    zPureProxy.process_messagec             C   s7  d d  l  } i  } yU | j   } | j |  j d |  j d  z | j | | |  } Wd  | j   XWn | j k
 r } z t d d t | j	 } WYd  d  } ~ Xn t
 | j f k
 r2} z` t d | j d t t | d d	  } t | d d  }	 x | D] }
 | |	 f | |
 <qWWYd  d  } ~ Xn X| S)
Nr   r   zgot SMTPRecipientsRefusedr   ZgotZ	smtp_codeZ
smtp_errorignore)smtplibZSMTPconnectr   ZsendmailquitZSMTPRecipientsRefusedr   rK   Z
recipientsrF   ZSMTPExceptionr   rv   )r   rR   rS   rl   r   r   seZerrcodeerrmsgrr
   r
   r   r     s$    'zPureProxy._deliver)r   r   r   r/   rx   r   r
   r
   )r   r   r     s   c                   s.   e  Z d  Z   f d d   Z d d   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   rH   r   )r   r
   r   r/     s    zMailmanProxy.__init__c             C   s  d d l  m } d d l m } d d l m } d d l m } g  }	 x | D] }
 |
 j   j d  d } | j d  } t |  d k r qM | d } t |  d k r | d	 } n d
 } | j	 |  sM | d! k r qM |	 j
 |
 | | f  qM Wx$ |	 D] \ }
 } } | j |
  q Wt d d j |  d t | ri|  j | | |  } t d | d t i  } | |  } | j |  } | j d  s| | d <| j d  st j t j    | d <x(|	 D] \ }
 } } t d |
 d t | j |  } | s(| j | d d } | | | <| d
 k rJ| j | d d	 q| d k rl| j | d d	 q| d k r| j | d d	 q| d k r| j | d d	 q| d" k r| d k rd | d <n
 d  | d <| j | d d	 qWd  S)#Nr   )StringIO)Utils)Message)MailList@-r)   r   r   adminownerrequestrr   leavezforwarding recips:ro   r   zwe got refusals:fromZFromZdateZDatezsending message tolocktolistZtoadminZtoownerZ	torequestZ	subscribeZSubjectZunsubscribe)r   r   r   r   rr   r   )rr   r   )ior   ZMailmanr   r   r   lowerrw   ri   Zlist_existsrj   remover   rr   rK   r   r   r   r   ZEnqueue)r   rE   rR   rS   rl   r   r   r   r   Z	listnamesZrcptlocalpartsZlistnamer{   r   Zmlistsr   r   Zmlistr
   r
   r   rx     sd    
	


zMailmanProxy.process_message)r   r   r   r/   rx   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   k  s   r   c        
   !   C   s%  yA t  j  t j d d   d d d d d d d d	 g  \ }  } Wn5 t  j k
 rx } z t d |  WYd  d  } ~ Xn Xt   } x|  D] \ } } | d' k r t d  q | d( k r t t  t j d  q | d) k r d | _	 q | d* k r| | _
 q | d+ k rt j a q | d, k r4d | _ q | d- k r y t |  } | | _ Wq t d | d t j t j d  Yq Xq Wt |  d k  rd } d } nh t |  d k  r| d } d } nC t |  d  k  r| d } | d } n t d d! t j |   | j d"  }	 |	 d k  rAt d d# |  | d  |	  | _ y! t | |	 d d    | _ Wn# t k
 rt d d$ |  Yn X| j d"  }	 |	 d k  rt d d% |  | d  |	  | _ y! t | |	 d d    | _ Wn# t k
 r t d d& |  Yn X| S).Nr   z	nVhc:s:duzclass=Znosetuidversionhelpzsize=debugr   -h--helpr   -V	--version-n
--nosetuidF-c--class-d--debug-u
--smtputf8T-s--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)r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )getoptr   argverrorr   r   r   rM   r   r   r   r   rK   r4   r   r   ri   
COMMASPACErr   rs   	localhost	localportr%   
remotehost
remoteport)
ZoptsrH   r   optionsoptr|   Zint_sizeZ	localspecZ
remotespecrz   r
   r
   r   	parseargsr  sp     	
	
	
!!r  __main__r*   r   r4   z7Cannot import module "pwd"; try running with -n option.r   nobodyr)   z3Cannot setuid "nobody"; try running with -n option.)?r   osrI   r   r   rA   r   r-   r   warningsr   Zemail._header_value_parserr   r   __all__r   ZprogramrM   r	   rK   r:   r   r   r   r.   r   r   r   r   r   r   r   r  r   r  r   rfindZlastdot
__import__r   localsmodr  rv   class_r   r   r   r   r   r4   proxyr   pwdImportErrorr   r   r   getpwnamr  PermissionErrorZloopKeyboardInterruptr
   r
   r
   r   <module>P   sp   	  U-SB		(	