From 07428a10607d3b7899ad656f392f5b29bbf8f689 Mon Sep 17 00:00:00 2001 From: Ben Gotow Date: Fri, 23 Jun 2017 18:23:12 -0700 Subject: [PATCH] Remove keybase plugin --- .../internal_packages/keybase/README.md | 14 - .../keybase/encrypt-composer-button@2x.png | Bin 15446 -> 0 bytes .../internal_packages/keybase/icon.png | Bin 55322 -> 0 bytes .../keybase/key-present@2x.png | Bin 18218 -> 0 bytes .../keybase/lib/decrypt-button.cjsx | 143 ----- .../keybase/lib/decryption-preprocess.coffee | 15 - .../keybase/lib/email-popover.cjsx | 31 -- .../keybase/lib/encrypt-button.cjsx | 160 ------ .../keybase/lib/identity.coffee | 53 -- .../keybase/lib/key-adder.cjsx | 213 ------- .../keybase/lib/key-manager.cjsx | 97 ---- .../keybase/lib/keybase-search.cjsx | 189 ------- .../keybase/lib/keybase-user.cjsx | 135 ----- .../keybase/lib/keybase.coffee | 61 -- .../internal_packages/keybase/lib/main.es6 | 34 -- .../keybase/lib/modal-key-recommender.cjsx | 157 ------ .../keybase/lib/passphrase-popover.cjsx | 80 --- .../keybase/lib/pgp-key-store.cjsx | 498 ----------------- .../keybase/lib/preferences-keybase.cjsx | 50 -- .../keybase/lib/private-key-popover.cjsx | 138 ----- .../keybase/lib/recipient-key-chip.cjsx | 53 -- .../internal_packages/keybase/package.json | 20 - .../keybase/spec/decrypt-buttons-spec.cjsx | 83 --- .../keybase/spec/encrypt-button-spec.cjsx | 142 ----- .../keybase/spec/keybase-profile-spec.cjsx | 9 - .../keybase/spec/keybase-search-spec.cjsx | 16 - .../keybase/spec/keybase-spec.coffee | 51 -- .../keybase/spec/main-spec.coffee | 39 -- .../keybase/spec/pgp-key-store-spec.cjsx | 209 ------- .../keybase/spec/recipient-key-chip-spec.cjsx | 40 -- .../keybase/stylesheets/main.less | 526 ------------------ 31 files changed, 3256 deletions(-) delete mode 100755 packages/client-app/internal_packages/keybase/README.md delete mode 100644 packages/client-app/internal_packages/keybase/encrypt-composer-button@2x.png delete mode 100644 packages/client-app/internal_packages/keybase/icon.png delete mode 100644 packages/client-app/internal_packages/keybase/key-present@2x.png delete mode 100755 packages/client-app/internal_packages/keybase/lib/decrypt-button.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/lib/decryption-preprocess.coffee delete mode 100644 packages/client-app/internal_packages/keybase/lib/email-popover.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/lib/encrypt-button.cjsx delete mode 100644 packages/client-app/internal_packages/keybase/lib/identity.coffee delete mode 100644 packages/client-app/internal_packages/keybase/lib/key-adder.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/lib/key-manager.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/lib/keybase-search.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/lib/keybase-user.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/lib/keybase.coffee delete mode 100755 packages/client-app/internal_packages/keybase/lib/main.es6 delete mode 100644 packages/client-app/internal_packages/keybase/lib/modal-key-recommender.cjsx delete mode 100644 packages/client-app/internal_packages/keybase/lib/passphrase-popover.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/lib/pgp-key-store.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/lib/preferences-keybase.cjsx delete mode 100644 packages/client-app/internal_packages/keybase/lib/private-key-popover.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/lib/recipient-key-chip.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/package.json delete mode 100755 packages/client-app/internal_packages/keybase/spec/decrypt-buttons-spec.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/spec/encrypt-button-spec.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/spec/keybase-profile-spec.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/spec/keybase-search-spec.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/spec/keybase-spec.coffee delete mode 100755 packages/client-app/internal_packages/keybase/spec/main-spec.coffee delete mode 100755 packages/client-app/internal_packages/keybase/spec/pgp-key-store-spec.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/spec/recipient-key-chip-spec.cjsx delete mode 100755 packages/client-app/internal_packages/keybase/stylesheets/main.less diff --git a/packages/client-app/internal_packages/keybase/README.md b/packages/client-app/internal_packages/keybase/README.md deleted file mode 100755 index cdd39d4fa..000000000 --- a/packages/client-app/internal_packages/keybase/README.md +++ /dev/null @@ -1,14 +0,0 @@ -## Keybase Plugin - -TODO: ------ -* final refactor -* tests - -WISHLIST: ------ -* message signing -* encrypted file handling -* integrate MIT PGP Keyserver search into Keybase searchbar -* make the decrypt interface a message body overlay instead of a button in the header -* improve search result deduping with keys on file diff --git a/packages/client-app/internal_packages/keybase/encrypt-composer-button@2x.png b/packages/client-app/internal_packages/keybase/encrypt-composer-button@2x.png deleted file mode 100644 index 20cead9ac5b51529caa8db846e025f9c0a977cfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15446 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

