From 023062054bdb829c3758de2c02415169e115bbe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Haylee=20Sch=C3=A4fer?= Date: Fri, 11 Oct 2024 11:46:12 +0200 Subject: [PATCH] handle encode/decode errors --- __test__/index.spec.mjs | 20 ++++++++++++++++++++ images/invalid_big.png | Bin 0 -> 44281 bytes images/invalid_small.png | Bin 0 -> 418 bytes index.d.ts | 1 + src/lib.rs | 24 ++++++++++++++++++++++-- tools/randomImage.js | 2 +- 6 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 images/invalid_big.png create mode 100644 images/invalid_small.png diff --git a/__test__/index.spec.mjs b/__test__/index.spec.mjs index fa82944..bf43f2d 100644 --- a/__test__/index.spec.mjs +++ b/__test__/index.spec.mjs @@ -43,3 +43,23 @@ for (const params of [ ]) { test(testEncode, ...params); } + +test('encode too small', (t) => { + let buffer = fs.readFileSync('images/invalid_small.png'); + let encoded = encodeImage(buffer); + let mchash = Buffer.from(encoded.minecraftHash).toString('hex'); + let error = encoded.error; + console.log(error); + t.is(mchash, ''); + t.true(error.includes('too small')); +}) + +test('encode too big', (t) => { + let buffer = fs.readFileSync('images/invalid_big.png'); + let encoded = encodeImage(buffer); + let mchash = Buffer.from(encoded.minecraftHash).toString('hex'); + let error = encoded.error; + console.log(error); + t.is(mchash, ''); + t.true(error.includes('too small')); // not sure why it says too small +}) \ No newline at end of file diff --git a/images/invalid_big.png b/images/invalid_big.png new file mode 100644 index 0000000000000000000000000000000000000000..347062ae46431e27a59ccca95254392a72a0adb4 GIT binary patch literal 44281 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

l##KaK7h-Q(pmdN->nn1pvtuQp^aCpMdUN!C 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

@h}`q%_h`!Bo9>Xh%bcY57iO=n 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

7f~o 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�Eq86LZh;g#B>a=to%_>dfYdiBF#zaju_G+;Xh zWwzpaG?v-x{b*3P3mfN1$g(0|sm2W$DO&wb$3C!Gqou0K7=t%{JV+9ZP!yejgY864 z6$hiy3W`nH{1U%$Vm{v$Pr|ltA67m|rn$QeX#bEe90@Ba(XP<)@42?52GXJRcZ2<$6i=exE>nClOq#T6N_kjYh;c4!Og{A50a#_)7aE6!@% z=@KeDyHC3?-v5uJU8Pc~49?n>`rm)4`1Oqkchg{*;-U`a3(3@cj4fw}&E&%2jhuWb z%-l-DZK9BKNBwOK6(x{Vro{;jT_e4s*W5Z@g37vIo_h;b3 z4ED7ULd@A>11;?~V5I-$?{DHqh_wspxSu}nUNcyIhcO3x;L)isXCu^9&R>dI)Oao# z1+pL}6V>*e$xKS|psJM`*XE7L_Y^R=JEJst;yL&ZBZsZwX#LrY9{Gp9GP#2ekZnLGrf@Inzv|5sNYT=0l}RjHOH)lrMzj-jhY*k z>fHW~gU}u7g?_@n*vCpDYD=*zzdH$2IV?Gg?wLz4ogvqh<58ZBvXTzJed{sZrq<^E zL=UzaNElnKsR;+2n>^8)8gF+!b4qt0vSvn7rv z`|@cM(4Py|(fBy2F@7o$!>*8R+`cF6lC7G8e?wW0^Yb=Pynyxu_`#%F=b4IJXm`-d!jSk*t8!N>p(`Q|$%**B^Wvryas5k8Q>x55=8xIoaVdYbe);?r%55Wd4e>$Ts5kB}BS>QRM?tiZ1V0D?nUfP5Bm|3#VSXNBVWPLKG(82^d=1LdkL4y=Lt{oWAXvk@0Rm_usDNPg-=|2 zwVknj+^Kckf+HV9nHzV(8@F?BvH#)2h~qiL9MO_6)Lff>#~U1AwU1VcXYE0cDu{) z`P_UO>@#7kWj8*o6R!R6^CWcB53@L2T+8dj9@vCRZhf<-1DA`hux`&6;*CbI@sCi* zvkq71Q%*0Mcq%=H+`7)gZCGWro4ep+sB8_>JZ2x=Zgs%dd_IvErQG}URpIb$58vV4 z3~?_W*@oP3mxu7lD-}~8!3w8J>gdk5F2}>i?=dQA`)+(b0O!o(tWWKS&GQV*oVGD# ze-UdP+EFcP2R;8dVBjf2l2zIZOrIjw!a+xr&AU$~Q)^KproD`!Lr51MR8a;%|F{do zGgCOSJ(BJttjROF%FgLxS-ihV=sH_ZfZ^0e)rfw1j-h5{nN%(bcM~&A-bOHPq3|ZJ zo~@-q$!3+oK^g+a8Ih#&W9a)VKAft+-F=&<@ZA_-?&;Ok7|NaIhPseB2N^CB#C%?53Df<;nVCmkEs2?5pJu#HX0A+<- zH8!QOuK{oUN8+)u0MoE^lB^7CdX4z-;}@4wUlINOIBq3f(A`6YP+4O2ii-)Y zNP7Q`PM5{aX#1;i-n16mvmYotC)|R?@P1g9x2EL~0iB}`8t^Hk4k6F`qaA4V|Gb~$ zGldDXQH#cZ=MRNUTlY$r7G6et9dnHues}-A-@e-$HhvS4#<=OyM9b2zfLf84xcc6Y z{zpa75?7|jf6i&3t5hkr`>B_rtOo2j~!Zivnk79!?Wo-JOdXRy68HMPDH$ruLE>x;gF$PrEkefm%S| ztTD~0^do}(L1(Zj@*wh=BxCLvHlc%=gq1VSoh@|(zH?;;fACsH{MA-i*ooq`huWEI zZYIQs*5Yc;8LHnZWW=WsLa#j|y!LeJZ;0l?DGBYapOmcPw61lrnQcva6MH7vC_;{h zzeTB2P*k6!)+4FAWC-Q_>o7cNG(pF-^nGHEiJvsPYSr2X%TcvC;{T3a3v;=1C6M_+ z!gaX!J;vI!ryQ72llh5d*ceb6weMJ zF?}B5?tPOPb{h#Wl4M(%-_6+MZ^^%dBxmsLQ4v-~LL#~9-DhVHD~9UWQ)#2pu13A7 zL@lh^%N_$ofP3?jgs{PJi!mAPj)y_Y-_L4psetb@A?v1})S$ZOF3Qql|0D4Vv6EFD z;Cq@u)^(UTGpE!|s#Ge~`jk_cMi%n??RUQ162XJtEHQ~wX6F!8+m3n@cT#rd{r~({ zrBbQ(u5#c)Unh13h`BcP3gW$uQt~w~uq=-80)XxZoaIE?NUo0GfltU1UV4vadBA^?Xzf&EYZFaG*tu2ifIpVVa6^5$&_-T~T&D?A|Ci6Fu zHCJ3jr_PqFh?>VzH%rb~iwiWfFT(GF;ETiwbN~J}UoDHpCi-frd(#>G1LtWsn7=uM zGHq^P8YJ2Sn@&SWY0!`H0ZKVm<7e;w^IY^=*wDCAbM7w}EyZ_lQ^uYs>1mXvh(+%0 z*}*v%J)Ej36~$&Yk7zb+H$TR2pmLE!9ZvIV@X~ZP1H0?~{oc1nfy5nuPnYqSE%XNotNvsPeUiAsZdCk7G&R_|^Q4ah@HcYAAh- z&xcL^&$S+HSepn#TN*CW!``J0t@dBWqj4f3yM$aBKe`vU&6l#?yB5Q>X54=J*q-oht*~jm zo?k&#FlqjUk4|nx&QD`nWlvPsvN6mp*-SDg{WP5(nqU|!6zsEhVvg&?b|u$57@t&E z%>A8s;Ok7MaHZ9lO_7+Dqh8(k@WWIC@a%Rtww7GD&d!^tv zXegTi01R?TL_t)hotm2jH;@o{;;ebhYT(Sf*#>xj7fj>rBjK)7l#o=r^^TJ`KoU~r z8rV_nM{K`h}NUvS~{*Bm3vTWbtNWTsgW?EdV(4YdnZgUW>BunK5pNX862PvDRmJR9?5)u zH;k-L3S0Kp>n%NZMNoN{h!=}*tmHt7vX$8nV-M!GNFpFaz|^3(2f65zOS8`{7}L~{ zTt`Xx6zu8B#5#&Q_&HxXb<7C0K@;+Zhwf3-^h;u%gQ$&yr-U%Uw}>(Yj@&r!f^J3v zar=gGOSPImi$(VC>ZBBsSgt*ZQG`gR>Z=qo>wZ<)1*C&P4w{qV+h^BWMd%nsE2#}| zrtMXwY;K6(5*q%H5YTn#4(tZW0!ntt$0g?~c7IB5*`~Yi8p%0Q6Vd&ZJkwhn?h*dc zmCD^s$h~ffmChba$EJ{a(vFq>5wEy-Lyjou+4XzfY>?2OqX7`>o7d3!pt)iV^3M&t+_E??reML*hgu1KV_^w9Y?VLpz!QV)Oqh7tlkdnpq}?c0b|B|^

|@U4NMcPD*UM!!12g&8$T>1RvM-CvAasHM1}4;@XV zl+E304}wb0EaK1p1DF{<;qUv=|9Yb>%13{QgrFY_#_}xWF?wgM$#YhkMqSLj zg^p@I$Ly2|yl<-^=~GIi+uMea_;d{`A4vw%U0>*Lo2kO+RrZPC?hxS(G7QAcPFeSX z!RqGt9P-0eEBcK#ZoQbh(wuQA2l)O{7H@^A@=R*xxzpo_4z;^v5^*w$*=L*y*&|kC zR**3x_E+V7fGw^sXQJ9tp*p{Yi}?$5i=p3(PPjalq)LyB9;EcnBgecd<2>JUVUq_% z{{N5_R+%ZI_fp}7pwx%1j@+r*4XY_)Eh_hE#JVSo1Zp&Hk`1 zr50PC9l(9cPCT3g(KHnf!g=vv8s|<&-|GtVqm{O>DwRs*R$&u*lXlUjq_Onx)psn}6~7W}KAZVwRndBhE9s+|L0uPfhGg0iHEa|A z9L&ake=skMl$u44N^)K=qmGxg1l01 z%)2TKmF{;fVJALv^xSW3G6m&-*&!Dev1T_%S5?|GVtbeTOvmlG^7M2t){mRUS_FR5i3A>rX6kbgDMdOh}XqBxr zdonZM`}g(OSyC+e({>=YoKtChSA2iHS0;qS?O{L_3u-0yrZCEm3}>ax?0~(HFqd^j zKaldmhEvTg@ogX+zs_7^f{lms##|5c>oU+2S~TJ4yM{RTNy9`fVOsUKGME{f)Kbs> zZPkAX9leQQ3z@JQ(^!7I7(2YrYN5wQDdr;-QBD=g6|1WY!g!@n})mRsB)IO7ua?C$V7ZXU-^TN8QxDl?af z*3WVI5Pmf5!hFpu)Wva_eUg-I+a&RqZeEhzGTm^GGhT91+fKQ>GCIrFYOC<-Ex@Rr zjtYIJ%WQWv$Ewd4$_?&M{`aHYI5Hm3h&h?8jnT!wpZ(jz zo7pwQ?7nm`g8t2W zw8KBG6Wix)PfI-wEv`V~qIdX#r(2F{o0>--mgzV4Q^_?l_^h-mPf zAv?QpWkMbW8nIfd{TlHx%bK>^Y#8NrhI)xXcv`Ju>eCpk!(3?UdjQ*xL1-5lbJSR< z@3I$^CQ?u1!$|wH6jguiL(WIIQP}?(N515cGWHC$<|&*&v${TfJ2IRgZ!Nd=xE8qQvEpRM1_~JE^$nG04 z3#h{R>Yds8Ae9Hct7w_{-%Ti;ZwQ#oR7Pi z-@(706r|i~+LMhbYq@zih#Rw&Vwh2{j?ko7hY)jJf|Hg}ZBJz?T@WnOYOaK?r_XKY z;UjS&7yBya{^%(sDfS}v(%;u-rYjji6NiH|Ti6ei)5EAXPNDIQzZ)^vFpi#mZ_v!k zfz57r8FWY4@FQZ>1}v+3aqZ9!|u9x z5s7TgH73sO0NaL+Cd2C`$)+p$v^I|6m+RukWSi188HH zfVrdGs89HQBA;Kxq^+!M`wV}AQZjMuEHv-b3=gb-h;L8+)PitFMH}~L@>7hh^{H%Z z#p8e~#B{xZ-tOBt{FzKY>&x6WF2*%8mX>!*7eFp^mdf3ix0bS_QwI)s$UUn&PT;U# zMJ#e=qV~s7Nkylc=5+?+V%X1ls<1TW{reStmZaDzop_v%<*h`GR9z}Iz0=#UL zkCCe)!Z>_F-tV_fA#*NuYenl_70}5XN|Q{b)xBkJA#Lna{Rw!Y@G+is^%xi>&*oBm zKZ-s}we|$7D%88LLy^S*S}rTy(x!I0QgdNa&JU9y!8BU`&G@@&2@JJBm15X{`oVS- zhR+};BcEGVt~4_Zphj$Yj^2&q-C!Y3tZquUbnD^<4Cl(ghJ}ks>7~0I_nyW~$-2ig z%{f{)h)?^q>;;?5_Y+-3V)O4>nb}tQt#F%WO{)VwR9>WEosEE(NA*Ry;}|mR?}e|w zYesx^;mc=#DM7M<>oJKrM7mcLkB5$CRv$se`)c{3?y6>iMJV33QcRj;t4DDqNoMVz z;evgPlDo)OE=ZS)RS9a(NcM>jOCOz?pGxY`9fI00ln@U_h5KJhCmuI!gTZu|7%@Yn^4z z1Wb~FX>+?Rd**sE=}Zq|3?|T|@@woLD~&h$rb+l|J-YSZ_jZ(YM|b@xZu6v-L~quf zbJ#t$Ckwroqu)%TnVgBg*_WcItgV8MqjG*@NrL4ZM!%cO7TY2U2MVwWA00?&O>4}z z%E``zAEW=M#WmwrHasJDN&3RH4{_n|H=BUrb@! z>RS~2DWI{TFMk>YQuVm-N}Yh-gK|vT^cLTzIyjsVGaZtkxTxbE z{khvru>u8MoQQf>kKBrZbWyu-(rYN&#=XH@cN4FDJ2J3ABhrd=>D)oo%@>!7HEWXi sjToCa9&8k>X3;B!+=F-NR-*#{A6y7II#DiLIsgCw07*qoM6N<$f;nd0n*aa+ literal 0 HcmV?d00001 diff --git a/images/invalid_small.png b/images/invalid_small.png new file mode 100644 index 0000000000000000000000000000000000000000..21667342266f537968f11fde950fed8322649c49 GIT binary patch literal 418 zcmV;T0bTxyP);Ne{${PUF)>?P6j_W!CX^&(trj`arYu7u zQIemy2(>x5NC|~j4laHskr0t22O}+#grv0WbyzvrbA5X1eW7oSCICpTqnO<$d^y8H z!y2W{zVIMne47AJHs}wNCr$~Gao6`J&VHupO$u%H)>%21S5E-26>KrW{Q8YZMS$Ma zMLftiu~fYRduB3aG{V&JDXiA^)9fh~(3oQ8g8Y#=6Yacda#ACb(PYh~&L5=s&CZ&g z0OJ(~!v1Nm>ET?7E} zZY(`5Dppw#`cQo5rOK@#092h@*r_z~V6=f*Qh_n~5~||_URf&m3trWqz9i7RH2?qr M07*qoM6N<$g5I~bhyVZp literal 0 HcmV?d00001 diff --git a/index.d.ts b/index.d.ts index b1e035c..2d65656 100644 --- a/index.d.ts +++ b/index.d.ts @@ -9,4 +9,5 @@ export declare class ImageWithHashes { png: Buffer minecraftHash: Buffer hash: Buffer + error?: string } diff --git a/src/lib.rs b/src/lib.rs index 3f331da..fb02584 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,7 +15,7 @@ const SKIN_DATA_LENGTH: usize = (SKIN_WIDTH * SKIN_HEIGHT * SKIN_CHANNELS); #[napi] pub fn sum(a: i32, b: i32) -> i32 { - a + b + a + b } #[napi] @@ -23,6 +23,7 @@ pub struct ImageWithHashes { pub png: Buffer, pub minecraft_hash: Buffer, pub hash: Buffer, + pub error: Option, } #[napi] @@ -37,6 +38,15 @@ pub fn encode_custom_image(buffer: &[u8], width: usize, height: usize) -> ImageW decoder.info_png_mut().interlace_method = 0; // should be 0 but just to be sure let decoded = decoder.decode(buffer); + if decoded.is_err() { + let error = decoded.unwrap_err(); + return ImageWithHashes { + png: Buffer::from(vec![]), + minecraft_hash: Buffer::from(vec![]), + hash: Buffer::from(vec![]), + error: Some(format!("{:?}", error)), + }; + } let decoded1 = decoded.unwrap(); let decoded_data = decoded1.bytes(); @@ -58,6 +68,15 @@ pub fn encode_custom_image(buffer: &[u8], width: usize, height: usize) -> ImageW let result = encoder.encode(&raw_data, width, height); // println!("Result: {:?}", result); + if result.is_err() { + let error = result.unwrap_err(); + return ImageWithHashes { + png: Buffer::from(vec![]), + minecraft_hash: Buffer::from(vec![]), + hash: Buffer::from(vec![]), + error: Some(format!("{:?}", error)), + }; + } let png = result.unwrap(); let mut hasher = Sha256::new(); @@ -72,6 +91,7 @@ pub fn encode_custom_image(buffer: &[u8], width: usize, height: usize) -> ImageW ImageWithHashes { png: Buffer::from(png.as_slice()), minecraft_hash: Buffer::from(minecraft_hash.as_slice()), - hash: Buffer::from(hash.as_slice()) + hash: Buffer::from(hash.as_slice()), + error: None, } } diff --git a/tools/randomImage.js b/tools/randomImage.js index a2c7b71..1c17fd8 100644 --- a/tools/randomImage.js +++ b/tools/randomImage.js @@ -33,6 +33,6 @@ function makeRandomImage(width = 64, height = 64) { } (() => { - const { imageBuffer, imageData, data, blob } = makeRandomImage(64, 64); + const { imageBuffer, imageData, data, blob } = makeRandomImage(128, 128); fs.writeFileSync(`images/randomImage${Math.round(Math.random()*100)}.png`, imageBuffer); })(); \ No newline at end of file