From afe348f0926f851fb334ccf4d5f2b8561700e6ea Mon Sep 17 00:00:00 2001 From: Julio Cesar Date: Mon, 7 Jul 2025 10:09:08 +0200 Subject: [PATCH] add files shared by Chintan --- ...API for Kigen Flow.postman_collection.json | 135 ++++++++++++++++++ Screenshot 2025-07-07 at 12.54.33.png | Bin 0 -> 24682 bytes gpg_key_ui_backend.py | 90 ++++++++++++ 3 files changed, 225 insertions(+) create mode 100644 GPG API for Kigen Flow.postman_collection.json create mode 100644 Screenshot 2025-07-07 at 12.54.33.png create mode 100644 gpg_key_ui_backend.py diff --git a/GPG API for Kigen Flow.postman_collection.json b/GPG API for Kigen Flow.postman_collection.json new file mode 100644 index 0000000..d44b936 --- /dev/null +++ b/GPG API for Kigen Flow.postman_collection.json @@ -0,0 +1,135 @@ +{ + "info": { + "_postman_id": "e77bfc0a-79fb-4594-be9d-06c53989ad2a", + "name": "GPG API for Kigen Flow", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "43522475", + "_collection_link": "https://chintan-533591.postman.co/workspace/Chintan's-Workspace~f62d7ab1-6c32-44dd-894e-371a5145aefa/collection/43522475-e77bfc0a-79fb-4594-be9d-06c53989ad2a?action=share&source=collection_link&creator=43522475" + }, + "item": [ + { + "name": "1. Check & Install GPG", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://3.29.0.254:8080/api/setup/gnupg", + "protocol": "http", + "host": [ + "3", + "29", + "0", + "254" + ], + "port": "8080", + "path": [ + "api", + "setup", + "gnupg" + ] + } + }, + "response": [] + }, + { + "name": "2. Generate GPG Key", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"RollxManager Platform\",\n \"email\": \"user@example.com\",\n \"comment\": \"PGP Key for Kigen\",\n \"passphrase\": \"your-secure-passphrase\"\n}" + }, + "url": { + "raw": "http://3.29.0.254:8080/api/generate-key", + "protocol": "http", + "host": [ + "3", + "29", + "0", + "254" + ], + "port": "8080", + "path": [ + "api", + "generate-key" + ] + } + }, + "response": [] + }, + { + "name": "3. Download Public Key", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://3.29.0.254:8080/api/download/public-key?email=user@example.com", + "protocol": "http", + "host": [ + "3", + "29", + "0", + "254" + ], + "port": "8080", + "path": [ + "api", + "download", + "public-key" + ], + "query": [ + { + "key": "email", + "value": "user@example.com" + } + ] + } + }, + "response": [] + }, + { + "name": "4. Upload GPG Encrypted File & Decrypt", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "file", + "type": "file", + "src": "/path/to/your/zip.gpg" + }, + { + "key": "passphrase", + "value": "your-secure-passphrase", + "type": "text" + } + ] + }, + "url": { + "raw": "http://3.29.0.254:8080/api/upload-decrypt", + "protocol": "http", + "host": [ + "3", + "29", + "0", + "254" + ], + "port": "8080", + "path": [ + "api", + "upload-decrypt" + ] + } + }, + "response": [] + } + ] +} \ No newline at end of file diff --git a/Screenshot 2025-07-07 at 12.54.33.png b/Screenshot 2025-07-07 at 12.54.33.png new file mode 100644 index 0000000000000000000000000000000000000000..48cecce8103da8a26852059ea65e5cea55909d2f GIT binary patch literal 24682 zcmeFZ2UJsAw=cdiNTf!Z^r9djRVfx)umB=b6qODKks1-{p$4RP0R^Qi(xfT9_l`(! zK}rJBOF|70!hfH4|KEGxIrn(qz31Kg#v5-u9DCqi*_+I@)|_+A_501aPR37WfwT8i z)Kma6GBV&d@E>q83ET$GP*6ZAPM?87p_G(osA!mIX{f1b*ccdLOkC_d++6IOoV@(v zg1i?*`8YX+u3Zwnd_`JXnn&=4!gWb`aVcrZ-~R|1B_$;dH4Q5*Evw{t&hwK0;h&R6 zfc^|w7lao=b^$m=PX?hUJ81=Y0D$Z?DDCe8|NlQ^ry%5~DWGR4si?sR%FY6($RLnY zT(z2Lwk=@;|i4BxGo;U?-%(aky{mRl=h5RQx_bHs=FcoFt*mWqot#}<-H`4c{sDnO z!6Bhxv2kzS#wWacpZGE3Q)X6nPVVR8lG3vBipr|$=9bpB_Kwc3?!lqqk@Nz{Aga+(r zrs8|dCvT~nDwASE7U~j5_vO+yB(T6F*O2Y^}LFTTpIu0^rK6PJjA>3ZYKiry@RzvvT2c3Qx`iO$8ZdSyCqRE7R*MLQV^oP^c{7J+Yt>Ew-$kOxkaapt z@&pJh^E?4=v4p~LoZt-)uDl4fbPF#?f~4V!G(P&uS8Ih=EXSPyXJ8>$qt@wpj>J?? z0P5InQhXH%S+w2}ack$7f{wND81_y7>c2+!~;82@k<>gzBFF9SwvqIL2|sbcc5p zPS`&I=uJw%f#vYB9NG73fbBk1nCKu4{Vqx`D8_)|2z;{w6vt(?R2v$DYF-#cEv4C} z?N6Qn_-Z)D2?5{HD$_bzKLH3+9_ygI;JB2f9SWkekM~Xh;tNn5bl)-Kx(?|GMY?8E z1AY|?QQXdo6uOst0(du^032YSu7cgUbM)v0sGm6jBF73rp_M_QlR$YtdVfaE*q;FH zOaD)#|C>fBwy51$$G&%#_P1+apTc*jO#hzVUL%SdtCIq_KsUjC0$_#y!h}Fmt#AQV z(qr*>3$!XBLQUTM3xa#0-^`icjVu#1<{4at4E#`Vn)d`~0IlV}nX{A5@5+aT9qr73 zCLj5?pBhTQPJbZ!0Qj>zt^6mzTG{fBHuOEJ8C?fjBz0>VfezIiO)%7L*g21kI|0c0 z2)bFI{#$_hZ@W(lkYGT~-Z%lM;D7LJCP|J!Z|x9kr}lh zMCQD1syQ;dy)(J$S=mrWkvxL0H1kW1tqAkKMX@@fho4>>=@7c+8uQ^gG}A>f+$ zg@)N)OX;1X}&w5-3HA^MV#J)EwNg~bTiX3 ztB2=;%`m;}GwMTT^pi@J-1(kg6}sf(OiXbi>WCye^ES8e>Mar`L!YDY$A*`;9_Y}@ z)}(<4%1r-9Uyo_6RKAYwlozG?0&bXd1YH<4)5kKS%pE0~B(jEWKNO;;BjC~9f0{-eMyp4UcFoTJ&ot;hcZb%|KMidoFV8{EKdp%QM zUm~VhpF#zlgHN0Qw58YYw#YOj&gfojC~zr@#0a&T&<@ahP_v?T$PE9_A8}A4$aEfk z)zDI_{qovE{5NFMQe*V0i91emd9sOx-ML{^R3bBgbRGUJac5;49?&0dr`tZ-6&bTC zQ2|+1;(o8pq)ql$myvE;`6RByWGr3; z%U;nL_>RG7*)xJENm-1AR0}$#0ffQu|IwQI4@=TbB1(YW@b56)W3!(}42pasF`+sU z9q>K&xPwFhjM07(Mq?DOoB&;-qwuNd6X3SN#;PCT`%j;9D?h9pB2oC=bh?b@6JYC- zb;B+ON(whg%j9`tMBiRm(YYGmeL9DA1}oog2bMEvD=y zgedBD5#vy^vC=B}nm5!H$nV$8EBK(C&I+r181Fadd~V=>xW4>!_4QO6&4cvj9PJ-e zGB|k!{8-Cj1a+~3<?>={(RG$H`Qb<()pr_bVXW0y0Emwb|b71+|5INJlpAdsKM4-JY7|Mqu ztsd$f!aTN)`hrc)4b_VxJ(YtsCCnYHq=(w1Bd{vku5ocD5hN;{NhJNS>FuF{*l+F& z=4X$mr`@b3naG9*Of($uZjaTS$3Eivh!1;T@*3v8IMpklc}>{E)2FOzE-l2W$)o&r zF`6=8;{5v`If`Z$kf%j2)Yy6fw^CjDPlO87iXnR$dp7IQL-7PA1i#~_c2$lf)@Pjl zoq2;^w{Y_YyQG+l82vT7$l)#KV{|$YQ!_?$eLtNpY-0=EJh5Rfexag5(?s7$xM(<4 z_>oHt^MF4eP2QzWzF}S36MzyLsK`fv>QvS0x5ts$m*)HC$E+Rr(^jp&5`Hu$twlzV zQaZO~JZlj{2vYvBc3*{1l7;ZO%1&FC+=CF2cO6@s;onG6 zVqI=(>cjNfB9pMEql0(vI(s5GdJT2ox`m7I|LCmG_tb_O8%Z>$Se^hzxVoR;Ke$}{ z7MiQYdPuyBhcGl^m2x5Fwq^`<%}42T7o&%ZGRA zTq-2IO~}Y*qlPy?V9cuP0jo&|?~#KNmkaYE`?XdLM=d6sMBNbi>xs@D#U&GxMwI;8 z6ewg}<>8am2E2qSZXqvsc_06+SPz}q$j6#o)p%!7E(cQjv5E&m*qCXTHD3P~ADyjb zaY;Qyz-x`Q^ZBf6-;2wL_y$5nE(fB{UKO`8g|zI}5=Sf-lG|PSP8q3XI_j%n5{8kt zz*CdxJ+Ce|4LVD^}^#6Q!r~1=C zV04`C_;-h$UP~`?Ef%eenX;q_RI_+_*glv1m|PX)1mIc@19lOJkd5{8RRM9FoyF(* zzOpg(cpk}BWrv|RC_h!$#qm2*T&c()>pw>H$urI#d+9BqGdCm4F4+;^WvUAeiyB^i zMPHH};eamN;es|FqM~0xNT$A!oePyXc zzVFP0Cwh;(9sQ8Agf4uaeVZkT>j&IR zVcWyHApcCQ+!Z%!dz(`mu`1+q6*s$XWc@&RxMT$%mpD1UUMAg5`X1+38WANsKkqPF zX&)u|k*Ki6)l3~eZqC2QCaN`G)`vDQ@-iI7-tU3Fk`B_tYCf8-j&NEh`t3@StsK(T zWg`>rhCdoykVJRieIop5p7ZR@{Q}`RFD-11*6FtFrD~OU@m=+X*d9&)GXPJkH@Mgq zZEE1GA|-aGOdk!%6o|{w>S|IA<}*^73s2qPf|UWTZ*(us7O`|;Q+TvT#O?S>$|`E& zS!cd=KGV$izLa_zUxJ))Q4c9ys3GgwL)0W*WBuTxjK9V>&YoRYDEWq$RzlzY^x7(JgkYJjsH9@E=ktW{|sA;!W6Zp zNVIS>k@|*9do^wub@sW?R>jJfSds6NJHzh*yT=?ll?XWw4M%l3Zx21U9vh~{xTs7O zM`fpK?lP1U-mUfUe!@eAz_QGmHp-)~Rgmk43m@xCaaN)7T9_2i^#uBr1m5~Ie$j!0 zRi2A_^!?9pFSRb@5$_vq$Rv>g#4H=u?IU?{Qjt59Magb?n)0@0~jy5V3f!Mw!0XbQqB z^9eJkF>BP$6(ufIAb9(50JYi-J3d!dp#SI43wViwl`81m8>=;Q%0ZV>dgs2k8~>vC z)alig$ryb_{;J?sIJ>+==0s<43a`4GYo{aMbyl6tMq-c^|WCQS*jv^FP&t1TQ=VwhwdC|L)E}25emW5@;y$%?g#D~s$Yw3r?$zcOr|fF z_aB>y37f!^!acD(5Zh{#)TS3%;rqWOLwWrx6bWt4AQaQ*aX*!ID6=f?AC^+5*V4P%s+44M$zqKkLg_bV&y7Ywx9?3pt7@pgvBoz;>%O&le>b0`FPM+p98 zvRV%rah{T;m-#V}6D8T?cD8X&FzQt;x@Fe8YfQRIhC0)ervy6O;Gy2Dh`ooZ*;jEQ z%4~pwC)@Z?)el+WM^k7&U0F`dH(R5+OvRRAajAmv(m`MM1c135qcG6{I~)mN(+l69 z9a+0|-EFiuaCm+9;q@Y;kG|I>7?6^Be7HE|i|_K*Zk=AS7$@qNi-Nfuo~ejabE^2U zpjs;|M;~lyR5ol?GL)}ARlDHDmHoSd*SS-!^W577(Y`MEYqLD`1l@LRQ??VJ)NI6# zU&CY$$!*jj$_nW+n)TRSHs)zgk& zMyct=OA5!A%KG?VKYP(yN{lB$L4M`+QXzlcmxnhiX%ro=blnilmLDquApgV%o&+s-ZDdvm`LG z;0+yX&*g__%cTN&da?_gBR?Ukvzy#^>@3Cxcav?nYOYr@oxrFRJNYC3+lDYmytj7|A7j0d6LRKB33Vg@Mz{WmOTM9qGaM; zHobj$C90Mzt-Z!W2+~{6MU*n7T|)cYuF_N&rt^pC-mZGc7gNgPla1rbW1qt`gvdw) zCRzqxdc~!#TI2TW5~sB88Mg9`j{E*I_*IiOJ#NX;u}v=-2bLiFheJBur7vb3$$sAC z_0=i>+^>cAMY(u3&><16uGMyLgFYZ*Lh=nAyaO1t(gECQ&*BU1VIdzLD^WqsOw=)t z@w(x)ZrLj)7Y7ZsqLnI;Bnw_Gxri5B)lTiIizZb{+@5&d7WSgB^->Y)Gx9wTeAscp zR1f9N-4t6#HG*OaiC6Kl2G->)25Et1YE16JZIN+tubjr+7IXHQS3z@*Agc5$H$=0T zjO=*!>fWj>yUVUFU@zM>e2ghwOzVj=FgZ2q%%T2skSK=HuwUD^PbyGZxsd+S-O@a6 zXTRvtM_)yEyh`*Oi~_0txIbVtFWtx_&R(|MvQqNeSzlR?R5@-<1e(bAK^ap-wTymr zm#OK@_Fd8?m?(-t!*N=0sA%^D2&?BPP8>B|GgcI6u(`z$efhe!*8Nvd?u9xAUn;B* zmo{ybb8LNSu@35WWx{24HI~Fvsc-@NoZKF3F3RvP~HsZ<7@Z z0NgN>0Ebn*euAliJrk1j;}&ibarLvEgw$4okgk293SuZH9hO{L1E;dNeA5D3bO!Nt zWv^1VqC%g)qS|Z#M@NSe-q)f*FsvrZPW5CMFAH;ia^1hj+)ZQlMHXgnJMoMC?5`H5 zziQux`QIbwzGOC1_TK4GH+$?Ik?nkem*&k**>9Ebw}6KW(*vc`e|5R{b)2KdHRDho zNF@+EZz8>28d;bDS&jMkMkm17H~1kl0AfA=HMjy<8}S}Ka^_X3oXC+J(#pMv;hdUN zcvglZHJvU4{!H`Ci{a^t22A7Y2Xr^HSi1k4+PI#>>6kVSdYdYz=qS7P2QSV;b%x{ zApSn~1KdT(*;AhYotYoO+W?+JF@!;}7l?XXhzG+Ble4I$vI1K`=wsO5xGGP8Q1*?l zm^9k9{N?jpVlOffofFsWeUmS9C&%;xj^K`gs{AcxDayxN11`#gFVZXGC3Lyj=h~Q@ ztt@{df6XAkQKhB&^^Id?7au;n;s?YWh{++H?prt2Sf%beZd_o7`Yp%86q|kJ?){Z2 z{#UeZZThvQ(INPg<39Huiwq-rd?>)ts{+}j@hA4+J~{KR@Uq|AOw92ZU&70qB#};E z;=8eI-Gtvcuvq7Y-D4iot6{P!YiCYX7pJb_)2x0H_M>)L|_DNC2m?X^FO$!l{ zu%_qI5(mdm0Luw(ck0MiA5+4v`(}F`mBzIW{4_elTqp9GMzYVrU7cuDHHv+o=M=$C z{t||o>$1~jQ%Ouiorq({_S}*XB;&6T*#C;QA~6CO7hhNa)!IzIA=4xDI{Be)Jds+i zRw}QeF!$2&X}}}pul&yMZSJU!h66$M6TlSYK9|HyKA7m@i7~jtACNKaX!w3hKh*n= z)A2;>k5TtuyR=_@-9NRn`kcq5CScvAmt~mZz71_WS%5}EY@m=rZD*(j)X^{SMz4%}L{E@a% zlVkqqwyJOjlQ{YR(|1v|Gp1ww zJ8dpJXY*Me61)p1FLR>hBKCx@K@P%zrH?TJp%)|lRaV&aoOyR-vU_)&>Wkwb1EN6>a{156;6Kn{(RnS_d%sk zx;91q+g!s{S&ghrYrV;-JH_q#FI{6|V)PWR;}eJ%&Lw&(KeaF1EF491xOiul3`fB< z;j-KAr1O301i{AYC*ktu+SOq{zO&u73qSwTX~?0ko~$tFTQnQdIu&>7&?@NZ<#tqH zpPqW$F@41{JxWSwm zL{~lAN`-88YZ~Xhp?jkw- zmPMtOu{63D6xqouqZ;cf>tVvtn1_@`p3mw4k7Eb)Sj49R5}!4iX2v2~tG+Z|-|B7o z8;kGLYVFrM=8XLdcPzTtSUcsza0;rJthbrOd$^4Rl$-l!^ooyX-(Et~#hb#CH+Fgf z&$scp*(-*m7H>P3lFb8#y!FFb{FBwlL^vH1sx&6<1<%$~b+NEp?6YSC)_w2U%O`U? zB>pVD>m!7WyBpp502$TZu`aSOsmJl#z?=2T*_gD}erUmfQG&0Rp#wHWeBFNi$)wKE z2K(qb-;G;y)oHhl%`e}vG!J|bYYlme>x=w|XI>2Pt2kHgq1+d<7YY*P`VkxE9o-ZP zh*N#oK~p0H3(mUYApxNg5SNpF@ags0%by*Z`ii(TMY`k_a(l6cMTFaJXq$46@?5cz z^)4^z+0+YMH8162MV1Kp&%LBD!R14119s2X$3H;`UnuAI1*`Vcp-8t@c2t$=*O3>wMHEBSI~5f5t@v_cYHBXQ*|t>x85+I2W;dozkt2d&8wzSqeakiC{&*ys>$ z7To#_h^cYM?-kIQeN}p>_tTP$X|9~Ivx|?3Y?VnjhOmiM7-o?*3AR91ODAZnI^@jM zTAF^%hzJDe>Q8`s{REwY6?Eow8F_VP``3??vSO(jPO$jFE8k}ol;()PGiD+!e1w=e zIOA>i41y19L+Sd4U@W36ggk1B?kvsxi|ZHaZa0!Hpcs&R8lx}D`3GC?9Q(RlRNLzU zO%RgtnSDC%T=0h(+c-XX*Vm}_w~gb(Ygl`H$*_=}2bjVJ>kex_se zftP$4{zc)d?i<)`a;l^8Sj`cW_kzs97Wfx(cETOn_^XjFnYVL(l)6SKx@>(p6Vui7 zpf6iKrp*BbTTdrM7wQ)lh^l2Ro%?#RFqTKr41n;_&GDr*I-Ci7mT_-qx8E|*gcjtQhabYHEW01TF6 zE(L1l_&fDngU>6((qdki7%nrt)^v!lD)$yCHf2VJb&wWwBAE@P`Db99>CnJ1 z*`|h3wWsvoO9yviTkRHGIH#XSi`;}|Bexa^rphH}W3sjSTPp9PE4}8Q?`y{^ybRv- zbhL(yFBJ(8!siYOywqVqqAq3`N}mgIY_s^z2VCy{=u1b*b=*;BO}sR^>-}&{|H$%# zVs_@FCPT}E%HSUNF{m3?=sCyAd9Zx z7F*P#8IZ1Ht+ExNGVfe^ezIK9%WiIodrRi?t}p}J{yuL-k*eBG;(?)F0XEjKQr}Vh z0+nOc8X^f7RDu_lps`_`T&jMOnaq}k-cnm9fee??^?OaDuA^Ys2heq_%H?uEx8z-}! zF%MF5NQM=>B%Q&Fax)UN@)5Dwi6;O$f#P}zsaWMVW>lY<5_gBP*HI>6sMRg;d!&O6 z_I(-G)4la4t9PRM^RMEq7HICy`pxVXrRP8*2zj5Uz(h8f3`ZWvd$GdMsOvvNzjW(2 z&K^q{TZF_oADKz9yt(sXd{+=6P`f|pMbh#+ZydP4a+WrO@I~Dm-=^%2=V+7V3bRGe zyy6~H{lPpX!JHYw=&OH)#6-3{ta}=3%3;f3YvAKIdxR`3LoA&hNPX#*XAM)ecUmTH z>yx1R1sd#Wq2t3uP^Fz#!VNdVt!278w*>JWg+zzgrB_ML)sBQf^-b#y^CI+g-sSD&8h z5pw{p1a56`mNxTDHH@(WfA!d|UhTW|P{#+RuR2!0LwAZ)b7*w zo|b7iEsZjq_xHDA#OPejW!~X)@~mN;IS*1<3f&js_tuCU7&%j@HD%Uh=TPT&i^@ue zpv2oF(OX23bTBdYYwdaLCY9}2A0}j{PUmi2N}+Om`n@D~j$EB(W2- zRVU{xdO`)|>eMCbfj3rQ0(28>Wnry`H|*_rlhp9saZVz#ZJ#B2Sp_$a{C0_X!yo|8 zJ>bKzQiM^kQXjFmTkHMVY^>j8sh?5$mhuMMnj;0&Y_t?yUka$a-`aUyEip%|Jl8Ar zAI{k%=w?4q;!Gq6h^%`m6vUr&&DIgiCD2>)*Ovx-6g3lSdM$aOQ zA#MAz-xID)tZmpaOsk*PigPqa_@~`Gj7wZuNy$2HNT^(K%`P} z#7d!lEA{#Fq~OP$?Y6cccCCv!?MrY?<@8M7@9!QvYkNu|KQ^vuHQ5~4HntCzo-&zf z#xIjDG(;U9nX8K8#UYnExvH*j8kTB9Po>f9AnUnQG2WW^PZbq03sKu4XaUi?X32iO z4t)j~ug9}2U+~ZX=hbL>TZ8K98FG5#uBwOpEmt7R?TB&t2bdoCIi$y;O1;fP%Ep6? z>lVE8JU*(ojkNp~IaXz_g<^(X)~#)y96l4Hh_AY#{DP8qr*V!AZgLth!fW}Lwc>S& z7ZsTk`=`}`irTNWJk^yqhf+KI4j!jaNQCID#Bb(_2WKrmSo~I6_9W)VZ#bCpLQSF& zBn6k??>qz5H#Qt+<45G8Z7dQ_CkY02u0eUy3f%jmcTVG?TOMF0)vK&DwDh^}^4UZh zS3IA~A@?a;XHNONWZ+spYNcJy$RQV4<}R$aLnGz~$gkL8#&v;hB9LNf)DLOTnxEx%BU9z z>ITZ^6xuzb+7ep#A7fKcK*Zv%1)Yv=*Kq0`7I%@#*8iB4m-S;oO{tRzT&UjUCXf@# z)^<6#RE**JLtA!&4_*C}XQO^ZW$fnq@F4GPx3GK9AJ)y*j=Heb9(6VGGf*&{a_IMT zOQ*AhQ6hVq#&oYvbA;a;DYeP6nf2GcXfpC{es-U^yq*;=5lWQ%Y?CTAEIKIHn0nvC z_Uvy>eWEj-ujO0|H^P90-DnD%!!*B7xO{#z+MSw7Jd83T_p~9`cNMK7nK~P4L;ahO zZcAjwBbzf#jucXa;bCnGo^a^`L*0J#%$<=m^#=WOcNZbNa|FZjv3E%SrnIwOhMcbG z!X!*-Wn|FQ69J3&4nOGoFwxz0g&;}ArPZV;Fj$tey9qO%m@)3NVXn`%@wvh^biuEd zyLApusvhgNBYL~!WFWFtz6{=ytb3bSQuFNW=BgWWO41VCL~et@G_X&C;JT-0xE;VR)|lVxF$K zU_gm=`Vwv=I^3CUC+T>VGeA;}twm+-b<47m4pD4W=22KrtB-Wuu=BfjJjMC9q=dMx zm8-!EKzf3#i4ccrO^h$G&s&oH*&gW0^`+FcLZb=GMIm`5dPz8u$TPHVS32=rMkJ)n zQ?3bl_$G%x)|JHDq5vC<_Db9d6N2=~zyrUdcc;H%W*AJDbXlV7G3UwVTop7WWm7!| ze-N(?@A6RDdWh%EQ6JyjG>|OOV8HT5CZC2j_;^z72n#{J%iqK$PH+8m;h_V!+2?Y9 zp81qGbKVj#7bW970yT$Xkfoyd6`Q5arzjbfx7AgU)6ruE8vlOa>c0V1f&?%kU-P8B#ZU$98TgRo%&CVE=Kdy{sjO1{UW67&nvFzt8ZO$O|BRs z^dgFx*{(yrY}o#EL^0|~v=}4fIwtNOD+4c#sPt+N3{@>~7+gJsL{7lf-jKGCd|+f(**TK@%E%3vy)+sHIb- z2)Pyz1Q)Y0-CblM`HHCgZJoNZE5T@!s9BL^!xCHTW)NdhaX{Cs`}KuyGTunH!@ag4 zXq{VWyAXTdV@~W?c)xA^g8Js^@@(rXsEqE4@(tO@?1keSM3G>y@=d7rCT^(ZT7N~4 zw?yJ2x`>?Hu*O&+$ixmaHD>CHQscQ8Q1iT~G(?PtWctcL%4aIGV?q$&9_AnT+J*br z^9grVQBj~G8<)n!oiF1bTPcqQnaNZa9}qA1C*8!IOXHk4dOVm^^U5P3E)_)s1KBwC z|A0YI{oQA`V7_44)-u-q=nR+`Wzt}B6UReRkk^L_vN=|8$ zJe2_#($!=_UYid+PG0r$$2J$wsFoKmeL`TzJ0fUbst=ETBlA6tTx{~BPO*ACT8qdj zw5mdtG`r$}_BHRzc?9;oziw5IAHBg}`25f4SJR3~j@6!RT+5*WFrkag_$FT0UO@lz z*kNF5g2lz3$KRfe4$OHKe|c<_?5I_T+zc6NpJo{PIb2lFKjEFrf-FHYxd$J8uH4)q z=2iC(+H(_S{N%NsUhpK`jh8v?D796|^$5rAD@&MLeuYw1wz$z z11_{yjn&CnYNgrRVqpFZ6YcVP=k@g(<`qymP250-$4uyHfw{Y9EtN|ymG7;ryGb`( ze)`f!TlJPIE78{ew5ivv;THw=G6d&0gH{y`WasWw@d-P0E>=pD&HST6=7F+Iigu1A zl^({?BkdmG!pyXP*`SGkpHY?RLFD(1rpKzef|>4*qucDRc69h$2!A~G)SFe*^f#fJ zvFit~-g0hvf|)A?5A+kyHDnPI?i;J#OYXD%rhP-jMAhUB)3NK}rbd5}#B)&-(h6&M zn{6Kcw9hbWOmoK@Q~t=FaO4y=N8 z`PU%*j@Y)6%Gs2>sCQs~##dz-u4j?PnvZ>Xk92Z?&-=Qg@wfQgoM^b8zY-#LP}lV- zv#n@l>J@PlF!Hgsiu6Mn-!1C5RTOUX@*L8q!_5B0nxdOJZ$x&#?L6eRJ~j0Zy;m9=4fW;>9Nv=TJGoa57}tjYOg((e$l;>4{GKwBC^W>_oxP3eNU@LTVJ@m0#-}-@S%X} zfk41z;H4*>0^V?j+RNA*+W`B4vI#(}Qv2J94)_%tIh#enC5k*U1esm=b4|r2Fs&^RvsP6@i%sl9X)lkwV`DASi1%~klznP zOuiEf(%Mh9+M%f7a9=koJ~ujcwsREc%go6Dur7&2;su-SB-&)>(WxKuY(L$76z=lQ z-C-7ReMKh~HUe@VX*5WKpM|A86oy$5?L%E6a?A>a{{kAZNjAJGt-HxnW-*(&r~$w+?UUVFda(VHjDNAnSjaD!D*5<9`5 zPpx7IRT8j=Gfo=WPW~!+nD!v*GP1ECypL{qzn*uftm{GBUTQJFc%<*+_A_Qb+(5QG z*5=%P8e^?;;qxf%4QN}!E&PS zP-e|z8cxQ@xi8l@34=%&X3rnnN2}%FlW=y%(AMq2`*n*eYLPR}sdI@tdGJ$6$Bq_8 zq^p>MW(r(N4=txjt_UY}V; zfAP}ADwvuQ+-GMPgu}fbyNHE!Uyc+ME`)yIgQvJ@dvW0M9aRMF?rlx;y(z1zwG2Qt zA`63C6=?^(R6pr2C!E0OIDB&zm(Ordu7<2gkCLvt@$B43)z_394m}K7ipgWNR=B5wA{}9?#toJIZCzE-_jp9jN|LYi zeS?!JaS;<2-qZF*mR9tC+Mm1nRmv=rwGXmvz`Veon4&&M3V+Ub{5>H{o=6v1EOl7m z;SIRYM7e0VY2z*5&Q6^=I=ZS}X|S@gLsPAi&1&icTi!IWM|nN>5wX7N5gZ~owziX3 zswTb|sT8CJn-Y~uKAW97d#GDPsKIQ+&2iKi_EZ(F7p}kgsDTh~7j|!&BhC*&TO?>C z0y1$}16hN6Slzd#`@OtNN5?2lYe*2muW)9yUMfLJ-Oj)ca{rN?ih_{O;S;mhFz*!T z;<_Q6wqVyD9Eety{rH4Ev_Xkhww_6+f%V*D{zV0;4(^cxEG#(Acr|8~#66llup1a^ z7H|CVPKr|Fbaw8n)0(h1q}hbGbY$qkSgomBuH6&UubDW?!f=&9>=*;C1@mSicIFmcm?p9XcHL*^w zts(D6YiX@!QNg71!};Px8#4ON3t^t2FIYGEBYUGdrgK+GQsubK=13ORfkO1+li~b~ zAlldsXBxm#Fy{t843+7z+gp3hb#T&1rMN|yDTei#WXvmCWLw&+QfgGhId<_->nAg6 zw{uMIZWtW|9~-$V1l{bY1LRu!a*(DiK4)>ys&~q@a&E8(r4KT6R&l(!B2QB;yT`rj zgXU7l>_gaQJbwZ>JA*#km>}3v&p{}|7>aORy<+7; z+Z2BzG{)HX`t|2KMLI)ekpgp%8wT>ZPJd5kT&L&vyk*a3GA>Uy5n9>7vwpL3NM z=|UUU4$>Nr@8wR)lXm#z9uWW)a)g<{WR@PsWfGjU26i=cwM+HM4?pF}v@dl2pt#PJ z1NmOhw#=^h9t-1W-+Qu3my+}J+*`=Ir)1IO^K+-_q?AWRUDmlL9}PX*7TsWamu6$+ zdw0phk=B8|uQ_1EOD$*RGBSwN+@nKf|9ri2JB0OUV#)imN8-j#@6|EYA+gd`)_^DF z10i!a$Eko1*v+$ofwdwz2rc@AwSk}J->+TaCEMv@o;SHri5CdR=+&x!CJf?bYSv@* zZCvkvq>rVe+OE2_3lGxpw9L*zBiJq4Q&3dBh?jx<5&O*D1UHOsAWf)1W5I{bcG(l}vFABCA;VHx>gg$W@Ra_2tA(Qyr(?!W;gJbJ9RrGw z7+M+XMM0*_*RL4%eii88jPQIiTu;$&V9apWP9t}~)cak9T_yB$MUDbkvf=D9k7APN zDzqh?FCD>F*g4(x0}@mi-@P-xAre(ZB(!<_bf_1@Nux=5cKOR5>kBb?hHdltUx=Mu zu`hcFiNJS)8y0ptq)@t!p>?UE@%;KxUp81XCG+G&5yk=SvA-Z)l=f^l_bBtlW`=00xJ~Ws(*_@1X zA2rlQs0ZmtB<{5?b!OmyM>$Q^{kXp zQ(ugJTi=~y%b#MzGz8Vcu_7ss&AstkPwxdk|8!&Z3%F}@9}Cgd#bx=Y6CkQ!0dAIG z;qIm9->sfaCFm7U^0Wn&J|m_zk+Ul zZxi`Wx^~KkW#%{MLl8oCAFzc6@@_cNVU74g?$#~hN;|+z6wr7;qvN0DE*>_}G zvo;}qQ>EsbBid-$?difLK5cavR%f?yp<4D&^_suJrT$mjYb!A9XLdKacyCbWeK|I% zyI0$QffFN4$cY)j67NV*447JR+y+{xO ztsnK3mG~X^&-l+T<@guu|5u9gpWQC6#Eb8>Gjl2wYU8k8n{%NeunTTsP8J&D2@>cl>P{ z;8&adf1~}9?LL0lLuQ@$?VOx7_Y=W!MiVC-_eAikO^Nxw_ns)euL?MT;Gh_*A zt-nGL-3PmLsvYDQq}4_Tf2 zh*VnmbXv3sHHp!b8r9#Dg_?bcij=8!z&tYU#fnMs>}~}g_EQ`)e@8WYVbncozYRMd2GB=mf={|=21P9d|d5sjL04I^aV+;Ss|A7^u zLeqbKJma5l{%hY=C!IsRLM=V}3a%i1ga_cp8{P!pkpxc_o3SDaK?*)rNf7i&l;Ehu zc94#KKZa8D1Rw|Tvo260ywh;$bmd|54HzqeASp!BZ$ph+qlK?TgXJd#Gk# zS+qzj*qSz*cE~1*+AIMNQEKkPX&uwV!}lk^!{C5b>%#vh#eeQt{A9#hy-F!B3Kf;w zAb=!yb34xdn8pKjd<>qM^uVZrC~6PZE%tYSAI%JaQ~FPLN?gj!J%4xu^>4oYPy*EY z;vjCmp)aWA%5=Keu*H8iJDz{G8DCjhk>o#^-B0{Xz*PDF*UPoXG<8PtLg`q_(5Z!@ z4!gmk1&74>D8{-gqI71N6?xQG=o}gro5_}JFiG`GQ5fj3Thx&3;RVrj$Oa}O0wNU3 zV2O?L8V|>#MK{30({bLhdvi-%MZSOrj-#OF|G$>MCm7O=`PDvMgOxy-eiYou_eTP9N6%(EVG_>Vqp>*OcZq z!+8EnbXK2#yYkT8ET=6et!#_>&6a(J;4>#td%w|HUi4UVy)9;8L`Ot>jO0Lkv|w4r zcmIuth`rJJNpGY$@%}`)I6bF8(=-tJhs49$#N4YZU;Id^Fu|~?ubOWb!*|7u!sU~o zJxg*^(GV}gBrC18jfL$w{w}|^jVY|XG{`TgiX2OpbyNXt^aW<8+OB;p4I`rnh`ZlE z^SSsZP+VMN-?1m`Czg#zHq}?47kdrwH{U>pgi@D_@S$#&fo!}M1u+6_r->FV@P*Gk zl1Wa~h?3}$%{5l#2_OxSS}or&;Vus&?}Zci2F=lJpetcaN?(9PkY5Z7i8GF1H>jBP z$k8b_%>Mp%-g+*%)uHA?jqI)(gmeCW8!JVj=$B}~`65p8L$pHDyeftB0W1dENJ0qQ8EiLBJp}lz7N%G-wij3|bN}0HFt0B$ zGa;aE&Eq9`8D#MGFctxt)3pFDsi1^6{C9sP8k&%*P61L^<1-_;ps=wLT`R!A>mhWh z-8^;g7zPw=eC}sTs0@hoT-pC%m70ws%td|RFg##a&j^y9Fk|9AkM>S?Q0}(EF07g2 z6?J{rVXzs&#Jc-Hxq^N(he<0bgmlW4D|=eN-s<%L1V3V=me&WH+ErI8wEXh3yd?Z2 z8N7!zz7{j>?n*acc@=c@>6cBh?PlgR;wIJI!m9Y=>r%KEwR})@G^C8OJ8Krq2fVg3V+OTqA`lgOec5HRH>l zJFfuq7muO(ps08>4bt3Sp(z&ZOc5%07ifGP#JSFa!Jj9V3{d6q4tjE&V!x*PBhes9 zK2=XYrvK(P&cA`6pst%-E;Ya0$nH#p_H=J7&%?uu5{u_tBONo}Qc$D26=zg$Q1Mnc zdY0|Sm&k=y^DGBI>Djg~jRAVI>KRYU|3wf;q_?sg18!d;fBsIKsHdI^mGloK9s}B^ z<0WZ_)^OZ6_NK#kyb|oKZnQR7s^vBjytQ^Xq9D+zmLOe_~>080Hr zq;cf)l*y8V*vo`-A!bb408D_bG#8(CZm0LWw_g5CBA0c=e4DmrJM9vm(+4r~_sG?t zh>=5jG8FFy!6tK|#1l!rQiq}h*YkcmWMaM8n>(GFJPaO!y(1sw&)X%-x*#s!V60CS qO#f0f)lp4nm4!tNSXEccQ$|%sP7!6o<+(v_{BwOir~l_MbLTJE7{1s5 literal 0 HcmV?d00001 diff --git a/gpg_key_ui_backend.py b/gpg_key_ui_backend.py new file mode 100644 index 0000000..2f5d777 --- /dev/null +++ b/gpg_key_ui_backend.py @@ -0,0 +1,90 @@ +# gpg_api.py + +from flask import Flask, request, jsonify, send_file +import subprocess +import tempfile +import os +from werkzeug.utils import secure_filename + +app = Flask(__name__) +UPLOAD_DIR = "/tmp/gpg_files" +os.makedirs(UPLOAD_DIR, exist_ok=True) + +@app.route("/api/setup/gnupg", methods=["GET"]) +def setup_gnupg(): + try: + subprocess.run(["gpg", "--version"], check=True) + return jsonify({"status": "GnuPG is already installed"}) + except Exception: + subprocess.run(["apt", "update"], check=True) + subprocess.run(["apt", "install", "-y", "gnupg"], check=True) + return jsonify({"status": "GnuPG installed"}) + +@app.route("/api/generate-key", methods=["POST"]) +def generate_key(): + data = request.json + name = data['name'] + email = data['email'] + comment = data.get('comment', '') + passphrase = data['passphrase'] + + key_input = f""" + %echo Generating GPG Key + Key-Type: RSA + Key-Length: 4096 + Name-Real: {name} + Name-Email: {email} + Name-Comment: {comment} + Expire-Date: 0 + Passphrase: {passphrase} + %commit + %echo Done + """ + + with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f: + f.write(key_input) + keyfile_path = f.name + + try: + subprocess.run(["gpg", "--batch", "--generate-key", keyfile_path], check=True) + return jsonify({"status": "Key generated successfully"}) + except subprocess.CalledProcessError as e: + return jsonify({"error": "Key generation failed", "details": str(e)}), 500 + finally: + os.remove(keyfile_path) + +@app.route("/api/download/public-key", methods=["GET"]) +def export_key(): + email = request.args.get('email') + filename = os.path.join(UPLOAD_DIR, f"{secure_filename(email)}_public.asc") + try: + subprocess.run(["gpg", "--armor", "--output", filename, "--export", email], check=True) + return send_file(filename, as_attachment=True) + except Exception as e: + return jsonify({"error": "Export failed", "details": str(e)}), 500 + +@app.route("/api/upload-decrypt", methods=["POST"]) +def upload_and_decrypt(): + if 'file' not in request.files: + return jsonify({"error": "Missing file"}), 400 + file = request.files['file'] + passphrase = request.form.get('passphrase') + + filename = secure_filename(file.filename) + gpg_path = os.path.join(UPLOAD_DIR, filename) + output_path = os.path.join(UPLOAD_DIR, f"decrypted_{filename[:-4]}.zip") + file.save(gpg_path) + + try: + subprocess.run([ + "gpg", "--batch", "--yes", + "--passphrase", passphrase, + "--output", output_path, + "--decrypt", gpg_path + ], check=True) + return send_file(output_path, as_attachment=True) + except subprocess.CalledProcessError as e: + return jsonify({"error": "Decryption failed", "details": str(e)}), 500 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=8080, debug=True)