From 9ffa02cef1f6fe966b8e842ea457c1ebfd8a2175 Mon Sep 17 00:00:00 2001 From: James South Date: Fri, 9 May 2014 17:45:21 +0100 Subject: [PATCH] Fixing concurrency issues in preset retrieval. - Also enhanced security. Former-commit-id: d977f2eb89343065cf95418bc2d43dd5e32ccbbc --- .../NET45/Config/ImageProcessorConfig.cs | 81 ++++++++---------- .../NET45/Helpers/RemoteFile.cs | 21 ++++- .../HttpModules/ImageProcessingModule.cs | 10 ++- src/Images/falahill_design__160p.jpg | Bin 0 -> 10469 bytes .../Views/Home/External.cshtml | 5 ++ .../Views/Home/Index.cshtml | 16 +--- .../config/imageprocessor/security.config | 27 +++--- 7 files changed, 83 insertions(+), 77 deletions(-) create mode 100644 src/Images/falahill_design__160p.jpg diff --git a/src/ImageProcessor.Web/NET45/Config/ImageProcessorConfig.cs b/src/ImageProcessor.Web/NET45/Config/ImageProcessorConfig.cs index 21c848a61..2f0357d8b 100644 --- a/src/ImageProcessor.Web/NET45/Config/ImageProcessorConfig.cs +++ b/src/ImageProcessor.Web/NET45/Config/ImageProcessorConfig.cs @@ -12,6 +12,7 @@ namespace ImageProcessor.Web.Config { #region Using using System; + using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -37,14 +38,14 @@ namespace ImageProcessor.Web.Config /// A collection of the elements /// for available plugins. /// - private static readonly Dictionary> PluginSettings = - new Dictionary>(); + private static readonly ConcurrentDictionary> PluginSettings = + new ConcurrentDictionary>(); /// /// A collection of the processing presets defined in the configuration. /// for available plugins. /// - private static readonly Dictionary PresetSettings = new Dictionary(); + private static readonly ConcurrentDictionary PresetSettings = new ConcurrentDictionary(); /// /// The processing configuration section from the current application configuration. @@ -185,33 +186,26 @@ namespace ImageProcessor.Web.Config #region Methods /// - /// Returns the collection of the processing presets defined in the configuration. + /// Returns the processing instructions matching the preset defined in the configuration. /// /// /// The name of the plugin to get the settings for. /// /// - /// The containing the processing presets defined in the configuration. + /// The the processing instructions. /// public string GetPresetSettings(string name) { - if (!PresetSettings.ContainsKey(name)) - { - var presetElement = - GetImageProcessingSection().Presets - .Cast() - .FirstOrDefault(x => x.Name == name); - - if (presetElement != null) - { - PresetSettings[presetElement.Name] = presetElement.Value; - } - } - - string preset; - PresetSettings.TryGetValue(name, out preset); - - return preset; + return PresetSettings.GetOrAdd( + name, + n => + { + ImageProcessingSection.PresetElement presetElement = GetImageProcessingSection() + .Presets + .Cast() + .FirstOrDefault(x => x.Name == n); + return presetElement != null ? presetElement.Value : null; + }); } /// @@ -225,31 +219,30 @@ namespace ImageProcessor.Web.Config /// public Dictionary GetPluginSettings(string name) { - if (!PluginSettings.ContainsKey(name)) - { - var pluginElement = - GetImageProcessingSection().Plugins - .Cast() - .FirstOrDefault(x => x.Name == name); - - Dictionary settings; - - if (pluginElement != null) + return PluginSettings.GetOrAdd( + name, + n => { - settings = pluginElement.Settings - .Cast() - .ToDictionary(setting => setting.Key, setting => setting.Value); - } - else - { - settings = new Dictionary(); - } + ImageProcessingSection.PluginElement pluginElement = GetImageProcessingSection() + .Plugins + .Cast() + .FirstOrDefault(x => x.Name == n); - PluginSettings.Add(name, settings); - return settings; - } + Dictionary settings; + + if (pluginElement != null) + { + settings = pluginElement.Settings + .Cast() + .ToDictionary(setting => setting.Key, setting => setting.Value); + } + else + { + settings = new Dictionary(); + } - return PluginSettings[name]; + return settings; + }); } /// diff --git a/src/ImageProcessor.Web/NET45/Helpers/RemoteFile.cs b/src/ImageProcessor.Web/NET45/Helpers/RemoteFile.cs index 79ecfd29e..05c2f9753 100644 --- a/src/ImageProcessor.Web/NET45/Helpers/RemoteFile.cs +++ b/src/ImageProcessor.Web/NET45/Helpers/RemoteFile.cs @@ -15,7 +15,6 @@ namespace ImageProcessor.Web.Helpers using System.Collections.Generic; using System.Globalization; using System.IO; - using System.Linq; using System.Net; using System.Security; using System.Text; @@ -354,8 +353,24 @@ namespace ImageProcessor.Web.Helpers string upper = this.url.Host.ToUpperInvariant(); // Check for root or subdomain. - bool validUrl = RemoteFileWhiteList.Any(item => - upper.StartsWith(item.Host.ToUpperInvariant()) || upper.EndsWith(item.Host.ToUpperInvariant())); + bool validUrl = false; + foreach (Uri uri in RemoteFileWhiteList) + { + if (!uri.IsAbsoluteUri) + { + Uri rebaseUri = new Uri("http://" + uri.ToString().TrimStart(new[] { '.', '/' })); + validUrl = upper.StartsWith(rebaseUri.Host.ToUpperInvariant()) || upper.EndsWith(rebaseUri.Host.ToUpperInvariant()); + } + else + { + validUrl = upper.StartsWith(uri.Host.ToUpperInvariant()) || upper.EndsWith(uri.Host.ToUpperInvariant()); + } + + if (validUrl) + { + break; + } + } if (!validUrl) { diff --git a/src/ImageProcessor.Web/NET45/HttpModules/ImageProcessingModule.cs b/src/ImageProcessor.Web/NET45/HttpModules/ImageProcessingModule.cs index 5e36ff128..a1f4b62da 100644 --- a/src/ImageProcessor.Web/NET45/HttpModules/ImageProcessingModule.cs +++ b/src/ImageProcessor.Web/NET45/HttpModules/ImageProcessingModule.cs @@ -261,7 +261,6 @@ namespace ImageProcessor.Web.HttpModules bool isRemote = request.Path.EndsWith(remotePrefix, StringComparison.OrdinalIgnoreCase); string requestPath = string.Empty; string queryString = string.Empty; - bool validExtensionLessUrl = false; string urlParameters = ""; string extensionLessExtension = ""; @@ -346,14 +345,12 @@ namespace ImageProcessor.Web.HttpModules // in the UrlAuthorizationModule by creating a generic identity. string virtualCachedPath = cache.GetVirtualCachedPath(); - IPrincipal user = context.User - ?? new GenericPrincipal(new GenericIdentity(string.Empty, string.Empty), new string[0]); + IPrincipal user = context.User ?? new GenericPrincipal(new GenericIdentity(string.Empty, string.Empty), new string[0]); // Do we have permission to call UrlAuthorizationModule.CheckUrlAccessForPrincipal? PermissionSet permission = new PermissionSet(PermissionState.None); permission.AddPermission(new AspNetHostingPermission(AspNetHostingPermissionLevel.Unrestricted)); bool hasPermission = permission.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet); - bool isAllowed = true; // Run the rewritten path past the auth system again, using the result as the default "AllowAccess" value @@ -493,6 +490,11 @@ namespace ImageProcessor.Web.HttpModules throw new HttpException(403, "Access denied"); } } + else if (isRemote) + { + // Just repoint to the external url. + HttpContext.Current.Response.Redirect(requestPath); + } } /// diff --git a/src/Images/falahill_design__160p.jpg b/src/Images/falahill_design__160p.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa3ee4f4057c383ee1a03d87ef303ebdacf5cb1c GIT binary patch literal 10469 zcmbWdbx>SS9OXN>L(o9507D4Dfqz8DwyG2o6JV3ju<=ySqCKIt&tm z4LRrlMs&ZoMnZ}qwNaq)2j@I(=$00LlOU;vE&HNfLCKo)?B zf$?Ae-@?Md`cJsn*jPAtxOjN~4SWJ30(^Wzd^|it5<)^E;(x*;ASELqCjIaFzlZ!c z{l8iNIx#*T{(lw!-}KlCAjb#T1Aby*umUj2F|f!n9(w`I000KgKezuG{@=pD#KOkG z{bz}g=wCtIlYjQHurU9b#lgn@SMBrfJ^-5>hk}Lw9WJG+2_CB>l|Vpz4nEuasxE4^ zDHKr96dFiCNb{7I?iu?Fj+dOTgoH&z#l+vpe)tHIlUGnw*U;3`*3s27Gq6zKN`Gv(LIARmIwY{_ZXYcRH>Dl?k4=vV6B85N5ifsYM!agfzgd#I(p^DOX$&jA zI(@|tb^S2&sq)3n4XNk6^2ISc?{@vg8?Ft%H)W2J3k}#qlqPa&1w<2eK1EqJtv@~3 zjQ2w6m?xqh0bs>bN7@4Q)tG^NIntbxl@WA2PG*15)62X_k_;%_nj^=U9czq&Qj8BJ zUd%3QJ9+CPATSU;tPY*mdYw*bKKw03@O^yVa&BT=E;c;B-F$09MEVc7;1OWw_r$=O z8Q?7^k}cd<8mG%D8Q-t#pSFWNK-+0SQBfdyl6JQ-dwyLv_Vi2IoYq&N;M z_rqsek;9P=qTrRgKn<(t*UmHZN;lUz^9jm8pUe%3GQ3U6r+Q(b!Z^<|%UK(1TVOBr z3*7Iz#{+x}e++(qClML0E#Y0hzbO;xi*ffpTem9qOEO55P*|CFFKW27igr|;pGEFy zO++_#h>hy`Wd$>u@G zv(6*HIyO*yL962{Y?BUHAAT1KVihO@0^>t9t+@Ru{YQWLFEK?G74^*&S?#Wm?5_JH z+q&F}Yvj9i_(>1U_yHb77tvR;H4C+wibP`~Cm*Uph}xenMxm-Y?>D)KF|zIw`@FJ4 zTNSJ~iM&6GrYwz%As5)rn8WgYweG~wiJN3gB?B|=3F@|yWxS_*kAPaWJy(63oMi86 z&>bQ%cepx+sF=adLdM(u>A?j4vbqGvd= z8SPgl;VC%G4?)?220Ivdh#jQNB-91oeN{0x6ol7&!{XMA9R1Ps70XW3T8{h$D zyzb-NrN3_kdZ?PWil^yE_<{a3A8Emfg!S~HD*|S;9NWh+ekiSq?^)dFjOL0EMDwJ# zM8UEL%_Z(OP-%ftkm+1%f~pUf2_v)X`f)bipK~%v;SlTF{zDpuO7J!v4ra|(PL$A zqn$6u)a&_I*f^O*Kf&l@mJZPxqkmP+B9yzT;yLKVfmRhAO+QBx;yHNk-6dK>Z#^LkU;(C7Vo(Nz-@8D*oQ! zjgQ1!^k=z<)u*G;id#qONnhklGImktm*rkM^&XFaer7y{6O~SBfhj!%WM_`MFG|3p zw3znePL8FK>y80~c?J{LnR>r89vFN7*;;g|tjq7U<=)Fd93;I4q^cRv)Wf-`37WIS zdk%YBF+<&EU3*I1iV&I}lt+%?#3nxiVsP%c`lThkaZwc!!pw(U9p}vC21<;h(51c| zgVk1>?$>4v)lNY$Jkw4}qfjOT*j$Jrui9shK^YuLVInmA^hO5=8z1j6rdX1kM=8-@ z3DkG8J%1VZ@()o!;A`o|`&dZ}2+}^pmle#rM!(9Z5p%H-n%c4r!C>WQFoO-+JYfQye74@YnPjW7(JpBFOE-fOX?@|tEnE=O>N4k|^4;5b++ zzhj=|traix7I!SRnQkp9@5N+HKv4b53x+fTL5g4KcF<~O-t#ZN5&ncP`hmoF1$5op~CgViDL z`a{M%b)wAM?9prFYQys*c0qrTycDT2-+>=$m^suJ_v_aDc{aJVXWRb1$W|A(d6j_Q|a`4Zh0_Op(y_;~eB80QDtuj8EYtIgEuy z3-wn}=l<6tKsAa#?NHA!F7NcD!){3=oH;m~ftRbtg^vjS7q0Ly1|wk_PzhM`xq=lp z7n{IeoUW5Jk`kz-`mo(<>67tneO_2xFTSOIa zP$*b1>KG_L({V2vz5$O3&g3fQO@E2(xLB9nb^rCygH|Wm?i-t(`g^ra^KdE1rg+jz zm#d&DFYqhzTM4FQH>rSO#|N2>grphk>}nC%RC>$4l)745qk?$^t?#H7m=oCvoi;(5 z8eokee^Q%mtRH}L?pV-Xh3@u;+7y3oYVEFWyuI0HW1oShOQZDM7xT2xa2<_u z5X>0X%p?}pwYD!06uMwyy7j{XxcV7(omjvOVlq8sS?Vj;_4=GG`Y$A6$W}Xd@Sw%z zyu-dNEB>PhC(YNn$yM7Swb^4gfTmRCB#0#UTYfd{F=ScaZV8(T^x5UydCRz zzbgryyOVv<;&D3?SXF{6pL|rw;Ku0N=6+FXs~s&|zH{zyT6jD;d4d=kW61H;#day_9@OCBTkXRWgn(AC45$irH$6H=jyMx3ZE^kgwx&X)gff!PK}YR;OyMF71Ktk@wMgsr?P!>JPA zZ8AVKbMVh6UOdNZ4+{6kpD(w|l+PM@VsYnNRXk8(T|_3fFVdM~g}Jg1d6dh)9o5-N zy~p25zl!X5Vk}5C%q7U5upx)(<6Z)&ANDmX%%gKcG=D3~T|CtW?$fSU<4NrWzF zjz<2l^EJTo$0Is>da#P%`@YWPZI$ajqukz5T{R^fTV-J5R?||wEJq>uzS#Bn`$y3g zYhBQ$NIsA7`R?IR`t<5h0bzN9vk*=L-<+!>VIAY;u}pG{ zR^>6hl^e&bv@*BWcu7d47+i@JGjl15B0xK#YLsDX3Uv~O?~HEfJ0wI-o({e4&kOws zvck}X5>>);w;9IzgEsA-{PkQ&&99YaJb97rWA9ZY1cpcdRvbo^wtumJnLKg%LYbW` z^(A1()2}a^+;>=SCn0a$CmTG8k#?iNjnp~jgJ9@Pb&o4?rzh6;G*MY$LFU>_9jtPi9$;viK7F38G9f-;M`~-iu6}B0 z4*EJ`jDo5sWQ8sN7Qb;h^TR=BE%)lN$K=?Z`h;GyHAX0~$+Uv7bFgUXe`GiXW%sxE z;HfrnHiP1UB(Oq|gfjq1uj4CQNLP_m-&(M+eklFBZL}XD@ORjxhdlcS15>s?o>WAg zy4PINs^-p0v20ctFe*!qX;pA$Pb)Ir<1U+TJfsquSAE)^%Wwn-Ib}&~roQR{8X3Sq z?O%ygfdfNQZ`pOVIiXn5!bfkD~e1>rJ-m{iGT=>lvoMGo@n zphl}W4bnx)-8Pru?LudGOXO?*ut6 zb0pqTK!X1pS2kLy<~e(|VImQ2ueiTNc1)>*8z)hY;}V!$$#d<`jXpnniL9xK>;Dw< z*V3EeYImV%V7^uTGUNVdojtC*)bA-i<}b5J7p#p>mW3waeMtgBc@8OrR7qQQNWA!{ zuMO>+A<|YulzWD-M}Tc3Nh^p> zRfFQmZd_S6%&|7&j4yb-roZeY8_{>)H+vJBfGi{2J46QQG{pZ-nlh1#CgwF`Q5r4< zE}v3H=Y1*c<{Y=ue8#VmmOCZE?*}J95p`Iu+Nd;G*56wULD7TllxVVZbQ_B&$Px4^!(;Js*4Ki+q5h}C@} zP+P$I^!^9!A^E0ue4L4Y^zyx47HHla=gVsxk%czjahdAR$;j@1M*zH#tytx%C7k+L zAb%H4^$w>goW*^$UldpMG^AVPj+4#y5*SF!C#hkdH)D<}EuomWOcEF)>Gr?I!xme5 zg|sB-m2jhQy#&{0_Yz1lqHd6y)6RbqzBI;j*9KebZ7mOWCK;7_FMJ$=JG8zW-p+>U z6eqL^WoFj-IP3A0?OaqZ6pLF$YEl=KaNIls^fHe7JK%4YH>fXz5K>Gdq7<(_K)B81 zYNkq~Vw>q95n*gQrk#KR4>9`px8Q>+)Ka^k?|1{$Jyr!pa{8{kKI`*u$OYt$8$1N7 ztTA;qP@lMv_WR}vrsOxV*d>)q)j4V2uQc$GxzNZW+ce)y-eUNQ-mP`A(X&tu!^>Dl z$gaGFWg>FXc%SPx5~iJp&aK!tB32>`_GLizS9u`P-$_mXHL`|nOt8ctc0|8vXU2Vx z%^248u2qla(f<|l#`Q9hvcCD;zIy)eDs$p-{$Q|Ki=Nx@mfWoZx_jb*I#=NlKp>J{ zj*iqwt!?qD{9Dz-87H|%gwF~UfA#MKx`NrIGAzc7;f^Kihw8GtO9(*1tT=9r=At#wx}!oSMF)i4DkQ76l|? zMmTDy{}737ZZmoWK<&Y(jFn;0!up8nGkd=l`$nrn9z+GTdv13c6is6-tU~a|(Ic6B zPmOI%3NFh0igA3U2*^;bS^K#;>06HV z3}dgGlK>=hbQaxxdTpeap^ehj%#kozwV!n#g{18cE^xy?{I`?j% zX84H1sduk^aqs-5i+}EY{oY+u%p-uO@lz$ypxNL?(D`dpp-6l`isJ17|CG}9HAYx!Q|RhwsZyL% z_79AHd~9bK#WAkG&S!-!`tPcjJfPR{cl%5_7*SDi3j1+Rf$yYZY)epcyYSjsCgZrm zzm#@zb~2yEHX9r3fZsz>1nS=|H<~mZ;7y)0+S+zE|LSol7+tAhpy6pmVqu@Nab$SD z-p^P7kyfzF_D@uTb-L@Qi|2exj-;(lz~O$C=j=%|x-Z%=AlWs?SY$KUIM`=hox2wq5HN~D**F%@&t|<~(K2n`bX!xE z8fj(P(*C~HA|j!I4oCfUVtl^Uw`^~FPF!94w7R?Nz>BOiEaqaxV@1VQV!?AW6 z__cHrqWj``Ps3N2SK5H$!l97fH;|?dS3N1dg2CZfNh{AtmDcOz&4r%q(01z9$)}&^ zB|VDD^Qk;x9t$F)^^j2hciWLxLvrFTSP6Moo|=P}@Vhi9hiCX97Xq)zf8Y~}7#=r4205Jo&xxd7a`WA=tc7r^YR-EQkEI zSK|U#NM7^ynfj|ki2mYUuOdYlF!64E?}|~hCl=Gl+i>pNF|ckysEw(ARZGyL@Zk}l z?sH(C&@HS}DuyIfzipA~9-I9ljh=$>ZnlKBvKv0VY? z&aT0p*C_r2w5aKzX^z=8)4j$V3#zKGnwb`RicP2YLL&f|z*LR{)x|R?ZrtO9tgqNu zUphmS^_P*9W%gGU>~$-(`IzdIm!I7Z9-1T&8e+L{Yy%m8f|?Q}n==*5wXRH)B5wJl zuJ+co=1R@pQ)FH{-#@*h^y*s;%R+2w^!iM_FKYF zr!Ss}(lc{Ep0QmL@82P}E5Y)e#9ppzOQ|;2? zL!Q`C(<&qQHyT?v1X4$U$;E11K7;#A*sxJ;T%k)%icT?8zCW7kkdX%7aP4CMc?Y(Y z;gexkcD0)7OEyyrUTWwhFV8Nr7UeOo8Y=uNq8IqF&<1Lk7|$MUDv@XiXQvM{sO*7x z9tS-FXj-`}Pzb-eGM7V6J~RE1l7{Im*u3mZHP;EeR3;Gt|K18hv7OfB%jpxEDkM?< zjI$J<+HCC~^V6NsZn!R!x<8hg-RcT?s>nGYxjXb692f`omPXaZhWXVTw~yp?n?!gV znYlKKkJxKIzYy!k6+=GPrV(g0P89o_TVT1aedguCKDkxGPOXl(qTy=Nk6x63;>vyL`MDS4a$XT^`-`^h zPGXac<|`l3!x241^@w|tvG-vIVG$h)l_$hAYU3KqdLwvckap+CD8q(Vq3(8>bf10j zz<0+!D>PVZNP4T+P?zaEQTO~ie1x^ol%3E>@&Gir@dFUpG!gDQ;!A&mcW{PM>P>oh z8M-MhDK0eQ`{1Hur7JMHgOPm+wRt@I*WGA`@z>e@t!g zk-aq5A<{X({F}1fmylS`xI9ik2%MU1RQeZM+oa4}6|H@rj+`K>>$tpx#o4Hiypg$# zGv{K714c|q&*S({j4t6QmXC@2T1l%>T=OjJV4lmZ;2Pz4?|aqr;5Rpsc*prK&8D6` zkaTl$@gixx++*=y)bBPs1+j7L0IG-LN-=<&;AYZkiINI5=U7&J{&g}F6%3(ua<$S^ zSn?hMbsYr8yT3{iurXLi#STTFo^Py?(jh0tBbrgaRe$=n^rHIowws0sK6g z+?EELzmV1tFa2F}FV%52H;)!iCgl^W2SSq~_X?$%4b+MsDq>B^k)hkVKndYMM6GjK zYYX#p9Uh>s6x$$QLt{M_?XAD>SAXG_(ZHO%K6^nn~!^Ur!7(x*omc4`RI} zwt-MS5NJbw?k8W(Gd;I}-OPJwyp0+$hn2{E@2P3xq=cw#qlhSBP6jJrlmbE7w`0~Y zgEm#kPpsqR(X1!6JCtVIwdTg(EX4&n=vWem>oK*X510MWJ~4$mRjV4{ zM?h~$VG`|5(y&Mp3++}8-mKYk=OeOj35I6YGawzwZjiCRI)`X)jD=UP1wrcNcTR01PUBG#S}D*krMdh4#a7-lY2_+O)%z~L7A!Dl|H94 ztPa?+5(O@O)LBA?JFLjHqAixS)+4PdmNc;0Nov-w-H=y)P1_^!2W&a~`9?8GepNtJ z1$!l~@*^OEuTI}yntr#c;X06(9V6c?ksfcAC^Jmr^Bn^(X40OEl<(Sj|KACfy1F#D zDVuw1Ssp@H$s>3RNe4LEisEN;K<=EZ2OSH~)hx7r{JnPrDeK-_u;s!{Er9lm>GTu5 z5HTKlF$Ycs(ZbTEery9Vyx{r z)SdoC|AZd*l$HZXMH+Tpizi86C| z^&X|t(-dB+{zKZh0ak2H3~0_W`xntsnL550=FO|f-!W2(r)Me=oGgxFN|E||O8iM6 zVgi#h@*d1ZjyR8h8=|cW!^8>lbC?`zY&-f95PI$-J5lE)G1}+cjVa=xs7ZhI@8f10 z1@9~yp;M#dLV|(&41zi~c%v%2$M@BYd9DAdVQW-_LoqdF72dFlh$euw#pK5+fLr3# ze1^4;5s{VUvFiWG~9K32@rv0Up%P`|GvTC;58CE-^R z^K#3N@2e@Sk#}GuM!oh4i4Vr6(j59J3Uo>z8Le{re$PmMNSG7p>e@xZ;=Cg8c7VM( z5NT=_Dq;;(6jEmGUlYx?k3ZKpVM4}$xHrB5PcYxJL~na5;zI%+c) z!rM7@R@U70`ZqUek7^hzGfgDq2zy(;f#|e=+nxZ-msmCA%7{X)4o@%_*v+rW!?rLV z?|tG`!b8X4B${$FQs(;u_N|&|szB52$Lh^bZ05g@L=IoR#belwBU5>YV)l1lWukfJ znrTI|v&yk_IA>-`X2APeuED?)%SZ~vyiqF6jLt5!)qb;<{vxG*1gAVR$Ix(H2|E>+ zpWF5Cmlz$WxJ806dt9id=GQ!rNa_s%r_XvtHB-TYI!xELIFKWLp z8^&lP{w)!MIC$zh-u{(uCyz zyfEqz!BZ3L68Dr_a&8<=PFL<%WC76y#{~gi%e-Fkpq-GuD4iUjh8b2D%Q5^#uqEmg zQ{eVXEnnG)Y`FY+%{5$<`x#Ez6uIda*bI(wSryfp6N;8T)0$qQS7=LGG*B{mJpv5! zg=$7r2W32=g*vHQ`;l?qaX=h_S|VkIMrMb}*-P=jWc!{PnrK;SZjT{xE||hjgPn^t zFK>km^3QP;0UIH`7w49-ISPaUFc(qLo6>lgt%fOB)};~XC-qPE!rn1NmkRb6JJ4>O zX}?OOa=Z2ehx6BHfh5&N%%`r;R^+SMu2u8w8{BZx&8!@53xck+8~04<&u?F*=}P`A zuu0jv_5b<&3C8NfB;XN1ruNnLM{QGMG*U@n7_?kHQq`O@G0Y6@5R>6uYXYcJKLVCb zV#KnhCEVpHhT?aWvlIsD3{vsboPq*|3Zp+9z!y$g{wP=`^cR*~mIeDWgwVSg(=fQe zsbCUrUDP&5!^T>op|n~^{H{eVW30F($)c44j-ZxyE*V8m#`>*$q{N$&aqRS(z~z8J z#<$n?aa2x05wlYe#GDIvA6YULP=1>o63qhdj1iaQW2tl?#n_u7q$pBlpYw@3((!gOzld|=yO zC%&U+n6J5>iVUv*%8}YH1Jw!P8tk=&4Qu#=*3*yNj8UX{K6#l*H|J+}&QcK(>b~O= zZ4>TueB3;D5{2$TM$L`WlAJjiHlBf)6WpP1BkgHA2i)C0@Zud!5Xx@u@Kws@rVRqOX;zXKIFmS-o~ z-uI(8pLnXbudR1J+4*g&x>X)&JI9i2ohC&0jauA&i(3QMTV-;-5XmAk<_G~s)_;^X zNOz@0_31*f7(zRdSXr+HY=0~`+ZGDrALcfI#TAr)8+lKSJ7pLL93Ke?c;E3#*LvQz z=sP84D#%$iow^K!Y3t4XsxxG=RiQDICua*aA?X``cg>bcI;5RZsn#t_7sndL_Gbcc zCmPgA!@8s;E^LjFu09*Zl7={WC>OC$AAakAu>m7k`!pxpWrUwKvMJ#n3gRlrGx`{~ zJkm18S1)oV3K(6pbeDNKs&iXDpt7kFrP8xba9>W9`a8{ohugwBmcn0m<)ks?LCwwQ zj1^`;r`3MO8U4oHuWa_;Ysbi_g{hu~KSbv1xYg!WL`Pj+%AKIKLpRkh7(cG~7fSLs zTLv$*bK{t((|vq@jUrthHCLM?QXirj&cBjMm+v8MpAzV5Ccecy0*JwTJBib(>QN1W zoh0LoU+Sy_0S=!JxM0wxeuAB5h_q#ZxxUk7q?d+(WT~zO0Dnl$O+>MfXy(rw?{bTX ztQRE-w;dJxPEU^&hW$_j&O2f-zJsOqDa#=2S(=Queh2{vxl!@Ll0evb1Q((FXfM8er_#AUqKwt`S%9#kC@( z!)xkX+{RgpW(T8fct9^H$_$KwVT^0g(;A53 zk<+Ra(J3xX2{5}U)^^KoO&$vm?JrIg2*TfDi1~D~+T)ro^hfU`on=eVyh>dB)n|-r zz_rH!U?XEwmVLfKGW(lF!_Y)hSU@P83=1ddWZd(Djowp*)Y{ec%gD2?4x*IVCxr)l zjX?v?OH;68$Ry1}$MX^oc}Ak+bkROcnqDKZZAMMOE5`7QC~9P#liaXq(HQ-hr(ixs0{0OZ$Q$q2W3 z3f>k++shCwb`JKZ=3XEMz)#0PyOdq&0zslO%Qj4 +
+
+ +
+
diff --git a/src/TestWebsites/NET45/Test_Website_NET45/Views/Home/Index.cshtml b/src/TestWebsites/NET45/Test_Website_NET45/Views/Home/Index.cshtml index d1378da35..33cc843d0 100644 --- a/src/TestWebsites/NET45/Test_Website_NET45/Views/Home/Index.cshtml +++ b/src/TestWebsites/NET45/Test_Website_NET45/Views/Home/Index.cshtml @@ -11,6 +11,8 @@

Foreign language test.

+

Strange name

+

Cropped

@@ -201,18 +203,6 @@

Color Profiles

- @*
-
-
-

CMYK original jpg

- -
-
-

sRGB original jpg

- -
-
-
*@
@@ -233,4 +223,4 @@
-
+ \ No newline at end of file diff --git a/src/TestWebsites/NET45/Test_Website_NET45/config/imageprocessor/security.config b/src/TestWebsites/NET45/Test_Website_NET45/config/imageprocessor/security.config index 05f9ed734..78b957605 100644 --- a/src/TestWebsites/NET45/Test_Website_NET45/config/imageprocessor/security.config +++ b/src/TestWebsites/NET45/Test_Website_NET45/config/imageprocessor/security.config @@ -1,14 +1,15 @@  - - - - - - - - - - - - - + + + + + + + + + + + + + +