Nautilus y el CoverFlow: Gloobus-Flow

Feb 5th, 2010 | Posted by Zarovich | Filed under Desarrollo

Interesantes avances en una de las ramas de github de nautilus. La implementación de un Cover-Flow al estilo Finder para el Nautilus. Esto no significa que vaya a formar parte del nautilus oficial, pero cabe la posibilidad de que acabe formando parte. Simplemente disfrutar con el video.

Bookmark and Share

Autenticación de Tuenti en C#

Feb 4th, 2010 | Posted by Zarovich | Filed under Desarrollo, Social

Lo conseguí!!!. Al fin fui capaz de hacer que mi API de Tuenti, aún muy verde todo sea dicho de paso, sea capaz de realizar la autenticación. Y la verdad es que quedó de lo más mono el método de autenticación.

Lo primero de todo. Este método de autenticación en realidad sirve para practicamente cualquier servicio web que esté expuesto. Por ejemplo para utilizar el servicio GoogleAccount simplemente habría que hacer algo parecido.

Lo importante es que la aplicación sea capaz de recibir el certificado del SSL y después de eso trabajar sobre él, tranquilamente. De todas formas hay una cosa que tuve que activar después de investigar un poco por internet que no acabo de entender muy bien su necesidad.

Como la API la estoy desarrollando para tener compatibilidad con Mono, y la distro mayoritaria actualmente es Ubuntu, y Ubuntu aún tiene la versión 2.4.X de Mono (la 2.6.X salió en Diciembre, así que hasta la 10.4 no cambiaré eso), tuve que prescindir del ServicePointManager.ServerCertificateValidationCallback y en su lugar usar el obsoleto ServicePointManager.CertifyPolicy para poder decirle que certificados debe aceptar y cuales no. Conste que si estás usando .NET 3.0 puedes tranquilamente utilizar el ServerCertificateValidationCallback sin miedo, que funcionará perfectamente. No lo garantizo, pero según he leido si, debería de funcionar.

La implementación del ICertifyPolicy que meto ahí es la siguiente.

class MyCertPolicy : ICertificatePolicy
{
	public bool CheckValidationResult(ServicePoint sp, X509Certificate cert,
      	WebRequest request, int problem)
	{
		return true;
	}
}

Bien, ahora ya aceptaremos cualquier certificado que recibamos en una conexión SSL dentro de nuestra aplicación. Conste que esto no es lo más recomendable, pero en las primeras versiones para ir tirando eso quedará así. Nos fiamos de los chicos de Tuenti.

Luego para decirle que use nuestra política de certificados

ServicePointManager.CertificatePolicy = new MyCertPolicy();
ServicePointManager.Expect100Continue = false;

Parece algo violento todo este cirio, pero es lo que hay. Lo siguiente será configurar la linea que será la que se envíe en el POST al servidor. Esta línea contendrá 4 parámetros, mail, password, timezone, remember; desconozco si el do_login acepta más.

// creating login data
ASCIIEncoding encoding = new ASCIIEncoding();
string userName = this.Mail;
string passwd = this.Passwd;
string timeZone = "1";
string remember = "1";
string postData = "email="+userName+"&input_password="
	+passwd+"&timezone=" + timeZone + "&remember=" + remember;
byte[] data = encoding.GetBytes(postData);

Tras esto habrá que construir la petición que se realizará al servidor, el tipo de petición que se realizará
será a través de HTTP. Así que necesitamos un HTTPWebRequest que apunte al servicio de Tuenti que queremos utilizar, en este caso do_login de Login. Es importante decirle a la petición que estamos haciendo un POST, el tipo de contenido que vamos a enviar en el POST y la longitud de dicho contenido. Y una cosa muy importante, decirle que ignore las redirecciones del servidor. Si al hacer login nos responde con un 302 Found para redireccionarnos, es mejor no hacerle caso, porque en la respuesta 302 está toda la información que necesitamos y no la podemos ignorar.

// login request to tuenti
HttpWebRequest hwr =
	(HttpWebRequest)WebRequest.Create(
	        "http://www.tuenti.com/?m=Login&func=do_login");
Console.WriteLine(hwr.RequestUri.AbsoluteUri);
hwr.Method = "POST";
hwr.ContentType="application/x-www-form-urlencoded";
hwr.ContentLength=data.Length;
Stream newStream = hwr.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
hwr.AllowAutoRedirect = false;

Ahora por último, debemos coger lo que nos interesa de la respuesta 302. La petición de redirección repito que nos da igual. Porque me imagino que el motivo de esto, es que el navegador que estemos utilizando, cuando recibe la 302 guarda las cookies que mandan en esta respuesta, y te manda de nuevo a la pantalla de Login. Al ir a la pantalla de login con las cookies metidas, el navegador las manda y Tuenti automáticamente nos manda a la página de Inicio de nuestro perfil o a la que hayamos intentado acceder sin estar autenticados.

