CFPDF/processDDX problems with sandbox security

    Posted At : April 5, 2008 5:53 AM

Earlier this week I was working on an app that required some basic PDF manipulation with CFPDF and processDDX. The code worked fine on my server, but threw the following error when deployed to the hosting environment.

500
ROOT CAUSE:
java.lang.NoClassDefFoundError: Could not initialize class com.adobe.internal.ddxm.io.Document
   at coldfusion.pdf.PDFDocOperation.getDDXMap(PDFDocOperation.java:956)
   at coldfusion.pdf.PDFDocOperation.processDDX(PDFDocOperation.java:1099)
   at coldfusion.tagext.lang.PDFTag.doEndTag(PDFTag.java:976)
   at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2662)
   at cftest22ecfm1476995377.runPage(D:\Websites\test\new3\test2.cfm:33)
   at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196)
   at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:370)
   at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
   at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:279)
   at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)
   at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
   at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)
   at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
   at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:74)
   at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
   at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
   at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
   at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
   at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
   at coldfusion.CfmServlet.service(CfmServlet.java:175)
   at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
   at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
   at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
   at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
   at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
   at com.seefusion.SeeFusion.doFilter(SeeFusion.java)
   at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
   at jrun.servlet.FilterChain.service(FilterChain.java:101)
   at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
   at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
   at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)
   at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
   at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
   at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
   at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
   at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
   at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)



javax.servlet.ServletException: ROOT CAUSE:
java.lang.NoClassDefFoundError: Could not initialize class com.adobe.internal.ddxm.io.Document
   at coldfusion.pdf.PDFDocOperation.getDDXMap(PDFDocOperation.java:956)
   at coldfusion.pdf.PDFDocOperation.processDDX(PDFDocOperation.java:1099)
   at coldfusion.tagext.lang.PDFTag.doEndTag(PDFTag.java:976)
   at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2662)
   at cftest22ecfm1476995377.runPage(D:\Websites\test\new3\test2.cfm:33)
   at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196)
   at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:370)
   at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
   at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:279)
   at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)
   at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
   at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)
   at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
   at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:74)
   at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
   at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
   at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
   at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
   at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
   at coldfusion.CfmServlet.service(CfmServlet.java:175)
   at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
   at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
   at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
   at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
   at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
   at com.seefusion.SeeFusion.doFilter(SeeFusion.java)
   at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
   at jrun.servlet.FilterChain.service(FilterChain.java:101)
   at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
   at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
   at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)
   at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
   at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
   at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
   at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
   at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
   at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)

   at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:70)
   at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
   at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
   at com.seefusion.SeeFusion.doFilter(SeeFusion.java)
   at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
   at jrun.servlet.FilterChain.service(FilterChain.java:101)
   at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
   at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
   at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)
   at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
   at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
   at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
   at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
   at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
   at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)

Mathew Ford from Ayera Technologies pointed out that it may be related to sandbox security.

Once sandbox security was turned off, the page worked like a charm. While sandbox security was on, even with no restrictions the templte would throw an error.

Here is the test code:

<!--- Create Test PDF --->
<cfdocument format="pdf" name="pdfSample">
Test document
</cfdocument>
<cfpdf action="write" overwrite="yes" source="pdfSample" destination="#getdirectoryfrompath(getCurrentTemplatePath())#sample_empty.pdf" >

<!--- Create in/out structure for processDDX --->
<cfset in=StructNew()>
<cfset in.SourceFile="sample_empty.pdf">
<cfset out=StructNew()>
<cfset out.DestinationFile="sample_ddx.pdf">

<!--- Create DDX code --->
<cfsavecontent variable="theDDX">
<?xml version="1.0" encoding="UTF-8"?>
<DDX xmlns="http://ns.adobe.com/DDX/1.0/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ns.adobe.com/DDX/1.0/ coldfusion_ddx.xsd">

   <PDF result="DestinationFile">
<Watermark rotation="0" opacity="100%" horizontalOffset="-215pt" verticalOffset="-360pt" showWhenPrinting="true">
<StyledText>
<p font-size="8pt" color="black" font="Arial">Name:<span font-size="10pt" color="black" font="Freestyle Script">Shlomy Gantz</span></p>
<p font-size="8pt" color="black" font="Arial">Company: BlueBrick</p> <p font-size="8pt" color="black" font="Arial">Date:<cfoutput>#dateformat(now(),"mm/dd/yyyy")# #timeformat(now(),"medium")#</cfoutput></p>
<p font-size="8pt" color="black" font="Arial">Transaction ID: 1ED3477617263721CADS6763</p>
</StyledText>
</Watermark>
<PDF source="SourceFile"/>
</PDF>
</DDX>
</cfsavecontent>

