Ë
    òT•jS7  ã                   ó¼  — d Z ddlZddlZddlZddlZ	 ddlZdZddgZ G d„ de	«      Z
dZd	Zd
ZdZeez   ZdZ G d„ d«      Zer G d„ de«      Zej'                  d«       edk(  rêddlZ eej*                  d   «      Z eej1                  «       «       ej3                  ej*                  d   «       ej5                  ej*                  d   «       ej7                  «        ej9                  «       \  ZZ ededz   «      D ]<  Z ejC                  e «      \  Z"Z#Z$ ede z  «       e#D ]  Z% ede%z   «       Œ  ed«       Œ> ejM                  «        yy# e$ r dZY �Œ@w xY w)z@A POP3 client class.

Based on the J. Myers POP3 draft, Jan. 96
é    NTFÚPOP3Úerror_protoc                   ó   — e Zd Zy)r   N)Ú__name__Ú
__module__Ú__qualname__© ó    ú/usr/lib/python3.12/poplib.pyr   r      s   … r
   én   iã  ó   ó   
i   c                   ó   — e Zd ZdZdZeej                  fd„Zd„ Z	d„ Z
d„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd!d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z ej>                  d«      Z d„ Z!d„ Z"d!d„Z#d„ Z$d„ Z%d!d „Z&y)"r   aP  This class supports both the minimal and optional command sets.
    Arguments can be strings or integers (where appropriate)
    (e.g.: retr(1) and retr('1') both work equally well.

    Minimal Command Set:
            USER name               user(name)
            PASS string             pass_(string)
            STAT                    stat()
            LIST [msg]              list(msg = None)
            RETR msg                retr(msg)
            DELE msg                dele(msg)
            NOOP                    noop()
            RSET                    rset()
            QUIT                    quit()

    Optional Commands (some servers support these):
            RPOP name               rpop(name)
            APOP name digest        apop(name, digest)
            TOP msg n               top(msg, n)
            UIDL [msg]              uidl(msg = None)
            CAPA                    capa()
            STLS                    stls()
            UTF8                    utf8()

    Raises one exception: 'error_proto'.

    Instantiate with:
            POP3(hostname, port=110)

    NB:     the POP protocol locks the mailbox from user
            authorization until QUIT, so be sure to get in, suck
            the messages, and quit, each time you access the
            mailbox.

            POP is a line-based protocol, which means large mail
            messages consume lots of python cycles reading them
            line-by-line.

            If it's available on your mail server, use IMAP4
            instead, it doesn't suffer from the two problems
            above.
    zUTF-8c                 ó  — || _         || _        d| _        t        j                  d| ||«       | j                  |«      | _        | j                  j                  d«      | _        d| _	        | j                  «       | _        y )NFzpoplib.connectÚrbr   )ÚhostÚportÚ_tls_establishedÚsysÚauditÚ_create_socketÚsockÚmakefileÚfileÚ
_debuggingÚ_getrespÚwelcome)Úselfr   r   Útimeouts       r   Ú__init__zPOP3.__init__b   sg   € àˆŒ	ØˆŒ	Ø %ˆÔÜ�	‰	Ð" D¨$°Ô5Ø×'Ñ'¨Ó0ˆŒ	Ø—I‘I×&Ñ& tÓ,ˆŒ	ØˆŒØ—}‘}“ˆ�r
   c                 óx   — |�|st        d«      ‚t        j                  | j                  | j                  f|«      S )Nz0Non-blocking socket (timeout=0) is not supported)Ú
ValueErrorÚsocketÚcreate_connectionr   r   )r   r   s     r   r   zPOP3._create_socketm   s6   € ØÐ¡wÜÐOÓPÐPÜ×'Ñ'¨¯©°D·I±IÐ(>ÀÓHÐHr
   c                 ó¾   — | j                   dkD  rt        dt        |«      «       t        j                  d| |«       | j
                  j                  |t        z   «       y )Né   z*put*zpoplib.putline)r   ÚprintÚreprr   r   r   ÚsendallÚCRLF©r   Úlines     r   Ú_putlinezPOP3._putliner   sB   € Ø�?‰?˜QÒ¤ g¬t°D«zÔ :Ü�	‰	Ð" D¨$Ô/Ø�	‰	×Ñ˜$¤™+Õ&r
   c                 ó”   — | j                   rt        dt        |«      «       t        || j                  «      }| j                  |«       y )Nz*cmd*)r   r'   r(   ÚbytesÚencodingr-   r+   s     r   Ú_putcmdzPOP3._putcmdz   s2   € Ø�?Š?œE '¬4°«:Ô6Ü�T˜4Ÿ=™=Ó)ˆØ�‰�dÕr
   c                 óR  — | j                   j                  t        dz   «      }t        |«      t        kD  rt	        d«      ‚| j
                  dkD  rt        dt        |«      «       |st	        d«      ‚t        |«      }|dd  t        k(  r|d d |fS |d d t        k(  r|dd |fS |d d |fS )Nr&   zline too longz*get*z-ERR EOFéþÿÿÿéÿÿÿÿ)
