static void pop3_store_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_CONNECTABLE: g_value_take_object ( value, camel_network_service_ref_connectable ( CAMEL_NETWORK_SERVICE (object))); return; case PROP_HOST_REACHABLE: g_value_set_boolean ( value, camel_network_service_get_host_reachable ( CAMEL_NETWORK_SERVICE (object))); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); }
static void pop3_store_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_CONNECTABLE: camel_network_service_set_connectable ( CAMEL_NETWORK_SERVICE (object), g_value_get_object (value)); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); }
static gboolean connect_to_server (CamelService *service, GCancellable *cancellable, GError **error) { CamelPOP3Store *store = CAMEL_POP3_STORE (service); CamelNetworkSettings *network_settings; CamelNetworkSecurityMethod method; CamelSettings *settings; CamelStream *tcp_stream; CamelPOP3Engine *pop3_engine = NULL; CamelPOP3Command *pc; gboolean disable_extensions; gboolean success = TRUE; gchar *host; guint32 flags = 0; gint ret; GError *local_error = NULL; settings = camel_service_ref_settings (service); network_settings = CAMEL_NETWORK_SETTINGS (settings); host = camel_network_settings_dup_host (network_settings); method = camel_network_settings_get_security_method (network_settings); disable_extensions = camel_pop3_settings_get_disable_extensions ( CAMEL_POP3_SETTINGS (settings)); g_object_unref (settings); tcp_stream = camel_network_service_connect_sync ( CAMEL_NETWORK_SERVICE (service), cancellable, error); if (tcp_stream == NULL) { success = FALSE; goto exit; } /* parent class connect initialization */ if (CAMEL_SERVICE_CLASS (camel_pop3_store_parent_class)-> connect_sync (service, cancellable, error) == FALSE) { g_object_unref (tcp_stream); success = FALSE; goto exit; } if (disable_extensions) flags |= CAMEL_POP3_ENGINE_DISABLE_EXTENSIONS; if (!(pop3_engine = camel_pop3_engine_new (tcp_stream, flags, cancellable, &local_error)) || local_error != NULL) { if (local_error) g_propagate_error (error, local_error); else g_set_error ( error, CAMEL_ERROR, CAMEL_ERROR_GENERIC, _("Failed to read a valid greeting from POP server %s"), host); g_object_unref (tcp_stream); success = FALSE; goto exit; } if (method != CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT) { g_object_unref (tcp_stream); goto exit; } if (!(pop3_engine->capa & CAMEL_POP3_CAP_STLS)) { g_set_error ( error, CAMEL_ERROR, CAMEL_ERROR_GENERIC, _("Failed to connect to POP server %s in secure mode: %s"), host, _("STLS not supported by server")); goto stls_exception; } pc = camel_pop3_engine_command_new ( pop3_engine, 0, NULL, NULL, cancellable, error, "STLS\r\n"); while (camel_pop3_engine_iterate (pop3_engine, NULL, cancellable, NULL) > 0) ; ret = pc->state == CAMEL_POP3_COMMAND_OK; camel_pop3_engine_command_free (pop3_engine, pc); if (ret == FALSE) { gchar *tmp; tmp = get_valid_utf8_error ((gchar *) pop3_engine->line); g_set_error ( error, CAMEL_ERROR, CAMEL_ERROR_GENERIC, /* Translators: Last %s is an optional * explanation beginning with ": " separator. */ _("Failed to connect to POP server %s in secure mode%s"), host, (tmp != NULL) ? tmp : ""); g_free (tmp); goto stls_exception; } /* Okay, now toggle SSL/TLS mode */ ret = camel_tcp_stream_ssl_enable_ssl ( CAMEL_TCP_STREAM_SSL (tcp_stream), cancellable, error); if (ret == -1) { g_prefix_error ( error, _("Failed to connect to POP server %s in secure mode: "), host); goto stls_exception; } g_object_unref (tcp_stream); /* rfc2595, section 4 states that after a successful STLS * command, the client MUST discard prior CAPA responses */ if (!camel_pop3_engine_reget_capabilities (pop3_engine, cancellable, error)) goto exception; goto exit; stls_exception: /* As soon as we send a STLS command, all hope * is lost of a clean QUIT if problems arise. */ /* if (clean_quit) { / * try to disconnect cleanly * / pc = camel_pop3_engine_command_new ( pop3_engine, 0, NULL, NULL, cancellable, NULL, "QUIT\r\n"); while (camel_pop3_engine_iterate (pop3_engine, NULL, cancellable, NULL) > 0) ; camel_pop3_engine_command_free (pop3_engine, pc); }*/ exception: g_object_unref (tcp_stream); g_clear_object (&pop3_engine); success = FALSE; exit: g_free (host); g_mutex_lock (&store->priv->property_lock); if (pop3_engine != NULL) store->priv->engine = g_object_ref (pop3_engine); g_mutex_unlock (&store->priv->property_lock); g_clear_object (&pop3_engine); return success; }
static gboolean connect_to_server (CamelService *service, GCancellable *cancellable, GError **error) { CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT (service); CamelNetworkSettings *network_settings; CamelNetworkSecurityMethod method; CamelSettings *settings; CamelStream *stream; GIOStream *base_stream; GIOStream *tls_stream; gchar *respbuf = NULL; gboolean success = TRUE; gchar *host; if (!CAMEL_SERVICE_CLASS (camel_smtp_transport_parent_class)-> connect_sync (service, cancellable, error)) return FALSE; /* set some smtp transport defaults */ transport->flags = 0; transport->authtypes = NULL; settings = camel_service_ref_settings (service); network_settings = CAMEL_NETWORK_SETTINGS (settings); host = camel_network_settings_dup_host (network_settings); method = camel_network_settings_get_security_method (network_settings); g_object_unref (settings); base_stream = camel_network_service_connect_sync ( CAMEL_NETWORK_SERVICE (service), cancellable, error); if (base_stream != NULL) { /* get the localaddr - needed later by smtp_helo */ transport->local_address = g_socket_connection_get_local_address ( G_SOCKET_CONNECTION (base_stream), NULL); stream = camel_stream_new (base_stream); g_object_unref (base_stream); } else { success = FALSE; goto exit; } transport->connected = TRUE; transport->ostream = stream; transport->istream = camel_stream_buffer_new ( stream, CAMEL_STREAM_BUFFER_READ); /* Read the greeting, note whether the server is ESMTP or not. */ do { /* Check for "220" */ g_free (respbuf); respbuf = camel_stream_buffer_read_line ( CAMEL_STREAM_BUFFER (transport->istream), cancellable, error); d (fprintf (stderr, "[SMTP] received: %s\n", respbuf ? respbuf : "(null)")); if (respbuf == NULL) { g_prefix_error (error, _("Welcome response error: ")); transport->connected = FALSE; success = FALSE; goto exit; } if (strncmp (respbuf, "220", 3)) { smtp_set_error ( transport, respbuf, cancellable, error); g_prefix_error (error, _("Welcome response error: ")); g_free (respbuf); success = FALSE; goto exit; } } while (*(respbuf+3) == '-'); /* if we got "220-" then loop again */ g_free (respbuf); /* Try sending EHLO */ transport->flags |= CAMEL_SMTP_TRANSPORT_IS_ESMTP; if (!smtp_helo (transport, cancellable, error)) { if (!transport->connected) { success = FALSE; goto exit; } /* Fall back to HELO */ g_clear_error (error); transport->flags &= ~CAMEL_SMTP_TRANSPORT_IS_ESMTP; if (!smtp_helo (transport, cancellable, error)) { success = FALSE; goto exit; } } /* Clear any EHLO/HELO exception and assume that * any SMTP errors encountered were non-fatal. */ g_clear_error (error); if (method != CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT) goto exit; /* we're done */ if (!(transport->flags & CAMEL_SMTP_TRANSPORT_STARTTLS)) { g_set_error ( error, CAMEL_ERROR, CAMEL_ERROR_GENERIC, _("Failed to connect to SMTP server %s in secure mode: %s"), host, _("STARTTLS not supported")); success = FALSE; goto exit; } d (fprintf (stderr, "[SMTP] sending: STARTTLS\r\n")); if (camel_stream_write ( stream, "STARTTLS\r\n", 10, cancellable, error) == -1) { g_prefix_error (error, _("STARTTLS command failed: ")); success = FALSE; goto exit; } respbuf = NULL; do { /* Check for "220 Ready for TLS" */ g_free (respbuf); respbuf = camel_stream_buffer_read_line ( CAMEL_STREAM_BUFFER (transport->istream), cancellable, error); d (fprintf (stderr, "[SMTP] received: %s\n", respbuf ? respbuf : "(null)")); if (respbuf == NULL) { g_prefix_error (error, _("STARTTLS command failed: ")); transport->connected = FALSE; success = FALSE; goto exit; } if (strncmp (respbuf, "220", 3) != 0) { smtp_set_error ( transport, respbuf, cancellable, error); g_prefix_error (error, _("STARTTLS command failed: ")); g_free (respbuf); success = FALSE; goto exit; } } while (*(respbuf+3) == '-'); /* if we got "220-" then loop again */ /* Okay, now toggle SSL/TLS mode */ base_stream = camel_stream_ref_base_stream (stream); tls_stream = camel_network_service_starttls ( CAMEL_NETWORK_SERVICE (service), base_stream, error); g_object_unref (base_stream); if (tls_stream != NULL) { camel_stream_set_base_stream (stream, tls_stream); g_object_unref (tls_stream); } else { g_prefix_error ( error, _("Failed to connect to SMTP server %s in secure mode: "), host); success = FALSE; goto exit; } /* We are supposed to re-EHLO after a successful STARTTLS to * re-fetch any supported extensions. */ if (!smtp_helo (transport, cancellable, error)) { success = FALSE; } exit: g_free (host); if (!success) { transport->connected = FALSE; g_clear_object (&transport->istream); g_clear_object (&transport->ostream); } return success; }