a DOg? @s:ddlZddlZddlZddlZddlZz ddlZWneyJdZYn0dZddlm Z ddlm Z gdZ dZ Gdd d eZGd d d eZGd d d eZGdddeZGdddeZGdddeZdZdZhdZgdZdddZdZedgdZedgdZd d!Z d"d#ZdYd$d%ZdZd&d'Z d[d(d)Z!erVd*d+Z"Gd,d-d-Z#erGd.d/d/e#Z$e %d/e&d0kr6ddl'Z'e'j(d1d2Z)e)j*d3d4d5d6d7e)j*d8d9d:d;d7e)j*de+d?eefd@e)j*dAdBdCe+dDd@e)j*dEdFdGddHdIe),Z-e-j.Z.e-js>e.d>kr.eZ.e#e-j/e.dJZ0ne.d>krLeZ.e$e-j/e.dJZ0e01Z2dKe2vrte03e04e-j4\Z5Z6Z7Z8Z9e:dLe9dMe6dNe7dOe8dPdQZ;ee7e8\Z5Z?e?D]Z\Z@ZAe eAdSBdTdRdZCe eAdUZDe+eAdZEe:dVFe@e;eCdWe;eDdXeEqe0GdS)\NFT) decode_header)_GLOBAL_DEFAULT_TIMEOUT)NNTP NNTPErrorNNTPReplyErrorNNTPTemporaryErrorNNTPPermanentErrorNNTPProtocolError NNTPDataErrorric@seZdZddZdS)rcGs>tj|g|Rz|d|_Wnty8d|_Yn0dS)NrzNo response given) Exception__init__response IndexError)selfargsr/usr/lib64/python3.9/nntplib.pyr bs  zNNTPError.__init__N)__name__ __module__ __qualname__r rrrrr`src@s eZdZdS)rNrrrrrrrrisrc@s eZdZdS)rNrrrrrrmsrc@s eZdZdS)rNrrrrrrqsrc@s eZdZdS)r Nrrrrrr usr c@s eZdZdS)r Nrrrrrr ysr wi3> Z100Z222Z101215Z224211Z230Z282Z231Z225Z220Z221)subjectfromdatez message-idZ references:bytes:linesrr)byteslines GroupInfo)grouplastfirstflag ArticleInfo)number message_idr cCsJg}t|D]2\}}t|tr4|||p,dq ||q d|S)Nascii)_email_decode_header isinstancerappenddecodejoin)Z header_strpartsvencrrrrs   rcCsg}|D]`}|ddkr:|ddd\}}}d|}n|d\}}}|}t||}||qt}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 )r fmtlinename_suffixdefaultsrrr_parse_overview_fmts    rBcCstt}g}|D]}i}|d^}}t|}t|D]\} } | t|krLq6|| } | d} | |kr| s| d} | r| dt| | krtd| r| t| dnd} | ||| <q6|||fq|S)N r4z: z?OVER/XOVER response doesn't include names of additional headers) r;r:splitint enumerate startswithr7r r.)r r<Zdata_process_funcZ n_defaultsZoverviewr=fieldsZarticle_numbertokensitoken field_nameZ is_metadatahrrr_parse_overviews&   rNcCs|dur |dd}|dd}t|dd}t|dd}t|dd}t|dd}t|dd}t|dd}|dkr|d7}n|dkr|d 7}t||||||S) NiFidil)rEdatetime)date_strtime_strZhoursZminutesZsecondsyearZmonthZdayrrr_parse_datetimes   rYcCsPt|tjsd}n d|}|j}|r<|d}d||}n d||}||fS)NZ000000z({0.hour:02d}{0.minute:02d}{0.second:02d}rTz{0:02d}{1.month:02d}{1.day:02d}z{0:04d}{1.month:02d}{1.day:02d})r-rUformatrX)ZdtlegacyrWyrVrrr_unparse_datetimes   r]cCs|durt}|j||dS)N)Zserver_hostname)sslZ_create_stdlib_contextZ wrap_socket)sockcontexthostnamerrr _encrypt_onsrbc@seZdZdZdZeddddefddZddZd d Z d d Z d dZ ddZ ddZ ddZeZddZddZdiddZddZdjddZd d!Zdkd"d#Zdld$d%Zd&d'Zd(d)Zd*d+Zdd,d-d.Zdd,d/d0Zdmdd,d1d2Zd3d4Zd5d6Zd7d8Z d9d:Z!dd,d;d<Z"d=d>Z#d?d@Z$dndAdBZ%dCdDZ&dEdFZ'dodGdHZ(dpdd,dIdJZ)dqdd,dKdLZ*drdd,dMdNZ+dOdPZ,dd,dQdRZ-dd,dSdTZ.dd,dUdVZ/dWdXZ0dYdZZ1d[d\Z2d]d^Z3d_d`Z4dadbZ5dsdcddZ6dedfZ7e8rdtdgdhZ9dS)urzutf-8surrogateescapeNFcCs~||_||_|||_d|_z2|jd|_|||s@|rN||||Wn(|jrh|j|jYn0dS)Nrwb) hostport_create_socketr_filemakefile _base_initloginclose)rrerfuserpassword readermodeusenetrctimeoutrrrr 8s    z NNTP.__init__cCs^d|_||_d|_|d|_|rNd|jvrN||jsNd|_|d|_d|_dS)NrFREADER) debugging_getrespwelcome_capsgetcapabilitiesreadermode_afterauth_setreadermodetls_on authenticated)rrorrrrj[s  zNNTP._base_initcCs|SNrrrrr __enter__}szNNTP.__enter__c s^fdd}|rZz6z Wnttfy6Yn0W|rZn|rX0dS)Ncs tdS)Nrh)hasattrrr}rrzNNTP.__exit__..)quitOSErrorEOFError_close)rrZ is_connectedrr}r__exit__s   z NNTP.__exit__cCs<|dur|stdtd||j|jt|j|jf|S)Nz0Non-blocking socket (timeout=0) is not supportedznntplib.connect) ValueErrorsysauditrerfsocketcreate_connection)rrqrrrrgs zNNTP._create_socketcCs|jrtdt|j|jS)Nz *welcome*)rsprintreprrur}rrr getwelcomeszNNTP.getwelcomec Cs|jdur~d|_d|_z|\}}WnttfyBi|_Yn<0||_d|vrfttt|d|_d|vr~d |d|_|jS)Nr5VERSIONZIMPLEMENTATION ) rv nntp_versionZnntp_implementation capabilitiesrrmaxmaprEr0)rrespcapsrrrrws  zNNTP.getcapabilitiescCs ||_dSr|)rs)rlevelrrrset_debuglevelszNNTP.set_debuglevelcCsHtd|||t}|jdkr.tdt||j||jdS)Nznntplib.putliner5z*put*) rr_CRLFrsrrrhwriteflushrr=rrr_putlines  z NNTP._putlinecCs2|jrtdt|||j|j}||dS)Nz*cmd*)rsrrencodeencodingerrorsrrrrr_putcmdsz NNTP._putcmdTcCs|jtd}t|tkr$td|jdkr+sz'NNTP._longcmdstring..r)rr=rhrlistrr}r_longcmdstring$s   zNNTP._longcmdstringcCs`z|jWStyYn0z|d\}}WntyLtdd}Yn 0t|}||_|S)NzLIST OVERVIEW.FMT)Z_cachedoverviewfmtAttributeErrorrrr:rB)rrr r<rrr_getoverviewfmt.s  zNNTP._getoverviewfmtcCsdd|DS)NcSsg|]}t|qSr)r"rDrrrrrArz#NNTP._grouplist..r)rr rrr _grouplist?szNNTP._grouplistcCs8i}|d\}}|D]}|^}}|||<q||fS)NZ CAPABILITIES)rrD)rrrr r=r>rIrrrrCs   zNNTP.capabilities)rhcCsbt|tjtjfs$td|jjt||jdk\}}d||}| ||\}}|| |fS)NAthe date parameter must be a date or datetime object, not '{:40}'rOzNEWGROUPS {0} {1}) r-rUr TypeErrorrZ __class__rr]rrr)rrrhrVrWcmdrr rrr newgroupsQs zNNTP.newgroupscCsRt|tjtjfs$td|jjt||jdk\}}d|||}| ||S)NrrOzNEWNEWS {0} {1} {2}) r-rUrrrZrrr]rr)rr#rrhrVrWrrrrnewnewsasz NNTP.newnewscCs4|durd|}nd}|||\}}|||fS)Nz LIST ACTIVE LIST)rr)r group_patternrhcommandrr rrrrqs  z NNTP.listc Cstd}|d|\}}|ds8|d|\}}i}|D]:}||}|r@|dd\} } |sr| S| || <q@|r||fSdSdS)Nz^(?P[^ ]+)[ ]+(.*)$zLIST NEWSGROUPS rzXGTITLE r5rOr+)recompilerrGsearchstripr#) rrZ return_allZline_patrr groupsZraw_linematchr>Zdescrrr_getdescriptionss   zNNTP._getdescriptionscCs ||dS)NFr)rr#rrr descriptions zNNTP.descriptioncCs ||dS)NTr)rrrrr descriptionsszNNTP.descriptionscCs|d|}|ds t||}d}}}t|}|dkr|d}|dkr|d}|dkr|d}|dkr|d}|t|t|t||fS)NzGROUP rrr5rOrrP)rrGrrDr;r7rE)rr>rwordscountr%r$nrrrr#s    z NNTP.groupcCs |d|S)NZHELP)r)rrhrrrhelpsz NNTP.helpcCs8|dst||}t|d}|d}|||fS)NZ22r5rO)rGrrDrE)rrrart_numr)rrr _statparses   zNNTP._statparsecCs||}||Sr|)rr)rr=rrrr_statcmds z NNTP._statcmdcCs"|r|d|S|dSdS)NzSTAT {0}ZSTAT)rrZ)r message_specrrrstats z NNTP.statcCs |dS)NZNEXTrr}rrrnextsz NNTP.nextcCs |dS)NZLASTrr}rrrr$sz NNTP.lastcCs0|||\}}||\}}}|t|||fSr|)rrr')rr=rhrr rr)rrr_artcmdsz NNTP._artcmdcCs$|durd|}nd}|||S)NzHEAD {0}ZHEADrZrrrrhrrrrheads z NNTP.headcCs$|durd|}nd}|||S)NzBODY {0}ZBODYrrrrrbodys z NNTP.bodycCs$|durd|}nd}|||S)Nz ARTICLE {0}ZARTICLErrrrrarticles z NNTP.articlecCs |dS)NZSLAVE)rr}rrrslave!sz NNTP.slavecsDtd|d|||\}}fdd|fdd|DfS)Nz^([0-9]+) ?(.*) ?z XHDR {0} {1}cs|}|r|ddS|S)Nr5rO)rr#)r=m)patrr remove_number2s z NNTP.xhdr..remove_numbercsg|] }|qSrrr)rrrr5rzNNTP.xhdr..)rrrrZ)rZhdrrrhrr r)rrrxhdr's  z NNTP.xhdrcCs.|d|||\}}|}|t||fS)Nz XOVER {0}-{1})rrZrrN)rstartendrhrr r<rrrxover7s z NNTP.xoverc Csxd|jvrdnd}t|ttfr>|\}}|d||p6d7}n|durR|d|}|||\}}|}|t||fS)NZOVERZXOVERz {0}-{1}r+r)rvr-tuplerrZrrrN) rrrhrrrrr r<rrroverEs z NNTP.overcCsb|d}|dst||}t|dkr8t||d}t|dkrTt||t|dfS)NZDATEZ111rOr5)rrGrrDr;r rY)rrelemrrrrr`s    z NNTP.datecCs||}|dst|t|ttfr2|}|D]:}|tsR| dt}|drdd|}|j |q6|j d|j | S)N3r!rs. )rrGrr-r bytearray splitlinesendswithrrstriprhrrrt)rrfrr=rrr_postqs      z NNTP._postcCs |d|S)NZPOST)r)rdatarrrpostsz NNTP.postcCs|d||S)Nz IHAVE {0})rrZ)rr)rrrrihavesz NNTP.ihavecCs4z"|jr|j|`W|jn |j0dSr|)rhrlr_r}rrrrs  z NNTP._closecCs&z|d}W|n |0|S)NZQUIT)rr)rrrrrrs z NNTP.quitcCs|jrtd|s|stdz<|rX|sXddl}|}||j}|rX|d}|d}WntylYn0|svdS|d|}|dr|st|n |d|}|dst |d|_ | |j rd |j vr| d|_ | dS) NzAlready logged in.z7At least one of `user` and `usenetrc` must be specifiedrrOzauthinfo user Z381zauthinfo pass Z281rr)r{rnetrcZauthenticatorsrerrrGrrrvrwrxry)rrmrnrprZ credentialsZauthrrrrrks>      z NNTP.loginc Cs`z|d|_WnJty"Yn:tyZ}z"|jdrDd|_nWYd}~n d}~00dS)Nz mode readerZ480T)rrurrr rGrx)rerrrrys  zNNTP._setreadermodecCs||jrtd|jrtd|d}|drp|jt|j||j |_|j d|_d|_d|_ | nt ddS)NzTLS is already enabled.z+TLS cannot be started after authentication.STARTTLSZ382rdTzTLS failed to start.)rzrr{rrGrhrlrbr_rerirvrwr)rr`rrrrstarttlss    z NNTP.starttls)T)N)N)N)N)N)N)N)N)N)NNT)N):rrrrr NNTP_PORTrr rjr~rrgrrwrdebugrrrrtrrrrrrrrrrrrrr#rrrrrr$rrrrrrrrrrrrrrrkry _have_sslrrrrrr(sp  #"     .         ) rcs8eZdZedddddeffdd ZfddZZS)NNTP_SSLNFc s"||_t|||||||dSr|) ssl_contextsuperr ) rrerfrmrnrrorprqrrrr szNNTP_SSL.__init__cs@t|}zt||j|j}Wn|Yn0|SdSr|)rrgrbrrerl)rrqr_rrrrgs zNNTP_SSL._create_socket)rrr NNTP_SSL_PORTrr rg __classcell__rrrrrs  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--serverz news.gmane.ioz+NNTP server hostname (default: %(default)s)z-pz--portrz#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)rerfrZGroupZhaszarticles, rangetocCs$t||kr |d|dd}|S)NrPz...)r;)sZlimrrrcut3s r r5rrr rZ nb_articlesrZ overviewsZartnumrrDZauthorrr rZrrrrrBs           S