o ?Og? @s< ddlZddlZddlZddlZddlZzddlZWn ey&dZYnwdZddlm Z ddlm Z gdZ dZ Gdd d eZGd d d eZGd d d eZGdddeZGdddeZGdddeZdZdZhdZgdZdddZdZedgdZedgdZd d!Z d"d#ZdYd$d%ZdYd&d'Z dZd(d)Z!erd*d+Z"Gd,d-d-Z#erGd.d/d/e#Z$e %d/e&d0krddl'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-jse.d>kreZ.e#e-j/e.dJZ0ne.d>kr%eZ.e$e-j/e.dJZ0e01Z2dKe2vr9e03e04e-j4\Z5Z6Z7Z8Z9e:dLe9dMe6dNe7dOe8dPdQZ;ee7e8\Z5Z?e?D]-\Z@ZAe eAdSBdTdRdZCe eAdUZDe+eAdZEe:dVFe@e;eCdWe;eDdXeEqhe0GdSdS)[NFT) decode_header)_GLOBAL_DEFAULT_TIMEOUT)NNTP NNTPErrorNNTPReplyErrorNNTPTemporaryErrorNNTPPermanentErrorNNTPProtocolError NNTPDataErrorric@seZdZ ddZdS)rcGs>tj|g|Rz|d|_WdStyd|_YdSw)NrzNo response given) Exception__init__response IndexError)selfargsr./opt/alt/python310/lib64/python3.10/nntplib.pyr bs   zNNTPError.__init__N)__name__ __module__ __qualname__r rrrrr`s rc@eZdZ dS)rNrrrrrrrrirc@r)rNrrrrrrmrrc@r)rNrrrrrrqrrc@r)r Nrrrrrr urr c@r)r Nrrrrrr yrr wi3> 215211Z100Z220Z282Z225Z224Z230Z221Z231Z222Z101)subjectfromdatez message-idZ references:bytes:linesrr )byteslines GroupInfo)grouplastfirstflag ArticleInfo)Znumber message_idr"cCsL g}t|D]\}}t|tr|||pdq||qd|S)Nascii)_email_decode_header isinstancer!appenddecodejoin)Z header_strpartsvencrrrrs   rcCs g}|D]0}|ddkr|ddd\}}}d|}n|d\}}}|}t||}||qt}t|t|krDtd|dt||krRtd|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     rCcCs tt}g}|D]]}i}|d^}}t|}t|D]B\} } | t|kr'q|| } | d} | |krX| sX| d} | rL| dt| | krLtd| rV| t| dnd} | ||| <q|||fq |S)N r5z: z?OVER/XOVER response doesn't include names of additional headers) r<r;splitint enumerate startswithr8r r/)r"r=Zdata_process_funcZ n_defaultsZoverviewr>ZfieldsZarticle_numbertokensitokenZ field_nameZ is_metadatahrrr_parse_overviews(   rMcCs |dur|dd}|dd}t|dd}t|dd}t|dd}t|dd}t|dd}t|dd}|dkrJ|d7}n|dkrR|d 7}t||||||S) NiFidil)rFdatetime)date_strtime_strZhoursZminutesZsecondsyearZmonthZdayrrr_parse_datetimes   rXcCsX t|tjs d}nd|}|j}|r"|d}d||}||fSd||}||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 |dur t}|j||dS)N)Zserver_hostname)sslZ_create_stdlib_contextZ wrap_socket)sockcontextZhostnamerrr _encrypt_onsr_c@s eZdZdZdZeddddefddZddZd d Z d d Z d dZ ddZ ddZ ddZeZddZddZdiddZddZdjddZd d!Zdjd"d#Zdjd$d%Zd&d'Zd(d)Zd*d+Zdd,d-d.Zdd,d/d0Zdjdd,d1d2Zd3d4Zd5d6Zd7d8Z d9d:Z!dd,d;d<Z"d=d>Z#d?d@Z$djdAdBZ%dCdDZ&dEdFZ'djdGdHZ(djdd,dIdJZ)djdd,dKdLZ*djdd,dMdNZ+dOdPZ,dd,dQdRZ-dd,dSdTZ.dd,dUdVZ/dWdXZ0dYdZZ1d[d\Z2d]d^Z3d_d`Z4dadbZ5dkdcddZ6dedfZ7e8rdjdgdhZ9dSdS)lrzutf-8surrogateescapeNFcCs~ ||_||_|||_d|_z|jd|_|||s!|r+||||WdSWdS|jr9|j|j)Nrwb) hostport_create_socketr]filemakefile _base_initloginclose)rrbrcuserpassword readermodeusenetrctimeoutrrrr 8s     z NNTP.__init__cCs` d|_||_d|_|d|_|r(d|jvr(||js(d|_|d|_d|_dS)NrFREADER) debugging_getrespwelcome_capsgetcapabilitiesreadermode_afterauth_setreadermodetls_on authenticated)rrlrrrrg[s   zNNTP._base_initcCs|SNrrrrr __enter__}szNNTP.__enter__c sffdd}|r1zzWn ttfyYnwW|r&dSdS|r0wwdS)Ncs tdS)Nre)hasattrrrzrrs zNNTP.__exit__..)quitOSErrorEOFError_close)rrZ is_connectedrrzr__exit__s    z NNTP.__exit__cCs<|dur |s tdtd||j|jt|j|jf|S)Nz0Non-blocking socket (timeout=0) is not supportedznntplib.connect) ValueErrorsysauditrbrcsocketZcreate_connection)rrnrrrrds zNNTP._create_socketcCs |jr tdt|j|jS)Nz *welcome*)rpprintreprrrrzrrr getwelcomeszNNTP.getwelcomec Cs |jdurBd|_d|_z|\}}Wnttfy$i|_Y|jSw||_d|vr6ttt|d|_d|vrBd |d|_|jS)Nr6ZVERSIONZIMPLEMENTATION ) rs nntp_versionZnntp_implementation capabilitiesrrmaxmaprFr1)rrespcapsrrrrts   zNNTP.getcapabilitiescCs ||_dSry)rp)rlevelrrrset_debuglevels zNNTP.set_debuglevelcCsJ td|||t}|jdkrtdt||j||jdS)Nznntplib.putliner6z*put*) rr_CRLFrprrrewriteflushrr>rrr_putlines  z NNTP._putlinecCs4 |jr tdt|||j|j}||dS)Nz*cmd*)rprrencodeencodingerrorsrrrrr_putcmdsz NNTP._putcmdTcCs |jtd}t|tkrtd|jdkrtdt||s#t|rC|ddt kr5|dd}|S|ddt vrC|dd}|S)Nr6z line too longz*get*rQ) rereadline_MAXLINEr<r rprrrr)rZ strip_crlfr>rrr_getlines    z NNTP._getlinecCsn |}|jrtdt|||j|j}|dd}|dkr%t||dkr-t||dvr5t ||S)Nz*resp*r645Z123) rrprrr0rrrrr )rrcrrrrqs z NNTP._getrespcCs d}zot|ttfrt|d}}|}|ddtvr"t|g}|durKdtdf} |d}||vr9n| drD|dd}| |q/nd} |}||krWn| drb|dd}| |qNW|ro| ||fS|rz| ww)Nwb.s. r6Fs..) r.strr!openrq _LONGRESPrrrrHrr/ri)rreZ openedFilerr"Z terminatorsr> terminatorrrr _getlongrespsH          zNNTP._getlongrespcCs |||Sry)rrqrrrr _shortcmds zNNTP._shortcmdcCs ||||Sryrr)rr>rerrr_longcmds  z NNTP._longcmdcs0 ||\}}|fdd|DfS)Ncsg|] }|jjqSr)r0rr.0r>rzrr +sz'NNTP._longcmdstring..r)rr>rerlistrrzr_longcmdstring$s   zNNTP._longcmdstringcCsb z|jWStyYnwz |d\}}Wnty'tdd}Ynwt|}||_|S)NzLIST OVERVIEW.FMT)Z_cachedoverviewfmtAttributeErrorrrr;rC)rrr"r=rrr_getoverviewfmt.s  zNNTP._getoverviewfmtcCsdd|DS)NcSsg|]}t|qSr)r$rErrrrrAsz#NNTP._grouplist..r)rr"rrr _grouplist?szNNTP._grouplistcCs: i}|d\}}|D] }|^}}|||<q ||fS)NZ CAPABILITIES)rrE)rrrr"r>r?rIrrrrCs  zNNTP.capabilities)recCsd t|tjtjfstd|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.newgroupscCsT t|tjtjfstd|jjt||jdk\}}d|||}| ||S)NrrNzNEWNEWS {0} {1} {2}) r.rTrrrYrrr[rr)rr%rrerUrVrrrrnewnewsas  z NNTP.newnewscCs6 |dur d|}nd}|||\}}|||fS)Nz LIST ACTIVE ZLIST)rr)r group_patternrecommandrr"rrrrqs  z NNTP.listc Cstd}|d|\}}|ds|d|\}}i}|D]}||}|r=|dd\} } |s9| S| || <q |rD||fSdS)Nz^(?P[^ ]+)[ ]+(.*)$zLIST NEWSGROUPS rzXGTITLE r6rNr,)recompilerrHsearchstripr%) rrZ return_allZline_patrr"groupsZraw_linematchr?Zdescrrr_getdescriptionss  zNNTP._getdescriptionscC ||dS)NFr)rr%rrr descriptions zNNTP.descriptioncCr)NTr)rrrrr descriptionss zNNTP.descriptionscCs |d|}|dst||}d}}}t|}|dkrA|d}|dkrA|d}|dkrA|d}|dkrA|d}|t|t|t||fS)NzGROUP rrr6rNrrO)rrHrrEr<r8rF)rr?rwordscountr'r&nrrrr%s    z NNTP.groupcC |d|S)NZHELP)r)rrerrrhelps z NNTP.helpcCs: |ds t||}t|d}|d}|||fS)NZ22r6rN)rHrrErF)rrrart_numr*rrr _statparses   zNNTP._statparsecCs ||}||Sry)rr)rr>rrrr_statcmds  z NNTP._statcmdcCs |r |d|S|dS)NzSTAT {0}ZSTAT)rrY)r message_specrrrstats z NNTP.statcC |dS)NZNEXTrrzrrrnext z NNTP.nextcCr)NZLASTrrzrrrr&rz NNTP.lastcCs2 |||\}}||\}}}|t|||fSry)rrr))rr>rerr"rr*rrr_artcmdsz NNTP._artcmdcC& |dur d|}nd}|||S)NzHEAD {0}ZHEADrYrrrrerrrrhead   z NNTP.headcCr)NzBODY {0}ZBODYrrrrrbodyrz NNTP.bodycCr)Nz ARTICLE {0}ZARTICLErrrrrarticlerz NNTP.articlecCr)NZSLAVE)rrzrrrslave!s z NNTP.slavecsF td|d|||\}}fdd|fdd|DfS)Nz^([0-9]+) ?(.*) ?z XHDR {0} {1}cs|}|r |ddS|S)Nr6rN)rr%)r>m)patrr remove_number2s z NNTP.xhdr..remove_numbercsg|]}|qSrrr)rrrr5szNNTP.xhdr..)rrrrY)rZhdrrrerr"r)rrrxhdr's   z NNTP.xhdrcCs0 |d|||\}}|}|t||fS)Nz XOVER {0}-{1})rrYrrM)rstartendrerr"r=rrrxover7s z NNTP.xoverc Csz d|jvrdnd}t|ttfr |\}}|d||pd7}n |dur*|d|}|||\}}|}|t||fS)NZOVERZXOVERz {0}-{1}r,r)rsr.tuplerrYrrrM) rrrerrrrr"r=rrroverEs z NNTP.overcCsd |d}|dst||}t|dkrt||d}t|dkr+t||t|dfS)NZDATEZ111rNr6)rrHrrEr<r rX)rrelemrrrrr`s    z NNTP.datecCs||}|dst|t|ttfr|}|D]}|ts)| dt}|dr2d|}|j |q|j d|j | S)N3r#rs. )rrHrr.r! bytearray splitlinesendswithrrstriprerrrq)rrfrr>rrr_postqs      z NNTP._postcCr)NZPOST)r)rdatarrrposts z NNTP.postcCs |d||S)Nz IHAVE {0})rrY)rr*rrrrihavesz NNTP.ihavecCsBz|jr|j|`W|jdSW|jdS|jwry)rerir]rzrrrrs z NNTP._closecCs& z |d}W||S|w)NZQUIT)rr)rrrrrr~s   z NNTP.quitcCs|jrtd|s|stdz|r,|s,ddl}|}||j}|r,|d}|d}Wn ty6Ynw|s;dS|d|}|dr]|sMt||d|}|ds]t |d|_ | |j ryd |j vr{| d|_ | dSdSdS) NzAlready logged in.z7At least one of `user` and `usenetrc` must be specifiedrrNzauthinfo user Z381zauthinfo pass Z281ro)rxrnetrcZauthenticatorsrbrrrHrrrsrtrurv)rrjrkrmrZ credentialsZauthrrrrrhsD     z NNTP.loginc Csbz |d|_WdStyYdSty0}z|jdr$d|_nWYd}~dSd}~ww)Nz mode readerZ480T)rrrrrr rHru)rerrrrvs  zNNTP._setreadermodecCs| |jrtd|jrtd|d}|dr:|jt|j||j |_|j d|_d|_d|_ | dSt d)NzTLS is already enabled.z+TLS cannot be started after authentication.STARTTLSZ382raTzTLS failed to start.)rwrrxrrHrerir_r]rbrfrsrtr)rr^rrrrstarttlss    z NNTP.starttls)Try)NNT):rrrrr NNTP_PORTrr rgr{rrdrrtrdebugrrrrqrrrrrrrrrrrrrr%rrrrrr&rrrrrrrrrrrrrr~rhrv _have_sslrrrrrr(st  #"    .         ) rcs8eZdZedddddeffdd ZfddZZS)NNTP_SSLNFc s$ ||_t|||||||dSry) ssl_contextsuperr ) rrbrcrjrkrrlrmrnrrrr s zNNTP_SSL.__init__cs4t|}z t||j|j}W|S|ry)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 r r6rsA         S