
    daf                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZ d dlmZmZ  ej                   d      Zd dlmZmZ d dlmZ 	 d dlZej0                  j3                  ej0                  j5                  e      dd      Zeej:                  Zn G d	 d
e      Z G d d      ZejA                          e!fZ"ee"ejF                  fz  Z" G d deejH                        Z% ejL                  ed       G d de%             Z' G d de jP                        Z)d Z* G d dej$                        Z+ G d d      Z, G d de,      Z- G d d      Z. G d de.      Z/ G d d e/      Z0 G d! d"e/      Z1 G d# d$      Z2 G d% d&e2e,ejH                        Z3 G d' d(e2e,ejH                        Z4 G d) d*e,ejH                        Z5 G d+ d,e-ejH                        Z6 G d- d.ejH                        Z7 G d/ d0ejH                        Z8 G d1 d2ejH                        Z9 G d3 d4      Z: ejL                  ed       G d5 d6e9             Z; G d7 d8ejH                        Z<e=d9k(  r ej|                          yy# e$ r dZY (w xY w):    N)support)socket_helperwarnings_helpernntplib)NNTP	GroupInfo)patchcertdatazkeycert3.pemc                       e Zd ZdZdZy)SSLErrorz6Non-existent exception class when we lack SSL support.zThis will never be raised.N)__name__
__module____qualname____doc__reason     ,/root/Python-3.12.4/Lib/test/test_nntplib.pyr   r      s
    D-r   r   c                       e 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 Z ej"                  dd      d        Zd ZddZ ej"                  dd      d        Zd Zd Zd Zed        Zd Zd Zy)NetworkedNNTPTestsMixinNc                 v    | j                   j                         }| j                  t        t	        |             y N)server
getwelcomeassertEqualstrtype)selfwelcomes     r   test_welcomez$NetworkedNNTPTestsMixin.test_welcome*   s(    ++((*d7m,r   c                     | j                   j                         \  }}| j                  |j                  d      |       |D ]!  }| j	                  t
        t        |             # y )Nz100 )r   help
assertTrue
startswithr   r   r   )r   resplineslines       r   	test_helpz!NetworkedNNTPTestsMixin.test_help.   sR    kk&&(e/6 	.DS$t*-	.r   c                     | j                   j                         \  }}t        |      dkD  rO| j                  t        t        |d                | j                  t        t        |d   j                               y y Nr   )r   listlenr   r   r   r   groupr   r%   groupss      r   	test_listz!NetworkedNNTPTestsMixin.test_list4   s]    {{'')fv;?YVAY8S$vay"78 r   c                    | j                   j                  | j                        \  }}t        |      dkD  rO| j	                  t
        t        |d                | j	                  t        t        |d   j                               y y r*   )	r   r+   	GROUP_PATr,   r   r   r   r   r-   r.   s      r   test_list_activez(NetworkedNNTPTestsMixin.test_list_active:   sc    {{''7fv;?YVAY8S$vay"78 r   c                    | j                  t        j                        5 }| j                  j	                  d       d d d        j
                  j                  }| j                  |j                  d      |       y # 1 sw Y   AxY w)NXYZZYz500 )	assertRaisesr   NNTPPermanentErrorr   	_shortcmd	exceptionresponser#   r$   )r   cmr%   s      r   test_unknown_commandz,NetworkedNNTPTestsMixin.test_unknown_command@   se    w99: 	+bKK!!'*	+||$$/6	+ 	+s   A<<Bc                 @   t         j                  j                         t        j                  d      z
  }| j                  j                  |      \  }}t        |      dkD  r=| j                  |d   t               | j                  |d   j                  t               y y )N   )daysr   )datetimedatetoday	timedeltar   	newgroupsr,   assertIsInstancer   r-   r   )r   dtr%   r/   s       r   test_newgroupsz&NetworkedNNTPTestsMixin.test_newgroupsF   sz     ]]  "X%7%7Q%??{{,,R0fv;?!!&)Y7!!&)//37 r   c                 V     fd} j                   j                   j                        } ||        j                   j                  |        j                   j                   j
                        } ||        j                   j                  d      } j                  |d       y )Nc                 j    j                  | t               j                  j                  |        y r   )rE   r   assertNotIn
GROUP_NAME)descr   s    r   _check_descz=NetworkedNNTPTestsMixin.test_description.<locals>._check_descP   s'    !!$,T__d3r   zzk.brrtt.baz )r   descriptionrK   assertInDESCr2   r   )r   rM   rL   s   `  r   test_descriptionz(NetworkedNNTPTestsMixin.test_descriptionO   s    	4 {{&&t7Ddii&{{&&t~~6D{{&&~6r"r   c                 p   | j                   j                  | j                        \  }}| j                  |j	                  d      xs |j	                  d      |       | j                  |t               || j                     }| j                  || j                   j                  | j                               y )Nz215 z282 )
r   descriptionsr2   r#   r$   rE   dictrK   r   rO   )r   r%   descsrL   s       r   test_descriptionsz)NetworkedNNTPTestsMixin.test_descriptions_   s    kk..t~~>eOOF#>tv'>	FeT*T__%t{{66tGHr   c                    | j                   j                  | j                        }| j                  dt	        |             |\  }}}}}| j                  || j                         | j                  |t               | j                  |t               | j                  |t               | j                  ||       | j                  |j                  d      |       y )N   211 )
r   r-   rK   r   r,   rE   intassertLessEqualr#   r$   )r   resultr%   countfirstlastr-   s          r   
test_groupz"NetworkedNNTPTestsMixin.test_grouph   s    ""4??3CK(*0'eUD%0eS)eS)dC(UD)/6r   c                     | j                   j                         \  }}| j                  |t        j                         | j	                  |j
                  d       | j                  |j
                  d       y )Ni  i  )r   rA   rE   r@   assertGreaterEqualyearr\   r   r%   rA   s      r   	test_datez!NetworkedNNTPTestsMixin.test_dates   sV    [[%%'
ddH$5$56		40TYY-r   c                     | j                  |t               | j                  |j                         h d       |j	                         D ]#  }| j                  |t
        t        d       f       % y )N>   rA   fromsubject
references:bytes:lines
message-id)rE   rU   rc   keysvaluesr   r   )r   art_dictvs      r   _check_art_dictz'NetworkedNNTPTestsMixin._check_art_dictz   s^    h-/	 " 	8A!!!c4:%67	8r   c                 \   | j                   j                  | j                        \  }}}}}| j                   j                  |dz
  |      \  }}t	        |      dk(  r| j                  d       |d   \  }}| j                  ||dz
         | j                  ||       | j                  |       y )NrY   r   zno articles retrieved)	r   r-   rK   xoverr,   skipTestrc   r\   rr   )	r   r%   r^   r_   r`   namer&   art_numrp   s	            r   
test_xoverz"NetworkedNNTPTestsMixin.test_xover   s    )-):):4??)K&eUD$kk''q$7eu:?MM12!!H2Wd+X&r   TzHtemporarily skipped until a permanent solution is found for issue #28971c                    | j                   j                  | j                        \  }}}}}|dz
  }| j                   j                  |d f      \  }}|d   \  }}	| j	                  |	       | j                   j                  ||f      \  }}|d   \  }}	| j                  ||       | j                  ||       | j	                  |	       y )N
   r   )r   r-   rK   overrr   rc   r\   )
r   r%   r^   r_   r`   rv   startr&   rw   rp   s
             r   	test_overz!NetworkedNNTPTestsMixin.test_over   s     *.):):4??)K&eUD$r	kk&&t}5e!!HX&kk&&t}5e!"I/Wd+X&r   c                     | j                   j                  | j                        \  }}}}}| j                   j                  d|      \  }}|D ]$  }| j	                  t
        t        |d                & y )Nri      )r   r-   rK   xhdrr   r   r   )r   r%   r^   r_   r`   rv   r&   r'   s           r   	test_xhdrz!NetworkedNNTPTestsMixin.test_xhdr   sf    )-):):4??)K&eUD$kk&&y$7e 	1DS$tAw-0	1r   c                    | j                  |t        j                         || j                  |j                  |       |j
                  D ]  }| j                  |t                | j                  |j
                  d   d       y )Nr{   )   .s   .
   .
)rE   r   ArticleInfor   numberr&   bytesrJ   )r   r%   articlerw   r'   s        r   check_article_respz*NetworkedNNTPTestsMixin.check_article_resp   sq    gw':':;W^^W5MM 	/D!!$.	/ 	r*,DEr   zFIXME: see bpo-32128c                    | j                   j                  | j                        \  }}}}}|||dz
  fD ]"  }	 | j                   j                  |      \  }} n | j                  d       | j                  |j                  d      |       | j                  |       | j                   j                  |      \  }}	| j                  |j                  d      |       | j                  ||	|       | j                   j                  |      \  }}
| j                  |j                  d      |       | j                  ||
|       d }|j                  D cg c]  } ||      s| }}|
j                  D cg c]  } ||      s| }}| j                  ||dgz   |	j                  z          y # t        j
                  $ r'}|j                  j                  d      s Y d }~d }~ww xY wc c}w c c}w )	Nr   z423 z(could not find a suitable article numberz221 z222 z220 c                 $    | j                  d      S )Ns   X-Antivirus)r$   )r'   s    r   <lambda>z@NetworkedNNTPTestsMixin.test_article_head_body.<locals>.<lambda>   s     ? r   r   )r   r-   rK   headr   NNTPTemporaryErrorr:   r$   ru   r#   r   bodyr   r&   r   )r   r%   r^   r_   r`   rv   rw   r   er   r   denylistr'   filtered_head_linesfiltered_liness                  r   test_article_head_bodyz.NetworkedNNTPTestsMixin.test_article_head_body   s   )-):):4??)K&eUD$eTAX. 
	FG![[--g6
d 
	F MMDE/6dG4[[%%g.
d/6dG4++G4g/6gw7?04

 6&.tn  $ 6 6+2== 14!)$  1 1)<u)Dtzz)QR- -- zz,,V4	$61s#   F+G(4G-+G%>G  G%c                       fd} j                   j                  j                  d        | j                  j                                 j                  j	                         \  }} ||       y )Nc                 l    | d   }j                  |t        t        f       j                  d|       y )NLISTOVERVIEW.FMT)rE   r+   tuplerP   )caps	caps_listr   s     r   _check_capsz>NetworkedNNTPTestsMixin.test_capabilities.<locals>._check_caps   s.    VI!!)dE];MM.)4r      )rc   r   nntp_versiongetcapabilitiescapabilities)r   r   r%   r   s   `   r   test_capabilitiesz)NetworkedNNTPTestsMixin.test_capabilities   sW    	5 	 8 8!<DKK//12[[--/
