Question

How do I use crossdomain with ftp?

I am trying to do a "hello world" level test of FTP in Flex, but for three days now, I cannot overcome the issue with how to coerce flex into accepting my crossdomain policy - even for testing purposes. Here is my code: The exact error text follows.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="onInitialize()" layout="vertical">

<mx:Script>
<![CDATA[
  import mx.utils.*;
  import mx.controls.Alert;
  private var fileRef:FileReference;
  private var fileSize:uint;
  private var fileContents:ByteArray;
  //you need to initiate two scokets one for sending
  //commands and second for sending data to FTP Server
  //socket for sending commands to FTP
  private var s:Socket
  //responce from FTP
  private var ftpResponce:String;
  //socket for sending Data to FTP
  private var dataChannelSocket:Socket;
  //responce from FTP when sending Data to FTP
  private var dataResponce:String;
  //will hold the IP address of new socket created by FTP
  private var dataChannelIP:String;
  //will hold the Port number created by FTP
  private var dataChannelPort:int;
  private var user:String="I have the right user"; //FTP usernae
  private var pass:String="the pw is correct"; //FTP Password

  private function receiveReply(e:ProgressEvent):void {
    ftpResponce=s.readUTFBytes(s.bytesAvailable)
    var serverResponse:Number=Number(ftpResponce.substr(0, 3));
    if (ftpResponce.indexOf('227') > -1) {
      //get the ip from the string response
      var temp:Object=ftpResponce.substring(ftpResponce.indexOf("(") + 1
        , ftpResponce.indexOf(")"));
      var dataChannelSocket_temp:Object=temp.split(",");
      dataChannelIP=dataChannelSocket_temp.slice(0, 4).join(".");
      dataChannelPort=parseInt(dataChannelSocket_temp[4]) * 256 +
        int(dataChannelSocket_temp[5]);
      //create new Data Socket based on dataChannelSocket and dataChannelSocket port
      dataChannelSocket=new Socket(dataChannelIP, dataChannelPort);
      dataChannelSocket.addEventListener(ProgressEvent.SOCKET_DATA, receiveData);
    }
    //few FTP Responce Codes
    switch (String(serverResponse)) {
      case "220":
        //FTP Server ready responce
        break;
      case "331":
        //User name okay, need password
        break;
      case "230":
        //User  logged in
        break;
      case "250":
        //CWD command successful
        break;
      case "227":
        //Entering Passive Mode (h1,h2,h3,h4,p1,p2).
        break;
      default:
    }
    //for more please
    //http://http://www.altools.com/image/support/alftp/ALFTP_35_help/
    //FTP_response_codes_rfc_959_messages.htm          
    traceData(ftpResponce);
  }

  private function receiveData(e:ProgressEvent):void {
    dataResponce=dataChannelSocket.readUTFBytes(
      dataChannelSocket.bytesAvailable);
    traceData("dataChannelSocket_response—>" + dataResponce);
  }

  private function showError(e:IOErrorEvent):void {
    traceData("Error—>" + e.text);
  }

  private function showSecError(e:SecurityErrorEvent):void {
    traceData("SecurityError–>" + e.text);
  }

  private function onInitialize():void {
    Security.loadPolicyFile("http://www.myUrlIsCorrectInMyProgram.com/crossdomain.xml");
  }

  private function createRemoteFile(fileName:String):void {
    if (fileName != null && fileName != "") {
      s.writeUTFBytes("STOR " + fileName + "\n");
      s.flush();
    }
  }

  private function sendData():void {
    fileContents=fileRef.data as ByteArray;
    fileSize=fileRef.size;
    dataChannelSocket.writeBytes(fileContents, 0, fileSize);
    dataChannelSocket.flush();
  }

  //initialize when application load
  private function upLoad():void {
    fileRef=new FileReference();
    //some eventlistener
    fileRef.addEventListener(Event.SELECT, selectEvent);
    fileRef.addEventListener(Event.OPEN, onFileOpen);
    //this function connects to the ftp server
    connect();
    //send the usernae and password
    this.userName(user);
    this.passWord(pass);
    //if you want to change the directory for upload file
    this.changeDirectory("/test/"); //directory name
    //enter into PASSV Mode
    s.writeUTFBytes("PASV\n");
    s.flush();
  }

  private function onFileOpen(event:Event):void {
  }

  private function traceData(event:Object):void {
    var tmp:String="================================\n";
    ta.text+=event.toString() + "\n";
    ta.verticalScrollPosition+=20;
  }

  private function ioErrorEvent(event:IOErrorEvent):void {
    Alert.show("IOError:" + event.text);
  }

  private function selectEvent(event:Event):void {
    btn_upload.enabled=true;
    filename.text=fileRef.name;
    fileRef.load();
  }

  private function uploadFile():void {
    createRemoteFile(fileRef.name);
    sendData();
  }

  private function connect():void {
    s=new Socket("ftp.myUrlIsCorrectInMyProgram.com", 21);
    s.addEventListener(ProgressEvent.SOCKET_DATA, receiveReply);
    s.addEventListener(IOErrorEvent.IO_ERROR, showError);
    s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, showSecError);
    s.addEventListener(Event.CONNECT, onSocketConnect);
    s.addEventListener(Event.CLOSE, onSocketClose);
    s.addEventListener(Event.ACTIVATE, onSocketAtivate);
  }

  private function onSocketConnect(evt:Event):void {
    //traceData("OnSocketConnect–>"+evt.target.toString());
  }

  private function onSocketClose(evt:Event):void {
    //traceData("onSocketClose–>"+evt.target.toString());
  }

  private function onSocketAtivate(evt:Event):void {
    //traceData("onSocketAtivate–>"+evt.target.toString());
  }

  private function userName(str:String):void {
    sendCommand("USER " + str);
  }

  private function passWord(str:String):void {
    sendCommand("PASS " + str);
  }

  private function changeDirectory(str:String):void {
    sendCommand("CWD " + str);
  }

  private function sendCommand(arg:String):void {
    arg+="\n";
    s.writeUTFBytes(arg);
    s.flush();
  }
]]>

