
    1hhx                     *   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJrJ	r	  S SK
Jr  S SKJrJr  / SQr\ R                   S    rSr " S S5      r\" 5       qS	rS
rSrS"S jr " S S\	R2                  5      r " S S\R6                  5      r " S S\5      r " S S\5      r " S S5      rS r \!S:X  a  \ " 5       r"\"RF                  r#S\#;   a3  \#RI                  S5      r%\&" \#S\% \'" 5       \(" 5       S/5      r)\#\%S-   S r#OS SK*r)\+" \)\#5      r,\," \"RZ                  \"R\                  4\"R^                  \"R`                  4\"Rb                  \"Rd                  S9r3\"Rh                  (       a-   S SK5r5\5Rt                  " S5      S    r; \Rh                  " \;5         \Rz                  " 5         gg! \6 a&    \7" S\ Rp                  S9  \ Rr                  " S5         Ngf = f! \< a&    \7" S!\ Rp                  S9  \ Rr                  " S5         Nnf = f! \> a     gf = f)#    N)asyncoreasynchat)warn)get_addr_specget_angle_addr)SMTPChannel
SMTPServerDebuggingServer	PureProxyzPython SMTP proxy version 0.3c                        \ rS rSrS rS rSrg)Devnull\   c                     g N selfmsgs     ;/opt/python-3.13.8/usr/lib/python3.13/test/support/smtpd.pywriteDevnull.write]   s    $    c                     g r   r   r   s    r   flushDevnull.flush^   s    Tr   r   N)__name__
__module____qualname____firstlineno__r   r   __static_attributes__r   r   r   r   r   \   s    r   r   
z, i    c                     [        [        [        5       -  [        R                  S9  U(       a  [        U[        R                  S9  [        R
                  " U 5        g )Nfile)print__doc__globalssysstderrexit)coder   s     r   usager.   g   s3    	'GI
CJJ/
c

#HHTNr   c                      \ rS rSrSrSrSr\R                  " \4S j5      r	\
S 5       r\SSS4S	 jrS
 rS r\
S 5       r\R"                  S 5       r\
S 5       r\R"                  S 5       r\
S 5       r\R"                  S 5       r\
S 5       r\R"                  S 5       r\
S 5       r\R"                  S 5       r\
S 5       r\R"                  S 5       r\
S 5       r\R"                  S 5       r\
S 5       r\R"                  S 5       r\
S 5       r\R"                  S 5       r\
S 5       r\R"                  S 5       r\
S  5       r\R"                  S! 5       rS" rS# rS$ rS% rS& r S' r!S( r"S) r#S* r$S+ r%S, r&S- r'S. r(S/ r)S0 r*S1 r+S2 r,S3r-g)4r   n   r      i   c                     U $ r   r   )xs    r   <lambda>SMTPChannel.<lambda>s   s    qr   c                      [        U R                  R                  5       5      $ ! [         a    U R                  s $ f = fr   )maxcommand_size_limitsvalues
ValueErrorcommand_size_limitr   s    r   max_command_size_limit"SMTPChannel.max_command_size_limitu   s<    	+t//66899 	+***	+s   "% >>NFc                 B   [         R                  R                  XUS9  Xl        X l        X0l        X@l        X`l        Xpl        U(       a  U(       a  [        S5      eU(       a!  SU l
        SU l        SU l        [        U l        O%SU l
        SU l        [        S5      U l        S	U l        U R!                  5         SU l        S
U l        U R&                  R)                  5         [*        R,                  " 5       U l         UR1                  5       U l        [=        S[?        U R2                  5      [@        S9  U RC                  SU R.                  < S[D        < 35        g ! [4         a9  nU R7                  5         UR8                  [8        R:                  :w  a  e  S nAg S nAff = f)NmapFdecode_data and enable_SMTPUTF8 cannot be set to True at the same timer#   
.r      
   .   
FzPeer:r%   z220  )#r   
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_smtpr8   clearsocketgetfqdnfqdngetpeernamepeerOSErrorcloseerrnoENOTCONNr'   reprDEBUGSTREAMpush__version__)	r   serverrK   rL   rM   r@   rN   decode_dataerrs	            r   rI   SMTPChannel.__init__|   sG   $$TS$9!		..'{ @ A A "D"DMDL#DM #D#DMt9DL!DM"  &&(NN$		((*DI 	gtDII[9		K89  	 JJLyyENN*	s   <E 
F%/FFc                     U R                   U l        S U l        / U l        SU l        SU l        U R                  S5        g )NFr   rD   )COMMAND
smtp_statemailfromrcpttosrequire_SMTPUTF8	num_bytesset_terminatorr   s    r   _set_post_data_state SMTPChannel._set_post_data_state   s8    ,, %G$r   c                 @    U R                  5         SU l        / U l        g Nr#   )rs   received_datareceived_linesr   s    r   rV   SMTPChannel._set_rset_state   s    !!# r   c                 <    [        S[        S5        U R                  $ )NzTAccess to __server attribute on SMTPChannel is deprecated, use 'smtp_server' instead   r   DeprecationWarningrJ   r   s    r   __serverSMTPChannel.__server   s!     ();Q	@r   c                 2    [        S[        S5        Xl        g )NzRSetting __server attribute on SMTPChannel is deprecated, set 'smtp_server' insteadr{   r|   r   values     r   r~   r      s     ();Q	@ r   c                 <    [        S[        S5        U R                  $ )NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadr{   r   r}   rx   r   s    r   __lineSMTPChannel.__line   s!     +,>	C"""r   c                 2    [        S[        S5        Xl        g )NzSSetting __line attribute on SMTPChannel is deprecated, set 'received_lines' insteadr{   r   r   s     r   r   r      s     +,>	C#r   c                 <    [        S[        S5        U R                  $ )NzRAccess to __state attribute on SMTPChannel is deprecated, use 'smtp_state' insteadr{   r   r}   rm   r   s    r   __stateSMTPChannel.__state   s     '(:A	?r   c                 2    [        S[        S5        Xl        g )NzPSetting __state attribute on SMTPChannel is deprecated, set 'smtp_state' insteadr{   r   r   s     r   r   r      s     '(:A	?r   c                 <    [        S[        S5        U R                  $ )NzXAccess to __greeting attribute on SMTPChannel is deprecated, use 'seen_greeting' insteadr{   r   r}   rW   r   s    r   
__greetingSMTPChannel.__greeting   !     *+=q	B!!!r   c                 2    [        S[        S5        Xl        g )NzVSetting __greeting attribute on SMTPChannel is deprecated, set 'seen_greeting' insteadr{   r   r   s     r   r   r           *+=q	B"r   c                 <    [        S[        S5        U R                  $ )NzSAccess to __mailfrom attribute on SMTPChannel is deprecated, use 'mailfrom' insteadr{   r   r}   rn   r   s    r   
__mailfromSMTPChannel.__mailfrom   s     %&8!	=}}r   c                 2    [        S[        S5        Xl        g )NzQSetting __mailfrom attribute on SMTPChannel is deprecated, set 'mailfrom' insteadr{   r   r   s     r   r   r      s     %&8!	=r   c                 <    [        S[        S5        U R                  $ )NzQAccess to __rcpttos attribute on SMTPChannel is deprecated, use 'rcpttos' insteadr{   r   r}   ro   r   s    r   	__rcpttosSMTPChannel.__rcpttos   s     $%7	<||r   c                 2    [        S[        S5        Xl        g )NzOSetting __rcpttos attribute on SMTPChannel is deprecated, set 'rcpttos' insteadr{   r   r   s     r   r   r      s     $%7	<r   c                 <    [        S[        S5        U R                  $ )NzTAccess to __data attribute on SMTPChannel is deprecated, use 'received_data' insteadr{   r   r}   rw   r   s    r   __dataSMTPChannel.__data   r   r   c                 2    [        S[        S5        Xl        g )NzRSetting __data attribute on SMTPChannel is deprecated, set 'received_data' insteadr{   r   r   s     r   r   r      r   r   c                 <    [        S[        S5        U R                  $ )NzKAccess to __fqdn attribute on SMTPChannel is deprecated, use 'fqdn' insteadr{   r   r}   r\   r   s    r   __fqdnSMTPChannel.__fqdn       !"4a	9yyr   c                 2    [        S[        S5        Xl        g )NzISetting __fqdn attribute on SMTPChannel is deprecated, set 'fqdn' insteadr{   r   r   s     r   r   r          !"4a	9	r   c                 <    [        S[        S5        U R                  $ )NzKAccess to __peer attribute on SMTPChannel is deprecated, use 'peer' insteadr{   r   r}   r^   r   s    r   __peerSMTPChannel.__peer  r   r   c                 2    [        S[        S5        Xl        g )NzISetting __peer attribute on SMTPChannel is deprecated, set 'peer' insteadr{   r   r   s     r   r   r     r   r   c                 <    [        S[        S5        U R                  $ )NzKAccess to __conn attribute on SMTPChannel is deprecated, use 'conn' insteadr{   r   r}   rK   r   s    r   __connSMTPChannel.__conn  r   r   c                 2    [        S[        S5        Xl        g )NzISetting __conn attribute on SMTPChannel is deprecated, set 'conn' insteadr{   r   r   s     r   r   r     r   r   c                 <    [        S[        S5        U R                  $ )NzKAccess to __addr attribute on SMTPChannel is deprecated, use 'addr' insteadr{   r   r}   rL   r   s    r   __addrSMTPChannel.__addr"  r   r   c                 2    [        S[        S5        Xl        g )NzISetting __addr attribute on SMTPChannel is deprecated, set 'addr' insteadr{   r   r   s     r   r   r   '  r   r   c                     [         R                  R                  U [        US-   U R                  (       a  SOS5      5        g )NrB   utf-8ascii)r   rH   re   bytesrp   r   s     r   re   SMTPChannel.push.  s4      u&LT%:%:'(I 	Jr   c                    S nU R                   U R                  :X  a  U R                  nO&U R                   U R                  :X  a  U R                  nU(       a  U R
                  U:  a  g U(       a  U =R
                  [        U5      -  sl        U R                  (       a&  U R                  R                  [        US5      5        g U R                  R                  U5        g )Nr   )rm   rl   r<   DATArM   rq   lenrO   rx   appendstr)r   datalimits      r   collect_incoming_data!SMTPChannel.collect_incoming_data3  s    ??dll*//E__		)((ET^^e+NNc$i'N&&s4'9:&&t,r   c                 @   U R                   R                  U R                  5      n[        S[	        U5      [
        S9  / U l        U R                  U R                  :X  Ga  U R                  Sso l        U(       d  U R                  S5        g U R                  (       d  [        US5      nUR                  S5      nUS:  a  UR                  5       nS nO(US U R                  5       nXS-   S  R                  5       nU R                  (       a  U R                   U   OU R"                  nX&:  a  U R                  S5        g [%        U S	U-   S 5      nU(       d  U R                  S
U-  5        g U" U5        g U R                  U R&                  :w  a  U R                  S5        SU l        g U R(                  (       a3  U R                  U R(                  :  a  U R                  S5        SU l        g / nUR+                  U R,                  5       HD  n	U	(       a)  U	S   U R.                  :X  a  UR1                  U	SS  5        M3  UR1                  U	5        MF     U R2                  R                  U5      U l        U R6                  U R8                  U R:                  U R4                  4n
0 nU R                  (       d  U R<                  U R>                  S.nU R@                  RB                  " U
0 UD6nU RE                  5         U(       d  U R                  S5        g U R                  U5        g )NzData:r%   r   z500 Error: bad syntaxr   rG   r1   z500 Error: line too longsmtp_z&500 Error: command "%s" not recognizedz451 Internal confusionz552 Error: Too much mail data)mail_optionsrcpt_options250 OK)#rP   joinrx   r'   rc   rd   rm   rl   rq   re   rO   r   findupperstriprX   r8   r;   getattrr   rM   splitrQ   rR   r   rT   rw   r^   rn   ro   r   r   rJ   process_messagers   )r   lineszicommandargmax_szmethodr   textargskwargsstatuss                r   found_terminatorSMTPChannel.found_terminatorC  s     %%d&9&9:gtDz4 ??dll*!%B		12$$4)		#A1u**,r(..*Q34j&&(-- ..w7373J3J {		45T7W#4d;F		BWLM3K$))+		23!"##9M9M(M		9:!" D

4==1DGt||3KKQR)KK%	 2
 "&!3!3D!9DIIt}}dllD<N<NODF$$$($5$5$($5$5 %%55tFvFF%%'		(#		&!r   c                     U(       d  U R                  S5        g U R                  (       a  U R                  S5        g U R                  5         Xl        U R                  SU R                  -  5        g )Nz501 Syntax: HELO hostname503 Duplicate HELO/EHLOz250 %s)re   rW   rV   r\   r   r   s     r   	smtp_HELOSMTPChannel.smtp_HELO  sU    II12II/0 		(TYY&'r   c                 V   U(       d  U R                  S5        g U R                  (       a  U R                  S5        g U R                  5         Xl        SU l        U R                  SU R                  -  5        U R
                  (       a5  U R                  SU R
                  -  5        U R                  S==   S-  ss'   U R                  (       d  U R                  S5        U R                  (       a(  U R                  S	5        U R                  S==   S
-  ss'   U R                  S5        g )Nz501 Syntax: EHLO hostnamer   Tz250-%sz250-SIZE %sMAIL   z250-8BITMIMEz250-SMTPUTF8
   z250 HELP)	re   rW   rV   rX   r\   rM   r8   rO   rN   r   s     r   	smtp_EHLOSMTPChannel.smtp_EHLO  s    II12II/0 !		(TYY&'IImd&:&::;$$V,2,  IIn%IIn%$$V,2,		*r   c                 X    U(       a  U R                  S5        g U R                  S5        g )Nz501 Syntax: NOOPr   re   r   s     r   	smtp_NOOPSMTPChannel.smtp_NOOP  s    II()IIhr   c                 F    U R                  S5        U R                  5         g )Nz221 Bye)re   close_when_doner   s     r   	smtp_QUITSMTPChannel.smtp_QUIT  s    		)r   c                 l    [        U5      nUS U R                  5       U:X  a  X#S  R                  5       $ grv   )r   r   r   )r   keywordr   keylens       r   _strip_command_keyword"SMTPChannel._strip_command_keyword  s8    Ww<7*w<%%''r   c                     U(       d  gUR                  5       R                  S5      (       a  [        U5      u  p#O[        U5      u  p#U(       d  X#4$ UR                  U4$ )N)r#   r#   <)lstrip
startswithr   r   	addr_spec)r   r   addressrests       r   _getaddrSMTPChannel._getaddr  sU    ::<""3''*3/MGT)#.MG=   $&&r   c                     0 nU HI  nUR                  S5      u  p4nUR                  5       (       a  U(       a	  U(       d    g U(       a  UOSX#'   MK     U$ )N=T)	partitionisalnum)r   paramsresultparameqr   s         r   
_getparamsSMTPChannel._getparams  sJ     E$s3Eu==??b%'ETFM	 
 r   c                    U(       Ga*  SnUR                  5       nUS:X  a  U R                  S5        g US:X  a  U R                  S5        g US:X  a)  SnU R                  (       a  XB-  nU R                  U5        g US:X  a)  S	nU R                  (       a  XB-  nU R                  U5        g US
:X  a  U R                  S5        g US:X  a  U R                  S5        g US:X  a  U R                  S5        g US:X  a  U R                  S5        g US:X  a  U R                  S5        g U R                  S5        g U R                  S5        g )N [SP <mail-parameters>]EHLOz250 Syntax: EHLO hostnameHELOz250 Syntax: HELO hostnamer   z 250 Syntax: MAIL FROM: <address>RCPTz250 Syntax: RCPT TO: <address>r   z250 Syntax: DATARSETz250 Syntax: RSETNOOPz250 Syntax: NOOPQUITz250 Syntax: QUIT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   re   rX   )r   r   extendedlc_argr   s        r   	smtp_HELPSMTPChannel.smtp_HELP  s   0HYY[F		566!		566!8%%OC		#6!6%%OC		#6!		,-6!		,-6!		,-6!		,-6!		67		 5 6 II , -r   c                     U(       aA  U R                  U5      u  p#U(       a  U R                  S5        g U R                  SU-  5        g U R                  S5        g )NzB252 Cannot VRFY user, but will accept message and attempt deliveryz502 Could not VRFY %sz501 Syntax: VRFY <address>)r   re   )r   r   r   r  s       r   	smtp_VRFYSMTPChannel.smtp_VRFY  sJ    "mmC0OG		 1 2 		1C78II23r   c                 8   U R                   (       d  U R                  S5        g [        SU[        S9  SnU R                  (       a  US-  nUc  U R                  U5        g U R                  SU5      nU R                  U5      u  p4U(       d  U R                  U5        g U R                  (       d  U(       a  U R                  U5        g U R                  (       a  U R                  S5        g UR                  5       R                  5       U l
        U R                  U R                  5      nUc  U R                  U5        g U R                  (       d*  UR                  SS	5      nUS
;  a  U R                  S5        g U R                  (       a6  UR                  SS5      nUSL a  SU l        OUSLa  U R                  S5        g UR                  SS 5      nU(       ac  UR!                  5       (       d  U R                  U5        g U R"                  (       a+  [%        U5      U R"                  :  a  U R                  S5        g ['        UR)                  5       5      S:  a  U R                  S5        g X0l        [        SU R                  [        S9  U R                  S5        g )N503 Error: send HELO firstz	===> MAILr%   z 501 Syntax: MAIL FROM: <address>r  zFROM:z503 Error: nested MAIL commandBODY7BIT)r  8BITMIMEz1501 Error: BODY can only be one of 7BIT, 8BITMIMESMTPUTF8FTz&501 Error: SMTPUTF8 takes no argumentsSIZEz:552 Error: message size exceeds fixed maximum message sizer   z:555 MAIL FROM parameters not recognized or not implementedzsender:r   )rW   re   r'   rd   rX   r   r   rn   r   r   r   r	  rO   poprN   rp   isdigitrM   intr   keys)r   r   	syntaxerrr   r  bodysmtputf8sizes           r   	smtp_MAILSMTPChannel.smtp_MAIL  s   !!II23k3[16	22I;IIi ))'37--,IIi !!fIIi ==II67"LLN002!2!23>IIi   ::ff-D//		MNzz*e4H4(,%&		BCzz&$'<<>>		)$%%#d)d6J6J*J		VWv{{}!IIRSi[9		(r   c                 f   U R                   (       d  U R                  S5        g [        SU[        S9  U R                  (       d  U R                  S5        g SnU R
                  (       a  US-  nUc  U R                  U5        g U R                  SU5      nU R                  U5      u  p4U(       d  U R                  U5        g U R
                  (       d  U(       a  U R                  U5        g UR                  5       R                  5       U l
        U R                  U R                  5      nUc  U R                  U5        g [        UR                  5       5      S:  a  U R                  S	5        g U R                  R                  U5        [        S
U R                  [        S9  U R                  S5        g )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   )rW   re   r'   rd   rn   rX   r   r   r   r   r   r	  r   r%  ro   r   )r   r   r&  r   r  s        r   	smtp_RCPTSMTPChannel.smtp_RCPT.  sI   !!II23k3[1}}II454	22I;IIi ))%5--,IIi !!fIIi "LLN002!2!23>IIi v{{}!IIPQG$iK8		(r   c                 x    U(       a  U R                  S5        g U R                  5         U R                  S5        g )Nz501 Syntax: RSETr   )re   rV   r   s     r   	smtp_RSETSMTPChannel.smtp_RSETQ  s-    II()		(r   c                 (   U R                   (       d  U R                  S5        g U R                  (       d  U R                  S5        g U(       a  U R                  S5        g U R                  U l        U R                  S5        U R                  S5        g )Nr  z503 Error: need RCPT commandz501 Syntax: DATAs   
.
z#354 End data with <CR><LF>.<CR><LF>)rW   re   ro   r   rm   rr   r   s     r   	smtp_DATASMTPChannel.smtp_DATAX  sk    !!II23||II45II()))L)		78r   c                 &    U R                  S5        g )Nz502 EXPN not implementedr   r   s     r   	smtp_EXPNSMTPChannel.smtp_EXPNg  s    		,-r   )rO   rR   rP   rQ   rT   rL   rK   rM   rN   rX   r\   r   rn   rq   r^   r   ro   rw   rx   rp   rW   rJ   rm   ).r   r   r   r    rl   r   r;   collectionsdefaultdictr8   propertyr<   DATA_SIZE_DEFAULTrI   rs   rV   _SMTPChannel__serversetter_SMTPChannel__line_SMTPChannel__state_SMTPChannel__greeting_SMTPChannel__mailfrom_SMTPChannel__rcpttos_SMTPChannel__data_SMTPChannel__fqdn_SMTPChannel__peer_SMTPChannel__conn_SMTPChannel__addrre   r   r   r   r   r   r   r   r   r	  r  r  r*  r-  r0  r3  r6  r!   r   r   r   r   r   n   s   GD%11;M2PQ+ + <M5e%:N%!     __! !
 # # ]]$ $
   ^^   
 " " # #
    
    
 " " ]]# #
   ]] 
   ]] 
   ]] 
   ]] J
- ;"|
(, 
	'	!-F	44l!F9.r   r   c                   6    \ rS rSr\r\SSS4S jrS rS r	Sr
g)r	   ik  NFc           	      r   Xl         X l        X0l        XPl        X`l        U(       a  U(       a  [        S5      e[        R                  R                  XS9   [        R                  " US[        R                  06nU R                  US   S   US   S   5        U R                  5         U R                  U5        U R                  S5        [!        U R"                  R$                  < S[&        R(                  " [&        R&                  " 5       5      < SU< S	U< 3[*        S
9  g !   U R-                  5         e = f)NrA   r?   typer   r1      z started at z
	Local addr: z
	Remote addr:r%   )
_localaddr_remoteaddrrM   rN   rO   r:   r   
dispatcherrI   rZ   getaddrinfoSOCK_STREAMcreate_socketset_reuse_addrbindlistenr'   	__class__r   timectimerd   r`   )r   	localaddr
remoteaddrrM   r@   rN   rh   gai_resultss           r   rI   SMTPServer.__init__o  s    $%..'{ @ A A$$T$3	: ,,i F282D2DFK{1~a0+a.2CD!IIi KKN
 ''DIIK)@:'-8:		JJLs   A4D# #D6c           	          [        S[        U5      -  [        S9  U R                  U UUU R                  U R
                  U R                  U R                  5      ng )NzIncoming connection from %sr%   )r'   rc   rd   channel_classrM   _maprN   rO   )r   rK   rL   channels       r   handle_acceptedSMTPServer.handle_accepted  sP    +d4j8{K$$T%)%)%)%9%9%)YY%)%9%9%)%6%68r   c                     [         er   )NotImplementedErrorr   r^   rn   ro   r   r   s         r   r   SMTPServer.process_message  s
    > "!r   )rO   rL  rM  rM   rN   )r   r   r   r    r   r]  r;  rI   r`  r   r!   r   r   r   r	   r	   k  s"    M "3!&E:88"r   r	   c                        \ rS rSrS rS rSrg)r
   i  c                 4   SnUR                  5       nU H  nU(       aK  U(       dD  SUS   -   n[        U[        5      (       d  [        UR	                  S5      5      n[        U5        Sn[        U[        5      (       d  [        U5      n[        U5        M     g )Nr1   zX-Peer: r   r   )
splitlines
isinstancer   rc   encoder'   )r   r^   r   	inheaderslinesr   
peerheaders          r   _print_message_content&DebuggingServer._print_message_content  s|    	!D'$q'1
!$,,!%j&7&7&@!AJj!	dC((Dz$K r   c                     [        S5        U(       aN  UR                  S5      (       a  [        SUS   -  5        UR                  S5      (       a  [        SUS   -  5        U R                  X5        [        S5        g )Nz%---------- MESSAGE FOLLOWS ----------r   zmail options: %sr   zrcpt options: %s
z%------------ END MESSAGE ------------)r'   getrn  rd  s         r   r   DebuggingServer.process_message  si    56zz.))(6.+AABzz.))*VN-CCD##D/56r   r   N)r   r   r   r    rn  r   r!   r   r   r   r
   r
     s    "7r   r
   c                   4   ^  \ rS rSrU 4S jrS rS rSrU =r$ )r   i  c                 d   > SU;   a  US   (       a  [        S5      e[        [        U ]  " U0 UD6  g )NrN   z$PureProxy does not support SMTPUTF8.)r:   superr   rI   )r   r   r   rU  s      r   rI   PureProxy.__init__  s3    &62C+DCDDi'88r   c                     UR                  S5      nSnU H  nU(       d    O	US-  nM     UR                  USUS   -  5        [        R                  U5      nU R	                  X#U5      n[        SU[        S9  g )Nr"   r   r1   z
X-Peer: %szwe got some refusals:r%   )r   insertrS   r   _deliverr'   rd   )	r   r^   rn   ro   r   rl  r   r   refuseds	            r   r   PureProxy.process_message  sr    

4 DFA  	QtAw./||E"--48%w[Ar   c                 ,   SS K n0 n UR                  5       nUR                  U R                  S   U R                  S   5         UR	                  XU5      nUR                  5         U$ ! UR                  5         f = f! UR                   a%  n[        S[        S9  UR                  n S nAU$ S nAf[        UR                  4 aL  n[        SUR                  [        S9  [        USS5      n[        USS	5      n	U H  n
X4XZ'   M
      S nAU$ S nAff = f)
Nr   r1   zgot SMTPRecipientsRefusedr%   got	smtp_code
smtp_errorignore)smtplibSMTPconnectrM  sendmailquitSMTPRecipientsRefusedr'   rd   
recipientsr_   SMTPExceptionrU  r   )r   rn   ro   r   r  rz  seerrcodeerrmsgrs              r   ry  PureProxy._deliver  s    	/AIId&&q)4+;+;A+>?**X=  ,, 	#-K@llG  ../ 	/%;7 ab1GQh7F%.
 	/s<   <A> A) A> )A;;A> >DB..DADDr   )	r   r   r   r    rI   r   ry  r!   __classcell__)rU  s   @r   r   r     s    9
B r   r   c                   $    \ rS rSrSrSrSrSrSrg)Optionsi  Tr   NFr   )	r   r   r   r    setuid	classname
size_limitrN   r!   r   r   r   r  r    s    FIJOr   r  c                      [         R                   " [        R                  SS  S/ SQ5      u  p[        5       nW  H  u  pEUS;   a  [	        S5        M  US;   a'  [        [        5        [        R                  " S5        ME  US;   a	  SUl	        MT  US	;   a  XSl
        Mb  US
;   a  [        R                  qMz  US;   a	  SUl        M  US;   d  M   [        U5      nXcl        M     [!        W5      S:  a  SnSnOS[!        U5      S:  a  US   nSnO<[!        U5      S:  a  US   nUS   nO"[	        SS["        R%                  U5      -  5        WR'                  S5      n	U	S:  a  [	        SSU-  5        US U	 Ul         [        XyS-   S  5      Ul        WR'                  S5      n	U	S:  a  [	        SSU-  5        US U	 Ul         [        XS-   S  5      Ul        U$ ! [         R                   a  n[	        SU5         S nAGNS nAff = f!   [        SU-   [        R                  S9  [        R                  " S5         GM  = f! [,         a    [	        SSU-  5         Nf = f! [,         a    [	        SSU-  5         U$ f = f)Nr1   z	nVhc:s:du)zclass=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'   rf   r,   r  r  r+   rd   rN   r$  r  r   
COMMASPACEr   r   	localhost	localportr:   
remotehost
remoteport)
optsr   r  optionsoptr   int_size	localspec
remotespecr   s
             r   	parseargsr  
  se   ]]HHQRL+
 iG""!H''+HHQK(("GN%% #%%**K((&*G#$$s8%-"# . 4y1}$	#
	TQG	#
	TQG	!W
a(:??4+@@A 	sA1ua%	12!"1G3	A#$0 	A1ua&34#BQG5 aCD!12 Nq << a,&,3::>,  3a%	123  5a&34N5sG   -G H:H?  I H+G==H3H<?III;:I;__main__rC   r1   )rN   z7Cannot import module "pwd"; try running with -n option.r%   nobodyr{   z3Cannot setuid "nobody"; try running with -n option.)r#   )?r*   osra   r  rV  rZ   r8  test.supportr   r   warningsr   email._header_value_parserr   r   __all__r  programrf   r   rd   rS   r  r;  r.   rH   r   rN  r	   r
   r   r  r  r   r  r  rfindlastdot
__import__r)   localsmodr  r   class_r  r  r  r  r  rN   proxyr  pwdImportErrorr'   r+   r,   getpwnamr  PermissionErrorloopKeyboardInterruptr   r   r   <module>r     s"  R  	      +  D ((1+- 
 i

 z.(%% z.zJ"$$ J"Z7j 7<*
 *Z ?D zkG!!I
i//#&8G,giB4Hgaij)	S)$FG%%w'8'89&&(:(:;%%w7N7NPE ~~	 h'*	IIf7 "  	KRUR\R\]HHQK	  	GcjjYHHQK	
  s6   +F+ G H	 +)GG)HH	HH