97
#define SSL_PORT_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_SSL2 | CAMEL_TCP_STREAM_SSL_ENABLE_SSL3)
98
#define STARTTLS_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_TLS)
107
{ "", "smtps", SMTPS_PORT, MODE_SSL }, /* really old (1.x) */
108
{ "always", "smtps", SMTPS_PORT, MODE_SSL },
109
{ "when-possible", "smtp", SMTP_PORT, MODE_TLS },
110
{ "never", "smtp", SMTP_PORT, MODE_CLEAR },
111
{ NULL, "smtp", SMTP_PORT, MODE_CLEAR }
114
G_DEFINE_TYPE (CamelSmtpTransport, camel_smtp_transport, CAMEL_TYPE_TRANSPORT)
97
/* Forward Declarations */
98
static void camel_network_service_init (CamelNetworkServiceInterface *interface);
100
G_DEFINE_TYPE_WITH_CODE (
102
camel_smtp_transport,
103
CAMEL_TYPE_TRANSPORT,
104
G_IMPLEMENT_INTERFACE (
105
CAMEL_TYPE_NETWORK_SERVICE,
106
camel_network_service_init))
117
109
connect_to_server (CamelService *service,
122
110
GCancellable *cancellable,
125
113
CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT (service);
126
CamelSession *session;
114
CamelNetworkService *network_service;
115
CamelNetworkSecurityMethod method;
130
117
CamelStream *tcp_stream;
131
118
gchar *respbuf = NULL;
139
126
transport->authtypes = NULL;
141
128
url = camel_service_get_camel_url (service);
142
session = camel_service_get_session (service);
144
if (ssl_mode != MODE_CLEAR) {
145
#ifdef CAMEL_HAVE_SSL
146
if (ssl_mode == MODE_TLS) {
147
tcp_stream = camel_tcp_stream_ssl_new_raw (session, url->host, STARTTLS_FLAGS);
149
tcp_stream = camel_tcp_stream_ssl_new (session, url->host, SSL_PORT_FLAGS);
153
error, CAMEL_SERVICE_ERROR,
154
CAMEL_SERVICE_ERROR_UNAVAILABLE,
155
_("Could not connect to %s: %s"),
156
url->host, _("SSL unavailable"));
159
#endif /* CAMEL_HAVE_SSL */
161
tcp_stream = camel_tcp_stream_raw_new ();
164
camel_session_get_socks_proxy (session, &socks_host, &socks_port);
167
camel_tcp_stream_set_socks_proxy (
168
CAMEL_TCP_STREAM (tcp_stream),
169
socks_host, socks_port);
173
if (camel_tcp_stream_connect (
174
CAMEL_TCP_STREAM (tcp_stream), host, serv,
175
fallback_port, cancellable, error) == -1) {
176
g_object_unref (tcp_stream);
130
network_service = CAMEL_NETWORK_SERVICE (service);
131
method = camel_network_service_get_security_method (network_service);
133
tcp_stream = camel_network_service_connect_sync (
134
CAMEL_NETWORK_SERVICE (service), cancellable, error);
136
if (tcp_stream == NULL)
180
139
transport->connected = TRUE;
315
connect_to_server_wrapper (CamelService *service,
316
GCancellable *cancellable,
320
const gchar *ssl_mode;
325
url = camel_service_get_camel_url (service);
327
if ((ssl_mode = camel_url_get_param (url, "use_ssl"))) {
328
for (i = 0; ssl_options[i].value; i++)
329
if (!strcmp (ssl_options[i].value, ssl_mode))
331
mode = ssl_options[i].mode;
332
serv = (gchar *) ssl_options[i].serv;
333
fallback_port = ssl_options[i].fallback_port;
336
serv = (gchar *) "smtp";
337
fallback_port = SMTP_PORT;
341
serv = g_alloca (16);
342
sprintf (serv, "%d", url->port);
346
return connect_to_server (
347
service, url->host, serv,
348
fallback_port, mode, cancellable, error);
352
272
authtypes_free (gpointer key, gpointer value, gpointer data)
278
smtp_transport_set_property (GObject *object,
283
switch (property_id) {
284
case PROP_SECURITY_METHOD:
285
camel_network_service_set_security_method (
286
CAMEL_NETWORK_SERVICE (object),
287
g_value_get_enum (value));
291
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
295
smtp_transport_get_property (GObject *object,
300
switch (property_id) {
301
case PROP_DEFAULT_PORT:
304
camel_network_service_get_default_port (
305
CAMEL_NETWORK_SERVICE (object)));
308
case PROP_SECURITY_METHOD:
311
camel_network_service_get_security_method (
312
CAMEL_NETWORK_SERVICE (object)));
315
case PROP_SERVICE_NAME:
318
camel_network_service_get_service_name (
319
CAMEL_NETWORK_SERVICE (object)));
323
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
327
smtp_transport_constructed (GObject *object)
330
const gchar *use_ssl;
332
/* Chain up to parent's constructed() method. */
333
G_OBJECT_CLASS (camel_smtp_transport_parent_class)->constructed (object);
335
url = camel_service_get_camel_url (CAMEL_SERVICE (object));
336
use_ssl = camel_url_get_param (url, "use_ssl");
338
if (g_strcmp0 (use_ssl, "never") == 0)
339
camel_network_service_set_security_method (
340
CAMEL_NETWORK_SERVICE (object),
341
CAMEL_NETWORK_SECURITY_METHOD_NONE);
342
else if (g_strcmp0 (use_ssl, "always") == 0)
343
camel_network_service_set_security_method (
344
CAMEL_NETWORK_SERVICE (object),
345
CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT);
346
else if (g_strcmp0 (use_ssl, "when-possible") == 0)
347
camel_network_service_set_security_method (
348
CAMEL_NETWORK_SERVICE (object),
349
CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT);
358
smtp_get_name (CamelService *service, gboolean brief)
353
smtp_transport_get_name (CamelService *service, gboolean brief)
402
return connect_to_server_wrapper (service, cancellable, error);
397
return connect_to_server (service, cancellable, error);
405
if (!connect_to_server_wrapper (service, cancellable, error))
400
if (!connect_to_server (service, cancellable, error))
408
403
/* check to see if AUTH is required, if so...then AUTH ourselves */
586
smtp_query_auth_types_sync (CamelService *service,
587
GCancellable *cancellable,
581
smtp_transport_query_auth_types_sync (CamelService *service,
582
GCancellable *cancellable,
590
585
CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT (service);
591
586
CamelServiceAuthType *authtype;
592
587
CamelProvider *provider;
593
588
GList *types, *t, *next;
595
if (!connect_to_server_wrapper (service, cancellable, error))
590
if (!connect_to_server (service, cancellable, error))
598
593
if (!transport->authtypes) {
599
smtp_disconnect_sync (service, TRUE, cancellable, NULL);
594
smtp_transport_disconnect_sync (
595
service, TRUE, cancellable, NULL);
616
smtp_disconnect_sync (service, TRUE, cancellable, NULL);
612
smtp_transport_disconnect_sync (service, TRUE, cancellable, NULL);
622
smtp_send_to_sync (CamelTransport *transport,
623
CamelMimeMessage *message,
625
CamelAddress *recipients,
626
GCancellable *cancellable,
618
smtp_transport_send_to_sync (CamelTransport *transport,
619
CamelMimeMessage *message,
621
CamelAddress *recipients,
622
GCancellable *cancellable,
629
625
CamelSmtpTransport *smtp_transport = CAMEL_SMTP_TRANSPORT (transport);
630
626
CamelInternetAddress *cia;
713
smtp_transport_get_service_name (CamelNetworkService *service)
715
CamelNetworkSecurityMethod method;
716
const gchar *service_name;
718
method = camel_network_service_get_security_method (service);
721
case CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT:
722
service_name = "smtps";
726
service_name = "smtp";
734
smtp_transport_get_default_port (CamelNetworkService *service)
736
CamelNetworkSecurityMethod method;
737
guint16 default_port;
739
method = camel_network_service_get_security_method (service);
742
case CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT:
743
default_port = SMTPS_PORT;
747
default_port = SMTP_PORT;
717
755
camel_smtp_transport_class_init (CamelSmtpTransportClass *class)
757
GObjectClass *object_class;
758
CamelServiceClass *service_class;
719
759
CamelTransportClass *transport_class;
720
CamelServiceClass *service_class;
761
object_class = G_OBJECT_CLASS (class);
762
object_class->set_property = smtp_transport_set_property;
763
object_class->get_property = smtp_transport_get_property;
764
object_class->constructed = smtp_transport_constructed;
722
766
service_class = CAMEL_SERVICE_CLASS (class);
723
service_class->get_name = smtp_get_name;
724
service_class->connect_sync = smtp_connect_sync;
725
service_class->disconnect_sync = smtp_disconnect_sync;
726
service_class->query_auth_types_sync = smtp_query_auth_types_sync;
767
service_class->get_name = smtp_transport_get_name;
768
service_class->connect_sync = smtp_transport_connect_sync;
769
service_class->disconnect_sync = smtp_transport_disconnect_sync;
770
service_class->query_auth_types_sync = smtp_transport_query_auth_types_sync;
728
772
transport_class = CAMEL_TRANSPORT_CLASS (class);
729
transport_class->send_to_sync = smtp_send_to_sync;
773
transport_class->send_to_sync = smtp_transport_send_to_sync;
775
/* Inherited from CamelNetworkService. */
776
g_object_class_override_property (
781
/* Inherited from CamelNetworkService. */
782
g_object_class_override_property (
784
PROP_SECURITY_METHOD,
787
/* Inherited from CamelNetworkService. */
788
g_object_class_override_property (
795
camel_network_service_init (CamelNetworkServiceInterface *interface)
797
interface->get_service_name = smtp_transport_get_service_name;
798
interface->get_default_port = smtp_transport_get_default_port;