Swf Dosyalarını Güvenlik İhlali

November 23, 2008 — 34 Comments

Flash ile yapılan uygulamalara harici dosya yüklemek temelde çok basit bir işlemdir. Genelde yapılacak olan işlem yeni bir Loader objesi oluşturup bu objeye yüklenecek materyalin adresini vermektir. Bu işlemin sorunsuz bir şekilde çalışması gerekirken bazen hatalar alabilirsiniz. Özellikle farklı domain adı altından dosyalara erişilmeye çalışıldığında yada aynı domain isminin başına www konulmadığı gibi basit sorunlar sistemi çalışmaz hale getirir. Bunun için bir örnek vermek gerekli diye düşünüyorum; Diyelim ki iki farklı domain adresiniz var ve siz aynı olan dosyaları sadece bir sunucuda tutmak istiyorsunuz.

Farklı sunuculardan dosya yüklemek

A sunucusu altındaki swf dosyası B sunucusundaki resim dosyasını kendi içerisinde yüklemeye çalışıyor. A sunucusunun B sunucusuna ulaşıp resim dosyasını yüklemesi için B sunucusu altında crossdomain.xml adlı bir xml dosyasının olması gerekiyor. Bu XML dosyası Flash Player’e bu sunucu altındaki dosyaların hangi sunuculara ait olduğuna dair izin bilgilerini içerir. XML dosyası şu şekildedir;

<xml version="1.0">
<cross-domain-policy>
<allow-access-from domain="*"></allow-access-from>
</cross-domain-policy>

Yukarıdaki örnek XML dosyası tüm sunucuların erişebileceği anlamına geliyor. Eğer sadece bir sunucunun erişmesini istiyorsanız yapmanız gereken yıldız(*) işareti olan yere domain adresini yazmak. Domain adresini yazarken dikkat etmeniz gereken nokta ise;

www.enginyoyen.com
ile
enginyoyen.com
adresinin birbirlerinden farklı algılandığıdır. Yani Flash Player yukarıdaki adres farklı farklı olarak algılayacaktır. Buradaki XML dosyası güvenlik ihlali hatasını çözmeye yeter. Tabii işin kötü tarafı bunun bazı koşullar altında çalışmaması. Yani farklı sunuculardan dosyayı almak için crossdomain.xml dosyası ve izinler ayarlanmıştır. Ama yineden aşağıdaki hatayı alırsınız;

Error #2044: İşlenmemiş securityError:. text=Error #2048: Güvenlik sanal alan ihlali http://enginyoyen.com…..

Peki hatayı gidermenin yolu nedir?
Hatayı gidermenin yolu LoaderContext sınıfını kullanmak. Bu sınıf swf içerisinde harici dosya yükleme seçeneklerini düzenliyor. Yapmanız gereken tek şey bir LoaderContext objesi oluşturup bu objenin checkPolicyFile parametresinin true olarak atamak. Daha sonra ise bu objeyi Loader objesinin load metoduna ikinci parametre olarak vermek;

var context:LoaderContext = new LoaderContext();
context.checkPolicyFile = true;
loader.load(urlReq,context);

Yukarıdaki kodun tam ve çalışır hali şu şekildedir;

var context:LoaderContext = new LoaderContext();
context.checkPolicyFile = true

