U
    ¹êW[U)  ã                   @   sB  d Z ddlmZ ddlZddlZddlZddlZzddlm	Z	 W n  e
k
r`   ddl	m	Z	 Y nX ddlmZ ddlmZ ddlmZmZ ddl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.
é    )Úprint_functionN)ÚConfigParser)Úversion)Úreactor)ÚLoggerÚtextFileLogObserver)Úsmtp)ÚNativeStringIOz/etc/mailmailz~/.twisted/mailmailz	127.0.0.1zSubject: 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   ú?/usr/lib/python3/dist-packages/twisted/mail/scripts/mailmail.pyr
   /   s   r
   c                   C   s$   z
t  ¡ W S    t ¡  Y S X d S ©N)ÚosÚgetloginÚgetpassZgetuserr   r   r   r   r   @   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 s6|jstdƒ‚| d d |j¡¡¡ |d sT| d t ¡ ¡¡ | |¡ |jr’|jD ]$}z|j 	|¡ W n   Y nX ql|  dd¡ t| !¡ tj "¡  ƒ|_#|S ) Nc                 S   s   g | ]}|  d ¡s|‘qS )ú-)Ú
startswith)Ú.0Úer   r   r   Ú
<listcomp>M   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: {}
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ÚemailZutilsZ	parseaddrÚappendÚwriteÚformatÚjoinr   Z
rfc822dateÚseekÚgetvalueÚreadÚbody)	ÚargvÚoZrequiredHeadersÚbufferr0   ÚlineZhdrsZhdrÚar   r   r   ÚparseOptionsK   s–    

û

ÿ








r<   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   rJ   r   r   r   r   r=   È   s   r=   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 )NrC   rD   Zallowr>   ú,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,   rP   r   r   r   r      s   ÿZidentityú:r   é   z.Illegal entry in [identity] section: {section})rM   Z	addressesrF   Zdefault_domain)r=   r   ÚaccessÚR_OKr   r5   r?   r@   rA   rB   Zhas_sectionZ
has_optionÚgetr+   ÚintÚ
ValueErrorÚ_logÚerrorÚupperr/   ÚsetattrÚitemsÚlenrE   rF   rG   )ÚpathÚcÚpZauZduZagZdgrM   r;   ÚdÚmodeÚLrN   rO   ÚhostZupÚpartsr   r   r   Ú
loadConfigó   s`    


 üÿÿÿrg   c                 C   s   t  ¡  d S r   ©r   Ústop)Úresultr   r   r   Úsuccess:  s    rk   c                 C   s   t  ¡  | ad S r   )r   ri   Úfailed)Úfr   r   r   Úfailure@  s    rn   c                 C   s.   t  | |j|j|j¡}| tt¡ t 	¡  d S r   )
r   Úsendmailr    r   r6   ZaddCallbacksrk   rn   r   Úrun)re   ÚoptionsÚidentrb   r   r   r   ro   G  s    ro   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©ÚfileZ	localhostc                 S   s   t  ¡ S r   rh   )Ú_r   r   r   Ú<lambda>V  ó    zsenderror.<locals>.<lambda>)r    r1   r'   r7   r   ÚDNSNAMEÚdecoder	   ÚprintTracebackÚ	ERROR_FMTr4   ro   ZaddBoth)rn   rq   Z	recipientr    rZ   r6   rb   r   r   r   Ú	senderrorN  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 )Nr>   TF)
r   ÚgetuidÚgetgidrC   r@   r?   rD   rB   rA   rH   )ÚconfZuidÚgidr   r   r   r>   Z  s*    









r>   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 deniedrt   )r<   r'   r7   rg   Ú
GLOBAL_CFGÚ	LOCAL_CFGr>   rY   rZ   rF   Ú	SMARTHOSTrE   ÚcopyÚupdaterG   r   ry   ro   rl   r&   r{   Ústderrr"   r}   )r8   ZgConfZlConfre   rr   r   r   r   rp   x  s&    



rp   )-r   Z
__future__r   Zemail.utilsr.   r   r'   r   Úconfigparserr   ÚImportErrorZtwisted.copyrightr   Ztwisted.internetr   Ztwisted.loggerr   r   Ztwisted.mailr   Ztwisted.python.compatr	   r‚   r_   Ú
expanduserrƒ   r„   r|   r‡   Z_logObserverrY   r
   r   r"   r#   r<   r=   rg   rk   rl   rn   ro   r}   r>   rp   r   r   r   r   Ú<module>   sB   


}+G