From 41d81b996fdd8276cc04e750297a12f852a97bf4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 10 May 2010 15:32:02 -0700 Subject: [PATCH 1/2] Test cases for MediaFile::getUploadedFileType() with OpenOffice, MS Office, and PDF sample files (as saved from OpenOffice 3.2) Only 3 of 16 cases pass on my dev box with default config. Ouch! --- tests/MediaFileTest.php | 77 +++++++++++++++++++++++++ tests/sample-uploads/office.pdf | Bin 0 -> 1162 bytes tests/sample-uploads/presentation.odp | Bin 0 -> 9330 bytes tests/sample-uploads/presentation.otp | Bin 0 -> 9359 bytes tests/sample-uploads/presentation.pot | Bin 0 -> 71168 bytes tests/sample-uploads/presentation.potm | Bin 0 -> 5789 bytes tests/sample-uploads/presentation.ppt | Bin 0 -> 71168 bytes tests/sample-uploads/presentation.pptx | Bin 0 -> 5790 bytes tests/sample-uploads/spreadsheet.ods | Bin 0 -> 6560 bytes tests/sample-uploads/spreadsheet.ots | Bin 0 -> 6575 bytes tests/sample-uploads/spreadsheet.xls | Bin 0 -> 6656 bytes tests/sample-uploads/spreadsheet.xlsx | Bin 0 -> 6010 bytes tests/sample-uploads/spreadsheet.xlt | Bin 0 -> 6144 bytes tests/sample-uploads/wordproc.doc | Bin 0 -> 9216 bytes tests/sample-uploads/wordproc.docx | Bin 0 -> 3350 bytes tests/sample-uploads/wordproc.odt | Bin 0 -> 7641 bytes tests/sample-uploads/wordproc.ott | Bin 0 -> 7656 bytes tests/sample-uploads/wordproc.rtf | 16 +++++ 18 files changed, 93 insertions(+) create mode 100644 tests/MediaFileTest.php create mode 100644 tests/sample-uploads/office.pdf create mode 100644 tests/sample-uploads/presentation.odp create mode 100644 tests/sample-uploads/presentation.otp create mode 100644 tests/sample-uploads/presentation.pot create mode 100644 tests/sample-uploads/presentation.potm create mode 100644 tests/sample-uploads/presentation.ppt create mode 100644 tests/sample-uploads/presentation.pptx create mode 100644 tests/sample-uploads/spreadsheet.ods create mode 100644 tests/sample-uploads/spreadsheet.ots create mode 100644 tests/sample-uploads/spreadsheet.xls create mode 100644 tests/sample-uploads/spreadsheet.xlsx create mode 100644 tests/sample-uploads/spreadsheet.xlt create mode 100644 tests/sample-uploads/wordproc.doc create mode 100644 tests/sample-uploads/wordproc.docx create mode 100644 tests/sample-uploads/wordproc.odt create mode 100644 tests/sample-uploads/wordproc.ott create mode 100644 tests/sample-uploads/wordproc.rtf diff --git a/tests/MediaFileTest.php b/tests/MediaFileTest.php new file mode 100644 index 0000000000..6fe9956210 --- /dev/null +++ b/tests/MediaFileTest.php @@ -0,0 +1,77 @@ +old_attachments_supported = common_config('attachments', 'supported'); + $GLOBALS['config']['attachments']['supported'] = true; + } + + public function tearDown() + { + $GLOBALS['config']['attachments']['supported'] = $this->old_attachments_supported; + } + + /** + * @dataProvider fileTypeCases + * + */ + public function testFileType($filename, $expectedType) + { + if (!file_exists($filename)) { + throw new Exception("WTF? $filename test file missing"); + } + $this->assertEquals($expectedType, MediaFile::getUploadedFileType($filename)); + } + + static public function fileTypeCases() + { + $base = dirname(__FILE__); + $dir = "$base/sample-uploads"; + return array( + array("$dir/office.pdf", "application/pdf"), + + array("$dir/wordproc.odt", "application/vnd.oasis.opendocument.text"), + array("$dir/wordproc.ott", "application/vnd.oasis.opendocument.text-template"), + array("$dir/wordproc.doc", "application/msword"), + array("$dir/wordproc.docx", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document"), + array("$dir/wordproc.rtf", "text/rtf"), + + array("$dir/spreadsheet.ods", + "application/vnd.oasis.opendocument.spreadsheet"), + array("$dir/spreadsheet.ots", + "application/vnd.oasis.opendocument.spreadsheet-template"), + array("$dir/spreadsheet.xls", "application/vnd.ms-excel"), + array("$dir/spreadsheet.xlt", "application/vnd.ms-excel"), + array("$dir/spreadsheet.xlsx", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"), + + array("$dir/presentation.odp", + "application/vnd.oasis-opendocument.presentation"), + array("$dir/presentation.otp", + "application/vnd.oasis-opendocument.presentation-template"), + array("$dir/presentation.ppt", + "application/vnd.ms-powerpoint"), + array("$dir/presentation.pot", + "application/vnd.ms-powerpoint"), + array("$dir/presentation.pptx", + "application/vnd.openxmlformats-officedocument.presentationml.presentation"), + ); + } + +} + diff --git a/tests/sample-uploads/office.pdf b/tests/sample-uploads/office.pdf new file mode 100644 index 0000000000000000000000000000000000000000..670bc2343e9cbfee1eb0a6eb6ff4733fc1b8dae7 GIT binary patch literal 1162 zcmah}!EVz)5bX`L;v@DFwMCTO_1fzgMUfIat_nqsoKym$9*nb14XHP>*Hy}iBbWXG z5|3LvA)UHO{%osWLzyacdQom4qtO z*q|ary17bvQV$4JLi%#5Pu7FjDyV-sk)#`s%qy2bU>gDw$wHNRA`5H;BJx}g)3~js z0}4mMEbMyL3E9t8If0J!NI#FWVqzGQOXBxPATQEHM*D4YfOTF%Q-}}gfk1&xE2Fg% zjN-DjRW=3MOaZNO0DP4MK0)MJIxGg*6cw4HuS%$cttq%03Vy8Pu^P?mE*2Fdax{@y zE77US1`8_k;^ixxmE-Z^MS=P-&PF>j+dJ;XO)dI?~aXexV;S=7cgZTHfH}L)`gqdz}e!it|QhobRMT;nVT=Sm%fwOBau=X zo0)(QKu$>eQO uo@2s2zs)?+Vtx?XF8nyOZM7M%+rk&VPt7zHI?naH)ovaBdTO1c5d8)1-7zu% literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/presentation.odp b/tests/sample-uploads/presentation.odp new file mode 100644 index 0000000000000000000000000000000000000000..8dd3a428bc3c42586770a37f6894803d479319d5 GIT binary patch literal 9330 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 YKLk=eO#;G0HVW+L3-%#D5_EXm&i?&E<7GD*w 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 F_J3^OcBB9R literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/presentation.pot b/tests/sample-uploads/presentation.pot new file mode 100644 index 0000000000000000000000000000000000000000..f5124ffa2b25669b2b442452771f23de0a46e7a5 GIT binary patch literal 71168 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 literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/presentation.potm b/tests/sample-uploads/presentation.potm new file mode 100644 index 0000000000000000000000000000000000000000..ade1bcb10fda6e20ea38931b7aaf31e26fc5c7c1 GIT binary patch literal 5789 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 WqpL-L9V7q%g#8F&w_nCT-}*nWOLxiu literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/presentation.ppt b/tests/sample-uploads/presentation.ppt new file mode 100644 index 0000000000000000000000000000000000000000..f5124ffa2b25669b2b442452771f23de0a46e7a5 GIT binary patch literal 71168 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 literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/presentation.pptx b/tests/sample-uploads/presentation.pptx new file mode 100644 index 0000000000000000000000000000000000000000..21ea61a1590f3895992071d93ce52573f2e247ec GIT binary patch literal 5790 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 Vig__eC@Ax4ky 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 literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/spreadsheet.ots b/tests/sample-uploads/spreadsheet.ots new file mode 100644 index 0000000000000000000000000000000000000000..5f830e6def09a7379b7760b82064d8c232f25b8c GIT binary patch literal 6575 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 D_kSmS literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/spreadsheet.xls b/tests/sample-uploads/spreadsheet.xls new file mode 100644 index 0000000000000000000000000000000000000000..2d470e68713923544ad8d36556928c0142e225df GIT binary patch literal 6656 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 literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/spreadsheet.xlt b/tests/sample-uploads/spreadsheet.xlt new file mode 100644 index 0000000000000000000000000000000000000000..980423b20f315ee3ca980928ac7c7528d4a896f4 GIT binary patch literal 6144 zcmeHLU1(fI6h3$VdN)avO`23~ZM;Ui`P+upJXq11P10x!)`qsC4~4qf?xtzC-4a)* zpt!9T6dF)k=u1Hgc`1TF2>PI40zQZ+iqZ#tN_{K(uoXoLHtYADd#}B&yL7iMO3R+* zo0&a#=AM~z&YUxIzxld->HPa^E=dVJEPh!oh9%_T8)%2!{}B-%+T<-4i$#}>W`k}a z4P0~PN*e}X#2`SMuK-Md{3fTqg_hNrYLyz;C0YD(V#$OYK|L!kz}nT*YIuxSR5c^L z@uHgkH|o=ne_aDN(iNY3_0RatIPM3^?SIC5?*C?>1y~8R0&M_NfV2Z0z$%~<=mJ&) zcK~++cL8gFwZPrLI-nc42e5#9fga#K;C^5|!1?t$HQNJd4+1fVH{{gUSKVmctOmj+ ztQZQ)$1A^N$k*6^2_ErYU{U?zNAUK_QToPsB9pZKD;m=|Bn<_#Z$=~{&4J^mOWawqBP_q9rJ^7Ho-SPN3Y_`Z#WwvXpABT z&PYNsQt}l2>h-ic&?589v5!wYIk9W>i6z}T^YUBKf)tk)Eb=)q<^Nh8pQ|p{zY?Es zE!Y3{<7MJIctLH&m4~0^Ge+7Q50)LWD0Y^h@*^4_Z8*_ z(=$Z-J-j;YC! zeag@4F;(9q>#0sD%5gkd3=HUqK`l>c-%e~f^oWi}N4t>CFyrX>WMVpHMJHd;Zm((? z#Vd!EE|2tj+I?uJl?o&Mp7wd^!36gM{GE`P5i{KJZf(d@cz3hBq*+vqGtJDPARn`- zmwuK>F1fG`Of0uRg;DREd7JnP8_{f&fNd)Y7pUn{@=249;~1XkAN6&}hw2}3PuF#P zpZ#A2pg9d=O?ylP%`>yG(`{uWUmcBPd5r|!)odh;`O8RZjyTFk;83K7k({0Q?{?Bg zuaOXxYBmza)YC|6TNDOPyMAmf?y`u<7>o0cmhu?S%sXb1v)Sje>6|rjESbt!4?VbH zPhu*S$)xnCHa3$^+eaRIOwA=WzAd!ok@kRP#0H+rN{Inw>Ev6#T-|vf^7fmi4EBET zJtNl{fN6=(;{XDbYy)`Dcm`mUq2u$uaTI{syKT1XDfKY65d|$cu%4} z2u5>`0a!981JH#QISwqT~2XHded-e)Rp!d1X+xLPApK fkkT(uwasVqO{{+dWak|D^{8sqzxVsg|1JMd3gb%2 literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/wordproc.doc b/tests/sample-uploads/wordproc.doc new file mode 100644 index 0000000000000000000000000000000000000000..81c5e34c6caab43a0d52e3cec241d72e423a8eac GIT binary patch literal 9216 zcmeI1PfT1z7{I@`ER;o{TR?0nl`X|mX$$2~E7;b;mQqSZ+EPpXpDlj`gjh7zE`uk?za~BHiTSA&vb~e8^ z^JeDF_suuo%)Xg-_16tIE`3$@yDSL%B}?XFKFLYSw@9yd?)@Sj(wa9Hi^ZI5l9})T zS>TSXtB#?ULCgjn^L3C5KFEWIARh{#5VSrnVB!a;yBSp%Sm2aI_)SVcj!2j|DsM5W z?n5aaliZ}6CzIC;H}zB1$;eMwAeF7OJlX!v`kn6l*Z%>X{~MqPilGD^hEjM0Ho_(- zgUz5awh%uG754pB;!4;CRqz;WhicdXk3$XYgk7*3YM~DHKs_`-BQ(KY*auHQGqk{y zupbVmKQkMkXRdlYzcSbYORTZ{iwj+@(lTX5cwHWEAusS|;xzOkuK9P&BgFiV zwacIkNl2z-l=UtCuU20rHC0xl1Z$+HD@#to;jWD`*6H(3!0}E?PIP%C-097InK(q* zE1fOgNmxXeptQB#id`~(vj2j%*9qyDVNxULq$N?KQ=-uh znX9nGW2q0W!vhDYGeGUIyh=_1y)3?bQ%WwMmz*k#8P?O4jr!TBUv5;6t6R<-3Hr4i zohv>(b5PDBDS&Pf+S4^Yk5MbW%&es?k#ec?TUL=(PTGs7kD#eq%VTEv0i#u=r88(9 zb0s9>l#b9=n4AJufMQzFmh#c6&=_-HuBCQ+Dc7nrPd5)w3HSoC z&Fh8nN0XWEg_jl&=zEO5z-T(hZbRGG;L(LkgJv*^sS>Yrv~H5$?i#ndlip_BCxkn*Od)BSI8{ic@u3`d z?dW8Bjb5H%It9>Q`#XVf)qOgZ5|k(F9%Qhs+>5L-KVqz5WBKoU|Jd#{V=|l@Ggj&z z@67y{MPh!P>MWGfu-Gg$1(}N*3l!~fQ!BkX3+6+>S>*z`=qm=d!+%;{n9w(!v)ZN(|e$j{=5@^ z2hw(e(UC|v5Wm+lmC*`LXmt|Anx3Be@qqbZpZzb^#+F42XHcRAO(z8vZ^{qM+{+||5 zKT$ut*TEy#@3qK`yo?1h7Pzl0pzkG_u!b#Qzvr!C3#{d?Th18?TarvzTNcngj#ViY zvsdc^vo{WIoeg^{VcSgDTLq0LIDv1F!bLWINp@Ol|EwDr&$VB!eOkNO|KZ2%pLgB< zvYou_1$lZ#%L$O#2dYAT&}Vgzyi`8LnXpP0Sk3Q$I(`ekAuOgQ8(g`fABhMSr^$M7 zI?flBa~v(E8;bB2^%p(B&~F%SpLZl#$Q|WSbEP2<=_*(Izq{7b2cBM=PT8r z(3Y>VHMr@A>bk`~6wl@mcMALK(Y1d2)zkSQMkH!-5@-BNwYvlPde*MZxs|Wq7=ExD z>@%_k_(~Ju%ZO?+hz65(Y3itK1^o}utaEOaeV63)?9sde`OhKWeGgOHzzn>7NnLyX H_uqd3i08!l literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/wordproc.docx b/tests/sample-uploads/wordproc.docx new file mode 100644 index 0000000000000000000000000000000000000000..04ea3c3ec18be5009329677c9327d3dacfe8e91e GIT binary patch literal 3350 zcmaJ@c|4T+8yzMY+YKWIg_&?MVXPrbi0lR>%h;KWWrjiaU0H@}FkK2INm7=`lr=l$ z+6p%mm9@pbWo&n*d+&$({cg|u&-A&kqAZQ(LIExfSC#rK+^CJ*Jv-0?;h*ara-f{lpHWBGxv5S0ahQcCtVdNSh z(vT69utRcwO6`wG2LK@dlYt}uGT`SQ?B(W1>-_Hd1>6XNeW&3WY&nqc47Ecfw6Iw3 zXtrg|Lgu7aoice!j%~H<*2)9;iG)UVQj?pfdLaIB$8A@vUI76G#23 znO=8MZl7`zuqMiYL}VO8g)eJt`DdCwpJzy)nK!&KO=nm#Xfb|Itc`V67ekWD6w8PX zc!r*sdC@vj1WH708hvevh@8CCD3YzfP)|X%)4?@R+M5IORiU=A(J6Gfzxyy*M@KMl zl$T{ST3StKGQAlVHOmy6pwx>0meV2OAcjfdWHS=czw(IPJiI37OhW%5Bb84&{5EEd z?K`$ZZ@^ikR7xc7rKRTtr00pH+I&D#I^Saj+lT!D(uFE85fTRZPRg>o&lb!dfrYV9 zPN4;kWx|-bdcjFKNqT_yDU)l3m@{n)T{m(W|$u_H;1WYbf|f{GwbCGJio?8@3d`9=8cdC z#r8J|Z|e@gU@h^n~&Ac;LZ@86YXYW^u4Pv__oXc zctC%E-R#lgpuO=IH^G(0FIZkD*Omu=a5V*E_|(y|yN#0+?qBU}P*G&;f<1I&5;-3- zqw1UZz?-`!U<^}87?+c?lje=U?<_LdDJDI!BU!(I1YVrQk7{OC7AiW(Z+#o8cW@~t z2t5EG$oR9N;`n!{4hky8yc^q$U~O0sFMb1+bO9H;SLeM|gf8D|=pBZB}6_6dG0)Nkklzz}$!l6I4gT)0JEcotcxxI(3vP#2tpT z?ddcyPKYJu_9-MWL!o-2r0CYu7_y7b22^R;b_8?!G2 zegp4)E;y1YwQB8oQcvXRfKke%)l+;j&&VTPqdHS`20{tuzK~Tf6K_vy1Tl|`S^vYlOTt@Metkvjl&`E)LW zCM5dFk-|y|QVldsXF5bJsA`B}&ER83eiE85&!N?J40VRP%&L{2;VGZjk;J7ByiNS~ ztIn?o9GbbeCEvYn4MCB2!qv6#KC3}#14q}{DC$>EZ0ZbAo>^~sSnEnQw6)3XajwOl zJQdlyZ0WPbK;s8kIRSk~?cRbq&HrtWEYv6d-VJ~6gLGpi|DUGcm$2A zNeeo@lCHU^P8=|}j*=)Ii_3T7)K5)lGx~C0UdFd58;UkH?@)DyRo+YUeM{cRij>W} zB{MkW(P>*tU$v#TeM&KeyFxfl6m4IKDyvkII%*Q^+V6NL_`dI^hx|3xAUpS+(A!F^ zJ&P9d=Xy0ugO{w8tjJHUiQTo;4cx=X(-*nWHga zYvU#MLH6+R_>K2Wi$h(x^Ocfc^B!W@B|$G5LGWuI`BusHQ-NYEY5dPaJ@Yg}LGHt2 z1I;o{YIQ-M8_zL74PoFcAGVR!SxCF4*O?WhaC5<8S4g)DUwHg+p7A;$iW5&zI4c!A z8N@Y>Rm{I*o@D(oB20s+ps_FZFc?_K&=&d7(s$wAr$mb&-E)g7s4MqeMFTav2N0}n zNMlruMw?)-Y1u0aKezTW&ZrSe5xNBM3GWnbV4MzN1rE{jHP2v*H-$X7H>L<~#b zG#$D=y%aIXvTh6hvJTy3qVW=KY4&D>+BN#8ynv}s*lJVViJHqC&IkLr`PtE^sn1X| zZ9%YK-Pld)gc}@#uxsh72+3&0BTl$Da1y?1t6Pjj_EtxOqDjm}5SQ`#UO%!$Ng(#m&qQ;%-(pQ}5DbiGIMwA|- z-mb;G+4jtJQ#fJ)a(m7!^|#KFAinpjFu&FG)>Zo5i6MP|aL&1q-1j`MA{Na9P5eSY zX3`F;Mg_APg3@1#ETSnr_7}DnD;04xe#67|Z7 zYd_)-Iv&mG_X~RXJKz5icu>;cf43Yp82yhu{s=!f`83_{7Xfqt{*Md%h(36(Gt8{0ODO;V literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/wordproc.odt b/tests/sample-uploads/wordproc.odt new file mode 100644 index 0000000000000000000000000000000000000000..fa6fe5e9ff0f2485b7bdb8390735c89954baec0b GIT binary patch literal 7641 zcmb7J2|Sct7ay|kTP0*CikUI?Jw&o(--$5>!kW7a$snL*RgD3>@WxhWU8GQFtI8?vFR#2BV>& z*#;xp{}OuQ9Sn`alQjLkkU5qP=uR+4$fVT?jZw+v{_sc9W$Yc1k&hN$P>pt%-gx`| zvXipm=I4sC44J+ZpsC~AIPTRjUP2k6TF5c*yO15J$LQ- z)V48bdXVyn#NBJ=iQ=iOMLb_cUs%drep>Jdak$&VGe2I1Dg8?N2TYH;Btj5XwqG{@_S)W{Dxe8sFE-$}^Jq6y= zQ0aM#51{fQk`K*rI>I^#QvT|*>-@u zc4%Yot5k&D+8G+<<7u}a4~9z~mf70;HW!9WuRQ`j$9>%!e%SH|Jl^P~Q}(SZ&>Xq@ z`*S(f!2))rZ_A64oF5Nvq4o`O>N!S*E8{4Nm@lTzDijQ_PK>MvT4w@0=u@TJ@u%Wc zqia?~q~Dzkj{-#+*s?IjYNZC8AG{T#GuM#*h4MCH;hpmU&q>rIb{}JeaD}wB&E?31 zk@8E`;d8!hiwWyBTD9$T20CJ5$9Tfo-J%b$uj%%*RdNP3XZhX^-IO{8h8}{S=v{`q zD)&{48CJV*u|Xr%H?CZe#AoY#RTTV&D{p-Cfu8z%(}CBoG2T*!fw`(`17J!`je+z# zmF!vLmtHvaLu<4SvYO$R z*%(v*K|Mv}Nt-HK6Pr9o$Hzm1aq+5h8jh}%-zs|>y@L6o7#IpHb@YtY;%ceWsyVp( z+Z;IfmKVdRh8|3RH`b@7xw&foX^R{Hpde0+AF~GVbJh&2sz`ky&K3^hQwHL%7ZinX zh2!u*tcz<-LJ2AY%%Sa9^%Cp)HQXka(#1Ww!sGc1N-g6T%x z3G+-(fu@HHD{R^ET7tP5%NtyF{RpRH>;7#vo-R+@Wc_Uqyd!^rqivw6BA<{N@|?3%3Mx3}CI zbd&QTYaW8#V@H;{mM4Hh-;YN4lwMtzlEvpt!P6hz)BEl~SZ;-GjY0yc|GuQq5rc!n z2O!}%(uy)@tABYwj-_hVij%INTe4+kt{?SGBO%K@RG9Kwc28)ESX_)SoiM!U%e1nv zc1)Q_@k)ZKKQn!r^z{aL=BlNQHiwi;zLE6Ji-d#mM}{tp3&gosIRrVXeUCaYlri9V zrc@zUz(!j_LOM}jcw9}ynIZ{S0;wffEe6*;$aKCs7JuO?gH<7a#f?YU3M<>IhuU98 zpYCa$L!O!&f72AZ>I58O=qXGe>|<@{CYBF^eeO0OKaMLWWToA{0;fz_YK(oFJTcsJ zMi5@IxRsw@-;Hctd&`{Cl2d%|Vl}kJDp{r5-sEFavKag&bA1>(Kw5CYc$1^p)AWoh z_e*N62obfI{9Z3=w_4P|KEpI8H3fN@FHnEC_WAi&f_|uIcn5n@)OWHA8^h;Uy@2z` zJYZcAz@iZ$)oWNY`^qg|HaDL(_c)=Vv&m&HW0=X$C#7=KoNeyGdAB~T>(Pv(64T_2 zYvg?Ru<3U^6YF79t`e(cQ+++1Ifp9d zl5etkG1JEDfUl`lu8TT8!}vhi-aL!@!VMM12r`jOT>^MsKc4Vhx2c=$B1hiRJ!S{( z4T;#hDzOdoHBSj%YOZfaVLWUc3E=(Z#fAZLH9}wP!XB@vnT2AP63p+Mvx&x`DVE)B zq_55O451%8jjjr*Nq@Y^bmG|AMT1DEmI|hgZ^^*hp9QURY1k;4 zpa~~v$CjuSLd|Lpx4!oNoGc5a2AQuoRUCQdVCorain*Hw(Qut+9Wz&0H+H%tYY8-s z&R$~$ikRu~pK?Eu2CYLRI29ZpC>f!sc?cAyaI}q`Dr$ZluMJlHpo?N+3!h*$VKnq= zw?`Kyyw!0RXTe$0T$S2#m7i&zV@K<00HW{cKpHzT3P26&C}faF&U~87s{aaS0nZ0-G{FzivuI|Chi{9xo&Z?89JV)@SNS0 zzp3nm=oCYC>}R#Q`=TZFd?idr*wK3Hx zIT5S<(~#iku;R|99>%y82iL)#Hc0F3Zh%YF8PDQkpJ{hmZqXbiPJ{ZSy4DVv=0Mh0 z%YyNpbf4=&Lh2A)%e?b>7Oew`0rmtxI)C?(qXJ&d?~;x>%xi&wrqBGyWw1>~wBPRt z1sNGrZ*KCwO>a=ZiW-`UV2@AmoCw^w!e3bzH5L7u6YwB$jQVYgnR+E5r?|0|^3srI zZ0@FK><~@w=8aS5DwidyU0dI+n)IHpSs#^nL4ATz&u}*5UB!lCCwHKv6NX~A`u@h; zp|O*MXQc~4xyCADVFVXTJzSuI#t5I*!X-|#heC)p6w+*8<{cZEW`=b7SVE6NQS<$q zfinbs=kTc;6fg2#OV{$Ao2P1Isq?yzLO-eHE$Mo=?8GoYZka&iwUSHrB5+QzIU}T~ zyExXx(&}<_+7#|>zt*h3gN1lZ4jj!ohd-DXqRUk49|+}q9R$AV2U9sm8}D{7dclIZ z-fEE3v67|;As?Hjukmk>SjgfYtJ8N1#z8qj zLEtmKuxG)v@dpn^dB2Ilyoo~3vwZ}D=m))-tHw}~4WMvua0U3vT~&Ugry4iaSjV*z zn`_;S0~9Xnx5|DHC!+e*iEvLD=Cs&)+ z{pSNF14@%0tn@wkg1fg$H-P*nQk>8{Wh|&?=jVB^&#QCTy!Qbgc9?V5(-vAzZ^=@W z|JWY+#w+VOP2i1!oPGXmQm3n9Hd-i`>!=#c1Mj9<$;V~f5poI&@X_-u3qHbuD)c;6 zpH^yAAj)SF{h8}?SBUE-?eR8#U1;4QchRw?@%rj&wZz+uWC}|ZZ8CO1r8G?8P?k~v zW~qpyBXU?c>d>Td6=CjEckwLy<+JKRvhC+?ZcYvCcbc}+d=RMHt{&WD<2G+@oDqAs z!ipUt!FA|jS)lPLrOgAQ{WIf*X5=SFx8{luqQ4WjY-*aN>=?>8Y5-tMY?t5sNHOkE z(J9320{}?Zc8USVLrELBiaPNhzb_n%BPJQDf>J=RAU_-hL%SeQZmNP7<~ouJg6e8? zDri?%1PrdUlXplG6BH;v(G-PK`te9r&_Z=;C&B5HMH<^rO7fk{i~=1^G*VPX~y)(jYgG z3ltBP^hLn^garA2#&J);A%gtd07`f)6oqp|W4*Q$zF&C6kP~x0QsyT~a%J0zA1K7` zLO}jFBp!rzafJ|xDv($ZRNHx1q)w@+YZS$*u{`l~R z$+jv{OOoh4Tnz%20!xBrC8faTQnE^5h?2C_PwU_He%SsRB{)2>FE~5`#=qSX9_oyQ zOTy4TD7>m5aiINZ-V5sXuS&GD2ONg~rz&QTrqoY!3=|7>!$L9c|5WxvV_p7P2XiNC z!|-tI?gP-z5V^roaO`$)jEGS-+8*xPv6coxge_1AfBxU=9Whum$w!bh1neaR5!UoU zAYCLCWfY`;24)vf<>z=&BK248SLs)jwyXcnxH*Z8+uYs9%NYelAaNl4&Mgpwa+_wD z$4!1n9CdbbdcVAcp(XEV;N;{yq>vU`h~EqtWneJ)qUyk-b#&rc<)eh8>d?s-R8_aW z-#R;jKl4%G%)&_9(|TOc8gH7BnO>&>mxvDS2K(r-mwn&7Y=hTSz;zJ+CmR)oI6ZfA zV!A|4(}OwR;X(AKmzX5|o<0#P0mRB}A)R7qp;4{~Hy>g^i9-kn0YPCf;w0UUF9_y? z#r`~y*!K(O$13#`Vf%;Y4=}`-yJ6utoHG;)+Hv6DmZX6F(*ai`nmCUCn-$j|tT1Sd z4~Dq3`23%(kxc%7AMt23^1oa0{lP~BY5w3qnh3lX6odOOj{d2GqzUS?C!BveL?Wfb zI5-|p+!3~OzDnBx?5F}u$Z)al`i}r6&@YmpFAOkjwtQ4#gIc@rnP+XnwRmgx*u+IaTtYx zjIegW;vZ6E-*X2?r+j4Z2l}X<3*mOrdz*l`KbjJm<(Z9*CsRZBQ+33S1V1Ux4_*$kxUiPnh-zdWOTN+Lk=p(B z`+FCkM!#G|W-d?V!s6k_HsX!n%^!!=_D{Gh_wvrl@n2oGV)`OqK>2iK%kQ&w5)bo32^C@9dj{-EwfaxfPJM zG{P{s?}B)JrYsCg7pPUkX#z;nsL5ks>TFLijKVQ8b800l(Xt1k7p_L;><7ZEk3aJ& z93-1qG4{y&a8~qlE%(W89dA!0cgy7Yrw_p^Ko5dY?E!eRl&LHqy_mYy_1+HYfm4S$ zavRsRXE&zA`V3{Ll3sq@+yalNvm~*`^fQzlI*Q}q_32}i?$k^W!Ajq4NgO&6EG~Jk ze73_iL4&Y4LtTS7$*ghQg&%b+5c8tlPbHWcs9kL3PY5FO9{Yy8rryXQUEB6tv*0$1 z!e{pQbhH9W>QI;%-|UUAYWf<4{i0gnKG)n-RzB$U&0_iVD`a%1rfC@Gcn@rCv@#!? z3NnUtU2i%oDwL$?xACMAfRv=p$hN%pl~w4%l2cBVrdD6S4uQ53&QqzMvuwsCU0NV# zBhi7BYQv4|dKsz?1ZIQ#5>xOl~E0NvLW+F#`+7vmJjtCS+xoZc6do zuN54$c|epliIVai?*V~w1aAaa^-GmwDJw4MuYP}-lqT9neS&s2MC8o&zw&Lm~len5BT zu(^ZF0>C=nRAP%|H21ESw9I(=;#T_vzw<4oyLKPRXq;=UrZ}+YHtCKP982~#1FvVr zxFI76X%`?PSFdP^w<|E#b>W<1rk$NazXSpJa#EGgW=Qguw@hx83V^t195=(Y!CD%a z>5)RewF?t=xs10YieSsq@}<C(P_yDg^6$;CQIj~ms!(4*SKPo+VHq78U=Cf;#i|G5CvD=Uz9o9gwx($&X@kt7 z`Yf$XPA8m>VbX&vBq7!9PlBX<>xZMPSkCn=8g3Te9Db%1!XDP5^k7Sj`=QmEAf|Qb z@td;cAstQ6TAuhPYK_M8GF|A#1I-uS(2u%l>s#1K48Cchr@zA@(fyu^Op@j0L`iu? zl;o$`RlR8mc|G7-FGOe~kLA&wMkL^HE^ax*Q&vwP*w$#PFz8}%?iFbcS&{ZQ zZDY`#^Uq-RVUsit15T=+Jt^>ad*2!6>mU5wd$-OsN&JB=jW6EF_T7q;{6n*kR5byP zddJ<`6bK^WbB(|rwY68_?^eHh1{;-8c<{-$3DwR3Pyzty0z13spH|!b#MRbN+gwBP)M*{iuTw}OQzl&1N7eANM6W7F)s;aW z*;rU!*DdN|&!*=0pW$C%V=xKc9L+oRPOgZnWd^`F{GIu7diO-0g*SjNTUIt8>vA?g z2q|P}m9#o*w{9ReU8jc=vZJxSL9N~I_7ZNJ^wAI=aOF0{UMtVo{B0Pb@B$ZurQ=wE z2BK2z{(H-#VrH42;|e%s5>tDX^Jx7}pQ@HxccJcllXT#)zHy{b;`E$}WlKAj`|8od z4Ize{P`?093TwS_IYaA+h>HU6)#eoBhaWLN*Sp^19(%1j=*1b0G^Z_eA=Nm0W;t{q zq)WLbhmPU3)|7#~eDHyx0@WtlFq3* z>#=ik6Oyf=X@LtlGR3`@EuVecCN`&9b#tuA0DwAT?qsY_M$Q5F`^OpL``IHqpK5lj zc3$b;lV;Lam|Za>-tPG(vt#(TgXmqu2x98?Yd{d${*L8NlY5gt(kbn(WK!%sv)!@V z`TF$F)Nt1hM%?;I
s?pW=#wwDW%2-mK#vHYE{?x5`SmSnY;H}0amB%=J2#QlXu z?t=cC3zAsmuF$gn8}xTh`TM)ywFCfu@1)irkajud-%&^;Y*zyQfU=i!{vGFcZ%Y1v zv&%vMSCq*=pzLzezoU>?>8>1R`*)20#Zmtb_IrSA{{Xg^v;M%@8IyZgSQ2a9l|&-W pUJko6WOgj~E&!wzc#jYx{m1p#Sf7%Lq{c%06C+Nrj6pEy|jm2s6V_b|ET~o$NElU@~UL%-AW}%F<%Vk`@U`Bs4@(_Pw%Y z3t1vdLdaU*j1s+XeZTL!^P8FHxz9QObIyIvz0d#L$Jl_1niBw^0|256bJWJz2I zuqYS-VZ4P(M@P4XN&@=T7)eKP44Obz@%2DuTH0eez??x7R>!nPWS9Cvo7Hy|8!+XfIVf}ghIyP+5_=y1hQv$D!&jd@d?J6Sy9bvlEtArEpwX+* zyt?VxN41;#ta4Q^wJic>3lH=^D{#L0$#cGAC7$YObJm`2c%uMgy7y$bfWe?`>^@%e zBysPJ6s~~Et|5yuuSYHHIn(~8uMhU2-Vh4Tq&@CeIb~yK&BJb-AS98j*^)l#9L1aK z%yM<;Z+%^>4EmP$@MB!RPsIdLj;39z?_# zRY5cET!UpEezY%(TN5m7TlBUhFW%|tz$Th%fLq@&JVX^woyU4P>66mKp|9h^tNv%w z0B0GKAZ>(`(drS^%i@rC$3wzFVW(`^n4@%({4NgMiPW2|Px(S~7dijVsh|HidICqq z94b}{Ib(e_EOxl$N@d8b_uhrr)oPuZHilDrl9JN=Asns|`#Dxlbhnms2Q;O7-wj@u zlLo_h5XX9!KgrE8f~rqlzZhI>0?)3Li=FVI{VxFx+?&uo{tz8X#_sWDT~2{+&ks-X`Qm6)Z)IpA{oOP-4B+KVpP8G#SW8%)U1+|Q_cV9}3WhT=J+#!* zH`a)*p-ryj24s0WIC_ujZ4RlmGxVX=41CHGrS9W=LI4?h9$Q zaFVVvk^VhkXrv1QPXOYaT{2?}(4k;XU7w07oXbXtbrg-WTSDpC7cXgaj9;>@ro?Ro z*+;dfvsiSsEq9fEZCD*vS)6HAntHQejXmI1Oy1*Jln0Q}Uu4G3)7*s{3z?SpX2j@-WTh^x@!Iyy%R9-GBxH+Pc0h9-wT7oyatcH) z+)#<~RPYwIp+wzyB!7*LK6IY9&fwYT4E*Z3+D5Lx3;8QWSqDFDEX*(sj~z0bW5{E@ zB|^ZhC>nly%eTfbF&DIQR-|k6;9}>}I8gNap-``)>#K5#gv=>K%998B-|dM@EwIfI zd4Jl!FDVS9!NC*!PzXGEMH#R$xY~c1t>UW{H$xwvZ1eJLANsjgY`R;p7|o50?%+hp z=twaJF+|>%X;m@Z$YSyQow=&H5v(6^m=F_K8=#!x)i|s*AT510&5?qIb9!(xpbY$Dp#oV z))QQ*mCbdYwyKEJ-7T}Ile1%Q8l%2KfrCulxhVs^?Dbuwb1tyg{d&~LG1b`gMB1QO^>_hq@g^5CsdHIXQJ*sFszttclH;`428v!m6zj)Vl0UKE@|VBC1&HE@1p1 zBJ;-UocZpi4laCEv^t^U8j(3Y9<;7C=zc20WT=MH5rr=>U)Q#|xmO}S=m15&QXu=>+0*BHgD9Qv%I#L|vN=h@UD79X#~@)7gBvyU&j z_Uhb>U>=c~ret2B6jWmCeV{;mXQwb-dB=u=y$kU^o#9PdiKKjPHxHCMLqS)7Oj^n7>kMPh|ilniXvaEee z0N(v9awdyzFAWPU_89%>BCS%eS@nUI*Pfpf6k)U=^JQr1!RPj-?!l(m`|0vpF4OFz z=1Qx^&?}0TK+}kf6?UMwnZD3Tw`0k$T4XHr;nDtrVe0Bapcu8IP1ICg)6*DTu=F#1}62s;`pX;$kdXj{_rF!VkM zJT^`9Wjoa7gnHsgpzVk(Q>-0pSZ<5>#oU#J2cCCMoH_c&rwZ>;#{SXwfwPF4`x&pw z#+4kmxdPI2`nZ!6QNX}=ecn91PbXvSl}&(H!Ci^PGcG#*U)$U%)U)%1X}XWSR87?f z*c5{H#!b6iHRab0PAo=z`oJ`DyRB~H0*_UKpQM54V@i2n`g2rkU+-raigTJ|x7tai z#7s0#TG)awTH69{co5Y@h&P`uRvSb<|>i>wr{N0y8Lxq9XgS{U;T>N z)p({3{s)(fT3<}ko0&w7UHU+;=(MbTn$I9IRek(YG0g6InEnyBp=+vAz%c#s`-k*y zS{!eJjb$sn;4l?xEIuYN#gq~CS)=xmc6|Gtv;>hB(fpF*J?}Hm(1BT-vSoA3{LXXm zD}Q(=&9djlsQT1lajSjP@_`W-@;e&4nWLBOT?V>a-BNzcXV)e)JOw8xnB4L_y6D_v9W z;PaP-VyTBJAFa*uj2eH_;K~j~FN6dhI%3h@M&g0J0I z7czRLbz6gdOeZcn@Rb-lHt`j_Ot!S*;{io#^E+60UB=qLzOc0AF13kISeqQ5Q2#fl zIj?+K>w0+$&QdXDt<_j$w9+&*ygyED3UbYx&#hMamPCMxtlw0tIner{U-e?6CbP$+yw)>HjCDPLdO!J82(~5^z(~z0ypP0Ij!G&fe+Zv zy6NkRE~PZ5DpE8n5!>lDdc&4z03Ps;Ho09tgY&0j{#U zW>MKKt+Hk4M~^QGiFQ{PaU&40Dj<-Lj}OoX0>t24L2}B<%Al>QB0o(z!+*(Py>O^4 zDQ7qcfkKe0B0NYACC42b4Iz^V8$&d#V` z^1A{c$wEM`AZHi>ChLtv_=t)K{T#<#11>Kjv<09-z`@XX7Yxp0tMdDWM;dZc@kcHJ zWy!8=Iq?I96s|nT7mp%TLN90m_S6ppm{pzxO+0ahS6RH~|Ea2YblLi)niyQO>f;3QCZlMs@&y82FWj zcmip#@B}1WXe$%~%n5~%g=4(X1a%QoCjW@f1Lpd#PK*=T;6FvNyCmg)s$*d|m@5v3 zb^E8V4+iJ_&px;tNg7T-;C3#6G}M0PiwfDDowHv-Y<2&gadVRxx4D~_hZ7oxMBzb% z?L#0I?K;gghoATmH{t|^zF%6z(o?qAb8~a^C?yBy64w1jn3zs|QMc#UIW+#f{7Gzl zW$?tyJr#Gp-#Ir-aQGSX<%iij;W35O84ujR5s4o;`hZ^Q=Y#m1_20%KA5F)Jr%g-bz!`AmdEd@? z4M;WLk)cikl~lGQKXJ%=HSwimwN@$zxiqu3RyH;GC`nK9U|?B(PT*32#if<326O}K zXu_@Tvq@bW-`_iXHTYyHv+}yD=H?GQwU%o5ZvON_P2aflQjfr=!$Q}WtXRGrc}VkY zdDG{$kB#6VsOYKCCBC9llb4SwGxHKtr;0Ca)_TL70vm$H3sOFD2A=b@R5e|(df(AI z3%_G;e|ys}d2yI&g6fh~U78{s$KbD1&20jR*Q(BDV(Dm$H4MiyvvTXiF4A-OW9F}i zW$pvQ&m4X3kvl*!zHEFp`@=bj&oz9(A+f{c=y zRyTXvA^j&0aAq~E>V8_AlI%59*b`s1vAzi&)?|xkkL+VA<~fAt6!7ZZ3+d2~6~{sD zH^&Vg3zU+5Q1YqWC02{LK0{lLJkF|h)L95E?T>xg=A#zK3e?TF@+AgPc#eKU-Oy~{ zgw(XY(0+KAP3bd7ObSK`Eyr^~Qt;EQ4GjY=;ywu-aIZ^N61yPm=6e2-lxq|WC#UI{ zX9f0euC=gAPX!puciwC~Cm|ZI?6X$Z06@vore;{)*kBjEv@lTZ^``TOx&Flnfwm;rTT0EUu2ZdPKZIR-%@dk;$F-P8oIGGBdDP%-*9< zM@6k{Q%tE}__Tln*7r-$$J5Zf6WA|Yf)ohlt*la$PF!}zZ1@NU-BdeeRuI^pHq+aD zM7`4aj?{P|KDn@gH;o|PsU*qavgeEW0^qt?BtxGaQiq4}fRiawWkJrME=}X9sUJJy zJByrI+x`52*?CSQ^tzJ5(ds!fTxwi6GHoOXf+e+d8xW+thgOO+KUX`a|D5(e?o zIj)E3f_1d8)5EzwE0@M?vzYJ5iXTwGQMvP4VYG)IaX(8kDO-FyY)Q%+R1%xsyV=*#1Zs-c)Rbi)}o+E z8okDK>K>g?DU0L{(I(|W%I{6^5tC^BiePU*XLSD|F$FzqU?xM}<%-8r$E~BMzQuVe zwj^uE>w?U}do8U@PRE{(WYL$Ok4I_R9S1?Y>xROu*v|JZ7_R5u9(t}5#Brfn6_xEK|O8v8vd9vjRxa6g-%Sv{-#TB7)M-n4J>SB2HrF?GTvj8>3YA1 zLYA#+yr85sTz2x)SN&<3Bl^IV9(mEVY_=!&8c=`(S@@+OcSU^>xv!7AE^Lmph=DE# zW?h4DDvGy7>l%aZU3?C=yD&j#-w##)>`qO%-}BBe$AIf|&;44{c&W!WblwCbn|I65 zBZX!k_f-2i>K}D&RU(Rq%r*eKHCA4Qy!*Q09%xideOB;DbHATzv7lC5RH)5*RX$%= zo+GPy^f{}xl`V2U#@O~)fd&9b5#D}!{%N({M_O$SbVT?AJ2q{@E06= zbJ~*{R~yrAd*w=hw)v#eta}yRv*wnx8dJRzWEC&}1{1|s&-#;VSwSlnBY}EmowA?X26=!MP+tdA*Rs;#qB(~=B!X*m@_vN)sCID36XNa2kDE^} z;$B$prK0g*av>J7s^j`zC+}M8eNu| z3FaS7IKCRx5at#!l3`*h_jcvZWj{WMP}bc*WUKTtTq0j{i{40^GekL1006H@6_l|7 z1tllo@9%0zcWGDKesi;}wS8lE?>Cd*#q2ao(&4T*Guw)P+m7B*j3E_pztV!l`L{K< zP3|rM$$Pas?E&@fo!f1_?UzyiED(3}P$U9Crl{m{aa(KK+HOWjrd>OYkL~ZQbsJ?n zTC&z|_PB%6OhWl5mHP{q+yVVJBP4Ulowk?#-=M!U%ir()jwS%`dyuF8fV9Ij|BgbY zVmmG54=B5t=ihOD_onO*I6F-Ae?^)51Ii9F{W}Voo9;A;z5gELe=*g+gZ(~0@IQd< zX0AVQwsUg#I!orRJ1v!jvzy6or_8qI?gfCn4(~L2(n$YtRW>%D*+Uj%BYh-E6D)^^ GeD)tte=w2& literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/wordproc.rtf b/tests/sample-uploads/wordproc.rtf new file mode 100644 index 0000000000..aad2c4605e --- /dev/null +++ b/tests/sample-uploads/wordproc.rtf @@ -0,0 +1,16 @@ +{\rtf1\ansi\deff0\adeflang1025 +{\fonttbl{\f0\froman\fprq2\fcharset128 Times New Roman;}{\f1\froman\fprq2\fcharset128 Times New Roman;}{\f2\fswiss\fprq2\fcharset128 Arial;}{\f3\fnil\fprq2\fcharset128 DejaVu Sans;}} +{\colortbl;\red0\green0\blue0;\red128\green128\blue128;} +{\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\snext1 Normal;} +{\s2\sb240\sa120\keepn\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\afs28\lang1081\ltrch\dbch\langfe2052\hich\f2\fs28\lang1033\loch\f2\fs28\lang1033\sbasedon1\snext3 Heading;} +{\s3\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext3 Body Text;} +{\s4\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon3\snext4 List;} +{\s5\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ai\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\i\loch\f0\fs24\lang1033\i\sbasedon1\snext5 caption;} +{\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext6 Index;} +} +{\info{\author Brion }{\creatim\yr2010\mo5\dy10\hr15\min2}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment StarWriter}{\vern3200}}\deftab709 +{\*\pgdsctbl +{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}} +\paperh15840\paperw12240\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc +\pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par } \ No newline at end of file From 9c7b66984c46668f314f93337d28c62854b6d134 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 10 May 2010 16:18:29 -0700 Subject: [PATCH 2/2] Enhanced upload file type detection. If given an original filename, we'll attempt to detect type from the extension if we were unable to make a definitive match from content. Generic octet-stream, zip, and MS Office type are explicitly singled out for re-checks, which fixes OpenOffice and MS Office documents to come up with the proper types when misdetected. File extensions can also be added to the upload type whitelist; they'll be normalized to types for the actual comparison, so only known extensions will work. --- lib/mediafile.php | 54 +++++++++++++++++++++-- tests/MediaFileTest.php | 73 ++++++++++++++++++++------------ tests/sample-uploads/image.gif | Bin 0 -> 35 bytes tests/sample-uploads/image.jpeg | Bin 0 -> 306 bytes tests/sample-uploads/image.jpg | Bin 0 -> 306 bytes tests/sample-uploads/image.png | Bin 0 -> 159 bytes 6 files changed, 97 insertions(+), 30 deletions(-) create mode 100644 tests/sample-uploads/image.gif create mode 100644 tests/sample-uploads/image.jpeg create mode 100644 tests/sample-uploads/image.jpg create mode 100644 tests/sample-uploads/image.png diff --git a/lib/mediafile.php b/lib/mediafile.php index 10d90d0081..85d673d92a 100644 --- a/lib/mediafile.php +++ b/lib/mediafile.php @@ -180,7 +180,8 @@ class MediaFile return; } - $mimetype = MediaFile::getUploadedFileType($_FILES[$param]['tmp_name']); + $mimetype = MediaFile::getUploadedFileType($_FILES[$param]['tmp_name'], + $_FILES[$param]['name']); $filename = null; @@ -241,19 +242,41 @@ class MediaFile return new MediaFile($user, $filename, $mimetype); } - static function getUploadedFileType($f) { + /** + * Attempt to identify the content type of a given file. + * + * @param mixed $f file handle resource, or filesystem path as string + * @param string $originalFilename (optional) for extension-based detection + * @return string + * + * @fixme is this an internal or public method? It's called from GetFileAction + * @fixme this seems to tie a front-end error message in, kinda confusing + * @fixme this looks like it could return a PEAR_Error in some cases, if + * type can't be identified and $config['attachments']['supported'] is true + * + * @throws ClientException if type is known, but not supported for local uploads + */ + static function getUploadedFileType($f, $originalFilename=false) { require_once 'MIME/Type.php'; + require_once 'MIME/Type/Extension.php'; + $mte = new MIME_Type_Extension(); $cmd = &PEAR::getStaticProperty('MIME_Type', 'fileCmd'); $cmd = common_config('attachments', 'filecommand'); $filetype = null; + // If we couldn't get a clear type from the file extension, + // we'll go ahead and try checking the content. Content checks + // are unambiguous for most image files, but nearly useless + // for office document formats. + if (is_string($f)) { // assuming a filename $filetype = MIME_Type::autoDetect($f); + } else { // assuming a filehandle @@ -262,7 +285,32 @@ class MediaFile $filetype = MIME_Type::autoDetect($stream['uri']); } - if (common_config('attachments', 'supported') === true || in_array($filetype, common_config('attachments', 'supported'))) { + // The content-based sources for MIME_Type::autoDetect() + // are wildly unreliable for office-type documents. If we've + // gotten an unclear reponse back or just couldn't identify it, + // we'll try detecting a type from its extension... + $unclearTypes = array('application/octet-stream', + 'application/vnd.ms-office', + 'application/zip'); + + if ($originalFilename && (!$filetype || in_array($filetype, $unclearTypes))) { + $type = $mte->getMIMEType($originalFilename); + if (is_string($type)) { + $filetype = $type; + } + } + + $supported = common_config('attachments', 'supported'); + if (is_array($supported)) { + // Normalize extensions to mime types + foreach ($supported as $i => $entry) { + if (strpos($entry, '/') === false) { + common_log(LOG_INFO, "sample.$entry"); + $supported[$i] = $mte->getMIMEType("sample.$entry"); + } + } + } + if ($supported === true || in_array($filetype, $supported)) { return $filetype; } $media = MIME_Type::getMedia($filetype); diff --git a/tests/MediaFileTest.php b/tests/MediaFileTest.php index 6fe9956210..a76a4f45e6 100644 --- a/tests/MediaFileTest.php +++ b/tests/MediaFileTest.php @@ -34,43 +34,62 @@ class MediaFileTest extends PHPUnit_Framework_TestCase if (!file_exists($filename)) { throw new Exception("WTF? $filename test file missing"); } - $this->assertEquals($expectedType, MediaFile::getUploadedFileType($filename)); + + $type = MediaFile::getUploadedFileType($filename, basename($filename)); + $this->assertEquals($expectedType, $type); + } + + /** + * @dataProvider fileTypeCases + * + */ + public function testUploadedFileType($filename, $expectedType) + { + if (!file_exists($filename)) { + throw new Exception("WTF? $filename test file missing"); + } + $tmp = tmpfile(); + fwrite($tmp, file_get_contents($filename)); + + $type = MediaFile::getUploadedFileType($tmp, basename($filename)); + $this->assertEquals($expectedType, $type); } static public function fileTypeCases() { $base = dirname(__FILE__); $dir = "$base/sample-uploads"; - return array( - array("$dir/office.pdf", "application/pdf"), + $files = array( + "image.png" => "image/png", + "image.gif" => "image/gif", + "image.jpg" => "image/jpeg", + "image.jpeg" => "image/jpeg", + + "office.pdf" => "application/pdf", - array("$dir/wordproc.odt", "application/vnd.oasis.opendocument.text"), - array("$dir/wordproc.ott", "application/vnd.oasis.opendocument.text-template"), - array("$dir/wordproc.doc", "application/msword"), - array("$dir/wordproc.docx", - "application/vnd.openxmlformats-officedocument.wordprocessingml.document"), - array("$dir/wordproc.rtf", "text/rtf"), + "wordproc.odt" => "application/vnd.oasis.opendocument.text", + "wordproc.ott" => "application/vnd.oasis.opendocument.text-template", + "wordproc.doc" => "application/msword", + "wordproc.docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "wordproc.rtf" => "text/rtf", - array("$dir/spreadsheet.ods", - "application/vnd.oasis.opendocument.spreadsheet"), - array("$dir/spreadsheet.ots", - "application/vnd.oasis.opendocument.spreadsheet-template"), - array("$dir/spreadsheet.xls", "application/vnd.ms-excel"), - array("$dir/spreadsheet.xlt", "application/vnd.ms-excel"), - array("$dir/spreadsheet.xlsx", - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"), + "spreadsheet.ods" => "application/vnd.oasis.opendocument.spreadsheet", + "spreadsheet.ots" => "application/vnd.oasis.opendocument.spreadsheet-template", + "spreadsheet.xls" => "application/vnd.ms-excel", + "spreadsheet.xlt" => "application/vnd.ms-excel", + "spreadsheet.xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - array("$dir/presentation.odp", - "application/vnd.oasis-opendocument.presentation"), - array("$dir/presentation.otp", - "application/vnd.oasis-opendocument.presentation-template"), - array("$dir/presentation.ppt", - "application/vnd.ms-powerpoint"), - array("$dir/presentation.pot", - "application/vnd.ms-powerpoint"), - array("$dir/presentation.pptx", - "application/vnd.openxmlformats-officedocument.presentationml.presentation"), + "presentation.odp" => "application/vnd.oasis.opendocument.presentation", + "presentation.otp" => "application/vnd.oasis.opendocument.presentation-template", + "presentation.ppt" => "application/vnd.ms-powerpoint", + "presentation.pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation", ); + + $dataset = array(); + foreach ($files as $file => $type) { + $dataset[] = array("$dir/$file", $type); + } + return $dataset; } } diff --git a/tests/sample-uploads/image.gif b/tests/sample-uploads/image.gif new file mode 100644 index 0000000000000000000000000000000000000000..b636f4b8df536b0a85e7cea1a6cf3f0bd3179b96 GIT binary patch literal 35 jcmZ?wbh9u|WMp7uXkcLY4+c66KmZb9U}AD%WUvMRyAlZ1 literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/image.jpeg b/tests/sample-uploads/image.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..21fcb5aef4f885ba2de26b136bec29a3056fcc86 GIT binary patch literal 306 zcmb7;NeaS15Ji94X}cvMu}st;rlY}oxDcE`@Ct&0Zbk53p1_5NaM*Yf+t!`B@)gwL z@oTVWdq;IToD4xk7`uXfARcU2i`{D3*>861&S)~5+ZzUu!t*>KU6WFlRiKq4^8HG{ zQLV-ibKGb*5FmVdKX1cKZZ!RX^~RQB=&=X)#B literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/image.jpg b/tests/sample-uploads/image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..21fcb5aef4f885ba2de26b136bec29a3056fcc86 GIT binary patch literal 306 zcmb7;NeaS15Ji94X}cvMu}st;rlY}oxDcE`@Ct&0Zbk53p1_5NaM*Yf+t!`B@)gwL z@oTVWdq;IToD4xk7`uXfARcU2i`{D3*>861&S)~5+ZzUu!t*>KU6WFlRiKq4^8HG{ zQLV-ibKGb*5FmVdKX1cKZZ!RX^~RQB=&=X)#B literal 0 HcmV?d00001 diff --git a/tests/sample-uploads/image.png b/tests/sample-uploads/image.png new file mode 100644 index 0000000000000000000000000000000000000000..60cbcfd17f345e65baf596c61f53985977f5a89e GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2s6ii6yp7}lMWc?slj7I;J!Gca%q zgD@k*tT_@uLG}_)Usv{9tlZ*U3Ogzu=mUi$OI#yLobz*YQ}ap~oQqNuOHxx5$}>wc x6x=<11Hv2m#DR)