Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не получается победить securityError (http://www.flasher.ru/forum/showthread.php?t=214114)

djken 17.04.2017 21:35

Не получается победить securityError
 
Всем привет.
Уже второй день бьюсь, перечитал что только можно - не получается победить проблему...

Есть локальная флэшка main.swf, которая обращается к Instagram - все отлично работает. Проверяю тип безопасности песочницы, которую устанавливает Flash Player
Код AS3:

trace(Security.sandboxType); // localTrusted

Тип безопасности - локальный с установленным доверием. Тут все понятно.

Но мне нужно, чтобы эта флэшка лежала на моем сайте - например, https://blablabla.com, и другая флэшка loader.swf, которая теперь лежит локально на компе, ее загружала в себя. (В loader.swf так же прописал Security.allowDomain, так как без этого main.swf загружаться не будет)

loader.swf:
Код AS3:

public class MainLoader extends Sprite
        {
                private var loader:Loader;
 
                public function MainLoader()
                {
                        trace(Security.sandboxType);
 
                        Security.allowDomain("https://blablalba.com");
 
                        loader = new Loader();
                        loader.load(new URLRequest("https://blablabla.com/main.swf"));
                        addChild(loader);
                }
        }

Работает - loader.swf загружает в себя main.swf
У loader.swf теперь тип безопасности - localTrusted, а у main.swf - remote.
Но вот обращение к Instagram не работает (Console):

Цитата:

Предупреждение: Не удалось загрузить файл политики из https://www.instagram.com/crossdomain.xml

*** Нарушение безопасности изолированной среды ***
Подключение к https://www.instagram.com/... прервано – нет разрешения от https://blablabla.com/main.swf
Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation: https://blablabla.com/main.swf cannot load data from https://www.instagram.com/...
...
...
...
Ошибка: Запрос ресурса на https://www.instagram.com/... источника запроса из https://blablabla.com/main.swf отклонен из-за отсутствия разрешений в файле политики.

Nooob 17.04.2017 23:33

Попробуй так
Код AS3:

                        var loader1:URLLoader = new URLLoader();
                        loader1.addEventListener(Event.COMPLETE, function(event:Event):void{
                                var loader2:Loader = new Loader();
                                loader2.loadBytes(loader1.data);
                        });
                        loader1.dataFormat = URLLoaderDataFormat.BINARY;
                        loader1.load(new URLRequest("https://blablabla.com/main.swf"));

Идея в том чтоб загрузить байты, затем загрузить эти байты через loadBytes.

Манипуляции с SecurityDomain в sandbox не к чему не приведут, раньше можно было через глобал настройки указать доверенную папку и назначать SecurityDomain.currentDomain.
Если ты делаешь AIR/Mobile app то хорошей практикой сначала загрузить все дополнительные модули извне байтами во временную директорию и использовать их уже оттуда

djken 18.04.2017 04:39

Nooob, спасибо! Помогло )

caseyryan 18.04.2017 06:20

Цитата:

Сообщение от djken (Сообщение 1200227)
Nooob, спасибо! Помогло )

Если переведешь приложение на AIR, никаких секьюрити ошибок не будет. Эйр кроссдоменные политики не учитывает

FlashRus 18.04.2017 13:14

Куда ни зайдёшь - везде caseyryan пытается убедить djken перелезть на AIR)

djken 18.04.2017 15:27

caseyryan, не раз посещала мысль попробовать это сделать, но боюсь, что может время отнять - наверняка при переводе на AIR прийдется что-то переделывать...

Перевел, все получилось

caseyryan 18.04.2017 19:54

Цитата:

Сообщение от FlashRus (Сообщение 1200230)
Куда ни зайдёшь - везде caseyryan пытается убедить djken перелезть на AIR)

Потому что это самый разумный вариант в данной ситуации :D

djken 19.04.2017 03:12

Цитата:

Если переведешь приложение на AIR, никаких секьюрити ошибок не будет. Эйр кроссдоменные политики не учитывает
caseyryan, под AIR тоже выдает ) main.swf так же лежит удаленно. Loader теперь под AIR.

Код AS3:

package
{
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLRequest;
 
        [SWF(width="800", height="500", frameRate="30")]
 
        public class LoaderAir extends Sprite
        {
                private var loader:Loader;
 
                public function LoaderAir()
                {
                        loader = new Loader();
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
                        loader.load(new URLRequest("https://blablabla.com/main.swf"));
                }
 
                private function loadCompleteHandler(e:Event):void
                {
                        addChild(loader)
                }
        }
}

Ошибка:

Цитата:

*** Нарушение безопасности изолированной среды ***
SecurityDomain \"https://blablabla.com/main.swf\" пытался получить доступ к несовместимому контексту \"app:/loader.swf\"
SecurityError: Error #2070: Security sandbox violation: caller https://blablabla.com/main.swf cannot access Stage owned by app:/LoaderAir.swf.

caseyryan 19.04.2017 06:49

Создай один контекст для них, и укажи его при загрузке. Тут дело не в кросдоменных политиках уже, а в том, что у main.swf свои ресурсы и своя сцена, а надо, чтобы она была единой
Код AS3:

var loader:Loader                                = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderCompele);
if (Security.sandboxType == Security.REMOTE) {
        var context:LoaderContext        = new LoaderContext();
        context.applicationDomain        = new ApplicationDomain(ApplicationDomain.currentDomain);
        context.securityDomain                = new SecurityDomain(SecurityDomain.currentDomain);
        loader.load(new URLRequest("https://blablabla.com/main.swf"), context);
} else {
        loader.load(new URLRequest("https://blablabla.com/main.swf"));
}


Nooob 19.04.2017 10:07

Цитата:

Сообщение от caseyryan (Сообщение 1200255)
Создай один контекст для них, и укажи его при загрузке.

Для AIR будет Security.sandboxType == Security.APPLICATION и твой код не выполнится.
Но даже если выполнился бы, то:
Цитата:

SecurityError: Error #2142: Security sandbox violation: local SWF files cannot use the LoaderContext.securityDomain property
Вне зависимости от того как оно запускается, в отладчике ли, собирается и запускается, securityDomain нужен только для разгуливания Remote зависимостей

и у SecurityDomain нету такого конструктора
Код AS3:

new SecurityDomain(SecurityDomain.currentDomain)



Часовой пояс GMT +4, время: 00:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.