File 0001-Add-new-job-to-change-permission-of-the-newly-create.patch of Package kpmcore

From 6c14ddb043ce22706740701b1c7413198b608c21 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <tcanabrava@kde.org>
Date: Thu, 9 Dec 2021 16:54:41 +0100
Subject: [PATCH] Add new job to change permission of the newly created
 partition

---
 src/core/partition.cpp                | 19 ++++++++++++
 src/core/partition.h                  |  9 ++++++
 src/jobs/CMakeLists.txt               |  1 +
 src/jobs/changepermissionsjob.cpp     | 42 ++++++++++++++++++++++++++
 src/jobs/changepermissionsjob.h       | 43 +++++++++++++++++++++++++++
 src/ops/createfilesystemoperation.cpp |  5 ++++
 src/ops/newoperation.cpp              |  5 ++++
 7 files changed, 124 insertions(+)
 create mode 100644 src/jobs/changepermissionsjob.cpp
 create mode 100644 src/jobs/changepermissionsjob.h

diff --git a/src/core/partition.cpp b/src/core/partition.cpp
index 61c59f4..eeb0bd0 100644
--- a/src/core/partition.cpp
+++ b/src/core/partition.cpp
@@ -368,6 +368,25 @@ void Partition::setPartitionPath(const QString& s)
     setNumber(-1);
 }
 
+
+bool Partition::execChangePermission(Report& report)
+{
+    if (m_permission.isEmpty()) {
+        return true;
+    }
+
+    ExternalCommand chmodCmd(report,
+                              QStringLiteral("chmod"),
+                            {
+                                    m_permission,
+                                    deviceNode()
+                            });
+
+    if ( chmodCmd.run() && chmodCmd.exitCode() == 0 )
+        return true;
+    return false;
+}
+
 void Partition::setFileSystem(FileSystem* fs)
 {
     m_FileSystem = fs;
diff --git a/src/core/partition.h b/src/core/partition.h
index e4bbff7..5bff232 100644
--- a/src/core/partition.h
+++ b/src/core/partition.h
@@ -259,6 +259,14 @@ public:
     }
     void deleteFileSystem();
 