r   ÚreadlineÚ_MAXLINEÚlenr   r   r'   r(   r*   ÚCR)r   r,   Úoctetss      r   Ú_getlinezPOP3._getline„   s°   € Ø�y‰y×!Ñ!¤(¨Q¡,Ó/ˆÜˆt‹9”xÒÜ˜oÓ.Ð.à�?‰?˜QÒ¤ g¬t°D«zÔ :Ùœ; zÓ2Ð2Ü�T“ˆð ��ˆ9œÒØ˜˜�9˜fÐ$Ð$Ø��ˆ8”rŠ>Ø˜˜"�:˜vÐ%Ð%Ø�C�Rˆy˜&Ð Ð r
   c                 ó¬   — | j                  «       \  }}| j                  dkD  rt        dt        |«      «       |j	                  d«      st        |«      ‚|S )Nr&   z*resp*ó   +)r:   r   r'   r(   Ú
startswithr   )r   ÚrespÚos      r   r   zPOP3._getresp™   sF   € Ø—-‘-“/‰ˆˆaØ�?‰?˜QÒ¤ h´°T³
Ô ;Ø�‰˜tÔ$Ü˜dÓ#Ð#Øˆr
   c                 óø   — | j                  «       }g }d}| j                  «       \  }}|dk7  rJ|j                  d«      r
|dz
  }|dd  }||z   }|j                  |«       | j                  «       \  }}|dk7  rŒJ|||fS )Nr   ó   .s   ..r&   )r   r:   r=   Úappend)r   r>   Úlistr9   r,   r?   s         r   Ú_getlongrespzPOP3._getlongresp£   sˆ   € Ø�}‰}‹ˆØˆ˜A�6Ø—-‘-“/‰ˆˆaØ�dŠlØ�‰˜uÔ%Ø�a‘C�Ø˜A˜B�x�Ø˜a‘ZˆFØ�K‰K˜ÔØ—m‘m“o‰GˆD�!ð �d‹lð �T˜6Ð!Ð!r
   c                 óD   — | j                  |«       | j                  «       S ©N)r1   r   r+   s     r   Ú	_shortcmdzPOP3._shortcmd³   s   € Ø�‰�TÔØ�}‰}‹Ðr
   c                 óD   — | j                  |«       | j                  «       S rF   )r1   rD   r+   s     r   Ú_longcmdzPOP3._longcmdº   s   € Ø�‰�TÔØ× Ñ Ó"Ð"r
   c                 ó   — | j                   S rF   )r   ©r   s    r   Ú
getwelcomezPOP3.getwelcomeÁ   s   € Ø�|‰|Ðr
   c                 ó   — || _         y rF   )r   )r   Úlevels     r   Úset_debuglevelzPOP3.set_debuglevelÅ   s	   € Øˆ�r
   c                 ó*   — | j                  d|z  «      S )zVSend user name, return response

        (should indicate password required).
        zUSER %s©rG   ©r   Úusers     r   rS   z	POP3.userË   s   € ð
 �~‰~˜i¨$Ñ.Ó/Ð/r
   c                 ó*   — | j                  d|z  «      S )z Send password, return response

        (response includes message count, mailbox size).

        NB: mailbox is locked by server from here to 'quit()'
        zPASS %srQ   )r   Úpswds     r   Úpass_z
