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,/opt/alt/python39/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> Z225Z222Z224Z220211Z101Z231Z282Z221Z100Z230215)subjectfromdatez message-idZ references:bytes:linesrr)byteslines GroupInfo)grouplastfirstflag ArticleInfo)Znumber 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    rAcCstt}g}|D]}i}|d^}}t|}t|D]\} } | t|krLq6|| } | d} | |kr| s| d} | r| dt| | krtd| r| t| dnd} | ||| <q6|||fq|S)N r3z: z?OVER/XOVER response doesn't include names of additional headers) r:r9splitint enumerate startswithr6r r-)r r;Zdata_process_funcZ n_defaultsZoverviewr<fieldsZarticle_numbertokensitoken field_nameZ is_metadatahrrr_parse_overviews&   rMcCs|dur |dd}|dd}t|dd}t|dd}t|dd}t|dd}t|dd}t|dd}|dkr|d7}n|dkr|d 7}t||||||S) NiFidil)rDdatetime)date_strtime_strZhoursZminutesZsecondsyearZmonthZdayrrr_parse_datetimes   rXcCsPt|tjsd}n d|}|j}|r<|d}d||}n d||}||fS)NZ000000z({0.hour:02d}{0.minute:02d}{0.second:02d}rSz{0:02d}{1.month:02d}{1.day:02d}z{0:04d}{1.month:02d}{1.day:02d})r,rTformatrW)ZdtZlegacyrVyrUrrr_unparse_datetimes   r[cCs|durt}|j||dS)N)Zserver_hostname)sslZ_create_stdlib_contextZ wrap_socket)sockcontextZhostnamerrr _encrypt_onsr_c@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)rrbrcuserpassword readermodeusenetrctimeoutrrrr 8s    z NNTP.__init__cCs^d|_||_d|_|d|_|rNd|jvrN||jsNd|_|d|_d|_dS)NrFREADER) debugging_getrespwelcome_capsgetcapabilitiesreadermode_afterauth_setreadermodetls_on authenticated)rrlrrrrg[s  zNNTP._base_initcCs|SNrrrrr __enter__}szNNTP.__enter__c s^fdd}|rZz6z Wnttfy6Yn0W|rZn|rX0dS)Ncs tdS)Nre)hasattrrrzrrzNNTP.__exit__..)quitOSErrorEOFError_close)rrZ is_connectedrrzr__exit__s   z NNTP.__exit__cCs<|dur|stdtd||j|jt|j|jf|S)Nz0Non-blocking socket (timeout=0) is not supportedznntplib.connect) ValueErrorsysauditrbrcsocketZcreate_connection)rrnrrrrds zNNTP._create_socketcCs|jrtdt|j|jS)Nz *welcome*)rpprintreprrrrzrrr getwelcomeszNNTP.getwelcomec Cs|jdur~d|_d|_z|\}}WnttfyBi|_Yn<0||_d|vrfttt|d|_d|vr~d |d|_|jS)Nr4ZVERSIONZIMPLEMENTATION ) rs nntp_versionZnntp_implementation capabilitiesrrmaxmaprDr/)rrespcapsrrrrts  zNNTP.getcapabilitiescCs ||_dSry)rp)rlevelrrrset_debuglevelszNNTP.set_debuglevelcCsHtd|||t}|jdkr.tdt||j||jdS)Nznntplib.putliner4z*put*) rr_CRLFrprrrewriteflushrr<rrr_putlines  z NNTP._putlinecCs2|jrtdt|||j|j}||dS)Nz*cmd*)rprrencodeencodingerrorsrrrrr_putcmdsz NNTP._putcmdTcCs|jtd}t|tkr$td|jdkr+sz'NNTP._longcmdstring..r)rr<rerlistrrzr_longcmdstring$s   zNNTP._longcmdstringcCs`z|jWStyYn0z|d\}}WntyLtdd}Yn 0t|}||_|S)NzLIST OVERVIEW.FMT)Z_cachedoverviewfmtAttributeErrorrrr9rA)rrr r;rrr_getoverviewfmt.s  zNNTP._getoverviewfmtcCsdd|DS)NcSsg|]}t|qSr)r"rCrrrrrAr~z#NNTP._grouplist..r)rr rrr _grouplist?szNNTP._grouplistcCs8i}|d\}}|D]}|^}}|||<q||fS)NZ CAPABILITIES)rrC)rrrr r<r=rHrrrrCs   zNNTP.capabilities)recCsbt|tjtjfs$td|jjt||jdk\}}d||}| ||\}}|| |fS)NAthe date parameter must be a date or datetime object, not '{:40}'rNzNEWGROUPS {0} {1}) r,rTr TypeErrorrY __class__rr[rrr)rrrerUrVcmdrr rrr newgroupsQs zNNTP.newgroupscCsRt|tjtjfs$td|jjt||jdk\}}d|||}| ||S)NrrNzNEWNEWS {0} {1} {2}) r,rTrrrYrrr[rr)rr#rrerUrVrrrrnewnewsasz NNTP.newnewscCs4|durd|}nd}|||\}}|||fS)Nz LIST ACTIVE ZLIST)rr)r group_patternrecommandrr rrrrqs  z NNTP.listc Cstd}|d|\}}|ds8|d|\}}i}|D]:}||}|r@|dd\} } |sr| S| || <q@|r||fSdSdS)Nz^(?P[^ ]+)[ ]+(.*)$zLIST NEWSGROUPS rzXGTITLE r4rNr*)recompilerrFsearchstripr#) 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 rrr4rNrrO)rrFrrCr:r6rD)rr=rwordscountr%r$nrrrr#s    z NNTP.groupcCs |d|S)NZHELP)r)rrerrrhelpsz NNTP.helpcCs8|dst||}t|d}|d}|||fS)NZ22r4rN)rFrrCrD)rrrart_numr(rrr _statparses   zNNTP._statparsecCs||}||Sry)rr)rr<rrrr_statcmds z NNTP._statcmdcCs"|r|d|S|dSdS)NzSTAT {0}ZSTAT)rrY)r message_specrrrstats z NNTP.statcCs |dS)NZNEXTrrzrrrnextsz NNTP.nextcCs |dS)NZLASTrrzrrrr$sz NNTP.lastcCs0|||\}}||\}}}|t|||fSry)rrr')rr<rerr rr(rrr_artcmdsz NNTP._artcmdcCs$|durd|}nd}|||S)NzHEAD {0}ZHEADrYrrrrerrrrheads z NNTP.headcCs$|durd|}nd}|||S)NzBODY {0}ZBODYrrrrrbodys z NNTP.bodycCs$|durd|}nd}|||S)Nz ARTICLE {0}ZARTICLErrrrrarticles z NNTP.articlecCs |dS)NZSLAVE)rrzrrrslave!sz NNTP.slavecsDtd|d|||\}}fdd|fdd|DfS)Nz^([0-9]+) ?(.*) ?z XHDR {0} {1}cs|}|r|ddS|S)Nr4rN)rr#)r<m)patrr remove_number2s z NNTP.xhdr..remove_numbercsg|] }|qSrrr)rrrr5r~zNNTP.xhdr..)rrrrY)rZhdrrrerr r)rrrxhdr's  z NNTP.xhdrcCs.|d|||\}}|}|t||fS)Nz XOVER {0}-{1})rrYrrM)rstartendrerr r;rrrxover7s z NNTP.xoverc Csxd|jvrdnd}t|ttfr>|\}}|d||p6d7}n|durR|d|}|||\}}|}|t||fS)NZOVERZXOVERz {0}-{1}r*r)rsr,tuplerrYrrrM) rrrerrrrr r;rrroverEs z NNTP.overcCsb|d}|dst||}t|dkr8t||d}t|dkrTt||t|dfS)NZDATEZ111rNr4)rrFrrCr:r rX)rrelemrrrrr`s    z NNTP.datecCs||}|dst|t|ttfr2|}|D]:}|tsR| dt}|drdd|}|j |q6|j d|j | S)N3r!rs. )rrFrr,r bytearray splitlinesendswithrrstriprerrrq)rrfrr<rrr_postqs      z NNTP._postcCs |d|S)NZPOST)r)rdatarrrpostsz NNTP.postcCs|d||S)Nz IHAVE {0})rrY)rr(rrrrihavesz NNTP.ihavecCs4z"|jr|j|`W|jn |j0dSry)rerir]rzrrrrs  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 specifiedrrNzauthinfo user Z381zauthinfo pass Z281ro)rxrnetrcZauthenticatorsrbrrrFrrrsrtrurv)rrjrkrmrZ credentialsZauthrrrrrhs>      z NNTP.loginc Cs`z|d|_WnJty"Yn:tyZ}z"|jdrDd|_nWYd}~n d}~00dS)Nz mode readerZ480T)rrrrrr rFru)rerrrrvs  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.STARTTLSZ382raTzTLS failed to start.)rwrrxrrFrerir_r]rbrfrsrtr)rr^rrrrstarttlss    z NNTP.starttls)T)N)N)N)N)N)N)N)N)N)NNT)N):rrrrr NNTP_PORTrr rgr{rrdrrtrdebugrrrrqrrrrrrrrrrrrrr#rrrrrr$rrrrrrrrrrrrrrrhrv _have_sslrrrrrr(sp  #"     .         ) rcs8eZdZedddddeffdd ZfddZZS)NNTP_SSLNFc s"||_t|||||||dSry) ssl_contextsuperr ) rrbrcrjrkrrlrmrnrrrr szNNTP_SSL.__init__cs@t|}zt||j|j}Wn|Yn0|SdSry)rrdr_rrbri)rrnr]rrrrds zNNTP_SSL._create_socket)rrr NNTP_SSL_PORTrr rd __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)rbrcrZGroupZhaszarticles, rangetocCs$t||kr |d|dd}|S)NrOz...)r:)sZlimrrrcut3s rr4rBs           S