6#include "validatorip_p.h"
10#include <QHostAddress>
13using namespace Qt::Literals::StringLiterals;
15const QRegularExpression ValidatorIpPrivate::regex{
16 u
"^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$"_s};
19 Constraints constraints,
21 const QString &defValKey)
22 :
ValidatorRule(*new ValidatorIpPrivate(field, constraints, messages, defValKey))
34 const QString v =
value(params);
39 result.
value.setValue(v);
42 qCDebug(C_VALIDATOR).noquote() <<
"Not a valid IP address";
63 if (!
value.contains(QLatin1Char(
':')) && !
value.contains(ValidatorIpPrivate::regex)) {
70 static const std::vector<std::pair<QHostAddress, int>> ipv4Private(
73 {QHostAddress(QStringLiteral(
"10.0.0.0")), 8},
78 {QHostAddress(QStringLiteral(
"169.254.0.0")), 16},
82 {QHostAddress(QStringLiteral(
"172.16.0.0")), 12},
86 {QHostAddress(QStringLiteral(
"192.168.0.0")), 12}});
89 static const std::vector<std::pair<QHostAddress, int>> ipv4Reserved(
92 {QHostAddress(QStringLiteral(
"0.0.0.0")), 8},
96 {QHostAddress(QStringLiteral(
"100.64.0.0")), 10},
100 {QHostAddress(QStringLiteral(
"127.0.0.1")), 8},
104 {QHostAddress(QStringLiteral(
"192.0.0.0")), 24},
108 {QHostAddress(QStringLiteral(
"192.0.2.0")), 24},
112 {QHostAddress(QStringLiteral(
"192.88.99.0")), 24},
116 {QHostAddress(QStringLiteral(
"198.18.0.0")), 15},
120 {QHostAddress(QStringLiteral(
"198.51.100.0")), 24},
124 {QHostAddress(QStringLiteral(
"203.0.113.0")), 24},
128 {QHostAddress(QStringLiteral(
"240.0.0.0")), 4},
132 {QHostAddress(QStringLiteral(
"255.255.255.255")), 32}});
135 static const std::vector<std::pair<QHostAddress, int>> ipv6Private(
137 {QHostAddress(QStringLiteral(
"fc00::")), 7},
140 {QHostAddress(QStringLiteral(
"fe80::")), 10}});
143 static const std::vector<std::pair<QHostAddress, int>> ipv6Reserved(
145 {QHostAddress(QStringLiteral(
"::")), 128},
148 {QHostAddress(QStringLiteral(
"::1")), 128},
151 {QHostAddress(QStringLiteral(
"::ffff:0:0")), 96},
155 {QHostAddress(QStringLiteral(
"100::")), 64},
159 {QHostAddress(QStringLiteral(
"64:ff9b::")), 96},
162 {QHostAddress(QStringLiteral(
"2001::")), 32},
165 {QHostAddress(QStringLiteral(
"2001:10::")), 28},
168 {QHostAddress(QStringLiteral(
"2001:20::")), 28},
171 {QHostAddress(QStringLiteral(
"2001:db8::")), 32},
174 {QHostAddress(QStringLiteral(
"2002::")), 16}});
178 if (a.setAddress(
value)) {
182 if (a.protocol() == QAbstractSocket::IPv4Protocol) {
184 if (constraints.testFlag(
IPv6Only)) {
189 valid = !std::ranges::any_of(
190 ipv4Private, [&a](
const std::pair<QHostAddress, int> &subnet) {
191 return a.isInSubnet(subnet.first, subnet.second);
196 valid = !std::ranges::any_of(
197 ipv4Reserved, [&a](
const std::pair<QHostAddress, int> &subnet) {
198 return a.isInSubnet(subnet.first, subnet.second);
203 if (a.isInSubnet(QHostAddress(QStringLiteral(
"224.0.0.0")), 4)) {
210 if (constraints.testFlag(
IPv4Only)) {
215 valid = !std::ranges::any_of(
216 ipv6Private, [&a](
const std::pair<QHostAddress, int> &subnet) {
217 return a.isInSubnet(subnet.first, subnet.second);
222 valid = !std::ranges::any_of(
223 ipv6Reserved, [&a](
const std::pair<QHostAddress, int> &subnet) {
224 return a.isInSubnet(subnet.first, subnet.second);
229 if (a.isInSubnet(QHostAddress(QStringLiteral(
"ff00::")), 8)) {
247 const QString _label =
label(c);
248 if (_label.isEmpty()) {
250 return c->
qtTrId(
"cutelyst-valip-genvalerr");
254 return c->
qtTrId(
"cutelyst-valip-genvalerr-label").arg(_label);
QString qtTrId(const char *id, int n=-1) const
Checks if the field value is a valid IP address.
QString genericValidationError(Context *c, const QVariant &errorData=QVariant()) const override
ValidatorIp(const QString &field, Constraints constraints=NoConstraint, const ValidatorMessages &messages={}, const QString &defValKey={})
void validateCb(Context *c, const ParamsMultiMap ¶ms, ValidatorRtFn cb) const override
Base class for all validator rules.
QString validationError(Context *c, const QVariant &errorData={}) const
QString label(const Context *c) const
std::function< void(ValidatorReturnType &&result)> ValidatorRtFn
Void callback function for validator rules that processes the ValidatorReturnType.
void defaultValue(Context *c, ValidatorReturnType *result) const
QString value(const ParamsMultiMap ¶ms) const
QMultiMap< QString, QString > ParamsMultiMap
static bool validate(const QString &value, Constraints constraints=NoConstraint)
Returns true if value is a valid IP address within the constraints.
The Cutelyst namespace holds all public Cutelyst API.
Stores custom error messages and the input field label.
Contains the result of a single input parameter validation.