POP3.pass_Ó   s   € ð �~‰~˜i¨$Ñ.Ó/Ð/r
   c                 óÆ   — | j                  d«      }|j                  «       }| j                  rt        dt	        |«      «       t        |d   «      }t        |d   «      }||fS )z]Get mailbox status.

        Result is tuple of 2 ints (message count, mailbox size)
        ÚSTATz*stat*r&   é   )rG   Úsplitr   r'   r(   Úint)r   ÚretvalÚretsÚnumMessagesÚsizeMessagess        r   Ústatz	POP3.statÝ   sV   € ð
 —‘ Ó'ˆØ�|‰|‹~ˆØ�?Š?œE (¬D°«JÔ7Ü˜$˜q™'“lˆÜ˜4 ™7“|ˆØ˜\Ð*Ð*r
   Nc                 óP   — |�| j                  d|z  «      S | j                  d«      S )a  Request listing, return result.

        Result without a message number argument is in form
        ['response', ['mesg_num octets', ...], octets].

        Result when a message number argument is given is a
        single response: the "scan listing" for that message.
        zLIST %sÚLIST©rG   rI   ©r   Úwhichs     r   rC   z	POP3.listê   s-   € ð ÐØ—>‘> )¨eÑ"3Ó4Ð4Ø�}‰}˜VÓ$Ð$r
   c                 ó*   — | j                  d|z  «      S )zoRetrieve whole message number 'which'.

        Result is in form ['response', ['line', ...], octets].
        zRETR %s©rI   rd   s     r   Úretrz	POP3.retrø   s   € ð
 �}‰}˜Y¨Ñ.Ó/Ð/r
   c                 ó*   — | j                  d|z  «      S )zFDelete message number 'which'.

        Result is 'response'.
        zDELE %srQ   rd   s     r   Údelez	POP3.dele   s   € ð
 �~‰~˜i¨%Ñ/Ó0Ð0r
   c                 ó$   — | j                  d«      S )zXDoes nothing.

        One supposes the response indicates the server is alive.
        ÚNOOPrQ   rK   s    r   Únoopz	POP3.noop  s   € ð
 �~‰~˜fÓ%Ð%r
   c                 ó$   — | j                  d«      S )z(Unmark all messages marked for deletion.ÚRSETrQ   rK   s    r   Úrsetz	POP3.rset  s   € à�~‰~˜fÓ%Ð%r
   c                 óH   — | j                  d«      }| j                  «        |S )zDSignoff: commit changes on server, unlock mailbox, close connection.ÚQUIT)rG   Úclose)r   r>   s     r   Úquitz	POP3.quit  s   € à�~‰~˜fÓ%ˆØ�
‰
ŒØˆr
   c                 óØ  — 	 | j                   }d| _         |�|j                  «        | j                  }d| _        |�1	 |j                  t        j
                  «       |j                  «        yy# t        $ r8}|j                  t        j                  k7  rt        |dd«      dk7  r‚ Y d}~ŒNd}~ww xY w# |j                  «        w xY w# | j                  }d| _        |�‹	 |j                  t        j
                  «       nD# t        $ r8}|j                  t        j                  k7  rt        |dd«      dk7  r‚ Y d}~nd}~ww xY w|j                  «        w # |j                  «        w xY ww xY w)z8Close the connection without assuming anything about it.NÚwinerrorr   i&'  )
