File indexing completed on 2024-05-05 05:48:46

0001 /*
0002     SPDX-FileCopyrightText: 2010 Volker Lanz <vl@fidra.de>
0003     SPDX-FileCopyrightText: 2012-2018 Andrius Štikonas <andrius@stikonas.eu>
0004     SPDX-FileCopyrightText: 2015 Chris Campbell <c.j.campbell@ed.ac.uk>
0005     SPDX-FileCopyrightText: 2015-2016 Teo Mrnjavac <teo@kde.org>
0006     SPDX-FileCopyrightText: 2016 Chantara Tith <tith.chantara@gmail.com>
0007     SPDX-FileCopyrightText: 2020 Arnaud Ferraris <arnaud.ferraris@collabora.com>
0008     SPDX-FileCopyrightText: 2020 Gaël PORTAY <gael.portay@collabora.com>
0009 
0010     SPDX-License-Identifier: GPL-3.0-or-later
0011 */
0012 
0013 #ifndef KPMCORE_LUKS_H
0014 #define KPMCORE_LUKS_H
0015 
0016 #include "util/libpartitionmanagerexport.h"
0017 
0018 #include "fs/filesystem.h"
0019 
0020 #include <QtGlobal>
0021 
0022 class Report;
0023 
0024 class QString;
0025 class QWidget;
0026 
0027 namespace FS
0028 {
0029 /** A LUKS crypto file system.
0030     @author Andrius Štikonas <andrius@stikonas.eu>
0031 */
0032 class LIBKPMCORE_EXPORT luks : public FileSystem
0033 {
0034 public:
0035     luks(qint64 firstsector, qint64 lastsector, qint64 sectorsused, const QString& label, const QVariantMap& features = {}, FileSystem::Type t = FileSystem::Type::Luks);
0036     ~luks() override;
0037 
0038     enum class KeyLocation {
0039         unknown,
0040         dmcrypt,
0041         keyring
0042     };
0043 
0044 public:
0045     void init() override;
0046     void scan(const QString& deviceNode) override;
0047     qint64 readUsedCapacity(const QString& deviceNode) const override;
0048 
0049     CommandSupportType supportGetUsed() const override {
0050         return m_GetUsed;
0051     }
0052     CommandSupportType supportGetLabel() const override {
0053         return m_GetLabel;
0054     }
0055     CommandSupportType supportCreate() const override {
0056         return m_Create;
0057     }
0058     CommandSupportType supportGrow() const override {
0059         if (!m_isCryptOpen)
0060             return cmdSupportNone;
0061         if (m_Grow && m_innerFs)
0062             return m_innerFs->supportGrow();
0063         return cmdSupportNone;
0064     }
0065     CommandSupportType supportGrowOnline() const override {
0066         if (!m_isCryptOpen)
0067             return cmdSupportNone;
0068         if (m_Grow && m_innerFs)
0069             return m_innerFs->supportGrowOnline();
0070         return cmdSupportNone;
0071     }
0072     CommandSupportType supportShrink() const override {
0073         if (!m_isCryptOpen)
0074             return cmdSupportNone;
0075         if (m_Shrink && m_innerFs)
0076             return m_innerFs->supportShrink();
0077         return cmdSupportNone;
0078     }
0079     CommandSupportType supportShrinkOnline() const override {
0080         if (!m_isCryptOpen)
0081             return cmdSupportNone;
0082         if (m_Shrink && m_innerFs)
0083             return m_innerFs->supportShrinkOnline();
0084         return cmdSupportNone;
0085     }
0086     CommandSupportType supportMove() const override {
0087         if (m_isCryptOpen)
0088             return cmdSupportNone;
0089         return m_Move;
0090     }
0091     CommandSupportType supportCheck() const override {
0092         if (!m_isCryptOpen)
0093             return cmdSupportNone;
0094         if (m_Check && m_innerFs)
0095             return m_innerFs->supportCheck();
0096         return cmdSupportNone;
0097     }
0098     CommandSupportType supportCheckOnline() const override {
0099         if (!m_isCryptOpen)
0100             return cmdSupportNone;
0101         if (m_Check && m_innerFs)
0102             return m_innerFs->supportCheckOnline();
0103         return cmdSupportNone;
0104     }
0105     CommandSupportType supportCopy() const override {
0106         if (m_isCryptOpen)
0107             return cmdSupportNone;
0108         return m_Copy;
0109     }
0110     CommandSupportType supportBackup() const override {
0111         return m_Backup;
0112     }
0113     CommandSupportType supportSetLabel() const override {
0114         if (m_Check && m_innerFs)
0115             return m_innerFs->supportSetLabel();
0116         return cmdSupportNone;
0117     }
0118     CommandSupportType supportUpdateUUID() const override {
0119         return m_UpdateUUID;
0120     }
0121     CommandSupportType supportGetUUID() const override {
0122         return m_GetUUID;
0123     }
0124 
0125     bool check(Report& report, const QString& deviceNode) const override;
0126     bool create(Report& report, const QString& deviceNode) override;
0127     SupportTool supportToolName() const override;
0128     bool supportToolFound() const override;
0129     QString readUUID(const QString& deviceNode) const override;
0130     bool updateUUID(Report& report, const QString& deviceNode) const override;
0131     bool resize(Report& report, const QString& deviceNode, qint64 length) const override;
0132     bool resizeOnline(Report& report, const QString& deviceNode, const QString& mountPoint, qint64 length) const override;
0133     QString readLabel(const QString& deviceNode) const override;
0134     bool writeLabel(Report& report, const QString& deviceNode, const QString& newLabel) override;
0135 
0136     QString mountTitle() const override;
0137     QString unmountTitle() const override;
0138     QString cryptOpenTitle() const;
0139     QString cryptCloseTitle() const;
0140 
0141     QString posixPermissions() const override { return implPosixPermissions();  };
0142     void setPosixPermissions(const QString& permissions) override { implSetPosixPermissions(permissions); };
0143     bool execChangePosixPermission(Report& report, const QString& deviceNode);
0144 
0145     void setPassphrase(const QString&);
0146     QString passphrase() const;
0147 
0148     bool canMount(const QString&, const QString&) const override;
0149     bool canUnmount(const QString&) const override;
0150     bool isMounted() const;
0151     void setMounted(bool mounted);
0152 
0153     bool canCryptOpen(const QString& deviceNode) const;
0154     bool canCryptClose(const QString& deviceNode) const;
0155     bool isCryptOpen() const;
0156     void setCryptOpen(bool cryptOpen);
0157 
0158     bool cryptOpen(QWidget* parent, const QString& deviceNode);
0159     bool cryptClose(const QString& deviceNode);
0160 
0161     void loadInnerFileSystem(const QString& mapperNode);
0162     void createInnerFileSystem(Type type);
0163 
0164     bool mount(Report& report, const QString& deviceNode, const QString& mountPoint) override;
0165     bool unmount(Report& report, const QString& deviceNode) override;
0166 
0167     FileSystem::Type type() const override;
0168 
0169     QString suggestedMapperName(const QString& deviceNode) const;
0170 
0171     void getMapperName(const QString& deviceNode);
0172     virtual void getLuksInfo(const QString& deviceNode);
0173 
0174     FileSystem* innerFS() const { return m_innerFs; }
0175     QString outerUuid() const;
0176 
0177     QString mapperName() const { return m_MapperName; }
0178     QString cipherName() const { return m_CipherName; }
0179     QString cipherMode() const { return m_CipherMode; }
0180     QString hashName() const { return m_HashName; }
0181     qint64 keySize() const { return m_KeySize; }
0182     qint64 payloadOffset() const { return m_PayloadOffset; }
0183 
0184     static bool canEncryptType(FileSystem::Type type);
0185     void initLUKS();
0186 
0187     bool testPassphrase(const QString& deviceNode, const QString& passphrase) const;
0188 
0189 protected:
0190     virtual QString readOuterUUID(const QString& deviceNode) const;
0191     void setPayloadSize();
0192 
0193 public:
0194     static CommandSupportType m_GetUsed;
0195     static CommandSupportType m_GetLabel;
0196     static CommandSupportType m_Create;
0197     static CommandSupportType m_Grow;
0198     static CommandSupportType m_Shrink;
0199     static CommandSupportType m_Move;
0200     static CommandSupportType m_Check;
0201     static CommandSupportType m_Copy;
0202     static CommandSupportType m_Backup;
0203     static CommandSupportType m_SetLabel;
0204     static CommandSupportType m_UpdateUUID;
0205     static CommandSupportType m_GetUUID;
0206 
0207 protected:
0208     mutable FileSystem* m_innerFs;
0209 
0210     mutable bool m_isCryptOpen;
0211     mutable bool m_cryptsetupFound;
0212     QString m_passphrase;
0213     bool m_isMounted;
0214 
0215     QString m_MapperName;
0216     QString m_CipherName;
0217     QString m_CipherMode;
0218     QString m_HashName;
0219     qint64 m_KeySize;
0220     qint64 m_PayloadOffset;
0221     qint64 m_PayloadSize;
0222     QString m_outerUuid;
0223 
0224     luks::KeyLocation m_KeyLocation = KeyLocation::unknown;
0225 };
0226 }
0227 
0228 #endif