deskflow/src/lib/gui/dotenv.cpp
Nick Bolton 9315b089c8
Improve UI design and reduce over-use of #ifdef (#7413)
* Rename `LicenseManager` to `License`

* Rename `LicenseManager` to `License`

* Move License class to gui lib

* Rename license related classes

* Refactor serial key parsing

* Don't fail fast on containers

* Move licensed product name from config to code

* Fixed formatting

* Update code coverage generator and fixed args

* WIP: Converting license to chrono

* WIP: Fixed compile errors, tests failing

* Fixed all serial key and license tests

* Disable verbose logging

* Add missing </p>

* Add missing include

* Revert code coverage config

* Handle parse errors

* Move more classes into the new gui lib and improve license/serial object ownership

* WIP: Fixing signal/slots in MainWindow

* Fixed slot for about to quit

* Rename manual slots to solve auto-connection warnings

* Fixed logging issue

* By default, don't close to tray

* Add .env support and furthe refactor license code, also fixed some copyright dates

* Remove test code

* Fixed memory error in .env parser and refactor more licensing display code

* Fixed color inconsistencies

* Fixed link colors and made log view expand

* Disable server components rather than hiding

* Reset years of blind UI layout fiddling

* Fixed clean Qt task

* Only show notice when time limited

* Fixed main window layout

* Show connected clients

* Set 15 spacing

* Auto connect on start

* More intentional screen size

* Fixed tests related to license

* Tests for expiry notifications

* Reorg tests and remove death test

* Update gtest

* Tests for dotenv parser

* Test command process

* What the heck is that doing there?

* Merge constants headers

* Fixed magic includes

* Remove helper function

* Remove comment

* Remove extern decl

* Update ChangeLog
2024-07-26 23:53:52 +01:00

91 lines
2.5 KiB
C++

/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2024 Symless Ltd.
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "dotenv.h"
#include <QDebug>
#include <QFile>
#include <QProcess>
#include <QProcessEnvironment>
#include <QString>
#include <QTextStream>
namespace synergy::gui {
QPair<QString, QString> getPair(const QString &line);
/**
* @brief A _very_ basic Qt .env file parser.
*
* This function re-invents the wheel to save adding a library dependency.
* It does not support many things that a proper .env parser would, such as
* trailing comments, escaping characters, multiline values, etc.
*
* If this function is not sufficient, replace it with a library such as:
* https://github.com/adeharo9/cpp-dotenv
*/
void dotenv(const QString &filePath) {
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug("no .env file in current dir");
return;
}
qDebug("loading env vars from: %s", filePath.toUtf8().constData());
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine().trimmed();
if (line.startsWith('#'))
continue;
auto [key, value] = getPair(line);
if (key.isEmpty() || value.isEmpty())
continue;
const auto keyBytes = key.toUtf8();
const auto valueBytes = value.toUtf8();
const auto &key_c = keyBytes.constData();
const auto &value_c = valueBytes.constData();
qDebug("%s=%s", key_c, value_c);
qputenv(keyBytes, valueBytes);
}
}
QString stripQuotes(const QString &value) {
QString result = value;
if (result.startsWith('"') && result.endsWith('"')) {
result = result.mid(1, result.length() - 2);
}
return result;
}
QPair<QString, QString> getPair(const QString &line) {
auto pos = line.indexOf('=');
if (pos == -1) {
return QPair<QString, QString>("", "");
}
QString key = line.left(pos);
QString value = line.mid(pos + 1);
return QPair<QString, QString>(key.trimmed(), stripQuotes(value.trimmed()));
}
} // namespace synergy::gui