add-determinism 0.7.3

RPM buildroot helper to strip nondeterministic bits in files
Documentation
3

�
�^��c@sZddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
ddlmZm
Z
dddddgZejdZd	ZGd
d�d�Ze�adZd
ZdZd$dd�ZGdd�dej�ZGdd�dej�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�d�Zdd�Z e!dk�rVe �Z"e"j#Z#de#k�rle#j$d�Z%e&e#de%�e'�e(�dg�Z)e#e%dd�Z#nddl*Z)e+e)e#�Z,e,e"j-e"j.fe"j/e"j0fe"j1e"j2d�Z3e"j4�r2yddl5Z5Wn.e6k
�r�e7dej8d �ej9d�YnXe5j:d!�d"Z;yej4e;�Wn.e<k
�r0e7d#ej8d �ej9d�YnXyej=�Wne>k
�rTYnXdS)%�N)�warn)�
get_addr_spec�get_angle_addr�SMTPChannel�
SMTPServer�DebuggingServer�	PureProxy�MailmanProxyzPython SMTP proxy version 0.3c@�eZdZdd�Zdd�ZdS)�DevnullcC�dS�N���self�msgr
r
�/usr/lib64/python3.6/smtpd.py�writef�z
Devnull.writecCrrr
�rr
r
r�flushgrz
Devnull.flushN)�__name__�
__module__�__qualname__rrr
r
r
rr
esr
�
z, i�cCs4ttt�tjd�|r&t|tjd�tj|�dS)N�Zfile)�printZ__doc__�globals�sys�stderr�exit)Zcoderr
r
r�usagepsr!c@s�eZdZdZdZdZejefdd��Ze	dd��Z
edd	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|Srr
)Zxr
r
rZ<lambda>|rzSMTPChannel.<lambda>cCs*yt|jj��Stk
r$|jSXdSr)Zmax�command_size_limitsZvalues�
ValueError�command_size_limitrr
r
r�max_command_size_limit~sz"SMTPChannel.max_command_size_limitNFc	Cstjj|||d�||_||_||_||_||_||_|rF|rFt	d��|rdd|_
d|_d|_t
|_nd|_
d|_td�|_d	|_|j�d|_d
|_|jj�tj�|_y|j�|_Wn:tk
r�}z|j�|jdtjkr�dSd}~XnXtdt |j�t!d
�|j"d|jt#f�dS)N��map�Fdecode_data and enable_SMTPUTF8 cannot be set to True at the same timer�
�.r�
s.s
FrzPeer:rz	220 %s %s)$�asynchat�
async_chat�__init__�smtp_server�conn�addr�data_size_limit�enable_SMTPUTF8�_decode_datar$�_emptystring�_linesep�_dotsep�NEWLINE�_newlineZord�_set_rset_state�
seen_greeting�
extended_smtpr#Zclear�socketZgetfqdn�fqdnZgetpeername�peer�OSError�close�args�errnoZENOTCONNr�repr�DEBUGSTREAM�push�__version__)	rZserverr1r2r3r(r4�decode_dataZerrr
r
rr/�s@


