Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   <policy-file-request/> + java-сервер (http://www.flasher.ru/forum/showthread.php?t=168319)

Zizilk 19.09.2011 20:11

[Решено] <policy-file-request/> + java-сервер
 
Имеется самописный сервер на java
При подключении от флеша присылается <policy-file-request/>, на что ему отправляю в сокет строчку
<?xml version="1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"8234\" /></cross-domain-policy>\0

Флешевое приложение никак не реагирует, и спустя какое-то время сообщает об ошибки безопасности.

Знаю, что есть решение разместить файл с точно таким же содержанием в корне домена к которому обращаемся. Проблема в том что обращаться собираюсь по айпишнику, а не по домену и вебсервера на машине с сервером скорее всего не будет.
Что я делаю не так?

maksimov 20.09.2011 10:54

вроде всё правильно делаете...

единственное: в приведённой вами xml'ке, первая кавычка не заэкранирована. Если в отправляемой вами строчке также, то причина возможно в этом.

<?xml version="1.0\"?><cross-domain-poli...

Zizilk 20.09.2011 12:27

Вот строчка пересылаемая
Код:

<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy SYSTEM \"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" meta-policy=\"master-only\"/></cross-domain-policy>\0
ещё из странностей, что запрос приходит из клиента через 3 секунды после открытия сокета. Возможно ли что причина в неправильном коде клиента?

код для связи с клиентом изменился толку нет

Клиент будет предельно простой, поэтому пишу код прямо в actions кадра

t4arty 20.09.2011 12:41

видел такие проблемы, решались они добавлением нулевого симвоба "u0000" (вроде так), а вообще поищите в инете пример сервера по отдачи кроссдоменика - их много. (я поищу свой пример, где-то он валялся).

maksimov 20.09.2011 13:27

Цитата:

Сообщение от t4arty (Сообщение 1032711)
а вообще поищите в инете пример сервера по отдачи кроссдоменика - их много.

А чё искать? Набираем в поисковике "OpenFire" - и всё. =) Там и пример, и документация, и сообщество.

Zizilk 20.09.2011 15:06

Последовал совету выдрал из OPENfire точный синтаксис и всё равно ошибка #2048///

maksimov 20.09.2011 16:04

Цитата:

Сообщение от Zizilk (Сообщение 1032754)
Последовал совету выдрал из OPENfire точный синтаксис и всё равно ошибка #2048///


Честно говоря, тут сложно что-либо посоветовать. Вы всё делаете правильно. Следовательно, проблема в невнимательности.

Если хотите, могу вам быстро набросать сокет-сервер на питоне, что бы вы могли проверить, всё ли правильно у вас со стороны флешки.


Как вариант, можно ещё попробовать добавить тегу allow-access-from, атрибут secure='false'.


Цитата:

