Merge branch 'starttls' of git://people.freedesktop.org/~daf/loudmouth into 1.3
authorSenko Rasic <senko.rasic@collabora.co.uk>
Mon, 29 Oct 2007 14:49:34 +0100
changeset 290 4ab72c1064e9
parent 283 b77f6cfe229e (current diff)
parent 289 839adca0d863 (diff)
child 291 cebf76f7f0e9
Merge branch 'starttls' of git://people.freedesktop.org/~daf/loudmouth into 1.3
loudmouth/lm-connection.c
--- a/docs/reference/tmpl/lm-message.sgml	Mon Oct 08 14:48:38 2007 +0200
+++ b/docs/reference/tmpl/lm-message.sgml	Mon Oct 29 14:49:34 2007 +0100
@@ -42,6 +42,8 @@
 @LM_MESSAGE_TYPE_SUCCESS: 
 @LM_MESSAGE_TYPE_FAILURE: 
 @LM_MESSAGE_TYPE_STREAM_ERROR: a stream:error element
+@LM_MESSAGE_TYPE_PROCEED: 
+@LM_MESSAGE_TYPE_STARTTLS: 
 @LM_MESSAGE_TYPE_UNKNOWN: incoming message is of some unknown type.
 
 <!-- ##### ENUM LmMessageSubType ##### -->
--- a/docs/reference/tmpl/lm-utils.sgml	Mon Oct 08 14:48:38 2007 +0200
+++ b/docs/reference/tmpl/lm-utils.sgml	Mon Oct 29 14:49:34 2007 +0100
@@ -17,3 +17,12 @@
 <!-- ##### SECTION Stability_Level ##### -->
 
 
+<!-- ##### FUNCTION lm_utils_get_localtime ##### -->
+<para>
+
+</para>
+
+@stamp: 
+@Returns: 
+
+
--- a/docs/reference/tmpl/loudmouth-unused.sgml	Mon Oct 08 14:48:38 2007 +0200
+++ b/docs/reference/tmpl/loudmouth-unused.sgml	Mon Oct 29 14:49:34 2007 +0100
@@ -91,11 +91,3 @@
 
 @message_node: 
 
-<!-- ##### FUNCTION lm_utils_get_localtime ##### -->
-<para>
-
-</para>
-
-@stamp: 
-@Returns: 
-
--- a/loudmouth/lm-connection.c	Mon Oct 08 14:48:38 2007 +0200
+++ b/loudmouth/lm-connection.c	Mon Oct 29 14:49:34 2007 +0100
@@ -76,11 +76,7 @@
 	LmSASL       *sasl;
 	gchar        *resource;
 	LmMessageHandler *features_cb;
-	gboolean      use_starttls;
 	LmMessageHandler *starttls_cb;
-	LmSSLFunction     ssl_fail_cb;
-	gpointer          ssl_fail_cb_data;
-	gboolean      require_starttls;
 
 	/* Communication */
 	guint         open_id;
@@ -741,9 +737,11 @@
 	if (connection->disconnect_cb && connection->disconnect_cb->func) {
 		LmCallback *cb = connection->disconnect_cb;
 		
+		lm_connection_ref (connection);
 		(* ((LmDisconnectFunction) cb->func)) (connection,
 						       reason,
 						       cb->user_data);
+		lm_connection_unref (connection);
 	}
 }
 
@@ -887,16 +885,6 @@
 	}
 }
 
