U
    P|j’  ã                   @   s€   d Z ddlZddlZddlmZ ddlmZ ddlmZ 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.
é    N)ÚUNIXAddress)Úsmtp)Úlogc                   @   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   Úauthenticated© r   ú6/tmp/pip-unpacked-wheel-audpp6lv/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>-   ó    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)Ú	transportZgetPeerr   Ú
isinstancer   Úhost)r	   Úaddressr   Zpeerr   r   r   r   0   s    
zDomainQueuer.willRelayc              	   C   sf   | j j}| ¡ \}}|�D t dt|jƒ›dt|jƒ›�¡ 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 z -> )
r   ÚqueueZcreateNewMessager   Úmsgr   r   r   ÚpickleÚdump)r	   r   r#   ZenvelopeFileZsmtpMessager   r   r   r   :   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   sl   g | _ g | _|D ]V}t|d dƒ�}t |¡}W 5 Q R X t|d ƒ}| |¡ | j  |¡ | j |¡ qd S )Nú-HÚrbú-D)ÚmessagesÚnamesÚopenr%   ÚloadÚappend)r	   ÚmessagePathsÚmessageÚfpZmessageContentsr   r   r   ÚloadMessagesQ   s    
zRelayerMixin.loadMessagesc                 C   s   | j s
d S | j d d S )Nr   ©r/   ©r	   r   r   r   ÚgetMailFrom\   s    zRelayerMixin.getMailFromc                 C   s   | j s
d S | j d d gS )Nr   r   r8   r9   r   r   r   Ú	getMailToa   s    zRelayerMixin.getMailToc                 C   s   | j s
d S | j d d S )Nr   r   r8   r9   r   r   r   ÚgetMailDataf   s    zRelayerMixin.getMailDatac                 C   sF   |t jkr2t | jd d ¡ t | jd d ¡ | jd= | jd= dS )z·Since 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Úremover0   r/   )r	   ÚcodeÚrespZnumOkÚ	addressesr   r   r   r   ÚsentMailk   s
    
zRelayerMixin.sentMailN)r'   r(   r)   r7   r:   r;   r<   rC   r   r   r   r   r+   L   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   r7   ©r	   r4   ÚargsÚkwr   r   r   r   }   s    zSMTPRelayer.__init__N©r'   r(   r)   r*   r   r   r   r   r   rD   x   s   rD   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   r7   rF   r   r   r   r   ’   s    zESMTPRelayer.__init__NrI   r   r   r   r   rJ   �   s   rJ   )r*   r>   r%   Ztwisted.internet.addressr   Ztwisted.mailr   Ztwisted.pythonr   r   r+   rE   rD   rK   rJ   r   r   r   r   Ú<module>   s   ;,