Archivo de la Categoría 'Uncategorized'

Pag 2 de 2

Interfaces gráficas al vuelo

Sin lugar a dudas, la tarea mas tediosa de crear un programa, es crear la interfaz gráfica, sobretodo cuando el programa es un script hecho en un rato, que pretende resolver alguna necesidad puntual, de forma sencilla y concisa.

Normalmente, nos encontramos que para crear un par de ventanas preguntando algo al user y eliminar algún archivo y crear una carpeta, tenemos que programar 4 lineas para lo que de verdad hace el programa, y 40 para la interfaz gráfica.

Para evitar esto, nació dialog, una pequeña aplicación que al ser ejecutada, permite pasarle ciertos parámetros que le indican como debe pintar una ventana, la dibuja, y según lo que haga el usuario, el comando devuelve una cosa u otra.

Para entrar mas en detalle, probamos el siguiente comando:

dialog –stdout –title “Selecciona un archivo” –fselect $HOME/ 14 48

Esto nos dibuja una ventana mediante ncurses, que nos permite seleccionar un fichero.

Utilizando esto, se pueden crear pequeños scripts en bash, por ejemplo, que realicen tareas y permitan interactuar al usuario.

Como la idea tubo bastante éxito, se creó Xdialog, que hace lo mismo pero pintando ventanas con GTK, y kdialog que hace lo mismo pero pintando ventanas mediante Qt.

Como para entender las cosas, lo mejor es un buen ejemplo, he creado un pequeño script en bash, que primero comprueba si estamos en las X, si no lo estamos, utiliza dialog, si lo estamos, comprueba si tenemos kdialog para utilizarlo, y si no lo tenemos, usa Xdialog.

#!/bin/bash

if [ -z $DISPLAY ]
then
DIALOG=dialog
else
if command -v kdialog &>/dev/null
then
DIALOG=kdialog
else
DIALOG=Xdialog
fi
fi

$DIALOG –title “Mi primer dialogo” \
–yesno “Si o no?” 10 30

case $? in
0)
echo “Has escogido si!!”;;
1)
echo “Has escodigo no!!”;;
255)
echo “Has cerrado el dialogo, sin decir si o no!!”;;
esac

Este script hace una pregunta, y luego printea por consola la respuesta que hemos escodigo.

Y este es el resultado que vemos usando kdialog.

Otro script que pregunta al usuario por su nombre, y muestra una caja de entrada:

#!/bin/bash

if [ -z $DISPLAY ]
then
DIALOG=dialog
else
if command -v kdialog &>/dev/null
then
DIALOG=kdialog
else
DIALOG=Xdialog
fi
fi

tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap “rm -f $tempfile” 0 1 2 5 15

$DIALOG –title “Un ejemplo con una caja de entrada” \
–inputbox “Caja de entrada de ejemplo:” 16 51 2> $tempfile

retval=$?

case $retval in
0)
echo “Input string is `cat $tempfile`”;;
1)
echo “Cancel pressed.”;;
255)
if test -s $tempfile ; then
cat $tempfile
else
echo “ESC pressed.”
fi
;;
esac

Cabe decir que kdialog no es completamente compatible con dialog y Xdialog, por lo que puede que os encontréis con problemas al intentar utilizar uno u otro de forma transparente.

Como curiosidad, conozco un par de scripts interesantes hechos con dialog, uno de ellos es un script hecho por un conocido mio, que sirve para crackear redes wireless que utilicen seguridad WEP, sin tener que teclear ningún comando:

Airfoncrack

Y aquí tenemos otro ejemplo de como utilizar kdialog y curl para crear una aplicación visual que permite agregar notas a twitter.

Trucos y misterios de meneame

He decidido hacer un paréntesis en el tipo de entradas que agrego al blog, de carácter técnico y dirigidas a un público muy concreto, para hacer una entrada que llevo tiempo queriendo hacer (desde mucho antes de abrir este blog).

Para los despistados, una de mis aficiones es colaborar con el meneame de una forma un tanto friki (si es que todo lo que toco, lo convierto en friki) que consiste en auditar su código y comunicar los errores de seguridad que encuentro, a Ricardo, para que los arregle.

Pese a que el meneame está muy bien programado, en contra de lo que dicen algunos sujetos, es cierto que ha tenido ciertos problemas de seguridad durante su historia, desde que colaboro, he encontrado varios problemas y de gravedad variada, sin embargo, el número total de problemas de seguridad, ha sido mucho menor que en otros sites populares y con mas tiempo, y el tiempo de reacción ante estos problemas, ha sido de minutos, por lo que considero a meneame, un site muy seguro y una demostración irrefutable de que el software libre es beneficioso cara a la seguridad.

Dejando de lado las presentaciones y la explicación de mi relación con meneame, este post trata sobre algo que llevo tiempo queriendo escribir…y es que auditando meneame continuamente, he aprendido mucho de su código y sus secretos, el como funciona, etc…y hay algunas cosas que siempre he querido documentar, pero nunca he encontrado el momento.

Antes de empezar, podemos ver el código de meneame, navegando por la carpeta www/ de su repositorio svn:

http://svn.meneame.net/index.cgi/branches/version3/www/

El primer directorio que vemos, es admin/, del cual nos llama la atención que no tiene index.php, por lo que si hacemos:

http://meneame.net/admin/

Veremos un forbidden, que nos impide listar el contenido del directorio, el único archivo que hay en ese directorio, es el archivo bans.php:

