xca/widgets/Options.cpp
Christian Hohnstaedt 6e432238e7 Generalize, simplify and unify settings management
Add settings class to access the settings table in the database
Cache values and improve database writes.
Options dialog simplified
Replace getSetting / storeSetting
Unpack option flags to rows in the settings
2018-03-10 09:04:54 +01:00

231 lines
5.2 KiB
C++

/* vi: set sw=4 ts=4:
*
* Copyright (C) 2001 - 2012 Christian Hohnstaedt.
*
* All rights reserved.
*/
#include "lib/func.h"
#include "Options.h"
#include "SearchPkcs11.h"
#include "lib/pki_scard.h"
#include <openssl/objects.h>
#include <QMessageBox>
#include <QToolTip>
Options::Options(MainWindow *parent)
:QDialog(parent)
{
mw = parent;
setWindowTitle(XCA_TITLE);
setupUi(this);
foreach(int nid, *MainWindow::dn_nid) {
QString n = OBJ_nid2ln(nid);
extDNobj->addItem(n);
expDNobj->addItem(n);
}
string_opts << "MASK:0x2002" << "pkix" << "nombstr" <<
"utf8only" << "default";
QStringList s;
s << tr("Printable string or UTF8 (default)")
<< tr("PKIX recommendation in RFC2459")
<< tr("No BMP strings, only printable and T61")
<< tr("UTF8 strings only (RFC2459)")
<< tr("All strings");
mbstring->addItems(s);
mbstring->setCurrentIndex(string_opts.indexOf(Settings["string_opt"]));
searchP11 = NULL;
transDnEntries->setText(transDnEntries->text()
.arg(OBJ_nid2ln(NID_commonName))
.arg(dn_translations[NID_commonName]));
setDnString(Settings["mandatory_dn"], extDNlist);
setDnString(Settings["explicit_dn"], expDNlist);
setupPkcs11Provider(Settings["pkcs11path"]);
suppress->setCheckState(Settings["suppress_messages"]);
noColorize->setCheckState(Settings["no_expire_colors"]);
transDnEntries->setCheckState(Settings["translate_dn"]);
onlyTokenHashes->setCheckState(Settings["only_token_hashes"]);
disableNetscape->setCheckState(Settings["disable_netscape"]);
}
Options::~Options()
{
if (searchP11)
delete searchP11;
}
void Options::on_extDNadd_clicked()
{
extDNlist->addItem(extDNobj->currentText());
}
void Options::on_extDNdel_clicked()
{
extDNlist->takeItem(extDNlist->currentRow());
}
void Options::on_expDNadd_clicked()
{
expDNlist->addItem(expDNobj->currentText());
}
void Options::on_expDNdel_clicked()
{
expDNlist->takeItem(expDNlist->currentRow());
}
void Options::on_expDNdefault_clicked()
{
setDnString(Settings.defaults("explicit_dn"), expDNlist);
}
void Options::setDnString(QString dn, QListWidget *w)
{
QStringList dnl;
if (!dn.isEmpty())
dnl = dn.split(",");
w->clear();
for (int i=0; i < dnl.count(); i++) {
int nid = OBJ_sn2nid(CCHAR(dnl[i]));
w->addItem(OBJ_nid2ln(nid));
}
}
QString Options::getDnString(QListWidget *w)
{
QStringList dn;
for (int j=0; j<w->count(); j++) {
int nid = OBJ_ln2nid(CCHAR(w->item(j)->text()));
dn << QString(OBJ_nid2sn(nid));
}
return dn.join(",");
}
int Options::exec()
{
if (QDialog::exec() == QDialog::Rejected)
return QDialog::Rejected;
Transaction;
if (!TransBegin())
return QDialog::Rejected;
Settings["suppress_messages"] = suppress->checkState();
Settings["no_expire_colors"] = noColorize->checkState();
Settings["translate_dn"] = transDnEntries->checkState();
Settings["only_token_hashes"] = onlyTokenHashes->checkState();
Settings["disable_netscape"] = disableNetscape->checkState();
Settings["default_hash"] = hashAlgo->currentHashName();
Settings["mandatory_dn"] = getDnString(extDNlist);
Settings["explicit_dn"] = getDnString(expDNlist);
Settings["string_opt"] = string_opts[mbstring->currentIndex()];
Settings["pkcs11path"] = getPkcs11Provider();
return TransCommit() ? QDialog::Accepted : QDialog::Rejected;
}
void Options::on_addButton_clicked(void)
{
load_pkcs11 l;
QString fname;
fname = QFileDialog::getOpenFileName(this, l.caption,
getLibDir(), l.filter);
addLib(fname);
}
void Options::addLib(QString fname)
{
pkcs11_lib *lib;
QString status;
fname = QFileInfo(fname).canonicalFilePath();
if (fname.isEmpty() || pkcs11::get_lib(fname))
return;
try {
lib = pkcs11::load_lib(fname, false);
if (lib)
status = lib->driverInfo();
} catch (errorEx &ex) {
lib = NULL;
status = ex.getString();
}
status = status.trimmed();
QListWidgetItem *item = new QListWidgetItem(fname);
item->setToolTip(status);
if (lib)
item->setIcon(*MainWindow::doneIco);
pkcs11List->addItem(item);
if (searchP11)
QToolTip::showText(searchP11->mapToGlobal(
QPoint(0,0)), status);
}
void Options::on_removeButton_clicked(void)
{
QListWidgetItem *item = pkcs11List->takeItem(pkcs11List->currentRow());
if (!item)
return;
try {
pkcs11::remove_lib(item->text());
} catch (errorEx &err) {
mw->Error(err);
}
}
void Options::on_searchPkcs11_clicked(void)
{
if (!searchP11) {
searchP11 = new SearchPkcs11(this, QString());
connect(searchP11, SIGNAL(addLib(QString)),
this, SLOT(addLib(QString)));
}
searchP11->show();
}
void Options::setupPkcs11Provider(QString list)
{
pkcs11_lib_list libs = pkcs11::get_libs();
foreach(pkcs11_lib *l, libs) {
QListWidgetItem *item = new QListWidgetItem(l->filename());
try {
item->setToolTip(l->driverInfo());
item->setIcon(*MainWindow::doneIco);
} catch (errorEx &err) {
mw->Error(err);
}
pkcs11List->addItem(item);
}
if (!list.isEmpty()) {
foreach(QString libname, list.split('\n')) {
if (libs.get_lib(libname))
continue;
QListWidgetItem *item = new QListWidgetItem(libname);
item->setToolTip(tr("Load failed"));
pkcs11List->addItem(item);
}
}
}
QString Options::getPkcs11Provider()
{
QStringList prov;
for (int j=0; j<pkcs11List->count(); j++) {
prov << pkcs11List->item(j)->text();
}
if (prov.count() == 0)
return QString("");
return prov.join("\n");
}