Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.09.2011, 20:11
Zizilk вне форума Посмотреть профиль Отправить личное сообщение для Zizilk Найти все сообщения от Zizilk
  № 1  
Ответить с цитированием
Zizilk

Регистрация: Sep 2011
Сообщений: 28
По умолчанию [Решено] <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

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

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


Последний раз редактировалось Zizilk; 21.09.2011 в 00:18.
Старый 20.09.2011, 10:54
maksimov вне форума Посмотреть профиль Отправить личное сообщение для maksimov Найти все сообщения от maksimov
  № 2  
Ответить с цитированием
maksimov
 
Аватар для maksimov

Регистрация: Jan 2010
Сообщений: 28
вроде всё правильно делаете...

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

<?xml version="1.0\"?><cross-domain-poli...
__________________
GAE + Flex = CyoaWare =)

Старый 20.09.2011, 12:27
Zizilk вне форума Посмотреть профиль Отправить личное сообщение для Zizilk Найти все сообщения от Zizilk
  № 3  
Ответить с цитированием
Zizilk

Регистрация: Sep 2011
Сообщений: 28
Вот строчка пересылаемая
Код:
<?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 кадра


Последний раз редактировалось Zizilk; 20.09.2011 в 15:35. Причина: Изменение кода, поэтому пост не актуален
Старый 20.09.2011, 12:41
t4arty вне форума Посмотреть профиль Отправить личное сообщение для t4arty Найти все сообщения от t4arty
  № 4  
Ответить с цитированием
t4arty

Регистрация: May 2010
Адрес: пространство в положении
Сообщений: 219
видел такие проблемы, решались они добавлением нулевого симвоба "u0000" (вроде так), а вообще поищите в инете пример сервера по отдачи кроссдоменика - их много. (я поищу свой пример, где-то он валялся).

Старый 20.09.2011, 13:27
maksimov вне форума Посмотреть профиль Отправить личное сообщение для maksimov Найти все сообщения от maksimov
  № 5  
Ответить с цитированием
maksimov
 
Аватар для maksimov

Регистрация: Jan 2010
Сообщений: 28
Цитата:
Сообщение от t4arty Посмотреть сообщение
а вообще поищите в инете пример сервера по отдачи кроссдоменика - их много.
А чё искать? Набираем в поисковике "OpenFire" - и всё. =) Там и пример, и документация, и сообщество.
__________________
GAE + Flex = CyoaWare =)

Старый 20.09.2011, 15:06
Zizilk вне форума Посмотреть профиль Отправить личное сообщение для Zizilk Найти все сообщения от Zizilk
  № 6  
Ответить с цитированием
Zizilk

Регистрация: Sep 2011
Сообщений: 28
Последовал совету выдрал из OPENfire точный синтаксис и всё равно ошибка #2048///

Старый 20.09.2011, 16:04
maksimov вне форума Посмотреть профиль Отправить личное сообщение для maksimov Найти все сообщения от maksimov
  № 7  
Ответить с цитированием
maksimov
 
Аватар для maksimov

Регистрация: Jan 2010
Сообщений: 28
Цитата:
Сообщение от Zizilk Посмотреть сообщение
Последовал совету выдрал из 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.
__________________
GAE + Flex = CyoaWare =)

Старый 20.09.2011, 17:49
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 8  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Посмотрите, может поможет.

Старый 20.09.2011, 22:38
Zizilk вне форума Посмотреть профиль Отправить личное сообщение для Zizilk Найти все сообщения от Zizilk
  № 9  
Ответить с цитированием
Zizilk

Регистрация: Sep 2011
Сообщений: 28
Вывел работу с полиси в отдельный поток, привязал прослушку порта 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();
    }
}


Последний раз редактировалось Zizilk; 20.09.2011 в 22:54.
Старый 04.11.2011, 21:18
freemtrg вне форума Посмотреть профиль Отправить личное сообщение для freemtrg Найти все сообщения от freemtrg
  № 10  
Ответить с цитированием
freemtrg

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:58.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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