diff options
author | Simon Rettberg | 2018-06-18 11:10:41 +0200 |
---|---|---|
committer | Simon Rettberg | 2018-06-18 11:10:41 +0200 |
commit | fb9bcbcad0b522b131682ebbffb78ff87abd0bdd (patch) | |
tree | 7bbfab4af8894ec826eb6c51c4cfc464207b9727 /src/userldapdata.cpp | |
parent | Clean up globals.* (remove unused, rename constants, prefix) (diff) | |
download | vmchooser2-fb9bcbcad0b522b131682ebbffb78ff87abd0bdd.tar.gz vmchooser2-fb9bcbcad0b522b131682ebbffb78ff87abd0bdd.tar.xz vmchooser2-fb9bcbcad0b522b131682ebbffb78ff87abd0bdd.zip |
Add support for filtering by LDAP values from file
This is a temporary solution until we can do server-side
filtering.
Diffstat (limited to 'src/userldapdata.cpp')
-rw-r--r-- | src/userldapdata.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/userldapdata.cpp b/src/userldapdata.cpp new file mode 100644 index 0000000..4382800 --- /dev/null +++ b/src/userldapdata.cpp @@ -0,0 +1,78 @@ +#include "userldapdata.h" + +#include <QSet> +#include <QFile> +#include <QDebug> +#include <QDir> + +#define INCBREAK if (++i >= len) break + +namespace { + +QSet<QString> _entries; + +} + +namespace UserLdapData { + +bool init(QString inputFile) +{ + _entries.clear(); + if (inputFile.isEmpty()) { + inputFile = QDir::homePath() + "/.openslx/ldap"; + } + QFile file(inputFile); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qDebug() << "Cannot read" << file.fileName(); + return false; + } + while (!file.atEnd()) { + QByteArray ba = file.readLine(); + const char *p = ba.constData(); + const int len = ba.size(); + bool b64 = false; + int dataStart = -1; + int keyEnd = -1; + for (int i = 1; i < len; ++i) { + if (p[i] != ':') + continue; + keyEnd = i; + INCBREAK; + if (p[i] == ':') { + INCBREAK; + b64 = true; + } + if (p[i] != ' ') + continue; + dataStart = i + 1; + break; + } + if (dataStart == -1) + continue; + int dataLen = len - dataStart; + while (dataLen > 0 && p[dataStart + dataLen - 1] == '\n') { + dataLen--; + } + QString value = QString::fromUtf8(p, keyEnd).toLower() + ":"; + if (b64) { + value += QString::fromUtf8(QByteArray::fromBase64(QByteArray(p + dataStart, dataLen))); + } else { + value += QString::fromUtf8(p + dataStart, dataLen); + } + _entries.insert(value); + } + return true; +} + +bool isEmpty() +{ + return _entries.isEmpty(); +} + +bool isAllowed(const QString& attribute, const QString& value) +{ + const QString keyLow(attribute.toLower() + ":" + value); + return _entries.contains(keyLow); +} + +} |