summaryrefslogtreecommitdiffstats
path: root/src/userldapdata.cpp
diff options
context:
space:
mode:
authorSimon Rettberg2018-06-18 11:10:41 +0200
committerSimon Rettberg2018-06-18 11:10:41 +0200
commitfb9bcbcad0b522b131682ebbffb78ff87abd0bdd (patch)
tree7bbfab4af8894ec826eb6c51c4cfc464207b9727 /src/userldapdata.cpp
parentClean up globals.* (remove unused, rename constants, prefix) (diff)
downloadvmchooser2-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.cpp78
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);
+}
+
+}