~ubuntu-branches/ubuntu/saucy/evolution-data-server/saucy

« back to all changes in this revision

Viewing changes to camel/providers/smtp/camel-smtp-transport.c

  • Committer: Package Import Robot
  • Author(s): Chris Coulson
  • Date: 2012-10-08 12:58:16 UTC
  • mfrom: (181.1.7 quantal)
  • Revision ID: package-import@ubuntu.com-20121008125816-i3n76e8c0m64e7xp
Tags: 3.6.0-0ubuntu2
* Fix LP: #1038047 part 1 - Don't abort in e_source_registry_new* when a
  problem occurs connecting to the Dbus service
  - add debian/patches/dont-abort-in-e_source_registry_new.patch
  - update debian/patches/series
* Fix LP: #1038047 part 2 - libedataserver depends on
  evolution-data-server-common to ensure that the GSettings schemas are
  present
  - update debian/control

Show diffs side-by-side

added added

removed removed

Lines of Context:
117
117
        transport->flags = 0;
118
118
        transport->authtypes = NULL;
119
119
 
120
 
        settings = camel_service_get_settings (service);
 
120
        settings = camel_service_ref_settings (service);
121
121
 
122
122
        network_settings = CAMEL_NETWORK_SETTINGS (settings);
123
123
        host = camel_network_settings_dup_host (network_settings);
124
124
        method = camel_network_settings_get_security_method (network_settings);
125
125
 
 
126
        g_object_unref (settings);
 
127
 
126
128
        tcp_stream = camel_network_service_connect_sync (
127
129
                CAMEL_NETWORK_SERVICE (service), cancellable, error);
128
130
 
134
136
        transport->connected = TRUE;
135
137
 
136
138
        /* get the localaddr - needed later by smtp_helo */
137
 
        transport->localaddr = camel_tcp_stream_get_local_address (CAMEL_TCP_STREAM (tcp_stream), &transport->localaddrlen);
 
139
        transport->localaddr = camel_tcp_stream_get_local_address (
 
140
                CAMEL_TCP_STREAM (tcp_stream), &transport->localaddrlen);
138
141
 
139
142
        transport->ostream = tcp_stream;
140
 
        transport->istream = camel_stream_buffer_new (tcp_stream, CAMEL_STREAM_BUFFER_READ);
 
143
        transport->istream = camel_stream_buffer_new (
 
144
                tcp_stream, CAMEL_STREAM_BUFFER_READ);
141
145
 
142
146
        /* Read the greeting, note whether the server is ESMTP or not. */
143
147
        do {
184
188
                }
185
189
        }
186
190
 
187
 
        /* clear any EHLO/HELO exception and assume that any SMTP errors encountered were non-fatal */
 
191
        /* Clear any EHLO/HELO exception and assume that
 
192
         * any SMTP errors encountered were non-fatal. */
188
193
        g_clear_error (error);
189
194
 
190
195
        if (method != CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT)
199
204
                goto exception_cleanup;
200
205
        }
201
206
 
202
 
        d(fprintf (stderr, "sending : STARTTLS\r\n"));
 
207
        d (fprintf (stderr, "sending : STARTTLS\r\n"));
203
208
        if (camel_stream_write (
204
209
                tcp_stream, "STARTTLS\r\n", 10, cancellable, error) == -1) {
205
210
                g_prefix_error (error, _("STARTTLS command failed: "));
284
289
        gchar *host;
285
290
        gchar *name;
286
291
 
287
 
        settings = camel_service_get_settings (service);
 
292
        settings = camel_service_ref_settings (service);
288
293
 
289
294
        network_settings = CAMEL_NETWORK_SETTINGS (settings);
290
295
        host = camel_network_settings_dup_host (network_settings);
291
296
 
 
297
        g_object_unref (settings);
 
298
 
292
299
        if (brief)
293
300
                name = g_strdup_printf (
294
301
                        _("SMTP server %s"), host);
314
321
        gboolean auth_required;
315
322
        gboolean success = TRUE;
316
323
 
317
 
        settings = camel_service_get_settings (service);
 
324
        settings = camel_service_ref_settings (service);
318
325
 
319
326
        network_settings = CAMEL_NETWORK_SETTINGS (settings);
320
327
        host = camel_network_settings_dup_host (network_settings);
321
328
        mechanism = camel_network_settings_dup_auth_mechanism (network_settings);
322
329
 
 
330
        g_object_unref (settings);
 
331
 
323
332
        /* We (probably) need to check popb4smtp before we connect ... */
324
333
        if (g_strcmp0 (mechanism, "POPB4SMTP") == 0) {
325
334
                GByteArray *chal;
367
376
                                error, CAMEL_SERVICE_ERROR,
368
377
                                CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
369
378
                                _("SMTP server %s does not support %s "
370
 
                                  "authentication"), host, mechanism);
 
379
                                "authentication"), host, mechanism);
