Vistas

Mejora G-Forge 7: Incluir mejoras en la comunicación de los usuarios

De MorfeoWiki

Tabla de contenidos

Introducción

La mejora propuesta para reforzar las comunicaciones entre los usuarios de la forja ha sido la introducción de una herramienta de mensajería instantánea basada en el protocolo Jabber. Gracias a ella, los usuarios podrán disfrutar de la opción de mantener conversaciones entre ellos de una forma mucho más dinámica y fluida de la que se proporcionaba actualmente con el uso de los foros y listas de correo.

Esta mejora consta de dos partes:

  • Por un lado, la integración de un servidor de mensajería instantánea basado en el protocolo Jabber. Éste se encarga de la gestión del servicio y de la comunicación entre los usuarios.
  • La integración de un cliente web basado en Jabber que sirva de interfaz a los usuarios para comunicarse entre ellos sin la necesidad de instalar ningún sofware externo a la forja.


Planificación

  • Prioridad: Media
  • Responsable: UPM


Protocolo de comunicaciones: Jabber

Jabber es un protocolo libre para mensajería instantánea, basado en el estándar XML y gestionado por Jabber Software Foundation. Ha sido escogido por su naturaleza de software libre, respetando la filosofía seguida por esta comunidad, por el gran número de clientes y servidores que existen basados en él, por el gran crecimiento y expansión que está experimentando en la actualidad y por numerosas características entre las que destacan:

  • Protocolo abierto: Con todas las ventajas que supone el uso de un protocolo estandar de comunicaciones para mensajería instantánea.
  • Descentralizado: Se puede utilizar un servidor para Jabber, el cual, puede interoperar o no con el resto de la red Jabber. Es dedir que podemos configurado como un servidor privado para el uso exclusivo de este servicio para un grupo determinado de usuarios (como por ejemplo los usuarios de GForge) o puede pasar a fomar parte de la red de Jabber e interacturar con cualquier usuario que use este protocolo y se gestione su servicio en un servidor de Jabber.
  • Extensible: Se puede ampliar con mejoras sobre el protocolo original. Las extensiones comunes son manejadas por la Jabber Software Foundation..
  • Seguro: Permite la autenticación y el establecimiento de comunicaciones usando protocolos de seguridad (SSL, GPG, etc...).
  • Multiredes: Mediante el uso de pasarelas se puede comunicar con otros clientes como el MSN, el ICQ o el Yahoo!.


Servidor: Ejabberd

Después de realizar un estudio teniendo en cuenta un extenso grupo de servidores Jabber (todos los cuales son "open source") que se encuentran en el

mercado actual, se ha decidido utilizar para su integración con la forja el servidor Ejabberd. Este servidor ha sido el escogido por ser el más completo en lo que se refiere a características que posee y por encontrarse en el momento de su elección en continua evolución por parte de su equipo de desarrolladores (es un servidor en continua evolución y expansión, parece que tiene futuro).

Es un servidor con licencia GNU GPL escrito principalmente en Erlang. Desde el punto de vista de la instalación y administración resulta muy cómodo ya que se encuentra en los repositorios de paquetes de la distribución Debian y posee una interfaz web y una herramienta en la línea de comandos que le dota de una gran flexibilidad. A parte, existe bastante documentación sobre el mismo (también en Castellano).

Está provisto de un gran número de módulos de que le permiten desde realizar estadísticas y salas de conversación, hasta enviar anuncios y crear reglas privadas. Estos módulos pueden ser cargados y descargados "en caliente" sin reiniciar el servidor.

La fiabilidad y escalabilidad ha sido probadas en entornos de hasta 25000 usuarios lo cual le da voto de confianza, aun más cuando se tiene en cuenta que es un proyecto todavia en activo y en continua labor de depuración.

El soporte de la información que debe ser persistente es por defecto Mnesia (Base de datos mediante ficheros XML) aunque es posible utilizar un servidor LDAP u otras bases de datos ODBC como son PostgreSQL, MySQL, etc...


Integración de Ejabberd

Como se ha mencionado antes, esta disponible en el repositorio de paquetes de Debian el paquete ejabberd. Dicho paquete tiene una serie de dependencias necesarias para su instalación, no se comentará aquí la instalación de las mismas, sólo se comentarán las dependencias que necesita:

  • erlang
  • openssl
  • ...

Para la instalación del servidor se debe ejecutar, con privilegios de superusuario, el siguiente comando:

user@host# apt-get install ejabberd

