U
    Â“«jh(  ã                   @   s  d Z ddlZddlZddlZddlZddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZmZ ddlmZ d	Zej d
¡ZdZdZeejƒZeed�ZG dd„ dƒZdd„ ZedƒZdd„ Z G dd„ dƒZ!dd„ Z"dd„ Z#da$dd„ Z%dd„ Z&dd „ Z'd!d"„ Z(d#d$„ Z)dS )%z4
Implementation module for the I{mailmail} command.
é    N)ÚConfigParser)ÚStringIO)Úversion)Úreactor)ÚLoggerÚtextFileLogObserver)Úsmtpz/etc/mailmailz~/.twisted/mailmailz	127.0.0.1z�Subject: Failed Message Delivery

  Message delivery failed.  The following occurred:

  %s
--
The Twisted sendmail application.
)Zobserverc                   @   s   e Zd ZdZdS )ÚOptionsat  
    Store the values of the parsed command-line options to the I{mailmail}
    script.

    @type to: L{list} of L{str}
    @ivar to: The addresses to which to deliver this message.

    @type sender: L{str}
    @ivar sender: The address from which this message is being sent.

    @type body: C{file}
    @ivar body: The object from which the message is to be read.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úA/tmp/pip-unpacked-wheel-59kc99xd/twisted/mail/scripts/mailmail.pyr	   (   s   r	   c                   C   s,   z
t  ¡ W S  tk
r&   t ¡  Y S X d S ©N)ÚosÚgetloginÚBaseExceptionÚgetpassÚgetuserr   r   r   r   r   8   s    
r   zUnsupported option.c           	   	   C   sÈ  t ƒ }dd„ | D ƒ|_tƒ |_d| kr6tdtƒ tƒ ‚d| krBt‚d| krNt‚d| krx| |  d¡d  |_|j 	|j¡ d	| ksˆd
| krŒt‚d| krœd|_
nd|_
d| kr²d|_
nd|_
d| ksÈd| krÐd|_nd|_d| krât‚d| k�rd|_|j|_g |_nd|_g |_g g g g g dœ}tƒ }d}tj ¡ }| ¡ �s@�qè| dd¡}|d  ¡ }|j�r˜|dk�r˜|j tj |d ¡d g¡ |dk�r¸d}n |dk�r¸tj |d ¡d |_||k�rÔ||  |d ¡ |�r$| |¡ �q$|d �s| d|j› d�¡ |d �s8|j�s tdƒ‚| d d |j¡¡¡ |d �sX| d t ¡ › d�¡ | |¡ |j�r |jD ].}z|j 	|¡ W n t k
�rš   Y nX �qp| !dd¡ t| "¡ tj #¡  ƒ|_$|S )!Nc                 S   s   g | ]}|  d ¡s|‘qS )ú-)Ú
startswith)Ú.0Úer   r   r   Ú
<listcomp>D   s     
 z parseOptions.<locals>.<listcomp>z	--versionzmailmail version:z-bpz-bsz-Fé   z-iz-oiz-odbTFz-odfz-oepz-epz-omz-t)ÚfromÚtoÚccÚbccÚdatez: r   )r   r   r   r   r   zFrom: z
r   zNo recipients specified.zTo: {}
z, r    zDate: )%r	   r   r   ÚsenderÚprintr   Ú
SystemExitÚ_unsupportedOptionÚindexÚremoveZ
backgroundÚprintErrorsZrecipientsFromHeadersZexcludeAddressesZexludeAddressesr   ÚsysÚstdinÚreadlineÚstripÚsplitÚlowerÚextendÚemailÚutilsÚ	parseaddrÚappendÚwriteÚformatÚjoinr   Z
rfc822dater   ÚseekÚgetvalueÚreadÚbody)	ÚargvÚoZrequiredHeadersÚbufferr3   ÚlineÚhdrsÚhdrÚar   r   r   ÚparseOptionsB   s’    

û










rA   c                   @   s   e Zd ZdZdd„ ZdS )ÚConfigurationaí  

    @ivar allowUIDs: A list of UIDs which are allowed to send mail.
    @ivar allowGIDs: A list of GIDs which are allowed to send mail.
    @ivar denyUIDs: A list of UIDs which are not allowed to send mail.
    @ivar denyGIDs: A list of GIDs which are not allowed to send mail.

    @type defaultAccess: L{bool}
    @ivar defaultAccess: L{True} if access will be allowed when no other access
    control rule matches or L{False} if it will be denied in that case.

    @ivar useraccess: Either C{'allow'} to check C{allowUID} first
    or C{'deny'} to check C{denyUID} first.

    @ivar groupaccess: Either C{'allow'} to check C{allowGID} first or
    C{'deny'} to check C{denyGID} first.

    @ivar identities: A L{dict} mapping hostnames to credentials to use when
    sending mail to that host.

    @ivar smarthost: L{None} or a hostname through which all outgoing mail will
    be sent.

    @ivar domain: L{None} or the hostname with which to identify ourselves when
    connecting to an MTA.
    c                 C   s@   g | _ g | _g | _g | _d| _d| _i | _d | _d | _d| _	d S )NÚdenyT)