r   rs   r   Úshutdownr#   Ú	SHUT_RDWRÚOSErrorÚerrnoÚENOTCONNÚgetattr)r   r   r   Úexcs       r   rs   z
POP3.close  s)  € ð	!Ø—9‘9ˆDØˆDŒIØÐØ—
‘
”à—9‘9ˆDØˆDŒIØÐð
!Ø—M‘M¤&×"2Ñ"2Ô3ð —J‘J•Lð  øô ò ð Ÿ	™	¤U§^¡^Ò3Ü" 3¨
°AÓ6¸%Ò?Øÿøðûð —J‘J•Lûð —9‘9ˆDØˆDŒIØÐð
!Ø—M‘M¤&×"2Ñ"2Õ3øÜò ð Ÿ	™	¤U§^¡^Ò3Ü" 3¨
°AÓ6¸%Ò?Øÿøðúð —J‘J•Lø�D—J‘J•Lúð  úsp   ‚%C ½A. Á.	B/Á7.B*Â%B2 Â*B/Â/B2 Â2CÃE)ÃC>Ã=EÃ>	D?Ä.D:Ä5EÄ:D?Ä?EÅE)ÅE%Å%E)c                 ó*   — | j                  d|z  «      S )zNot sure what this does.zRPOP %srQ   rR   s     r   Úrpopz	POP3.rpop7  s   € à�~‰~˜i¨$Ñ.Ó/Ð/r
   s   \+OK.[^<]*(<.*>)c                 ó.  — t        || j                  «      }| j                  j                  | j                  «      }|st        d«      ‚ddl}|j                  d«      |z   }|j                  |«      j                  «       }| j                  d|›d|›�«      S )a  Authorisation

        - only possible if server has supplied a timestamp in initial greeting.

        Args:
                user     - mailbox user;
                password - mailbox password.

        NB: mailbox is locked by server from here to 'quit()'
        z!-ERR APOP not supported by serverr   Nr&   zAPOP ú )r/   r0   Ú	timestampÚmatchr   r   ÚhashlibÚgroupÚmd5Ú	hexdigestrG   )r   rS   ÚpasswordÚsecretÚmr„   Údigests          r   Úapopz	POP3.apop>  s{   € ô �x §¡Ó/ˆØ�N‰N× Ñ  §¡Ó.ˆÙÜÐAÓBÐBÛØ—‘˜“˜FÑ"ˆØ—‘˜VÓ$×.Ñ.Ó0ˆØ�~Š~ªd±FÐ;Ó<Ð<r
   c                 ó0   — | j                  d|›d|›�«      S )z­Retrieve message header of message number 'which'
        and first 'howmuch' lines of message body.

        Result is in form ['response', ['line', ...], octets].
        zTOP r�   rg   )r   re   Úhowmuchs      r   ÚtopzPOP3.topS  s   € ð �}Š}ªE±7Ð;Ó<Ð<r
   c                 óP   — |�| j                  d|z  «      S | j                  d«      S )zìReturn message digest (unique id) list.

        If 'which', result contains unique id for that message
        in the form 'response mesgnum uid', otherwise result is
        the list ['response', ['mesgnum uid', ...], octets]
        zUIDL %sÚUIDLrc   rd   s     r   Úuidlz	POP3.uidl\  s-   € ð ÐØ—>‘> )¨eÑ"3Ó4Ð4Ø�}‰}˜VÓ$Ð$r
   c                 ó$   — | j                  d«      S )zITry to enter UTF-8 mode (see RFC 6856). Returns server response.
        ÚUTF8rQ   rK   s    r   Úutf8z	POP3.utf8h  s   € ð �~‰~˜fÓ%Ð%r
   c                 óž   — d„ }i }	 | j                  d«      }|d   }|D ]  } ||«      \  }}|||<   Œ 	 |S # t        $ r t        d«      ‚w xY w)a   Return server capabilities (RFC 2449) as a dictionary
        >>> c=poplib.POP3('localhost')
        >>> c.capa()
        {'IMPLEMENTATION': ['Cyrus', 'POP3', 'server', 'v2.2.12'],
         'TOP': [], 'LOGIN-DELAY': ['0'], 'AUTH-RESP-CODE': [],
         'EXPIRE': ['NEVER'], 'USER': [], 'STLS': [], 'PIPELINING': [],
         'UIDL': [], 'RESP-CODES': []}
        >>>

        Really, according to RFC 2449, the cyrus folks should avoid
        having the implementation split into multiple arguments...
        c                 óT   — | j                  d«      j                  «       }|d   |dd  fS )NÚasciir   r&   )ÚdecoderZ   )r,   Úlsts     r   Ú	_parsecapzPOP3.capa.<locals>._parsecap{  s-   € Ø—+‘+˜gÓ&×,Ñ,Ó.ˆCØ�q‘6˜3˜q˜r˜7�?Ð"r
   ÚCAPAr&   z!-ERR CAPA not supported by server)rI   r   )r   r›   Úcapsr>   ÚrawcapsÚcaplineÚcapnmÚcapargss           r   Úcapaz	POP3.capan  sw   € ò	#ð ˆð	CØ—=‘= Ó(ˆDØ˜1‘gˆGØ"ò &�Ù!*¨7Ó!3‘��wØ%��U’ñ&ð
 ˆøô ò 	CÜÐAÓBÐBð	Cús	   ‡-7 ·Ac                 óˆ  — t         st        d«      ‚| j                  rt        d«      ‚| j                  «       }d|vrt        d«      ‚|€t	        j
                  «       }| j                  d«      }|j                  | j                  | j                  ¬«      | _        | j                  j                  d«      | _        d| _        |S )z{Start a TLS session on the active connection as specified in RFC 2595.

                context - a ssl.SSLContext
        z-ERR TLS support missingú$-ERR TLS session already establishedÚSTLSz!-ERR STLS not supported by server©Úserver_hostnamer   T)ÚHAVE_SSLr   r   r¢   ÚsslÚ_create_stdlib_contextrG   Úwrap_socketr   r   r   r   )r   Úcontextr�   r>   s       r   Ústlsz	POP3.stls‹  s¯   € õ
 ÜÐ8Ó9Ð9Ø× Ò ÜÐDÓEÐEØ�y‰y‹{ˆØ˜‰~ÜÐAÓBÐBØˆ?Ü×0Ñ0Ó2ˆGØ�~‰~˜fÓ%ˆØ×'Ñ'¨¯	©	Ø8<¿	¹	ð (ó CˆŒ	à—I‘I×&Ñ& tÓ,ˆŒ	Ø $ˆÔØˆr
   rF   )'r   r   r   Ú__doc__r0   Ú	POP3_PORTr#   Ú_GLOBAL_DEFAULT_TIMEOUTr    r   r-   r1   r:   r   rD   rG   rI   rL   rO   rS   rV   r`   rC   rh   rj   rm   rp   rt   rs   r   ÚreÚcompiler‚   rŒ   r�   r’   r•   r¢   r­   r	   r
   r   r   r   3   s»   „ ñ)ðV €Hà"+Ø×7Ñ7ó	'òIò