371
380
                        success = FALSE;
372
381
                }
373
382
 
471
480
                        "AUTH %s\r\n", mechanism);
472
481
        }
473
482
 
474
 
        d(fprintf (stderr, "sending : %s", cmdbuf));
 
483
        d (fprintf (stderr, "sending : %s", cmdbuf));
475
484
        if (camel_stream_write_string (
476
485
                transport->ostream, cmdbuf,
477
486
                cancellable, error) == -1) {
506
515
 
507
516
                if (FALSE) {
508
517
                broken_smtp_server:
509
 
                        d(fprintf (stderr, "Your SMTP server's implementation of the %s SASL\n"
510
 
                                   "authentication mechanism is broken. Please report this to the\n"
511
 
                                   "appropriate vendor and suggest that they re-read rfc2554 again\n"
512
 
                                   "for the first time (specifically Section 4).\n",
513
 
                                   mechanism));
 
518
                        d (fprintf (
 
519
                                stderr, "Your SMTP server's implementation "
 
520
                                "of the %s SASL\nauthentication mechanism is "
 
521
                                "broken. Please report this to the\n"
 
522
                                "appropriate vendor and suggest that they "
 
523
                                "re-read rfc2554 again\nfor the first time "
 
524
                                "(specifically Section 4).\n",
 
525
                                mechanism));
514
526
                }
515
527
 
516
528
                /* eat whtspc */
526
538
                /* send our challenge */
527
539
                cmdbuf = g_strdup_printf ("%s\r\n", challenge);
528
540
                g_free (challenge);
529
 
                d(fprintf (stderr, "sending : %s", cmdbuf));
 
541
                d (fprintf (stderr, "sending : %s", cmdbuf));
530
542
                if (camel_stream_write_string (
531
543
                        transport->ostream, cmdbuf,
532
544
                        cancellable, error) == -1) {
568
580
 
569
581
break_and_lose:
570
582
        /* Get the server out of "waiting for continuation data" mode. */
571
 
        d(fprintf (stderr, "sending : *\n"));
 
583
        d (fprintf (stderr, "sending : *\n"));
572
584
        camel_stream_write (transport->ostream, "*\r\n", 3, cancellable, NULL);
573
585
        respbuf = camel_stream_buffer_read_line (
574
586
                CAMEL_STREAM_BUFFER (transport->istream), cancellable, NULL);
575
 
        d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
 
587
        d (fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
576
588
 
577
589
lose:
578
590
        result = CAMEL_AUTHENTICATION_ERROR;
689
701
                        g_set_error (
690
702
                                error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
691
703
                                _("Cannot send message: "
692
 
                                  "one or more invalid recipients"));
 
704
                                "one or more invalid recipients"));
693
705
                        camel_operation_pop_message (cancellable);
694
706
                        smtp_transport->need_rset = TRUE;
695
707
                        return FALSE;
855
867
        const guchar *start, *end;
856
868
        GHashTable *table = NULL;
857
869
 
 
870
        start = buffer;
 
871
 
 
872
        /* make sure there is at least one delimiter
 
873
         * character in the AUTH response */
 
874
        if (!isspace ((gint) *start) && *start != '=')
 
875
                return NULL;
 
876
 
858
877
        /* advance to the first token */
859
 
        start = buffer;
860
878
        while (isspace ((gint) *start) || *start == '=')
861
879
                start++;
862
880
 
1109
1127
 
1110
1128
        token = (transport->flags & CAMEL_SMTP_TRANSPORT_IS_ESMTP) ? "EHLO" : "HELO";
1111
1129
        if (numeric)
1112
 
                cmdbuf = g_strdup_printf("%s [%s%s]\r\n", token, numeric, name);
 
1130
                cmdbuf = g_strdup_printf ("%s [%s%s]\r\n", token, numeric, name);
1113
1131
        else
1114
 
                cmdbuf = g_strdup_printf("%s %s\r\n", token, name);
 
1132
                cmdbuf = g_strdup_printf ("%s %s\r\n", token, name);
1115
1133
        g_free (name);
1116
1134
 
1117
 
        d(fprintf (stderr, "sending : %s", cmdbuf));
 
1135
        d (fprintf (stderr, "sending : %s", cmdbuf));
1118
1136
        if (camel_stream_write_string (
1119
1137
                transport->ostream, cmdbuf, cancellable, error) == -1) {
1120
1138
                g_free (cmdbuf);
1180
1198
                                                transport->flags &= ~CAMEL_SMTP_TRANSPORT_AUTH_EQUAL;
1181
1199
 
1182
1200
                                        /* parse for supported AUTH types */
1183
 
                                        token += 5;
 
1201
                                        token += 4;
1184
1202
 
1185
1203
                                        if (transport->authtypes) {
1186
1204
                                                g_hash_table_foreach (transport->authtypes, authtypes_free, NULL);
1214
1232
        else
1215
1233
                cmdbuf = g_strdup_printf ("MAIL FROM:<%s>\r\n", sender);
1216
1234
 
1217
 
        d(fprintf (stderr, "sending : %s", cmdbuf));
 
1235
        d (fprintf (stderr, "sending : %s", cmdbuf));
1218
1236
 
1219
1237
        if (camel_stream_write_string (
1220
1238
                transport->ostream, cmdbuf, cancellable, error) == -1) {
1266
1284
 
1267
1285
        cmdbuf = g_strdup_printf ("RCPT TO:<%s>\r\n", recipient);
1268
1286
 
1269
 
        d(fprintf (stderr, "sending : %s", cmdbuf));
 
1287
        d (fprintf (stderr, "sending : %s", cmdbuf));
1270
1288
 
1271
1289
        if (camel_stream_write_string (
1272
1290
                transport->ostream, cmdbuf, cancellable, error) == -1) {
1331
1349
        /* Changes the encoding of all mime parts to fit within our required
1332
1350
         * encoding type and also force any text parts with long lines (longer
1333
1351
         * than 998 octets) to wrap by QP or base64 encoding them. */
1334
 
        camel_mime_message_set_best_encoding (message, CAMEL_BESTENC_GET_ENCODING, enctype);
 
1352
        camel_mime_message_set_best_encoding (
 
1353
                message, CAMEL_BESTENC_GET_ENCODING, enctype);
1335
1354
 
1336
1355
        cmdbuf = g_strdup ("DATA\r\n");
1337
1356
 
1338
 
        d(fprintf (stderr, "sending : %s", cmdbuf));
 
1357
        d (fprintf (stderr, "sending : %s", cmdbuf));
1339
1358
 
1340
1359
        if (camel_stream_write_string (
1341
1360
                transport->ostream, cmdbuf, cancellable, error) == -1) {
1436
1455
 
1437
1456
        /* terminate the message body */
1438
1457
 
1439
 
        d(fprintf (stderr, "sending : \\r\\n.\\r\\n\n"));
 
1458
        d (fprintf (stderr, "sending : \\r\\n.\\r\\n\n"));
1440
1459
 
1441
1460
        if (camel_stream_write (
1442
1461
                transport->ostream, "\r\n.\r\n", 5,
1484
1503
 
1485
1504
        cmdbuf = g_strdup ("RSET\r\n");
1486
1505
 
1487
 
        d(fprintf (stderr, "sending : %s", cmdbuf));
 
1506
        d (fprintf (stderr, "sending : %s", cmdbuf));
1488
1507
 
1489
1508
        if (camel_stream_write_string (
1490
1509
                transport->ostream, cmdbuf, cancellable, error) == -1) {
1533
1552
 
1534
1553
        cmdbuf = g_strdup ("QUIT\r\n");
1535
1554
 
1536
 
        d(fprintf (stderr, "sending : %s", cmdbuf));
 
1555
        d (fprintf (stderr, "sending : %s", cmdbuf));
1537
1556
 
1538
1557
        if (camel_stream_write_string (
1539
1558
                transport->ostream, cmdbuf, cancellable, error) == -1) {
1550
1569
                        CAMEL_STREAM_BUFFER (transport->istream),
1551
1570
                        cancellable, error);
1552
1571
 
1553
 
                d(fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
 
1572
                d (fprintf (stderr, "received: %s\n", respbuf ? respbuf : "(null)"));
1554
1573
                if (respbuf == NULL) {
1555
1574
                        g_prefix_error (error, _("QUIT command failed: "));
1556
1575
                        transport->connected = FALSE;