;
Êâ"Ic            !   @   s  d  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 d d g Z	 e j
 d Z d Z Gd „  d	 ƒ Z e ƒ  a d
 Z d Z d Z d d „ Z Gd „  d e j ƒ Z Gd „  d e j ƒ Z Gd „  d e ƒ Z Gd „  d e ƒ Z Gd „  d e ƒ Z Gd „  d ƒ Z d „  Z e d k o¶e ƒ  Z e j oÓ y d d l Z Wn4 e  k
 o( e! d d e j" ƒe j# d ƒ Yn Xe j$ d ƒ d Z% y e j e% ƒ Wq3e& k
 oU Z' z? e' j e j( k o ‚  n e! d d e j" ƒe j# d ƒ WYd d Z' [' Xq3Xn e j) Z) d e) k oO e) j* d ƒ Z+ e, e) d e+ … e- ƒ  e. ƒ  d g ƒ Z/ e) e+ d d … Z) n d d l0 Z/ e1 e/ e) ƒ Z2 e2 e j3 e j4 f e j5 e j6 f ƒ Z7 y e j8 ƒ  Wqe9 k
 o YqXn d S(   uc  An RFC 2821 smtp proxy.

Usage: %(program)s [options] [localhost:localport [remotehost:remoteport]]

Options:

    --nosetuid
    -n
        This program generally tries to setuid `nobody', unless this flag is
        set.  The setuid call will fail if this program is not run as root (in
        which case, use this flag).

    --version
    -V
        Print the version number and exit.

    --class classname
    -c classname
        Use `classname' as the concrete SMTP proxy class.  Uses `PureProxy' by
        default.

    --debug
    -d
        Turn on debugging prints.

    --help
    -h
        Print this message and exit.

Version: %(__version__)s

If localhost is not given then `localhost' is used, and if localport is not
given then 8025 is used.  If remotehost is not given then `localhost' is used,
and if remoteport is not given, then 25 is used.
i    Nu
   SMTPServeru   DebuggingServeru	   PureProxyu   MailmanProxyu   Python SMTP proxy version 0.2c             B   s    |  Ee  Z d  „  Z d „  Z d S(   c             C   s   d  S(   N(    (   u   selfu   msg(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   writeY   s    c             C   s   d  S(   N(    (   u   self(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   flushZ   s    N(   u   __name__u
   __module__u   writeu   flush(   u
   __locals__(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   DevnullX   s   
	u   Devnullu   
u    u   , c             C   sI   t  t t ƒ  d t j ƒ| o t  | d t j ƒn t j |  ƒ d  S(   Nu   file(   u   printu   __doc__u   globalsu   sysu   stderru   exit(   u   codeu   msg(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   usaged   s    c             B   s†   |  Ee  Z d  Z d Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d S(   i    i   c             C   sÌ   t  j j |  | ƒ | |  _ | |  _ | |  _ g  |  _ |  j |  _ d |  _	 d  |  _ g  |  _ d |  _ t j ƒ  |  _ | j ƒ  |  _ t d t |  j ƒ d t ƒ|  j d |  j t f ƒ |  j d ƒ d  S(   Ni    u    u   Peer:u   fileu	   220 %s %ss   
(   u   asynchatu
   async_chatu   __init__u   _SMTPChannel__serveru   _SMTPChannel__connu   _SMTPChannel__addru   _SMTPChannel__lineu   COMMANDu   _SMTPChannel__stateu   _SMTPChannel__greetingu   Noneu   _SMTPChannel__mailfromu   _SMTPChannel__rcpttosu   _SMTPChannel__datau   socketu   getfqdnu   _SMTPChannel__fqdnu   getpeernameu   _SMTPChannel__peeru   printu   repru   DEBUGSTREAMu   pushu   __version__u   set_terminator(   u   selfu   serveru   connu   addr(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   __init__p   s    								c             C   s$   t  j j |  t | d d ƒ ƒ d  S(   Nu   
u   ascii(   u   asynchatu
   async_chatu   pushu   bytes(   u   selfu   msg(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   push‚   s    c             C   s   |  j  j t | d ƒ ƒ d  S(   Nu   utf8(   u   _SMTPChannel__lineu   appendu   str(   u   selfu   data(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   collect_incoming_data†   s    c       	      C   s  t  j |  j ƒ } t d t | ƒ d t ƒg  |  _ |  j |  j k oÃ | p |  j d ƒ d  Sd  } | j
 d ƒ } | d k  o | j ƒ  } d  } n1 | d  | … j ƒ  } | | d d  … j ƒ  } t |  d | d  ƒ } | p |  j d | ƒ d  S| | ƒ d  S|  j |  j k o |  j d	 ƒ d  Sg  } xW | j d
 ƒ D]F } | o, | d d k o | j | d d  … ƒ qE| j | ƒ qEWt j | ƒ |  _ |  j j |  j |  j |  j |  j ƒ } g  |  _ d  |  _ |  j |  _ |  j d ƒ | p |  j d ƒ n |  j | ƒ d  S(   Nu   Data:u   fileu   500 Error: bad syntaxu    i    i   u   smtp_u'   502 Error: command "%s" not implementedu   451 Internal confusionu   
u   .s   
u   250 Ok(   u   EMPTYSTRINGu   joinu   _SMTPChannel__lineu   printu   repru   DEBUGSTREAMu   _SMTPChannel__stateu   COMMANDu   pushu   Noneu   findu   upperu   stripu   getattru   DATAu   splitu   appendu   NEWLINEu   _SMTPChannel__datau   _SMTPChannel__serveru   process_messageu   _SMTPChannel__peeru   _SMTPChannel__mailfromu   _SMTPChannel__rcpttosu   set_terminator(	   u   selfu   lineu   methodu   iu   commandu   argu   datau   textu   status(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   found_terminatorŠ   sR    	

 		c             C   sU   | p |  j  d ƒ d  S|  j o |  j  d ƒ n | |  _ |  j  d |  j ƒ d  S(   Nu   501 Syntax: HELO hostnameu   503 Duplicate HELO/EHLOu   250 %s(   u   pushu   _SMTPChannel__greetingu   _SMTPChannel__fqdn(   u   selfu   arg(    (    u"   /mit/python/lib/python3.0/smtpd.pyu	   smtp_HELO»   s    
	c             C   s)   | o |  j  d ƒ n |  j  d ƒ d  S(   Nu   501 Syntax: NOOPu   250 Ok(   u   push(   u   selfu   arg(    (    u"   /mit/python/lib/python3.0/smtpd.pyu	   smtp_NOOPÅ   s    c             C   s   |  j  d ƒ |  j ƒ  d  S(   Nu   221 Bye(   u   pushu   close_when_done(   u   selfu   arg(    (    u"   /mit/python/lib/python3.0/smtpd.pyu	   smtp_QUITË   s    c             C   s›   d  } t | ƒ } | d  | … j ƒ  | k oh | | d  … j ƒ  } | p q— | d d k o2 | d d k o! | d k o | d d … } q— n | S(   Ni    u   <iÿÿÿÿu   >u   <>i   (   u   Noneu   lenu   upperu   strip(   u   selfu   keywordu   argu   addressu   keylen(    (    u"   /mit/python/lib/python3.0/smtpd.pyu	   __getaddrÑ   s    /c             C   s˜   t  d | d t ƒ| o |  j d | ƒ n d  } | p |  j d ƒ d  S|  j o |  j d ƒ d  S| |  _ t  d |  j d t ƒ|  j d ƒ d  S(   Nu	   ===> MAILu   fileu   FROM:u   501 Syntax: MAIL FROM:<address>u   503 Error: nested MAIL commandu   sender:u   250 Ok(   u   printu   DEBUGSTREAMu   _SMTPChannel__getaddru   Noneu   pushu   _SMTPChannel__mailfrom(   u   selfu   argu   address(    (    u"   /mit/python/lib/python3.0/smtpd.pyu	   smtp_MAILÞ   s     
	c             C   sŸ   t  d | d t ƒ|  j p |  j d ƒ d  S| o |  j d | ƒ n d  } | p |  j d ƒ d  S|  j j | ƒ t  d |  j d t ƒ|  j d ƒ d  S(   Nu	   ===> RCPTu   fileu   503 Error: need MAIL commandu   TO:u   501 Syntax: RCPT TO: <address>u   recips:u   250 Ok(   u   printu   DEBUGSTREAMu   _SMTPChannel__mailfromu   pushu   _SMTPChannel__getaddru   Noneu   _SMTPChannel__rcpttosu   append(   u   selfu   argu   address(    (    u"   /mit/python/lib/python3.0/smtpd.pyu	   smtp_RCPTë   s    
 c             C   sQ   | o |  j  d ƒ d  Sd  |  _ g  |  _ d |  _ |  j |  _ |  j  d ƒ d  S(   Nu   501 Syntax: RSETu    u   250 Ok(   u   pushu   Noneu   _SMTPChannel__mailfromu   _SMTPChannel__rcpttosu   _SMTPChannel__datau   COMMANDu   _SMTPChannel__state(   u   selfu   arg(    (    u"   /mit/python/lib/python3.0/smtpd.pyu	   smtp_RSETø   s    			c             C   s_   |  j  p |  j d ƒ d  S| o |  j d ƒ d  S|  j |  _ |  j d ƒ |  j d ƒ d  S(   Nu   503 Error: need RCPT commandu   501 Syntax: DATAs   
.
u#   354 End data with <CR><LF>.<CR><LF>(   u   _SMTPChannel__rcpttosu   pushu   DATAu   _SMTPChannel__stateu   set_terminator(   u   selfu   arg(    (    u"   /mit/python/lib/python3.0/smtpd.pyu	   smtp_DATA  s    
N(   u   __name__u
   __module__u   COMMANDu   DATAu   __init__u   pushu   collect_incoming_datau   found_terminatoru	   smtp_HELOu	   smtp_NOOPu	   smtp_QUITu   _SMTPChannel__getaddru	   smtp_MAILu	   smtp_RCPTu	   smtp_RSETu	   smtp_DATA(   u
   __locals__(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   SMTPChannell   s   
				1	
						u   SMTPChannelc             B   s)   |  Ee  Z d  „  Z d „  Z d „  Z d S(   c             C   s•   | |  _  | |  _ t j j |  ƒ |  j t j t j ƒ |  j	 ƒ  |  j
 | ƒ |  j d ƒ t d |  j j t j t j ƒ  ƒ | | f d t ƒd  S(   Ni   u0   %s started at %s
	Local addr: %s
	Remote addr:%su   file(   u
   _localaddru   _remoteaddru   asyncoreu
   dispatcheru   __init__u   create_socketu   socketu   AF_INETu   SOCK_STREAMu   set_reuse_addru   bindu   listenu   printu	   __class__u   __name__u   timeu   ctimeu   DEBUGSTREAM(   u   selfu	   localaddru
   remoteaddr(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   __init__  s    		
c             C   sB   |  j  ƒ  \ } } t d t | ƒ d t ƒt |  | | ƒ } d  S(   Nu   Incoming connection from %su   file(   u   acceptu   printu   repru   DEBUGSTREAMu   SMTPChannel(   u   selfu   connu   addru   channel(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   handle_accept  s    c             C   s
   t  ‚ d S(   uI  Override this abstract method to handle messages from the client.

        peer is a tuple containing (ipaddr, port) of the client that made the
        socket connection to our smtp port.

        mailfrom is the raw address the client claims the message is coming
        from.

        rcpttos is a list of raw addresses the client wishes to deliver the
        message to.

        data is a string containing the entire full text of the message,
        headers (if supplied) and all.  It has been `de-transparencied'
        according to RFC 821, Section 4.5.2.  In other words, a line
        containing a `.' followed by other text has had the leading dot
        removed.

        This function should return None, for a normal `250 Ok' response;
        otherwise it returns the desired response string in RFC 821 format.

        N(   u   NotImplementedError(   u   selfu   peeru   mailfromu   rcpttosu   data(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   process_message$  s    N(   u   __name__u
   __module__u   __init__u   handle_acceptu   process_message(   u
   __locals__(    (    u"   /mit/python/lib/python3.0/smtpd.pyu
   SMTPServer  s   
		c             B   s   |  Ee  Z d  „  Z d S(   c             C   sr   d } | j  d ƒ } t d ƒ xB | D]: } | o# | o t d | d ƒ d } n t | ƒ q& Wt d ƒ d  S(   Ni   u   
u%   ---------- MESSAGE FOLLOWS ----------u   X-Peer:i    u%   ------------ END MESSAGE ------------(   u   splitu   print(   u   selfu   peeru   mailfromu   rcpttosu   datau	   inheadersu   linesu   line(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   process_message@  s    
 
N(   u   __name__u
   __module__u   process_message(   u
   __locals__(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   DebuggingServer>  s   
c             B   s    |  Ee  Z d  „  Z d „  Z d S(   c       	      C   s   | j  d ƒ } d } x$ | D] } | p Pn | d 7} q W| j | d | d ƒ t j | ƒ } |  j | | | ƒ } t d | d t ƒd  S(   Nu   
i    i   u
   X-Peer: %su   we got some refusals:u   file(   u   splitu   insertu   NEWLINEu   joinu   _deliveru   printu   DEBUGSTREAM(	   u   selfu   peeru   mailfromu   rcpttosu   datau   linesu   iu   lineu   refused(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   process_messageO  s     c             C   s>  d d  l  } i  } yU | j ƒ  } | j |  j d |  j d ƒ z | j | | | ƒ } Wd  | j ƒ  XWnÐ | j k
 o4 } z t d d t ƒ| j	 } WYd  d  } ~ Xn t
 j | j f k
 ov } z` t d | j d t ƒt | d d ƒ } t | d d	 ƒ }	 x | D] }
 | |	 f | |
 <qWWYd  d  } ~ Xn X| S(
   Ni    i   u   got SMTPRecipientsRefusedu   fileu   gotu	   smtp_codeiÿÿÿÿu
   smtp_erroru   ignore(   u   smtplibu   SMTPu   connectu   _remoteaddru   sendmailu   quitu   SMTPRecipientsRefusedu   printu   DEBUGSTREAMu
   recipientsu   socketu   erroru   SMTPExceptionu	   __class__u   getattr(   u   selfu   mailfromu   rcpttosu   datau   smtplibu   refusedu   su   eu   errcodeu   errmsgu   r(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   _deliver]  s&     (N(   u   __name__u
   __module__u   process_messageu   _deliver(   u
   __locals__(    (    u"   /mit/python/lib/python3.0/smtpd.pyu	   PureProxyN  s   
	c             B   s   |  Ee  Z d  „  Z d S(   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 o qM n | d } t | ƒ d k o | d	 } n d
 } | j	 | ƒ p | d! k o qM n |	 j
 |
 | | f ƒ qM Wx$ |	 D] \ }
 } } | j |
 ƒ qWt d d j | ƒ d t ƒ| o, |  j | | | ƒ } t d | d t ƒn i  } | | ƒ } | j | ƒ } | j d ƒ p | | d <n | j d ƒ p t j t j ƒ  ƒ | d <n x<|	 D]4\ }
 } } t d |
 d t ƒ| j | ƒ } | p# | j | d d ƒ} | | | <n | d
 k o | j | d d	 ƒqî| d k o | j | d d	 ƒqî| d k o | j | d d	 ƒqî| d k o | j | d d	 ƒqî| d" k o< | d k o d | d <n d  | d <| j | d d	 ƒqîqîWd  S(#   Ni    (   u   StringIO(   u   Utils(   u   Message(   u   MailListu   @u   -i   i   u    u   adminu   owneru   requestu   joinu   leaveu   forwarding recips:u    u   fileu   we got refusals:u   fromu   Fromu   dateu   Dateu   sending message tou   locku   tolistu   toadminu   toowneru	   torequestu	   subscribeu   Subjectu   unsubscribe(   u    u   adminu   owneru   requestu   joinu   leave(   u   joinu   leave(   u   iou   StringIOu   Mailmanu   Utilsu   Messageu   MailListu   loweru   splitu   lenu   list_existsu   appendu   removeu   printu   joinu   DEBUGSTREAMu   _deliveru   getu   timeu   ctimeu   Enqueue(   u   selfu   peeru   mailfromu   rcpttosu   datau   StringIOu   Utilsu   Messageu   MailListu	   listnamesu   rcptu   localu   partsu   listnameu   commandu   refusedu   mlistsu   su   msgu   mlist(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   process_messagex  sj     

  
N(   u   __name__u
   __module__u   process_message(   u
   __locals__(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   MailmanProxyw  s   
c             B   s   |  Ee  Z d  Z d Z d S(   i   u	   PureProxyN(   u   __name__u
   __module__u   setuidu	   classname(   u
   __locals__(    (    u"   /mit/python/lib/python3.0/smtpd.pyu   OptionsÆ  s   
u   Optionsc        	      C   sÜ  y; t  j  t j d d  … d d d d d d g ƒ \ }  } Wn7 t  j k
 o( } z t d | ƒ WYd  d  } ~ Xn Xt ƒ  } x® |  D]¦ \ } } | d k o t d
 ƒ q… | d k o$ t t d t j ƒt j	 d
 ƒ q… | d  k o d
 | _
 q… | d! k o | | _ q… | d" k o t j a q… q… Wt | ƒ d k  o d } d } nm t | ƒ d k  o | d
 } d } nF t | ƒ d k  o | d
 } | d } n t d d t j | ƒ ƒ | j d ƒ } | d
 k  o t d d | ƒ n | d  | … | _ y! t | | d d  … ƒ | _ Wn% t k
 o t d d | ƒ Yn X| j d ƒ } | d
 k  o t d d | ƒ n | d  | … | _ y! t | | d d  … ƒ | _ Wn% t k
 o t d d | ƒ Yn X| S(#   Ni   u   nVhc:du   class=u   nosetuidu   versionu   helpu   debugu   -hu   --helpi    u   -Vu	   --versionu   fileu   -nu
   --nosetuidu   -cu   --classu   -du   --debugu   localhost:8025u   localhost:25i   i   u   Invalid arguments: %su   :u   Bad local spec: %su   Bad local port: %su   Bad remote spec: %su   Bad remote port: %s(   u   -hu   --help(   u   -Vu	   --version(   u   -nu
   --nosetuid(   u   -cu   --class(   u   -du   --debug(   u   getoptu   sysu   argvu   erroru   usageu   Optionsu   printu   __version__u   stderru   exitu   setuidu	   classnameu   DEBUGSTREAMu   lenu
   COMMASPACEu   joinu   findu	   localhostu   intu	   localportu
   ValueErroru
   remotehostu
   remoteport(	   u   optsu   argsu   eu   optionsu   optu   argu	   localspecu
   remotespecu   i(    (    u"   /mit/python/lib/python3.0/smtpd.pyu	   parseargsÌ  s^    "!	 



!!u   __main__u7   Cannot import module "pwd"; try running with -n option.u   filei   u   nobodyi   u3   Cannot setuid "nobody"; try running with -n option.u   .(:   u   __doc__u   sysu   osu   errnou   getoptu   timeu   socketu   asyncoreu   asynchatu   __all__u   argvu   programu   __version__u   Devnullu   DEBUGSTREAMu   NEWLINEu   EMPTYSTRINGu
   COMMASPACEu   usageu
   async_chatu   SMTPChannelu
   dispatcheru
   SMTPServeru   DebuggingServeru	   PureProxyu   MailmanProxyu   Optionsu	   parseargsu   __name__u   optionsu   setuidu   pwdu   ImportErroru   printu   stderru   exitu   getpwnamu   nobodyu   OSErroru   eu   EPERMu	   classnameu   rfindu   lastdotu
   __import__u   globalsu   localsu   modu   __main__u   getattru   class_u	   localhostu	   localportu
   remotehostu
   remoteportu   proxyu   loopu   KeyboardInterrupt(    (    (    u"   /mit/python/lib/python3.0/smtpd.pyu   <module>$   sj   %	¤.)O	9	
 %	(