diff options
author | Simon Rettberg | 2018-02-08 12:02:00 +0100 |
---|---|---|
committer | Simon Rettberg | 2018-02-08 12:02:00 +0100 |
commit | 7688ba080c0c69508847fca9aa36dc392ddbb766 (patch) | |
tree | f39315ec70374d2cca6b0929049345c7b113d8d0 /src/namereplace.cpp | |
parent | Update readme (diff) | |
download | slxgreeter-7688ba080c0c69508847fca9aa36dc392ddbb766.tar.gz slxgreeter-7688ba080c0c69508847fca9aa36dc392ddbb766.tar.xz slxgreeter-7688ba080c0c69508847fca9aa36dc392ddbb766.zip |
Support regex mangling of username before passing to lightdm
Diffstat (limited to 'src/namereplace.cpp')
-rw-r--r-- | src/namereplace.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/namereplace.cpp b/src/namereplace.cpp new file mode 100644 index 0000000..36d834d --- /dev/null +++ b/src/namereplace.cpp @@ -0,0 +1,69 @@ +#include "namereplace.h" +#include <QString> +#include <QRegularExpression> +#include <QFile> +#include <QTextStream> +#include <QDebug> + +#define SOURCE_FILE "/opt/openslx/lightdm/login-regexp" + +static QList< QPair< QRegularExpression, QString > > list; + +static inline int find(QChar c, int start, const QString& line) +{ + do { + int next = line.indexOf(c, start); + if (next == -1) + return -1; + if (line.at(next - 1) != '\\') + return next; + start = next + 1; + } while (true); +} + +void NameReplace::loadSubs() +{ + int idx = 0; + QFile inputFile(SOURCE_FILE); + if (!inputFile.open(QIODevice::ReadOnly)) + return; + QTextStream in(&inputFile); + in.setCodec("UTF-8"); + while (!in.atEnd()) { + QString line = in.readLine(); + idx++; + if (line.isEmpty()) + continue; + QChar delim = line.at(0); + int first = find(delim, 1, line); + if (first == -1) + continue; + int second = find(delim, first + 1, line); + if (second == -1) + continue; + QString regex = line.mid(1, first - 1).replace(QString("\\") + delim, QString(delim)); + QString replace = line.mid(first + 1, second - first - 1).replace(QString("\\") + delim, QString(delim)); + QString flags = line.mid(second + 1); + // ... + QRegularExpression::PatternOptions opts = 0; + if (flags.contains("i")) { + opts |= QRegularExpression::CaseInsensitiveOption; + } + QRegularExpression re(regex, opts); + if (!re.isValid()) { + qWarning() << "Invalid regex:" << regex << "on line" << idx; + continue; + } + list.append(QPair<QRegularExpression, QString>(re, replace)); + } + inputFile.close(); +} + +void NameReplace::replace(QString& input) +{ + if (list.isEmpty()) + return; + for (auto &brumm : list) { + input = input.replace(brumm.first, brumm.second); + } +} |