#include "userldapdata.h" #include #include #include #include #include #define INCBREAK if (++i >= len) break namespace { QSet _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] == ':') { // Double ":", means base64 encoded data 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--; } // Put "lowercase(key):value" into set 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) { if (value.indexOf(QLatin1Char('*')) == -1 && value.indexOf(QLatin1Char('?')) == -1) { const QString keyLow(attribute.toLower() + QLatin1String(":") + value); return _entries.contains(keyLow); } // Wildcard matching QRegularExpression re(QLatin1String("^") + QRegularExpression::escape(attribute.toLower()) + QLatin1String(":") + QRegularExpression::wildcardToRegularExpression(value)); for (auto str : _entries) { if (re.match(str).hasMatch()) return true; } return false; } }