Secure requests from non-secure pages
Setting secure="False" in a crossdomain.xml file served over https allows .swf files loaded from http: URLs to access https: URLs on the server. This should be used with extreme caution. If an attacker can trick a client into loading something evil off of example.com, setting secure="False" makes the data served over SSL (on https://example.com/) just as vulnerable. Taken together with the wildcard problem noted above, Setting secure="False" on yourdomain.example.com could end up compromising far more than just your own project's security.

bav 20.09.2011 17:49

Посмотрите, может поможет.

Zizilk 20.09.2011 22:38

Вывел работу с полиси в отдельный поток, привязал прослушку порта 843, результат нулевой. Те сервер пишет что отправлено, клиент же не получает.

лог клиента
Код:

securityErrorHandler: [SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"]
Лог сервера (обрамляющие кавычки вокруг ответа сервера пришпандорены в выводе лога, чтобы проще контролить что отправляется (так мы видим пробел перед последней кавычкой, говорящий что нулевой знак тоже отправился))
Код:

20.09.2011 21:29:51 ServerFlashRunnable flashrun
INFO: new Flash connection
20.09.2011 21:29:54 ServerFlashRunnable flashrun
INFO: Flash is connecting | '<policy-file-request/> '
20.09.2011 21:29:54 ServerFlashRunnable flashrun
INFO: Send to flash | '<?xml version="1.0"?><!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtd
ss-domain-policy.dtd"><cross-domain-policy><allow-access-from secure='false' domain="*" to-ports="8234" /></cross-d
-policy>
'
20.09.2011 21:29:54 ServerFlashRunnable flashrun
INFO: Flash new Connection closed

После подключения со стороны флеша вызывается этот метод
Код:

private static void flashrun(Socket gsock)
        {
                log.info("new Flash connection");

                InputStream fromguest=null;
                OutputStream toguest=null;
                try
                {
                        fromguest=gsock.getInputStream();
                        toguest=gsock.getOutputStream();
                }
                catch(IOException e)
                {
                        log.warning("Can't create Flash streams");
                }
               
                if((fromguest!=null)&&(toguest!=null))
                {       
                        Scanner in = new Scanner(fromguest);
                        PrintWriter out = new PrintWriter(toguest,true);               
                        String outcoming;
                        if(Server.Server_ch())
                        {
                                while (in.hasNextLine() )
                                {
                                        String incoming = in.nextLine();
                                       
                                                if (incoming.equals("<policy-file-request/>\0"))
                                                {
                                                        log.info("Flash is connecting | '"+incoming+"'");
                                                        outcoming=CROSS_DOMAIN_TEXT +"8234"+CROSS_DOMAIN_END_TEXT+"\n";
                                                        log.info("Send to flash | '"+outcoming+"'");
                                                        out.write(outcoming);
                                                        if (out != null) {
                                                                out.flush();
                                                                out.close();
                                                        }
                                                        if (in != null) {
                                                                in.close();
                                                        }
                                                        if (gsock != null) {
                                                                try
                                                                {
                                                                        log.info("Flash new Connection closed");
                                                                        gsock.close();
                                                                }
                                                                catch(IOException e)
                                                                {
                                                                        log.warning("Can't close Flash connection");
                                                                }
                                                        }
                                                }
                                                else
                                                {
                                                        try
                                                        {
                                                                log.info("Flash new Connection closed");
                                                                gsock.close();
                                                        }
                                                        catch(IOException e)
                                                        {
                                                                log.warning("Can't close flash connection");
                                                        }
                                                }
                                       
                                }
                        }
                        else
                        {
                                try
                                {
                                        log.info("Connection closed");
                                        gsock.close();
                                }
                                catch(IOException e)
                                {
                                        log.warning("Can't close connection");
                                }
                               
                        }
                }
        }

Код клиента взят полностью из примера из справки по работе с сокетами, только адаптирован для вывода в textarea тестового фрейма

Код тествого фрейма
Код AS3:

stop();
import MyGlobal;
var socket=new MyGlobal("127.0.0.1", 8234,stat);

Код myGlobals
Код AS3:

package {
                import flash.errors.*;
                import flash.events.*;
                import flash.net.Socket;
        public class MyGlobal extends Socket {
          private var response:String;
          private var stat;
          public function MyGlobal(host:String , port:uint, st) {
        super();
                stat=st;
        configureListeners();
        if (host && port)  {
            super.connect(host, port);
        }
    }
 
    private function configureListeners():void {
        addEventListener(Event.CLOSE, closeHandler);
        addEventListener(Event.CONNECT, connectHandler);
        addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
        addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
        addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
    }
 
    private function writeln(str:String):void {
        str += "\n";
        try {
            writeUTFBytes(str);
        }
        catch(e:IOError) {
            trace(e);
        }
    }
 
    private function sendRequest():void {
        stat.htmlText="sendRequest";
        response = "";
        writeln("GET /");
        flush();
    }
 
    private function readResponse():void {
        var str:String = readUTFBytes(bytesAvailable);
        response += str;
    }
 
    private function closeHandler(event:Event):void {
        stat.htmlText="closeHandler: " + event;
        trace(response.toString());
    }
 
    private function connectHandler(event:Event):void {
        stat.text="connectHandler: " + event;
        sendRequest();
    }
 
    private function ioErrorHandler(event:IOErrorEvent):void {
        stat.htmlText="ioErrorHandler: " + event;
    }
 
    private function securityErrorHandler(event:SecurityErrorEvent):void {
        stat.htmlText="securityErrorHandler: " + event;
    }
 
    private function socketDataHandler(event:ProgressEvent):void {
        stat.htmlText="socketDataHandler: " + event;
        readResponse();
    }
 
        }
}

2bav попробовал так, пишет ошибку компилятор об том что не может найти метод write. у которого три аргумента, ошибку правда не скопипастил я.

Ps идей почему у меня такое нет совершенно. Вернее те что есть попахивают шаманизмом, вроде попробовать насильно конвертить отправляемую строку в UTF8. Если важно сервер поднят на одной машине с вебсервером, на котором лежит тот флеш файл. Веб сервер и мой сервер работают на разных портах.
PPs
Решил от нефиг делать запустить из адоб флеша, через паблиш превью. Запустилось, но реквеста не последовало, вместо этого тупо приконектилось туда куда прошу, а не на полиси порт, и гордо выдало о получении "fail" (так как я брал из примера адобовского и там в обработчике подключения так и стоит отправка чего-то, в этом чём-то сервер формата родного запроса не узнал и послал "fail"'ом клиент)... Затык где то именно в этой долбанном хендшейке.



PPPs веб сервер(у меня xampp), на котором висит флешка надо как-то настраивать?

Добавлено через 1 час 38 минут
Заработало... почувствовал себя доктором франкенштейном и до конца не понимаю, чё делаю таки сделал...
Вот готовый класс к запуску в отдельном потоке если чё.
Код:

class ServerFlashRunnable implements Runnable
{
        private ServerSocket flashsock;
        private static final Logger log=Logger.getLogger("main.thread");
        public static String CROSS_DOMAIN_TEXT = "<?xml version=\"1.0\"?>"+
                        "<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">" +
            "<cross-domain-policy>" +
            "<allow-access-from secure='false' domain=\"*\" to-ports=\"";
        public static String CROSS_DOMAIN_END_TEXT ="\" /></cross-domain-policy>";
    public ServerFlashRunnable(ServerSocket sock)
        {
                flashsock=sock;
               
        }
       
        public void run()
        {
                log.info("Flash tread starts");
                while(Server.Server_ch())
                {
                        try
                        {
                                Socket gsock=flashsock.accept();
                                flashrun(gsock);
                        }
                        catch(IOException e)
                        {
                                log.warning("Can't accept flash connection");
                        }
                }
        }
       
       
        private static void flashrun(Socket gsock)
        {
                log.info("new Flash connection");

                InputStream fromguest=null;
                OutputStream toguest=null;
                try
                {
                        fromguest=gsock.getInputStream();
                        toguest=gsock.getOutputStream();
                }
                catch(IOException e)
                {
                        log.warning("Can't create Flash streams");
                }
               
                if((fromguest!=null)&&(toguest!=null))
                {       
                        BufferedReader in = new BufferedReader(new InputStreamReader(fromguest));
                        PrintWriter out = new PrintWriter(toguest,true);               
                        String outcoming;
                       
                        String request = "";
                        request = read(in);
                        if(Server.Server_ch())
                        {
                                if (request.contains("<policy-file-request/>") || request.contains("GET /crossdomain.xml")) {
                        out.write(CROSS_DOMAIN_TEXT +
                                "8234" +                                                                                //порт который надо открыть пихаем сюда
                                CROSS_DOMAIN_END_TEXT+"\u0000");
                }
                                try
                                {
                                        out.flush();
                            out.close();
                                        in.close();
                                        log.info("Connection closed");
                                        gsock.close();
                                }
                                catch(IOException e)
                                {
                                        log.warning("Can't close connection");
                                }
                        }
                        else
                        {
                                try
                                {
                                        log.info("Connection closed");
                                        gsock.close();
                                }
                                catch(IOException e)
                                {
                                        log.warning("Can't close connection");
                                }
                               
                        }
                }
        }
        protected static String read(BufferedReader in) {
        StringBuffer buffer = new StringBuffer();
        int codePoint;
        boolean zeroByteRead = false;
       
        try {
            do {
                codePoint = in.read();

                if (codePoint == 0 || codePoint == '\n') {
                    zeroByteRead = true;
                }
                else if (Character.isValidCodePoint(codePoint)) {
                    buffer.appendCodePoint(codePoint);
                }
            }
            while (!zeroByteRead && buffer.length() < 200);
        }
        catch (Exception e) {
            log.warning("Exception (read): " + e.getMessage());
        }
       
        return buffer.toString();
    }
}


freemtrg 04.11.2011 21:18

Прошу прощения, у меня похожая ошибка. Уже что только не перепробовал...
В чем у вас проблема была? (у меня просто серверная часть на node.js и взять ваше решение не могу)


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

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