Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sync: from linuxdeepin/dtkcore #15

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions docs/global/dconfigfile.zh_CN.dox
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,16 @@ dtk_add_config_meta_files(
"name": "map",
"permissions": "readwrite",
"visibility": "public"
},
"publicConfig": {
"value": true,
"serial": 0,
"flags": ["user-public"],
"name": "public configure",
"name[zh_CN]": "我是公开的配置",
"description": "I am public configure",
"permissions": "readwrite",
"visibility": "private"
}
}
}
Expand Down Expand Up @@ -188,6 +198,8 @@ sudo ./dconfigfile-example
@brief 存在此标记时,将表明则此配置项不可被覆盖(详见下述 override 机制)。反之,不存在此标记时表明此配置项允许被覆盖,对于此类配置项,如若其有界面设置入口,则当此项不可写时,应当隐藏或禁用界面的设置入口.
@var Dtk::Core::DConfigFile::Flag Dtk::Core::DConfigFile::Global
@brief 当读写此类配置时,将忽略用户身份,无论程序使用哪个用户身份执行,读操作都将获取到同样的数据,写操作将对所有用户都生效。但是,如果对应的配置存储目录不存在或无权限写入,则忽略此标志
@var Dtk::Core::DConfigFile::Flag Dtk::Core::DConfigFile::UserPublic
@brief 该类配置项允许被其他用户访问


@enum Dtk::Core::DConfigFile::Permissions
Expand Down
3 changes: 2 additions & 1 deletion include/global/dconfigfile.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ class LIBDTKCORESHARED_EXPORT DConfigFile : public DObject{
public:
enum Flag {
NoOverride = 1 << 0,
Global = 1 << 1
Global = 1 << 1,
UserPublic = 1 << 2
};
Q_DECLARE_FLAGS(Flags, Flag)

Expand Down
2 changes: 2 additions & 0 deletions src/dconfigfile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,8 @@ class Q_DECL_HIDDEN DConfigInfo {
flags |= DConfigFile::NoOverride;
} else if (flag == QLatin1String("global")) {
flags |= DConfigFile::Global;
} else if (flag == QLatin1String("user-public")) {
flags |= DConfigFile::UserPublic;
}
}

Expand Down
40 changes: 36 additions & 4 deletions src/dsgapplication.cpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,27 @@
// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd.
// SPDX-FileCopyrightText: 2022-2023 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later

#include "dsgapplication.h"

#include <sys/syscall.h>
#include <unistd.h>

#include <QByteArray>
#include <QCoreApplication>
#include <QDebug>
#include <QDBusUnixFileDescriptor>
#include <QDBusReply>
#include <QRegularExpression>
#include <QLoggingCategory>

#include <DDBusInterface>

#ifdef QT_DEBUG
Q_LOGGING_CATEGORY(dsgApp, "dtk.core.dsg")
#else
Q_LOGGING_CATEGORY(dsgApp, "dtk.core.dsg", QtInfoMsg)
#endif

DCORE_BEGIN_NAMESPACE

Expand Down Expand Up @@ -34,10 +50,26 @@ QByteArray DSGApplication::id()
return result;
}

QByteArray DSGApplication::getId(qint64)
QByteArray DSGApplication::getId(qint64 pid)
{
// TODO(zccrs): Call the org.desktopspec.ApplicationManager DBus service
return nullptr;
int pidfd = syscall(SYS_pidfd_open, pid, 0);
if (pidfd < 0) {
qCWarning(dsgApp) << "pidfd open failed:" << strerror(errno);
return QByteArray();
}

DDBusInterface infc("org.desktopspec.ApplicationManager1",
"/org/desktopspec/ApplicationManager1",
"org.desktopspec.ApplicationManager1");

QDBusReply<QString> reply = infc.call("Identify", QVariant::fromValue(QDBusUnixFileDescriptor(pidfd)));

if (!reply.isValid()) {
qCWarning(dsgApp) << "Identify from AM failed." << reply.error().message();
return QByteArray();
}

return reply.value().toLatin1();
}

DCORE_END_NAMESPACE
10 changes: 10 additions & 0 deletions tests/data/dconf-example.meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,16 @@
"name": "array value type",
"permissions": "readwrite",
"visibility": "public"
},
"publicConfig": {
"value": true,
"serial": 0,
"flags": ["user-public"],
"name": "public configure",
"name[zh_CN]": "我是公开的配置",
"description": "I am public configure",
"permissions": "readwrite",
"visibility": "private"
}
}
}
11 changes: 11 additions & 0 deletions tests/ut_dconfigfile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -485,3 +485,14 @@ TEST_F(ut_DConfigFile, setSubpath) {
ASSERT_FALSE(config.load(LocalPrefix));
}
}

TEST_F(ut_DConfigFile, userPublic) {

FileCopyGuard guard(":/data/dconf-example.meta.json", QString("%1/%2.json").arg(metaPath, FILE_NAME));
{
DConfigFile config(APP_ID, FILE_NAME);
ASSERT_TRUE(config.load(LocalPrefix));
ASSERT_TRUE(config.meta()->flags("publicConfig").testFlag(DConfigFile::UserPublic));
ASSERT_FALSE(config.meta()->flags("canExit").testFlag(DConfigFile::UserPublic));
}
}