; Ec@sdZdklZdkZdkZdkZdkZdkZdkZdk Z dk l Z e Z e i Z dfdYZ de fdYZdfd YZdS( sPending messages functions.(s parseaddrN(sQueuesQueuec BstZdZgeeeeeeeedeed ZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZRS(sA simple pending queue.ic Cs|||_||_||_||_||_||_||_||_| |_ | |_ | |_ | |_ t i|_dS(N(smsgssselfscachescommand_recipients descendingsdisposesolderssummarysterses thresholdsverbosesyoungerspretendssyssstdout( sselfsmsgsscachescommand_recipients descendingsdisposesolderssummarysterses thresholdsverbosesyoungerspretend((s./TMDA/Pending.pys__init__.s            cCs ti otidnd}x|iD]}|djood}x3ti i D]"}|ii |i iqWW|iidti itddt_ q.q.W|i o| oti|_n|ii|io|iin|SdS(s>Initialize the queue with the given parameters (see __init__).s&Pending Queue does not exist, exiting.is-is/dev/ttysrN(sQsexistssErrorss QueueErrors wantedstdinsselfsmsgssmsgidssyssstdins readlinesslinesextendsstripssplitsremovesclosesopens fetch_idsssorts descendingsreverse(sselfs wantedstdinsmsgidsline((s./TMDA/Pending.pys initQueueLs(      cGs;x$|D]}|iit|qW|iiddS(s)Print one or more strings on self.stdout.s N(sstringssssselfsstdoutswritesstr(sselfsstringsss((s./TMDA/Pending.pysPrintis cGsM|io;x$|D]}|iit|qW|iidndSdS(s(Conditionally print one or more strings.s N(sselfsverbosesstringssssstdoutswritesstr(sselfsstringsss((s./TMDA/Pending.pyscPrintos cCs |iSdS(s,Return the full list of message identifiers.N(sselfsmsgs(sself((s./TMDA/Pending.pyslistIdsxscCs|iSdS(s*Return the list of still pending messages.N(sselfslistIds(sself((s./TMDA/Pending.pyslistPendingIds|scCsJ|io<tiitiotiti|_ qFg|_ ndS(s!Load the message cache from disk.N( sselfscachesosspathsexistssDefaultss PENDING_CACHEsUtilsunpicklesmsgcache(sself((s./TMDA/Pending.pys _loadCaches  cCsA|io/||ijodSq9|iid|ndSdS(sAdd a message to the cache.iiN(sselfscachesmsgidsmsgcachesinsert(sselfsmsgid((s./TMDA/Pending.pys _addCaches  cCs"|io|ii|ndS(s Remove a message from the cache.N(sselfscachesmsgcachesremovesmsgid(sselfsmsgid((s./TMDA/Pending.pys _delCaches cCs>|io0|iti |_ti|itidndS(sSave the cache on disk.iN(sselfscachesmsgcachesDefaultssPENDING_CACHE_LENsUtilspickleits PENDING_CACHE(sself((s./TMDA/Pending.pys _saveCaches cCs|ioti|i}dti}t|t|}t|i dd}|i o ||jp|i o ||jodSqndSdS(s-Check the threshold against the message date.s%ds.iiN(sselfs thresholdsUtilssecondssthreshold_secsstimesnowsintsmin_timesmsgidssplitsmsg_timesyoungersolder(sselfsmsgidsmsg_timesthreshold_secssmin_timesnow((s./TMDA/Pending.pys checkTresholds . cCs|itjp |idjodSn|i o|idjo|iq|idjo|iq|idjo|iq|idjo|iq|idjo|i |i qndSd S( sDispose the message.spassisreleasesdeletes whitelists blacklistsshowiN( sselfsdisposesNonespretendsMsreleasesdeletes whitelists blacklistsPrintspager(sselfsM((s./TMDA/Pending.pysdisposeMessages  cCs|i|dSdS(s)This is a callback for inherited classes.iN(sselfs showMessagesM(sselfsM((s./TMDA/Pending.pysprocessMessages cCsh|io|i|iddn>|io3|i|i|i|i|i|indS(sDisplay a message.stsviN(sselfstersesPrintsMsverbosessummaryscountstotal(sselfsM((s./TMDA/Pending.pys showMessages    cCsdS(s9Pure virtual method to be overriden by inherited classes.N((sselfsM((s./TMDA/Pending.pysendProcessMessagescCs}t|i|_d|_|ixG|iD]<}|id|_yt||i}Wn(t i j o}|i |q/nX|i|i oq/n|i|i oq/n|i o|i d|iq/n|i| oPnd|i|if}|io|d}n|io|i d|n|i| oq/n|i|q/W|idS(sProcess all the messages.iis+can't determine recipient address, skippings%s %ss (not)s N(slensselfsmsgsstotalscounts _loadCachesmsgidsMessagescommand_recipientsMsErrorss MessageErrorsobjscPrints checkTresholds _addCachesgetConfirmAddresssprocessMessagesdisposesmessagespretendsdisposeMessagesendProcessMessages _saveCache(sselfsobjsmsgidsMsmessage((s./TMDA/Pending.pysmainLoops<      (s__name__s __module__s__doc__sNones__init__s initQueuesPrintscPrintslistIdsslistPendingIdss _loadCaches _addCaches _delCaches _saveCaches checkTresholdsdisposeMessagesprocessMessages showMessagesendProcessMessagesmainLoop(((s./TMDA/Pending.pysQueue+s" -         sInteractiveQueuec Bs_tZdZgeeeeeeeedeed ZdZdZdZdZRS(sAn interactive pending queue.ic Cs5ti|||||||||| | | | dS(N(sQueues__init__sselfsmsgsscachescommand_recipients descendingsdisposesolderssummarysterses thresholdsverbosesyoungerspretend( sselfsmsgsscachescommand_recipients descendingsdisposesolderssummarysterses thresholdsverbosesyoungerspretend((s./TMDA/Pending.pys__init__s cCs>ti||itjo d|_n |i|_|SdS(s.Additionally initialize the interactive queue.spassN(sQueues initQueuesselfsdisposesNones dispose_def(sself((s./TMDA/Pending.pys initQueues    cCs^|io|in|i||io|in|i| odSndSdS(Nii(sselfstersesPrints showMessagesMs userInput(sselfsM((s./TMDA/Pending.pysprocessMessage's   cCsyVd}tio|d}ntio|d}n|d}t||i}|dd!i}|djo|i|_ n|djo d |_ n|d jo d |_ n|d jo d |_ n|djo d|_ nh|djo d|_ nN|djo d|_ n4|djodSn|i dd| d |_ Wn!t j o|i dSnXdSdS(sGet the user input.s ([p]ass / [s]how / [r]el / [d]els / [w]hites / [b]lacks / [q]uit) [%s]: iisspspasssssshowsrsreleasesdsdeletesws whitelistsbs blacklistsqs sI don't understand %sN( smessagesDefaultssPENDING_WHITELIST_APPENDsPENDING_BLACKLIST_APPENDs raw_inputsselfs dispose_defsinpslowersanssdisposesPrintsKeyboardInterrupt(sselfsMsinpsanssmessage((s./TMDA/Pending.pys userInput1s@                    cCsu|i of|idddfjoI|id|_|ii|ii|i|i|i |iqqndS(Nsshows whitelists blacklisti( sselfspretendsdisposescountsmsgssinsertsindexsMsmsgids _delCache(sselfsM((s./TMDA/Pending.pysendProcessMessageTs  %( s__name__s __module__s__doc__sNones__init__s initQueuesprocessMessages userInputsendProcessMessage(((s./TMDA/Pending.pysInteractiveQueues - #sMessagecBstZdZdZdZeZeedZdZ dZ dZ dZ dZ d Zd Zddd Zd Zdddd ZRS(sA simple pending message classisbytescCs||_ti|i otid|inti|id||_||_ |i t jo|ii d|_ nt |ii dd|_ t |ii dd|_ti|i|i |_dS(Ns %s not found!s fullParsesx-tmda-recipients return-pathisx-primary-address(smsgidsselfsQs find_messagesErrorss MessageErrors fetch_messages fullParsesmsgobjs recipientsNonesgets parseaddrs return_pathsx_primary_addresssUtilsconfirm_append_addresssappend_address(sselfsmsgids recipients fullParse((s./TMDA/Pending.pys__init__cs  cCs>dk}tioti|itin|iid\}}|i d=|i d=ti |i dd|i d=|i ||d|i d<|i d =ti|i d >is N(sselfsmsg_sizeslensshowsbytessmsgidsstrstotalscountsDefaultssSUMMARY_HEADERSshdrs capitalizesrjustsUtils decode_headersmsgobjsgetsmailtosgetConfirmAddresssconfirm_accept_address(sselfscountstotalsmailtoshdrsstr((s./TMDA/Pending.pyssummarys   C(s__name__s __module__s__doc__smsg_sizesbytessNonesconfirm_accept_addresssFalses__init__sreleasesdeletes whitelists blacklistspagersshowsgetDatestersesgetConfirmAddressssummary(((s./TMDA/Pending.pysMessage^s  !     (s__doc__s email.utilss parseaddrsemailsosssysstimesDefaultssErrorssUtilsTMDA.Queue.QueuesQueuesQsinitsInteractiveQueuesMessage( s parseaddrsErrorssQueuessyssInteractiveQueuesUtilsQsDefaultsstimesMessagesossemail((s./TMDA/Pending.pys?s           _