U
    
W[                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlZzddlZ	W n e
k
rX   ddl	Z	Y nX G dd dZG dd	 d	ZG d
d deejZG dd deejZdS )z
Support for relaying mail.
    )smtp)log)UNIXAddressNc                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )DomainQueuerzM
    An SMTP domain which add messages to a queue intended for relaying.
    Fc                 C   s   || _ || _d S N)serviceauthed)selfr   Zauthenticated r
   4/usr/lib/python3/dist-packages/twisted/mail/relay.py__init__   s    zDomainQueuer.__init__c                    st     jjrftdtjdd}tdtjdd}t|dkrft|dkrf fddS t	dS )a  
        Check whether mail can be relayed to a user.

        @type user: L{User}
        @param user: A user.

        @rtype: no-argument callable which returns L{IMessage <smtp.IMessage>}
            provider
        @return: A function which takes no arguments and returns a message
            receiver for the user.

        @raise SMTPBadRcpt: When mail cannot be relayed to the user.
        N@      c                      s
     S r   )startMessager
   r	   userr
   r   <lambda>3       z%DomainQueuer.exists.<locals>.<lambda>)
	willRelaydestprotocolfilterstrorigsplitlenr   ZSMTPBadRcpt)r	   r   r   r   r
   r   r   exists    s    zDomainQueuer.existsc                 C   s$   |j  }| jp"t|tp"|jdkS )z
        Check whether we agree to relay.

        The default is to relay for all connections over UNIX
        sockets and all connections from localhost.
        z	127.0.0.1)Z	transportZgetPeerr   
isinstancer   Zhost)r	   Zaddressr   Zpeerr
   r
   r   r   7   s    
zDomainQueuer.willRelayc              	   C   sb   | j j}| \}}|@ tdt|jt|jf  t	t|jt|jg| W 5 Q R X |S )z
        Create an envelope and a message receiver for the relay queue.

        @type user: L{User}
        @param user: A user.

        @rtype: L{IMessage <smtp.IMessage>}
        @return: A message receiver.
        zQueueing mail %r -> %r)
r   queueZcreateNewMessager   msgr   r   r   pickledump)r	   r   r   ZenvelopeFileZsmtpMessager
   r
   r   r   C   s    
&zDomainQueuer.startMessageN)F)__name__
__module____qualname____doc__r   r   r   r   r
   r
   r
   r   r      s
   
r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )RelayerMixinc              
   C   sj   g | _ g | _|D ]T}t|d }t|}W 5 Q R X t|d }|| | j | | j| qd S )N-H-D)messagesnamesopenr!   loadappend)r	   messagePathsmessagefpZmessageContentsr
   r
   r   loadMessages]   s    
zRelayerMixin.loadMessagesc                 C   s   | j s
d S | j d d S )Nr   r*   r	   r
   r
   r   getMailFromi   s    zRelayerMixin.getMailFromc                 C   s   | j s
d S | j d d gS )Nr   r   r3   r4   r
   r
   r   	getMailToo   s    zRelayerMixin.getMailToc                 C   s   | j s
d S | j d d S )Nr   r   r3   r4   r
   r
   r   getMailDatau   s    zRelayerMixin.getMailDatac                 C   sF   |t jkr2t| jd d  t| jd d  | jd= | jd= dS )zSince we only use one recipient per envelope, this
        will be called with 0 or 1 addresses. We probably want
        to do something with the error message if we failed.
        r   r)   r(   N)r   SUCCESSosremover+   r*   )r	   codeZrespZnumOkZ	addressesr   r
   r
   r   sentMail{   s
    
zRelayerMixin.sentMailN)r#   r$   r%   r2   r5   r6   r7   r<   r
   r
   r
   r   r'   W   s
   r'   c                   @   s   e Zd ZdZdd ZdS )SMTPRelayerz)
    A base class for SMTP relayers.
    c                 O   s"   t jj| f|| | | dS )a  
        @type messagePaths: L{list} of L{bytes}
        @param messagePaths: The base filename for each message to be relayed.

        @type args: 1-L{tuple} of (0) L{bytes} or 2-L{tuple} of
            (0) L{bytes}, (1) L{int}
        @param args: Positional arguments for L{SMTPClient.__init__}

        @type kw: L{dict}
        @param kw: Keyword arguments for L{SMTPClient.__init__}
        N)r   
SMTPClientr   r2   r	   r/   argskwr
   r
   r   r      s    zSMTPRelayer.__init__Nr#   r$   r%   r&   r   r
   r
   r
   r   r=      s   r=   c                   @   s   e Zd ZdZdd ZdS )ESMTPRelayerz*
    A base class for ESMTP relayers.
    c                 O   s"   t jj| f|| | | dS )a  
        @type messagePaths: L{list} of L{bytes}
        @param messagePaths: The base filename for each message to be relayed.

        @type args: 3-L{tuple} of (0) L{bytes}, (1) L{None} or
            L{ClientContextFactory
            <twisted.internet.ssl.ClientContextFactory>},
            (2) L{bytes} or 4-L{tuple} of (0) L{bytes}, (1) L{None}
            or L{ClientContextFactory
            <twisted.internet.ssl.ClientContextFactory>}, (2) L{bytes},
            (3) L{int}
        @param args: Positional arguments for L{ESMTPClient.__init__}

        @type kw: L{dict}
        @param kw: Keyword arguments for L{ESMTPClient.__init__}
        N)r   ESMTPClientr   r2   r?   r
   r
   r   r      s    zESMTPRelayer.__init__NrB   r
   r
   r
   r   rC      s   rC   )r&   Ztwisted.mailr   Ztwisted.pythonr   Ztwisted.internet.addressr   r9   ZcPickler!   ImportErrorr   r'   r>   r=   rD   rC   r
   r
   r
   r   <module>   s   A2