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