http://svn.meneame.net/index.cgi/branches/version3/www/admin/bans.php?rev=1372&view=markup

El cual, nada mas empezar hace una comprobación:

if ($current_user->user_level==”god” || $current_user->user_level==”admin”) {

Esto nos lleva a nuestra primera deducción: en meneame hay dos tipos de administradores, unos conocidos como admin, y otros conocidos como god, como si fuesen dos niveles distintos de acceso.

La primera pregunta que se nos viene a la cabeza es: vale, ¿Pero que es eso de $current_user? $current_user es una instancia de la clase User, que se encuentra en:

http://svn.meneame.net/index.cgi/*checkout*/branches/version3/www/libs/user.php?content-type=text%2Fplain&rev=1547

Esta clase, como vemos, es una clase que representa a un usuario del meneame, y maneja su información, tanto su karma, como su nivel de acceso, etc.

Todo el meneame funciona con clases como esta, que representan cosas en meneame, están todas en:

http://svn.meneame.net/index.cgi/branches/version3/www/libs/

Otro ejemplo de clase como user, pero que representa links, es Link:

http://svn.meneame.net/index.cgi/*checkout*/branches/version3/www/libs/link.php?content-type=text%2Fplain&rev=1550

Para los javeros, estas clases podríamos decir que son una mezcla entre DAO y TO (Transfer Object), pero todo junto en una misma clase.

Aparte de este mecanismo de clases que representan cosas en meneame, existe otro mecanismo interesante usado en el meneame: el de los backend.

En meneame, en muchos sitios, pasamos el ratón por encima y sale un cartelito con información, por ejemplo, cuando alguien cita otro comentario en una noticia, usando #X, si pasamos el ratón por encima del #, veremos el comentario número X en una cajita amarilla, que sigue al ratón.

Esto lo consigue con unos pequeños php, que están en:

http://svn.meneame.net/index.cgi/branches/version3/www/backend/

Y que reciben un argumento, por ejemplo, el numero de comentario, y devuelven un pequeño código html, que es el que va dentro del cuadro amarillo.

Ademas de los cuadros amarillos (que también van por ajax), el backend se utiliza en realidad para recibir las peticiones Ajax de toda la web, y procesarlas, así está todo bien ordenado.

Un ejemplo de esto es el backend get_user_api_key, que está en:

http://svn.meneame.net/index.cgi/branches/version3/www/backend/get_user_api_key.php?rev=1431&view=markup

Que es quien atiende a la llamada Ajax que se produce, cuando en tu perfil, haces click sobre ver tu clave api, como vemos en su código:

if ($id != $current_user->user_id && $current_user->user_level != ‘god’ ) {

Cada usuario puede ver solo su API key, excepto los gods, que pueden ver las de todos, sin embargo, los admins no pueden.

Esto aclara un poco lo de los dos distintos niveles de acceso, admin y god.

Aparte de todo esto, tenemos otra carpeta interesante en el svn:

http://svn.meneame.net/index.cgi/branches/version3/www/api/?rev=1550

Api, que es donde se alojan los archivos php que atienden las llamadas a la API pública del meneame, una API que podemos usar, para comunicar nuestros blogs, webs o aplicaciones de terceros con meneame, vamos a ver alguna interesante:

http://meneame.net/api/url.php?url=http://www.adn.es&all=1

Con esto obtenemos todos los enlaces en meneame hacia el site www.adn.es.

Existen algunas otras API en el meneame, todas en esa carpeta, sin embargo hay un archivo muy curioso ahí:

http://svn.meneame.net/index.cgi/branches/version3/www/api/check_url_test.php?rev=1340&view=markup

Que como se puede ver, es alguna especie de prueba, pero que está en el svn desde hace mucho tiempo, y ahí sigue…misterios del código.

Aparte de todo esto, en el código de meneame hay algunas otras curiosidades, por ejemplo, un site accesible llamado mueveme, aquí:

http://meneame.net/mueveme/

El cual parece algo para acceder desde el mobil, o algo así, ni idea, no navego con el mobil.

Otra versión alternativa accesible de meneame, es la versión para nintendo DS:

http://meneame.net/nds/

Y por si la nintendo DS fuese poco, también hay para la WII:

http://meneame.net/wii/

Otra curiosidad que no acabo de entender (aunque seguro que ha sido dicha en el blog de meneame…), es por que hay un icono en el svn con nombre: apple-touch-icon.png:

http://meneame.net/apple-touch-icon.png

Supongo que sera para cuando entras con el iphone, a saber, ya lo buscaré por el código.

Como conclusión, decir que si eres informático, el código de meneame tiene muchas cosas interesantes y muchos ejemplos de como hacer cosas…como hacer un portal para la WII, para la NDS, etc etc.

Normalmente la gente no suele mirarse el código de meneame (me refiero a la gente que lo podría entender,a los desarrolladores), incluso si deciden bajarlo y usarlo en su site, no suelen estudiarlo ni un poco, y si lo hacen, no suelen compartir sus cambios con meneame.net.

Yo soy uno de los talibanes que sigue pensando que una web como meneame, donde el modelo de negocio es la publicidad, puede ser compatible con tener una comunidad a su alrededor, sin embargo, el caso de meneame me ha demostrado que muchos “webmasters” (como llamarlos?) solo buscan aprovecharse de que meneame comparte su código, y no buscan ni ayudar, ni colaborar, ni enriquecer nada mas que sus bolsillos.

Se que es una conclusión un tanto rara para un artículo como este, pero tenía que decirlo :)