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:
Alan Davis
2016-06-15 16:11:15 +00:00
parent c4c30abae0
commit 60a8b718bc
8 changed files with 177 additions and 69 deletions

View File

@@ -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;
}
}