Archiwum z Czerwiec, 2007

Adobe Poland (leję żółć)

sobota, Czerwiec 30th, 2007

Pomijając kwestię ceny oprogramowania, o której wszyscy powiedzieli wszystko, a nikt nie zrobił nic, chciałem sobie wylać wiadro żółci na temat wszelakich konkursów organizowanych przez Adobe. Ponoć mamy polski oddział Adobe (chociaż tego nie czuję), mamy przaśną polskawą stronę (już od dwóch miesięcy), mamy dwie grupy użytkowników, ale czwarta RP jakoś nie jest wymieniona w liście krajów z których użytkownicy mogą wystartować w konkursach Adobiego. Polska, czy Rumunia na tej liście się nie znalazły. Mamy swój oddział, jesteśmy w Unii podobnie jak Czechy czy Węgry, jednak na listę uprawnionych do udziału w Adobe AIR Developer Derby wpisani nie zostaliśmy…

Swoją drogą pisząc tego posta odkryłem, że Rumunia ma również swoją wersję językowa. Tak samo bogata jak nasza.

Getter/setter w FMS2

czwartek, Czerwiec 28th, 2007

Oczywiście tak naprawdę FMS2 to wykastrowany JavaScript1.5 na sterydach, zatem większość myków z dokumentacji przejdzie jak pocisk z magnum przez wczorajsze wydanie Faktu. Co jest, a czego nie ma można wykminić przez proste trace'y:

Actionscript:
  1. trace(Number.prototype.toPrecision);

A to próbka dodawania akcesorów do prototypu:

Actionscript:
  1. function Testuj (){}
  2. Testuj.prototype.dawaj getter = function ()
  3. {
  4. return "Zawsze 3";
  5. }
  6. Testuj.prototype.dawaj setter = function (n)
  7. {
  8. trace("Zawsze "+n);
  9. }
  10. a = new Testuj();
  11. trace(a.dawaj)
  12. a.dawaj = 10;

Ciekawe kiedy zaskoczą nas trójeczką?

Bezpieczeństwo aplikacji FMS

piątek, Czerwiec 22nd, 2007

Tekst jest skierowany do osób zajmujących się poważniej FMS i rozumiejących ideę frameworka server-side Flash Media Servera 2. Jak znajdę trochę czasu to może coś więcej o tym napiszę, bo widzę, że w naszym pięknym kraju mało kto lubi dzielić się wiedzą. A ci co się już decydują sa hackowani ;) Póki co polecam ten artykuł. Jest stary jak świat, ale też jak dobre wino. Bardziej to z racji samego FMS, który w wersji drugiej nadal oparty jest na mozillowym SpiderMonkey. Adobiu! Czas na Tamarina w FMS3...

Przyszło mi rozszerzyć funkcjonalność wideoczata o moderację wypowiedzi. Moderowanie działa na zasadzie kolejkowania wiadomości w SharedObject. Moderator może się podłączyć do takiego obiektu i zarządzać listą wypowiedzi. Zawsze możemy sobie zhardkodować taki obiekt po stronie serwera i tylko ktoś posiadający wersję moderatorską czata będzie wiedział gdzie się podłączać. Ale po co cokolwiek hardkodować, jeśli można wszystko zrobić prostą metodą znaną chociażby z ciasteczek przeglądarki.

Jak wiadomo komponenty po stronie serwera mogą być dynamicznie tworzone. To dzięki temu najbardziej oporny z tfurców będzie potrafił sklecić czata. Magia dzieje się z pomocą dynamicznej instancjacji (facade.asc). Zblokować to możemy łatwo ustawiając naszą klasę do zarządzania moderowaniem na niedynamiczną. Dzięki temu nikt niepowołany nie stworzy własnej instancji komponentu moderowania po stronie serwera. Ok, mamy już bezpieczeństwo, nie rezygnując z zalet jakie daje nam koncepcja frejmłorku. Teraz wypadałoby stworzyć obiekt. I tu przechodzimy do clue. Chat posiada publiczną metodę turnOnModeration, która zwraca nazwę obiektu "moderatora". Dzięki tej nazwie możemy dokonywać magii po stronie serwera. Oczywiście wąskim gardłem jest takie zabezpieczenie metody turnOnModeration, żeby nie zwracała tej nazwy niepożądanym użyszkodnikom. Ale to temat na inny wpis.

Teraz wystarczy tylko stworzyć obiekt o losowej nazwie i zwrócić ją uprawnionemu użytkownikowi. Pomysł jest podobny do tego w jaki sposób przechowuje profile Adobe Flash Player, czy Thunderbird. Jeśli nie znam nazwy katalogu (tu: obiektu), to znając jego strukturę (tu: API) po stronie klienta, czy nawet serwera serwera nic nie wskóram. Tym sposobem możemy (chociaż nie musimy) załączyć API do moderowania w zwykłym, uniwersalnym kliencie. Teraz każdy domorosły chakier, nawet wyposażony w ostatnią wersję ASV, może nam nafiukać.

Actionscript:
  1. function NameGenerator (length)
  2. {
  3. //Dlugosc podstawowej nazwy:
  4. this.length = (length <= 0 || length == undefined || length> 31)? 8 : length;
  5. var now = new Date();
  6. this.weeks = new Date(now.getYear()+1900, now.getMonth(), now.getDate(), now.getHours());
  7. }
  8. //Podstawowe, dozwolone znaki w nazwie:
  9. NameGenerator.CHARS = "ABCDEFGHIJLMNOPQRSTUVWXYZabcdefghjklmnopqrstuvwxz";
  10.  
  11. NameGenerator.prototype.getName = function ()
  12. {
  13. var name = "";
  14. var i = this.length;
  15. var rl = NameGenerator.CHARS.length;
  16. while (i--)
  17. name += NameGenerator.CHARS.charAt(Math.floor(Math.random()*rl));
  18. //Zwracamy nazwe z malym timestampem pomniejszanym o losowa wartosc:
  19. return name+((new Date()-Math.floor(Math.random()*1e4))-this.weeks);
  20. }

NameGeneratora używam do tradycyjnego tworzenia komponentów po stronie serwera, a następnie informuję klienta-moderatora "gdzie" jest instancja. Potem zabawa wygląda tak jak przy każdym innym komponencie. Tworzymy po stronie klienta obiekt tej klasy z otrzymaną nazwą i hasanko! Zatem krzywa uczenia się dla rozumiejących temat jest prawie płaska. Oczywiście, jeśli ktoś w trakcie sesji przechwyci tę nazwę to amba. Ale jeśli komuś się to uda, to znaczy, że może przechwycić dużo więcej niemiłych rzeczy. A nazwa obiektu moderatora to będzie wtedy pikuś.