comparison libpurple/plugins/ssl/ssl-gnutls.c @ 15822:32c366eeeb99

sed -ie 's/gaim/purple/g'
author Sean Egan <seanegan@gmail.com>
date Mon, 19 Mar 2007 07:01:17 +0000
parents eed84b59c252
children 6531f1a2e1d7
comparison
equal deleted inserted replaced
15821:84b0f9b23ede 15822:32c366eeeb99
1 /** 1 /**
2 * @file ssl-gnutls.c GNUTLS SSL plugin. 2 * @file ssl-gnutls.c GNUTLS SSL plugin.
3 * 3 *
4 * gaim 4 * purple
5 * 5 *
6 * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org> 6 * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org>
7 * 7 *
8 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
33 33
34 typedef struct 34 typedef struct
35 { 35 {
36 gnutls_session session; 36 gnutls_session session;
37 guint handshake_handler; 37 guint handshake_handler;
38 } GaimSslGnutlsData; 38 } PurpleSslGnutlsData;
39 39
40 #define GAIM_SSL_GNUTLS_DATA(gsc) ((GaimSslGnutlsData *)gsc->private_data) 40 #define PURPLE_SSL_GNUTLS_DATA(gsc) ((PurpleSslGnutlsData *)gsc->private_data)
41 41
42 static gnutls_certificate_client_credentials xcred; 42 static gnutls_certificate_client_credentials xcred;
43 43
44 static void 44 static void
45 ssl_gnutls_init_gnutls(void) 45 ssl_gnutls_init_gnutls(void)
65 gnutls_certificate_free_credentials(xcred); 65 gnutls_certificate_free_credentials(xcred);
66 } 66 }
67 67
68 68
69 static void ssl_gnutls_handshake_cb(gpointer data, gint source, 69 static void ssl_gnutls_handshake_cb(gpointer data, gint source,
70 GaimInputCondition cond) 70 PurpleInputCondition cond)
71 { 71 {
72 GaimSslConnection *gsc = data; 72 PurpleSslConnection *gsc = data;
73 GaimSslGnutlsData *gnutls_data = GAIM_SSL_GNUTLS_DATA(gsc); 73 PurpleSslGnutlsData *gnutls_data = PURPLE_SSL_GNUTLS_DATA(gsc);
74 ssize_t ret; 74 ssize_t ret;
75 75
76 gaim_debug_info("gnutls", "Handshaking\n"); 76 purple_debug_info("gnutls", "Handshaking\n");
77 ret = gnutls_handshake(gnutls_data->session); 77 ret = gnutls_handshake(gnutls_data->session);
78 78
79 if(ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED) 79 if(ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED)
80 return; 80 return;
81 81
82 gaim_input_remove(gnutls_data->handshake_handler); 82 purple_input_remove(gnutls_data->handshake_handler);
83 gnutls_data->handshake_handler = 0; 83 gnutls_data->handshake_handler = 0;
84 84
85 if(ret != 0) { 85 if(ret != 0) {
86 gaim_debug_error("gnutls", "Handshake failed. Error %s\n", 86 purple_debug_error("gnutls", "Handshake failed. Error %s\n",
87 gnutls_strerror(ret)); 87 gnutls_strerror(ret));
88 88
89 if(gsc->error_cb != NULL) 89 if(gsc->error_cb != NULL)
90 gsc->error_cb(gsc, GAIM_SSL_HANDSHAKE_FAILED, 90 gsc->error_cb(gsc, PURPLE_SSL_HANDSHAKE_FAILED,
91 gsc->connect_cb_data); 91 gsc->connect_cb_data);
92 92
93 gaim_ssl_close(gsc); 93 purple_ssl_close(gsc);
94 } else { 94 } else {
95 gaim_debug_info("gnutls", "Handshake complete\n"); 95 purple_debug_info("gnutls", "Handshake complete\n");
96 96
97 gsc->connect_cb(gsc->connect_cb_data, gsc, cond); 97 gsc->connect_cb(gsc->connect_cb_data, gsc, cond);
98 } 98 }
99 99
100 } 100 }
101 101
102 102
103 static void 103 static void
104 ssl_gnutls_connect(GaimSslConnection *gsc) 104 ssl_gnutls_connect(PurpleSslConnection *gsc)
105 { 105 {
106 GaimSslGnutlsData *gnutls_data; 106 PurpleSslGnutlsData *gnutls_data;
107 static const int cert_type_priority[2] = { GNUTLS_CRT_X509, 0 }; 107 static const int cert_type_priority[2] = { GNUTLS_CRT_X509, 0 };
108 108
109 gnutls_data = g_new0(GaimSslGnutlsData, 1); 109 gnutls_data = g_new0(PurpleSslGnutlsData, 1);
110 gsc->private_data = gnutls_data; 110 gsc->private_data = gnutls_data;
111 111
112 gnutls_init(&gnutls_data->session, GNUTLS_CLIENT); 112 gnutls_init(&gnutls_data->session, GNUTLS_CLIENT);
113 gnutls_set_default_priority(gnutls_data->session); 113 gnutls_set_default_priority(gnutls_data->session);
114 114
118 gnutls_credentials_set(gnutls_data->session, GNUTLS_CRD_CERTIFICATE, 118 gnutls_credentials_set(gnutls_data->session, GNUTLS_CRD_CERTIFICATE,
119 xcred); 119 xcred);
120 120
121 gnutls_transport_set_ptr(gnutls_data->session, GINT_TO_POINTER(gsc->fd)); 121 gnutls_transport_set_ptr(gnutls_data->session, GINT_TO_POINTER(gsc->fd));
122 122
123 gnutls_data->handshake_handler = gaim_input_add(gsc->fd, 123 gnutls_data->handshake_handler = purple_input_add(gsc->fd,
124 GAIM_INPUT_READ, ssl_gnutls_handshake_cb, gsc); 124 PURPLE_INPUT_READ, ssl_gnutls_handshake_cb, gsc);
125 125
126 ssl_gnutls_handshake_cb(gsc, gsc->fd, GAIM_INPUT_READ); 126 ssl_gnutls_handshake_cb(gsc, gsc->fd, PURPLE_INPUT_READ);
127 } 127 }
128 128
129 static void 129 static void
130 ssl_gnutls_close(GaimSslConnection *gsc) 130 ssl_gnutls_close(PurpleSslConnection *gsc)
131 { 131 {
132 GaimSslGnutlsData *gnutls_data = GAIM_SSL_GNUTLS_DATA(gsc); 132 PurpleSslGnutlsData *gnutls_data = PURPLE_SSL_GNUTLS_DATA(gsc);
133 133
134 if(!gnutls_data) 134 if(!gnutls_data)
135 return; 135 return;
136 136
137 if(gnutls_data->handshake_handler) 137 if(gnutls_data->handshake_handler)
138 gaim_input_remove(gnutls_data->handshake_handler); 138 purple_input_remove(gnutls_data->handshake_handler);
139 139
140 gnutls_bye(gnutls_data->session, GNUTLS_SHUT_RDWR); 140 gnutls_bye(gnutls_data->session, GNUTLS_SHUT_RDWR);
141 141
142 gnutls_deinit(gnutls_data->session); 142 gnutls_deinit(gnutls_data->session);
143 143
144 g_free(gnutls_data); 144 g_free(gnutls_data);
145 gsc->private_data = NULL; 145 gsc->private_data = NULL;
146 } 146 }
147 147
148 static size_t 148 static size_t
149 ssl_gnutls_read(GaimSslConnection *gsc, void *data, size_t len) 149 ssl_gnutls_read(PurpleSslConnection *gsc, void *data, size_t len)
150 { 150 {
151 GaimSslGnutlsData *gnutls_data = GAIM_SSL_GNUTLS_DATA(gsc); 151 PurpleSslGnutlsData *gnutls_data = PURPLE_SSL_GNUTLS_DATA(gsc);
152 ssize_t s; 152 ssize_t s;
153 153
154 s = gnutls_record_recv(gnutls_data->session, data, len); 154 s = gnutls_record_recv(gnutls_data->session, data, len);
155 155
156 if(s == GNUTLS_E_AGAIN || s == GNUTLS_E_INTERRUPTED) { 156 if(s == GNUTLS_E_AGAIN || s == GNUTLS_E_INTERRUPTED) {
157 s = -1; 157 s = -1;
158 errno = EAGAIN; 158 errno = EAGAIN;
159 } else if(s < 0) { 159 } else if(s < 0) {
160 gaim_debug_error("gnutls", "receive failed: %s\n", 160 purple_debug_error("gnutls", "receive failed: %s\n",
161 gnutls_strerror(s)); 161 gnutls_strerror(s));
162 s = -1; 162 s = -1;
163 /* 163 /*
164 * TODO: Set errno to something more appropriate. Or even 164 * TODO: Set errno to something more appropriate. Or even
165 * better: allow ssl plugins to keep track of their 165 * better: allow ssl plugins to keep track of their
171 171
172 return s; 172 return s;
173 } 173 }
174 174
175 static size_t 175 static size_t
176 ssl_gnutls_write(GaimSslConnection *gsc, const void *data, size_t len) 176 ssl_gnutls_write(PurpleSslConnection *gsc, const void *data, size_t len)
177 { 177 {
178 GaimSslGnutlsData *gnutls_data = GAIM_SSL_GNUTLS_DATA(gsc); 178 PurpleSslGnutlsData *gnutls_data = PURPLE_SSL_GNUTLS_DATA(gsc);
179 ssize_t s = 0; 179 ssize_t s = 0;
180 180
181 /* XXX: when will gnutls_data be NULL? */ 181 /* XXX: when will gnutls_data be NULL? */
182 if(gnutls_data) 182 if(gnutls_data)
183 s = gnutls_record_send(gnutls_data->session, data, len); 183 s = gnutls_record_send(gnutls_data->session, data, len);
184 184
185 if(s == GNUTLS_E_AGAIN || s == GNUTLS_E_INTERRUPTED) { 185 if(s == GNUTLS_E_AGAIN || s == GNUTLS_E_INTERRUPTED) {
186 s = -1; 186 s = -1;
187 errno = EAGAIN; 187 errno = EAGAIN;
188 } else if(s < 0) { 188 } else if(s < 0) {
189 gaim_debug_error("gnutls", "send failed: %s\n", 189 purple_debug_error("gnutls", "send failed: %s\n",
190 gnutls_strerror(s)); 190 gnutls_strerror(s));
191 s = -1; 191 s = -1;
192 /* 192 /*
193 * TODO: Set errno to something more appropriate. Or even 193 * TODO: Set errno to something more appropriate. Or even
194 * better: allow ssl plugins to keep track of their 194 * better: allow ssl plugins to keep track of their
199 } 199 }
200 200
201 return s; 201 return s;
202 } 202 }
203 203
204 static GaimSslOps ssl_ops = 204 static PurpleSslOps ssl_ops =
205 { 205 {
206 ssl_gnutls_init, 206 ssl_gnutls_init,
207 ssl_gnutls_uninit, 207 ssl_gnutls_uninit,
208 ssl_gnutls_connect, 208 ssl_gnutls_connect,
209 ssl_gnutls_close, 209 ssl_gnutls_close,
212 }; 212 };
213 213
214 #endif /* HAVE_GNUTLS */ 214 #endif /* HAVE_GNUTLS */
215 215
216 static gboolean 216 static gboolean
217 plugin_load(GaimPlugin *plugin) 217 plugin_load(PurplePlugin *plugin)
218 { 218 {
219 #ifdef HAVE_GNUTLS 219 #ifdef HAVE_GNUTLS
220 if(!gaim_ssl_get_ops()) { 220 if(!purple_ssl_get_ops()) {
221 gaim_ssl_set_ops(&ssl_ops); 221 purple_ssl_set_ops(&ssl_ops);
222 } 222 }
223 223
224 /* Init GNUTLS now so others can use it even if sslconn never does */ 224 /* Init GNUTLS now so others can use it even if sslconn never does */
225 ssl_gnutls_init_gnutls(); 225 ssl_gnutls_init_gnutls();
226 226
229 return FALSE; 229 return FALSE;
230 #endif 230 #endif
231 } 231 }
232 232
233 static gboolean 233 static gboolean
234 plugin_unload(GaimPlugin *plugin) 234 plugin_unload(PurplePlugin *plugin)
235 { 235 {
236 #ifdef HAVE_GNUTLS 236 #ifdef HAVE_GNUTLS
237 if(gaim_ssl_get_ops() == &ssl_ops) { 237 if(purple_ssl_get_ops() == &ssl_ops) {
238 gaim_ssl_set_ops(NULL); 238 purple_ssl_set_ops(NULL);
239 } 239 }
240 #endif 240 #endif
241 241
242 return TRUE; 242 return TRUE;
243 } 243 }
244 244
245 static GaimPluginInfo info = 245 static PurplePluginInfo info =
246 { 246 {
247 GAIM_PLUGIN_MAGIC, 247 PURPLE_PLUGIN_MAGIC,
248 GAIM_MAJOR_VERSION, 248 PURPLE_MAJOR_VERSION,
249 GAIM_MINOR_VERSION, 249 PURPLE_MINOR_VERSION,
250 GAIM_PLUGIN_STANDARD, /**< type */ 250 PURPLE_PLUGIN_STANDARD, /**< type */
251 NULL, /**< ui_requirement */ 251 NULL, /**< ui_requirement */
252 GAIM_PLUGIN_FLAG_INVISIBLE, /**< flags */ 252 PURPLE_PLUGIN_FLAG_INVISIBLE, /**< flags */
253 NULL, /**< dependencies */ 253 NULL, /**< dependencies */
254 GAIM_PRIORITY_DEFAULT, /**< priority */ 254 PURPLE_PRIORITY_DEFAULT, /**< priority */
255 255
256 SSL_GNUTLS_PLUGIN_ID, /**< id */ 256 SSL_GNUTLS_PLUGIN_ID, /**< id */
257 N_("GNUTLS"), /**< name */ 257 N_("GNUTLS"), /**< name */
258 VERSION, /**< version */ 258 VERSION, /**< version */
259 /** summary */ 259 /** summary */
260 N_("Provides SSL support through GNUTLS."), 260 N_("Provides SSL support through GNUTLS."),
261 /** description */ 261 /** description */
262 N_("Provides SSL support through GNUTLS."), 262 N_("Provides SSL support through GNUTLS."),
263 "Christian Hammond <chipx86@gnupdate.org>", 263 "Christian Hammond <chipx86@gnupdate.org>",
264 GAIM_WEBSITE, /**< homepage */ 264 PURPLE_WEBSITE, /**< homepage */
265 265
266 plugin_load, /**< load */ 266 plugin_load, /**< load */
267 plugin_unload, /**< unload */ 267 plugin_unload, /**< unload */
268 NULL, /**< destroy */ 268 NULL, /**< destroy */
269 269
272 NULL, /**< prefs_info */ 272 NULL, /**< prefs_info */
273 NULL /**< actions */ 273 NULL /**< actions */
274 }; 274 };
275 275
276 static void 276 static void
277 init_plugin(GaimPlugin *plugin) 277 init_plugin(PurplePlugin *plugin)
278 { 278 {
279 } 279 }
280 280
281 GAIM_INIT_PLUGIN(ssl_gnutls, init_plugin, info) 281 PURPLE_INIT_PLUGIN(ssl_gnutls, init_plugin, info)