1 /* vi: set sw=4 ts=4:
2  *
3  * Copyright (C) 2001 - 2020 Christian Hohnstaedt.
4  *
5  * All rights reserved.
6  */
7 
8 #ifndef __PKI_BASE_H
9 #define __PKI_BASE_H
10 
11 #include <QString>
12 #include <QRegExp>
13 #include <QVariant>
14 #include <QByteArray>
15 #include "BioByteArray.h"
16 #include "asn1time.h"
17 #include "pkcs11_lib.h"
18 #include "base.h"
19 #include "db.h"
20 #include "pki_lookup.h"
21 #include "headerlist.h"
22 #include "sql.h"
23 #include "xfile.h"
24 
25 #define pki_openssl_error() _openssl_error(*this, C_FILE, __LINE__)
26 #define pki_ign_openssl_error() _ign_openssl_error(*this, C_FILE, __LINE__)
27 
28 enum pki_source {
29 	unknown,
30 	imported,
31 	generated,
32 	transformed,
33 	token,
34 	legacy_db,
35 	renewed
36 };
37 
38 #define VIEW_item_id 0
39 #define VIEW_item_name 1
40 #define VIEW_item_type 2
41 #define VIEW_item_date 3
42 #define VIEW_item_source 4
43 #define VIEW_item_comment 5
44 
45 extern pki_lookup Store;
46 
47 class pki_base : public QObject
48 {
49 		Q_OBJECT
50 
51 	public: /* static */
52 		static QRegExp limitPattern;
53 		static QString rmslashdot(const QString &fname);
54 		static unsigned hash(const QByteArray &ba);
55 		static bool pem_comment;
56 		static int count;
57 		static QList<pki_base*> allitems;
58 
59 	protected:
60 		QVariant sqlItemId;
61 		QString desc, comment;
62 		a1time insertion_date;
63 		enum pki_type pkiType;
64 		/* model data */
65 		pki_base *parent;
66 		void my_error(const QString &error) const;
67 		QString filename;
68 		virtual void PEM_file_comment(XFile &file) const;
69 		virtual void collect_properties(QMap<QString, QString> &) const;
70 		QList<pki_base*> childItems;
71 
72 	public:
73 		enum msg_type {
74 			msg_import,
75 			msg_delete,
76 			msg_delete_multi,
77 			msg_create,
78 		};
79 		enum print_opt {
80 			print_openssl_txt,
81 			print_pem,
82 			print_coloured,
83 		};
84 		enum pki_source pkiSource;
85 
86 		pki_base(const QString &d = QString(), pki_base *p = NULL);
87 		pki_base(const pki_base *p);
88 		virtual ~pki_base();
89 
90 		QList<pki_base*> getChildItems() const;
91 		void clear();
getIntName()92 		QString getIntName() const
93 		{
94 			return desc;
95 		}
setFilename(const QString & s)96 		void setFilename(const QString &s)
97 		{
98 			filename = s;
99 		}
getFilename()100 		QString getFilename() const
101 		{
102 			return filename;
103 		}
inheritFilename(pki_base * pki)104 		void inheritFilename(pki_base *pki) const
105 		{
106 			pki->setFilename(getFilename());
107 		}
108 		virtual QString comboText() const;
109 		virtual void print(BioByteArray &b, enum print_opt opt) const;
110 		QString getUnderlinedName() const;
setIntName(const QString & d)111 		void setIntName(const QString &d)
112 		{
113 			desc = d;
114 		}
115 		virtual void autoIntName(const QString &file);
getComment()116 		QString getComment() const
117 		{
118 			return comment;
119 		}
setComment(const QString & c)120 		void setComment(const QString &c)
121 		{
122 			comment = c;
123 		}
getSqlItemId()124 		QVariant getSqlItemId() const
125 		{
126 			return sqlItemId;
127 		}
getType()128 		enum pki_type getType() const
129 		{
130 			return pkiType;
131 		}
i2d_b64()132 		QString i2d_b64() const
133 		{
134 			return QString::fromLatin1(i2d().toBase64());
135 		}
getInsertionDate()136 		a1time getInsertionDate() const
137 		{
138 			return insertion_date;
139 		}
140 		virtual QByteArray i2d() const;
141 		virtual bool compare(const pki_base *) const;
142 		virtual QString getMsg(msg_type msg) const;
143 		virtual const char *getClassName() const;
144 
145 		/* Tree View management */
146 		void setParent(pki_base *p);
147 		pki_base *getParent() const;
148 		pki_base *child(int row);
149 		void insert(pki_base *item);
150 		int childCount() const;
151 		void takeChild(pki_base *pki);
152 		pki_base *takeFirst();
153 		int indexOf(const pki_base *child) const;
154 
155 		/* Token handling */
156 		virtual void deleteFromToken();
157 		virtual void deleteFromToken(const slotid &);
158 		virtual int renameOnToken(const slotid &, const QString &);
159 
160 		/* Import / Export management */
161 		virtual bool pem(BioByteArray &b, int format=0);
162 		virtual void fromPEM_BIO(BIO *, const QString &);
163 		virtual void fromPEMbyteArray(const QByteArray &, const QString &);
164 		virtual void fload(const QString &);
165 		virtual void writeDefault(const QString&) const;
166 
167 		/* Old database management methods */
fromData(const unsigned char *,db_header_t *)168 		virtual void fromData(const unsigned char *, db_header_t *) {};
169 		/* Qt Model-View methods */
bg_color(const dbheader * hd)170 		virtual QVariant bg_color(const dbheader *hd) const
171 		{
172 			(void)hd;
173 			return QVariant();
174 		}
175 		virtual QVariant column_data(const dbheader *hd) const;
176 		virtual QVariant getIcon(const dbheader *hd) const;
177 		virtual QVariant column_tooltip(const dbheader *hd) const;
178 		virtual a1time column_a1time(const dbheader *hd) const;
179 		virtual bool visible() const;
180 		int isVisible();
181 		bool childVisible() const;
182 
183 		/* SQL management methods */
184 		QSqlError insertSql();
insertSqlData()185 		virtual QSqlError insertSqlData()
186 		{
187 			return QSqlError();
188 		}
189 		QSqlError deleteSql();
deleteSqlData()190 		virtual QSqlError deleteSqlData()
191 		{
192 			return QSqlError();
193 		}
194 		virtual void restoreSql(const QSqlRecord &rec);
195 		QSqlError sqlItemNotFound(QVariant sqlId) const;
196 		unsigned hash() const;
197 		QString pki_source_name() const;
198 		QString get_dump_filename(const QString &dirname,
199 					  const QString &ext) const;
200 		void selfComment(QString msg);
201 		QStringList icsVEVENT(const a1time &expires,
202 		    const QString &summary, const QString &description) const;
QString()203 		operator QString() const
204 		{
205 			return QString("(%1[%2]:%3)").arg(getClassName())
206 				.arg(getSqlItemId().toString()).arg(getIntName());
207 		}
208 };
209 
210 Q_DECLARE_METATYPE(pki_base *);
211 #endif
212