--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/loudmouth/src/lm-ssl-generic.c Tue Feb 02 01:10:06 2010 +0200
@@ -0,0 +1,249 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2003-2006 Imendio AB
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include "lm-debug.h"
+#include "lm-ssl.h"
+#include "lm-ssl-base.h"
+#include "lm-ssl-internals.h"
+
+LmSSLResponse
+_lm_ssl_func_always_continue (LmSSL *ssl,
+ LmSSLStatus status,
+ gpointer user_data)
+{
+ UNUSED_FORMAL_PARAM(ssl);
+ UNUSED_FORMAL_PARAM(status);
+ UNUSED_FORMAL_PARAM(user_data);
+ return LM_SSL_RESPONSE_CONTINUE;;
+}
+
+/* Define the SSL functions as noops if we compile without support */
+#ifndef HAVE_SSL
+
+LmSSL *
+_lm_ssl_new (const gchar *expected_fingerprint,
+ LmSSLFunction ssl_function,
+ gpointer user_data,
+ GDestroyNotify notify)
+{
+ return NULL;
+}
+
+void
+_lm_ssl_initialize (LmSSL *ssl)
+{
+ /* NOOP */
+}
+
+gboolean
+_lm_ssl_begin (LmSSL *ssl,
+ gint fd,
+ const gchar *server,
+ GError **error)
+{
+ return TRUE;
+}
+
+GIOStatus
+_lm_ssl_read (LmSSL *ssl,
+ gchar *buf,
+ gint len,
+ gsize *bytes_read)
+{
+ /* NOOP */
+ *bytes_read = 0;
+
+ return G_IO_STATUS_EOF;
+}
+
+gboolean
+_lm_ssl_send (LmSSL *ssl, const gchar *str, gint len)
+{
+ /* NOOP */
+ return TRUE;
+}
+void
+_lm_ssl_close (LmSSL *ssl)
+{
+ /* NOOP */
+}
+
+void
+_lm_ssl_free (LmSSL *ssl)
+{
+ /* NOOP */
+}
+
+#endif /* HAVE_SSL */
+
+
+
+/**
+ * lm_ssl_new:
+ * @expected_fingerprint: The expected fingerprint. @ssl_function will be called if there is a mismatch. %NULL if you are not interested in this check.
+ * @ssl_function: Callback called to inform the user of a problem during setting up the SSL connection and how to proceed. If %NULL is passed the default function that always continues will be used.
+ * @user_data: Data sent with the callback.
+ * @notify: Function to free @user_dataa when the connection is finished. %NULL if @user_data should not be freed.
+ *
+ * Creates a new SSL struct, call #lm_connection_set_ssl to use it.
+ *
+ * Return value: A new #LmSSL struct.
+ **/
+EXPORT_C LmSSL *
+lm_ssl_new (const gchar *expected_fingerprint,
+ LmSSLFunction ssl_function,
+ gpointer user_data,
+ GDestroyNotify notify)
+{
+ /* The implementation of this function will be different depending
+ * on which implementation is used
+ */
+ return _lm_ssl_new (expected_fingerprint,
+ ssl_function, user_data, notify);
+}
+
+/**
+ * lm_ssl_is_supported:
+ *
+ * Checks whether Loudmouth supports SSL or not.
+ *
+ * Return value: #TRUE if this installation of Loudmouth supports SSL, otherwise returns #FALSE.
+ **/
+EXPORT_C gboolean
+lm_ssl_is_supported (void)
+{
+#ifdef HAVE_SSL
+ return TRUE;
+#else
+ return FALSE;
+#endif
+}
+
+
+/**
+ * lm_ssl_get_fingerprint:
+ * @ssl: an #LmSSL
+ *
+ * Returns the MD5 fingerprint of the remote server's certificate.
+ *
+ * Return value: A 16-byte array representing the fingerprint or %NULL if unknown.
+ **/
+EXPORT_C const gchar *
+lm_ssl_get_fingerprint (LmSSL *ssl)
+{
+ g_return_val_if_fail (ssl != NULL, NULL);
+
+ return LM_SSL_BASE(ssl)->fingerprint;
+}
+
+/**
+ * lm_ssl_ref:
+ * @ssl: an #LmSSL
+ *
+ * Adds a reference to @ssl.
+ *
+ * Return value: the ssl
+ **/
+EXPORT_C LmSSL *
+lm_ssl_ref (LmSSL *ssl)
+{
+ g_return_val_if_fail (ssl != NULL, NULL);
+
+ LM_SSL_BASE(ssl)->ref_count++;
+
+ return ssl;
+}
+
+/**
+ * lm_ssl_use_starttls:
+ * @ssl: an #LmSSL
+ *
+ * Set whether STARTTLS should be used.
+ **/
+EXPORT_C 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);
+ lm_verbose ("lm_ssl_get_use_starttls use_starttls[%d]\n", base->use_starttls);
+ 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
+ *
+ * Removes a reference from @ssl. When no more references are present
+ * @ssl is freed.
+ **/
+EXPORT_C void
+lm_ssl_unref (LmSSL *ssl)
+{
+ LmSSLBase *base;
+
+ g_return_if_fail (ssl != NULL);
+
+ base = LM_SSL_BASE (ssl);
+
+ base->ref_count --;
+
+ if (base->ref_count == 0) {
+ if (base->data_notify) {
+ (* base->data_notify) (base->func_data);
+ }
+
+ _lm_ssl_free (ssl);
+ }
+}
+
+