Switch to use LmAuthParameters instead of passing around username and password.
authorMikael Hallendal <micke@imendio.com>
Wed, 22 Oct 2008 15:29:49 +0200
changeset 540 72acfccdec86
parent 539 4e387d919a46
child 541 9c315096fa5a
Switch to use LmAuthParameters instead of passing around username and password. This cleans up the code and reduces the number of strings that need to be copied and synced.
loudmouth/lm-connection.c
loudmouth/lm-data-objects.h
loudmouth/lm-sasl.c
loudmouth/lm-sasl.h
--- a/loudmouth/lm-connection.c	Wed Oct 22 14:08:45 2008 +0200
+++ b/loudmouth/lm-connection.c	Wed Oct 22 15:29:49 2008 +0200
@@ -82,6 +82,7 @@
 
 #include <glib-object.h>
 
+#include "lm-data-objects.h"
 #include "lm-sock.h"
 #include "lm-debug.h"
 #include "lm-error.h"
@@ -174,12 +175,11 @@
                                               GError             **error);
 void            connection_do_close          (LmConnection        *connection);
 static LmMessage *     
-connection_create_auth_req_msg               (const gchar         *username);
+connection_create_auth_req_msg               (LmAuthParameters    *auth_params);
+    
 static LmMessage *
 connection_create_auth_msg                   (LmConnection        *connection,
-                                              const gchar         *username,
-                                              const gchar         *password,
-                                              const gchar         *resource,
+                                              LmAuthParameters    *auth_params,
                                               gint                 auth_type);
 static LmHandlerResult 
 connection_auth_req_reply                    (LmMessageHandler    *handler,
@@ -231,9 +231,7 @@
                                               LmMessage           *message,
                                               gpointer             user_data);
 static gboolean connection_old_auth          (LmConnection        *connection,
-                                              const gchar         *username,
-                                              const gchar         *password,
-                                              const gchar         *resource,
+                                              LmAuthParameters    *auth_params,
                                               GError             **errror);
 
 static void
@@ -573,23 +571,8 @@
     }
 }
 
-typedef struct {
-    gchar *username;
-    gchar *password;
-    gchar *resource;
-} AuthReqData;
-
-static void 
-auth_req_data_free (AuthReqData *data) 
-{
-    g_free (data->username);
-    g_free (data->password);
-    g_free (data->resource);
-    g_free (data);
-}
-
 static LmMessage *
-connection_create_auth_req_msg (const gchar *username)
+connection_create_auth_req_msg (LmAuthParameters *auth_params)
 {
     LmMessage     *m;
     LmMessageNode *q_node;
@@ -600,17 +583,15 @@
     lm_message_node_set_attributes (q_node,
                                     "xmlns", "jabber:iq:auth",
                                     NULL);
-    lm_message_node_add_child (q_node, "username", username);
+    lm_message_node_add_child (q_node, "username", lm_auth_parameters_get_username (auth_params));
 
     return m;
 }
 
 static LmMessage *
-connection_create_auth_msg (LmConnection *connection,
-                            const gchar  *username,
-                            const gchar  *password,
-                            const gchar  *resource,
-                            gint          auth_type)
+connection_create_auth_msg (LmConnection     *connection,
+                            LmAuthParameters *auth_params,
+                            gint              auth_type)
 {
     LmMessage     *auth_msg;
     LmMessageNode *q_node;
@@ -624,7 +605,7 @@
                                     "xmlns", "jabber:iq:auth", 
                                     NULL);
 
-    lm_message_node_add_child (q_node, "username", username);
+    lm_message_node_add_child (q_node, "username", lm_auth_parameters_get_username (auth_params));
     
     if (auth_type & AUTH_TYPE_0K) {
         lm_verbose ("Using 0k auth (not implemented yet)\n");
@@ -636,7 +617,7 @@
         gchar *digest;
 
         lm_verbose ("Using digest\n");
-        str = g_strconcat (connection->stream_id, password, NULL);
+        str = g_strconcat (connection->stream_id, lm_auth_parameters_get_password (auth_params), NULL);
         digest = lm_sha_hash (str);
         g_free (str);
         lm_message_node_add_child (q_node, "digest", digest);
@@ -644,12 +625,12 @@
     } 
     else if (auth_type & AUTH_TYPE_PLAIN) {
         lm_verbose ("Using plaintext auth\n");
-        lm_message_node_add_child (q_node, "password", password);
+        lm_message_node_add_child (q_node, "password", lm_auth_parameters_get_password (auth_params));
     } else {
         /* TODO: Report error somehow */
     }
     
