poniedziałek, 11 kwietnia 2011

Bye, bye Yandex!

Niestety wymieniony wcześniej sposób nie zadziałał. Próbowałam nawet blokować pojedyncze IP,  ale i to nie pomogło.
Rzecz była w tym, ze tomcat do nasłuchiwania na porcie 80 nie korzysta z inet-u. Poniżej krótkie wyjaśnienie, dlaczego blokada nie działała:

Files hosts.allow and hosts.deny work through a daemon (a program running in the background) called inetd. (On some systems, xinetd is used.) Other files used by inetd are /etc/services and /etc/inetd.conf. The purpose of inetd is to listen on various ports; when it accepts a connection on one of these ports, it fires up the appropriate service.

You can set up your system so that one of the services that inetd passes off connections to is a web server. For the purpose of efficiency, though, most systems do not have their web servers set up that way; they listen directly to the appropriate ports (usually port 80 at least).

If your web server is configured so that it listens directly to the appropriate ports, then inetd is not offering the protection you request in file hosts.deny. There's nothing wrong with this; you just have to configure your web server (Apache, in your case?) to provide the appropriate protection.


Więc się wkurzyłam i żeby nie grzebać bezpośrednio w iptables'ach wykorzystałam programik Ulatra Simple Firewall.
wystarczyło wpisać:

ufw insert 1 deny from 77.88.0.0/16
ufw enable
ufw status  #wyswietl reguly

Rekordy wpisywane są chyba jako reguły do iptables, więc należy pamiętać o ich dobrej kolejności. Jeśli mechanizm napotka pierwszą pasującą regułę, nie będzie uwzględniał już dalszych. I tak, "Insert 1" wstawił regułę na pierwszym miejscu, natomiast gdyby przed tym znajdowała się reguła pozwalająca się łączyć wszystkim komputerom, to nasza reguła zostałaby zignorowana.

wtorek, 29 marca 2011

yandex-fucking-machine

Dziś będzie o nadpobudliwym, nadgorliwym pająku, który generuje mi na witrynie średnio sto wejść dziennie, a zdarzyło się i kilkaset. Mało tego, przez parę godzin potrafi 'wisieć' na stronie.
Mowa o crawlerze (a właściwie crawlerach, gdyż jest ich wiele) rosyjskiej wyszukwiarki yandex.ru, które są niesamowicie - że użyję kolokwializmu - upierdliwe. Boty google wydają się być o wiele mniej inwazyjne.
Do tego nie da się yandexa zablokować przy pomocy uznawanego za standard wśród wyszukiwarek - pliku robots.txt, gdyż nie są one przez niego akceptowane.
Pozostaje sobie ściągnąć albo https://github.com/sickill/yandex-fucking-machine

albo dodać wpis do hosts.deny
ALL: 77.88.0.0/16
Żeby było wiadomo o czym mowa, poniżej rysunek poglądowy, który unaocznia nam pokemonowo-predatorski charaketer rosyjskiej wyszukiwarki (właściwy Yandex umiejscowiony jest w nosie pikaczu, czyli w Moskoł). Zwolenników teorii spiskowych proszę o zwrócenie uwagi, na jaki kraj żółty zwierz poluje ;)

piątek, 25 marca 2011

Guice kontra Spring w wersji zjadliwej

 Na artykuł znajdujący sie pod linkiem http://jroller.com/habuma/entry/guice_vs_spring_javaconfig_a natknęłam się już bardzo dawno, ale chciałabym go tutaj przytoczyć i to nie tylko z uwagi na jego wartość merytoryczną, ale także na sposób prezentacji wiedzy. Co mnie w nim urzekło?
Ano, domain objects, bez wątpienia. O ileż przyjemniej czyta się takie porównanie, na przykładzie rycerzy okrągłego stołu, a to wszystko okraszone przyśpiewkami minstrela*
W sytuacji, gdy obiekty domeny nie są abstrakcyjne, a wręcz przeciwnie - są konkretne i jaskrawo odznaczają się na tle reszty kodu, niesiona treść automatycznie staje się bardziej przejrzysta i co za tym idzie, łatwa do zrozumienia.



* no dobra, pod warunkiem, że terminy nie gonią a rozwścieczony szef nie sterczy nam nad ramieniem


niedziela, 6 marca 2011

indeksacja

Niby proste i każde dziecko różniczkowe powinno to potrafić, a jednak...

int index=0;
indices[index]=index++;

Czy powyższy kod przypisuje wartość do elementu zerowego tablicy czy też pierwszego?
Rzecz rodem ze stajni na egzamin certyfikacyjny Sun'a.
Czy Ty, młody Polaku, znasz odpowiedź bez mrugnięcia okiem? Ja musiałam sobie sprawdzić kodowniczo ;)