dDr   c                 |    d}d}| j                  t        j                  | j                  j                  ||d       y )NnotarealusernotarealpasswordF)userpasswordusenetrc)r6   r   	NNTPErrorr   login)r   baduserbadpws      r   test_zloginz#NetworkedNNTPTestsMixin.test_zlogin   s=     !"'++T[[->->& 	 	Hr   c                 v    t        |       }	 | j                  j                          d |_        y # d |_        w xY wr   )r   r   quit)r   clss     r   test_zzquitz#NetworkedNNTPTestsMixin.test_zzquit   s/    4j	KKCJCJs   / 	8c                     d }t        |       D ]?  }|j                  d      st        | |      }t        |      s-t	        | | ||             A y )Nc                 B     t        j                          fd       }|S )Nc                 ~    t        j                  | j                        5   |        d d d        y # 1 sw Y   y xY wr   )r   transient_internet	NNTP_HOST)r   meths    r   wrappedzHNetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_meth.<locals>.wrapped   s1    "55dnnE J  s   	3<)	functoolswraps)r   r   s   ` r   	wrap_methz7NetworkedNNTPTestsMixin.wrap_methods.<locals>.wrap_meth   s%    __T" # Nr   test_)dirr$   getattrcallablesetattr)r   r   rv   r   s       r   wrap_methodsz$NetworkedNNTPTestsMixin.wrap_methods   sS    	 H 	0D??7+3%DD> Cy/	0r   c                     | j                  t              5  | j                  | j                  dd       d d d        y # 1 sw Y   y xY w)Nr   Ftimeoutr   )r6   
ValueError
NNTP_CLASSr   r   s    r   test_timeoutz$NetworkedNNTPTestsMixin.test_timeout  s?    z* 	GOODNNAOF	G 	G 	Gs	   >Ac                    fd}t        t        j                  d      }| j                  | j                  |d<   	  | j                  | j
                  fi |5  | j                   |              | j                  j                                d d d        | j                   |               | j                  | j
                  fi |5  j                          d d d        | j                   |              y # 1 sw Y   nxY w# 1 sw Y   ,xY w# t        $ rK}t        j                  d|j                        r%t        j                  d| d| j
                         d }~ww xY w)Nc                  l    t         d      sy	  j                          y# t        t        f$ r Y yw xY w)NfileFT)hasattrr"   OSErrorEOFError)r   s   r   is_connectedzANetworkedNNTPTestsMixin.test_with_statement.<locals>.is_connected  s<    66*  X& s   ! 33Fr   ssl_context(?i)KEY.TOO.SMALLzGot  connecting to )rU   r   INTERNET_TIMEOUTr   r   r   r#   r"   assertFalser   r   researchr   unittestSkipTest)r   r   kwargsssl_errr   s       @r   test_with_statementz+NetworkedNNTPTestsMixin.test_with_statement  sG   	 ,,
 '$($4$4F=!	$T__T^^>v>F //./ \^,$T__T^^>v>F \^,/ /   	yy-w~~>''$wi 8..2nn-?)A B B	sH   D 6D =D D!D  D	D DD 	E,!AE''E,r   )r   r   r   r   r    r(   r0   r3   r<   rG   rR   rW   ra   rf   rr   rx   r   skipIfr~   r   r   r   r   r   r   classmethodr   r   r   r   r   r   r   r   &   s    K-.9978# I	7.	8	' X__T 8 9'9'"1F X__T12S 3S<H 0 0&G!r   r   c                   @    e Zd ZdZdZdZdZeZe	d        Z
e	d        Zy)NetworkedNNTPTestsznews.trigofacile.comfr.comp.lang.pythonzfr.comp.lang.*Pythonc           	      ~   t        j                  d       t        t         j                  d      }| j                  | j                  |d<   t        j                  | j                        5  	  | j                  | j                  fi || _	        	 d d d        y # t        $ rb}t        j                  d|j                        r't        j                  |  d| d| j                        t!        | j                          d }~wt"        $ r% t        j                  |  d| j                        w xY w# 1 sw Y   y xY w)	NnetworkFr   r   r   z got r   z  got EOF error on connecting to )r   requiresrU   r   r   r   r   r   r   r   r   r   r   r   r   r   print
EOF_ERRORS)r   r   r   s      r   
setUpClasszNetworkedNNTPTests.setUpClassA  s3   #,,
 ??&$'OOF=!--cmm< 	AA+S^^CMMDVD
	A 	A  9917>>B"++se5	 B225--1B-D E Ecmm$ A''3% 0..1mm->)@ A AA	A 	As+   +D3-"B	D0"AC??1D00D33D<c                 R    | j                   | j                   j                          y y r   )r   r   )r   s    r   tearDownClassz NetworkedNNTPTests.tearDownClassX  s    ::!JJOO "r   N)r   r   r   r   rK   r2   rQ   r   r   r   r   r   r   r   r   r   r   8  sC    &I&J IDJA A,  r   r   requires SSL supportc                       e Zd ZdZdZdZdZ eedd      Z	dZ
dZe> ej                         Zej                  d       ej                   j"                  e_        yy)NetworkedNNTP_SSLTestsznntp.aioe.orgz	aioe.testzaioe.*testNNTP_SSLNDEFAULT)r   r   r   r   rK   r2   rQ   r   r   r   r0   test_starttlsssl_create_unverified_contextr   set_ciphers
TLSVersionTLSv1_2maximum_versionr   r   r   r   r   ]  sp      I JID*d3J I M
4c446	*&)nn&<&<# r   r   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	_NNTPServerIOzA raw IO object allowing NNTP commands to be received and processed
    by a handler.  The handler can push responses which can then be read
    from the IO object.c                 (   t         j                  j                  |        t        j                         | _        t        j                         | _        || _        | j                  j                  | j                  j                  | j                         y r   )
io	RawIOBase__init__BytesIOc2ss2chandlerr}   readline	push_data)r   r   s     r   r   z_NNTPServerIO.__init__  sW    
d#::<::<488,,dnn=r   c                      yNTr   r   s    r   readablez_NNTPServerIO.readable      r   c                      yr  r   r   s    r   writablez_NNTPServerIO.writable  r  r   c                     | j                   j                         }| j                   j                  dd       | j                   j                  |       | j                   j                  |       y)z.Push (buffer) some data to send to the client.r   r   N)r   tellseekwrite)r   dataposs      r   r  z_NNTPServerIO.push_data  sC    hhmmoatcr   c                     | j                   j                         }| j                   j                  |       | j                   j                  |       | j                  j                          t        |      S )zThe client sends us some data)r   r
  r  r  r   process_pendingr,   )r   br  s      r   r  z_NNTPServerIO.write  sJ    hhmmoqc$$&1vr   c                     | j                   j                          | j                  j                  t	        |            }t	        |      }||d| |S )z#The client wants to read a responseN)r   r  r   readr,   )r   bufr  ns       r   readintoz_NNTPServerIO.readinto  sA    $$&HHMM#c(#FBQr   N)
