B
    u9aP¨  ã               @   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 d,d-d.d/d0g¡Ze d1d2d3d4g¡Zd5d„ Z	d6d7„ Zdld8d9„Zdmd:d;„Z dnd<d=„Z!erˆd>d?„ Z"G d@dA„ dAƒZ#G dBd„ de#ƒZ$erÆG dCdD„ dDe#ƒZ%e &dD¡ e'dEkr|d dl(Z(e(j)dFdGZ*e*j+dHdIdJdKdL e*j+dMdNdOdPdL e*j+dQdRdSe,dTeef dU e*j+dVdWdXe,dYdU e*j+dZd[d\dd]d^ e* -¡ Z.e.j/Z/e.js€e/dSkrpeZ/e$e.j0e/d_Z1ne/dSkrŽeZ/e%e.j0e/d_Z1e1 2¡ Z3d`e3kr¶e1 4¡  e1 5e.j5¡\Z6Z7Z8Z9Z:e;dae:dbe7dce8dde9ƒ dedf„ Z<e=e,e9ƒe.j> dg ƒZ8e1 ?e8e9¡\Z6Z@xbe@D ]Z\ZAZBe	eBd$ ƒ Cdhdg¡d  ZDe	eBd# ƒZEe,eBd) ƒZFe;di GeAe<eDdjƒe<eEdkƒeF¡ƒ qW e1 H¡  dS )oé    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/lib/python3.7/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| | |p.d¡¡ q| |¡ qW d |¡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 …   d¡\}}}d| }n|  d¡\}}}| ¡ }t ||¡}| |¡ 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Ú_ÚsuffixÚdefaultsr   r   r   Ú_parse_overview_fmt²   s    

r=   c             C   sØ   t tƒ}g }xÆ| D ]¾}i }| d¡^}}t|ƒ}xt|ƒD ]„\}	}
|	t |ƒkrPq:||	 }| d¡}|	|kr²|s²|d }|
rš|
d t |ƒ…  ¡ |krštdƒ‚|
r®|
t |ƒd … nd }
|
|||	 < q:W | ||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&    

rG   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 ||||||¡S )
Niúÿÿÿé   é   éüÿÿÿéþÿÿÿéF   iÐ  éd   il  )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}|r<|d }d || ¡}nd || ¡}||fS )NZ000000z({0.hour:02d}{0.minute:02d}{0.second:02d}rM   z{0:02d}{1.month:02d}{1.day:02d}z{0:04d}{1.month:02d}{1.day:02d})r(   rN   ÚformatrQ   )ZdtÚlegacyrP   ÚyrO   r   r   r   Ú_unparse_datetimeþ   s    
rV   c             C   s   |d krt  ¡ }|j| |dS )N)Zserver_hostname)ÚsslZ_create_stdlib_contextZwrap_socket)ÚsockÚcontextZhostnamer   r   r   Ú_encrypt_on  s    rZ   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| _|  ¡ | _d | _|  ¡  d| _|rZd| jkrZ|  ¡  | jsZd | _|  ¡  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ˆ   ¡  W n ttfk
r8   Y nX W d |ƒ rLˆ  ¡  X d S )Nc                  s
   t ˆ dƒS )Nr_   )Úhasattrr   )r   r   r   Ú<lambda>k  ó    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Úreprrb   )r   r   r   r   Ú
getwelcomeu  s     z_NNTPBase.getwelcomec          	   C   s†   | j d kr€d| _d | _y|  ¡ \}}W n ttfk
rD   i | _ Y n<X || _ d|krhttt|d ƒƒ| _d|kr€d 	|d ¡| _| j S )Nr0   ZVERSIONZIMPLEMENTATIONú )
rc   Únntp_versionZnntp_implementationÚcapabilitiesr   r   ÚmaxÚmapr@   r+   )r   ÚrespÚcapsr   r   r   rd   ~  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 ¡  d S )Nr0   z*put*)Ú_CRLFr`   rt   ru   r_   ÚwriteÚflush)r   r8   r   r   r   Ú_putline  s
    
 z_NNTPBase._putlinec             C   s2   | j rtdt|ƒƒ | | j| j¡}|  |¡ d S )Nz*cmd*)r`   rt   ru   ÚencodeÚencodingÚerrorsrƒ   )r   r8   r   r   r   Ú_putcmd¥  s     z_NNTPBase._putcmdTc             C   s†   | 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*rK   éÿÿÿÿ)
