o ?Ogj‰ã@s^ ddlZddlZddlZddlZddlZddlZddlZddlmZddl m Z m Z gd¢Z ede ddddlZddlZejdZdZGd d „d ƒZeƒad Zd Zd Zd'dd„ZGdd„dejƒZGdd„dejƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„dƒZ dd„Z!e"dkr-e!ƒZ#e#j$Z$d e$vrºe$ %d ¡Z&e'e$de&…e(ƒe)ƒdgƒZ*e$e&d!d…Z$nddl+Z*e,e*e$ƒZ-e-e#j.e#j/fe#j0e#j1fe#j2e#j3d"Z4e#j5rzddl6Z6Wne7yôe8d#ej9d$e :d!¡Ynwe6 ;d%¡dZ¡WdSe?y,YdSwdS)(éN)Úwarn)Ú get_addr_specÚget_angle_addr)Ú SMTPChannelÚ SMTPServerÚDebuggingServerÚ PureProxyÚ MailmanProxyz¬The smtpd module is deprecated and unmaintained and will be removed in Python 3.12. Please see aiosmtpd (https://aiosmtpd.readthedocs.io/) for the recommended replacement.é)Ú stacklevelzPython SMTP proxy version 0.3c@óeZdZdd„Zdd„ZdS)ÚDevnullcCódS©N©©ÚselfÚmsgrrú,/opt/alt/python310/lib64/python3.10/smtpd.pyÚwriteróz Devnull.writecCrrr©rrrrÚflushsrz Devnull.flushN)Ú__name__Ú __module__Ú __qualname__rrrrrrr qs r Ú z, iÚcCs4tttƒtjd|rt|tjdt |¡dS)N©Úfile)ÚprintÚ__doc__ÚglobalsÚsysÚstderrÚexit)ÚcoderrrrÚusage|sr'c@sþeZdZdZdZdZe efdd„¡Ze dd„ƒZ e dd d fd d „Z d d „Z dd„Ze dd„ƒZejdd„ƒZe dd„ƒZejdd„ƒZe dd„ƒZejdd„ƒZe dd„ƒZejdd„ƒZe dd„ƒZejdd„ƒZe dd „ƒZejd!d „ƒZe d"d#„ƒZejd$d#„ƒZe d%d&„ƒZejd'd&„ƒZe d(d)„ƒZejd*d)„ƒZe d+d,„ƒZejd-d,„ƒZe d.d/„ƒZejd0d/„ƒZd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„Zd;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+dS)SrréicCs|Srr)ÚxrrrÚˆrzSMTPChannel.cCs*zt|j ¡ƒWSty|jYSwr)ÚmaxÚcommand_size_limitsÚvaluesÚ ValueErrorÚcommand_size_limitrrrrÚmax_command_size_limitŠs   ÿz"SMTPChannel.max_command_size_limitNFc Cs tjj|||d||_||_||_||_||_||_|r#|r#t dƒ‚|r2d|_ d|_ d|_ t |_nd|_ d|_ tdƒ|_ d |_| ¡d|_d |_|j ¡t ¡|_z| ¡|_Wntyy}z| ¡|jtjkrn‚WYd}~dSd}~wwtd t|jƒt d | !d |jt"f¡dS)N©ÚmapúFdecode_data and enable_SMTPUTF8 cannot be set to True at the same timerú Ú.óó ó.ó FzPeer:rz 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ÚsocketZgetfqdnÚfqdnZ getpeernameÚpeerÚOSErrorÚcloseÚerrnoZENOTCONNr ÚreprÚ DEBUGSTREAMÚpushÚ __version__) rZserverr>r?r@r2rAÚ decode_dataÚerrrrrr<‘sD    €úzSMTPChannel.__init__cCs0 |j|_d|_g|_d|_d|_| d¡dS)NFrr7)ÚCOMMANDÚ smtp_stateÚmailfromÚrcpttosÚrequire_SMTPUTF8Ú num_bytesÚset_terminatorrrrrÚ_set_post_data_state¸sz SMTPChannel._set_post_data_statecCs | ¡d|_g|_dS©Nr)r`Ú received_dataÚreceived_linesrrrrrIÁs zSMTPChannel._set_rset_statecCótdtdƒ|jS)NzTAccess to __server attribute on SMTPChannel is deprecated, use 'smtp_server' insteadr ©rÚDeprecationWarningr=rrrrÚ__serverÉóÿzSMTPChannel.__servercCótdtdƒ||_dS)NzRSetting __server attribute on SMTPChannel is deprecated, set 'smtp_server' insteadr re©rÚvaluerrrrgÎóÿ cCrd)NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadr ©rrfrcrrrrÚ__lineÔrhzSMTPChannel.__linecCri)NzSSetting __line attribute on SMTPChannel is deprecated, set 'received_lines' insteadr rmrjrrrrnÙrlcCrd)NzRAccess to __state attribute on SMTPChannel is deprecated, use 'smtp_state' insteadr ©rrfrZrrrrÚ__stateßrhzSMTPChannel.__statecCri)NzPSetting __state attribute on SMTPChannel is deprecated, set 'smtp_state' insteadr rorjrrrrpärlcCrd)NzXAccess to __greeting attribute on SMTPChannel is deprecated, use 'seen_greeting' insteadr ©rrfrJrrrrÚ __greetingêrhzSMTPChannel.__greetingcCri)NzVSetting __greeting attribute on SMTPChannel is deprecated, set 'seen_greeting' insteadr rqrjrrrrrïrlcCrd)NzSAccess to __mailfrom attribute on SMTPChannel is deprecated, use 'mailfrom' insteadr ©rrfr[rrrrÚ __mailfromõrhzSMTPChannel.__mailfromcCri)NzQSetting __mailfrom attribute on SMTPChannel is deprecated, set 'mailfrom' insteadr rsrjrrrrtúrlcCrd)NzQAccess to __rcpttos attribute on SMTPChannel is deprecated, use 'rcpttos' insteadr ©rrfr\rrrrÚ __rcpttosrhzSMTPChannel.__rcpttoscCri)NzOSetting __rcpttos attribute on SMTPChannel is deprecated, set 'rcpttos' insteadr rurjrrrrvrlcCrd)NzTAccess to __data attribute on SMTPChannel is deprecated, use 'received_data' insteadr ©rrfrbrrrrÚ__data rhzSMTPChannel.__datacCri)NzRSetting __data attribute on SMTPChannel is deprecated, set 'received_data' insteadr rwrjrrrrxrlcCrd)NzKAccess to __fqdn attribute on SMTPChannel is deprecated, use 'fqdn' insteadr ©rrfrNrrrrÚ__fqdnrhzSMTPChannel.__fqdncCri)NzISetting __fqdn attribute on SMTPChannel is deprecated, set 'fqdn' insteadr ryrjrrrrzrlcCrd)NzKAccess to __peer attribute on SMTPChannel is deprecated, use 'peer' insteadr ©rrfrOrrrrÚ__peer!rhzSMTPChannel.__peercCri)NzISetting __peer attribute on SMTPChannel is deprecated, set 'peer' insteadr r{rjrrrr|&rlcCrd)NzKAccess to __conn attribute on SMTPChannel is deprecated, use 'conn' insteadr ©rrfr>rrrrÚ__conn,rhzSMTPChannel.__conncCri)NzISetting __conn attribute on SMTPChannel is deprecated, set 'conn' insteadr r}rjrrrr~1rlcCrd)NzKAccess to __addr attribute on SMTPChannel is deprecated, use 'addr' insteadr ©rrfr?rrrrÚ__addr7rhzSMTPChannel.__addrcCri)NzISetting __addr attribute on SMTPChannel is deprecated, set 'addr' insteadr rrjrrrr€<rlcCs&tj |t|d|jr dndƒ¡dS)Nr4úutf-8Úascii)r:r;rUÚbytesr]rrrrrUCs  ÿzSMTPChannel.pushcCs~d}|j|jkr |j}n |j|jkr|j}|r|j|krdS|r)|jt|ƒ7_|jr7|j  t |dƒ¡dS|j  |¡dS)Nr) rZrYr0ÚDATAr@r^ÚlenrBrcÚappendÚstr)rÚdataÚlimitrrrÚcollect_incoming_dataHs  z!SMTPChannel.collect_incoming_datac Cs|j |j¡}tdt|ƒtdg|_|j|jkr‚|jd}|_|s)|  d¡dS|j s1t |dƒ}|  d¡}|dkrA|  ¡}d}n|d|…  ¡}||dd… ¡}|jr[|j|n|j}||kri|  d¡dSt|d |dƒ}|s||  d |¡dS||ƒdS|j|jkr’|  d ¡d|_dS|jr¥|j|jkr¥|  d ¡d|_dSg}| |j¡D]} | rÂ| d|jkrÂ| | dd…¡q­| | ¡q­|j |¡|_|j|j|j|jf} i} |j så|j|jd œ} |j j!| i| ¤Ž} | "¡| sû|  d¡dS|  | ¡dS)NzData:rrz500 Error: bad syntaxrú r(z500 Error: line too longZsmtp_z&500 Error: command "%s" not recognizedz451 Internal confusionz552 Error: Too much mail data)Ú mail_optionsÚ rcpt_optionsú250 OK)#rCÚjoinrcr rSrTrZrYr^rUrBr‡ÚfindÚupperÚstriprKr,r/Úgetattrr„r@ÚsplitrDrEr†rGrbrOr[r\rŒrr=Úprocess_messager`) rÚlineZszÚiÚcommandÚargZmax_szÚmethodrˆÚtextÚargsÚkwargsZstatusrrrÚfound_terminatorXsl     ÿÿ     þzSMTPChannel.found_terminatorcCsH|s | d¡dS|jr| d¡dS| ¡||_| d|j¡dS)Nz501 Syntax: HELO hostnameú503 Duplicate HELO/EHLOz250 %s)rUrJrIrN©rr™rrrÚ smtp_HELO–s  zSMTPChannel.smtp_HELOcCs²|s | d¡dS|jr| d¡dS| ¡||_d|_| d|j¡|jr9| d|j¡|jdd7<|jsA| d¡|jrR| d ¡|jdd 7<| d ¡dS) Nz501 Syntax: EHLO hostnamerŸTz250-%sz 250-SIZE %sÚMAILéz 250-8BITMIMEz 250-SMTPUTF8é z250 HELP) rUrJrIrKrNr@r,rBrAr rrrÚ smtp_EHLO¢s&    zSMTPChannel.smtp_EHLOcCs |r | d¡dS| d¡dS)Nz501 Syntax: NOOPrŽ©rUr rrrÚ smtp_NOOP¸szSMTPChannel.smtp_NOOPcCs| d¡| ¡dS)Nz221 Bye)rUZclose_when_doner rrrÚ smtp_QUIT¾s  zSMTPChannel.smtp_QUITcCs0t|ƒ}|d|… ¡|kr||d… ¡SdSra)r…r‘r’)rÚkeywordr™ZkeylenrrrÚ_strip_command_keywordÃsz"SMTPChannel._strip_command_keywordcCsF|sdS| ¡ d¡rt|ƒ\}}nt|ƒ\}}|s||fS|j|fS)N)rrú<)ÚlstripÚ startswithrrZ addr_spec)rr™ÚaddressÚrestrrrÚ_getaddrÉs  zSMTPChannel._getaddrcCsHi}|D]}| d¡\}}}| ¡r|r|sdS|r|nd||<q|S)Nú=T)Ú partitionÚisalnum)rÚparamsÚresultZparamÚeqrkrrrÚ _getparamsÔszSMTPChannel._getparamscCs|r„d}| ¡}|dkr| d¡dS|dkr| d¡dS|dkr2d}|jr+||7}| |¡dS|dkrFd }|jr?||7}| |¡dS|d krQ| d ¡dS|d kr\| d ¡dS|dkrg| d¡dS|dkrr| d¡dS|dkr}| d¡dS| d¡dS| d¡dS)Nú [SP ]ZEHLOz250 Syntax: EHLO hostnameZHELOz250 Syntax: HELO hostnamer¢z 250 Syntax: MAIL FROM:
ZRCPTz250 Syntax: RCPT TO:
r„z250 Syntax: DATAZRSETz250 Syntax: RSETZNOOPz250 Syntax: NOOPZQUITz250 Syntax: QUITZVRFYz250 Syntax: VRFY
zD501 Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFYzD250 Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)r‘rUrK)rr™ZextendedZlc_argrrrrÚ smtp_HELPßs:zSMTPChannel.smtp_HELPcCsD|r| |¡\}}|r| d¡dS| d|¡dS| d¡dS)NzB252 Cannot VRFY user, but will accept message and attempt deliveryz502 Could not VRFY %sz501 Syntax: VRFY
)r°rU)rr™r®r´rrrÚ smtp_VRFYs zSMTPChannel.smtp_VRFYcCs¼|js | d¡dStd|tdd}|jr|d7}|dur%| |¡dS| d|¡}| |¡\}}|s;| |¡dS|jsG|rG| |¡dS|jrQ| d¡dS| ¡  ¡|_ |  |j ¡}|duri| |¡dS|j s}|  dd ¡}|d vr}| d ¡dS|jr™|  d d ¡}|durŽd|_n |d ur™| d¡dS|  dd¡}|r½| ¡s¬| |¡dS|jr½t|ƒ|jkr½| d¡dSt| ¡ƒdkrÌ| d¡dS||_td|jtd| d¡dS)Nú503 Error: send HELO firstz ===> MAILrz 501 Syntax: MAIL FROM:
r¸zFROM:z503 Error: nested MAIL commandZBODYÚ7BIT)r¼Z8BITMIMEz1501 Error: BODY can only be one of 7BIT, 8BITMIMEZSMTPUTF8FTz&501 Error: SMTPUTF8 takes no argumentsZSIZEz:552 Error: message size exceeds fixed maximum message sizerz:555 MAIL FROM parameters not recognized or not implementedzsender:rŽ)rJrUr rTrKrªr°r[r‘r”rŒr·rBÚpoprAr]Úisdigitr@Úintr…Úkeys)rr™Ú syntaxerrr®r´ÚbodyÚsmtputf8ÚsizerrrÚ smtp_MAIL sh                 zSMTPChannel.smtp_MAILcCs|js | d¡dStd|td|js| d¡dSd}|jr$|d7}|dur/| |¡dS| d|¡}| |¡\}}|sE| |¡dS|jsQ|rQ| |¡dS| ¡  ¡|_ |  |j ¡}|duri| |¡dSt |  ¡ƒdkrx| d ¡dS|j |¡td |jtd| d ¡dS) Nr»z ===> RCPTrz503 Error: need MAIL commandz501 Syntax: RCPT TO:
r¸zTO:rz8555 RCPT TO parameters not recognized or not implementedzrecips:rŽ)rJrUr rTr[rKrªr°r‘r”rr·r…rÀr\r†)rr™rÁr®r´rrrÚ smtp_RCPTCs@           zSMTPChannel.smtp_RCPTcCs(|r | d¡dS| ¡| d¡dS)Nz501 Syntax: RSETrŽ)rUrIr rrrÚ smtp_RSETfs  zSMTPChannel.smtp_RSETcCsZ|js | d¡dS|js| d¡dS|r| d¡dS|j|_| d¡| d¡dS)Nr»z503 Error: need RCPT commandz501 Syntax: DATAs . z#354 End data with .)rJrUr\r„rZr_r rrrÚ smtp_DATAms    zSMTPChannel.smtp_DATAcCs| d¡dS)Nz502 EXPN not implementedr¦r rrrÚ smtp_EXPN|szSMTPChannel.smtp_EXPN),rrrrYr„r/Ú collectionsÚ defaultdictr,Úpropertyr0ÚDATA_SIZE_DEFAULTr<r`rIZ_SMTPChannel__serverÚsetterZ_SMTPChannel__lineZ_SMTPChannel__stateZ_SMTPChannel__greetingZ_SMTPChannel__mailfromZ_SMTPChannel__rcpttosZ_SMTPChannel__dataZ_SMTPChannel__fqdnZ_SMTPChannel__peerZ_SMTPChannel__connZ_SMTPChannel__addrrUrŠržr¡r¥r§r¨rªr°r·r¹rºrÅrÆrÇrÈrÉrrrrrƒs’  ÿ'                       >   # 6# rc@s2eZdZeZedddfdd„Zdd„Zdd„ZdS) rNFcCsÈ||_||_||_||_||_|r|rtdƒ‚tjj||dz't j |dt j iŽ}|  |dd|dd¡|  ¡| |¡| d¡Wn| ¡‚td|jjt t ¡¡||ftddS) Nr3r1Útyperr(éz0%s started at %s Local addr: %s Remote addr:%sr)Z _localaddrÚ _remoteaddrr@rArBr.ÚasyncoreÚ dispatcherr<rMZ getaddrinfoZ SOCK_STREAMZ create_socketZset_reuse_addrZbindZlistenrQr Ú __class__rÚtimeÚctimerT)rZ localaddrZ remoteaddrr@r2rArWZ gai_resultsrrrr<„s2ÿ þ þzSMTPServer.__init__c Cs6tdt|ƒtd| ||||j|j|j|j¡}dS)NzIncoming connection from %sr)r rSrTÚ channel_classr@Ú_maprArB)rr>r?ZchannelrrrÚhandle_accepted súzSMTPServer.handle_acceptedcKs t‚r)ÚNotImplementedError©rrOr[r\rˆrrrrr•«szSMTPServer.process_message) rrrrr×rÍr<rÙr•rrrrr€s þ rc@r )rcCsld}| ¡}|D]+}|r&|s&d|d}t|tƒs t| d¡ƒ}t|ƒd}t|tƒs/t|ƒ}t|ƒqdS)Nr(zX-Peer: rr)Ú splitlinesÚ isinstancer‡rSÚencoder )rrOrˆZ inheadersÚlinesr–Z peerheaderrrrÚ_print_message_contentÏs    ôz&DebuggingServer._print_message_contentcKsXtdƒ|r | d¡rtd|dƒ| d¡r td|dƒ| ||¡tdƒdS)Nz%---------- MESSAGE FOLLOWS ----------rŒzmail options: %srzrcpt options: %s z%------------ END MESSAGE ------------)r ÚgetràrÛrrrr•às    zDebuggingServer.process_messageN)rrrràr•rrrrrÍs rcs,eZdZ‡fdd„Zdd„Zdd„Z‡ZS)rcs2d|vr |dr tdƒ‚tt|ƒj|i|¤ŽdS)NrAz$PureProxy does not support SMTPUTF8.)r.Úsuperrr<©rrœr©rÔrrr<ìszPureProxy.__init__c Csf| d¡}d}|D] }|sn|d7}q | |d|d¡t |¡}| |||¡}td|tddS)Nrrr(z X-Peer: %szwe got some refusals:r)r”ÚinsertrFrÚ_deliverr rT) rrOr[r\rˆrßr—r–Úrefusedrrrr•ñs   zPureProxy.process_messagec Csúddl}i}z%| ¡}| |jd|jd¡z| |||¡}W| ¡W|S| ¡w|jyH}ztdtd|j }WYd}~|Sd}~wt |j fy|}z&td|j tdt |ddƒ}t |dd ƒ} |D]} || f|| <qhWYd}~|Sd}~ww) Nrr(zgot SMTPRecipientsRefusedrZgotZ smtp_codeéÿÿÿÿZ smtp_errorÚignore)ÚsmtplibZSMTPZconnectrÑZsendmailÚquitZSMTPRecipientsRefusedr rTZ recipientsrPZ SMTPExceptionrÔr“) rr[r\rˆrêrçÚsÚeZerrcodeÚerrmsgÚrrrrræÿs2  ó  €÷   ÿ€÷zPureProxy._deliver)rrrr<r•ræÚ __classcell__rrrärrës rcs$eZdZ‡fdd„Zdd„Z‡ZS)r cs>tdtdƒd|vr|drtdƒ‚tt|ƒj|i|¤ŽdS)Nz8MailmanProxy is deprecated and will be removed in futurer rAz'MailmanProxy does not support SMTPUTF8.)rrfr.rârr<rãrärrr<s ÿzMailmanProxy.__init__cCsddlm}ddlm}ddlm}ddlm}g} |D]:} |  ¡ d¡d} |  d¡} t| ƒdkr3q| d} t| ƒdkrB| d }nd }|  | ¡rM|d vrNq|   | | |f¡q| D] \} } }|  | ¡qYt d d   |¡td|r~| |||¡}t d|tdi}||ƒ}| |¡}| d¡s’||d<| d¡s t t ¡¡|d<| D]g\} } }t d| td| | ¡}|sÀ|j| dd}||| <|d krÌ|j|d dq¢|dkrØ|j|d dq¢|dkrä|j|d dq¢|dkrð|j|d dq¢|dvr |dkrþd|d <nd!|d <|j|d dq¢dS)"Nr)ÚStringIO)ÚUtils)ÚMessage)ÚMailListú@ú-r r(r)rÚadminÚownerÚrequestrÚleavezforwarding recips:r‹rzwe got refusals:ÚfromZFromÚdateZDatezsending message to)Úlock)Útolistr÷)Ztoadminrø)Ztoownerrù)Z torequest)rrúrZ subscribeZSubjectZ unsubscribe)ÚiorñZMailmanròrórôÚlowerr”r…Z list_existsr†Úremover rrTrærárÕrÖZEnqueue)rrOr[r\rˆrñròrórôZ listnamesZrcptZlocalÚpartsZlistnamer˜rçZmlistsrìrZmlistrrrr• sf               €êzMailmanProxy.process_message)rrrr<r•rðrrrärr s r c@seZdZdZdZdZdZdS)ÚOptionsTrNF)rrrÚsetuidÚ classnameÚ size_limitrArrrrrms rc CsXzt tjdd…dgd¢¡\}}Wntjy*}z td|ƒWYd}~nd}~wwtƒ}|D]\\}}|dvr=tdƒq0|dvrKttƒt d¡q0|dvrSd|_ q0|d vr[||_ q0|d vrctj a q0|d vrkd |_ q0|d vrŒz t|ƒ}||_Wq0td|tj dt d¡Yq0q0t|ƒdkr˜d}d}n&t|ƒdkr¥|d}d}nt|ƒdkr´|d}|d}n tddt |¡ƒ| d¡} | dkrÎtdd|ƒ|d| …|_z t|| dd…ƒ|_Wntyòtdd|ƒYnw| d¡} | dkrtdd|ƒ|d| …|_zt|| dd…ƒ|_W|Sty+tdd|ƒY|Sw)Nr(z nVhc:s:du)zclass=ZnosetuidÚversionÚhelpzsize=ÚdebugrÃ)z-hz--helpr)z-Vz --version)z-nz --nosetuidF)z-cz--class)z-dz--debug)z-uz --smtputf8T)z-sz--sizezInvalid size: rzlocalhost:8025z localhost:25r ézInvalid arguments: %sú:zBad local spec: %szBad local port: %szBad remote spec: %szBad remote port: %s)Úgetoptr#ÚargvÚerrorr'rr rVr%rrr$rTrAr¿rr…Ú COMMASPACErrÚ localhostÚ localportr.Ú remotehostÚ remoteport) ZoptsrœríÚoptionsÚoptr™Zint_sizeZ localspecZ remotespecr—rrrÚ parseargsts| þ€ÿ    ú      ÿ  þþrÚ__main__r5r()rAz7Cannot import module "pwd"; try running with -n option.rÚnobodyz3Cannot setuid "nobody"; try running with -n option.)r)@r#ÚosrRr rÕrMrÊÚwarningsrZemail._header_value_parserrrÚ__all__rfrÒr:r ZprogramrVr rTrFrrÍr'r;rrÓrrrr rrrrrÚrfindZlastdotÚ __import__r"ÚlocalsÚmodrr“Zclass_rrrrrrAÚproxyrÚpwdÚ ImportErrorr r$r%ÚgetpwnamrÚPermissionErrorZloopÚKeyboardInterruptrrrrÚsŒN û   M-U B    þ  þþÿä