From 141a340aadad4f23dbb1c8c61d656a1f3ecb4431 Mon Sep 17 00:00:00 2001 From: HardiReady Date: Sun, 3 Feb 2019 12:16:22 +0100 Subject: [PATCH] Add upload image dimension check/limitation for rank, squad and decoration images (CC-69) --- server/middleware/validators.js | 4 +- .../decoration/591c78741ee62711cfc18f27.png | Bin 6400 -> 54065 bytes server/routes/decorations.js | 272 ++++++++++-------- server/routes/ranks.js | 43 +-- server/routes/squads.js | 23 +- .../edit-decoration.component.ts | 7 +- .../squads/edit-squad/edit-squad.component.ts | 7 +- 7 files changed, 207 insertions(+), 149 deletions(-) diff --git a/server/middleware/validators.js b/server/middleware/validators.js index 94172cb..f18b914 100644 --- a/server/middleware/validators.js +++ b/server/middleware/validators.js @@ -4,7 +4,7 @@ const codes = require('../routes/http-codes'); // library to check image dimensions from file buffer -var sizeOf = require('buffer-image-size'); +const sizeOf = require('buffer-image-size'); /** * check if id has valid UUID format @@ -27,8 +27,6 @@ const idValidator = (req, res, next) => { const imageDimensionValidator = (imageFileBuf, maxWidth, maxHeight) => { const dimensions = sizeOf(imageFileBuf); - console.log(dimensions.width) - console.log(dimensions.height) if (dimensions.width > maxWidth || dimensions.height > maxHeight) { let err = new Error(`Image exceeds maximum dimensions of ${maxWidth}px width and ${maxHeight}px height`); err.status = codes.wrongrequest; diff --git a/server/resource/decoration/591c78741ee62711cfc18f27.png b/server/resource/decoration/591c78741ee62711cfc18f27.png index 03c59e5331effd831bb797b847ec5f15057559f0..513e8455002273779526d126420323e1253b2f9b 100644 GIT binary patch literal 54065 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'c|*K5gde00E9#BZqPc3EHwrlz5l5{e)7bF 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 DgnZ%- literal 6400 zcmV+b8UN;qP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000gvNklpid4`{J@40<@@1CV+Mk6sAkQgCZ5}QjxfMr7jh=7B)*cclx zYylDz?27G5TrO8xj!8_MitVyZNF2;!ViPJ@6;Td223ddw5(t6TL9#Rw8qKDe-tT_T z$&Vh%l3kU5^yI5PKf1c=RG;rX@A1xeI2thh!@w2DiU$&6D?zx7z>S7pz z<6{-%D?1J&ga9Cuu{ks{f$KWNk%?&vrlyY3Y);{ME{%rM7KXgp|L;VNnA@)SGcFmr zl-vIC)7-xP76L!!>p$7Rmiu1d^AFv_A78khdb7;)yZ?to(&4PErrDT60+ZIotURlq ztIvBcuN~UXwgWo|^O~u?V@#Jv=^9_rR)#1gdHe0dRBLs@P!WbPBS$Cs<)+tZG<^V6 ztdK*Cd+F-PqLrqQPx8c5yRq#gwq+tMgU-%gQmGog-z1gFv;~kj(#-2wz$f4HVS01j zyl>4_>^i!K>(0NH$G`j&JikuasZwt?Nm&-S|fMnrE6^&46ZA&?e;LluuL9!=7%&rhbU5f<NKhcE=ynv0BMMI0%#(!^1Wj`gX{G|*_2@%=hcBMZ#3n&dZyO*% z5Mi1YmCA`Tep9-YZAFnn7=k#~NY@QeN~5(#qws?Wr4>pGl!A0Rk7cDXO|YysF+^Bk zc&!`3?9FaH#iVqG!Q3L=HF!SDJC}3$noAiUo8rRrhj?!LOSq#IUQT_G!31oq*9e<+ zNX>4eTU(`#4lFCvHbCMy#Ih{%`3~Z^b*Z)11VKc#>QbwF2qEyi0NK@DPn5K!8CZ5+Miag@jBZ`c+0FsWn@r^n{3AEOyK)G`8YW`%wdbOYpo}%Ty7#KCaaVyO_YXw)}~r_h@uEXXwWgXokGe4QbtH=w*?TXk_c&V ziXsZqc7|Ktdn@n1@>*`c>vODn_YyktJ@_H4x_k|L_U+~S4?e)BZn}w`Z@x~U)J=F) zL+N+hXuvQ*Ra<9i7a&p^n5IQKogoN(!YC#RW2$wRLnBjE>psS8@RvQMJcWD;ts$SY z$z@VVQz9)BOPU0MPaFrc%W4ZCB32+lm;z$ZTGNr~;_Ug07(VzG^ZQGvFwL@+tC*e{ z$Eq9 z11-p9Qw$Dtw-_RzQgx7%Q+3K^2aTqXwW&8;;y5A-H7JFY62ti2f;KS3Nu%=$9n5-C zKuV>^XEPi>KFYq~Va~r`4X?fSB9A=!D63bk;f_0Q=b2wT&Ct*inqJ69KJ)>e-TEwB z8k-Rvtso>!jUiIxQv(=|Y#Shkp)m{-%SsRgAyE_)$1(M~!^n{nRO=oBfgeW5dA$X4 z9cj=Yvo^(I8dFLvOJYf*73_a+z2k-9Sb#a-AU1UCTAP~w;(S6Uq`$k5MT-`*Yv&d! zwI=J}0^95$5qF|>)V6-s zNxvzju(pC3BK&|Xx%v73;ja3*MuP{DVq1o_Ju_B5iqNsg;`gH3w z7GwI>Y+9rsg7btX_Kw z(~W6Jg7OuVfhp+omScExb1r}|Z22{gV;sk4Vyw*Ac+3AYo6U%#JaQA^G6q4$<)ybbv?k#qdVH#?LFx?!!XXsFj}tG zXr)02w9?4VVwyrn8k9!nQe?78jMLKID2h<(^woy6H`BvVV>vhc=?56wJI2b(hIsyk zt(1C7xSmJGPO#{_rR*CXX3^jPt5>bz+2?-6(PPKC_wG9wA3e^ak3Y%!wKt%Y#W%nC zWn|Lir~mP5e*E|=C>6C85T#<2G6=%}%aW+LRpVtcHofyYh%+u2f=byzj!)K@sWj0* zA!}2sI>b>#Bs8E%By3DGfoVpVW&$DFGY@IZz@LBMGZb&>=H4%SiI3m-Azpm(6&z3V z`s@2xw)7mPjvZy>$OxnRpP&F-xb#*w{`5&sG@D%Zp369Vc!Dd|U5-qet?b!M;Z__> zGtpK+OjBT*7Rh9azzUf$zIS zQ82q?+Xhs*{8BdD_qTlSd*9^~pZEm-@U8p#r|*25haY+ZnbQ2{(?4TEIehA>wXCt8 zqt<;bH$3undK-D}{ovg=Qw^@U<_a!ez3kMUFK!Ng`pP5NIvP z1x+o=tlzRTr%_xtvX{?w%?PwKhm5Gf0`lG!;^&+6G9WFuweNh9UEY3f{LG!)xYl6e)fC(G#Y~A8IA#xX^TVHIC^N)Y zd%ncHQilF>7P5b2hCQzzM#@y%0g*C9N{ehZ-%5MKm?(;=*If=DnWk22wN89LME3UN zDHcZasn=~94UagEiDM9Gve^!7`vg)N zBodjn0+LAN*t&Hao1T7(jXNIWrSVsw2z0;&XJ5#Q{`o}ywIr<_eCt;mnHWC?2{0mo zk^*`aQ=-Dg(F3fiHAp0Ka{`D`A&EqSVzHYr3TOSRXf!?E9xb2QTuh}BhDq-l%jv`fC50uXja{HZMV0zUkECgI2HaK`>H@E%hexA7H(`&ZIDJ4hJw1VGw)`rDCXtX73Mm8vVYE_XX_^M6 zG(l-hX}0=Dr**wMI!Yvy6+ACNGMQ;RAOQWPbp&t!oZ8A7kqiJ$t=8c3^Dai0-{2ct zwnOZJEx-U}Xb>9HN^)Lw7pZy-$&NWG1WzAO_4Lg9y)lD%4ZJz4%ug}|B;(_wL}9B+S4!cyKI4;kc9C>v!?$RoEUwt#KcKG`(&x5JJ z5D1~rMl1F#i$6!_Q~_iNGBc-u2+WU0bZu)B`rl%1pffgDq zA#X0^T<^13M;w~rD06LR%76~xxGrHB6NZY3$tu6u_S-XMK&vl0`wXGnre_YYW7p)I z3g!MU%Vzt?hXZ`=zU}NZ8W?$r5)qcjF<-A|VRbEL-9^}mKbRKI6(FYzF&Kp_~Cb-IYUbNzXJfi { - const filter = {}; - if (req.query.fractFilter) { - filter.fraction = req.query.fractFilter.toUpperCase(); - } - if (req.query.q) { - filter.name = {$regex: req.query.q, $options: 'i'}; - } - DecorationModel.find(filter, {}, { - sort: { - fraction: 'asc', - isMedal: 'asc', - sortingNumber: 'asc', - name: 'asc', - }, - }, (err, items) => { - if (err) { - err.status = codes.servererror; - return next(err); - } - if (items && items.length > 0) { - res.locals.items = items; - } else { - res.locals.items = []; - } - res.locals.processed = true; - next(); - }); - }) +decorationRouter.route('/') + .get((req, res, next) => { + const filter = {}; + if (req.query.fractFilter) { + filter.fraction = req.query.fractFilter.toUpperCase(); + } + if (req.query.q) { + filter.name = {$regex: req.query.q, $options: 'i'}; + } + DecorationModel.find(filter, {}, { + sort: { + fraction: 'asc', + isMedal: 'asc', + sortingNumber: 'asc', + name: 'asc', + }, + }, (err, items) => { + if (err) { + err.status = codes.servererror; + return next(err); + } + if (items && items.length > 0) { + res.locals.items = items; + } else { + res.locals.items = []; + } + res.locals.processed = true; + next(); + }); + }) - .post(apiAuthenticationMiddleware, checkHl, upload.single('image'), (req, res, next) => { - const decoration = new DecorationModel(req.body); - // timestamp and default are set automatically by Mongoose Schema Validation - decoration.save((err) => { - if (err) { - err.status = codes.wrongrequest; - err.message += ' in fields: ' + Object.getOwnPropertyNames(err.errors); - return next(err); - } - res.status(codes.created); - res.locals.items = decoration; - fs.appendFile(resourceLocation + decoration._id + '.png', - new Buffer(req.file.buffer), - (err) => { - if (err) next(err); - }); - next(); - }); - }) + .post(apiAuthenticationMiddleware, checkHl, upload.single('image'), (req, res, next) => { + if (req.file) { + const decoration = new DecorationModel(req.body); - .all( - routerHandling.httpMethodNotAllowed - ); + const imageFileBuffer = req.file.buffer; + const err = imageDimensionValidator(imageFileBuffer, + (decoration.isMedal ? MAX_MEDAL_IMAGE_WIDTH : MAX_RIBBON_IMAGE_WIDTH), + (decoration.isMedal ? MAX_MEDAL_IMAGE_HEIGHT : MAX_RIBBON_IMAGE_HEIGHT)); + if (err) { + return next(err); + } -decoration.route('/:id') - .get(idValidator, (req, res, next) => { - return genericGetById(req, res, next, DecorationModel); - }) + // timestamp and default are set automatically by Mongoose Schema Validation + decoration.save((err) => { + if (err) { + err.status = codes.wrongrequest; + err.message += ' in fields: ' + Object.getOwnPropertyNames(err.errors); + return next(err); + } + res.status(codes.created); + res.locals.items = decoration; + fs.appendFile(resourceLocation + decoration._id + '.png', + new Buffer(req.file.buffer), + (err) => { + if (err) next(err); + }); + next(); + }); + } else { + const err = new Error('no image file provided'); + err.status = codes.wrongmediasend; + next(err); + } + }) - .patch(apiAuthenticationMiddleware, checkHl, upload.single('image'), (req, res, next) => { - if (!req.body || (req.body._id && req.body._id !== req.params.id)) { - // little bit different as in PUT. :id does not need to be in data, but if the _id and url id must match - const err = new Error('id of PATCH resource and send JSON body are not equal ' + req.params.id + ' ' + - req.body._id); - err.status = codes.notfound; - next(err); - return; // prevent node to process this function further after next() has finished. - } + .all( + routerHandling.httpMethodNotAllowed + ); - // optional task 3: increment version manually as we do not use .save(.) - req.body.updatedAt = new Date(); - req.body.$inc = {__v: 1}; +decorationRouter.route('/:id') + .get(idValidator, (req, res, next) => { + return genericGetById(req, res, next, DecorationModel); + }) - if (req.file) { - const file = resourceLocation + req.params.id + '.png'; - fs.unlink(file, (err) => { - if (err) next(err); - fs.appendFile(file, new Buffer(req.file.buffer), (err) => { - if (err) next(err); - }); - }); - } + .patch(apiAuthenticationMiddleware, checkHl, upload.single('image'), (req, res, next) => { + if (!req.body || (req.body._id && req.body._id !== req.params.id)) { + // little bit different as in PUT. :id does not need to be in data, but if the _id and url id must + // match + const err = new Error( + 'id of PATCH resource and send JSON body are not equal ' + req.params.id + ' ' + + req.body._id); + err.status = codes.notfound; + next(err); + return; // prevent node to process this function further after next() has finished. + } - // PATCH is easier with mongoose than PUT. You simply update by all data that comes from outside. no need - // to reset attributes that are missing. - DecorationModel.findByIdAndUpdate(req.params.id, req.body, {new: true}, (err, item) => { - if (err) { - err.status = codes.wrongrequest; - } else if (!item) { - err = new Error('item not found'); - err.status = codes.notfound; - } else { - res.locals.items = item; - } - next(err); - }); - }) + // optional task 3: increment version manually as we do not use .save(.) + req.body.updatedAt = new Date(); + req.body.$inc = {__v: 1}; - .delete(apiAuthenticationMiddleware, checkHl, (req, res, next) => { - const id = req.params.id; - DecorationModel.findByIdAndRemove(id, (err, item) => { - if (err) { - err.status = codes.wrongrequest; - } else if (!item) { - err = new Error('item not found'); - err.status = codes.notfound; - } + DecorationModel.findById(req.body._id, (err, item) => { + if (err) { + return next(err); + } + if (req.file) { + const imageFileBuffer = req.file.buffer; + const imageDimensionError = imageDimensionValidator(imageFileBuffer, + (item.isMedal ? MAX_MEDAL_IMAGE_WIDTH : MAX_RIBBON_IMAGE_WIDTH), + (item.isMedal ? MAX_MEDAL_IMAGE_HEIGHT : MAX_RIBBON_IMAGE_HEIGHT)); + if (imageDimensionError) { + return next(imageDimensionError); + } - // deleted all awardings linked to this decoration - AwardingsModel.find({decorationId: id}).remove().exec(); + const file = resourceLocation + req.params.id + '.png'; + fs.unlink(file, (err) => { + if (err) next(err); + fs.appendFile(file, new Buffer(req.file.buffer), (err) => { + if (err) next(err); + }); + }); + } - // delete graphic - fs.unlink(resourceLocation.concat(id).concat('.png'), - (err) => { - // we don't set res.locals.items and thus it will send a 204 (no content) at the end. see last handler - res.locals.processed = true; - next(err); - }); - }); - }) + // PATCH is easier with mongoose than PUT. You simply update by all data that comes from outside. no + // need to reset attributes that are missing. + DecorationModel.findByIdAndUpdate(req.params.id, req.body, {new: true}, (err, item) => { + if (err) { + err.status = codes.wrongrequest; + } else if (!item) { + err = new Error('item not found'); + err.status = codes.notfound; + } else { + res.locals.items = item; + } + next(err); + }); + }); + }) - .all( - routerHandling.httpMethodNotAllowed - ); + .delete(apiAuthenticationMiddleware, checkHl, (req, res, next) => { + const id = req.params.id; + DecorationModel.findByIdAndRemove(id, (err, item) => { + if (err) { + err.status = codes.wrongrequest; + } else if (!item) { + err = new Error('item not found'); + err.status = codes.notfound; + } + + // deleted all awardings linked to this decoration + AwardingsModel.find({decorationId: id}).remove().exec(); + + // delete graphic + fs.unlink(resourceLocation.concat(id).concat('.png'), + (err) => { + // we don't set res.locals.items and thus it will send a 204 (no content) at the end. see last + // handler + res.locals.processed = true; + next(err); + }); + }); + }) + + .all( + routerHandling.httpMethodNotAllowed + ); // this middleware function can be used, if you like or remove it // it looks for object(s) in res.locals.items and if they exist, they are send to the client as json -decoration.use(routerHandling.emptyResponse); +decorationRouter.use(routerHandling.emptyResponse); -module.exports = decoration; +module.exports = decorationRouter; diff --git a/server/routes/ranks.js b/server/routes/ranks.js index b1461c3..bf2652b 100644 --- a/server/routes/ranks.js +++ b/server/routes/ranks.js @@ -56,27 +56,32 @@ ranks.route('/') }) .post(apiAuthenticationMiddleware, checkHl, upload.single('image'), (req, res, next) => { - const rank = new RankModel(req.body); - const imageFileBuffer = req.file.buffer; - - const err = imageDimensionValidator(imageFileBuffer, MAX_IMAGE_WIDTH, MAX_IMAGE_HEIGHT); - if(err) { - return next(err); - } - - // timestamp and default are set automatically by Mongoose Schema Validation - rank.save((err) => { + if (req.file) { + const imageFileBuffer = req.file.buffer; + const err = imageDimensionValidator(imageFileBuffer, MAX_IMAGE_WIDTH, MAX_IMAGE_HEIGHT); if (err) { - err.status = codes.wrongrequest; - next(err); + return next(err); } - res.status(codes.created); - res.locals.items = rank; - fs.appendFile(resourceLocation + rank._id + '.png', new Buffer(imageFileBuffer), - (err) => { + + const rank = new RankModel(req.body); + // timestamp and default are set automatically by Mongoose Schema Validation + rank.save((err) => { + if (err) { + err.status = codes.wrongrequest; next(err); - }); - }); + } + res.status(codes.created); + res.locals.items = rank; + fs.appendFile(resourceLocation + rank._id + '.png', new Buffer(imageFileBuffer), + (err) => { + next(err); + }); + }); + } else { + const err = new Error('no image file provided'); + err.status = codes.wrongmediasend; + next(err); + } }) .all( @@ -106,7 +111,7 @@ ranks.route('/:id') if (req.file) { const imageFileBuffer = req.file.buffer; const err = imageDimensionValidator(imageFileBuffer, MAX_IMAGE_WIDTH, MAX_IMAGE_HEIGHT); - if(err) { + if (err) { return next(err); } diff --git a/server/routes/squads.js b/server/routes/squads.js index 8764f4f..bb824ca 100644 --- a/server/routes/squads.js +++ b/server/routes/squads.js @@ -22,6 +22,9 @@ const SquadModel = require('../models/squad'); // util const genericGetById = require('./_generic').genericGetById; +const imageDimensionValidator = require('../middleware/validators').imageDimensionValidator; +const MAX_IMAGE_WIDTH = 150; +const MAX_IMAGE_HEIGHT = 150; const squads = new express.Router(); @@ -54,6 +57,12 @@ squads.route('/') const squad = new SquadModel(req.body); // timestamp and default are set automatically by Mongoose Schema Validation if (req.file) { + const imageFileBuffer = req.file.buffer; + const err = imageDimensionValidator(imageFileBuffer, MAX_IMAGE_WIDTH, MAX_IMAGE_HEIGHT); + if (err) { + return next(err); + } + squad.save((err) => { if (err) { err.status = codes.wrongrequest; @@ -62,10 +71,9 @@ squads.route('/') } res.status(codes.created); res.locals.items = squad; - fs.appendFile(resourceLocation.concat(squad._id).concat('.png'), - new Buffer(req.file.buffer), (err) => { - next(err); - }); + fs.appendFile(resourceLocation.concat(squad._id).concat('.png'), new Buffer(imageFileBuffer), (err) => { + next(err); + }); }); } else { const err = new Error('no image file provided'); @@ -98,11 +106,16 @@ squads.route('/:id') req.body.$inc = {__v: 1}; if (req.file) { + const imageFileBuffer = req.file.buffer; + const err = imageDimensionValidator(imageFileBuffer, MAX_IMAGE_WIDTH, MAX_IMAGE_HEIGHT); + if (err) { + return next(err); + } const file = resourceLocation.concat(req.params.id) .concat('.png'); fs.unlink(file, (err) => { if (err) next(err); - fs.appendFile(file, new Buffer(req.file.buffer), (err) => { + fs.appendFile(file, new Buffer(imageFileBuffer), (err) => { if (err) next(err); }); }); diff --git a/static/src/app/manage/decorations/edit-decoration/edit-decoration.component.ts b/static/src/app/manage/decorations/edit-decoration/edit-decoration.component.ts index ff86c88..e248905 100644 --- a/static/src/app/manage/decorations/edit-decoration/edit-decoration.component.ts +++ b/static/src/app/manage/decorations/edit-decoration/edit-decoration.component.ts @@ -66,7 +66,7 @@ export class EditDecorationComponent implements OnInit, OnDestroy { if (this.fileList) { file = this.fileList[0]; this.decorationService.submitDecoration(this.decoration, file) - .subscribe(rank => { + .subscribe(decoration => { this.router.navigate(['..'], {relativeTo: this.route}); }); } else { @@ -83,12 +83,15 @@ export class EditDecorationComponent implements OnInit, OnDestroy { } delete this.decoration['__v']; this.decorationService.submitDecoration(this.decoration, file) - .subscribe(rank => { + .subscribe(decoration => { setTimeout(() => { this.imagePreviewSrc = 'resource/decoration/' + this.decoration._id + '.png?' + Date.now(); }, 300); fileInput.value = ''; this.snackBarService.showSuccess('generic.save.success'); + }, error => { + const errorMsg = error._body ? JSON.parse(error._body).error.message : error.error.error.message; + this.snackBarService.showError('Error: '.concat(errorMsg), 15000); }); } } diff --git a/static/src/app/manage/squads/edit-squad/edit-squad.component.ts b/static/src/app/manage/squads/edit-squad/edit-squad.component.ts index 0d36c29..4eeb022 100644 --- a/static/src/app/manage/squads/edit-squad/edit-squad.component.ts +++ b/static/src/app/manage/squads/edit-squad/edit-squad.component.ts @@ -69,7 +69,7 @@ export class EditSquadComponent implements OnInit, OnDestroy { if (this.fileList) { file = this.fileList[0]; this.squadService.submitSquad(this.squad, file) - .subscribe(rank => { + .subscribe(squad => { this.saved = true; this.router.navigate(['..'], {relativeTo: this.route}); }); @@ -87,12 +87,15 @@ export class EditSquadComponent implements OnInit, OnDestroy { } delete this.squad['__v']; this.squadService.submitSquad(this.squad, file) - .subscribe(rank => { + .subscribe(squad => { setTimeout(() => { this.imagePreviewSrc = 'resource/squad/' + this.squad._id + '.png?' + Date.now(); }, 300); fileInput.value = ''; this.snackBarService.showSuccess('generic.save.success'); + }, error => { + const errorMsg = error._body ? JSON.parse(error._body).error.message : error.error.error.message; + this.snackBarService.showError('Error: '.concat(errorMsg), 15000); }); } }