8 #include <Cutelyst/Controller> 9 #include <Cutelyst/Dispatcher> 10 #include <Cutelyst/Plugins/Authentication/authentication.h> 131 return AroundExecute;
137 Q_UNUSED(application)
139 const auto attributes = args.value(u
"attributes"_s).value<
ParamsMultiMap>();
140 d->actionReverse = args.
value(u
"reverse"_s).toString();
142 if (!attributes.contains(u
"RequiresRole"_s) && !attributes.contains(u
"AllowedRole"_s)) {
143 qFatal(
"RoleACL: Action %s requires at least one RequiresRole or AllowedRole attribute",
144 qPrintable(d->actionReverse));
146 const QStringList required = attributes.values(u
"RequiresRole"_s);
147 for (
const QString &role : required) {
148 d->requiresRole.
append(role);
151 const QStringList allowed = attributes.values(u
"AllowedRole"_s);
152 for (
const QString &role : allowed) {
153 d->allowedRole.
append(role);
157 auto it = attributes.constFind(u
"ACLDetachTo"_s);
158 if (it == attributes.constEnd() || it.value().isEmpty()) {
159 qFatal(
"RoleACL: Action %s requires the ACLDetachTo(<action>) attribute",
160 qPrintable(d->actionReverse));
162 d->aclDetachTo = it.value();
190 bool allRequired = std::ranges::all_of(
191 required, [&user_has](
const QString &role) {
return user_has.
contains(role); });
196 return std::ranges::any_of(
197 allowed, [&user_has](
const QString &role) {
return user_has.
contains(role); });
198 }
else if (!required.
isEmpty()) {
199 return std::ranges::all_of(
200 required, [&user_has](
const QString &role) {
return user_has.
contains(role); });
201 }
else if (!allowed.
isEmpty()) {
202 return std::ranges::any_of(
203 allowed, [&user_has](
const QString &role) {
return user_has.
contains(role); });
214 d->detachTo = controller->
actionFor(d->aclDetachTo);
219 "RoleACL: Action '%s' requires a valid action set on the ACLDetachTo(%s) attribute",
220 qPrintable(d->actionReverse),
221 qPrintable(d->aclDetachTo));
228 #include "moc_roleacl.cpp" bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
bool init(Application *application, const QVariantHash &args) override
void detach(Action *action=nullptr)
Action * getActionByPath(QStringView path) const
bool aroundExecute(Context *c, QStack< Component *> stack) override
The Cutelyst Component base class.
Cutelyst Controller base class.
bool canVisit(Context *c) const
User role-based authorization action role.
bool isEmpty() const const
Modifiers modifiers() const override
The Cutelyst namespace holds all public Cutelyst API.
bool dispatcherReady(const Dispatcher *dispatcher, Controller *controller) override
QStringList toStringList() const const
void append(QList< T > &&value)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
virtual bool aroundExecute(Context *c, QStack< Component *> stack)
The Cutelyst application.
static AuthenticationUser user(Context *c)
Action * actionFor(QStringView name) const
T value(const Key &key, const T &defaultValue) const const