+    void setPermissions(const QString& permission) {
+        m_permission = permission;
+    }
+
+    // sets the disk to have write and read permissions of 777.
+    // userful for pendrives and such.
+    bool execChangePermission(Report& report);
+
 private:
     void setNumber(qint32 n) {
         m_Number = n;
@@ -275,6 +283,7 @@ private:
     QString m_Label;
     QString m_Type;
     QString m_UUID;
+    QString m_permission;
     quint64 m_Attributes = 0;
     QString m_PartitionPath;
     QString m_MountPoint;
diff --git a/src/jobs/CMakeLists.txt b/src/jobs/CMakeLists.txt
index 6aec254..a6968de 100644
--- a/src/jobs/CMakeLists.txt
+++ b/src/jobs/CMakeLists.txt
@@ -31,6 +31,7 @@ set(JOBS_SRC
     jobs/setpartflagsjob.cpp
     jobs/copyfilesystemjob.cpp
     jobs/movefilesystemjob.cpp
+    jobs/changepermissionsjob.cpp
 )
 
 set(JOBS_LIB_HDRS
diff --git a/src/jobs/changepermissionsjob.cpp b/src/jobs/changepermissionsjob.cpp
new file mode 100644
index 0000000..eabca29
--- /dev/null
+++ b/src/jobs/changepermissionsjob.cpp
@@ -0,0 +1,42 @@
+/*
+    SPDX-FileCopyrightText: Tomaz Canabrava <tcanabrava@kde.org>
+
+    SPDX-License-Identifier: GPL-3.0-or-later
+*/
+
+#include "jobs/changepermissionsjob.h"
+
+#include "core/lvmdevice.h"
+#include "core/partition.h"
+
+#include "util/report.h"
+
+#include <KLocalizedString>
+
+/** Creates a new CreateVolumeGroupJob
+ * @param permission the new permission for the partition, in chmod style.
+ * @param partition the partition to change the permission.
+ */
+ChangePermissionJob::ChangePermissionJob(Partition& partition) :
+    Job(),
+    m_Partition(partition)
+{
+}
+
+bool ChangePermissionJob::run(Report& parent)
+{
+    bool rval = false;
+
+    Report* report = jobStarted(parent);
+
+    rval = m_Partition.execChangePermission(*report);
+
+    jobFinished(*report, rval);
+
+    return rval;
+}
+
+QString ChangePermissionJob::description() const
+{
+    return xi18nc("@info/plain", "Change the permissions of: <filename>%1</filename> to %2", m_Partition.deviceNode(), m_permissions);
+}
diff --git a/src/jobs/changepermissionsjob.h b/src/jobs/changepermissionsjob.h
new file mode 100644
index 0000000..805f180
--- /dev/null
+++ b/src/jobs/changepermissionsjob.h
@@ -0,0 +1,43 @@
+/*
+    SPDX-FileCopyrightText: 2021 Tomaz Canabrava <tcanabrava@kde.org>
+
+    SPDX-License-Identifier: GPL-3.0-or-later
+*/
+
+#ifndef KPMCORE_CHANGEPERMISSIONJOB_H
+#define KPMCORE_CHANGEPERMISSIONJOB_H
+
+#include "jobs/job.h"
+
+class Partition;
+class Report;
+
+class QString;
+
+/** Check a FileSystem.
+    @author Volker Lanz <vl@fidra.de>
+*/
+class ChangePermissionJob : public Job
+{
+public:
+    /* Permission should be set in the partition. */
+    explicit ChangePermissionJob(Partition& p);
+
+public:
+    bool run(Report& parent) override;
+    QString description() const override;
+
+protected:
+    Partition& partition() {
+        return m_Partition;
+    }
+    const Partition& partition() const {
+        return m_Partition;
+    }
+
+private:
+    Partition& m_Partition;
+    QString m_permissions;
+};
+
+#endif
diff --git a/src/ops/createfilesystemoperation.cpp b/src/ops/createfilesystemoperation.cpp
index 4e6f40e..1f9890b 100644
--- a/src/ops/createfilesystemoperation.cpp
+++ b/src/ops/createfilesystemoperation.cpp
@@ -13,6 +13,7 @@
 #include "jobs/deletefilesystemjob.h"
 #include "jobs/createfilesystemjob.h"
 #include "jobs/checkfilesystemjob.h"
+#include "jobs/changepermissionsjob.h"
 
 #include "fs/filesystem.h"
 #include "fs/filesystemfactory.h"
@@ -42,6 +43,10 @@ CreateFileSystemOperation::CreateFileSystemOperation(Device& d, Partition& p, Fi
     addJob(deleteJob());
     addJob(createJob());
     addJob(checkJob());
+
+    // if the user never configured a new permission, nothing will run, if he did,
+    // then we change the permissions on the newly created partition.
+    addJob(new ChangePermissionJob(p));
 }
 
 CreateFileSystemOperation::~CreateFileSystemOperation()
diff --git a/src/ops/newoperation.cpp b/src/ops/newoperation.cpp
index 2c4fe51..7242af2 100644
--- a/src/ops/newoperation.cpp
+++ b/src/ops/newoperation.cpp
@@ -21,6 +21,7 @@
 #include "jobs/setfilesystemlabeljob.h"
 #include "jobs/setpartflagsjob.h"
 #include "jobs/checkfilesystemjob.h"
+#include "jobs/changepermissionsjob.h"
 
 #include "fs/filesystem.h"
 #include "fs/filesystemfactory.h"
@@ -106,6 +107,10 @@ NewOperation::NewOperation(Device& d, Partition* p) :
 
         d_ptr->m_CheckFileSystemJob = new CheckFileSystemJob(newPartition());
         addJob(checkJob());
+
+        // if the user never configured a new permission, nothing will run, if he did,
+        // then we change the permissions on the newly created partition.
+        addJob(new ChangePermissionJob(newPartition()));
     }
 }
 
-- 
2.35.1

openSUSE Build Service is sponsored by