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: