eaiovnaovbqoebvqoeavibavo B YI~d@sZddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z m Z dddddgZejdZd ZGd d d Zead Zd ZdZd$ddZGdddejZGdddejZGdddeZGdddeZGdddeZGdddZddZ e!dkrVe Z"e"j#Z#de#krle#$dZ%e&e#de%e'e(dgZ)e#e%ddZ#nddl*Z)e+e)e#Z,e,e"j-e"j.fe"j/e"j0fe"j1e"j2dZ3e"j4r2y ddl5Z5Wn.e6k re7dej8d e9dYnXe5:d!d"Z;ye4e;Wn.ek rTYnXdS)%N)warn) get_addr_specget_angle_addr SMTPChannel SMTPServerDebuggingServer PureProxy MailmanProxyzPython SMTP proxy version 0.3c@seZdZddZddZdS)DevnullcCsdS)N)selfmsgr r */opt/alt/python37/lib64/python3.7/smtpd.pywritefz Devnull.writecCsdS)Nr )r r r rflushgrz Devnull.flushN)__name__ __module__ __qualname__rrr r r rr esr  z, icCs4ttttjd|r&t|tjdt|dS)N)file)print__doc__globalssysstderrexit)coder r r rusagepsrc@seZdZdZdZdZeefddZe ddZ e dd d fd d Z d d Z ddZe ddZejddZe ddZejddZe ddZejddZe ddZejddZe ddZejddZe 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/Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAdBZ#dCdDZ$dEdFZ%dGdHZ&dIdJZ'dKdLZ(dMdNZ)dOdPZ*dQdRZ+dS)SrricCs|S)Nr )xr r r|rzSMTPChannel.cCs*yt|jStk r$|jSXdS)N)maxcommand_size_limitsvalues ValueErrorcommand_size_limit)r r r rmax_command_size_limit~sz"SMTPChannel.max_command_size_limitNFc Cs tjj|||d||_||_||_||_||_||_|rF|rFt d|rdd|_ d|_ d|_ t |_nd|_ d|_ td|_ d |_|d|_d |_|jt|_y||_Wn<tk r}z||jd tjkrdSd}~XYnXtd t |jt!d |"d|jt#fdS)N)mapzFdecode_data and enable_SMTPUTF8 cannot be set to True at the same timerz .rs . FrzPeer:)rz 220 %s %s)$asynchat async_chat__init__ smtp_serverconnaddrdata_size_limitenable_SMTPUTF8 _decode_datar& _emptystring_linesep_dotsepNEWLINE_newlineord_set_rset_state seen_greeting extended_smtpr$clearsocketZgetfqdnfqdnZ getpeernamepeerOSErrorcloseargserrnoZENOTCONNrrepr DEBUGSTREAMpush __version__) r Zserverr1r2r3r)r4 decode_dataerrr r rr/s@   zSMTPChannel.__init__cCs.|j|_d|_g|_d|_d|_|ddS)NFrs )COMMAND smtp_statemailfromrcpttosrequire_SMTPUTF8 num_bytesset_terminator)r r r r_set_post_data_states z SMTPChannel._set_post_data_statecCs|d|_g|_dS)Nr)rT received_datareceived_lines)r r r rr<szSMTPChannel._set_rset_statecCstdtd|jS)NzTAccess to __server attribute on SMTPChannel is deprecated, use 'smtp_server' instead)rDeprecationWarningr0)r r r r__serverszSMTPChannel.__servercCstdtd||_dS)NzRSetting __server attribute on SMTPChannel is deprecated, set 'smtp_server' insteadrW)rrXr0)r valuer r rrYscCstdtd|jS)NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadrW)rrXrV)r r r r__lineszSMTPChannel.__linecCstdtd||_dS)NzSSetting __line attribute on SMTPChannel is deprecated, set 'received_lines' insteadrW)rrXrV)r rZr r rr[scCstdtd|jS)NzRAccess to __state attribute on SMTPChannel is deprecated, use 'smtp_state' insteadrW)rrXrN)r r r r__stateszSMTPChannel.__statecCstdtd||_dS)NzPSetting __state attribute on SMTPChannel is deprecated, set 'smtp_state' insteadrW)rrXrN)r rZr r rr\scCstdtd|jS)NzXAccess to __greeting attribute on SMTPChannel is deprecated, use 'seen_greeting' insteadrW)rrXr=)r r r r __greetingszSMTPChannel.__greetingcCstdtd||_dS)NzVSetting __greeting attribute on SMTPChannel is deprecated, set 'seen_greeting' insteadrW)rrXr=)r rZr r rr]scCstdtd|jS)NzSAccess to __mailfrom attribute on SMTPChannel is deprecated, use 'mailfrom' insteadrW)rrXrO)r r r r __mailfromszSMTPChannel.__mailfromcCstdtd||_dS)NzQSetting __mailfrom attribute on SMTPChannel is deprecated, set 'mailfrom' insteadrW)rrXrO)r rZr r rr^scCstdtd|jS)NzQAccess to __rcpttos attribute on SMTPChannel is deprecated, use 'rcpttos' insteadrW)rrXrP)r r r r __rcpttosszSMTPChannel.__rcpttoscCstdtd||_dS)NzOSetting __rcpttos attribute on SMTPChannel is deprecated, set 'rcpttos' insteadrW)rrXrP)r rZr r rr_scCstdtd|jS)NzTAccess to __data attribute on SMTPChannel is deprecated, use 'received_data' insteadrW)rrXrU)r r r r__dataszSMTPChannel.__datacCstdtd||_dS)NzRSetting __data attribute on SMTPChannel is deprecated, set 'received_data' insteadrW)rrXrU)r rZr r rr`scCstdtd|jS)NzKAccess to __fqdn attribute on SMTPChannel is deprecated, use 'fqdn' insteadrW)rrXrA)r r r r__fqdn szSMTPChannel.__fqdncCstdtd||_dS)NzISetting __fqdn attribute on SMTPChannel is deprecated, set 'fqdn' insteadrW)rrXrA)r rZr r rrascCstdtd|jS)NzKAccess to __peer attribute on SMTPChannel is deprecated, use 'peer' insteadrW)rrXrB)r r r r__peerszSMTPChannel.__peercCstdtd||_dS)NzISetting __peer attribute on SMTPChannel is deprecated, set 'peer' insteadrW)rrXrB)r rZr r rrbscCstdtd|jS)NzKAccess to __conn attribute on SMTPChannel is deprecated, use 'conn' insteadrW)rrXr1)r r r r__conn szSMTPChannel.__conncCstdtd||_dS)NzISetting __conn attribute on SMTPChannel is deprecated, set 'conn' insteadrW)rrXr1)r rZr r rrc%scCstdtd|jS)NzKAccess to __addr attribute on SMTPChannel is deprecated, use 'addr' insteadrW)rrXr2)r r r r__addr+szSMTPChannel.__addrcCstdtd||_dS)NzISetting __addr attribute on SMTPChannel is deprecated, set 'addr' insteadrW)rrXr2)r rZr r rrd0scCs&tj|t|d|jrdnddS)Nz zutf-8ascii)r-r.rIbytesrQ)r r r r rrI7s zSMTPChannel.pushcCs|d}|j|jkr|j}n|j|jkr*|j}|r<|j|krr$r'getattrrgr3splitr7r8rir:rUrBrOrProrpr0process_messagerT) r lineZszicommandargZmax_szmethodrktextrEkwargsstatusr r rfound_terminatorLsd        zSMTPChannel.found_terminatorcCsH|s|ddS|jr&|ddS|||_|d|jdS)Nz501 Syntax: HELO hostnamez503 Duplicate HELO/EHLOz250 %s)rIr=r<rA)r r{r r r smtp_HELOs  zSMTPChannel.smtp_HELOcCs|s|ddS|jr&|ddS|||_d|_|d|j|jrr|d|j|jdd7<|js|d|jr|d |jdd 7<|d dS) Nz501 Syntax: EHLO hostnamez503 Duplicate HELO/EHLOTz250-%sz 250-SIZE %sMAILz 250-8BITMIMEz 250-SMTPUTF8 z250 HELP) rIr=r<r>rAr3r$r5r4)r r{r r r smtp_EHLOs&    zSMTPChannel.smtp_EHLOcCs|r|dn |ddS)Nz501 Syntax: NOOPz250 OK)rI)r r{r r r smtp_NOOPs zSMTPChannel.smtp_NOOPcCs|d|dS)Nz221 Bye)rIZclose_when_done)r r{r r r smtp_QUITs zSMTPChannel.smtp_QUITcCs0t|}|d||kr,||dSdS)Nr)rhrsrt)r keywordr{Zkeylenr r r_strip_command_keywordsz"SMTPChannel._strip_command_keywordcCsF|sdS|dr$t|\}}n t|\}}|s<||fS|j|fS)N)rr<)lstrip startswithrrZ addr_spec)r r{addressrestr r r_getaddrs zSMTPChannel._getaddrcCsJi}x@|D]8}|d\}}}|r.|r2|s2dS|r:|nd||<q W|S)N=T) partitionisalnum)r paramsresultZparameqrZr r r _getparamss zSMTPChannel._getparamscCs|rd}|}|dkr$|dq|dkr8|dq|dkr^d}|jrR||7}||q|dkrd }|jrx||7}||q|d kr|d q|d kr|d q|dkr|dq|dkr|dq|dkr|dq|dn |ddS)Nz [SP ]ZEHLOz250 Syntax: EHLO hostnameZHELOz250 Syntax: HELO hostnamerz 250 Syntax: MAIL FROM:
ZRCPTz250 Syntax: RCPT TO:
rgz250 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)rsrIr>)r r{ZextendedZlc_argr r r r smtp_HELPs:          zSMTPChannel.smtp_HELPcCs@|r2||\}}|r"|dq<|d|n |ddS)NzB252 Cannot VRFY user, but will accept message and attempt deliveryz502 Could not VRFY %sz501 Syntax: VRFY
)rrI)r r{rrr r r smtp_VRFYs  zSMTPChannel.smtp_VRFYcCs|js|ddStd|tdd}|jr4|d7}|dkrJ||dS|d|}||\}}|sv||dS|js|r||dS|jr|ddS| |_ | |j }|dkr||dS|j s| dd }|d kr|d dS|jr8| d d }|dkr d|_n|d k r8|ddS| dd}|r|sb||dS|jrt||jkr|ddSt|dkr|ddS||_td|jtd|ddS)Nz503 Error: send HELO firstz ===> MAIL)rz 501 Syntax: MAIL FROM:
z [SP ]zFROM:z503 Error: nested MAIL commandZBODY7BIT)rZ8BITMIMEz1501 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:z250 OK)r=rIrrHr>rrrOrsrvrorr5popr4rQisdigitr3intrhkeys)r r{ syntaxerrrrZbodysmtputf8sizer r r smtp_MAILsh                    zSMTPChannel.smtp_MAILcCs|js|ddStd|td|js6|ddSd}|jrH|d7}|dkr^||dS|d|}||\}}|s||dS|js|r||dS| |_ | |j }|dkr||dSt | dkr|d dS|j|td |jtd|d dS) Nz503 Error: send HELO firstz ===> RCPT)rz503 Error: need MAIL commandz501 Syntax: RCPT TO:
z [SP ]zTO:rz8555 RCPT TO parameters not recognized or not implementedzrecips:z250 OK)r=rIrrHrOr>rrrsrvrprrhrrPri)r r{rrrr r r smtp_RCPT7s@           zSMTPChannel.smtp_RCPTcCs(|r|ddS||ddS)Nz501 Syntax: RSETz250 OK)rIr<)r r{r r r smtp_RSETZs  zSMTPChannel.smtp_RSETcCsZ|js|ddS|js(|ddS|r:|ddS|j|_|d|ddS)Nz503 Error: send HELO firstz503 Error: need RCPT commandz501 Syntax: DATAs . z#354 End data with .)r=rIrPrgrNrS)r r{r r r smtp_DATAas    zSMTPChannel.smtp_DATAcCs|ddS)Nz502 EXPN not implemented)rI)r r{r r r smtp_EXPNpszSMTPChannel.smtp_EXPN),rrrrMrgr' collections defaultdictr$propertyr(DATA_SIZE_DEFAULTr/rTr<Z_SMTPChannel__serversetterZ_SMTPChannel__lineZ_SMTPChannel__stateZ_SMTPChannel__greetingZ_SMTPChannel__mailfromZ_SMTPChannel__rcpttosZ_SMTPChannel__dataZ_SMTPChannel__fqdnZ_SMTPChannel__peerZ_SMTPChannel__connZ_SMTPChannel__addrrIrmrrrrrrrrrrrrrrrr r r rrws` &            >   # 6#c@s2eZdZeZedddfddZddZddZdS) rNFcCs||_||_||_||_||_|r.|r.tdtjj||dyNt j |dt j i}| |dd|dd| |||dWn|Yn(Xtd|jjtt||ftddS) NzFdecode_data and enable_SMTPUTF8 cannot be set to True at the same time)r)typerr z0%s started at %s Local addr: %s Remote addr:%s)r)Z _localaddr _remoteaddrr3r4r5r&asyncore dispatcherr/r@Z getaddrinfoZ SOCK_STREAMZ create_socketZset_reuse_addrZbindZlistenrDr __class__rtimectimerH)r Z localaddrZ remoteaddrr3r)r4rKZ gai_resultsr r rr/xs*  zSMTPServer.__init__c Cs6tdt|td|||||j|j|j|j}dS)NzIncoming connection from %s)r)rrGrH channel_classr3Z_mapr4r5)r r1r2Zchannelr r rhandle_acceptedszSMTPServer.handle_acceptedcKstdS)N)NotImplementedError)r rBrOrPrkr~r r rrwszSMTPServer.process_message) rrrrrrr/rrwr r r rrts  c@seZdZddZddZdS)rcCspd}|}x^|D]V}|rN|sNd|d}t|tsBt|d}t|d}t|ts`t|}t|qWdS)Nr zX-Peer: rzutf-8) splitlines isinstancerjrGencoder)r rBrkZ inheaderslinesrxZ peerheaderr r r_print_message_contents    z&DebuggingServer._print_message_contentcKsXtd|r@|dr&td|d|dr@td|d|||tddS)Nz%---------- MESSAGE FOLLOWS ----------rozmail options: %srpzrcpt options: %s z%------------ END MESSAGE ------------)rgetr)r rBrOrPrkr~r r rrws   zDebuggingServer.process_messageN)rrrrrwr r r rrscs,eZdZfddZddZddZZS)rcs.d|kr|drtdtt|j||dS)Nr4z$PureProxy does not support SMTPUTF8.)r&superrr/)r rEr~)rr rr/szPureProxy.__init__c Csh|d}d}x|D]}|sP|d7}qW||d|dt|}||||}td|tddS)Nrrr z X-Peer: %szwe got some refusals:)r)rvinsertr9rq_deliverrrH) r rBrOrPrkrryrxrefusedr r rrws    zPureProxy.process_messagec Csddl}i}yB|}||jd|jdz||||}Wd|XWn|jk r}ztdtd|j }Wdd}~XYnjt |j fk r}zFtd|j tdt |dd}t |dd } x|D]} || f|| <qWWdd}~XYnX|S) Nrr zgot SMTPRecipientsRefused)rZgotZ smtp_codeZ smtp_errorignore)smtplibZSMTPZconnectrZsendmailquitZSMTPRecipientsRefusedrrHZ recipientsrCZ SMTPExceptionrru) r rOrPrkrrseZerrcodeerrmsgrr r rrs$    "zPureProxy._deliver)rrrr/rwr __classcell__r r )rrrs cs$eZdZfddZddZZS)r cs.d|kr|drtdtt|j||dS)Nr4z'MailmanProxy does not support SMTPUTF8.)r&rrr/)r rEr~)rr rr/ szMailmanProxy.__init__cCs8ddlm}ddlm}ddlm}ddlm}g} x||D]t} | dd} | d} t| dkrhq:| d} t| dkr| d }nd }| | r:|d krq:| | | |fq:Wx| D]\} } }| | qWt d d |td|r||||}t d|tdi}||}||}|ds0||d<|dsNtt|d<x| D]\} } }t d| td|| }|s|j| dd}||| <|d kr|j|d dn|dkr|j|d dnh|dkr|j|d dnN|dkr|j|d dn4|dkrT|dkrd|d <nd!|d <|j|d dqTWdS)"Nr)StringIO)Utils)Message)MailList@-rWr r)radminownerrequestrqleavezforwarding recips:rn)rzwe got refusals:fromZFromZdateZDatezsending message to)lock)tolistr)Ztoadminr)Ztoownerr)Z torequest)rqrrqZ subscribeZSubjectZ unsubscribe)iorZMailmanrrrlowerrvrhZ list_existsriremoverrqrHrrrrZEnqueue)r rBrOrPrkrrrrZ listnamesZrcptZlocalpartsZlistnamerzrZmlistsrr Zmlistr r rrwsd                     zMailmanProxy.process_message)rrrr/rwrr r )rrr s c@seZdZdZdZdZdZdS)OptionsTrNF)rrrsetuid classname size_limitr4r r r rr_src Csty.ttjdddddddddd g\}}Wn.tjk r\}ztd|Wdd}~XYnXt}x|D]\}}|d krtd qj|d krtttd qj|d krd|_ qj|dkr||_ qj|dkrtj a qj|dkrd|_ qj|dkrjyt|}||_Wqjtd|tj dtdYqjXqjWt|dkr@d}d}nPt|dkr\|d }d}n4t|dkr||d }|d}ntddt||d} | d krtdd||d| |_yt|| dd|_Wn$tk rtdd|YnX|d} | d kr"tdd||d| |_yt|| dd|_Wn$tk rntdd|YnX|S) Nr z nVhc:s:duzclass=Znosetuidversionhelpzsize=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:25rWzInvalid arguments: %s:zBad local spec: %szBad local port: %szBad remote spec: %szBad remote port: %s)getoptrargverrorrrrrJrrrrrHr4rrrh COMMASPACErqrr localhost localportr& remotehost remoteport) ZoptsrEroptionsoptr{Zint_sizeZ localspecZ remotespecryr r r parseargsfsp         r__main__r*r )r4z7Cannot import module "pwd"; try running with -n option.)rnobodyrWz3Cannot setuid "nobody"; try running with -n option.)r)?rosrFrrr@rr-rwarningsrZemail._header_value_parserrr__all__rZprogramrJr rHr9rrrr.rrrrrr rrrrrrfindZlastdot __import__rlocalsmodrruclass_rrrrrr4proxyrpwd ImportErrorrrrgetpwnamrPermissionErrorZloopKeyboardInterruptr r r rPsv   M-SB