Durante el proceso de instalación que realiza la herramienta apt de Debian pregunta por el nombre del servidor al que dará servicio, en este momento se ha de introducir la URL raíz del utilizada por GForge. Tras lo anterior, el instalador pregunta por un nombre de usuario y contraseña para el administrador del servicio (necesario para poder acceder a la herramienta web de configuración de ejabberd).

Tras finalizar el proceso anterior, sólo cabe mencionar que en /etc/ejabberd/ejabberd.cfg disponemos de un fichero de configuración, en el cual se pueden particularizar cierta características de este servidor. Una de las características que se debe de configurar es la de no permitir el registro de cuentas a través del protocolo Jabber; ya que si no realizamos esto y permitimos que cualquiera puede registrar una cuenta, si se da de alta un usuario en la forja cuyo login coincida con una cuenta ya existente el mencionado usuario no podrá usar el servicio de mensajería al no disponer de una cuenta propia en el servidor de Jabber.

En el fichero ejabberd.cfg:

{access, register, [{allow, all}]}.   [comentar esta línea]
{access, register, [{deny, all}]}.    [descomentar esta línea o añadirla si no está]

LLegados a este punto ya disponemos de un servidor de Jabber, ahora se muestra lo que se debe realizar en el código de la forja para que cuando un usuario se da de alta en la misma se de también de alta en el servicio de mensajería también.

Los ficheros que hay que se han modificado son los siguientes:

  • /usr/share/gforge/www/account:
register.php        [Se ha incluido la línea: require_once('www/jabber/inc/_jabber.inc.php');]
index.php           [Mismo cambio que en el fichero anterior]
change_pw.php       [Mismo cambio que en el fichero anterior]
change_email.php    [Mismo cambio que en el fichero anterior]
  • /usr/share/gforge/www/admin:
useredit.php        [Se ha incluido la línea: require_once('www/jabber/inc/_jabber.inc.php');]
userlist.php        [Mismo cambio que en el fichero anterior]
  • /usr/share/gforge/common/include:
UserSyncronized.class
     [ - Se ha incluido la variable $jabberUser en los atributos de la clase UserSyncronized.
       - Se ha modificado el constructor para inicializar el "objeto" JabberUser.
       - Modificada función create (Crea un nuevo usuario en el servidor Jabber).
       - Modificada función setPasswd (Actualiza el password en el servidor Jabber). ]
  • /usr/share/gforge/www/jabber/inc (NUEVOS FICHEROS):
_jabber.inc.php         [Colección de requires_once de los nuevos ficheros utilizados para la integración de Jabber en la forja]
_jabberUser.class.php   [Implementación de la clase JabberUser]
JabberServer.inc        [Contiene el nombre del servidor Jabber]
addJabberUser           [Ejecutable que da de alta a un usuario en el servidor Jabber]



Una vez que se ha realizado lo anterior hay que editar el fichero JabberServer.inc introduciendo el nombre del servidor Jabber (si se ha seguido la instalación de la forja que se ha indicado, entonces este nombre se corresponde con la URL que introducimos en el navegador para acceder a la página principal de la forja). También hay que permitir que cualquier usuario que ejecute addJabberUser tenga privilegios de superusuario, ya que el usuario que lo ejecuta es www-data. Para realizar lo anterior nos situamos en el directorio /usr/share/gforge/www/jabber/inc y realizamos con permisos de superusuario:

user@host# chmod u+s addJabberUser


Configuración del almacenamiento persistente

Una vez que hemos instalado el servidor ejabberd de la manera que se ha indicado en el párrafo enterior se utiliza para el almacenamiento persistente la base de datos Mnesia, que es una base de datos que almacena la información en forma de ficheros XML.

Para que podamos acceder a la base de datos y poder ver y gestionar la información de una manera más eficiente y cómoda se realiza un cambio de soporte en el almacenamiento, se va a pasar de la base de datos Mnesia a base de datos MySQL. Este cambio de almacenamiento persistente también va permitir que podamos acceder a través de PHP a la base de datos y cambiar la información para ciertos casos en los que nos hara falta esto (por ejemplo cuando un usuario de GForge realize un cambio de contraseña en la foja deberemos capturar este evento y realizar el mismo cambio de contraseña en la base de datos del servidor de Jabber).