-static LmSSLResponse
-connection_tls_error (LmSSL        *ssl,
-		      LmSSLStatus   status,
-		      gpointer      user_data)
-{
-	LmConnection *conn = (LmConnection *) user_data;
-
-	return conn->ssl_fail_cb (ssl, status, conn->ssl_fail_cb_data);
-}
-
 static LmHandlerResult
 connection_bind_reply (LmMessageHandler *handler,
 			LmConnection    *connection,
@@ -944,8 +932,6 @@
 			    LmMessage *message,
 			    gpointer user_data)
 {
-	connection->ssl = lm_ssl_new (NULL, connection_tls_error, connection, NULL);
-	lm_ssl_ref (connection->ssl);
 	if (lm_socket_starttls (connection->socket, connection->ssl)) {
 		connection_send_stream_header (connection);
 	} else {
@@ -967,27 +953,31 @@
 	LmMessageNode    *starttls_node;
 	
 	starttls_node = lm_message_node_find_child (message->node, "starttls");
-	if (connection->use_starttls && starttls_node) {
-		LmMessage        *msg;
+	if (connection->ssl && lm_ssl_get_use_starttls (connection->ssl)) {
+		if (starttls_node) {
+			LmMessage        *msg;
 
-		msg = lm_message_new (NULL, LM_MESSAGE_TYPE_STARTTLS);
+			msg = lm_message_new (NULL, LM_MESSAGE_TYPE_STARTTLS);
 
-		lm_message_node_set_attributes (msg->node,
-						"xmlns", XMPP_NS_STARTTLS,
-						NULL);
+			lm_message_node_set_attributes (
+				msg->node,
+				"xmlns", XMPP_NS_STARTTLS,
+				NULL);
 
-		lm_connection_send (connection, msg, NULL);
-		lm_message_unref (msg);
+			lm_connection_send (connection, msg, NULL);
+			lm_message_unref (msg);
 
-		return LM_HANDLER_RESULT_REMOVE_MESSAGE;
-	} else if (!connection->ssl && connection->require_starttls) {
-		/* If we don't have ssl set up already, and there
-		 * were no starttls features present, and we do
-		 * require it, this is the place to scream */
+			return LM_HANDLER_RESULT_REMOVE_MESSAGE;
+		} else if (lm_ssl_get_require_starttls (connection->ssl)) {
+			/* If there were no starttls features present and we require it, this is
+			 * the place to scream. */
 
-		g_debug ("%s: required StartTLS feature not supported by server", G_STRFUNC);
-		connection_do_close (connection);
-		return LM_HANDLER_RESULT_REMOVE_MESSAGE;
+			g_debug ("%s: required StartTLS feature not supported by server", G_STRFUNC);
+			connection_do_close (connection);
+			connection_signal_disconnect (connection,
+				LM_DISCONNECT_REASON_ERROR);
+			return LM_HANDLER_RESULT_REMOVE_MESSAGE;
+		}
 	}
 
 	bind_node = lm_message_node_find_child (message->node, "bind");
@@ -1343,7 +1333,7 @@
 			LM_MESSAGE_TYPE_STREAM_FEATURES,
 			LM_HANDLER_PRIORITY_FIRST);
 
-		if (connection->use_starttls) {
+		if (connection->ssl && lm_ssl_get_use_starttls (connection->ssl)) {
 			connection->starttls_cb  =
 				lm_message_handler_new (_lm_connection_starttls_cb,
 					NULL, NULL);
@@ -2028,20 +2018,3 @@
 		connection_free (connection);
 	}
 }
-
-/*
- * lm_connection_use_startls:
- * @connection: Connection to use STARTTLS on
- */
-void
-lm_connection_use_starttls (LmConnection *connection,
-			    gboolean require,
-			    LmSSLFunction ssl_fail_cb,
-			    gpointer user_data)
-{
-	connection->use_starttls = TRUE;
-	connection->ssl_fail_cb = ssl_fail_cb;
-	connection->ssl_fail_cb_data = user_data;
-	connection->require_starttls = require;
-}
-
--- a/loudmouth/lm-connection.h	Mon Oct 08 14:48:38 2007 +0200
+++ b/loudmouth/lm-connection.h	Mon Oct 29 14:49:34 2007 +0100
@@ -159,10 +159,6 @@
 LmConnectionState lm_connection_get_state     (LmConnection       *connection);
 LmConnection* lm_connection_ref               (LmConnection       *connection);
 void          lm_connection_unref             (LmConnection       *connection);
-void          lm_connection_use_starttls (LmConnection *connection,
-		   			  gboolean require,
-					  LmSSLFunction ssl_fail_cb,
-					  gpointer user_data);
 
 G_END_DECLS
 
--- a/loudmouth/lm-ssl-base.h	Mon Oct 08 14:48:38 2007 +0200
+++ b/loudmouth/lm-ssl-base.h	Mon Oct 29 14:49:34 2007 +0100
@@ -32,6 +32,8 @@
 	GDestroyNotify  data_notify;
 	gchar          *expected_fingerprint;
 	char            fingerprint[20];
+	gboolean        use_starttls;
+	gboolean        require_starttls;
 
 	gint            ref_count;
 };
--- a/loudmouth/lm-ssl-generic.c	Mon Oct 08 14:48:38 2007 +0200
+++ b/loudmouth/lm-ssl-generic.c	Mon Oct 29 14:49:34 2007 +0100
@@ -170,6 +170,52 @@
 }
 
 /**
+ * lm_ssl_use_starttls:
+ * @ssl: an #LmSSL
+ *
+ * Set whether STARTTLS should be used.
+ **/
+void
+lm_ssl_use_starttls (LmSSL *ssl,
+		     gboolean use_starttls,
+		     gboolean require_starttls)
+{
+	LmSSLBase *base;
+
+	base = LM_SSL_BASE (ssl);
+	base->use_starttls = use_starttls;
+	base->require_starttls = require_starttls;
+}
+
+/**
+ * lm_ssl_get_use_starttls:
+ *
+ * Return value: TRUE is @ssl is configured to use STARTTLS.
+ **/
+gboolean
+lm_ssl_get_use_starttls (LmSSL *ssl)
+{
+	LmSSLBase *base;
+
+	base = LM_SSL_BASE (ssl);
+	return base->use_starttls;
+}
+
+/**
+ * lm_ssl_get_require_starttls:
+ *
+ * Return value: TRUE if @ssl requires that STARTTLS succeed.
+ **/
+gboolean
+lm_ssl_get_require_starttls (LmSSL *ssl)
+{
+	LmSSLBase *base;
+
+	base = LM_SSL_BASE (ssl);
+	return base->require_starttls;
+}
+
+/**
  * lm_ssl_unref
  * @ssl: an #LmSSL
  * 
--- a/loudmouth/lm-ssl.h	Mon Oct 08 14:48:38 2007 +0200
+++ b/loudmouth/lm-ssl.h	Mon Oct 29 14:49:34 2007 +0100
@@ -65,6 +65,13 @@
 
 const gchar *         lm_ssl_get_fingerprint (LmSSL          *ssl);
 
+void                  lm_ssl_use_starttls    (LmSSL *ssl,
+					      gboolean use_starttls,
+					      gboolean require);
+
+gboolean              lm_ssl_get_use_starttls (LmSSL *ssl);
+
+gboolean              lm_ssl_get_require_starttls (LmSSL *ssl);
 
 LmSSL *               lm_ssl_ref             (LmSSL          *ssl);
 void                  lm_ssl_unref           (LmSSL          *ssl);