protocols/ircv3/purpleircv3connection.c

changeset 42772
4103b1b41a29
parent 42771
3dc6600c6c0e
child 42780
c1af98cbd43a
equal deleted inserted replaced
42771:3dc6600c6c0e 42772:4103b1b41a29
22 22
23 #include <glib/gi18n-lib.h> 23 #include <glib/gi18n-lib.h>
24 24
25 #include <birb.h> 25 #include <birb.h>
26 26
27 #include <hasl.h>
28
27 #include "purpleircv3connection.h" 29 #include "purpleircv3connection.h"
28 30
29 #include "purpleircv3core.h" 31 #include "purpleircv3core.h"
30 #include "purpleircv3messagehandlers.h" 32 #include "purpleircv3messagehandlers.h"
31 33
53 static gboolean 55 static gboolean
54 purple_ircv3_connection_unknown_message_cb(IbisClient *client, 56 purple_ircv3_connection_unknown_message_cb(IbisClient *client,
55 const char *command, 57 const char *command,
56 IbisMessage *message, 58 IbisMessage *message,
57 gpointer data); 59 gpointer data);
60
61 static gboolean
62 purple_ircv3_connection_saslsuccess(IbisClient *client, const char *command,
63 IbisMessage *message, gpointer data);
58 64
59 /****************************************************************************** 65 /******************************************************************************
60 * Helpers 66 * Helpers
61 *****************************************************************************/ 67 *****************************************************************************/
62 static void 68 static void
114 120
115 conversations = g_list_delete_link(conversations, conversations); 121 conversations = g_list_delete_link(conversations, conversations);
116 } 122 }
117 } 123 }
118 124
125 static inline void
126 purple_ircv3_connection_setup_sasl(PurpleIRCv3Connection *connection,
127 PurpleAccount *account)
128 {
129 PurpleIRCv3ConnectionPrivate *priv = NULL;
130 HaslContext *hasl_context = NULL;
131 const char *value = NULL;
132 gboolean clear_text = FALSE;
133
134 priv = purple_ircv3_connection_get_instance_private(connection);
135
136 hasl_context = hasl_context_new();
137
138 value = purple_account_get_string(account, "sasl-login-name", NULL);
139 if(!purple_strempty(value)) {
140 hasl_context_set_username(hasl_context, value);
141 } else {
142 hasl_context_set_username(hasl_context,
143 ibis_client_get_nick(priv->client));
144
145 /* Since the user doesn't have a SASL login name set, we'll listen for
146 * IBIS_RPL_SASLSUCCESS and use that to set the login name to the
147 * username in HASL which worked if the signal handler gets called.
148 */
149 g_signal_connect_object(priv->client, "message::" IBIS_RPL_SASLSUCCESS,
150 G_CALLBACK(purple_ircv3_connection_saslsuccess),
151 connection, G_CONNECT_DEFAULT);
152 }
153
154 value = purple_connection_get_password(PURPLE_CONNECTION(connection));
155 hasl_context_set_password(hasl_context, value);
156
157 value = purple_account_get_string(account, "sasl-mechanisms", NULL);
158 if(!purple_strempty(value)) {
159 hasl_context_set_allowed_mechanisms(hasl_context, value);
160 }
161
162 clear_text = purple_account_get_bool(account, "plain-sasl-in-clear", FALSE);
163 hasl_context_set_allow_clear_text(hasl_context, clear_text);
164
165 ibis_client_set_hasl_context(priv->client, hasl_context);
166 g_clear_object(&hasl_context);
167 }
168
119 /****************************************************************************** 169 /******************************************************************************
120 * Callbacks 170 * Callbacks
121 *****************************************************************************/ 171 *****************************************************************************/
122 static gboolean 172 static gboolean
123 purple_ircv3_connection_unknown_message_cb(G_GNUC_UNUSED IbisClient *client, 173 purple_ircv3_connection_unknown_message_cb(G_GNUC_UNUSED IbisClient *client,
148 g_free(contents); 198 g_free(contents);
149 199
150 return TRUE; 200 return TRUE;
151 } 201 }
152 202
203 static gboolean
204 purple_ircv3_connection_saslsuccess(IbisClient *client,
205 G_GNUC_UNUSED const char *command,
206 G_GNUC_UNUSED IbisMessage *message,
207 gpointer data)
208 {
209 PurpleIRCv3Connection *connection = data;
210 PurpleAccount *account = NULL;
211 const char *value = NULL;
212
213 account = purple_connection_get_account(PURPLE_CONNECTION(connection));
214 value = purple_account_get_string(account, "sasl-login-name", NULL);
215
216 /* If the sasl-login-name is empty, we set it to the current username in
217 * our hasl context that was used to login.
218 */
219 if(purple_strempty(value)) {
220 HaslContext *hasl_context = NULL;
221
222 hasl_context = ibis_client_get_hasl_context(client);
223 if(HASL_IS_CONTEXT(hasl_context)) {
224 purple_account_set_string(account, "sasl-login-name",
225 hasl_context_get_username(hasl_context));
226
227 }
228 }
229
230 /* We don't actually handle SASLSUCCESS, but we just needed to know if it
231 * was sent.
232 */
233 return FALSE;
234 }
235
153 static void 236 static void
154 purple_ircv3_connection_connect_cb(GObject *source, 237 purple_ircv3_connection_connect_cb(GObject *source,
155 G_GNUC_UNUSED GParamSpec *pspec, 238 G_GNUC_UNUSED GParamSpec *pspec,
156 gpointer data) 239 gpointer data)
157 { 240 {
237 /* If TLS is not being used, set the default port to the plain port. */ 320 /* If TLS is not being used, set the default port to the plain port. */
238 if(!tls) { 321 if(!tls) {
239 default_port = PURPLE_IRCV3_DEFAULT_PLAIN_PORT; 322 default_port = PURPLE_IRCV3_DEFAULT_PLAIN_PORT;
240 } 323 }
241 port = purple_account_get_int(account, "port", default_port); 324 port = purple_account_get_int(account, "port", default_port);
325
326 purple_ircv3_connection_setup_sasl(connection, account);
242 327
243 resolver = purple_proxy_get_proxy_resolver(account, &local_error); 328 resolver = purple_proxy_get_proxy_resolver(account, &local_error);
244 if(local_error != NULL) { 329 if(local_error != NULL) {
245 g_propagate_error(error, local_error); 330 g_propagate_error(error, local_error);
246 331

mercurial