
    RhS7                        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(  rd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	II&&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''DII(>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gtDz :		"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T4==)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    yy!!(Q,/t9xo..??QgtDz :;z22T 99f$$8r>":v%%CRy&  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    }}A6--/adlu%aCABxaZFKKmmoGD! dl T6!!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 )zSend 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)   	!99DDI

99DDI
!MM&"2"23 JJL     		U^^3"3
A6%? JJL 99DDI
!MM&"2"23  		U^^3"3
A6%? JJLDJJL  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/NN  .ABBF"V$..0~~dF;<<r
   c                 0    | j                  d|d|      S )zRetrieve 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     }}E7;<<r
   c                 P    || j                  d|z        S | j                  d      S )zReturn 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q63qr7?"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1gG" &!*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yy{~ABB?002G~~f%''		8<		 ( C	II&&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
 

/0I=*=	%&: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"DLMM$dG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<    &&tW5D<<++D<@II , GDKr
   c                     t        d      )zThe 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@ NN:zSXXa[A	!,,.FF388A;GGCHHQKFFH668Wi1gk" ) !q	fma  	 D%$,	 '() FFH [  Hs   E EE