1 /*
2     cryptoconfigmodule_p.h
3 
4     This file is part of libkleopatra
5     SPDX-FileCopyrightText: 2004, 2005 Klarälvdalens Datakonsult AB
6 
7     SPDX-License-Identifier: GPL-2.0-or-later
8 */
9 
10 #pragma once
11 
12 #include <QWidget>
13 
14 #include <QList>
15 
16 class KLineEdit;
17 class QSpinBox;
18 
19 class QPushButton;
20 class QGridLayout;
21 class QLabel;
22 class QCheckBox;
23 class QComboBox;
24 
25 namespace Kleo
26 {
27 class FileNameRequester;
28 }
29 
30 namespace QGpgME
31 {
32 class CryptoConfig;
33 class CryptoConfigComponent;
34 class CryptoConfigGroup;
35 class CryptoConfigEntry;
36 } // namespace QGpgME
37 
38 namespace Kleo
39 {
40 class CryptoConfigModule;
41 class CryptoConfigComponentGUI;
42 class CryptoConfigGroupGUI;
43 class CryptoConfigEntryGUI;
44 
45 /**
46  * A widget corresponding to a component in the crypto config
47  */
48 class CryptoConfigComponentGUI : public QWidget
49 {
50     Q_OBJECT
51 
52 public:
53     CryptoConfigComponentGUI(CryptoConfigModule *module, QGpgME::CryptoConfigComponent *component,
54                              QWidget *parent = nullptr);
55 
56     bool save();
57     void load();
58     void defaults();
59 
60 private:
61     QGpgME::CryptoConfigComponent *mComponent = nullptr;
62     QList<CryptoConfigGroupGUI *> mGroupGUIs;
63 };
64 
65 /**
66  * A class managing widgets corresponding to a group in the crypto config
67  */
68 class CryptoConfigGroupGUI : public QObject
69 {
70     Q_OBJECT
71 
72 public:
73     CryptoConfigGroupGUI(CryptoConfigModule *module, QGpgME::CryptoConfigGroup *group,
74                          const std::vector<QGpgME::CryptoConfigEntry *> &entries,
75                          QGridLayout *layout, QWidget *parent = nullptr);
76 
77     bool save();
78     void load();
79     void defaults();
80 
81 private:
82     QList<CryptoConfigEntryGUI *> mEntryGUIs;
83 };
84 
85 /**
86  * Factory for CryptoConfigEntryGUI instances
87  * Not a real factory, but can become one later.
88  */
89 class CryptoConfigEntryGUIFactory
90 {
91 public:
92     static CryptoConfigEntryGUI *createEntryGUI(
93         CryptoConfigModule *module,
94         QGpgME::CryptoConfigEntry *entry, const QString &entryName,
95         QGridLayout *layout, QWidget *widget);
96 };
97 
98 /**
99  * Base class for the widget managers tied to an entry in the crypto config
100  */
101 class CryptoConfigEntryGUI : public QObject
102 {
103     Q_OBJECT
104 public:
105     CryptoConfigEntryGUI(CryptoConfigModule *module,
106                          QGpgME::CryptoConfigEntry *entry,
107                          const QString &entryName);
108 
load()109     void load()
110     {
111         doLoad();
112         mChanged = false;
113     }
save()114     void save()
115     {
116         Q_ASSERT(mChanged);
117         doSave();
118         mChanged = false;
119     }
120     void resetToDefault();
121 
122     QString description() const;
isChanged()123     bool isChanged() const
124     {
125         return mChanged;
126     }
127 
128 Q_SIGNALS:
129     void changed();
130 
131 protected Q_SLOTS:
slotChanged()132     void slotChanged()
133     {
134         mChanged = true;
135         Q_EMIT changed();
136     }
137 
138 protected:
139     virtual void doSave() = 0;
140     virtual void doLoad() = 0;
141 
142     QGpgME::CryptoConfigEntry *mEntry = nullptr;
143     QString mName;
144     bool mChanged = false;
145 };
146 
147 /**
148  * A widget manager for a string entry in the crypto config
149  */
150 class CryptoConfigEntryLineEdit : public CryptoConfigEntryGUI
151 {
152     Q_OBJECT
153 
154 public:
155     CryptoConfigEntryLineEdit(CryptoConfigModule *module,
156                               QGpgME::CryptoConfigEntry *entry,
157                               const QString &entryName,
158                               QGridLayout *layout,
159                               QWidget *parent = nullptr);
160 
161     void doSave() override;
162     void doLoad() override;
163 private:
164     KLineEdit *mLineEdit = nullptr;
165 };
166 
167 /**
168  * A widget manager for a debug-level entry in the crypto config
169  */
170 class CryptoConfigEntryDebugLevel : public CryptoConfigEntryGUI
171 {
172     Q_OBJECT
173 public:
174     CryptoConfigEntryDebugLevel(CryptoConfigModule *module, QGpgME::CryptoConfigEntry *entry,
175                                 const QString &entryName, QGridLayout *layout, QWidget *parent = nullptr);
176 
177     void doSave() override;
178     void doLoad() override;
179 private:
180     QComboBox *mComboBox = nullptr;
181 };
182 
183 /**
184  * A widget manager for a path entry in the crypto config
185  */
186 class CryptoConfigEntryPath : public CryptoConfigEntryGUI
187 {
188     Q_OBJECT
189 
190 public:
191     CryptoConfigEntryPath(CryptoConfigModule *module,
192                           QGpgME::CryptoConfigEntry *entry,
193                           const QString &entryName,
194                           QGridLayout *layout,
195                           QWidget *parent = nullptr);
196 
197     void doSave() override;
198     void doLoad() override;
199 private:
200     Kleo::FileNameRequester *mFileNameRequester = nullptr;
201 };
202 
203 /**
204  * A widget manager for a directory path entry in the crypto config
205  */
206 class CryptoConfigEntryDirPath : public CryptoConfigEntryGUI
207 {
208     Q_OBJECT
209 
210 public:
211     CryptoConfigEntryDirPath(CryptoConfigModule *module,
212                              QGpgME::CryptoConfigEntry *entry,
213                              const QString &entryName,
214                              QGridLayout *layout,
215                              QWidget *parent = nullptr);
216 
217     void doSave() override;
218     void doLoad() override;
219 private:
220     Kleo::FileNameRequester *mFileNameRequester = nullptr;
221 };
222 
223 /**
224  * A widget manager for an int/uint entry in the crypto config
225  */
226 class CryptoConfigEntrySpinBox : public CryptoConfigEntryGUI
227 {
228     Q_OBJECT
229 
230 public:
231     CryptoConfigEntrySpinBox(CryptoConfigModule *module,
232                              QGpgME::CryptoConfigEntry *entry,
233                              const QString &entryName,
234                              QGridLayout *layout,
235                              QWidget *parent = nullptr);
236     void doSave() override;
237     void doLoad() override;
238 private:
239     enum { Int, UInt, ListOfNone } mKind;
240     QSpinBox *mNumInput = nullptr;
241 };
242 
243 /**
244  * A widget manager for a bool entry in the crypto config
245  */
246 class CryptoConfigEntryCheckBox : public CryptoConfigEntryGUI
247 {
248     Q_OBJECT
249 
250 public:
251     CryptoConfigEntryCheckBox(CryptoConfigModule *module,
252                               QGpgME::CryptoConfigEntry *entry,
253                               const QString &entryName,
254                               QGridLayout *layout,
255                               QWidget *parent = nullptr);
256     void doSave() override;
257     void doLoad() override;
258 private:
259     QCheckBox *mCheckBox = nullptr;
260 };
261 
262 /**
263  * A widget manager for an LDAP list entry in the crypto config
264  */
265 class CryptoConfigEntryLDAPURL : public CryptoConfigEntryGUI
266 {
267     Q_OBJECT
268 
269 public:
270     CryptoConfigEntryLDAPURL(CryptoConfigModule *module,
271                              QGpgME::CryptoConfigEntry *entry,
272                              const QString &entryName,
273                              QGridLayout *layout,
274                              QWidget *parent = nullptr);
275     void doSave() override;
276     void doLoad() override;
277 private Q_SLOTS:
278     void slotOpenDialog();
279 private:
280     void setURLList(const QList<QUrl> &urlList);
281     QLabel *mLabel = nullptr;
282     QPushButton *mPushButton = nullptr;
283     QList<QUrl> mURLList;
284 };
285 
286 }
287