Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 23 additions & 9 deletions service/diskmanagerservice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,12 @@ bool DiskManagerService::mount(const QString &mountpath)
return false;
}

QString invokerUid = QString::number(connection().interface()->serviceUid(message().service()).value());
QDBusReply<uint> uidReply = connection().interface()->serviceUid(message().service());
if (!uidReply.isValid()) {
qWarning() << "Failed to get invoker UID for mount, refusing operation";
return false;
}
QString invokerUid = QString::number(uidReply.value());
return m_partedcore->mountAndWriteFstab(mountpath, invokerUid);
}

Expand Down Expand Up @@ -502,16 +507,25 @@ bool DiskManagerService::checkAuthorization(void)
QString actionId("com.deepin.pkexec.deepin-diskmanager");
QString serviceName = message().service();

if (serviceName == m_frontEndDBusName ||
connection().interface()->serviceUid(serviceName).value() == 0 ||
PolicyKitHelper::instance()->checkAuthorization(actionId, serviceName)) {
qDebug() << "Authorization granted for service:" << serviceName;
if (serviceName == m_frontEndDBusName) {
qDebug() << "Authorization granted for frontend:" << serviceName;
return true;
}

QDBusReply<uint> uidReply = connection().interface()->serviceUid(serviceName);
if (uidReply.isValid() && uidReply.value() == 0) {
qDebug() << "Authorization granted for root user";
return true;
} else {
qWarning() << "Authorization denied for service:" << serviceName;
sendErrorReply(QDBusError::AccessDenied);
return false;
}

if (PolicyKitHelper::instance()->checkAuthorization(actionId, serviceName)) {
qDebug() << "Authorization granted via Polkit for service:" << serviceName;
return true;
}

qWarning() << "Authorization denied for service:" << serviceName;
sendErrorReply(QDBusError::AccessDenied);
return false;
#endif
}

Expand Down
7 changes: 1 addition & 6 deletions service/diskoperation/filesystems/btrfs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -386,12 +386,7 @@ double Btrfs::btrfsSize2Double(QString &str)
double num = numStr.toDouble();
int index = str.indexOf(numStr);
int pos = index + numStr.length();
if (pos < str.length()) {
qDebug() << "pos < str.length()";
char unit = str.at(pos).toLatin1();

}
char unit = str.at(pos).toLatin1();
char unit = (pos < str.length()) ? str.at(pos).toLatin1() : '\0';
Byte_Value mult;
switch (unit) {
case 'K': mult = KIBIBYTE ; break ;
Expand Down
17 changes: 12 additions & 5 deletions service/diskoperation/luksoperator/luksoperator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@

#include "luksoperator.h"
#include "../fsinfo.h"
#include <QFile>

Check warning on line 8 in service/diskoperation/luksoperator/luksoperator.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QFile> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <QSaveFile>

Check warning on line 9 in service/diskoperation/luksoperator/luksoperator.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QSaveFile> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <QDir>

Check warning on line 10 in service/diskoperation/luksoperator/luksoperator.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QDir> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <QDateTime>

Check warning on line 11 in service/diskoperation/luksoperator/luksoperator.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QDateTime> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <QJsonDocument>

Check warning on line 12 in service/diskoperation/luksoperator/luksoperator.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QJsonDocument> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <QJsonObject>
#include <QProcess>
#include <QTextStream>
Expand Down Expand Up @@ -668,6 +669,7 @@
qDebug() << "open /etc/crypttab failed, return false";
return false;
}
QFileDevice::Permissions origPerm = file.permissions();

// read crypttab
bool findflag = false; //目前默认只改第一个发现的uuid findflag 标志位:是否已经查找到uuid
Expand Down Expand Up @@ -698,18 +700,23 @@
}
file.close();

//write crypttab
if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
// 原子写入:先写临时文件,再 rename 到 /etc/crypttab,避免 TOCTOU 竞态
QSaveFile saveFile(QStringLiteral("/etc/crypttab"));
if (!saveFile.open(QIODevice::WriteOnly)) {
qDebug() << "open /etc/crypttab for write failed, return false";
return false;
}

QTextStream out(&file);
QTextStream out(&saveFile);
for (int i = 0; i < list.count(); i++) {
out << list.at(i);
}
out.flush();
file.close();
if (!saveFile.commit()) {
qDebug() << "commit /etc/crypttab failed, return false";
return false;
}
// 恢复原文件权限,避免 QSaveFile 使用临时文件导致权限被 umask 改变
QFile::setPermissions(QStringLiteral("/etc/crypttab"), origPerm);
qDebug() << "Successfully created key file:" << filePath;
qDebug() << "LUKSOperator::wirteCrypttab END";
return true;
Expand Down