Ë
    oj’  ã                   ó¼   — 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                  «      r€t        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ä˜$¤ D§I¡I£× 4Ñ 4°S¸!Ó <Ó=ˆDÜ˜$¤ D§I¡I£× 4Ñ 4°S¸!Ó <Ó=ˆDÜ�4‹y˜AŠ~¤# 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<   € ð ×!Ñ!×)Ñ)Ó+ˆØ�{‰{ÒWœj¨¬{Ó;ÒW¸t¿y¹yÈKÑ?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Ü�G‰G�n¤S¨¯©£^Ð$6°d¼3¸t¿y¹y»>Ð:LÐMÔNÜ�K‰Kœ˜TŸY™Y›¬¨T¯Y©Y«Ð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 ‘n dÓ+ð 2¨rÜ"(§+¡+¨b£/�÷2ä�g ‘nÓ%ˆBØ×"Ñ" 2Ô&Ø�M‰M× Ñ  Ô1Ø�J‰J×Ñ˜gÕ&ñ	'÷2ð 2ús   £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)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Úremover>   r=   )r   ÚcodeÚrespÚnumOkÚ	addressesr   s         r   ÚsentMailzRelayerMixin.sentMailk   sY   € ð
 ”4—<‘<Ñä�I‰I�d—j‘j ‘m dÑ*Ô+Ü�I‰I�d—j‘j ‘m dÑ*Ô+Ø�M‰M˜!ÐØ�J‰J�q‰Mr   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   