static void smtp_settings_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_AUTH_MECHANISM: g_value_take_string ( value, camel_network_settings_dup_auth_mechanism ( CAMEL_NETWORK_SETTINGS (object))); return; case PROP_HOST: g_value_take_string ( value, camel_network_settings_dup_host ( CAMEL_NETWORK_SETTINGS (object))); return; case PROP_PORT: g_value_set_uint ( value, camel_network_settings_get_port ( CAMEL_NETWORK_SETTINGS (object))); return; case PROP_SECURITY_METHOD: g_value_set_enum ( value, camel_network_settings_get_security_method ( CAMEL_NETWORK_SETTINGS (object))); return; case PROP_USER: g_value_take_string ( value, camel_network_settings_dup_user ( CAMEL_NETWORK_SETTINGS (object))); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); }
static gboolean ews_transport_connect_sync (CamelService *service, GCancellable *cancellable, GError **error) { EEwsConnection *connection; CamelSession *session; CamelSettings *settings; gchar *auth_mech; gboolean success; /* Chain up to parent's method. */ if (!CAMEL_SERVICE_CLASS (camel_ews_transport_parent_class)->connect_sync (service, cancellable, error)) return FALSE; if (camel_service_get_connection_status (service) == CAMEL_SERVICE_DISCONNECTED) return FALSE; connection = ews_transport_ref_connection (CAMEL_EWS_TRANSPORT (service)); if (connection) { g_object_unref (connection); return TRUE; } session = camel_service_ref_session (service); settings = camel_service_ref_settings (service); /* Try running an operation that requires authentication * to make sure we have valid credentials available. */ auth_mech = camel_network_settings_dup_auth_mechanism (CAMEL_NETWORK_SETTINGS (settings)); success = camel_session_authenticate_sync (session, service, auth_mech ? auth_mech : "NTLM", cancellable, error); g_free (auth_mech); g_object_unref (session); g_object_unref (settings); return success; }
static gboolean pop3_store_connect_sync (CamelService *service, GCancellable *cancellable, GError **error) { CamelPOP3Store *store = (CamelPOP3Store *) service; CamelPOP3Engine *pop3_engine; CamelSettings *settings; CamelSession *session; const gchar *user_data_dir; gboolean success = TRUE; gchar *mechanism; session = camel_service_ref_session (service); user_data_dir = camel_service_get_user_data_dir (service); settings = camel_service_ref_settings (service); mechanism = camel_network_settings_dup_auth_mechanism ( CAMEL_NETWORK_SETTINGS (settings)); g_object_unref (settings); if (!camel_session_get_online (session)) { g_set_error ( error, CAMEL_SERVICE_ERROR, CAMEL_SERVICE_ERROR_UNAVAILABLE, _("You must be working online to complete this operation")); success = FALSE; goto exit; } g_mutex_lock (&store->priv->property_lock); if (store->priv->cache == NULL) { CamelDataCache *cache; cache = camel_data_cache_new (user_data_dir, error); if (cache != NULL) { /* Ensure cache will never expire, otherwise * it causes redownload of messages. */ camel_data_cache_set_expire_age (cache, -1); camel_data_cache_set_expire_access (cache, -1); store->priv->cache = g_object_ref (cache); g_object_unref (cache); } } g_mutex_unlock (&store->priv->property_lock); success = connect_to_server (service, cancellable, error); if (!success) goto exit; success = camel_session_authenticate_sync ( session, service, mechanism, cancellable, error); if (!success) goto exit; /* Now that we are in the TRANSACTION state, * try regetting the capabilities */ pop3_engine = camel_pop3_store_ref_engine (store); if (pop3_engine) { pop3_engine->state = CAMEL_POP3_ENGINE_TRANSACTION; if (!camel_pop3_engine_reget_capabilities (pop3_engine, cancellable, error)) success = FALSE; g_clear_object (&pop3_engine); } else { g_set_error_literal ( error, CAMEL_SERVICE_ERROR, CAMEL_SERVICE_ERROR_UNAVAILABLE, _("You must be working online to complete this operation")); success = FALSE; } exit: g_free (mechanism); g_object_unref (session); if (!success) { /* to not leak possible connection to the server */ g_mutex_lock (&store->priv->property_lock); g_clear_object (&store->priv->engine); g_mutex_unlock (&store->priv->property_lock); } return success; }
static gboolean smtp_transport_connect_sync (CamelService *service, GCancellable *cancellable, GError **error) { CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT (service); CamelNetworkSettings *network_settings; CamelSettings *settings; gchar *host; gchar *mechanism; gboolean auth_required; gboolean success = TRUE; /* Chain up to parent's method. */ if (!CAMEL_SERVICE_CLASS (camel_smtp_transport_parent_class)->connect_sync (service, cancellable, error)) return FALSE; smtp_debug_print_server_name (service, "Connecting to"); settings = camel_service_ref_settings (service); network_settings = CAMEL_NETWORK_SETTINGS (settings); host = camel_network_settings_dup_host (network_settings); mechanism = camel_network_settings_dup_auth_mechanism (network_settings); g_object_unref (settings); /* We (probably) need to check popb4smtp before we connect ... */ if (g_strcmp0 (mechanism, "POPB4SMTP") == 0) { GByteArray *chal; CamelSasl *sasl; sasl = camel_sasl_new ("smtp", "POPB4SMTP", service); chal = camel_sasl_challenge_sync (sasl, NULL, cancellable, error); if (chal != NULL) g_byte_array_free (chal, TRUE); if (camel_sasl_get_authenticated (sasl)) success = connect_to_server ( service, cancellable, error); else success = FALSE; g_object_unref (sasl); goto exit; } success = connect_to_server (service, cancellable, error); if (!success) return FALSE; /* check to see if AUTH is required, if so...then AUTH ourselves */ auth_required = (mechanism != NULL) && (transport->authtypes != NULL) && (g_hash_table_size (transport->authtypes) > 0) && (transport->flags & CAMEL_SMTP_TRANSPORT_IS_ESMTP); if (auth_required) { CamelSession *session; session = camel_service_ref_session (service); if (g_hash_table_lookup (transport->authtypes, mechanism)) { success = camel_session_authenticate_sync ( session, service, mechanism, cancellable, error); } else { g_set_error ( error, CAMEL_SERVICE_ERROR, CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, _("SMTP server %s does not support %s " "authentication"), host, mechanism); success = FALSE; } g_object_unref (session); if (!success) transport->connected = FALSE; } exit: g_free (host); g_free (mechanism); return success; }