cutelyst  3.9.1
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
validator.cpp
1 /*
2  * SPDX-FileCopyrightText: (C) 2017-2022 Matthias Fehring <mf@huessenbergnetz.de>
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 
6 #include "validator_p.h"
7 
8 #include <Cutelyst/application.h>
9 #include <Cutelyst/context.h>
10 #include <Cutelyst/request.h>
11 
12 #include <QLoggingCategory>
13 
14 using namespace Cutelyst;
15 
16 Q_LOGGING_CATEGORY(C_VALIDATOR, "cutelyst.utils.validator", QtWarningMsg)
17 
18 Validator::Validator(QLatin1String translationContext)
19  : d_ptr(new ValidatorPrivate(translationContext))
20 {
21 }
22 
23 #ifdef Q_COMPILER_INITIALIZER_LISTS
24 Validator::Validator(std::initializer_list<ValidatorRule *> validators,
25  QLatin1String translationContext)
26  : d_ptr(new ValidatorPrivate(validators, translationContext))
27 {
28 }
29 #endif
30 
32 {
33 }
34 
36 {
37  Q_D(Validator);
38  d->params.clear();
39  if (!d->validators.empty()) {
40  qDeleteAll(d->validators.begin(), d->validators.end());
41  d->validators.clear();
42  }
43 }
44 
45 Cutelyst::ValidatorResult Validator::validate(Context *c, ValidatorFlags flags) const
46 {
47  ValidatorResult result;
48 
49  Q_ASSERT(c);
50 
51  ParamsMultiMap params;
52  if (flags.testFlag(BodyParamsOnly)) {
53  params = c->req()->bodyParameters();
54  } else if (flags.testFlag(QueryParamsOnly)) {
55  params = c->req()->queryParameters();
56  } else {
57  params = c->req()->queryParameters();
58  params.unite(c->req()->bodyParameters());
59  }
60 
61  result = validate(c, params, flags);
62 
63  return result;
64 }
65 
67  Validator::validate(Context *c, const ParamsMultiMap &params, ValidatorFlags flags) const
68 {
69  ValidatorResult result;
70 
71  Q_ASSERT(c);
72  Q_D(const Validator);
73 
74  if (d->validators.empty()) {
75  qCWarning(C_VALIDATOR) << "Validation started with empty validator list.";
76  return result;
77  }
78 
79  if (params.empty()) {
80  qCWarning(C_VALIDATOR) << "Validation started with empty parameters.";
81  }
82 
83  const bool stopOnFirstError = flags.testFlag(StopOnFirstError);
84  const bool noTrimming = flags.testFlag(NoTrimming);
85 
86  for (ValidatorRule *v : d->validators) {
87 
88  if (noTrimming) {
89  v->setTrimBefore(false);
90  }
91 
92  const ValidatorReturnType singleResult = v->validate(c, params);
93 
94  if (singleResult.extra.isValid()) {
95  result.addExtra(v->field(), singleResult.extra);
96  }
97 
98  if (singleResult) {
99  result.addValue(v->field(), singleResult.value);
100  } else {
101  result.addError(v->field(), singleResult.errorMessage);
102  if (stopOnFirstError) {
103  break;
104  }
105  }
106  }
107 
108  if (!result && flags.testFlag(FillStashOnError)) {
109  c->setStash(QStringLiteral("validationErrorStrings"), result.errorStrings());
110  c->setStash(QStringLiteral("validationErrors"), QVariant::fromValue(result.errors()));
111 
112  if (!params.isEmpty()) {
113  auto i = params.constBegin();
114  while (i != params.constEnd()) {
115  if (!i.key().contains(QStringLiteral("password"), Qt::CaseInsensitive)) {
116  c->setStash(i.key(), i.value());
117  }
118  ++i;
119  }
120  }
121  }
122 
123  return result;
124 }
125 
127 {
128  Q_D(Validator);
129  v->setTranslationContext(d->translationContext);
130  d->validators.push_back(v);
131 }
132 
134 {
135  app->loadTranslations(QStringLiteral("plugin_utils_validator"));
136 }
ValidatorResult validate(Context *c, ValidatorFlags flags=NoSpecialBehavior) const
Starts the validation process on Context c and returns a ValidatorResult.
Definition: validator.cpp:45
const_iterator constEnd() const const
QVariant fromValue(T &&value)
Validator(QLatin1String translationContext=QLatin1String())
Constructs a new Validator.
Definition: validator.cpp:18
bool isEmpty() const const
void setStash(const QString &key, const QVariant &value)
Definition: context.cpp:217
void loadTranslations(const QString &filename, const QString &directory=QString(), const QString &prefix=QString(), const QString &suffix=QString())
const_iterator constBegin() const const
ParamsMultiMap bodyParameters() const
Definition: request.cpp:216
The Cutelyst Context.
Definition: context.h:38
QHash< QString, QStringList > errors() const
Returns a dictionary containing fields with errors.
QStringList errorStrings() const
Returns a list of all error messages.
CaseInsensitive
The Cutelyst namespace holds all public Cutelyst API.
Definition: Mainpage.dox:7
Base class for all validator rules.
Validation processor for input data
Definition: validator.h:282
void addError(const QString &field, const QString &message)
Adds new error information to the internal QHash.
bool empty() const const
void addValue(const QString &field, const QVariant &value)
Adds a new value extracted from the specified input field.
virtual ValidatorReturnType validate(Context *c, const ParamsMultiMap &params) const =0
Starts the validation and returns the result.
ParamsMultiMap queryParameters() const
Definition: request.cpp:252
void clear()
Clears all internal data.
Definition: validator.cpp:35
void addValidator(ValidatorRule *v)
Adds a new validator to the list of validators.
Definition: validator.cpp:126
static void loadTranslations(Application *app)
Loads the translations for the plugin.
Definition: validator.cpp:133
QString field() const
Returns the name of the field to validate.
bool isValid() const const
The Cutelyst Application.
Definition: application.h:42
Contains the result of a single input parameter validation.
Definition: validatorrule.h:49
Provides information about performed validations.
void addExtra(const QString &field, const QVariant &extra)
Adds new extra data that came up when validating the input field.
QMultiMap< Key, T > & unite(QMultiMap< Key, T > &&other)
~Validator()
Desconstructs the Validator and all added ValidatorRule objects.
Definition: validator.cpp:31