r_   ÚreadlineÚ_MAXLINEr6   r
   r`   rt   ru   rq   r€   )r   Z
strip_crlfr8   r   r   r   Ú_getline¬  s    
 z_NNTPBase._getlinec             C   sl   |   ¡ }| jrtdt|ƒƒ | | j| j¡}|d d… }|dkrHt|ƒ‚|dkrXt|ƒ‚|dkrht	|ƒ‚|S )Nz*resp*r0   Ú4Ú5Z123)
r‹   r`   rt   ru   r*   r…   r†   r   r   r	   )r   r|   Úcr   r   r   ra   ½  s     z_NNTPBase._getrespc             C   sì   d }zÐt |ttfƒr"t|dƒ }}|  ¡ }|d d… tkrBt|ƒ‚g }|d k	r–dt df}xv|  d¡}||krpP | 	d¡r†|dd … }| 
|¡ q\W n<d}x6|  ¡ }||kr®P | 	d¡rÄ|dd … }| |¡ qœW W d |râ| ¡  X ||fS )NÚwbé   ó   .s   .
Fs   ..r0   )r(   Ústrr   Úopenra   Ú	_LONGRESPr   r€   r‹   rB   r   r)   Úclose)r   r_   Z
openedFiler|   r   Zterminatorsr8   Ú
terminatorr   r   r   Ú_getlongrespÍ  s8    	



z_NNTPBase._getlongrespc             C   s   |   |¡ |  ¡ S )N)r‡   ra   )r   r8   r   r   r   Ú	_shortcmdû  s    
z_NNTPBase._shortcmdc             C   s   |   |¡ |  |¡S )N)r‡   r—   )r   r8   r_   r   r   r   Ú_longcmd  s    
z_NNTPBase._longcmdc                s.   ˆ   |¡ ˆ  |¡\}}|‡ fdd„|D ƒfS )Nc                s   g | ]}|  ˆ 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|  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 | ¡ Ž ‘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 }|   d¡\}}x |D ]}| ¡ ^}}|||< qW ||fS )NZCAPABILITIES)r   r?   )r   r}   r|   r   r8   r9   rC   r   r   r   ry   &  s    
z_NNTPBase.capabilities)r_   c            C   sb   t |tjtjfƒs$td |jj¡ƒ‚t|| jdk ƒ\}}d ||¡}|  	||¡\}}||  
|¡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   rV   rx   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¡ƒ‚t|| jdk ƒ\}}d |||¡}|  	||¡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   rV   rx   r   )r   r   r   r_   rO   rP   r£   r   r   r   ÚnewnewsD  s    z_NNTPBase.newnewsc            C   s4   |d k	rd| }nd}|   ||¡\}}||  |¡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  d¡}|  d| ¡\}}| d¡s8|  d| ¡\}}i }x>|D ]6}| | ¡ ¡}|rB| 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   rB   Ú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   |   |d¡S )NF)r°   )r   r   r   r   r   Údescriptionz  s    z_NNTPBase.descriptionc             C   s   |   |d¡S )NT)r°   )r   r¦   r   r   r   Údescriptions‡  s    z_NNTPBase.descriptionsc             C   sš   |   d| ¡}| d¡s t|ƒ‚| ¡ }d } }}t|ƒ}|dkr€|d }|dkr€|d }|dkr€|d }|dkr€|d  ¡ }|t|ƒt|ƒt|ƒ|fS )NzGROUP r   r   r0   rH   r   rI   )r˜   rB   r   r?   r6   r2   r@   )r   r9   r|   ÚwordsÚcountr!   r    Únr   r   r   r   ‹  s    

