/*
* e-source-security.c
*
* This library 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.
*
* This library 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 library. If not, see .
*
*/
/**
* SECTION: e-source-security
* @include: libedataserver/libedataserver.h
* @short_description: #ESource extension for security settings
*
* The #ESourceSecurity extension tracks settings for establishing a
* secure connection with a remote server.
*
* Access the extension as follows:
*
* |[
* #include
*
* ESourceSecurity *extension;
*
* extension = e_source_get_extension (source, E_SOURCE_EXTENSION_SECURITY);
* ]|
**/
#include "e-source-security.h"
#include
#define E_SOURCE_SECURITY_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE \
((obj), E_TYPE_SOURCE_SECURITY, ESourceSecurityPrivate))
#define SECURE_METHOD "tls"
struct _ESourceSecurityPrivate {
gchar *method;
};
enum {
PROP_0,
PROP_METHOD,
PROP_SECURE
};
G_DEFINE_TYPE (
ESourceSecurity,
e_source_security,
E_TYPE_SOURCE_EXTENSION)
static void
source_security_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
switch (property_id) {
case PROP_METHOD:
e_source_security_set_method (
E_SOURCE_SECURITY (object),
g_value_get_string (value));
return;
case PROP_SECURE:
e_source_security_set_secure (
E_SOURCE_SECURITY (object),
g_value_get_boolean (value));
return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
source_security_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
switch (property_id) {
case PROP_METHOD:
g_value_take_string (
value,
e_source_security_dup_method (
E_SOURCE_SECURITY (object)));
return;
case PROP_SECURE:
g_value_set_boolean (
value,
e_source_security_get_secure (
E_SOURCE_SECURITY (object)));
return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
source_security_finalize (GObject *object)
{
ESourceSecurityPrivate *priv;
priv = E_SOURCE_SECURITY_GET_PRIVATE (object);
g_free (priv->method);
/* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (e_source_security_parent_class)->finalize (object);
}
static void
e_source_security_class_init (ESourceSecurityClass *class)
{
GObjectClass *object_class;
ESourceExtensionClass *extension_class;
g_type_class_add_private (class, sizeof (ESourceSecurityPrivate));
object_class = G_OBJECT_CLASS (class);
object_class->set_property = source_security_set_property;
object_class->get_property = source_security_get_property;
object_class->finalize = source_security_finalize;
extension_class = E_SOURCE_EXTENSION_CLASS (class);
extension_class->name = E_SOURCE_EXTENSION_SECURITY;
g_object_class_install_property (
object_class,
PROP_METHOD,
g_param_spec_string (
"method",
"Method",
"Security method",
"none",
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS |
E_SOURCE_PARAM_SETTING));
g_object_class_install_property (
object_class,
PROP_SECURE,
g_param_spec_boolean (
"secure",
"Secure",
"Secure the network connection",
FALSE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
}
static void
e_source_security_init (ESourceSecurity *extension)
{
extension->priv = E_SOURCE_SECURITY_GET_PRIVATE (extension);
}
/**
* e_source_security_get_method:
* @extension: an #ESourceSecurity
*
* Returns the method used to establish a secure network connection to a
* remote account. There are no pre-defined method names; backends are
* free to set this however they wish. If a secure connection is not
* desired, the convention is to set #ESourceSecurity:method to "none".
*
* Returns: the method used to establish a secure network connection
*
* Since: 3.6
**/
const gchar *
e_source_security_get_method (ESourceSecurity *extension)
{
g_return_val_if_fail (E_IS_SOURCE_SECURITY (extension), NULL);
return extension->priv->method;
}
/**
* e_source_security_dup_method:
* @extension: an #ESourceSecurity
*
* Thread-safe variation of e_source_security_get_method().
* Use this function when accessing @extension from multiple threads.
*
* The returned string should be freed with g_free() when no longer needed.
*
* Returns: a newly-allocated copy of #ESourceSecurity:method
*
* Since: 3.6
**/
gchar *
e_source_security_dup_method (ESourceSecurity *extension)
{
const gchar *protected;
gchar *duplicate;
g_return_val_if_fail (E_IS_SOURCE_SECURITY (extension), NULL);
e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
protected = e_source_security_get_method (extension);
duplicate = g_strdup (protected);
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
return duplicate;
}
/**
* e_source_security_set_method:
* @extension: an #ESourceSecurity
* @method: (allow-none): security method, or %NULL
*
* Sets the method used to establish a secure network connection to a
* remote account. There are no pre-defined method names; backends are
* free to set this however they wish. If a secure connection is not
* desired, the convention is to set #ESourceSecurity:method to "none".
* In keeping with that convention, #ESourceSecurity:method will be set
* to "none" if @method is %NULL or an empty string.
*
* Since: 3.6
**/
void
e_source_security_set_method (ESourceSecurity *extension,
const gchar *method)
{
GObject *object;
g_return_if_fail (E_IS_SOURCE_SECURITY (extension));
e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
if (extension->priv->method &&
g_strcmp0 (extension->priv->method, method) == 0) {
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
return;
}
g_free (extension->priv->method);
extension->priv->method = e_util_strdup_strip (method);
if (extension->priv->method == NULL)
extension->priv->method = g_strdup ("none");
e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
object = G_OBJECT (extension);
g_object_freeze_notify (object);
g_object_notify (object, "method");
g_object_notify (object, "secure");
g_object_thaw_notify (object);
}
/**
* e_source_security_get_secure:
* @extension: an #ESourceSecurity
*
* This is a convenience function which returns whether a secure network
* connection is desired, regardless of the method used. This relies on
* the convention of setting #ESourceSecurity:method to "none" when a
* secure network connection is not desired.
*
* Returns: whether a secure network connection is desired
*
* Since: 3.6
**/
gboolean
e_source_security_get_secure (ESourceSecurity *extension)
{
const gchar *method;
g_return_val_if_fail (E_IS_SOURCE_SECURITY (extension), FALSE);
method = e_source_security_get_method (extension);
g_return_val_if_fail (method != NULL, FALSE);
return (g_strcmp0 (method, "none") != 0);
}
/**
* e_source_security_set_secure:
* @extension: an #ESourceSecurity
* @secure: whether a secure network connection is desired
*
* This function provides a simpler way to set #ESourceSecurity:method
* when using a secure network connection is a yes or no option and the
* exact method name is unimportant. If @secure is %FALSE, the
* #ESourceSecurity:method property is set to "none". If @secure is
* %TRUE, the function assumes the backend will use Transport Layer
* Security and sets the #ESourceSecurity:method property to "tls".
*
* Since: 3.6
**/
void
e_source_security_set_secure (ESourceSecurity *extension,
gboolean secure)
{
const gchar *method;
g_return_if_fail (E_IS_SOURCE_SECURITY (extension));
method = secure ? SECURE_METHOD : "none";
e_source_security_set_method (extension, method);
}