diff --git a/src/fs/luks.cpp b/src/fs/luks.cpp index 3fd2a94..b5858ae 100644 --- a/src/fs/luks.cpp +++ b/src/fs/luks.cpp @@ -67,6 +67,7 @@ luks::~luks() void luks::init() { + m_Create = findExternal(QStringLiteral("cryptsetup")) ? cmdSupportFileSystem : cmdSupportNone; m_UpdateUUID = findExternal(QStringLiteral("cryptsetup")) ? cmdSupportFileSystem : cmdSupportNone; m_Copy = cmdSupportCore; m_Move = cmdSupportCore; @@ -74,13 +75,77 @@ void luks::init() m_GetUUID = findExternal(QStringLiteral("cryptsetup")) ? cmdSupportFileSystem : cmdSupportNone; } +bool luks::create(Report& report, const QString& deviceNode) const +{ + + QPointer dlg = new DecryptLuksDialog(0, deviceNode); //TODO: parent widget instead of 0 + + if (dlg->exec() != QDialog::Accepted) + { + delete dlg; + return false; + } + + std::vector commands; + commands.push_back(QStringLiteral("echo")); + commands.push_back(QStringLiteral("cryptsetup")); + std::vector args; + args.push_back({ dlg->luksPassphrase().text() }); + args.push_back({ QStringLiteral("-s"), + QStringLiteral("512"), + QStringLiteral("luksFormat"), + deviceNode, + QStringLiteral("-") }); + + ExternalCommand createCmd(commands, args); + if (!(createCmd.run(-1) && createCmd.exitCode() == 0)) + return false; + + commands.clear(); + commands.push_back(QStringLiteral("echo")); + commands.push_back(QStringLiteral("cryptsetup")); + args.clear(); + args.push_back({ dlg->luksPassphrase().text() }); + args.push_back({ QStringLiteral("luksOpen"), + deviceNode, + dlg->luksName().text() }); + delete dlg; + + ExternalCommand openCmd(commands, args); + if (!(openCmd.run(-1) && openCmd.exitCode() == 0)) + return false; + + if (m_innerFs) + { + delete m_innerFs; + m_innerFs = nullptr; + } + + QString mapperNode = mapperName(deviceNode); + if (mapperNode.isEmpty()) + return false; + + + //FIXME: don't hardcode inner fs type + FileSystem::Type innerFsType = FileSystem::Ext4; + m_innerFs = FileSystemFactory::cloneWithNewType(innerFsType, + *this); + + m_isCryptOpen = (m_innerFs != nullptr); + + if (m_isCryptOpen) + return true; + return false; + +} + bool luks::supportToolFound() const { return // m_GetUsed != cmdSupportNone && // m_GetLabel != cmdSupportNone && // m_SetLabel != cmdSupportNone && -// m_Create != cmdSupportNone && + m_Create != cmdSupportNone && // m_Check != cmdSupportNone && m_UpdateUUID != cmdSupportNone && // m_Grow != cmdSupportNone && diff --git a/src/fs/luks.h b/src/fs/luks.h index 5006fc7..5bcff08 100644 --- a/src/fs/luks.h +++ b/src/fs/luks.h @@ -83,6 +83,7 @@ public: return m_GetUUID; } + virtual bool create(Report &report, const QString &deviceNode) const override; virtual qint64 minCapacity() const; virtual SupportTool supportToolName() const; virtual bool supportToolFound() const; @@ -133,9 +134,9 @@ public: static CommandSupportType m_GetUUID; private: - FileSystem* m_innerFs; + mutable FileSystem* m_innerFs; - bool m_isCryptOpen; + mutable bool m_isCryptOpen; bool m_isMounted; }; }