zSMTPChannel.__init__cCs.|j|_d|_g|_d|_d|_|jd�dS)NFrr,)�COMMAND�
smtp_state�mailfrom�rcpttos�require_SMTPUTF8�	num_bytes�set_terminatorrr
r
r�_set_post_data_state�sz SMTPChannel._set_post_data_statecCs|j�d|_g|_dS�Nr)rQ�
received_data�received_linesrr
r
rr;�szSMTPChannel._set_rset_statecC�tdtd�|jS)NzTAccess to __server attribute on SMTPChannel is deprecated, use 'smtp_server' instead��r�DeprecationWarningr0rr
r
r�__server��zSMTPChannel.__servercC�tdtd�||_dS)NzRSetting __server attribute on SMTPChannel is deprecated, set 'smtp_server' insteadrVrW�r�valuer
r
rrY�rZcCrU)NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadrV�rrXrTrr
r
r�__line�rZzSMTPChannel.__linecCr[)NzSSetting __line attribute on SMTPChannel is deprecated, set 'received_lines' insteadrVr^r\r
r
rr_�rZcCrU)NzRAccess to __state attribute on SMTPChannel is deprecated, use 'smtp_state' insteadrV�rrXrKrr
r
r�__state�rZzSMTPChannel.__statecCr[)NzPSetting __state attribute on SMTPChannel is deprecated, set 'smtp_state' insteadrVr`r\r
r
rra�rZcCrU)NzXAccess to __greeting attribute on SMTPChannel is deprecated, use 'seen_greeting' insteadrV�rrXr<rr
r
r�
__greeting�rZzSMTPChannel.__greetingcCr[)NzVSetting __greeting attribute on SMTPChannel is deprecated, set 'seen_greeting' insteadrVrbr\r
r
rrc�rZcCrU)NzSAccess to __mailfrom attribute on SMTPChannel is deprecated, use 'mailfrom' insteadrV�rrXrLrr
r
r�
__mailfrom�rZzSMTPChannel.__mailfromcCr[)NzQSetting __mailfrom attribute on SMTPChannel is deprecated, set 'mailfrom' insteadrVrdr\r
r
rre�rZcCrU)NzQAccess to __rcpttos attribute on SMTPChannel is deprecated, use 'rcpttos' insteadrV�rrXrMrr
r
r�	__rcpttos�rZzSMTPChannel.__rcpttoscCr[)NzOSetting __rcpttos attribute on SMTPChannel is deprecated, set 'rcpttos' insteadrVrfr\r
r
rrg�rZcCrU)NzTAccess to __data attribute on SMTPChannel is deprecated, use 'received_data' insteadrV�rrXrSrr
r
r�__data�rZzSMTPChannel.__datacCr[)NzRSetting __data attribute on SMTPChannel is deprecated, set 'received_data' insteadrVrhr\r
r
rrirZcCrU)NzKAccess to __fqdn attribute on SMTPChannel is deprecated, use 'fqdn' insteadrV�rrXr?rr
r
r�__fqdn
rZzSMTPChannel.__fqdncCr[)NzISetting __fqdn attribute on SMTPChannel is deprecated, set 'fqdn' insteadrVrjr\r
r
rrkrZcCrU)NzKAccess to __peer attribute on SMTPChannel is deprecated, use 'peer' insteadrV�rrXr@rr
r
r�__peerrZzSMTPChannel.__peercCr[)NzISetting __peer attribute on SMTPChannel is deprecated, set 'peer' insteadrVrlr\r
r
rrmrZcCrU)NzKAccess to __conn attribute on SMTPChannel is deprecated, use 'conn' insteadrV�rrXr1rr
r
r�__conn rZzSMTPChannel.__conncCr[)NzISetting __conn attribute on SMTPChannel is deprecated, set 'conn' insteadrVrnr\r
r
rro%rZcCrU)NzKAccess to __addr attribute on SMTPChannel is deprecated, use 'addr' insteadrV�rrXr2rr
r
r�__addr+rZzSMTPChannel.__addrcCr[)NzISetting __addr attribute on SMTPChannel is deprecated, set 'addr' insteadrVrpr\r
r
rrq0rZcCs&tjj|t|d|jrdnd��dS)Nr*�utf-8Zascii)r-r.rGZbytesrNrr
r
rrG7s
zSMTPChannel.pushcCs|d}|j|jkr|j}n|j|jkr*|j}|r<|j|kr<dS|rR|jt|�7_|jrl|jj	t
|d��n|jj	|�dS)Nrr)rKrJr&�DATAr3rO�lenr5rT�append�str)r�dataZlimitr
r
r�collect_incoming_data<sz!SMTPChannel.collect_incoming_datac
Cs|jj|j�}tdt|�td�g|_|j|jk�r|jd}|_|sT|j	d�dS|j
sdt|d�}|jd�}|dkr�|j
�}d}n$|d|�j
�}||dd�j�}|jr�|j|n|j}||kr�|j	d�dSt|d	|d�}|�s�|j	d
|�dS||�dS|j|jk�r*|j	d�d|_dS|j�rT|j|jk�rT|j	d�d|_dSg}xJ|j|j�D]:}	|	�r�|	d|jk�r�|j|	dd��n
|j|	��qfW|jj|�|_|j|j|j|jf}
i}|j
�s�|j|jd
�}|j j!|
|�}|j"�|�s|j	d�n
|j	|�dS)NzData:rrz500 Error: bad syntaxrr� 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)#r6�joinrTrrErFrKrJrOrGr5rv�find�upper�stripr=r#r%�getattrrsr3�splitr7r8rur:rSr@rLrMrzr{r0�process_messagerQ)
r�lineZsz�i�command�argZmax_szZmethodrwZtextrC�kwargsZstatusr
r
r�found_terminatorLsd






zSMTPChannel.found_terminatorcCsH|s|jd�dS|jr&|jd�dS|j�||_|jd|j�dS)Nz501 Syntax: HELO hostname�503 Duplicate HELO/EHLOz250 %s)rGr<r;r?�rr�r
r
r�	smtp_HELO�s

zSMTPChannel.smtp_HELOcCs�|s|jd�dS|jr&|jd�dS|j�||_d|_|jd|j�|jrr|jd|j�|jdd7<|js�|jd�|jr�|jd	�|jdd
7<|jd�dS)Nz501 Syntax: EHLO hostnamer�Tz250-%sz250-SIZE %s�MAILiz250-8BITMIMEz250-SMTPUTF8i
z250 HELP)	rGr<r;r=r?r3r#r5r4r�r
r
r�	smtp_EHLO�s&



zSMTPChannel.smtp_EHLOcCs|r|jd�n
|jd�dS)Nz501 Syntax: NOOPr|�rGr�r
r
r�	smtp_NOOP�szSMTPChannel.smtp_NOOPcCs|jd�|j�dS)Nz221 Bye)rGZclose_when_doner�r
r
r�	smtp_QUIT�s
zSMTPChannel.smtp_QUITcCs0t|�}|d|�j�|kr,||d�j�SdSrR)rtrr�)rZkeywordr�Zkeylenr
r
r�_strip_command_keyword�sz"SMTPChannel._strip_command_keywordcCsF|sdS|j�jd�r$t|�\}}nt|�\}}|s<||fS|j|fS)Nrz<)rr)ZlstripZ
startswithrrZ	addr_spec)rr��addressZrestr
r
r�_getaddr�szSMTPChannel._getaddrcCsNi}xD|D]<}|jd�\}}}|j�s2|r6|r6dS|r>|nd||<q
W|S)Nz=T)Z	partitionZisalnum)r�paramsZresultZparamZeqr]r
r
r�
_getparams�s
zSMTPChannel._getparamscCs|r�d}|j�}|dkr$|jd�q�|dkr8|jd�q�|dkr^d}|jrR||7}|j|�q�|dkr�d	}|jrx||7}|j|�q�|d
kr�|jd�q�|dkr�|jd
�q�|dkr�|jd�q�|dkr�|jd�q�|dkr�|jd�q�|jd�n
|jd�dS)N� [SP <mail-parameters>]ZEHLOz250 Syntax: EHLO hostnameZHELOz250 Syntax: HELO hostnamer�z 250 Syntax: MAIL FROM: <address>ZRCPTz250 Syntax: RCPT TO: <address>rsz250 Syntax: DATAZRSETz250 Syntax: RSETZNOOPz250 Syntax: NOOPZQUITz250 Syntax: QUITZVRFYz250 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)rrGr=)rr�ZextendedZlc_argrr
r
r�	smtp_HELP�s:zSMTPChannel.smtp_HELPcCs@|r2|j|�\}}|r"|jd�q<|jd|�n
|jd�dS)NzB252 Cannot VRFY user, but will accept message and attempt deliveryz502 Could not VRFY %sz501 Syntax: VRFY <address>)r�rG)rr�r�r�r
r
r�	smtp_VRFY�szSMTPChannel.smtp_VRFYcCs�|js|jd�dStd|td�d}|jr4|d7}|dkrJ|j|�dS|jd|�}|j|�\}}|sv|j|�dS|jr�|r�|j|�dS|jr�|jd�dS|j�j	�|_
|j|j
�}|dkr�|j|�dS|j�s|j
dd	�}|dk�r|jd�dS|j�r>|j
dd
�}|dk�r&d|_n|d
k	�r>|jd�dS|j
dd�}|�r�|j��sh|j|�dS|j�r�t|�|jk�r�|jd�dSt|j��dk�r�|jd�dS||_td|jtd�|jd�dS)N�503 Error: send HELO firstz	===> MAILrz 501 Syntax: MAIL FROM: <address>r�zFROM:z503 Error: nested MAIL commandZBODY�7BIT�8BITMIMEz1501 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|)r�r�)r<rGrrFr=r�r�rLrr�rzr�r5Zpopr4rNZisdigitr3�intrt�keys)rr��	syntaxerrr�r�Zbody�smtputf8Zsizer
r
r�	smtp_MAILsh














zSMTPChannel.smtp_MAILcCs|js|jd�dStd|td�|js6|jd�dSd}|jrH|d7}|dkr^|j|�dS|jd|�}|j|�\}}|s�|j|�dS|jr�|r�|j|�dS|j�j	�|_
|j|j
�}|dkr�|j|�dSt|j
��dkr�|jd	�dS|jj|�td
|jtd�|jd�dS)Nr�z	===> RCPTrz503 Error: need MAIL commandz501 Syntax: RCPT TO: <address>r�zTO:rz8555 RCPT TO parameters not recognized or not implementedzrecips:r|)r<rGrrFrLr=r�r�rr�r{r�rtr�rMru)rr�r�r�r�r
r
r�	smtp_RCPT7s@






zSMTPChannel.smtp_RCPTcCs(|r|jd�dS|j�|jd�dS)Nz501 Syntax: RSETr|)rGr;r�r
r
r�	smtp_RSETZs

zSMTPChannel.smtp_RSETcCsZ|js|jd�dS|js(|jd�dS|r:|jd�dS|j|_|jd�|jd�dS)Nr�z503 Error: need RCPT commandz501 Syntax: DATAs
.
z#354 End data with <CR><LF>.<CR><LF>)r<rGrMrsrKrPr�r
r
r�	smtp_DATAas



zSMTPChannel.smtp_DATAcCs|jd�dS)Nz502 EXPN not implementedr�r�r
r
r�	smtp_EXPNpszSMTPChannel.smtp_EXPN),rrrrJrsr%�collectionsZdefaultdictr#Zpropertyr&�DATA_SIZE_DEFAULTr/rQr;Z_SMTPChannel__serverZsetterZ_SMTPChannel__lineZ_SMTPChannel__stateZ_SMTPChannel__greetingZ_SMTPChannel__mailfromZ_SMTPChannel__rcpttosZ_SMTPChannel__dataZ_SMTPChannel__fqdnZ_SMTPChannel__peerZ_SMTPChannel__connZ_SMTPChannel__addrrGrxr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r
r
r
rrws`&	>#6#c@s2eZdZeZedddfdd�Zdd�Zdd�ZdS)	rNFcCs�||_||_||_||_||_|r.|r.td��tjj||d�yNt	j
|dt	ji�}|j|dd|dd�|j
�|j|�|jd�Wn|j��Yn(Xtd|jjtjtj��||ftd�dS)	Nr)r'Ztyperr"iz0%s started at %s
	Local addr: %s
	Remote addr:%sr)Z
