B
    18™\P¨  ã               @   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   úK/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/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ÚArticleInfoÚ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ú	r0   z: z?OVER/XOVER response doesn't include names of additional headers)	r7   r6   ÚsplitÚintÚ	enumerateÚ
startswithr3   r
   r*   )r   r8   Zdata_process_funcZ
n_defaultsZoverviewr9   ZfieldsZarticle_numberÚtokensÚiÚtokenÚ
field_nameZis_metadataÚhr   r   r   Ú_parse_overviewË   s&    

rI   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  )rA   Údatetime)Údate_strÚtime_strZhoursZminutesÚsecondsÚyearÚmonthÚdayr   r   r   Ú_parse_datetimeè   s    
rW   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}rO   z{0:02d}{1.month:02d}{1.day:02d}z{0:04d}{1.month:02d}{1.day:02d})r)   rP   ÚformatrT   )ÚdtZlegacyrR   ÚyrQ   r   r   r   Ú_unparse_datetimeþ   s    
r[   c             C   s   |d krt  ¡ }|j| |dS )N)Zserver_hostname)ÚsslZ_create_stdlib_contextZwrap_socket)ÚsockÚcontextÚhostnamer   r   r   Ú_encrypt_on  s    r`   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   re   rd   Ú
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 )Nre   )Ú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*)rf   ÚprintÚreprrh   )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 )Nr1   ZVERSIONZIMPLEMENTATIONú )
ri   Únntp_versionZnntp_implementationÚcapabilitiesr   r   ÚmaxÚmaprA   r,   )r   ÚrespÚcapsr   r   r   rj   ~  s    
z_NNTPBase.getcapabilitiesc             C   s
   || _ d S )N)rf   )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 )Nr1   z*put*)Ú_CRLFrf   rz   r{   re   ÚwriteÚflush)r   r9   r   r   r   Ú_putline  s
    
 z_NNTPBase._putlinec             C   s2   | j rtdt|ƒƒ | | j| j¡}|  |¡ d S )Nz*cmd*)rf   rz   r{   ÚencodeÚencodingÚerrorsr‰   )r   r9   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 )Nr1   zline too longz*get*rM   éÿÿÿÿ)
re   ÚreadlineÚ_MAXLINEr7   r
   rf   rz   r{   rw   r†   )r   Z
strip_crlfr9   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*r1   Ú4Ú5Z123)
r‘   rf   rz   r{   r+   r‹   rŒ   r   r   r	   )r   r‚   Úcr   r   r   rg   ½  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   ..r1   )r)   Ústrr   Úopenrg   Ú	_LONGRESPr   r†   r‘   rC   r‡   r*   Úclose)r   re   Z
openedFiler‚   r   Zterminatorsr9   Ú
terminatorr   r   r   Ú_getlongrespÍ  s8    	



z_NNTPBase._getlongrespc             C   s   |   |¡ |  ¡ S )N)r   rg   )r   r9   r   r   r   Ú	_shortcmdû  s    
z_NNTPBase._shortcmdc             C   s   |   |¡ |  |¡S )N)r   r   )r   r9   re   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Œ   )Ú.0r9   )r   r   r   ú
<listcomp>  s   z,_NNTPBase._longcmdstring.<locals>.<listcomp>)r   r   )r   r9   re   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   r6   r>   )r   r‚   r   r8   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    r9   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   r9   r:   rD   r   r   r   r   &  s    
z_NNTPBase.capabilities)re   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}'rJ   zNEWGROUPS {0} {1})r)   rP   r   Ú	TypeErrorrX   Ú	__class__r   r[   r~   r£   r¦   )r   r   re   rQ   rR   Ú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}'rJ   zNEWNEWS {0} {1} {2})
r)   rP   r   r§   rX   r¨   r   r[   r~   r£   )r   r   r   re   rQ   rR   r©   r   r   r   ÚnewnewsD  s    z_NNTPBase.newnewsc            C   s4   |d k	rd| }nd}|   ||¡\}}||  |¡fS )NzLIST ACTIVE ÚLIST)r£   r¦   )r   Úgroup_patternre   Ú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 r1   rJ   r'   )ÚreÚcompiler£   rC   ÚsearchÚstripr   )r   r­   Z
return_allÚline_patr‚   r   ÚgroupsÚraw_lineÚmatchr:   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   r1   rJ   r–   rK   )rž   rC   r   r@   r7   r3   rA   )r   r:   r‚   ÚwordsÚcountr!   r    Únr   r   r   r   ‹  s    

z_NNTPBase.groupc            C   s   |   d|¡S )NZHELP)r£   )r   re   r   r   r   Úhelp¥  s    z_NNTPBase.helpc             C   s8   |  d¡st|ƒ‚| ¡ }t|d ƒ}|d }|||fS )NZ22r1   rJ   )rC   r   r@   rA   )r   r‚   rº   Úart_numr%   r   r   r   Ú
_statparse¯  s    
z_NNTPBase._statparsec             C   s   |   |¡}|  |¡S )N)rž   r¿   )r   r9   r‚   r   r   r   Ú_statcmd¹  s    
z_NNTPBase._statcmdc             C   s"   |r|   d |¡¡S |   d¡S d S )NzSTAT {0}ZSTAT)rÀ   rX   )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   r9   re   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)rX   rÄ   )r   rÁ   re   r©   r   r   r   ÚheadÚ  s    z_NNTPBase.headc            C   s$   |d k	rd  |¡}nd}|  ||¡S )NzBODY {0}ZBODY)rX   rÄ   )r   rÁ   re   r©   r   r   r   Úbodyè  s    z_NNTPBase.bodyc            C   s$   |d k	rd  |¡}nd}|  ||¡S )NzARTICLE {0}ZARTICLE)rX   rÄ   )r   rÁ   re   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 )Nr1   rJ   )r¶   r   )r9   Úm)Úpatr   r   Úremove_number  s    
z%_NNTPBase.xhdr.<locals>.remove_numberc                s   g | ]}ˆ |ƒ‘qS r   r   )r    r9   )rË   r   r   r¡     s    z"_NNTPBase.xhdr.<locals>.<listcomp>)r¯   r°   r£   rX   )r   Zhdrr˜   re   r‚   r   r   )rÊ   rË   r   Úxhdr
  s    	
z_NNTPBase.xhdrc            C   s.   |   d ||¡|¡\}}|  ¡ }|t||ƒfS )NzXOVER {0}-{1})r£   rX   r¥   rI   )r   ÚstartÚendre   r‚   r   r8   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'   r}   )ri   r)   Útupler¢   rX   r£   r¥   rI   )	r   rÁ   re   r©   rÍ   rÎ   r‚   r   r8   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() insteadrJ   z^([^ 	]+)[ 	]+(.*)$zXGTITLE r1   )
ÚwarningsÚwarnÚDeprecationWarningr¯   r°   r£   r±   r²   r*   r   )	r   r   re   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 usedrJ   z	XPATH {0}Z223)	rÒ   rÓ   rÔ   rž   rX   rC   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111rJ   r1   é   )rž   rC   r   r@   r7   r
   rW   )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ž   rC   r   r)   r   Ú	bytearrayÚ
splitlinesÚendswithr†   Úrstripre   r‡   rˆ   rg   )r   r®   Úfr‚   r9   r   r   r   Ú_postz  s    





z_NNTPBase._postc             C   s   |   d|¡S )NÚPOST)râ   )r   Údatar   r   r   Úpost  s    z_NNTPBase.postc             C   s   |   d |¡|¡S )Nz	IHAVE {0})râ   rX   )r   r%   rä   r   r   r   Úihave–  s    z_NNTPBase.ihavec             C   s   | j  ¡  | ` d S )N)re   r›   )r   r   r   r   rx   Ÿ  s    
z_NNTPBase._closec             C   s   z|   d¡}W d |  ¡  X |S )NZQUIT)rž   rx   )r   r‚   r   r   r   ru   £  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   rJ   zauthinfo user Z381zauthinfo pass Z281rc   )rn   rÖ   ÚnetrcZauthenticatorsrd   rv   rž   rC   r   r   ri   rj   rk   rl   )r   ÚuserÚpasswordÚusenetrcrç   ÚcredentialsÚ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ž   rh   r   r   r   rC   rk   )r   Úer   r   r   rl   Õ  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.)rm   rÖ   rn   rž   rC   re   r›   r`   r]   rd   Úmakefileri   rj   r   )r   r^   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   rq   ry   r|   rj   r…   Údebugr‰   r   r‘   rg   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Ï   rÑ   rÕ   rÙ   r   râ   rå   ræ   rx   ru   rí   rl   Ú	_have_sslrò   r   r   r   r   ra   (  sj   .	

.






		
)ra   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ð   )
rd   ÚportÚsocketÚcreate_connectionr]   rñ   ra   r   rí   r›   )	r   rd   rõ   rè   ré   ro   rê   rp   re   r   r   r   r   ý  s    

zNNTP.__init__c             C   s    zt  | ¡ W d | j ¡  X d S )N)ra   rx   r]   r›   )r   r   r   r   rx   !  s    zNNTP._close)r   r   r   Ú	NNTP_PORTr   r   rx   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ð   )ro   rp   )	rö   r÷   r]   r`   rñ   ra   r   rí   r›   )
r   rd   rõ   rè   ré   Zssl_contextro   rê   rp   re   r   r   r   r   +  s    