środa, 16 lutego 2011

Wicket+Atom

Tak na szybko... przy pomocy Xstream'a

1. Klasa, na podstawie której generowany będzie feed:

    @XStreamAlias("rss")  
    public class Atom {  
        @XStreamAsAttribute  
        @XStreamAlias("xmlns:atom")  
        String xmlns="http://www.w3.org/2005/Atom";  
        @XStreamAsAttribute  
        String version="2.0";  
        public channel channel=new channel();  
          
        public static class channel {  
           public String title;  
           public String subtitle;  
           public String link;  
           @XStreamAlias("atom:link")  
           public AtomLink atomLink;  
           public String language;  
           public Date lastBuildDate;  

           @XStreamImplicit(itemFieldName = "item")  
             public List entries=new ArrayList();  
          }  
          public static class AtomLink {  
             @XStreamAsAttribute  
             public String href;  
             @XStreamAsAttribute  
             public String rel="self";  
          }  
          public static class Entry {  
             public String title;  
             public String link;  
             public String description;  
             public Date pubDate;  
          }  
     }  
2. Wicket WebResource class:
   public class AtomWebResource extends WebResource {  
       public static Logger log = LoggerFactory.getLogger(AtomWebResource.class);  
       
      @Override  
      protected int getCacheDuration() {  
          return 0;  
      }  
         
      @Override  
      public IResourceStream getResourceStream() {  
          return new AbstractResourceStreamWriter() {  
              public String getContentType() {  
                  return "text/xml; charset=UTF-8";  
              }  
              public void write(OutputStream output) {  
                  try {  
                      BufferedWriter bufferedWriter = new BufferedWriter(new PrintWriter(output));               
                      bufferedWriter.write(getAtom());  
                      bufferedWriter.flush();  
                      bufferedWriter.close();  
                  } catch (IOException e) {  
                      log.error("",e);  
                  }                    
              }              
          };  
      }  
     // w celu optymalizacji, zamiast tworzyć feeda na nowo można go cache'ować   
     private String getAtom() {  
          Atom a=new Atom();  
        a.title="Tytul";
        //... tu wypełniamy wszystkie entry
        return xstream.toXML();
   }
} 
3. Dodanie resource do aplikacji Wicket
public void init() {
    getSharedResources().add(AtomWebResource.class.getName(), new AtomWebResource());
    mountSharedResource("feed", Application.class.getName()+"/"+AtomWebResource.class.getName());           
}
4. Dodanie linkow na stronach
  add(new ResourceLink("rssLink",new ResourceReference(AtomWebResource.class.getName())));
...i w html
       

sobota, 12 lutego 2011

Łączenie z zabezpieczonym WebService z klienta Javy

... a dokładniej łączenie z WebService opartą na EJB przy pomocy loginu i hasła. Jeśli chcemy wykorzystać certyfikaty cała procedura będzie wyglądała całkiem podobnie.

  1. Aplikacja: Nasza usługa powinna mieć annotacje @WebContext z authMethod="BASIC"
@WebService
@Stateless
@WebContext(contextRoot = "ws", authMethod = "BASIC")
public class MyService implements IMyService {

    @Resource
    private SessionContext ctx;
   
    public void foo() {
         String userLogin = ctx.getCallerPrincipal().getName();
         // dostep do loginu
    }
}



   2.  Aplikacja: META-INF/jboss.xml powinien zawierać definicję security domain, wykorzystane zostanie jaas
java:/jaas/MySecurityDomain 

  3.  Serwer: conf/login-config.xml powinien zawierać definicję security domain. W tym wypadku jest to najprostsze z możliwych logowanie przy pomocy user.properties i roles.properties

  
    
    
  


w login-config

  4.  Serwer: w conf powinny znajdować się pliki user.properties i roles.properties, kolejno:
username1=password1
username2=password2

username1=administrator
username2=operator 


Voila! Tyle po stronie serwera. Po stronie aplikacji klienckiej musimy dodać credentiale przed połączeniem się z usługą sieciową. Zakładam, że klient usługi został wygenerowany przez wsimport (albo jakoś tak) JBossa. Robi się to tak:

        import javax.xml.ws.BindingProvider;
        //....
        MyServiceService port = new  MyServiceService();
        IMyService myService = port.getMyServicePort();
        Map requestContext = ((BindingProvider)myService).getRequestContext();
        requestContext.put(BindingProvider.USERNAME_PROPERTY, "username1");
        requestContext.put(BindingProvider.PASSWORD_PROPERTY, "password1");
        myService.foo(); // autoryzowana metoda