PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB`  YFTc@sdZddlZddlZddlZddlZddlZddlZddlZddl Zddl Zddl Zej j jdefdYZdefdYZdefdYZd efd YZd efd YZdS( sqNetworked spam-signature detection client. >>> import pyzor >>> import pyzor.client >>> import pyzor.digest >>> import pyzor.config To load the accounts file: >>> accounts = pyzor.config.load_accounts(filename) To create a client (to then issue commands): >>> client = pyzor.client.Client(accounts) To create a client, using the anonymous user: >>> client = pyzor.client.Client() To get a digest (of an email.message.Message object, or similar): >>> digest = pyzor.digest.get_digest(msg) To query a server (where address is a (host, port) pair): >>> client.ping(address) >>> client.info(digest, address) >>> client.report(digest, address) >>> client.whitelist(digest, address) >>> client.check(digest, address) To query the default server (public.pyzor.org): >>> client.ping() >>> client.info(digest) >>> client.report(digest) >>> client.whitelist(digest) >>> client.check(digest) Response will contain, depending on the type of request, some of the following keys (e.g. client.ping()['Code']): All responses will have: - 'Diag' 'OK' or error message - 'Code' '200' if OK - 'PV' Protocol Version - 'Thread' `info` and `check` responses will also contain: - '[WL-]Count' Whitelist/Blacklist count `info` responses will also have: - '[WL-]Entered' timestamp when message was first whitelisted/blacklisted - '[WL-]Updated' timestamp when message was last whitelisted/blacklisted iNtClientcBseZdZdZddddZddZddZddZddZ dd Z dd Z dd Z dd Z ed ZdZRS(ii cCs|dkri}ntd|jD|_|dkrOtjj}n||_|dk rp||_nt j d|_ dS(Ncss3|])\\}}}|t|f|fVqdS(N(tint(t.0thosttporttaccount((s0/usr/lib/python2.7/site-packages/pyzor/client.pys Pstpyzor( tNonetdictt iteritemstaccountsRtdigestt digest_spectspecttimeouttloggingt getLoggertlog(tselfR RR ((s0/usr/lib/python2.7/site-packages/pyzor/client.pyt__init__Ms       spublic.pyzor.orgiy_cCs7tjj}|j||}|j||jS(N(Rtmessaget PingRequesttsendt read_responset get_thread(Rtaddresstmsgtsock((s0/usr/lib/python2.7/site-packages/pyzor/client.pytpingYscCs:tjj|}|j||}|j||jS(N(RRt PongRequestRRR(RR RRR((s0/usr/lib/python2.7/site-packages/pyzor/client.pytpong^scCs:tjj|}|j||}|j||jS(N(RRt InfoRequestRRR(RR RRR((s0/usr/lib/python2.7/site-packages/pyzor/client.pytinfocscCs@tjj||j}|j||}|j||jS(N(RRt ReportRequestR RRR(RR RRR((s0/usr/lib/python2.7/site-packages/pyzor/client.pytreporthscCs@tjj||j}|j||}|j||jS(N(RRtWhitelistRequestR RRR(RR RRR((s0/usr/lib/python2.7/site-packages/pyzor/client.pyt whitelistmscCs:tjj|}|j||}|j||jS(N(RRt CheckRequestRRR(RR RRR((s0/usr/lib/python2.7/site-packages/pyzor/client.pytcheckrscCs5dtjjjtjf}tj|dtjjS(Ns:Code: %s Diag: OK PV: %s Thread: 1024 Count: 0 WL-Count: 0t_class(RRtResponsetok_codet proto_versiontemailtmessage_from_bytes(RtdigestsRR((s0/usr/lib/python2.7/site-packages/pyzor/client.pyt _mock_checkws  cCs|dt|df}|jy|j|}Wntk rTtjj}nXttj}|j|d|jjD]-\}}y|j||WqqqXqWx>|jjD]-\}}y|j||WqQqQqQXqQWdS(s!Force send any remaining reports.N(RaR RRb(RRR((s0/usr/lib/python2.7/site-packages/pyzor/client.pytforces cCs|jdS(N(Rl(R((s0/usr/lib/python2.7/site-packages/pyzor/client.pyt__del__sN(spublic.pyzor.orgiy_(spublic.pyzor.orgiy_( R\R]t__doc__RRR"R$RdRcRlRm(((s0/usr/lib/python2.7/site-packages/pyzor/client.pyR_s    t ClientRunnercBs&eZdZddZdZRS(cCs1tjd|_||_t|_g|_dS(NR(RRRtroutinetTruetall_oktresults(RRp((s0/usr/lib/python2.7/site-packages/pyzor/client.pyRs  cCs|dkri}nd|}d}y&|j||}|j||Wnptjttfk r}|jjd||j t |ff|j j d||j j|t|_nXdS(Ns%s:%s s%s%s s %s %s: %s(RRpthandle_responseRRIR3t ValueErrorRstappendtcodeR7RRDt __class__R\tFalseRr(RtservertargstkwargsRtresponsete((s0/usr/lib/python2.7/site-packages/pyzor/client.pytruns   )cCs<|jst|_n|jjd||jfdS(s)mesaage is a string we've built up so fars%s%s N(tis_okRyRrRsRvt head_tuple(RR}R((s0/usr/lib/python2.7/site-packages/pyzor/client.pyRt s  N(R\R]RRRRt(((s0/usr/lib/python2.7/site-packages/pyzor/client.pyRos  tCheckClientRunnercBs eZdddZdZRS(icCsJtj||t|_t|_d|_d|_||_||_dS(Ni( RoRRyt found_hitt whitelistedt hit_counttwhitelist_countt r_count_foundtwl_count_clears(RRptr_counttwl_count((s0/usr/lib/python2.7/site-packages/pyzor/client.pyRs     cCs|dt|j7}|jrt|d|_t|d|_|j|jkrjt|_n|j|j krt|_ n|d|j|jf7}n t |_ |j j|ddS(Ns%s tCountsWL-Counts%d %ds (R7RRRRRRRqRRRRyRrRsRv(RR}R((s0/usr/lib/python2.7/site-packages/pyzor/client.pyRts    (R\R]RRt(((s0/usr/lib/python2.7/site-packages/pyzor/client.pyRs tInfoClientRunnercBseZdZRS(cCs|dt|j7}|jrxd D]x}||kr-t||}d|krjt|}n$|dkrd }ntj|}|d ||f7}q-q-Wn t|_|jj |d dS( Ns%s RtEnteredtUpdatedsWL-Counts WL-Entereds WL-UpdateditNevers %s: %s s (sCountRRsWL-Counts WL-Entereds WL-Updated( R7RRRR5tctimeRyRrRsRv(RR}RR:tvaltstringed((s0/usr/lib/python2.7/site-packages/pyzor/client.pyRt*s       (R\R]Rt(((s0/usr/lib/python2.7/site-packages/pyzor/client.pyR)s(RnR5R+R@RRjRht pyzor.digestRt pyzor.accountt pyzor.messagetpyzor.hacks.py26thackstpy26t hack_emailtobjectRR_RoRR(((s0/usr/lib/python2.7/site-packages/pyzor/client.pyt7s           y3