r   r   r   r   r   r  r  r  r  r  r   r   r   r   r   |  s%    >r   r   c                 L    t        |       }t        j                  ||      }||fS r   )r   r   BufferedRWPair)r   sior   s      r   make_mock_filer    s*    

 C S#&D;r   c                       e Zd ZddZd Zy)
NNTPServerNc                 B    || _         || _        | j                  |       y r   )r   host
_base_init)r   fr  
readermodes       r   r   zNNTPServer.__init__  s    		
#r   c                 <    | j                   j                          | ` y r   )r   closer   s    r   _closezNNTPServer._close  s    		Ir   r   )r   r   r   r   r$  r   r   r   r  r    s    $
r   r  c                   2     e Zd ZdZ fdZ fdZd Z xZS )MockedNNTPTestsMixinNc                 B    t         |           | j                          y r   supersetUpmake_serverr   	__class__s    r   r*  zMockedNNTPTestsMixin.setUp  s    r   c                 &    t         |           | `y r   )r)  tearDownr   r,  s    r   r/  zMockedNNTPTestsMixin.tearDown  s    Kr   c                     | j                         | _        t        | j                        \  | _        }t	        |dg|i || _        | j
                  S )Nztest.server)handler_classr   r  r  r  r   )r   argsr   r   s       r   r+  z MockedNNTPTestsMixin.make_server  sH    ))+'5$ }FtFvF{{r   )r   r   r   r1  r*  r/  r+  __classcell__r-  s   @r   r&  r&    s    Mr   r&  c                        e Zd Z fdZ xZS )MockedNNTPWithReaderModeMixinc                 F    t         |           | j                  d       y )NT)r!  r(  r,  s    r   r*  z#MockedNNTPWithReaderModeMixin.setUp  s    D)r   )r   r   r   r*  r3  r4  s   @r   r6  r6    s    * *r   r6  c                       e 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 Zd Zd dZd Zd Zd!dZd Zd ZdddZdddZdZdZedz   ez   Zd dZd dZd dZd Zy)"NNTPv1HandlerzA handler for RFC 977z200 NNTP mock serverc                 x    d| _         d| _        || _        || _        d| _        d| _        | j                          y )NFT)in_bodyallow_posting	_readline
_push_data
_logged_in
_user_senthandle_welcome)r   r  r  s      r   r}   zNNTPv1Handler.start  s9    !!#r   c                     t        |dd      S )Nutf-8surrogateescape)r   r   r  s     r   _decodezNNTPv1Handler._decode  s    4"344r   c                    | j                   rm	 | j                         }|sy | j                  j                  |       |dk(  rn5	 | j                  \  }} ||d| j                  i d | _        d | _        d| _         	 | j                  | j                               }|sy |j                  d      st        dj                  |            |d d }|j                         ^}}t        | d|j                         z   d       }|| j                          n#	  ||  | j                   r||f| _        g | _        	 # d | _        d | _        d| _         w xY w# t        $ r }t        dj                  |            |d }~ww xY w)	Nr   r   F
z line doesn't end with \r\n: {!r}handle_zcommand failed: {!r})r;  r=  r   appendbody_callbackrF  endswithr   formatsplitr   upperhandle_unknown	Exception)r   r'   r   tokenscmdr   s         r   r  zNNTPv1Handler.process_pending  ss   <<~~'		  &8# %#11ff-499-%)" 	$<< 01D==( !E!L!LT!RSS9D::<LC&4SYY[!8$?D|##%'&M ||-16\*$&	)  &*" 	$  ! Q$%;%B%B4%HIqPQs$   !D4 E 4E	E7E22E7c                     d| _         y)z7Flag that the client is expected to post a request bodyTN)r;  r   s    r   expect_bodyzNNTPv1Handler.expect_body  s	    r   c                 &    | j                  |       y)zPush some binary dataN)r>  rE  s     r   r  zNNTPv1Handler.push_data  s    r   c                     t        j                  |      }dj                  |j                               dz   }|j	                  d      }| j                  |       y)zPush a string literalrH  rC  N)textwrapdedentjoin
splitlinesencoder  )r   lits     r   push_litzNNTPv1Handler.push_lit  sD    ooc"kk#..*+f4jj!sr   c                 &    | j                  d       y )Nz	500 What?r_  r   s    r   rQ  zNNTPv1Handler.handle_unknown  s    k"r   c                 :    | j                  | j                         y r   )r_  r   r   s    r   rA  zNNTPv1Handler.handle_welcome  s    dll#r   c                 &    | j                  d       y Nz205 Bye!ra  r   s    r   handle_QUITzNNTPv1Handler.handle_QUIT"  s    j!r   c                 &    | j                  d       y )N111 20100914001155ra  r   s    r   handle_DATEzNNTPv1Handler.handle_DATE%  s    *+r   c                 r    |dk(  r| j                  d       y | j                  dj                  |             y )Nr   z$211 486 761 1265 fr.comp.lang.pythonz411 No such group {})r_  rN  )r   r-   s     r   handle_GROUPzNNTPv1Handler.handle_GROUP(  s0    ))MM@AMM077>?r   c                 &    | j                  d       y )Nz            100 Legal commands
              authinfo user Name|pass Password|generic <prog> <args>
              date
              help
            Report problems to <root@example.org>
            .ra  r   s    r   handle_HELPzNNTPv1Handler.handle_HELP.  s      	r   Nc                     || j                  d       y |dk(  r| j                  d       y |dk(  r| j                  d       y | j                  d       y )N412 No newsgroup selected3000234"223 3000234 <45223423@example.com><45223423@example.com>223 0 <45223423@example.com>430 No Such Article Foundra  r   message_specs     r   handle_STATzNNTPv1Handler.handle_STAT7  sM    MM56Y&MM>?55MM89MM56r   c                 &    | j                  d       y )N*223 3000237 <668929@example.org> retrievedra  r   s    r   handle_NEXTzNNTPv1Handler.handle_NEXTA  s    BCr   c                 &    | j                  d       y )N,223 3000234 <45223423@example.com> retrievedra  r   s    r   handle_LASTzNNTPv1Handler.handle_LASTD  s    DEr   c                 j   || j                  d       y |dk(  r)|dk(  r| j                  d       y | j                  d       y |dk(  r| j                  d       y |dk(  rD|J |d	k(  r| j                  d
       y |dk(  r| j                  d       y | j                  d       y | j                  d       y )Na                  215 Newsgroups in form "group high low flags".
                comp.lang.python 0000052340 0000002828 y
                comp.lang.python.announce 0000001153 0000000993 m
                free.it.comp.lang.python 0000000002 0000000002 y
                fr.comp.lang.python 0000001254 0000000760 y
                free.it.comp.lang.python.learner 0000000000 0000000001 y
                tw.bbs.comp.lang.python 0000000304 0000000304 y
                .ACTIVE*distutils*z                    215 Newsgroups in form "group high low flags"
                    gmane.comp.python.distutils.devel 0000014104 0000000001 m
                    gmane.comp.python.distutils.cvs 0000000000 0000000001 m
                    .zW                    215 Newsgroups in form "group high low flags"
                    .r   a                  215 Order of fields in overview database.
                Subject:
                From:
                Date:
                Message-ID:
                References:
                Bytes:
                Lines:
                Xref:full
                .
NEWSGROUPScomp.lang.pythonz                    215 Descriptions in form "group description".
                    comp.lang.python	The Python computer language.
                    .comp.lang.python*z                    215 Descriptions in form "group description".
                    comp.lang.python.announce	Announcements about the Python language. (Moderated)
                    comp.lang.python	The Python computer language.
                    .zW                    215 Descriptions in form "group description".
                    .z501 Unknown LIST keywordra  )r   actionparams      r   handle_LISTzNNTPv1Handler.handle_LISTG  s    >MM   x%      ~%MM 
 
 |#$$$**   --      MM45r   c                     |dk(  r|dk(  r|dk(  r| j                  d       y |dk(  r|dk(  r|dk(  r| j                  d       y |dk(  r!|dv r|dk(  r| j                  d	d
z  dz          y | j                  d       y )Nr  20100913082004a                  230 list of newsarticles (NNTP v2) created after Mon Sep 13 08:20:04 2010 follows
                <a4929a40-6328-491a-aaaf-cb79ed7309a2@q2g2000vbk.googlegroups.com>
                <f30c0419-f549-4218-848f-d7d0131da931@y3g2000vbm.googlegroups.com>
                .100913a                  230 list of newsarticles (NNTP v1) created after Mon Sep 13 08:20:04 2010 follows
                <a4929a40-6328-491a-aaaf-cb79ed7309a2@q2g2000vbk.googlegroups.com>
                <f30c0419-f549-4218-848f-d7d0131da931@y3g2000vbm.googlegroups.com>
                .)20100101100101090000ztoo long linei  z
.zK                230 An empty list of newsarticles follows
                .ra  )r   r-   date_strtime_strs       r   handle_NEWNEWSzNNTPv1Handler.handle_NEWNEWS}  s     ''H
,BH$MM  
 ))h(.BH$MM  
 ))00("MM/D0  ! MM  r   c                 T    |dk(  r| j                  d       y | j                  d       y )Nz57-59uK  224 Overview information for 57-58 follows
57	Re: ANN: New Plone book with strong Python (and Zope) themes throughout	Doug Hellmann <doug.hellmann-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>	Sat, 19 Jun 2010 18:04:08 -0400	<4FD05F05-F98B-44DC-8111-C6009C925F0C@gmail.com>	<hvalf7$ort$1@dough.gmane.org>	7103	16	Xref: news.gmane.io gmane.comp.python.authors:57
58	Looking for a few good bloggers	Doug Hellmann <doug.hellmann-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>	Thu, 22 Jul 2010 09:14:14 -0400	<A29863FA-F388-40C3-AA25-0FD06B09B5BF@gmail.com>		6683	16	
59	Re: Message d'erreur incompréhensible (par moi)	Eric Brunel <eric.brunel@pragmadev.nospam.com>	Wed, 15 Sep 2010 18:09:15 +0200	<eric.brunel-2B8B56.18091515092010@news.wanadoo.fr>	<4c90ec87$0$32425$ba4acef3@reader.news.orange.fr>	1641	27	Xref: saria.nerim.net fr.comp.lang.python:1265
.
z1                224 No articles
                .ra  rt  s     r   handle_XOVERzNNTPv1Handler.handle_XOVER  s.    7"MM4 MM  r   )r   c                    |@| j                   r"| j                  d       | j                          y | j                  d       y | j                   sJ | j                  d       || _        y )Nz+340 Input article; end with <CR-LF>.<CR-LF>440 Posting not permitted240 Article received OKr<  r_  rV  posted_body)r   r   s     r   handle_POSTzNNTPv1Handler.handle_POST  sZ    <!!KL  "9:%%%%MM34#Dr   c                    |E| j                   r'|dk(  r"| j                  d       | j                          y | j                  d       y | j                   sJ | j                  d       || _        y )N+<i.am.an.article.you.will.want@example.com>z%335 Send it; end with <CR-LF>.<CR-LF>435 Article not wanted235 Article transferred OKr  )r   
message_idr   s      r   handle_IHAVEzNNTPv1Handler.handle_IHAVE  sc    <""KKEF  "67%%%%MM67#Dr   z        From: "Demo User" <nobody@example.net>
        Subject: I am just a test article
        Content-Type: text/plain; charset=UTF-8; format=flowed
        Message-ID: <i.am.an.article.you.will.want@example.com>ui           This is just a test article.
        ..Here is a dot-starting line.

        -- Signed by André.z

c                    || j                  d       n@|dk(  r| j                  d       n)|dk(  r| j                  d       n| j                  d       y | j                  | j                         | j                  d       y )N"220 3000237 <45223423@example.com>rq  220 0 <45223423@example.com>ro  "220 3000234 <45223423@example.com>rs  .)r_  sample_articlert  s     r   handle_ARTICLEzNNTPv1Handler.handle_ARTICLE  sn    MM>?55MM89Y&MM>?MM56d))*cr   c                    || j                  d       n@|dk(  r| j                  d       n)|dk(  r| j                  d       n| j                  d       y | j                  | j                         | j                  d       y )N"221 3000237 <45223423@example.com>rq  221 0 <45223423@example.com>ro  "221 3000234 <45223423@example.com>rs  r  )r_  sample_headrt  s     r   handle_HEADzNNTPv1Handler.handle_HEAD  n    MM>?55MM89Y&MM>?MM56d&&'cr   c                    || j                  d       n@|dk(  r| j                  d       n)|dk(  r| j                  d       n| j                  d       y | j                  | j                         | j                  d       y )N"222 3000237 <45223423@example.com>rq  222 0 <45223423@example.com>ro  "222 3000234 <45223423@example.com>rs  r  )r_  sample_bodyrt  s     r   handle_BODYzNNTPv1Handler.handle_BODY  r  r   c                 &   | j                   r| j                  d       y |dk(  r7| j                  r| j                  d       y | j                  d       d| _        y |dk(  r| j                  d       d| _         y t        dj	                  |            )	Nz502 Already Logged Inr   z 482 User Credential Already Sentz381 Password RequiredTpassz281 Login SuccessfulzUnknown cred type {})r?  r_  r@  rR  rN  )r   	cred_typer  s      r   handle_AUTHINFOzNNTPv1Handler.handle_AUTHINFO
  sy    ??MM12& @A56"&& MM01"DO299)DEEr   r   NN) r   r   r   r   r   r}   rF  r  rV  r  r_  rQ  rA  re  rh  rj  rl  rv  ry  r|  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r9  r9    s    $G5$'L#$",@7DF46l>@ #' 
$ 04 $CK"K !6)K7NFr   r9  c                   $    e Zd ZdZd Zd ZddZy)NNTPv2Handlerz"A handler for RFC 3977 (NNTP "v2")c                     d}| j                   s!| j                  |j                  d             y | j                  |j                  d             y )Na              101 Capability list:
            VERSION 2 3
            IMPLEMENTATION INN 2.5.1{}
            HDR
            LIST ACTIVE ACTIVE.TIMES DISTRIB.PATS HEADERS NEWSGROUPS OVERVIEW.FMT
            OVER
            POST
            READER
            .z
            AUTHINFO USERrN   )r?  r_  rN  r   fmts     r   handle_CAPABILITIESz!NNTPv2Handler.handle_CAPABILITIES  s<    	 MM#**%BCDMM#**R.)r   c                     t        d      )Nz3MODE READER sent despite READER has been advertised)rR  )r   _s     r   handle_MODEzNNTPv2Handler.handle_MODE.  s    MNNr   Nc                 $    | j                  |      S r   )r  rt  s     r   handle_OVERzNNTPv2Handler.handle_OVER1  s      ..r   r   )r   r   r   r   r  r  r  r   r   r   r  r    s    ,*"O/r   r  c                   "     e Zd ZdZ fdZ xZS )CapsAfterLoginNNTPv2Handlerz3A handler that allows CAPABILITIES only after loginc                 ^    | j                   s| j                  d       y t        |           y )Nz480 You must log in.)r?  r_  r)  r  r,  s    r   r  z/CapsAfterLoginNNTPv2Handler.handle_CAPABILITIES8  s"    MM01G')r   )r   r   r   r   r  r3  r4  s   @r   r  r  5  s    =* *r   r  c                   "    e Zd ZdZd Zd Zd Zy)ModeSwitchingNNTPv2Handlerz$A server that starts in transit modec                     d| _         y NF)	_switchedr   s    r   r   z#ModeSwitchingNNTPv2Handler.__init__B  s	    r   c                     d}| j                   r!| j                  |j                  d             y | j                  |j                  d             y )Na              101 Capability list:
            VERSION 2 3
            IMPLEMENTATION INN 2.5.1
            HDR
            LIST ACTIVE ACTIVE.TIMES DISTRIB.PATS HEADERS NEWSGROUPS OVERVIEW.FMT
            OVER
            POST
            {}READER
            .rN   zMODE-)r  r_  rN  r  s     r   r  z.ModeSwitchingNNTPv2Handler.handle_CAPABILITIESE  s;    	 >>MM#**R.)MM#**W-.r   c                 Z    | j                   s|dk(  sJ d| _         | j                  d       y )NreaderTz200 Posting allowed)r  r_  )r   whats     r   r  z&ModeSwitchingNNTPv2Handler.handle_MODEU  s*    >>dh&666+,r   N)r   r   r   r   r   r  r  r   r   r   r  r  ?  s    ./ -r   r  c                        e Zd Z 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 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 Zd Z d Z!d  Z"d! Z# xZ$S )"NNTPv1v2TestsMixinc                 "    t         |           y r   )r)  r*  r,  s    r   r*  zNNTPv1v2TestsMixin.setUp]  s    r   c                 x    | j                  | j                  j                  | j                  j                         y r   )r   r   r   r   r   s    r   r    zNNTPv1v2TestsMixin.test_welcome`  s&    ,,dll.B.BCr   c                     | j                   dk(  r&| j                  d| j                  j                         | j                  j	                  dd       | j                  d| j                  j                         y )Nr   AUTHINFOtestusertestpw)r   rP   r   _capsr   rJ   r   s    r   test_authinfoz NNTPv1v2TestsMixin.test_authinfoc  sX    !MM*dkk&7&78*h/ 	T[[%6%67r   c                     | j                   j                         \  }}| j                  |d       | j                  |t        j                  dddddd             y )Nrg    	      r      7   )r   rA   r   r@   re   s      r   rf   zNNTPv1v2TestsMixin.test_datek  sN    [[%%'
d34x00q"aRHIr   c                     | j                  | j                  j                         | j                  j	                         }| j                  |d       | j                  | j                  j                         y rd  )r   r  closedr   r   r   r#   )r   r%   s     r   	test_quitzNNTPv1v2TestsMixin.test_quitp  sN    ){{!z*(r   c                     | j                   j                         \  }}| j                  |d       | j                  |g d       y )Nz100 Legal commands)z8  authinfo user Name|pass Password|generic <prog> <args>z  datez  helpz%Report problems to <root@example.org>)r   r"   r   )r   r%   r"   s      r   r(   zNNTPv1v2TestsMixin.test_helpv  s>    [[%%'
d34  
 	r   c           	      r   | j                   j                         \  }}| j                  t        |      d       |d   }| j                  |t	        dddd             | j                   j                  d      \  }}| j                  t        |      d       |d	   }| j                  |t	        d
