CryptoManager: add fileSystemIsSetup()
[accounts-sso:signon.git] / src / signond / cryptomanager.h
1 /* -*- Mode: C++; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of signon
4  *
5  * Copyright (C) 2009-2010 Nokia Corporation.
6  *
7  * Contact: Aurel Popirtac <ext-aurel.popirtac@nokia.com>
8  * Contact: Alberto Mardegan <alberto.mardegan@nokia.com>
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public License
12  * version 2.1 as published by the Free Software Foundation.
13  *
14  * This library is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22  * 02110-1301 USA
23  */
24
25 /*!
26   @file cryptomanager.h
27   Definition of the CryptoManager object.
28   @ingroup Accounts_and_SSO_Framework
29  */
30
31 #ifndef CRYPTO_MANAGER_H
32 #define CRYPTO_MANAGER_H
33
34 #include <QObject>
35
36 #define MINUMUM_ENCRYPTED_FILE_SYSTEM_SIZE 4
37
38 namespace SignonDaemonNS {
39
40     /*!
41         @class CryptoManager
42         Encrypted file system manager. Uses cryptsetup and LUKS.
43         @ingroup Accounts_and_SSO_Framework
44     */
45     class CryptoManager : public QObject
46     {
47         Q_OBJECT
48
49         // DO NOT change the order of the enum values!!!
50         enum FileSystemMountState {
51             Unmounted = 0,
52             LoopSet,
53             LoopLuksFormatted,
54             LoopLuksOpened,
55             Mounted
56         };
57
58     public:
59
60         /*!
61           @enum FileSystemType
62           Supported encrypted partion filesystem type.
63         */
64         enum FileSystemType {
65             Ext2 = 0,
66             Ext3,
67             Ext4
68         };
69
70         /*!
71             Constructs a CryptoManager object with the given parent.
72             @param parent
73         */
74         CryptoManager(QObject *parent = 0);
75
76         /*!
77             Constructs a CryptoManager object with the given access code, file system name and parent.
78             @param accessCode Key for the encrypted file system
79             @param fileSystemPath path of the ecnrypted file system's file/device
80             @param parent Parent object
81         */
82         CryptoManager(const QByteArray &encryptionKey, const QString &fileSystemPath, QObject *parent = 0);
83
84         /*!
85             Destroys a CryptoManager object.
86         */
87         ~CryptoManager();
88
89         /*!
90             Sets the encryption key.
91             @param key, the encrypted file system key.
92         */
93         void setEncryptionKey(const QByteArray &key) { m_accessCode = key; }
94
95         /*!
96             @return The in use encryption key.
97         */
98         QByteArray encryptionKey() const { return m_accessCode; }
99
100         /*!
101             Sets the file system type.
102             @param type The file system's type.
103             @see FileSystemType
104         */
105         void setFileSystemType(const FileSystemType type) { m_fileSystemType = type; }
106
107         /*!
108             Overloaded, for convenience method.
109             @param type The file system's type as string.
110         */
111         bool setFileSystemType(const QString &type);
112
113         /*!
114             @return the file system's type.
115             @see FileSystemType
116         */
117         FileSystemType fileSystemType() const { return m_fileSystemType; }
118
119         /*!
120             @param size The size of the file system (Mb).
121             @returns true if the call succeeded, false otherwise (minimum 4 Mb).
122         */
123         bool setFileSystemSize(const quint32 size);
124
125         /*!
126             @return the file system's size (Mb).
127         */
128         quint32 fileSystemSize() const { return m_fileSystemSize; }
129
130         /*!
131             Sets the file system's path.
132             @param path The path of the file system's file/source.
133         */
134         void setFileSystemPath(const QString &path);
135
136         /*!
137             @returns the path of the file system.
138         */
139         QString fileSystemPath() const { return m_fileSystemPath; }
140
141         /*!
142             Sets up an encrypted file system. This method is to be called only at the file system creation/foramtting.
143             Use mountFileSystem() on subsequent uses. This method handles also the mounting so when using it, a call
144             to mountFileSystem() is not necessary.
145             @returns true, if successful, false otherwise.
146             @warning this method will always format the file system, use carefully.
147         */
148         bool setupFileSystem();
149
150         /*!
151             Mounts the encrypted file system.
152             @returns true, if successful, false otherwise.
153         */
154         bool mountFileSystem();
155
156         /*!
157             Unmounts the encrypted file system.
158             @returns true, if successful, false otherwise.
159         */
160         bool unmountFileSystem();
161
162         /*!
163             Deletes the encrypted file system.
164             @returns true, if successful, false otherwise.
165             @warning use this carefully, this will lead to data loss.
166             @todo finish implemetation.
167         */
168         bool deleteFileSystem();
169
170         /*!
171             @returns true if the file system is mounted, false otherwise.
172         */
173         bool fileSystemIsMounted() const { return m_mountState == Mounted; }
174
175         /*!
176             @returns true if the file system is setup, false otherwise.
177         */
178         bool fileSystemIsSetup() const;
179
180         /*!
181             @returns true, if the file system contains a specific file.
182             @attention The file system must be mounted prior to calling this.
183         */
184         bool fileSystemContainsFile(const QString &filePath);
185
186         /*!
187             @returns the path of the mounted file system.
188         */
189         QString fileSystemMountPath() const;
190
191         /*!
192             @attention if the file system is not mounted and the encryption
193             key can access it, this method will cause the file system to be
194             mounted.
195             @returns whether the key `key` is occupying a keyslot in the encrypted file system.
196         */
197         bool encryptionKeyInUse(const QByteArray &key);
198
199         /*!
200             Adds an encryption key to one of the available keyslots of the LUKS partition's header.
201             Use the `keyTag` parameter in order to store and keep track of the key.
202             @sa isEncryptionKey(const QByteArray &key)
203             @param key The key to be added/set.
204             @param existingKey An already existing key.
205             @returns true, if succeeded, false otherwise.
206         */
207         bool addEncryptionKey(const QByteArray &key,
208                               const QByteArray &existingKey);
209
210         /*!
211             Releases an existing used keyslot in the LUKS partition's header.
212             @param key The key to be removed.
213             @param remainingKey Another valid key
214             @attention The system cannot remain keyless.
215             @returns true, if succeeded, false otherwise.
216         */
217         bool removeEncryptionKey(const QByteArray &key,
218                                  const QByteArray &remainingKey);
219
220     Q_SIGNALS:
221         void fileSystemMounted();
222         void fileSystemUnmounting();
223
224     private:
225         void clearFileSystemResources();
226         bool mountMappedDevice();
227         bool unmountMappedDevice();
228         void updateMountState(const FileSystemMountState state);
229
230         static bool createPartitionFile(const QString &filePath);
231         static bool formatMapFileSystem(const QString &fileSystemPath);
232
233     private:
234         //TODO remove this
235         void serializeData();
236
237     private:
238         QByteArray m_accessCode;
239         QString m_fileSystemPath;
240         QString m_fileSystemMapPath;
241         QString m_fileSystemName;
242         QString m_fileSystemMountPath;
243         QString m_loopDeviceName;
244
245         FileSystemMountState m_mountState;
246         FileSystemType m_fileSystemType;
247         quint32 m_fileSystemSize;
248     };
249
250 } //namespace SignonDaemonNS
251
252
253 #endif // CRYPTOMANAGER_H