Showing posts with label flash. Show all posts
Showing posts with label flash. Show all posts

Monday, May 05, 2008

it's not a bug... >"< (flash player 9 security model)

幾個月前當 flash player 更新到 9.0.115 時,因為 security model 改變,讓我以為 Security.loadPolicyFile() 沒有被正確調用是一個 bug... 並期待會在下次更新改善。

而就在最近,flash player 更新到 9.0.124 了。
而且,果不其然,security model 再次被修改~細節請參考這裡
我關心的部份是:

A socket policy file will always be required for all socket connections

唉...
我個人認為這改變很白爛啊...  >"<

anyway,這只是前言,這篇重點在於,這次的相關文章中,我看到了一篇有提到 flash player 內部的 socket policy request process!

哇咧!!!
原來是這樣的次序

  1. 先找 port 843 的 master policty file
  2. 才是作 Security.loadPolicyFile()
  3. 最後是往目標連線的 socket port 取...

哪有這種事情...

居然把他們自定的特殊 port 843 當作第一優先,取不到還得等 3sec,然後才往其他地方找 policy file...

So,我原來還期待上次發現的問題,可能會被改掉,這下看來是不可能了!
因為那不是 bug,是刻意的 FEATURE!

老實說,我真的覺得 Adobe 對於 flash player 作這樣的設計很白痴...

Saturday, December 29, 2007

My work-around for flash player 9.0.115 loadPolicyFile()

上一篇說了一堆,想想還是把我的 code sample 放上來好了~

var playerVersion:String = System.capabilities.version;
var bkidx:Number = playerVersion.indexOf(" ");
var platform:String;
var majorVersion:String;
var minorVersion:String;
if (bkidx >= 0) {
    platform = playerVersion.substring(0, bkidx);
    var secondHalf:String = playerVersion.substring(bkidx+1,
                                         playerVersion.length);
    var vers:Array = secondHalf.split(",");
    majorVersion = vers[0];
    minorVersion = vers[2];
}

var drcID:Number:
function doReadlConnect(server, port) {
    clearInterval(drcID);

    // do real stuff here
}

function myConnect(server, port) {
    System.security.loadPolicyFile("
http://"+server+"/crossdomain.xml");
    System.security.loadPolicyFile("xmlsocket://"+server+":"+port);

    var sock:XMLSocket = new XMLSocket();
    sock.connect(server, port);
    sock.onConnect = function() {
        this.close();
        delete this;
    }

    var waitms = 1000;
    if (majorVersion == "9" && minorVersion == "115")
        waitms = 5000; // special for 9.0.115
    drcID = setInterval(this, "doRealConnect", waitms, server, port);

}

注意,這只是節錄出來的 sample,不要照抄去用... XD

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 是否有正常動作。只能希望下一個版本會改進了。

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