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