:̜(dZddlZddlZddlZddlZddlZddlZddlZddlm Z m Z ddl m Z ddl mZmZgdZej"dZdZGdd Zead Zd Zd Zd#dZGdde j4ZGdde j8ZGddeZGddeZGddZ dZ!e"dk(re!Z#e#jHZ$de$vr3e$jKdZ&e'e$de&e(e)d gZ*e$e&dzdZ$nddl+Z*e,e*e$Z-e-e#j\e#j^fe#j`e#jbfe#jde#jfZ4e#jjr- ddl6Z6e6jvd d!Z< ejje< e j|yy#e7$r)e8dejrejtdYiwxYw#e=$r)e8d"ejrejtdYrwxYw#e?$rYywxYw)$aAn RFC 5321 smtp proxy with optional RFC 1870 and RFC 6531 extensions. 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. --size limit -s limit Restrict the total size of the incoming message to "limit" number of bytes via the RFC 1870 SIZE extension. Defaults to 33554432 bytes. --smtputf8 -u Enable the SMTPUTF8 extension and behave as an RFC 6531 smtp proxy. --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. N)asyncoreasynchat)warn) get_addr_specget_angle_addr) SMTPChannel SMTPServerDebuggingServer PureProxyzPython SMTP proxy version 0.3ceZdZdZdZy)DevnullcyNselfmsgs 9/opt/alt/python312/lib64/python3.12/test/support/smtpd.pywritez Devnull.write]s$cyrrrs rflushz Devnull.flush^sTrN)__name__ __module__ __qualname__rrrrrr r \srr  z, ictttztj|rt|tjtj |y)Nfile)print__doc__globalssysstderrexit)coders rusager)gs3 'GI CJJ/  c #HHTNrceZdZdZdZdZejefdZe dZ e dddfdZ d Z d Ze d Zej d Ze d Zej dZe dZej dZe dZej dZe dZej dZe dZej dZe dZej dZe dZej dZe dZej dZe dZej dZe dZej d Zd!Zd"Zd#Zd$Zd%Zd&Z d'Z!d(Z"d)Z#d*Z$d+Z%d,Z&d-Z'd.Z(d/Z)d0Z*d1Z+y)2rric|Srr)xs rzSMTPChannel.ssqrc t|jjS#t$r|jcYSwxYwr)maxcommand_size_limitsvalues ValueErrorcommand_size_limitrs rmax_command_size_limitz"SMTPChannel.max_command_size_limitus< +t//6689 9 +** * +s "%==NFc4tjj|||||_||_||_||_||_||_|r |r td|r!d|_ d|_ d|_ t|_n%d|_ d|_ td|_ d |_|j!d|_d |_|j&j)t+j,|_ |j1|_t=d t?|j2t@ |jCd |j.dtDy#t4$r8}|j7|j8t8j:k7rYd}~yd}~wwxYw)NmapFdecode_data and enable_SMTPUTF8 cannot be set to True at the same timer .r . FzPeer:r z220  )#r async_chat__init__ smtp_serverconnaddrdata_size_limitenable_SMTPUTF8 _decode_datar3 _emptystring_linesep_dotsepNEWLINE_newlineord_set_rset_state seen_greeting extended_smtpr1clearsocketgetfqdnfqdn getpeernamepeerOSErrorcloseerrnoENOTCONNr"repr DEBUGSTREAMpush __version__) rserverrCrDrEr8rF decode_dataerrs rrAzSMTPChannel.__init__|sU$$T4S$9!  ..' {@A A  "D "DMDL#DM #D #DMt9DL!DM "   &&(NN$  ((*DI gtDII[9 K89  JJLyyENN*   s6E F.FFc|j|_d|_g|_d|_d|_|j dy)z/Reset state variables to their post-DATA state.NFrr<)COMMAND smtp_statemailfromrcpttosrequire_SMTPUTF8 num_bytesset_terminatorrs r_set_post_data_statez SMTPChannel._set_post_data_states8,,  % G$rc@|jd|_g|_y)z.Reset all state variables except the greeting.rN)rj received_datareceived_linesrs rrNzSMTPChannel._set_rset_states !!# rc<tdtd|jS)NzTAccess to __server attribute on SMTPChannel is deprecated, use 'smtp_server' insteadrDeprecationWarningrBrs r__serverzSMTPChannel.__servers! ();Q @rc4tdtd||_y)NzRSetting __server attribute on SMTPChannel is deprecated, set 'smtp_server' insteadrorprvalues rrrzSMTPChannel.__servers ();Q @ rc<tdtd|jS)NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadrorrqrmrs r__linezSMTPChannel.__lines! +,> C"""rc4tdtd||_y)NzSSetting __line attribute on SMTPChannel is deprecated, set 'received_lines' insteadrorwrts rrxzSMTPChannel.__lines +,> C#rc<tdtd|jS)NzRAccess to __state attribute on SMTPChannel is deprecated, use 'smtp_state' insteadrorrqrdrs r__statezSMTPChannel.__states '(:A ?rc4tdtd||_y)NzPSetting __state attribute on SMTPChannel is deprecated, set 'smtp_state' insteadror{rts rr|zSMTPChannel.__states '(:A ?rc<tdtd|jS)NzXAccess to __greeting attribute on SMTPChannel is deprecated, use 'seen_greeting' insteadrorrqrOrs r __greetingzSMTPChannel.__greeting! *+=q B!!!rc4tdtd||_y)NzVSetting __greeting attribute on SMTPChannel is deprecated, set 'seen_greeting' insteadrorrts rrzSMTPChannel.__greeting *+=q B"rc<tdtd|jS)NzSAccess to __mailfrom attribute on SMTPChannel is deprecated, use 'mailfrom' insteadrorrqrers r __mailfromzSMTPChannel.__mailfroms %&8! =}}rc4tdtd||_y)NzQSetting __mailfrom attribute on SMTPChannel is deprecated, set 'mailfrom' insteadrorrts rrzSMTPChannel.__mailfroms %&8! = rc<tdtd|jS)NzQAccess to __rcpttos attribute on SMTPChannel is deprecated, use 'rcpttos' insteadrorrqrfrs r __rcpttoszSMTPChannel.__rcpttoss $%7 <||rc4tdtd||_y)NzOSetting __rcpttos attribute on SMTPChannel is deprecated, set 'rcpttos' insteadrorrts rrzSMTPChannel.__rcpttoss $%7 < rc<tdtd|jS)NzTAccess to __data attribute on SMTPChannel is deprecated, use 'received_data' insteadrorrqrlrs r__datazSMTPChannel.__datarrc4tdtd||_y)NzRSetting __data attribute on SMTPChannel is deprecated, set 'received_data' insteadrorrts rrzSMTPChannel.__datarrc<tdtd|jS)NzKAccess to __fqdn attribute on SMTPChannel is deprecated, use 'fqdn' insteadrorrqrTrs r__fqdnzSMTPChannel.__fqdn !"4a 9yyrc4tdtd||_y)NzISetting __fqdn attribute on SMTPChannel is deprecated, set 'fqdn' insteadrorrts rrzSMTPChannel.__fqdn !"4a 9 rc<tdtd|jS)NzKAccess to __peer attribute on SMTPChannel is deprecated, use 'peer' insteadrorrqrVrs r__peerzSMTPChannel.__peer rrc4tdtd||_y)NzISetting __peer attribute on SMTPChannel is deprecated, set 'peer' insteadrorrts rrzSMTPChannel.__peerrrc<tdtd|jS)NzKAccess to __conn attribute on SMTPChannel is deprecated, use 'conn' insteadrorrqrCrs r__connzSMTPChannel.__connrrc4tdtd||_y)NzISetting __conn attribute on SMTPChannel is deprecated, set 'conn' insteadrorrts rrzSMTPChannel.__connrrc<tdtd|jS)NzKAccess to __addr attribute on SMTPChannel is deprecated, use 'addr' insteadrorrqrDrs r__addrzSMTPChannel.__addr"rrc4tdtd||_y)NzISetting __addr attribute on SMTPChannel is deprecated, set 'addr' insteadrorrts rrzSMTPChannel.__addr'rrctjj|t|dz|jr dydy)Nr:utf-8ascii)rr@r]bytesrgrs rr]zSMTPChannel.push.sA  u <%:%:'(I J@G(I Jrcd}|j|jk(r |j}n%|j|jk(r |j}|r|j |kDry|r|xj t |z c_|jr&|jjt|dy|jj|y)Nr) rdrcr5DATArErhlenrGrmappendstr)rdatalimits rcollect_incoming_dataz!SMTPChannel.collect_incoming_data3s ??dll *//E __ )((E T^^e+   NNc$i 'N       & &s4'9 :    & &t ,rc|jj|j}tdt |t g|_|j |jk(r|jdc}|_|s|jdy|js t|d}|jd}|dkr|j}d}n)|d|j}||dzdj}|jr|j |n |j"}||kDr|jdyt%|d |zd}|s|jd |zy||y|j |j&k7r|jd d|_y|j(r2|j|j(kDr|jd d|_yg}|j+|j,D]<} | r'| d|j.k(r|j1| dd,|j1| >|j2j||_|j6|j8|j:|j4f} i} |js|j<|j>d } |j@jB| i| } |jE| s|jdy|j| y)NzData:r rz500 Error: bad syntaxrr?r+z500 Error: line too longsmtp_z&500 Error: command "%s" not recognizedz451 Internal confusionz552 Error: Too much mail data) mail_options rcpt_options250 OK)#rHjoinrmr"r[r\rdrcrhr]rGrfindupperstriprPr1r4getattrrrEsplitrIrJrrLrlrVrerfrrrBprocess_messagerj) rlineszicommandargmax_szmethodrtextargskwargsstatuss rfound_terminatorzSMTPChannel.found_terminatorCs  %%d&9&9: gtDz 4  ??dll *!% B 12$$4) #A1u**,r(..*1Q34j&&(--..w7373J3J F{ 45T7W#4d;F BWLM 3K $))+ 23!"##9M9M(M 9:!"D 4==1DGt||3KKQR)KK% 2 "&!3!3D!9D IIt}}dllD]EHLOz250 Syntax: EHLO hostnameHELOz250 Syntax: HELO hostnamerz 250 Syntax: MAIL FROM:
RCPTz250 Syntax: RCPT TO:
rz250 Syntax: DATARSETz250 Syntax: RSETNOOPz250 Syntax: NOOPQUITz250 Syntax: QUITVRFYz250 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)rr]rP)rrextendedlc_argrs r smtp_HELPzSMTPChannel.smtp_HELPs  0HYY[F 566! 566!8%%8OC #6!6%%8OC #6! ,-6! ,-6! ,-6! ,-6! 67 56 II, -rc|r=|j|\}}|r|jdy|jd|zy|jdy)NzB252 Cannot VRFY user, but will accept message and attempt deliveryz502 Could not VRFY %sz501 Syntax: VRFY
)rr])rrrrs r smtp_VRFYzSMTPChannel.smtp_VRFYsL "mmC0OGV 12 1C78 II2 3rc|js|jdytd|td}|jr|dz }||j|y|j d|}|j |\}}|s|j|y|js|r|j|y|jr|jdy|jj|_ |j|j}||j|y|js(|jdd }|d vr|jd y|jr4|jd d }|durd|_n|d ur|jdy|jdd}|rX|j!s|j|y|j"r*t%||j"kDr|jdyt'|j)dkDr|jdy||_td|jt|jdy)N503 Error: send HELO firstz ===> MAILr z 501 Syntax: MAIL FROM:
rzFROM:z503 Error: nested MAIL commandBODY7BIT)r8BITMIMEz1501 Error: BODY can only be one of 7BIT, 8BITMIMESMTPUTF8FTz&501 Error: SMTPUTF8 takes no argumentsSIZEz:552 Error: message size exceeds fixed maximum message sizerz:555 MAIL FROM parameters not recognized or not implementedzsender:r)rOr]r"r\rPrrrerrrrrGpoprFrgisdigitrEintrkeys)rr syntaxerrrrbodysmtputf8sizes r smtp_MAILzSMTPChannel.smtp_MAILs!! II2 3  k3[16    2 2I ; IIi ))'37--, IIi !!f IIi  == II6 7 "LLN002!2!23 > IIi   ::ff-D// MN   zz*e4H4(,%& BCzz&$' <<> )$%%#d)d6J6J*J VW v{{}  ! IIR S   i[9 (rc2|js|jdytd|t|js|jdyd}|j r|dz }||j|y|j d|}|j|\}}|s|j|y|j s|r|j|y|jj|_ |j|j}||j|yt|jdkDr|jd y|jj|td |jt|jd y) Nrz ===> RCPTr z503 Error: need MAIL commandz501 Syntax: RCPT TO:
rzTO:rz8555 RCPT TO parameters not recognized or not implementedzrecips:r)rOr]r"r\rerPrrrrrrrrrfr)rrrrrs r smtp_RCPTzSMTPChannel.smtp_RCPT.sK!! II2 3  k3[1}} II4 5 4    2 2I ; IIi ))%5--, IIi !!f IIi "LLN002!2!23 > IIi  v{{}  ! IIP Q  G$ iK8 (rcn|r|jdy|j|jdy)Nz501 Syntax: RSETr)r]rNrs r smtp_RSETzSMTPChannel.smtp_RSETQs-  II( )   (rc |js|jdy|js|jdy|r|jdy|j|_|j d|jdy)Nrz503 Error: need RCPT commandz501 Syntax: DATAs . z#354 End data with .)rOr]rfrrdrirs r smtp_DATAzSMTPChannel.smtp_DATAXsk!! II2 3 || II4 5   II( ) )) L) 78rc&|jdy)Nz502 EXPN not implementedrrs r smtp_EXPNzSMTPChannel.smtp_EXPNgs ,-r),rrrrcrr4 collections defaultdictr1propertyr5DATA_SIZE_DEFAULTrArjrN_SMTPChannel__serversetter_SMTPChannel__line_SMTPChannel__state_SMTPChannel__greeting_SMTPChannel__mailfrom_SMTPChannel__rcpttos_SMTPChannel__data_SMTPChannel__fqdn_SMTPChannel__peer_SMTPChannel__conn_SMTPChannel__addrr]rrrrrrrrrrrrr r r rrrrrrnsG D1+11;M2PQ ++ "!r) rrrrr4rrAr7rrrrr r ks"M"3!&E:88"rr ceZdZdZdZy)r cd}|j}|D]k}|rA|s?d|dz}t|tst|j d}t |d}t|ts t|}t |my)Nr+zX-Peer: rr) splitlines isinstancerr[encoder")rrVr inheaderslinesr peerheaders r_print_message_contentz&DebuggingServer._print_message_contentsv !D'$q'1 !$,!%j&7&7&@!AJj! dC(Dz $Krc td|rD|jdrtd|dz|jdrtd|dz|j||tdy)Nz%---------- MESSAGE FOLLOWS ----------rzmail options: %srzrcpt options: %s z%------------ END MESSAGE ------------)r"getrCr:s rrzDebuggingServer.process_messagese 56 zz.)(6.+AABzz.)*VN-CCD ##D$/ 56rN)rrrrCrrrrr r s "7rr c*eZdZfdZdZdZxZS)r cTd|vr|dr tdtt||i|y)NrFz$PureProxy does not support SMTPUTF8.)r3superr rA)rrrr-s rrAzPureProxy.__init__s3  &62C+DCD D i'88rc|jd}d}|D] }|sn|dz } |j|d|dztj|}|j |||}t d|t y)Nrrr+z X-Peer: %szwe got some refusals:r )rinsertrKr_deliverr"r\) rrVrerfrrArrrefuseds rrzPureProxy.process_messagest 4  D FA  Q tAw./||E"--'48 %w[Arc6ddl}i} |j}|j|jd|jd |j |||}|j |S#|j wxYw#|j $r(}tdt|j}Yd}~|Sd}~wt|jf$rO}td|jtt|dd}t|dd } |D] } || f|| < Yd}~|Sd}~wwxYw) Nrr+zgot SMTPRecipientsRefusedr got smtp_code smtp_errorignore)smtplibSMTPconnectr%sendmailquitSMTPRecipientsRefusedr"r\ recipientsrW SMTPExceptionr-r) rrerfrrSrLseerrcodeerrmsgrs rrKzPureProxy._delivers / A IId&&q)4+;+;A+> ? **Xw=,, # -K @llG../ / %; 7ab1GQ h7F%v.  /s< , 3 a% 123 5 a&34 N5sG-F?9G,!H''I?G) G$$G),5H$'III! I!__main__r;r+)rFz7Cannot import module "pwd"; try running with -n option.r nobodyroz3Cannot setuid "nobody"; try running with -n option.)r)@r#r%osrYrmr.rRr test.supportrrwarningsremail._header_value_parserrr__all__rnprogramr^r r\rKrprr)r@rr&r r r rbr{rrvrdrfindlastdot __import__r$localsmodr|rclass_rqrrrsrtrerFproxyrcpwd ImportErrorr"r&r'getpwnamr}PermissionErrorloopKeyboardInterruptrrrrs1+N +D  ((1+-  i   z.(%%z.zJ"$$J"Z7j7<* *Z?D zkG!!I i//#&8G,giB4Hgaij)  S) $F G%%w'8'89&&(:(:;%%w7N7N PE~~  h'*  BIIf   7"  KRUR\R\ ] CHHQK    Gcjj Y CHHQK     s6'F'GH '+GG+HH HH