ddd             y )N   r   comp.lang.python.announce
0000001153
0000000993mr  r   r   z!gmane.comp.python.distutils.devel
0000014104
0000000001)r   r+   r   r,   r   )r   r%   r/   gs       r   r0   zNNTPv1v2TestsMixin.test_list  s    {{'')fVa(1I1<"C)	* {{''6fVa(1I9<"C)	*r   c                 *   | j                   j                  d      \  }}}| j                  |d       | j                  |d       | j                  |d       | j                   j                  d      \  }}}| j                  |d       | j                  |d       | j                  |d       | j                  t        j
                        5 }| j                   j                  d       d d d        | j                  j                  j                  d       | j                  t        j
                        5 }| j                   j                          d d d        | j                  |j                  j                  d       y # 1 sw Y   xY w# 1 sw Y   <xY w)	N- rp  rq  rr  r   z<non.existent.id>rs  rn  )r   statr   r6   r   r   r9   r:   )r   r%   rw   r  r;   s        r   	test_statzNNTPv1v2TestsMixin.test_stat  sL   $(KK$4$4W$=!gzCD'*%=>$(KK$4$45M$N!gz=>!$%=>w99: 	2bKK01	2..0KLw99: 	bKK	..0KL	2 	2	 	s   
E=3F	=F	Fc                     | j                   j                         \  }}}| j                  |d       | j                  |d       | j                  |d       y )Nrx  - z<668929@example.org>)r   nextr   r   r%   rw   r  s       r   	test_nextzNNTPv1v2TestsMixin.test_next  sM    $(KK$4$4$6!gzKL'*%;<r   c                     | j                   j                         \  }}}| j                  |d       | j                  |d       | j                  |d       y )Nr{  r  rq  )r   r`   r   r  s       r   	test_lastzNNTPv1v2TestsMixin.test_last  sM    $(KK$4$4$6!gzMN'*%=>r   c                     | j                   j                  d      }| j                  |d       | j                   j                  d      }| j                  |d       y )Nr  The Python computer language.comp.lang.pythonxrN   )r   rO   r   )r   rL   s     r   rR   z#NNTPv1v2TestsMixin.test_description  sM    {{&&'9:>?{{&&':;r"r   c                 R   | j                   j                  d      \  }}| j                  |d       | j                  |ddi       | j                   j                  d      \  }}| j                  |ddd       | j                   j                  d      \  }}| j                  |i        y )Nr  z-215 Descriptions in form "group description".r  r  z4Announcements about the Python language. (Moderated))r  r  r  )r   rT   r   r.   s      r   rW   z$NNTPv1v2TestsMixin.test_descriptions  s    {{//0BCfNO ?" 	 {{//0CDf ?)_" 	 {{//0CDf$r   c                 8   | j                   j                  d      \  }}}}}| j                  |j                  d      |       | j	                  |d       | j	                  |d       | j	                  |d       | j	                  |d       | j                  t        j                        5 }| j                   j                  d       d d d        j                  }| j                  |j                  j                  d      |j                         y # 1 sw Y   KxY w)Nr   rZ   i  i  i  zcomp.lang.python.develz411 No such group)
r   r-   r#   r$   r   r6   r   r   r9   r:   )r   r%   r^   r_   r`   r-   r;   excs           r   ra   zNNTPv1v2TestsMixin.test_group  s    *.++*;*;<Q*R'eUD%/6$t$$ 56w99: 	8bKK67	8ll//0CD	&	8 	8s   *DDc                    t        j                   dddddd      }| j                  j                  d|      \  }}dj                  | j                        }| j                  ||       | j                  |d	d
g       t        j                   dddddd      }| j                  j                  d|      \  }}| j                  |d       | j                  |g        y )Nr  r              r  zS230 list of newsarticles (NNTP v{0}) created after Mon Sep 13 08:20:04 2010 followszB<a4929a40-6328-491a-aaaf-cb79ed7309a2@q2g2000vbk.googlegroups.com>zB<f30c0419-f549-4218-848f-d7d0131da931@y3g2000vbm.googlegroups.com>r   z)230 An empty list of newsarticles follows)r@   r   newnewsrN  r   r   )r   rF   r%   idsexpecteds        r   test_newnewszNNTPv1v2TestsMixin.test_newnews  s    tQAr15KK''(:B?	c=fT&&' 	 	x(PP 	
 tQAr15KK''(=rB	cJKb!r   c                     | j                  t        |      d       | j                  |d   j                  d      d       | j                  |d   d       | j                  |d   d       | j                  |d	   d
       y )Nr   r{   rC  u   -- Signed by André.rI  r   s   .Here is a dot-starting line.s   This is just a test article.)r   r,   decoder   r&   s     r   _check_article_bodyz&NNTPv1v2TestsMixin._check_article_body  st    UQ'r))'24JKrC(r$DEr$CDr   c                     | j                  t        |      d       | j                  |d   d       | j                  |d   d       y )Nr   r   s&   From: "Demo User" <nobody@example.net>   s7   Message-ID: <i.am.an.article.you.will.want@example.com>)r   r,   r	  s     r   _check_article_headz&NNTPv1v2TestsMixin._check_article_head  s@    UQ'q#LMq#]^r   c                     | j                  t        |      d       | j                  |d d        | j                  |dd         | j                  |d   d       y )Nr  r   r  r   )r   r,   r  r
  r	  s     r   _check_article_dataz&NNTPv1v2TestsMixin._check_article_data  sR    UQ'  r+  rs,q3'r   c                 n   | j                   j                         \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j                   j                  d      \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j                   j                  d      \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j	                  t
        j                        5 }| j                   j                  d       d d d        | j                  j                  j                  d	       y # 1 sw Y   0xY w)
