10#include <QLoggingCategory>
11#include <QTemporaryFile>
15Q_LOGGING_CATEGORY(C_AUTH_HTPASSWD,
"cutelyst.plugin.authentication.htpasswd", QtWarningMsg)
28 const QString username = user.value(QStringLiteral(
"username"));
30 QTemporaryFile tmp(m_filename + QLatin1String(
"-XXXXXXX"));
31 tmp.setAutoRemove(
false);
33 qCWarning(C_AUTH_HTPASSWD) <<
"Failed to open temporary file for writing";
38 QFile file(m_filename);
39 if (file.exists() && file.open(QFile::ReadWrite | QFile::Text)) {
40 while (!file.atEnd()) {
41 QByteArray line = file.readLine();
42 QByteArrayList parts = line.split(
':');
43 if (!wrote && parts.size() >= 2 && parts.first() == username.toLatin1()) {
44 line = username.toLatin1() +
':' +
45 user.value(QStringLiteral(
"password")).toLatin1().replace(
':',
',') +
'\n';
54 QByteArray line = username.toLatin1() +
':' +
55 user.value(QStringLiteral(
"password")).toLatin1().replace(
':',
',') +
60 if (file.exists() && !file.remove()) {
61 qCWarning(C_AUTH_HTPASSWD) <<
"Failed to remove auth file for replacement";
65 if (!tmp.rename(m_filename)) {
66 qCWarning(C_AUTH_HTPASSWD) <<
"Failed to rename temporary file";
74 const QString username = userInfo.
value(QStringLiteral(
"username"));
76 QFile file(m_filename);
77 if (file.open(QFile::ReadOnly | QFile::Text)) {
78 while (!file.atEnd()) {
79 QByteArray line = file.readLine();
80 QByteArrayList parts = line.trimmed().split(
':');
81 if (parts.size() >= 2 && !parts.first().startsWith(
'#') &&
82 parts.first() == username.toLatin1()) {
83 ret.
insert(QStringLiteral(
"username"), username);
85 QByteArray password = parts.at(1);
86 ret.
insert(QStringLiteral(
"password"),
87 QString::fromLatin1(password.replace(
',',
':')));
103 return findUser(c, {{QStringLiteral(
"username"), frozenUser.toString()}});
Container for user data retrieved from an AuthenticationStore.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
void setId(const QVariant &id)
void insert(const QString &key, const QVariant &value)
Authentication data store using a flat file.
virtual ~StoreHtpasswd() override
QVariant forSession(Context *c, const AuthenticationUser &user) override final
AuthenticationUser findUser(Context *c, const ParamsMultiMap &userInfo) override final
AuthenticationUser fromSession(Context *c, const QVariant &frozenUser) override final
void addUser(const ParamsMultiMap &user)
QMultiMap< QString, QString > ParamsMultiMap
The Cutelyst namespace holds all public Cutelyst API.