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.
--- 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