'òò!ò*ò"ò ò#òò ò0ò0ò
+ó%ò0ò1ò&ò&ò
ò!ò80ð
 �—
‘
Ð/Ó0€Iò=ò*=ó	%ò&òô:r
   c                   óD   — e Zd ZdZefej                  ddœd„Zd„ Zdd„Z	y)ÚPOP3_SSLaN  POP3 client class over SSL connection

        Instantiate with: POP3_SSL(hostname, port=995, context=None)

               hostname - the hostname of the pop3 over ssl server
               port - port number
               context - a ssl.SSLContext

        See the methods of the parent class POP3 for more documentation.
        N)r   r¬   c                ón   — |€t        j                  «       }|| _        t        j	                  | |||«       y rF   )r©   rª   r¬   r   r    )r   r   r   r   r¬   s        r   r    zPOP3_SSL.__init__¯  s.   € àˆÜ×4Ñ4Ó6�Ø"ˆDŒLÜ�M‰M˜$  d¨GÕ4r
   c                 ó€   — t         j                  | |«      }| j                  j                  || j                  ¬«      }|S )Nr¦   )r   r   r¬   r«   r   )r   r   r   s      r   r   zPOP3_SSL._create_socket¶  s<   € Ü×&Ñ& t¨WÓ5ˆDØ—<‘<×+Ñ+¨DØ<@¿I¹Ið ,ó GˆDàˆKr
   c                 ó   — t        d«      ‚)z¬The method unconditionally raises an exception since the
            STLS command doesn't make any sense on an already established
            SSL/TLS session.
            r¤   )r   )r   r¬   s     r   r­   zPOP3_SSL.stls¼  s   € ô
 ÐDÓEÐEr
   rF   )
r   r   r   r®   ÚPOP3_SSL_PORTr#   r°   r    r   r­   r	   r
   r   r´   r´   £  s,   „ ñ		ð '4ð 	5Ø &× >Ñ >Èô	5ò	ô	Fr
   r´   Ú__main__r&   rY   é   zMessage %d:z   z-----------------------)'r®   rz   r±   r#   r   r©   r¨   ÚImportErrorÚ__all__Ú	Exceptionr   r¯   r¸   r8   ÚLFr*   r6   r   r´   rB   r   ÚargvÚar'   rL   rS   rV   rC   r`   ÚnumMsgsÚ	totalSizeÚrangeÚirh   ÚheaderÚmsgr9   r,   rt   r	   r
   r   ú<module>rÇ      s†  ðñó Û 	Û Û 
ðÛØ€Hð �-Ð
 €ô #�)Ô "ð €	ð €ð €Ø
€Ø	ˆ"�u€ð €÷kñ kñ\ ôF�4ô Fð@ ‡N�N�:ÔàˆzÒÛÙˆS�X‰X�a‰[Ó€AÙ	ˆ!�,‰,‹.ÔØ‡F�Fˆ3�8‰8�A‰;ÔØ‡G�GˆC�H‰H�Q‰KÔØ‡F�F„HØŸ6™6›8Ñ€WˆiÙ�1�g ‘kÓ"ò )ˆØ !§¡ q£	Ñˆ��fÙˆm˜aÑÔ Øò 	 ˆDÙ�%˜$‘,Õð	 áÐ'Õ(ð)ð ‡F�F…Hð øð[ ò ØƒHðús   ”E ÅEÅE