???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3

  \F                 @   s  d dl Z d dlZd dlZd dlZd dlZyd dlZW n ek
rL   dZY nX dZd dlm	Z
 d dlmZ dddd	d
dddgZdZG dd deZG dd deZG dd	 d	eZG dd
 d
eZG dd deZG dd deZdZdZdddddddddd d!d"hZd#d$d%d&d'd(d)gZd(d)d*Zd+Zejd,d-d.d/d0gZejd1d2d3d4gZd5d Z	d6d7 Zdkd8d9Zdld:d;Z dmd<d=Z!erd>d? Z"G d@dA dAZ#G dBd de#Z$erG dCdD dDe#Z%ej&dD e'dEkr|d dl(Z(e(j)dFdGZ*e*j+dHdIdJdKdL e*j+dMdNdOdPdL e*j+dQdRdne,dTeef dU e*j+dVdWdXe,dYdU e*j+dZd[d\dd]d^ e*j- Z.e.j/Z/e.jse/dokrpeZ/e$e.j0e/d_Z1ne/dpkreZ/e%e.j0e/d_Z1e1j2 Z3d`e3kre1j4  e1j5e.j5\Z6Z7Z8Z9Z:e;dae:dbe7dce8dde9 dedf Z<e=e,e9e.j> dS Z8e1j?e8e9\Z6Z@xbe@D ]Z\ZAZBe	eBd$ jCdgdSd  ZDe	eBd# ZEe,eBd) ZFe;dhjGeAe<eDdie<eEdjeF qW e1jH  dS )q    NFT)decode_header)_GLOBAL_DEFAULT_TIMEOUTNNTP	NNTPErrorNNTPReplyErrorNNTPTemporaryErrorNNTPPermanentErrorNNTPProtocolErrorNNTPDataErrorr   i   c               @   s   e Zd Zdd ZdS )r   c             G   s>   t j| f|  y|d | _W n tk
r8   d| _Y nX d S )Nr   zNo response given)	Exception__init__response
IndexError)selfargs r   /usr/lib64/python3.6/nntplib.pyr   b   s
    zNNTPError.__init__N)__name__
__module____qualname__r   r   r   r   r   r   `   s   c               @   s   e Zd ZdS )r   N)r   r   r   r   r   r   r   r   i   s   c               @   s   e Zd ZdS )r   N)r   r   r   r   r   r   r   r   m   s   c               @   s   e Zd ZdS )r   N)r   r   r   r   r   r   r   r   q   s   c               @   s   e Zd ZdS )r	   N)r   r   r   r   r   r   r   r	   u   s   c               @   s   e Zd ZdS )r
   N)r   r   r   r   r   r   r   r
   y   s   w   i3  Z100Z101211215Z220Z221Z222Z224Z225Z230Z231Z282subjectfromdatez
message-idZ
referencesz:bytesz:lines)bytesliness   
	GroupInfogrouplastfirstflagArticleInfoZnumber
message_idr   c             C   sN   g }x>t | D ]2\}}t|tr6|j|j|p.d q|j| qW dj|S )Nascii )_email_decode_header
isinstancer   appenddecodejoin)Z
header_strpartsvencr   r   r   r      s    
c             C   s   g }xh| D ]`}|d dkr<|dd  j d\}}}d| }n|j d\}}}|j }tj||}|j| q
W t}t|t|k rtd|d t| |krtd|S )Nr   :   z$LIST OVERVIEW.FMT response too shortz*LIST OVERVIEW.FMT redefines default fields)	partitionlower_OVERVIEW_FMT_ALTERNATIVESgetr)   _DEFAULT_OVERVIEW_FMTlenr
   )r   fmtlinename_suffixZdefaultsr   r   r   _parse_overview_fmt   s    