z_NNTPBase.groupc            C   s   |   d|¡S )NZHELP)r   )r   r_   r   r   r   Úhelp¥  s    z_NNTPBase.helpc             C   s8   |  d¡st|ƒ‚| ¡ }t|d ƒ}|d }|||fS )NZ22r0   rH   )rB   r   r?   r@   )r   r|   r³   Úart_numr$   r   r   r   Ú
_statparse¯  s    
z_NNTPBase._statparsec             C   s   |   |¡}|  |¡S )N)r˜   r¸   )r   r8   r|   r   r   r   Ú_statcmd¹  s    
z_NNTPBase._statcmdc             C   s"   |r|   d |¡¡S |   d¡S d S )NzSTAT {0}ZSTAT)r¹   rS   )r   Úmessage_specr   r   r   Ústat¾  s    	z_NNTPBase.statc             C   s
   |   d¡S )NZNEXT)r¹   )r   r   r   r   ÚnextÌ  s    z_NNTPBase.nextc             C   s
   |   d¡S )NZLAST)r¹   )r   r   r   r   r    Ð  s    z_NNTPBase.lastc             C   s0   |   ||¡\}}|  |¡\}}}|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  |¡}nd}|  ||¡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  |¡}nd}|  ||¡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  |¡}nd}|  ||¡S )NzARTICLE {0}ZARTICLE)rS   r½   )r   rº   r_   r£   r   r   r   Úarticleö  s    z_NNTPBase.articlec             C   s
   |   d¡S )NZSLAVE)r˜   )r   r   r   r   Úslave  s    z_NNTPBase.slavec               sD   t  d¡‰ |  d ||¡|¡\}}‡ fdd„‰|‡fdd„|D ƒfS )Nz^([0-9]+) ?(.*)
?zXHDR {0} {1}c                s   ˆ   | ¡}|r| 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.   |   d ||¡|¡\}}|  ¡ }|t||ƒfS )NzXOVER {0}-{1})r   rS   rŸ   rG   )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 ||p6d¡7 }n|d k	rR|d | }|  ||¡\}}|  ¡ }|t||ƒfS )NZOVERZXOVERz {0}-{1}r&   rw   )rc   r(   Útuplerœ   rS   r   rŸ   rG   )	r   rº   r_   r£   rÆ   rÇ   r|   r   r7   r   r   r   Úover(  s    z_NNTPBase.overc      	      C   sj   t  dtd¡ t d¡}|  d| |¡\}}g }x0|D ](}| | ¡ ¡}|r6| | 	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   sl   t  dtd¡ |  d |¡¡}| d¡s0t|ƒ‚y| ¡ \}}W n tk
r^   t|ƒd ‚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   rB   r   r?   Ú
ValueError)r   Úidr|   Zresp_numÚpathr   r   r   ÚxpathU  s    
z_NNTPBase.xpathc             C   sb   |   d¡}| d¡st|ƒ‚| ¡ }t|ƒdkr8t|ƒ‚|d }t|ƒdkrTt|ƒ‚|t|d ƒfS )NZDATEZ111rH   r0   é   )r˜   rB   r   r?   r6   r
   rR   )r   r|   Úelemr   r   r   r   r   i  s    

z_NNTPBase.datec             C   s”   |   |¡}| d¡st|ƒ‚t|ttfƒr2| ¡ }xB|D ]:}| t¡sT| 	d¡t }| d¡rfd| }| j
 |¡ q8W | j
 d¡ | j
 ¡  |  ¡ S )NÚ3s   
r‘   s   .
)r˜   rB   r   r(   r   Ú	bytearrayÚ
splitlinesÚendswithr€   Úrstripr_   r   r‚   ra   )r   r§   Úfr|   r8   r   r   r   Ú_postz  s    





z_NNTPBase._postc             C   s   |   d|¡S )NZPOST)rÛ   )r   Údatar   r   r   Úpost  s    z_NNTPBase.postc             C   s   |   d |¡|¡S )Nz	IHAVE {0})rÛ   rS   )r   r$   rÜ   r   r   r   Úihave–  s    z_NNTPBase.ihavec             C   s   | j  ¡  | ` d S )N)r_   r•   )r   r   r   r   rr   Ÿ  s    
z_NNTPBase._closec             C   s   z|   d¡}W d |  ¡  X |S )NZQUIT)r˜   rr   )r   r|   r   r   r   ro   £  s    
z_NNTPBase.quitc             C   sö   | j rtdƒ‚|s|stdƒ‚y<|rX|sXdd l}| ¡ }| | j¡}|rX|d }|d }W n tk
rn   Y nX |sxd S |  d| ¡}| d¡r¾|sžt|ƒ‚n |  d| ¡}| d¡s¾t	|ƒ‚d | _
|  ¡  | jròd	| j
krò|  ¡  d | _
|  ¡  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]   )rh   rÏ   ÚnetrcZauthenticatorsr^   rp   r˜   rB   r   r   rc   rd   re   rf   )r   ÚuserÚpasswordÚusenetrcrß   ZcredentialsZauthr|   r   r   r   Úlogin¬  s<    


z_NNTPBase.loginc          
   C   s`   y|   d¡| _W nJ tk
