5#include "authenticationrealm.h"
6#include "credentialhttp_p.h"
7#include "credentialpassword.h"
9#include <Cutelyst/Context>
10#include <Cutelyst/Response>
12#include <QLoggingCategory>
17Q_LOGGING_CATEGORY(C_CREDENTIALHTTP,
"cutelyst.plugin.credentialhttp", QtWarningMsg)
21 , d_ptr(new CredentialHttpPrivate)
25CredentialHttp::~CredentialHttp()
39 d->authorizationRequiredMessage = message;
45 return d->passwordField;
51 d->passwordField = fieldName;
57 return d->passwordType;
63 d->passwordType = type;
69 return d->passwordPreSalt;
81 return d->passwordPostSalt;
93 return d->usernameField;
99 d->usernameField = fieldName;
105 d->requireSsl = require;
115 if (d->requireSsl && !c->request()->secure()) {
116 ret = d->authenticationFailed(c, realm, authinfo);
120 if (d->isAuthTypeBasic()) {
121 ret = d->authenticateBasic(c, realm, authinfo);
127 ret = d->authenticationFailed(c, realm, authinfo);
134 const QString password = passwordPreSalt + authinfo.value(passwordField) + passwordPostSalt;
135 const QString storedPassword = user.value(passwordField).toString();
137 if (Q_LIKELY(passwordType == CredentialHttp::Hashed)) {
139 }
else if (passwordType == CredentialHttp::Clear) {
140 return storedPassword == password;
141 }
else if (passwordType == CredentialHttp::None) {
142 qCCritical(C_CREDENTIALHTTP) <<
"CredentialPassword is set to ignore password check";
155 qCDebug(C_CREDENTIALHTTP) <<
"Checking http basic authentication.";
158 if (userPass.user.isEmpty()) {
163 auth.insert(usernameField, userPass.user);
166 auth.insert(passwordField, userPass.password);
167 if (checkPassword(_user, auth)) {
170 qCDebug(C_CREDENTIALHTTP) <<
"Password didn't match";
173 qCDebug(C_CREDENTIALHTTP) <<
"Unable to locate a user matching user info provided in realm";
187 if (authorizationRequiredMessage.isEmpty()) {
188 res->
setBody(
"Authorization required."_qba);
190 res->
setBody(authorizationRequiredMessage);
194 if (isAuthTypeBasic()) {
195 createBasicAuthResponse(c, realm);
201bool CredentialHttpPrivate::isAuthTypeBasic()
const
203 return type == CredentialHttp::Basic || type == CredentialHttp::Any;
209 joinAuthHeaderParts(
"Basic"_qba, buildAuthHeaderCommon(realm)));
212QByteArrayList CredentialHttpPrivate::buildAuthHeaderCommon(
AuthenticationRealm *realm)
const
218 if (!realm->
name().isEmpty()) {
219 ret.append(
"realm=\"" + realm->
name().toLatin1() +
'"');
224QByteArray CredentialHttpPrivate::joinAuthHeaderParts(
const QByteArray &type,
225 const QByteArrayList &parts)
const
227 QByteArray ret = type;
228 if (!parts.isEmpty()) {
229 ret.append(
' ' + parts.join(
", "));
234#include "moc_credentialhttp.cpp"
virtual AuthenticationUser findUser(Context *c, const ParamsMultiMap &userinfo)
Tries to find the user with authinfo returning a non null AuthenticationUser on success.
bool isNull() const
Returns true if the object is null.
QString name() const noexcept
Response * res() const noexcept
Response * response() const noexcept
QString usernameField() const
Returns the field to look for when authenticating the user.
void setPasswordType(PasswordType type)
Sets the type of password this class will be dealing with.
void setUsernameField(const QString &fieldName)
Sets the field to look for when authenticating the user.
QString passwordPreSalt() const
Returns the salt string to be prepended to the password.
QString passwordPostSalt() const
Returns the salt string to be appended to the password.
void setPasswordPreSalt(const QString &passwordPreSalt)
Sets the salt string to be prepended to the password.
QString passwordField() const
Returns the field to look for when authenticating the user.
PasswordType passwordType() const
Returns the type of password this class will be dealing with.
void setType(CredentialHttp::AuthType type)
AuthenticationUser authenticate(Context *c, AuthenticationRealm *realm, const ParamsMultiMap &authinfo) final
Tries to authenticate the authinfo using the give realm.
void setPasswordField(const QString &fieldName)
Sets the field to look for when authenticating the user.
void setPasswordPostSalt(const QString &passwordPostSalt)
Sets the salt string to be appended to the password.
void setRequireSsl(bool require)
void setAuthorizationRequiredMessage(const QString &message)
static bool validatePassword(const QByteArray &password, const QByteArray &correctHash)
Validates the given password against the correct hash.
Headers headers() const noexcept
void setContentType(const QByteArray &type)
void setStatus(quint16 status) noexcept
void setBody(QIODevice *body)
Headers & headers() noexcept
The Cutelyst namespace holds all public Cutelyst API.
QMultiMap< QString, QString > ParamsMultiMap