C z@h|l00<>yr^~4gGM(N3;OEdJ02@=mfTGe6`kLL8!7VtqD+219XDaSC3Qev)+{(S6N z{W#8b7Uadr!*oN$ue2O8ecBvUMd7H$9u*)6nXR=4-o z)R&@(P77hT4i#&ug)vVvxy{bf@sBi$3pB(cF>V;MQ_1?8H;*0zt5^$(T~UjG;wIaO ziTh9k=E1%vcI@k#1=NTydbhGI>OZTI|Dw%lHBBGQ{Kj4`AtWlBtF_=`!?89{XLnZv znHgz_qRVZE+gZFIuGQhF(AdVqbx~DDcwL9Hc}C7RuSvOcBN#4{hM|zqm=Ihy9KN_3|fWwydS&2 zWZhq|>Y1fhX6e3Yh2eiX!mMJO4`dBj#n0!|XsFf6lq*}puhr=Ftk^lKTdbxq-`c3m z1@Ray1ZD>HJ@#eI-p@3x+#w$w4fQW9c~|9x;Vfw_YHK@P9}Nv0sMXmR%9vo|0AZ>1 z;@|lFzu;GDO4+U@n-7<8LnoN=@MXi+W3UTY!!;mTdpFVjo&yy%KzUpjkel|*7$~&| zt6(+yMd9c$L8LQG38T<&d_;N1vbV$4VZ_!pRV96dz?+mB+8KqLxgILK6!**rFXxH# z*KYu#wlq9HmfxEdjNW4R-$^{GmMu?Wu2%M&4T4q$_oK3=l@jzCOgz3MwuqwJT_?o> zDw2pxZe~&b0GZ9PKfal4)nrXKPK?7b@0 zg8i(wy2O#VE}4r$2TPWT&9;l3MXBLZyeBE65R$r>1doXSpm^CIda{;Xmu;t>O)c#= zxrep;4_YP#U?2qIK1;r#K8SJNx|RrJK(2C--rzc}2wrjO5#svY%o}&H?m|5T>%>>z z{Ps%v4kfjhsrwzh>kPrx{a zVyj+3S)GI?+P^b(LP;mHT=iL9eoafCr0MDwjOj!ZbC$1~NGG-7Ga<<8v9{&>_3&Fp zOYH0~S;)qIpiT_?5X6XU57Vm%euLG9!%nc^zp>8oK&p?FlWowV z_1_x6roHs@jc;Rm9cLzoPG=b6s5I)beLzc{?UrreJLTjP4j+o{R; zgx9Y7&qzzK{J2DYN|DiRbslp$seqHou-}DgdpcYb(zVqGL(eJdPQCw)_4cNP!(>arNmpb|Wgpb1)q` z8@S9ncu0j1ZxFlxnX_A{mXYr0G{>Kn^&m1ZbDq#FX z3Zd(s=*gAs+W-$fGt7B>OV7?LRfDoDk@ns3asl+agM+;z(grX0 z`7C=t&khY-E9?LTYdyl?11RtV2iHX%Jlc!hS3zgPhn+3d=X2N%LMRlgM4|7{CPbYt z7~>sqUhK3t3!x7(T#e9>)~k~rD+n}#F#&r3j0>q)XW$#f^xjlR^NzPT&(cxB9h|d; zwDwv2r90Lgi8_dm1{So`3P&mePCf~`-_5Bk35e66z>?j&f5DZ1@-oh5*bPLCG#vR=sxZ{LN{)vWN%DUY-Lb^)T>fJx%;RL!C zbd|;B&03@3Dcy%7FdTjM*4R(n6rca>9$C`}FU!nN%}IGChG9P@Kp;tS5H5)c3l(w>zpB!g^^%W?|9hg_nRAd+CL&SwqHmo?S(i*GQ~?5q2}{# zMPOZ4pm_?{Nl~YpS}coK$`0;T$X0Uqr1-EYcg~S((k6kA!YBULEY&y|t%*;}2lLrVC z>+((7@Z{;~f5lPNZ3qq{=txg8DCkQ_G-dCoBw_Fz2oU1E;}`ZquekF#f9(&h$6vvI z8+(qw>Z@kyf1K+P!Ezrl#SF$MoJ_jTa-8}gC+bIo)1~Ma;#UU9Vj2Hg5Erw;f?Au2 z=|Z<8_;B~vh|e*GAxm)RJAFtN2ZKyh-0q3**NnH5*#8mj{8=UO{!sT%XGztD zPoTSh@lwuqmI=!1W=A(^g?Y4!!2!RDCO{~(YiKJ2Ol8KTIeyQ6?YfCg;6+`}vSI$M zISw{+LRkrm^FE6P%~pW!!QcM($myP>^}j*R-qn~{_f5GLu$>z3k*?!6DIFOXgCGNZ z{~#{Po~Pgdmt^Xx^{C!ky3XGf!)=Z!46@zk#UCk!KQi>mQ%g6*2{C<0)(mrox1~Uf z2q8)6q>rj82Vk%1+SbT+A0G2v;nu87-7*W?3%|HH<&~bHuF3j5QtdZ6FXF> zUNfqgIceA`OBw!MqUj4LN`eLygsBtgd(mzsTG_wvn=?|4fDl$)^6p=;rqq&glw{FR z3HfMgyD33#oWD{S_<>SV>yjXWokCZ2>%5jZbWrj&klvqpc0AnsRK7=>qZy?RznRoN zo#a6LXXPzRHC%C{E+oJYO@*R=LE6QUOXf%79Hs(Ps6-l0UDeAi7?@VG&fuMHiAGEgHb$|sbubSWt85p@&ckn> z7FLdw<_t%vCK8^?y7+5*EpdzX+U_ve7R-;DpXZ!HZD*CNA*MuG$UMs^i~mC&OM*6E zdsW&_!m&qeTvV;cf^!gYxBJS*swGqcMY^R(jMP}OX3|3uwm`40}S!0vJZE4rCDMo=CO#YEtu=pe-~H8`X1 zsU){>OvmdNu=)>HPLiF&2oD9(Lr+yq^=s>s!JLzZpVb4m_dfgrDxjOiuwW%I7xwE1 z4OD)KHg%xxxO;{g9Hof-OhMXST=+FB+}m6jM4IV~XK#j15+^fE*)HX9SS^kuU{6zx z5=N^OEF3?;xN8RLWd#1I7#JQ-pBknaW}^c!*`+Zl-2xh3t~{s?ee{-k%T zWBGr;kR8lE3f^H`6j=Q!>vfqRWJ*8*_7?iC*Z2VEeieeTz)LFj?w+`Et&Kt4> z$fVN)1J#cl#A!K~GlN1I5dJNr#6F75d5{w*?;#X2_343WNg~QDrsmudQQu34|9(Q; zhgE4yR2nKI5wohHA+eD$XwE1a;{vbXR3xF_hE`Mj+d{0{l=+Skx$DdCrrnO#bB;ML z8M;kg+t4G98(Evf%s*lL=x}!@E^pEIyB3Deew6Z)?)mM7NMBXCuug+X&+}2HN=ukS zzitc2Cor?|ZN4RbSaM0=9pv6G4b3tfq}?rz{dvQyHm-C~Sx52Y{zJu_O+bc1B}6&o zlNpvnQYF4_Ys5%TWz=~w$0YvQ>ipeKhIcjRdTEKJMu5+CZ~Ah9qISc=MwiisJEgtK zuOjkfdJ%GgK_9%b)>Bi3k^Yd4ldMK}Q%0i-kf>WE2sYXs)aP(^v<_s#4~U3FmdsqI z(NtzNP}m@Jig=T|w1z`;9jk|NOn&Zv@*Qfu3Ot2bMCd4Z+O|4~?6TW-scEWM`(w3& zH?^FIzRytUG^Bn`-hM7%ex^-v#cYyQn_()9aoii4ZOv!l0aMqM-+>~RV~KKdEB!LE zoIx+-#i_H5Udnan_(~v1tH@D}Lf}0`?_~WKlwuM+w786Gh37q;`&K)CZ5$3%q}QZ< zO(L(WxOgS9>SJ6A?*BAlpqFQ&<$ZxG?_Cdft3Qw$_UZ;B&sTF|20dzGr@%Nw_QWM!n#rQE8^bsbQcC z&RyzAqw@U){^BuHm1y**XAs2k#C>i~Y>Ur8<(PCz0W=3&U6iW5q#aP6+f2*R?oCnc z#YB5mi^TYv;_1o!V~I~`CeL-p!<5fuJ;cx0g%_;}ppmP0Oza?i$HeX&PFcd146YkE zhN4#0%|akDw}bOd$#9?NAG*PV8E%;Y^hreEH-asvA9P+PROw7f5~4Z8Gh=SL30(xQ z$7@H(H0+yF|MSRYdHEC>b7JcoWM1e?hdrhPW;ia@rzt0L*~i!-w{OqptJFxQ*dXf zAiFsKda!F`3q$Cs3 z>+4YaFZWHXcuuUan=NJP^pwfkyG~5A3s+_3iBwkngN#gRc@*i-BC4Af?7Vi+y#MeW zFYw}w(CWx$89Y|jUWVsMfZJO69^V_YAiq$kZY~gZpb+Y)y+<7<=On_R6a^2px?7HF zC!P2BK0_5pLOt1cKb&6cp8m%X-^WWa_=gV<&(6313n9zg7yf&rA>@sq0{J(Lo5)SN zVO*Y9lo++rf}f3>GABP3HXLr$ABub3>(hGGC5SU90!*WQ86AV6%SlatELm7->zipY z@7TdCSyl8e?#Bo^d}#S)*UGr@>E42=h)%_YDf7#Ys!3Gq;-7LW^Q?Q#HOGbuQsb%% z#Wi9l8>v;I8G@JOQ-VX}Zd>mMm%-rgLbW~$%*8Lx{0i6H7poW*Wsw3Ra>^KkuIFK< zx3_(%a{hT3=3Bq=LhM8ENS{1d>vjKO*Y~U1@~eU6t{_z|NrF*KKtjSHCOhHiV19c!hVa~q2W=U=h81qdmMc5Ih6Bh*bZ%S%osN=@@Yy0Fm;%> zS?Z)($uzZWKK!2Mwm;AgJnJIi0n$39lWGi{!Sok>p#6^An7Kd!jA%VyWR(du4T9-5 zYa0#G$LwkGuEH;gt?4&puMFnfK$r)c;|95@e$iLD;}@(b-#gmZz{{l>i~{F(jfC*W z4-mg*2>s38MS8l$5+{#3{0Ad#Pl?Ya9x;Dn(=Jxl81`upKSuzr6TK}Go^#~ezMBQL z9$?t9`g9k>jVMt4YmqP1@#dOR#J$5=ej(TXu^Upy?x40PNdMKPzMg;~=<$>1HSQ!Z z1X=iXl5TRmY8zr@l6jIa(qh4OQyOaKzAdjB{{DagL7S~y?Uz?H-dGaKTjpzU)FpG%I5{deN#BJMN>4V z-xQ0?-4Bh#dVr|jY=&_S@=NDXooM;$}rdIU_lxL4L zZFzA_xq^BVLE~Z(bq!JgSkF%wAOX>W2hnAo2)(kJJ2bx=l|wD{;tM4R=0@a*~q?=b9EGO!k(= zLN?(=LWsIe84@rv@tnWaqsQbulKyqGSPOeCoCKyvHFm3d)(Q|=aVc2^`C4y6*YVfY z{*-N3)#$WYr8r}u9+Kwx(-DI6lQ;GD`G=dRbeuq4{R>Kp3o}MRPOJL{iy5GZtDNUi zAdr>uWSKf1>rN;eb`#Ym}5>XZe8#a5>7mcN;&QY%x``#Djp ze+Pe%KYL|4#Om2U?YN>Q#vBU;gyVyjvcD~8rHCy+gAj2TGP*EWE`~agiY;N1;(3=m zm0XveHh}!9Bhg#(M3%I_gYg$Ikx=0}Sph~d)Sp@!FGW=(IMvMG6uqWq3q+?`SM>Dc8#KFNEE)4>Z-k2A;1({Qb>2@@orYX`sVhB(3_f z9?2K0(`EDCMB56{8!S8tUZPmKQjTgKXNYbNuNNIZ&73V~n*;~#0dwdFblc6wXuXRA zX%~$PDsHLAisPGZ4hGe3iGa8etKnG3 z{J(Iga04bTk)27yzW8!(_>2b>Csqw!cUAzYELS} z!>qE3Sv~D9T3spR<@9A+Qa2QxDaIJ5H(itN2!WXqeN7_7UraA8i96q)10Gq!qD6SB z)!9$<=8$}9lB~O;+#F3X+|jQVXiaP4eOXx#c~b^49S3b)b>;Ghx_gG0QtSHbO*;D5 zQ6GX4&IBt(WeMMf&|TL&r`a4{O9S~-k>h_{2yd;cb~&Se#sznMws?Qbc*p%-J;&>e z#%o!FsB^~YK3Ipxn9CRvt?uM6^S#x4YkVc@(jTPJx?^L%`|QmMWcD-Cw6yPEi@T-M zM!VB@MwVmdxtKhZ0UADG3Pv${mbJ*++cP((J<5uLK4!gs&JfJWHm*hs>BIS-Ai^3p zp%i2$)JcKTBAAEme6b`*MxWO?1!&2vQ8&97iGK6!s;IIf>MNtMm0ubkT~ zso3y&TI6p@d-Ng$R=%3U71TjPzVjVwt(rXxPq%yx4Mg6p2LqPbb5fJjqnTkLl?nv@VughpUQwvBao=^94N@W>P{C08K^+ER;{MpV4U_5&$1-FXi z?+K!v?>VFI`JFnlW2nEre?FVoy25}8=vEjlGbn?%{9tEp-K&y7XPmd4Cmm{)|BEDzU5h-T=_^6CnG!p}3d81me_rS6mP+!l`;g^dLV1JBK?BdaM zT?8#=pJ-=H0B@~N@?gx=XaX2u6L}!<64#e0m7~oRUvc=dQc z6XmDL_v}|7*TDZ(>g#_V{GRoi9%gg;{WF}7IKBia4S7^yEM~l@VyFNI$cWEce5J-1 zl#YPx9J^aHCj6~oi>@e9QIh7L>SgKi@$vQa)JigFE1;G*MH+&BqNk*ivti45aC__Y z_Vo1RisZx)cL?YA@l0N}d{)+Eq>|KhmTI!oCPXxdZ;Y%*Z|Sv)bCfeR2*lfzJKu*xZOj0_ zou8jyMTh#h7e5Y3llcf{d~KiI&3q7h&Q>KF<7`if(|z;-Bv{O5x7IQo5rU3ib1V+u z-f#45X-QD^nff{9kn*VfBkPOuCRx?p)^8%Sx5_I?5|Tx*HR@Mlll>Q}OaAahkU-Ex zs@=&E*w*j7#^B-fEaR@jn-ez*3k*nq5g3ZSQ%R;6<1M>HkIAoij$yjCd1%O%1u`A) zNkliSJeuArECxJ#dJSLm%^8oMaGV&Y*@AhGt5!$fifR=)VUukjUS5yv=j1QlkPj9! z#qNigZ)SXh%9C>=5DNC(&;;R7OvSS5-SgH(-m?zg`#gIo7xoe z6!!!_z&^`pJ1COKFFeR_^DHF6EI8}m0oq-kU`$&Vpdwp*L)66Vr| z%gF#zodv%vMyoa$*uahltHzaCu(bf++@PevkjnZ)(6W|b{)=CVV&ZV|Fp2c>JVaE! zkysap%vllz=VUvRuR9jR>+6$r{Ed7Lx_2UQieDtxO5~T>kzh^S3h1yeej=wwf}s(R zm?6b_lQZ!aM~?apqCE0VpV!)3ZOYD3O06+8<^K z7Yx-}9&LV`G;XG`pbJJKh_m?4EU&KgowPSo5luhwGRWg`84eg0sTp+ocur+GPM4Df zaFUnSgsszYa&A*mYDYuV*eir zA^56u#Os?;hBV&HG~P_?-c0|vsBR6XYxs4S{P`*}Ts_+WzpLjqYW(H?v;SY^9rxx! zwxbM?azk|iSV*%0*3%l{%LVn#`UQpUaS(;EQ*C~1Lp6#v(8u(k_UQMh8oRX6+Bg0c zBY34c(6kJMlyG2MzYBaNx0}BioEwVon}synOcIBD+flY;1TrXW4uIGrhdRs$A0SZk z^+en-76~Cjz&IWRwhXIMIURt{(U{KXM!5d>&~Vs)r1|;x%9#q_+Ie}S(#zi$Ie@Ms z{)OKBz<;lU{~hW=#^)xaa0${!a>uZE-?`osE6YT)_LQsNW_w2&(c<__1qLITfn8i2 zTb!A0(2hmqWn^@|e#}9CCE}l_6#xNuy1R*l<%2@jZFaTHXFJ;mia3d6>n+f ztE6!|_eAzjsD|=SE%yH3+b<8!zSGUs400o0@|HS^k>9^jmT8qU6?tyX*?Wfr-G_tykBdF;75`ACVmkglV)>*VgqAgO2nC0knUqI<8F`}jN7V991xAHJAX^Jrr)*a84+g}5~A;$06 zEAb1RllfmkLizA*!PB7V%P})i3H6**Y4hK_d99~C<~--4-yPR)Cc>pUEWY#H zBqYyFiqr=W9`nDI!q_Xww`KuAdeG%H-f~C){NW<*G!uVIveFRoHT+D!{Ls+BAHjPy z$(p7F+}F^I0Xy1hgKz!^vXnY8TRI{p7d+kkt{Mw z3Ax8seWk-YxWv{TPLn>C^1bEUhD+AN6X#-Q^84hiL71dHQemJ>-ce1i-zYbsAB_sp zG7U@1I6ws4Dw8PNRXBbZtf&f2N?HEwxVLA!4MMsxpW}*$*n`H1iLeP$Uhi7%u@X49 z_LE8G^eK0cq*C4;PI8(hTH1CW-!w;-v^F8y4jt^FxX`6!*ClH*_%FzsjHvm~zL#9c z9}-2BqgM0Zhisn-WjITb$`(AxAM#eqM)Mt;Ek?{k6i>zVgL=zDG-ODwxc{69whC}s z2`2}Oxn?gQls6Q!U}U9)(UegA{E^KTj_}dQ^E}F11m#V?P1B$X`|`o^O7MhzFxNks z=h4=J6~I)sL#y!15Q3MN61GNV-h$^Do|gYeoPa%Lbu7c!wL2=t(G6oHglZZ;9L!D= z$^5&fb*$CWZF$}vGx@+g8lNpchVJ(_u2C7h zI0x+|(T90FSa&j^S<-rPy%>2WV2h9R^$0Nyed+ix(B{IhPZieOCq~vo&snRw$157I zAD5x)gw{XPDRvH$`Gi8n)=dIr)kck+Y+-|_jq#8cNy)p6?&&^OGA45I?mNo@z~1p( zuiVUbe}{!ls(`U=OME#l5WIU`s{~ayjDsXDTa%Zo0gei%!bp$hi8ksv&j8tG>&n^* zL>dVUTYd||lKT(V0XV3^tL;{$^G1tV+mq2gGB>`E5904Y0IY8LH;wAsn)Z=%YZF;Z zPa!@_=DHtt=R6e>na->7N5yL$YvjCM*`#UJg(+uR+Frmn>Kil|W4UkTvr7I`7q)^r zkXv&o!^STS?Uw62sCL9m$5np^kb%`rR~uOh_}8QoYJWw_U5mHD&ET4O8Y{}g)tk2s z_PmM`!I$5%wR_wTV>=8jZ@&)p+zL*U^XdPb`-HMCAIhtgn0*8^-D$)vicjG2mvR-978^E?1G(mQ zS-kKHo+`???63Xbwy(Ujno1-J@u*j)UQv34${Z*Q`3BKCe9mpqs6Mz!ZEAg<&Kj5~ zE?S$3s{76;XRDDvR{eX8p^f;8=nW-No`MF~1^p)kkR|Ki2U9{}dk{;l%}Yn;+yNyy z`3KNuD(-poI#6US!V}%bwP4I`k4Uo}%0rDJA_hrk5}Q-p3eGPd<_A1l9u2@nH)N*D zUzxhnTnvReA}Z=rjY$Rt>omT@drK}!i#yGz2NnsIVYWkH`)zn-!_T7{q1+t!5xQwO zzpipUsrc8t-|kiH|Co#$I`GMT z?Eu=_ad=lvW=-0XzV?`=#4Y$szOU+%ZB1(#N7Vu2M4(JHe6OMK(Sb>5!a;>m<%5%3 zLT!x@^-7j<0%YD6d9`6KKkS(m(GY_Ot9Atut_1yt@!2+zT|8;Ro(7q0GImtjl;ZMU zOOXrnyyBZ_Hrep5O$X7QbpZLFT+>69!~u2a^}42mfY|{WP$eOMXjd69spAjZlvk}M zorG%0H}sF%mU(aq0mn&xBhz*||J~W^!&l4TxBP$WjNA;g`^In@Gu)>l<2J3*b zwiHV1jP}b`a`+eFXNZHa5zDGVR|7IF-t^pgPs@%qtWR*Amb*tpG4Fc7uU1iFlBD-= zXd2^s9*Ez+)bB9h{;TRQ8HhgdkJ5kghL(-B!%*MxB8wEFZ#@2%vZ5M9YvUGM4ca z>su9k@B%4#OKWR$YqqmA6lj5n9F;7q&GeAzbs@2P;Z083F@7ZdbJ+0XNL z_p-BIW7th0r;{f34 zbQF$d~(x4XuMhT-B5s;5Kh^u9!)_+@XYzhoy>7LPI%J;>nx5i2mfAJwj6V!E>3l=m3so0Rz_d6Wd3#@bA55~wW~CxyiKkZg_DzR|m#jBW z$_GgV1BG@8ewFsUb(OI9TAZT<`Q|c0DH6E3=odan+L57j7ms7z$~3fIeqox+`wGb^ zfj6#9+zhsc6$R%{`10lwQwHV{l4HHr{z$fzgVKe?z<`N7^rHM+hVop{=ZjS@IAV;s z@A3oi-sJouQ*F|}T-=|D|GV@0@3mgIxC=qLFHLVky*n*jEn6C#vqkSweZ1FrF9!I; zqfzLdhj;AT!h6+UoLDt>KlYS7op^Hb&10c+{O5!ls?6Sc8l|*9R@j7VKD+O+ArR+! zRCm`O8&U=t6(YF?EFHooHo}X{= z!lAcC=&oHG=Aq8hM<@X?ihJ;i?D6(cU~ipEg zNugGfMLrM!fbhP3`_{_E#U*b8*Kl%t{JB^^w^Z(~C%oKTZ)k9En1_WY$>*FmL)6;k zkNdndu=C?(Q5nyrkSy5w*3@rf2qUku)%n|}Z{PlyUGG{y(l;=WArOhIEsXm4%8O$` zm1${d;IHZF^0@MqT!nz!7ZG9B^}Yn){zQ?^yCjB0DIr0@^RUgqv?wsxbK*0r&|dC| zgTH_M>7vKL(M!gK-NhCxB3s6@9-9cNt*Uxa*WKOG(Q)|m=lxnJ4RlG#_pk2eOtqa9 z7LQtNL0}qp!f8}hRpIh4E;9aBT1y#h-7-zwvM@9>B!_G=6wEhxn(`#G-n!+CIa`@w z*Gl9vBvt}frd<)0(|}(V`ck<|49;TOGeIIF zBWIU*y+mzju5-OGKn-pTq`D{lCKtD=gyyqpXlT?y5RyFg7l@h$LWXk{5SV5I{T$f> zygK5yryGW2{Bb@Jk1fkDJ13?9`S|z>3xMh;9}{O=4%Soo4P2C)#$oMcd^%96Ir3rNH ziDAwn*X6yw!2Y*9RH?XKpOYvoHYUbNcX_F{ z-EZFmw=+H5D&OrB{SOw-mno^Q%$tWgZ>U@?rfK8Ic8(yTun^Ud_woBebMGSbb^e3Fi}JTA#sIV~gh3)G`EAKt$o;=eaj{nxb8$}sGEmMW3A;#Qf* z3#IQiRT!!pKxC0kIo$rH*y+18{H%fjtR0Tpy@*lQ*_OSk*a`C-;GE)pl?zrt!+y- z)`T>e`C7&8cDQW>4I^AWf7Y&p%nO?KoSS@u!CpS1IfB+EK;UODX-XSR^Kqn7R4jSu zw>0U8lyb!o-1Le2+>?DIKS`{(`7B^>#&9?EvgEtr5(5ydf@s@A-uy`}>u%OuzbO5= zVMJWQbA5ejJbrC?klwl@?VM;S4d%tXrZ-^Rk8_p6(GYQ8oXPyKF<)vtakTs`;nixRr~ z9V4+(*w1|bx6TnyjYac&!MfrwrWOSyMF z@AiY?E6?7E&e$9S6Yf7Nspc8MT$b!SU3m&u5HzDrygWJEB>oGObFB??1rUtp`RiC^ zOFp|9JaUoHJj`YcAQ5RZ#ENS;O){uYcfBmcIv3E&D2hZxlksO9a}WfsvNVWTSjG3m z0z45MLh|zQ-c|#LwxGdn?jscy*p_`jDE`~e`R)en2_CNCtHO|&LRnMYY=nQ`GT)xM zOkOzSjUICx8GO!fDgxcS&X7fhwaXG)PGj~J5_fEYam2ahkWju^da&3sfM1Iz zA!$yz?k8x!Z3p3b-aX`jM00%$Q51iUpZZLy3;1OViD0~bzswcY+$JL}qv@RQvTX}0 z7(Wj~eCYN4ZjVRXj6K+e$lB-r8j7cWK*nAK75XRQu^TS%FCu%AX_1Q1{W}h$grKE%qV|rZ?r8V@rb22$OiQ9QON&*`krJf zrZL~aQi5uyptx4|FKPsb{SUbR!<+wn7cehNuW9^0-uG&IBxeVl9MEYGn1i|J110mO zccOpN-uOY0j63(`hK! zD}Az@#9ILJC8_^rCW7R~j&>b=0BB&DquS)e>}}Xe9G`)=Heli#YM?s$6yG{ltoa61 zYDKwSK1!Kl&`wEwZ+3uOPBJ(TK+$gnZPV=8JW&_K?6kGVTJiqQSU%hia z#1|9mU1e=s?6;1fGxIM{|K_{%v8VByw(dR7^kgHyHInZiUh5IF9CzMgTSvU0x%rYH zBhLM=H6lnjqo&+_?oM!&_`puqf8jDvg9Eyps#S$3CZBkUq0EmLaXeN#uFcY?m4Tmz zw)S0UV1FI8a}U!o?JeoplUxF9<|rv7Dku-@*WM%AmPQ~)kxtmGNa)%(u`2_w_7!yO z{MF{(W)6Q+-&Y81cf%lOFcWP=%0ZlWll=EAbpV#Cp+x`@VgP1;vu?_Ld^&{~s;Jd( zx2f|f4I&;I(^~Aec@+3pH+bn65043{`!W4L>I*x|y=;P_GQ`nJ3G?BW9fY?&^r%*^ zJ&vx871T}Wc64-{+##&MuWnt3enKvEpheVdc28Vw9Rb6~-@%%IoWk0&JLI%Qg#Y7^ zkeS3W&KZyrv{)PRqVHhd5$U_vur3C5;+;u3dd2{KPh1FNM*vffkvI>V;?VGVl*QjO z#^#`>dAk`Wu)T&8sjZl8GSX}SR75uQKSUQ58*p<9?%%^#+dUrT8uB+^NuBAXqbDOR zj!_|DD^0c!#9)_&N6{cJs}Dm1O+lko7cF9A1KSE>fl=)6)luJ5g6;N|1~~wkyX?jA z0$6IX#cJQOZ9OPtX_ktk8+qE3Ae%b{TRh8mq}aeih6by3fg6DTz{_KLB!}&at7Llz zGD`W+m-REMe9rlWKK8TVjoW1dXH>QkxdbTt8Nte!v`!bISSd(;8xo$>JBXBN@AxNC zdx+Mhz2A-EdIP!vaO=U^sIR9jGyA(%l+U#BRjynh!vUXsAV~frsVHfKpqb~aZ|ZVA zEVp+%w*z%PY;e&L%FfyJ1l@Bu#wm)f59Ynj?%c5vkPIF^hGDk+uH|?Ba+?>DZow`4 z|2fE3%#1=Xb%UcB+FfO=$zpDkcAS>4i3W3+^D&RmHU#oG>r)wuE=6l_c{j28N*1Cg z_;q`mL&$zudv><5&I`F#A9z{7kXB0RBoE=zp=tt4v zv$WDcDdG~_(D@25%o|*s>FnqJjy)q)86paqCM|}RSB~r+=TwH}z1jQcidAJ<`u%}q z3mwXw8T)&eccb?H!YeRAqmjsK+--oRk13#}P>%Y7&79k2=g5Hl-ujd||6#!LX4UfV zL+sN-a(L3Y#eC|ah__feV7c~439_TeJTx3uAD=tR^ztt6RC2%M{)2bJ=^m!4#^Xk)`sMSI&a}LdTObBkUm7 zziMj=0m`M-uHXA5m8-M%|B_Ie~`$@;DK4V)E8F%>TTYRA|$LHK8|HnXNZi*hjI3sPT|1 z>pL*nhXg)4L3=)~OPfWTO~y|-AwRLJf@qwSzhNLo^g|0w&Nr3G zL%xHE1T-6klRD3r%Q)c%=-4D`H2(~Xl{U z4AlHGsX%1!J;hOT&zB&5)g?~owqpxPos@XhY89_fTr(Tg*~#z~u=NAxrAK62kEa|(_&+y zT=~Hw{`>NHAtIDqcv7PWTr$nzAtvFUn>T?iuoZ(lbw6G|XozRnpZMt}mlWB01DUp; zSD(o>4TkXp5vW!#6Uw$&k zK>>XxI~4jWY@56o64_8A)Sa>vsZWvv6|O9Hgr))2`ttbRUjc7_Lj)cquTNL_CYcRD zT*2|i<-D)f^)^dLNjfaz{JdD?q;9EMRl}Zr8&a;SJ>*7WeXQDDJZVBu=02$==N2+%l*Ns zkm4nD3p!;JB$?v-N8FtXL}3>N z#Uu8A8L(4_7dGpKi}in3E)3XEp~gJ{IOdDC@Qv7>dnwxY*=}8&`BKd8-?$Z<5Fa0( zAe;#@#OEC3kfwJ9Qf2+h~gh22zM*1eZq zDV8I{x=-G6uY_M?qO8BhIhJ?7Ghi`ww)#`&(MX6d;Yi(+A}xDSRcP8q4cB2cJNM%HD=Ug7Bl=9#p zSILbbjiKJ-bwSqjDMd!%ZE1|}lit-15L_xdc;)RO;OCF$yoW0oD^A5*23&d%4EO|O zHl$bNi`kT}=9cadC*x?$RSU6Q5!wv(Wwgn<-+iUCN2&E9%y#q7J)I~% zXy&mK9!txthF9=PKi53U(6T&?yd2;!m<5vo2y<$;FWMD^r!pG;b7Mn7};!%hGh5Sv#Tzu2AM}w z2;9<#vOF&3Fw&Q(&4rbjsFda_+iG&Sy0xoObnu^4vL+Q}I$YP)yZ!&TyxnEgrQ6y> zs<%?1J_La;7tkSj5)^*Av%Ao}5S_YwC*y1#_0;ul>#51-x zlLTeqy0ss9*)Dx3*XYM;`IcS+r)&2i+!W2x(C;bpm|-vC6MB!KTSMNjznb->o?pfJ z!|E_w9J8W5V6`^`6&o6R>P!Xxh*X~bxTeDIYP=qRJN3zkoUK%4w_6>40uY=FGYntCf z3{#arA1Q^e%Jf06)GfCV_jZuJ3_Z%p>pvvV>QPGz(w4u*9n(rO=#6v}W)ezE&Y3F! z>6XGBj*RYQcU+uJ7AU5e|r|bO>!flkNNc(-bC5={LqqYdXNy+%2y@`*lLB{zf9@N%e8!!+Ez-5rDorp z3#w+sC*pd~TkD0$n8OXyJ>32k_q_uvAGNnVqqX;eOdEJ-N(V;jquQJ_~b} zZ*AB<@=(zJ*oo`YU{mX>j^c*fxk19tMh~iy3`4n=5s6~HZ}J@*pRuxQ&`N9y2UAao z&#}J`=am2As@pe-9PPYPFtX3ppGnKOSs14!_?K%6ctd8;^Khuw!@lI~=T^hvY8p_* z=k&!lWu`vYu7G$~L|c0S9bY4(s~P*dpp+YM4JbCNU-kEhT9;gxpB_`y{L+&bN=>$x zCf&Xy_c@v-Rn9~&>ZjeD=1aHr$c)xP{q&;tq7$}=`jtId)wuas zLnlS%QAh)k!x{|CCCEr=T5V6&x8Q;eXIQ@n-(CF(rMc?Is{KLvfPC`H&nv5D4s-f) zwy?!h@`Yf`*&oXln`!BF_}t0*>pLP@_788YK2oZG(9<#a&isoa#O6!HOv7ti>D-d# z{tzeb#^K$|k~0O$A3jOkx%Hx%3Fl2l$k4FD5^L#*)7J^Y`o8ThEt;81YIUCpujxwm z!)w#ji;ppvoD)sH2vQntCnu@s_AXzUsQeU1j^(CmfEK&IRg_@S)J`?>uBzecZqjVy z*<3%vnsGHdCu}6voEo^7YpD_!nHta&q4M>QZnqDy_|f;gyF4S$tuk0LhNm*?7SIfZ5K!kw_S0T-<%|1cIEewKmatEIOoj2(i-D8t)eh!Uj z&;3js@Kr*}p>or!m-^UWRn+0jnXHYPs9NuWW6nW)M;j|pnKsbsB*_sNj{#gLi$!)eg@<-QWy6?g&*Tc zoOZu!HmulRA;wa-!f7NJqWj)fyk+~iQ_=4uxmrLpP)PspyIqY;(+o$mYPQV`)gUo|2E z2?Bspd6s&|4wK!wNOsNECwZAW9e1v7t+3Ia)Gar4Ydnb$zj8Od)*Ha&w(*T7`Bb&? z^m>>bUpA zoaw3(|FbCKD0hVHVZ#;&uqD$yhErE8>{Cq$DVwEV{0Ss$7{FA68W=$vZ=~ zR-0!I(T42{2i-JTQ8-<{kAO!&-NcYCWDf4AZDWIHB_x_x+XDVS<)Ej*3^+=DfrSPyfK z+4vgqqLL!Un~7)F@1cyqr^{UDCJJg)1z+6m1Z(aFA`-9EhX07u%f=2J(+P*Xct`*0 z6#gCK`Z0w+TfZ6ocKEAU!F>(=w5HN)+SIBD=Ow%$ozh1?5ni#Ee+^Zi%B2>TOgK*O zneHF1JTSLFRa$+>pL;V^^mAP**`UJ3r-X56{OI?Y-#xi?xY|sxSHy5R+~2LJ!cB=T zf+>lIb)eCFZwnff&$`eq^`4p-`D=oi4&km55gwc;L@4D(>2X%K$0?WSLR_IraXvou zPZFrl_jZa2H^m%@j9D5TJ~v1mVK1UMetD=ZTYj&!aB1B9JQgvr zC;JbXadUpXDpJ1cTQ}9GtKD;scxAOYBGw(=9if`~-qU{>RebT>f{aeAQi(`HC7<^% zkhi!CTG*cC>V#A#@x8vz9?JeE-<8=&e~tW|KO^j!$=xp3V^hix;kxnJ7KqcQ-!AFv zq;(cu#ts*ltY4uo%z^b_iHiz$_-_e}zdMGW@)kmx&{hp6 zYMYlszo`0YV~q-aerLWiN<}g4xQqREa9fY}fUZPQCYs(Lu0g(kf6x-^F73DPk4apF zDo7^&tyAhJ90YK07YD?9@ND71CB1Y=qk2Dn))z&TlmSmfDc;jn-YcL! z@pzwg8^E%%n_%yJRP}aPUHW3KiH0ZxplXLpG$%*72 zJ#^t=d{N+0YDS&vy?Ri@g284Fmd5xHiYYoax}M}}b1-nr`fSWjUD4S~_%IOIysyfI zmLHU0m}7S65dB?FiCD~ktgq;pySou_mdPJ;kr!q}x^O%CL1(wtus9sv;2wHVVB=Eh zu|Lr^X-s@fuO3Vp2i?~-i;^Vf^qWLrKItjgTwWvDu!fo0RkbC4pnOAld&{3%OZ&3l zy;UTG_~#Q>eS{A23G0H4dT3wCFRC>OJB3W~py~OH3GTj~cYmH;*|k3ihqbd*HrQzb?N2f|7niBIo7+6Ou`wzEy^muJ zeP4jrn{H&;vJQuj-T}}`2B}H(Bm+a*$(N;SiyNauhm-?>-U4qRHS^;i-xL5Ye@Gl7 z8KyosE*^I4EXO=SfBXsi80c>L3=#D~Yajeeee3oFdQbeu&W$g$^EX@(hHzrMr1Ntp z&IMs8`2%hp7kgW$Im;*p+uL*agSDrtAJcC@`5M=cj2x_KiAqwudy-(ul-H;qFpI8# z)3b0^|HI-#Vn<-CmC<|uEXoNRi|6}`Z>$6;2YLD}GGAzW5FjZ}R1ssQ4uYDD!&aR_dRzmTN#| z%?8e%`Aqj*ds4!Z{wOGq_?8z2iW_R3ye-BT%Me(#IKH6JCt-Af&(b)`)3sahRRbB= z{tqWq>hw30#1k9ZV%JM(hL)_N^|kilgrsoX|- zvMPvs5OY5DR{DTlO_q{q_5CJqErnOzY1Y7AnS`)QuMOg^jYH?J&kH zBcH0nVoq7X?<`mFr>iHmAfM@K|A=vxN2Q%nTOj%?(6YnV%wPOxxtvrivu*k9^2a*c z9H*TepPB2YGiBzK^C(_=6-Y(LHO~I|>2_PP$e3_%CU-~ope@EMc_$K?TV}Z`<&G&h zyH4K>F{Dts=NF1e>GOhpdlZ=P7Bd~&e6XIe&gZNrRC}({VsSV5Dyach8RoJwVg7Zo zoRuS`;LpT;9)Q&6wD0a$-tYLuSl@|$kf@S~U5u2!{=`XkKBDnkLCbr;J$A_s1>CjK z6oa4Qs$xEIkW1~Em#=a5F~f`=Np)PPw4pucg@-PDm&|!2X7UV@&?w zYk4=Xd_w3lm4j=`=c(9tqw9aSNn0e3cgTjk=IoPRyhpVeZ$>G;Z2N&R_%c5e!-1yA zZ*0qW5*|>6Gqa&Orc;#%h|~U{QJ5Ka64T+xd!@#IN<&ZZH}JT@dkc0+)A;yf>j3@f zmA;=lRjA=5L!gqYlT2m@yWS?aBf!k?+>2o4j~YoGH4r1$i}qsXj+(Ba6Z9n;MznQ| z4hP&m>!jby_U2|h{>l?;W4dsu)+xMIJmCE~&-!;dClwm1;_`9HLx&r@(j@(m^e^o7 zoxkIrDFhuPod9^LW#3y~iLl(hn?i>xs=F`DJ6fq*(cqANFX?jdugwR~mZDU5To;Df znT z8^g@kbyM*oLrhT8g7m#o*6$NW#GP^Ua)f&LN5e~-kcY~RmPxIA*VHJqN1$!XK>q@V zmCFcMgKosj0XJ`fBol4w!;w0tBu4s{#jmnV&B7}0tLiZQ-P0d+=Yd|de{Q7_cw@z8 z9u4Wa>F_d)}GIXYo_yHSSfoXK|+9(3?AQJ{-*K_bFHorkih4TZpteowzz3 z^IqcxsHfg%Lb;`C9?9b`7Z~t2QB=8gmjs#!K$%F80_>LZGonR|KaUR}!{np{_oG%;)hf;#l zH?+ktr^DtW;?a$Fstt|)#=G(gdkn$xX4-8PR|aDbuct%|4gqc|lR2{N-=$unL_Ur~X%ucvxwP1hp@!z4-9 z%R%q5J=+&oxR*S@b9P`Js0u^qh-3tvg4{2Dam$-UZ_mZ>3c0@sm z@&Wflsyxj<-)!I(;a!B4{DMQ}QY-e( zLRixaxvb3z@%`n5q}pp3-l&H%iL!}ybJ-x((mujSva;!@WB-P+`_d|$Y1@#*fiy`%5TH2|ZYbf_>rm2GZT>K)#6tB0o6|YjsRNl)bP441BY!>)8}%I0|z@w`>$q>I_POHoDWh3x~4c^y0CJhoDd%+k5lLoLtC z;@I<@XbeW*t7m73^O;I+(LBn+%PX`!wB?A_x;a1p@z28??U2~Tv6ap(sgJrTv1G+3 z0}-fWtGAbb;V&>1#hmdJVEs-H_)7ZGN8=5}=!r$+f%`m9`8JcNtMPed1 z3NZ0HjkNjhKXcr3JNuRsx_#nu+b%Zzs;5@`%p$Z(#9pK2#e(3gd=cGV{P+K8CJ#YW z?oI$7=dr)~#Qe+L^!H4cr$dGC@6Y_DaoYUN5bSHD4^ez{ZElM-f-h_2f_ zv6wd}ErY&TsBw=u^@OAc)--6Js4z&+n+H3a^16KrFl6bZXXaWB{TSrU$nLvRu~&Qd zby+QMSP1O6-nRVB3#c%Jx(#gASaDD~9meAik_ znCRhoc}c}&@3g;C)eJ`C-3RQ=A9lk7UOn886r`W}9Wm>n;^m1-K-O3<4g)32{p;oF zaMwAYxVosNZu69_k#~>Yn4%_ZqaX5Ld+z$!qbT+V_-SL{RuUdW_ti>FJ9S}r;3@s8 zAN8m=qeZ&aT)dXhW?G#Y9ca&@=%sQnKeNoaVRX1RbM~jE#P+6v_AuTFCxC)+5?-ci|g_O&7P3KZDNb(69>i-$)+0UoCL9iwv~DKqApbu)d~Pm$IOQ)fSzxVaT0 zq+SBLmGzT0lRm*{l`#dY7u?jBgoMa&3VKjXe4zdP_Y!96j++McbuDhrpb@vWX!#q% zDdcAfOZ#6ud8^g-6jiMf7vym?n(1p|?Wv6gFf;)<>%2aEdM%1h)7 z;|C$TA4kX1P`;Ee{rcP-I#0j6%~B0jZQT94&z3jxha|pEd@X!-m-M5WKwT0UZy?MJ#Zh*42ScwE8yM~*)R#)*Gr6f9bC)#7St`apZ+rNI1wFq+$i@mZ6 zO>^HnXp`-_d#u5FoDYZOhZeOw8Yy9Z`=X~$&0=py3`m)I+~msYEWl7@D=dZ9PnA6| zGXS)ONjyAXoZ&iXq|x+oarwc_@q;^3HYS@cNOiDpgZ)vpDbrQvf?Af?55Fgvo+VE( zf5To%l@n_!_WSr&@HE__){R4cm)>`^^?K7C*&14@j*jQ2S;}E#=Re^&;mKns-<~NZ zyXNj+@2Y2rnf>nVHVDqF|8Koo^gY{or}!lqhn4|tTS zZT6~_W)+>qdE4x*2NT1babJ2S088X2uj?+Amj~n`cx-{QG6h^*H=3C4p%)*QneSgY zs#HmR7y7NJet?YZeWBq3cJH6_mq!`?f9;)TR8z~hz=J3t2p6O)C{09KLg)yDCa8!g zAXQ2T0YXb4fzYI?2#EBmR0TzpUPL-l6e*%q=_t~#DALtUDk)p;iP)-TDPqk_u?A(9+ap$J%p-O<#Y3AUI= zG1ke_B_;7NP4mt}7m_=V3v*$O1<-o5-jOrUqA!aao0*D<+OWMEHRlmnx7xVaa(O>O z6U@5*<$WWKu8Ox2+tJItJcZQdL!!^TX#i)MqEgH8&kuLPbkBK|S*81(F zDAaUrs2mo=AA1L{Jf?G_xLW;LL-lNFHNz$3V_V5q9WNdB943j}Qs<2vF)|GF z$1vY>W;$dVKZv~ryx$3%)E^V%=SZh0PzvN!tF&Hx_PSg-s6Wvf8*`xQrSOBmVa1wl zaib27u2@#8laq41wx`ZL>PPn{*oQBlxuuBLy3wlH zB!<~eDk{QuK8sHW+ol?+*+pg~R6e+5& zdOk_4qU6<9oc0!eOy^y7-;94%M0?s(arFwY%X<=fV2L~7y)|xu za@tf&1>#E9)kg#CU+Z-6Hz5Z;FD-I1e{6Q#7iZ$we@B(_YS4_NHLJkp0j-|*J^klV zTTx6h-TPBtKC4IkKiVRn~sYIPD%T|3AAJOJ_yJFn9Ho`eKv_?MwuJFjA?d{zVwq!frJ(YhxsC`?Z z3thh4^Q8+SOuh7=dFN@xxKCV@R_Kwyh7D??Se@eFOo?$RA@1;)D@s1DL3a5FT(WA{ z`smUH(MBVIE%%+?Tj6O{y`Cj7>4T6a14H$}yVdB!FW?O4|ML%XcT1F9K8)0U1mJ6CrdB>((Iwt&sVD|_J$_oAM=1EiiUf_fsd-yf2vkr zv@qG{rCk)g_bKAJQ=Vxod8tsW*MQgK$;#pGcAE1H-2URR{_?rQ&HD2Ja~|%~!rZFV z9}+DKMbl=e9IShKC+b#@(_MXCcbTgqPFnxPv*^?x^2$s4Fzr^XajG(8AmT^F{mv>Vq4fV;AOm`{e#+Br z#!?l+ec_WE?prhh#>avRO8O@8ex0>rA*U@VZ1pUmYuoaCD@}rk+R6`9PWCHBG3G11 z5wQz7uU2Y!z0`zM=;af+$D22G!Id^UVtkq!FRS4=I2Y{>jmlgT zfnh1)T;Li!9&VS4{4wy8I)D7JCub7)-mf9>4l7rya_VJ%*7fpe>K#}ZZv*9=)Bb^Z z$Xg^btg1NL$_E|gJW={Mj~m3@TzJ9k^a;gkbjj@VNYUJeN~*}NQianV73|W*y2T<| zd#b3%fJf#R8IQY&(sqW#k^9b!SG@;$sfHza)}XHIUYmPfOVSPy-z-v!)IC zywot&he_JwSQ+P|hdn>(>6ygn+%~~CfZ9%+35}Osm2}U%HE3YB^_G@5hTG}9kmrS{ zhPN?{21af>xT7C-4v#*C#zd)o`n@motXd(dlh zY;acjef+e8T`K;G-a`9W+z?Jmp7SI4d|et>*yW9TON%)=nYiW+x&*lQfhN?0);7gp zJ<%isG;n6z{bp=OUZqjxhv#0CWn~~oVal_GUN$yYUby+3m@)l>wetg(8-`zB3qeH>!3ZoQ_ z3zy5Af~(9{_B?HE{o@p`21lUHaSy{BwTT_qAYFr}?-QFt)K1(?fQt2Ymaqrwm)wBc z7(5!iaI2`$Ijm|jr{j542Mu`}3pVB`%(uQYR%yb9=fuPLhm+aZ%RPFZ$G>1GKUp0(5 zC=nOvEx!?_BD6PcDz{$d21+4ZP$x4hIFWyTi=lEqrX;#0sZVk?9;4HT$TL z?!cQ$VXy8KP#*YI%(y-%eWOB1UY@qEmFiw@Et=~{>iF>FR96u4JZ8;IduN-avVZNC zwi}JJPAS)2M*L|qb@7cM{}BcBR`|(H3m^L^oepxm>PW|YVT@~i);o6lbh}dtjNTi; z&K=pex|sF`XzB}h(2RBn0vmPP-F|HF%Ebuxx=ZELj1+gkS_7NI{tC%7_qy{j zTh%Qe6edF=sE)Loxv#6RybNDq9e%6no^$_=(t=6E=k_y+)m=s^rYw37v&K^*C=N`UH`^IJ0-qCeHb&nLqPbgoWiZ;4@ zXT(FH`N4vQ-AZ-qbn{YoM!nXbN{7a8;<^G#uey<|`BrZR(s{NE752BP&^0{0T$cK1 zv+`N@qiZYuvr;by>=UKVZ9i$rdaE;H?y}{S?BIP#xg(EWo`E`}{H1qRA$P!&lTQ!U z$t0SK4cbg&hr`yIR8xa?YTk3vD9-4s1p9mtE-lYxPkWhQzQb>w_`cf?^9gLw-xbz^ zhlAF%xhj+LPaila{$gNbyPE8bMZ)vXu6=9F6-!UVX4>w(*eIiV-m$XdJ0WDg)?!fo zIX2Jx|G&uWw?jFU#GZ&hk+lK>$(o_`3~`29=j0G*M^U&H+7c=1?uhyNSEBMTcMKe1 zkHm3VB5hDk3OpYxYIwL%Rth`@l3EZgj4IL=b=uPfsq1-O58-K#khS80DN@V3%K;7? zkvKS)yQ6~>R?c04=c`{iK;CTz^KgAt!PzVDDDMu)WvF$5OBL;c(QfZr5&Y;ib@ z92ktp<3;h}qG%Tzu$Zi@?5-OqR0Plv!Fo91;O-($Sl(|={_>-S#3Ec!7#s@i#I@@e zZi#lqDe&;@4)o*teqWB59|JjIzq11-% z1S+lvk(CpJ$Vos%ATj_h0w>=zfAgV*wnABZ5cmMxNb5nx=5>m$B%n6i!HwR*B z1;@b&9Q>Gsn4F|I;Uu&Ob-(+O2k(L=0RJ_ryUc!TCl(MZ#E*DjTwNT#hTRGQMmiuJ zkxn=)5EHRqV`7Dnvqrl(!f}cyN4O0VjB&D&2mfsRx95kkMeoKG{U4UikM6%Oo*!Lu zs%Qta3lIyWqPRTxpPK*eNdxOoOX~;Me_ZE|j^KaVA6VQeH(=|0--`ceiPiJKAi+9F zEZWrtfjs2~gz4vg{Jv|nwB*h>VR3LL1oDiUA}}3M6v|2tE-fV~1(A>ukw98WiAYGw zh>OTrAuUCqaBH}%1XLCwV-5YfaDO%bb?E|qYG{P(?&|pN+UkGln!x;TuC-lIK-Ppi z5a{gA{(n2fKe+kZP^VE?Ag_4*wQ;^Bs;}Ee7wPtFlI0rhn|Vc;%UW3l zVcPoUY1ig!H09uk-OQ+n*iB?eD|zrQtv{#ryBX^L8o+P<3C#cV7-&}pw z`p-_VXlooE?t)ad0oKI#9DU)hZOf&qy8ASeA7Tf*#-IlQbcUvPOwuJq^+x|4YFP1TtpEODv)py(jY36 za1ljBs6fI+NQ0y5z-(klW-A5 zM5sW*MM#6FOu|JJ5upMJ7aFG>FP1TtpEODv)py(jY36a1ljBs6fI+NQ0M+0)RgsX{pXW>&*>VmG}nAo zFgdZ0;X&pqIg@QC7t671#l7$_2R&SGSW@@R*x-!2ffe>rcf~FFi^QWD+%RD+wsHMp z3>CF@7o7Q?^nYT_(K#VV{utT?ebf?HTAZfmQ#vt!G(gwR#8?S0;S&__9(5EZnkK|g8Q0u6}f$rHrZDO%dsPR`uf}T77+Tt zv;)ul8ZF^K&AXxO?CcGoQf|`W!-wtNSP=Itm{R;bOd(H%MX3##0y}7xov(0zb~;)r zJzy#HE+)RFf`bzDt~tE9A((MPRYm2k3`hH$XRqKRxnNITnmdkQ@w9tAX0@)sjS57M)GT&hD=}6klRpXh-+gAv$?2Asc^Hi z`Z<2aizX(AFB%(rZq9V)1n=9oucFIti8}VIr0?=v|9P7ZL_V3Md)=2kU1dqw)vRT- z>iU-{uNTF|#j_{f=2kOL^UVxbd9Bd+1Ox`MgTg>jqUO~c9;*xR#uEEpYgacnDS_A) zTLVq(g=Zp-R-pJ%tMK4`mbT{(;f&>mR3-)oC%dH2L7n3|!KAGN zrDE$(g|c*CS)abY$giE^fQ{Y3O!jGD_AH%mrQk4)3io{^zt4AhZ(cemEp>XQR{WmL z!O%u+sJJ-e-Me>>_I7tS#>K@sx%T?Xtm^58n3MXErt5y^n&(q`}f#S#`$B!NB296Og3JD78 zSGfGi0xVl^T8ra;+{m`K=*BGH>J5%te5cWA>!7(fO=e0^T4klYTStllZ1{<@>T}Bi zdNwwyDl?cU47T&~&Ye3sa>-7oZ+R=$V1W{dzE1Y`yn2F{nr_rmjM9;yB5_8uqzD;g6UTac5J6FfIJw^uP0ot>L&W~i@UI_v`pZ${MD z*V`EivwZQq5@VK!Zy7yPPU&~1{m|nreFxzYzXd;xy!+=`RRh=>^iWvkN&KI!2dS?$ ziI|i=qNAZH0x9X}ylyKkE&T#aFazk_Jff6dMQ(0xE*{=o^ksQ@y|}CltD>SJ$7$)l ziQ6&9tAo=(O46%Yd3oVOotzqNb&>9+5+JftdBjLxs$DXUs1+qbJbi$RaHbn%jV?z+|(46ougys zlgocHreElrx22RHK}2XWJG$#{hj&8H$omPpFLZSvwAW1|ZpHV$dPUDEjdwcWca+jm zB|Tq5H2!{0x1H;yOWikHT3U7>2gsxN7?_x@c6D{-_2im*bq}ZN=VSr}di4tog|7w$ zy)|7eC9lEwfZg$j<1C(kp)w$5$*-&Gatl;Gq*=ftiOx+lCtJ*fHXMUu{oGbS1 z;whesy~U_Ek6yfZvE;S#r)flN?2<XoL-q9O)8^jZn>5|)xtqvP@ph&o}1g0=fk)-md~Sgfk#8s zc&rCX9m~ShdB>o5yhTdoVD{6ep0A&}&L*AWVJJeq$?~!*@#JGw?r;S%U&HFEJHMo4 zNyVc_!gQGA9Zm9_?Ckx6Pn_?n3ot=-vWq_fX~c(j9{~1P`yJWnh=c^&WNGw~=;Y)o z-&f0L>+J09$)Qka3{a`N6{vfBw7a`o3p0m+u$=}{9~#0oXeKQ!A%R(*AHZ7x4sIF> zTNf4I@{PdJ`7aB_|^zBLT=vGfpGboO6B6R!|0Lq66~WxdYL0aXpdo z@nwsEb6p@kH`|vO&-^)5u{|*{Q2;O$F?)hZ7lA^f(os)g($Xv9UIKUvCtq7no{fR= z^>t4tA0MCowZ%!@2Fn6x0CItZ)+|Re+X0Hgd-vW~4Gs?8lKfsb;cN?Q-fsf-(LB7o zlrBKMy}iA#xaj3GHvRGA2qQgx8ha=Qhop5QLgv$&H$N}$yX3ap(yRkz=1(wVnGIfu z9f~dB?V(?%xZgn!k6)3Ae$j;<$?cu(X9>M_Qr}s=JHcO4Qc`PuJQQr#=dc`MUaX*? z-~&vD0m0m?8^+G|3<5ki9Rj$nwv>omb0Mu?YAd>(YCQ diff --git a/packages/client-app/internal_packages/keybase/key-present@2x.png b/packages/client-app/internal_packages/keybase/key-present@2x.png deleted file mode 100644 index 8b5c27f035f4ad93a23383f61ff51131f3f98ca6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18218 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 diff --git a/packages/client-app/internal_packages/keybase/lib/decrypt-button.cjsx b/packages/client-app/internal_packages/keybase/lib/decrypt-button.cjsx deleted file mode 100755 index e11f60ae9..000000000 --- a/packages/client-app/internal_packages/keybase/lib/decrypt-button.cjsx +++ /dev/null @@ -1,143 +0,0 @@ -{MessageStore, React, ReactDOM, FileDownloadStore, MessageBodyProcessor, Actions} = require 'nylas-exports' -PGPKeyStore = require './pgp-key-store' -{remote} = require 'electron' -PassphrasePopover = require './passphrase-popover' -PrivateKeyPopover = require './private-key-popover' -pgp = require 'kbpgp' -_ = require 'underscore' - -class DecryptMessageButton extends React.Component - - @displayName: 'DecryptMessageButton' - - @propTypes: - message: React.PropTypes.object.isRequired - - constructor: (props) -> - super(props) - @state = @_getStateFromStores() - - _getStateFromStores: -> - return { - isDecrypted: PGPKeyStore.isDecrypted(@props.message) - wasEncrypted: PGPKeyStore.hasEncryptedComponent(@props.message) - encryptedAttachments: PGPKeyStore.fetchEncryptedAttachments(@props.message) - status: PGPKeyStore.msgStatus(@props.message) - } - - componentDidMount: -> - @unlistenKeystore = PGPKeyStore.listen(@_onKeystoreChange, @) - - componentWillUnmount: -> - @unlistenKeystore() - - _onKeystoreChange: -> - # every time a new key gets unlocked/fetched, try to decrypt this message - if not @state.isDecrypted - PGPKeyStore.decrypt(@props.message) - @setState(@_getStateFromStores()) - - _onClickDecrypt: (event) => - popoverTarget = event.target.getBoundingClientRect() - if @_noPrivateKeys() - Actions.openPopover( - @_openPassphrasePopover(popoverTarget, @decryptPopoverDone)}/>, - {originRect: popoverTarget, direction: 'down'} - ) - else - @_openPassphrasePopover(popoverTarget, @decryptPopoverDone) - - _displayError: (err) -> - dialog = remote.dialog - dialog.showErrorBox('Decryption Error', err.toString()) - - _onClickDecryptAttachments: (event) => - popoverTarget = event.target.getBoundingClientRect() - if @_noPrivateKeys() - Actions.openPopover( - @_openPassphrasePopover(popoverTarget, @decryptAttachmentsPopoverDone)}/>, - {originRect: popoverTarget, direction: 'down'} - ) - else - @_openPassphrasePopover(popoverTarget, @decryptAttachmentsPopoverDone) - - decryptPopoverDone: (passphrase) => - for recipient in @props.message.to - # right now, just try to unlock all possible keys - # (many will fail - TODO?) - privateKeys = PGPKeyStore.privKeys(address: recipient.email, timed: false) - for privateKey in privateKeys - PGPKeyStore.getKeyContents(key: privateKey, passphrase: passphrase) - - decryptAttachmentsPopoverDone: (passphrase) => - for recipient in @props.message.to - privateKeys = PGPKeyStore.privKeys(address: recipient.email, timed: false) - for privateKey in privateKeys - PGPKeyStore.getKeyContents(key: privateKey, passphrase: passphrase, callback: (identity) => PGPKeyStore.decryptAttachments(identity, @state.encryptedAttachments)) - - _openPassphrasePopover: (target, callback) => - Actions.openPopover( - , - {originRect: target, direction: 'down'} - ) - - _noPrivateKeys: => - numKeys = 0 - for recipient in @props.message.to - numKeys = numKeys + PGPKeyStore.privKeys(address: recipient.email, timed: false).length - return numKeys < 1 - - render: => - if not (@state.wasEncrypted or @state.encryptedAttachments.length > 0) - return false - - title = "Message Encrypted" - decryptLabel = "Decrypt" - borderClass = "border" - decryptClass = "decrypt-bar" - if @state.status? - if @state.status.indexOf("Message decrypted") >= 0 - title = @state.status - borderClass = "border done-border" - decryptClass = "decrypt-bar done-decrypt-bar" - else if @state.status.indexOf("Unable to decrypt message.") >= 0 - title = @state.status - borderClass = "border error-border" - decryptClass = "decrypt-bar error-decrypt-bar" - decryptLabel = "Try Again" - - decryptBody = false - if !@state.isDecrypted and !(@state.status?.indexOf("malformed") >= 0) - decryptBody = - - decryptAttachments = false - if @state.encryptedAttachments?.length >= 1 - title = if @state.encryptedAttachments.length == 1 then "Attachment Encrypted" else "Attachments Encrypted" - buttonLabel = if @state.encryptedAttachments.length == 1 then "Decrypt Attachment" else "Decrypt Attachments" - decryptAttachments = - - if decryptAttachments or decryptBody - decryptionInterface = -

- {decryptBody} - {decryptAttachments} -
- -
-
-
-
-
- {title} -
- {decryptionInterface} -
-
-
-
- -module.exports = DecryptMessageButton diff --git a/packages/client-app/internal_packages/keybase/lib/decryption-preprocess.coffee b/packages/client-app/internal_packages/keybase/lib/decryption-preprocess.coffee deleted file mode 100755 index af535a294..000000000 --- a/packages/client-app/internal_packages/keybase/lib/decryption-preprocess.coffee +++ /dev/null @@ -1,15 +0,0 @@ -{MessageViewExtension, Actions} = require 'nylas-exports' -PGPKeyStore = require './pgp-key-store' - -class DecryptPGPExtension extends MessageViewExtension - @formatMessageBody: ({message}) => - if not PGPKeyStore.hasEncryptedComponent(message) - return message - if PGPKeyStore.isDecrypted(message) - message.body = PGPKeyStore.getDecrypted(message) - else - # trigger a decryption - PGPKeyStore.decrypt(message) - message - -module.exports = DecryptPGPExtension diff --git a/packages/client-app/internal_packages/keybase/lib/email-popover.cjsx b/packages/client-app/internal_packages/keybase/lib/email-popover.cjsx deleted file mode 100644 index 83ed85976..000000000 --- a/packages/client-app/internal_packages/keybase/lib/email-popover.cjsx +++ /dev/null @@ -1,31 +0,0 @@ -{React, Actions} = require 'nylas-exports' -{ParticipantsTextField} = require 'nylas-component-kit' -Identity = require './identity' -_ = require 'underscore' - -module.exports = -class EmailPopover extends React.Component - constructor: -> - @state = {to: [], cc: [], bcc: []} - - @propTypes: - profile: React.PropTypes.instanceOf(Identity).isRequired - - render: -> - participants = @state - -
- - -
- - _onRecipientFieldChange: (contacts) => - @setState(contacts) - - _onDone: => - @props.onPopoverDone(_.pluck(@state.to, 'email'), @props.profile) - Actions.closePopover() diff --git a/packages/client-app/internal_packages/keybase/lib/encrypt-button.cjsx b/packages/client-app/internal_packages/keybase/lib/encrypt-button.cjsx deleted file mode 100755 index dac9934dc..000000000 --- a/packages/client-app/internal_packages/keybase/lib/encrypt-button.cjsx +++ /dev/null @@ -1,160 +0,0 @@ -{Utils, DraftStore, React, Actions, DatabaseStore, Contact, ReactDOM} = require 'nylas-exports' -PGPKeyStore = require './pgp-key-store' -Identity = require './identity' -ModalKeyRecommender = require './modal-key-recommender' -{RetinaImg} = require 'nylas-component-kit' -{remote} = require 'electron' -pgp = require 'kbpgp' -_ = require 'underscore' - -class EncryptMessageButton extends React.Component - - @displayName: 'EncryptMessageButton' - - # require that we have a draft object available - @propTypes: - draft: React.PropTypes.object.isRequired - session: React.PropTypes.object.isRequired - - constructor: (props) -> - super(props) - - # plaintext: store the message's plaintext in case the user wants to edit - # further after hitting the "encrypt" button (i.e. so we can "undo" the - # encryption) - - # cryptotext: store the message's body here, for comparison purposes (so - # that if the user edits an encrypted message, we can revert it) - @state = {plaintext: "", cryptotext: "", currentlyEncrypted: false} - - componentDidMount: -> - @unlistenKeystore = PGPKeyStore.listen(@_onKeystoreChange, @) - - componentWillUnmount: -> - @unlistenKeystore() - - componentWillReceiveProps: (nextProps) -> - if @state.currentlyEncrypted and nextProps.draft.body != @props.draft.body and nextProps.draft.body != @state.cryptotext - # A) we're encrypted - # B) someone changed something - # C) the change was AWAY from the "correct" cryptotext - body = @state.cryptotext - @props.session.changes.add({body: body}) - - _getKeys: -> - keys = [] - for recipient in @props.draft.participants({includeFrom: false, includeBcc: true}) - publicKeys = PGPKeyStore.pubKeys(recipient.email) - if publicKeys.length < 1 - # no key for this user - keys.push(new Identity({addresses: [recipient.email]})) - else - # note: this, by default, encrypts using every public key associated - # with the address - for publicKey in publicKeys - if not publicKey.key? - PGPKeyStore.getKeyContents(key: publicKey) - else - keys.push(publicKey) - - return keys - - _onKeystoreChange: => - # if something changes with the keys, check to make sure the recipients - # haven't changed (thus invalidating our encrypted message) - if @state.currentlyEncrypted - newKeys = _.map(@props.draft.participants(), (participant) -> - return PGPKeyStore.pubKeys(participant.email) - ) - newKeys = _.flatten(newKeys) - - oldKeys = _.map(@props.draft.participants(), (participant) -> - return PGPKeyStore.pubKeys(participant.email) - ) - oldKeys = _.flatten(oldKeys) - - if newKeys.length != oldKeys.length - # someone added/removed a key - our encrypted body is now out of date - @_toggleCrypt() - - render: -> - classnames = "btn btn-toolbar" - if @state.currentlyEncrypted - classnames += " btn-enabled" - -
- -
- - _onClick: => - @_toggleCrypt() - - _toggleCrypt: => - # if decrypted, encrypt, and vice versa - # addresses which don't have a key - if @state.currentlyEncrypted - # if the message is already encrypted, place the stored plaintext back - # in the draft (i.e. un-encrypt) - @props.session.changes.add({body: @state.plaintext}) - @setState({currentlyEncrypted: false}) - else - # if not encrypted, save the plaintext, then encrypt - plaintext = @props.draft.body - identities = @_getKeys() - @_checkKeysAndEncrypt(plaintext, identities, (err, cryptotext) => - if err - console.warn err - Actions.recordUserEvent("Email Encryption Errored", {error: err}) - NylasEnv.showErrorDialog(err) - if cryptotext? and cryptotext != "" - Actions.recordUserEvent("Email Encrypted") - #
 tag prevents gross HTML formatting in-flight
-          cryptotext = "
#{cryptotext}
" - @setState({ - currentlyEncrypted: true - plaintext: plaintext - cryptotext: cryptotext - }) - @props.session.changes.add({body: cryptotext}) - ) - - _encrypt: (text, identities, cb) => - # get the actual key objects - keys = _.pluck(identities, "key") - # remove the nulls - kms = _.compact(keys) - if kms.length == 0 - NylasEnv.showErrorDialog("There are no PGP public keys loaded, so the message cannot be - encrypted. Compose a message, add recipients in the To: field, and try again.") - return - params = - encrypt_for: kms - msg: text - pgp.box(params, cb) - - _checkKeysAndEncrypt: (text, identities, cb) => - emails = _.chain(identities) - .pluck("addresses") - .flatten() - .uniq() - .value() - - if _.every(identities, (identity) -> identity.key?) - # every key is present and valid - @_encrypt(text, identities, cb) - else - # open a popover to correct null keys - DatabaseStore.findAll(Contact, {email: emails}).then((contacts) => - component = ( @_encrypt(text, newIdentities, cb) }/>) - Actions.openPopover( - component, - { - originRect: ReactDOM.findDOMNode(@).getBoundingClientRect(), - direction: 'up', - closeOnAppBlur: false, - }) - ) - -module.exports = EncryptMessageButton diff --git a/packages/client-app/internal_packages/keybase/lib/identity.coffee b/packages/client-app/internal_packages/keybase/lib/identity.coffee deleted file mode 100644 index a406470c6..000000000 --- a/packages/client-app/internal_packages/keybase/lib/identity.coffee +++ /dev/null @@ -1,53 +0,0 @@ -# A single user identity: a key, a way to find that key, one or more email -# addresses, and a keybase profile - -{Utils} = require 'nylas-exports' -path = require 'path' - -module.exports = -class Identity - constructor: ({key, addresses, isPriv, keybase_profile}) -> - @id = Utils.generateTempId() - @key = key ? null # keybase keymanager object - @isPriv = isPriv ? false # is this a private key? - @timeout = null # the time after which this key (if private) needs to be unlocked again - @addresses = addresses ? [] # email addresses associated with this identity - @keybase_profile = keybase_profile ? null # a kb profile object associated with this identity - - Object.defineProperty(@, 'keyPath', { - get: -> - if @addresses.length > 0 - keyDir = path.join(NylasEnv.getConfigDirPath(), 'keys') - thisDir = if @isPriv then path.join(keyDir, 'private') else path.join(keyDir, 'public') - keyPath = path.join(thisDir, @addresses.join(" ")) - else - keyPath = null - return keyPath - }) - - if @isPriv - @setTimeout() - - fingerprint: -> - if @key? - return @key.get_pgp_fingerprint().toString('hex') - return null - - setTimeout: -> - delay = 1000 * 60 * 30 # 30 minutes in ms - @timeout = Date.now() + delay - - isTimedOut: -> - return @timeout < Date.now() - - uid: -> - if @key? - uid = @key.get_pgp_fingerprint().toString('hex') - else if @keybase_profile? - uid = @keybase_profile.components.username.val - else if @addresses.length > 0 - uid = @addresses.join('') - else - uid = @id - - return uid diff --git a/packages/client-app/internal_packages/keybase/lib/key-adder.cjsx b/packages/client-app/internal_packages/keybase/lib/key-adder.cjsx deleted file mode 100644 index 6d947f1ff..000000000 --- a/packages/client-app/internal_packages/keybase/lib/key-adder.cjsx +++ /dev/null @@ -1,213 +0,0 @@ -{Utils, React, RegExpUtils} = require 'nylas-exports' -{RetinaImg} = require 'nylas-component-kit' -PGPKeyStore = require './pgp-key-store' -Identity = require './identity' -kb = require './keybase' -pgp = require 'kbpgp' -_ = require 'underscore' -fs = require 'fs' - -module.exports = -class KeyAdder extends React.Component - @displayName: 'KeyAdder' - - constructor: (props) -> - @state = - address: "" - keyContents: "" - passphrase: "" - - generate: false - paste: false - import: false - - isPriv: false - loading: false - - validAddress: false - validKeyBody: false - - _onPasteButtonClick: (event) => - @setState - generate: false - paste: !@state.paste - import: false - address: "" - validAddress: false - keyContents: "" - - _onGenerateButtonClick: (event) => - @setState - generate: !@state.generate - paste: false - import: false - address: "" - validAddress: false - keyContents: "" - passphrase: "" - - _onImportButtonClick: (event) => - NylasEnv.showOpenDialog({ - title: "Import PGP Key", - buttonLabel: "Import", - properties: ['openFile'] - }, (filepath) => - if filepath? - @setState - generate: false - paste: false - import: true - address: "" - validAddress: false - passphrase: "" - fs.readFile(filepath[0], (err, data) => - pgp.KeyManager.import_from_armored_pgp { - armored: data - }, (err, km) => - if err - PGPKeyStore._displayError("File is not a valid PGP key.") - return - else - privateStart = "-----BEGIN PGP PRIVATE KEY BLOCK-----" - keyBody = if km.armored_pgp_private? then km.armored_pgp_private else km.armored_pgp_public - @setState - keyContents: keyBody - isPriv: keyBody.indexOf(privateStart) >= 0 - validKeyBody: true - ) - ) - - _onInnerGenerateButtonClick: (event) => - @setState - loading: true - @_generateKeypair() - - _generateKeypair: => - pgp.KeyManager.generate_rsa { userid : @state.address }, (err, km) => - km.sign {}, (err) => - if err - console.warn(err) - km.export_pgp_private {passphrase: @state.passphrase}, (err, pgp_private) => - ident = new Identity({ - addresses: [@state.address] - isPriv: true - }) - PGPKeyStore.saveNewKey(ident, pgp_private) - km.export_pgp_public {}, (err, pgp_public) => - ident = new Identity({ - addresses: [@state.address] - isPriv: false - }) - PGPKeyStore.saveNewKey(ident, pgp_public) - @setState - keyContents: pgp_public - loading: false - - _saveNewKey: => - ident = new Identity({ - addresses: [@state.address] - isPriv: @state.isPriv - }) - PGPKeyStore.saveNewKey(ident, @state.keyContents) - - _onAddressChange: (event) => - address = event.target.value - valid = false - if (address and address.length > 0 and RegExpUtils.emailRegex().test(address)) - valid = true - @setState - address: event.target.value - validAddress: valid - - _onPassphraseChange: (event) => - @setState - passphrase: event.target.value - - _onKeyChange: (event) => - privateStart = "-----BEGIN PGP PRIVATE KEY BLOCK-----" - @setState - keyContents: event.target.value - isPriv: event.target.value.indexOf(privateStart) >= 0 - pgp.KeyManager.import_from_armored_pgp { - armored: event.target.value - }, (err, km) => - if err - valid = false - else - valid = true - @setState - validKeyBody: valid - - _renderAddButtons: -> -
- Add a PGP Key: - - - -
- - _renderManualKey: -> - if !@state.validAddress and @state.address.length > 0 - invalidMsg = Invalid email address - else if !@state.validKeyBody and @state.keyContents.length > 0 - invalidMsg = Invalid key body - else - invalidMsg = - invalidInputs = !(@state.validAddress and @state.validKeyBody) - - buttonClass = if invalidInputs then "btn key-add-btn btn-disabled" else "btn key-add-btn" - - passphraseInput = - -
-
-