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 )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   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   ;-