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
14using namespace Cutelyst;
15
16Q_LOGGING_CATEGORY(C_VALIDATOR, "cutelyst.utils.validator", QtWarningMsg)
17
18Validator::Validator(QLatin1String translationContext)
19 : d_ptr(new ValidatorPrivate(translationContext))
20{
21}
22
23#ifdef Q_COMPILER_INITIALIZER_LISTS
24Validator::Validator(std::initializer_list<ValidatorRule *> validators,
25 QLatin1String translationContext)
26 : d_ptr(new ValidatorPrivate(validators, translationContext))
27{
28}
29#endif
30
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
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}
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:217
ParamsMultiMap bodyParameters() const
Definition request.cpp:216
ParamsMultiMap queryParameters() const
Definition request.cpp:252
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.
ValidatorResult validate(Context *c, ValidatorFlags flags=NoSpecialBehavior) const
Starts the validation process on Context c and returns a ValidatorResult.
Definition validator.cpp:45
~Validator()
Desconstructs the Validator and all added ValidatorRule objects.
Definition validator.cpp:31
Validator(QLatin1String translationContext=QLatin1String())
Constructs a new Validator.
Definition validator.cpp:18
void addValidator(ValidatorRule *v)
Adds a new validator to the list of validators.
static void loadTranslations(Application *app)
Loads the translations for the plugin.
void clear()
Clears all internal data.
Definition validator.cpp:35
The Cutelyst namespace holds all public Cutelyst API.
Definition Mainpage.dox:8
QMultiMap< QString, QString > ParamsMultiMap
QMultiMap< Key, T > & unite(const QMultiMap< Key, T > &other)
CaseInsensitive
QVariant fromValue(const T &value)
bool isValid() const const
Contains the result of a single input parameter validation.