1 /* vi: set sw=4 ts=4:
2  *
3  * Copyright (C) 2015 - 2020 Christian Hohnstaedt.
4  *
5  * All rights reserved.
6  */
7 
8 #include "lib/pki_temp.h"
9 #include "TempTreeView.h"
10 #include "NewX509.h"
11 #include "XcaDialog.h"
12 #include "MainWindow.h"
13 #include <QAbstractItemModel>
14 #include <QAbstractItemView>
15 #include <QMenu>
16 
fillContextMenu(QMenu * menu,QMenu *,const QModelIndex &,QModelIndexList indexes)17 void TempTreeView::fillContextMenu(QMenu *menu, QMenu *,
18 		const QModelIndex &, QModelIndexList indexes)
19 {
20 	if (indexes.size() != 1)
21 		return;
22 
23 	menu->addAction(tr("Duplicate"), this, SLOT(duplicateTemp()));
24 	menu->addAction(tr("Create certificate"), this, SLOT(certFromTemp()));
25 	menu->addAction(tr("Create request"), this, SLOT(reqFromTemp()));
26 }
27 
duplicateTemp()28 void TempTreeView::duplicateTemp()
29 {
30 	pki_temp *temp = db_base::fromIndex<pki_temp>(currentIndex());
31 	if (!temp || !basemodel)
32 		return;
33 	pki_temp *newtemp = new pki_temp(temp);
34 	newtemp->setIntName(newtemp->getIntName() + " " + tr("copy"));
35 	temps()->insertPKI(newtemp);
36 }
37 
certFromTemp()38 void TempTreeView::certFromTemp()
39 {
40 	pki_temp *temp = db_base::fromIndex<pki_temp>(currentIndex());
41 	if (temp)
42 		emit newCert(temp);
43 }
44 
reqFromTemp()45 void TempTreeView::reqFromTemp()
46 {
47 	pki_temp *temp = db_base::fromIndex<pki_temp>(currentIndex());
48 	if (temp)
49 		emit newReq(temp);
50 }
51 
showPki(pki_base * pki)52 void TempTreeView::showPki(pki_base *pki)
53 {
54 	alterTemp(dynamic_cast<pki_temp *>(pki));
55 }
56 
runTempDlg(pki_temp * temp)57 bool TempTreeView::runTempDlg(pki_temp *temp)
58 {
59 	NewX509 *dlg = new NewX509(this);
60 
61 	dlg->setTemp(temp);
62 	if (!dlg->exec()) {
63 		delete dlg;
64 		return false;
65 	}
66 	dlg->toTemplate(temp);
67 	delete dlg;
68 	return true;
69 }
70 
newItem()71 void TempTreeView::newItem()
72 {
73 	pki_temp *temp = NULL;
74 	QString type;
75 
76 	if (!basemodel)
77 		return;
78 
79 	itemComboTemp *ic = new itemComboTemp(NULL);
80 	ic->insertPkiItems(temps()->getPredefs());
81 	XcaDialog *dlg = new XcaDialog(this, tmpl, ic,
82 				tr("Preset Template values"), QString());
83 	if (dlg->exec()) {
84 		temp = new pki_temp(ic->currentPkiItem());
85 		if (temp) {
86 			temp->pkiSource = generated;
87 			if (runTempDlg(temp)) {
88 				temp = dynamic_cast<pki_temp *>(
89 						temps()->insertPKI(temp));
90 				temps()->createSuccess(temp);
91 			} else {
92 				delete temp;
93 			}
94 		}
95 	}
96 	delete dlg;
97 }
98 
alterTemp(pki_temp * temp)99 bool TempTreeView::alterTemp(pki_temp *temp)
100 {
101 	if (!basemodel || !temp)
102 		return false;
103 
104 	if (!runTempDlg(temp))
105 		return false;
106 
107 	temps()->alterTemp(temp);
108 	return true;
109 }
110