mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-10-08 14:51:49 +00:00
MNT-16381 Transformers must validate the content stream mimetype
- Addition of AbstractContentTransformer2.strictMimeTypeCheck(...) to check that the declared mimetype is the same as the Tika derived mimetype. Controlled by a new alfresco global property content.transformer.strict.mimetype.check (set to true by default). - Added the UnsupportedTransformationException to a number of transformation callers as they should have been handling it already. - Modified DifferrentMimeTypeTest to test the new strictMimeTypeCheck. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@128168 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -70,6 +70,7 @@ public abstract class AbstractContentTransformer2 extends AbstractContentTransfo
|
||||
private ContentTransformerRegistry registry;
|
||||
private boolean registerTransformer;
|
||||
private boolean retryTransformOnDifferentMimeType;
|
||||
private boolean strictMimeTypeCheck;
|
||||
MetadataExtracterConfig metadataExtracterConfig;
|
||||
/**
|
||||
* A flag that indicates that the transformer should be started in it own Thread so
|
||||
@@ -248,6 +249,11 @@ public abstract class AbstractContentTransformer2 extends AbstractContentTransfo
|
||||
targetMimetype, reader.getSize(), options);
|
||||
}
|
||||
|
||||
// MNT-16381: check the mimetype of the file supplied by the user
|
||||
// matches the sourceMimetype of the reader. Intermediate files are
|
||||
// not checked.
|
||||
strictMimeTypeCheck(reader, options);
|
||||
|
||||
// Check the transformability
|
||||
checkTransformable(reader, writer, options);
|
||||
|
||||
@@ -338,10 +344,10 @@ public abstract class AbstractContentTransformer2 extends AbstractContentTransfo
|
||||
String differentType = getMimetypeService().getMimetypeIfNotMatches(reader.getReader());
|
||||
|
||||
// Report the error
|
||||
if(differentType == null)
|
||||
if (differentType == null)
|
||||
{
|
||||
transformerDebug.debug(" Failed", e);
|
||||
throw new ContentIOException("Content conversion failed: \n" +
|
||||
transformerDebug.debug(" Failed", e);
|
||||
throw new ContentIOException("Content conversion failed: \n" +
|
||||
" reader: " + reader + "\n" +
|
||||
" writer: " + writer + "\n" +
|
||||
" options: " + options.toString(false) + "\n" +
|
||||
@@ -432,6 +438,26 @@ public abstract class AbstractContentTransformer2 extends AbstractContentTransfo
|
||||
}
|
||||
}
|
||||
|
||||
private void strictMimeTypeCheck(ContentReader reader, TransformationOptions options)
|
||||
throws UnsupportedTransformationException
|
||||
{
|
||||
if (strictMimeTypeCheck && depth.get() == 1)
|
||||
{
|
||||
String differentType = getMimetypeService().getMimetypeIfNotMatches(reader.getReader());
|
||||
if (differentType != null)
|
||||
{
|
||||
String fileName = transformerDebug.getFileName(options, true, 0);
|
||||
String readerSourceMimetype = reader.getMimetype();
|
||||
String message = "Transformation of ("+fileName+
|
||||
") has not taken place because the declared mimetype ("+
|
||||
readerSourceMimetype+") does not match the detected mimetype ("+
|
||||
differentType+").";
|
||||
logger.warn(message);
|
||||
throw new UnsupportedTransformationException(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels <code>task</code> and closes content accessors
|
||||
*
|
||||
@@ -630,4 +656,14 @@ public abstract class AbstractContentTransformer2 extends AbstractContentTransfo
|
||||
{
|
||||
this.retryTransformOnDifferentMimeType = retryTransformOnDifferentMimeType;
|
||||
}
|
||||
|
||||
public boolean getStrictMimeTypeCheck()
|
||||
{
|
||||
return strictMimeTypeCheck;
|
||||
}
|
||||
|
||||
public void setStrictMimeTypeCheck(boolean strictMimeTypeCheck)
|
||||
{
|
||||
this.strictMimeTypeCheck = strictMimeTypeCheck;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user