r$   Y n8 tk
rZ } z|j d¡rHd| _n‚ W d d }~X Y nX d S )Nzmode readerZ480T)r˜   rb   r   r   r   rB   re   )r   Úer   r   r   rf   Õ  s    z_NNTPBase._setreadermodec             C   s|   | j rtdƒ‚| jrtdƒ‚|  d¡}| d¡rp| j ¡  t| j|| j	ƒ| _| j 
d¡| _d| _ d | _|  ¡  ntdƒ‚d S )NzTLS is already enabled.z+TLS cannot be started after authentication.ÚSTARTTLSZ382ÚrwbTzTLS failed to start.)rg   rÏ   rh   r˜   rB   r_   r•   rZ   rX   r^   Úmakefilerc   rd   r   )r   rY   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   rk   rs   rv   rd   r   Údebugrƒ   r‡   r‹   ra   r—   r˜   r™   r   rŸ   r    ry   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Þ   rr   ro   rã   rf   Ú	_have_sslrè   r   r   r   r   r[   (  sj   .	

.






		
)r[   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 ||f|¡| _d }y8| j d¡}t | ||||¡ |sJ|rX|  |||¡ W n$   |rn| 	¡  | j 	¡  ‚ Y nX d S )Nræ   )
r^   ÚportÚsocketÚcreate_connectionrX   rç   r[   r   rã   r•   )	r   r^   rë   rà   rá   ri   râ   rj   r_   r   r   r   r   ý  s    

zNNTP.__init__c             C   s    zt  | ¡ W d | j ¡  X d S )N)r[   rr   rX   r•   )r   r   r   r   rr   !  s    zNNTP._close)r   r   r   Ú	NNTP_PORTr   r   rr   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  ||f|¡| _d }	yJt| j||ƒ| _| j d¡}	tj| |	|||d |sP|r^|  |||¡ W n$   |	rt|	 ¡  | j ¡  ‚ Y nX d S )Nræ   )ri   rj   )	rì   rí   rX   rZ   rç   r[   r   rã   r•   )
r   r^   rë   rà   rá   Zssl_contextri   râ   rj   r_   r   r   r   r   +  s    


zNNTP_SSL.__init__c             C   s    zt  | ¡ W d | j ¡  X d S )N)r[   rr   rX   r•   )r   r   r   r   rr   A  s    zNNTP_SSL._close)r   r   r   ÚNNTP_SSL_PORTr   r   rr   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--portrˆ   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, rangeÚtoc             C   s$   t | ƒ|kr | d |d … d } | S )NrI   z...)r6   )ÚsZlimr   r   r   Úcutl  s    rù   r0   ú<z{:7} {:20} {:42} ({})é   é*   )N)N)F)Ir¨   rì   ÚcollectionsrN   rË   rW   ÚImportErrorrê   Zemail.headerr   r'   r   Ú__all__rŠ   r   r   r   r   r   r	   r
   rî   rð   r”   r5   r3   r€   Ú
namedtupler   r#   r=   rG   rR   rV   rZ   r[   r   rï   r)   r   ÚargparseÚArgumentParserÚparserÚadd_argumentr@   Ú
parse_argsr   rë   Zserverrø   rd   r}   rè   r   r|   r´   r!   r    r9   rt   rù   r’   Znb_articlesrÈ   Z	overviewsZartnumrÊ   r?   Zauthorr   r   rS   ro   r   r   r   r   Ú<module>B   sÆ   
	


     X-






 