static void calendar_sources_registry_source_changed_cb (ESourceRegistry *registry, ESource *source, CalendarSources *sources) { if (e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR)) { CalendarSourceData *source_data; ESourceSelectable *extension; gboolean have_client; gboolean show_source; source_data = &sources->priv->appointment_sources; extension = e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR); have_client = (g_hash_table_lookup (source_data->clients, source) != NULL); show_source = e_source_get_enabled (source) && e_source_selectable_get_selected (extension); if (!show_source && have_client) { g_hash_table_remove (source_data->clients, source); g_signal_emit (sources, source_data->changed_signal, 0); } if (show_source && !have_client) { create_client_for_source (source, source_data->source_type, source_data); g_signal_emit (sources, source_data->changed_signal, 0); } } if (e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST)) { CalendarSourceData *source_data; ESourceSelectable *extension; gboolean have_client; gboolean show_source; source_data = &sources->priv->task_sources; extension = e_source_get_extension (source, E_SOURCE_EXTENSION_TASK_LIST); have_client = (g_hash_table_lookup (source_data->clients, source) != NULL); show_source = e_source_get_enabled (source) && e_source_selectable_get_selected (extension); if (!show_source && have_client) { g_hash_table_remove (source_data->clients, source); g_signal_emit (sources, source_data->changed_signal, 0); } if (show_source && !have_client) { create_client_for_source (source, source_data->source_type, source_data); g_signal_emit (sources, source_data->changed_signal, 0); } } }
static void outlook_backend_child_added (ECollectionBackend *backend, ESource *child_source) { ESource *collection_source; const gchar *extension_name; gboolean is_mail = FALSE; collection_source = e_backend_get_source (E_BACKEND (backend)); extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; is_mail |= e_source_has_extension (child_source, extension_name); extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY; is_mail |= e_source_has_extension (child_source, extension_name); extension_name = E_SOURCE_EXTENSION_MAIL_TRANSPORT; is_mail |= e_source_has_extension (child_source, extension_name); /* Synchronize mail-related user with the collection identity. */ extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; if (is_mail && e_source_has_extension (child_source, extension_name)) { ESourceAuthentication *auth_child_extension; ESourceCollection *collection_extension; const gchar *collection_identity; const gchar *auth_child_user; extension_name = E_SOURCE_EXTENSION_COLLECTION; collection_extension = e_source_get_extension ( collection_source, extension_name); collection_identity = e_source_collection_get_identity ( collection_extension); extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; auth_child_extension = e_source_get_extension ( child_source, extension_name); auth_child_user = e_source_authentication_get_user ( auth_child_extension); /* XXX Do not override an existing user name setting. * The IMAP or (especially) SMTP configuration may * have been modified to use a non-Outlook server. */ if (auth_child_user == NULL) e_source_authentication_set_user ( auth_child_extension, collection_identity); } /* Chain up to parent's child_added() method. */ E_COLLECTION_BACKEND_CLASS (e_outlook_backend_parent_class)-> child_added (backend, child_source); }
static void eee_backend_child_added (ECollectionBackend *backend, ESource *child_source) { ESource *collection_source; const gchar *extension_name; gboolean is_mail = FALSE; collection_source = e_backend_get_source (E_BACKEND (backend)); extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; is_mail |= e_source_has_extension (child_source, extension_name); extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY; is_mail |= e_source_has_extension (child_source, extension_name); extension_name = E_SOURCE_EXTENSION_MAIL_TRANSPORT; is_mail |= e_source_has_extension (child_source, extension_name); /* Synchronize mail-related display names with the collection. */ if (is_mail) g_object_bind_property ( collection_source, "display-name", child_source, "display-name", G_BINDING_SYNC_CREATE); /* Synchronize mail-related user with the collection identity. */ extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; if (is_mail && e_source_has_extension (child_source, extension_name)) { ESourceAuthentication *auth_child_extension; ESourceCollection *collection_extension; extension_name = E_SOURCE_EXTENSION_COLLECTION; collection_extension = e_source_get_extension ( collection_source, extension_name); extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; auth_child_extension = e_source_get_extension ( child_source, extension_name); g_object_bind_property ( collection_extension, "identity", auth_child_extension, "user", G_BINDING_SYNC_CREATE); } /* Chain up to parent's child_added() method. */ E_COLLECTION_BACKEND_CLASS (e_eee_backend_parent_class)-> child_added (backend, child_source); }
/* Helper for e_mail_session_ref_default_transport() * and mail_session_ref_transport_from_x_identity(). */ static CamelService * mail_session_ref_transport_for_identity (EMailSession *session, ESource *source) { ESourceRegistry *registry; ESourceMailSubmission *extension; CamelService *transport = NULL; const gchar *extension_name; gchar *uid; registry = e_mail_session_get_registry (session); extension_name = E_SOURCE_EXTENSION_MAIL_SUBMISSION; if (source == NULL) return NULL; if (!e_source_registry_check_enabled (registry, source)) return NULL; if (!e_source_has_extension (source, extension_name)) return NULL; extension = e_source_get_extension (source, extension_name); uid = e_source_mail_submission_dup_transport_uid (extension); if (uid != NULL) { transport = e_mail_session_ref_transport (session, uid); g_free (uid); } return transport; }
static ESource * guess_mail_account_from_message (ESourceRegistry *registry, CamelMimeMessage *message) { ESource *source = NULL; const gchar *uid; /* Lookup an ESource by 'X-Evolution-Source' header. */ uid = camel_mime_message_get_source (message); if (uid != NULL) source = e_source_registry_ref_source (registry, uid); /* If we found an ESource, make sure it's a mail account. */ if (source != NULL) { const gchar *extension_name; extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; if (!e_source_has_extension (source, extension_name)) { g_object_unref (source); source = NULL; } } return source; }
static gboolean alarm_selector_set_source_selected (ESourceSelector *selector, ESource *source, gboolean selected) { ESourceAlarms *extension; const gchar *extension_name; /* Make sure this source is a calendar. */ extension_name = e_source_selector_get_extension_name (selector); if (!e_source_has_extension (source, extension_name)) return FALSE; extension_name = E_SOURCE_EXTENSION_ALARMS; extension = e_source_get_extension (source, extension_name); g_return_val_if_fail (E_IS_SOURCE_ALARMS (extension), FALSE); if (selected != e_source_alarms_get_include_me (extension)) { e_source_alarms_set_include_me (extension, selected); e_source_selector_queue_write (selector, source); return TRUE; } return FALSE; }
static gboolean conflict_search_selector_set_source_selected (ESourceSelector *selector, ESource *source, gboolean selected) { ESourceConflictSearch *extension; const gchar *extension_name; /* Make sure this source is a calendar. */ extension_name = e_source_selector_get_extension_name (selector); if (!e_source_has_extension (source, extension_name)) return FALSE; extension_name = E_SOURCE_EXTENSION_CONFLICT_SEARCH; extension = e_source_get_extension (source, extension_name); g_return_val_if_fail (E_IS_SOURCE_CONFLICT_SEARCH (extension), FALSE); if (selected != e_source_conflict_search_get_include_me (extension)) { e_source_conflict_search_set_include_me (extension, selected); e_source_selector_queue_write (selector, source); return TRUE; } return FALSE; }
static gchar * yahoo_backend_dup_resource_id (ECollectionBackend *backend, ESource *child_source) { const gchar *extension_name; /* XXX This is trival for now since we only * add one calendar and one task list. */ extension_name = E_SOURCE_EXTENSION_CALENDAR; if (e_source_has_extension (child_source, extension_name)) return g_strdup (YAHOO_CALENDAR_RESOURCE_ID); extension_name = E_SOURCE_EXTENSION_TASK_LIST; if (e_source_has_extension (child_source, extension_name)) return g_strdup (YAHOO_TASKS_RESOURCE_ID); return NULL; }
static gchar * google_backend_dup_resource_id (ECollectionBackend *backend, ESource *child_source) { const gchar *extension_name; /* XXX This is trivial for now since we only * add one calendar and one address book. */ extension_name = E_SOURCE_EXTENSION_CALENDAR; if (e_source_has_extension (child_source, extension_name)) return g_strdup (GOOGLE_CALENDAR_RESOURCE_ID); extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK; if (e_source_has_extension (child_source, extension_name)) return g_strdup (GOOGLE_CONTACTS_RESOURCE_ID); return NULL; }
/* Helper for e_mail_session_get_fcc_for_message_sync() */ static CamelFolder * mail_session_ref_fcc_from_identity (EMailSession *session, ESource *source, CamelMimeMessage *message, GCancellable *cancellable, GError **error) { ESourceRegistry *registry; ESourceMailSubmission *extension; CamelFolder *folder = NULL; const gchar *extension_name; gchar *folder_uri; registry = e_mail_session_get_registry (session); extension_name = E_SOURCE_EXTENSION_MAIL_SUBMISSION; if (source == NULL) return NULL; if (!e_source_registry_check_enabled (registry, source)) return NULL; if (!e_source_has_extension (source, extension_name)) return NULL; extension = e_source_get_extension (source, extension_name); if (e_source_mail_submission_get_replies_to_origin_folder (extension)) { GError *local_error = NULL; /* This may return NULL without setting a GError. */ folder = mail_session_ref_origin_folder ( session, message, cancellable, &local_error); if (local_error != NULL) { g_warn_if_fail (folder == NULL); g_propagate_error (error, local_error); return NULL; } } folder_uri = e_source_mail_submission_dup_sent_folder (extension); if (folder_uri != NULL && folder == NULL) { /* This may return NULL without setting a GError. */ folder = mail_session_try_uri_to_folder ( session, folder_uri, cancellable, error); } g_free (folder_uri); return folder; }
static void calendar_sources_registry_source_removed_cb (ESourceRegistry *registry, ESource *source, CalendarSources *sources) { if (e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR)) { CalendarSourceData *source_data; source_data = &sources->priv->appointment_sources; g_hash_table_remove (source_data->clients, source); g_signal_emit (sources, source_data->changed_signal, 0); } if (e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST)) { CalendarSourceData *source_data; source_data = &sources->priv->task_sources; g_hash_table_remove (source_data->clients, source); g_signal_emit (sources, source_data->changed_signal, 0); } }
static gchar * eee_backend_dup_resource_id (ECollectionBackend *backend, ESource *child_source) { const gchar *extension_name; /* XXX This is trivial for now since we only * add one calendar and one address book. */ extension_name = E_SOURCE_EXTENSION_CALENDAR; if (e_source_has_extension (child_source, extension_name)) return g_strdup ("kalendari nazov"); return NULL; }
static gboolean mail_account_in_recipients (ESourceRegistry *registry, ESource *source, GHashTable *recipients) { ESourceExtension *extension; const gchar *extension_name; const gchar *uid; gboolean match = FALSE; gchar *address; /* Disregard disabled mail accounts. */ if (!e_source_registry_check_enabled (registry, source)) return FALSE; extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; extension = e_source_get_extension (source, extension_name); uid = e_source_mail_account_get_identity_uid ( E_SOURCE_MAIL_ACCOUNT (extension)); if (uid == NULL) return FALSE; source = e_source_registry_ref_source (registry, uid); if (source == NULL) return FALSE; extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY; if (!e_source_has_extension (source, extension_name)) { g_object_unref (source); return FALSE; } extension = e_source_get_extension (source, extension_name); address = e_source_mail_identity_dup_address ( E_SOURCE_MAIL_IDENTITY (extension)); g_object_unref (source); if (address != NULL) { match = g_hash_table_contains (recipients, address); g_free (address); } return match; }
static gboolean e_soup_ssl_trust_accept_certificate_cb (GTlsConnection *conn, GTlsCertificate *peer_cert, GTlsCertificateFlags errors, gpointer user_data) { ESoupSslTrustData *handler = user_data; ETrustPromptResponse response; SoupURI *soup_uri; const gchar *host; gchar *auth_host = NULL; soup_uri = soup_message_get_uri (handler->soup_message); if (!soup_uri || !soup_uri_get_host (soup_uri)) return FALSE; host = soup_uri_get_host (soup_uri); if (e_source_has_extension (handler->source, E_SOURCE_EXTENSION_AUTHENTICATION)) { ESourceAuthentication *extension_authentication; extension_authentication = e_source_get_extension (handler->source, E_SOURCE_EXTENSION_AUTHENTICATION); auth_host = e_source_authentication_dup_host (extension_authentication); if (auth_host && *auth_host) { /* Use the 'host' from the Authentication extension, because it's the one used when storing the trust prompt result. The SoupMessage can be redirected, thus it would not ever match. */ host = auth_host; } else { g_free (auth_host); auth_host = NULL; } } response = e_source_webdav_verify_ssl_trust ( e_source_get_extension (handler->source, E_SOURCE_EXTENSION_WEBDAV_BACKEND), host, peer_cert, errors); g_free (auth_host); return (response == E_TRUST_PROMPT_RESPONSE_ACCEPT || response == E_TRUST_PROMPT_RESPONSE_ACCEPT_TEMPORARILY); }
ESource * em_utils_guess_mail_identity_with_recipients_and_sort (ESourceRegistry *registry, CamelMimeMessage *message, CamelFolder *folder, const gchar *message_uid, EMailUtilsSourtSourcesFunc sort_func, gpointer sort_func_data) { ESource *source; ESourceExtension *extension; const gchar *extension_name; const gchar *uid; g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL); g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL); source = em_utils_guess_mail_account_with_recipients_and_sort ( registry, message, folder, message_uid, sort_func, sort_func_data); if (source == NULL) return NULL; extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; extension = e_source_get_extension (source, extension_name); uid = e_source_mail_account_get_identity_uid ( E_SOURCE_MAIL_ACCOUNT (extension)); if (uid == NULL) return NULL; source = e_source_registry_ref_source (registry, uid); if (source == NULL) return NULL; extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY; if (!e_source_has_extension (source, extension_name)) { g_object_unref (source); return NULL; } return source; }
ESource * em_utils_guess_mail_identity (ESourceRegistry *registry, CamelMimeMessage *message, CamelFolder *folder, const gchar *message_uid) { ESource *source; ESourceExtension *extension; const gchar *extension_name; const gchar *uid; g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL); g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL); if (folder != NULL) g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); source = em_utils_guess_mail_account (registry, message, folder, message_uid); if (source == NULL) return NULL; extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; extension = e_source_get_extension (source, extension_name); uid = e_source_mail_account_get_identity_uid ( E_SOURCE_MAIL_ACCOUNT (extension)); if (uid == NULL) return NULL; source = e_source_registry_ref_source (registry, uid); if (source == NULL) return NULL; extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY; if (!e_source_has_extension (source, extension_name)) { g_object_unref (source); return NULL; } return source; }
static CamelService * ref_default_transport (EMailSession *session) { ESource *source; CamelService *service; const gchar *extension_name; const gchar *uid; source = e_source_registry_ref_default_mail_identity (source_registry); if (source == NULL) return NULL; extension_name = E_SOURCE_EXTENSION_MAIL_SUBMISSION; if (e_source_has_extension (source, extension_name)) { ESourceMailSubmission *extension; gchar *uid; extension = e_source_get_extension (source, extension_name); uid = e_source_mail_submission_dup_transport_uid (extension); g_object_unref (source); source = e_source_registry_ref_source (source_registry, uid); g_free (uid); } else { g_object_unref (source); source = NULL; } if (source == NULL) return NULL; uid = e_source_get_uid (source); service = camel_session_ref_service (CAMEL_SESSION (session), uid); g_object_unref (source); return service; }
static ESource * guess_mail_account_from_folder (ESourceRegistry *registry, CamelFolder *folder, const gchar *message_uid) { ESource *source; CamelStore *store; const gchar *uid; /* Lookup an ESource by CamelStore UID. */ store = camel_folder_get_parent_store (folder); if (message_uid && folder && CAMEL_IS_VEE_STORE (store)) { CamelMessageInfo *mi = camel_folder_get_message_info (folder, message_uid); if (mi) { CamelFolder *location; location = camel_vee_folder_get_location (CAMEL_VEE_FOLDER (folder), (CamelVeeMessageInfo *) mi, NULL); if (location) store = camel_folder_get_parent_store (location); camel_folder_free_message_info (folder, mi); } } uid = camel_service_get_uid (CAMEL_SERVICE (store)); source = e_source_registry_ref_source (registry, uid); /* If we found an ESource, make sure it's a mail account. */ if (source != NULL) { const gchar *extension_name; extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; if (!e_source_has_extension (source, extension_name)) { g_object_unref (source); source = NULL; } } return source; }
/** * e_mail_session_ref_transport: * @session: an #EMailSession * @transport_uid: the UID of a mail transport * * Returns the transport #CamelService instance for @transport_uid, * verifying first that the @transport_uid is indeed a mail transport and * that the corresponding #ESource is enabled. If these checks fail, the * function returns %NULL. * * The returned #CamelService is referenced for thread-safety and must be * unreferenced with g_object_unref() when finished with it. * * Returns: a #CamelService, or %NULL **/ CamelService * e_mail_session_ref_transport (EMailSession *session, const gchar *transport_uid) { ESourceRegistry *registry; ESource *source = NULL; CamelService *transport = NULL; const gchar *extension_name; g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL); g_return_val_if_fail (transport_uid != NULL, NULL); registry = e_mail_session_get_registry (session); extension_name = E_SOURCE_EXTENSION_MAIL_TRANSPORT; source = e_source_registry_ref_source (registry, transport_uid); if (source == NULL) goto exit; if (!e_source_registry_check_enabled (registry, source)) goto exit; if (!e_source_has_extension (source, extension_name)) goto exit; transport = camel_session_ref_service ( CAMEL_SESSION (session), transport_uid); /* Sanity check. */ if (transport != NULL) g_warn_if_fail (CAMEL_IS_TRANSPORT (transport)); exit: g_clear_object (&source); return transport; }
static void task_shell_view_backend_error_cb (EClientCache *client_cache, EClient *client, EAlert *alert, ETaskShellView *task_shell_view) { ETaskShellContent *task_shell_content; ESource *source; const gchar *extension_name; task_shell_content = task_shell_view->priv->task_shell_content; source = e_client_get_source (client); extension_name = E_SOURCE_EXTENSION_TASK_LIST; /* Only submit alerts from task list backends. */ if (e_source_has_extension (source, extension_name)) { EAlertSink *alert_sink; alert_sink = E_ALERT_SINK (task_shell_content); e_alert_sink_submit_alert (alert_sink, alert); } }
static void cal_shell_view_backend_error_cb (EClientCache *client_cache, EClient *client, EAlert *alert, ECalShellView *cal_shell_view) { ECalShellContent *cal_shell_content; ESource *source; const gchar *extension_name; cal_shell_content = cal_shell_view->priv->cal_shell_content; source = e_client_get_source (client); extension_name = E_SOURCE_EXTENSION_CALENDAR; /* Only submit alerts from calendar backends. */ if (e_source_has_extension (source, extension_name)) { EAlertSink *alert_sink; alert_sink = E_ALERT_SINK (cal_shell_content); e_alert_sink_submit_alert (alert_sink, alert); } }
/** * e_cal_backend_mail_account_is_valid: * @registry: an #ESourceRegistry * @user: user name for the account to check * @name: placeholder for the account name * * Checks that a mail account is valid, and returns its name. * * Returns: TRUE if the account is valid, FALSE if not. */ gboolean e_cal_backend_mail_account_is_valid (ESourceRegistry *registry, gchar *user, gchar **name) { GList *list, *iter; const gchar *extension_name; gboolean valid = FALSE; g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), FALSE); g_return_val_if_fail (user != NULL, FALSE); extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; list = e_source_registry_list_enabled (registry, extension_name); for (iter = list; iter != NULL; iter = g_list_next (iter)) { ESource *source = E_SOURCE (iter->data); ESourceMailAccount *mail_account; ESourceMailIdentity *mail_identity; const gchar *uid; gboolean match = FALSE; gchar *address; extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; mail_account = e_source_get_extension (source, extension_name); uid = e_source_mail_account_get_identity_uid (mail_account); if (uid == NULL) continue; source = e_source_registry_ref_source (registry, uid); if (source == NULL) continue; extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY; if (!e_source_has_extension (source, extension_name)) { g_object_unref (source); continue; } mail_identity = e_source_get_extension (source, extension_name); address = e_source_mail_identity_dup_address (mail_identity); if (address != NULL) { match = (g_ascii_strcasecmp (address, user) == 0); g_free (address); } if (match && name != NULL) *name = e_source_dup_display_name (source); g_object_unref (source); if (match) { valid = TRUE; break; } } g_list_free_full (list, (GDestroyNotify) g_object_unref); return valid; }
/** * e_trust_prompt_run_for_source: * @parent: A #GtkWindow to use as a parent for the trust prompt dialog * @source: an #ESource, with %E_SOURCE_EXTENSION_AUTHENTICATION * @certificate_pem: a PEM-encoded certificate for which to show the trust prompt * @certificate_errors: errors of the @certificate_pem * @error_text: (allow-none): an optional error text to show in the dialog; can be %NULL * @allow_source_save: whether can also save any @source changes * @cancellable: (allow-none): a #GCancellable, or %NULL * @callback: a callback to call, when the prompt (an @source save) is done * @user_data: user data passed into @callback * * Similar to e_trust_prompt_run_modal(), except it also manages all the necessary things * around the @source<!-- -->'s SSL/TLS trust properties when it also contains %E_SOURCE_EXTENSION_WEBDAV, * thus the SSL/TLS trust on the WebDAV @source is properly updated based on the user's choice. * The call is finished with e_trust_prompt_run_for_source_finish(), * which also returns the user's choice. The finish happens in the @callback. * This is necessary, because the @source can be also saved. * * The function fails, if the @source doesn't contain the %E_SOURCE_EXTENSION_AUTHENTICATION. * * Note: The dialog is not shown when the stored certificate trust in the WebDAV @source * matches the @certificate_pem and the stored result is #E_TRUST_PROMPT_RESPONSE_REJECT. * * Since: 3.16 **/ void e_trust_prompt_run_for_source (GtkWindow *parent, ESource *source, const gchar *certificate_pem, GTlsCertificateFlags certificate_errors, const gchar *error_text, gboolean allow_source_save, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { ESourceAuthentication *extension_authentication = NULL; ESourceWebdav *extension_webdav = NULL; SaveSourceData *save_data; GTlsCertificate *certificate; gchar *host; GTask *task; if (parent) g_return_if_fail (GTK_IS_WINDOW (parent)); g_return_if_fail (E_IS_SOURCE (source)); g_return_if_fail (certificate_pem != NULL); if (e_source_has_extension (source, E_SOURCE_EXTENSION_GOA) || e_source_has_extension (source, E_SOURCE_EXTENSION_UOA)) { /* Make sure that GOA/UOA collection sources contain these extensions too */ g_warn_if_fail (e_source_get_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION)); g_warn_if_fail (e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND)); } if (e_source_has_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION)) extension_authentication = e_source_get_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION); if (e_source_has_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND)) extension_webdav = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND); save_data = g_new0 (SaveSourceData, 1); save_data->response = E_TRUST_PROMPT_RESPONSE_UNKNOWN; save_data->call_save = FALSE; /* Lookup used host name */ if (extension_authentication) host = e_source_authentication_dup_host (extension_authentication); else host = NULL; if (!host || !*host) { g_free (host); host = NULL; if (e_source_has_extension (source, E_SOURCE_EXTENSION_GOA)) { ESourceGoa *goa_extension; gchar *url; goa_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_GOA); url = e_source_goa_dup_calendar_url (goa_extension); host = trust_prompt_get_host_from_url (url); g_free (url); if (!host) { url = e_source_goa_dup_contacts_url (goa_extension); host = trust_prompt_get_host_from_url (url); g_free (url); } } } certificate = g_tls_certificate_new_from_pem (certificate_pem, -1, &save_data->error); if (certificate) { if (extension_webdav && host) save_data->response = e_source_webdav_verify_ssl_trust (extension_webdav, host, certificate, 0); else save_data->response = E_TRUST_PROMPT_RESPONSE_REJECT_TEMPORARILY; if (save_data->response != E_TRUST_PROMPT_RESPONSE_REJECT) { const gchar *source_extension = NULL; if (e_source_has_extension (source, E_SOURCE_EXTENSION_ADDRESS_BOOK)) source_extension = E_SOURCE_EXTENSION_ADDRESS_BOOK; if (e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR)) { if (!source_extension) source_extension = E_SOURCE_EXTENSION_CALENDAR; else source_extension = E_SOURCE_EXTENSION_COLLECTION; } if (e_source_has_extension (source, E_SOURCE_EXTENSION_MEMO_LIST)) { if (!source_extension) source_extension = E_SOURCE_EXTENSION_MEMO_LIST; else source_extension = E_SOURCE_EXTENSION_COLLECTION; } if (e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST)) { if (!source_extension) source_extension = E_SOURCE_EXTENSION_TASK_LIST; else source_extension = E_SOURCE_EXTENSION_COLLECTION; } if (e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_ACCOUNT)) { if (!source_extension) source_extension = E_SOURCE_EXTENSION_MAIL_ACCOUNT; else source_extension = E_SOURCE_EXTENSION_COLLECTION; } if (e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_TRANSPORT)) { if (!source_extension) source_extension = E_SOURCE_EXTENSION_MAIL_TRANSPORT; else source_extension = E_SOURCE_EXTENSION_COLLECTION; } save_data->response = e_trust_prompt_run_with_dialog_ready_callback (parent, source_extension, e_source_get_display_name (source), host, certificate_pem, certificate_errors, error_text, trust_prompt_listen_for_source_changes_cb, source); } } g_signal_handlers_disconnect_matched (source, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, source_connection_status_changed_cb, NULL); if (save_data->response != E_TRUST_PROMPT_RESPONSE_UNKNOWN) { if (certificate && extension_webdav) { e_source_webdav_update_ssl_trust (extension_webdav, host, certificate, save_data->response); save_data->call_save = allow_source_save; } } g_clear_object (&certificate); g_free (host); task = g_task_new (source, cancellable, callback, user_data); g_task_set_source_tag (task, e_trust_prompt_run_for_source); g_task_set_task_data (task, save_data, save_source_data_free); g_task_run_in_thread (task, save_source_thread); g_object_unref (task); }
static void google_backend_child_added (ECollectionBackend *backend, ESource *child_source) { ESource *collection_source; const gchar *extension_name; gboolean is_mail = FALSE; collection_source = e_backend_get_source (E_BACKEND (backend)); extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; is_mail |= e_source_has_extension (child_source, extension_name); extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY; is_mail |= e_source_has_extension (child_source, extension_name); extension_name = E_SOURCE_EXTENSION_MAIL_TRANSPORT; is_mail |= e_source_has_extension (child_source, extension_name); /* Synchronize mail-related user with the collection identity. */ extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; if (is_mail && e_source_has_extension (child_source, extension_name)) { ESourceAuthentication *auth_child_extension; ESourceCollection *collection_extension; const gchar *collection_identity; const gchar *auth_child_user; extension_name = E_SOURCE_EXTENSION_COLLECTION; collection_extension = e_source_get_extension ( collection_source, extension_name); collection_identity = e_source_collection_get_identity ( collection_extension); extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; auth_child_extension = e_source_get_extension ( child_source, extension_name); auth_child_user = e_source_authentication_get_user ( auth_child_extension); /* XXX Do not override an existing user name setting. * The IMAP or (especially) SMTP configuration may * have been modified to use a non-Google server. */ if (auth_child_user == NULL) e_source_authentication_set_user ( auth_child_extension, collection_identity); } /* Keep the calendar authentication method up-to-date. * * XXX Not using a property binding here in case I end up adding * other "support" interfaces which influence authentication. * Many-to-one property bindinds tend not to work so well. */ extension_name = E_SOURCE_EXTENSION_CALENDAR; if (e_source_has_extension (child_source, extension_name)) { google_backend_calendar_update_auth_method (child_source); g_signal_connect ( child_source, "notify::oauth2-support", G_CALLBACK (google_backend_calendar_update_auth_method), NULL); } /* Keep the contacts authentication method up-to-date. * * XXX Not using a property binding here in case I end up adding * other "support" interfaces which influence authentication. * Many-to-one property bindings tend not to work so well. */ extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK; if (e_source_has_extension (child_source, extension_name)) { google_backend_contacts_update_auth_method (child_source); g_signal_connect ( child_source, "notify::oauth2-support", G_CALLBACK (google_backend_contacts_update_auth_method), NULL); } /* Chain up to parent's child_added() method. */ E_COLLECTION_BACKEND_CLASS (e_google_backend_parent_class)-> child_added (backend, child_source); }
gboolean e_mail_store_save_initial_setup_sync (CamelStore *store, GHashTable *save_setup, ESource *collection_source, ESource *account_source, ESource *submission_source, ESource *transport_source, gboolean write_sources, GCancellable *cancellable, GError **error) { gboolean collection_changed = FALSE; gboolean account_changed = FALSE; gboolean submission_changed = FALSE; gboolean transport_changed = FALSE; gboolean success = TRUE; GHashTableIter iter; gpointer key, value; g_return_val_if_fail (CAMEL_IS_STORE (store), FALSE); g_return_val_if_fail (save_setup != NULL, FALSE); g_return_val_if_fail (E_IS_SOURCE (account_source), FALSE); if (!g_hash_table_size (save_setup)) return TRUE; /* The key name consists of up to four parts: Source:Extension:Property[:Type] Source can be 'Collection', 'Account', 'Submission', 'Transport', 'Backend' Extension is any extension name; it's up to the key creator to make sure the extension belongs to that particular Source. Property is a property name in the Extension. Type is an optional letter describing the type of the value; if not set, then string is used. Available values are: 'b' for boolean, 'i' for integer, 's' for string, 'f' for folder full path. All the part values are case sensitive. */ g_hash_table_iter_init (&iter, save_setup); while (g_hash_table_iter_next (&iter, &key, &value)) { gchar **keys; keys = g_strsplit (key, ":", -1); if (g_strv_length (keys) < 3 || g_strv_length (keys) > 4) { g_warning ("%s: Incorrect store setup key, expects 3 or 4 parts, but %d given in '%s'", G_STRFUNC, g_strv_length (keys), (const gchar *) key); } else if (g_str_equal (keys[0], "Collection")) { if (mail_store_save_setup_key (store, collection_source, keys[1], keys[2], keys[3], value)) collection_changed = TRUE; } else if (g_str_equal (keys[0], "Account")) { if (mail_store_save_setup_key (store, account_source, keys[1], keys[2], keys[3], value)) account_changed = TRUE; } else if (g_str_equal (keys[0], "Submission")) { if (mail_store_save_setup_key (store, submission_source, keys[1], keys[2], keys[3], value)) submission_changed = TRUE; } else if (g_str_equal (keys[0], "Transport")) { if (mail_store_save_setup_key (store, transport_source, keys[1], keys[2], keys[3], value)) transport_changed = TRUE; } else if (g_str_equal (keys[0], "Backend")) { ESource *backend_source = NULL; if (collection_source && e_source_has_extension (collection_source, keys[1])) backend_source = collection_source; else if (account_source && e_source_has_extension (account_source, keys[1])) backend_source = account_source; if (mail_store_save_setup_key (store, backend_source, keys[1], keys[2], keys[3], value)) transport_changed = TRUE; } else { g_warning ("%s: Unknown source name '%s' given in '%s'", G_STRFUNC, keys[0], (const gchar *) key); } } if (write_sources) { if (transport_changed && success && e_source_get_writable (transport_source)) success = e_source_write_sync (transport_source, cancellable, error); if (submission_changed && success && e_source_get_writable (submission_source)) success = e_source_write_sync (submission_source, cancellable, error); if (account_changed && success && e_source_get_writable (account_source)) success = e_source_write_sync (account_source, cancellable, error); if (collection_changed && success && e_source_get_writable (collection_source)) success = e_source_write_sync (collection_source, cancellable, error); } return success; }
static gboolean ews_transport_can_server_side_sent_folder (CamelService *service, EwsFolderId **folder_id, GCancellable *cancellable) { CamelSession *session; ESourceRegistry *registry; ESource *sibling, *source = NULL; gboolean is_server_side = FALSE; g_return_val_if_fail (CAMEL_IS_EWS_TRANSPORT (service), FALSE); g_return_val_if_fail (folder_id != NULL, FALSE); session = camel_service_ref_session (service); if (session && E_IS_MAIL_SESSION (session)) registry = g_object_ref (e_mail_session_get_registry (E_MAIL_SESSION (session))); else registry = e_source_registry_new_sync (cancellable, NULL); if (!registry) { g_clear_object (&session); return FALSE; } sibling = e_source_registry_ref_source (registry, camel_service_get_uid (service)); if (sibling) { GList *sources, *siter; sources = e_source_registry_list_sources (registry, E_SOURCE_EXTENSION_MAIL_SUBMISSION); for (siter = sources; siter; siter = siter->next) { source = siter->data; if (!source || g_strcmp0 (e_source_get_parent (source), e_source_get_parent (sibling)) != 0 || !e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION) || !e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_COMPOSITION)) source = NULL; else break; } if (source && e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION) && e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_COMPOSITION)) { ESourceMailSubmission *subm_extension; CamelStore *store = NULL; gchar *folder_name = NULL; subm_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION); /* Copy messages on the server side only if the replies might not be saved to the original folder, which is handled by the evolution itself. */ if (!e_source_mail_submission_get_replies_to_origin_folder (subm_extension) && e_source_mail_submission_get_sent_folder (subm_extension) && e_mail_folder_uri_parse (session, e_source_mail_submission_get_sent_folder (subm_extension), &store, &folder_name, NULL) & CAMEL_IS_EWS_STORE (store)) { CamelEwsStore *ews_store = CAMEL_EWS_STORE (store); gchar *folder_id_str; folder_id_str = camel_ews_store_summary_get_folder_id_from_name ( ews_store->summary, folder_name); if (folder_id_str) { gchar *change_key; change_key = camel_ews_store_summary_get_change_key (ews_store->summary, folder_name, NULL); *folder_id = e_ews_folder_id_new (folder_id_str, change_key, FALSE); g_free (change_key); is_server_side = *folder_id != NULL; } g_free (folder_id_str); } g_clear_object (&store); g_free (folder_name); } g_list_free_full (sources, g_object_unref); g_object_unref (sibling); } g_object_unref (registry); g_clear_object (&session); return is_server_side; }
GCancellable * mail_send (EMailSession *session) { CamelFolder *local_outbox; CamelService *service; struct _send_info *info; struct _send_data *data; send_info_t type = SEND_INVALID; const gchar *transport_uid; ESource *account; const gchar *extension_name; account = e_source_registry_ref_default_mail_identity (source_registry); if (account == NULL) return NULL; extension_name = E_SOURCE_EXTENSION_MAIL_SUBMISSION; if (e_source_has_extension (account, extension_name)) { ESourceMailSubmission *extension; gchar *uid; extension = e_source_get_extension (account, extension_name); uid = e_source_mail_submission_dup_transport_uid (extension); g_object_unref (account); account = e_source_registry_ref_source (source_registry, uid); g_free (uid); } else { g_object_unref (account); account = NULL; } if (account == NULL) return NULL; transport_uid = e_source_get_uid (account); data = setup_send_data (session); info = g_hash_table_lookup (data->active, SEND_URI_KEY); if (info != NULL) { info->again++; d(printf("send of %s still in progress\n", transport_uid)); return info->cancellable; } service = camel_session_ref_service ( CAMEL_SESSION (session), transport_uid); if (!CAMEL_IS_TRANSPORT (service)) { return NULL; } d(printf("starting non-interactive send of '%s'\n", account->transport->url)); type = get_receive_type (service); if (type == SEND_INVALID) { return NULL; } info = g_malloc0 (sizeof (*info)); info->type = SEND_SEND; info->session = g_object_ref (session); info->service = g_object_ref (service); info->keep_on_server = FALSE; info->cancellable = camel_operation_new(); info->data = data; info->state = SEND_ACTIVE; info->timeout_id = 0; d(printf("Adding new info %p\n", info)); g_hash_table_insert (data->active, g_strdup(SEND_URI_KEY), info); /* todo, store the folder in info? */ local_outbox = e_mail_session_get_local_folder ( session, E_MAIL_LOCAL_FOLDER_OUTBOX); mail_send_queue ( session, local_outbox, CAMEL_TRANSPORT (service), E_FILTER_SOURCE_OUTGOING, info->cancellable, receive_get_folder, info, receive_status, info, send_done, info); return info->cancellable; }
static void yahoo_backend_child_added (ECollectionBackend *backend, ESource *child_source) { EYahooBackend *yahoo_backend; ESource *collection_source; const gchar *extension_name; gboolean is_mail = FALSE; /* Chain up to parent's child_added() method. */ E_COLLECTION_BACKEND_CLASS (e_yahoo_backend_parent_class)-> child_added (backend, child_source); yahoo_backend = E_YAHOO_BACKEND (backend); collection_source = e_backend_get_source (E_BACKEND (backend)); extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; is_mail |= e_source_has_extension (child_source, extension_name); /* Take special note of the mail identity source. * We need it to build the calendar CalDAV path. */ extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY; if (e_source_has_extension (child_source, extension_name)) { GWeakRef *weak_ref; weak_ref = &yahoo_backend->mail_identity_source; g_weak_ref_set (weak_ref, child_source); is_mail = TRUE; } extension_name = E_SOURCE_EXTENSION_MAIL_TRANSPORT; is_mail |= e_source_has_extension (child_source, extension_name); /* Synchronize mail-related user with the collection identity. */ extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; if (is_mail && e_source_has_extension (child_source, extension_name)) { ESourceAuthentication *auth_child_extension; ESourceCollection *collection_extension; const gchar *collection_identity; const gchar *auth_child_user; extension_name = E_SOURCE_EXTENSION_COLLECTION; collection_extension = e_source_get_extension ( collection_source, extension_name); collection_identity = e_source_collection_get_identity ( collection_extension); extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; auth_child_extension = e_source_get_extension ( child_source, extension_name); auth_child_user = e_source_authentication_get_user ( auth_child_extension); /* XXX Do not override an existing user name setting. * The IMAP or (especially) SMTP configuration may * have been modified to use a non-Yahoo! server. */ if (auth_child_user == NULL) e_source_authentication_set_user ( auth_child_extension, collection_identity); } }