JSUtils.java 12.4 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.internal.pdftoolkit.core.exceptions.PDFIOException
 *  com.adobe.internal.pdftoolkit.core.exceptions.PDFInvalidDocumentException
 *  com.adobe.internal.pdftoolkit.core.exceptions.PDFSecurityException
 *  com.adobe.internal.pdftoolkit.core.types.ASName
 *  com.adobe.internal.pdftoolkit.pdf.document.PDFCatalog
 *  com.adobe.internal.pdftoolkit.pdf.document.PDFDocument
 *  com.adobe.internal.pdftoolkit.pdf.impl.FieldAndAnnotationImpl
 *  com.adobe.internal.pdftoolkit.pdf.interactive.action.PDFAction
 *  com.adobe.internal.pdftoolkit.pdf.interactive.action.PDFActionJavaScript
 *  com.adobe.internal.pdftoolkit.pdf.interactive.action.PDFAdditionalActions
 *  com.adobe.internal.pdftoolkit.pdf.interactive.action.PDFAdditionalActionsField
 *  com.adobe.internal.pdftoolkit.pdf.interactive.action.PDFJavaScriptEvent
 *  com.adobe.internal.pdftoolkit.pdf.interactive.annotation.PDFAnnotation
 *  com.adobe.internal.pdftoolkit.pdf.interactive.annotation.PDFAnnotationIterator
 *  com.adobe.internal.pdftoolkit.pdf.interactive.forms.PDFField
 *  com.adobe.internal.pdftoolkit.pdf.interactive.forms.PDFFieldList
 *  com.adobe.internal.pdftoolkit.pdf.interactive.forms.PDFFieldNode
 *  com.adobe.internal.pdftoolkit.pdf.interactive.forms.PDFInteractiveForm
 *  com.adobe.internal.pdftoolkit.services.javascript.JavaScriptHandler
 *  com.adobe.internal.pdftoolkit.services.javascript.extension.JSADBEProvider
 *  com.adobe.internal.pdftoolkit.services.javascript.extension.JSAppProvider
 *  com.adobe.internal.pdftoolkit.services.javascript.extension.JSExtensionOptions
 *  com.adobe.internal.pdftoolkit.services.permissions.PermissionsManager
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.fd.forms.internal.utils;

