o
    ¯b“  ã                   @   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   ú4/usr/lib/python3/dist-packages/twisted/mail/relay.pyÚ__init__   s   
zDomainQueuer.__init__c                    sp   ˆ   ˆjˆj¡r3tdtˆjƒ dd¡ƒ}tdtˆjƒ dd¡ƒ}t|ƒdkr3t|ƒdkr3‡ ‡fdd„S t 	ˆ¡‚)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>-   s   
 z%DomainQueuer.exists.<locals>.<lambda>)
Ú	willRelayÚdestÚprotocolÚfilterÚstrÚorigÚsplitÚlenr   Ú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)Ú	transportÚgetPeerr   Ú
isinstancer   Úhost)r	   Úaddressr   Úpeerr   r   r   r   0   s   
zDomainQueuer.willRelayc                 C   s|   | j j}| ¡ \}}|�( t dt|jƒ›dt|jƒ›�¡ t 	t|jƒt|jƒg|¡ W d  ƒ |S 1 s7w   Y  |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 -> N)
r   ÚqueueÚcreateNewMessager   Úmsgr   r   r   ÚpickleÚdump)r	   r   r%   ÚenvelopeFileÚ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   s€   g | _ g | _|D ]5}t|d dƒ�}t |¡}W d   ƒ n1 s!w   Y  t|d ƒ}| |¡ | j  |¡ | j |¡ qd S )Nú-HÚrbú-D)ÚmessagesÚnamesÚopenr(   ÚloadÚappend)r	   ÚmessagePathsÚmessageÚfpÚmessageContentsr   r   r   ÚloadMessagesR   s   ÿ
úzRelayerMixin.loadMessagesc                 C   s   | j sd S | j d d S )Nr   ©r4   ©r	   r   r   r   ÚgetMailFrom]   ó   zRelayerMixin.getMailFromc                 C   s   | j sd S | j d d gS )Nr   r   r>   r?   r   r   r   Ú	getMailTob   s   zRelayerMixin.getMailToc                 C   s   | j sd S | j d d S )Nr   r   r>   r?   r   r   r   ÚgetMailDatag   rA   zRelayerMixin.getMailDatac                 C   sF   |t jv rt | 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   r3   r1   N)r   ÚSUCCESSÚosÚremover5   r4   )r	   ÚcodeÚrespÚnumOkÚ	addressesr   r   r   r   ÚsentMaill   s
   
zRelayerMixin.sentMailN)r,   r-   r.   r=   r@   rB   rC   rK   r   r   r   r   r0   L   s    r0   c                   @   ó   e Zd ZdZdd„ ZdS )ÚSMTPRelayerz)
    A base class for SMTP relayers.
    c                 O   ó(   t jj| g|¢R i |¤Ž |  |¡ 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   r=   ©r	   r9   ÚargsÚkwr   r   r   r   ~   s   zSMTPRelayer.__init__N©r,   r-   r.   r/   r   r   r   r   r   rM   y   ó    rM   c                   @   rL   )ÚESMTPRelayerz*
    A base class for ESMTP relayers.
    c                 O   rN   )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   r=   rP   r   r   r   r   “   s   zESMTPRelayer.__init__NrS   r   r   r   r   rU   Ž   rT   rU   )r/   rE   r(   Útwisted.internet.addressr   Útwisted.mailr   Útwisted.pythonr   r   r0   rO   rM   rV   rU   r   r   r   r   Ú<module>   s   ;-