<!--- Process the DDX --->
<cfpdf action="processddx" ddxfile="#theDDX#" inputfiles="#in#" outputfiles="#out#" name="ddxRet">

<!--- Show the results --->
<cfdump var="#ddxRet#" label="DDX return information">
<BR>
<a href="sample_ddx.pdf">sample_ddx.pdf</a>
<BR>


I was showing off Adobe AIR (formerly apollo) to a client, trying to create a simple file upload mini app. I followed the documentation, but was constantly getting the following error whenever I tried to upload.

Error #2044: Unhandled IOErrorEvent:. text=Error #2038: File I/O Error.
	at AIRFileUpload$iinit()
	at _AIRFileUpload_mx_managers_SystemManager/create()
	at mx.managers::SystemManager/::initializeTopLevelWindow()
	at mx.managers::SystemManager/::docFrameHandler()

I finally found the following technote which led me to the missing ingredient:

request.method = URLRequestMethod.POST;


Once I added that my application was working just fine.



Here is the code:

AIRFileUpload.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" height="150" width="300">
<mx:Script>
   <![CDATA[
         
         import flash.net.FileReference;
         import flash.events.*;

         private var fileRef:FileReference = new FileReference();Çspan style='color: #808080'ÈÇemÈ //Used to hold the file we are uploading
Ç/emÈÇ/spanÈ         private var uploadURL:String = "http://127.0.0.1/projects/air/AirFileUpload/bin/upload.cfm";Çspan style='color: #808080'ÈÇemÈ // URL for server side upload script
Ç/emÈÇ/spanÈ         
         [Bindable]
         private var statusMsg:String = "No file Selected";Çspan style='color: #808080'ÈÇemÈ // Used in status label
Ç/emÈÇ/spanÈ         
         
         /* Activate the OS file selection menu */
         private function selectFile():void {
         
                     try
                     {
                      var success:Boolean = fileRef.browse();
                      fileRef.addEventListener(Event.SELECT, selectHandler);
                     }
                     catch (error:Error)
                     {
                        trace("Unable to browse for files.");
                     
                     }
                  }
         
         
         /* Uploads the file to the server */
         private function uploadFile():void {

                  var request:URLRequest = new URLRequest();
                   request.url = uploadURL;
                   request.method=URLRequestMethod.POST;
         
                try
                   {
                      fileRef.upload(request,"Filedata");
                   fileRef.addEventListener(Event.COMPLETE, completeHandler);
                   statusMsg="Uploading...";
                   }
                   catch (error:Error)
                   {
                   statusMsg = "Unable to upload file.";
                   }
                  }      
   
         
            private function selectHandler(event:Event):void {
               statusMsg = "Selected " + fileRef.name;
               btnUpload.enabled=true;
            }         


            private function completeHandler(event:Event):void
            {
             statusMsg = "File Uploaded";
             btnUpload.enabled=false;
            }
      

   ]]>
</mx:Script>

   <mx:VBox width="100%" height="100%">
      <mx:Form>
         <mx:FormHeading label="Uploading a file to a remote server" />
   
         <mx:FormItem label="1.">
            <mx:Button click="selectFile()" label="Select A file" horizontalCenter="0" id="btnSelect" />
         </mx:FormItem>
         <mx:FormItem label="2.">
            <mx:Button click="uploadFile()" label="Upload" horizontalCenter="0" enabled="false" id="btnUpload" />
         </mx:FormItem>
      </mx:Form>
      <mx:Label text="Status: {statusMsg}" />
   </mx:VBox>

</mx:WindowedApplication>

upload.cfm
<cffile action="upload" filefield="Filedata" destination="#ExpandPath('.')#" nameconflict="OVERWRITE" />


A client of mine asked me the other day to remove the toolbar from PDF files displayed in their application. I quickly found that you can modify the URL to the PDF file from:

http://www.mysite.com/myfile.pdf

to:

http://www.mysite.com/myfile.pdf#toolbar=0

The following document on Adobe's site provides more information and additional parameters that can be set.

Powered by BlogCFC

HostMySite.com Web Hosting Provided by www.HostMySite.com

Aggregated by fullasagoog.com
[Valid RSS]

Add to Google