diff --git a/src/dbus/applicationmanager1service.cpp b/src/dbus/applicationmanager1service.cpp index a70b3c4..46f40ae 100644 --- a/src/dbus/applicationmanager1service.cpp +++ b/src/dbus/applicationmanager1service.cpp @@ -547,13 +547,13 @@ QString ApplicationManager1Service::Identify(const QDBusUnixFileDescriptor &pidf auto pid = getPidFromPidFd(pidfd); if (pid == 0) { - sendErrorReply(QDBusError::Failed, "pid is invalid"); + safe_sendErrorReply(QDBusError::Failed, "pid is invalid"); return {}; } const auto ret = m_identifier->Identify(pid); if (ret.ApplicationId.isEmpty()) { - sendErrorReply(QDBusError::Failed, "Identify failed."); + safe_sendErrorReply(QDBusError::Failed, "Identify failed."); return {}; } @@ -562,7 +562,7 @@ QString ApplicationManager1Service::Identify(const QDBusUnixFileDescriptor &pidf }); if (app == m_applicationList.cend()) { - sendErrorReply(QDBusError::Failed, "can't find application:" % ret.ApplicationId); + safe_sendErrorReply(QDBusError::Failed, "can't find application:" % ret.ApplicationId); return {}; } @@ -575,7 +575,7 @@ QString ApplicationManager1Service::Identify(const QDBusUnixFileDescriptor &pidf instancePath = (*app)->findInstance(ret.InstanceId); } if (instancePath.path().isEmpty()) { - sendErrorReply(QDBusError::Failed, "can't find instance:" % ret.InstanceId); + safe_sendErrorReply(QDBusError::Failed, "can't find instance:" % ret.InstanceId); return {}; } @@ -706,14 +706,14 @@ ApplicationManager1Service::findApplicationsByIds(const QStringList &appIds) con QString ApplicationManager1Service::addUserApplication(const QVariantMap &desktop_file, const QString &name) noexcept { if (name.isEmpty()) { - sendErrorReply(QDBusError::Failed, "file name is empty."); + safe_sendErrorReply(QDBusError::Failed, "file name is empty."); return {}; } QDir xdgDataHome; QString dir{getXDGDataHome() + "/applications"}; if (!xdgDataHome.mkpath(dir)) { - sendErrorReply(QDBusError::Failed, "couldn't create directory of user applications."); + safe_sendErrorReply(QDBusError::Failed, "couldn't create directory of user applications."); return {}; } @@ -721,13 +721,13 @@ QString ApplicationManager1Service::addUserApplication(const QVariantMap &deskto const auto &filePath = xdgDataHome.filePath(name); if (QFileInfo info{filePath}; info.exists() and info.isFile()) { - sendErrorReply(QDBusError::Failed, QString{"file already exists:%1"}.arg(info.absoluteFilePath())); + safe_sendErrorReply(QDBusError::Failed, QString{"file already exists:%1"}.arg(info.absoluteFilePath())); return {}; } QFile file{filePath}; if (!file.open(QFile::NewOnly | QFile::WriteOnly | QFile::Text)) { - sendErrorReply(QDBusError::Failed, file.errorString()); + safe_sendErrorReply(QDBusError::Failed, file.errorString()); return {}; } @@ -735,14 +735,14 @@ QString ApplicationManager1Service::addUserApplication(const QVariantMap &deskto auto fileContent = DesktopFileGenerator::generate(desktop_file, errMsg); if (fileContent.isEmpty() or !errMsg.isEmpty()) { file.remove(); - sendErrorReply(QDBusError::Failed, errMsg); + safe_sendErrorReply(QDBusError::Failed, errMsg); return {}; } auto writeContent = fileContent.toLocal8Bit(); if (file.write(writeContent) != writeContent.size()) { file.remove(); - sendErrorReply(QDBusError::Failed, "incomplete file content.this file will be removed."); + safe_sendErrorReply(QDBusError::Failed, "incomplete file content.this file will be removed."); return {}; } @@ -753,13 +753,13 @@ QString ApplicationManager1Service::addUserApplication(const QVariantMap &deskto if (err != ParserError::NoError) { file.remove(); qDebug() << "add user's application failed:" << err; - sendErrorReply(QDBusError::Failed, "search failed."); + safe_sendErrorReply(QDBusError::Failed, "search failed."); return {}; } if (!ret) { file.remove(); - sendErrorReply(QDBusError::InternalError); + safe_sendErrorReply(QDBusError::InternalError); return {}; } @@ -767,7 +767,7 @@ QString ApplicationManager1Service::addUserApplication(const QVariantMap &deskto auto appId = desktopSource.desktopId(); if (!addApplication(std::move(desktopSource))) { file.remove(); - sendErrorReply(QDBusError::Failed, "add application to ApplicationManager failed."); + safe_sendErrorReply(QDBusError::Failed, "add application to ApplicationManager failed."); return {}; } diff --git a/src/dbus/applicationservice.cpp b/src/dbus/applicationservice.cpp index 0ffc61d..c43a9c6 100644 --- a/src/dbus/applicationservice.cpp +++ b/src/dbus/applicationservice.cpp @@ -232,9 +232,7 @@ ApplicationService::Launch(const QString &action, const QStringList &fields, con if (!Actions) { QString msg{"application can't be executed."}; qWarning() << msg; - if (calledFromDBus()) { - sendErrorReply(QDBusError::Failed, msg); - } + safe_sendErrorReply(QDBusError::Failed, msg); return {}; } @@ -242,9 +240,7 @@ ApplicationService::Launch(const QString &action, const QStringList &fields, con if (execStr.isEmpty()) { QString msg{"maybe entry actions's format is invalid, abort launch."}; qWarning() << msg; - if (calledFromDBus()) { - sendErrorReply(QDBusError::Failed, msg); - } + safe_sendErrorReply(QDBusError::Failed, msg); return {}; } } @@ -258,18 +254,14 @@ ApplicationService::Launch(const QString &action, const QStringList &fields, con auto cmds = generateCommand(optionsMap); auto task = unescapeExec(execStr, fields); if (!task) { - if (calledFromDBus()) { - sendErrorReply(QDBusError::InternalError, "Invalid Command."); - } + safe_sendErrorReply(QDBusError::InternalError, "Invalid Command."); return {}; } auto [bin, execCmds, res] = std::move(task); if (bin.isEmpty()) { qCritical() << "error command is detected, abort."; - if (calledFromDBus()) { - sendErrorReply(QDBusError::Failed); - } + safe_sendErrorReply(QDBusError::Failed); return {}; } @@ -352,7 +344,7 @@ bool ApplicationService::SendToDesktop() const noexcept auto success = m_desktopSource.sourceFileRef().link(desktopFile); if (!success) { qDebug() << "create link failed:" << m_desktopSource.sourceFileRef().errorString() << "path:" << desktopFile; - sendErrorReply(QDBusError::ErrorType::Failed, m_desktopSource.sourceFileRef().errorString()); + safe_sendErrorReply(QDBusError::ErrorType::Failed, m_desktopSource.sourceFileRef().errorString()); } return success; @@ -375,7 +367,7 @@ bool ApplicationService::RemoveFromDesktop() const noexcept if (!success) { qDebug() << "remove desktop file failed:" << desktopFile.errorString(); - sendErrorReply(QDBusError::ErrorType::Failed, desktopFile.errorString()); + safe_sendErrorReply(QDBusError::ErrorType::Failed, desktopFile.errorString()); } return success; @@ -568,19 +560,19 @@ void ApplicationService::setEnviron(const QString &value) noexcept auto storagePtr = m_storage.lock(); if (!storagePtr) { qCritical() << "broken storage."; - sendErrorReply(QDBusError::InternalError); + safe_sendErrorReply(QDBusError::InternalError); return; } auto appId = id(); if (!storagePtr->readApplicationValue(appId, ApplicationPropertiesGroup, Environ).isNull()) { if (!storagePtr->updateApplicationValue(appId, ApplicationPropertiesGroup, Environ, value)) { - sendErrorReply(QDBusError::Failed, "update environ failed."); + safe_sendErrorReply(QDBusError::Failed, "update environ failed."); return; } } else { if (!storagePtr->createApplicationValue(appId, ApplicationPropertiesGroup, Environ, value)) { - sendErrorReply(QDBusError::Failed, "set environ failed."); + safe_sendErrorReply(QDBusError::Failed, "set environ failed."); } } @@ -664,7 +656,7 @@ void ApplicationService::setAutoStart(bool autostart) noexcept QFile autostartFile{fileName}; if (!autostartFile.open(QFile::WriteOnly | QFile::Text | QFile::Truncate)) { qWarning() << "open file" << fileName << "failed:" << autostartFile.error(); - sendErrorReply(QDBusError::Failed); + safe_sendErrorReply(QDBusError::Failed); return; } @@ -690,7 +682,7 @@ void ApplicationService::setAutoStart(bool autostart) noexcept if (writeBytes != hideAutostart.size() or !autostartFile.flush()) { qWarning() << "incomplete write:" << autostartFile.error(); - sendErrorReply(QDBusError::Failed, "set failed: filesystem error."); + safe_sendErrorReply(QDBusError::Failed, "set failed: filesystem error."); return; } @@ -755,7 +747,7 @@ void ApplicationService::setMimeTypes(const QStringList &value) noexcept auto &infos = parent()->mimeManager().infos(); auto userInfo = std::find_if(infos.begin(), infos.end(), [](const MimeInfo &info) { return info.directory() == userDir; }); if (userInfo == infos.cend()) { - sendErrorReply(QDBusError::Failed, "user-specific config file doesn't exists."); + safe_sendErrorReply(QDBusError::Failed, "user-specific config file doesn't exists."); return; } diff --git a/src/dbus/instanceservice.cpp b/src/dbus/instanceservice.cpp index afec0df..88f2aa4 100644 --- a/src/dbus/instanceservice.cpp +++ b/src/dbus/instanceservice.cpp @@ -34,5 +34,5 @@ void InstanceService::KillAll(int signal) return; } - sendErrorReply(reply.errorName(), reply.errorMessage()); + safe_sendErrorReply(reply.errorName(), reply.errorMessage()); } diff --git a/src/dbus/mimemanager1service.cpp b/src/dbus/mimemanager1service.cpp index 2024981..7d4f224 100644 --- a/src/dbus/mimemanager1service.cpp +++ b/src/dbus/mimemanager1service.cpp @@ -92,7 +92,7 @@ void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) n auto &app = m_infos.front().appsList(); if (app.empty()) { - sendErrorReply(QDBusError::InternalError); + safe_sendErrorReply(QDBusError::InternalError); return; } @@ -101,7 +101,7 @@ void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) n if (userConfig == app.end()) { qWarning() << "couldn't find user mimeApps"; - sendErrorReply(QDBusError::InternalError); + safe_sendErrorReply(QDBusError::InternalError); return; } @@ -110,7 +110,7 @@ void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) n } if (!userConfig->writeToFile()) { - sendErrorReply(QDBusError::Failed, "set default app failed, these config will be reset after re-login."); + safe_sendErrorReply(QDBusError::Failed, "set default app failed, these config will be reset after re-login."); } } @@ -121,7 +121,7 @@ void MimeManager1Service::unsetDefaultApplication(const QStringList &mimeTypes) if (userConfig == app.end()) { qWarning() << "couldn't find user mimeApps"; - sendErrorReply(QDBusError::InternalError); + safe_sendErrorReply(QDBusError::InternalError); return; } @@ -130,7 +130,7 @@ void MimeManager1Service::unsetDefaultApplication(const QStringList &mimeTypes) } if (!userConfig->writeToFile()) { - sendErrorReply(QDBusError::Failed, "unset default app failed, these config will be reset after re-login."); + safe_sendErrorReply(QDBusError::Failed, "unset default app failed, these config will be reset after re-login."); } } diff --git a/src/global.h b/src/global.h index 0b86caa..3dd96eb 100644 --- a/src/global.h +++ b/src/global.h @@ -651,4 +651,6 @@ inline int pidfd_open(pid_t pid, uint flags) return syscall(SYS_pidfd_open, pid, flags); } +#define safe_sendErrorReply if (calledFromDBus()) sendErrorReply + #endif