r<   c             C   s   t t}g }x| D ]}i }|jd^}}t|}xt|D ]\}	}
|	t |krPq:||	 }|jd}|	|kr| r|d }|
r|
d t | j |krtd|
r|
t |d  nd }
|
|||	 < q:W |j||f qW |S )N	r/   z: z?OVER/XOVER response doesn't include names of additional headers)	r6   r5   splitint	enumerate
startswithr2   r
   r)   )r   r7   Zdata_process_funcZ
n_defaultsZoverviewr8   ZfieldsZarticle_numbertokensitokenZ
field_nameZis_metadatahr   r   r   _parse_overview   s&    

rF   c             C   s   |d kr | dd  }| d d	 } t |d d }t |dd }t |dd  }t | d d
 }t | dd }t | dd  }|dk r|d7 }n|dk r|d7 }tj||||||S )N         F   i  d   il  iirL   rM   )r?   datetime)date_strtime_strZhoursZminutesZsecondsyearZmonthZdayr   r   r   _parse_datetime   s    
rR   c             C   sP   t | tjsd}n
dj| }| j}|r<|d }dj|| }ndj|| }||fS )NZ000000z({0.hour:02d}{0.minute:02d}{0.second:02d}rK   z{0:02d}{1.month:02d}{1.day:02d}z{0:04d}{1.month:02d}{1.day:02d})r(   rN   formatrQ   )ZdtZlegacyrP   yrO   r   r   r   _unparse_datetime   s    
rU   c             C   s   |d krt j }|j| |dS )N)Zserver_hostname)sslZ_create_stdlib_contextZwrap_socket)sockcontextZhostnamer   r   r   _encrypt_on  s    rY   c               @   s  e Zd ZdZdZdefddZdd Zdd	 Zd
d Z	dd Z
dd ZeZdd Zdd ZdhddZdd ZdiddZdd ZdjddZdkdd Zd!d" Zd#d$ Zd%d& Zdd'd(d)Zdd'd*d+Zdldd'd,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zdd'd6d7Zd8d9 Z d:d; Z!dmd<d=Z"d>d? Z#d@dA Z$dndBdCZ%dodd'dDdEZ&dpdd'dFdGZ'dqdd'dHdIZ(dJdK Z)dd'dLdMZ*dd'dNdOZ+dd'dPdQZ,dd'dRdSZ-dTdU Z.dVdW Z/dXdY Z0dZd[ Z1d\d] Z2d^d_ Z3d`da Z4drdbdcZ5ddde Z6e7rdsdfdgZ8dS )t	_NNTPBasezutf-8surrogateescapeNc             C   sj   || _ || _d| _| j | _d | _| j  d| _|rZd| jkrZ| j  | jsZd | _| j  d| _	d| _
d S )Nr   FREADER)hostfile	debugging_getrespwelcome_capsgetcapabilitiesreadermode_afterauth_setreadermodetls_onauthenticated)r   r^   r]   
readermodetimeoutr   r   r   r   8  s    
	z_NNTPBase.__init__c             C   s   | S )Nr   )r   r   r   r   	__enter__g  s    z_NNTPBase.__enter__c                sR    fdd}| rNz*y j   W n ttfk
r8   Y nX W d | rL j  X d S )Nc                  s
   t  dS )Nr^   )hasattrr   )r   r   r   <lambda>k  s    z$_NNTPBase.__exit__.<locals>.<lambda>)quitOSErrorEOFError_close)r   r   Zis_connectedr   )r   r   __exit__j  s    