Los pasos que hay que seguir para que el servidor ejabberd tenga soporte MySQL son los siguientes:

    • mysql.beam
    • mysql_auth.beam
    • mysql_conn.beam
    • mysql_recv.beam
  • Hay que poner los anteriores ficheros *.beam en el path de erlang para ejabberd. Si todo se ha instalado siguiendo los pasos de este tutorial el directorio donde habrá que copiar esos ficheros será /usr/lib/erlang/lib/ejabberd-1.1.2/ebin/.
  • Una vez realizado lo anterior vamos a proceder a configurar la base de datos MySQL. Lo primero será acceder al gestor de bases de datos como root:
user@host$ mysql -u root -p
Enter password:
mysql>
  • Se crea un nuevo usuario ejabberd en la base de datos con privilegios sobre ejabberd.*:
mysql> GRANT ALL ON ejabberd.* TO 'ejabberd'@'localhost' IDENTIFIED BY 'password del usuario ejabberd';
Query OK, 0 rows affected (0.00 sec)
mysql> \q
user@host$
  • Accedemos con el usuario ejabberd y creamos la base de datos ejabberd:
user@host$ mysql -u ejabberd -p
Enter password:
mysql> CREATE DATABASE ejabberd;
Query OK, 1 row affected (0.00 sec)
mysql> \q
user@host$ mysql -u ejabberd -p -D ejabberd < mysql.sql
user@host$
  • Ahora tenemos que ir a modificar el fichero de configuración de ejabberd (se encuentra en /etc/ejabberd):
{auth_method, internal}.                                                  [Comentar esta línea]
{auth_method, odbc}.                                                      [Añadir esta línea]
{odbc_server, {mysql, "localhost", "ejabberd", "ejabberd", "password"}}.  [Añadir esta línea]
  • Tenemos que modificar las líneas en que se declaran los módulos que se usan:
Cambiar mod_last por mod_last_odbc para almacenar la última fecha en MySQL.
Cambiar mod_offline por mod_offline_odbc para almacenar los mensajes offline en MySQL.
Cambiar mod_roster por mod_roster_odbc para almacenar la lista de contactos en MySQL.
Cambiar mod_vcard por mod_vcard_odbc para almacenar la descripción de usuario en MySQL.
  • Después de realizar lo anterior hay que añadir una nueva tabla a la base de datos de mySQL para los usuarios que han sido dados de baja en la forja (no se eliminan de la base de datos de la forja sino que sólo se les pone el flag de inactivos y pueden volver a ser activados en cualquier momento). La nueva tabla almacenará a los usuarios con el flag inactivo de la forja.
user@host$ mysql -u ejabberd -p -D ejabberd < addDeletedUsers.mysql
user@host$
  • Esto se ha hecho así para para que la BBDD de soporte a un estado más que los usuarios pueden tener, para ejabberd si un usuario existe quiere decir que esta en estado activo, si se da de baja un usuario, este es eliminado de la base de datos. En GForge en cambio no se elimina ningún usuario de la forja sino que se le pone como inactivo y no puede usar ningún servicio de la forja pero puede volver a ser activado en cualquier momento y no perderá ningún tipo de información anterior. La nueva tabla introducida va a dar soporte para poder almacenar una lista de usuarios inactivos (han sido dados de baja en la forja) que si estos vuelven a ser dados de alta, debido a la nueva tabla introducida también va a permitir que puedan ser activados en el servicio de mensajería de nuevo sin una pérdida de sus lista de contactos, etc ...


Cliente: JWChat

Después de un estudio de los posibles clientes web de Jabber la decisión tomada fue de utilizar JWChat. Este cliente está implementado enteramente en JavaScript y se caracteriza por su sencillez de manejo aunque incorpora la mayoría de características que poseen los clietes de Jabberd no basados en web. Permite salas multichat (por ejemplo se permite crear salas de char por proyecto activo en GForge) y posee historial de mensajes (soportado por ejabberd).

Es compatible con los principales navegadores del mercado (Explorer 5.0 o superior, Netscape 6 o superior, Mozilla 1.0.2 o superior, Camino 0.7) e implementa HTTP Polling y HTTP Binding como Backends para la comunicación.


Integración de JWChat

Para la integración de este cliente web se deberán seguir los siguientes pasos:

  • Obtención del código de JWChat, disponible en http://jwchat.sourceforge.net/.
  • Con permisos de superusuario se descomprime el fichero tar.gz en el directorio /usr/share/gforge/www.
  • Se renombra el directorio a jwchat.

Hasta aquí ya se ha isntalado JWChat en la forja, ahora queda configurar el servidor web (apache2):

  • Crear un fichero .htaccess en el directorio del JWChat e introducir lo siguiente:
