util/HostMatch.h
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | #include <QRegularExpression> | ||
| 3 | #include <QUrl> | ||
| 4 | |||
| 5 | namespace HostMatch { | ||
| 6 | 1223 | inline QString canonicalName(const QString &name) { | |
| 7 |
1/1✓ Branch 2 → 3 taken 1223 times.
|
1223 | QString value = name.trimmed(); |
| 8 |
4/4✓ Branch 5 → 6 taken 1223 times.
✓ Branch 6 → 7 taken 2 times.
✓ Branch 6 → 8 taken 1221 times.
✓ Branch 7 → 8 taken 2 times.
|
1223 | if (value.endsWith(QLatin1Char('.'))) value.chop(1); |
| 9 |
3/3✓ Branch 9 → 10 taken 1223 times.
✓ Branch 10 → 11 taken 1223 times.
✓ Branch 11 → 12 taken 1223 times.
|
1223 | const QString ace = QString::fromLatin1(QUrl::toAce(value)).toLower(); |
| 10 | 36 | static const QRegularExpression valid(QStringLiteral( | |
| 11 |
4/7✓ Branch 14 → 15 taken 18 times.
✓ Branch 14 → 27 taken 1205 times.
✓ Branch 16 → 17 taken 18 times.
✗ Branch 16 → 27 not taken.
✓ Branch 21 → 22 taken 18 times.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 60 not taken.
|
1302 | "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$")); |
| 12 |
6/10✓ Branch 28 → 29 taken 1223 times.
✗ Branch 28 → 34 not taken.
✓ Branch 30 → 31 taken 1223 times.
✓ Branch 31 → 32 taken 1223 times.
✓ Branch 32 → 33 taken 1128 times.
✓ Branch 32 → 34 taken 95 times.
✓ Branch 36 → 37 taken 1223 times.
✗ Branch 36 → 38 not taken.
✗ Branch 61 → 62 not taken.
✗ Branch 61 → 63 not taken.
|
4892 | return ace.size() <= 253 && valid.match(ace).hasMatch() ? ace : QString(); |
| 13 | 1223 | } | |
| 14 | |||
| 15 | 404 | inline bool isHostOrSubdomain(const QString &host, const QString &domain) { | |
| 16 |
2/2✓ Branch 2 → 3 taken 404 times.
✓ Branch 3 → 4 taken 404 times.
|
404 | const QString candidate = canonicalName(host), expected = canonicalName(domain); |
| 17 |
5/6✓ Branch 5 → 6 taken 404 times.
✗ Branch 5 → 8 not taken.
✓ Branch 7 → 8 taken 1 time.
✓ Branch 7 → 9 taken 403 times.
✓ Branch 10 → 11 taken 1 time.
✓ Branch 10 → 12 taken 403 times.
|
404 | if (candidate.isEmpty() || expected.isEmpty()) return false; |
| 18 |
2/2✓ Branch 13 → 14 taken 23 times.
✓ Branch 13 → 15 taken 380 times.
|
403 | if (candidate == expected) return true; |
| 19 |
4/7✓ Branch 15 → 16 taken 10 times.
✓ Branch 15 → 28 taken 370 times.
✓ Branch 17 → 18 taken 10 times.
✗ Branch 17 → 28 not taken.
✓ Branch 22 → 23 taken 10 times.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 58 not taken.
|
390 | static const QRegularExpression numeric(QStringLiteral("^[0-9.]+$")); |
| 20 |
11/16✓ Branch 29 → 30 taken 380 times.
✓ Branch 30 → 31 taken 380 times.
✓ Branch 31 → 32 taken 379 times.
✓ Branch 31 → 38 taken 1 time.
✓ Branch 34 → 35 taken 379 times.
✓ Branch 35 → 36 taken 379 times.
✓ Branch 36 → 37 taken 15 times.
✓ Branch 36 → 38 taken 364 times.
✓ Branch 40 → 41 taken 379 times.
✓ Branch 40 → 42 taken 1 time.
✓ Branch 42 → 43 taken 380 times.
✗ Branch 42 → 44 not taken.
✗ Branch 59 → 60 not taken.
✗ Branch 59 → 61 not taken.
✗ Branch 65 → 66 not taken.
✗ Branch 65 → 67 not taken.
|
380 | return !numeric.match(expected).hasMatch() && candidate.endsWith(QLatin1Char('.') + expected); |
| 21 | 404 | } | |
| 22 | |||
| 23 | 641 | inline bool isSafeMeetingUrl(const QUrl &url) { | |
| 24 |
11/16✓ Branch 5 → 6 taken 61 times.
✓ Branch 7 → 8 taken 56 times.
✓ Branch 7 → 21 taken 5 times.
✓ Branch 9 → 10 taken 56 times.
✓ Branch 11 → 12 taken 53 times.
✓ Branch 11 → 21 taken 3 times.
✓ Branch 16 → 17 taken 53 times.
✗ Branch 16 → 21 not taken.
✓ Branch 31 → 32 taken 61 times.
✓ Branch 31 → 33 taken 580 times.
✓ Branch 33 → 34 taken 588 times.
✓ Branch 33 → 35 taken 53 times.
✗ Branch 74 → 75 not taken.
✗ Branch 74 → 76 not taken.
✗ Branch 79 → 80 not taken.
✗ Branch 79 → 81 not taken.
|
811 | if (!url.isValid() || url.scheme() != QLatin1String("https") || !url.userInfo().isEmpty() || |
| 25 |
15/22✓ Branch 2 → 3 taken 641 times.
✓ Branch 3 → 4 taken 61 times.
✓ Branch 3 → 21 taken 580 times.
✓ Branch 13 → 14 taken 53 times.
✓ Branch 14 → 15 taken 53 times.
✓ Branch 18 → 19 taken 53 times.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 53 times.
✓ Branch 23 → 24 taken 53 times.
✓ Branch 23 → 25 taken 588 times.
✓ Branch 25 → 26 taken 53 times.
✓ Branch 25 → 27 taken 588 times.
✓ Branch 27 → 28 taken 53 times.
✓ Branch 27 → 29 taken 588 times.
✓ Branch 29 → 30 taken 56 times.
✓ Branch 29 → 31 taken 585 times.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 62 not taken.
✗ Branch 65 → 66 not taken.
✗ Branch 65 → 67 not taken.
✗ Branch 69 → 70 not taken.
✗ Branch 69 → 71 not taken.
|
1343 | canonicalName(url.host()).isEmpty() || url.toEncoded().size() > 4096) return false; |
| 26 |
2/2✓ Branch 36 → 37 taken 53 times.
✓ Branch 37 → 38 taken 53 times.
|
53 | const auto decoded = QUrl::fromPercentEncoding(url.toEncoded()); |
| 27 |
2/2✓ Branch 54 → 41 taken 1850 times.
✓ Branch 54 → 55 taken 53 times.
|
1903 | for (const QChar ch : decoded) |
| 28 |
4/8✓ Branch 42 → 43 taken 1850 times.
✗ Branch 42 → 49 not taken.
✓ Branch 44 → 45 taken 1850 times.
✗ Branch 44 → 49 not taken.
✗ Branch 48 → 49 not taken.
✓ Branch 48 → 50 taken 1850 times.
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 1850 times.
|
1850 | if (ch.unicode() < 0x20 || ch.unicode() == 0x7f || ch == QLatin1Char('\\')) return false; |
| 29 | 53 | return true; | |
| 30 | 53 | } | |
| 31 | 489 | inline bool isKnownMeetingUrl(const QUrl &url) { | |
| 32 |
2/2✓ Branch 3 → 4 taken 441 times.
✓ Branch 3 → 5 taken 48 times.
|
489 | if (!isSafeMeetingUrl(url)) return false; |
| 33 | static const QStringList domains{"meet.google.com", "teams.microsoft.com", "teams.live.com", | ||
| 34 |
5/10✓ Branch 5 → 6 taken 7 times.
✓ Branch 5 → 24 taken 41 times.
✓ Branch 7 → 8 taken 7 times.
✗ Branch 7 → 24 not taken.
✓ Branch 21 → 22 taken 63 times.
✓ Branch 21 → 23 taken 7 times.
✗ Branch 40 → 41 not taken.
✗ Branch 40 → 42 not taken.
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 51 not taken.
|
118 | "zoom.us", "webex.com", "whereby.com", "meet.jit.si", "gotomeeting.com", "chime.aws"}; |
| 35 |
2/2✓ Branch 35 → 26 taken 287 times.
✓ Branch 35 → 36 taken 23 times.
|
310 | for (const QString &domain : domains) |
| 36 |
4/4✓ Branch 28 → 29 taken 287 times.
✓ Branch 29 → 30 taken 287 times.
✓ Branch 31 → 32 taken 25 times.
✓ Branch 31 → 33 taken 262 times.
|
287 | if (isHostOrSubdomain(url.host(), domain)) return true; |
| 37 | 23 | return false; | |
| 38 | 7 | } | |
| 39 | } // namespace HostMatch | ||
| 40 |