z_NNTPBase.__exit__c             C   s   | j rtdt| j | jS )Nz	*welcome*)r_   printreprra   )r   r   r   r   
getwelcomeu  s     z_NNTPBase.getwelcomec             C   s   | j d krd| _d | _y| j \}}W n ttfk
rD   i | _ Y n<X || _ d|krhttt|d | _d|krdj	|d | _| j S )Nr0   VERSIONZIMPLEMENTATION )
rb   nntp_versionZnntp_implementationcapabilitiesr   r   maxmapr?   r+   )r   respcapsr   r   r   rc   ~  s    
z_NNTPBase.getcapabilitiesc             C   s
   || _ d S )N)r_   )r   levelr   r   r   set_debuglevel  s    z_NNTPBase.set_debuglevelc             C   s:   |t  }| jdkr tdt| | jj| | jj  d S )Nr0   z*put*)_CRLFr_   rr   rs   r^   writeflush)r   r8   r   r   r   _putline  s
    
 z_NNTPBase._putlinec             C   s2   | j rtdt| |j| j| j}| j| d S )Nz*cmd*)r_   rr   rs   encodeencodingerrorsr   )r   r8   r   r   r   _putcmd  s     z_NNTPBase._putcmdTc             C   s   | j jtd }t|tkr$td| jdkr<tdt| |sDt|r|dd  t	krf|d d }n|dd  t	kr|d d }|S )	Nr0   zline too longz*get*rH   rM   rM   r   )
r^   readline_MAXLINEr6   r
   r_   rr   rs   ro   r   )r   Z
strip_crlfr8   r   r   r   _getline  s    
 z_NNTPBase._getlinec             C   sl   | j  }| jrtdt| |j| j| j}|d d }|dkrHt||dkrXt||dkrht	||S )Nz*resp*r0   45Z123)
