// Copyright � 2004-2007 ASERT. Released under the Canoo Webtest license.
package com.canoo.webtest.plugins.pdftest;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.canoo.webtest.engine.StepExecutionException;
import com.canoo.webtest.engine.StepFailedException;
import com.canoo.webtest.plugins.pdftest.htmlunit.PDFEncryptionPermission;
import com.canoo.webtest.plugins.pdftest.htmlunit.PDFPage;
/**
* @author Paul King
* @author Marc Guillemot
* @webtest.step
* category="PDF"
* name="pdfVerifyEncryptionPermissions"
* alias="verifyPdfEncryptionPermissions"
* description="This step verifies encryption permissions of an encrypted <key>pdf</key> document."
*/
public class PdfVerifyEncryptionPermissionsStep extends AbstractVerifyPdfStep {
private String fAllow;
private String fDeny;
private final List fAllowPermissions = new ArrayList();
private final List fDenyPermissions = new ArrayList();
/**
* @param allow
* @webtest.parameter required="yes/no"
* description="The comma-separated list of permissions which must be allowed (from
* 'printing', 'degradedPrinting', 'modifyContents', 'copy', 'modifyAnnotations', 'fillIn',
* 'screenReaders', 'assembly').
* Must be set if <em>deny</em> is not set."
*/
public void setAllow(final String allow) {
fAllow = allow;
}
public String getAllow() {
return fAllow;
}
/**
* @param deny
* @webtest.parameter required="yes/no"
* description="The comma-separated list of permissions which must be disallowed
* (from 'printing', 'degradedPrinting', 'modifyContents', 'copy', 'modifyAnnotations', 'fillIn',
* 'screenReaders', 'assembly').
* Must be set if <em>allow</em> is not set."
*/
public void setDeny(final String deny) {
fDeny = deny;
}
public String getDeny() {
return fDeny;
}
protected void verifyParameters() {
super.verifyParameters();
paramCheck(getAllow() == null && getDeny() == null, "One of 'allow' or 'deny' must be set.");
parsePermissions(fAllowPermissions, getAllow());
parsePermissions(fDenyPermissions, getDeny());
}
void parsePermissions(final List fillIn, final String permissions) {
if (StringUtils.isEmpty(permissions)) {
return;
}
final String[] tabPermissions = permissions.split("\\W+");
for (int i = 0; i < tabPermissions.length; i++) {
final String name = tabPermissions[i];
final PDFEncryptionPermission pdfPermission = PDFEncryptionPermission.get(name);
if (pdfPermission != null)
fillIn.add(pdfPermission);
else
throw new StepExecutionException("Unknown PDF permission: \"" + name + "\"", this);
}
}
protected void verifyPdf(final PDFPage pdfPage) {
checkPermissions(pdfPage, fAllowPermissions, true);
checkPermissions(pdfPage, fDenyPermissions, false);
}
private void checkPermissions(final PDFPage pdfPage, final List permissions, final boolean expectedValue) {
for (final Iterator iter = permissions.iterator(); iter.hasNext();) {
final PDFEncryptionPermission permission = (PDFEncryptionPermission) iter.next();
final boolean actualVallue = pdfPage.hasPermission(permission);
if (actualVallue != expectedValue)
{
final StringBuffer sb = new StringBuffer("Incorrect encryption permission found: ");
sb.append(permission.getName());
sb.append(" is ");
if (expectedValue)
sb.append("not ");
sb.append("set");
throw new StepFailedException(sb.toString(), this);
}
}
}
}