From d9d182f7baa9eccbb654b8f3b569ed8ef910c76a Mon Sep 17 00:00:00 2001 From: Aileen Nowak Date: Tue, 11 Apr 2017 18:40:17 +0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Blog=20icon=20improvements=20(#8?= =?UTF-8?q?260)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs #7688 - blog icon error message - change default favicon to 60px --- .../server/middleware/validation/blog-icon.js | 14 +++++++------- core/server/public/favicon.ico | Bin 15086 -> 34494 bytes core/server/translations/en.json | 6 +----- .../functional/routes/api/upload_icon_spec.js | 4 ++-- .../unit/middleware/serve-favicon_spec.js | 2 +- .../fixtures/images/favicon_32x_single.ico | Bin 4286 -> 0 bytes .../fixtures/images/favicon_64x_single.ico | Bin 0 -> 16958 bytes .../fixtures/images/favicon_multi_sizes.ico | Bin 15086 -> 34494 bytes 8 files changed, 11 insertions(+), 15 deletions(-) mode change 100644 => 100755 core/server/public/favicon.ico delete mode 100755 core/test/utils/fixtures/images/favicon_32x_single.ico create mode 100755 core/test/utils/fixtures/images/favicon_64x_single.ico mode change 100644 => 100755 core/test/utils/fixtures/images/favicon_multi_sizes.ico diff --git a/core/server/middleware/validation/blog-icon.js b/core/server/middleware/validation/blog-icon.js index e1a2be58ea..bf5aa132fd 100644 --- a/core/server/middleware/validation/blog-icon.js +++ b/core/server/middleware/validation/blog-icon.js @@ -61,7 +61,7 @@ module.exports = function blogIcon() { // CASE: file should not be larger than 100kb if (!validIconSize(req.file.size)) { - return next(new errors.RequestEntityTooLargeError({message: i18n.t('errors.api.icons.fileSizeTooLarge', {extensions: iconExtensions})})); + return next(new errors.ValidationError({message: i18n.t('errors.api.icons.invalidFile', {extensions: iconExtensions})})); } return getIconDimensions(req.file).then(function (dimensions) { @@ -70,18 +70,18 @@ module.exports = function blogIcon() { // CASE: file needs to be a square if (req.file.dimensions.width !== req.file.dimensions.height) { - return next(new errors.ValidationError({message: i18n.t('errors.api.icons.iconNotSquare', {extensions: iconExtensions})})); + return next(new errors.ValidationError({message: i18n.t('errors.api.icons.invalidFile', {extensions: iconExtensions})})); } - // CASE: icon needs to be bigger than 32px - // .ico files can contain multiple sizes, we need at least a minimum of 32px (16px is ok, as long as 32px are present as well) - if (req.file.dimensions.width < 32) { - return next(new errors.ValidationError({message: i18n.t('errors.api.icons.fileTooSmall', {extensions: iconExtensions})})); + // CASE: icon needs to be bigger than 60px + // .ico files can contain multiple sizes, we need at least a minimum of 60px (16px is ok, as long as 60px are present as well) + if (req.file.dimensions.width <= 60) { + return next(new errors.ValidationError({message: i18n.t('errors.api.icons.invalidFile', {extensions: iconExtensions})})); } // CASE: icon needs to be smaller than 1000px if (req.file.dimensions.width > 1000) { - return next(new errors.ValidationError({message: i18n.t('errors.api.icons.fileTooLarge', {extensions: iconExtensions})})); + return next(new errors.ValidationError({message: i18n.t('errors.api.icons.invalidFile', {extensions: iconExtensions})})); } next(); diff --git a/core/server/public/favicon.ico b/core/server/public/favicon.ico old mode 100644 new mode 100755 index c24e3c410330d199710adb42c6a1f624ef87c013..a60606aa2fa02c59421b61a74594e3e9a0f3bd58 GIT binary patch literal 34494 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 literal 15086 zcmeHOX>b%p6dnqz{G$cGEPv*QTK*FSLP$2*T;vWR2PqFw!4hH#B7$5cuyPfLMM)v2 zf+)om!WoXp8L^Nn;Yb2Xgak+|NjL=aPf~fluXlSg+00~SCp+0Jq}3P9v1?8 z-Vs*UACo4_CrGK(C2((M%IN%8o5Q- z?ux{_+8f8anI9j*XBTTkSKm3v=t^F!n!e55?MK=2xrrwrr1$9z}CB#LE_DQ|44P~e^k^?5NrHm6PY*@Br z5!F;zQElz-RC~QMUAtC8>({QLeJDso{J{*yqO7-=1 zWcGV-|2~a=r;uDj2MR(SWoAEMLx&S%DK>f_<>zKnb5oO<8Pw9!LLZKOSG6B`l$rg2 z4IR)G>^^``@<(J+)7`sfW(Zq97&A(>A9*YG0~I-IZ{{R!N{g5fm(%h~)MFQlb@gtA2oJYwwo_dnhN)EUVEv#=n?G25j* zXhTfY8|v7Q?`V7Kt&{vR_11SG$Cys}UE1(8q|*P{{z1uH;d-Zo+-xi z!ucKw2I0K`Ca|4q18`G$Za8uLD7Ch>Qd?VFPzjj8h7Kp%08Fd%zu7!#RPXHk&+9L* zEzM2l>z9#zX63;4u3yfqzv(FnbmrI7W@gx~KYQjhL5CCLN6ww2-X2NIzgj}8zga=6 zR(>560v0fVE%i8+Vjb#w{qlZuwy$T_o+YMJc0Vn+7@P1_46k1?QP#-C{Ce&8_9bHo zte#oFa=r`%+jXzWzU;-ODoM;0u^G9UR-MfF;njiP= z-L39zG5+wqfHhqE12%LxW54zNqt+&wKTx`_gZ=Y7Uv#qH>HQ=2QFrd#mL>(1mh9Y4 z@v%e1I{^RBnlV*;M`=NTE%$AD?|XO465T^-?dp}(*w8@D%}ru251$zlc$lu%RMRID z#;fB3<0Fs9$?;=HsENNBzynNRLq~V*G?Is2;KN5aC$LI5xAMmXR%)_aeD44Un80>o z?Ca^q8HaV!KO2OtUILarkH2o6XIp2WIyjwt+ygu^Mi~m-!O$t=tHHnu1%`+X_dq{8 z)wWG>-dKB>#_tB_hI{-JaqMu8U&}Z=V)FbRgysDKwGCl>e?zvxdw)j6nOc~Fy*2?8*wdg(YX{FUuW)%O)4xo? z*6WW49i`9-8+`4CZht*vayb4CLL3}-6%yjw_oK+840VzZGLW^S6EbK|YH}Ry-Ls2s)z?#f zU7eRW7GHPs2CZDNT*XEnW%XPq`5?1*Pl>>=vxkEW;yy;_LTC6)9Q#@j@_IkW+KnAS ze_l>HH8kAOgBI~>+}i*d#jYU>3_I;d9{_v7yg9VHq?mS1 z(u5*WwoAhY8OQ>|?ihd^&IJAK$1}<$t`#218)ypb?ogomwEXa$XU;4t-m%q7+c~vD zK7PpB^*?-^i}7dkTn>X4vcT}~KW!V0@{q~P$)Lu@2Ho**r4X{fu%jP#;oV-kcmW+c zu%8YFNRU~&c%i^BYNM5M?Kro>ujT2Eti%C^h^rvBVnA9w@U`UAmP@=q()idYai06* z4;#sdzTfyQ6^$FC&P8t(=F<9gt7$XK;4E044F{qZyl4l`E^pteHyvsxPaNZZju!3S zxM97@4_UkC&N#y?$jh>HuL`kW+{J^xw{6|5>POrh78FPj_F^ye2FS6FVMt~#|c6nWo3sC2p;fCz5Xfg1K@6aMrxwi zXJW63Jjzh#&o7^WnaTPOA1bBGmoCz!ixo_jKB^F9hYywt9zFeD`;+PDkuth=wMN`; z$Gv$$HC3Vvb%>4X$xAz={h4X7Ig!#*;@R$4UbB#z*w1Y&-M@z_E}WzD=gx9^Uab4r zFK_s69e=Ct6MoRsk237h;b+`^zjv>h9z3{Dznm%;cHpi>b@dg&qbCphF*eY@BlELq zWF8Zz*%`xx&*6XI>x`ccV-VQ*UXdhqA(eUQD^4Mccfj`hqj?8yy}zDr%uJB|4{t4J A_5c6? diff --git a/core/server/translations/en.json b/core/server/translations/en.json index 06809d34a1..7e16c86f3d 100644 --- a/core/server/translations/en.json +++ b/core/server/translations/en.json @@ -371,11 +371,7 @@ }, "icons": { "missingFile": "Please select an icon.", - "fileSizeTooLarge": "Please select an icon file smaller than 100kb.", - "iconNotSquare": "The icon needs to be a square.", - "fileTooLarge": "Please select an icon file smaller than 1000px.", - "fileTooSmall": "Please select an icon file larger than 32px.", - "invalidFile": "Please select a valid icon file.", + "invalidFile": "Blog icon must be a square .ico or .png file between 60px – 1,000px, under 100kb.", "couldNotGetSize": "Couldn/'t get icon dimensions" }, "users": { diff --git a/core/test/functional/routes/api/upload_icon_spec.js b/core/test/functional/routes/api/upload_icon_spec.js index 5397682711..2de1b7d46b 100644 --- a/core/test/functional/routes/api/upload_icon_spec.js +++ b/core/test/functional/routes/api/upload_icon_spec.js @@ -73,7 +73,7 @@ describe('Upload Icon API', function () { request.post(testUtils.API.getApiQuery('uploads/icon')) .set('Authorization', 'Bearer ' + accesstoken) .expect('Content-Type', /json/) - .attach('uploadimage', path.join(__dirname, '/../../../utils/fixtures/images/favicon_32x_single.ico')) + .attach('uploadimage', path.join(__dirname, '/../../../utils/fixtures/images/favicon_64x_single.ico')) .expect(200) .end(function (err, res) { if (err) { @@ -151,7 +151,7 @@ describe('Upload Icon API', function () { .set('Authorization', 'Bearer ' + accesstoken) .expect('Content-Type', /json/) .attach('uploadimage', path.join(__dirname, '/../../../utils/fixtures/images/favicon_size_too_large.png')) - .expect(413) + .expect(422) .end(function (err) { if (err) { return done(err); diff --git a/core/test/unit/middleware/serve-favicon_spec.js b/core/test/unit/middleware/serve-favicon_spec.js index 5db57193a0..5384884142 100644 --- a/core/test/unit/middleware/serve-favicon_spec.js +++ b/core/test/unit/middleware/serve-favicon_spec.js @@ -118,7 +118,7 @@ describe('Serve Favicon', function () { statusCode.should.eql(200); }, end: function (body) { - body.length.should.eql(15086); + body.length.should.eql(34494); done(); } }; diff --git a/core/test/utils/fixtures/images/favicon_32x_single.ico b/core/test/utils/fixtures/images/favicon_32x_single.ico deleted file mode 100755 index a5f1611c14b7c962dfd997030932e4318ff3f4d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmc&&&rcIk5MJ@1A_q@Bh|!{841z`4?Y5=R0{;XTm75pi&4cmc!8B-MypSjc6b~kN zFwq!|iAI5do(&g68X-MPIg>6t=iA+R`*_(`egw-SA2aj4neUt35J<7CBlH!ITlj9x zoU*K#Wm%U9L|H`w_#IAD^NHiJ_VZ`Q(#h_!-P`37!~w&FHhGlbMf)@bJ2kbQj-?zs zQL&TVqAqwR?$c|X$31gOgcm%q19r*SJr&wb0BS$ie8;uggPiY~=b9t)9KplWd*>I< zmC~tDgJ<>>^?AKkc2srS$=gXK%IVY^AOIa8DGc-f^zP;C*ID?@*B@|2kM&`X%(Uxw$E(CMV<^a&Y>=Y&~tvBfdZNj8YCx@53x>vYzUvdvb3>V}_o&4*K{G?}l>+QAP+S-cx(b^SBHdd7F9yzB`7|HRXA$(udWqR>ysN5JFN{UUmdbB10` zvq<$J!`+*|bCCPGg9A>PAc_Hyt1$7~dit@G59UpC8ei_}>=@&jM#syY9i^6&&9UKP zt}-}~QJxz)Lwz67JwpY(*Hnl6a4}nfH$DTl#amO@0XmHUyxQVtyw9Kf85p~CbzUqD s6|!a8!Tk?=xWlB~O&%>R{&T~7)v}JwTGr9~_%}g=4!mZ`bCtaR0nsGKm;e9( diff --git a/core/test/utils/fixtures/images/favicon_64x_single.ico b/core/test/utils/fixtures/images/favicon_64x_single.ico new file mode 100755 index 0000000000000000000000000000000000000000..5a6625acbce3c52ed6ec274ad6a542f43b873de8 GIT binary patch literal 16958 zcmeHO+iw(Q6yItPqXb_XeV|Z4Ymh=)+U}+8cDudV1f}u8G%*kpP*ZD741a-Ejocmz^#xK8+DW;5o-;FN_RM#gncbZQA}l$a?>pDu z?|k2G3%i?0RKcHoJ^_C(O|0liB<@Wl5-UK!l-L1+_F^9k?!K$KcJZR2bZg^qs%7;g zh?Q(!B@}5{t=e>Pp|-f{tP-i_RTg4Sw>AyeE?G2$T%z!=s;ate-n@BtE?>HMuxa&* zG2l9*@RfPQ#Xqh(GCtq{Tt<--azl=$S=7|rSDnjd_5)`tiFnEp6^Fl`><{ZD$KyUM z$M3h08*-HS<4n+=Y^fiCnsY_g)#D(19Je2jKCiMdz^#4+x$=8}_o54C1J9W`5Fty{ zdB}OV*X8Q$JlB-NW8}3iM`we)Ipm6*=^oq<&keBSYlg!8e`>Sv^#J+fYhzQxL!+ry z;EobBgVu&%e^4&>>FVfgz8n`{Oc>VyXZvT|lA57ZYr{++f0~W1cNlKYf!4f^R~u%F zwM_NAIKvqQ`E@mcb1iVsB%6l4zIJ~$XSZe=>?HnJhS|<7eNXjKhxdpFV;gW!CmZ4S zgaW@}*Boo)++^wfBKKgNj2Mx7vcW2)W?4Dcn7YMd@tXXEwI&-b_1CCnogl7oJdsPm@yu-e7cGsW^=A?vnOQ-O;cyL;C* zaq85hi1M&3OMLh3*JABJk5UJ1=);&O5A3-IdV8~V@#rwhF>&srawkr+Gc#h_t1l_I z(T2Wa9@skym!O%TkBhFJ=TG}%(O$}9-&=b<+*BKFr922P)oIgU^n4Q6IP9fh-uL!i z-^>w5sr=*M;H!c2Ba!DtcBV__Pc_^gvGJ$6vX;5vUXGFXa*phW{XbJvMU7x~c2?}z z{<6}0=k`|w`igmAZ{OJ&IJKwOsBvy=yM`0a1#@&F&+LuYc8jU0(~)4~Yx|Es92SqR z?Nj)#Tib8@qQ3r5ojxsIhu%>z+Wa*`if)MEb+9fM@?lTxt;2M~+cNsQbzN{H7A}T+uV8a?IzqUhpG2u)=!NG>;=@Kb z4S7oaC>W_G=@M!O@gpB<1t0YC`3Xaqju9j8U)mba%FiQwugfW%d3b&t{ip`-tHVWc zvUc(|ZG2W7Ir6JGapL$j73{fb<1-<%=iFrcxaa=T*2j+>jr6mx5<$nHcN`paHL`8d z=5gi9l}b>HR1MJpXPCEd|aDzlpbFZ-Ke! z#6PbJQj1hN3PvZ!k6Yy^`*qw^+xhe7BH^q=(D`%c3}>X`)X%B>xDVccPn+9|i>z{aBJpI%Lko8P(ZxW1?eL5SD;kDO` z4bZc%r=x&10Hbe45uSjHPE0GDKS|*(=12pH@3rs$5g9Q_6lM|jwIeaiI+#to?{s`316{wcph8Z zc-Y?KFWK;Q=-`1*#V_MyS{eU&OpJpM#T@gK`1qp_#bbj5g*mf6Pi`0zBL_dT^Qq3~ z2R^Z115LPmc6MgSiv*wZv@TUoO#B}BbE+8U_lLhx@bu=}#b1B^p)E5p@tYE_=aGyU z7d8*I&ZSG2wAe~99y|KCg0sIjD=uHw_rTsNUln5x{$EXvbGc?sKD38RDLhR%C*j}F za?gi*J5AxXU5>xj`#^9-I zUmfg;y(z9doq{?fL3aUT{Qh%v`RGprCs-uKqJaLzZ^EYkLSnE0MzFmKi0ol|YT8t5ls z&m%8}d|`ELY}hNLpT-}AvAZ*6d003;A1>;v>21W#b7&oKzw9~`r_-9;axrF87R+W6 z=R@M16{}4?uEXM-bMo`x`MPz~oUq5n`UChW5(*wLEI$f9GZbYm-CN^(OLA&s-JmWSqQu^Z1#rIBFMF#~SF*??;ZrSJpTaychK=>jvRH^ijY# z6NWP`E@5@hPZEYn^3P;5Eu+W@x#`Ybo&)ajwei8a+kC|0XhfL;|>t-yiPj%`E;&y&UEho0m6nG?*IS* literal 0 HcmV?d00001 diff --git a/core/test/utils/fixtures/images/favicon_multi_sizes.ico b/core/test/utils/fixtures/images/favicon_multi_sizes.ico old mode 100644 new mode 100755 index c24e3c410330d199710adb42c6a1f624ef87c013..a60606aa2fa02c59421b61a74594e3e9a0f3bd58 GIT binary patch literal 34494 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 literal 15086 zcmeHOX>b%p6dnqz{G$cGEPv*QTK*FSLP$2*T;vWR2PqFw!4hH#B7$5cuyPfLMM)v2 zf+)om!WoXp8L^Nn;Yb2Xgak+|NjL=aPf~fluXlSg+00~SCp+0Jq}3P9v1?8 z-Vs*UACo4_CrGK(C2((M%IN%8o5Q- z?ux{_+8f8anI9j*XBTTkSKm3v=t^F!n!e55?MK=2xrrwrr1$9z}CB#LE_DQ|44P~e^k^?5NrHm6PY*@Br z5!F;zQElz-RC~QMUAtC8>({QLeJDso{J{*yqO7-=1 zWcGV-|2~a=r;uDj2MR(SWoAEMLx&S%DK>f_<>zKnb5oO<8Pw9!LLZKOSG6B`l$rg2 z4IR)G>^^``@<(J+)7`sfW(Zq97&A(>A9*YG0~I-IZ{{R!N{g5fm(%h~)MFQlb@gtA2oJYwwo_dnhN)EUVEv#=n?G25j* zXhTfY8|v7Q?`V7Kt&{vR_11SG$Cys}UE1(8q|*P{{z1uH;d-Zo+-xi z!ucKw2I0K`Ca|4q18`G$Za8uLD7Ch>Qd?VFPzjj8h7Kp%08Fd%zu7!#RPXHk&+9L* zEzM2l>z9#zX63;4u3yfqzv(FnbmrI7W@gx~KYQjhL5CCLN6ww2-X2NIzgj}8zga=6 zR(>560v0fVE%i8+Vjb#w{qlZuwy$T_o+YMJc0Vn+7@P1_46k1?QP#-C{Ce&8_9bHo zte#oFa=r`%+jXzWzU;-ODoM;0u^G9UR-MfF;njiP= z-L39zG5+wqfHhqE12%LxW54zNqt+&wKTx`_gZ=Y7Uv#qH>HQ=2QFrd#mL>(1mh9Y4 z@v%e1I{^RBnlV*;M`=NTE%$AD?|XO465T^-?dp}(*w8@D%}ru251$zlc$lu%RMRID z#;fB3<0Fs9$?;=HsENNBzynNRLq~V*G?Is2;KN5aC$LI5xAMmXR%)_aeD44Un80>o z?Ca^q8HaV!KO2OtUILarkH2o6XIp2WIyjwt+ygu^Mi~m-!O$t=tHHnu1%`+X_dq{8 z)wWG>-dKB>#_tB_hI{-JaqMu8U&}Z=V)FbRgysDKwGCl>e?zvxdw)j6nOc~Fy*2?8*wdg(YX{FUuW)%O)4xo? z*6WW49i`9-8+`4CZht*vayb4CLL3}-6%yjw_oK+840VzZGLW^S6EbK|YH}Ry-Ls2s)z?#f zU7eRW7GHPs2CZDNT*XEnW%XPq`5?1*Pl>>=vxkEW;yy;_LTC6)9Q#@j@_IkW+KnAS ze_l>HH8kAOgBI~>+}i*d#jYU>3_I;d9{_v7yg9VHq?mS1 z(u5*WwoAhY8OQ>|?ihd^&IJAK$1}<$t`#218)ypb?ogomwEXa$XU;4t-m%q7+c~vD zK7PpB^*?-^i}7dkTn>X4vcT}~KW!V0@{q~P$)Lu@2Ho**r4X{fu%jP#;oV-kcmW+c zu%8YFNRU~&c%i^BYNM5M?Kro>ujT2Eti%C^h^rvBVnA9w@U`UAmP@=q()idYai06* z4;#sdzTfyQ6^$FC&P8t(=F<9gt7$XK;4E044F{qZyl4l`E^pteHyvsxPaNZZju!3S zxM97@4_UkC&N#y?$jh>HuL`kW+{J^xw{6|5>POrh78FPj_F^ye2FS6FVMt~#|c6nWo3sC2p;fCz5Xfg1K@6aMrxwi zXJW63Jjzh#&o7^WnaTPOA1bBGmoCz!ixo_jKB^F9hYywt9zFeD`;+PDkuth=wMN`; z$Gv$$HC3Vvb%>4X$xAz={h4X7Ig!#*;@R$4UbB#z*w1Y&-M@z_E}WzD=gx9^Uab4r zFK_s69e=Ct6MoRsk237h;b+`^zjv>h9z3{Dznm%;cHpi>b@dg&qbCphF*eY@BlELq zWF8Zz*%`xx&*6XI>x`ccV-VQ*UXdhqA(eUQD^4Mccfj`hqj?8yy}zDr%uJB|4{t4J A_5c6?