1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
/*
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
SPDX-FileCopyrightText: 2020 Harald Sitter <sitter@kde.org>
*/
#include "groupmanager.h"
#include <QProcess>
#include <QFileInfo>
#include <QDebug>
#include <KUser>
#include <KAuth/KAuthAction>
#include <KAuth/KAuthExecuteJob>
#include <KLocalizedString>
GroupManager::GroupManager(QObject *parent)
: QObject(parent)
{
metaObject()->invokeMethod(this, [this] {
auto proc = new QProcess;
proc->setProgram(QStringLiteral("testparm"));
proc->setArguments({QStringLiteral("--debuglevel=0"),
QStringLiteral("--suppress-prompt"),
QStringLiteral("--verbose"),
QStringLiteral("--parameter-name"),
QStringLiteral("usershare path")});
connect(proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this, proc](int exitCode) {
proc->deleteLater();
const QString path = QString::fromUtf8(proc->readAllStandardOutput().simplified());
m_ready = true;
Q_EMIT isReadyChanged();
QFileInfo info(path);
if (exitCode != 0 || path.isEmpty() || !info.exists()) {
return; // usershares may be disabled or path is invalid :|
}
if (info.isWritable()) {
m_isMember = true;
Q_EMIT isMemberChanged();
}
m_targetGroup = info.group();
Q_EMIT targetGroupChanged();
if (m_targetGroup != QLatin1String("root") && m_targetGroup.contains(QLatin1String("samba"))) {
m_canMakeMember = true;
Q_EMIT canMakeMemberChanged();
}
});
proc->start();
});
}
bool GroupManager::canMakeMember() const
{
return m_canMakeMember;
}
bool GroupManager::isReady() const
{
return m_ready;
}
QString GroupManager::targetGroup() const
{
return m_targetGroup;
}
bool GroupManager::isMember() const
{
return m_isMember;
}
void GroupManager::makeMember()
{
Q_ASSERT(m_canMakeMember);
const QString user = KUser().loginName();
const QString group = m_targetGroup;
Q_ASSERT(!user.isEmpty());
Q_ASSERT(!group.isEmpty());
auto action = KAuth::Action(QStringLiteral("org.kde.filesharing.samba.addtogroup"));
action.setHelperId(QStringLiteral("org.kde.filesharing.samba"));
action.addArgument(QStringLiteral("user"), user);
action.addArgument(QStringLiteral("group"), group);
action.setDetailsV2({{KAuth::Action::AuthDetail::DetailMessage,
i18nc("@label kauth action description %1 is a username %2 a group name",
"Adding user '%1' to group '%2' so they may configure Samba user shares",
user,
group) }
});
KAuth::ExecuteJob *job = action.execute();
connect(job, &KAuth::ExecuteJob::result, this, [this, job] {
job->deleteLater();
if (job->error() != KAuth::ExecuteJob::NoError) {
Q_EMIT makeMemberError(job->errorString());
return;
}
Q_EMIT madeMember();
});
job->start();
}
|