509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
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�rˆd>d?„ Z"G d@dA„ dAƒZ#G dBd„ de#ƒZ$e�rÆG 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�s€e/dok�rpeZ/e$e.j0e/d_�Z1ne/dpk�rŽeZ/e%e.j0e/d_�Z1e1j2ƒ Z3d`e3k�r¶e1j4ƒ  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 rŠtdƒ‚|d t|ƒ… |kr¦t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|ƒ}x’t|ƒD ]†\}	}
|	t |ƒkrPq:||	 }|jdƒ}|	|kr´| r´|d }|
rœ|
d t |ƒ… jƒ |krœt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  iúÿÿÿiúÿÿÿéüÿÿÿrL   éþÿÿÿ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r€d| _d | _y| jƒ \}}W n ttfk
rD   i | _ Y n<X || _ d|krhttt|d ƒƒ| _d|kr€d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 }zÐt |ttfƒr"t|dƒ }}| jƒ }|d d… tkrBt|ƒ‚g }|d k	r–dt df}xv| jdƒ}||krpP |j	dƒr†|dd … }|j
|ƒ q\W n<d}x6| jƒ }||kr®P |j	dƒrÄ|dd … }|j|ƒ qœW 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Ä|s¤t|ƒ‚n | jd| ƒ}|jdƒsÄt	|ƒ‚d | _
| jƒ  | jrød	| 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-






 