From 612cc7591e3ab50855c37a17f39687f10057dfd8 Mon Sep 17 00:00:00 2001 From: Emmet Friel Date: Tue, 7 Feb 2023 15:15:00 +0000 Subject: [PATCH 1/2] Added test image, updated .proto file to add hash to chunk and performed sha256 check server side --- game_world.jpg | Bin 0 -> 101491 bytes proto/chunk.proto | 6 +- proto/codegen.sh | 2 +- src/chunk_pb2.py | 183 ++++-------------------------------------- src/chunk_pb2.pyi | 27 +++++++ src/chunk_pb2_grpc.py | 132 +++++++++++++++++++----------- src/demo_client.py | 2 +- src/lib.py | 43 +++++++++- 8 files changed, 173 insertions(+), 222 deletions(-) create mode 100644 game_world.jpg mode change 100644 => 100755 proto/codegen.sh create mode 100644 src/chunk_pb2.pyi diff --git a/game_world.jpg b/game_world.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12dff17325cab1bd1fc3ffa8f5beabf625719722 GIT binary patch literal 101491 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

!kC%g zXG4PyTG+Yqw3|TU-NToXz5@7E@1cBR4nz82XE}Jo5 zziGezGhNFeQp}LFk}Duu0QyBkHRAW65J%bX2mLg)NAl{JBJ!Mx?ijv=4^3m{Gj@iC z#O}t-R^{$W%U^(nJN>BXOG7hk_95Ees5xjM+*hhNNHMTlwV%)NO}%M!WT6xJoX~~UQh{?phX!Zj3i9-D~sNq#$!swOl-_$ii&h>|-}CAKgVVIkd+EzG}j z^2*j7x{v~Abl$3%Ge9Q@K&9MK z*qCeK%jaBwhg_LUFWhdiWb^1Jg{yvF2#td9tS}va+$L273<=kufO%pp1|4!(`k0pM z@poM+Ai0B-jUHV+pu2?blN<^@R@ zkqbm&s+}b$=c`JA{4S@S&bYxDlUY9BE(v7%K~K_y?`aWHuxDXGjIND`ByD3sRy(%v%Fc@8 zV?4kX2;7ZYDhK*w%i&@2(Meo!B{Y!+;~e4GcQD*?Vqc_2u*C?A$7mDK&1ff`0NZwC z!o%MSoSrO(%_t&LMsS6Vo3T{1FiW!TZ+=e8kulH`Lt zG;d(+y8vQ5Xsy#)D+VSvQpMxsbq~1Y>0twTDme5?tUG&W40l4{? zGq$QM7L@`gcx`tSxCcC5{xE4tN7Qi%5{w^Gj%VcB{M@o`@tU5fM;tnOgOV8KPsp*t z5W5H{KO`2aXvv5Hc(P;dPLo{%M$3@2y)(n+Uf9q;%s2_TCR`+Ct6xL&@r1fFud-c| z(WmqXjfk^ca%^6q$e^K(RRBDk)OE@74Gbi2@B&(#EbE>6M~;S|CE6Y%!%RFZA~qiA zY9i&IlVkx*a`ZOoQvkkH#BeAMREEcmc3Fvh2U)#Vb~{;+K{$ywWPP}Ov>QEbOOPgA zC1SsDfw_#(B1y+nMgTO;<~GNOqRQ~H(61$O*sm%iq%?LqoQ$wO34jsP>u3;H`*oNO z=+2QPhY5~HAzX>|1Oj7d_gn`WLVwClPX>^d=_o(RFUmNST`Ux)W^F7+EK*BJ_+Y(< zjzay_#aigmio`?VG5>}0HeMQ49%f-Q+OG;*yR3s6(&|GkE|fUp9>|7Ic=>sH01Omv z@j_WSAM7LYk<@ymJzr%VIt!R=?^|8gW8GTuig)+r!b~bVWutjO3CM{A z8)?u%qEo8S1!ZG4Z5f*B;H}!^j1M>)QN~&V=x`^%&2H#w6;a3x%`9qfWj14Mnbdv( zP{8JZUx0Vw(#8fGVm7gdr~>I0sMSbA_(;b{84I;QFnaH_@57vq69Z4Ra-KArU9&}X zOFuz|q_ikBcrg7^bZc4}imFC?D0s3Kl8!fBkl}eLfyKWsYYUoPkO#W3UEzuy!rF~& zka%e@Eu&&I&cmP73($Sl@~UP1R3s*+9*y;sIizct8Jv!pFY>e>g$@;uX^bM~J+jW? z!6PK<8b%}wd4@WHj4p^#BBHy#Er z?tqwiS|RQ%7fcy=0u(EEk1hZJ_DEHTQ3Z`S)bUn$wIYz2<^ug>UksrL0eIyGiHVWv zWC#Ne0RR)DL36~?brV=Y6C&n?Pjhj(a6472&)4X|2Tl*^HZTh4%5O+3-jeWj5K(l` z12Eun^penMQV3!>7}9uIgL=N8_BO-IJv7o?%IJy$DQ3xsjc_Y0J2>jWendVX-3q66 zlb&Zx4rYyqqAQJrBKJhRbGE^b3w`(@1ZhEL$3#zn>MI8I@#svf0^PtDgd z6$sMAFvd#1CHBRn#E+jRh}j#KY-QTSi!}@wT4rLIqyU13VkSo(lxyjgAW7`<3}-V) zv-@$EVjQ7nkAlHAZ;6C_#dK35RH*>8s^U>VkM%%J+YVXAov8RI5j|uA5%_$mp%xLMo3Pdb-_dVQs#_rN1 z^n$n|PcwpS#m$nCJoJo6Rg{{wA+TA_z^3V&v6!~qm}{QIIJ`W|4=2h+lym*7IiVnC zJ@to2a_9^=ho`h6)9i3-o0uON-9cq#Q&wn5B6SOghDql8DY73Wscc#yA9KL`^R`ih zRN+9WvZ3@LI!RoWX7y}CJ$wmNoEj!J!emrn5|12CBApDyvQu|c>u%D#X_W=t$*B&; z${sbrdeE0g=cf(*u6gErTQ)am77cJGdka$eTQE{4zQhj8}kx#Ge$!I4?WOtu0%&?a)W1 z#Zpl=D9M$Ggc4CEi@Je&jq74qLmwi+B2yy$J_`0If7)aBjzj9uQba8}>Lh@M_LW$* z;RZgqKS7;l!jeZqnV(&FL;T$|p7MA)imBMURz=KF0>zY#BB!0lh-QSRFyW$OFIV-FL3ce1*lnofby#);%cxr}2iL2JYf7D1C;VARN|xA*%_Tnpi8s;_H2%>{zb@Zs$D zE*TG4SKILLr5$J%5NDwdX*`swd&C~8j*3Z43jk4H3+_fS7(A^N&cNd?fkoBGcxcG4 zMg~~XT-6{>K|YYWlw{YV@20PfqPvWNWO)JgEg*nu-PIKdXkH?AM43o3f1iKE4-sC( zUhy+0^d4QZx3}VqhGM7A>`F_3bS{``UqRq+}2+8b52gp-o37Y@1^&inLsK@ zYD#MUfhZrIs&7YVa%RJa4;W~cYXpojQ;;fdnKT5?u zM}7lujy#3a0THCnkROomv-jwm)<)yPturd7>0yudOMC{&)0H!&+1RJ;gC!qD# zX2~DQHt{C-J>|c!PqZ7TO!%yQzv)`g*aU+13`({q4?T!N0J+aDFE;AJwAO0F;Z&7%>GviS`+#c>(-^HEh#Tz`>+~ znTdEI0Im5{x>I9m_Q%oBZns?}CU*`SK(lpgBj9M|+XvpG8eKseSKnr~20 z=T38@0I(jB8p|V>u3vyQ;!V%0wdh8MVO13RmG*W#a1lY#yyM(k{^L)D-huOQ9`eL- zP2>=?*!F|R*bdB>`&G>X0=4X5E+z6FFA9qYA0@_FHB;LMjef?au0E&Zbvz$Cjeh|) zlU%x&CFVjo@k4yerTRD{(jeC6$7zLyzIBasNb>CXF_JXbqa}JX;kQuKkZ3i;jlWxs)p; z(zDix5PeBU`d(DXvyjOAT#L#mKXzO1Bd;T`LjsP>bi?wfu{U-_nMQLora0pV1|qL~+P3ro}!x zx{%>VpQQfYow(lsdqx)nOQdZwusjUZ5Ei93Qr>5i8G|A+!zlJ=AZC@&Zd!g6u8Eu{ zAx=~>jRu|E_*Y&VEC@ORLNux=Eg7ik5CTXXzGmCY;CqZK9?5A{L#Ft-HO3AL)izlz zc2pnFM3?GZkCz4ic-bwo9}7FmgA+xP5LYt8lTcAA#-M5pib^_GKIX6!3HZ(qt2;$z zqv9V_unfwkL1J1#@==Ohk~LOFSjys}q$;c8@l&HaV}{p67olArPur%{%1)F<#54B( zf?yO3yhLp?l`)_@e;~iX7KMSqAqvHt)PiHgcX$&5$#=0%F{c=IDk{7De|nlQC~XOCYjv82~0vyACxO0}LnI zpm16BBw~AcM`(#@(Ihp}4br3(DCVCF3y|}{(KKkGBu?=;xi%T+>cWyz$V{1IzX0>t zHqUDd51G;AD+!2I`vsC6Vwf*3U}(uf#-S%Mk>-*cu@3>rN@Yy+V0ms?Oy18R6e|!F zHlPtH88}q+4rRhTxh6SkoY8e`KPEoy4!krWFc8+E;GHN8E@km1YQ?_mL?wP>%?)B3H^Li{o z&e>~E&w$5@4UeKH8rPXXDJW7KT{o)ZQj;X?22Xu+nWkNf=TsyY=tOW?G&ZLM{oLF| zo(er#{zq}{C?WJ1Z7&;vakGQz#ovw4&;#&dnB&=$61a$YuAjagG#CTVboyCor7ek=lK&~@0Y`Z7hIwWsXmnbJqhcp9D zjpaHWMxcOMJy=5OyK;_^xzh9r~yuXBigJUx*bbk zHSK0<83?<8Hns&=dTl%@1@qBdd_n(Gc^k=c5fC$ySZI^ulS7b(Is!#WuT zM0yZavj9Mf#Kw}^D#ym)Pu|SpV$CB|m;Zdn!U;5!qYqr53Mvf+@FNd$n&1%NgK+v)@V$cJzH zN)*g^WM#5@YOHfCwLdW6{(knm43j(@5mUIhW?aGIcPMtfQGoGG3-;N*$sKw)#t^>J zoFQU*rz{TH=@yrGEKHj?B|d=2AnrlpE{pTvPVO%Nj~sIa@+3{MeTd3Y=3Jkv9)=( z_VT7Pyrb=BQ|bHvAE6A@sQadUH{>CNP`}4hXm@kpc-mKLmZJPJABc`-jK&8=3+=-1 zRI!mfBxg+?jzFSpWX*as;+Es+sV|E{Sf~;b;21WrpbFG0K^m{QyqZHjbeZyqJ_nQp zVySroY_{R)7T%gn3t)Xsk{@pDt|0CQ$d2|i)|4@5ca0F?_pa5M`W~kE0Z6Te> z@Zn5_)jTb+XyI$AT5C^LHxZ`aL_5v`Q~zYy(I!v3GDTonQzjTz4R(q>)w`dX=sqiw zjH(n;S1OB&SYTzIA*u(cN0a0BgVC`}Z5w|2LVnZL2$9`0oV;UquAli>CIgao-`ujM z1WBs0;C{01w?s)9I!+jTqojvd^Va8Riyd*^l~Y4O=`r&AS`7fXrZ5FNMZQ#erp1S- zVw+~_u@S^B;kZ9!iyEUWtq5#G1j;8^^OBdjNo&mbRQv1-0_G?Oks{C{*8Q#9KhIvN zrsigLwl)s1F%pBllnr!gq|*(KQ1+vjDHmfBG-w&V3k&6>YEvM_KnHOzYq~NQb-J!X zr=MeOogUklVVMX>0xnUU!1)xbQPP;uQY(h~Tc>xidZgU4PvV#CE7Ls&8U16xkIaD z%+;*%Do0q-_mErWqL)chK9bGS=BRv<$~M zD~sBQrm7M{CSWMm)mF_ZD*7ot4pl}fKyn7B*pdd_Dm4StukxXj!$xX|;F#|C3@pc6epW!DjaPu&_r};o5egVcdKrD=z>90|dpwy@yNT`e0;J+IqwWg{sDf1D{ zfDjfBS%JF03jFF zz&A-tY7?sOTP_C4>C(F}-IW_&<>t;_YaA!^$aE-ig_fu4FTh0!-JfjyQi*W zHsLGn!Y$49?6Ya#Bhin=f$Duv&9sZAeXc2zl)b}c9YpzzW8DaWjt_C<)NE;I zkx)oU&a%J;M6vbDAAPx9(l28V-~FV8NgEtNOvp+&64;v9};js zKN`qrIJagTdutZ5UL5#I%1U|I66~0_^?^Q;mM@MFn=7=5gs;vYXqAfmwH%cOMHY23 zEA9)M^zg1aMGaXC!}JZOL^lpeU}IfV?QFigTDmzET;T_bCi+M@WCs7Oaa24$Z4a+k zgbCp$G2L<$H6|W?K3El;EUO@iJNr5o$!`5l$$$?ZK0JXcSu_ZDnlT*m`1s+g-BV;U~)!kTlML%QVZ=cnV@oQL#XN#fRXwl=>2~ zwQVVo)P{I;cxnJPk_B?+NA-kAB%j)DL?7~dM6=2{{1(xm*?M!g_6u->XfkyS{QL{! zIC?;c3}$@xIrU|X7DXXx{4W5Si3n{$+L0v+SPBxsi!|f7{+Lk9k*9#WXcuc6z$6B zf=ZgU*e5X&)R{u zn=R`{hH&Oodl`}p(i)u=|0u7q_tJJrx(u2L^%Ai6=D^VckkoKaaMjL4is*4pf0Orh z&i|YyGzN(dU(zy#JdW)b;0kw1cElv&2}Zd-2x5ntQp?N3RTJ|hr0xD8O zkfI0*p@-g)E=8J(6hS~xx*)xyC{;v?NEf7eHu}Eb|9<~D-+i8Q?>Tp}GkeOKHEY&d zQ!<(2|8_;*_U1TgUcOt$p&9zx7iY6cj)#7|c}=|HWlnPX$h&Gz=eE=k$n{8Cvc8Rk z*yqCyv>Ov^?=2*o9Tq={{Q{V1NO(>$H#S3N3~nN3=n$D4OcY(R9+sIDgohsO5nq2G%iOucUAa_k=Db0J(dp%d*@empgIb2G&c)z6C~WiT|< zG_Ckqg>2g&x;sCfM(!C|TEaE2vlw3Gn0Ys!f6D!$B1u%+UW3Xv|5EHr>TblK5H0TVhS$ABtIOb)r-E;R zw^+*RG|a-&+|}3GdUdBGt}%lbP#mjS{TJ@MNBm6Z;iP?V&Il7AbWHvv6_ty?n=f>Y zX9nnT0@93d@?dvnKGo<(#`>vW0PmBdkQbIrG0|&`d5TXTa{{dFUJhRV_LdaSm0J_O7->qG4 z>!br&lixTmIZM}W7sspC5@TB|T+M}HP{X24=zjsUZanRYK=IXK^qkcMc=g-78(E;( z7P;rgI0BEbh44!=78TcEy^Rcec$C>oIz&xaH9eE3y>rl#(oHs|^&i2}4qx7r;gxb5 z=K(x-lp?8&8ck{^r@{aqWX6A^8~#23CO7LG@|>yG{QvH&Xrv;O^l0Q%b87ld%Q%&# zh+Fml-4}ki&pBqtkzy<{=)eGMZvH&Ve;la4y#ES6ar_QEMd6=vQ)k7g{#6B&+@sZh z1Na-s|2ohnCf&B&cdYcs+MTCyJwJl^LURLs_goC64(dzyH-qaHo0L&D!ExBey=159 zTf0tmi2m$h1MqZ<3nY0MBP0}vNbqQvp2*l=Rc--in_ATQ0+RnutMh>MI3S#a(w&Tu zZ?GB@)XB85l96k3StB@AT>?VkSoWZP^2xloBr#3^`ku-LgG^5D(}=VYA-sg9N$712 zjCs~xjJQSFkRq# z_(OVohtch+!pFY=Zs#Yun+$V=&uJ-5c>H&_XS}FDI&$Kxr|C5xUr#(&64%1YMy6O+ zN|q;YAE9jRz(g*1PO?w>iQn$7*wvE@84f+3!Vk}ePyUiM~0H#+1d%ri^@LP9-U zteg#At|TDvC~0on*v08(eSPV~W^f6&F#i5?uumj69aWyKJ9q5(dj{E@2Y{tRz?_KwxuE*?V5Tnpklz+T)Tql6?Cr?U-Dl*J5>Q)s#DJ zOZR!rpz6cd!)2BAzh@Y7%S^`adevL&C(C6A4%}_jQ;=;~$ei+6ta}OyuMe)_!2nJu z_R2PVwbTo0zKXnTz_HtJ`_yFeu2(fUp89LfG0TmRS3xAm@xHn5%PhH8<9qs;en4VD zl=T#mploQY2<8B*O`QREvzt0zQ^$m|#) z%}r?wXHvNdm1%#!V|H{o|uN^U6N3~N{jlLyfPHJiY@MOS0s@VLP`;$10X!Y)Ux3%LAix0=AzXzqEBKA z#SVyVV@Pjv#nUb`AY&BY@ecnYfV5V#~188~j#l&v89`s8D=_8=#C<|1$nLau#T5oM?C5GzYUXgH%= zY(tyMtm}I6QDvh?u%nb8YK$-pv=vDwHFG^?c8lUxC2bz-y?p{;!LI+wO%y`Cv3=Ri z;Gy!n6U4B>XK<3Jmb$!Dea3+KOl?gMACG$$TvTAK|0H^*cd7Ra#Rxku`I0=4h=tViCfEZ{4ko>J{? zm}X#4p^VohD!jXRf^pg9CHFa`wkrJLxt;*-CE3?dOu^hc)jr3-?H-#_Dkw++_`zgk z<`6U#(gR>r93$uHGp9oK9tVaqX)pz(G)H*&+&9i!Qx=|~AU4OZrd*?dX?SWUW(;Qx zaObpHBX6Ag;tm72(WDS5ez1@YrB|1nr*D0`-pBo65guq=YQjM3;uTiPk{Qt6ew)9Q zfy~wo^^#Ii{Gt!5PY5MRqEhNRBx4tWEwdrO@&Qby7BHfupi1OoY-MQWq7!=+&Dc_F zXG_@tH+R~+E*EQDZ8dqzG(87OeLj#NOcj2Xg&;gJ!UJMQ^9%6W`3%cg2x+&rKkmv3dXQi3(1DMquV4i`Z;i!KpK80*G3 zi`51gXi=TY`WR#`88lc}RDtG{9jd#FWW zPAYan09g=Uch_4CNrFLo@TrjnS<*9^mPG=jk=6%y5!N>OK>L#r%?J+YV8|8RR&(_x z3S!48TK*X2{N&WE`-Xk0LJp9+t$rrn&`FRUXM*6yu#{t@BS~#?fEF#wLhn52<;SYR zP7g+~iI@Q3m|5C#(!;BFTpGVeXwgdH7+{$*z;23J#CCo1Gx@w(!<8h>rFjuhSie-p zh)yQMcE2UQyPQjQbx^cd-e=f|x0f|U(m=eO%&ig@uMh`b$_*eeTvlYN!OF2LBdIm- zQ5J3j`l%YfvjB7QYzjDgYHjsdFQGOe=2nxOMRJ!`HGOx=*~{6*o^d}W6bE$4-7Y8q zENvpmOE=5ZSHn9*M4D8kXoqrwA=RjuoB7mGC4+NyqFtVRbXawpEH}N{)0Pa+DRyBd zr|8+i8xMJk1fDh z45NAL-AVUNz{B{BmOW#dHiZ3jt*>!Swd#XV@Db8NwsnTNDFgaf^5ws`d zzHh-i&PE%10y+V$I zV~ejv#184!NkB<$;K27>cLof_%jHv0vxgY(_hIc1#x|q6BBFudOku;!G(ia!6;)z! z@pv>{(X5IJ#FmPVfu7I?h#V{+U0w`=~qTy|9ct`QEl1sOyg5uUki%~iEyziY+1@a~L&6W=#FR1M4jJ|JHunb>hlB*bvDg1bi%KuUV|Hw`5z?oy^GT6IB0qv^B z=f8kp1H!e->|G{X=O1l7J600VPCIu^{^zHeFbIqy(05aq9zPlOvqdZ%Ue46mKj3d3 zcQFAnAO^j$XFv$la41ZmB#j&>Q|`=ZWp685NV~gP^$Qp)NFN%d-H?$$lJEo+NgHH0 z&L^@c!c)a~aCxK&%}^G|Mc)<{B$uF^`Rrv%+m8ZO)vZ52=aRNp!2@mUUogQ%eNb?~ znh_tYgnEw`9xyuePb?_ku8fZ|cE41_WiY`dsObJvCCBYLYmB-r4aCORzdK_bfRlVF+ryEWAP(|3Uta zsK^W$!y(=6a1TfrJ|3Wpm>+<=>(GFA{?iLWc94JRAPL? z^xk4dWS~Zor4JIKwkzJNa{8uR^b-=8yUOX@s2f=>F9(vdA2*2=rmm4M!L7HIGkde3 zC}ldQ`N8q`HIRCA;}Ca>~dr3*8~;6(u50h*yXe5kYj#m_lYGT&8XT13uS7Vg$+{+C`jnl@wup1 zO9ULN$d`|rUmpse%%+-wv#ADed-xTD6Wlc}k2^w>RZq;h;lTG{L{aH|NgJzd#=T zng9?a5C960fSYWPoBc2zEd;h3G1!E|c1fITWp`5qpb%sp7>S1gCmV6lpanj70Gy!! z4P4>GLbi~BD8N9JQ4^5gkK5`;Zs_1P^l%kA!fpf*0u6ov_=!aTkf43?Ju#RQB>3ML zPrLv?fz4ONwsatds9S6bwk-@ge z@btr)mDt64Situ6b`Z>6n=hc34;cg?Aut{&dm=f&&;kS70sUB9c?$v?j6&i8>zzlI z&8T^aT^v{#MHC$gP|=A7OOB+0V^0c(plcOIlkh3Fu;62bn__Tc2xJp292(0Kh(L=Y zu&uxzJDJ0@;^i(yj1mnp2#y`rMh-`_G{dloFl?(biX>Pj9)VVZ0W$z*laj?l3pdw? z^61AU=&+y(06+;>+-%}8Foebd(msG93>^m`AOt|15()A%5P&Nw!qETmAj$2K_AQG3; z2Op$H+38`S5P%0Pk{ZmAfQ0C=54YlS0zvtp8Ti^`x|EvU^0lN1<$wX8E}RGzjRrYF zapJ`S06hT=J5hymdcvFCEEUS^`ho0tYRm?KFBcGUCt_Erid(5Ub{#%kW50w%pofSO zJbeI3EUu!LJrRQ3qDHnv@-lRAbcf)SVkOWt>_L<$!aH=H?!_fl z1TPE?w2>hIp2ZC7D4>U+d^rkW_j@Iw)FU$s!5|}1068$Aj>b0wih(d21Ym#wDkyMs z0m67i03gE#r~}+YynC36B9)hA$WsV~ijnC7LE9~d1VMsF6QC#T#6!R-)H+}(&m=mm()2BN+?%AF%Iu$DzZUG}mNfCLvkt7E$e(9i5> zB*G0wKsK=#Q@tU<1O>qG5#59*ux<672<0=# zXFc5JG_EEVw?%shW—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 stnHGwe None: ... + +class Reply(_message.Message): + __slots__ = ["length", "msg"] + LENGTH_FIELD_NUMBER: _ClassVar[int] + MSG_FIELD_NUMBER: _ClassVar[int] + length: int + msg: str + def __init__(self, msg: _Optional[str] = ..., length: _Optional[int] = ...) -> None: ... + +class Request(_message.Message): + __slots__ = ["name"] + NAME_FIELD_NUMBER: _ClassVar[int] + name: str + def __init__(self, name: _Optional[str] = ...) -> None: ... diff --git a/src/chunk_pb2_grpc.py b/src/chunk_pb2_grpc.py index deb223e..d14c17b 100644 --- a/src/chunk_pb2_grpc.py +++ b/src/chunk_pb2_grpc.py @@ -1,63 +1,99 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" import grpc import chunk_pb2 as chunk__pb2 class FileServerStub(object): - # missing associated documentation comment in .proto file - pass - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.upload = channel.stream_unary( - '/FileServer/upload', - request_serializer=chunk__pb2.Chunk.SerializeToString, - response_deserializer=chunk__pb2.Reply.FromString, - ) - self.download = channel.unary_stream( - '/FileServer/download', - request_serializer=chunk__pb2.Request.SerializeToString, - response_deserializer=chunk__pb2.Chunk.FromString, - ) + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.upload = channel.stream_unary( + '/FileServer/upload', + request_serializer=chunk__pb2.Chunk.SerializeToString, + response_deserializer=chunk__pb2.Reply.FromString, + ) + self.download = channel.unary_stream( + '/FileServer/download', + request_serializer=chunk__pb2.Request.SerializeToString, + response_deserializer=chunk__pb2.Chunk.FromString, + ) class FileServerServicer(object): - # missing associated documentation comment in .proto file - pass + """Missing associated documentation comment in .proto file.""" - def upload(self, request_iterator, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + def upload(self, request_iterator, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') - def download(self, request, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + def download(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def add_FileServerServicer_to_server(servicer, server): - rpc_method_handlers = { - 'upload': grpc.stream_unary_rpc_method_handler( - servicer.upload, - request_deserializer=chunk__pb2.Chunk.FromString, - response_serializer=chunk__pb2.Reply.SerializeToString, - ), - 'download': grpc.unary_stream_rpc_method_handler( - servicer.download, - request_deserializer=chunk__pb2.Request.FromString, - response_serializer=chunk__pb2.Chunk.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'FileServer', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) + rpc_method_handlers = { + 'upload': grpc.stream_unary_rpc_method_handler( + servicer.upload, + request_deserializer=chunk__pb2.Chunk.FromString, + response_serializer=chunk__pb2.Reply.SerializeToString, + ), + 'download': grpc.unary_stream_rpc_method_handler( + servicer.download, + request_deserializer=chunk__pb2.Request.FromString, + response_serializer=chunk__pb2.Chunk.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'FileServer', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + # This class is part of an EXPERIMENTAL API. +class FileServer(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def upload(request_iterator, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_unary(request_iterator, target, '/FileServer/upload', + chunk__pb2.Chunk.SerializeToString, + chunk__pb2.Reply.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def download(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/FileServer/download', + chunk__pb2.Request.SerializeToString, + chunk__pb2.Chunk.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/src/demo_client.py b/src/demo_client.py index 2730c8b..91292d6 100644 --- a/src/demo_client.py +++ b/src/demo_client.py @@ -7,7 +7,7 @@ client = lib.FileClient('localhost:8888') # demo for file uploading - in_file_name = '/tmp/large_file_in' + in_file_name = 'game_world.jpg' client.upload(in_file_name) # demo for file downloading: diff --git a/src/lib.py b/src/lib.py index c281e4a..38fb6dc 100644 --- a/src/lib.py +++ b/src/lib.py @@ -3,25 +3,47 @@ import grpc import time +import hashlib import chunk_pb2, chunk_pb2_grpc CHUNK_SIZE = 1024 * 1024 # 1MB +def get_sha256_file(filepath): + BLOCK_SIZE = 1024 + m = hashlib.sha256() + if os.path.exists(filepath): + with open(filepath,"rb") as myfile: + while True: + data = myfile.read(BLOCK_SIZE) + if not data: + return m + m.update(data) + + def get_file_chunks(filename): with open(filename, 'rb') as f: while True: - piece = f.read(CHUNK_SIZE); + piece = f.read(CHUNK_SIZE) if len(piece) == 0: return - yield chunk_pb2.Chunk(buffer=piece) + yield chunk_pb2.Chunk(hash=get_sha256_file(filename).hexdigest(),buffer=piece) def save_chunks_to_file(chunks, filename): + # write chunks to file with open(filename, 'wb') as f: for chunk in chunks: + if chunk.hash != 0: + hash_data = chunk.hash f.write(chunk.buffer) + # integrity check - compute and compare hashes + if hash_data == get_sha256_file(filename).hexdigest(): + return True + else: + return False + class FileClient: @@ -30,9 +52,18 @@ def __init__(self, address): self.stub = chunk_pb2_grpc.FileServerStub(channel) def upload(self, in_file_name): + # check if file exists and has read permissions + if os.path.isfile(in_file_name) and os.access(in_file_name, os.R_OK): + print("[CLIENT] File exists and is readable") + else: + print("[CLIENT] Either the file is missing or not readable") + exit() + chunks_generator = get_file_chunks(in_file_name) response = self.stub.upload(chunks_generator) assert response.length == os.path.getsize(in_file_name) + print(f"[SERVER] {response.msg}") + print(f"[SERVER] {response.length} bytes recieved") def download(self, target_name, out_file_name): response = self.stub.download(chunk_pb2.Request(name=target_name)) @@ -47,8 +78,12 @@ def __init__(self): self.tmp_file_name = '/tmp/server_tmp' def upload(self, request_iterator, context): - save_chunks_to_file(request_iterator, self.tmp_file_name) - return chunk_pb2.Reply(length=os.path.getsize(self.tmp_file_name)) + if save_chunks_to_file(request_iterator, self.tmp_file_name): + return chunk_pb2.Reply(msg="Data received and verified.",length=os.path.getsize(self.tmp_file_name)) + else: + return chunk_pb2.Reply(msg="Data received but verification failed!",length=os.path.getsize(self.tmp_file_name)) + + def download(self, request, context): if request.name: From 76257e44e335b58a96ebecf6d817d85f10eacf5e Mon Sep 17 00:00:00 2001 From: Emmet Friel Date: Tue, 7 Feb 2023 15:26:37 +0000 Subject: [PATCH 2/2] added requirements.txt --- requirements.txt | 4 ++++ src/demo_client.py | 1 + 2 files changed, 5 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e3f11ba --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +grpcio==1.51.1 +grpcio-tools==1.51.1 +pkg_resources==0.0.0 +protobuf==4.21.12 diff --git a/src/demo_client.py b/src/demo_client.py index 91292d6..e88ac3d 100644 --- a/src/demo_client.py +++ b/src/demo_client.py @@ -15,5 +15,6 @@ if os.path.exists(out_file_name): os.remove(out_file_name) client.download('whatever_name', out_file_name) + print() os.system(f'sha1sum {in_file_name}') os.system(f'sha1sum {out_file_name}')