diff --git a/assets/dbus/org.deepin.Filemanager.ShareControl.xml b/assets/dbus/org.deepin.Filemanager.ShareControl.xml
index 3e808f5bc1..67371d16f6 100644
--- a/assets/dbus/org.deepin.Filemanager.ShareControl.xml
+++ b/assets/dbus/org.deepin.Filemanager.ShareControl.xml
@@ -10,9 +10,6 @@
-
-
-
diff --git a/autotests/plugins/dfmplugin-dirshare/test_usersharehelper.cpp b/autotests/plugins/dfmplugin-dirshare/test_usersharehelper.cpp
index 21ac294627..7d42471da1 100644
--- a/autotests/plugins/dfmplugin-dirshare/test_usersharehelper.cpp
+++ b/autotests/plugins/dfmplugin-dirshare/test_usersharehelper.cpp
@@ -339,8 +339,6 @@ TEST_F(UT_UserShareHelper, SetSmbdAutoStart)
DeclareDBusCallFunc_Custom(const QString &);
auto call = static_cast(&QDBusAbstractInterface::call);
stub.set_lamda(call, [] { __DBG_STUB_INVOKE__ return QDBusMessage(); });
- EXPECT_NO_FATAL_FAILURE(UserShareHelperInstance->setSmbdAutoStart());
- EXPECT_FALSE(UserShareHelperInstance->setSmbdAutoStart());
}
TEST_F(UT_UserShareHelper, IsValidShare)
diff --git a/autotests/plugins/dfmplugin-smbbrowser/test_smbbrowserutils.cpp b/autotests/plugins/dfmplugin-smbbrowser/test_smbbrowserutils.cpp
index 7ddfeaba06..8f522ac4d6 100644
--- a/autotests/plugins/dfmplugin-smbbrowser/test_smbbrowserutils.cpp
+++ b/autotests/plugins/dfmplugin-smbbrowser/test_smbbrowserutils.cpp
@@ -94,10 +94,6 @@ TEST_F(UT_SmbBrowserUtils, IsServiceRuninig)
TEST_F(UT_SmbBrowserUtils, StartService)
{
- EXPECT_FALSE(smb_browser_utils::startService(""));
- EXPECT_FALSE(smb_browser_utils::startService("hello"));
- EXPECT_FALSE(smb_browser_utils::startService("xxx..."));
-
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
// stub.set_lamda(&QDBusAbstractInterface::asyncCall, [] { __DBG_STUB_INVOKE__ return QDBusPendingCall::fromError(QDBusError()); });
typedef QDBusPendingCall (QDBusAbstractInterface::*AsyncCall)(const QString &method,
@@ -116,28 +112,6 @@ TEST_F(UT_SmbBrowserUtils, StartService)
stub.set_lamda(&QDBusPendingCall::waitForFinished, [] { __DBG_STUB_INVOKE__ });
stub.set_lamda(&QDBusPendingCall::isValid, [] { __DBG_STUB_INVOKE__ return true; });
- EXPECT_TRUE(smb_browser_utils::startService("smb"));
- EXPECT_TRUE(smb_browser_utils::startService("nmb"));
- EXPECT_FALSE(smb_browser_utils::startService("nmbd"));
-}
-
-TEST_F(UT_SmbBrowserUtils, EnableServiceAsync)
-{
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- typedef QDBusPendingCall (QDBusAbstractInterface::*AsyncCall)(const QString &method,
- const QVariant &arg1,
- const QVariant &arg2,
- const QVariant &arg3,
- const QVariant &arg4,
- const QVariant &arg5,
- const QVariant &arg6,
- const QVariant &arg7,
- const QVariant &arg8);
- stub.set_lamda(static_cast(&QDBusAbstractInterface::asyncCall), []() { __DBG_STUB_INVOKE__ return QDBusPendingCall::fromError(QDBusError()); });
-#else
- stub.set_lamda(&QDBusAbstractInterface::doAsyncCall, [] { __DBG_STUB_INVOKE__ return QDBusPendingCall::fromError(QDBusError()); });
-#endif
- EXPECT_NO_FATAL_FAILURE(smb_browser_utils::enableServiceAsync());
}
TEST_F(UT_SmbBrowserUtils, CheckAndEnableService)
@@ -147,12 +121,9 @@ TEST_F(UT_SmbBrowserUtils, CheckAndEnableService)
EXPECT_TRUE(smb_browser_utils::checkAndEnableService("smbd"));
serviceRunning = false;
- bool startServiceResult = true;
- stub.set_lamda(smb_browser_utils::startService, [&] { __DBG_STUB_INVOKE__ return startServiceResult; });
- stub.set_lamda(smb_browser_utils::enableServiceAsync, [] { __DBG_STUB_INVOKE__ });
+ stub.set_lamda(smb_browser_utils::enableServiceNow, [] { return true; });
EXPECT_TRUE(smb_browser_utils::checkAndEnableService("smb"));
- startServiceResult = false;
EXPECT_FALSE(smb_browser_utils::checkAndEnableService("sb"));
}
diff --git a/autotests/services/sharecontrol/test_sharecontrol.cpp b/autotests/services/sharecontrol/test_sharecontrol.cpp
index 7794e46805..79804bef83 100644
--- a/autotests/services/sharecontrol/test_sharecontrol.cpp
+++ b/autotests/services/sharecontrol/test_sharecontrol.cpp
@@ -34,18 +34,18 @@ class UT_ShareControlDBus : public testing::Test
{
// Reset read call counter for each test
readCallCount = 0;
-
+
// Mock QDBusContext::message to prevent crashes
- stub.set_lamda(&QDBusContext::message, [](const QDBusContext *) -> const QDBusMessage& {
+ stub.set_lamda(&QDBusContext::message, [](const QDBusContext *) -> const QDBusMessage & {
__DBG_STUB_INVOKE__
// Create a static message to ensure it has valid service data
static QDBusMessage msg = QDBusMessage::createMethodCall("org.test.service", "/test", "org.test.Interface", "testMethod");
return msg;
});
-
+
shareControlDBus = new ShareControlDBus("test_sharecontrol");
}
-
+
virtual void TearDown() override
{
stub.clear();
@@ -56,7 +56,7 @@ class UT_ShareControlDBus : public testing::Test
protected:
ShareControlDBus *shareControlDBus = nullptr;
stub_ext::StubExt stub;
- int readCallCount = 0; // Track read system call count
+ int readCallCount = 0; // Track read system call count
};
class UT_PolicyKitHelper : public testing::Test
@@ -278,13 +278,13 @@ TEST_F(UT_ShareControlDBus, SetUserSharePassword_Success_ReturnsTrue)
stub.set_lamda(read, [this](int, void *buf, size_t count) -> ssize_t {
__DBG_STUB_INVOKE__
this->readCallCount++;
-
+
if (this->readCallCount == 1) {
// First call: return serialized credentials data
QByteArray data;
QDataStream stream(&data, QIODevice::WriteOnly);
stream << QString("testuser") << QString("testpassword");
-
+
// Copy data to buffer (ensure we don't exceed buffer size)
size_t dataSize = std::min(static_cast(data.size()), count);
memcpy(buf, data.constData(), dataSize);
@@ -332,44 +332,6 @@ TEST_F(UT_ShareControlDBus, SetUserSharePassword_Success_ReturnsTrue)
EXPECT_TRUE(result);
}
-// Test EnableSmbServices with authentication failure
-TEST_F(UT_ShareControlDBus, EnableSmbServices_AuthenticationFailed_ReturnsFalse)
-{
- // Mock authentication failure
- stub.set_lamda(&PolicyKitHelper::checkAuthorization, [](PolicyKitHelper *, const QString &, const QString &) {
- __DBG_STUB_INVOKE__
- return false;
- });
-
- bool result = shareControlDBus->EnableSmbServices();
- EXPECT_FALSE(result);
-}
-
-// Test EnableSmbServices successful execution
-TEST_F(UT_ShareControlDBus, EnableSmbServices_Success_ReturnsTrue)
-{
- // Mock successful authentication
- stub.set_lamda(&PolicyKitHelper::checkAuthorization, [](PolicyKitHelper *, const QString &, const QString &) {
- __DBG_STUB_INVOKE__
- return true;
- });
-
- // Mock QProcess success for both services - use function pointer to specify overload
- using ProcessStartFunc = void (QProcess::*)(const QString &, const QStringList &, QIODevice::OpenMode);
- stub.set_lamda(static_cast(&QProcess::start), [](QProcess *, const QString &, const QStringList &, QIODevice::OpenMode) {
- __DBG_STUB_INVOKE__
- });
-
- using ProcessWaitFunc = bool (QProcess::*)(int);
- stub.set_lamda(static_cast(&QProcess::waitForFinished), [](QProcess *, int) {
- __DBG_STUB_INVOKE__
- return true;
- });
-
- bool result = shareControlDBus->EnableSmbServices();
- EXPECT_TRUE(result);
-}
-
// Test IsUserSharePasswordSet with process failure
TEST_F(UT_ShareControlDBus, IsUserSharePasswordSet_ProcessFailed_ReturnsFalse)
{
diff --git a/debian/changelog b/debian/changelog
index 193bc4fe51..d10a095112 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+dde-file-manager (6.5.102) unstable; urgency=medium
+
+ * fix bugs
+ * security enhancement
+
+ -- Zhang Sheng Thu, 06 Nov 2025 21:21:57 +0800
+
dde-file-manager (6.5.101) unstable; urgency=medium
* fix bugs
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index ec635144f6..0000000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-9
diff --git a/debian/control b/debian/control
index 3a69ccd376..d40d7ffeda 100644
--- a/debian/control
+++ b/debian/control
@@ -3,9 +3,9 @@ Section: libdevel
Priority: optional
Maintainer: Deepin Packages Builder
Build-Depends:
+ debhelper-compat (= 12),
cmake,
doxygen,
- debhelper (>=9),
pkg-config,
libffmpegthumbnailer-dev,
libpolkit-agent-1-dev,
@@ -26,7 +26,6 @@ Build-Depends:
libcryptsetup-dev,
libpcre2-dev,
libdde-shell-dev (>= 0.0.10),
- deepin-desktop-base | deepin-desktop-server | deepin-desktop-device,
qt6-base-dev,
qt6-base-private-dev,
qt6-svg-dev,
@@ -51,18 +50,18 @@ Build-Depends:
libdeepin-service-framework-dev,
libheif-dev,
libappimage-dev
-Standards-Version: 3.9.8
+Standards-Version: 4.5.0
Homepage: http://www.deepin.org
Package: dde-desktop
Architecture: any
-Depends:
- ${shlibs:Depends},
- ${misc:Depends},
+Depends:
+ ${shlibs:Depends},
+ ${misc:Depends},
libdde-file-manager (=${binary:Version}),
libqt6sql6-sqlite,
qt6-translations-l10n,
- libimageeditor6 | hello
+ libimageeditor6
Conflicts: dde-workspace (<< 2.90.5), dde-file-manager-oem, dde-desktop-plugins
Replaces: dde-file-manager-oem, dde-file-manager (<< 6.0.1), dde-desktop-plugins
Recommends: deepin-screensaver
@@ -74,6 +73,8 @@ Architecture: any
Depends:
${shlibs:Depends},
${misc:Depends},
+ pkexec,
+ deepin-desktop-base | deepin-desktop-server | deepin-desktop-device,
libdde-file-manager (=${binary:Version}),
socat,
cryfs,
@@ -85,14 +86,17 @@ Depends:
qml6-module-qtquick-window,
tpm2-abrmd,
libtss2-tcti-pcap0,
- libtss2-tcti-tabrmd0,
- libusec-recoverykey | hello
-Replaces: dde-file-manager-oem, dde-desktop (<< 6.0.1),
+ libtss2-tcti-tabrmd0
+Replaces: dde-file-manager-oem,
+ dde-desktop (<< 6.5.101),
dde-file-manager-preview,
dde-file-manager-preview-plugins,
dde-file-manager-plugins,
dde-file-manager-daemon-plugins,
- dde-file-manager-common-plugins
+ dde-file-manager-common-plugins,
+ dde-file-manager-services-plugins (<< 6.5.101)
+Breaks: dde-desktop (<< 6.5.101),
+ dde-file-manager-services-plugins (<< 6.5.101)
Conflicts: dde-file-manager-preview,
dde-file-manager-preview-plugins,
dde-file-manager-plugins,
@@ -111,8 +115,7 @@ Depends:
gvfs-backends (>=1.27.3),
cryptsetup,
gnome-keyring,
- libdfm-extension (=${binary:Version}),
- dlnfs | hello
+ libdfm-extension (=${binary:Version})
Multi-Arch: same
Description: DDE File Manager core librarys
This package contains the shared libraries.
@@ -136,7 +139,7 @@ Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: deepin desktop-environment - deepin-service-manager plugins module
Deepin Desktop Environment (DDE) - deepin-service-manager plugins module.
-
+
Package: libdfm-extension-dev
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, libdfm-extension (=${binary:Version})
@@ -146,7 +149,7 @@ Description: Development package for libdfm-extension
Package: dde-file-manager-dev
Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, dde-file-manager (=${binary:Version}),
+Depends: ${shlibs:Depends}, ${misc:Depends}, libdde-file-manager (=${binary:Version}),
libdfm6-io-dev, libdfm6-mount-dev, libdfm6-burn-dev
Description: DDE File Manager Devel library
This package contains the header files and static libraries
diff --git a/debian/control.in b/debian/control.in
new file mode 100644
index 0000000000..d314663ef0
--- /dev/null
+++ b/debian/control.in
@@ -0,0 +1,157 @@
+Source: dde-file-manager
+Section: libdevel
+Priority: optional
+Maintainer: Deepin Packages Builder
+Build-Depends:
+ debhelper-compat (= 12),
+ cmake,
+ doxygen,
+ pkg-config,
+ libffmpegthumbnailer-dev,
+ libpolkit-agent-1-dev,
+ dde-tray-loader-dev,
+ libtag1-dev,
+ libdmr-dev,
+ libicu-dev,
+ libxcb-ewmh-dev,
+ libdeepin-pdfium-dev,
+ libssl-dev,
+ libgtest-dev,
+ libgmock-dev,
+ liblucene++-dev,
+ libdocparser-dev,
+ libboost-filesystem-dev,
+ libsecret-1-dev,
+ libpoppler-cpp-dev,
+ libcryptsetup-dev,
+ libpcre2-dev,
+ libdde-shell-dev (>= 0.0.10),
+ qt6-base-dev,
+ qt6-base-private-dev,
+ qt6-svg-dev,
+ qt6-multimedia-dev,
+ qt6-tools-dev,
+ qt6-tools-dev-tools,
+ qt6-declarative-dev,
+ qt6-5compat-dev,
+ libdtk6widget-dev,
+ libdtk6gui-dev,
+ libdtk6core-dev,
+ libdtk6core-bin,
+ libdtk6declarative-dev,
+ libdfm6-io-dev,
+ libdfm6-mount-dev,
+ libdfm6-burn-dev,
+ libdfm6-search-dev,
+ libpolkit-qt6-1-dev,
+ libxcb-xfixes0-dev (>= 1.10~),
+ libopenjp2-7-dev,
+ liblcms2-dev,
+ libdeepin-service-framework-dev,
+ libheif-dev,
+ libappimage-dev
+Standards-Version: 4.5.0
+Homepage: http://www.deepin.org
+
+Package: dde-desktop
+Architecture: any
+Depends:
+ ${shlibs:Depends},
+ ${misc:Depends},
+ libdde-file-manager (=${binary:Version}),
+ libqt6sql6-sqlite,
+ qt6-translations-l10n,
+ libimageeditor6
+Conflicts: dde-workspace (<< 2.90.5), dde-file-manager-oem, dde-desktop-plugins
+Replaces: dde-file-manager-oem, dde-file-manager (<< 6.0.1), dde-desktop-plugins
+Recommends: deepin-screensaver
+Description: deepin desktop-environment - desktop module
+ Deepin Desktop Environment (DDE) - desktop module.
+
+Package: dde-file-manager
+Architecture: any
+Depends:
+ ${shlibs:Depends},
+ ${misc:Depends},
+ pkexec,
+ deepin-desktop-base | deepin-desktop-server | deepin-desktop-device,
+ libdde-file-manager (=${binary:Version}),
+ socat,
+ cryfs,
+ dde-device-formatter,
+ libblockdev-crypto2 | libblockdev-crypto3,
+ dde-file-manager-services-plugins (=${binary:Version}),
+ qml6-module-qtquick-controls,
+ qml6-module-qtquick-layouts,
+ qml6-module-qtquick-window,
+ tpm2-abrmd,
+ libtss2-tcti-pcap0,
+ libtss2-tcti-tabrmd0@PROFESSIONAL_DEPS@
+Replaces: dde-file-manager-oem,
+ dde-desktop (<< 6.5.101),
+ dde-file-manager-preview,
+ dde-file-manager-preview-plugins,
+ dde-file-manager-plugins,
+ dde-file-manager-daemon-plugins,
+ dde-file-manager-common-plugins,
+ dde-file-manager-services-plugins (<< 6.5.101)
+Breaks: dde-desktop (<< 6.5.101),
+ dde-file-manager-services-plugins (<< 6.5.101)
+Conflicts: dde-file-manager-preview,
+ dde-file-manager-preview-plugins,
+ dde-file-manager-plugins,
+ dde-file-manager-daemon-plugins,
+ dde-file-manager-common-plugins
+Recommends: avfs, samba, deepin-anything-server
+Description: File manager front end
+ File manager front-end of Deepin OS
+
+Package: libdde-file-manager
+Architecture: any
+Depends:
+ ${shlibs:Depends},
+ ${misc:Depends},
+ libpoppler-cpp0v5 (>= 0.48.0),
+ gvfs-backends (>=1.27.3),
+ cryptsetup,
+ gnome-keyring,
+ libdfm-extension (=${binary:Version})@PROFESSIONAL_DEPS2@
+Multi-Arch: same
+Description: DDE File Manager core librarys
+ This package contains the shared libraries.
+Replaces: dfmplugin-disk-encrypt
+Conflicts: dfmplugin-disk-encrypt
+
+Package: dde-disk-mount-plugin
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: plugin of dde-dock
+ Disk mount plugin of dde-dock which is created by dde-file-manager
+
+Package: libdfm-extension
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: extension library of dde-file-manager
+ Extension library of dde-file-manager which is provided for third parties
+
+Package: dde-file-manager-services-plugins
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: deepin desktop-environment - deepin-service-manager plugins module
+ Deepin Desktop Environment (DDE) - deepin-service-manager plugins module.
+
+Package: libdfm-extension-dev
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, libdfm-extension (=${binary:Version})
+Description: Development package for libdfm-extension
+ This package contains the header files and pkgconfig
+ of libdfm-extension
+
+Package: dde-file-manager-dev
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, libdde-file-manager (=${binary:Version}),
+ libdfm6-io-dev, libdfm6-mount-dev, libdfm6-burn-dev
+Description: DDE File Manager Devel library
+ This package contains the header files and static libraries
+ of dde-file-manager
+
diff --git a/debian/dde-desktop.install b/debian/dde-desktop.install
index 6808320805..cb46d66ffd 100644
--- a/debian/dde-desktop.install
+++ b/debian/dde-desktop.install
@@ -3,8 +3,6 @@ usr/lib/*/dde-file-manager/plugins/desktop-core/*.so
usr/share/applications/dde-computer.desktop
usr/share/applications/dde-trash.desktop
usr/share/applications/dde-home.desktop
-usr/share/dbus-1/services/com.deepin.dde.desktop.service
-usr/share/dbus-1/services/org.freedesktop.FileManager.service
usr/share/dde-shell/*/*.json
usr/lib/*/dde-shell/*.so
usr/bin/dfm-trash.sh
diff --git a/debian/dde-file-manager-services-plugins.install b/debian/dde-file-manager-services-plugins.install
index 8cf1da26ef..1d407f3119 100644
--- a/debian/dde-file-manager-services-plugins.install
+++ b/debian/dde-file-manager-services-plugins.install
@@ -2,10 +2,5 @@ usr/lib/*/deepin-service-manager/*.so
usr/share/deepin-service-manager/system/*.json
usr/share/deepin-service-manager/user/*.json
usr/share/deepin-service-manager/other/*.json
-usr/share/dbus-1/system.d/*.conf
-usr/share/dbus-1/system-services/*.service
-usr/share/dbus-1/system.d/org.deepin.filemanager.diskencrypt.conf
-usr/share/dbus-1/services/org.deepin.Filemanager.TextIndex.service
etc/systemd/system/deepin-service-group@.service.d/*
-usr/share/polkit-1/rules.d/99-dde-file-manager-encrypt.rules
-etc/udev/rules.d/*.rules
+
diff --git a/debian/dde-file-manager.install b/debian/dde-file-manager.install
index 7bceb85816..5c475c8e73 100644
--- a/debian/dde-file-manager.install
+++ b/debian/dde-file-manager.install
@@ -15,17 +15,17 @@ usr/lib/*/dde-file-manager/plugins/previews/*.json
usr/share/applications/dde-file-manager.desktop
usr/share/applications/dde-open.desktop
usr/share/dde-file-manager/translations/*.qm
-usr/share/dbus-1/interfaces/com.deepin.filemanager.filedialog.xml
-usr/share/dbus-1/interfaces/com.deepin.filemanager.filedialogmanager.xml
-usr/share/dbus-1/services/com.deepin.filemanager.filedialog.service
-usr/share/dbus-1/services/com.deepin.filemanager.filedialog_x11.service
-usr/share/dbus-1/services/com.deepin.filemanager.filedialog_wayland.service
-usr/share/dbus-1/services/org.deepin.Filemanager.Daemon.service
+usr/share/dbus-1/interfaces/*.xml
+usr/share/dbus-1/services/*.service
+usr/share/dbus-1/system.d/*.conf
+usr/share/dbus-1/system-services/*.service
usr/share/deepin-manual/manual-assets/application
usr/share/polkit-1/actions/*.policy
usr/share/deepin-log-viewer/deepin-log.conf.d/*.json
usr/share/deepin-debug-config/deepin-debug-config.d/*.json
usr/share/mime/packages/dtk-dci.xml
usr/lib/systemd/user/
+usr/share/polkit-1/rules.d/*.rules
etc/X11/Xsession.d/99dfm-dlnfs-automount
etc/deepin/dde-file-manager/dfm-dlnfs-automount
+etc/udev/rules.d/*.rules
diff --git a/debian/rules b/debian/rules
index 5b01e32b24..95e95080f2 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,6 +1,6 @@
#!/usr/bin/make -f
-export QT_SELECT=5
+export QT_SELECT=6
include /usr/share/dpkg/default.mk
DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
@@ -8,6 +8,25 @@ DEB_BUILD_OPTIONS=nocheck
SYSTYPE = $(shell cat /usr/lib/deepin/desktop-version | grep Type= | awk -F'=' '{print $$2}')
+# 检测是否为 Professional 版本
+define detect_edition
+ifneq (,$(shell test -f /etc/os-version && grep -q "EditionName=Professional" /etc/os-version && echo yes))
+ PROFESSIONAL_DEPS=,\\n libusec-recoverykey
+ PROFESSIONAL_DEPS2=,\\n dlnfs
+else
+ PROFESSIONAL_DEPS=
+ PROFESSIONAL_DEPS2=
+endif
+endef
+
+# 调用版本检测
+$(eval $(call detect_edition))
+
+# 生成 control 文件(需要处理换行符)
+$(shell sed -e 's|@PROFESSIONAL_DEPS@|$(PROFESSIONAL_DEPS)|g' \
+ -e 's|@PROFESSIONAL_DEPS2@|$(PROFESSIONAL_DEPS2)|g' \
+ debian/control.in | sed 's|\\n|\n|g' > debian/control)
+
%:
dh $@ --parallel
diff --git a/src/apps/dde-file-manager-daemon/dbusservice/dde-filemanager-daemon.service b/src/apps/dde-file-manager-daemon/dbusservice/dde-filemanager-daemon.service
index 0b97ff6122..b855b52bd1 100644
--- a/src/apps/dde-file-manager-daemon/dbusservice/dde-filemanager-daemon.service
+++ b/src/apps/dde-file-manager-daemon/dbusservice/dde-filemanager-daemon.service
@@ -7,7 +7,6 @@ Type=dbus
BusName=org.deepin.Filemanager.Daemon
ExecStart=/usr/bin/dde-file-manager-daemon
CapabilityBoundingSet=~CAP_NET_RAW
-MemoryLimit=8G
[Install]
WantedBy=multi-user.target
diff --git a/src/apps/dde-file-manager/pkexec/dde-file-manager-pkexec b/src/apps/dde-file-manager/pkexec/dde-file-manager-pkexec
index 709157cec8..81dfc1d5ec 100644
--- a/src/apps/dde-file-manager/pkexec/dde-file-manager-pkexec
+++ b/src/apps/dde-file-manager/pkexec/dde-file-manager-pkexec
@@ -8,8 +8,19 @@
set -e
function run_pkexec() {
- # 使用一个临时文件来传递所有必要的环境变量,而不仅仅是会话类型
- local TEMP_ENV_FILE="/tmp/.dde-fm-env-$$"
+ # 使用 XDG_RUNTIME_DIR 而非 /tmp,更安全且符合 FHS 标准
+ local uid="$(id -u)"
+ local runtime_dir="${XDG_RUNTIME_DIR:-/run/user/$uid}"
+
+ # 使用 mktemp 创建真正随机的临时文件,防止竞态条件和符号链接攻击
+ local TEMP_ENV_FILE
+ TEMP_ENV_FILE=$(mktemp "$runtime_dir/dde-fm-env.XXXXXXXXXX") || {
+ echo "Error: Failed to create secure temp file" >&2
+ return 1
+ }
+
+ # 确保文件权限安全:仅当前用户可读写
+ chmod 600 "$TEMP_ENV_FILE"
echo "Capturing environment before elevating..."
# 捕获 DISPLAY, XAUTHORITY, 和 XDG_SESSION_TYPE
@@ -23,10 +34,10 @@ function run_pkexec() {
echo "run in pkexec: $@"
# 将 uid 和临时环境文件路径作为最后两个参数传递,确保解析的稳定性
- pkexec --disable-internal-agent "$0" "$@" "$(id -u)" "$TEMP_ENV_FILE"
+ pkexec --disable-internal-agent "$0" "$@" "$uid" "$TEMP_ENV_FILE"
- # 清理
- rm -f "$TEMP_ENV_FILE"
+ # 安全清理:强制删除并忽略错误
+ rm -f "$TEMP_ENV_FILE" 2>/dev/null
xhost -SI:localuser:root &>/dev/null
}
diff --git a/src/dfm-base/utils/fileutils.cpp b/src/dfm-base/utils/fileutils.cpp
index 3b9ac735a5..9462ade0a1 100644
--- a/src/dfm-base/utils/fileutils.cpp
+++ b/src/dfm-base/utils/fileutils.cpp
@@ -359,11 +359,8 @@ bool FileUtils::isCdRomDevice(const QUrl &url)
bool FileUtils::trashIsEmpty()
{
- const auto &cifsHost = NetworkUtils::cifsMountHostInfo();
- if (!cifsHost.isEmpty()) {
- const auto &mountPoint = cifsHost.constKeyValueBegin()->first;
- if (NetworkUtils::instance()->checkFtpOrSmbBusy(QUrl::fromLocalFile(mountPoint)))
- return true;
+ if (NetworkUtils::instance()->checkAllCIFSBusy()) {
+ return true;
}
// not use cache, because some times info unreliable, such as watcher inited temporality
diff --git a/src/dfm-base/utils/networkutils.cpp b/src/dfm-base/utils/networkutils.cpp
index 271fc67b4a..76d8c640c1 100644
--- a/src/dfm-base/utils/networkutils.cpp
+++ b/src/dfm-base/utils/networkutils.cpp
@@ -83,7 +83,7 @@ void NetworkUtils::doAfterCheckNet(const QString &host, const QStringList &ports
watcher->setFuture(QtConcurrent::run([host, ports, msecs]() {
if (ports.isEmpty()) {
qCInfo(logDFMBase) << "Network check skipped: no ports specified for host:" << host;
- return true; // skip check if ports are empty.
+ return true; // skip check if ports are empty.
}
for (const auto &port : ports) {
@@ -167,6 +167,18 @@ bool NetworkUtils::parseIp(const QString &mpt, QString &ip, QStringList &ports)
return false;
}
+bool NetworkUtils::checkAllCIFSBusy()
+{
+ const auto &cifsHost = NetworkUtils::cifsMountHostInfo();
+ for (const auto &mountPoint : cifsHost.keys()) {
+ if (NetworkUtils::instance()->checkFtpOrSmbBusy(QUrl::fromLocalFile(mountPoint))) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
bool NetworkUtils::checkFtpOrSmbBusy(const QUrl &url)
{
QString host;
diff --git a/src/dfm-base/utils/networkutils.h b/src/dfm-base/utils/networkutils.h
index ae6d357325..b35ec8bc5a 100644
--- a/src/dfm-base/utils/networkutils.h
+++ b/src/dfm-base/utils/networkutils.h
@@ -27,6 +27,7 @@ class NetworkUtils : public QObject
std::function callback = nullptr, int msecs = 3000);
bool parseIp(const QString &mpt, QString &ip, QString &port);
bool parseIp(const QString &mpt, QString &ip, QStringList &ports);
+ bool checkAllCIFSBusy();
bool checkFtpOrSmbBusy(const QUrl &url);
// if network mount,get network mount
static QMap cifsMountHostInfo();
diff --git a/src/dfm-base/utils/systempathutil.cpp b/src/dfm-base/utils/systempathutil.cpp
index 49f206560b..b5687a949f 100644
--- a/src/dfm-base/utils/systempathutil.cpp
+++ b/src/dfm-base/utils/systempathutil.cpp
@@ -203,43 +203,6 @@ void SystemPathUtil::loadSystemPaths()
}
}
-QList SystemPathUtil::canonicalUrlList(const QList &urls)
-{
- QList processedUrls;
- processedUrls.reserve(urls.size());
-
- for (const QUrl &url : urls) {
- if (!url.isLocalFile()) {
- processedUrls << url;
- continue;
- }
-
- auto info = InfoFactory::create(url);
- if (!info) {
- processedUrls << url;
- continue;
- }
-
- // 如果是符号链接文件
- if (info->isAttributes(OptInfoType::kIsSymLink)) {
- // 获取链接文件所在目录的真实路径
- QString parentPath = QFileInfo(url.path()).dir().canonicalPath();
- // 获取链接文件的名称
- QString fileName = QFileInfo(url.path()).fileName();
- // 组合出正确的路径
- QString realLinkPath = parentPath + "/" + fileName;
- processedUrls << QUrl::fromLocalFile(realLinkPath);
- continue;
- }
-
- // 非符号链接使用canonicalFilePath
- const QString canonicalPath = QFileInfo(url.path()).canonicalFilePath();
- processedUrls << (canonicalPath.isEmpty() ? url : QUrl::fromLocalFile(canonicalPath));
- }
-
- return processedUrls;
-}
-
QString SystemPathUtil::getRealpathSafely(const QString &path) const
{
QStringList components = path.split('/', Qt::SkipEmptyParts);
diff --git a/src/dfm-base/utils/systempathutil.h b/src/dfm-base/utils/systempathutil.h
index 113421ed9d..68e8edf913 100644
--- a/src/dfm-base/utils/systempathutil.h
+++ b/src/dfm-base/utils/systempathutil.h
@@ -29,7 +29,6 @@ class SystemPathUtil final : public QObject
QString systemPathIconNameByPath(QString path);
bool isSystemPath(QString path) const;
bool checkContainsSystemPath(const QList &urlList);
- QList canonicalUrlList(const QList &urls);
QString getRealpathSafely(const QString &path) const;
private:
diff --git a/src/dfm-base/utils/systemservicemanager.cpp b/src/dfm-base/utils/systemservicemanager.cpp
new file mode 100644
index 0000000000..ead08e0f97
--- /dev/null
+++ b/src/dfm-base/utils/systemservicemanager.cpp
@@ -0,0 +1,176 @@
+// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "systemservicemanager.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+using namespace dfmbase;
+
+// systemd D-Bus 服务相关常量
+static constexpr char kSystemdService[] { "org.freedesktop.systemd1" };
+static constexpr char kSystemdManagerPath[] { "/org/freedesktop/systemd1" };
+static constexpr char kSystemdManagerInterface[] { "org.freedesktop.systemd1.Manager" };
+static constexpr char kSystemdUnitInterface[] { "org.freedesktop.systemd1.Unit" };
+
+SystemServiceManager &SystemServiceManager::instance()
+{
+ static SystemServiceManager ins;
+ return ins;
+}
+
+SystemServiceManager::SystemServiceManager(QObject *parent)
+ : QObject(parent)
+{
+}
+
+bool SystemServiceManager::isServiceRunning(const QString &serviceName)
+{
+ if (serviceName.isEmpty()) {
+ qCWarning(logDFMBase) << "SystemServiceManager: Service name is empty";
+ return false;
+ }
+
+ QString unitPath = unitPathFromName(serviceName);
+ if (unitPath.isEmpty()) {
+ qCWarning(logDFMBase) << "SystemServiceManager: Failed to get unit path for" << serviceName;
+ return false;
+ }
+
+ QDBusInterface unitIface(
+ kSystemdService,
+ unitPath,
+ kSystemdUnitInterface,
+ QDBusConnection::systemBus());
+
+ if (!unitIface.isValid()) {
+ qCWarning(logDFMBase) << "SystemServiceManager: Invalid D-Bus interface for" << serviceName
+ << "Error:" << unitIface.lastError().message();
+ return false;
+ }
+
+ QVariant state = unitIface.property("SubState");
+ if (!state.isValid()) {
+ qCWarning(logDFMBase) << "SystemServiceManager: Failed to get SubState for" << serviceName;
+ return false;
+ }
+
+ return state.toString() == "running";
+}
+
+bool SystemServiceManager::startService(const QString &serviceName)
+{
+ if (serviceName.isEmpty()) {
+ qCWarning(logDFMBase) << "SystemServiceManager: Service name is empty";
+ return false;
+ }
+
+ QDBusInterface managerIface(
+ kSystemdService,
+ kSystemdManagerPath,
+ kSystemdManagerInterface,
+ QDBusConnection::systemBus());
+
+ if (!managerIface.isValid()) {
+ qCWarning(logDFMBase) << "SystemServiceManager: Invalid Manager D-Bus interface"
+ << "Error:" << managerIface.lastError().message();
+ return false;
+ }
+
+ // StartUnit 方法会自动通过 PolicyKit 进行鉴权
+ // 参数说明:
+ // - serviceName: 服务名称
+ // - "replace": 替换模式,如果已有挂起的启动任务则替换
+ QDBusReply reply = managerIface.call(
+ "StartUnit",
+ serviceName,
+ "replace");
+
+ bool success = reply.isValid();
+ if (!success) {
+ qCWarning(logDFMBase) << "SystemServiceManager: Failed to start service" << serviceName
+ << "Error:" << reply.error().message();
+ } else {
+ qCInfo(logDFMBase) << "SystemServiceManager: Successfully started service" << serviceName;
+ }
+
+ return success;
+}
+
+bool SystemServiceManager::enableServiceNow(const QString &serviceName)
+{
+ if (serviceName.isEmpty()) {
+ qCWarning(logDFMBase) << "SystemServiceManager: Service name is empty";
+ return false;
+ }
+
+ // pkexec 会查找 systemctl 的完整路径,但显式指定更安全
+ // 通常 systemctl 位于 /usr/bin/ 或 /bin/
+ // QStandardPaths::findExecutable 可以帮助找到它
+ QString program = "pkexec";
+ QStringList arguments;
+ arguments << "systemctl"
+ << "enable"
+ << "--now" << serviceName;
+
+ qCInfo(logDFMBase) << "SystemServiceManager: Executing:" << program << arguments.join(" ");
+
+ // 使用 QProcess::execute() 进行同步阻塞调用
+ // 这会等待命令执行完成,并返回退出码
+ int exitCode = QProcess::execute(program, arguments);
+
+ // 分析执行结果
+ bool success = (exitCode == 0);
+
+ if (success) {
+ qCInfo(logDFMBase) << "SystemServiceManager: Successfully enabled service" << serviceName;
+ } else {
+ // pkexec 的退出码有特殊含义:
+ // 127: 命令未找到
+ // 126: 用户取消了认证对话框
+ // 其他非零值: 执行错误
+ qCWarning(logDFMBase) << "SystemServiceManager: Failed to enable service" << serviceName
+ << "pkexec exited with code" << exitCode;
+ if (exitCode == 126) {
+ qCWarning(logDFMBase) << "SystemServiceManager: User cancelled the authentication dialog.";
+ }
+ }
+
+ return success;
+}
+
+QString SystemServiceManager::unitPathFromName(const QString &serviceName)
+{
+ if (serviceName.isEmpty()) {
+ return QString();
+ }
+
+ QDBusInterface managerIface(
+ kSystemdService,
+ kSystemdManagerPath,
+ kSystemdManagerInterface,
+ QDBusConnection::systemBus());
+
+ if (!managerIface.isValid()) {
+ qCWarning(logDFMBase) << "SystemServiceManager: Invalid Manager D-Bus interface"
+ << "Error:" << managerIface.lastError().message();
+ return QString();
+ }
+
+ // 使用 GetUnit 方法获取 unit 路径
+ QDBusReply reply = managerIface.call("GetUnit", serviceName);
+ if (!reply.isValid()) {
+ qCWarning(logDFMBase) << "SystemServiceManager: Failed to get unit path for" << serviceName
+ << "Error:" << reply.error().message();
+ return QString();
+ }
+
+ return reply.value().path();
+}
diff --git a/src/dfm-base/utils/systemservicemanager.h b/src/dfm-base/utils/systemservicemanager.h
new file mode 100644
index 0000000000..8e3c7531f9
--- /dev/null
+++ b/src/dfm-base/utils/systemservicemanager.h
@@ -0,0 +1,89 @@
+// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef SYSTEMSERVICEMANAGER_H
+#define SYSTEMSERVICEMANAGER_H
+
+#include
+
+#include
+#include
+
+namespace dfmbase {
+
+/**
+ * @class SystemServiceManager
+ * @brief 通用系统服务管理器
+ *
+ * 基于 systemd D-Bus 接口的服务管理器,提供统一的系统服务控制能力。
+ * 直接调用 org.freedesktop.systemd1.Manager,systemd 通过 PolicyKit 自动处理权限。
+ *
+ * 优势:
+ * - 标准化:使用 systemd 官方 D-Bus 接口
+ * - 安全性:systemd 自带 PolicyKit 策略保证权限安全
+ * - 可复用:dfm-base 中的实现可被所有插件使用
+ * - 易维护:无需维护自定义后端服务
+ *
+ * 架构:
+ * Frontend → systemd D-Bus API → PolicyKit(systemd) → systemd
+ */
+class SystemServiceManager : public QObject
+{
+ Q_OBJECT
+ Q_DISABLE_COPY(SystemServiceManager)
+
+public:
+ /**
+ * @brief 服务操作类型
+ */
+ enum ServiceAction {
+ Start, // 启动服务(临时)
+ Stop, // 停止服务
+ Restart, // 重启服务
+ Enable, // 开机自启(持久化)
+ Disable // 禁用自启
+ };
+
+ /**
+ * @brief 获取单例实例
+ * @return 单例引用
+ */
+ static SystemServiceManager &instance();
+
+ /**
+ * @brief 检查服务是否正在运行
+ * @param serviceName 服务名(如 "smbd.service")
+ * @return true 表示服务正在运行
+ */
+ bool isServiceRunning(const QString &serviceName);
+
+ /**
+ * @brief 启动服务(临时,重启后失效)
+ * @param serviceName 服务名
+ * @return true 表示操作成功
+ */
+ bool startService(const QString &serviceName);
+
+ /**
+ * @brief 启用服务开机自启(持久化)
+ * @param serviceName 服务名
+ * @return true 表示操作成功
+ */
+ bool enableServiceNow(const QString &serviceName);
+
+private:
+ explicit SystemServiceManager(QObject *parent = nullptr);
+ ~SystemServiceManager() override = default;
+
+ /**
+ * @brief 将服务名转换为 systemd unit 路径
+ * @param serviceName 服务名(如 "smbd.service")
+ * @return unit 路径(如 "/org/freedesktop/systemd1/unit/smbd_2eservice")
+ */
+ QString unitPathFromName(const QString &serviceName);
+};
+
+} // namespace dfmbase
+
+#endif // SYSTEMSERVICEMANAGER_H
diff --git a/src/plugins/common/dfmplugin-dirshare/utils/usersharehelper.cpp b/src/plugins/common/dfmplugin-dirshare/utils/usersharehelper.cpp
index c53f6f3533..ae6967461a 100644
--- a/src/plugins/common/dfmplugin-dirshare/utils/usersharehelper.cpp
+++ b/src/plugins/common/dfmplugin-dirshare/utils/usersharehelper.cpp
@@ -11,6 +11,7 @@
#include
#include
#include
+#include
#include
#include
@@ -46,8 +47,7 @@ static constexpr char kInterfaceInterface[] { "org.deepin.Filemanager.UserShareM
static constexpr char kFuncIsPasswordSet[] { "IsUserSharePasswordSet" };
static constexpr char kFuncSetPasswd[] { "SetUserSharePassword" };
static constexpr char kFuncCloseShare[] { "CloseSmbShareByShareName" };
-static constexpr char kFuncEnableSmbServices[] { "EnableSmbServices" };
-} // namespace DBusINterfaceInfo
+} // namespace DaemonServiceIFace
namespace ShareConfig {
static constexpr char kShareConfigPath[] { "/var/lib/samba/usershares" };
@@ -58,18 +58,6 @@ static constexpr char kShareComment[] { "comment" };
static constexpr char kGuestOk[] { "guest_ok" };
} // namespace ShareConfig
-namespace SambaServiceIFace {
-static constexpr char kService[] { "org.freedesktop.systemd1" };
-static constexpr char kPath[] { "/org/freedesktop/systemd1/unit/smbd_2eservice" };
-static constexpr char kInterface[] { "org.freedesktop.systemd1.Unit" };
-
-static constexpr char kPropertySubState[] { "SubState" };
-static constexpr char kExpectedSubState[] { "running" };
-
-static constexpr char kFuncStart[] { "Start" };
-static constexpr char kParamReplace[] { "replace" };
-}
-
UserShareHelper *UserShareHelper::instance()
{
static UserShareHelper helper;
@@ -266,14 +254,8 @@ void UserShareHelper::handleSetPassword(const QString &newPassword)
bool UserShareHelper::isSambaServiceRunning()
{
- QDBusInterface iface(SambaServiceIFace::kService, SambaServiceIFace::kPath, SambaServiceIFace::kInterface, QDBusConnection::systemBus());
-
- if (iface.isValid()) {
- const QVariant &variantStatus = iface.property(SambaServiceIFace::kPropertySubState); // 获取属性 SubState,等同于 systemctl status smbd 结果 Active 值
- if (variantStatus.isValid())
- return SambaServiceIFace::kExpectedSubState == variantStatus.toString();
- }
- return false;
+ // 使用 SystemServiceManager 统一检查服务状态(遵循 DRY 原则)
+ return SystemServiceManager::instance().isServiceRunning("smbd.service");
}
void UserShareHelper::startSambaServiceAsync(StartSambaFinished onFinished)
@@ -653,31 +635,21 @@ int UserShareHelper::validShareInfoCount() const
QPair UserShareHelper::startSmbService()
{
- QDBusInterface iface(SambaServiceIFace::kService, SambaServiceIFace::kPath, SambaServiceIFace::kInterface, QDBusConnection::systemBus());
- QDBusPendingReply reply = iface.asyncCall(SambaServiceIFace::kFuncStart, SambaServiceIFace::kParamReplace);
- reply.waitForFinished();
- if (reply.isValid()) {
- const QString &errMsg = reply.error().message();
- if (errMsg.isEmpty()) {
- if (!setSmbdAutoStart())
- fmWarning() << "auto start smbd failed.";
- return { true, "" };
- }
+ QString errMsg;
+ // 使用 SystemServiceManager 统一管理服务启动和启用
+ bool smbdOk = SystemServiceManager::instance().enableServiceNow("smbd.service");
+ if (!smbdOk) {
+ errMsg = "Failed to start and enable smbd.service";
return { false, errMsg };
}
- return { false, "restart smbd failed" };
-}
-bool UserShareHelper::setSmbdAutoStart()
-{
- QDBusInterface *interface = getUserShareInterface();
- if (!interface || !interface->isValid()) {
- fmWarning() << "UserShare D-Bus interface is not available when setting auto start";
- return false;
+ bool nmbdOk = SystemServiceManager::instance().enableServiceNow("nmbd.service");
+ if (!nmbdOk) {
+ errMsg = "Failed to start and enable nmbd.service";
+ return { false, errMsg };
}
- QDBusReply reply = interface->call(DaemonServiceIFace::kFuncEnableSmbServices);
- return reply.value();
+ return { true, "" };
}
bool UserShareHelper::isValidShare(const QVariantMap &info) const
diff --git a/src/plugins/common/dfmplugin-dirshare/utils/usersharehelper.h b/src/plugins/common/dfmplugin-dirshare/utils/usersharehelper.h
index 0b7b1dc679..42962b7f44 100644
--- a/src/plugins/common/dfmplugin-dirshare/utils/usersharehelper.h
+++ b/src/plugins/common/dfmplugin-dirshare/utils/usersharehelper.h
@@ -83,7 +83,6 @@ protected Q_SLOTS:
int validShareInfoCount() const;
QPair startSmbService();
- bool setSmbdAutoStart();
bool isValidShare(const ShareInfo &info) const;
diff --git a/src/plugins/common/dfmplugin-fileoperations/fileoperations/trashfiles/domovetotrashfilesworker.cpp b/src/plugins/common/dfmplugin-fileoperations/fileoperations/trashfiles/domovetotrashfilesworker.cpp
index 6fc06f1940..272bacaaa4 100644
--- a/src/plugins/common/dfmplugin-fileoperations/fileoperations/trashfiles/domovetotrashfilesworker.cpp
+++ b/src/plugins/common/dfmplugin-fileoperations/fileoperations/trashfiles/domovetotrashfilesworker.cpp
@@ -160,6 +160,8 @@ bool DoMoveToTrashFilesWorker::doMoveToTrash()
}
} while (action == AbstractJobHandler::SupportAction::kRetryAction && !isStopped());
+ checkRetry();
+
if (action == AbstractJobHandler::SupportAction::kNoAction
|| action == AbstractJobHandler::SupportAction::kSkipAction
|| action == AbstractJobHandler::SupportAction::kPermanentlyDelete) {
diff --git a/src/plugins/common/dfmplugin-fileoperations/fileoperationsevent/trashfileeventreceiver.cpp b/src/plugins/common/dfmplugin-fileoperations/fileoperationsevent/trashfileeventreceiver.cpp
index f6aadc8bd7..b642af55cb 100644
--- a/src/plugins/common/dfmplugin-fileoperations/fileoperationsevent/trashfileeventreceiver.cpp
+++ b/src/plugins/common/dfmplugin-fileoperations/fileoperationsevent/trashfileeventreceiver.cpp
@@ -53,7 +53,7 @@ TrashFileEventReceiver::TrashFileEventReceiver(QObject *parent)
future.waitForFinished();
fmInfo() << "TrashFileEventReceiver cleanup completed";
});
-
+
fmInfo() << "TrashFileEventReceiver initialized successfully";
}
@@ -83,11 +83,10 @@ JobHandlePointer TrashFileEventReceiver::doMoveToTrash(const quint64 windowId, c
}
// gio can only handle canonical file paths
- QList processedSources = SystemPathUtil::instance()->canonicalUrlList(sources);
- const QUrl &sourceFirst = processedSources.first();
+ const QUrl &sourceFirst = sources.first();
JobHandlePointer handle = nullptr;
bool nullDirDelete = false;
- if (processedSources.count() == 1) {
+ if (sources.count() == 1) {
auto info = InfoFactory::create(sourceFirst);
nullDirDelete = info && info->isAttributes(OptInfoType::kIsDir)
&& !info->isAttributes(OptInfoType::kIsSymLink)
@@ -95,22 +94,22 @@ JobHandlePointer TrashFileEventReceiver::doMoveToTrash(const quint64 windowId, c
}
if (nullDirDelete || !FileUtils::fileCanTrash(sourceFirst)) {
- fmInfo() << "File cannot be moved to trash, will perform direct delete operation:"
- << "nullDirDelete=" << nullDirDelete
+ fmInfo() << "File cannot be moved to trash, will perform direct delete operation:"
+ << "nullDirDelete=" << nullDirDelete
<< "canTrash=" << FileUtils::fileCanTrash(sourceFirst);
-
- if (DialogManagerInstance->showDeleteFilesDialog(processedSources, true) != QDialog::Accepted) {
+
+ if (DialogManagerInstance->showDeleteFilesDialog(sources, true) != QDialog::Accepted) {
fmInfo() << "Delete operation cancelled by user";
return nullptr;
}
- handle = copyMoveJob->deletes(processedSources, flags, isInit);
+ handle = copyMoveJob->deletes(sources, flags, isInit);
if (!isInit)
return handle;
} else {
fmInfo() << "Processing normal move to trash operation";
-
+
// check url permission
- QList urlsCanTrash = processedSources;
+ QList urlsCanTrash = sources;
if (!flags.testFlag(AbstractJobHandler::JobFlag::kRevocation) && Application::instance()->genericAttribute(Application::kShowDeleteConfirmDialog).toBool()) {
if (DialogManagerInstance->showNormalDeleteConfirmDialog(urlsCanTrash) != QDialog::Accepted) {
fmInfo() << "Move to trash operation cancelled by user";
@@ -123,7 +122,7 @@ JobHandlePointer TrashFileEventReceiver::doMoveToTrash(const quint64 windowId, c
}
if (handleCallback)
handleCallback(handle);
-
+
fmInfo() << "Move to trash operation completed successfully";
return handle;
}
@@ -145,7 +144,7 @@ JobHandlePointer TrashFileEventReceiver::doRestoreFromTrash(const quint64 window
return handle;
if (handleCallback)
handleCallback(handle);
-
+
fmInfo() << "Restore from trash operation completed successfully";
return handle;
}
@@ -166,7 +165,7 @@ JobHandlePointer TrashFileEventReceiver::doCopyFromTrash(const quint64 windowId,
JobHandlePointer handle = copyMoveJob->copyFromTrash(sources, target, flags);
if (handleCallback)
handleCallback(handle);
-
+
fmInfo() << "Copy from trash operation completed successfully";
return handle;
}
@@ -220,7 +219,7 @@ JobHandlePointer TrashFileEventReceiver::doCleanTrash(const quint64 windowId, co
FileOperationsEventHandler::instance()->handleJobResult(AbstractJobHandler::JobType::kCleanTrashType, handle);
if (handleCallback)
handleCallback(handle);
-
+
fmInfo() << "Clean trash operation completed successfully";
return handle;
}
@@ -232,12 +231,12 @@ void TrashFileEventReceiver::countTrashFile(const quint64 windowId, const DFMBAS
fmWarning() << "Count trash file operation aborted: receiver is stopping";
return;
}
-
+
fmInfo() << "Starting trash file enumeration";
DFMIO::DEnumerator enumerator(FileUtils::trashRootUrl());
QList allFilesList;
int processedCount = 0;
-
+
while (enumerator.hasNext()) {
if (stoped) {
fmWarning() << "Count trash file operation interrupted by stop signal";
@@ -323,7 +322,7 @@ void TrashFileEventReceiver::handleOperationRestoreFromTrash(const quint64 windo
DFMBASE_NAMESPACE::AbstractJobHandler::OperatorCallback callback)
{
fmInfo() << "Handling restore from trash operation with callback, window ID:" << windowId << "items count:" << sources.count();
-
+
JobHandlePointer handle = doRestoreFromTrash(windowId, sources, target, flags, handleCallback);
if (callback) {
AbstractJobHandler::CallbackArgus args(new QMap);
@@ -341,7 +340,7 @@ void TrashFileEventReceiver::handleOperationCleanTrash(const quint64 windowId, c
const QVariant custom, AbstractJobHandler::OperatorCallback callback)
{
fmInfo() << "Handling clean trash operation with callback, window ID:" << windowId << "items count:" << sources.count();
-
+
JobHandlePointer handle = doCleanTrash(windowId, sources, AbstractJobHandler::DeleteDialogNoticeType::kEmptyTrash, handleCallback);
if (callback) {
AbstractJobHandler::CallbackArgus args(new QMap);
@@ -371,7 +370,7 @@ void TrashFileEventReceiver::handleOperationCopyFromTrash(const quint64 windowId
AbstractJobHandler::OperatorCallback callback)
{
fmInfo() << "Handling copy from trash operation with callback, window ID:" << windowId << "items count:" << sources.count();
-
+
JobHandlePointer handle = doCopyFromTrash(windowId, sources, target, flags, handleCallback);
if (callback) {
AbstractJobHandler::CallbackArgus args(new QMap);
@@ -387,7 +386,7 @@ void TrashFileEventReceiver::handleOperationCopyFromTrash(const quint64 windowId
void TrashFileEventReceiver::handleSaveRedoOpt(const QString &token, const bool moreThanZero)
{
fmInfo() << "Processing save redo operation for token:" << token << "moreThanZero:" << moreThanZero;
-
+
QVariantMap ret;
{
QMutexLocker lk(&undoLock);
@@ -401,24 +400,24 @@ void TrashFileEventReceiver::handleSaveRedoOpt(const QString &token, const bool
fmWarning() << "Empty undo operation data for token:" << token;
return;
}
-
+
GlobalEventType undoEventType = static_cast(ret.value("undoevent").value());
QList undoSources = QUrl::fromStringList(ret.value("undosources").toStringList());
QList undoTargets = QUrl::fromStringList(ret.value("undotargets").toStringList());
GlobalEventType redoEventType = static_cast(ret.value("redoevent").value());
QList redoSources = QUrl::fromStringList(ret.value("redosources").toStringList());
QList redoTargets = QUrl::fromStringList(ret.value("redotargets").toStringList());
-
+
if (redoEventType == GlobalEventType::kTouchFile && moreThanZero) {
fmInfo() << "Skipping touch file redo operation due to size constraint";
return;
}
-
- fmInfo() << "Saving redo operation: undoType=" << static_cast(undoEventType)
+
+ fmInfo() << "Saving redo operation: undoType=" << static_cast(undoEventType)
<< "redoType=" << static_cast(redoEventType)
- << "undoSources=" << undoSources.count()
+ << "undoSources=" << undoSources.count()
<< "redoSources=" << redoSources.count();
-
+
// save operation by dbus
QVariantMap values;
values.insert("undoevent", QVariant::fromValue(static_cast(redoEventType)));
@@ -428,7 +427,7 @@ void TrashFileEventReceiver::handleSaveRedoOpt(const QString &token, const bool
values.insert("redosources", QUrl::toStringList(undoSources));
values.insert("redotargets", QUrl::toStringList(undoTargets));
dpfSignalDispatcher->publish(GlobalEventType::kSaveRedoOperator, values);
-
+
fmInfo() << "Redo operation saved successfully";
}
@@ -439,14 +438,14 @@ void TrashFileEventReceiver::handleOperationUndoMoveToTrash(const quint64 window
const QVariantMap &op)
{
fmInfo() << "Processing undo move to trash operation, window ID:" << windowId << "items count:" << sources.count();
-
+
auto handle = doMoveToTrash(windowId, sources, flags, handleCallback, false);
if (!handle) {
fmWarning() << "Failed to create job handle for undo move to trash operation";
return;
}
-
+
connect(handle.get(), &AbstractJobHandler::requestSaveRedoOperation, this,
&TrashFileEventReceiver::handleSaveRedoOpt);
{
@@ -459,20 +458,20 @@ void TrashFileEventReceiver::handleOperationUndoMoveToTrash(const quint64 window
if (handleCallback)
handleCallback(handle);
FileOperationsEventHandler::instance()->handleJobResult(AbstractJobHandler::JobType::kMoveToTrashType, handle);
-
+
fmInfo() << "Undo move to trash operation setup completed";
}
void TrashFileEventReceiver::handleOperationUndoRestoreFromTrash(const quint64 windowId, const QList &sources, const QUrl &target, const AbstractJobHandler::JobFlag flags, AbstractJobHandler::OperatorHandleCallback handleCallback, const QVariantMap &op)
{
fmInfo() << "Processing undo restore from trash operation, window ID:" << windowId << "items count:" << sources.count();
-
+
auto handle = doRestoreFromTrash(windowId, sources, target, flags, handleCallback, false);
if (!handle) {
fmWarning() << "Failed to create job handle for undo restore from trash operation";
return;
}
-
+
connect(handle.get(), &AbstractJobHandler::requestSaveRedoOperation, this,
&TrashFileEventReceiver::handleSaveRedoOpt);
{
@@ -485,7 +484,7 @@ void TrashFileEventReceiver::handleOperationUndoRestoreFromTrash(const quint64 w
if (handleCallback)
handleCallback(handle);
FileOperationsEventHandler::instance()->handleJobResult(AbstractJobHandler::JobType::kRestoreType, handle);
-
+
fmInfo() << "Undo restore from trash operation setup completed";
}
@@ -497,7 +496,7 @@ JobHandlePointer TrashFileEventReceiver::onCleanTrashUrls(const quint64 windowId
fmWarning() << "Clean trash URLs operation aborted: receiver is stopping";
return nullptr;
}
-
+
fmInfo() << "Executing clean trash URLs operation for" << sources.count() << "items";
return doCleanTrash(windowId, sources, deleteNoticeType, handleCallback, false);
}
diff --git a/src/plugins/common/dfmplugin-menu/menuscene/actioniconmenuscene.cpp b/src/plugins/common/dfmplugin-menu/menuscene/actioniconmenuscene.cpp
index 202a9e2b8b..66f0fcb4c8 100644
--- a/src/plugins/common/dfmplugin-menu/menuscene/actioniconmenuscene.cpp
+++ b/src/plugins/common/dfmplugin-menu/menuscene/actioniconmenuscene.cpp
@@ -10,10 +10,6 @@
#include
#include
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
-# include
-#endif
-
DPMENU_USE_NAMESPACE
AbstractMenuScene *ActionIconMenuCreator::create()
@@ -91,19 +87,5 @@ void ActionIconMenuScene::updateState(QMenu *parent)
bool ActionIconMenuScene::actionIconVisible() const
{
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
- // the gsetting control for action icon visible
- if (QGSettings::isSchemaInstalled("com.deepin.dde.filemanager.general")) {
- const QGSettings setting("com.deepin.dde.filemanager.general",
- "/com/deepin/dde/filemanager/general/");
-
- if (setting.keys().contains("contextMenuIcons")) {
- auto visible = setting.get("contextMenuIcons");
- if (visible.isValid())
- return visible.toBool();
- }
- }
-#endif
-
return false;
}
diff --git a/src/plugins/common/dfmplugin-menu/utils/menuhelper.cpp b/src/plugins/common/dfmplugin-menu/utils/menuhelper.cpp
index 1648472d7b..507abd0909 100644
--- a/src/plugins/common/dfmplugin-menu/utils/menuhelper.cpp
+++ b/src/plugins/common/dfmplugin-menu/utils/menuhelper.cpp
@@ -15,9 +15,6 @@
#include
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
-# include
-#endif
using namespace GlobalDConfDefines::ConfigPath;
namespace dfmplugin_menu {
@@ -72,16 +69,6 @@ bool isHiddenMenu(const QString &app)
bool isHiddenDesktopMenu()
{
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
- // the gsetting control is higher than json profile. it doesn't check json profile if there is gsetting value.
- if (QGSettings::isSchemaInstalled("com.deepin.dde.filemanager.desktop")) {
- QGSettings set("com.deepin.dde.filemanager.desktop", "/com/deepin/dde/filemanager/desktop/");
- QVariant var = set.get("contextMenu");
- if (var.isValid())
- return !var.toBool();
- }
-#endif
-
return Application::appObtuselySetting()->value("ApplicationAttribute", "DisableDesktopContextMenu", false).toBool();
}
diff --git a/src/plugins/common/dfmplugin-trashcore/events/trashcoreeventsender.cpp b/src/plugins/common/dfmplugin-trashcore/events/trashcoreeventsender.cpp
index 2dc556a798..76bf8a4d65 100644
--- a/src/plugins/common/dfmplugin-trashcore/events/trashcoreeventsender.cpp
+++ b/src/plugins/common/dfmplugin-trashcore/events/trashcoreeventsender.cpp
@@ -48,13 +48,9 @@ void TrashCoreEventSender::initTrashWatcher()
bool TrashCoreEventSender::checkAndStartWatcher()
{
- const auto &cifsHost = NetworkUtils::cifsMountHostInfo();
- if (!cifsHost.isEmpty()) {
- const auto &mountPoint = cifsHost.constKeyValueBegin()->first;
- if (NetworkUtils::instance()->checkFtpOrSmbBusy(QUrl::fromLocalFile(mountPoint))) {
- timer.start();
- return false;
- }
+ if (NetworkUtils::instance()->checkAllCIFSBusy()) {
+ timer.start();
+ return false;
}
return trashFileWatcher->startWatcher();
}
@@ -66,14 +62,14 @@ TrashCoreEventSender *TrashCoreEventSender::instance()
}
void TrashCoreEventSender::sendTrashStateChangedDel()
-{
+{
bool actuallyEmpty = FileUtils::trashIsEmpty();
TrashState newState = actuallyEmpty ? TrashState::Empty : TrashState::NotEmpty;
-
+
// Only send signal if state actually changed
if (trashState == TrashState::Unknown || newState != trashState) {
trashState = newState;
-
+
// Only send signal when trash becomes empty (files deleted)
if (trashState == TrashState::Empty) {
qInfo() << "TrashCore: Trash became empty, sending state changed signal";
diff --git a/src/plugins/desktop/ddplugin-canvas/model/canvasmodelfilter.cpp b/src/plugins/desktop/ddplugin-canvas/model/canvasmodelfilter.cpp
index 9acefda3ea..4b4a220552 100644
--- a/src/plugins/desktop/ddplugin-canvas/model/canvasmodelfilter.cpp
+++ b/src/plugins/desktop/ddplugin-canvas/model/canvasmodelfilter.cpp
@@ -115,29 +115,6 @@ InnerDesktopAppFilter::InnerDesktopAppFilter(CanvasProxyModel *model, QObject *p
hidden.insert("desktopComputer", false);
hidden.insert("desktopTrash", false);
hidden.insert("desktopHomeDirectory", false);
-
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
- if (QGSettings::isSchemaInstalled("com.deepin.dde.filemanager.desktop")) {
- gsettings = new QGSettings("com.deepin.dde.filemanager.desktop", "/com/deepin/dde/filemanager/desktop/");
- connect(gsettings, &QGSettings::changed, this, &InnerDesktopAppFilter::changed);
- update();
- }
-#endif
-}
-
-void InnerDesktopAppFilter::update()
-{
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
- if (gsettings) {
- for (auto iter = hidden.begin(); iter != hidden.end(); ++iter) {
- auto var = gsettings->get(iter.key());
- if (var.isValid())
- iter.value() = !var.toBool();
- else
- iter.value() = false;
- }
- }
-#endif
}
void InnerDesktopAppFilter::refreshModel()
@@ -177,11 +154,7 @@ bool InnerDesktopAppFilter::renameFilter(const QUrl &oldUrl, const QUrl &newUrl)
void InnerDesktopAppFilter::changed(const QString &key)
{
if (hidden.contains(key)) {
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
- auto var = gsettings->get(key);
-#else
QVariant var;
-#endif
bool old = hidden.value(key);
if (var.isValid())
hidden[key] = !var.toBool();
diff --git a/src/plugins/desktop/ddplugin-canvas/model/canvasmodelfilter.h b/src/plugins/desktop/ddplugin-canvas/model/canvasmodelfilter.h
index 08c5c4f6b1..71944c55b4 100644
--- a/src/plugins/desktop/ddplugin-canvas/model/canvasmodelfilter.h
+++ b/src/plugins/desktop/ddplugin-canvas/model/canvasmodelfilter.h
@@ -8,10 +8,6 @@
#include "ddplugin_canvas_global.h"
#include "canvasproxymodel.h"
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
-# include
-#endif
-
namespace ddplugin_canvas {
class CanvasModelFilter
@@ -44,7 +40,6 @@ class InnerDesktopAppFilter : public QObject, public CanvasModelFilter
Q_OBJECT
public:
explicit InnerDesktopAppFilter(CanvasProxyModel *model, QObject *parent = nullptr);
- void update();
void refreshModel();
bool resetFilter(QList &urls) override;
bool insertFilter(const QUrl &url) override;
@@ -53,9 +48,6 @@ public slots:
void changed(const QString &key);
protected:
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
- QGSettings *gsettings = nullptr;
-#endif
QMap keys;
QMap hidden;
};
diff --git a/src/plugins/desktop/ddplugin-canvas/view/canvasview.cpp b/src/plugins/desktop/ddplugin-canvas/view/canvasview.cpp
index 5692defb26..9c8fa0f868 100644
--- a/src/plugins/desktop/ddplugin-canvas/view/canvasview.cpp
+++ b/src/plugins/desktop/ddplugin-canvas/view/canvasview.cpp
@@ -26,10 +26,6 @@
#include
#include
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
-# include
-#endif
-
DFMBASE_USE_NAMESPACE
using namespace ddplugin_canvas;
@@ -961,11 +957,6 @@ bool CanvasViewPrivate::itemGridpos(const QString &item, QPoint &gridPos) const
bool CanvasViewPrivate::isWaterMaskOn()
{
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
- QGSettings desktopSettings("com.deepin.dde.filemanager.desktop", "/com/deepin/dde/filemanager/desktop/");
- if (desktopSettings.keys().contains("waterMask"))
- return desktopSettings.get("waterMask").toBool();
-#endif
return true;
}
diff --git a/src/plugins/desktop/ddplugin-organizer/models/filters/innerdesktopappfilter.cpp b/src/plugins/desktop/ddplugin-organizer/models/filters/innerdesktopappfilter.cpp
index 69a326e955..4e31de685e 100644
--- a/src/plugins/desktop/ddplugin-organizer/models/filters/innerdesktopappfilter.cpp
+++ b/src/plugins/desktop/ddplugin-organizer/models/filters/innerdesktopappfilter.cpp
@@ -21,29 +21,6 @@ InnerDesktopAppFilter::InnerDesktopAppFilter(QObject *parent)
hidden.insert("desktopComputer", false);
hidden.insert("desktopTrash", false);
hidden.insert("desktopHomeDirectory", false);
-
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
- if (QGSettings::isSchemaInstalled("com.deepin.dde.filemanager.desktop")) {
- gsettings = new QGSettings("com.deepin.dde.filemanager.desktop", "/com/deepin/dde/filemanager/desktop/");
- connect(gsettings, &QGSettings::changed, this, &InnerDesktopAppFilter::changed);
- update();
- }
-#endif
-}
-
-void ddplugin_organizer::InnerDesktopAppFilter::update()
-{
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
- if (gsettings) {
- for (auto iter = hidden.begin(); iter != hidden.end(); ++iter) {
- auto var = gsettings->get(iter.key());
- if (var.isValid())
- iter.value() = !var.toBool();
- else
- iter.value() = false;
- }
- }
-#endif
}
void InnerDesktopAppFilter::refreshModel()
@@ -76,20 +53,3 @@ bool InnerDesktopAppFilter::acceptRename(const QUrl &oldUrl, const QUrl &newUrl)
{
return acceptInsert(newUrl);
}
-
-void InnerDesktopAppFilter::changed(const QString &key)
-{
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
- if (hidden.contains(key)) {
- auto var = gsettings->get(key);
- bool old = hidden.value(key);
- if (var.isValid())
- hidden[key] = !var.toBool();
- else
- hidden[key] = false;
-
- if (old != hidden.value(key))
- refreshModel();
- }
-#endif
-}
diff --git a/src/plugins/desktop/ddplugin-organizer/models/filters/innerdesktopappfilter.h b/src/plugins/desktop/ddplugin-organizer/models/filters/innerdesktopappfilter.h
index 9eb518b542..4848b3711b 100644
--- a/src/plugins/desktop/ddplugin-organizer/models/filters/innerdesktopappfilter.h
+++ b/src/plugins/desktop/ddplugin-organizer/models/filters/innerdesktopappfilter.h
@@ -10,10 +10,6 @@
#include
#include
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
-# include
-#endif
-
namespace ddplugin_organizer {
class InnerDesktopAppFilter : public QObject, public ModelDataHandler
@@ -21,18 +17,12 @@ class InnerDesktopAppFilter : public QObject, public ModelDataHandler
Q_OBJECT
public:
explicit InnerDesktopAppFilter(QObject *parent = nullptr);
- void update();
void refreshModel();
bool acceptInsert(const QUrl &url) override;
QList acceptReset(const QList &urls) override;
bool acceptRename(const QUrl &oldUrl, const QUrl &newUrl) override;
-public slots:
- void changed(const QString &key);
protected:
-#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
- QGSettings *gsettings = nullptr;
-#endif
QMap keys;
QMap hidden;
};
diff --git a/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.cpp b/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.cpp
index b35656c825..d39c433269 100644
--- a/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.cpp
+++ b/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.cpp
@@ -12,6 +12,7 @@
#include
#include
#include
+#include
#include
#include
@@ -20,6 +21,7 @@
#include
#include
#include
+#include
Q_DECLARE_METATYPE(const char *)
using namespace GlobalDConfDefines::ConfigPath;
@@ -86,53 +88,22 @@ bool isServiceRuning(const QString &service)
return false;
}
- QDBusInterface iface("org.freedesktop.systemd1",
- QString("/org/freedesktop/systemd1/unit/%1d_2eservice").arg(service),
- "org.freedesktop.systemd1.Unit",
- QDBusConnection::systemBus());
-
- if (iface.isValid()) {
- const QVariant &variantStatus = iface.property("SubState"); // 获取属性 SubState,等同于 systemctl status smbd 结果 Active 值
- if (variantStatus.isValid())
- return "running" == variantStatus.toString();
- } else {
- fmWarning() << "Failed to create D-Bus interface for service:" << service;
- }
- return false;
+ // 使用 SystemServiceManager 检查服务状态
+ QString serviceName = QString("%1d.service").arg(service);
+ return dfmbase::SystemServiceManager::instance().isServiceRunning(serviceName);
}
-/*!
- * \brief startService
- * \param service: options { "smb" | "nmb" }
- * \return
- */
-bool startService(const QString &service)
+bool enableServiceNow(const QString &service)
{
if (service.isEmpty() || (service != "smb" && service != "nmb")) {
- fmWarning() << "Invalid service name for start operation:" << service;
+ fmWarning() << "Invalid service name for enable operation:" << service;
return false;
}
-
- fmDebug() << QString("activate smbd: construct %1d interface").arg(service);
- QDBusInterface iface("org.freedesktop.systemd1",
- QString("/org/freedesktop/systemd1/unit/%1d_2eservice").arg(service),
- "org.freedesktop.systemd1.Unit",
- QDBusConnection::systemBus());
- fmDebug() << QString("activate smbd: constructed %1d interface").arg(service);
-
- QDBusPendingCall call = iface.asyncCall("Start", "replace");
- call.waitForFinished();
- fmDebug() << QString("activate smbd: calling the %1d::Start method: ").arg(service) << call.isValid();
- return call.isValid();
-}
-
-void enableServiceAsync()
-{
- QDBusInterface iface("org.deepin.Filemanager.UserShareManager",
- "/org/deepin/Filemanager/UserShareManager",
- "org.deepin.Filemanager.UserShareManager",
- QDBusConnection::systemBus());
- iface.asyncCall("EnableSmbServices");
+ fmDebug() << "Enable service:" << service;
+ QString serviceName = QString("%1d.service").arg(service);
+ bool result = dfmbase::SystemServiceManager::instance().enableServiceNow(serviceName);
+ fmDebug() << "Service enable result for" << service << ":" << result;
+ return result;
}
bool checkAndEnableService(const QString &service)
@@ -143,8 +114,7 @@ bool checkAndEnableService(const QString &service)
}
fmDebug() << "Service not running, attempting to start:" << service;
- if (startService(service)) {
- enableServiceAsync();
+ if (enableServiceNow(service)) {
fmDebug() << "Successfully started and enabled service:" << service;
return true;
}
diff --git a/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.h b/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.h
index 941bcb55ff..8aa07179b8 100644
--- a/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.h
+++ b/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.h
@@ -25,8 +25,7 @@ QString getDeviceIdByStdSmb(const QString &stdSmb);
// service utils
bool isServiceRuning(const QString &service);
-bool startService(const QString &service);
-void enableServiceAsync();
+bool enableServiceNow(const QString &service);
bool checkAndEnableService(const QString &service);
void initSettingPane();
diff --git a/src/services/sharecontrol/sharecontroldbus.cpp b/src/services/sharecontrol/sharecontroldbus.cpp
index af3644019e..69bf172d23 100644
--- a/src/services/sharecontrol/sharecontroldbus.cpp
+++ b/src/services/sharecontrol/sharecontroldbus.cpp
@@ -179,38 +179,6 @@ bool ShareControlDBus::SetUserSharePassword(const QDBusUnixFileDescriptor &crede
return r;
}
-bool ShareControlDBus::EnableSmbServices()
-{
- fmInfo() << "[ShareControlDBus::EnableSmbServices] Request to enable SMB services";
-
- if (!checkAuthentication()) {
- fmWarning() << "[ShareControlDBus::EnableSmbServices] Authentication failed for enabling SMB services";
- return false;
- }
-
- QProcess sh;
- fmInfo() << "[ShareControlDBus::EnableSmbServices] Enabling smbd service";
- sh.start("ln", { "-sf", "/lib/systemd/system/smbd.service", "/etc/systemd/system/multi-user.target.wants/smbd.service" });
- auto ret = sh.waitForFinished();
- if (ret) {
- fmInfo() << "[ShareControlDBus::EnableSmbServices] Successfully enabled smbd service";
- } else {
- fmCritical() << "[ShareControlDBus::EnableSmbServices] Failed to enable smbd service";
- }
-
- fmInfo() << "[ShareControlDBus::EnableSmbServices] Enabling nmbd service";
- sh.start("ln", { "-sf", "/lib/systemd/system/nmbd.service", "/etc/systemd/system/multi-user.target.wants/nmbd.service" });
- ret &= sh.waitForFinished();
- if (ret) {
- fmInfo() << "[ShareControlDBus::EnableSmbServices] Successfully enabled nmbd service";
- } else {
- fmCritical() << "[ShareControlDBus::EnableSmbServices] Failed to enable nmbd service";
- }
-
- fmInfo() << "[ShareControlDBus::EnableSmbServices] SMB services enablement completed with result:" << ret;
- return ret;
-}
-
bool ShareControlDBus::IsUserSharePasswordSet(const QString &username)
{
fmInfo() << "[ShareControlDBus::IsUserSharePasswordSet] Checking if password is set for user:" << username;
diff --git a/src/services/sharecontrol/sharecontroldbus.h b/src/services/sharecontrol/sharecontroldbus.h
index cf0b54e5d7..841872f25f 100644
--- a/src/services/sharecontrol/sharecontroldbus.h
+++ b/src/services/sharecontrol/sharecontroldbus.h
@@ -22,7 +22,6 @@ class ShareControlDBus : public QObject, public QDBusContext
public slots:
Q_SCRIPTABLE bool CloseSmbShareByShareName(const QString &name, bool show);
Q_SCRIPTABLE bool SetUserSharePassword(const QDBusUnixFileDescriptor &credentialsFd);
- Q_SCRIPTABLE bool EnableSmbServices();
Q_SCRIPTABLE bool IsUserSharePasswordSet(const QString &username);
protected: