Topic: jabberd2 et stockage des mots de passe dans une base mysql

Bonjour à tous.
J'ai récemment mis en place un serveur jabberd2 et j'ai choisi de le coupler à une base mysql.
Une petite chose qui me gêne tout de même: c'est que les mots de passe sont stockés en clair dans cette base de données.
Dans le fichier c2s.xml il y a bien cette section qui est prévue pour travailler avec des mots de passe cryptés :

      <password_type>
        <!-- only one may be enabled here -->
        <!--<plaintext/>-->
        <!-- use crypt(3)ed passwords -->
        <crypt/>
      </password_type>

Mais malheureusement cela ne fonctionne pas lorsque j'enregistre un nouvel utilisateur.
Par exemple pour un utilisateur dont le pseudo est ctd j'ai bien une notification dans c2s.log de la création de l'utilisateur ctd

          Fri Oct 26 15:46:04 2012 [notice] [8] created user: user=ctd; realm=machine.domaine.fr

J'ai fait une trace aussi sur les requêtes mysql et je peux voir que mon utilisateur est créé mais sans mot de passe
         INSERT INTO `authreg` ( `username`, `realm` ) VALUES ( 'ctd', 'machine.domaine.fr' )

Et au bout d'un moment mon processus jabberd2-c2s se plante (sans traces dans les logs)

Ceci ne se produit pas quand je choisis de ne pas crypter mes mots de passe.

Est ce que ce serait dû au serveur mysql?

J'ai également essayé de passer par un moyen détourné en écrivant le script pipe-auth.pl et en l'appelant dans la section
<pipe>
      <!-- Program to execute -->
      <exec>/usr/local/bin/pipe-auth.pl</exec>
    </pipe>

Mais celui ci n'est jamais appelé :-(
Pour information ma version de jabberd2 est la 2.2.8

Si quelqu'un a eu les mêmes difficultés que moi et a pu résoudre ce problème je suis preneur de toute information utile :-)

CedrX

Re: jabberd2 et stockage des mots de passe dans une base mysql

Je me réponds à moi même:

En recompilant le paquet jabberd2 j'ai activé l'option debug (--enable-debug)
Et voici les raisons du plantage de jabberd2-c2s

/usr/sbin/jabberd2-c2s: symbol lookup error: /usr/lib/jabberd2/authreg_mysql.so: undefined symbol: crypt

J'avance :-)

Re: jabberd2 et stockage des mots de passe dans une base mysql

Je me réponds encore à moi même:
Le patch/La solution au problème est plus ou moins ici

http://www.mail-archive.com/jabberd2@li … 01639.html

Je recopie le patch ici au cas où l'url que j'ai cité plus haut serait indisponible. Merci de votre compréhension

==================
Index: configure.ac
===================================================================
--- configure.ac    (wersja 934)
+++ configure.ac    (wersja 935)
@@ -190,6 +190,7 @@
if test "x$ac_cv_lib_crypt_crypt" = "xyes"; then
   AC_DEFINE(HAVE_CRYPT, 1, [Define to 1 if you have the crypt() function])
fi
+AM_CONDITIONAL(HAVE_CRYPT, [test "x$ac_cv_lib_crypt_crypt" = "xyes"])
AC_CHECK_FUNC([connect], ,[AC_CHECK_LIB([socket], [connect])])
AC_CHECK_LIB([ws2_32], [_head_libws2_32_a])

Index: storage/authreg_mysql.c
===================================================================
--- storage/authreg_mysql.c    (wersja 934)
+++ storage/authreg_mysql.c    (wersja 935)
@@ -23,19 +23,28 @@
#define _XOPEN_SOURCE 500
#include "c2s.h"
#include <mysql.h>
-#include <unistd.h>

-/* Windows does not has the crypt function, let's take DES_crypt from OpenSSL instead */
+/* Windows does not have the crypt() function, let's take DES_crypt from OpenSSL instead */
#if defined(HAVE_OPENSSL_CRYPTO_H) && defined(_WIN32)
#include <openssl/des.h>
#define crypt DES_crypt
+#define HAVE_CRYPT 1
+#else
+#ifdef HAVE_CRYPT
+#include <unistd.h>
#endif
+#endif

#define MYSQL_LU  1024   /* maximum length of username - should correspond to field length */
#define MYSQL_LR   256   /* maximum length of realm - should correspond to field length */
#define MYSQL_LP   256   /* maximum length of password - should correspond to field length */

-enum mysql_pws_crypt { MPC_PLAIN, MPC_CRYPT };
+enum mysql_pws_crypt {
+    MPC_PLAIN,
+#ifdef HAVE_CRYPT
+    MPC_CRYPT,
+#endif
+};

static char salter[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./";

@@ -141,7 +150,9 @@
static int _ar_mysql_check_password(authreg_t ar, char *username, char *realm, char password[257]) {
     mysqlcontext_t ctx = (mysqlcontext_t) ar->private;
     char db_pw_value[257];
+#ifdef HAVE_CRYPT
     char *crypted_pw;
+#endif
     int ret;

     ret = _ar_mysql_get_password(ar, username, realm, db_pw_value);
@@ -154,10 +165,12 @@
                 ret = (strcmp(password, db_pw_value) != 0);
                 break;

+#ifdef HAVE_CRYPT
         case MPC_CRYPT:
                 crypted_pw = crypt(password,db_pw_value);
                 ret = (strcmp(crypted_pw, db_pw_value) != 0);
                 break;
+#endif

         default:
         /* should never happen */
@@ -183,6 +196,7 @@
     snprintf(iuser, MYSQL_LU+1, "%s", username);
     snprintf(irealm, MYSQL_LR+1, "%s", realm);

+#ifdef HAVE_CRYPT
     if (ctx->password_type == MPC_CRYPT) {
        char salt[12] = "$1$";
        int i;
@@ -193,6 +207,7 @@
        salt[11] = '\0';
        strcpy(password, crypt(password, salt));
     }
+#endif
     
     password[256]= '\0';

@@ -385,8 +400,10 @@
     /* get encryption type used in DB */
     if (config_get_one(ar->c2s->config, "authreg.mysql.password_type.plaintext", 0)) {
         mysqlcontext->password_type = MPC_PLAIN;
+#ifdef HAVE_CRYPT
     } else if (config_get_one(ar->c2s->config, "authreg.mysql.password_type.crypt", 0)) {
         mysqlcontext->password_type = MPC_CRYPT;
+#endif
     } else {
         mysqlcontext->password_type = MPC_PLAIN;
     }
Index: storage/Makefile.am
===================================================================
--- storage/Makefile.am    (wersja 934)
+++ storage/Makefile.am    (wersja 935)
@@ -50,6 +50,9 @@
authreg_mysql_la_CPPFLAGS = $(MYSQL_CFLAGS)
authreg_mysql_la_LDFLAGS = $(MODULE_LDFLAGS)
authreg_mysql_la_LIBADD  = $(MODULE_LIBADD) $(MYSQL_LIBS)
+if HAVE_CRYPT
+authreg_mysql_la_LIBADD += -lcrypt
+endif
storage_mysql_la_SOURCES = storage_mysql.c
storage_mysql_la_CPPFLAGS = $(MYSQL_CFLAGS)
storage_mysql_la_LDFLAGS = $(MODULE_LDFLAGS)