-    lm_message_node_add_child (q_node, "resource", resource);
+    lm_message_node_add_child (q_node, "resource", lm_auth_parameters_get_resource (auth_params));
 
     return auth_msg;
 }
@@ -663,16 +644,12 @@
     int               auth_type;
     LmMessage        *auth_msg;
     LmMessageHandler *auth_handler;
-    AuthReqData      *data = (AuthReqData *) user_data;      
+    LmAuthParameters *auth_params = (LmAuthParameters *) user_data;
     gboolean          result;
     
     auth_type = connection_check_auth_type (m);
 
-    auth_msg = connection_create_auth_msg (connection, 
-                                           data->username,
-                                           data->password,
-                                           data->resource,
-                                           auth_type);
+    auth_msg = connection_create_auth_msg (connection, auth_params, auth_type);
 
     auth_handler = lm_message_handler_new (connection_auth_reply,
                                            NULL, NULL);
@@ -1204,14 +1181,9 @@
         connection->use_sasl = FALSE;
 
         if (connection->sasl) {
-            const gchar *user;
-            const gchar *pass;
-
-            lm_sasl_get_auth_params (connection->sasl, &user, &pass);
-            if (user && pass) {
+            if (lm_sasl_get_auth_params (connection->sasl)) {
                 GError *error = NULL;
-                connection_old_auth (connection, user, pass,
-                                     connection->resource,
+                connection_old_auth (connection, lm_sasl_get_auth_params (connection->sasl),
                                      &error);
 
                 if (error) {
@@ -1485,11 +1457,16 @@
                             GDestroyNotify     notify,
                             GError           **error)
 {
+    LmAuthParameters *auth_params;
+    gboolean          ret_val;
+    
     g_return_val_if_fail (connection != NULL, FALSE);
     g_return_val_if_fail (username != NULL, FALSE);
     g_return_val_if_fail (password != NULL, FALSE);
     g_return_val_if_fail (resource != NULL, FALSE);
 
+    auth_params = lm_auth_parameters_new (username, password, resource);
+
     if (!lm_connection_is_open (connection)) {
         g_set_error (error,
                      LM_ERROR,
@@ -1504,16 +1481,15 @@
                                                   user_data, 
                                                   notify);
 
-    connection->resource = g_strdup (resource);
+    connection->resource = g_strdup (lm_auth_parameters_get_resource (auth_params));
+                                              
     connection->effective_jid = g_strdup_printf ("%s/%s", 
                                                  connection->jid, connection->resource);
 
     /* TODO: Break out Credentials (or use the already existing AuthReqData struct for *
      *       Username/Password and Resource                                            */
     if (connection->use_sasl) {
-        lm_sasl_authenticate (connection->sasl,
-                              username, password,
-                              connection->server,
+        lm_sasl_authenticate (connection->sasl, auth_params, connection->server,
                               connection_sasl_auth_finished);
 
         connection->features_cb  =
@@ -1524,36 +1500,30 @@
                                                 LM_MESSAGE_TYPE_STREAM_FEATURES,
                                                 LM_HANDLER_PRIORITY_FIRST);
 
-        return TRUE;
+        ret_val = TRUE;
+    } else {
+        ret_val = connection_old_auth (connection, auth_params, error);
     }
 
-    return connection_old_auth (connection, username, password,
-                                resource, error);
+    lm_auth_parameters_unref (auth_params);
+
+    return ret_val;
 }
 
 static gboolean
-connection_old_auth (LmConnection  *connection,
-                     const gchar   *username,
-                     const gchar   *password,
-                     const gchar   *resource, 
-                     GError       **error)
+connection_old_auth (LmConnection      *connection,
+                     LmAuthParameters  *auth_params,
+                     GError           **error)
 {
     LmMessage        *m;
-    AuthReqData      *data;
     LmMessageHandler *handler;
     gboolean          result;
     
-
-    m = connection_create_auth_req_msg (username);
+    m = connection_create_auth_req_msg (auth_params);
         
-    data = g_new0 (AuthReqData, 1);
-    data->username = g_strdup (username);
-    data->password = g_strdup (password);
-    data->resource = g_strdup (resource);
-    
     handler = lm_message_handler_new (connection_auth_req_reply, 
-                                      data, 
-                                      (GDestroyNotify) auth_req_data_free);
+                                      lm_auth_parameters_ref (auth_params),
+                                      (GDestroyNotify) lm_auth_parameters_unref);
     result = lm_connection_send_with_reply (connection, m, handler, error);
     
     lm_message_handler_unref (handler);
--- a/loudmouth/lm-data-objects.h	Wed Oct 22 14:08:45 2008 +0200
+++ b/loudmouth/lm-data-objects.h	Wed Oct 22 15:29:49 2008 +0200
@@ -17,6 +17,8 @@
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+#ifndef __LM_DATA_OBJECT_H__
+#define __LM_DATA_OBJECT_H__
 
 #include <glib.h>
 
@@ -43,4 +45,6 @@
 guint                 lm_connect_parameters_get_port   (LmConnectParameters *params);
 
 LmConnectParameters * lm_connect_parameters_ref        (LmConnectParameters *params);
-void                  lm_connect_parameters_unref      (LmConnectParameters *params);
\ No newline at end of file
+void                  lm_connect_parameters_unref      (LmConnectParameters *params);
+
+#endif /* __LM_DATA_OBJECT_H__ */
\ No newline at end of file
--- a/loudmouth/lm-sasl.c	Wed Oct 22 14:08:45 2008 +0200
+++ b/loudmouth/lm-sasl.c	Wed Oct 22 15:29:49 2008 +0200
@@ -55,8 +55,7 @@
     LmConnection        *connection;
     AuthType             auth_type;
     SaslAuthState        state;
-    gchar               *username;
-    gchar               *password;
+    LmAuthParameters    *auth_params;
     gchar               *server;
     gchar               *digest_md5_rspauth;
     LmMessageHandler    *features_cb;
@@ -214,9 +213,9 @@
 
     response = g_string_new ("");
 
-    if (sasl->username == NULL || sasl->password == NULL) {
+    if (sasl->auth_params == NULL) {
         g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
-               "%s: no username or password provided", G_STRFUNC);
+               "%s: no authentication parameters provided", G_STRFUNC);
         if (sasl->handler) {
             sasl->handler (sasl, sasl->connection, 
                            FALSE, "no username/password provided");
@@ -245,7 +244,7 @@
     }
 
     /* FIXME properly escape values */
-    g_string_append_printf (response, "username=\"%s\"", sasl->username);
+    g_string_append_printf (response, "username=\"%s\"", lm_auth_parameters_get_username (sasl->auth_params));
     g_string_append_printf (response, ",realm=\"%s\"", realm);
     g_string_append_printf (response, ",digest-uri=\"xmpp/%s\"", realm);
     g_string_append_printf (response, ",nonce=\"%s\",nc=00000001", nonce);
@@ -254,7 +253,9 @@
     g_string_append_printf (response, ",qop=auth,charset=utf-8");
 
     tmp = g_strdup_printf ("%s:%s:%s", 
-                           sasl->username, realm, sasl->password);
+                           lm_auth_parameters_get_username (sasl->auth_params), 
+                           realm, lm_auth_parameters_get_password (sasl->auth_params));
+        
     md5_init (&md5_calc);
     md5_append (&md5_calc, (const md5_byte_t *)tmp, strlen(tmp));
     md5_finish (&md5_calc, digest_md5);
@@ -314,7 +315,7 @@
     gchar     *response64;
     int        result;
 
-    response = sasl_md5_prepare_response(sasl, challenge);
+    response = sasl_md5_prepare_response (sasl, challenge);
     if (response == NULL) {
         return FALSE;
     }
@@ -595,9 +596,9 @@
         mech = "PLAIN";
         sasl->state = SASL_AUTH_STATE_PLAIN_STARTED;
 
-        if (sasl->username == NULL || sasl->password == NULL) {
+        if (sasl->auth_params == NULL) {
             g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
-                   "%s: no username or password provided", 
+                   "%s: no authentication parameters provided", 
                    G_STRFUNC);
             if (sasl->handler) {
                 sasl->handler (sasl, sasl->connection, FALSE, "no username/password provided");
@@ -607,9 +608,9 @@
         }
 
         g_string_append_c (str, '\0');
-        g_string_append (str, sasl->username);
+        g_string_append (str, lm_auth_parameters_get_username (sasl->auth_params));
         g_string_append_c (str, '\0');
-        g_string_append (str, sasl->password);
+        g_string_append (str, lm_auth_parameters_get_password (sasl->auth_params));
         cstr = g_base64_encode ((const guchar *) str->str, 
                                 (gsize) str->len);
 
@@ -757,15 +758,13 @@
 
 void
 lm_sasl_authenticate (LmSASL              *sasl,
-                      const gchar         *username,
-                      const gchar         *password,
+                      LmAuthParameters    *auth_params,
                       const gchar         *server,
                       LmSASLResultHandler  handler)
 {
-    sasl->username   = g_strdup (username);
-    sasl->password   = g_strdup (password);
-    sasl->server     = g_strdup (server);
-    sasl->handler    = handler;
+    sasl->auth_params = lm_auth_parameters_ref (auth_params);
+    sasl->server      = g_strdup (server);
+    sasl->handler     = handler;
 
     sasl->challenge_cb = lm_message_handler_new (sasl_challenge_cb,
                                                  sasl,
@@ -802,9 +801,11 @@
 lm_sasl_free (LmSASL *sasl)
 {
     g_return_if_fail (sasl != NULL);
+    
+    if (sasl->auth_params) {
+        lm_auth_parameters_unref (sasl->auth_params);
+    }
 
-    g_free (sasl->username);
-    g_free (sasl->password);
     g_free (sasl->server);
 
     if (sasl->features_cb) {
@@ -835,11 +836,9 @@
 }
 
 
-void
-lm_sasl_get_auth_params (LmSASL *sasl, const gchar **username,
-                         const gchar **password)
+LmAuthParameters *
+lm_sasl_get_auth_params (LmSASL *sasl)
 {
-    *username = sasl->username;
-    *password = sasl->password;
+    return sasl->auth_params;
 }
 
--- a/loudmouth/lm-sasl.h	Wed Oct 22 14:08:45 2008 +0200
+++ b/loudmouth/lm-sasl.h	Wed Oct 22 15:29:49 2008 +0200
@@ -27,28 +27,28 @@
 
 #include <glib.h>
 
+#include "lm-data-objects.h"
+
 G_BEGIN_DECLS
 
 typedef struct _LmSASL LmSASL;
 
-typedef void (*LmSASLResultHandler) (LmSASL *sasl,
-                                     LmConnection *connection,
-                                     gboolean success,
-                                     const gchar *reason);
+typedef void (*LmSASLResultHandler) (LmSASL               *sasl,
+                                     LmConnection         *connection,
+                                     gboolean              success,
+                                     const gchar          *reason);
 
-LmSASL *lm_sasl_new (LmConnection *connection);
+LmSASL *           lm_sasl_new              (LmConnection         *connection);
 
-void lm_sasl_authenticate (LmSASL *sasl, 
-                           const gchar *username,
-                           const gchar *password,
-                           const gchar *server,
-                           LmSASLResultHandler handler);
+void               lm_sasl_authenticate     (LmSASL               *sasl, 
+                                             LmAuthParameters     *auth_params,
+                                             const gchar          *server,
+                                             LmSASLResultHandler   handler);
 
-void lm_sasl_free (LmSASL *sasl);
+void               lm_sasl_free             (LmSASL               *sasl);
 
-void
-lm_sasl_get_auth_params (LmSASL *sasl, const gchar **username,
-                         const gchar **password);
+LmAuthParameters * lm_sasl_get_auth_params  (LmSASL               *sasl);
+
 
 G_END_DECLS