Saturday, December 29, 2007

buggy loadPolicyFile() in flash player 9.0.115

最近公司的程式被回報在某些 flash player plugin 上會出問題,進一步發現問題只在 9.0.115 才發生,跑 flash player 9.0.45, 9.0.47 都正常。

到 Adobe devnet 看了才知道 9.0.115 在 security 控管上有了新的方式,有興趣的可以看這裡,這版還只是第一階段變動,未來還有第二階段。

由於我們的程式需要開 XMLSocket 連線到其他機器的特殊 port (低於 1024),所以只能使用 loadPolicyFile() 來取得 XMLSokcet 的開啟權限。但是這個動作在 flash player 9.0.115 卻有問題~

根據 Adobe 文件,9.0.115 在 XMLSocket 開啟時會先連去目標 server 的 port 843 試圖取得 meta policy file,若是該 port 沒有回應,則會歷經一個 3sec 的 timeout,然後才改連到目標 port 並發出 "<policy-file-request/>" 的命令要求下載 policy file。

然後~

才會允許 XMLSocket 連線...

如果想要避免連往 port 843 的 3sec timeout,就必須在程式中先下 System.security.loadPolicyFile() 主動去取得 XMLSocket policy file,那麼就能馬上接著開啟 XMLSocket 連線了。

但是,很可惜,事實上在 9.0.115 中 loadPolicyFile() 根本就不會動作!

9.0.115 完全不會去執行 loadPolicyFile() 取得 policy file,而是只會等到程式在做 XMLSocket:connect() 時,才開始進行到 port 843 取 policy file 的一連串流程...

結果就是,程式必須等將近 5sec 之後,才能正常地進行 XMLSocket 連線~
很囧~

想要在 9.0.115 中正常開啟 XMLSocket 連線的辦法,目前就只能先做一次 dummy connecting 讓 player 開始進行要求 policy file 的流程,然後等待約 5sec 後才做真正的連線,那麼程式就能運作了...

所以咧,我只好在程式中判斷 flash player 版本 (可以使用 System.capabilities.version 取得),然後針對 9.0.115 做這個 5sec waiting。

很可笑的 bug,浪費我不少時間在確認 loadPolicyFile() 在各版本 flash player 是否有正常動作。只能希望下一個版本會改進了。

有些人也遇到這個問題,相關討論在這裡
本來想上去留言我的解決方式,但是還要開帳號,還是算了... 懶~~

5 comments:

LJ said...

Thanks. I found the same problem. Do you know if this issue is fixed in Flash Player 9.0.124.0?

chenjl said...

No...
I think it's still there in 9.0.124.

aladdin said...

這已經不是 bug 了,而是確認的新 feature 了...

aladdin said...

應該說,所有的loadPolicyFile()都只有在需要的時候,才會去讀。

所以,必須要用 onConnect 或是connect 事件才能繼續動作。

chenjl said...

是呀,所以我後來就在這篇補充了
http://chenjl.blogspot.com/2008/05/it-not-bug-flash-player-9-security.html
還是覺得有點鳥的設計啦...