r   r_   rr   rs   r*   r   r   r   r   r	   )r   r{   cr   r   r   r`     s     z_NNTPBase._getrespc          
   C   s   d }zt |ttfr"t|d }}| j }|d d tkrBt|g }|d k	rdt df}xv| jd}||krpP |j	dr|dd  }|j
| q\W n<d}x6| j }||krP |j	dr|dd  }|j| qW W d |r|j  X ||fS )Nwb      .s   .
Fs   ..r0   )r(   strr   openr`   	_LONGRESPr   r   r   rA   r   r)   close)r   r^   Z
openedFiler{   r   Zterminatorsr8   
terminatorr   r   r   _getlongresp  s8    	



z_NNTPBase._getlongrespc             C   s   | j | | j S )N)r   r`   )r   r8   r   r   r   	_shortcmd  s    
z_NNTPBase._shortcmdc             C   s   | j | | j|S )N)r   r   )r   r8   r^   r   r   r   _longcmd  s    
z_NNTPBase._longcmdc                s.    j |  j|\}}| fdd|D fS )Nc                s   g | ]}|j  j jqS r   )r*   r   r   ).0r8   )r   r   r   
<listcomp>  s   z,_NNTPBase._longcmdstring.<locals>.<listcomp>)r   r   )r   r8   r^   r{   listr   )r   r   _longcmdstring  s    
z_NNTPBase._longcmdstringc             C   sb   y| j S  tk
r   Y nX y| jd\}}W n  tk
rN   td d  }Y n
X t|}|| _ |S )NzLIST OVERVIEW.FMT)Z_cachedoverviewfmtAttributeErrorr   r   r5   r<   )r   r{   r   r7   r   r   r   _getoverviewfmt  s    z_NNTPBase._getoverviewfmtc             C   s   dd |D S )Nc             S   s   g | ]}t |j  qS r   )r   r>   )r   r8   r   r   r   r   $  s    z(_NNTPBase._grouplist.<locals>.<listcomp>r   )r   r   r   r   r   
_grouplist"  s    z_NNTPBase._grouplistc             C   s<   i }| j d\}}x |D ]}|j ^}}|||< qW ||fS )NZCAPABILITIES)r   r>   )r   r|   r{   r   r8   r9   rB   r   r   r   rx   &  s    
z_NNTPBase.capabilities)r^   c            C   sb   t |tjtjfs$tdj|jjt|| jdk \}}dj||}| j	||\}}|| j
|fS )NzAthe date parameter must be a date or datetime object, not '{:40}'rH   zNEWGROUPS {0} {1})r(   rN   r   	TypeErrorrS   	__class__r   rU   rw   r   r   )r   r   r^   rO   rP   cmdr{   r   r   r   r   	newgroups4  s    z_NNTPBase.newgroupsc            C   sR   t |tjtjfs$tdj|jjt|| jdk \}}dj|||}| j	||S )NzAthe date parameter must be a date or datetime object, not '{:40}'rH   zNEWNEWS {0} {1} {2})
r(   rN   r   r   rS   r   r   rU   rw   r   )r   r   r   r^   rO   rP   r   r   r   r   newnewsD  s    z_NNTPBase.newnewsc            C   s4   |d k	rd| }nd}| j ||\}}|| j|fS )NzLIST ACTIVE ZLIST)r   r   )r   group_patternr^   commandr{   r   r   r   r   r   T  s
    
z_NNTPBase.listc             C   s   t jd}| jd| \}}|jds8| jd| \}}i }x>|D ]6}|j|j }|rB|jdd\}	}
|sp|
S |
||	< qBW |r||fS dS d S )Nz^(?P<group>[^ 	]+)[ 	]+(.*)$zLIST NEWSGROUPS r   zXGTITLE r0   rH   r&   )recompiler   rA   searchstripr   )r   r   Z
return_allline_patr{   r   groupsraw_linematchr9   Zdescr   r   r   _getdescriptionsc  s    


z_NNTPBase._getdescriptionsc             C   s   | j |dS )NF)r   )r   r   r   r   r   descriptionz  s    z_NNTPBase.descriptionc             C   s   | j |dS )NT)r   )r   r   r   r   r   descriptions  s    z_NNTPBase.descriptionsc             C   s   | j d| }|jds t||j }d } }}t|}|dkr|d }|dkr|d }|dkr|d }|dkr|d j }|t|t|t||fS )NzGROUP r   r   r0   rH   r   rI   )r   rA   r   r>   r6   r2   r?   )r   r9   r{   wordscountr!   r    nr   r   r   r     s    

z_NNTPBase.groupc            C   s   | j d|S )NZHELP)r   )r   r^   r   r   r   help  s    z_NNTPBase.helpc             C   s8   |j dst||j }t|d }|d }|||fS )NZ22r0   rH   )rA   r   r>   r?   )r   r{   r   art_numr$   r   r   r   
_statparse  s    
z_NNTPBase._statparsec             C   s   | j |}| j|S )N)r   r   )r   r8   r{   r   r   r   _statcmd  s    
z_NNTPBase._statcmdc             C   s"   |r| j dj|S | j dS d S )NzSTAT {0}ZSTAT)r   rS   )r   message_specr   r   r   stat  s    	z_NNTPBase.statc             C   s
   | j dS )NZNEXT)r   )r   r   r   r   next  s    z_NNTPBase.nextc             C   s
   | j dS )NZLAST)r   )r   r   r   r   r      s    z_NNTPBase.lastc             C   s0   | j ||\}}| j|\}}}|t|||fS )N)r   r   r#   )r   r8   r^   r{   r   r   r$   r   r   r   _artcmd  s    z_NNTPBase._artcmdc            C   s$   |d k	rdj |}nd}| j||S )NzHEAD {0}ZHEAD)rS   r   )r   r   r^   r   r   r   r   head  s    z_NNTPBase.headc            C   s$   |d k	rdj |}nd}| j||S )NzBODY {0}ZBODY)rS   r   )r   r   r^   r   r   r   r   body  s    z_NNTPBase.bodyc            C   s$   |d k	rdj |}nd}| j||S )NzARTICLE {0}ZARTICLE)rS   r   )r   r   r^   r   r   r   r   article  s    z_NNTPBase.articlec             C   s
   | j dS )NZSLAVE)r   )r   r   r   r   slave  s    z_NNTPBase.slavec               sD   t jd | jdj|||\}} fdd|fdd|D fS )Nz^([0-9]+) ?(.*)
?zXHDR {0} {1}c                s    j | }|r|jddS | S )Nr0   rH   )r   r   )r8   m)patr   r   remove_number  s    
z%_NNTPBase.xhdr.<locals>.remove_numberc                s   g | ]} |qS r   r   )r   r8   )r   r   r   r     s    z"_NNTPBase.xhdr.<locals>.<listcomp>)r   r   r   rS   )r   Zhdrr   r^   r{   r   r   )r   r   r   xhdr
  s    	
z_NNTPBase.xhdrc            C   s.   | j dj|||\}}| j }|t||fS )NzXOVER {0}-{1})r   rS   r   rF   )r   startendr^   r{   r   r7   r   r   r   xover  s    	
z_NNTPBase.xoverc      	      C   sx   d| j krdnd}t|ttfr>|\}}|dj||p6d7 }n|d k	rR|d | }| j||\}}| j }|t||fS )NZOVERZXOVERz {0}-{1}r&   rv   )rb   r(   tupler   rS   r   r   rF   )	r   r   r^   r   r   r   r{   r   r7   r   r   r   over(  s    z_NNTPBase.overc      	      C   sj   t jdtd tjd}| jd| |\}}g }x0|D ](}|j|j }|r6|j|j	dd q6W ||fS )NzFThe XGTITLE extension is not actively used, use descriptions() insteadrH   z^([^ 	]+)[ 	]+(.*)$zXGTITLE r0   )
warningswarnDeprecationWarningr   r   r   r   r   r)   r   )	r   r   r^   r   r{   Z	raw_linesr   r   r   r   r   r   xgtitleC  s    

z_NNTPBase.xgtitlec             C   sj   t jdtd | jdj|}|jds0t|y|j \}}W n tk
r\   t|Y n
X ||fS d S )Nz(The XPATH extension is not actively usedrH   z	XPATH {0}Z223)	r   r   r   r   rS   rA   r   r>   
ValueError)r   idr{   Zresp_numpathr   r   r   xpathU  s    
z_NNTPBase.xpathc             C   sb   | j d}|jdst||j }t|dkr8t||d }t|dkrTt||t|d fS )NZDATEZ111rH   r0      )r   rA   r   r>   r6   r
   rR   )r   r{   elemr   r   r   r   r   i  s    

z_NNTPBase.datec             C   s   | j |}|jdst|t|ttfr2|j }xB|D ]:}|jtsT|j	dt }|jdrfd| }| j
j| q8W | j
jd | j
j  | j S )N3s   
r   s   .
)r   rA   r   r(   r   	bytearray
splitlinesendswithr   rstripr^   r   r   r`   )r   r   fr{   r8   r   r   r   _postz  s    





z_NNTPBase._postc             C   s   | j d|S )NZPOST)r   )r   datar   r   r   post  s    z_NNTPBase.postc             C   s   | j dj||S )Nz	IHAVE {0})r   rS   )r   r$   r   r   r   r   ihave  s    z_NNTPBase.ihavec             C   s   | j j  | ` d S )N)r^   r   )r   r   r   r   rp     s    
z_NNTPBase._closec          
   C   s   z| j d}W d | j  X |S )NZQUIT)r   rp   )r   r{   r   r   r   rm     s    
z_NNTPBase.quitc             C   s   | j rtd| r"| r"tdy>|r^| r^dd l}|j }|j| j}|r^|d }|d }W n tk
rt   Y nX |s~d S | jd| }|jdr|st|n | jd| }|jdst	|d | _
| j  | jrd	| j
kr| j  d | _
| j  d S )
NzAlready logged in.z7At least one of `user` and `usenetrc` must be specifiedr   rH   zauthinfo user Z381zauthinfo pass Z281r\   )rg   r   netrcZauthenticatorsr]   rn   r   rA   r   r   rb   rc   rd   re   )r   userpasswordusenetrcr   ZcredentialsZauthr{   r   r   r   login  s<    



z_NNTPBase.loginc             C   s`   y| j d| _W nJ tk
r$   Y n8 tk
rZ } z|jjdrHd| _n W Y d d }~X nX d S )Nzmode readerZ480T)r   ra   r   r   r   rA   rd   )r   er   r   r   re     s    z_NNTPBase._setreadermodec             C   s|   | j rtd| jrtd| jd}|jdrp| jj  t| j|| j	| _| jj
d| _d| _ d | _| j  ntdd S )NzTLS is already enabled.z+TLS cannot be started after authentication.STARTTLSZ382rwbTzTLS failed to start.)rf   r   rg   r   rA   r^   r   rY   rW   r]   makefilerb   rc   r   )r   rX   r{   r   r   r   starttls  s    



z_NNTPBase.starttls)T)N)N)N)N)N)N)N)N)N)NNT)N)9r   r   r   r   r   r   r   rj   rq   rt   rc   r~   debugr   r   r   r`   r   r   r   r   r   r   rx   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r   r   r   r   r   r   r   r   r   r   r   r   r   rp   rm   r   re   	_have_sslr   r   r   r   r   rZ   (  sj   .	

.






		
)rZ   c               @   s*   e Zd ZeddddefddZdd ZdS )r   NFc       	      C   s   || _ || _tj||f|| _d }y8| jjd}tj| |||| |sJ|rX| j||| W n$   |rn|j	  | jj	   Y nX d S )Nr   )
r]   portsocketcreate_connectionrW   r   rZ   r   r   r   )	r   r]   r   r   r   rh   r   ri   r^   r   r   r   r     s    

zNNTP.__init__c          
   C   s    zt j|  W d | jj  X d S )N)rZ   rp   rW   r   )r   r   r   r   rp   !  s    zNNTP._close)r   r   r   	NNTP_PORTr   r   rp   r   r   r   r   r     s   "c               @   s,   e Zd ZedddddefddZdd ZdS )NNTP_SSLNFc	       
      C   s   t j||f|| _d }	yJt| j||| _| jjd}	tj| |	|||d |sP|r^| j||| W n$   |	rt|	j  | jj   Y nX d S )Nr   )rh   ri   )	r   r   rW   rY   r   rZ   r   r   r   )
r   r]   r   r   r   Zssl_contextrh   r   ri   r^   r   r   r   r   +  s    


zNNTP_SSL.__init__c          
   C   s    zt j|  W d | jj  X d S )N)rZ   rp   rW   r   )r   r   r   r   rp   A  s    zNNTP_SSL._close)r   r   r   NNTP_SSL_PORTr   r   rp   r   r   r   r   r   )  s
   r   __main__zJ        nntplib built-in demo - display the latest articles in a newsgroup)r   z-gz--groupzgmane.comp.python.generalz3group to fetch messages from (default: %(default)s))defaultr   z-sz--serverznews.gmane.orgz+NNTP server hostname (default: %(default)s)z-pz--portr0   z#NNTP port number (default: %s / %s))r   typer   z-nz--nb-articles
   z2number of articles to fetch (default: %(default)s)z-Sz--ssl
store_truezuse NNTP over SSL)actionr   r   )r]   r   r   ZGroupZhaszarticles, rangeZtoc             C   s$   t | |kr | d |d  d } | S )NrI   z...)r6   )sZlimr   r   r   cutl  s    r   <z{:7} {:20} {:42} ({})   *   )N)N)Fr   r   r   )Ir   r   collectionsrN   r   rV   ImportErrorr   Zemail.headerr   r'   r   __all__r   r   r   r   r   r   r	   r
   r   r   r   r5   r3   r   
namedtupler   r#   r<   rF   rR   rU   rY   rZ   r   r   r)   r   argparseArgumentParserparseradd_argumentr?   
parse_argsr   r   Zserverr   rc   r|   r   r   r{   r   r!   r    r9   rr   r   r   Znb_articlesr   Z	overviewsZartnumr   r>   Zauthorr   r   rS   rm   r   r   r   r   <module>B   s   
	


     X-






 