Ú	allowUIDsÚdenyUIDsÚ	allowGIDsÚdenyGIDsÚ
useraccessÚgroupaccessÚ
identitiesÚ	smarthostÚdomainÚdefaultAccess)Úselfr   r   r   Ú__init__Ø   s    zConfiguration.__init__N)r
   r   r   r   rO   r   r   r   r   rB   ¼   s   rB   c                 C   sì  t ƒ }t | tj¡s|S tƒ }| | ¡ |j}|j}|j}|j	}d||fd||ffD ]ö\}}}	| 
|¡rTd|fd|	ffD ]~\}
}| ||
¡rx| ||
¡rx| ||
¡ d¡D ]J}zt|ƒ}W n. tk
rè   tjd|d  ¡ ||d� Y qªX | |¡ qªqx| |d	¡}d
d„ dd„ | d¡D ƒD ƒ}|d dk�r>t||dƒ qTt||dƒ qT| 
d¡�r¤| d¡D ]@\}}| dd¡}t|ƒdk�r–tjd|d� �qb||j|< �qb| 
d¡�rè| dd¡�rÌ| dd¡|_| dd¡�rè| dd¡|_|S )NrH   rI   ZallowrC   ú,z6Illegal {prefix}ID in [{section}] section: {sectionID}r   )ÚprefixÚsectionÚ	sectionIDÚorderc                 S   s   g | ]}|  ¡ ‘qS r   )r,   ©r   Úsr   r   r   r     s     zloadConfig.<locals>.<listcomp>c                 S   s   g | ]}|  ¡ ‘qS r   )r-   rU   r   r   r   r     s     Úidentityú:r   é   z.Illegal entry in [identity] section: {section})rR   Ú	addressesrK   Zdefault_domain)rB   r   ÚaccessÚR_OKr   r8   rD   rE   rF   rG   Úhas_sectionÚ
has_optionÚgetr,   ÚintÚ
ValueErrorÚ_logÚerrorÚupperr2   ÚsetattrÚitemsÚlenrJ   rK   rL   )ÚpathÚcÚpÚauZduZagZdgrR   r@   ÚdÚmodeÚLrS   rT   ÚhostZupÚpartsr   r   r   Ú
loadConfigç   sT    


ûrq   c                 C   s   t  ¡  d S r   ©r   Ústop)Úresultr   r   r   Úsuccess,  s    ru   c                 C   s   t  ¡  | ad S r   )r   rs   Úfailed)Úfr   r   r   Úfailure3  s    rx   c                 C   s.   t  | |j|j|j¡}| tt¡ t 	¡  d S r   )
r   Úsendmailr!   r   r9   ZaddCallbacksru   rx   r   Úrun)ro   ÚoptionsÚidentrl   r   r   r   ry   9  s    ry   c                 C   sf   |j g}d tjd tj d¡¡}tƒ }| j|d� tt	| 
¡  ƒ}t d|||¡}| dd„ ¡ d S )Nz2"Internally Generated Message ({})"<postmaster@{}>r   Úascii©ÚfileÚ	localhostc                 S   s   t  ¡ S r   rr   )Ú_r   r   r   Ú<lambda>H  ó    zsenderror.<locals>.<lambda>)r!   r4   r(   r:   r   ÚDNSNAMEÚdecoder   ÚprintTracebackÚ	ERROR_FMTr7   ry   ZaddBoth)rx   r{   Z	recipientr!   rc   r9   rl   r   r   r   Ú	senderror?  s     
ÿrˆ   c                 C   s    t  ¡ }t  ¡ }| jdkr8|| jkr(dS || jkrTdS n|| jkrFdS || jkrTdS | jdkr||| jkrldS || jkr˜dS n|| jkrŠdS || jkr˜dS | j	 S )NrC   TF)
r   ÚgetuidÚgetgidrH   rE   rD   rI   rG   rF   rM   )ÚconfÚuidÚgidr   r   r   rC   K  s*    









rC   c                  C   sÀ   t tjdd … ƒ} ttƒ}ttƒ}t|ƒs2t|ƒr@t d¡ d S |j	pN|j	pNt
}|j ¡ }| |j¡ |jrv|jt_n|jr„|jt_t|| |ƒ tr¼| jr²tjtjd� tdƒ‚n
tt| ƒ d S )Nr   zPermission deniedr~   )rA   r(   r:   rq   Ú
GLOBAL_CFGÚ	LOCAL_CFGrC   rb   rc   rK   Ú	SMARTHOSTrJ   ÚcopyÚupdaterL   r   r„   ry   rv   r'   r†   Ústderrr#   rˆ   )r;   ZgConfZlConfro   r|   r   r   r   rz   h  s&    



rz   )*r   Úemail.utilsr/   r   r   r(   Úconfigparserr   Úior   Ztwisted.copyrightr   Ztwisted.internetr   Ztwisted.loggerr   r   Ztwisted.mailr   rŽ   rh   Ú
expanduserr�   r�   r‡   r“   Z_logObserverrb   r	   r   r#   r$   rA   rB   rq   ru   rv   rx   ry   rˆ   rC   rz   r   r   r   r   Ú<module>   s:   


z+E