From 3af2670bd5b4963eff24f053c3a4e89e3f6a021a Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Fri, 21 Feb 2020 13:08:02 +1000 Subject: [PATCH] FIX: Consider webp a supported image format for upload (#9015) * Also fixes an issue where if webp was a downloaded hotlinked image and then secure + sent in an email, it was not being redacted because webp was not a supported media format in FileHelper * Webp originally removed as an image format in https://github.com/discourse/discourse/pull/6377 and there was a spec to make sure a .bin webp file did not get renamed from its type to webp. However we want to support webp images now to make sure they are properly redacted if secure media is on, so change the example in the spec to use tiff, another banned format, instead --- .../javascripts/discourse/lib/uploads.js.es6 | 2 +- lib/file_helper.rb | 2 +- spec/fixtures/images/tiff_as.bin | Bin 0 -> 7910 bytes spec/lib/upload_creator_spec.rb | 8 ++++---- test/javascripts/lib/uploads-test.js.es6 | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 spec/fixtures/images/tiff_as.bin diff --git a/app/assets/javascripts/discourse/lib/uploads.js.es6 b/app/assets/javascripts/discourse/lib/uploads.js.es6 index 0f12b3aa49..37ded98e4f 100644 --- a/app/assets/javascripts/discourse/lib/uploads.js.es6 +++ b/app/assets/javascripts/discourse/lib/uploads.js.es6 @@ -194,7 +194,7 @@ export function authorizesOneOrMoreImageExtensions(staff) { } export function isImage(path) { - return /\.(png|jpe?g|gif|svg|ico)$/i.test(path); + return /\.(png|webp|jpe?g|gif|svg|ico)$/i.test(path); } export function isVideo(path) { diff --git a/lib/file_helper.rb b/lib/file_helper.rb index c2fb8f6693..cbf11eebbe 100644 --- a/lib/file_helper.rb +++ b/lib/file_helper.rb @@ -133,7 +133,7 @@ class FileHelper end def self.supported_images - @@supported_images ||= Set.new %w{jpg jpeg png gif svg ico} + @@supported_images ||= Set.new %w{jpg jpeg png gif svg ico webp} end def self.supported_audio diff --git a/spec/fixtures/images/tiff_as.bin b/spec/fixtures/images/tiff_as.bin new file mode 100644 index 0000000000000000000000000000000000000000..dec1b3cfaa7b9f61ed9375ee6455d2346182e1c6 GIT binary patch literal 7910 zcmeHsXH-*LxAqR969~P9CecLfy?5EVgs2LVw+kpqH&)PVGkfFeae zP!I)y(0jQXkLP{Q_l@_Q`{Vw*<0fN{J+t;&D|@fmpQ)j71)yaHfN;5ay$xJiQiA)6 zcKY>>qRj9|%Jv50Xk&i5SXBpu`o%yQ)IpB;|WG(#vVqEUjv(MDos5NiJRkx zTx!g{jGLTlXRWHH*G;4f$Jc@|)}9lH4|}I!t+u|V(wtWhA9ULLnPQy9m?b(Ew#=l9 zO!zZ89RnCJOF=SEN08UdnYlA`ipSjT8)b~^tSTlw{q)KI?^XV%Qn4RII0{AhJYu_Q zsFjR!SstTEu-{|^N~LhhmtLBiHo((1oPU*2WrCEfM*)jV@?o1bW6;^Qo^L!zCZp5- zB?HsR9CJ#4!cJqe6OTmsq^FxXlPOfAs$>}})@-~G`XB#3_3{yc46onvIhCW!5ULs7!hB-#JD>e=V2pXnS{N`IJAE3ae|JA} z@4WaC;eRh}`nE)Xo>CA8M~CHKikqg92tZH9?fz8U-=OzEMU~{DjZ=&5rDwyz6HWT5 zxZ;-mZla|Zin~}8VFfC#vG_;)A+D4ueo%3%%CE~!dz(n1@4UH*vGy^{HWJPa1{D|i zIMjh4suT6{Ajes>E3_z4XiB=sn2W;}AUMR-2FcKNecLgYFv^0uW-VVg$9Owj&l&gh z%VtiWa3~t{s3P? z^8N`jURJB;+Yaim39eU5^?5(Uel}QdU~NAyD2zoe3VU)dT#)1((i*)m{;l=p6`X%Q zE&V{)4M09ob@Bf*^9T9d^8Y%mdTBBu=?gQLXvB{Nve+)C{xWm7nk@9kLX$FMyXut> zpqa;vCW=Jo-uuJM>mA9aeCkzy&p;H8n?o>G6-HOkvhwn2f`SGlYgkh4HbGDx&aBLC z4WOBe|G<~K)VJh7qjkbTFE^ydF`21Kr&RpVh`abywe~^Mgr~=pWee0P{=JvqtyxU9 z8+r!o-B?;j62~>^cZeJ+3d(SOs~&K2H1t@@X~noc`|WTbb07AWW2iSgCTe=y4wIXp zLp8d#ejv*#?(#Bi=gE#Qvs`!2>RAyy1elW5M|?bQ?Ni3XZ5mOgPj2%KX2ogOwPYrK zz7Z>UB2m^U`dCT-XpUG}$5V1zxgX~~W6B>6xg;5Q(Kb1;L49gx>^7v*oU>aoio83)Gqh5Atn=Qrj9>7Z zx!dNkFaRGnEV|ch&5WtYn8645TAqpVCb@pK{nIOkg9p0jxjoBVsk5@B9XUN7wMeGC zVK3W}xxgI+(|Hi}%=i7RHIZP4j_3^+OpMI?tl?;{JIoScyf1`5P2JhJTj!lLg;m&1 z34>L)eO=yZW@*Uru~<#=yf%9m+y3g?*6H0*n;xv?uH5jn5b!2ixECv@&pvt9=&MZ~ zC99*&(%VY@qyp038$$mX;~paXPVs7v6#UuS8|n>;ucUkkloO}JXjQbwEN46YVn`Ue z`)iO)RikBIhX-<#yCL{@zZ?cS<7c%gUXOT zbWMwr_aQA)9ydqN@D=PbO*bYnPWH9QDMhsTuvnt=zj*aETZ4$VzMpIEy z@R+jM?}llTvO)GMvNsf|e4kWDSB|N=HWwz~J-uiT_7{GUb?o9ook=`pTMjNnEe2!x zQGahG5>PsTjl;n7BHsYy7bzt;Z%6U~C!1zk(yJ$gC>5>i5|D;*2Lhkz}wFUn>uiT zP~%zD?vq=iYShvB>%sW;ye@#Rq%Mt}#XexSL+x0@ z#_GDyUXlG+{3z@T-8yO!#9=>D(AW9_k=fv+&XC*4{tRu=zX2hX8X4n@ZcBt7>?pxQ zWZ=&$%k)b-5|mXBl?6g`yS4RT?@ z$qxQ$70%~EsFK{?(T{kX16R>uyw43S3fN_lRCNME>i&ADY#QLQBff$Y3&_25O>J}}BhoHGIg~Kw&I*JoVSMtBT$dNz{Bhw1)SJhGcV6F;{7`)t|PzBQ?JP1t<$L6g*%m*gpGeq(R+Pno`?QL>Xdt&u!npVs(pwV6qqoUe8uLpSd5oq0Ni(D(0AgK?5#i6aLFL!2O z$wPYW^Pab|Xjw*MyKR4D5nD_B7F}!ch~YN#wuH=^Z(Eto)c$u{^G9}S%eh}>@mK#S zm*9QdA6z_^us2cez0RCBry(MZDB6!Ep7&c}@;0_elN#*47IMVH^TK55<~}w5gtb@) z7IjDT9EK?Wx^u@Lp@-_pT`M`3mOZ~O(6;+srO|p$ZsFwo4X?*Oz%8&!nAM`Yy$o&H zkTk$;+^}ROYL71UZdZH(A-xcWJmO9Iq5hXTu!vMebhOmM|vaCKEomVVzSX?AM&utm=~ z%xdlVofhVoVo#gRHiE@%2AFNY{PgA+z@@0n9Su16@bK?jg6VNNy|B97tmQ}OXh^$zXXvT8AFKk;o z3`P3L{{DV={b=D6N#Og?!o$1nXLB_J>ZkHV?E1Ea8V=$64Fa(^(JgTuSiE+k_Xm@0 z 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 { }); QUnit.test("isImage", assert => { - ["png", "jpg", "jpeg", "gif", "ico"].forEach(extension => { + ["png", "webp", "jpg", "jpeg", "gif", "ico"].forEach(extension => { var image = "image." + extension; assert.ok(isImage(image), image + " is recognized as an image"); assert.ok(