diff options
| author | manuel <manuel@mausz.at> | 2019-12-02 18:58:13 +0100 |
|---|---|---|
| committer | manuel <manuel@mausz.at> | 2019-12-02 18:58:13 +0100 |
| commit | f2ef25deb1aa356d41cdd3f6e46d9a68c48bfce0 (patch) | |
| tree | 62d116f4da1d9bb772db2b5190deb4db489cd436 | |
| parent | c8dcce86c04f318de89fa0701962d7c33964726d (diff) | |
| download | qmail-f2ef25deb1aa356d41cdd3f6e46d9a68c48bfce0.tar.gz qmail-f2ef25deb1aa356d41cdd3f6e46d9a68c48bfce0.tar.bz2 qmail-f2ef25deb1aa356d41cdd3f6e46d9a68c48bfce0.zip | |
Rewrite 554 smtp code for web.de/gmx.net/1&1 servers
| -rw-r--r-- | qmail-remote.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/qmail-remote.c b/qmail-remote.c index 0e2377e..ee1906c 100644 --- a/qmail-remote.c +++ b/qmail-remote.c | |||
| @@ -387,7 +387,7 @@ void tls_quit(const char *s1, const char *s2) | |||
| 387 | } | 387 | } |
| 388 | # define tls_quit_error(s) tls_quit(s, ssl_error()) | 388 | # define tls_quit_error(s) tls_quit(s, ssl_error()) |
| 389 | 389 | ||
| 390 | int match_partner(const char *s, int len) | 390 | static int match_partner(const char *s, int len) |
| 391 | { | 391 | { |
| 392 | if (!case_diffb(partner_fqdn, len, s) && !partner_fqdn[len]) return 1; | 392 | if (!case_diffb(partner_fqdn, len, s) && !partner_fqdn[len]) return 1; |
| 393 | /* we also match if the name is *.domainname */ | 393 | /* we also match if the name is *.domainname */ |
| @@ -398,6 +398,14 @@ int match_partner(const char *s, int len) | |||
| 398 | return 0; | 398 | return 0; |
| 399 | } | 399 | } |
| 400 | 400 | ||
| 401 | static int match_suffix(const char *s, const char *suffix) | ||
| 402 | { | ||
| 403 | int diff_len = str_len(s) - str_len(suffix); | ||
| 404 | if (diff_len >= 0 && !case_diffb(suffix, str_len(suffix), s + diff_len)) | ||
| 405 | return 1; | ||
| 406 | return 0; | ||
| 407 | } | ||
| 408 | |||
| 401 | /* don't want to fail handshake if certificate can't be verified */ | 409 | /* don't want to fail handshake if certificate can't be verified */ |
| 402 | int verify_cb(int preverify_ok, X509_STORE_CTX *ctx) { return 1; } | 410 | int verify_cb(int preverify_ok, X509_STORE_CTX *ctx) { return 1; } |
| 403 | 411 | ||
| @@ -765,6 +773,14 @@ void smtp() | |||
| 765 | #endif | 773 | #endif |
| 766 | 774 | ||
| 767 | code = smtpcode(); | 775 | code = smtpcode(); |
| 776 | #ifdef TLS | ||
| 777 | if (code == 554 && partner_fqdn != NULL && ( | ||
| 778 | match_suffix(partner_fqdn, "web.de") || | ||
| 779 | match_suffix(partner_fqdn, "gmx.net") || | ||
| 780 | match_suffix(partner_fqdn, "kundenserver.de"))) { | ||
| 781 | code = 454; /* 4xx, does not really matter */ | ||
| 782 | } | ||
| 783 | #endif | ||
| 768 | if (code >= 500 && code < 600) quit("DConnected to "," but greeting failed"); | 784 | if (code >= 500 && code < 600) quit("DConnected to "," but greeting failed"); |
| 769 | if (code >= 400 && code < 500) return; /* try next MX, see RFC-2821 */ | 785 | if (code >= 400 && code < 500) return; /* try next MX, see RFC-2821 */ |
| 770 | if (code != 220) quit("ZConnected to "," but greeting failed"); | 786 | if (code != 220) quit("ZConnected to "," but greeting failed"); |