Así que cogemos la cookie que nos interesa, que en concreto es la sid, que es donde están nuestros datos de autenticación y sobretodo el dato más importante, el sid (Session ID), con el Tuenti identificará la sesión abierta.

HttpWebResponse response = (HttpWebResponse) hwr.GetResponse();
string cookieString=response.GetResponseHeader("set-cookie");
this.cookie = new Cookie("sid", cookieString.Substring(4,70));
this.cookie.Expires = DateTime.Parse(cookieString.Substring(84, 29));
this.cookie.Domain = ".tuenti.com";
this.cookie.Path = "/";

Que podemos hacer ahora con esta Cookie, podeis probarlo vosotros mismos a tratar de hacer un HTTPWebRequest a cualquier otra página de Tuenti, mandando esta Cookie. Si todo está bien la página
de respuesta es la pantalla de carga. Ahora bien para evitar toparnos con la pantalla de carga, podemos acceder a servicios tan interesantes, como el que devuelve la página de nuestro perfil directamente.


http://www.tuenti.com/?m=profile&func=my_profile

Proximamente estará subida la primera revisión de Tuenti.NET en el repositorio de Git.
Página de proyecto en Gitorious

Ahí teneis un pequeño esbozo de lo que pretendo conseguir en un principio con esta API. Que conste que avanzará lento, porque estoy a otras cosas.

Bookmark and Share

Investigando Tuenti

Feb 4th, 2010 | Posted by Zarovich | Filed under Desarrollo, Social

Esta noche después de cenar retomé mis investigaciones acerca de Tuenti. Hace tiempo estuve tratando de empezar a montar una API para Mono/.NET para interactuar con Tuenti. El tema es que la API hay que hacerla totalmente a mano, ya que Tuenti actualmente no dispone de API pública.

En capítulos anteriores no narrados en el blog…

En su momento para hacer pruebas de recuperar la respuesta HTTP que manda me puse a lanzar requests desde mi librería a ver que me respondía. El caso es que siempre me mandaba a la página de Login (al menos no me ignora diciendo que no estoy usando un navegador soportado). En un principio quería forzar la autenticación, simplemente para tratar de parsear el HTML de la página de inicio de Tuenti una vez se está logueado. Para ello fui al Chrome eché un vistazo a las Cookies que tiene guardadas de Tuenti y las cree a pelo y las añadi al HTTPWebRequest. Así conseguí que mandase de respuesta la página de inicio de Tuenti. BIEN.

Teoricamente la respuesta según la cabecera del HTML de respuesta debería de ser XHTML. Si fuese XHTML esto debería de poder ser parseado tal cual como un XML. El caso es que la respuesta no es XML válido. Me imagino que eliminan algunos tags con el fin de ahorrar algunos bytes en la transferencia (esto fue a raíz de una conversación que tuve esta tarde con mi colega raziel). Así que el parseador XML de .NET/Mono lanza una excepción diciendo que el XML no es válido y no puede parsearlo.
Read more…

Bookmark and Share

Id Software está buscando gente.

Feb 3rd, 2010 | Posted by Zarovich | Filed under Desarrollo, Juegos, Social

¿Que será lo más interesante de la noticia?, ¿Que Id Software te pueda contratar o que te quieran contratar para colaborar en su próximo gran proyecto?.

Y cual es su próximo gran proyecto. Estamos próximos a la llegada de Rage, no cabe duda. Pero que es lo que vendrá después de Rage… Parece que según esta foto su próximo gran proyecto es Doom. Otra vez el retorno del clásico de entre los clásicos después del grandioso Doom III.

Read more…

Bookmark and Share

Tutorial JUnit en Eclipse

Ene 31st, 2010 | Posted by Zarovich | Filed under Desarrollo, Tutorial

JUnit es un framework desarrollado para la realización de tests de unidad. Tiene como principal característica poder definir Tests de forma rápida y sencilla a través de la utilización de etiquetas. También es posible crear clases que sirvan para lanzar conjuntos de tests (TestSuite) y de esta manera automatizar más aún el proceso.

Veamos un ejemplo rápido que espero os ayude a comprender la creación de tests de unidad de una forma eficaz en Eclipse SDK Galileo.

Primero de todo vamos a crear un nuevo proyecto, para ello vamos a File->New->Java Project o pulsamos Shift+Alt+N y seleccionamos Java Project. Da igual el nombre que se le ponga, aseguraros de que teneis la última versión de Java seleccionada, en este caso yo estoy trabajando con JavaSE-1.6.

Read more…

Bookmark and Share