
    \d&0                     z   d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	 ddl
mZmZ ddlmZmZmZ ddlmZ  eej                   G d	 d
                      Z G d de          Z G d de          Z G d dej                  Z G d de          Z G d dej                  Z G d dej                  ZdS )z
Mail protocol support.
    )implementer)longversion)CramMD5CredentialsUsernamePassword)UnauthorizedLogin)deferprotocol)pop3relaysmtp)logc                   L    e Zd ZU dZdZdZeed<   ej	        fdZ
d Zd Zd ZdS )	DomainDeliveryBaseaN  
    A base class for message delivery using the domains of a mail service.

    @ivar service: See L{__init__}
    @ivar user: See L{__init__}
    @ivar host: See L{__init__}

    @type protocolName: L{bytes}
    @ivar protocolName: The protocol being used to deliver the mail.
        Sub-classes should set this appropriately.
    Ns   not-implemented-protocolprotocolNamec                 0    || _         || _        || _        dS )z
        @type service: L{MailService}
        @param service: A mail service.

        @type user: L{bytes} or L{None}
        @param user: The authenticated SMTP user.

        @type host: L{bytes}
        @param host: The hostname.
        N)serviceuserhost)selfr   r   r   s       6lib/python3.11/site-packages/twisted/mail/protocols.py__init__zDomainDeliveryBase.__init__%   s     				    c                    dx}}| j         rd| j                             d          z   }|d         rd|d         z   }d|d         z   dz   |d         z   d	z   |z   |z   }d
| j        z   dz   | j        z   dz   t	          j        d          z   dz   }dd                    t          t          |                    z   dz   t          j	                    z   }d|z   dz   |z   dz   |z   S )a  
        Generate a received header string for a message.

        @type helo: 2-L{tuple} of (L{bytes}, L{bytes})
        @param helo: The client's identity as sent in the HELO command and its
            IP address.

        @type origin: L{Address}
        @param origin: The origination address of the message.

        @type recipients: L{list} of L{User}
        @param recipients: The destination addresses for the message.

        @rtype: L{bytes}
        @return: A received header string.
        r   s    auth=xtextr   s    helo=s   from s    ([      ]s   by s    with s    (ascii   )s   for <    s   > s
   Received: s   
	)
r   encoder   r   r   joinmapbytesr   
rfc822date)	r   heloorigin
recipientsauthStrheloStrfromUserbyforUsers	            r   receivedHeaderz!DomainDeliveryBase.receivedHeader4   s   "  '9 	<$)"2"27";";;G7 	*$q')Gd1g%.a84?'IGSi   	
  ))*  	 tyyUJ!7!78885@4?CTCTT 	 x''1B6@7JJr   c                 "   | j         rS| j        j        rG| j        j                            |j        j        d          }|t          j        | j        d          }n| j        j        |j        j                 }t          j
        |j        |          S )a9  
        Validate the address for which a message is destined.

        @type user: L{User}
        @param user: The destination address.

        @rtype: L{Deferred <defer.Deferred>} which successfully fires with
            no-argument callable which returns L{IMessage <smtp.IMessage>}
            provider.
        @return: A deferred which successfully fires with a no-argument
            callable which returns a message receiver for the destination.

        @raise SMTPBadRcpt: When messages cannot be accepted for the
            destination address.
        NT)r   r   queuedomainsgetdestdomainr   DomainQueuerr   maybeDeferredexists)r   r   ds      r   
validateTozDomainDeliveryBase.validateToY   s|    " 9 	7+ 	7$(()94@@Ay&t|T::$TY%56A"18T222r   c                     |st          j        |dd          |j        dk    r!|j        dk    rt          j        |dd          |S )a  
        Validate the address from which a message originates.

        @type helo: 2-L{tuple} of (L{bytes}, L{bytes})
        @param helo: The client's identity as sent in the HELO command and its
            IP address.

        @type origin: L{Address}
        @param origin: The origination address of the message.

        @rtype: L{Address}
        @return: The origination address.

        @raise SMTPBadSender: When messages cannot be accepted from the
            origination address.
        i  zWho are you?  Say HELO first.r   i  z#Sender address must contain domain.)r   SMTPBadSenderlocalr3   )r   r%   r&   s      r   validateFromzDomainDeliveryBase.validateFromr   sW    "  	S$VS2QRRR<36=C#7#7$VS2WXXXr   )__name__
