выполнить удаленный SWF-файл в изолированной программной среде безопасности AIR - PullRequest
3 голосов
/ 13 июня 2011

Я пытаюсь загрузить внешний SWF-файл и запустить его в изолированной программной среде безопасности AIR.

это код приложения AIR:

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();
    }
}

Код файла downloadable.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";
                    ...
    }
}

так что теперь, если я запустил Downloader, он загрузит SWF и попытается запустить его, но я получу исключение в разделе Загружаемые на линии

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

ошибка:

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

Итак - что мне нужно сделать, чтобы предотвратить такие ошибки безопасности? Я хочу, чтобы мой удаленный SWF-файл обрабатывался как собственный код, работающий в той же изолированной программной среде безопасности, что и код AIR.

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Я не уверен насчет Android, но для обычного веб-плеера вам необходимо указать SecurityDomain.currentDomain для securityDomain контекста загрузчика, чтобы загруженный код считался равным загрузчику с точки зрения разрешений.Также обратите внимание, что по причинам, которые невозможно объяснить, если вы используете SecurityDomain при загрузке из файловой системы на ПК, Flash Player будет жаловаться.

Несмотря на всю сложность, безопасность Flash Player часто является защитой по незаметности ... Итак,если он не работает так, как вы его запрограммировали, попробуйте Loader.loadBytes () «обходной путь».

0 голосов
/ 13 апреля 2012
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();
}
...