cutelyst  4.8.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-2023 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 using namespace Qt::Literals::StringLiterals;
16 
17 Q_LOGGING_CATEGORY(C_VALIDATOR, "cutelyst.utils.validator", QtWarningMsg)
18 
19 Validator::Validator(const char *translationContext)
20  : d_ptr(new ValidatorPrivate(translationContext))
21 {
22 }
23 
24 Validator::Validator(std::initializer_list<ValidatorRule *> validators,
25  const char *translationContext)
26  : d_ptr(new ValidatorPrivate(validators, translationContext))
27 {
28 }
29 
30 Validator::~Validator() = default;
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 
64  Validator::validate(Context *c, const ParamsMultiMap &params, ValidatorFlags flags) const
65 {
66  ValidatorResult result;
67 
68  Q_ASSERT(c);
69  Q_D(const Validator);
70 
71  if (d->validators.empty()) {
72  qCWarning(C_VALIDATOR) << "Validation started with empty validator list.";
73  return result;
74  }
75 
76  if (params.empty()) {
77  qCWarning(C_VALIDATOR) << "Validation started with empty parameters.";
78  }
79 
80  const bool stopOnFirstError = flags.testFlag(StopOnFirstError);
81  const bool noTrimming = flags.testFlag(NoTrimming);
82 
83  for (ValidatorRule *v : d->validators) {
84 
85  if (noTrimming) {
86  v->setTrimBefore(false);
87  }
88 
89  const ValidatorReturnType singleResult = v->validate(c, params);
90 
91  if (singleResult.extra.isValid()) {
92  result.addExtra(v->field(), singleResult.extra);
93  }
94 
95  if (singleResult) {
96  result.addValue(v->field(), singleResult.value);
97  } else {
98  result.addError(v->field(), singleResult.errorMessage);
99  if (stopOnFirstError) {
100  break;
101  }
102  }
103  }
104 
105  if (!result && flags.testFlag(FillStashOnError)) {
106  c->setStash(u"validationErrorStrings"_s, result.errorStrings());
107  c->setStash(u"validationErrors"_s, QVariant::fromValue(result.errors()));
108 
109  if (!params.isEmpty()) {
110  auto i = params.constBegin();
111  while (i != params.constEnd()) {
112  if (!i.key().contains(u"password"_s, Qt::CaseInsensitive)) {
113  c->setStash(i.key(), i.value());
114  }
115  ++i;
116  }
117  }
118  }
119 
120  return result;
121 }
122 
124 {
125  Q_D(Validator);
126  v->setTranslationContext(d->translationContext);
127  d->validators.push_back(v);
128 }
129 
131 {
132  app->loadTranslations(u"plugin_utils_validator"_s);
133 }
ValidatorResult validate(Context *c, ValidatorFlags flags=NoSpecialBehavior) const
Definition: validator.cpp:42
const_iterator constEnd() const const
QVariant fromValue(T &&value)
bool isEmpty() const const
Validator(const char *translationContext=nullptr)
Definition: validator.cpp:19
void setStash(const QString &key, const QVariant &value)
Definition: context.cpp:213
Request req
Definition: context.h:67
const_iterator constBegin() const const
ParamsMultiMap bodyParameters() const
Definition: request.cpp:220
QHash< QString, QStringList > errors() const noexcept
The Cutelyst Context.
Definition: context.h:42
QStringList errorStrings() const
CaseInsensitive
The Cutelyst namespace holds all public Cutelyst API.
Base class for all validator rules.
Validation processor for input data.
Definition: validator.h:273
void addError(const QString &field, const QString &message)
bool empty() const const
QString field() const noexcept
void addValue(const QString &field, const QVariant &value)
virtual ValidatorReturnType validate(Context *c, const ParamsMultiMap &params) const =0
ParamsMultiMap queryParameters() const
Definition: request.cpp:256
void addValidator(ValidatorRule *v)
Definition: validator.cpp:123
static void loadTranslations(Application *app)
Definition: validator.cpp:130
bool isValid() const const
The Cutelyst application.
Definition: application.h:72
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)
QMultiMap< Key, T > & unite(QMultiMap< Key, T > &&other)
void loadTranslations(const QString &filename, const QString &directory={}, const QString &prefix={}, const QString &suffix={})