Beispiel #1
0
static gboolean ssl_connected(gpointer data, gint source, b_input_condition cond)
{
	struct scd *conn = data;

	if (conn->verify) {
		/* Right now we don't have any verification functionality for OpenSSL. */
		conn->func(conn->data, 1, NULL, cond);
		if (source >= 0) {
			proxy_disconnect(source);
		}
		ssl_conn_free(conn);

		return FALSE;
	}

	if (source == -1) {
		goto ssl_connected_failure;
	}

	if (!initialized) {
		ssl_init();
	}


	if (ssl_ctx == NULL) {
		goto ssl_connected_failure;
	}

	conn->ssl = SSL_new(ssl_ctx);
	if (conn->ssl == NULL) {
		goto ssl_connected_failure;
	}

	/* We can do at least the handshake with non-blocking I/O */
	sock_make_nonblocking(conn->fd);
	SSL_set_fd(conn->ssl, conn->fd);

	if (conn->hostname && !g_ascii_isdigit(conn->hostname[0])) {
		SSL_set_tlsext_host_name(conn->ssl, conn->hostname);
	}

	return ssl_handshake(data, source, cond);

ssl_connected_failure:
	conn->func(conn->data, 0, NULL, cond);
	ssl_disconnect(conn);
	return FALSE;

}
Beispiel #2
0
void ssl_disconnect(void *conn_)
{
	struct scd *conn = conn_;

	if (conn->inpa != -1) {
		b_event_remove(conn->inpa);
	}

	if (conn->established) {
		SSL_shutdown(conn->ssl);
	}

	proxy_disconnect(conn->fd);

	ssl_conn_free(conn);
}
Beispiel #3
0
void ssl_disconnect(void *conn_)
{
	struct scd *conn = conn_;

	// When we swich to NSS_Init, we should have here
	// NSS_Shutdown();

	if (conn->prfd) {
		PR_Close(conn->prfd);
	} else if (conn->fd) {
		proxy_disconnect(conn->fd);
	}

	g_free(conn->hostname);
	g_free(conn);
}
Beispiel #4
0
static void jabber_logout(struct im_connection *ic)
{
	struct jabber_data *jd = ic->proto_data;

	while (jd->filetransfers) {
		imcb_file_canceled(ic, (( struct jabber_transfer *) jd->filetransfers->data)->ft, "Logging out");
	}

	while (jd->streamhosts) {
		jabber_streamhost_t *sh = jd->streamhosts->data;
		jd->streamhosts = g_slist_remove(jd->streamhosts, sh);
		g_free(sh->jid);
		g_free(sh->host);
		g_free(sh);
	}

	if (jd->fd >= 0) {
		jabber_end_stream(ic);
	}

	while (ic->groupchats) {
		jabber_chat_free(ic->groupchats->data);
	}

	if (jd->r_inpa >= 0) {
		b_event_remove(jd->r_inpa);
	}
	if (jd->w_inpa >= 0) {
		b_event_remove(jd->w_inpa);
	}

	if (jd->ssl) {
		ssl_disconnect(jd->ssl);
	}
	if (jd->fd >= 0) {
		proxy_disconnect(jd->fd);
	}

	if (jd->tx_len) {
		g_free(jd->txq);
	}

	if (jd->node_cache) {
		g_hash_table_destroy(jd->node_cache);
	}

	if (jd->buddies) {
		jabber_buddy_remove_all(ic);
	}

	xt_free(jd->xt);

	md5_free(&jd->cached_id_prefix);

	g_free(jd->oauth2_access_token);
	g_free(jd->away_message);
	g_free(jd->internal_jid);
	g_free(jd->gmail_tid);
	g_free(jd->muc_host);
	g_free(jd->username);
	g_free(jd->me);
	g_free(jd);

	jabber_connections = g_slist_remove(jabber_connections, ic);
}