3 Stimmen

Remote-SWF in der AIR Security Sandbox ausführen

Ich versuche, eine externe SWF-Datei herunterzuladen und sie innerhalb der AIR-Sicherheitssandbox auszuführen.

Dies ist der Code der AIR-Anwendung:

public class Downloader extends Sprite
{

    private static const REMOTE_FILE:URLRequest = new URLRequest("http://myserver.com/downloadable.swf");
    private var _main:NativeWindow;

    public function Downloader()
    {
        var loader:URLLoader = new URLLoader(REMOTE_FILE);
        loader.dataFormat = URLLoaderDataFormat.BINARY;
        loader.addEventListener(Event.COMPLETE, downloadComplete);
    }

    private function downloadComplete(e:Event):void{
        var ba:ByteArray = e.target.data;
        var stream:FileStream = new FileStream();
        var file:File = File.applicationStorageDirectory.resolvePath("downloadable.swf");
        stream.open(file, FileMode.WRITE);
        stream.writeBytes(ba);
        stream.close();

        loadAndRunSwf();
    }

    private function loadAndRunSwf(){       
        this._main = new NativeWindow();
        this._main.width = 1024;
        this._main.height = 768;

                    ////obsolete?
        //var context:LoaderContext = new LoaderContext();
        //context.allowLoadBytesCodeExecution = true;
        //context.applicationDomain = ApplicationDomain.currentDomain;  

        var file:File = File.applicationStorageDirectory.resolvePath("downloadable.swf");
        var loader:Loader = new Loader();
        loader.load(new URLRequest(file.url)/*,context*/);

        this._main.stage.addChild(loader);
        this._main.activate();
    }
}

Code der herunterladbaren.swf:

public class Downloadable extends Sprite
{
    private var _btn:Button = new Button();
    private var _baseFolder:File = new File("app-storage:/");

    public function downloadable_test()
    {
        this.addChild(_btn);
        _btn.label = "access Harddisk";
                    ...
    }
}

so jetzt, wenn ich Downloader ausführen, wird es die swf herunterladen und versuchen, es auszuführen, aber ich werde eine Ausnahme in Downloadable auf die Zeile erhalten

    private var _baseFolder:File = new File("app-storage:/");

den Fehler:

SecurityError: file
at runtime::SecurityManager$/checkPrivilegeForCaller()

Was muss ich also tun, um solche Sicherheitsfehler zu vermeiden? Ich möchte, dass meine Remote-SWF als nativer Code behandelt wird, der in der gleichen Sicherheits-Sandbox läuft wie der AIR-Code.

1voto

Ich bin mir bei Android nicht sicher, aber für den regulären Webplayer müssen Sie SecurityDomain.currentDomain für die securityDomain des Loader-Kontexts angeben, damit der geladene Code in Bezug auf die Berechtigungen dem Loader gleichgestellt wird. Beachten Sie auch, dass sich Flash Player aus unerklärlichen Gründen beschwert, wenn Sie SecurityDomain beim Laden aus dem Dateisystem auf dem PC verwenden.

Wie kompliziert auch immer, die Sicherheit des Flash Players ist oft eine Sicherheit durch Unklarheit... Wenn es also nicht so funktioniert, wie Sie es kodiert haben, versuchen Sie Loader.loadBytes() als "Workaround".

0voto

chungho Punkte 1
function loadAndRunSwf()
{
    var context:LoaderContext=new LoaderContext(false);

    context.allowCodeImport=true;

    var ba:ByteArray=new ByteArray();
    var file:File = File.applicationStorageDirectory.resolvePath("downloadable.swf");
    var fileStream:FileStream=new FileStream();
    var loader:Loader = new Loader();

    fileStream.open(file,"read");
    fileStream.readBytes(ba);
    ba.position=0;
    loader.loadBytes(ba,context);
    this._main = new NativeWindow();
    this._main.width = 1024;
    this._main.height = 768;
    this._main.stage.addChild(loader);
    this._main.activate();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X