3 2aF@sddlZddlZddlZddlZddlZy ddlZWnek rLdZYnXdZddlm Z ddlm Z dddd d d d d gZ dZ GdddeZGdddeZGdd d eZGdd d eZGdd d eZGdd d eZdZdZdddddddddd d!d"h Zd#d$d%d&d'd(d)gZd(d)d*Zd+Zejd,d-d.d/d0gZejd1d2d3d4gZd5d Z d6d7Zdkd8d9Zdld:d;Z dmdd?Z"Gd@dAdAZ#GdBdde#Z$erGdCdDdDe#Z%e j&dDe'dEkr|ddl(Z(e(j)dFdGZ*e*j+dHdIdJdKdLe*j+dMdNdOdPdLe*j+dQdRdne,dTeefdUe*j+dVdWdXe,dYdUe*j+dZd[d\dd]d^e*j-Z.e.j/Z/e.jse/dokrpeZ/e$e.j0e/d_Z1ne/dpkreZ/e%e.j0e/d_Z1e1j2Z3d`e3kre1j4e1j5e.j5\Z6Z7Z8Z9Z:e;dae:dbe7dce8dde9dedfZdSZ8e1j?e8e9\Z6Z@xbe@D]Z\ZAZBe eBd$jCdgdSdZDe eBd#ZEe,eBd)ZFe;dhjGeAetj|f|y|d|_Wntk r8d|_YnXdS)NrzNo response given) Exception__init__response IndexError)selfargsr,/opt/alt/python36/lib64/python3.6/nntplib.pyr bs zNNTPError.__init__N)__name__ __module__ __qualname__r rrrrr`sc@s eZdZdS)rN)rrrrrrrrisc@s eZdZdS)rN)rrrrrrrrmsc@s eZdZdS)rN)rrrrrrrrqsc@s eZdZdS)r N)rrrrrrrr usc@s eZdZdS)r N)rrrrrrrr yswi3Z100Z101211215Z220Z221Z222Z224Z225Z230Z231Z282subjectfromdatez message-idZ referencesz:bytesz:lines)bytesliness GroupInfogrouplastfirstflag ArticleInfoZnumber message_idrcCsNg}x>t|D]2\}}t|tr6|j|j|p.dq|j|qWdj|S)Nascii)_email_decode_header isinstancerappenddecodejoin)Z header_strpartsvencrrrrs  cCsg}xh|D]`}|ddkr<|ddjd\}}}d|}n|jd\}}}|j}tj||}|j|q Wt}t|t|krtd|dt||krtd|S)Nr:z$LIST OVERVIEW.FMT response too shortz*LIST OVERVIEW.FMT redefines default fields) partitionlower_OVERVIEW_FMT_ALTERNATIVESgetr)_DEFAULT_OVERVIEW_FMTlenr )rfmtlinename_suffixdefaultsrrr_parse_overview_fmts    r=cCstt}g}x|D]}i}|jd^}}t|}xt|D]\} } | t|krPq:|| } | jd} | |kr| r| d} | r| dt| j| krtd| r| t| dnd} | ||| <q:W|j||fqW|S)N r/z: z?OVER/XOVER response doesn't include names of additional headers) r6r5splitint enumerate startswithr2r r))rr7Zdata_process_funcZ n_defaultsZoverviewr8ZfieldsZarticle_numbertokensitokenZ field_nameZ is_metadatahrrr_parse_overviews&   rGcCs|dkr |dd}|dd }t|dd}t|dd}t|dd}t|dd }t|d d }t|d d}|dkr|d7}n|dkr|d7}tj||||||S)NFidiliirMrN)r@datetime)date_strtime_strZhoursZminutesZsecondsyearZmonthZdayrrr_parse_datetimes   rScCsPt|tjsd}n dj|}|j}|r<|d}dj||}n dj||}||fS)NZ000000z({0.hour:02d}{0.minute:02d}{0.second:02d}rLz{0:02d}{1.month:02d}{1.day:02d}z{0:04d}{1.month:02d}{1.day:02d})r(rOformatrR)ZdtlegacyrQyrPrrr_unparse_datetimes   rWcCs|dkrtj}|j||dS)N)Zserver_hostname)sslZ_create_stdlib_contextZ wrap_socket)sockcontextZhostnamerrr _encrypt_onsr[c@seZdZdZdZdefddZddZdd Zd d Z d d Z ddZ e Z ddZ ddZdhddZddZdiddZddZdjddZdkdd Zd!d"Zd#d$Zd%d&Zdd'd(d)Zdd'd*d+Zdldd'd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zdd'd6d7Zd8d9Z d:d;Z!dmdd?Z#d@dAZ$dndBdCZ%dodd'dDdEZ&dpdd'dFdGZ'dqdd'dHdIZ(dJdKZ)dd'dLdMZ*dd'dNdOZ+dd'dPdQZ,dd'dRdSZ-dTdUZ.dVdWZ/dXdYZ0dZd[Z1d\d]Z2d^d_Z3d`daZ4drdbdcZ5dddeZ6e7rdsdfdgZ8dS)t _NNTPBasezutf-8surrogateescapeNcCsj||_||_d|_|j|_d|_|jd|_|rZd|jkrZ|j|jsZd|_|jd|_ d|_ dS)NrFREADER) hostfile debugging_getrespwelcome_capsgetcapabilitiesreadermode_afterauth_setreadermodetls_on authenticated)rr`r_ readermodetimeoutrrrr 8s  z_NNTPBase.__init__cCs|S)Nr)rrrr __enter__gsz_NNTPBase.__enter__csRfdd}|rNz*y jWnttfk r8YnXWd|rLjXdS)Ncs tdS)Nr`)hasattrr)rrrksz$_NNTPBase.__exit__..)quitOSErrorEOFError_close)rrZ is_connectedr)rr__exit__js   z_NNTPBase.__exit__cCs|jrtdt|j|jS)Nz *welcome*)raprintreprrc)rrrr getwelcomeusz_NNTPBase.getwelcomec Cs|jdkrd|_d|_y|j\}}Wnttfk rDi|_Ynsz,_NNTPBase._longcmdstring..)rr)rr8r`r}listr)rr_longcmdstrings  z_NNTPBase._longcmdstringcCsby|jStk rYnXy|jd\}}Wn tk rNtdd}Yn Xt|}||_|S)NzLIST OVERVIEW.FMT)Z_cachedoverviewfmtAttributeErrorrrr5r=)rr}rr7rrr_getoverviewfmtsz_NNTPBase._getoverviewfmtcCsdd|DS)NcSsg|]}t|jqSr)rr?)rr8rrrr$sz(_NNTPBase._grouplist..r)rrrrr _grouplist"sz_NNTPBase._grouplistcCs<i}|jd\}}x |D]}|j^}}|||<qW||fS)NZ CAPABILITIES)rr?)rr~r}rr8r9rCrrrrz&s    z_NNTPBase.capabilities)r`cCsbt|tjtjfs$tdj|jjt||jdk\}}dj||}|j ||\}}||j |fS)NzAthe date parameter must be a date or datetime object, not '{:40}'rIzNEWGROUPS {0} {1}) r(rOr TypeErrorrT __class__rrWryrr)rrr`rPrQcmdr}rrrr newgroups4s  z_NNTPBase.newgroupscCsRt|tjtjfs$tdj|jjt||jdk\}}dj|||}|j ||S)NzAthe date parameter must be a date or datetime object, not '{:40}'rIzNEWNEWS {0} {1} {2}) r(rOrrrTrrrWryr)rrrr`rPrQrrrrnewnewsDs z_NNTPBase.newnewscCs4|dk rd|}nd}|j||\}}||j|fS)Nz LIST ACTIVE ZLIST)rr)r group_patternr`commandr}rrrrrTs  z_NNTPBase.listc Cstjd}|jd|\}}|jds8|jd|\}}i}x>|D]6}|j|j}|rB|jdd\} } |sp| S| || <qBW|r||fSdSdS)Nz^(?P[^ ]+)[ ]+(.*)$zLIST NEWSGROUPS rzXGTITLE r0rIr&)recompilerrBsearchstripr) rrZ return_allline_patr}rgroupsraw_linematchr9Zdescrrr_getdescriptionscs    z_NNTPBase._getdescriptionscCs |j|dS)NF)r)rrrrr descriptionzs z_NNTPBase.descriptioncCs |j|dS)NT)r)rrrrr descriptionssz_NNTPBase.descriptionscCs|jd|}|jds t||j}d}}}t|}|dkr|d}|dkr|d}|dkr|d}|dkr|dj}|t|t|t||fS)NzGROUP rrr0rIrrJ)rrBrr?r6r2r@)rr9r}wordscountr!r nrrrrs    z_NNTPBase.groupcCs |jd|S)NZHELP)r)rr`rrrhelpsz_NNTPBase.helpcCs8|jdst||j}t|d}|d}|||fS)NZ22r0rI)rBrr?r@)rr}rart_numr$rrr _statparses   z_NNTPBase._statparsecCs|j|}|j|S)N)rr)rr8r}rrr_statcmds z_NNTPBase._statcmdcCs"|r|jdj|S|jdSdS)NzSTAT {0}ZSTAT)rrT)r message_specrrrstats z_NNTPBase.statcCs |jdS)NZNEXT)r)rrrrnextsz_NNTPBase.nextcCs |jdS)NZLAST)r)rrrrr sz_NNTPBase.lastcCs0|j||\}}|j|\}}}|t|||fS)N)rrr#)rr8r`r}rrr$rrr_artcmdsz_NNTPBase._artcmdcCs$|dk rdj|}nd}|j||S)NzHEAD {0}ZHEAD)rTr)rrr`rrrrheads z_NNTPBase.headcCs$|dk rdj|}nd}|j||S)NzBODY {0}ZBODY)rTr)rrr`rrrrbodys z_NNTPBase.bodycCs$|dk rdj|}nd}|j||S)Nz ARTICLE {0}ZARTICLE)rTr)rrr`rrrrarticles z_NNTPBase.articlecCs |jdS)NZSLAVE)r)rrrrslavesz_NNTPBase.slavecsDtjd|jdj|||\}}fdd|fdd|DfS)Nz^([0-9]+) ?(.*) ?z XHDR {0} {1}csj|}|r|jddS|S)Nr0rI)rr)r8m)patrr remove_numbers z%_NNTPBase.xhdr..remove_numbercsg|] }|qSrr)rr8)rrrrsz"_NNTPBase.xhdr..)rrrrT)rZhdrrr`r}rr)rrrxhdr s  z_NNTPBase.xhdrcCs.|jdj|||\}}|j}|t||fS)Nz XOVER {0}-{1})rrTrrG)rstartendr`r}rr7rrrxovers  z_NNTPBase.xoverc Csxd|jkrdnd}t|ttfr>|\}}|dj||p6d7}n|dk rR|d|}|j||\}}|j}|t||fS)NZOVERZXOVERz {0}-{1}r&rx)rdr(tuplerrTrrrG) rrr`rrrr}rr7rrrover(s z_NNTPBase.overc Csjtjdtdtjd}|jd||\}}g}x0|D](}|j|j}|r6|j|j ddq6W||fS)NzFThe XGTITLE extension is not actively used, use descriptions() insteadrIz^([^ ]+)[ ]+(.*)$zXGTITLE r0) warningswarnDeprecationWarningrrrrrr)r) rrr`rr}Z raw_linesrrrrrrxgtitleCs  z_NNTPBase.xgtitlec Csjtjdtd|jdj|}|jds0t|y|j\}}Wntk r\t|Yn X||fSdS)Nz(The XPATH extension is not actively usedrIz XPATH {0}Z223) rrrrrTrBrr? ValueError)ridr}Zresp_numpathrrrxpathUs z_NNTPBase.xpathcCsb|jd}|jdst||j}t|dkr8t||d}t|dkrTt||t|dfS)NZDATEZ111rIr0)rrBrr?r6r rS)rr}elemrrrrris    z_NNTPBase.datecCs|j|}|jdst|t|ttfr2|j}xB|D]:}|jtsT|j dt}|jdrfd|}|j j |q8W|j j d|j j |j S)N3s rs. )rrBrr(r bytearray splitlinesendswithrrstripr`rrrb)rrfr}r8rrr_postzs       z_NNTPBase._postcCs |jd|S)NZPOST)r)rdatarrrpostsz_NNTPBase.postcCs|jdj||S)Nz IHAVE {0})rrT)rr$rrrrihavesz_NNTPBase.ihavecCs|jj|`dS)N)r`r)rrrrrrs z_NNTPBase._closec Csz|jd}Wd|jX|S)NZQUIT)rrr)rr}rrrros z_NNTPBase.quitc Cs|jrtd| r"| r"tdy>|r^| r^ddl}|j}|j|j}|r^|d}|d}Wntk rtYnX|s~dS|jd|}|jdr|st|n |jd|}|jdst |d|_ |j |j rd |j kr|j d|_ |j dS) NzAlready logged in.z7At least one of `user` and `usenetrc` must be specifiedrrIzauthinfo user Z381zauthinfo pass Z281r^)rirnetrcZauthenticatorsr_rprrBrrrdrerfrg)ruserpasswordusenetrcrZ credentialsZauthr}rrrlogins<       z_NNTPBase.logincCs`y|jd|_WnJtk r$Yn8tk rZ}z|jjdrHd|_nWYdd}~XnXdS)Nz mode readerZ480T)rrcrrr rBrf)rerrrrgs z_NNTPBase._setreadermodecCs||jrtd|jrtd|jd}|jdrp|jjt|j||j |_|jj d|_d|_d|_ |j nt ddS)NzTLS is already enabled.z+TLS cannot be started after authentication.STARTTLSZ382rwbTzTLS failed to start.)rhrrirrBr`rr[rYr_makefilerdrer)rrZr}rrrstarttlss    z_NNTPBase.starttls)T)N)N)N)N)N)N)N)N)N)NNT)N)9rrrrrrr rlrsrvrerdebugrrrrbrrrrrrrzrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrorrg _have_sslrrrrrr\(sj .    .         ) r\c@s*eZdZeddddefddZddZdS)rNFc Cs||_||_tj||f||_d}y8|jjd}tj||||||sJ|rX|j|||Wn$|rn|j |jj YnXdS)Nr) r_portsocketcreate_connectionrYrr\r rr) rr_rrrrjrrkr`rrrr s   z NNTP.__init__c Cs ztj|Wd|jjXdS)N)r\rrrYr)rrrrrr!sz NNTP._close)rrr NNTP_PORTrr rrrrrrrs "c@s,eZdZedddddefddZddZdS)NNTP_SSLNFc Cstj||f||_d} yJt|j|||_|jjd} tj|| |||d|sP|r^|j|||Wn$| rt| j|jjYnXdS)Nr)rjrk) rrrYr[rr\r rr) rr_rrrZ ssl_contextrjrrkr`rrrr +s    zNNTP_SSL.__init__c Cs ztj|Wd|jjXdS)N)r\rrrYr)rrrrrrAszNNTP_SSL._close)rrr NNTP_SSL_PORTrr rrrrrrr)s  r__main__zJ nntplib built-in demo - display the latest articles in a newsgroup)rz-gz--groupzgmane.comp.python.generalz3group to fetch messages from (default: %(default)s))defaultrz-sz--serverznews.gmane.orgz+NNTP server hostname (default: %(default)s)z-pz--portr0z#NNTP port number (default: %s / %s))rtyperz-nz --nb-articles z2number of articles to fetch (default: %(default)s)z-Sz--ssl store_truezuse NNTP over SSL)actionrr)r_rrZGroupZhaszarticles, rangeZtocCs$t||kr |d|dd}|S)NrJz...)r6)sZlimrrrcutls rBs          X-