Nr  r  rq  r  r  r  r   <non-existent@example.com>rs  )	r   r   r   r  r6   r   r   r9   r:   r   r%   inforw   r  r&   r;   s          r   test_articlezNNTPv1v2TestsMixin.test_article  s   [[((*
dCD%)"U'*%=>  '[[((1
dCD%)"U'*%=>  '[[(()AB
d=>%)"U!$%=>  'w99: 	>bKK <=	>..0KL	> 	>    F++F4c                    t        j                         }| j                  j                  |      \  }}| j	                  |d       |\  }}}| j	                  |d       | j	                  |d       | j	                  |g        |j                         }| j                  |j                  d      t        |             | j                  |j                  d      t        |             y )Nr   r  r  rq  K   From: "Demo User" <nobody@example.net>
Subject: I am just a test article
U   This is just a test article.
.Here is a dot-starting line.

-- Signed by André.
)
r   r   r   r   r   getvaluer#   r$   asciirM  r   r   r%   r  rw   r  r&   r  s           r   test_article_filez$NNTPv1v2TestsMixin.test_article_file  s    JJL[[((a(0
dCD%)"U'*%=>#zz|5 T{	 	.
 T{	r   c                 n   | j                   j                         \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j                   j                  d      \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j                   j                  d      \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j	                  t
        j                        5 }| j                   j                  d       d d d        | j                  j                  j                  d	       y # 1 sw Y   0xY w)
