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