| 98 |
98 |
| 99 } |
99 } |
| 100 |
100 |
| 101 |
101 |
| 102 static void |
102 static void |
| 103 ssl_gnutls_connect_cb(gpointer data, gint source, GaimInputCondition cond) |
103 ssl_gnutls_connect(GaimSslConnection *gsc) |
| 104 { |
104 { |
| 105 GaimSslConnection *gsc = (GaimSslConnection *)data; |
|
| 106 GaimSslGnutlsData *gnutls_data; |
105 GaimSslGnutlsData *gnutls_data; |
| 107 static const int cert_type_priority[2] = { GNUTLS_CRT_X509, 0 }; |
106 static const int cert_type_priority[2] = { GNUTLS_CRT_X509, 0 }; |
| 108 |
107 |
| 109 /* |
|
| 110 * TODO: Uh, this needs to somehow check to make sure that gsc is |
|
| 111 * still valid before actually doing anything. |
|
| 112 */ |
|
| 113 |
|
| 114 if(source < 0) { |
|
| 115 if(gsc->error_cb != NULL) |
|
| 116 gsc->error_cb(gsc, GAIM_SSL_CONNECT_FAILED, gsc->connect_cb_data); |
|
| 117 |
|
| 118 gaim_ssl_close(gsc); |
|
| 119 return; |
|
| 120 } |
|
| 121 |
|
| 122 gsc->fd = source; |
|
| 123 |
|
| 124 gnutls_data = g_new0(GaimSslGnutlsData, 1); |
108 gnutls_data = g_new0(GaimSslGnutlsData, 1); |
| 125 gsc->private_data = gnutls_data; |
109 gsc->private_data = gnutls_data; |
| 126 |
110 |
| 127 gnutls_init(&gnutls_data->session, GNUTLS_CLIENT); |
111 gnutls_init(&gnutls_data->session, GNUTLS_CLIENT); |
| 128 gnutls_set_default_priority(gnutls_data->session); |
112 gnutls_set_default_priority(gnutls_data->session); |
| 131 cert_type_priority); |
115 cert_type_priority); |
| 132 |
116 |
| 133 gnutls_credentials_set(gnutls_data->session, GNUTLS_CRD_CERTIFICATE, |
117 gnutls_credentials_set(gnutls_data->session, GNUTLS_CRD_CERTIFICATE, |
| 134 xcred); |
118 xcred); |
| 135 |
119 |
| 136 gnutls_transport_set_ptr(gnutls_data->session, GINT_TO_POINTER(source)); |
120 gnutls_transport_set_ptr(gnutls_data->session, GINT_TO_POINTER(gsc->fd)); |
| 137 |
121 |
| 138 gnutls_data->handshake_handler = gaim_input_add(gsc->fd, |
122 gnutls_data->handshake_handler = gaim_input_add(gsc->fd, |
| 139 GAIM_INPUT_READ, ssl_gnutls_handshake_cb, gsc); |
123 GAIM_INPUT_READ, ssl_gnutls_handshake_cb, gsc); |
| 140 |
124 |
| 141 ssl_gnutls_handshake_cb(gsc, gsc->fd, GAIM_INPUT_READ); |
125 ssl_gnutls_handshake_cb(gsc, gsc->fd, GAIM_INPUT_READ); |