_localaddr�_remoteaddrr3r4r5r$�asyncore�
dispatcherr/r>ZgetaddrinfoZSOCK_STREAMZ
create_socketZset_reuse_addrZbindZlistenrBr�	__class__r�time�ctimerF)rZ	localaddrZ
remoteaddrr3r(r4rIZgai_resultsr
r
rr/xs*

zSMTPServer.__init__cCs6tdt|�td�|j||||j|j|j|j�}dS)NzIncoming connection from %sr)rrErF�
channel_classr3Z_mapr4r5)rr1r2Zchannelr
r
r�handle_accepted�szSMTPServer.handle_acceptedcKst�dSr)ZNotImplementedError�rr@rLrMrwr�r
r
rr��szSMTPServer.process_message)	rrrrr�r�r/r�r�r
r
r
rrts
c@r	)rcCsrd}|j�}x`|D]X}|rP|rPd|d}t|t�sDt|jd��}t|�d}t|t�sbt|�}t|�qWdS)Nr"zX-Peer: rrr)Z
splitlinesZ
isinstancervrEZencoder)rr@rwZ	inheaders�linesr�Z
peerheaderr
r
r�_print_message_content�s



z&DebuggingServer._print_message_contentcKsXtd�|r@|jd�r&td|d�|jd�r@td|d�|j||�td�dS)Nz%---------- MESSAGE FOLLOWS ----------rzzmail options: %sr{zrcpt options: %s
z%------------ END MESSAGE ------------)r�getr�r�r
r
rr��s

zDebuggingServer.process_messageN)rrrr�r�r
r
r
rr�scs,eZdZ�fdd�Zdd�Zdd�Z�ZS)rc�.d|kr|drtd��tt|�j||�dS)Nr4z$PureProxy does not support SMTPUTF8.�r$Zsuperrr/�rrCr��r�r
rr/��zPureProxy.__init__c	Csh|jd�}d}x|D]}|sP|d7}qW|j|d|d�tj|�}|j|||�}td|td�dS)Nrrr"z
X-Peer: %szwe got some refusals:r)r�Zinsertr9r}�_deliverrrF)	rr@rLrMrwr�r�r��refusedr
r
rr��s


zPureProxy.process_messagecCs�ddl}i}yB|j�}|j|jd|jd�z|j|||�}Wd|j�XWn�|jk
r�}ztdtd�|j	}WYdd}~Xnjt
|jfk
r�}zHtd|jtd�t
|dd	�}t
|dd�}	x|D]}
||	f||
<q�WWYdd}~XnX|S)
Nrr"zgot SMTPRecipientsRefusedrZgotZ	smtp_codeZ
smtp_errorZignorei����)�smtplibZSMTPZconnectr�ZsendmailZquitZSMTPRecipientsRefusedrrFZ
recipientsrAZ
SMTPExceptionr�r�)rrLrMrwr�r��s�eZerrcodeZerrmsgZrr
r
rr��s$
"zPureProxy._deliver)rrrr/r�r��
__classcell__r
r
r�rr�scs$eZdZ�fdd�Zdd�Z�ZS)rcr�)Nr4z'MailmanProxy does not support SMTPUTF8.r�r�r�r
rr/
r�zMailmanProxy.__init__cCs:ddlm}ddlm}ddlm}ddlm}g}	x~|D]v}
|
j�jd�d}|jd�}t|�dkrhq:|d}
t|�dkr�|d	}nd
}|j	|
�s:|d!kr�q:|	j
|
|
|f�q:Wx|	D]\}
}
}|j|
�q�Wtddj
|�td�|�r|j|||�}td|td�i}||�}|j|�}|jd��s2||d<|jd��sPtjtj��|d<x�|	D]�\}
}
}td|
td�|j|
�}|�s�|j|
dd�}|||
<|d
k�r�|j|d	d�n�|dk�r�|j|d	d�nh|dk�r�|j|d	d�nN|d
k�r�|j|d	d�n4|d"k�rV|dk�rd|d<nd |d<|j|d	d��qVWdS)#Nr)�StringIO)�Utils)�Message)�MailListz@z-rVr"r�admin�owner�requestr}�leavezforwarding recips:ryrzwe got refusals:ZfromZFromZdateZDatezsending message to)Zlock)Ztolist)Ztoadmin)Ztoowner)Z	torequestZ	subscribeZSubjectZunsubscribe)rr�r�r�r}r�)r}r�)Zior�ZMailmanr�r�r�Zlowerr�rtZlist_existsruZremoverr}rFr�r�r�r�ZEnqueue)rr@rLrMrwr�r�r�r�Z	listnamesZrcptZlocalZpartsZlistnamer�r�Zmlistsr�rZmlistr
r
rr�sd











zMailmanProxy.process_message)rrrr/r�r�r
r
r�rrsc@seZdZdZdZdZdZdS)�OptionsTrNF)rrr�setuid�	classname�
size_limitr4r
r
r
rr�_sr�c
!Csty.tjtjdd�dddddddd	g�\}}Wn.tjk
r\}ztd|�WYdd}~XnXt�}x�|D]�\}}|d'kr�td�qj|d(kr�tt�tjd�qj|d)kr�d|_	qj|d*kr�||_
qj|d+kr�tjaqj|d,kr�d|_
qj|d-krjyt|�}||_Wqjtd|tjd�tjd�YqjXqjWt|�dk�r@d}d}nPt|�dk�r\|d}d}n4t|�d k�r||d}|d}ntdd!tj|��|jd"�}	|	dk�r�tdd#|�|d|	�|_yt||	dd��|_Wn$tk
�r�tdd$|�YnX|jd"�}	|	dk�r"tdd%|�|d|	�|_yt||	dd��|_Wn$tk
�rntdd&|�YnX|S).Nr"z	nVhc:s:duzclass=ZnosetuidZversionZhelpzsize=Zdebugr��-h�--helpr�-V�	--version�-n�
--nosetuidF�-c�--class�-d�--debug�-u�
--smtputf8T�-s�--sizezInvalid size: rzlocalhost:8025zlocalhost:25rVizInvalid arguments: %sz:zBad local spec: %szBad local port: %szBad remote spec: %szBad remote port: %s)r�r�)r�r�)r�r�)r�r�)r�r�)r�r�)r�r�)�getoptr�argvZerrorr!r�rrHr r�r�rrFr4r�r�rt�
COMMASPACEr}r~�	localhost�	localportr$�
remotehost�
remoteport)
ZoptsrCr��optionsZoptr�Zint_sizeZ	localspecZ
remotespecr�r
r
r�	parseargsfsp






r��__main__r+r")r4z7Cannot import module "pwd"; try running with -n option.r�nobodyrVz3Cannot setuid "nobody"; try running with -n option.)r)?rZosrDr�r�r>r�r-r�ZwarningsrZemail._header_value_parserrrZ__all__r�ZprogramrHr
rFr9r�r�r!r.rr�rrrrr�r�rr�r�ZrfindZlastdotZ
__import__rZlocalsZmodr�r�Zclass_r�r�r�r�r�r4Zproxyr�ZpwdZImportErrorrrr Zgetpwnamr�ZPermissionErrorZloopZKeyboardInterruptr
r
r
rZ<module>Psv

M-SB