#include "userldapdata.h" #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] == ':') { 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); } }