File indexing completed on 2024-04-28 05:34:16

0001 // SPDX-FileCopyrightText: 2023 Daniel Vrátil <dvratil@kde.org>
0002 //
0003 // SPDX-License-Identifier: LGPL-2.1-or-later
0004 
0005 #include "klipperutils.h"
0006 
0007 #include <QProcess>
0008 #include <QRegularExpression>
0009 #include <QStandardPaths>
0010 
0011 namespace
0012 {
0013 
0014 const int klipperMinMajorVersion = 5;
0015 const int klipperMinMinorVersion = 13;
0016 
0017 }
0018 
0019 using namespace PlasmaPass;
0020 
0021 KlipperUtils::State KlipperUtils::getState()
0022 {
0023     const auto klipperExecutable = QStandardPaths::findExecutable(QStringLiteral("klipper"));
0024     if (klipperExecutable.isEmpty()) {
0025         return State::Missing;
0026     }
0027 
0028     QProcess process{};
0029     process.setProgram(klipperExecutable);
0030     process.setArguments({QStringLiteral("--version")});
0031     process.start(QIODevice::ReadOnly);
0032     process.waitForFinished();
0033     if (process.exitStatus() != QProcess::NormalExit) {
0034         return State::Missing;
0035     }
0036     const auto output = process.readAllStandardOutput();
0037 
0038     const QRegularExpression rx(QStringLiteral(R"/(^klipper ([0-9]+)\.([0-9]+))/"));
0039     const auto match = rx.match(QString::fromUtf8(output));
0040     if (!match.hasMatch()) {
0041         return State::Available;
0042     }
0043 
0044     const auto majorVersionStr = match.capturedView(1);
0045     bool ok = false;
0046     const int majorVersion = majorVersionStr.toInt(&ok);
0047     if (!ok) {
0048         return State::Available;
0049     }
0050 
0051     const auto minorVersionStr = match.capturedView(2);
0052     ok = false;
0053     const int minorVersion = minorVersionStr.toInt(&ok);
0054     if (!ok) {
0055         return State::Available;
0056     }
0057 
0058     // Klipper supports x-kde-passwordManagerHint since Plasma 5.13
0059     const auto verdict = ((majorVersion > klipperMinMajorVersion) || (majorVersion == klipperMinMajorVersion && minorVersion >= klipperMinMinorVersion));
0060     return verdict ? State::SupportsPasswordManagerHint : State::Available;
0061 }