1984 giorni di propaganda negativa contro la Apple

Il prestigioso giornale on line osnews ha promesso 1984 giorni di pubblicità negativa. Tutto è nato dopo il rifiuto della Apple di pubblicare Google Voice app sul loro store. E’ stato l’ennesimo rifiuto che ha fatto traboccare il vaso per l’editore di osnews. L’obiettivo è ottenere una piattaforma veramente aperta, libera dal controllo e senza restrizioni dei gestori che vogliono sfruttare tutto al massimo. Finchè questo non cambia anche per me le alternative che promoverò a scapito del iPhone sono chiare: Android, Symbian e perfino Windows Mobile.

Relaxing SSL validation for JaxWS

I’ve recently had the need to access a web service developed in .Net and signed with a self signed certificate. I’ve decided to use the JaxWS and the Metro stack to develop the client and run it on Java6. As a plus, the service was protected with username and password. The service was exposed on an IP address and I repetedly had problems in establishing a connection. In the end, thanks to this article, it was obvious that the certificate was not created with the alternative name attribute but it was not an option to change the certificate as the web service was already used by other consumers (.net clients don’t suffer by this issue). So, on my quest to relax the validation, I’ve found out this article and code snippet, which did not compile at first (I guess package names were changed in JDK6) so I’ve did some trivial refactoring and now, after invoking the static methods in the client code, the SSL connection gets validated with no problems. Hope it helps and thanks to the original authors. / To change this template, choose Tools | Templates * and open the template in the editor. / package adhocclient2; /** * @author schrepfler / import java.security.GeneralSecurityException; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; /** This class provide various static methods that relax X509 certificate and * hostname verification while using the SSL over the HTTP protocol. @author Francis Labrie */ public final class SSLUtilities { / * Hostname verifier for the Sun’s deprecated API. * * @deprecated see {@link #_hostnameVerifier}. */ private static HostnameVerifier __hostnameVerifier; / * Thrust managers for the Sun’s deprecated API. * * @deprecated see {@link #_trustManagers}. */ private static TrustManager[] __trustManagers; / * Hostname verifier. */ private static HostnameVerifier _hostnameVerifier; / * Thrust managers. */ private static TrustManager[] _trustManagers; / * Set the default Hostname Verifier to an instance of a fake class that * trust all hostnames. This method uses the old deprecated API from the * com.sun.ssl package. * * @deprecated see {@link #_trustAllHostnames()}. */ private static void __trustAllHostnames() { // Create a trust manager that does not validate certificate chains if (__hostnameVerifier == null) { __hostnameVerifier = new _FakeHostnameVerifier(); } // if // Install the all-trusting host name verifier HttpsURLConnection.setDefaultHostnameVerifier(__hostnameVerifier); } // __trustAllHttpsCertificates / * Set the default X509 Trust Manager to an instance of a fake class that * trust all certificates, even the self-signed ones. This method uses the * old deprecated API from the com.sun.ssl package. * * @deprecated see {@link #_trustAllHttpsCertificates()}. */ private static void __trustAllHttpsCertificates() { SSLContext context; // Create a trust manager that does not validate certificate chains if (__trustManagers == null) { __trustManagers = new TrustManager[]{new _FakeX509TrustManager()}; } // if // Install the all-trusting trust manager try { context = SSLContext.getInstance(“SSL”); context.init(null, __trustManagers, new SecureRandom()); } catch (GeneralSecurityException gse) { throw new IllegalStateException(gse.getMessage()); } // catch HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory()); } // __trustAllHttpsCertificates / * Return true if the protocol handler property java. * protocol.handler.pkgs is set to the Sun’s com.sun.net.ssl. * internal.www.protocol deprecated one, false * otherwise. * * @return true if the protocol handler * property is set to the Sun’s deprecated one, false * otherwise. */ private static boolean isDeprecatedSSLProtocol() { return (“com.sun.net.ssl.internal.www.protocol”.equals(System.getProperty(“java.protocol.handler.pkgs”))); } // isDeprecatedSSLProtocol / * Set the default Hostname Verifier to an instance of a fake class that * trust all hostnames. */ private static void _trustAllHostnames() { // Create a trust manager that does not validate certificate chains if (_hostnameVerifier == null) { _hostnameVerifier = new FakeHostnameVerifier(); } // if // Install the all-trusting host name verifier: HttpsURLConnection.setDefaultHostnameVerifier(_hostnameVerifier); } // _trustAllHttpsCertificates / * Set the default X509 Trust Manager to an instance of a fake class that * trust all certificates, even the self-signed ones. */ private static void _trustAllHttpsCertificates() { SSLContext context; // Create a trust manager that does not validate certificate chains if (_trustManagers == null) { _trustManagers = new TrustManager[]{new FakeX509TrustManager()}; } // if // Install the all-trusting trust manager: try { context = SSLContext.getInstance(“SSL”); context.init(null, _trustManagers, new SecureRandom()); } catch (GeneralSecurityException gse) { throw new IllegalStateException(gse.getMessage()); } // catch HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory()); } // _trustAllHttpsCertificates / * Set the default Hostname Verifier to an instance of a fake class that * trust all hostnames. */ public static void trustAllHostnames() { // Is the deprecated protocol setted? if (isDeprecatedSSLProtocol()) { __trustAllHostnames(); } else { _trustAllHostnames(); } // else } // trustAllHostnames / * Set the default X509 Trust Manager to an instance of a fake class that * trust all certificates, even the self-signed ones. */ public static void trustAllHttpsCertificates() { // Is the deprecated protocol setted? if (isDeprecatedSSLProtocol()) { __trustAllHttpsCertificates(); } else { _trustAllHttpsCertificates(); } // else } // trustAllHttpsCertificates / * This class implements a fake hostname verificator, trusting any host * name. This class uses the old deprecated API from the com.sun. * ssl package. * * @author Francis Labrie * * @deprecated see {@link SSLUtilities.FakeHostnameVerifier}. */ public static class _FakeHostnameVerifier implements HostnameVerifier { / * Always return true, indicating that the host name is an * acceptable match with the server’s authentication scheme. * * @param hostname the host name. * @param session the SSL session used on the connection to * host. * @return the true boolean value * indicating the host name is trusted. */ public boolean verify(String hostname, SSLSession session) { return (true); } } // _FakeHostnameVerifier / * This class allow any X509 certificates to be used to authenticate the * remote side of a secure socket, including self-signed certificates. This * class uses the old deprecated API from the com.sun.ssl * package. * * @author Francis Labrie * * @deprecated see {@link SSLUtilities.FakeX509TrustManager}. */ public static class _FakeX509TrustManager implements X509TrustManager { / * Empty array of certificate authority certificates. */ private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{}; / * Always return true, trusting for client SSL * chain peer certificate chain. * * @param chain the peer certificate chain. * @return the true boolean value * indicating the chain is trusted. */ public boolean isClientTrusted(X509Certificate[] chain) { return (true); } // checkClientTrusted / * Always return true, trusting for server SSL * chain peer certificate chain. * * @param chain the peer certificate chain. * @return the true boolean value * indicating the chain is trusted. */ public boolean isServerTrusted(X509Certificate[] chain) { return (true); } // checkServerTrusted / * Return an empty array of certificate authority certificates which * are trusted for authenticating peers. * * @return a empty array of issuer certificates. */ public X509Certificate[] getAcceptedIssuers() { return (_AcceptedIssuers); } // getAcceptedIssuers public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { throw new UnsupportedOperationException(“Not supported yet.”); } public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { throw new UnsupportedOperationException(“Not supported yet.”); } } // _FakeX509TrustManager / * This class implements a fake hostname verificator, trusting any host * name. * * @author Francis Labrie */ public static class FakeHostnameVerifier implements HostnameVerifier { / * Always return true, indicating that the host name is * an acceptable match with the server’s authentication scheme. * * @param hostname the host name. * @param session the SSL session used on the connection to * host. * @return the true boolean value * indicating the host name is trusted. */ public boolean verify(String hostname, SSLSession session) { return (true); } // verify } // FakeHostnameVerifier / * This class allow any X509 certificates to be used to authenticate the * remote side of a secure socket, including self-signed certificates. * * @author Francis Labrie */ public static class FakeX509TrustManager implements X509TrustManager { / * Empty array of certificate authority certificates. */ private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{}; / * Always trust for client SSL chain peer certificate * chain with any authType authentication types. * * @param chain the peer certificate chain. * @param authType the authentication type based on the client * certificate. */ public void checkClientTrusted(X509Certificate[] chain, String authType) { } // checkClientTrusted / * Always trust for server SSL chain peer certificate * chain with any authType exchange algorithm types. * * @param chain the peer certificate chain. * @param authType the key exchange algorithm used. */ public void checkServerTrusted(X509Certificate[] chain, String authType) { } // checkServerTrusted /** * Return an empty array of certificate authority certificates which * are trusted for authenticating peers. * * @return a empty array of issuer certificates. */ public X509Certificate[] getAcceptedIssuers() { return (_AcceptedIssuers); } // getAcceptedIssuers } // FakeX509TrustManager } // SSLUtilities

Frontiers 09 - Verde e Internet

Chi l’ha detto che internet delle cose non possa essere anche verde e collaborare con la natura? questo è uno dei temi che oggi si affrontano a frontiers accanto ai soliti tempi di interaction design. La sala è ormai piena, tra poco si inizia annunciano al microfono, i vari speacker stanno finendo le slide e si mettono a posto le varie demo. In regia come sempre dolmedia.

June 8, 2009 · 1 min · 67 words ·  Yoghi

All your base are belong to us

Oracle ha comprato la Sun per $7.4 miliardi. In attesa che l’accordo venga approvato pensiamoci un attimo. La Oracle ora possiede Oracle DBMS, MySQL e Berkley DB. E proprio ora di dire Tutte le vostre basi ci appartengono! Meno male che uso postgresql :)

Google App Engine introduce Java

E’ un dato di fatto che spesso, la piattaforma di sviluppo che scegliamo è collegata con i servizi di hosting che esistono. Le preferenze personali semplicemente passano in secondo piano. LAMP è un successo mondiale sopratutto perche esistono migliaia siti di hosting pronti e a basso costo. .Net è un “fallimento” lato server perche i server non sono gratis e aperti. Java ha i server gratis e aperti, ma presenta i problemi. Se un host provider mette a disposizione un application/servlet container, come dare un servizio che scala e contemporaneamente proibire ai sviluppatori di fare idiozie che potrebbero mettere in ginocchio il sistema o lasciarlo meno sicuro, alla fine avete a disposizione tutte le API del JDK. Aggiungiamo anche il fatto che i requisiti neccessari sono più esigenti in termini di RAM e CPU messi a confronto con LAMP. Un problema non da poco che gli ingegneri della Google hanno deciso di affrontare e offrire una soluzione tutta loro. Google App Engine, che fin’ora offriva Python come piattaforma di sviluppo, ora offre anche Java. Per il momento, è in fase di “prova” e limitato ai primi 10'000 sviluppatori che faranno la richiesta (10 siti a testa). Chi sarà il fortunato, vedrà che la Java VM è stata modificata, le modifiche principali sono ...

GWT SuggestBoxReloaded

This article will present how to implement a GWT 1.6 (RC2) SuggestBox with backing hidden fields, RPC calls and not query the server on every character event. While integrating GWT on work, I needed to implement a SuggestBox with a backend RPC service but I had some requirements that the default SuggestBox didn’t fulfill. Namely, I needed that the suggestion sets hidden fields (ex. displaying a human readable name for the user and setting a hidden id field). The solution presented in GWT SuggestBox backed by DTO Model and the Using the GWT SuggestBox with RPC were very helpful in creating this example project. I advise you to read/implement them before reading further in order to understand the issues. The first article hit the sweet point on how to pass hidden values using the DTO pattern, you can either wrap your hidden fields (Hidden.wrap) or as in this example we’ll instantiate them using GWT and add them to the panel. The next issues were following, 1. You need to be able to clear the value either by a button or by deleting the text in the TextBox, 2. The Lombardi solution presented an issue as it sent out every query string, 3. Enable some sort of reusability of the generated javascript client. First of all I created three basic Suggestion classes, IdEnabledSuggestion, TextEnabledSuggestion and SimpleSuggestion. These three probably cover 90% of the cases (actually, the TextEnabledSuggestion can replace IdEnabledSuggestion just as well), otherwise you can add a DTO with the data you need, just remember that you must put the DTO class in the /client package, in my first trials I had it outside which led to problems. public class IdEnabledSuggestion implements IsSerializable, Suggestion { private String displayString, replacementString; private Long id; public IdEnabledSuggestion(){ } public IdEnabledSuggestion(String displayString, String replacementString, Long id){ this.displayString = displayString; this.replacementString = replacementString; this.id = id; } public String getDisplayString() { return displayString; } public String getReplacementString() { return replacementString; } public Long getId() { return id; } } Then you extend the RemoteService interface and also the Async version. In order to achieve reusability, I’ve added an enum that acts as a switch, that way I can group all suggestion methods under the same servlet. A even more flexible solution would be to add a text parameter to the javascript client that would switch the endpoint ending on separate url’s, probably using ServiceDefTarget.setServiceEntryPoint(String), but as I don’t really like declaring a servlet for each endpoint I would recommend that solution with some kind of rest/mvc framework, I would love to see someone extending this example with struts2 and spring mvc endpoints :) @RemoteServiceRelativePath(“oracle”) public interface OracleService extends RemoteService { public SuggestOracle.Response getSuggestions(SuggestOracle.Request search, Oracles oracle); public static class Util { public static OracleServiceAsync getInstance() { OracleServiceAsync instance = (OracleServiceAsync) GWT.create(OracleService.class); return instance; } } } In order to solve the second issue, and avoid sending queries on every key event, I have extracted a SuggestOracle.Request and SuggestOracle.Callback on a instance level. When a user inserts a query, I temporarily set the variables and schedule the timer, this way, even if new events come, they overwrite the instance variables effectively caching them for later so when the time passes the service gets invoked once and only once with the last query. It’s a simple trick that produces the expected actions and I hope I’m not missing some threading, timer or leakage issue? I’ve added also setters so that you can set your delay and minimum number of characters needed to send the query. I then wrap the Hidden, the SuggestBox and a widget that implements HasClickHandlers in a object that adds the various handlers to manage form state and you are good to go. :) public class HiddenSuggestBox { private SuggestBox suggestBox; private Hidden hidden; private HasClickHandlers clearWidget; public HiddenSuggestBox(SuggestBox suggestBox, Hidden hidden, HasClickHandlers clearWidget) { super(); this.suggestBox = suggestBox; this.hidden = hidden; this.clearWidget = clearWidget; this.suggestBox.addSelectionHandler(new MySelectionHandler()); this.suggestBox.getTextBox().addValueChangeHandler(new ClearTextBox()); this.clearWidget.addClickHandler(new ClearValueHandler()); } private class MySelectionHandler implements SelectionHandler<suggestion> { public void onSelection(SelectionEvent<suggestion> event) { if(event.getSelectedItem() instanceof TextEnabledSuggestion){ TextEnabledSuggestion suggestion = (TextEnabledSuggestion)event.getSelectedItem(); hidden.setValue(suggestion.getText()); } else if(event.getSelectedItem() instanceof IdEnabledSuggestion){ IdEnabledSuggestion suggestion = (IdEnabledSuggestion)event.getSelectedItem(); hidden.setValue(suggestion.getId()+""); } else { hidden.setValue(event.getSelectedItem().getReplacementString()); } } } private class ClearTextBox implements ValueChangeHandler<string> { public void onValueChange(ValueChangeEvent<string> event) { if(event.getValue().trim().equals("")){ suggestBox.getTextBox().setValue(""); hidden.setValue(""); } } } private class ClearValueHandler implements ClickHandler { public void onClick(ClickEvent event) { hidden.setValue(""); suggestBox.setValue(""); } } } eclipse project archive You might need to set JVM in launcher and ant script.

