diff --git a/src/core/copysourceshred.cpp b/src/core/copysourceshred.cpp index 05b4174..c465ce6 100644 --- a/src/core/copysourceshred.cpp +++ b/src/core/copysourceshred.cpp @@ -23,11 +23,11 @@ @param s the size the copy source will (pretend to) have @param sectorsize the sectorsize the copy source will (pretend to) have */ -CopySourceShred::CopySourceShred (qint64 s, qint32 sectorsize) : +CopySourceShred::CopySourceShred (qint64 s, qint32 sectorsize, bool randomShred) : CopySource(), m_Size(s), m_SectorSize(sectorsize), - m_SourceFile(Config::shredSource() == Config::EnumShredSource::random ? QStringLiteral("/dev/urandom") : QStringLiteral("/dev/zero")) + m_SourceFile(randomShred ? QStringLiteral("/dev/urandom") : QStringLiteral("/dev/zero")) { } diff --git a/src/core/copysourceshred.h b/src/core/copysourceshred.h index d6b855a..9216c7c 100644 --- a/src/core/copysourceshred.h +++ b/src/core/copysourceshred.h @@ -34,7 +34,7 @@ class CopyTarget; class CopySourceShred : public CopySource { public: - CopySourceShred(qint64 size, qint32 sectorsize); + CopySourceShred(qint64 size, qint32 sectorsize, bool randomShred); public: virtual bool open(); diff --git a/src/jobs/shredfilesystemjob.cpp b/src/jobs/shredfilesystemjob.cpp index df03bf8..0023c6b 100644 --- a/src/jobs/shredfilesystemjob.cpp +++ b/src/jobs/shredfilesystemjob.cpp @@ -35,10 +35,11 @@ @param d the Device the FileSystem is on @param p the Partition the FileSystem is in */ -ShredFileSystemJob::ShredFileSystemJob(Device& d, Partition& p) : +ShredFileSystemJob::ShredFileSystemJob(Device& d, Partition& p, bool randomShred) : Job(), m_Device(d), - m_Partition(p) + m_Partition(p), + m_RandomShred(randomShred) { } @@ -64,7 +65,7 @@ bool ShredFileSystemJob::run(Report& parent) // Again, a scope for copyTarget and copySource. See MoveFileSystemJob::run() { CopyTargetDevice copyTarget(device(), partition().fileSystem().firstSector(), partition().fileSystem().lastSector()); - CopySourceShred copySource(partition().capacity(), copyTarget.sectorSize()); + CopySourceShred copySource(partition().capacity(), copyTarget.sectorSize(), m_RandomShred); if (!copySource.open()) report->line() << i18nc("@info/plain", "Could not open random data source to overwrite file system."); diff --git a/src/jobs/shredfilesystemjob.h b/src/jobs/shredfilesystemjob.h index 6899f6a..a9142a7 100644 --- a/src/jobs/shredfilesystemjob.h +++ b/src/jobs/shredfilesystemjob.h @@ -36,7 +36,7 @@ class Report; class ShredFileSystemJob : public Job { public: - ShredFileSystemJob(Device& d, Partition& p); + ShredFileSystemJob(Device& d, Partition& p, bool randomShred); public: virtual bool run(Report& parent); @@ -53,6 +53,7 @@ class ShredFileSystemJob : public Job private: Device& m_Device; Partition& m_Partition; + bool m_RandomShred; }; #endif diff --git a/src/ops/deleteoperation.cpp b/src/ops/deleteoperation.cpp index aadc955..5b18e57 100644 --- a/src/ops/deleteoperation.cpp +++ b/src/ops/deleteoperation.cpp @@ -35,16 +35,23 @@ @param d the Device to delete a Partition on @param p pointer to the Partition to delete. May not be NULL */ -DeleteOperation::DeleteOperation(Device& d, Partition* p, bool secure) : +DeleteOperation::DeleteOperation(Device& d, Partition* p, ShredAction shred) : Operation(), m_TargetDevice(d), m_DeletedPartition(p), - m_Secure(secure), - m_DeleteFileSystemJob(isSecure() - ? static_cast(new ShredFileSystemJob(targetDevice(), deletedPartition())) - : static_cast(new DeleteFileSystemJob(targetDevice(), deletedPartition()))), + m_ShredAction(shred), m_DeletePartitionJob(new DeletePartitionJob(targetDevice(), deletedPartition())) { + switch(shredAction()) + { + case NoShred: + m_DeleteFileSystemJob = static_cast(new DeleteFileSystemJob(targetDevice(), deletedPartition())); + case ZeroShred: + m_DeleteFileSystemJob = static_cast(new ShredFileSystemJob(targetDevice(), deletedPartition(), false)); + case RandomShred: + m_DeleteFileSystemJob = static_cast(new ShredFileSystemJob(targetDevice(), deletedPartition(), true)); + } + addJob(deleteFileSystemJob()); addJob(deletePartitionJob()); } @@ -79,7 +86,7 @@ void DeleteOperation::undo() QString DeleteOperation::description() const { - if (isSecure()) + if (shredAction() != NoShred) return xi18nc("@info/plain", "Shred partition %1 (%2, %3)", deletedPartition().deviceNode(), Capacity::formatByteSize(deletedPartition().capacity()), deletedPartition().fileSystem().name()); else return xi18nc("@info/plain", "Delete partition %1 (%2, %3)", deletedPartition().deviceNode(), Capacity::formatByteSize(deletedPartition().capacity()), deletedPartition().fileSystem().name()); diff --git a/src/ops/deleteoperation.h b/src/ops/deleteoperation.h index c07ec15..eed5da4 100644 --- a/src/ops/deleteoperation.h +++ b/src/ops/deleteoperation.h @@ -43,15 +43,24 @@ class LIBKPMCORE_EXPORT DeleteOperation : public Operation Q_DISABLE_COPY(DeleteOperation) public: - DeleteOperation(Device& d, Partition* p, bool secure = false); + enum ShredAction + { + NoShred = 0, + ZeroShred, + RandomShred + }; + + DeleteOperation(Device& d, Partition* p, ShredAction shred = NoShred); ~DeleteOperation(); public: - QString iconName() const { return isSecure() ? QStringLiteral("edit-delete-shred") : QStringLiteral("edit-delete"); } + QString iconName() const { return shredAction() == NoShred ? + QStringLiteral("edit-delete") : + QStringLiteral("edit-delete-shred"); } QString description() const; void preview(); void undo(); - bool isSecure() const { return m_Secure; } + ShredAction shredAction() const { return m_ShredAction; } virtual bool targets(const Device& d) const; virtual bool targets(const Partition& p) const; @@ -75,7 +84,7 @@ class LIBKPMCORE_EXPORT DeleteOperation : public Operation private: Device& m_TargetDevice; Partition* m_DeletedPartition; - bool m_Secure; + ShredAction m_ShredAction; Job* m_DeleteFileSystemJob; DeletePartitionJob* m_DeletePartitionJob; };