xca/widgets/MW_menu.cpp
Christian 91e4e78cef Add options dialog to set the default hash algo,
mandatory distinguished name entries and allow duplicate key use
as requested by some users.
show CRL signature alg information

Version 0.6.3
2007-05-20 10:05:10 +02:00

159 lines
4.3 KiB
C++

/* vi: set sw=4 ts=4:
*
* Copyright (C) 2001 - 2007 Christian Hohnstaedt.
*
* All rights reserved.
*/
#include "MainWindow.h"
#include "Options.h"
#include "lib/load_obj.h"
#include "lib/pass_info.h"
#include "ui_Options.h"
#include "widgets/hashBox.h"
#include <qapplication.h>
#include <qmenubar.h>
#include <qmessagebox.h>
void MainWindow::init_menu()
{
QMenu *file, *help, *import;
file = menuBar()->addMenu(tr("&File"));
file->addAction(tr("New &DataBase"), this,
SLOT(new_database()), Qt::CTRL+Qt::Key_N );
file->addAction(tr("Open &DataBase"), this,
SLOT(load_database()), Qt::CTRL+Qt::Key_L );
acList += file->addAction(tr("&Close DataBase"), this,
SLOT(close_database()), Qt::CTRL+Qt::Key_C );
acList += file->addAction(tr("&Dump DataBase"), this,
SLOT(dump_database()), Qt::CTRL+Qt::Key_D );
acList += file->addAction(tr("&Import old db_dump"), this,
SLOT(import_dbdump()), Qt::CTRL+Qt::Key_I );
acList += file->addAction(tr("&Undelete items"), this,
SLOT(undelete()), Qt::CTRL+Qt::Key_U );
file->addSeparator();
acList += file->addAction(tr("Options"), this, SLOT(setOptions()) );
file->addSeparator();
file->addAction(tr("E&xit"), qApp, SLOT(quit()), Qt::ALT+Qt::Key_F4 );
import = menuBar()->addMenu(tr("&Import"));
import->addAction(tr("Keys"), this,
SLOT(on_BNimportKey_clicked()) );
import->addAction(tr("Requests"), this,
SLOT(on_BNimportReq_clicked()) );
import->addAction(tr("Certificates"), this,
SLOT(on_BNimportCert_clicked()) );
import->addAction(tr("PKCS#12"), this,
SLOT(on_BNimportPKCS12_clicked()) );
import->addAction(tr("PKCS#7"), this,
SLOT(on_BNimportPKCS7_clicked()) );
import->addAction(tr("Template"), this,
SLOT(on_BNimportTemp_clicked()) );
import->addAction(tr("Revocation list"), this,
SLOT(on_BNimportCrl_clicked()) );
import->addAction(tr("PEM file"), this,
SLOT(loadPem()) );
help = menuBar()->addMenu(tr("&Help") );
help->addAction(tr("&Content"), this, SLOT(help()), Qt::Key_F1 );
help->addAction(tr("&About"), this, SLOT(about()) );
help->addAction(tr("Donations"), this, SLOT(donations()) );
wdList += import;
}
void MainWindow::new_database()
{
load_db l;
QString fname = QFileDialog::getSaveFileName(this, l.caption, homedir,
l.filter, 0, QFileDialog::DontConfirmOverwrite);
if (fname.isEmpty())
return;
close_database();
homedir = fname.mid(0, fname.lastIndexOf(QDir::separator()) );
dbfile = fname;
init_database();
}
void MainWindow::load_database()
{
load_db l;
QString fname = QFileDialog::getOpenFileName(this, l.caption, homedir,
l.filter);
if (fname.isEmpty())
return;
close_database();
homedir = fname.mid(0, fname.lastIndexOf(QDir::separator()) );
dbfile = fname;
init_database();
}
void MainWindow::import_dbdump()
{
extern int read_dump(const char *, db_base **, char *, int);
char buf[50];
db_base *dbl[] = { keys, reqs, certs, temps, crls };
if (!keys)
return;
QString pass;
QString file = QFileDialog::getOpenFileName(this, tr(XCA_TITLE), homedir,
tr("Database dump ( *.dump );;All files ( *.* )"));
if (file.isEmpty())
return;
pass_info p(tr("Import password"),
tr("Please enter the password of the old database"), this);
if (passRead(buf, 50, 0, &p) <0)
return;
pass = buf;
try {
read_dump(CCHAR(file), dbl, buf, 50);
//printf("MD5:%s, r:%s\n", CCHAR(pki_key::md5passwd(CCHAR(pass))),buf);
if (pki_key::md5passwd(CCHAR(pass)) != buf) {
int ret = QMessageBox::warning(this, tr(XCA_TITLE),
tr("Password verification error. Ignore keys ?"),
tr("Import anyway"), tr("Cancel"));
if (ret)
return;
}
pki_key::setOldPasswd(CCHAR(pass));
read_dump(CCHAR(file), dbl, NULL, 0);
pki_key::eraseOldPasswd();
} catch (errorEx &err) {
Error(err);
}
}
void MainWindow::setOptions()
{
unsigned char bol;
Options *opt = new Options(this);
opt->multiple_use->setChecked(multiple_key_use);
if (!opt->exec())
return;
QString alg = opt->hashAlgo->currentHashName();
db mydb(dbfile);
mydb.set((const unsigned char *)CCHAR(alg), alg.length()+1, 1,
setting, "default_hash");
hashBox::setDefault(alg);
mandatory_dn = opt->getDnString();
mydb.set((const unsigned char *)CCHAR(mandatory_dn),
mandatory_dn.length()+1, 1, setting, "mandatory_dn");
multiple_key_use = opt->multiple_use->isChecked();
bol = multiple_key_use ? 1 : 0;
mydb.set(&bol, sizeof(bol), 1, setting, "multiple_key_use");
}