Quali saranno gli eroi del futuro?

Dal sito Hero Factory è possibile disegnare il proprio eroe. un modo carino per passare 5 minuti di relax creativo!

March 15, 2009 · 1 min · 20 words ·  Yoghi

Link della settimana

Un po di link carini che ho scovato in questi giorni : unetbootin, make usb bootable Func client/server per l'esecuzione di script bash remoti (write in python) Twisted dei Matrix Labs, piattaforma scritta in python per la comunicazione in rete. DTN Routing Simulator Gift di natale da MacHeist aka software free EcoFont font da usare per risparmiare inchiostro

December 22, 2008 · 1 min · 58 words ·  Yoghi

Natale

Natale si avvicina cosi ho pensato di mettere un tema un po natalizio, come vedete non è un tema troppo fino, ma ho poco tempo per fare tante cose e nn riesco a curarne i dettagli :) Qualcuno (nessuno) noterà mai che con wp 2.7+ le codifiche degli accenti sono cambiate e quindi nei post vecchi appariranno sbagliate! Buone feste.

December 22, 2008 · 1 min · 60 words ·  Yoghi

La banca delle "disponibilità "

Domenica ho sentito quest’idea e mi è subito piaciuto, ora non ho tempo di spiegarla nel dettaglio ma mi è piaciuta assai; in breve è un luogo (anche virtuale) in cui ogni individuo può mettere l’informazione di sapere/conoscere qualcosa e chi ha necessià di un chiarimento al riguardo lo può contattare. Voi direte abbiamo scoperto l’acqua calda, esistono già forum e altri mezzi per aiutarsi ma quello che secondo me è interessante è che se fosse fatto a livello di “quartiere” potrebbe essere un modo molto utile per aiutarsi e aiutare gli emigrati (regolari eh!) e conoscere la realtà del nostro quartiere, che di solito si tende a non conoscere, si conosce a volte solo il condominio in cui si abita e poco più. Sarebbe anche un modo per diminuire le fregature…. è una bozza, magari dopo scrivo meglio, ma son oberato di impegni.

December 4, 2008 · 1 min · 144 words ·  Yoghi