⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainwindow.cpp

📁 一个小型证书管理系统
💻 CPP
字号:
/* * Copyright (C) 2001 Christian Hohnstaedt. * *  All rights reserved. * * *  Redistribution and use in source and binary forms, with or without  *  modification, are permitted provided that the following conditions are met: * *  - Redistributions of source code must retain the above copyright notice, *    this list of conditions and the following disclaimer. *  - Redistributions in binary form must reproduce the above copyright notice, *    this list of conditions and the following disclaimer in the documentation *    and/or other materials provided with the distribution. *  - Neither the name of the author nor the names of its contributors may be  *    used to endorse or promote products derived from this software without *    specific prior written permission. * * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * This program links to software with different licenses from: * *	http://www.openssl.org which includes cryptographic software * 	written by Eric Young (eay@cryptsoft.com)" * *	http://www.sleepycat.com * *	http://www.trolltech.com *  * * * http://www.hohnstaedt.de/xca * email: christian@hohnstaedt.de * * $Id: MainWindow.cpp,v 1.52 2003/01/06 19:35:46 chris Exp $  * */                           #include "MainWindow.h"QPixmap *MainWindow::keyImg = NULL, *MainWindow::csrImg = NULL,	*MainWindow::certImg = NULL, *MainWindow::tempImg = NULL,	*MainWindow::nsImg = NULL, *MainWindow::revImg = NULL;MainWindow::MainWindow(QWidget *parent, const char *name ) 	:MainWindow_UI(parent, name){	connect( (QObject *)quitApp, SIGNAL(clicked()), (QObject *)qApp, SLOT(quit()) );	QString cpr = "(c) 2002 by Christian@Hohnstaedt.de - Version: ";	copyright->setText(cpr + VER);	setCaption(tr(XCA_TITLE));#ifdef WIN32	baseDir = "";	dbfile="xca.db";#else		baseDir = QDir::homeDirPath();	baseDir += QDir::separator();	baseDir += BASE_DIR;	QDir d(baseDir);        if ( ! d.exists() ){		if (!d.mkdir(baseDir))			qFatal(  "Couldnt create: " +  baseDir );	}	if (qApp->argc() <2){		dbfile = "xca.db";	}	else {		dbfile = qApp->argv()[1];	}	#endif	try {		dbenv = new DbEnv(0);		dbenv->set_errcall(&MainWindow::dberr);		dbenv->open(baseDir.latin1(), DB_RECOVER | DB_INIT_TXN | DB_INIT_MPOOL | DB_INIT_LOG | DB_INIT_LOCK | DB_CREATE , 0600 );		MARK	}	catch (DbException &err) {		DBEX(err);		QString e = err.what();		e += " (" + baseDir + ")";		qFatal(e);	}	MARK	ERR_load_crypto_strings();	OpenSSL_add_all_algorithms();		keyImg = loadImg("bigkey.png");	csrImg = loadImg("bigcsr.png");	certImg = loadImg("bigcert.png");	tempImg = loadImg("bigtemp.png");	nsImg = loadImg("netscape.png");	revImg = loadImg("revoked.png");	MARK		try {		settings = new db_base(dbenv, dbfile.latin1(), "settings");		MARK		initPass();		keys = new db_key(dbenv, dbfile.latin1(), keyList);		reqs = new db_x509req(dbenv, dbfile.latin1(), reqList, keys);		certs = new db_x509(dbenv, dbfile.latin1(), certList, keys);		temps = new db_temp(dbenv, dbfile.latin1(), tempList);	}	catch (errorEx &err) {		Error(err);	}	catch (DbException &err) {		DBEX(err);		qFatal(err.what());	}			bigKey->setPixmap(*keyImg);	bigCsr->setPixmap(*csrImg);	bigCert->setPixmap(*certImg);	bigTemp->setPixmap(*tempImg);	bigRev->setPixmap(*revImg);#ifdef qt3		connect( keyList, SIGNAL(itemRenamed(QListViewItem *, int, const QString &)),this, SLOT(renameKey(QListViewItem *, int, const QString &)));	connect( reqList, SIGNAL(itemRenamed(QListViewItem *, int, const QString &)),this, SLOT(renameReq(QListViewItem *, int, const QString &)));	connect( certList, SIGNAL(itemRenamed(QListViewItem *, int, const QString &)),this, SLOT(renameCert(QListViewItem *, int, const QString &)));	connect( tempList, SIGNAL(itemRenamed(QListViewItem *, int, const QString &)),this, SLOT(renameTemp(QListViewItem *, int, const QString &)));#endif	};MainWindow::~MainWindow() {	 ERR_free_strings();	 EVP_cleanup();	 delete(keys);	 delete(reqs);	 delete(certs);	 delete(temps);	 delete(settings);	 dbenv->close(0);}QPixmap *MainWindow::loadImg(const char *name ){        return settings->loadImg(name);}			void MainWindow::initPass(){	PASS_INFO p;	string passHash = settings->getString("pwhash");	if (passHash == "") {		string title=tr("New Password").latin1();		string description=tr("Please enter a password, that will be used to encrypt your private keys in the database-file").latin1();		p.title = &title;		p.description = &description;		int keylen = passWrite((char *)pki_key::passwd, 25, 0, &p);		if (keylen == 0) {			qFatal("Ohne Passwort laeuft hier gaaarnix :-)");		}		pki_key::passwd[keylen]='\0';		settings->putString( "pwhash", md5passwd() );	}	else {	     int keylen=0;			     while (md5passwd() != passHash) {		if (keylen !=0)			QMessageBox::warning(this,tr(XCA_TITLE), tr("Password verify error, please try again"));			string title=tr("Password").latin1();		string description=tr("Please enter the password for unlocking the database").latin1();		p.title = &title;		p.description = &description;		keylen = passRead(pki_key::passwd, 25, 0, &p);		if (keylen == 0) {			qFatal("Ohne Passwort laeuft hier gaaarnix :-)");		}		pki_key::passwd[keylen]='\0';	    }	}}void MainWindow::renamePKI(db_base *db){        pki_base * pki = db->getSelectedPKI();	if (!pki) return;        QString name= pki->getDescription().c_str();	bool ok;	QString nname = QInputDialog::getText (XCA_TITLE, "Please enter the new name",			QLineEdit::Normal, name, &ok, this );	if (ok && name != nname) {		db->renamePKI(pki, nname.latin1());	}}// Static Password Callback functions int MainWindow::passRead(char *buf, int size, int rwflag, void *userdata){	PASS_INFO *p = (PASS_INFO *)userdata;	PassRead_UI *dlg = new PassRead_UI(NULL, 0, true);	if (p != NULL) {		dlg->image->setPixmap( *keyImg );		dlg->title->setText(tr(p->title->c_str()));		dlg->description->setText(tr(p->description->c_str()));	}	dlg->pass->setFocus();	dlg->setCaption(tr(XCA_TITLE));	if (dlg->exec()) {	   QString x = dlg->pass->text();	   strncpy(buf, x.latin1(), size);	   return x.length();	}	else return 0;}int MainWindow::passWrite(char *buf, int size, int rwflag, void *userdata){	PASS_INFO *p = (PASS_INFO *)userdata;	PassWrite_UI *dlg = new PassWrite_UI(NULL, 0, true);	if (p != NULL) {		dlg->image->setPixmap( *keyImg );		dlg->title->setText(tr(p->title->c_str()));		dlg->description->setText(tr(p->description->c_str()));	}	dlg->passA->setFocus();	dlg->setCaption(tr(XCA_TITLE));	if (dlg->exec()) {	   QString A = dlg->passA->text();	   QString B = dlg->passB->text();	   if (A != B) return 0;	   strncpy(buf, A.latin1(), size);	   return A.length();	}	else return 0;}void MainWindow::incProgress(int a, int b, void *progress){	int i = ((QProgressDialog *)progress)->progress();	((QProgressDialog *)progress)->setProgress(++i);}string MainWindow::md5passwd(){	EVP_MD_CTX mdctx;	string str;	unsigned int n;	int j;	char zs[4];	unsigned char m[EVP_MAX_MD_SIZE];	EVP_DigestInit(&mdctx, EVP_md5());	EVP_DigestUpdate(&mdctx, pki_key::passwd, strlen(pki_key::passwd));	EVP_DigestFinal(&mdctx, m, &n);	for (j=0; j<(int)n; j++) {		sprintf(zs, "%02X%c",m[j], (j+1 == (int)n) ?'\0':':');		str += zs;	}	return str;}bool MainWindow::opensslError(pki_base *pki){	string err;	if (!pki) {		QMessageBox::warning(this,tr(XCA_TITLE), tr("The system detected a NULL pointer, maybe the system is out of memory" ));		qFatal("NULL pointer detected - Exiting");	}		if (( err = pki->getError()) != "") { 		QMessageBox::warning(this,tr(XCA_TITLE), tr("The following error occured")+			" (" + QString::fromLatin1(pki->getClassName().c_str()) +") :"+			QString::fromLatin1(err.c_str()));		return true;	}	return false;}	void MainWindow::Error(errorEx &err){	if (err.isEmpty()) {		CERR("Empty error Exception silently ignored");		return;	}	QMessageBox::warning(this,tr(XCA_TITLE), tr("The following error occured:") + "\n" +			QString::fromLatin1(err.getCString()));}void MainWindow::crashApp(){	pki_base * nullpointer = NULL;	CERR("------> CRASHING the Application <----------");	nullpointer->getDescription();}void MainWindow::dberr(const char *errpfx, char *msg){	CERR(errpfx << " " << msg);}void MainWindow::setPath(QFileDialog *dlg){	string wd = settings->getString("workingdir");		if (!wd.empty()) {		dlg->setDir(QString(wd.c_str()));	}}void MainWindow::newPath(QFileDialog *dlg){	string wd = dlg->dirPath().latin1();	settings->putString("workingdir", wd);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -