^d] "ddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl Z ddl Z ddl Z ddl Z ddlZddlZddlmZdZdZdZ d3dZ GddeZd Zd ZGd d eZGd deZGddeZGddeZGddeZGddeZGddeeZ GddeZ!Gdde!eeeZ"Gdde!eeZ#Gdd e!eeZ$Gd!d"eZ%Gd#d$eZ&Gd%d&e&Z'Gd'd(e'Z(Gd)d*e&e!ee%eZ)Gd+d,e(e)Z*Gd-d.eZ+Gd/d0e+e'ee%eZ,Gd1d2e(e,Z-dS)4N)_ c|jsdS |s!! * L: ' ' ' H( ) ) ) ) ) * * x (&&& $%%%%%%  Q011CGG;<<<  sAA*C# C#ACC#c<tjtd|j|dztjd}d|_tjj|_ tj }|j dkr(t|||}d|d<d|d <|r|r|ntj|||d <|j|d <||| t)jgd |d dS#t.$r7}tjtd|j|dzYd}~dSd}~wwxYw)Nz Mailing %(address)s: %(subject)s)addresssubjectzutf-88bithtmlztext/html; charset=utf-8z Content-Typezauto-generatedzAuto-SubmittedSubjectTo)/usr/sbin/sendmailz-oiz-tT)inputcheckz.Failed to send mail to %(address)s: %(errmsg)s)rerrmsg)r infor email_addressemailcharsetCharset body_encodingQPheader_encodingmessageMessage email_formatrconvert_to_htmlisascii isprintableheaderHeader set_payload subprocessrunas_bytesrwarning)rchangesrr%r*rs r mail_changesr8>s K455$2%'''(((m##G,,G"G#m.Gm##%%G f$$v,,..w@@"< 0G %,__%6%6M7;N;N;P;PM''',|':':7G'L'L I(GDM )))(:::'BRBRBTBT\`aaaaaa (((qIJJ$*$8#%''' ( ( ( ( ( ( ( ( ((s-+E F$,FFctjds(|r$tjt d|zdS|js(|r$tjt d|zdSdS)Nrz9The mail frontend needs an installed 'sendmail', using %sFzDThe mail frontend needs an e-mail address to be configured, using %sT)ospathexistsr r rr#)rreplacementFrontends rcan_send_emailsr>Ys 7>>. / /  7 LVWW"56 7 7 7u    7 Labb"56 7 7 7u 4ceZdZdS)EUnknownFrontendN__name__ __module__ __qualname__r?rrArAjDr?rAc BdtdzdzdfdtdtDztdz}dD]} t ||}|snbt |dz cS#t$r;}tj td t|zYd }~d }~wwxYwtj td |j z|j S) z, Utility function used for testing purposes  z$Available apt-listchanges frontends:c0g|]}d|dz|fzS)z %d. %s rrF).0i frontendss r z$_select_frontend..ps+XXX!lAaC ! #55XXXr?rz*Choose a frontend by entering its number: )rr Error: %sNzUsing default frontend: %s) rjoinrangelen ttyconfirmttyaskintrr r rr"r)rrNpromptrMresponsers ` r_select_frontendr[ms8 A<== = D WWXXXXuQI?W?WXXX Y YZ ; < <=F33 3!&))0088H S]]1_- - - - 3 3 3 L;#b''1 2 2 2 2 2 2 2 2 3 K.//&/ABBB ?s)$B)B)) C.31C))C.c tttttt t ttddd }ddg}|j r=t|tt| }n|j}|dkrdS||vrn.|jdkrt!|rd}ndS|jdkr|dkst!|dsd}n|dkrt!|d sd }|d vrUd t"jvrG|d r |d dnd }t)jt-dd|iz|dkrs t/d}|j||<nX#t2$rK}|jr|jr d}d|_nd }t)jt-d||dzYd}~nd}~wwxYw||_||vrt:||||S)N) textpagerdebconfmailsysloglogbrowser xterm-pager xterm-browsergtknonerarbrgrPr`rr]r^)rfrdreDISPLAYzxterm-z1$DISPLAY is not set, falling back to %(frontend)srrfAptListChangesGtkFz|The gtk frontend needs a working python3-gi, but it cannot be loaded. Falling back to %(frontend)s. The error is: %(errmsg)s)rr!)text_frd pager_frd debconf_frdmail_frd syslog_frdlog_frd browser_frdxterm_pager_frdxterm_browser_frdselect_frontendr[sortedlistkeysrquietr>r:environ startswithr r r __import__gtk_frd ImportErrorapt_modefrontend_from_envrrA)rpackages_countrNfrontends_no_overridenamerfrs r make_frontendrs{#%(#'!)"1$5 " "I   tINN4D4D/E/E(F(FGG v~~t $$$     6 " " DD4    6>>!@!@>D 6>>/&'"B"B>D : : :yPRPZ?Z?Z#x88E488gD LNOO",t!45 6 6 6 5== D !455"%+ $ D D D?#v'?#"D%*FNN"D Q :;;04r"B"BCDDDDDDDD DFO 9 9T?6> 2 22sE// G9AF??Gc$eZdZfdZdZxZS)basecVt||_dSN)super__init__r)selfrargs __class__s rrz base.__init__s$  r?c|SrrFrr]s r_renderz base._renders r?)rCrDrErr __classcell__rs@rrrsGr?rc$eZdZfdZdZxZS)titledcBtj|d|_dS)Nzapt-listchanges output)rrtitlerrrs rrztitled.__init__s"$- r?c||_dSr)r)rrs r set_titleztitled.set_titles  r?)rCrDrErrrrs@rrrsG.....r?rc>eZdZfdZddZdZdZdZdZxZ S) rcZt||||_dSr)rrr)rrrrs rrzfrontend.__init__s+ 000,r?rcdSrrFrdiffs rupdate_progresszfrontend.update_progress r?cdSrrFrs r progress_donezfrontend.progress_donerr?cdSrrFrs rdisplay_outputzfrontend.display_outputrr?cdSNFrFrs rneeds_tty_stdinzfrontend.needs_tty_stdinur?cdSNTrFrs rrzfrontend.confirmtr?r) rCrDrErrrrrrrrs@rrrs-----          r?rceZdZdZdS)rmcddl}ddl}dtjvstjddkrdS||j|jd}|tjd|}|| ||}tj d}tj | d|d |d D]G}|r|d |zd z2|d H||d |j||d|dd|j|dd|j|d|ddd|dd||dS)NrDEBIAN_FRONTEND passthrough DEBCONF_PIPE)readwriteapt-listchanges-tmp)prefixisTemplate: apt-listchanges/info Type: title Description: NEWS Template: apt-listchanges/title Type: title Description: ${title} Template: apt-listchanges/news Type: note Description: ${packages_count} packages rIz z . x_loadtemplatefilezapt-listchanges/infozapt-listchanges/titlerzapt-listchanges/newsrseenfalsehigh)socketr_r:ryAF_UNIX SOCK_STREAMconnectmakefilecloseDebconftempfileNamedTemporaryFilefchmodfilenorsplitstripflushcommandrr"substrrsettitlefsetrgo) rr]rdcsockdcfddbtmplines rrzdebconf_frd.display_outputs  BJ . ."*=N2OS`2`2` F}}V^V-?CC RZ/000}} ZZTZ . .)1FGGG #**,,&&& - . . .JJt$$ " "Dzz|| " $+,---- &!!!!  '222  &''' ('4:>>> ')94;NOOO +,,, &888 /000  r?NrCrDrErrFr?rrmrms#&&&&&r?rmc eZdZdZdZdZdS)rVc$tjr?tjr!t |St j}tddd5}| | || | | cdddS#1swxYwYdS)Nz/dev/ttyzrb+r) buffering)r stdinisattystdoutrrstripALChackssystem_encodingopenrto_bytesr from_bytesreadline)rrYencttys rrWzttyconfirm.ttyasks 9     *#*"3"3"5"5 *=='')) )&(( *eq 1 1 1 ;S IIcll6** + + + IIKKK>>#,,..1188:: ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;sA5DD  D c|dtdz}|dkp0tjt jtj|S)Nzapt-listchanges: zDo you want to continue? [Y/n] rJ)rWrresearchlocale nl_langinfoYESEXPR)rrZs rrzttyconfirm.confirm)sS;;2Q7X5Y5YYZZ2~56+=fn+M+M+3"5"5 5r?c|jjSr)rrrs rrzttyconfirm.needs_tty_stdin-s {""r?N)rCrDrErWrrrFr?rrVrVsA;;;555#####r?rVceZdZddZdZdS)simpleprogressrc|jjdkrdSt|ds-d|_t jt ddzdSdS)Nrmessage_printedReading changelogsz...)rrxhasattrrr r"rrs rrzsimpleprogress.update_progress1s` ; q Ft.// 9#$D K.//%7 8 8 8 8 8 9 9r?cdSrrFrs rrzsimpleprogress.progress_done9rr?NrrCrDrErrrFr?rrr0s79999     r?rceZdZdS)rnNrBrFr?rrnrn<rGr?rnceZdZdZdS) prepend_titlecn|jjs|S|jdzt|jdzzdz|zS)NrI-z )rrrrUrs rrzprepend_title._render@sE{! KzD C OOc$9: r?N)rCrDrErrFr?rrr?s#r?rceZdZdZdS)rkctjtj||dSr)r rrrr as_stringrrs rrztext_frd.display_outputGsA 133==dll4>P>PQQRRRRRr?NrrFr?rrkrkFs(SSSSSr?rkceZdZdZdS)rocddl}||j|tj|||dS)Nr)facility)raopenlog LOG_DAEMONrrrrcloselog)rr]ras rrzsyslog_frd.display_outputKsm  1222 h.00::4<<;M;MNNOOOr?NrrFr?rroroJs#r?roceZdZdZdS)rpc tj||}t |jjd5}|jjrtj |jj|_ tj | tj|||}|||jdkr9t't)dt+|j|jdzn||ddddS#1swxYwYdS)Na)rr preexec_fnenv)rr-Command %(cmd)s exited with status %(status)dcmdstatus)rrrrrrrbfiltershlexrrr3Popen get_commandPIPEget_preexec_fn get_environ communicate returncodeOSErrorrrrr)rr]outputfprocesss rrzlog_frd.display_outputSs)++55dll46H6HII $+/3 ' ' 1{! ${4;+=>> $*$$&&joa#2244$:J:J:L:L##&#111%**!!$S"T"T,/ ,=,=I[$\$\#]^^^+ sC9EE!ENrrFr?rrprpRs#     r?rpceZdZddZdZdS) fancyprogressrc\|sdSt|dsd|_d|_|xj|z c_tdd|jdz|jz zz}t ||_t j|dzt j dS)Nprogressrrz... %d%%d ) rr line_lengthrrrUr rrr)rrrs rrzfancyprogress.update_progressds  FtZ(( !DM D   %&&t}s7JTM`7`)aat99 %%% r?c>t|drtjd|jzdztjt ddzt dzdztjdSdS)Nr rrz... DonerI)rr rrrrrrs rrzfancyprogress.progress_doneqs 4 ' '  J  S4#33d: ; ; ; J  Q344v=& IDP Q Q Q J         r?NrrrFr?rrrcs7    r?rcHeZdZfdZdZdZdZdZdZdZ dZ xZ S) runcommandc^tj|d|_d|_d|_dS)NTrJ)rrwaitsuffixrrs rrzruncommand.__init__xs0$  r?c|jstjdkrdStjd|j|} ||j | || | | tj| j}t!jdt%j||jgz||}|}|dkr4t1t3dt5|j|dzt9dd D]G}|tj| jkrnt!jd H||n#||wxYw|jst=jddSdS) Nrr)rr$dirg?)rrrrrrg?) r#r:forkrrr$ get_tmpdirrrrrrfchown_tmpfilerfstatst_atimetimesleepr3r r rrrrrrrrT_close_temp_filer r )rr]ratimerrrMs rrzruncommand.display_outputsy RWYY!^^ F)1Ft{`d`o`o`q`qrrr ' IIdh'' T(:(:;; < < < IIKKK    - - -HSZZ\\**3E JsOOO &t'7'7'9'9SXJ'FSWSfSfShShnrn~n~oAoABBBG\\^^F{{a OPP(+GL(9(9V L LMNNN1b\\  BHSZZ\\22;;;E 3  ! !# & & & &D ! !# & & & &y  HQKKKKK  s F6HH3cR |dS#t$rYdSwxYwr)rFileNotFoundError)rrs rr.zruncommand._close_temp_files:  IIKKKKK     DD s  &&c|jSr)rrs rr zruncommand.get_command |r?cdSrrFrrs rr)zruncommand.fchown_tmpfilerr?cdSrrFrs rr(zruncommand.get_tmpdirrr?cdSrrFrs rrzruncommand.get_preexec_fnrr?cdSrrFrs rrzruncommand.get_environrr?) rCrDrErrr.r r)r(rrrrs@rr!r!ws&&&P   r?r!cBeZdZfdZdZdZdZdZdZdZ xZ S)runcommand_drop_privsc2tj|||_||_|jjr?|jr:tjtd|jj |jdzdSdSdS)Nz2Found user: %(user)s, temporary directory: %(dir)s)userr&) rr _find_user_pw_user_pw _find_tmpdir_tmpdirrdebugr rpw_namers rrzruncommand_drop_privs.__init__s$**,, ((** ;  L L LOPP#}4T\JJK L L L L L L L L Lr?cl|jr,tj||jj|jjdSdSr)r>r:fchownpw_uidpw_gidr5s rr)z$runcommand_drop_privs.fchown_tmpfiles= = J Ifdm2DM4H I I I I I J Jr?c|jSr)r@rs rr(z runcommand_drop_privs.get_tmpdirr3r?c$jsdSfd}|S)Nc tjjjtjjjdS#t $r<}tjtdt|zYd}~dSd}~wwxYw)NrR) r:setgidr>rFsetuidrErr r rr)rrs rpreexecz5runcommand_drop_privs.get_preexec_fn..preexecs 7 $-./// $-.///// 7 7 7 Q{^^c"gg5666666666 7s)rrLs` rrz$runcommand_drop_privs.get_preexec_fns2} 4 7 7 7 7 7 r?c|jsdStj}|jj|d<|jj|d<dD]}|jj||<|jrdD] }|j||< |S)NHOMESHELL)USERNAMEUSERLOGNAME)TMPDIRTMPTEMPDIRTEMP)r>r:rypw_dirpw_shellrBr@)rnewenvenvvars rrz!runcommand_drop_privs.get_environs~} 4-v-0w5 3 3F!]2F6NN < .> . .!%v r?c tjdkrdSd}dD]}|tjvr tj|}|st j|nt j|}nC#t$r5}ttd|t|dz|d}~wwxYw|r |j r|Stj tddS)Nr)APT_LISTCHANGES_USER SUDO_USERrPz9Error getting user from variable '%(envvar)s': %(errmsg)s)rZr!z1Cannot find suitable user to drop root privileges)r:getuidryisdigitpwdgetpwnamgetpwuidr RuntimeErrorrrrEr r6)rpwdatarZr<rs rr=z#runcommand_drop_privs._find_user_pws 9;;!  4G Y YF##Y:f-D7;||~~]S\$///3 0B99B>cH|jsdStj}tjtjztjz}tj|jjd tj ||r|tj dS|g}| drd|ddt|jjz}tj ||r|tj dS| ||dkrBd}tj ||r|tj dS| |ttd|jjt|dz#tj dwxYw)Nrz/0z/tmpzJNone of the following directories is accessible by user %(user)s: %(dirs)s)r<dirs)r>r gettempdirr:R_OKW_OKX_OKsetreuidrEaccessrKendswithrappendrcrrB)rtmpdirflagschecked_tmpdirss rr?z"runcommand_drop_privs._find_tmpdirs} 4$&&"'!BG+ DM(!,,, y'' & IaLLLL% &hOt$$ /"DM,@(A(AA9VU++"! IaLLLL &&v...9VU++"! IaLLLL  &&v...q"? @ @*.-*?*-o*>*>"@"@ @AA A IaLLLLs #F AF 53F =AF F!) rCrDrErr)r(rrr=r?rrs@rr:r:sLLLLLJJJ      *r?r:c*eZdZfdZdZdZxZS)xtermctj|tj|_d|_t j|j dd|_ dS)NFrtzx-terminal-emulator) rrr:P_NOWAITmoder#r rrgetrtrs rrzxterm.__init__sM$K  [:O!P!PQQ r?c6|jd|jdgz|jzS)Nz-Tz-e)rtrrrs rr zxterm.get_commandszT4:t44t|CCr?cdSrrFrs rrzxterm.needs_tty_stdin!rr?)rCrDrErr rrrs@rrtrts^RRRRR DDDr?rtc*eZdZfdZdZdZxZS)rlctj||tj|jdd|_d|_tj |_ dS)Nr^zsensible-pagerz.txt) rr_setup_less_variabler rrrxrr$rrrrs rrzpager_frd.__init__&sf$ !!###{4;??7rr?)rCrDrErr}rrrs@rrlrl%sV.....111"r?rlceZdZdS)rrNrBrFr?rrrrrArGr?rrcLeZdZejdejZejdejZdZejdejZ ejdejZ dZ ejdZ dZ ejd Zd Zejd Zd Zd ZdZdZdZdS)rz(?:lp:?\s+\#\d+(?:,\s*\#\d+)*)z(?P#(?P\d+))z@\gzE(?:closes:\s*(?:bug)?\#?\s?\d+(?:,\s*(?:bug)?\#?\s?\d+)*|(?)#\d+)z(?P#?(?P\d+))z=\gz#\bC(VE|AN)-(19|20|21)\d\d-\d{4,7}\bzH\g<0>zs([a-zA-Z0-9_\+\-\.]+)@(([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)z \g<0>zf(ht|f)tps?\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&;%\$#\=~])*cV||||Sr)rr)rrr]s rr-zhtml.convert_to_htmlUs& u||D!!!r?c~|ddddddS)N&z&z>)replacers r _html_encodezhtml._html_encodeYs6||C))11#v>>FFsFSSSr?cT|}jfd|}jfd|}jj|}jj|}||dS)Ncjjj|dSNr) lp_bug_resub lp_bug_fmtgroupmrs rz#html._render_text..^s+4>3E3EdoWXW^W^_`WaWa3b3br?cjjj|dSr)bug_rerbug_fmtrrs rrz#html._render_text.._s$  aggVWjj0Y0Yr?) rlp_bug_stanza_rer bug_stanza_recve_recve_fmtemail_re email_fmtr)rhtmltextr]s` r _render_textzhtml._render_text\s  &&$(()b)b)b)bdhii!%%&Y&Y&Y&Y[_``{t|T22}  66tr?c d}|j|D]}||||||}|}|ddvr|dd}|dz}|d|d||d||||ddS)Nrrf).,;?'rz z)url_refinditerrstartendrrr)rrrprevposmatchurls r _render_linezhtml._render_lineds[))$// R RE   hWU[[]]-B(C D D DiikkG++--C2w444#2#h1  NNNCCC9J9J39O9O9O9OP Q Q Q Q (DN33333r?ctj}|d||j|d|dD]-}||||d.|d|S)Nzs z6
rIz
)ioStringIOrrrrgetvalue)rr]rrs rrz html._renderps;==    tz"""    JJt$$ ! !D   h - - - NN4 -...  """r?N)rCrDrErcompileIrrrrrrrrrrrr-rrrrrFr?rrrDs"rz"CRTJJ!rz"CRTJJIZJBJgikimnnMBJA24HHFTGBJEFFF_GrzQRRH3I RZBCCF"""TTT 5 5 5#####r?rc$eZdZfdZdZxZS)rqctj|tj|jdd|_d|_tj |_ dS)Nrczsensible-browserz.html) rrr rrrxrr$r utf8_encodingrrs rrzbrowser_frd.__init__sT${4;??9>P#Q#QRR  )++r?cdSrrFrs rrzbrowser_frd.needs_tty_stdinrr?)rCrDrErrrrs@rrqrqsG,,,,, r?rqceZdZdS)rsNrBrFr?rrsrsrGr?rsr).r r:rr,r3r email.messager$ email.header email.charsetrr`r rr rrr rr8r>rrAr[robjectrrrrmrVrrnrrkrorprr!r:rtrlrrrrqrsrFr?rrs4        (((2+    &     y   $N3N3N3`6Tv*'''''('''R########$      T         ~x   FSSSSS}nj(SSS     m^X   "D(CCCCCCCCJYYYYYJYYYv      !    M:}h8     eY   ?#?#?#?#?#6?#?#?#B$-z=(     {     r?