
    Ϫf                         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      Z	 G d d	      Z
 G d
 de
ej                        Z G d de
ej                        Zy)z
Support for relaying mail.
    N)UNIXAddress)smtp)logc                   *    e Zd ZdZddZd Zd Zd Zy)DomainQueuerzM
    An SMTP domain which add messages to a queue intended for relaying.
    c                      || _         || _        y N)serviceauthed)selfr
   authenticateds      4/usr/lib/python3/dist-packages/twisted/mail/relay.py__init__zDomainQueuer.__init__   s    #    c                 |     j                  j                  j                        rt        dt	        j
                        j                  dd            }t        dt	        j                        j                  dd            }t        |      dk(  rt        |      dk(  r fdS t        j                        )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                  &     j                        S r	   )startMessage)r   users   r   <lambda>z%DomainQueuer.exists.<locals>.<lambda>-   s    t006 r   )
	willRelaydestprotocolfilterstrorigsplitlenr   SMTPBadRcpt)r   r   r   r   s   ``  r   existszDomainQueuer.exists   s     >>$))T]]3$DII 4 4S! <=D$DII 4 4S! <=D4yA~#d)q.66t$$r   c                     |j                   j                         }| j                  xs! t        |t              xs |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   peers       r   r   zDomainQueuer.willRelay0   s<     !!))+{{Wj{;WtyyK?WWr   c           	         | j                   j                  }|j                         \  }}|5  t        j                  dt        |j                        dt        |j                               t        j                  t        |j                        t        |j                        g|       ddd       |S # 1 sw Y   |S xY w)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smtpMessages        r   r   zDomainQueuer.startMessage:   s     ""$)$:$:$<!k 	HGGnS^$6d3tyy>:LMNKKTYYTYY8,G	H 	H s   B B66C N)F)__name__
__module____qualname____doc__r   r"   r   r    r   r   r   r      s    $%,Xr   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)RelayerMixinc                 J   g | _         g | _        |D ]  }t        |dz   d      5 }t        j                  |      }d d d        t        |dz         }j                  |       | j                   j                  |       | j                  j                  |        y # 1 sw Y   axY w)N-Hrb-D)messagesnamesopenr.   loadappend)r   messagePathsmessagefpmessageContentss        r   loadMessageszRelayerMixin.loadMessagesQ   s    
# 	'Ggnd+ 2r"(++b/2gn%B""2&MM  1JJg&	'2 2s   BB"	c                 @    | j                   sy | j                   d   d   S )Nr   r=   r   s    r   getMailFromzRelayerMixin.getMailFrom\        }}}}Q""r   c                 B    | j                   sy | j                   d   d   gS )Nr   r   rH   rI   s    r   	getMailTozRelayerMixin.getMailToa   s#    }}a #$$r   c                 @    | j                   sy | j                   d   d   S )Nr   r   rH   rI   s    r   getMailDatazRelayerMixin.getMailDataf   rK   r   c                     |t         j                  v rJt        j                  | j                  d   dz          t        j                  | j                  d   dz          | j
                  d= | j                  d= y)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   coderespnumOk	addressesr   s         r   sentMailzRelayerMixin.sentMailk   sY    
 4<<IIdjjmd*+IIdjjmd*+MM!JJqMr   N)r2   r3   r4   rF   rJ   rM   rO   rX   r6   r   r   r8   r8   L   s    
	'#
%
#

r   r8   c                       e Zd ZdZd Zy)SMTPRelayerz)
    A base class for SMTP relayers.
    c                 l    t        j                  j                  | g|i | | j                  |       y)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   rF   r   rB   argskws       r   r   zSMTPRelayer.__init__}   s.     	  333,'r   Nr2   r3   r4   r5   r   r6   r   r   rZ   rZ   x   s    (r   rZ   c                       e Zd ZdZd Zy)ESMTPRelayerz*
    A base class for ESMTP relayers.
    c                 l    t        j                  j                  | g|i | | j                  |       y)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   rF   r]   s       r   r   zESMTPRelayer.__init__   s0    " 	!!$444,'r   Nr`   r6   r   r   rb   rb      s    (r   rb   )r5   rR   r.   twisted.internet.addressr   twisted.mailr   twisted.pythonr   r   r8   r\   rZ   rd   rb   r6   r   r   <module>rh      sW   
 
  0  8 8v) )X(, (*(<!1!1 (r   