19 #include "validatorip_p.h"
20 #include <QHostAddress>
21 #include <QRegularExpression>
27 ValidatorRule(*new ValidatorIpPrivate(field, constraints, messages, defValKey))
41 const QString v =
value(params);
46 result.
value.setValue<QString>(v);
49 qCDebug(C_VALIDATOR,
"ValidatorIp: Validation failed for field %s at %s::%s: not a valid IP address within the constraints.", qPrintable(
field()), qPrintable(c->controllerName()), qPrintable(c->actionName()));
64 if (!
value.contains(QLatin1Char(
':')) && !
value.contains(QRegularExpression(QStringLiteral(
"^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$")))) {
71 static const std::vector<std::pair<QHostAddress,int>> ipv4Private({
74 {QHostAddress(QStringLiteral(
"10.0.0.0")), 8},
79 {QHostAddress(QStringLiteral(
"169.254.0.0")), 16},
83 {QHostAddress(QStringLiteral(
"172.16.0.0")), 12},
87 {QHostAddress(QStringLiteral(
"192.168.0.0")), 12}
91 static const std::vector<std::pair<QHostAddress,int>> ipv4Reserved({
94 {QHostAddress(QStringLiteral(
"0.0.0.0")), 8},
98 {QHostAddress(QStringLiteral(
"100.64.0.0")), 10},
102 {QHostAddress(QStringLiteral(
"127.0.0.1")), 8},
106 {QHostAddress(QStringLiteral(
"192.0.0.0")), 24},
110 {QHostAddress(QStringLiteral(
"192.0.2.0")), 24},
114 {QHostAddress(QStringLiteral(
"192.88.99.0")), 24},
118 {QHostAddress(QStringLiteral(
"198.18.0.0")), 15},
122 {QHostAddress(QStringLiteral(
"198.51.100.0")), 24},
126 {QHostAddress(QStringLiteral(
"203.0.113.0")), 24},
130 {QHostAddress(QStringLiteral(
"240.0.0.0")), 4},
134 {QHostAddress(QStringLiteral(
"255.255.255.255")), 32}
139 static const std::vector<std::pair<QHostAddress,int>> ipv6Private({
141 {QHostAddress(QStringLiteral(
"fc00::")), 7},
144 {QHostAddress(QStringLiteral(
"fe80::")), 10}
148 static const std::vector<std::pair<QHostAddress,int>> ipv6Reserved({
150 {QHostAddress(QStringLiteral(
"::")), 128},
153 {QHostAddress(QStringLiteral(
"::1")), 128},
156 {QHostAddress(QStringLiteral(
"::ffff:0:0")), 96},
160 {QHostAddress(QStringLiteral(
"100::")), 64},
164 {QHostAddress(QStringLiteral(
"64:ff9b::")), 96},
167 {QHostAddress(QStringLiteral(
"2001::")), 32},
170 {QHostAddress(QStringLiteral(
"2001:10::")), 28},
173 {QHostAddress(QStringLiteral(
"2001:20::")), 28},
176 {QHostAddress(QStringLiteral(
"2001:db8::")), 32},
179 {QHostAddress(QStringLiteral(
"2002::")), 16}
184 if (a.setAddress(
value)) {
188 if (a.protocol() == QAbstractSocket::IPv4Protocol) {
190 if (constraints.testFlag(
IPv6Only)) {
196 for (
const std::pair<QHostAddress,int> &subnet : ipv4Private) {
197 if (a.isInSubnet(subnet.first, subnet.second)) {
206 for (
const std::pair<QHostAddress,int> &subnet : ipv4Reserved) {
207 if (a.isInSubnet(subnet.first, subnet.second)) {
215 if (a.isInSubnet(QHostAddress(QStringLiteral(
"224.0.0.0")), 4)) {
222 if (constraints.testFlag(
IPv4Only)) {
228 for (
const std::pair<QHostAddress,int> &subnet : ipv6Private) {
229 if (a.isInSubnet(subnet.first, subnet.second)) {
238 for (
const std::pair<QHostAddress,int> &subnet : ipv6Reserved) {
239 if (a.isInSubnet(subnet.first, subnet.second)) {
247 if (a.isInSubnet(QHostAddress(QStringLiteral(
"ff00::")), 8)) {
266 const QString _label =
label(c);
267 if (_label.isEmpty()) {
268 error = c->
translate(
"Cutelyst::ValidatorIp",
"IP address is invalid or not acceptable.");
271 error = c->
translate(
"Cutelyst::ValidatorIp",
"The IP address in the “%1” field is invalid or not acceptable.").arg(_label);