/* * e-source-openpgp.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-openpgp * @include: libedataserver/libedataserver.h * @short_description: #ESource extension for OpenPGP settings * * The #ESourceOpenPGP extension tracks OpenPGP (RFC 4880) settings to be * applied to outgoing mail messages. * * Access the extension as follows: * * |[ * #include * * ESourceOpenPGP *extension; * * extension = e_source_get_extension (source, E_SOURCE_EXTENSION_OPENPGP); * ]| **/ #include "e-source-openpgp.h" #include struct _ESourceOpenPGPPrivate { gchar *key_id; gchar *signing_algorithm; gboolean always_trust; gboolean encrypt_to_self; gboolean sign_by_default; gboolean encrypt_by_default; gboolean prefer_inline; gboolean locate_keys; }; enum { PROP_0, PROP_ALWAYS_TRUST, PROP_ENCRYPT_TO_SELF, PROP_KEY_ID, PROP_SIGNING_ALGORITHM, PROP_SIGN_BY_DEFAULT, PROP_ENCRYPT_BY_DEFAULT, PROP_PREFER_INLINE, PROP_LOCATE_KEYS }; G_DEFINE_TYPE_WITH_PRIVATE ( ESourceOpenPGP, e_source_openpgp, E_TYPE_SOURCE_EXTENSION) static void source_openpgp_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_ALWAYS_TRUST: e_source_openpgp_set_always_trust ( E_SOURCE_OPENPGP (object), g_value_get_boolean (value)); return; case PROP_ENCRYPT_TO_SELF: e_source_openpgp_set_encrypt_to_self ( E_SOURCE_OPENPGP (object), g_value_get_boolean (value)); return; case PROP_KEY_ID: e_source_openpgp_set_key_id ( E_SOURCE_OPENPGP (object), g_value_get_string (value)); return; case PROP_SIGNING_ALGORITHM: e_source_openpgp_set_signing_algorithm ( E_SOURCE_OPENPGP (object), g_value_get_string (value)); return; case PROP_SIGN_BY_DEFAULT: e_source_openpgp_set_sign_by_default ( E_SOURCE_OPENPGP (object), g_value_get_boolean (value)); return; case PROP_ENCRYPT_BY_DEFAULT: e_source_openpgp_set_encrypt_by_default ( E_SOURCE_OPENPGP (object), g_value_get_boolean (value)); return; case PROP_PREFER_INLINE: e_source_openpgp_set_prefer_inline ( E_SOURCE_OPENPGP (object), g_value_get_boolean (value)); return; case PROP_LOCATE_KEYS: e_source_openpgp_set_locate_keys ( E_SOURCE_OPENPGP (object), g_value_get_boolean (value)); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void source_openpgp_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_ALWAYS_TRUST: g_value_set_boolean ( value, e_source_openpgp_get_always_trust ( E_SOURCE_OPENPGP (object))); return; case PROP_ENCRYPT_TO_SELF: g_value_set_boolean ( value, e_source_openpgp_get_encrypt_to_self ( E_SOURCE_OPENPGP (object))); return; case PROP_KEY_ID: g_value_take_string ( value, e_source_openpgp_dup_key_id ( E_SOURCE_OPENPGP (object))); return; case PROP_SIGNING_ALGORITHM: g_value_take_string ( value, e_source_openpgp_dup_signing_algorithm ( E_SOURCE_OPENPGP (object))); return; case PROP_SIGN_BY_DEFAULT: g_value_set_boolean ( value, e_source_openpgp_get_sign_by_default ( E_SOURCE_OPENPGP (object))); return; case PROP_ENCRYPT_BY_DEFAULT: g_value_set_boolean ( value, e_source_openpgp_get_encrypt_by_default ( E_SOURCE_OPENPGP (object))); return; case PROP_PREFER_INLINE: g_value_set_boolean ( value, e_source_openpgp_get_prefer_inline ( E_SOURCE_OPENPGP (object))); return; case PROP_LOCATE_KEYS: g_value_set_boolean ( value, e_source_openpgp_get_locate_keys ( E_SOURCE_OPENPGP (object))); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void source_openpgp_finalize (GObject *object) { ESourceOpenPGPPrivate *priv; priv = E_SOURCE_OPENPGP (object)->priv; g_free (priv->key_id); g_free (priv->signing_algorithm); /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (e_source_openpgp_parent_class)->finalize (object); } static void e_source_openpgp_class_init (ESourceOpenPGPClass *class) { GObjectClass *object_class; ESourceExtensionClass *extension_class; object_class = G_OBJECT_CLASS (class); object_class->set_property = source_openpgp_set_property; object_class->get_property = source_openpgp_get_property; object_class->finalize = source_openpgp_finalize; extension_class = E_SOURCE_EXTENSION_CLASS (class); extension_class->name = E_SOURCE_EXTENSION_OPENPGP; g_object_class_install_property ( object_class, PROP_ALWAYS_TRUST, g_param_spec_boolean ( "always-trust", "Always Trust", "Always trust keys in my keyring", FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_ENCRYPT_TO_SELF, g_param_spec_boolean ( "encrypt-to-self", "Encrypt To Self", "Always encrypt to myself", TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_KEY_ID, g_param_spec_string ( "key-id", "Key ID", "PGP/GPG Key ID", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_SIGNING_ALGORITHM, g_param_spec_string ( "signing-algorithm", "Signing Algorithm", "Hash algorithm used to sign messages", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_SIGN_BY_DEFAULT, g_param_spec_boolean ( "sign-by-default", "Sign By Default", "Sign outgoing messages by default", FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_ENCRYPT_BY_DEFAULT, g_param_spec_boolean ( "encrypt-by-default", "Encrypt By Default", "Encrypt outgoing messages by default", FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_PREFER_INLINE, g_param_spec_boolean ( "prefer-inline", "Prefer inline", "Prefer inline sign/encrypt", FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_LOCATE_KEYS, g_param_spec_boolean ( "locate-keys", "Locate Keys", "Locate keys in WKD for encryption", TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); } static void e_source_openpgp_init (ESourceOpenPGP *extension) { extension->priv = e_source_openpgp_get_instance_private (extension); } /** * e_source_openpgp_get_always_trust: * @extension: an #ESourceOpenPGP * * Returns whether to skip key validation and assume that used keys are * always fully trusted. * * Returns: whether used keys are always fully trusted * * Since: 3.6 **/ gboolean e_source_openpgp_get_always_trust (ESourceOpenPGP *extension) { g_return_val_if_fail (E_IS_SOURCE_OPENPGP (extension), FALSE); return extension->priv->always_trust; } /** * e_source_openpgp_set_always_trust: * @extension: an #ESourceOpenPGP * @always_trust: whether used keys are always fully trusted * * Sets whether to skip key validation and assume that used keys are * always fully trusted. * * Since: 3.6 **/ void e_source_openpgp_set_always_trust (ESourceOpenPGP *extension, gboolean always_trust) { g_return_if_fail (E_IS_SOURCE_OPENPGP (extension)); if (extension->priv->always_trust == always_trust) return; extension->priv->always_trust = always_trust; g_object_notify (G_OBJECT (extension), "always-trust"); } /** * e_source_openpgp_get_encrypt_to_self: * @extension: an #ESourceOpenPGP * * Returns whether to "encrypt-to-self" when sending encrypted messages. * * Returns: whether to "encrypt-to-self" * * Since: 3.6 **/ gboolean e_source_openpgp_get_encrypt_to_self (ESourceOpenPGP *extension) { g_return_val_if_fail (E_IS_SOURCE_OPENPGP (extension), FALSE); return extension->priv->encrypt_to_self; } /** * e_source_openpgp_set_encrypt_to_self: * @extension: an #ESourceOpenPGP * @encrypt_to_self: whether to "encrypt-to-self" * * Sets whether to "encrypt-to-self" when sending encrypted messages. * * Since: 3.6 **/ void e_source_openpgp_set_encrypt_to_self (ESourceOpenPGP *extension, gboolean encrypt_to_self) { g_return_if_fail (E_IS_SOURCE_OPENPGP (extension)); if (extension->priv->encrypt_to_self == encrypt_to_self) return; extension->priv->encrypt_to_self = encrypt_to_self; g_object_notify (G_OBJECT (extension), "encrypt-to-self"); } /** * e_source_openpgp_get_key_id: * @extension: an #ESourceOpenPGP * * Returns the OpenPGP key ID used to sign and encrypt messages. * * Returns: the key ID used to sign and encrypt messages * * Since: 3.6 **/ const gchar * e_source_openpgp_get_key_id (ESourceOpenPGP *extension) { g_return_val_if_fail (E_IS_SOURCE_OPENPGP (extension), NULL); return extension->priv->key_id; } /** * e_source_openpgp_dup_key_id: * @extension: an #ESourceOpenPGP * * Thread-safe variation of e_source_openpgp_get_key_id(). * 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 #ESourceOpenPGP:key-id * * Since: 3.6 **/ gchar * e_source_openpgp_dup_key_id (ESourceOpenPGP *extension) { const gchar *protected; gchar *duplicate; g_return_val_if_fail (E_IS_SOURCE_OPENPGP (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); protected = e_source_openpgp_get_key_id (extension); duplicate = g_strdup (protected); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return duplicate; } /** * e_source_openpgp_set_key_id: * @extension: an #ESourceOpenPGP * @key_id: the key ID used to sign and encrypt messages * * Sets the OpenPGP key ID used to sign and encrypt messages. * * The internal copy of @key_id is automatically stripped of leading and * trailing whitespace. If the resulting string is empty, %NULL is set * instead. * * Since: 3.6 **/ void e_source_openpgp_set_key_id (ESourceOpenPGP *extension, const gchar *key_id) { g_return_if_fail (E_IS_SOURCE_OPENPGP (extension)); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (e_util_strcmp0 (extension->priv->key_id, key_id) == 0) { e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return; } g_free (extension->priv->key_id); extension->priv->key_id = e_util_strdup_strip (key_id); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); g_object_notify (G_OBJECT (extension), "key-id"); } /** * e_source_openpgp_get_signing_algorithm: * @extension: an #ESourceOpenPGP * * Returns the name of the hash algorithm used to digitally sign outgoing * messages. * * Returns: the signing algorithm for outgoing messages * * Since: 3.6 **/ const gchar * e_source_openpgp_get_signing_algorithm (ESourceOpenPGP *extension) { g_return_val_if_fail (E_IS_SOURCE_OPENPGP (extension), NULL); return extension->priv->signing_algorithm; } /** * e_source_openpgp_dup_signing_algorithm: * @extension: an #ESourceOpenPGP * * Thread-safe variation of e_source_openpgp_get_signing_algorithm(). * 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 #ESourceOpenPGP:signing-algorithm * * Since: 3.6 **/ gchar * e_source_openpgp_dup_signing_algorithm (ESourceOpenPGP *extension) { const gchar *protected; gchar *duplicate; g_return_val_if_fail (E_IS_SOURCE_OPENPGP (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); protected = e_source_openpgp_get_signing_algorithm (extension); duplicate = g_strdup (protected); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return duplicate; } /** * e_source_openpgp_set_signing_algorithm: * @extension: an #ESourceOpenPGP * @signing_algorithm: the signing algorithm for outgoing messages * * Sets the name of the hash algorithm used to digitally sign outgoing * messages. * * The internal copy of @signing_algorithm is automatically stripped of * leading and trailing whitespace. If the resulting string is empty, * %NULL is set instead. * * Since: 3.6 **/ void e_source_openpgp_set_signing_algorithm (ESourceOpenPGP *extension, const gchar *signing_algorithm) { g_return_if_fail (E_IS_SOURCE_OPENPGP (extension)); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (e_util_strcmp0 (extension->priv->signing_algorithm, signing_algorithm) == 0) { e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return; } g_free (extension->priv->signing_algorithm); extension->priv->signing_algorithm = e_util_strdup_strip (signing_algorithm); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); g_object_notify (G_OBJECT (extension), "signing-algorithm"); } /** * e_source_openpgp_get_sign_by_default: * @extension: an #ESourceOpenPGP * * Returns whether to digitally sign outgoing messages by default using * OpenPGP-compliant software such as GNU Privacy Guard (GnuPG). * * Returns: whether to sign outgoing messages by default * * Since: 3.6 **/ gboolean e_source_openpgp_get_sign_by_default (ESourceOpenPGP *extension) { g_return_val_if_fail (E_IS_SOURCE_OPENPGP (extension), FALSE); return extension->priv->sign_by_default; } /** * e_source_openpgp_set_sign_by_default: * @extension: an #ESourceOpenPGP * @sign_by_default: whether to sign outgoing messages by default * * Sets whether to digitally sign outgoing messages by default using * OpenPGP-compliant software such as GNU Privacy Guard (GnuPG). * * Since: 3.6 **/ void e_source_openpgp_set_sign_by_default (ESourceOpenPGP *extension, gboolean sign_by_default) { g_return_if_fail (E_IS_SOURCE_OPENPGP (extension)); if (extension->priv->sign_by_default == sign_by_default) return; extension->priv->sign_by_default = sign_by_default; g_object_notify (G_OBJECT (extension), "sign-by-default"); } /** * e_source_openpgp_get_encrypt_by_default: * @extension: an #ESourceOpenPGP * * Returns whether to digitally encrypt outgoing messages by default using * OpenPGP-compliant software such as GNU Privacy Guard (GnuPG). * * Returns: whether to encrypt outgoing messages by default * * Since: 3.18 **/ gboolean e_source_openpgp_get_encrypt_by_default (ESourceOpenPGP *extension) { g_return_val_if_fail (E_IS_SOURCE_OPENPGP (extension), FALSE); return extension->priv->encrypt_by_default; } /** * e_source_openpgp_set_encrypt_by_default: * @extension: an #ESourceOpenPGP * @encrypt_by_default: whether to encrypt outgoing messages by default * * Sets whether to digitally encrypt outgoing messages by default using * OpenPGP-compliant software such as GNU Privacy Guard (GnuPG). * * Since: 3.18 **/ void e_source_openpgp_set_encrypt_by_default (ESourceOpenPGP *extension, gboolean encrypt_by_default) { g_return_if_fail (E_IS_SOURCE_OPENPGP (extension)); if (extension->priv->encrypt_by_default == encrypt_by_default) return; extension->priv->encrypt_by_default = encrypt_by_default; g_object_notify (G_OBJECT (extension), "encrypt-by-default"); } /** * e_source_openpgp_get_prefer_inline: * @extension: an #ESourceOpenPGP * * Returns whether to prefer inline sign/encrypt of the text/plain messages. * * Returns: whether to prefer inline sign/encrypt of the text/plain messages * * Since: 3.20 **/ gboolean e_source_openpgp_get_prefer_inline (ESourceOpenPGP *extension) { g_return_val_if_fail (E_IS_SOURCE_OPENPGP (extension), FALSE); return extension->priv->prefer_inline; } /** * e_source_openpgp_set_prefer_inline: * @extension: an #ESourceOpenPGP * @prefer_inline: whether to prefer inline sign/encrypt of the text/plain messages * * Sets whether to prefer inline sign/encrypt of the text/plain messages. * * Since: 3.20 **/ void e_source_openpgp_set_prefer_inline (ESourceOpenPGP *extension, gboolean prefer_inline) { g_return_if_fail (E_IS_SOURCE_OPENPGP (extension)); if (extension->priv->prefer_inline == prefer_inline) return; extension->priv->prefer_inline = prefer_inline; g_object_notify (G_OBJECT (extension), "prefer-inline"); } /** * e_source_openpgp_get_locate_keys: * @extension: an #ESourceOpenPGP * * Returns, whether gpg can locate keys using Web Key Directory (WKD) lookup * when encrypting messages. The default is %TRUE. * * Returns: whether gpg can locate keys using Web Key Directory (WKD) lookup * when encrypting messages. * * Since: 3.46 **/ gboolean e_source_openpgp_get_locate_keys (ESourceOpenPGP *extension) { g_return_val_if_fail (E_IS_SOURCE_OPENPGP (extension), FALSE); return extension->priv->locate_keys; } /** * e_source_openpgp_set_locate_keys: * @extension: an #ESourceOpenPGP * @locate_keys: value to set * * Sets the @locate_keys on the @extension, which is used to instruct * gpg to locate keys using Web Key Directory (WKD) lookup when encrypting * messages. * * Since: 3.46 **/ void e_source_openpgp_set_locate_keys (ESourceOpenPGP *extension, gboolean locate_keys) { g_return_if_fail (E_IS_SOURCE_OPENPGP (extension)); if (!extension->priv->locate_keys == !locate_keys) return; extension->priv->locate_keys = locate_keys; g_object_notify (G_OBJECT (extension), "locate-keys"); }