[SWF] /FTP-debug/FTP.swf - 739,099 bytes after decompression Warning: Domain www.myUrlIsCorrectInMyProgram.com does not specify a meta-policy. Applying default meta-policy 'master-only'. This configuration is deprecated. See http://www.adobe.com/go/strict_policy_files to fix this problem.

Warning: Timeout on xmlsocket://ftp.myUrlIsCorrectInMyProgram.com:843 (at 3 seconds) while waiting for socket policy file. This should not cause any problems, but see http://www.adobe.com/go/strict_policy_files for an explanation.

Warning: [strict] Ignoring policy file at xmlsocket://ftp.myUrlIsCorrectInMyProgram.com:21 due to incorrect syntax. See http://www.adobe.com/go/strict_policy_files to fix this problem.

* Security Sandbox Violation * Connection to ftp.myUrlIsCorrectInMyProgram.com:21 halted - not permitted from http://localhost/FTP-debug/FTP.swf Error: Request for resource at xmlsocket://ftp.myUrlIsCorrectInMyProgram.com:21 by requestor from http://localhost/FTP-debug/FTP.swf is denied due to lack of policy file permissions.

The "Information" at the URL's listed above is categorically unintelligable to me.

Please, someone help!

Was it helpful?

Solution

See the crossdomain spec:

http://learn.adobe.com/wiki/download/attachments/64389123/CrossDomain_PolicyFile_Specification.pdf?version=1

This covers the warning you have and can help you get this working.

OTHER TIPS

I also had the same issue but was able to fix it using the flash policy server that I downloaded from http://www.flash-resources.net/download.html. I ran this on the same machine that I have my tomcat server installed and made the call Security.loadPolicyFile("xmlsocket://:843"); from the application and it worked perfectly. No errors.

I also had the same issue but was able to fix it using the flash policy server that I downloaded from here. I ran this on the same machine that I have my tomcat server installed and made the call Security.loadPolicyFile("xmlsocket://Machine Name:843"); from the application and it worked perfectly. No errors.

Watch the typo around the Machine Name in the last post.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top