Mercurial > pidgin.yaz
annotate plugins/ssl/ssl-gnutls.c @ 7665:0351ff7030d0
[gaim-migrate @ 8309]
Felipe Contreras (aka revo aka shx) writes:
" Basically that, currently gaim will not display
international "subjects" or "from" fields from emails,
like "a??a" or "Pa?l".
This implements the propper RFC that specify the format
for those fields."
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sun, 30 Nov 2003 04:17:17 +0000 |
parents | ea2d07ad05a9 |
children | 99ffabc6ce73 |
rev | line source |
---|---|
7016 | 1 /** |
2 * @file ssl-gnutls.c GNUTLS SSL plugin. | |
3 * | |
4 * gaim | |
5 * | |
6 * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org> | |
7 * | |
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 | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 */ | |
22 #include "internal.h" | |
7051
e885d4963a68
[gaim-migrate @ 7614]
Christian Hammond <chipx86@chipx86.com>
parents:
7050
diff
changeset
|
23 #include "debug.h" |
7016 | 24 #include "plugin.h" |
7051
e885d4963a68
[gaim-migrate @ 7614]
Christian Hammond <chipx86@chipx86.com>
parents:
7050
diff
changeset
|
25 #include "sslconn.h" |
7016 | 26 |
27 #define SSL_GNUTLS_PLUGIN_ID "ssl-gnutls" | |
28 | |
29 #ifdef HAVE_GNUTLS | |
30 | |
31 #include <gnutls/gnutls.h> | |
32 | |
33 typedef struct | |
34 { | |
35 gnutls_session session; | |
36 | |
37 } GaimSslGnutlsData; | |
38 | |
39 #define GAIM_SSL_GNUTLS_DATA(gsc) ((GaimSslGnutlsData *)gsc->private_data) | |
40 | |
41 static gnutls_certificate_client_credentials xcred; | |
42 | |
43 static gboolean | |
44 ssl_gnutls_init(void) | |
45 { | |
46 gnutls_global_init(); | |
47 | |
48 gnutls_certificate_allocate_credentials(&xcred); | |
49 gnutls_certificate_set_x509_trust_file(xcred, "ca.pem", | |
50 GNUTLS_X509_FMT_PEM); | |
51 | |
52 return TRUE; | |
53 } | |
54 | |
55 static void | |
56 ssl_gnutls_uninit(void) | |
57 { | |
58 gnutls_global_deinit(); | |
59 | |
60 gnutls_certificate_free_credentials(xcred); | |
61 } | |
62 | |
63 static void | |
64 ssl_gnutls_connect_cb(gpointer data, gint source, GaimInputCondition cond) | |
65 { | |
66 GaimSslConnection *gsc = (GaimSslConnection *)data; | |
67 GaimSslGnutlsData *gnutls_data; | |
68 static const int cert_type_priority[2] = { GNUTLS_CRT_X509, 0 }; | |
69 int ret; | |
70 | |
71 if (source < 0) | |
72 return; | |
73 | |
74 gsc->fd = source; | |
75 | |
76 gnutls_data = g_new0(GaimSslGnutlsData, 1); | |
77 gsc->private_data = gnutls_data; | |
78 | |
79 gnutls_init(&gnutls_data->session, GNUTLS_CLIENT); | |
80 gnutls_set_default_priority(gnutls_data->session); | |
81 | |
82 gnutls_certificate_type_set_priority(gnutls_data->session, | |
83 cert_type_priority); | |
84 | |
85 gnutls_credentials_set(gnutls_data->session, GNUTLS_CRD_CERTIFICATE, | |
86 xcred); | |
87 | |
88 gnutls_transport_set_ptr(gnutls_data->session, GINT_TO_POINTER(source)); | |
89 | |
90 gaim_debug_info("gnutls", "Handshaking\n"); | |
91 ret = gnutls_handshake(gnutls_data->session); | |
92 | |
93 if (ret < 0) | |
94 { | |
7325
35e652831230
[gaim-migrate @ 7911]
Christian Hammond <chipx86@chipx86.com>
parents:
7274
diff
changeset
|
95 gaim_debug_error("gnutls", "Handshake failed. Error %d\n", ret); |
7016 | 96 |
7274
448e39ace278
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7051
diff
changeset
|
97 if (gsc->error_cb != NULL) |
7481
5f0f9d7fba6a
[gaim-migrate @ 8094]
Christian Hammond <chipx86@chipx86.com>
parents:
7467
diff
changeset
|
98 gsc->error_cb(gsc, GAIM_SSL_HANDSHAKE_FAILED, |
5f0f9d7fba6a
[gaim-migrate @ 8094]
Christian Hammond <chipx86@chipx86.com>
parents:
7467
diff
changeset
|
99 gsc->connect_cb_data); |
7274
448e39ace278
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7051
diff
changeset
|
100 |
7016 | 101 gaim_ssl_close(gsc); |
102 } | |
103 else | |
104 { | |
105 gsc->connect_cb(gsc->connect_cb_data, gsc, cond); | |
106 } | |
107 } | |
108 | |
109 static void | |
110 ssl_gnutls_close(GaimSslConnection *gsc) | |
111 { | |
112 GaimSslGnutlsData *gnutls_data = GAIM_SSL_GNUTLS_DATA(gsc); | |
113 | |
7467 | 114 if(!gnutls_data) |
115 return; | |
116 | |
7016 | 117 gnutls_bye(gnutls_data->session, GNUTLS_SHUT_RDWR); |
118 | |
119 gnutls_deinit(gnutls_data->session); | |
120 | |
121 g_free(gnutls_data); | |
122 } | |
123 | |
124 static size_t | |
125 ssl_gnutls_read(GaimSslConnection *gsc, void *data, size_t len) | |
126 { | |
127 GaimSslGnutlsData *gnutls_data = GAIM_SSL_GNUTLS_DATA(gsc); | |
128 int s; | |
129 | |
130 s = gnutls_record_recv(gnutls_data->session, data, len); | |
131 | |
132 if (s < 0) | |
133 s = 0; | |
134 | |
135 return s; | |
136 } | |
137 | |
138 static size_t | |
139 ssl_gnutls_write(GaimSslConnection *gsc, const void *data, size_t len) | |
140 { | |
141 GaimSslGnutlsData *gnutls_data = GAIM_SSL_GNUTLS_DATA(gsc); | |
7467 | 142 size_t s = 0; |
7016 | 143 |
7467 | 144 if(gnutls_data) |
145 s = gnutls_record_send(gnutls_data->session, data, len); | |
7016 | 146 |
147 return s; | |
148 } | |
149 | |
150 static GaimSslOps ssl_ops = | |
151 { | |
152 ssl_gnutls_init, | |
153 ssl_gnutls_uninit, | |
154 ssl_gnutls_connect_cb, | |
155 ssl_gnutls_close, | |
156 ssl_gnutls_read, | |
157 ssl_gnutls_write | |
158 }; | |
159 | |
160 #endif /* HAVE_GNUTLS */ | |
161 | |
162 static gboolean | |
163 plugin_load(GaimPlugin *plugin) | |
164 { | |
165 #ifdef HAVE_GNUTLS | |
166 gaim_ssl_set_ops(&ssl_ops); | |
167 | |
168 return TRUE; | |
169 #else | |
170 return FALSE; | |
171 #endif | |
172 } | |
173 | |
174 static gboolean | |
175 plugin_unload(GaimPlugin *plugin) | |
176 { | |
7050
e8cd8827fb25
[gaim-migrate @ 7613]
Christian Hammond <chipx86@chipx86.com>
parents:
7016
diff
changeset
|
177 #ifdef HAVE_GNUTLS |
e8cd8827fb25
[gaim-migrate @ 7613]
Christian Hammond <chipx86@chipx86.com>
parents:
7016
diff
changeset
|
178 gaim_ssl_set_ops(NULL); |
e8cd8827fb25
[gaim-migrate @ 7613]
Christian Hammond <chipx86@chipx86.com>
parents:
7016
diff
changeset
|
179 #endif |
e8cd8827fb25
[gaim-migrate @ 7613]
Christian Hammond <chipx86@chipx86.com>
parents:
7016
diff
changeset
|
180 |
7016 | 181 return TRUE; |
182 } | |
183 | |
184 static GaimPluginInfo info = | |
185 { | |
186 2, /**< api_version */ | |
187 GAIM_PLUGIN_STANDARD, /**< type */ | |
188 NULL, /**< ui_requirement */ | |
189 GAIM_PLUGIN_FLAG_INVISIBLE, /**< flags */ | |
190 NULL, /**< dependencies */ | |
191 GAIM_PRIORITY_DEFAULT, /**< priority */ | |
192 | |
193 SSL_GNUTLS_PLUGIN_ID, /**< id */ | |
194 N_("GNUTLS"), /**< name */ | |
195 VERSION, /**< version */ | |
196 /** summary */ | |
197 N_("Provides SSL support through GNUTLS."), | |
198 /** description */ | |
199 N_("Provides SSL support through GNUTLS."), | |
200 "Christian Hammond <chipx86@gnupdate.org>", | |
201 GAIM_WEBSITE, /**< homepage */ | |
202 | |
203 plugin_load, /**< load */ | |
204 plugin_unload, /**< unload */ | |
205 NULL, /**< destroy */ | |
206 | |
207 NULL, /**< ui_info */ | |
208 NULL /**< extra_info */ | |
209 }; | |
210 | |
211 static void | |
212 init_plugin(GaimPlugin *plugin) | |
213 { | |
214 } | |
215 | |
216 GAIM_INIT_PLUGIN(ssl_gnutls, init_plugin, info) |