3 \F@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/usr/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_suffixZdefaultsrrr_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&   rFcCs|dkr |dd}|dd }t|dd}t|dd}t|dd}t|dd }t|d d }t|d d}|dkr|d7}n|dkr|d7}tj||||||S)NFidiliirLrM)r?datetime)date_strtime_strZhoursZminutesZsecondsyearZmonthZdayrrr_parse_datetimes   rRcCsPt|tjsd}n dj|}|j}|r<|d}dj||}n dj||}||fS)NZ000000z({0.hour:02d}{0.minute:02d}{0.second:02d}rKz{0:02d}{1.month:02d}{1.day:02d}z{0:04d}{1.month:02d}{1.day:02d})r(rNformatrQ)ZdtZlegacyrPyrOrrr_unparse_datetimes   rUcCs|dkrtj}|j||dS)N)Zserver_hostname)sslZ_create_stdlib_contextZ wrap_socket)sockcontextZhostnamerrr _encrypt_onsrYc@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*)r_printreprra)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{rr8r9rBrrrrx&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}'rHzNEWGROUPS {0} {1}) r(rNr TypeErrorrS __class__rrUrwrr)rrr^rOrPcmdr{rrrr newgroups4s  z_NNTPBase.newgroupscCsRt|tjtjfs$tdj|jjt||jdk\}}dj|||}|j ||S)NzAthe date parameter must be a date or datetime object, not '{:40}'rHzNEWNEWS {0} {1} {2}) r(rNrrrSrrrUrwr)rrrr^rOrPrrrrnewnewsDs 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 r0rHr&)recompilerrAsearchstripr) 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 rrr0rHrrI)rrArr>r6r2r?)rr9r{wordscountr!r nrrrrs    z_NNTPBase.groupcCs |jd|S)NZHELP)r)rr^rrrhelpsz_NNTPBase.helpcCs8|jdst||j}t|d}|d}|||fS)NZ22r0rH)rArr>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)rrS)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)rSr)rrr^rrrrheads z_NNTPBase.headcCs$|dk rdj|}nd}|j||S)NzBODY {0}ZBODY)rSr)rrr^rrrrbodys z_NNTPBase.bodycCs$|dk rdj|}nd}|j||S)Nz ARTICLE {0}ZARTICLE)rSr)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)Nr0rH)rr)r8m)patrr remove_numbers z%_NNTPBase.xhdr..remove_numbercsg|] }|qSrr)rr8)rrrrsz"_NNTPBase.xhdr..)rrrrS)rZhdrrr^r{rr)rrrxhdr s  z_NNTPBase.xhdrcCs.|jdj|||\}}|j}|t||fS)Nz XOVER {0}-{1})rrSrrF)rstartendr^r{rr7rrrxovers  z_NNTPBase.xoverc Csxd|jkrdnd}t|ttfr>|\}}|dj||p6d7}n|dk rR|d|}|j||\}}|j}|t||fS)NZOVERZXOVERz {0}-{1}r&rv)rbr(tuplerrSrrrF) 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() insteadrHz^([^ ]+)[ ]+(.*)$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 usedrHz XPATH {0}Z223) rrrrrSrArr> ValueError)ridr{Zresp_numpathrrrxpathUs z_NNTPBase.xpathcCsb|jd}|jdst||j}t|dkr8t||d}t|dkrTt||t|dfS)NZDATEZ111rHr0)rrArr>r6r rR)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. )rrArr(r bytearray splitlinesendswithrrstripr^rrr`)rrfr{r8rrr_postzs       z_NNTPBase._postcCs |jd|S)NZPOST)r)rdatarrrpostsz_NNTPBase.postcCs|jdj||S)Nz IHAVE {0})rrS)rr$rrrrihavesz_NNTPBase.ihavecCs|jj|`dS)N)r^r)rrrrrps z_NNTPBase._closec Csz|jd}Wd|jX|S)NZQUIT)rrp)rr{rrrrms 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 specifiedrrHzauthinfo user Z381zauthinfo pass Z281r\)rgrnetrcZauthenticatorsr]rnrrArrrbrcrdre)ruserpasswordusenetrcrZ credentialsZauthr{rrrlogins<       z_NNTPBase.logincCs`y|jd|_WnJtk r$Yn8tk rZ}z|jjdrHd|_nWYdd}~XnXdS)Nz mode readerZ480T)rrarrr rArd)rerrrres 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.)rfrrgrrAr^rrYrWr]makefilerbrcr)rrXr{rrrstarttlss    z_NNTPBase.starttls)T)N)N)N)N)N)N)N)N)N)NNT)N)9rrrrrrr rjrqrtrcr~debugrrrr`rrrrrrrxrrrrrrrrrrrrr rrrrrrrrrrrrrrrprmrre _have_sslrrrrrrZ(sj .    .         ) rZc@s*eZdZeddddefddZddZdS)rNFc Cs||_||_tj||f||_d}y8|jjd}tj||||||sJ|rX|j|||Wn$|rn|j |jj YnXdS)Nr) r]portsocketcreate_connectionrWrrZr rr) rr]rrrrhrrir^rrrr s   z NNTP.__init__c Cs ztj|Wd|jjXdS)N)rZrprWr)rrrrrp!sz NNTP._close)rrr NNTP_PORTrr rprrrrrs "c@s,eZdZedddddefddZddZdS)NNTP_SSLNFc Cstj||f||_d} yJt|j|||_|jjd} tj|| |||d|sP|r^|j|||Wn$| rt| j|jjYnXdS)Nr)rhri) rrrWrYrrZr rr) rr]rrrZ ssl_contextrhrrir^rrrr +s    zNNTP_SSL.__init__c Cs ztj|Wd|jjXdS)N)rZrprWr)rrrrrpAszNNTP_SSL._close)rrr NNTP_SSL_PORTrr rprrrrr)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)NrIz...)r6)sZlimrrrcutls rZauthorrrrSrmrrrrBs          X-