From e34bc19f7126b80764a4c8747a7a2a1636289396 Mon Sep 17 00:00:00 2001
From: jvoisin <julien.voisin@dustri.org>
Date: Mon, 16 Apr 2018 22:27:29 +0200
Subject: [PATCH] Add support for BMP
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

To be completely honest, BMP have no metadata,
but we still add it, just in caseā„¢
---
 src/images.py         |  14 ++++++++++++++
 tests/data/dirty.bmp  | Bin 0 -> 5746 bytes
 tests/test_libmat2.py |  15 +++++++++++++++
 3 files changed, 29 insertions(+)
 create mode 100644 tests/data/dirty.bmp

diff --git a/src/images.py b/src/images.py
index 06f3e22..707207b 100644
--- a/src/images.py
+++ b/src/images.py
@@ -75,3 +75,17 @@ class TiffParser(GdkPixbufAbstractParser):
             'FileTypeExtension', 'ImageHeight', 'ImageSize', 'ImageWidth',
             'MIMEType', 'Megapixels', 'SourceFile'}
 
+
+class BMPParser(GdkPixbufAbstractParser):
+    mimetypes = {'image/bmp', 'image/x-ms-bmp'}
+    meta_whitelist = {'SourceFile', 'ExifToolVersion', 'FileName', 'Directory',
+            'FileSize', 'FileModifyDate', 'FileAccessDate',
+            'FileInodeChangeDate', 'FilePermissions', 'FileType',
+            'FileTypeExtension', 'MIMEType', 'BMPVersion', 'ImageWidth',
+            'ImageHeight', 'Planes', 'BitDepth', 'Compression', 'ImageLength',
+            'PixelsPerMeterX', 'PixelsPerMeterY', 'NumColors',
+            'NumImportantColors', 'RedMask', 'GreenMask', 'BlueMask',
+            'AlphaMask', 'ColorSpace', 'RedEndpoint', 'GreenEndpoint',
+            'BlueEndpoint', 'GammaRed', 'GammaGreen', 'GammaBlue', 'ImageSize',
+            'Megapixels'}
+
diff --git a/tests/data/dirty.bmp b/tests/data/dirty.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..be9094d1f8e9f9e9ae0584863c2aa6cb48b7f05d
GIT binary patch
literal 5746
zcmZ?rEfQk@gDM6Fh8zY41|tRr22}<I21W)6u=o#A1_ohn2nGu<Ffcf|2NlEE#L`S?
z3Y|l9!t+|?E#1{@f|aZTOoEHFJktyV3T%?Q-3sQqSFQA{Sr^c?+q-_FOYtI`lwP~!
zE|-G2zO7sQ8rJ(%E)A|*<B;BKpV(?1Sz{j4=#biG8(n7|S#A|p<QQ9}@0n&1mTwbY
z<djh3lGf&t)9acy$-iw==!65lb*t=CdmPfcoO7l{PCO7d=ag^x0^8Uc+vsZJfE)$}
z*YND{k`5U=H&xeQWzR_Cm}33F9Fw3@>x5RTgbtVdS)P?E{aUtpH*E5)U+<hZ+c{^N
zd&vUt#tr_>oBiw7gf_1CDxT+-Ingq*#y+XtHm24#veG83$TTp^HZ<2NDBCh5+bN;O
zE3?ffuivw9N=W^R;LdG<?OVM{=DKF~x#dj>ZQB$-{b+E@di&H4+t@n$m|C--0tN<`
zh@6PB9!Wbd6`ycruLxC_5EX|A<G^Bzh)Uz2605it=YsieRjd74w)?bf^K01XUb4ii
ze3^UQy3p=D{tX*~8#nk=t@J5gU=`iyn9|{#*kT(|X6&725tL)%ooE|gY!Q-UA6Mm)
z+U%Ux?o~cNqGL-$&(5IM%|W%x{3;eiv~P-^emJ;wlXK=IhvXKU_$JH98mFXI1_qDl
zyvVX%P1i78*HC@8C}WQpOaBb3;4GJ@GN-5#ujD50{K>&pi^H4NMYODoXjv0nu^_B!
zVMOD~`0g#yO)F!YS4K4~jjWg(l-(JU+ZmG87M$7WpHvo*P#BO@5}MT%mfI3t&>UUR
z7E|1v&@eZweM3mc*6{W%p=}!@y0*kk*c;NZ*{gh!bH+r+^e*e9cGsLqUb#~l81jp2
z>)QGX%WDgZD~l@XDr#D)8#_uXYisISYnwV7n!D@T`Wic@Hg!#F?wQfpJ*~cDVnh4n
z#;$3NT{9X$<dlYvNeyii8k)N5nmTJ6+v}S<>l-_&s_PmXTI=dstLj?n>Y8h7n_5~r
z+j}O&cdhlWSr*c?CaQl|c-NMInxz4?OMS}bxMfdpNNw}To9LF-=8(|9z|hjvT3cFD
zQB+V-lwV$yUs;q_QJ7a=lv`eqQ&x~unx9>omtB&VRi2w!nv+qSlUbaTQIwrokeyMK
zl~I_LUXYcZpP81QnU<HClAD>D4;CrR$|}mqD$U6*$;~Rt%_=X*ttiS*Pl%h|-x*as
z&AV_)So6x@=G8vsv)!{h{EDZzW%qdGbh@TBduO*<`X|{2r!z3LG`A+jMK{(|)>W2+
zQCVF@d2MBRZ3PI`RFu_%P-$&>X?=M~O<74@SxH?<X-#QKO=)ROX>oN)adl~Nd2w+?
zNnu4vVO2?SbxBEGX=y`6X=7zsQ)PL5Rb@+EZChh~XrSM;Nxjh-rM~g`L20Fa2}OSK
zdESw!K2e$O5vktM>Aq1J{?RFJ{$V~LQ49<{?QID$Q8Om@PwnfO+}|~+uWM3&*W~{0
zNnkX&zZ-=5K;)FZ?x}s<Q~G+Q_x4Qh?FMsur}TDD?d_h_-94$NYf^95l-`~xJzdj!
zx~BAYPwVZP+S5G|q_St~#NL?5uo;slq^4$tMa6`KMukVjghj=LMZ|<gM2AE~g@lEN
zghhr&M21I2hebs(F!XnKBt%EenAkh1yL)0!`^4Uk2|eu-dfUP5_R0NSAd&8l{+{+p
zeVzTCZIgPtr}lJC?dzG)-7%r3b7D{Dl)mmsT^*A;J9=81r}lPD>FJo#-8rGBV{&)L
zl%9?Wy&aQ!JEu+TiHQiGIb~8>dTvNWOjtx*ctmVebX;^yY-CJqSVTlnSXe+%XjoVT
z$Z6r>3=9){yAq-!XH4vy+|xO^w_{RY=Y*d2$-N-<l)kRSnCR@3q{QgRlKh<9tki_4
z$fmlQsNlea=*Wzu_@ca=isHhwq=dAD*o?&ZqU=l`H<xJ>dZ+YuPVMWO+|xO!r(;TQ
z=al~5>67|nBf_Rno>)-dmr~xAR8SL_S(KbpoLX2Bms65f-W*%pm{!x1RnwJR))G_L
zz`!u6w<jq!YHDBCq+XCQU9F8%`n!5s8++SZCiivaWu#XW6&B`X)|8dxXJzDNq&HMo
z<z;2$W~7%D<d+o|6zApUXJu9t7nBthlosS=Bqz2vHB9d9>~5~_Z*KtweOE_kOG{s8
zM|@P|j46|{>nBI%H-%<a_{L}ZM5TH}rg+9?`)1bo<+g;B^}1)(yJpqfB$Y8ROz!JV
zjE(ASYD`av3-IyEOHZw@EDH|~D9FmFC@Bo__e)KPE6U3%&dbWpN{b8)N>7N-%S=m&
ziz_QE$VpF&2@g$*jqYu44e;@b2oA_gOG!&ehz#;iijL@MX)MS}&rC@U4e)EOuZxe4
zoHJ!gQfY@*e34sZrb9rKjeCHZo3E8$xOqUFRam-3OqOm~ia~0LQa~&N!<7D>#Mr1w
zy<N5C#l?Bq)un|^wUvcAS+y0#ZS~caB?U#fS&cOnb(Lk!b(MLUsd*Wx6~*~A<;Bf)
z)%BGXc^RqY#f1~PI<is{OAB*rOA9ND@(Z%E$_n#(TbirOi(6`ItIJ9zc6B90Ma`Ky
zHKTfhS5l=@c)Gc}pOJ%`zOB8swY`C>kG@}oMrfQ~WTt*xzH(3!1H<(GuB4c#>63b<
z^><9~@5;+asVpvt3<^k!jSTVgt}QRg%ScU6j!%k-s;?-`N==N52r0-)E6Pbvj*U)B
zNQejysI4k5$j(ejjEj#BPl%3etSV26jm=C+j0p=)ii?>$Wy+k%6K74DoD>r^fBMwa
z%09P*Du>7{BR79F3p))9D^+s~Eqhl(|7g94G?SQoeg8!DK#;p8^d!ed&zRUbv%hoN
zgs$eAik_DG+S0<N>ax1hf(h--?e$fSmBkGe#gn_*TkC4-D@!{X8`|otnyN}$Ypbfu
zOZz)JnrmyC>+0)kYnrR8d)wNYt18+W>zit-+8gTTPMI`oO8@Mslapg(7R;QI**x2~
zpx>vU$3C{iHY!8c!(Yq8*C-%b*DKUCrobqsz$iRJ(bbQEVcNvr<hbY=6T4@D+|@aw
zuXEOfuGtg2=S=9CGqG##guYo5dS*`Oo-?_B?v#nMrcRnUdBUuzlV?xvpEbE}&XoQc
zlP1laJbA|CiL<9nnK5PZtSOUbO`b4o@`M>+#dD^DxHG5r&z?3ZB|dik%qi*3bAlTd
zgtsnF=v(7m+-;RmWEPoX9hYwsnr4&NZd=l8m)T$vmCL{|ZE|l)e9Y_#pm?0s-!;3x
zd(On}xf8o*Pwt*Kv1iW2{yCHSXHMwtZ*Q43Wny=0^VA7F6M8zQPwbmDxqot3+qC|k
zsr~&^`ulp?T4zq3GHdFT*;6OanmTC~$c<A#jA@f*PoF$z`qcEK_=U5l6-{29FmXfN
zgw1(Nj{4Tm^RJ)bQqbm@UTc$H?O8q5r*4i*VYg{~IRnGYDLrZNF>@w#gMw*7&+Lgk
zbHVPKJE>>xr0%&>dKOHZSe%tnl#|s^U6GxhlAaV77a3lVotc}F8Xp;&m6{wA6&V#4
zk(ZS{d&bP!(`L+`K4Z@G8M9~1m^FRIoS8G{%$PQJ){OZxXJjWQFPt;0q<=+H*Q(gg
zRmsz~g>@{C?pc#KX_ISVvu9aPc+>pg`nln)i`+{37#QYF>CH@tn%UbvvAv<azM`|f
zdU99u^#1k<E%h^d+h$GZoZQ!5Rg~Y;(ln{JtE#lPv!$`Irn0@MzO*o>qA0JUslKwb
zxW2l&t+{!|lo?&^-P0yb>+S5FI&sR>$y2)9JEl*b*w@uDYwEO|l$6DDX6Loe_ATxU
zsh<_uu_UH{ZB)<dkcK(#d3A2tHU6cYKE)jY<rDoXCo(WBoZ6R@5LKC<5fS7Q8yZ-c
znUWM478>9^XJSuDW^zehMs#>kNq$a7LQGv%c}sm&bXaIsT5?NWRZV$uY(z+Ua(rfb
zYDIBTUS?KWQf7HUbyQe<MR8SbMqzGxUU6PQpub;HZdPYweQsLHin(*r8Yj6IwfL6x
z1XoQ6Z=D<5Fg>(xa!6&DV{(pbQkGM4o^MH~Pf<4m!@_C(*@+R;x|@2MYkOO3>MIJm
zTWaen3#U)$>};%Vt*`26sBNk)>uGPC+TY#Z-P%-J-PzJKrN6VSzOuHWq^G^Lro4PY
zPgi?mbA5GvS4&rCb4PnaQ)hEWUq?@4b!|_3+q4ON^QKKH$VgqaV0Q7uWg&I5W4o5d
zwk`;-nHpU;EvaQjSXsM&X-i`7!r1PG@!d;e$|o=|ESNqaD=B*3<es^cyB1FGiwyG4
z%TA4t4$DZ2_VaLwiww(3Nlc0f>uYa}i3rKbNKQ?Nt1K<ZOH0g5h{;Zl?`&yEijItn
z46iFMO^k^x%*{(lNNlLCO;1Y6%gE|!ZJRfH*21|n7tNbloSnXE(cH|s?(nkKsQSr?
z?Q=3GFOR8ei>hdgtLsT^o)lft99!8IQ_&V*+Y1V>iP<T!b0>GtozyjVa&K2-_0;ax
z@`8-Ivi#<%l9t-?*4m1S(%k9&U5(Xcbrr>vyIWdn%X`}zC$u&+RF<|i)%AC_)mE0(
zS5|bjHuto)PweXMX=`t)t?ldRSU7#^qFFN*&YiJn?yRER%$1Ah<&~HDB_*ZSHRUum
zWj1%DG&E;)^=5STWi_{_mQ^Gc6y>&b=5$VBV3<3lCqFH2?&Pky6T9Y2=<aK&O^u1D
zEzXM!^36?(&P<5OijT;QkE$)nPfdtUkB_XYEN*M84iENChzLyx3(QE0&Cf_K%FC%P
zDXy<74-fXw&CG}m52-3GjtmZ5K5y>g*)tZ-ow<1a%%Z%^<%{P{pEtK_+Qjy0lP1oe
zHEH33X-gMPS-xz}`VG@ot?r#WZ{p%5bGPiOn=+e$VdkXnlB~pelX~V&?wUKPYi562
zUrXKezUJ<x$|)TUQ@Wd{cD77vZ<^KLIkl&KQb+Tg$vv|tc1`GN>+fiu(AC!0+0x(9
zGO4F)a$on93B41#yQcK@P3-EN+TT05r+dkqS&Qb*SiE4)@&&WY3Uk&hUvTvJkq6Hn
zK79H3>FXCS-o1YH@y)A`@85j-{PgYHS06q+d;j+N#}BukK4oB-*4JK<mp*@T-~7qF
zAlFR-N9d%^xs%)HPVAmHse9qHzD3g}EuKDc(KHB}uxQ$Z1=A-koHlXx^og^kPna`p
z;_N9CW>1|wd)m|mvu7@tJ$wGl84G64STbkk;<+=I%%8J-(ZUsr7u1y$ZdkGS`i*N}
ze}DV-=li!mKS1Q)AK(A{`2H8f29rO({rUd&=XVB%$sLWgMOpJF_biy)3v$}zp81nO
z<^8<Lo%1Jm&!61AaBBaeX%iPuo3wb^q(##vECjJ9%$*KGvu8{Iq3M(6PMt7!+SGY7
zW-OR9Ytfup3un(-G;{jWxic5fo3UiU?3GIvu3WmXwxW2$s--t?UI#e`<gV|y7~lW=
zU|{HNs;Mu{UofS2-sG<NQ+pOp>02<RZ^6`_`O|vmP3xaKy>H>P2@9r8UOZ#+q8T7^
z$;?ShW=@_zW8%D-6X(vFGH1r*S<@!Wn>um+j42Ce&0I8h&f<A<m&}{HY|iZE^JmYW
zIc@&z8Ecj-Si5{tV^!J4bt`V(y7nEfqacoDVCZXaPK%GoNsVi3ZOF<@%F9a5ON-A=
zOUO=5$VpAeOi9d6O(@9CPEL$WO^C|RNG`}oD#}dG&rHtEO3uqn&CN`iKX1;QS<~{<
z(+YCZ3v;rHb92h_aw`k7tBZ0nQj=Pm>)IMBo2pC7^0POsTY2N=RU+K=je()Rx4WmS
zv$M0q*51Clwy~qFt*^VYzo)yer+ZRw_k^C_iM@UOlP0!wbhWp&P44fTG@*aWg#M`$
zCQP0%VN!qJl!+6UE?=>1$&x7(CrzC)Y3k%DGp0<PHD&soY13y<omN#*(cIF!VD9Y2
zb7w4FICuTZB{yzf`}P0#@BhDl{r~mr|L>pwfByRa^XESh0*n0m_5bJZ|Gya+jGY24
zJR=NkT~zgr&E0}6y<?n%5}o~H-2<ZC0^{66l3armTtiblqVnA%GM$4G-GY)lLz2Bh
zQ+*@S10vIXqcQ{I^1UOo0wUA=BT@sSQbVHCLn4yGqtim7lYRX|+&%phQ*+~!veI&j
z@`}oP`ll>fx^mgdb*t8IUcYtQmR<XH9Xzz}*r@|2&hI*Wa>xFYtGDi5xOy`KgNmt#
zx`l_VvWAj|uDY?Ks*#J9sjG&Gv$3s@zKx%eU4XHjpRq%LiDQVqt*@c2ubD%Dwvn^B
zW1zX6ua%>prDK4#ONf<Iu#Ka?m9xLCYoMcRkdteWvuB8lSFnq_pQW{}r*F8of3$CK
zTwqvqYFbuCc3w_?NpV?aS#^C~Q%8M!cYQ~1O>2KuQ%^xndq!zpYHlS1gSfPcl$3(B
zl(@8{jFgO$w6uz}jIyMZvYfn@jI5T7yso^WiGs43f|99%qKT4<m8zDring<!MS!7g
zu#t6;g;Rv7L#UCtubo?*wOh2KXPmo#s<m^Jg+qvqOQef?gq5Y8vv;J6N2rUdmy3%>
zNLWl*SbStmLR>;xQfg*uW^P7yenwVadUj!AdQMDIMr3?ySVSTNgNBxgs;ai3ro5_(
zuBxi8y1J3NhOw%ep{9<xk*TwRiJi8#ji$DZriKLwY1!!*dKp{zS~>(<Ifq!ggxb1A
zIC)092PAs=CwK>?hDYbbB^HFoWJbiK`voTi1jcx~yZQQs2Zcn1M<ql=CHM!1$0ejD
zrlcn(XJ+LVWabrS<rbu6=O!j+BqU`dCa1<HrANo6Ffb$}#3d)h+ncCFhKEN*MMgzN
zMn*-&#zyC6Bo<`E7vv=Q`-k}Whk1DhxV!s1I(pdJxH;InJKB3VJ9&9|2D-WWxVn0~
zy0`}ggoOnM<s`>trzU2mrluq%r6(ukrYFUPcvP2W73O6nBqnEPX60pP=jY~BRg^T<
zS2j0Pb+j~eG&QxiHn-N*bhS24p3pme>a@udCowSewpFw@mc)lRCPoF-mgP3p6g5^A
z)s*E`m*(`fl}>0csVd1TE6S`a%B-o#FE7k0E6i%H$#1I8YpKp{tIch!%4w;|uP@JT
ztIKPz&F*W;>#ECbtIKPy&YRd$)LffWkQ~xnncG;ATVI*m)m+}uSk~E6F`=VwT5rSj
z{-)VeyQcQE%$?l1WOo0uc{A3nS-EG&_Wk>IGcf%4`~An??_1U{ZE30f_5aWJKi@&<
z_mA&?zkmPp<J<4=AO={?kH0^Dfa{F!f4+g#{Q3R^toYlXZ(yl!-~W93@#ow3U*Ep}
z{`&3rw{O3{eEIqL<L9^Eet-G)^UIfCpT7P2{PpJ-5c%uV*I!>?=<C;?pTGS0{Q3Lm
MPv1X(0y7vG0CU!(RsaA1

literal 0
HcmV?d00001

diff --git a/tests/test_libmat2.py b/tests/test_libmat2.py
index 34f7301..ae04dc2 100644
--- a/tests/test_libmat2.py
+++ b/tests/test_libmat2.py
@@ -307,3 +307,18 @@ class TestCleaning(unittest.TestCase):
         self.assertEqual(p.get_meta(), {})
 
         os.remove('./tests/data/clean.tiff')
+
+    def test_bmp(self):
+        shutil.copy('./tests/data/dirty.bmp', './tests/data/clean.bmp')
+        p = images.BMPParser('./tests/data/clean.bmp')
+
+        meta = p.get_meta()
+        self.assertEqual(meta, {})  # bmp has no meta :)
+
+        ret = p.remove_all()
+        self.assertTrue(ret)
+
+        p = images.BMPParser('./tests/data/clean.bmp.cleaned')
+        self.assertEqual(p.get_meta(), {})
+
+        os.remove('./tests/data/clean.bmp')
-- 
GitLab