Skip to content

Commit b91576c

Browse files
Dynamic Media: Do not use Dynamic Media to generate download URLs (#123)
1 parent bae82db commit b91576c

File tree

6 files changed

+409
-14
lines changed

6 files changed

+409
-14
lines changed

changes.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@
2424
xsi:schemaLocation="http://maven.apache.org/changes/2.0.0 https://maven.apache.org/xsd/changes-2.0.0.xsd">
2525
<body>
2626

27+
<release version="2.6.0" date="not released">
28+
<action type="update" dev="sseifert" issue="123"><![CDATA[
29+
Dynamic Media: Do not use Dynamic Media to generate download URLs, unless explicitly enabled via OSGi configuration (backward-compatibility mode).
30+
Latest setups of Dynamic Media do not support downloading original binaries of images, thus Dynamic Media is only used for rendering image renditions and no longer for any downloads.<br/>
31+
<b>Breaking change:</b> With Dynamic Media, downloads are now served via AEM DAM by default. Your can restore the previous behavior by setting <code>enableDownloads</code> to true via "wcm.io Media Handler Dynamic Media Support" OSGi configuration.
32+
]]></action>
33+
</release>
34+
2735
<release version="2.5.4" date="2025-10-16">
2836
<action type="fix" dev="sseifert" issue="111">
2937
Dynamic Media with Open API: Display thumbnail of selected remote asset on load.

src/main/java/io/wcm/handler/mediasource/dam/impl/DamContext.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ public boolean isDynamicMediaEnabled() {
116116
return dynamicMediaSupportService.isDynamicMediaEnabled()
117117
// check that DM capability is enabled for the given asset
118118
&& dynamicMediaSupportService.isDynamicMediaCapabilityEnabled(isDynamicMediaAsset())
119+
// use dynamic media only for downloads if explicitly enabled
120+
&& (!(mediaArgs.isDownload() || mediaArgs.isContentDispositionAttachment()) || dynamicMediaSupportService.isEnableDownloads())
119121
// ensure DM is not disabled within MediaArgs for this media request
120122
&& !mediaArgs.isDynamicMediaDisabled();
121123
}

src/main/java/io/wcm/handler/mediasource/dam/impl/dynamicmedia/DynamicMediaSupportService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ public interface DynamicMediaSupportService {
5151
*/
5252
boolean isAemFallbackDisabled();
5353

54+
/**
55+
* @return Whether Dynamic Media should be used to deliver downloads (not recommended, backward-compatibility mode).
56+
*/
57+
boolean isEnableDownloads();
58+
5459
/**
5560
* @return Whether to validate that the renditions defined via smart cropping fulfill the requested image width/height
5661
* to avoid upscaling or white borders.

src/main/java/io/wcm/handler/mediasource/dam/impl/dynamicmedia/DynamicMediaSupportServiceImpl.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,18 @@ public class DynamicMediaSupportServiceImpl implements DynamicMediaSupportServic
8787
@AttributeDefinition(
8888
name = "Disable AEM Fallback",
8989
description = "Disable the automatic fallback to AEM-based rendering of renditions (via Media Handler) "
90-
+ "if Dynamic Media is enabled, but the asset has not the appropriate Dynamic Media metadata.")
90+
+ "if Dynamic Media is enabled, but the asset has not the appropriate Dynamic Media metadata. "
91+
+ "Please note that AEM is still used to deliver binaries for downloads even if this is activated, "
92+
+ "unless 'Enable Downloads' is activated as well (which is not recommended).")
9193
boolean disableAemFallback() default false;
9294

95+
@AttributeDefinition(
96+
name = "Enable Downloads",
97+
description = "Use Dynamic Media for downloads (for both image and non-image binaries). "
98+
+ "It is NOT recommended to enable this setting. Dynamic Media does provides reliable downloads only for non-image files, not to original binaries of images files "
99+
+ "(although this did work for older setups). Enable this option only if you know what you are doing (backward-compatibility mode).")
100+
boolean enableDownloads() default false;
101+
93102
@AttributeDefinition(
94103
name = "Validate Smart Crop Rendition Sizes",
95104
description = "Validates that the renditions defined via smart cropping fulfill the requested image width/height to avoid upscaling or white borders.")
@@ -134,6 +143,7 @@ public class DynamicMediaSupportServiceImpl implements DynamicMediaSupportServic
134143
private DynamicMediaCapabilityDetection dmCapabilityDetection;
135144
private boolean authorPreviewMode;
136145
private boolean disableAemFallback;
146+
private boolean enableDownloads;
137147
private boolean validateSmartCropRenditionSizes;
138148
private Dimension imageSizeLimit;
139149
private boolean setImageQuality;
@@ -151,6 +161,7 @@ private void activate(Config config) {
151161
this.dmCapabilityDetection = config.dmCapabilityDetection();
152162
this.authorPreviewMode = config.authorPreviewMode();
153163
this.disableAemFallback = config.disableAemFallback();
164+
this.enableDownloads = config.enableDownloads();
154165
this.validateSmartCropRenditionSizes = config.validateSmartCropRenditionSizes();
155166
this.imageSizeLimit = new Dimension(config.imageSizeLimitWidth(), config.imageSizeLimitHeight());
156167
this.setImageQuality = config.setImageQuality();
@@ -188,6 +199,11 @@ public boolean isAemFallbackDisabled() {
188199
return disableAemFallback;
189200
}
190201

202+
@Override
203+
public boolean isEnableDownloads() {
204+
return enableDownloads;
205+
}
206+
191207
@Override
192208
public boolean isValidateSmartCropRenditionSizes() {
193209
return validateSmartCropRenditionSizes;

src/test/java/io/wcm/handler/media/impl/MediaHandlerImplImageFileTypesEnd2EndDynamicMediaTest.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424

2525
import com.day.cq.dam.api.Asset;
2626

27-
import io.wcm.handler.mediasource.dam.impl.dynamicmedia.DynamicMediaPath;
2827
import io.wcm.testing.mock.aem.junit5.AemContextExtension;
2928
import io.wcm.wcm.commons.contenttype.ContentType;
3029

@@ -63,10 +62,7 @@ void testAsset_JPEG_Original_DynamicMediaDisabled() {
6362
@Override
6463
@Test
6564
void testAsset_JPEG_Original_ContentDisposition() {
66-
Asset asset = createSampleAsset("/filetype/sample.jpg", ContentType.JPEG);
67-
buildAssertMedia_ContentDisposition(asset, 100, 50,
68-
"https://dummy.scene7.com/is/content/DummyFolder/sample.jpg" + DynamicMediaPath.DOWNLOAD_SUFFIX,
69-
ContentType.JPEG);
65+
super.testAsset_JPEG_Original_ContentDisposition();
7066
}
7167

7268
@Override
@@ -242,10 +238,7 @@ void testAsset_TIFF_Original() {
242238
@Override
243239
@Test
244240
void testAsset_TIFF_Original_ContentDisposition() {
245-
Asset asset = createSampleAsset("/filetype/sample.tif", ContentType.TIFF);
246-
buildAssertMedia_ContentDisposition(asset, 100, 50,
247-
"https://dummy.scene7.com/is/content/DummyFolder/sample.tif" + DynamicMediaPath.DOWNLOAD_SUFFIX,
248-
ContentType.TIFF);
241+
super.testAsset_TIFF_Original_ContentDisposition();
249242
}
250243

251244
@Override
@@ -306,10 +299,7 @@ void testAsset_SVG_Original() {
306299
@Override
307300
@Test
308301
void testAsset_SVG_Original_ContentDisposition() {
309-
Asset asset = createSampleAsset("/filetype/sample.svg", ContentType.SVG);
310-
buildAssertMedia_ContentDisposition(asset, 100, 50,
311-
"https://dummy.scene7.com/is/content/DummyFolder/sample.svg" + DynamicMediaPath.DOWNLOAD_SUFFIX,
312-
ContentType.SVG);
302+
super.testAsset_SVG_Original_ContentDisposition();
313303
}
314304

315305
@Override

0 commit comments

Comments
 (0)