__module____qualname____doc__r   r   r#   __annotations__r   DNSNAMEr   r-   r8   r<    r   r   r   r      s         
 
 G5L%555+/<    #K #K #KJ3 3 32    r   r   c                       e Zd ZdZdZdS )SMTPDomainDeliveryzA
    A domain delivery base class for use in an SMTP server.
    s   smtpNr=   r>   r?   r@   r   rC   r   r   rE   rE      s          LLLr   rE   c                       e Zd ZdZdZdS )ESMTPDomainDeliveryzB
    A domain delivery base class for use in an ESMTP server.
    s   esmtpNrF   rC   r   r   rH   rH      s          LLLr   rH   c                   2    e Zd ZdZej        ZdZddZd Z	dS )SMTPFactorya;  
    An SMTP server protocol factory.

    @ivar service: See L{__init__}
    @ivar portal: See L{__init__}

    @type protocol: no-argument callable which returns a L{Protocol
        <protocol.Protocol>} subclass
    @ivar protocol: A callable which creates a protocol.  The default value is
        L{SMTP}.
    Nc                 `    t           j                            |            || _        || _        dS )z
        @type service: L{MailService}
        @param service: An email service.

        @type portal: L{Portal <twisted.cred.portal.Portal>} or
            L{None}
        @param portal: A portal to use for authentication.
        N)r   rJ   r   r   portal)r   r   rL   s      r   r   zSMTPFactory.__init__   s-     	!!$'''r   c                     t          j        d|            t          j                            | |          }| j        |_        | j        |_        |S )a  
        Create an instance of an SMTP server protocol.

        @type addr: L{IAddress <twisted.internet.interfaces.IAddress>} provider
        @param addr: The address of the SMTP client.

        @rtype: L{SMTP}
        @return: An SMTP protocol.
        zConnection from )r   msgr   rJ   buildProtocolr   rL   r   addrps      r   rO   zSMTPFactory.buildProtocol   sL     	)4))*****466L	;r   )N)
r=   r>   r?   r@   r   SMTPr	   rL   r   rO   rC   r   r   rJ   rJ      sO        
 
 yHF       r   rJ   c                   0    e Zd ZdZej        ZdZd Zd Z	dS )ESMTPFactorya  
    An ESMTP server protocol factory.

    @type protocol: no-argument callable which returns a L{Protocol
        <protocol.Protocol>} subclass
    @ivar protocol: A callable which creates a protocol.  The default value is
        L{ESMTP}.

    @type context: L{IOpenSSLContextFactory
        <twisted.internet.interfaces.IOpenSSLContextFactory>} or L{None}
    @ivar context: A factory to generate contexts to be used in negotiating
        encrypted communication.

    @type challengers: L{dict} mapping L{bytes} to no-argument callable which
        returns L{ICredentials <twisted.cred.credentials.ICredentials>}
        subclass provider.
    @ivar challengers: A mapping of acceptable authorization mechanism to
        callable which creates credentials to use for authentication.
    Nc                 F    t          j        | g|R   dt          i| _        dS )zk
        @param args: Arguments for L{SMTPFactory.__init__}

        @see: L{SMTPFactory.__init__}
        s   CRAM-MD5N)rJ   r   r   challengers)r   argss     r   r   zESMTPFactory.__init__   s1     	T)D))))');<r   c                 l    t                               | |          }| j        |_        | j        |_        |S )a  
        Create an instance of an ESMTP server protocol.

        @type addr: L{IAddress <twisted.internet.interfaces.IAddress>} provider
        @param addr: The address of the ESMTP client.

        @rtype: L{ESMTP}
        @return: An ESMTP protocol.
        )rJ   rO   rW   contextctxrP   s      r   rO   zESMTPFactory.buildProtocol   s1     %%dD11(r   )
r=   r>   r?   r@   r   ESMTPr	   rZ   r   rO   rC   r   r   rU   rU      sJ         ( zHG= = =    r   rU   c                   ,    e Zd ZdZdZdZd Zd Zd ZdS )VirtualPOP3a[  
    A virtual hosting POP3 server.

    @type service: L{MailService}
    @ivar service: The email service that created this server.  This must be
        set by the service.

    @type domainSpecifier: L{bytes}
    @ivar domainSpecifier: The character to use to split an email address into
        local-part and domain. The default is '@'.
    N   @c                 <   |                      |          \  }}	 | j                            |          }|                    t	          j        | j        ||          dt          j                  S # t          $ r# t          j
        t                                cY S w xY w)a1  
        Perform APOP authentication.

        Override the default lookup scheme to allow virtual domains.

        @type user: L{bytes}
        @param user: The name of the user attempting to log in.

        @type digest: L{bytes}
        @param digest: The challenge response.

        @rtype: L{Deferred} which successfully results in 3-L{tuple} of
            (L{IMailbox <pop3.IMailbox>}, L{IMailbox <pop3.IMailbox>}
            provider, no-argument callable)
        @return: A deferred which fires when authentication is complete.
            If successful, it returns an L{IMailbox <pop3.IMailbox>} interface,
            a mailbox and a logout function. If authentication fails, the
            deferred fails with an L{UnauthorizedLogin
            <twisted.cred.error.UnauthorizedLogin>} error.
        N)lookupDomainr   lookupPortalloginr
   APOPCredentialsmagicIMailboxKeyErrorr   failr   )r   r   digestr3   rL   s        r   authenticateUserAPOPz VirtualPOP3.authenticateUserAPOP  s    * ((..f	\..v66F <<$TZv>>dm    	3 	3 	3:/1122222	3s   A. .*BBc                 &   |                      |          \  }}	 | j                            |          }|                    t	          ||          dt
          j                  S # t          $ r# t          j	        t                                cY S w xY w)aY  
        Perform authentication for a username/password login.

        Override the default lookup scheme to allow virtual domains.

        @type user: L{bytes}
        @param user: The name of the user attempting to log in.

        @type password: L{bytes}
        @param password: The password to authenticate with.

        @rtype: L{Deferred} which successfully results in 3-L{tuple} of
            (L{IMailbox <pop3.IMailbox>}, L{IMailbox <pop3.IMailbox>}
            provider, no-argument callable)
        @return: A deferred which fires when authentication is complete.
            If successful, it returns an L{IMailbox <pop3.IMailbox>} interface,
            a mailbox and a logout function. If authentication fails, the
            deferred fails with an L{UnauthorizedLogin
            <twisted.cred.error.UnauthorizedLogin>} error.
        N)ra   r   rb   rc   r   r
   rf   rg   r   rh   r   )r   r   passwordr3   rL   s        r   authenticateUserPASSz VirtualPOP3.authenticateUserPASS+  s    * ((..f	W\..v66F << 0x @ @$VVV  	3 	3 	3:/1122222	3s   A# #*BBc                     	 |                     | j        d          \  }}n# t          $ r d}Y nw xY w|| j        j        vr:t          j        d                    |                    d                              ||fS )a  
        Check whether a domain is among the virtual domains supported by the
        mail service.

        @type user: L{bytes}
        @param user: An email address.

        @rtype: 2-L{tuple} of (L{bytes}, L{bytes})
        @return: The local part and the domain part of the email address if the
            domain is supported.

        @raise POP3Error: When the domain is not supported by the mail service.
        r   r   zno such domain {}zutf-8)	splitdomainSpecifier
ValueErrorr   r0   r
   	POP3Errorformatdecode)r   r   r3   s      r   ra   zVirtualPOP3.lookupDomainH  s    	::d&:A>>LD&& 	 	 	FFF	---.!4!;!;FMM'<R<R!S!STTTV|s   ! 00)	r=   r>   r?   r@   r   rp   rj   rm   ra   rC   r   r   r^   r^      sZ        
 
 GO  >W W W:    r   r^   c                   &    e Zd ZdZeZdZd Zd ZdS )POP3Factorya  
    A POP3 server protocol factory.

    @ivar service: See L{__init__}

    @type protocol: no-argument callable which returns a L{Protocol
        <protocol.Protocol>} subclass
    @ivar protocol: A callable which creates a protocol.  The default value is
        L{VirtualPOP3}.
    Nc                     || _         dS )zY
        @type service: L{MailService}
        @param service: An email service.
        N)r   )r   r   s     r   r   zPOP3Factory.__init__n  s    
 r   c                 ^    t           j                            | |          }| j        |_        |S )a   
        Create an instance of a POP3 server protocol.

        @type addr: L{IAddress <twisted.internet.interfaces.IAddress>} provider
        @param addr: The address of the POP3 client.

        @rtype: L{POP3}
        @return: A POP3 protocol.
        )r	   ServerFactoryrO   r   rP   s      r   rO   zPOP3Factory.buildProtocolu  s*     "00t<<L	r   )	r=   r>   r?   r@   r^   r	   r   r   rO   rC   r   r   rv   rv   _  sH        	 	 HG      r   rv   N)r@   zope.interfacer   twisted.copyrightr   twisted.cred.credentialsr   r   twisted.cred.errorr   twisted.internetr   r	   twisted.mailr
   r   r   twisted.pythonr   IMessageDeliveryr   rE   rH   rJ   rU   POP3r^   ry   rv   rC   r   r   <module>r      s  
 
 ' & & & & & ) ) ) ) ) ) I I I I I I I I 0 0 0 0 0 0 , , , , , , , , * * * * * * * * * *       T"##r r r r r r r $#rj    +       ,   + + + + +$" + + +\. . . . .; . . .bc c c c c$) c c cL" " " " "(( " " " " "r   