From 13832d916f4bd6152d43668cecef68b869609752 Mon Sep 17 00:00:00 2001 From: punix Date: Wed, 19 Mar 2025 21:24:33 +0100 Subject: [PATCH] ssl encrypt and decrypt works now --- Wire-Py.desktop | 2 +- __pycache__/cls_mth_fc.cpython-312.pyc | Bin 11820 -> 15605 bytes __pycache__/wg_main.cpython-312.pyc | Bin 51062 -> 68832 bytes cls_mth_fc.py | 115 +++++++++++++++++++------ install | 8 +- org.sslcrypt.policy | 2 + ssl_decrypt.py | 24 ++---- ssl_encrypt.py | 38 +++++--- wg_main.py | 62 ++++++++++--- 9 files changed, 176 insertions(+), 75 deletions(-) mode change 100755 => 100644 Wire-Py.desktop diff --git a/Wire-Py.desktop b/Wire-Py.desktop old mode 100755 new mode 100644 index cda2352..f3e17fb --- a/Wire-Py.desktop +++ b/Wire-Py.desktop @@ -4,4 +4,4 @@ Name=Wire-Py Exec=/usr/local/bin/wg_main.py Terminal=false Categories=Network; -Icon=/usr/share/icons/wp-icons/128/wg_vpn.png +Icon=/usr/share/icons/wp-icons/128/wg_vpn.png \ No newline at end of file diff --git a/__pycache__/cls_mth_fc.cpython-312.pyc b/__pycache__/cls_mth_fc.cpython-312.pyc index 9e274fb9ef4312970d12bc7ac9f5d2e207404956..0f6c91ad64e4918a706b0f57ec0292d4baed22a2 100644 GIT binary patch delta 6893 zcma)AeQaCTb${>i@sWHa#ZO75L|W8`CDFFT$njU~D2;4O{)jB8mE6oyJeB5qk|
44plDm^K4LkYMY&F2ROknPkhe@~jNr8lW?|R^H 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 delta 3853 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 MwO2l4HNN7%0V!2UrvLx| diff --git a/__pycache__/wg_main.cpython-312.pyc b/__pycache__/wg_main.cpython-312.pyc index df0df3af69913fafed5c0dc54ece66ff6cda41ec..ca880e7f037ee0d9ad6fc231a2e655d0249fd821 100644 GIT binary patch literal 68832 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 literal 51062 zcmdtL3s_s(c__N|-Vy=?i1)+dWf10JV;jFPHWTMcieQ!}XT)+#WL%BdXGb?b;pk&%zQZ&tAWdAa+qAcG^>QnOMu+Cv|N0B6x66< zR8dYj@+v4+rJ&AIZ=bwET~(c>t|+Yej}Wlas)(wO**zEGZRok^=(%L;u{)jcOHpH0 zMh(6FP6yL(ce?tbDv#$9gr^QeY@5er!%rK%=7teB+u*)vXB`b)hwHj7ItCr?9%-3k zol89_fzUSrAsrMVVYl)I)vI6>Z_wSU8`M=rxB4W7IUce151r{BVq8~xVn{_2(}9}~ ze^35<8by6g@h0_V_D#wo#2CvNqkcp; z)m~_0F@H}n|7`#fCE*zpVnSOAc|giC6T(1c0xVbjJJ$&wr-U|U@YkAi3 zF+8=rk1_DyH&fSCOo~r+nPQ7qQ39hl(J82*qE$f((;=CB0ektfC}6_!l=EdAsONp+ zn@O8a=j#b=m&bpB{AH#N#suN(`8eWR%WtgG|;cmg!QlRhTm9MVcuGS1+m60X{GBEnh39BCa;Vc!b!8L|EQ8AXlaW zCU?40tPQgk%3@%uz)eZgCP(=6#5Yszqs25<0cZ8;+GrcaZWn|(EoD$>nKBm^E z9?PDt6LCyF{ed$)g!pFaeVXZpWpkB-T<_CLA>-zym1FaUIBXVH1gODFVkvo_EH0J7$@;Mhtf}Mcl%$OESkuiziSH#?BNIoq=QsIu zN&9cNm_F}=a>}d({7M1ys<1vn%=0{y_?GRv%`nf$&5oW|cnGG65D`OT*#mYyOnk!{ zvW3r^%m#8f%CsS~74R*#vxW738(>KqvmM;@B&C+?^J-sO9InXaEeB`yrHgRmilIqK zZFi8`u1Qh~xtcUHJEvRX(i@hfw~M5AeiiBMifftO&?Y9P72J#@X~@;E+Gi3=v$%ciXWGR2zDqHCephuZ^RvxDzRb8;XakRDP=gD+Uwq4AaywvhZrnP* z7uqh1*$1vUNjmZ^m?gHvD&VX>3AwzAd8m=ESCYJBFb`rfJe2reG7rhbk)4P3dwTg) z_5O{rwARx<0z|ESjO8ew}JUPHqbyT`%S zdwQHv1sl~k5hkj4J3KZIQtMGQV`ncdR!Io?{vOwmyWz@k9p~A!wc$#i?eg$Y{qRuV zU0@g>>E9JcokjKx_)*n*-l`r5Obo`ZXSbAor;Gc#M)qE+Dih zA2ooaf5OA4Boic%LsEihnVi)m=XIYsXHD{)M`gP5?E_p#CU)^C&xg@=KEj5IDz119 zr-m8mDvPVPm&LC3>iK{nt2(Ocb9ka^*RW$Ko(Izi=)m@S9Do<3Q?YXzqXz6>*RZD_ zdJ@yJTwkngxab;mGz^an^l(5_3B2VZC#K$J z>mTa(*lhL9P8aZp+%5H7BxH)Y-vsB=>(qRD{yU!^`+O*UjeoS8p996s#_tP`UMK3RATqvbIiHv0nG$s@3wfS-z822X4R=(%4~7t)B0uca&jIXo2b zjqY4D04HzzcDHBL>4<8$IY2eyb}SmmL{W#+0ht_n)%_R|Y zMbKQ~KNB|BAxhOF4%I)_QKmzRXIlRE;uGXUu(Hy^YnY1 z4&u4$vA`H%EUwEAmPL-~@@w*-yARjoXv)DMw}&0+!Rg*xb-=+oEIlySyDiYz#1s-lJr%2NBRzJ7%Br%a& zVe5gd+Nf-kZ0sk3PkYg z%Ga;&+0@$$Yo)r^HRJ&Shl_Rev96IJ=8*wnSXFEbyjW!SMb*Q0=4zZ20%tu$^CwPl zr1A&Yro^Uf_#iwG8tZ)_2t15JGS$OUQb4^+{jQQW&T%jN9qAC79T+E|y% z6V;A#Zyn$pfAEONo3I>rHm&^5}QgkR5TE~mqO*|DnTA`mu6^$G58U=$h47mS$^V@c3h z5;3j~8rR-8R+EN_>W*@IKC4nh9hel6Mz@ zvjhzT`_F|+&;NR`jz#t*i+%Fk3Uau!;tG=JmoQNrYy?9VbH@&^zZNK1jSVjnG;)dy0Y=S>qa3=7i9;!s-J%opL?D)1;V`WGP4 zWO#HYRQl43$0JFJSAs{0(f=K`nt(^_M)>&%si3H4ACQC&Tq!Qwog)r!MvQEAJM3)F zMI>imT;Jz&WpP_ZT_do)y6mtp97Z!q&>$=JJq{C|zqZLhOiGZUvVLmh1K(ZW?5Xda z|IYcq;oeYX-&eKwO=bV;OWAWKm4s??_^_I45{R!uHTgBkRJCBriI~cQrm~2sCTOa; zZ>l9V^yYTDEC+GU8G_Bp9@o&2gKShwz1i^Lq=SXMfixI4b`Az+k#375QXo0;La&MBLRUxp{q|kBbwe`6R)^i}I5Y5(r z18Y}2n$0(yd7@IRJ*#-(n3kmG9L9Z?niI%BK;%HJ4GzV0u_?!!VzFPg_rnt9bd)~A z9m$JBm|||(LA-EX8FISpjAh7i#S+^IC&3dlA2$v`Har(W)luSJv|p~K=T-QZ*Ol@cNIus zWUSMpHjcF(%>a_9*JX3}unxx%_t7-y0$!+#we=9X$96TEDUB2ZOpG-e)w2$Fzn9x6 z5u!gz_c?$_2YQ0lK@FmslgN={aX-pdqhrNT70?t>8kqMsRJ;?JZ&Aasi!P7r;Gn(F z5!C_z7J2niJ-WmA0aj(!4%~eMZs%;h#IJ{sz5RV7EHM51*nTFO&XLk$un}l#@t39p zw|XpU7eoy_1?Rkg6gZ{>%6gDCw{eW7#F)*t3!b5<`T|grQ7ugRr|oQ1jnSesY`n?t zKALW47#mSG)g4on4ze>;O!7~wXbHpm**1~;?`u)<@ZBtM!T0#PF}H;#>R z(?Qfo+TaW!i`~{-wiaumwzGZisP@to@`i4)Gent@EyYGhf|Nz(4vS1j7Ihg|6j!sa zqH_Tq7do$@a|NAIbgrTEIyz+8`Xc(?KnG{%sNQDlaoXK(n~iX&Uqy~e;}x5ew!0-ZXh3(|R$6#?4nUweFuh?OejCONZdX1c!p@;6_eYmc;_4Yr>RoU=vF4F}H+2iCq8%y}(LvkTdIH_uL-o%DRg z21PU=v~EoIj&aO5{?gao-`M)@wJBe4&5khL{4h1+t9AaYP-^94O0934%AZfqnY0Ge z%je@6zxPdzOL>6L^Z@eMNa-6Ea`SIqo46LJ=?dqb!o~qPggzCkGwzw}x_$oE`7mAc zRIAf(cxu+@>z}4+^mU)4Y4tUaO_YAkLP7Cu>n*Fl{oMwDO~>MXCu*hsg5ncerMEscP(^EQx7=!( zs`#McZo`~DTzH7X7A#R7AX0=b4${T`<5N(G;xJv0z%O&aj}6#9q?V-YX9LyP9dY?i zihn3l>9Q&H2dQ^c zXU_-dvM_xJa|R5H(3L^DGElp7?sDLz3jw+^O!o+%NPp-8+YXa1>4*>42DTm~;fEg3 zl?!==x6^K=0k*z==k?js;k@=(0k}L0f^>nubSfi27li3`*eqwI%|gn7aVEC~);5Ld zEkaJxz=fQ=n|%{~lgw8JA@LL;&YB>-#^3ecxjW}(jRAU1nBI$@QpQpuH2E|*dyWJj zd_Wfon1@IaD%cc<5(1{h`u<@`+IZDlE%U~lcRI&9{TVkp!^ZM?qv@TaV@D&#%Am0_ zu&yOwtPC4>L6uT3VwFLbR*yPkEoWHt5ttdt$DdoXVu^) zW(Zbvn=NXv!S0Y5aiZU7v%NNAcXD6I;t@@atu{Rlr_*M;t6={#t{lj}-OVjA$mwR$ zG2sVPZ~ycS>Y4hQQd9PrLYHi+NsKt*2PT2flQM8bMSe!ntzwjKP;iz+1+IosgR4bx zN7Q)IV`n`lJ+9%lu1;^A0T;cK7hP8@B;11H4*Y0oBitw8Xj{mZgT#y5xg(imLgkLUT@soX#gk#O^L9(TNC#V2KATf6{I3V#at;9v7gx_-H z72(Xe0K?|{GPv1SbTfut(}4Tm&1jx+)&@A^OkZxunkH7HbFm1+0t?> ze0jMFgbFOE-cZiMSBHjHwg?6l&=b8sbv=7{ChRg}Q| zUrdmI22~b7ZKNn~T{G@xvdX^L=!FfDZEe*l&OXa#EzF*Z?~Bz;WZ?g~^>P zFwqoAlY8@$b;e&J+~>godImOOhFb>zrbzj=VEMK=bENfnu=O}07y5(e`U7rHIB!ID zV>Xj9%WckfzwzZT_Kbq|mD|JZ z0OF?0UGgIocPPSq`Md<4K$9e!J3Dah?0oTaXR;RH=Fxva3y=gpMa&RnV=oRpswFEa zbl<9%(hP!7amcZ01<0`k>VG^3BTgYkoO$sW5m#3Z4OUxM0tIT@lD=of1vP~%sB8#v zgRG_>p)YM_(fJE-Kqb@Z#vLy# zyYO%;uTfZeq5Hl0N&D{q1~@m)XR>QA^7;bjUyYm}2%aAZct*l`msha%c5-VkF2H9v zFYukx@*}C1V5%jQT6ROZkdk(T{nD0k`&-QdZH!7RlcRx}ePQGNrGfX2`;ovVR5TxR zN7%R&e8+ubGg-+ytvdGGP%(BEo$r7X)!A%}tH)*|bPXHEaNO?Q<%CD1;aC)y5Qpq$ za^cq-)Gw7v4gCqN(byE9q@`=NJ}E2F?Br-;jE+4mJb(n`d4j4W$!X(JHBj=#gM-5^ zHrDI*J4%Wo1TPnA*@K*7K~ay}|8fj>%RbQUcGr{0Z4Ojj13f}a3AXp3Qs_ZRB;l*W z-ucQ!2doLK0$}?y(G^fDDS| zuw3cGdRidiSWE}Q6|3vwh`Ux;_j(|u3l0nGK&A)OwBK{lHR2&l;4tfgga)BRY`@!4 zZ-M#{vPQ*(Fmp`F34&c{XQ;}MWkVyh zzn!%M^}@#bDXvAOaP|?8YY;@qs8c;^abJXPbPPdtpuOUfA>9UmeCzRT0trKNJM5rg z(PIalz+P0sh^c)-bJSYw@Ph?$$*^k(=|5;Ew5q@>hPnV6Fo@G?1D!%r16VLnB6Sg? zlSYENaXk>XqyfTm#Ck8m^_4SYNKB*@$U}aq<9-PY81hXZ=SM-e6UKEkl_L#p+zv>b zN~3zOA#}4`w)55`n zYYGpf$vr*=BWzva$bizP97y56iEm+RufhW}(jzlIg)E0d*!Evj`_zm!ACdyHU`6Bu z@Kl7-F}l~mR>HW7{TgsOINvy(ep@QaYUnU*z!# zMroLoOIs++|A?3uV~lGt+DFS-zYtnX@6-A8mnpZ-r(;r4>i~bT`Fe^;gH!40*HRc0 zoafEBmMWf>_ZfUCJ|mpGjUhOk>QW7<<4TaplN-=yX}+`p6cr{skY5(&$JZ4OjEFT9 z`iC)JYKPV9BTp$0K2XN{#J5l3spNk#*?fw88Lp-KH1cVq1rvrUK+>^_haW)3V#4D~ zm!vP)XAp7Pr{?oSn<;$0z%|SEsj-gNOhDwJkTc<7a6kUs7O_4ETdR#vb6_v;6W?+8ypInbILQ0NcU(+yj*uI}vMtDzO6MpX z-Pbb2na-CHH`it^Gp}dz*Z?P!6V@qMKgAJzSS&y9^HHx$P9{s@9^qq%@3=azaTJ5wj9&vh43FSRWN^Ucw4f{rnY1?%?0J>g~t! zM^N9MN)moFN%+Ym;b-`84{8dLhc`GjN_kGmgmuY;q0S9?22S%n@eS#v!B{)XhcH$i zOYqF}C?%LRtLgL>oh0%DiS$51Jz16B^fUWm6O0N>gh+9FwKetl8+6+Zc+3^doiY6^ zI{|q`^+*LyA?~Qcu(&q4_q~~+sv^I1nNuFd^8*b z&IC{ccvi?hkex=|GXM^zxV_U4Gm)FTxX`x#XZx%#ie z&Ncn=QNyKD^nW*?C6n2fW32yh5jL~?2t&aGV>@$@_4NUdvlltmgL zs&s)?8b{Q!xM_^0prpK&VSt8nM^nhL3maj>g4W{51t4{M@Pm;v+Xp1y@Q8=~JIvt^ z(fJ2VLJP<6pg>VAr$R^M!BIU>NI>Bsk!0A9ij73(9yRr$-v*TE6&uNn0Wa6a9jrh?9#4$+{%p-X0ZZiN9 zHd}(jaotP+%8dj#1&zW>Z*d%XnfQ4vRLOl1I{7;FSly-2moMa&MshaUaAicz2aW8%CRLgAp zy>+|i&IeANy|?!)oROWZ_U{R0S3jn-0Fqm(m+|$tSVI8{FvI9ziW=3uc(bwGzBY~LKRyl_s*|bJ5?E6 z(=fATw(FZMbEkqE56xRT<|{k>%K6Hp=xhY1y3em!u+&U7PO&qMGb2B>?0ia7Yij~E zEpw_+W&2~Qs&v=Ky7`KA?;W{wWTtAi{hRgSiq?gynyDS3sx7l+_o|u~>Nb9G?(VtS zypJ}0oF3ZqQmF3ilyZLa?vJwO&V@jZ*mXMCdOFa0Cb0RXDZ@f_%?J9s`kAtCF|#e9 zrb9nD8909K$F^Y8`Ed2i^Bdddx`P{!PSNx08a`;c+cb0He{Wu>ZJO216@7d;eC9&r zOn>l9f9TAmz!qn?c5tC~OQd#Buy)T}d${)C!|KLJ^{!y`uDRTgYXdL68n|$AzP01y z-oWWs9;+0sidPl$y#xQGQdpe|sH3&vgOs}|GY7uQ%)FGQ`3s-DesM{K;+ZC+a6{>6Xw|`^bd`0zphwdDTRBR4bY@V^tn!lIxot$vR z?znJ-Yuxnh+HcnWr+NT7j34<#+rPc?*f6UOmN(Cv zn&-1y#+CEgyU-~IC-0SU&4Q_boLO%4kK8xaJx--6c0OxW!Z`dT4$sABLkdzxQiH{3 zt(ZJP81poJQn~qngevsO#IG(5ZDDB|p<3`<| zsdA1}`ajEWt%M(c-a^BdfR=`6fwXb}32f9H+o=m|rNJMhG{^O+L5&V#2928I*(t#c z9mEgjX^xlbgT*?43RY;2*Xe>*9mZd;KhdBH?x4ZFry*{7G5YHj;KDKF1jao3H#jGw z!ZW)bW<>TO`nIEELFaFI$Ar@*(!|J;*8@vFht?E4F`rgw%DLzmvj_f!2RW4ZJgERj z-smi+u|`bKYQXfYiv5oewTA~pVAPcXS_UlF0?&omoGp=RCXIn5EY9X^?`N|*i*{ip z3{UulyAtvc+qHt`8u^8#5xf7Ey4TU z2^E8%W5C@7TfMPa72rzwIM5aX_lge#+?U~Ffz7(SINX^XmNy?6TQV9>!0G5(svqaL8%fYP&snT+AFDGOMKbZ|oe3XZH}UH>%oKt|3g9m+jVn81xqjU&?bjr^%j`Ll*vy$b4B_6TcRTemFmM2z+cJanX53 zco>ix@8Gc%WXrVYGXG^@l=q2mu#pb*6+YMWiE;^;r!gb)3|!-V;(LsGU1BL+68Cj6 z4)2rJdFV@$_W1%ILwrl)F1O0^{Q|fm&`**XSY}<8K*aV1)G{l%1R^&71BBQzzaf^K z_epCYiMdR>#I1{O@M(!}zy_JM144y8rWlvp%Fz4<%^0S4^7A^h(H=eqK>a4~7vHk; z2#j9XNwrMx;?n`CJz8Hj5bMimkzXz)x%sof7jGedrEu$|7V=|jZ5yn$#?Rbh7O~E} z&u4^HaL;r*zgvXXYUjT}9dGb{@tvf#OiNk|EiI=qXlXf(*$-|ya{ye^b5_r7Nph5L zRf&c7Rlu#6S_vP*^;)iu@;OTEgs%c_z0~^lXYRW)u?Kjc=Plkh@HX!g-w9)2KmP?v z{_lCe_)gNRDNB0wAoO7da|ql_<}kQfOb58;WqMUENBK6ESR7AMQaQNwK0&hxZkoYf zU3rcY`S~i~)=MpW$Mx#C*s8n_Xu{0tBmDXVW9*>#W#G%aUwq5A^Yfg*>vUzg^?`DJOxm!;Hs5;!@^ z(ExpSj(LU2mvY)9y^dmuga^jI4RV-F2!@{ob6$Oep0@M*45*DjK?96`DU2*GV5#!S z>~Mi!%VD(kz}PHc7;p=djL_=X2$jo6ZlpE%3ix&>v&c%}*83#4OAWO!4k%L*(+e)% zD7Mm68hpZ?QLD_oSS+>YKk#ij@cX<^d`ow+GWQf{-_GE4f2@6-?DqhSoMva|z~`+= zuGqp|D8LEKQMtuyT`sPNwYx8psLLknxQYr2L}%t7u|zx2L1q$B!{HQikOLnx^&8cJ z$s_l$eTdzKaazFvl@Awanh@K$V9*>C1Rk03+m8`SBRM<08$%DH^Jn0AX`&qB0IR#W z$A~8$-0Vk>lGfED&*WTj*!_1CH zR}n^ff}6xdK(LvIIX=>Z1GhRl9PFbnf;UceAL*Se_#jZvMi&Q1+#XOqV!`El++dgJ@Ni1|Nlq=AL3SIgNLJ*8!SX#iC+uqLhr~$2Wa8Y26=z?(Wh~F>3#~q`;ex0>obQ5T$ z!Eq+eRvI2<@ir`j`-uR54t?TAPSmGhAu>I4yzxs{CQIM)fyJzdsWfORjhNO2P3vZ= z1EzIh(+)JGl{S$UF;xall~V@-rpmBsb6lX`KArhN&fT1_X+4IgPozgoYlEh>Q!fQf zYww$y9_uMn5s}G*h8yUZIUQCoGSBHmfsz=gWr5kbK1XbBe1v_-Zh;!#Jn3nql}+r!11OvH&8wGoQE~k^XV61WsG3+8H{m}1T z(+7mlqDKyw-;aGBOBc;5C4t6#5*~;tyM@5L55Htwqr~F^44BSA&MI7YjIJQw0Y5eJS>Q|S5Pld zS;tlO8}$EEW|KC3_*=R zj0x;{p&fvE(!hTiGx6au8!$zH7oVwz0d75?s`zHI$(D0k{;Q8782r2NwNZrOeX_V1 zcSW>klMoj+wu#S}a6vY~_QcQdTTUg2pB0g51LfMj6imKcd^?i7kSJO9m|3vyUK%EkLIbofNF05gqIo(q7y_ z6YUmXS+_H|Zs)8$xNdi-sC8VA z=Q|pv4h9Q0&+38&yXMTH?0t_ZWk%)4mEuW{&7p#Al9L|KH1Hixo@5kG?)RUc**beR zP`E#AI)Id)VZy*skp7BD*`{FGrkUfxvMpiL)&;ni4en(7hB{EWEo9jq&f2k1UNw~# zD&I0&6)bNZ?^u9hViB7|MO(-B&gWYEd++61=ktmpd9}g3+DP8|VBY$fjBwt@gs{Md z)^J`M3A6_DtdYEp!Mu&LHG#a1;k>;Ic}2HVZl%EOl6e~zpnNG4DPM2*mxPMee{18+ z=-igzmP4V9hl53j!=?^si$FpBj4G792`ouxG|kcr`Ne^fjWZ`h`P&{-s_drOvv7_D zwCwYnCfo503-iIi-GNzisJ`XinwEKs^}X~v=`-s4md(G^K%8eP0C}c@l+ezyC1BYc zDr_33=L^dtg>}I~IL*NQHswW3mY~Vv&kLJs9+-AL%z}&0zOrS~{^jO*b6&(;88lZ$ z%ndXm&O>81O*BoO_;Rzq{k?s6_D%KQtJngOZyugFjJIh{m5m>Tn+zAs zmWa77Xs(-L!sdVescK?f!d-0Ya>@Mnh270dq4wFFF-X9pF40l!2v zS$tLkmHZ_(&LXKQ*s0BE`qk5V%3SgZm6_TosmufO?)m)I@wWN=J?K<}Q?zG%?}E7m z?s#kTvs0UYYToderm|ZVOX6)?60Z^xUnIBw{YGnkM>+LjQQ_fc)rVW!E8)ivi&8ss zR6n%lcjz@gQe~l=OGC(y*0dMF=N~s~I<&fzM{ z*B_}<{b^P%y0r>$z3F>6WtF*}U=zK>{}NoXOx2c6!H)@ARcL z<~n}WHRiznjdcE2VV^0?2An7q>;pIr;;DHKLD0-tcmFVMZj<0eCI`K$Nnk0+>)1Ni zakGsCa@>*$UpSs*8+iWZ_jW$#va|TAtZbCWRfT}O5!cZm%uR)IKSCY|NGz`4l`U86 z<4w1f!kwVpZF7WNjH~^xb%EH~<%*fh6UfC{awFc5gIJu4Noa(R@w8+z1mR>@t3r^a zAYX%4O}2ZugcHW#i=QxxV#OYE**L=wu{v{@v}2ix@_E3&6NghT4na1_Aqd!Jgc`yc z0u(PN#s{m5F%yr^*<~hcEplC!_cOK@0lxhlT(Kjr^t^an$&5qsmCZFvLB0`>7cj>N z4>G5TD94YY9L1Z4n^Ygj!~cWgErV!Xa4cn|l6#(w$+IOHC9x%kmWNbux49bbGtj`@ z=32PhToCTa+-)wgZ1^w8TSwTuiFwn@=8bJao*RZ<1(-RfS6_y9DzPPq^(AQ=7?vvs zFoIKLZ*RbrBH`h48%wbX?V1D{mx_c3V#;VeFuFLQni?4Rg5V0z0W+y!$1!d7Z4+np zN)Tu<0^8h^%@+^SH=)>$$0j1I()ct3f)*wp6V6WvP^&Ldd@g)$UgdAnQ`qX4D*tNp5_$jtbK3zz!hWCqaIboN4 z&eMXRE>6gZdLIdoMD!*I)_6=~yCq+Rk-}t?5kZUJ(EJt}9R^!vmSLCM-4AL{-rBB7GTf#VqVz$Tk8jD97!zR8WSE@b_dbIA2p71`W2G za1YPRG>CH*KE;^wGWFYvn+g!f8q}Z__6Mpf3Zl|O?3IAkIA#6%sIuo`G}Aro=mG0- zps&T-fR0^@5>xZhH}`>w=c~hP%d*=bFa*!-3Pim|0r&^dUF06gPyZWA1n!xS%#@9v z2o%Lp?V86C|HCe8kyMAu$==7abRP+&1oOH zRBJg2md7vFTH5SAm)z(jrl&t=xn^L01t}7-SyT&ZT>ZVH-c;y|*hS9upeu_)Gfs2r zGfFX zbWm`|=AeVpAMT2)L+JZ^jI2kW0iD0YpMQu>FaGR9ryrcCfyi};+=_h-0<1<^DGrzb zqF7WGiKZ|PH`rJw_dZ8c(O?*n5@GdO+;g!b==>f!wGiKpYHb2FZrL5v=FaAXe zWDsKhA$Ik5!TIOwRJ3$Qz*vG>e4B2zOteI@DuY>-p{%MVXsBqXV5q1T z4HfN6G*t9318$wW`O3sAf>E$gM$MG{UPgl)c&iL}$b4j0{k^pBq(!zK3T{0V+S(B| z9|>n1k%R9^gnvw1G8*TtbsrSmEr?im2d%q9*0%BXuz4-qJNlmCj^VwuJ84s%NJDF| zp>?h_*w7xb>>WS&z}x}S1HW#nXy)o%{>MiHFWVz8Ukbi_De|%___8bX@@s)LY}o7u zdu0ClQ1OOu?U~ij?GJ7}9NN?oEbbWJH(ypADQgUtHG(wA^X<=n^Yf7{2ZLJcRB^zXyZpP2ILhnTZ3lnRO$4I4^H1b9X4-5yKa{!F8edT z?1O7BwRg2M)_c`E7D{U)r5l5#8$+d=C)Hoqf*1_tUANP3rGs>;_ipcGdN^Jtv zeBWpfSa*ghTEe-z7OK`wb%v^T%=QJV_D&iXpp~(OeIZNpq-MUbVoGzbunr`Lk)rj% zqVR9jyzlUuP7EaoTr_Mu4%~e>q~fJ6z-vJrP9sX4 zL89D`3bO28jC=?jZ@NTU56i^%9tad3oJ|Pn^qF-yqlSIJF*^W;5W&Qt4mHi;Dq_*V zJU7zWm!Q}y*5p(`sfckan99F+Z0`Kn6Kd|d&hgAZSC+KJ02H3IMcjdbKf}<& z=i!#%n1Ow2kHdoXE5L#{h)l$Tm^iAkern_c-(BDAsqdZt&iVOPaAS5fP9ECmeU{N%l9<|0X&=04GZ0fFnvS z!#KOT&>2Ff0UWpq5{?bA{~cr3VIUq`V1FB(kI?xeaH2X;vbGKP_e8ZGmb`VarzM^g zxKn)y_VM^bvJ)d4Gvsoxx6t_z9aIA1?i2i7^!*+5vF z&H`KjW4M~p%l(ckpe)3PaJ$D}Aegw{B+5r&41M~#&4)3a-^cteqK|B7 zQzU9u(Ud(G9X*#WkPCH*zExCnbm(YrFIx&gRtwpoM)fgD3i|q6nAUDgs|}qFaNr&) z?ut1M2T;M7Uo!d13HQyP z3Fp2IBg+aQ|zhSC$X5U=q$E5+fFihiJ?<=ZP z>3r;lpM}iqo7M^IWV_!R&TNECb(p?xOotfbHCk{?BcqRHwQ`o#664GOA{g^&N=ixXQ z4A6ODx;7Sw$xPb)$EQ5ASrJk6w_7Tpuwes#ps6tpzW zZ4GC4K*|P8#4u)v&@j02{kegLy#YEuOz(?@zmq1Kl6Or(1t*gX)=za-bf_L<|eBcz4*3N^#5rrJN~yxSS6Z3))41n44u3}K}w zOZ}~+&TAjgg$tR*k<7|qW@RX|3ewjhS$AdP3YzY<+#na-L4_j5;-Im3(&0Z7HrC0Ee z*@7`QVyp@ptESYTL1^4aewPM~rT&Wh#;S*yXJyb>>4$IY9vDk;!U8h$E1w60;s>7d z15+&z8WFdRR!N#+V--#**>Q+8zqaN*=N)ILxo^JO`c$LLS%+8!#nY!EUUB&2w@+P| zc@6Pr8{YPNTzcCtA4wl5-yEi!B)Bjc3;IWOv%c}M4;Y%o3px2W2POvm=1A$5VCj}w z&-Xs}ozDfjx&w@3zG^F&UC+hglJWqsEM+W(8!mo@|FtQ0RzU{McFg~%c;n$k;l@K_ zy7Z32!()dd#-gCHX!2~Jx-D$ngWVh-c;C1O?>LML+#WXWSP~NhvEgzHZh9xYsCm0J zShjUe{UhUt#_;K$$mzl0>B0G$b!aud4vKHY;=_a$8X;>QK@gLX+EjtqW=n_|QHINgeKyfC|!%{I<4Wc1;} zAAf|lSQxy8_L zey{irO!lzuZdfQRxxMYyHhg-(DmmO6~xm|6!n zdZ%W@M+wx&5K=DqA)Sh-Ki+kpE_i0s!vu(i*_###bM|M&IjmCkiBiKFb#bH~5-GT? zf3gVNljY9%@9s_V66{+OAGwo{l9C9* z4!MBb>8MV^6D-Y34{iYVbkDTw#P zxaDFT-Y4w~NEg&CxM!e}_la+5T#pd^ywkK&ta<*$dXnB1MCQn`U;hL67xu#=`*Jvj7n%>hY#MZ(E zowQHCRE`WwB%OHhkNqF$*rBXMl+9j1A1)~@1CF&c zkqbt+M}Lhl|A3At?!*}{QRex4wo(`&2!BrGhy5Xj2~07LuSYn1gx80{PBwubhS+5_ z5UvnQB%XxrC$fBgfhlfA2Qf;#MahjzlgN@`E%^2O;COT5_%Lve(hVp2dM=j2y6Qd; z4GMgi1XjjlvHe$1fu(3F_=L*R*FVJWt_WsSgfiCN zXj>4?&?JbAD^Oy+D^6tmQ@C1(rZRR)1=}Rr<|WapAg4w5Ho(Al+e!}=QQvRQIh3yY zL1tSM{P>~1T@9~4N!J|8*Zql^Mt@PO^6+-mk1e_AZc~7}^nx0~Hb<;x{||Kj3pj2V zMAU8$-~S^9qJ#WTH|h#}`Udq>Y13*7|EVo?r>36p;JKS+;G^)sC?F5fI7zrHUeT>) zl-(LIPN9B7(XC}PZ&2O3Q5D>3e*|DSi!O)2*VzMGRN=wR3E8-&LE50bqJZs%@X-e* zHBbeEdweSC)&um5C>uhO#{)Vq+_TcHr*wk=ixsv(!V|Z|2-{D&n|{G81C&&5yTYiZ z)%@fRa=$L_Y!e>X&{6{lVfYh5h0Un=*~@+5`%(PxocO&; zFZ2?>tdVjETS_qjwhD5T+w{uXc!szZ5tjGyTWJMoD}fa&ZD&_h?R4~d*y|7j6qabP zd^C(V@^O;oKY>uMc3mX{|KYH-=Bf=;us|9@Ub;cJWYFH{h#EM#5y+TW&X^V5N;xM)3LYpgstn~k-Z?Uz-(=v{$UV)qlyh126Sfcqw`aABH*}j zJdhQM8=N?Hy_rWwyId}3SO2hJDXte6q5yonPR(cIHSPxfm0JS8jBs@x(&`Us1IPM7 zuHR%=m@XqkGm^`bOqeczSZuj{_SRXyXQp><(~p`zY!0054i}$8;<$jsL@qc-b%*Iv zr2JFIQsD}}iuY>n)S!yX?jZax+dW^lHX#IViYseVz%-iMrg%yz^n38CGhj#TdTSRl zAb>|W?uq2C3+Arl^iJ*@n;)wvW1;*J8!{_YKy^{4Z2;OS@exPHr~eLHuC!pY z)j_*;!bz9203&KSSh)86D@Y4Yy$J0q^wCvp;1mG4PQ@5dzm>)bBbA-|taRcfU<;5A zhX-e4c)0J0R46sM+zgDd zqqNO72-<@-TQtpc$=2ua9EH0-QJ=$WsOxpPKm>Tf?jf62@ zk4bIcj#pkD=w}$mP@88cs#w2VEVy9PTELpH25@;T#hSqZ(b^>+)PS_4!MxBcVwuC#Yvg{8dgEsb&18vkGq=lZ_#%P9kLM3VO8q&N@pH=j z7gXL~P^Al0_Fqxu|0h-cip2&Vmq5oOCc86l;FDY=I z`4mot0`A5`_vtGtn@&+bzVYU^iEU3Q^gnG+&sXG*D{)u!lmhSLt(4k$!+TGa|FhKG zFP*=>@3B&;p&x5i8jwAup$G%{e}UYpDPX}j!5%@A^5(%W9DK9$3!USe0|h&0-C^~f zd9^`4@aPwg-dATo&ZpD`pFU2bjApoEPm}sH+6eX4q%IP5obTrswJWHP6qLXeK G?*9jif^C@q diff --git a/cls_mth_fc.py b/cls_mth_fc.py index 904f093..6897db6 100755 --- a/cls_mth_fc.py +++ b/cls_mth_fc.py @@ -4,8 +4,8 @@ import gettext import locale import os import shutil -import subprocess from subprocess import check_call +import subprocess import tkinter as tk import zipfile from datetime import datetime @@ -13,6 +13,7 @@ from pathlib import Path from tkinter import ttk import requests + APP = 'wirepy' LOCALE_DIR = "/usr/share/locale/" locale.bindtextdomain(APP, LOCALE_DIR) @@ -20,41 +21,98 @@ gettext.bindtextdomain(APP, LOCALE_DIR) gettext.textdomain(APP) _ = gettext.gettext -wg_set = Path(Path.home() / '.config/wire_py/settings') +wg_set = Path(Path.home() / '.config/wire_py/settings') -def dirs_and_files(): +class Create(): + """ + This class is for the creation of the folders and files + required by Wire-Py, as well as for decryption + the tunnel from the user's home directory + """ - pth = Path.home() / '.config/wire_py' - pth.mkdir(parents=True, exist_ok=True) - sett = Path.home() / '.config/wire_py/settings' - ks = Path.home() / '.config/wire_py/keys' + @staticmethod + def dir_and_files(): - if sett.exists(): - pass + pth = Path.home() / '.config/wire_py' + pth.mkdir(parents=True, exist_ok=True) + sett = Path.home() / '.config/wire_py/settings' + ks = Path.home() / '.config/wire_py/keys' - else: - sett.touch() - sett.write_text('[UPDATES]\non\n[THEME]\nlight\n[TOOLTIP]\nTrue\n[AUTOSTART ON]\noff\n') + if sett.exists(): + pass - if ks.exists(): - pass + else: + sett.touch() + sett.write_text('[UPDATES]\non\n[THEME]\nlight\n[TOOLTIP]\nTrue\n[AUTOSTART ON]\noff\n') - else: - ks.touch() + if ks.exists(): + pass -def files_for_autostart(): + else: + ks.touch() - pth2 = Path.home() / '.config/systemd/user' - pth2.mkdir(parents=True, exist_ok=True) - wg_ser = Path.home() / '.config/systemd/user/wg_start.service' + @staticmethod + def files_for_autostart(): - if wg_ser.exists(): - pass + pth2 = Path.home() / '.config/systemd/user' + pth2.mkdir(parents=True, exist_ok=True) + wg_ser = Path.home() / '.config/systemd/user/wg_start.service' + + if wg_ser.exists(): + pass + + else: + wg_ser.touch() + wg_ser.write_text('[Unit]\nDescription=Automatic Tunnel Start\nAfter=network-online.target' + '\n\n[Service]\nType=oneshot\nExecStartPre=/bin/sleep 5\nExecStart=/usr/' + 'local/bin/start_wg.py\n[Install]\nWantedBy=default.target') + check_call(['systemctl', '--user', 'enable', 'wg_start.service']) + + @staticmethod + def make_dir(): + ''' Dirname "tlecdewg" = Tunnel Encrypt Decrypt Wireguard ''' + + dirname = Path('/tmp/tlecdcwg/') + if dirname.exists(): + pass + else: + dirname.mkdir() + + @staticmethod + def decrypt(): + process = subprocess.run(['pkexec', '/usr/local/bin/ssl_decrypt.py'], stdout=subprocess.PIPE, text=True) + #print(process.stdout) + if process.returncode == 0: + print('File successfully decrypted...') + else: + print(f'Error with the following code... {process.returncode}') + + @staticmethod + def encrypt(): + process = subprocess.run(['pkexec', '/usr/local/bin/ssl_encrypt.py'], stdout=subprocess.PIPE, text=True) + print(process.stdout) + if process.returncode == 0: + print('All Files successfully encrypted...') + else: + print(f'Error with the following code... {process.returncode}') + +class UOS: + """ + The class is only for unixoidal systems "UOS" = UnixOS + + """ + + """ + This method displays the user name of the logged-in user, + even if you are rooted in a shell + """ + @staticmethod + def username(): + logname = str(Path.home())[6:] + file = Path.home() / '/tmp/.loguser' + with open(file, "w") as f: + f.write(logname) - else: - wg_ser.touch() - wg_ser.write_text('[Unit]\nDescription=Automatic Tunnel Start\nAfter=network-online.target\n\n[Service]\nType=oneshot\nExecStartPre=/bin/sleep 5\nExecStart=/usr/local/bin/start_wg.py\n[Install]\nWantedBy=default.target') - check_call(['systemctl', '--user', 'enable', 'wg_start.service']) class GiteaUpdate: @@ -229,11 +287,13 @@ class Tunnel: """ @staticmethod def list(): - dirname = '/tmp/tlecdcwg/' + + dirname = Path('/tmp/tlecdcwg/') wg_s = os.listdir(dirname) return wg_s + """ This will export the tunnels. A zipfile with current date and time is created @@ -298,3 +358,4 @@ class Tipi: return False else: return True + diff --git a/install b/install index 803ac54..2acfc1f 100755 --- a/install +++ b/install @@ -9,13 +9,13 @@ install_file_with(){ mkdir -p ~/.config/wire_py && touch ~/.config/wire_py/keys && cp -u settings ~/.config/wire_py/ && \ mkdir -p ~/.config/systemd/user && cp -u wg_start.service ~/.config/systemd/user/ && \ systemctl --user enable wg_start.service - sudo cp -u org.sslcrypt.policy /usr/share/polkit-1/actions/ && \ + sudo cp -f org.sslcrypt.policy /usr/share/polkit-1/actions/ && \ sudo apt install python3-tk && \ - sudo cp -u wg_main.py start_wg.py cls_mth_fc.py ssl_encrypt.py ssl_decrypt.py /usr/local/bin/ && \ + sudo cp -fv wg_main.py start_wg.py cls_mth_fc.py ssl_encrypt.py ssl_decrypt.py /usr/local/bin/ && \ sudo cp -uR wp-icons lx-icons /usr/share/icons/ && sudo cp -uR TK-Themes /usr/share/ && \ sudo cp -u languages/de/*.mo /usr/share/locale/de/LC_MESSAGES/ && \ sudo ln -sf /usr/local/bin/wg_main.py /usr/local/bin/wirepy && \ - sudo cp -u Wire-Py.desktop /usr/share/applications/ + sudo cp -f Wire-Py.desktop /usr/share/applications/ } install_arch_d(){ @@ -128,7 +128,7 @@ else clear exit 0 fi -clear +#clear read -n 1 -s -r -p $"To close the Window press a button" clear diff --git a/org.sslcrypt.policy b/org.sslcrypt.policy index 9aca08b..6a2c47a 100644 --- a/org.sslcrypt.policy +++ b/org.sslcrypt.policy @@ -33,8 +33,10 @@ License along with this library. If not, see auth_admin_keep + auth_admin_keep yes /usr/local/bin/ssl_decrypt.py + \ No newline at end of file diff --git a/ssl_decrypt.py b/ssl_decrypt.py index fb061b1..c020a93 100755 --- a/ssl_decrypt.py +++ b/ssl_decrypt.py @@ -3,23 +3,18 @@ import os from subprocess import check_call -import shutil from pathlib import Path +import shutil +uname = Path('/tmp/.loguser') +with open(uname, 'r') as f: + logname = f.readline() + ''' Dirname "tlecdewg" = Tunnel Encrypt Decrypt Wireguard ''' dirname = Path('/tmp/tlecdcwg/') keyfile = '/usr/local/etc/ssl/pwgk.pem' -logname = os.getlogin() -''' Remove the folder when it is there ''' -if os.path.exists(str(dirname)): - shutil.rmtree(str(dirname)) - -os.mkdir(dirname) -shutil.chown(dirname, 1000, 1000) -tl = os.listdir(str(dirname)) - -dirname2 = '/home/' + logname + '/.config/wire_py/' +dirname2 = ('/home/' + logname + '/.config/wire_py/') detl = os.listdir(dirname2) os.chdir(dirname2) detl.remove('keys') @@ -30,9 +25,4 @@ if os.path.exists(dirname2 + 'pbwgk.pem'): tlname2 = detunnels[:-4] + '.conf' extpath = str(dirname) + '/' + tlname2 check_call(['openssl', 'pkeyutl', '-decrypt', '-inkey', keyfile, '-in', detunnels, '-out', extpath]) - - -def create_pub_key(): - pth_with_keyname = '/home/' + logname + '/.config/wire_py/pbwgk.pem' - check_call(['openssl', 'rsa', '-in', keyfile, '-out', pth_with_keyname, '-outform', 'PEM', '-pubout']) - shutil.chown(pth_with_keyname, 1000, 1000) + shutil.chown(extpath, 1000, 1000) \ No newline at end of file diff --git a/ssl_encrypt.py b/ssl_encrypt.py index c05dd6c..5c46e50 100755 --- a/ssl_encrypt.py +++ b/ssl_encrypt.py @@ -5,35 +5,45 @@ import os from subprocess import check_call from pathlib import Path import shutil -from ssl_decrypt import create_pub_key -logname = os.getlogin() -keyfile = Path('/home/', logname) / '.config/wire_py/pbwgk.pem' +uname = Path('/tmp/.loguser') + +with open(uname, 'r') as f: + logname = f.readline() + +keyfile = Path(f'/home/{logname}/.config/wire_py/pbwgk.pem') dirname = Path('/tmp/tlecdcwg/') +pkeyfile = '/usr/local/etc/ssl/pwgk.pem' if not keyfile.is_file(): - create_pub_key() -else: - + check_call(['openssl', 'rsa', '-in', pkeyfile, '-out', keyfile, '-outform', 'PEM', '-pubout']) + shutil.chown(keyfile, 1000, 1000) + if dirname.exists(): - tl = os.listdir(dirname) - print(tl) + tl = os.listdir(str(dirname)) + cpth = str(keyfile) + cryptfiles = cpth[:-9] + + if keyfile.exists() and len(tl) != 0: + for tunnels in tl: + sourcetl = str(dirname) + '/' + tunnels + tlname = cryptfiles + tunnels[:-5] + '.dat' + check_call(['openssl', 'pkeyutl', '-encrypt', '-inkey', keyfile, '-pubin', '-in', sourcetl, '-out', tlname]) + +else: + + if dirname.exists(): + tl = os.listdir(str(dirname)) cpth = str(keyfile) cryptfiles = cpth[:-9] if keyfile.exists() and len(tl) != 0: for tunnels in tl: sourcetl = str(dirname) + '/' + tunnels - print(source) tlname = cryptfiles + tunnels[:-5] + '.dat' check_call(['openssl', 'pkeyutl', '-encrypt', '-inkey', keyfile, '-pubin', '-in', sourcetl, '-out', tlname]) - else: - print('im else block') - #shutil.rmtree(dirname) - else: - print('im letzen else block') diff --git a/wg_main.py b/wg_main.py index 5caf28c..90a1bbb 100755 --- a/wg_main.py +++ b/wg_main.py @@ -4,19 +4,25 @@ import gettext import locale import webbrowser import os -import shutil +import sys +import signal import subprocess +import shutil import tkinter as tk from pathlib import Path from subprocess import check_call from tkinter import filedialog, ttk, TclError -from cls_mth_fc import (Tunnel, dirs_and_files, msg_window, Tipi, GiteaUpdate ,files_for_autostart) +from cls_mth_fc import (Tunnel, Create, msg_window, Tipi, GiteaUpdate, UOS) -check_call(['pkexec', '/usr/local/bin/ssl_decrypt.py']) +UOS.username() +Create.dir_and_files() +Create.make_dir() +Create.decrypt() tcl_path = Path('/usr/share/TK-Themes') wg_set = Path(Path.home() / '.config/wire_py/settings') wg_tips = Tipi.if_tip(wg_set) +dirname = Path('/tmp/tlecdcwg/') ''' 1 = 1. Year, 09 = Month of the Year, 2924 = Day and Year of the Year ''' version = 'v. 2.03.0325' @@ -31,6 +37,31 @@ gettext.bindtextdomain(APP, LOCALE_DIR) gettext.textdomain(APP) _ = gettext.gettext +def signalHandler(signum, frame): + ''' Determine clear text names for signal numbers ''' + SIGNALS_TO_NAMES_DICT = dict((getattr(signal, n), n) \ + for n in dir(signal) if n.startswith('SIG') and '_' not in n ) + signame = SIGNALS_TO_NAMES_DICT.get(signum, "Unnamed signal: %d" % signum) + + ''' + End program for certain signals, + report to others only reception + ''' + if signum in (signal.SIGINT, signal.SIGTERM): + exitCode = 1 + print("\nSignal '%s' (%d) received. => Aborting with exit code %d." % (signame, signum, exitCode)) + shutil.rmtree(dirname) + Path.unlink('/tmp/.loguser') + print('Breakdown by user...') + sys.exit(exitCode) + else: + print("Signal %d received and ignored." % signum) + shutil.rmtree(dirname) + Path.unlink('/tmp/.loguser') + print('Process unexpectedly ended...') +signal.signal(signal.SIGINT, signalHandler) +signal.signal(signal.SIGTERM, signalHandler) +signal.signal(signal.SIGHUP, signalHandler) class MainWindow(tk.Tk): def __init__(self, *args, **kwargs): @@ -62,9 +93,9 @@ class MainWindow(tk.Tk): ''' Set it as the window icon ''' self.iconphoto(True, self.wg_icon) - + FrameWidgets(self).grid() - + class FrameWidgets(ttk.Frame): def __init__(self, container, **kwargs): @@ -334,7 +365,7 @@ class FrameWidgets(ttk.Frame): ''' Listbox with Scrollbar ''' def enable_check_box(_): - files_for_autostart() + Create.files_for_autostart() if self.l_box.size() != 0: self.wg_autostart.configure(state='normal') self.lb_rename.config(state='normal') @@ -351,6 +382,7 @@ class FrameWidgets(ttk.Frame): self.l_box.configure(yscrollcommand=self.scrollbar.set) ''' Tunnel List ''' + self.tl = Tunnel.list() for tunnels in self.tl: self.l_box.insert("end", tunnels[:-5]) @@ -659,6 +691,8 @@ class FrameWidgets(ttk.Frame): with open(wg_set, 'w') as theme_set5: theme_set5.writelines(lines5) self.autoconnect_var.set(value=new_a_connect) + + Create.encrypt() return select_tl @@ -744,7 +778,7 @@ class FrameWidgets(ttk.Frame): If in each case false comes out, a corresponding window comes to inform the user that something is wrong. """ - dirs_and_files() + Create.dir_and_files() try: filepath = filedialog.askopenfilename(initialdir=str(Path.home()), title=_('Select Wireguard config File'), @@ -787,6 +821,8 @@ class FrameWidgets(ttk.Frame): subprocess.check_output(['nmcli', 'connection', 'import', 'type', 'wireguard', 'file', new_conf], text=True) + Create.encrypt() + else: shutil.copy(filepath, '/tmp/tlecdcwg/') if self.a != '': @@ -796,6 +832,8 @@ class FrameWidgets(ttk.Frame): subprocess.check_output(['nmcli', 'connection', 'import', 'type', 'wireguard', 'file', filepath], text=True) + Create.encrypt() + self.StrVar.set('') self.a = Tunnel.active() self.l_box.insert(0, self.a) @@ -882,9 +920,6 @@ class FrameWidgets(ttk.Frame): self.show_data() check_call(['nmcli', 'con', 'mod', self.a, 'connection.autoconnect', 'no']) Path.chmod(wg_read, 0o600) - - ''' Here encrypt import files ''' - check_call(['pkexec', '/usr/local/bin/ssl_encrypt.py']) if 'PrivateKey = ' and 'Endpoint = ' not in read: """img_w, img_i, w_title, w_txt hand over""" @@ -903,7 +938,7 @@ class FrameWidgets(ttk.Frame): except subprocess.CalledProcessError: print('Tunnel exist!') - + def box_set(self): """ This Method will display the autostart label which @@ -1157,7 +1192,6 @@ class MyToolTip(tk.Toplevel): self.destroy() - if __name__ == '__main__': window = MainWindow() """ @@ -1171,3 +1205,7 @@ if __name__ == '__main__': window.tk.call('set', '::tk::dialog::file::showHiddenBtn', '0') window.tk.call('set', '::tk::dialog::file::showHiddenVar', '0') window.mainloop() + +shutil.rmtree(dirname) +Path.unlink('/tmp/.loguser') +sys.exit(0) \ No newline at end of file