zNNTP_SSL.__init__c             C   s    zt  | ¡ W d | j ¡  X d S )N)ra   rx   r]   r›   )r   r   r   r   rx   A  s    zNNTP_SSL._close)r   r   r   ÚNNTP_SSL_PORTr   r   rx   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½   )rd   rõ   rï   ZGroupZhaszarticles, rangeÚtoc             C   s$   t | ƒ|kr | d |d … d } | S )NrK   z...)r7   )ÚsZlimr   r   r   Úcutl  s    r  r1   ú<z{:7} {:20} {:42} ({})é   é*   )N)N)F)Ir¯   rö   ÚcollectionsrP   rÒ   r\   ÚImportErrorrô   Zemail.headerr   r(   r   Ú__all__r   r   r   r   r   r   r	   r
   rø   rú   rš   r6   r4   r†   Ú
namedtupler   r#   r>   rI   rW   r[   r`   ra   r   rù   r*   r   ÚargparseÚArgumentParserÚparserÚadd_argumentrA   Ú
parse_argsr   rõ   Zserverr  rj   rƒ   rò   r   r‚   r»   r!   r    r:   rz   r  r˜   Znb_articlesrÏ   Z	overviewsZartnumrÑ   r@   Zauthorr   r   rX   ru   r   r   r   r   Ú<module>B   sÆ   
	


     X-






 