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);
QString validationError(Context *c, const QVariant &errorData=QVariant()) const
Returns a descriptive error message if validation failed.
Stores custom error messages and the input field label.
~ValidatorIp() override
Deconstructs the ip validator.
QString translate(const char *context, const char *sourceText, const char *disambiguation=nullptr, int n=-1) const
The Cutelyst namespace holds all public Cutelyst API.
Base class for all validator rules.
ValidatorIp(const QString &field, Constraints constraints=NoConstraint, const ValidatorMessages &messages=ValidatorMessages(), const QString &defValKey=QString())
Constructs a new ip validator.
QString label(Context *c) const
Returns the human readable field label used for generic error messages.
QString value(const ParamsMultiMap ¶ms) const
Returns the value of the field from the input params.
static bool validate(const QString &value, Constraints constraints=NoConstraint)
Returns true if value is a valid IP address within the constraints.
QString field() const
Returns the name of the field to validate.
Contains the result of a single input parameter validation.
Checks if the field value is a valid IP address.
void defaultValue(Context *c, ValidatorReturnType *result, const char *validatorName) const
I a defValKey has been set in the constructor, this will try to get the default value from the stash ...
QString genericValidationError(Context *c, const QVariant &errorData=QVariant()) const override
Returns a generic error message if validation failed.