Nr  r  rq  r  r  r  r   r  rs  )	r   r   r   r  r6   r   r   r9   r:   r  s          r   	test_headzNNTPv1v2TestsMixin.test_head      [[%%'
dCD%)"U'*%=>  '[[%%g.
dCD%)"U'*%=>  '[[%%&>?
d=>%)"U!$%=>  'w99: 	;bKK9:	;..0KL	; 	;r  c                    t        j                         }| j                  j                  |      \  }}| j	                  |d       |\  }}}| j	                  |d       | j	                  |d       | j	                  |g        |j                         }| j                  |j                  d      t        |             | j                  |j                  d      t        |             y )Nr  r  r  rq  r  r  )r   r   r   r   r   r  r#   r$   r  r   rM  r  s           r   test_head_filez!NNTPv1v2TestsMixin.test_head_file;  s    JJL[[%%1%-
dCD%)"U'*%=>#zz|5 T{	 	.
 T{	r   c                 n   | j                   j                         \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j                   j                  d      \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j                   j                  d      \  }}| j                  |d       |\  }}}| j                  |d       | j                  |d       | j                  |       | j	                  t
        j                        5 }| j                   j                  d       d d d        | j                  j                  j                  d	       y # 1 sw Y   0xY w)
Nr  r  rq  r  r  r  r   r  rs  )	r   r   r   r
  r6   r   r   r9   r:   r  s          r   	test_bodyzNNTPv1v2TestsMixin.test_bodyO  r   r  c                    t        j                         }| j                  j                  |      \  }}| j	                  |d       |\  }}}| j	                  |d       | j	                  |d       | j	                  |g        |j                         }| j                  |j                  d      t        |             | j                  |j                  d      t        |             y )Nr  r  r  rq  r  r  )r   r   r   r   r   r  r   r$   r  r#   rM  r  s           r   test_body_filez!NNTPv1v2TestsMixin.test_body_filej  s    JJL[[%%1%-
dCD%)"U'*%=>#zz|5 T{	 	.
 T{	r   c                 Z   | j                  |j                  d      |       | j                  t        |      d       |d   \  }}| j                  |d       | j                  |ddddd	d
ddd       |d   \  }}| j                  |d   d        |d   \  }}| j                  |d   d       y )Nz224 r  r   9   zEDoug Hellmann <doug.hellmann-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>zGRe: ANN: New Plone book with strong Python (and Zope) themes throughoutzSat, 19 Jun 2010 18:04:08 -0400z0<4FD05F05-F98B-44DC-8111-C6009C925F0C@gmail.com>z<hvalf7$ort$1@dough.gmane.org>710316z*news.gmane.io gmane.comp.python.authors:57)rh   ri   rA   rm   rj   rk   rl   xrefr   r+  r   ri   0   Re: Message d'erreur incompréhensible (par moi))r#   r$   r   r,   )r   r%   	overviewsrw   r|   s        r   check_over_xover_respz(NNTPv1v2TestsMixin.check_over_xover_resp~  s    /6Y+!!"%[`5L:@	  		 "!ft,!!iK	Mr   c                 f    | j                   j                  dd      \  }}| j                  ||       y )Nr(  ;   )r   rt   r.  r   r%   r-  s      r   rx   zNNTPv1v2TestsMixin.test_xover  s,    ++++B3i""43r   c                 d    | j                   j                  d      \  }}| j                  ||       y )N)r(  r0  )r   r|   r.  r1  s      r   r~   zNNTPv1v2TestsMixin.test_over  s*    ++**84i""43r   s  From: "Demo User" <nobody@example.net>
Subject: I am just a test article
Content-Type: text/plain; charset=UTF-8; format=flowed
Message-ID: <i.am.an.article.you.will.want@example.com>

This is just a test article.
.Here is a dot-starting line.

-- Signed by André.
c                 8   | j                   j                  }| j                  t        |      d       | j                  |d   d       | j                  |d   d       | j                  |d   d       | j                  |d   d	       | j                  |d
   d       y )Nrz   r{   r   rI  s   -- Signed by André.
r     
r  s    ..Here is a dot-starting line.
r   s(   From: "Demo User" <nobody@example.net>
)r   r  r   r,   r	  s     r   _check_posted_bodyz%NNTPv1v2TestsMixin._check_posted_body  s    ((UR(rH-r$EFrG,r$IJq#PQr   c                   | j                   }| ||      fz   }d | j                  _         || }| j                          | j                   j	                  dd      }| ||      fz   }d | j                  _         || }| j                          |S )Nr4     
)sample_postr   r  r5  replace)r   funcfile_factoryr2  post	func_argsr%   s          r   _check_post_ihave_subz(NNTPv1v2TestsMixin._check_post_ihave_sub  s    L.00	#' Y! ''7L.00	#' Y!r   c                     | j                   |g|dt        i}| j                  ||        | j                   |g|dt        i}| j                  ||        | j                   |g|dt        j
                  i}| j                  ||       d } | j                   |g|d|i}| j                  ||       d } | j                   |g|d|i}| j                  ||       y )Nr;  c                 8    t        | j                  d            S )NTkeependsiterr\  r  s    r   	iterlinesz6NNTPv1v2TestsMixin.check_post_ihave.<locals>.iterlines  s    d344r   c                 8    t        | j                  d            S )NFrA  rC  rE  s    r   rF  z6NNTPv1v2TestsMixin.check_post_ihave.<locals>.iterlines  s    e455r   )r>  r   r   	bytearrayr   r   )r   r:  success_respr2  r%   rF  s         r   check_post_ihavez#NNTPv1v2TestsMixin.check_post_ihave  s    )t))$JJEJ|,)t))$NNIN|,)t))$OOBJJO|,	5)t))$NNIN|,	6)t))$NNIN|,r   c                 p   | j                  | j                  j                  d       d| j                  _        | j                  t        j                        5 }| j                  j                  | j                         d d d        | j                  j                  j                  d       y # 1 sw Y   0xY w)Nr  Fr  )rJ  r   r<  r   r<  r6   r   r   r8  r   r9   r:   r   r;   s     r   	test_postzNNTPv1v2TestsMixin.test_post  s    dkk..0IJ%*"w99: 	/bKKT--.	/..4	6	/ 	/s   &B,,B5c                 R   | j                  | j                  j                  dd       | j                  t        j
                        5 }| j                  j                  d| j                         d d d        | j                  j                  j                  d       y # 1 sw Y   0xY w)Nr  r  z<another.message.id>r  )
