Skip to content

Commit 7731c4d

Browse files
itsXuStdeepin-bot[bot]
authored andcommitted
fix: [249531/encrypt] redecrypt, dev status, menu entry.
as title. Log: as title. Bug: https://pms.uniontech.com/bug-view-249531.html
1 parent ff8df60 commit 7731c4d

5 files changed

Lines changed: 79 additions & 26 deletions

File tree

src/dde-file-manager-daemon/daemonplugin-file-encrypt/encrypt/diskencrypt.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,8 +710,17 @@ int block_device_utils::bcDevEncryptStatus(const QString &device, EncryptStates
710710
struct crypt_device *cdev { nullptr };
711711
dfmbase::FinallyUtil finalClear([&] {if (cdev) crypt_free(cdev); });
712712

713-
int ret = crypt_init(&cdev,
713+
int ret = 0;
714+
715+
QString backHeader = "/boot/usec-crypt/" + QString(kDecryptHeaderPrefix) + device.mid(5);
716+
if (QFile(backHeader).exists()) {
717+
ret = crypt_init_data_device(&cdev,
718+
backHeader.toStdString().c_str(),
719+
device.toStdString().c_str());
720+
} else {
721+
ret = crypt_init(&cdev,
714722
device.toStdString().c_str());
723+
}
715724
CHECK_INT(ret, "init device failed " + device, -kErrorInitCrypt);
716725

717726
ret = crypt_load(cdev, CRYPT_LUKS, nullptr);

src/dde-file-manager/dfmplugin-disk-encrypt-entry/events/eventshandler.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ bool EventsHandler::onAcquireDevicePwd(const QString &dev, QString *pwd, bool *c
317317
if (!pwd || !cancelled)
318318
return false;
319319

320-
if (EventsHandler::instance()->isUnderOperating(dev)) {
320+
if (!canUnlock(dev)) {
321321
*cancelled = true;
322322
return true;
323323
}
@@ -535,6 +535,21 @@ void EventsHandler::requestReboot()
535535
sessMng.asyncCall("RequestReboot");
536536
}
537537

538+
bool EventsHandler::canUnlock(const QString &device)
539+
{
540+
if (EventsHandler::instance()->isUnderOperating(device)) {
541+
return false;
542+
}
543+
544+
if (device == unfinishedDecryptJob()) {
545+
dialog_utils::showDialog(tr("Error"),
546+
tr("Device is not fully decrypted, please finish decryption before access."),
547+
dialog_utils::DialogType::kInfo);
548+
return false;
549+
}
550+
return true;
551+
}
552+
538553
void EventsHandler::autoStartDFM()
539554
{
540555
qInfo() << "autostart is going to added...";

src/dde-file-manager/dfmplugin-disk-encrypt-entry/events/eventshandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ private Q_SLOTS:
4747
void showChgPwdError(const QString &device, const QString &devName, int code);
4848

4949
void requestReboot();
50+
bool canUnlock(const QString &device);
5051

5152
private:
5253
explicit EventsHandler(QObject *parent = nullptr);

src/dde-file-manager/dfmplugin-disk-encrypt-entry/menu/diskencryptmenuscene.cpp

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@ using namespace dfmplugin_diskenc;
3535
using namespace disk_encrypt;
3636

3737
static constexpr char kActIDEncrypt[] { "de_0_encrypt" };
38-
static constexpr char kActIDResume[] { "de_0_resume" };
38+
static constexpr char kActIDResumeEncrypt[] { "de_0_resumeEncrypt" };
3939
static constexpr char kActIDUnlock[] { "de_0_unlock" };
4040
static constexpr char kActIDDecrypt[] { "de_1_decrypt" };
41+
static constexpr char kActIDResumeDecrypt[] { "de_1_resumeDecrypt" };
4142
static constexpr char kActIDChangePwd[] { "de_2_changePwd" };
4243

4344
DiskEncryptMenuScene::DiskEncryptMenuScene(QObject *parent)
@@ -145,8 +146,12 @@ bool DiskEncryptMenuScene::create(QMenu *)
145146
actions.insert(kActIDChangePwd, act);
146147

147148
act = new QAction(tr("Continue partition encryption"));
148-
act->setProperty(ActionPropertyKey::kActionID, kActIDResume);
149-
actions.insert(kActIDResume, act);
149+
act->setProperty(ActionPropertyKey::kActionID, kActIDResumeEncrypt);
150+
actions.insert(kActIDResumeEncrypt, act);
151+
152+
act = new QAction(tr("Continue partition decryption"));
153+
act->setProperty(ActionPropertyKey::kActionID, kActIDResumeDecrypt);
154+
actions.insert(kActIDResumeDecrypt, act);
150155

151156
act = new QAction(tr("Enable partition encryption"));
152157
act->setProperty(ActionPropertyKey::kActionID, kActIDEncrypt);
@@ -161,9 +166,9 @@ bool DiskEncryptMenuScene::triggered(QAction *action)
161166

162167
if (actID == kActIDEncrypt) {
163168
encryptDevice(param);
164-
} else if (actID == kActIDResume) {
169+
} else if (actID == kActIDResumeEncrypt) {
165170
EventsHandler::instance()->resumeEncrypt(param.devDesc);
166-
} else if (actID == kActIDDecrypt) {
171+
} else if (actID == kActIDDecrypt || actID == kActIDResumeDecrypt) {
167172
QString displayName = QString("%1(%2)").arg(param.deviceDisplayName).arg(param.devDesc.mid(5));
168173
if (dialog_utils::showConfirmDecryptionDialog(displayName, param.initOnly) != QDialog::Accepted)
169174
return true;
@@ -593,22 +598,47 @@ void DiskEncryptMenuScene::updateActions()
593598
act->setEnabled(false);
594599
});
595600

601+
// update operatable
602+
bool taskWorking = EventsHandler::instance()->isTaskWorking();
603+
bool currDevOperating = EventsHandler::instance()->isUnderOperating(param.devDesc);
604+
bool hasPendingJob = EventsHandler::instance()->hasPendingTask();
605+
actions[kActIDEncrypt]->setEnabled(!taskWorking && !hasPendingJob);
606+
actions[kActIDDecrypt]->setEnabled(!taskWorking && !hasPendingJob && !currDevOperating);
607+
actions[kActIDChangePwd]->setEnabled(!taskWorking);
608+
actions[kActIDResumeEncrypt]->setEnabled(!taskWorking && !currDevOperating);
609+
actions[kActIDUnlock]->setEnabled(!currDevOperating);
610+
596611
// update visibility
597612
if (hasCryptHeader) {
598-
bool unlocked = selectedItemInfo.value("CleartextDevice").toString() != "/";
599613
int states = EventsHandler::instance()->deviceEncryptStatus(param.devDesc);
600-
if (states & kStatusFinished) { // fully encrypted
614+
// fully encrypted
615+
if (states & kStatusFinished) {
616+
bool unlocked = selectedItemInfo.value("CleartextDevice").toString() != "/";
601617
actions[kActIDDecrypt]->setVisible(true);
602618
actions[kActIDUnlock]->setVisible(!unlocked);
603619
if (param.type != disk_encrypt::kTPMOnly)
604620
actions[kActIDChangePwd]->setVisible(true);
605-
} else if (states & (kStatusOnline | kStatusEncrypt)) { // not fully encrypted
606-
if (states & kStatusNoEncryptConfig) {
607-
param.isDetachedHeader = true;
608-
actions[kActIDEncrypt]->setVisible(true);
609-
} else {
610-
param.isDetachedHeader = false;
611-
actions[kActIDResume]->setVisible(true);
621+
}
622+
// not finished
623+
else if (states & kStatusOnline) {
624+
// encrytp not finish
625+
if (states & kStatusEncrypt) {
626+
if (states & kStatusNoEncryptConfig) {
627+
param.isDetachedHeader = true;
628+
actions[kActIDEncrypt]->setVisible(true);
629+
} else {
630+
param.isDetachedHeader = false;
631+
actions[kActIDResumeEncrypt]->setVisible(true);
632+
}
633+
}
634+
// decrypt not finish
635+
else if (states & kStatusDecrypt) {
636+
actions[kActIDDecrypt]->setVisible(false);
637+
actions[kActIDResumeDecrypt]->setVisible(true);
638+
639+
actions[kActIDResumeDecrypt]->setEnabled(true);
640+
actions[kActIDChangePwd]->setEnabled(false);
641+
actions[kActIDUnlock]->setEnabled(false);
612642
}
613643
} else {
614644
qWarning() << "unmet status!" << param.devDesc << states;
@@ -617,16 +647,6 @@ void DiskEncryptMenuScene::updateActions()
617647
actions[kActIDEncrypt]->setVisible(true);
618648
}
619649

620-
// update operatable
621-
bool taskWorking = EventsHandler::instance()->isTaskWorking();
622-
bool currDevOperating = EventsHandler::instance()->isUnderOperating(param.devDesc);
623-
bool hasPendingJob = EventsHandler::instance()->hasPendingTask();
624-
actions[kActIDEncrypt]->setEnabled(!taskWorking && !hasPendingJob);
625-
actions[kActIDDecrypt]->setEnabled(!taskWorking && !hasPendingJob && !currDevOperating);
626-
actions[kActIDChangePwd]->setEnabled(!taskWorking);
627-
actions[kActIDResume]->setEnabled(!taskWorking && !currDevOperating);
628-
actions[kActIDUnlock]->setEnabled(!currDevOperating);
629-
630650
QString dev = param.devDesc;
631651
QString fileName = kRebootFlagFilePrefix + dev.replace("/", "_");
632652
QFile rebootFlag(fileName);

src/dde-file-manager/dfmplugin-disk-encrypt-entry/plugin_diskencryptentry.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ void DiskEncryptEntry::onComputerMenuSceneAdded(const QString &scene)
6464

6565
void DiskEncryptEntry::processUnfinshedDecrypt(const QString &device)
6666
{
67+
QString dev(device);
68+
QString ignoreFile = "/tmp/dfm_ignore_decrypt_auto_reqeust_" + dev.replace("/", "_");
69+
if (QFile(ignoreFile).exists())
70+
return;
6771

6872
QMenu *menu = new QMenu();
6973
DiskEncryptMenuScene *scene = new DiskEncryptMenuScene();
@@ -89,4 +93,8 @@ void DiskEncryptEntry::processUnfinshedDecrypt(const QString &device)
8993
scene->triggered(*ret);
9094
delete scene;
9195
delete menu;
96+
97+
QFile f(ignoreFile);
98+
f.open(QIODevice::Truncate | QIODevice::WriteOnly);
99+
f.close();
92100
}

0 commit comments

Comments
 (0)