AddDefaultCharset UTF-8
Options +MultiViews
<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule http-poll/ http://servidor_gforge:5280/http-poll/ [P]
</IfModule>
  • Añadir al fichero de configuración de apache lo siguiente (/etc/apache2/apache2.conf):
<Directory "/usr/share/gforge/www/jwchat">
        AllowOverride All
</Directory>
  • Estando en el directorio de apache (/etc/apache2) ejecutar lo siguiente:
user@host# ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/
user@host# ln -s /etc/apache2/mods-available/proxy.load /etc/apache2/mods-enabled/
user@host# ln -s /etc/apache2/mods-available/proxy.conf /etc/apache2/mods-enabled/
  • Finalmente se reinicia el servidor apache:
user@host# apache2ctl restart

Una vez realizado todo lo anterior ya se tendrá disponible en la direccion http://server_gforge/jwchat el cliete web de Jabber, en el cual nos podremos logear con el login y password de nuestro usuario en la forja.

Configuración del resto del servicio

Los ficheros que han sido implementados en su totalidad y los ficheros que han sido modificados son los siguientes (Los que están en negrita indican los ficheros de código implementados desde cero):

  • En /etc/ejabberd:
ejabberd.cfg
addDeletedUsers.mysql
  • En /usr/share/gforge/www/account:
register.php
index.php
change_pw.php
change_email.php
login.php
logout.php
  • En /usr/share/gforge/www/admin:
useredit.php
userlist.php
  • En /usr/share/gforge/common/include:
UserSyncronized.class
  • En /usr/share/gforge/www/jabber/inc:
_jabber.inc.php
_jabberUser.class.php
JabberServer.inc
addJabberUser.c
props.inc
_mySQLConn.class.php
  • En /usr/share/gforge/www/jwchat/:
loginJabber.html
jwchar.css
config.js

Con la introducción de los nuevos ficheros de código y la modificación de los ficheros indicados (¡ojo! si se va a instalar esta mejora en una versión de la forja es más seguro consultar las modificaciones introducidas en los ficheros y realizarlas en los ficheros de la nueva versión de la forja para asegurar la compatibilidad de esta mejora con futuras versiones de GForge).


Uso del servicio

El uso del cliente web es muy sencillo e intuitivo, se ha configurado el servicio para que automáticamente al producirse una autenticación de usuario vía web para entrar en la cuenta de un usuario se lanze un pop-up con la sesión iniciada en el cliente JWchat.

Si un determinado usuario sólo quiere utilizar el servicio de mensajería y no quiere tener que autenticarse en la GForge dispone de dos alternativas para poder utilizar este servicio:

  • El uso del cliente web JWchat disponible en la dirección http://server_gforge/jwchat: Usa el mismo cliente que si se ubiese autenticado en GForge pero sin tener que hace esto último.
  • El uso de cualquier cliente (web o no) que comprenda el protocolo Jabber (Gaim, Mercury Messenger, etc ...).


Observaciones

Este servicio se ha implementado de tal manera que si se integra esta mejora en una forja ya existente con un usuarios ya dados de alta u usando GForge se den de alta automáticamente en este servicio pero a condición de que realizen un cambio de contraseña en el sistema. Esto es así porque para poder dar de alta a un usuario en este servicio se necesita conocer su contraseña y esta tiene que ser la misma que el usuaro tenga en GForge si se quiere que automáticamente se autentique y acceda a una sesión de Jabber cuando el usuario se autentica en la forja. Para conocer su contraseña y realizar el proceso lo más automático posible se ha capturado el evento cambiar de contraseña en GForge para cambiar la contraseña o dar de alta a un nuevo usuario en el servidor ejabberd.

Por lo explicado aquí no va a ocurrir ningún tipo de problema de funcionamiento al incorporar esta mejora en un entorno GForge con usuarios, proyectos, etc ... en marcha.


Resultados

El resultado de esta mejora es la integración total de un sistema de mensajería instantánea (cliente y servidor) en el entorno de G-Forge. Al darse de alta un usuario en la forja, éste será dado de alta de forma totalmente transparente en el servidor de Jabber utilizando el mismo nombre de usuario y la misma contraseña que introduzca en la forja (el JID del usuario es usuario_de_gforge@servidor_de_gforge).

Aparte, para darle mayor flexibilidad al usuario, se le permitirá conectar utilizando otros clientes compatibles con el protocolo Jabber y ajenos a la forja para ofrecer al usuario una mayor comodidad en su trabajo.