rJ  r   ihaver6   r   r   r8  r   r9   r:   rL  s     r   
test_ihavezNNTPv1v2TestsMixin.test_ihave  s    dkk//1MK	Mw99: 	HbKK4d6F6FG	H..1	3	H 	Hs   'BB&c                     t        j                   dddddd      }| j                  t        j                  | j                  j
                  d|       y )Nr  r   r  r   r  )r@   r6   r   NNTPDataErrorr   r  )r   rF   s     r   test_too_long_linesz&NNTPv1v2TestsMixin.test_too_long_lines  sE    tQ1a3'//++--/A2	Gr   )%r   r   r   r*  r    r  rf   r  r(   r0   r  r  r  rR   rW   ra   r  r
  r  r  r  r  r  r"  r$  r&  r.  rx   r~   r8  r5  r>  rJ  rM  rP  rS  r3  r4  s   @r   r  r  [  s    D8J
)*M =?#%&"&E_
(M6*M6(M6(M*44	* 	R -*63Gr   r  c                       e Zd ZdZdZeZd Zy)NNTPv1Testsz*Tests an NNTP v1 server (no capabilities).r   c                     | j                   j                         }| j                  |i        | j                  | j                   j                  d       | j                  | j                   j                  d        y )Nr   r   r   r   r   nntp_implementationr   r   s     r   	test_capszNNTPv1Tests.test_caps  sX    {{**,r"111588$?r   N)r   r   r   r   r   r9  r1  rZ  r   r   r   rU  rU    s    4L!M@r   rU  c                       e Zd ZdZdZeZd Zy)NNTPv2Testsz,Tests an NNTP v2 server (with capabilities).r   c                    | j                   j                         }| j                  |ddgddgdgg g dg g g d       | j                  | j                   j                  d       | j                  | j                   j                  d	       y )
N23INNz2.5.1USER)r~  zACTIVE.TIMESzDISTRIB.PATSHEADERSr  r   )VERSIONIMPLEMENTATIONr  HDRr   OVERPOSTREADERr  z	INN 2.5.1rW  rY  s     r   rZ  zNNTPv2Tests.test_caps  s    {{**,Sz$g.>
  
	 	111588+Fr   N)r   r   r   r   r   r  r1  rZ  r   r   r   r\  r\    s    6L!MGr   r\  c                       e Zd ZdZdZeZd Zy)CapsAfterLoginNNTPv2TestszCTests a probably NNTP v2 server with capabilities only after login.r   c                     | j                  | j                  j                  i        | j                  j                  dd       | j	                  d| j                  j                         y )Nr  r  rc  )r   r   r  r   rP   r   s    r   test_caps_only_after_loginz4CapsAfterLoginNNTPv2Tests.test_caps_only_after_login  sH    **B/*h/i!2!23r   N)r   r   r   r   r   r  r1  rl  r   r   r   rj  rj    s    ML/M4r   rj  c                       e Zd ZdZdZeZd Zy)SendReaderNNTPv2TestszoSame tests as for v2 but we tell NTTP to send MODE READER to a server
    that isn't in READER mode by default.r   c                 P    | j                  d| j                  j                         y )Nrh  )rP   r   r  r   s    r   (test_we_are_in_reader_mode_after_connectz>SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connect&  s    h 1 12r   N)r   r   r   r   r   r  r1  rp  r   r   r   rn  rn    s    - L.M3r   rn  c                   b    e Zd Zd Zd Zd Zd Zd Zd Z e	j                  ed      d        Zy	)
	MiscTestsc                       fd} |dd        |dd        |dd        |dd        |dd        |d	d
        |dd       y )Nc                 P    j                  t        j                  |       |       y r   )r   r   decode_header)ar  r   s     r   givesz+MiscTests.test_decode_header.<locals>.gives-  s    W2215q9r   rN   za plain headerz with extra  spaces z%=?ISO-8859-15?Q?D=E9buter_en_Python?=u   Débuter en Pythonz=?utf-8?q?Re=3A_=5Bsqlite=5D_probl=C3=A8me_avec_ORDER_BY_sur_des_cha?= =?utf-8?q?=C3=AEnes_de_caract=C3=A8res_accentu=C3=A9es?=uP   Re: [sqlite] problème avec ORDER BY sur des chaînes de caractères accentuéesz,Re: =?UTF-8?B?cHJvYmzDqG1lIGRlIG1hdHJpY2U=?=u   Re: problème de matricer,  r   r   rw  s   ` r   test_decode_headerzMiscTests.test_decode_header,  sh    	:b2 01$&<=57KL J`	b 	<(	* 	@@	Br   c                    g d}| j                  t        j                  |      g d       g d}| j                  t        j                  |      g d       g d}| j                  t        j                  |      g d       g d}| j                  t        j                  |      g d       g d}| j                  t        j                  |      g d       g d}| j                  t        j                  |      g d	       y )
N)Subject:From:Date:Message-ID:References:rk   rl   )ri   rh   rA   rm   rj   rk   rl   )r{  r|  r}  r~  r  Bytes:Lines:)zsubject:zFROM:zDaTe:zmessage-ID:r  zBYTES:r  )	r{  r|  r}  r~  r  rk   rl   	Xref:fullzDistribution:full)	ri   rh   rA   rm   rj   rk   rl   r+  distribution)	r{  r|  r}  r~  r  r  r  z	Xref:FULLzDistribution:FULL)r{  r|  r}  r~  r  r  r  r  ri   rh   rA   rm   rj   rk   rl   r+  )r   r   _parse_overview_fmtr	  s     r   test_parse_overview_fmtz!MiscTests.test_parse_overview_fmt<  s    444U;!	"444U;!	"444U;!	"& 	44U;9	:& 	44U;9	:A44U;)	*r   c                    t         j                  dgz   }dg}t         j                  ||      }|\  \  }}| j                  |d       | j                  |dddddd	d
dd       dg}t         j                  ||      }|\  \  }}| j                  |d   d        dg}t         j                  ||      }|\  \  }}| j                  |d   d       | j                  |d   d       y )Nr+  z3000234	I am just a test article	"Demo User" <nobody@example.com>	6 Oct 1998 04:38:40 -0500	<45223423@example.com>	<45454@example.net>	1234	17	Xref: news.example.com misc.test:3000363r  zI am just a test articlez "Demo User" <nobody@example.com>z6 Oct 1998 04:38:40 -0500rq  z<45454@example.net>123417z"news.example.com misc.test:3000363r  z3000234	I am just a test article	"Demo User" <nobody@example.com>	6 Oct 1998 04:38:40 -0500	<45223423@example.com>	<45454@example.net>	1234	17		z3000234	I am just a test article	"Demo User" <nobody@example.com>	6 Oct 1998 04:38:40 -0500	<45223423@example.com>	 	1234	17	Xref: 	rj    rN   )r   _DEFAULT_OVERVIEW_FMT_parse_overviewr   )r   r  r&   overviewrw   fieldss         r   test_parse_overviewzMiscTests.test_parse_overviewd  s   ++vh6;
 **5#6%&'*16/2/8	"
 		
 **5#6%&.
 **5#6%&-s3,r   c           
            fd} |dd dddddd        |d	d
dddddd        |dd
dddddd        |dd
dddddd       y )Nc                 r    j                  t        j                  | |      t        j                  |        y r   )r   r   _parse_datetimer@   )rv  r  cr   s      r   rw  z,MiscTests.test_parse_datetime.<locals>.gives  s.    W44Q:%..24r   19990623135624  r     r  8      19990623135624990623090623i  r   rx  s   ` r   test_parse_datetimezMiscTests.test_parse_datetime  sc    	4 	dAr2r2>j(D!RR<h$2r2r:h$2r2r:r   c           
            fd} |dddddddd	        |d
ddddddd	        |dddddddd        fd} |ddddd        |d
dddd        |ddddd       y )Nc                     t        j                   | |||||      }	j                  t        j                  |      ||f       	j                  t        j                  |d      ||f       y r  r@   r   r   _unparse_datetime
yMdhr  sr  r  rF   r   s
            r   rw  z.MiscTests.test_unparse_datetime.<locals>.gives  se    ""1aAq!4BW66r:&13W66r5A&13r   r  r  r  r  r  r  r  r    20000623r  rY   r   r   r  20100605010203c                     t        j                  | ||      }j                  t        j	                  |      ||f       j                  t        j	                  |d      ||f       y r  r@   rA   r   r   r  r  r  r  r  r  rF   r   s         r   rw  z.MiscTests.test_unparse_datetime.<locals>.gives  s]    q!Q'BW66r:&13W66r5A&13r   000000r   rx  s   ` r   test_unparse_datetimezMiscTests.test_unparse_datetime  s    	3 	dAr2r2z8<dAr2r2z8<dAq!Q:x8	3 	dAr:x0dAr:x0dAq*h/r   c           
            fd} |dddddddd	        |d
ddddddd	        |dddddddd        fd} |ddddd        |d
dddd        |ddddd       y )Nc                     t        j                   | |||||      }	j                  t        j                  |d      ||f       y r  r  r  s
            r   rw  z5MiscTests.test_unparse_datetime_legacy.<locals>.gives  sB    ""1aAq!4BW66r4@&13r   r  r  r  r  r  r  r  r  r  000623r  rY   r   r   r  100605r  c                     t        j                  | ||      }j                  t        j	                  |d      ||f       y r  r  r  s         r   rw  z5MiscTests.test_unparse_datetime_legacy.<locals>.gives  s:    q!Q'BW66r4@&13r   r  r   rx  s   ` r   test_unparse_datetime_legacyz&MiscTests.test_unparse_datetime_legacy  s    	3 	dAr2r2x:dAr2r2x:dAq!Q8X6	3 	dAr8X.dAr8X.dAq(H-r   r   c                 B    | j                  t        t        d             y )Nr   )r#   r   r   r   s    r   test_ssl_supportzMiscTests.test_ssl_support  s    45r   N)r   r   r   ry  r  r  r  r  r  r   
skipUnlessr   r  r   r   r   rr  rr  *  sG    B &*P,-\	;0..& X456 66r   rr  c                       e Zd ZdZd Zy)PublicAPITestsz>Ensures that the correct values are exposed in the public API.c                     | j                  t        t        d             g d}t        |j	                  d       | j                  t        t        j                        t        |             y )N__all__)r   r   NNTPReplyErrorr   r7   NNTPProtocolErrorrR  ru  r   )r#   r   r   r   rK  r   setr  )r   
target_apis     r   test_module_all_attributez(PublicAPITests.test_module_all_attribute  sO    34M
 ?j)W__-s:?r   N)r   r   r   r   r  r   r   r   r  r    s    H@r   r  c                   P    e Zd ZdZej
                  Z	 d	dZd Zd Z	d Z
d Zd Zy)
MockSocketTestszaTests involving a mock socket object

    Used where the _NNTPServerIO file object is not enough.Nc                 f  	
  G fdd      } G 	
fdd      d
g 	t        d|      5  | j                  ||      5  | j                  d||       d d d        d d d        | j                  
       	D ]  }| j                  |j                          y # 1 sw Y   ExY w# 1 sw Y   IxY w)	Nc                       e Zd Z fdZy)NMockSocketTests.check_constructor_error_conditions.<locals>.mock_socket_modulec                             S r   r   )addressr   
MockSockets     r   create_connectionz`MockSocketTests.check_constructor_error_conditions.<locals>.mock_socket_module.create_connection  s    !|#r   N)r   r   r   r  )r  s   r   mock_socket_moduler    s    $r   r  c                   $    e Zd ZfdZ fdZy)FMockSocketTests.check_constructor_error_conditions.<locals>.MockSocketc                 
    dy r  r   )r   socket_closeds    r   r#  zLMockSocketTests.check_constructor_error_conditions.<locals>.MockSocket.close  s     $r   c                 T            }t        |      \  }}j                  |       |S r   )r  rK  )socketmoder   r  r   filesr1  s        r   makefilezOMockSocketTests.check_constructor_error_conditions.<locals>.MockSocket.makefile  s)    '/(14T"r   N)r   r   r   r#  r  )r  r1  r  s   r   r  r    s    %r   r  Fznntplib.socketdummy)r   r   )r	   assertRaisesRegex
nntp_classr#   r  )r   r1  expected_error_typeexpected_error_msgr   r   r  r   r  r  r  s    `      @@@r   "check_constructor_error_conditionsz2MockSocketTests.check_constructor_error_conditions  s    
	$ 	$		 		 #%78 	D##$79KL	DOOG%(OC	D 	D 	& 	&AOOAHH%	&		D 	D 	D 	Ds#   B'BB'B$	 B''B0c                 x     G d dt               }| j                  |t        j                  |j                         y )Nc                       e Zd ZdZy)1MockSocketTests.test_bad_welcome.<locals>.HandlerzBad WelcomeNr   r   r   r   r   r   r   Handlerr    s    #Gr   r  )r9  r  r   r  r   r   r  s     r   test_bad_welcomez MockSocketTests.test_bad_welcome  s.    	$m 	$//W..	Ar   c                 x     G d dt               }| j                  |t        j                  |j                         y )Nc                       e Zd ZdZy)EMockSocketTests.test_service_temporarily_unavailable.<locals>.Handlerz#400 Service temporarily unavailableNr  r   r   r   r  r        ;Gr   r  )r9  r  r   r   r   r  s     r   $test_service_temporarily_unavailablez4MockSocketTests.test_service_temporarily_unavailable  .    	<m 	<//W//	Br   c                 x     G d dt               }| j                  |t        j                  |j                         y )Nc                       e Zd ZdZy)EMockSocketTests.test_service_permanently_unavailable.<locals>.Handlerz#502 Service permanently unavailableNr  r   r   r   r  r    r  r   r  )r9  r  r   r7   r   r  s     r   $test_service_permanently_unavailablez4MockSocketTests.test_service_permanently_unavailable
  r  r   c                 n     G fddt               }d| j                  |t        j                         y )Nc                       e Zd Z fdZy)6MockSocketTests.test_bad_capabilities.<locals>.Handlerc                 (    | j                         y r   ra  )r   capabilities_responses    r   r  zJMockSocketTests.test_bad_capabilities.<locals>.Handler.handle_CAPABILITIES  s    34r   N)r   r   r   r  )r  s   r   r  r    s    5r   r  z201 bad capability)r9  r  r   r  )r   r  r  s     @r   test_bad_capabilitiesz%MockSocketTests.test_bad_capabilities  s4    	5m 	5 !5//W++-B	Dr   c                 z    d}d} G fddt               }d| j                  |t        j                  ||       y )Nzt@e.compythonc                       e Zd Z fdZy)3MockSocketTests.test_login_aborted.<locals>.Handlerc                 (    | j                         y r   ra  )r   r2  authinfo_responses     r   r  zCMockSocketTests.test_login_aborted.<locals>.Handler.handle_AUTHINFO  s    /0r   N)r   r   r   r  )r  s   r   r  r    s    1r   r  z503 Mechanism not recognized)r9  r  r   r7   )r   r   r   r  r  s       @r   test_login_abortedz"MockSocketTests.test_login_aborted  sB    	1m 	1 ;//W//1B8	r   r  )r   r   r   r   r   r   r  r  r  r  r  r  r  r   r   r   r  r    s9    ? J
 "&&:ABBD
r   r  c                       e Zd ZdZd Zy)bypass_contextz'Bypass encryption and actual SSL modulec                     | S r   r   )sockr2  s     r   wrap_socketzbypass_context.wrap_socket(  s    r   N)r   r   r   r   r  r   r   r   r  r  &  s
    1r   r  c                       e Zd Zed        Zy)MockSslTestsc                  8    t        j                  | dt        i|S )Nr   )r   r   r  )r  kws     r   r  zMockSslTests.nntp_class-  s    G.GBGGr   N)r   r   r   staticmethodr  r   r   r   r   r   +  s    H Hr   r   c                   J    e Zd Zd Zd Z ej                  ed      d        Zy)LocalServerTestsc                    t        j                          }t        j                  |      }|j                          t	        j
                  | j                  |f      | _        | j                  j                          | j                  | j                  j                         | j                  t        t        j                  |d            | _        y )N)targetr2  F)r   )r  r   	bind_portlisten	threadingThread
run_server
backgroundr}   
addCleanupr[  enterContextr   HOSTnntp)r   r  ports      r   r*  zLocalServerTests.setUp3  s    }}&&t,#**??$2,,-%%d=+=+=te&TU	r   c                 ,   |5  |j                         \  }}d d d        t        j                         5 }|j                         |j                  |j	                  d            }|j                  d       	 |j                         }|dk(  r|j                  d       n|dk(  r|j                          |j                  d       t        j                  t        j                        }|j                  t               |j                  |d      }|j                  |       |j                  |j	                  d            }n1|d	k(  r|j                  d
       nt        dj                  |            	 d d d        y # 1 sw Y   hxY w# 1 sw Y   y xY w)Nrbs   200 Server ready
Ts   CAPABILITIES
s.   101 Capability list:
VERSION 2
STARTTLS
.
s
   STARTTLS
s   382 Begin TLS negotiation now
)server_sides   QUIT
s
   205 Bye!
zUnexpected command {!r})accept
contextlib	ExitStackenter_contextr  sendallr  r#  r   
SSLContextPROTOCOL_TLS_SERVERload_cert_chaincertfiler  r   rN  )r   r  clientr  cleanupr  rT  contexts           r   r  zLocalServerTests.run_server>  sn    	(++-KVQ	(!!# 	Lw!!&)**6??4+@AFNN23oo'--NN! O+LLNNN#GH!nnS-D-DEG++H5$00D 1 2F))&1$226??43HIFK'NN?3$%>%E%Ec%JKK- ( 1	L 	L	( 	(	L 	Ls   E=E F
=F
Fr   c                    | j                   j                  }| j                   j                  }| j                   j                          | j	                  || j                   j                         | j	                  || j                   j                         | j                  | j                   j                  t        j                         | j                  t        | j                   j                         y r   )
r  r   r  starttlsassertNotEqualrE   r   	SSLSocketr6   r   )r   r   r  s      r   r   zLocalServerTests.test_starttls^  s    yy~~yy~~		 	D$))..1D$))..1diinncmm<*dii&8&89r   N)	r   r   r   r*  r  r   r  r   r   r   r   r   r  r  2  s3    	VL@ X45: 6:r   r  __main__)?r   r  r@   rY  r   r   r  os.pathosr   r
  r   r   test.supportr   r   import_deprecatedr   r   r   unittest.mockr	   r   ImportErrorpathr[  dirname__file__r  r   rR  r   r   r   r   SSLEOFErrorTestCaser   r  r   r   r   r  r  r&  r6  r9  r  r  r  r  rU  r\  rj  rn  rr  r  r  r  r   r  r   mainr   r   r   <module>r3     s   	        	   7
+/
+
+I
6 # 
 77<<1:~N?||H.9 .G GT  $ $ & [
?3??$$J#0(2C2C #J S01=/ = 2=<)BLL )X	 	 &*$8 *BF BFJ
/M /6*- *- -8PG PGf
@$&:H<M<M 
@G$&:H<M<M G.	4 4h6G6G 	4	39	3_6!! _6D
@X&& 
@Lh'' L\ 
 S01H? H 2H8:x(( 8:v zHMMO u2  
Cs   I: :JJ