service/SmtpReplies.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "SmtpReplies.h" | ||
| 2 | |||
| 3 | namespace SmtpReplies { | ||
| 4 | |||
| 5 | 22 | EhloCapabilities parseEhlo(const QString &response) { | |
| 6 | 22 | EhloCapabilities capabilities; | |
| 7 |
1/1✓ Branch 4 → 5 taken 22 times.
|
22 | const auto lines = response.split('\n', Qt::SkipEmptyParts); |
| 8 | |||
| 9 |
2/2✓ Branch 122 → 7 taken 34 times.
✓ Branch 122 → 123 taken 22 times.
|
56 | for (QString line : lines) { |
| 10 |
1/1✓ Branch 9 → 10 taken 34 times.
|
34 | line = line.trimmed(); |
| 11 |
1/2✓ Branch 13 → 14 taken 34 times.
✗ Branch 13 → 38 not taken.
|
34 | if (line.length() >= 4) { |
| 12 | 34 | bool hasCode = false; | |
| 13 |
2/2✓ Branch 14 → 15 taken 34 times.
✓ Branch 15 → 16 taken 34 times.
|
34 | line.left(3).toInt(&hasCode); |
| 14 |
6/7✓ Branch 17 → 18 taken 33 times.
✓ Branch 17 → 29 taken 1 time.
✓ Branch 20 → 21 taken 33 times.
✓ Branch 22 → 23 taken 16 times.
✓ Branch 22 → 28 taken 17 times.
✓ Branch 27 → 28 taken 16 times.
✗ Branch 27 → 29 not taken.
|
50 | if (hasCode && (line[3] == QLatin1Char('-') || |
| 15 |
3/3✓ Branch 25 → 26 taken 16 times.
✓ Branch 30 → 31 taken 33 times.
✓ Branch 30 → 37 taken 1 time.
|
50 | line[3] == QLatin1Char(' '))) { |
| 16 |
2/2✓ Branch 31 → 32 taken 33 times.
✓ Branch 32 → 33 taken 33 times.
|
33 | line = line.mid(4).trimmed(); |
| 17 | } | ||
| 18 | } | ||
| 19 | |||
| 20 |
1/2✗ Branch 39 → 40 not taken.
✓ Branch 39 → 41 taken 34 times.
|
34 | if (line.isEmpty()) |
| 21 | ✗ | continue; | |
| 22 | |||
| 23 | 34 | const int spaceIndex = line.indexOf(QLatin1Char(' ')); | |
| 24 | 34 | const int equalsIndex = line.indexOf(QLatin1Char('=')); | |
| 25 | 34 | int delimiterIndex = -1; | |
| 26 |
3/4✓ Branch 47 → 48 taken 20 times.
✓ Branch 47 → 51 taken 14 times.
✗ Branch 48 → 49 not taken.
✓ Branch 48 → 51 taken 20 times.
|
34 | if (spaceIndex >= 0 && equalsIndex >= 0) { |
| 27 | ✗ | delimiterIndex = qMin(spaceIndex, equalsIndex); | |
| 28 | } else { | ||
| 29 | 34 | delimiterIndex = qMax(spaceIndex, equalsIndex); | |
| 30 | } | ||
| 31 | |||
| 32 |
3/3✓ Branch 53 → 54 taken 21 times.
✓ Branch 53 → 55 taken 13 times.
✓ Branch 54 → 56 taken 21 times.
|
68 | const QString key = (delimiterIndex >= 0 ? line.left(delimiterIndex) : line) |
| 33 |
1/1✓ Branch 56 → 57 taken 34 times.
|
68 | .trimmed() |
| 34 |
1/1✓ Branch 57 → 58 taken 34 times.
|
34 | .toUpper(); |
| 35 | const QString value = | ||
| 36 |
3/3✓ Branch 60 → 61 taken 21 times.
✓ Branch 60 → 62 taken 13 times.
✓ Branch 61 → 63 taken 21 times.
|
68 | (delimiterIndex >= 0 ? line.mid(delimiterIndex + 1) : QString()) |
| 37 |
1/1✓ Branch 63 → 64 taken 34 times.
|
68 | .trimmed() |
| 38 |
1/1✓ Branch 64 → 65 taken 34 times.
|
68 | .toUpper() |
| 39 |
1/1✓ Branch 65 → 66 taken 34 times.
|
34 | .simplified(); |
| 40 | |||
| 41 |
2/2✓ Branch 71 → 72 taken 1 time.
✓ Branch 71 → 73 taken 33 times.
|
34 | if (key == QLatin1String("STARTTLS")) { |
| 42 | 1 | capabilities.supportsStartTls = true; | |
| 43 | 1 | continue; | |
| 44 | } | ||
| 45 | |||
| 46 |
2/2✓ Branch 75 → 76 taken 9 times.
✓ Branch 75 → 88 taken 24 times.
|
33 | if (key == QLatin1String("SIZE")) { |
| 47 | 9 | bool valid = false; | |
| 48 |
2/2✓ Branch 79 → 80 taken 9 times.
✓ Branch 80 → 81 taken 9 times.
|
9 | const qint64 size = value.section(QLatin1Char(' '), 0, 0).toLongLong(&valid); |
| 49 | // A plausible range only (RFC 1870 allows 0 = no fixed maximum). | ||
| 50 |
5/6✓ Branch 82 → 83 taken 6 times.
✓ Branch 82 → 86 taken 3 times.
✓ Branch 83 → 84 taken 4 times.
✓ Branch 83 → 86 taken 2 times.
✓ Branch 84 → 85 taken 4 times.
✗ Branch 84 → 86 not taken.
|
9 | if (valid && size > 0 && size < (qint64(1) << 40)) capabilities.maximumMessageBytes = size; |
| 51 | 9 | continue; | |
| 52 | 9 | } | |
| 53 |
2/2✓ Branch 90 → 91 taken 11 times.
✓ Branch 90 → 106 taken 13 times.
|
24 | if (key == QLatin1String("AUTH")) { |
| 54 |
1/1✓ Branch 94 → 95 taken 11 times.
|
11 | const auto mechanisms = value.split(QLatin1Char(' '), Qt::SkipEmptyParts); |
| 55 |
2/2✓ Branch 103 → 97 taken 14 times.
✓ Branch 103 → 104 taken 11 times.
|
25 | for (const QString &mechanism : mechanisms) { |
| 56 |
1/2✓ Branch 99 → 100 taken 14 times.
✗ Branch 99 → 101 not taken.
|
14 | if (!capabilities.authMechanisms.contains(mechanism)) |
| 57 |
1/1✓ Branch 100 → 101 taken 14 times.
|
14 | capabilities.authMechanisms.append(mechanism); |
| 58 | } | ||
| 59 | 11 | } | |
| 60 | 54 | } | |
| 61 | |||
| 62 | 22 | return capabilities; | |
| 63 | 22 | } | |
| 64 | |||
| 65 | 7 | AuthMechanism selectAuthMechanism(const EhloCapabilities &capabilities) { | |
| 66 |
2/2✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 10 taken 5 times.
|
14 | if (capabilities.authMechanisms.contains(QStringLiteral("LOGIN"))) |
| 67 | 2 | return AuthMechanism::Login; | |
| 68 |
2/2✓ Branch 16 → 17 taken 3 times.
✓ Branch 16 → 18 taken 2 times.
|
10 | if (capabilities.authMechanisms.contains(QStringLiteral("PLAIN"))) |
| 69 | 3 | return AuthMechanism::Plain; | |
| 70 | 2 | return AuthMechanism::None; | |
| 71 | } | ||
| 72 | |||
| 73 | } // namespace SmtpReplies | ||
| 74 |