/* * Copyright (C) 2015 Red Hat, Inc. (www.redhat.com) * * 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 . * */ #ifdef HAVE_CONFIG_H #include #endif #include "e-credentials-prompter.h" #include "e-credentials-prompter-impl.h" struct _ECredentialsPrompterImplPrivate { GCancellable *cancellable; }; enum { PROMPT_FINISHED, LAST_SIGNAL }; static guint signals[LAST_SIGNAL]; G_DEFINE_ABSTRACT_TYPE (ECredentialsPrompterImpl, e_credentials_prompter_impl, E_TYPE_EXTENSION) static void e_credentials_prompter_impl_constructed (GObject *object) { ECredentialsPrompterImpl *prompter_impl = E_CREDENTIALS_PROMPTER_IMPL (object); ECredentialsPrompterImplClass *klass; ECredentialsPrompter *prompter; gint ii; /* Chain up to parent's method. */ G_OBJECT_CLASS (e_credentials_prompter_impl_parent_class)->constructed (object); prompter = E_CREDENTIALS_PROMPTER (e_extension_get_extensible (E_EXTENSION (prompter_impl))); klass = E_CREDENTIALS_PROMPTER_IMPL_GET_CLASS (object); g_return_if_fail (klass->authentication_methods != NULL); for (ii = 0; klass->authentication_methods[ii]; ii++) { e_credentials_prompter_register_impl (prompter, klass->authentication_methods[ii], prompter_impl); } } static void e_credentials_prompter_impl_dispose (GObject *object) { ECredentialsPrompterImpl *prompter_impl = E_CREDENTIALS_PROMPTER_IMPL (object); if (prompter_impl->priv->cancellable) { g_cancellable_cancel (prompter_impl->priv->cancellable); g_clear_object (&prompter_impl->priv->cancellable); } /* Chain up to parent's method. */ G_OBJECT_CLASS (e_credentials_prompter_impl_parent_class)->dispose (object); } static void e_credentials_prompter_impl_class_init (ECredentialsPrompterImplClass *klass) { GObjectClass *object_class; EExtensionClass *extension_class; g_type_class_add_private (klass, sizeof (ECredentialsPrompterImplPrivate)); object_class = G_OBJECT_CLASS (klass); object_class->dispose = e_credentials_prompter_impl_dispose; object_class->constructed = e_credentials_prompter_impl_constructed; extension_class = E_EXTENSION_CLASS (klass); extension_class->extensible_type = E_TYPE_CREDENTIALS_PROMPTER; /** * ECredentialsPrompterImpl::prompt-finished: * @prompter_impl: an #ECredentialsPrompterImpl which emitted the signal * @prompt_id: an ID of the prompt which was finished * @credentials: (allow-none): entered credentials, or %NULL for cancelled prompts * * Emitted when a prompt of ID @prompt_id is finished. * * Since: 3.16 **/ signals[PROMPT_FINISHED] = g_signal_new ( "prompt-finished", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (ECredentialsPrompterImplClass, prompt_finished), NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); } static void e_credentials_prompter_impl_init (ECredentialsPrompterImpl *prompter_impl) { prompter_impl->priv = G_TYPE_INSTANCE_GET_PRIVATE (prompter_impl, E_TYPE_CREDENTIALS_PROMPTER_IMPL, ECredentialsPrompterImplPrivate); prompter_impl->priv->cancellable = g_cancellable_new (); } /** * e_credentials_prompter_impl_get_credentials_prompter: * @prompter_impl: an #ECredentialsPrompterImpl * * Returns an #ECredentialsPrompter with which the @prompter_impl is associated. * * Returns: an #ECredentialsPrompter * * Since: 3.16 **/ ECredentialsPrompter * e_credentials_prompter_impl_get_credentials_prompter (ECredentialsPrompterImpl *prompter_impl) { EExtensible *extensible; g_return_val_if_fail (E_IS_CREDENTIALS_PROMPTER_IMPL (prompter_impl), NULL); extensible = e_extension_get_extensible (E_EXTENSION (prompter_impl)); if (!extensible) return NULL; return E_CREDENTIALS_PROMPTER (extensible); } /** * e_credentials_prompter_impl_prompt: * @prompter_impl: an #ECredentialsPrompterImpl * @prompt_id: a prompt ID to be passed to e_credentials_prompter_impl_prompt_finish() * @auth_source: an #ESource, to prompt the credentials for (the source which asked for credentials) * @cred_source: a parent #ESource, from which credentials were taken, or should be stored to * @error_text: (allow-none): an optional error text from the previous credentials prompt; can be %NULL * @credentials: credentials, as saved in keyring; can be empty, but not %NULL * * Runs a credentials prompt for the @prompter_impl. The actual prompter implementation * receives the prompt through ECredentialsPrompterImplClass::process_prompt(), where the given * @prompt_id is used for an identification. The prompt is left 'active' as long as it is * not finished with a call of e_credentials_prompter_impl_prompt_finish(). This should be * called even for cancelled prompts. The prompt can be cancelled before it's processed, * using the e_credentials_prompter_impl_cancel_prompt(). * * The @auth_source can be the same as @cred_source, in case the credentials * are stored only for that particular source. If the sources share credentials, * which can be a case when the @auth_source is part of a collection, then * the @cred_stource can be that collection source. * * Since: 3.16 **/ void e_credentials_prompter_impl_prompt (ECredentialsPrompterImpl *prompter_impl, gpointer prompt_id, ESource *auth_source, ESource *cred_source, const gchar *error_text, const ENamedParameters *credentials) { ECredentialsPrompterImplClass *klass; g_return_if_fail (E_IS_CREDENTIALS_PROMPTER_IMPL (prompter_impl)); g_return_if_fail (E_IS_SOURCE (auth_source)); g_return_if_fail (E_IS_SOURCE (cred_source)); g_return_if_fail (credentials != NULL); klass = E_CREDENTIALS_PROMPTER_IMPL_GET_CLASS (prompter_impl); g_return_if_fail (klass->process_prompt != NULL); klass->process_prompt (prompter_impl, prompt_id, auth_source, cred_source, error_text, credentials); } /** * e_credentials_prompter_impl_prompt_finish: * @prompter_impl: an #ECredentialsPrompterImpl * @prompt_id: a prompt ID * @credentials: (allow-none): credentials to use; can be %NULL for cancelled prompts * * The actual credentials prompt implementation finishes a previously started * credentials prompt @prompt_id with ECredentialsPrompterImplClass::process_prompt() * by a call to this function. This function should be called regardless the prompt * was or was not cancelled with e_credentials_prompter_impl_cancel_prompt(). * Once the prompt is finished another queued is started, if any pending exists. * Use %NULL @credentials for cancelled prompts, otherwise the credentials are used * for authentication of the associated #ESource. * * Since: 3.16 **/ void e_credentials_prompter_impl_prompt_finish (ECredentialsPrompterImpl *prompter_impl, gpointer prompt_id, const ENamedParameters *credentials) { g_return_if_fail (E_IS_CREDENTIALS_PROMPTER_IMPL (prompter_impl)); g_return_if_fail (prompt_id != NULL); g_signal_emit (prompter_impl, signals[PROMPT_FINISHED], 0, prompt_id, credentials); } /** * e_credentials_prompter_impl_cancel_prompt: * @prompter_impl: an #ECredentialsPrompterImpl * @prompt_id: a prompt ID to cancel * * Asks the @prompt_impl to cancel current prompt, which should have ID @prompt_id. * * Since: 3.16 **/ void e_credentials_prompter_impl_cancel_prompt (ECredentialsPrompterImpl *prompter_impl, gpointer prompt_id) { ECredentialsPrompterImplClass *klass; g_return_if_fail (E_IS_CREDENTIALS_PROMPTER_IMPL (prompter_impl)); klass = E_CREDENTIALS_PROMPTER_IMPL_GET_CLASS (prompter_impl); g_return_if_fail (klass->cancel_prompt != NULL); klass->cancel_prompt (prompter_impl, prompt_id); }