var loader =  new Loader ();
var urlReq:URLRequest("resim_veya_herhangi_bir_dosya_adresi.jpg");
loader.load(urlReq,context);

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.contentLoaderInfo.addEventListener(Event.OPEN, openHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

function openHandler(e:Event) {
//dosya yüklenmeye başlandı
}
function completeHandler(e:Event) {
//dosya yüklendi
}
function ioErrorHandler(e:IOErrorEvent):void {
//hata
}
;

Burada dikkat etmeniz gereken diğer bir durum ise aynı domain adı altında çalışan Flash dosyalarının hata vermesidir. Buradaki en büyük sebep ise domain adlarının iki farklı şekilde girilmesidir;

www.enginyoyen.com
ile
enginyoyen.com

Buda temel olarak güvenlik ihlali sayılıp aynı sunucu altında bile sorun çıkarmaktadır. Bunu çözmek için yukarıdaki yöntemi kullanabilirsiniz.
Kolay Gelsin
Engin!

34 responses to Swf Dosyalarını Güvenlik İhlali

  1. iki tane url adresi vermek mümkün değil mi?

  2. İki tane URL adresinden veri çekebilir, ama yukarıdaki işlemi yaparsan hata vermez.

  3. Öncelikle yazılarınız ve dersleriniz için teşekkür ediyorum.
    As2 de yapmış olduğum bir çalışma vardı. Bu çalışmada çözemediğim bir hata veriyordu.(güvenlik hatası) Çalışmamın amacı xml dosyasından hostumdaki vdeoları swf içindeki playerda oynatmak.list Component ile listelediğimde çalışıyordu. Verileri kendim listelediğimde şu hatayı veriyor.
    *** Güvenlik Sanal Alanı İhlali ***
    “http://www.promerdesign.com/oyunlar/video/GTA IV.flv” bağlantısı durduruldu – file:
    Maklelinizi okuduktan sonra bir kaç kezdaha denedim çözemedim. crossdomain.xml bu dosyayı tam olarak sunucuda nere atacaz. LoaderContext bu sınıf as2 de çalışıyormu.

  4. Merhaba Engin,
    crossdomain.xml dosyasını sunucunun ana dizinine yerleştirmen gerekiyor.

    As2 de loadercontext malesef yok, ama sorununu çözmek için şu şekilde bir sistem uygulayabilirsin; bir tane as3 swf dosyası yaratıp o swf dosyasına diğer as2 dosyalarını çağırıp sorunu çözmeyi deneyebilirsin. İşe yarayıp yaramayacağını bilmem ama en azından denemekte fayda var.

  5. xml’den image veri çekerken sorun yaşıyorum. bunu nasıl engelleyebilirim. sizin yukarıda anlattıklaırnız dışında extra’dan ne yapmam gerekiyor.

  6. Merhaba Ahmet,
    kullandığın yapısyı ve aldığın sorunu yazarsan eğer sorunu daha kolay bulabiliriz.

  7. Merhaba Engin hocam,

    Benim merak ettiğim Loader sınıfında bunu kullanabiliyoruz ama URLLoader ve POST ile veri gönderirken de LoaderContext kullanabilir miyiz?

  8. Merhaba Yağız,
    LoaderContext objesini Loader sınıfı içerisinde load() ve loadBytes() metotlarında kullanabiliyorsun.
    Kolay gelsin

  9. Ozaman sorumu biraz daha ileri götüreyim.

    Bir başka domaindeki PHP dosyasını çalıştırmak için ne yapmamız lazım?

    Ben LoaderContext kullanarak bir SWF çektim ve bunun içinde URLLoader kullandım. Çalıştı ama biraz takla attırdım gibi geldi bana :)

  10. Merhaba Yağız,
    mantık aslında aynı, yapman gereken ise crossdomain.xml dosyasını ayarlamak. Flash Player in çalışma mantığı şöyle: Diyelimki a.swf dosyası bulunduğu domainden farklı bir domaine ulaşmaya çalışıyor. Bağlantı sağlanmadan önce Flash Player bağlanılacak olan adresin altındaki crossdomain dosyasını kontrol ediyor. Eğer izin verilmişse bu bağlantıya izin veriyor, eğer izin yoksa o zaman flash player izin vermiyor. Yani işlem flash player tarafından kontrol ediliyor.

  11. “Yani işlem flash player tarafından kontrol ediliyor.” işte aradığım cevap buydu :)

    Teşekkürler.

  12. merhaba engin bey,

    benim sorunum sizin yukarıda anlatıldığı gibi ama sorunu cozemedim.

    bir video banner yaptım ve bunun flv dosyasını kendi serverımdan host ettim. ama swf dosyası başka bir sitede yayınlanacak. Yani swf nin içindeki flv benim serverımda host edilecek. Ben bu şekilde uyguladım ama maalesef bannerın içinden tıkladığımda flv dosyasını getirmiyor.Serverda mime ayarlarımı yaptım

    yardımcı olursanız cok sevinirim.

  13. Merhaba,
    yapman gereken kendi sunucuna crossdomain.xml dosyasını eklemen. Bu dosyanın içerisinde yukarıda olduğu gibi ister tüm sitelere izin verirsin istersen sadece tek bir siteye erişim izni verebilirsin.

    Eğer bu işlemi doğru yaptığından emin sen, Flash player 10 indirip bilgisayarına yükle, internet tarayıcını açıp ilgili siteyi aç. Aldığın hataya göre ne yapacağını belirlemen daha kolay olur.
    Kolay gelsin

  14. Merhaba,ben swf ile ilgili başka bir soru sormak istiyorum.swf yi fullscreen yapmak için fscommand2(“Fullscreen”,true) ve fscommand2(“SetSoftKeys”,Soft1,Soft2) komutlarını kullandım flashlite 2.1 kullanıyorum as2 de..cep telefonunda programda bir tuşa bastığımda fullscreen özelliği gidiyor..tekrar tekrar fullscreen yapmam gerekiyor..yardımcı olabilirmisiniz çok acil gerekiyor :(

  15. Hocam Eline Sağlık..

    Şimdi resim swf vb dosyaları başka sunuculardan bu yöntemle alabiliyoruz dedik. Hatta UILoader Bileşenini kullandığımda kendi kendine herşeyi hallettiğini farkettim geçenlerde. sadece source kısmına adresi giriyorum.

    Ancak xml dosyasını hiç bir siteden yükleyemeyecek miyiz? Bunu başaran var mı?.. Lakin bu yöntem belli türler için geçerli gibi gözüküyor. Ve diğer türler için bu yöntem kar etmediği gibi başka bir çözümde ortada yok. Sanırım hiç oluşturulmamış. Flash ile tcmb’den döviz kurlarını çekemiyoruz. ya da kulerden renk kodlarını alamıyoruz.. sanırım önce php’ye yazdırmak gerekiyor kendi sunucumuzda..

    Başaran varsa bildirsin lütfen.. Saygılar..

  16. Merhaba Burak,
    teoride bahsettiğin bilgileri alamaman için herhangi bir sebep yok. Tabii bilgiyi alacağın sunucuda cross-domain xml tanımlamasının yapılmış olması gerekiyor. Eğer izin verilmiş ise istediğin siteden gerekli bilgileri alabilirsin.

  17. Merhaba Zeynep,
    sorunun neden olduğu hakkında bir fikrim yok ama önlemek için cep telefonundaki tuşların laylarını dinleyip yapılacak işlemleri boşa düşürebilirsin. En azından deneyerek çalışıp çalışmama ihtimalini gözden geçirebilirsin.

  18. Merhaba !
    Benim de aynı türden sorunum Flex içerisinde var. Aslında yazdığım program, ASP dosyasına istek gönderip, ASP veritabanına bağlanıp sonuçları XML formatına çevirip, XML texti de SWF programıma geri döndürüyor. Ama maalesef SWF dosyası security ile ilgili sorun görüntülüyor. ASP yi broswer da çalıştırdğımda, %100 başarılı çalıştığını görebiliyorum. Sanırım burada içeriğini de yazmış olduğunuz crossdomain.xml dosyasına ihtiyaç var.
    localhostte tuttuğum fiziksel adres “c:inetpubwwwrootbenimsite” peki ben bu crossdomain.xml i tam olarak buraya mı kopyalamalıyım ?
    componenti kullanıyorum. Çözümü flash için değil de flex componentleri ile naısl olabilir, o şekilde anlatırsanız sevinirim.
    İyi çalışmalar!

  19. Merhaba Onur,
    genelde local testlerde güvenlik hatası vermesi gerekmiyor. Ama dosyayı belirttiğin dizine kopyalaman gerekiyor. Çözümün flex veya falsh ile bir alakası yok, tamamen player ile ilgili.

  20. zaten kitabinizin son sayfasinda da bu konuya el atmistiniz burada da boylelikle daha detayli anlatmissiniz tesekkurler…

  21. 1086: Syntax error: expecting semicolon before leftparen.

    var urlReq:URLRequest(“resim_veya_herhangi_bir_dosya_adresi.jpg”);

    hata aliorum burada

  22. Merhaba Burak;
    kodu şu şekilde düzeltmen gerekiyor;
    var urlReq:URLRequest = new URLRequest(“resim_veya_herhangi_bir_dosya_adresi.jpg”);

    Kolay gelsin

  23. saveAndLoad komutu ile başka bir siteye veri göndermek istiyorum() flash içindeki bir form aracılığı ile fakat ekleyemedim bir türlü.
    Direk flash(swf) dosyasını çalıştırırsam sorun olmuyor, fakat html sayfa içinden veri göndermeye çalışırsam gönderemiyorum. Crossdomain dosyasını hazırlayıp ana dizine yükledim(httpdocs içinde),
    flash dosyalarıda bu dizinde ama bir türlü veriyi gönderemedim. Sorun ne olabilir?

  24. Engin hocam merhaba,benim sorunumda yukarda Burak Aydın arkadaşımla aynı sekilde,yani döviz kurlarını cekmek istiyorum bi istenin xml sayfasından ama güvenlik ihlali dior ve kurları göstermiyor cektigim sitenin root dizininde crossdomain.xml olmasımı gerekiyor bnun icin? yani benim yapabilecegim bşi yok burumda dogrumu?

  25. çok teşekkürler engin hocam. tamda arayıp bulamadığım şeydi :)

  26. Merhaba,
    HTTPService ile başka bir domainden xml dosyası çekmek istersek nasıl bir davranış izlicez. Bu kısımda benim aklım karıştı biraz.

  27. Merhaba Onur,
    başka bir domainden XML dosyası almak için o domain adınını XML kullanımı için izin vermiş olması gerekiyor. Eğer izin verilmiş ise diğer bir deyişle crossdomain.xml dosyası varsa ve bu dosya içerisinde farklı domain adlarının siteden bilgi çekebileceği bilgisi yer alıyorsa XML bilgisini ilgili domain adresinden alabilirsin.

  28. merhaba burak hocam benim anlamadığım birşey var flash debug durumunda hazırladığım döviz scriptinde tcmb.com dan bilgi alabiliyor ama serverda hata veriyor ayrıca aynı şekilde bir hava durumu scriptide yaptım iki aynı proje içerisinde ve bu iki proje benim başıma dert oldu gitti gözlerime kraplar girdi artık sabahtandır aynı şeyle ugraşıyorum lütfen bana crossdomain.xml olmayan bir dosyadan nasıl veri çekebiliriz bunu anlatabilirmisini veya tcmbden ayrı crossdomain.xml’i olan bir site biliyorsanız oda olabilir ama lütfen çok acil bir cvb olsun ilginiz için teşekürler…

  29. Pardon burak hoca ile karıştırdım adınızı engin hocam artk düşünün ki kafam ne halde :(

  30. @ibrahim halil,
    basit aslında. Kullandığın sunucunun desteklediği dile göre bir Proxy dosyası hazırlaman gerekiyor.
    Yapman gereken işlem şu; diyelim ki PHP kullanıyorsun, flash ile yaptığın uygulama php dokümanına bağlanacak ve döviz bilgilerini almak için gerekli sunucuya bağlanacak. Yani sen PHP’yi arada köprü olarak kullanacaksın. Bu sayede Flash ile aradaki güvenlik sorunu kalkmış olacak.
    Kolay gelsin

  31. Hocam allah senden razı olsun bu sorunu günlerdir çözmek için uğraştım ama bi türlü halledemedim. Bu makalen sayesinde çözdüm ve derin bir ohh çektim.

    allah senden razı olsun, çok teşekkür ederim.

  32. Merhaba Engin Bey
    Sorumu sormadan önce yukarıdaki makeleniz için teşekkür ederim.
    Web sayfasının bulunduğu server windows server ve bildiğiniz üzere php desteklemiyor.Benim yaptığım web sayfaları ise window server’da..
    Php dosyasını kendi linux server’ımdan çağırmaya çalışıyorum fakat olmuyor.crossdomain.xml root dizinine attım ve gerekli ayarlamaları yaptıktan sonra xml dosyasını alabiliyorum,fakat o sunucuda bulunun php dosyasını kullanarak veriyi gönderemiyorum.Bana kalsa server’ı taşırım fakat bir şirketin her dakika kullandığı bir server olunca bu işlemi yapmam maliyet ve çalışanlar için zaman kaybına neden olucak.Biraz daha ayrıntılı bahsetmem gerekirse kaynak kodları yazayım.:)
    bu kod ile xml dosyasını aldım

    ve contact.xml dizini içerisinde php alması gerektiği yer tanımlı bu şekilde

    bunlarada contact.swf dosyasının kodları
    package
    {
    import caurina.transitions.Tweener;
    import caurina.transitions.properties.ColorShortcuts;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.FocusEvent;
    import flash.geom.ColorTransform;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLVariables;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequestMethod;
    import flash.filters.DropShadowFilter;
    import flash.text.*;

    public class Contact extends Sprite
    {
    private var _xml:XML;
    private var _settings:XMLList;
    private var _css:StyleSheet;
    private var _background:Sprite;
    private var _nameArea:TextInputArea;
    private var _emailArea:TextInputArea;
    private var _subjectArea:TextInputArea;
    private var _messageArea:TextInputArea;
    private var _pageTitle:pageTitle;
    private var _sendBtn:SendButton;
    private var _bgColor:ColorTransform;
    private var _lineColor:ColorTransform;
    private var _sendBgColor:ColorTransform;
    private var _sendLineColor:ColorTransform;
    private var _origTextColor:int;
    private var _name:String = “Type your name”;
    private var _email:String = “Type your email”;
    private var _subject:String = “Type your subject”;
    private var _message:String = “Type your message”;
    private var _otherInfo:TextField;

    override public function get height():Number
    {
    return _background.height;
    }

    override public function get width():Number
    {
    return _background.width;
    }

    public function Contact()
    {
    if (stage)
    {
    init();
    }
    else
    {
    addEventListener(Event.ADDED_TO_STAGE, init);
    }
    addEventListener(Event.REMOVED_FROM_STAGE, removedFromStage);
    }
    private function init(e:Event = null):void
    {
    ColorShortcuts.init();
    var xld:URLLoader = new URLLoader();
    xld.load(new URLRequest(GlobalVar.xmlAddress));
    xld.addEventListener(Event.COMPLETE, xmlLoaded);
    }
    private function xmlLoaded(e:Event):void
    {
    _xml = XML(e.target.data);
    _settings = _xml.child(“settings”);
    var cssld:URLLoader = new URLLoader();
    cssld.load(new URLRequest(“style.css”));
    cssld.addEventListener(Event.COMPLETE, cssLoaded);
    }
    private function cssLoaded(e:Event):void
    {
    _css = new StyleSheet();
    _css.parseCSS(e.target.data);

    addElements();
    }

    //draw and add elements on stage
    private function addElements():void
    {
    _background = new Sprite();
    _background.graphics.lineStyle(0, _settings.@backgroundColor, 1, true, “none”);
    _background.graphics.beginFill(_settings.@backgroundColor, _settings.@backgroundOpacity / 100);
    _background.graphics.drawRect(0, 0, _settings.@backgroundWidth, _settings.@backgroundHeight);
    _background.graphics.endFill();
    this.addChild(_background);

    _background.filters = [new DropShadowFilter(1, 90, 0, 1, 5, 5, .7, 3)];

    _bgColor = new ColorTransform();
    _bgColor.color = _settings.@textInputBgColor;
    _lineColor = new ColorTransform();
    _lineColor.color = _settings.@textInputLineColor;

    _sendBgColor = new ColorTransform();
    _sendBgColor.color = _settings.@sendButtonBgColor;
    _sendLineColor = new ColorTransform();
    _sendLineColor.color = _settings.@sendButtonLineColor;

    _pageTitle = new pageTitle();
    _pageTitle.titleText.autoSize = TextFieldAutoSize.LEFT;
    _pageTitle.titleText.styleSheet = _css;
    _pageTitle.x = _settings.@textInputPaddingX;
    _pageTitle.y = _settings.@textInputPaddingX;
    _pageTitle.titleText.htmlText = _xml.child(“title”);
    this.addChild(_pageTitle);

    _nameArea = new TextInputArea();
    _nameArea.x = _settings.@textInputPaddingX;
    _nameArea.y = _settings.@textInputPaddindY;
    _nameArea.bgFill.transform.colorTransform = _bgColor;
    _nameArea.bgLine.transform.colorTransform = _lineColor;
    _nameArea.bgFill.width = _settings.@textInputWidth;
    _nameArea.bgFill.height = _nameArea.textArea.height + 4;
    _nameArea.bgFill.alpha = _settings.@textInputBgOpacity / 100;
    _nameArea.bgLine.width = _nameArea.bgFill.width;
    _nameArea.bgLine.height = _nameArea.bgFill.height;
    _nameArea.textArea.width = _nameArea.bgFill.width – 1;
    _nameArea.textArea.textColor = _settings.@textInputTextColor;
    _nameArea.textArea.maxChars = _settings.@nameAreaMaxChars;
    _nameArea.textArea.text = _name;
    _nameArea.textArea.addEventListener(FocusEvent.FOCUS_IN, onFocus);

    this.addChild(_nameArea);

    _emailArea = new TextInputArea();
    _emailArea.x = _settings.@textInputPaddingX;
    _emailArea.y = _nameArea.y + _nameArea.height + Number(_settings.@textInputVerticalSpace);
    _emailArea.bgFill.transform.colorTransform = _bgColor;
    _emailArea.bgLine.transform.colorTransform = _lineColor;
    _emailArea.bgFill.width = _settings.@textInputWidth;
    _emailArea.bgFill.height = _emailArea.textArea.height + 4;
    _emailArea.bgFill.alpha = _settings.@textInputBgOpacity / 100;
    _emailArea.bgLine.width = _emailArea.bgFill.width;
    _emailArea.bgLine.height = _emailArea.bgFill.height;
    _emailArea.textArea.width = _emailArea.bgFill.width – 1;
    _emailArea.textArea.textColor = _settings.@textInputTextColor;
    _emailArea.textArea.maxChars = _settings.@emailAreaMaxChars;
    _emailArea.textArea.text = _email;
    _emailArea.textArea.addEventListener(FocusEvent.FOCUS_IN, onFocus);

    this.addChild(_emailArea);

    _subjectArea = new TextInputArea();
    _subjectArea.x = _settings.@textInputPaddingX;
    _subjectArea.y = _emailArea.y + _emailArea.height + Number(_settings.@textInputVerticalSpace);
    _subjectArea.bgFill.transform.colorTransform = _bgColor;
    _subjectArea.bgLine.transform.colorTransform = _lineColor;
    _subjectArea.bgFill.width = _settings.@textInputWidth;
    _subjectArea.bgFill.height = _emailArea.textArea.height + 4;
    _subjectArea.bgFill.alpha = _settings.@textInputBgOpacity / 100;
    _subjectArea.bgLine.width = _emailArea.bgFill.width;
    _subjectArea.bgLine.height = _emailArea.bgFill.height;
    _subjectArea.textArea.width = _emailArea.bgFill.width – 1;
    _subjectArea.textArea.textColor = _settings.@textInputTextColor;
    _subjectArea.textArea.maxChars = _settings.@subjectAreaMaxChars;
    _subjectArea.textArea.text = _subject;
    _subjectArea.textArea.addEventListener(FocusEvent.FOCUS_IN, onFocus);

    this.addChild(_subjectArea);

    _messageArea = new TextInputArea();
    _messageArea.x = _settings.@textInputPaddingX;
    _messageArea.y = _subjectArea.y + _subjectArea.height + Number(_settings.@textInputVerticalSpace);
    _messageArea.bgFill.transform.colorTransform = _bgColor;
    _messageArea.bgLine.transform.colorTransform = _lineColor;
    _messageArea.bgFill.width = _settings.@textInputWidth;
    _messageArea.bgFill.height = Number(_settings.@messageAreaHeight) + 4;
    _messageArea.bgFill.alpha = _settings.@textInputBgOpacity / 100;
    _messageArea.bgLine.width = _messageArea.bgFill.width;
    _messageArea.bgLine.height = _messageArea.bgFill.height;
    _messageArea.textArea.width = _messageArea.bgFill.width – 1;
    _messageArea.textArea.height = _settings.@messageAreaHeight;
    _messageArea.textArea.textColor = _settings.@textInputTextColor;
    _messageArea.textArea.maxChars = _settings.@messageAreaMaxChars;
    _messageArea.textArea.text = _message;
    _messageArea.textArea.addEventListener(FocusEvent.FOCUS_IN, onFocus);

    this.addChild(_messageArea);

    _sendBtn = new SendButton();
    _sendBtn.bgFill.width = _settings.@sendButtonWidth;
    _sendBtn.bgFill.height = _settings.@sendButtonHeight;
    _sendBtn.bgLine.width = _sendBtn.bgFill.width;
    _sendBtn.bgLine.height = _sendBtn.bgFill.height;
    _sendBtn.bgFill.transform.colorTransform = _sendBgColor;
    _sendBtn.bgFill.alpha = _settings.@sendButtonBgOpacity / 100;
    _sendBtn.bgLine.transform.colorTransform = _sendLineColor;
    _sendBtn.btnName.embedFonts = true;
    _sendBtn.btnName.autoSize = TextFieldAutoSize.LEFT;
    _sendBtn.btnName.wordWrap = false;
    _sendBtn.btnName.antiAliasType = AntiAliasType.ADVANCED;
    _sendBtn.btnName.styleSheet = _css;
    _sendBtn.btnName.htmlText = _xml.child(“sendButtonText”);
    _origTextColor = _sendBtn.btnName.textColor;
    _sendBtn.btnName.x = _sendBtn.bgFill.width / 2 – _sendBtn.btnName.width / 2;
    _sendBtn.btnName.y = _sendBtn.bgFill.height / 2 – _sendBtn.btnName.height/2;
    _sendBtn.y = _messageArea.y + _messageArea.height + Number(_settings.@textInputVerticalSpace);
    _sendBtn.x = _messageArea.x + _messageArea.width – _sendBtn.width;
    _sendBtn.mouseChildren = false;
    _sendBtn.buttonMode = true;
    _sendBtn.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
    _sendBtn.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
    _sendBtn.addEventListener(MouseEvent.CLICK, sendMessage);
    this.addChild(_sendBtn);

    _otherInfo = new TextField();
    _otherInfo.selectable = false;
    _otherInfo.width = _background.width – (2 * Number(_settings.@textInputPaddingX)) – Number(_settings.@textInputWidth) – 20;
    _otherInfo.autoSize = TextFieldAutoSize.LEFT;
    _otherInfo.wordWrap = true;
    _otherInfo.multiline = true;
    _otherInfo.embedFonts = false;
    _otherInfo.antiAliasType = AntiAliasType.ADVANCED;
    _otherInfo.condenseWhite = true;
    _otherInfo.styleSheet = _css;
    _otherInfo.htmlText = _xml.child(“otherInfo”);

    _otherInfo.x = _background.width – Number(_settings.@textInputPaddingX) – _otherInfo.width;
    _otherInfo.y = Number(_settings.@textInputPaddindY);

    this.addChild(_otherInfo);
    }

    private function onMouseOver(e:MouseEvent):void
    {
    Tweener.addTween(e.target.bgFill, { _color: _settings.@sendButtonBgColorOnMouseOver, alpha:_settings.@sendButtonBgOpacityOnMouseOver / 100, time:0.4 } );
    Tweener.addTween(e.target.bgLine, { _color: _settings.@sendButtonLineColorOnMouseOver, time:0.4 } );
    e.target.btnName.textColor = _settings.@sendButtonTextColorOnMouseOver;
    }

    private function onMouseOut(e:MouseEvent):void
    {
    Tweener.addTween(e.target.bgFill, { _color: _settings.@sendButtonBgColor, alpha:_settings.@sendButtonBgOpacity / 100, time:0.4 } );
    Tweener.addTween(e.target.bgLine, { _color: _settings.@sendButtonLineColor, time:0.4 } );
    e.target.btnName.textColor = _origTextColor;
    }

    //send variables to php file and send the mail
    private function sendMessage(e:MouseEvent):void
    {
    var name:String = _nameArea.textArea.text;
    var email:String = _emailArea.textArea.text;
    var subject:String = _subjectArea.textArea.text;
    var message:String = _messageArea.textArea.text;
    var cEmail:String = _xml.child(“companyEmail”);
    var sName:String = _xml.child(“siteName”);
    if (validateEmail(email))
    {
    var phpLd:URLLoader = new URLLoader();
    var request:URLRequest = new URLRequest(_xml.child(“phpFile”).@src);

    var variables:URLVariables = new URLVariables();
    phpLd.dataFormat = URLLoaderDataFormat.VARIABLES;
    request.method = URLRequestMethod.POST;
    variables.senderName = name;
    variables.senderEmail = email;
    variables.senderSubject = subject;
    variables.senderMessage = message;
    variables.companyEmail = cEmail;
    variables.siteName = sName;
    request.data = variables;
    phpLd.load(request);
    phpLd.addEventListener(Event.COMPLETE, variablesSent);
    }
    else
    {
    _emailArea.textArea.text = “Email is not valid”;
    }
    }

    //this method is executed after the mail is sent
    private function variablesSent(e:Event):void
    {
    e.target.removeEventListener(Event.COMPLETE, variablesSent);

    _nameArea.textArea.text = _name;
    Tweener.addTween(_nameArea.bgFill, { _color: _settings.@textInputBgColor, alpha:_settings.@textInputBgOpacity/100, time:0.4 } );
    Tweener.addTween(_nameArea.bgLine, { _color: _settings.@textInputLineColor, time:0.4 } );
    _nameArea.textArea.textColor = _settings.@textInputTextColor;

    _emailArea.textArea.text = _email;
    Tweener.addTween(_emailArea.bgFill, { _color: _settings.@textInputBgColor, alpha:_settings.@textInputBgOpacity/100, time:0.4 } );
    Tweener.addTween(_emailArea.bgLine, { _color: _settings.@textInputLineColor, time:0.4 } );
    _emailArea.textArea.textColor = _settings.@textInputTextColor;

    _subjectArea.textArea.text = _subject;
    Tweener.addTween(_subjectArea.bgFill, { _color: _settings.@textInputBgColor, alpha:_settings.@textInputBgOpacity/100, time:0.4 } );
    Tweener.addTween(_subjectArea.bgLine, { _color: _settings.@textInputLineColor, time:0.4 } );
    _subjectArea.textArea.textColor = _settings.@textInputTextColor;

    _messageArea.textArea.text = _message;
    Tweener.addTween(_messageArea.bgFill, { _color: _settings.@textInputBgColor, alpha:_settings.@textInputBgOpacity/100, time:0.4 } );
    Tweener.addTween(_messageArea.bgLine, { _color: _settings.@textInputLineColor, time:0.4 } );
    _messageArea.textArea.textColor = _settings.@textInputTextColor;

    stage.focus = null;
    }

    //when you click on text input area method onFocus is called
    private function onFocus(e:FocusEvent):void
    {
    setName();
    if (e.target.text == _name)
    {
    _nameArea.textArea.text = “”;
    Tweener.addTween(_nameArea.bgFill, { _color: _settings.@textInputBgColorOnFocus, alpha:_settings.@textInputBgOpacityOnFocus/100, time:0.4 } );
    Tweener.addTween(_nameArea.bgLine, { _color: _settings.@textInputLineColorOnFocus, time:0.4 } );
    _nameArea.textArea.textColor = _settings.@textInputTextColorOnFocus;
    }
    if (e.target.text == _email || e.target.text == “Email is not valid”)
    {
    _emailArea.textArea.text = “”;
    Tweener.addTween(_emailArea.bgFill, { _color: _settings.@textInputBgColorOnFocus, alpha:_settings.@textInputBgOpacityOnFocus/100, time:0.4 } );
    Tweener.addTween(_emailArea.bgLine, { _color: _settings.@textInputLineColorOnFocus, time:0.4 } );
    _emailArea.textArea.textColor = _settings.@textInputTextColorOnFocus;
    }

    if (e.target.text == _subject)
    {
    _subjectArea.textArea.text = “”;
    Tweener.addTween(_subjectArea.bgFill, { _color: _settings.@textInputBgColorOnFocus, alpha:_settings.@textInputBgOpacityOnFocus/100, time:0.4 } );
    Tweener.addTween(_subjectArea.bgLine, { _color: _settings.@textInputLineColorOnFocus, time:0.4 } );
    _subjectArea.textArea.textColor = _settings.@textInputTextColorOnFocus;
    }

    if (e.target.text == _message)
    {
    _messageArea.textArea.text = “”;
    Tweener.addTween(_messageArea.bgFill, { _color: _settings.@textInputBgColorOnFocus, alpha:_settings.@textInputBgOpacityOnFocus/100, time:0.4 } );
    Tweener.addTween(_messageArea.bgLine, { _color: _settings.@textInputLineColorOnFocus, time:0.4 } );
    _messageArea.textArea.textColor = _settings.@textInputTextColorOnFocus;
    }
    }
    //return to original state
    private function setName():void
    {
    if (_nameArea.textArea.text == “”)
    {
    _nameArea.textArea.text = _name;
    Tweener.addTween(_nameArea.bgFill, { _color: _settings.@textInputBgColor, alpha:_settings.@textInputBgOpacity/100, time:0.4 } );
    Tweener.addTween(_nameArea.bgLine, { _color: _settings.@textInputLineColor, time:0.4 } );
    _nameArea.textArea.textColor = _settings.@textInputTextColor;
    }
    if (_emailArea.textArea.text == “”)
    {
    _emailArea.textArea.text = _email;
    Tweener.addTween(_emailArea.bgFill, { _color: _settings.@textInputBgColor, alpha:_settings.@textInputBgOpacity/100, time:0.4 } );
    Tweener.addTween(_emailArea.bgLine, { _color: _settings.@textInputLineColor, time:0.4 } );
    _emailArea.textArea.textColor = _settings.@textInputTextColor;
    }

    if (_subjectArea.textArea.text == “”)
    {
    _subjectArea.textArea.text = _subject;
    Tweener.addTween(_subjectArea.bgFill, { _color: _settings.@textInputBgColor, alpha:_settings.@textInputBgOpacity/100, time:0.4 } );
    Tweener.addTween(_subjectArea.bgLine, { _color: _settings.@textInputLineColor, time:0.4 } );
    _subjectArea.textArea.textColor = _settings.@textInputTextColor;
    }

    if (_messageArea.textArea.text == “”)
    {
    _messageArea.textArea.text = _message;
    Tweener.addTween(_messageArea.bgFill, { _color: _settings.@textInputBgColor, alpha:_settings.@textInputBgOpacity/100, time:0.4 } );
    Tweener.addTween(_messageArea.bgLine, { _color: _settings.@textInputLineColor, time:0.4 } );
    _messageArea.textArea.textColor = _settings.@textInputTextColor;
    }
    }

    //check if mail is correctly written
    private function validateEmail(email:String):Boolean
    {
    if (email.length >= 10) {
    if (email.indexOf(“@”) > 1) {
    if ((email.indexOf(“@”) + 2) < email.indexOf(“.”)) {
    if ((email.lastIndexOf(“.”)) = 1; i–)
    {
    removeChildAt(i);
    }
    removeChildAt(0);
    }
    }
    }
    epey uzunca bir soru oldu sanıırm sabırla okuduğunuz için çok teşekkür ederim:)
    Yardımınızı bekliyorum nerede yanlış yapıyorum..?

  33. Onur Yıldırım March 3, 2011 at 3:56 pm

    Merhaba Hocam.

    Bitane radyo player yaptım.Gazet düzgün çalışıyor.Yalnız SoundMixer.computeSpectrum() metodunu kullandığımda (Güvenlik sanal alan ihlali: SoundMixer.computeSpectrum: file:///C|/Web/Arşiv/Kurumsal/Radyo%20Arda/player.swf, rtmp://***.***.***/*** öğesine erişemiyor. Hiçbir ilke dosyası erişimi onaylamadı.) hatası alıyorum.Bunu bir türlü çözemedim.Gerekli xml dosyasını hostun ana dizinine koydum.Ama Yine hata alıyorum.

    Teşekkürler.

  34. engin bey lutfen yardım eden kafayı yıcam ya bı turlu bulamadım.2 sorum olucak size;
    1) actionscript 3 ile yaptıgım siteye actionscript 1 ile kodlanmıs swf cekıyorum bu herhangı bır sorun cıkartırmı?
    2) actionscript 3 ile kodladıgım flash sitemin içinde dışardan cagırdıgım swfler(xml,image v.s)gibi bussuru dosyam var bunların hepsi için site acılısnda preloader yapmak istiyorum bu mumkunmu?
    4 gozle cevabınızı beklıyorum saygılarıml

Leave a Reply

*

Text formatting is available via select HTML. <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>