import com.adobe.fd.forms.internal.utils.JSADBEProviderImpl;
import com.adobe.fd.forms.internal.utils.JSAppProviderImpl;
import com.adobe.fd.forms.internal.utils.ServiceUtil;
import com.adobe.fd.forms.internal.utils.Utils;
import com.adobe.internal.pdftoolkit.core.exceptions.PDFIOException;
import com.adobe.internal.pdftoolkit.core.exceptions.PDFInvalidDocumentException;
import com.adobe.internal.pdftoolkit.core.exceptions.PDFSecurityException;
import com.adobe.internal.pdftoolkit.core.types.ASName;
import com.adobe.internal.pdftoolkit.pdf.document.PDFCatalog;
import com.adobe.internal.pdftoolkit.pdf.document.PDFDocument;
import com.adobe.internal.pdftoolkit.pdf.impl.FieldAndAnnotationImpl;
import com.adobe.internal.pdftoolkit.pdf.interactive.action.PDFAction;
import com.adobe.internal.pdftoolkit.pdf.interactive.action.PDFActionJavaScript;
import com.adobe.internal.pdftoolkit.pdf.interactive.action.PDFAdditionalActions;
import com.adobe.internal.pdftoolkit.pdf.interactive.action.PDFAdditionalActionsField;
import com.adobe.internal.pdftoolkit.pdf.interactive.action.PDFJavaScriptEvent;
import com.adobe.internal.pdftoolkit.pdf.interactive.annotation.PDFAnnotation;
import com.adobe.internal.pdftoolkit.pdf.interactive.annotation.PDFAnnotationIterator;
import com.adobe.internal.pdftoolkit.pdf.interactive.forms.PDFField;
import com.adobe.internal.pdftoolkit.pdf.interactive.forms.PDFFieldList;
import com.adobe.internal.pdftoolkit.pdf.interactive.forms.PDFFieldNode;
import com.adobe.internal.pdftoolkit.pdf.interactive.forms.PDFInteractiveForm;
import com.adobe.internal.pdftoolkit.services.javascript.JavaScriptHandler;
import com.adobe.internal.pdftoolkit.services.javascript.extension.JSADBEProvider;
import com.adobe.internal.pdftoolkit.services.javascript.extension.JSAppProvider;
import com.adobe.internal.pdftoolkit.services.javascript.extension.JSExtensionOptions;
import com.adobe.internal.pdftoolkit.services.permissions.PermissionsManager;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.AllPermission;
import java.security.CodeSource;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.ProtectionDomain;
import java.security.cert.Certificate;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JSUtils {
    private static final String ACROBAT_JS_FILE = "AForm.js";
    private static final String FORMAT = "format";
    private static final Logger logger = LoggerFactory.getLogger(JSUtils.class);

    public static void executeEventsAndGenerateAppearances(PDFDocument oPdfDocument, boolean executeEvents) throws Exception {
        JavaScriptHandler jsHandler = null;
        HashMap oldValueMap = null;
        if (executeEvents) {
            jsHandler = JSUtils.getJSHandler(oPdfDocument);
            JSUtils.runCalculateEvents(oPdfDocument, jsHandler);
            JSUtils.runEventsOfType(oPdfDocument, jsHandler, "format");
            oldValueMap = JSUtils.setFormattedValuesAndGetOriginalFieldValues(oPdfDocument, jsHandler);
        }
        Utils.generateAppearances(oPdfDocument);
        if (executeEvents) {
            JSUtils.setOriginalValuesBackOnField(oPdfDocument, oldValueMap);
        }
    }

    private static void runCalculateEvents(PDFDocument oPdfDocument, JavaScriptHandler jsHandler) throws PDFInvalidDocumentException, PDFIOException, PDFSecurityException {
        PDFFieldList coList = jsHandler.getJavaScriptHandlerDocument().requireCatalog().getInteractiveForm().getCalculationOrder();
        if (coList != null) {
            Iterator it = coList.iterator(true);
            while (it.hasNext()) {
                PDFAction action;
                PDFField jsField = (PDFField)it.next();
                PDFAdditionalActions pdfAdditionalActions = jsField.getAdditionalActions();
                PDFAdditionalActionsField aas = null;
                if (pdfAdditionalActions == null || !(pdfAdditionalActions instanceof PDFAdditionalActionsField) || (action = (aas = (PDFAdditionalActionsField)pdfAdditionalActions).getActionOnCalculate()) == null || !(action instanceof PDFActionJavaScript)) continue;
                try {
                    jsHandler.execute(new PDFJavaScriptEvent(jsField, (PDFActionJavaScript)action, ASName.k_C.asString()));
                }
                catch (Exception e) {
                    logger.error("Failed to run calculate events on field", (Throwable)e);
                }
            }
        }
    }

    private static void runEventsOfType(PDFDocument oPdfDocument, JavaScriptHandler jsHandler, String eventType) throws Exception {
        PDFInteractiveForm acroForm = oPdfDocument.getInteractiveForm();
        if (acroForm == null) {
            return;
        }
        Iterator fieldIterator = acroForm.iterator(true);
        PDFField pdfField = null;
        while (fieldIterator.hasNext()) {
            pdfField = (PDFField)fieldIterator.next();
            PDFAdditionalActions pdfAdditionalActions = pdfField.getAdditionalActions();
            PDFAdditionalActionsField aas = null;
            if (pdfAdditionalActions != null && pdfAdditionalActions instanceof PDFAdditionalActionsField) {
                aas = (PDFAdditionalActionsField)pdfAdditionalActions;
                Set aasMap = aas.keySet();
                for (ASName actName : aasMap) {
                    PDFJavaScriptEvent event;
                    PDFAction additionalAction = aas.getAction(actName);
                    if (additionalAction == null || (event = new PDFJavaScriptEvent(pdfField, (PDFActionJavaScript)additionalAction, actName.asString())) == null || !eventType.equalsIgnoreCase(event.getEventName())) continue;
                    try {
                        jsHandler.execute(event);
                    }
                    catch (Exception e) {
                        logger.error("Failed to run events", (Throwable)e);
                    }
                }
                continue;
            }
            PDFAnnotationIterator annotIter = pdfField.getAnnotationsIterator();
            while (annotIter != null && annotIter.hasNext()) {
                PDFAnnotation annot = annotIter.next();
                pdfAdditionalActions = annot.getAdditionalActions();
                if (pdfAdditionalActions == null || !(pdfAdditionalActions instanceof PDFAdditionalActionsField)) continue;
                aas = (PDFAdditionalActionsField)pdfAdditionalActions;
                Set aasMap = aas.keySet();
                for (ASName actName : aasMap) {
                    PDFJavaScriptEvent event;
                    PDFAction additionalAction = aas.getAction(actName);
                    if (additionalAction == null || (event = new PDFJavaScriptEvent(pdfField, (PDFActionJavaScript)additionalAction, actName.asString())) == null || !eventType.equalsIgnoreCase(event.getEventName())) continue;
                    try {
                        jsHandler.execute(event);
                    }
                    catch (Exception e) {
                        logger.error("Failed to run events", (Throwable)e);
                    }
                }
            }
        }
    }

    private static HashMap setFormattedValuesAndGetOriginalFieldValues(PDFDocument oPdfDocument, JavaScriptHandler jsHandler) throws Exception {
        PDFInteractiveForm acroForm = oPdfDocument.getInteractiveForm();
        if (acroForm == null) {
            return null;
        }
        HashMap<PDFFieldNode, Object> oldValueMap = null;
        if (jsHandler.getFormattedFieldValueMap() != null) {
            oPdfDocument.getInteractiveForm().setNeedAppearances(false);
            oldValueMap = new HashMap<PDFFieldNode, Object>();
            HashMap map = jsHandler.getFormattedFieldValueMap();
            for (String fieldName : map.keySet()) {
                PDFFieldNode field = jsHandler.getField(fieldName).getNode();
                Object formattedValue = map.get(fieldName);
                List fieldValue = field.getValueList();
                Object oldValue = null;
                if (fieldValue != null) {
                    oldValue = fieldValue.size() > 1 ? fieldValue : fieldValue.get(0).toString();
                }
                oldValueMap.put(field, oldValue);
                if (formattedValue == null) continue;
                field.setStringValue(formattedValue.toString());
            }
        }
        return oldValueMap;
    }

    private static void setOriginalValuesBackOnField(PDFDocument oPdfDocument, HashMap oldValueMap) throws Exception {
        PDFInteractiveForm acroForm = oPdfDocument.getInteractiveForm();
        if (acroForm == null || oldValueMap == null) {
            return;
        }
        HashMap map = oldValueMap;
        for (Object field : map.keySet()) {
            Object value;
            if (field == null || (value = map.get(field)) == null) continue;
            ((PDFFieldNode)field).setStringValue(value.toString());
        }
    }

    private static ProtectionDomain getProtectionDomain() {
        URL codebase = null;
        try {
            codebase = ServiceUtil.getTempFileManager().getTempFile().toURL();
        }
        catch (MalformedURLException e) {
            logger.error("Failed to get Pretection domain", (Throwable)e);
        }
        catch (IOException e) {
            logger.error("Failed to get Pretection domain", (Throwable)e);
        }
        CodeSource cs = new CodeSource(codebase, (Certificate[])null);
        Permissions collection = new Permissions();
        collection.add(new AllPermission());
        ProtectionDomain domain = new ProtectionDomain(cs, collection);
        return domain;
    }

    public static JavaScriptHandler getJSHandler(PDFDocument oPdfDocument) throws Exception {
        JSAppProviderImpl extensionApp = new JSAppProviderImpl();
        JSExtensionOptions extensionOptions = JSExtensionOptions.newInstance();
        extensionOptions.registerJSAppProvider((JSAppProvider)extensionApp);
        JSADBEProviderImpl extensionADBE = new JSADBEProviderImpl();
        extensionOptions.registerJSADBEProvider((JSADBEProvider)extensionADBE);
        JavaScriptHandler jsHandler = JavaScriptHandler.getRegisteredInstance((PDFDocument)oPdfDocument);
        if (jsHandler == null) {
            jsHandler = JavaScriptHandler.getInstance((PDFDocument)oPdfDocument, (InputStream)JSUtils.class.getResourceAsStream("AForm.js"), (ProtectionDomain)JSUtils.getProtectionDomain(), (PermissionsManager)PermissionsManager.newInstance((PDFDocument)oPdfDocument), (boolean)true, (JSExtensionOptions)extensionOptions);
        }
        return jsHandler;
    }
}