diff --git a/Makefile.in b/Makefile.in index adfa62a2..2a18099e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -14,8 +14,8 @@ CC=@CC@ CPPFLAGS=-I. @CPPFLAGS@ @DEFS@ CFLAGS=-Wall @ac_DEBUG@ -LDFLAGS=-Llib -Lui -Lwidgets @LDFLAGS@ -LIBS=@LIBS@ -lwidget -lpki -lqtui +LDFLAGS=-Llib @LDFLAGS@ +LIBS=@LIBS@ -lpki MOC=@MOC@ UIC=@UIC@ @@ -23,24 +23,24 @@ UIC=@UIC@ ################################### -NAMES=XcaListView KeyView ReqView TempView CertView validity distname CrlView -OBJS=main.o $(patsubst %,moc_%.o,$(NAMES)) $(patsubst %,%.o,$(NAMES)) +#NAMES=XcaListView KeyView ReqView TempView CertView validity distname +#OBJS=main.o $(patsubst %,moc_%.o,$(NAMES)) $(patsubst %,%.o,$(NAMES)) -SUBDIRS=lib ui widgets +OBJS=ui/ui.o widgets/widgets.o view/view.o +SUBDIRS=lib ui widgets view -all: $(SUBDIRS) $(OBJS) xca -main.o: ui +all: $(SUBDIRS) xca re: clean all %.o: %.cpp $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ -xca: $(OBJS) lib/libpki.a ui/libqtui.a widgets/libwidget.a +xca: $(OBJS) lib/libpki.a $(OBJS) $(CC) $(LDFLAGS) $(OBJS) $(LIBS) -o xca @echo -e "\n\n\nOk, compilation was successfull. \nNow do as root: 'make install'\n" -lib ui widgets: +$(SUBDIRS): $(MAKE) -C $@ all clean: diff --git a/configure.ac b/configure.ac index ee0848e9..96bba1d5 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_INIT(xca, 0.4.0) -AC_CONFIG_SRCDIR([main.cpp]) +AC_CONFIG_SRCDIR([view/main.cpp]) AC_CONFIG_HEADERS([config.h]) if test -z "$CFLAGS"; then @@ -94,7 +94,7 @@ else ac_DEBUG= fi], ) -AC_CONFIG_FILES([Makefile lib/Makefile lib/base.h ui/Makefile widgets/Makefile results]) +AC_CONFIG_FILES([Makefile lib/Makefile lib/base.h ui/Makefile widgets/Makefile view/Makefile results]) AC_OUTPUT if test "$LDB" != X; then diff --git a/lib/x509name.cpp b/lib/x509name.cpp index 8ccc5a80..56f0b269 100644 --- a/lib/x509name.cpp +++ b/lib/x509name.cpp @@ -90,7 +90,7 @@ QString x509name::oneLine() const QString x509name::getEntryByNid(int nid) const { - int len = X509_NAME_get_text_by_NID(xn, nid, NULL, 0); + int len = X509_NAME_get_text_by_NID(xn, nid, NULL, 0) + 1; char *buf = (char *)OPENSSL_malloc(len); QString s; X509_NAME_get_text_by_NID(xn, nid, buf, len); diff --git a/ui/Makefile.in b/ui/Makefile.in index bcc65aab..99fc724e 100644 --- a/ui/Makefile.in +++ b/ui/Makefile.in @@ -15,7 +15,7 @@ UIC=@UIC@ AR=@AR@ RANLIB=@RANLIB@ -CPPFLAGS=-I.. @CPPFLAGS@ @DEFS@ +CPPFLAGS=-I.. -I../widgets -I../view @CPPFLAGS@ @DEFS@ CFLAGS=-Wall @ac_DEBUG@ ############################################## @@ -30,11 +30,10 @@ MOC_CPP=$(patsubst %,moc_%.cpp,$(MOCNAMES)) UI_CPP=$(patsubst %, %.cpp, $(UINAMES)) UI_H=$(patsubst %, %.h, $(UINAMES)) -all: libqtui.a +all: ui.o -libqtui.a: $(UIOBJS) - $(AR) rc $@ $(UIOBJS) - $(RANLIB) $@ +ui.o: $(UIOBJS) + $(LD) -r $(UIOBJS) -o $@ %.o: %.cpp $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ diff --git a/ui/ReqDetail.ui b/ui/ReqDetail.ui index f0a35f6c..ceea8aad 100644 --- a/ui/ReqDetail.ui +++ b/ui/ReqDetail.ui @@ -11,8 +11,8 @@ 0 0 - 556 - 405 + 544 + 298 @@ -113,7 +113,7 @@ name - Spacer7 + Spacer12 orientation @@ -725,7 +725,7 @@ name - Spacer5_2 + Spacer13 orientation @@ -753,7 +753,7 @@ name - Spacer6_2 + Spacer14 orientation @@ -852,7 +852,7 @@ image0 - 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 diff --git a/view/CertView.cpp b/view/CertView.cpp new file mode 100644 index 00000000..79cd50f4 --- /dev/null +++ b/view/CertView.cpp @@ -0,0 +1,1292 @@ +/* + * 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$ + * + */ + + +#include "CertView.h" +#include "widgets/MainWindow.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ui/CertExtend.h" +#include "widgets/ExportCert.h" +#include "ui/CertDetail.h" +#include "ui/TrustState.h" +#include "widgets/ExportTinyCA.h" +#include "widgets/validity.h" +#include "lib/pki_pkcs12.h" +#include "lib/pki_pkcs7.h" + +#ifdef WIN32 +#include // to define mkdir function +#include // to define mkdir function +#else +#include +#include +#include +#endif + +CertView::CertView(QWidget * parent = 0, const char * name = 0, WFlags f = 0) + :XcaListView(parent, name, f) +{ + addColumn(tr("Common Name")); + addColumn(tr("Serial")); + addColumn(tr("not After")); + addColumn(tr("Trust state")); + addColumn(tr("Revokation")); + viewState=1; // Tree View +} + + +void CertView::newItem() +{ + NewX509 *dlg = MainWindow::newX509(MainWindow::certImg); + dlg->setCert(); + if (dlg->exec()) { + newCert(dlg); + } + delete dlg; +} + + +void CertView::newCert(NewX509 *dlg) +{ + pki_x509 *cert = NULL; + pki_x509 *signcert = NULL; + pki_x509req *req = NULL; + pki_key *signkey = NULL, *clientkey = NULL, *tempkey = NULL; + a1int serial; + a1time notBefore, notAfter; + x509name subject; + int i; + const QString critical = "critical"; + + QStringList cont; + + QString ekeyusage[]= {"serverAuth","clientAuth","codeSigning","emailProtection", + "timeStamping","msCodeInd","msCodeCom", + "msCTLSign","msSGC","msEFS","nsSGC","1.3.6.1.4.1.311.10.3.4.1"}; + QString keyusage[] ={"digitalSignature", "nonRepudiation", "keyEncipherment", + "dataEncipherment", "keyAgreement", "keyCertSign", + "cRLSign", "encipherOnly", "decipherOnly"}; + QString certTypeList[] = { "client", "server", "email", "objsign", + "sslCA", "emailCA", "objCA" }; + + QListBoxItem *item; + + emit init_database(); + + try { + // Step 1 - Subject and key + if (!dlg->fromReqCB->isChecked()) { + clientkey = dlg->getSelectedKey(); + subject = dlg->getX509name(); + } + else { + // A PKCS#10 Request was selected + req = (pki_x509req *)MainWindow::reqs->getByName(dlg->reqList->currentText()); + if (Error(req)) return; + clientkey = req->getRefKey(); + if (clientkey == NULL) { + clientkey = req->getPubKey(); + tempkey = clientkey; + } + subject = req->getSubject(); + } + + // Step 2 - select Signing + if (dlg->foreignSignRB->isChecked()) { + signcert = (pki_x509 *)db->getByName(dlg->certList->currentText()); + serial = signcert->getIncCaSerial(); + signkey = signcert->getRefKey(); + // search for serial in database + + } + else { + signkey = clientkey; + bool ok; + serial = dlg->serialNr->text().toInt(&ok); + if (!ok) serial = 0; + } + + + // Step 3 - Choose the Date and all the V3 extensions + + // Date handling + notBefore = dlg->validity->getNotBefore(); + notAfter = dlg->validity->getNotAfter(); + + // initially create cert + cert = new pki_x509(); + if (!signcert) signcert=cert; + cert->setIntName(req->getIntName()); + cert->setPubKey(clientkey); + cert->setSubject(subject); + cert->setIssuer(signcert->getSubject()); + if (cert->resetTimes(signcert) > 0) { + if (QMessageBox::information(this,tr(XCA_TITLE), + tr("The validity times for the certificate need to get adjusted to not exceed those of the signer"), + tr("Continue creation"), tr("Abort") + )) + throw errorEx(""); + } + + // STEP 4 + // handle extensions + + // basic constraints + if (dlg->bcCritical->isChecked()) cont << critical; + cont << (QString)"CA:" + dlg->basicCA->currentText(); + cont << (QString)"pathlen:" + dlg->basicPath->text(); + cert->addV3ext(NID_basic_constraints, cont.join(", ")); + + // Subject Key identifier + if (dlg->subKey->isChecked()) { + cert->addV3ext(NID_subject_key_identifier, "hash"); + } + + // Authority Key identifier + if (dlg->authKey->isChecked()) { + cert->addV3ext(NID_authority_key_identifier, + "keyid:always,issuer:always"); + } + + // key usage + cont.clear(); + if (dlg->kuCritical->isChecked()) cont << critical; + for (i=0; (item = dlg->keyUsage->item(i)); i++) { + if (item->selected()){ + cont << keyusage[i]; + } + } + cert->addV3ext(NID_key_usage, cont.join(", ")); + + // extended key usage + cont.clear(); + if (dlg->ekuCritical->isChecked()) cont << critical; + for (i=0; (item = dlg->ekeyUsage->item(i)); i++) { + if (item->selected()){ + cont << ekeyusage[i]; + } + } + cert->addV3ext(NID_ext_key_usage, cont.join(", ")); + + + // Subject Alternative name + if (dlg->subAltCp->isChecked()) { + if (subject.getEntryByNid(NID_pkcs9_emailAddress).length() == 0) { + if (QMessageBox::information(this,tr(XCA_TITLE), + tr("You requested to copy the subject E-Mail address but it is empty !"), + tr("Continue creation"), tr("Abort") + )) + throw errorEx(""); + } + else { + cont << (QString)"email:copy"; + } + } + cont << dlg->subAltName->text(); + cert->addV3ext(NID_subject_alt_name, cont.join(", ")); + + // issuer alternative name + cont.clear(); + if (dlg->issAltCp->isChecked()) { + if (!signcert->hasSubAltName()) { + if (QMessageBox::information(this,tr(XCA_TITLE), + tr("You requested to copy the issuer alternative name but it is empty !"), + tr("Continue creation"), tr("Abort") + )) + throw errorEx(""); + } + else { + cont << (QString)"issuer:copy"; + } + } + cont << dlg->issAltName->text(); + cert->addV3ext(NID_issuer_alt_name, cont.join(", ")); + + // CRL distribution points + if (!dlg->crlDist->text().isEmpty()) { + CERR("CRL dist. Point: "<< dlg->crlDist->text() ); + cert->addV3ext(NID_crl_distribution_points, dlg->crlDist->text()); + } + + // STEP 5 + // Nestcape extensions + cont.clear(); + for (i=0; (item = dlg->nsCertType->item(i)); i++) { + if (item->selected()){ + cont << certTypeList[i]; + } + } + cert->addV3ext(NID_netscape_cert_type, cont.join(", ")); + cert->addV3ext(NID_netscape_base_url, dlg->nsBaseUrl->text()); + cert->addV3ext(NID_netscape_revocation_url, dlg->nsRevocationUrl->text()); + cert->addV3ext(NID_netscape_ca_revocation_url, dlg->nsCARevocationUrl->text()); + cert->addV3ext(NID_netscape_renewal_url, dlg->nsRenewalUrl->text()); + cert->addV3ext(NID_netscape_ca_policy_url, dlg->nsCaPolicyUrl->text()); + cert->addV3ext(NID_netscape_ssl_server_name, dlg->nsSslServerName->text()); + cert->addV3ext(NID_netscape_comment, dlg->nsComment->text()); + + // and finally sign the request + cert->sign(signkey); + CERR( "SIGNED"); + insert(cert); + CERR("inserted"); + if (tempkey != NULL) delete(tempkey); + CERR("Dialog deleted" ); + updateView(); + return; + } + catch (errorEx &err) { + Error(err); + delete cert; + if (tempkey != NULL) delete(tempkey); + } + +} + +void CertView::extendCert() +{ + pki_x509 *oldcert = NULL, *signer = NULL, *newcert =NULL; + pki_key *signkey = NULL; + a1time time; + a1int serial; + emit init_database(); + try { + CertExtend_UI *dlg = new CertExtend_UI(this, NULL, true); + dlg->image->setPixmap(*MainWindow::certImg); + dlg->validity->setNotBefore(time.now()); + dlg->validity->setNotAfter(time.now(60 * 60 * 24 * 356)); + + if (!dlg->exec()) { + delete dlg; + return; + } + oldcert = (pki_x509 *)getSelected(); + if (!oldcert || !(signer = oldcert->getSigner()) || !(signkey = signer->getRefKey()) || signkey->isPubKey()) return; + newcert = new pki_x509(oldcert); + serial = signer->getIncCaSerial(); + + // get signers own serial to avoid having the same + if (serial == signer->getSerial()) { + serial = signer->getIncCaSerial(); // just take the next one + } + db->updatePKI(signer); // FIXME::not so pretty .... + + // change date and serial + newcert->setSerial(serial); + newcert->setNotBefore(dlg->validity->getNotBefore()); + newcert->setNotAfter(dlg->validity->getNotAfter()); + + if (newcert->resetTimes(signer) > 0) { + if (QMessageBox::information(this,tr(XCA_TITLE), + tr("The validity times for the certificate need to get adjusted to not exceed those of the signer"), + tr("Continue creation"), tr("Abort") + )) + throw errorEx(""); + } + + + // and finally sign the request + newcert->sign(signkey); + CERR( "SIGNED"); + insert(newcert); + CERR("inserted"); + delete dlg; + } + catch (errorEx &err) { + Error(err); + if (newcert) + delete newcert; + } +} + +void CertView::showItem(pki_base *basecert, bool import) +{ + pki_x509 *cert = (pki_x509 *)basecert; + if (!cert) return; + if (Error(cert)) return ; + try { + CertDetail_UI *dlg = new CertDetail_UI(this,0,true); + bool ret; + dlg->image->setPixmap(*MainWindow::certImg); + dlg->descr->setText(cert->getIntName()); + dlg->setCaption(tr(XCA_TITLE)); + + // examine the key + pki_key *key= cert->getRefKey(); + if (key) + if (key->isPrivKey()) { + dlg->privKey->setText(key->getIntName()); + dlg->privKey->setDisabled(false); + } + + // examine the signature + if ( cert->getSigner() == NULL) { + dlg->verify->setText(tr("SIGNER UNKNOWN")); + } + else if ( cert->compare(cert->getSigner()) ) { + dlg->verify->setText(tr("SELF SIGNED")); + } + + else { + dlg->verify->setText(cert->getSigner()->getIntName()); + } + + // check trust state + if (cert->getEffTrust() == 0) { + dlg->verify->setDisabled(true); + } + CERR( cert->getEffTrust() ); + + // the serial + dlg->serialNr->setText(cert->getSerial().toHex()); + + // details of subject + x509name subj = cert->getSubject(); + QString land = subj.getEntryByNid(NID_countryName); + QString land1 = subj.getEntryByNid(NID_stateOrProvinceName); + if (land != "" && land1 != "") + land += " / " +land1; + else + land+=land1; + + dlg->dnCN->setText(subj.getEntryByNid(NID_commonName)); + dlg->dnC->setText(land); + dlg->dnL->setText(subj.getEntryByNid(NID_localityName)); + dlg->dnO->setText(subj.getEntryByNid(NID_organizationName)); + dlg->dnOU->setText(subj.getEntryByNid(NID_organizationalUnitName)); + dlg->dnEmail->setText(subj.getEntryByNid(NID_pkcs9_emailAddress)); + + // same for issuer.... + x509name iss = cert->getIssuer(); + land = iss.getEntryByNid(NID_countryName); + land1 = iss.getEntryByNid(NID_stateOrProvinceName); + if (land != "" && land1 != "") + land += " / " +land1; + else + land+=land1; + + dlg->dnCN_2->setText(iss.getEntryByNid(NID_commonName) ); + dlg->dnC_2->setText(land); + dlg->dnL_2->setText(iss.getEntryByNid(NID_localityName)); + dlg->dnO_2->setText(iss.getEntryByNid(NID_organizationName)); + dlg->dnOU_2->setText(iss.getEntryByNid(NID_organizationalUnitName)); + dlg->dnEmail_2->setText(iss.getEntryByNid(NID_pkcs9_emailAddress)); + dlg->notBefore->setText(cert->getNotBefore().toPretty()); + dlg->notAfter->setText(cert->getNotAfter().toPretty()); + MARK + + // validation of the Date + if (cert->checkDate() == -1) { + dlg->dateValid->setText(tr("Not valid")); + dlg->dateValid->setDisabled(true); + } + if (cert->checkDate() == +1) { + dlg->dateValid->setText(tr("Not valid")); + dlg->dateValid->setDisabled(true); + } + if (cert->isRevoked()) { + dlg->dateValid->setText(tr("Revoked: ") + + cert->getRevoked().toPretty()); + dlg->dateValid->setDisabled(true); + + } + // the fingerprints + dlg->fpMD5->setText(cert->fingerprint(EVP_md5())); + dlg->fpSHA1->setText(cert->fingerprint(EVP_sha1())); + + // V3 extensions + dlg->v3Extensions->setText(cert->printV3ext()); + + // rename the buttons in case of import + if (import) { + dlg->but_ok->setText(tr("Import")); + dlg->but_cancel->setText(tr("Discard")); + } + + // show it to the user... + QString odesc = cert->getIntName(); + ret = dlg->exec(); + QString ndesc = dlg->descr->text(); + delete dlg; + if (!ret && import) { + delete cert; + } + if (!ret) return; + + emit init_database(); + + if (import) { + cert = (pki_x509 *)insert(cert); + } + if (ndesc != odesc) { + db->renamePKI(cert, ndesc); + return; + } + } + catch (errorEx &err) { + Error(err); + } + return ; +} + +void CertView::deleteItem() +{ + try { + pki_x509 *cert = (pki_x509 *)getSelected(); + if (!cert) return; + if (cert->getSigner() && cert->getSigner() != cert && cert->getSigner()->canSign()) { + QMessageBox::information(this,tr(XCA_TITLE), + tr("It is actually not a good idea to delete a cert that was signed by you") +":\n'" + + cert->getIntName() + "'\n" , + tr("Ok") ); + } + deleteItem_default(tr("The certificate"), tr("is going to be deleted")); + } + catch (errorEx &err) { + Error(err); + } +} + +void CertView::load() +{ + QStringList filter; + filter.append(tr("Certificates ( *.pem *.der *.crt *.cer )")); + filter.append(tr("All files ( *.* )")); + load_default(filter,tr("Certificate import")); +} + +pki_base *CertView::loadItem(QString fname) +{ + pki_x509 *cert = new pki_x509(fname); + return cert; +} + +void CertView::loadPKCS12() +{ + pki_pkcs12 *pk12; + QStringList filt; + filt.append(tr("PKCS#12 Certificates ( *.p12 *.pfx )")); + filt.append(tr("All files ( *.* )")); + QStringList slist; + QString s=""; + QFileDialog *dlg = new QFileDialog(this,0,true); + dlg->setCaption(tr("Certificate import")); + dlg->setFilters(filt); + dlg->setMode( QFileDialog::ExistingFiles ); + dlg->setDir(MainWindow::getPath()); + if (dlg->exec()) { + slist = dlg->selectedFiles(); + MainWindow::setPath(dlg->dirPath()); + } + delete dlg; + for ( QStringList::Iterator it = slist.begin(); it != slist.end(); ++it ) { + s = *it; + s = QDir::convertSeparators(s); + try { + pk12 = new pki_pkcs12(s, &MainWindow::passRead); + insertP12(pk12); + } + catch (errorEx &err) { + Error(err); + } + delete pk12; + } +} + + +void CertView::insertP12(pki_pkcs12 *pk12) +{ + pki_x509 *acert; + pki_key *akey; + + try { + akey = pk12->getKey(); + acert = pk12->getCert(); +#ifdef INSERT_WO_ASK + insertKey(akey); + insertCert(acert); + for (int i=0; inumCa(); i++) { + acert = pk12->getCa(i); + insertCert(acert); + } +#else + // keyList->show(akey, true); + showItem(acert,true); + for (int i=0; inumCa(); i++) { + acert = pk12->getCa(i); + showItem(acert, true); + } +#endif + //if (keys) + //FIXME:: keys->updateView(); + } + catch (errorEx &err) { + Error(err); + } + MARK +} + + +void CertView::loadPKCS7() +{ + pki_pkcs7 *pk7 = NULL; + pki_x509 *acert; + QStringList filt; + filt.append(tr("PKCS#7 data ( *.p7s *.p7m *.p7b )")); + filt.append(tr("All files ( *.* )")); + QStringList slist; + QString s=""; + QFileDialog *dlg = new QFileDialog(this,0,true); + dlg->setCaption(tr("Certificate import")); + dlg->setFilters(filt); + dlg->setMode( QFileDialog::ExistingFiles ); + dlg->setDir(MainWindow::getPath()); + if (dlg->exec()) { + slist = dlg->selectedFiles(); + MainWindow::setPath(dlg->dirPath()); + } + delete dlg; + for ( QStringList::Iterator it = slist.begin(); it != slist.end(); ++it ) { + s = *it; + s = QDir::convertSeparators(s); + try { + pk7 = new pki_pkcs7(s); + pk7->readP7(s); + for (int i=0; inumCert(); i++) { + acert = pk7->getCert(i); + showItem(acert, true); + } + // keys->updateView(); + } + catch (errorEx &err) { + Error(err); + } + if (pk7) delete pk7; + } +} + + +pki_base *CertView::insert(pki_base *item) +{ + pki_x509 *cert = (pki_x509 *)item; + emit init_database(); + try { + pki_x509 *oldcert = (pki_x509 *)db->getByReference(cert); + if (oldcert) { + QMessageBox::information(this,tr(XCA_TITLE), + tr("The certificate already exists in the database as") +":\n'" + + oldcert->getIntName() + + "'\n" + tr("and so it was not imported"), "OK"); + delete(cert); + return oldcert; + } + CERR( "insertCert: inserting" ); + insert(cert); + } + catch (errorEx &err) { + Error(err); + } + a1int serial; + // check the CA serial of the CA of this cert to avoid serial doubles + if (cert->getSigner() != cert && cert->getSigner()) { + serial = cert->getSerial(); + CERR("OTHER SIGNER" << serial.getLong()); + if (cert->getSigner()->getCaSerial() getSigner()->setCaSerial(serial); + } + } + // check CA serial of this cert + // FIXME: serial = certs->searchSerial(cert); + if ( serial > 0L) { + QMessageBox::information(this,tr(XCA_TITLE), + tr("The certificate CA serial is lower than the highest serial of one signed certificate it will be set to ") + + QString::number(serial.getLong()), "OK"); + cert->setCaSerial(serial); + } + db->updatePKI(cert); + return cert; +} + +#define P7_ONLY 0 +#define P7_CHAIN 1 +#define P7_TRUSTED 2 + +void CertView::store() +{ + QStringList filt; + pki_x509 *crt = (pki_x509 *)getSelected(); + pki_x509 *oldcrt = NULL; + emit init_database(); + if (!crt) return; + pki_key *privkey = crt->getRefKey(); + ExportCert *dlg = new ExportCert((crt->getIntName() + ".crt"), + (privkey && privkey->isPrivKey()), MainWindow::getPath(), crt->tinyCAfname() ); + dlg->image->setPixmap(*MainWindow::certImg); + int dlgret = dlg->exec(); + + if (!dlgret) { + delete dlg; + return; + } + QString fname = dlg->filename->text(); + if (fname == "") { + delete dlg; + return; + } + try { + switch (dlg->exportFormat->currentItem()) { + case 0: // PEM + crt->writeCert(fname,true,false); + break; + case 1: // PEM with chain + while(crt && crt != oldcrt) { + crt->writeCert(fname,true,true); + oldcrt = crt; + crt = crt->getSigner(); + } + break; + case 2: // PEM all trusted Certificates + // FIXME: db->writeAllCerts(fname,true); + break; + case 3: // PEM all Certificates + // FIXME: db->writeAllCerts(fname,false); + break; + case 4: // DER + crt->writeCert(fname,false,false); + break; + case 5: // P7 lonely + writePKCS7(fname, P7_ONLY); + break; + case 6: // P12 + writePKCS7(fname, P7_CHAIN); + break; + case 7: // P12 + writePKCS7(fname, P7_TRUSTED); + break; + case 8: // P12 + writePKCS12(fname,false); + break; + case 9: // P12 + cert chain + writePKCS12(fname,true); + break; + + } + } + catch (errorEx &err) { + Error(err); + } + delete dlg; +} + + +void CertView::writePKCS12(QString s, bool chain) +{ + QStringList filt; + try { + pki_x509 *cert = (pki_x509 *)getSelected(); + if (!cert) return; + pki_key *privkey = cert->getRefKey(); + if (!privkey || privkey->isPubKey()) { + QMessageBox::warning(this,tr(XCA_TITLE), + tr("There was no key found for the Certificate: ") + + cert->getIntName() ); + return; + } + if (s.isEmpty()) return; + s = QDir::convertSeparators(s); + pki_pkcs12 *p12 = new pki_pkcs12(cert->getIntName(), cert, privkey, &MainWindow::passWrite); + pki_x509 *signer = cert->getSigner(); + int cnt =0; + while ((signer != NULL ) && (signer != cert) && chain) { + CERR("SIGNER:"<<(int)signer); + p12->addCaCert(signer); + CERR( "signer: " << ++cnt ); + cert=signer; + signer=signer->getSigner(); + } + CERR("start writing" ); + p12->writePKCS12(s); + delete p12; + } + catch (errorEx &err) { + Error(err); + } +} + +void CertView::writePKCS7(QString s, int type) +{ + pki_pkcs7 *p7 = NULL; + QList list; + pki_x509 *cert = (pki_x509 *)getSelected(); + pki_base *cer; + emit init_database(); + try { + p7 = new pki_pkcs7(""); + if ( type == P7_CHAIN ) { + while (cert != NULL) { + p7->addCert(cert); + if (cert->getSigner() == cert) cert = NULL; + else cert = cert->getSigner(); + } + } + if ( type == P7_ONLY ) { + p7->addCert(cert); + } + if (type == P7_TRUSTED) { + list = db->getContainer(); + if (!list.isEmpty()) { + for ( cer = list.first(); cer != NULL; cer = list.next() ) { + p7->addCert((pki_x509 *)cer); + } + } + } + p7->writeP7(s, false); + } + catch (errorEx &err) { + Error(err); + } + if (p7 != NULL ) delete p7; + +} + +void CertView::signP7() +{ + QStringList filt; + try { + pki_x509 *cert = (pki_x509 *)getSelected(); + if (!cert) return; + pki_key *privkey = cert->getRefKey(); + if (!privkey || privkey->isPubKey()) { + QMessageBox::warning(this,tr(XCA_TITLE), + tr("There was no key found for the Certificate: ") + + cert->getIntName()); + return; + } + filt.append("All Files ( *.* )"); + QString s=""; + QStringList slist; + QFileDialog *dlg = new QFileDialog(this,0,true); + dlg->setCaption(tr("Import Certificate signing request")); + dlg->setFilters(filt); + dlg->setMode( QFileDialog::ExistingFiles ); + dlg->setDir(MainWindow::getPath()); + if (dlg->exec()) { + slist = dlg->selectedFiles(); + MainWindow::setPath(dlg->dirPath()); + } + delete dlg; + pki_pkcs7 * p7 = new pki_pkcs7(""); + for ( QStringList::Iterator it = slist.begin(); it != slist.end(); ++it ) { + s = *it; + s = QDir::convertSeparators(s); + p7->signFile(cert, s); + p7->writeP7((s + ".p7s"), true); + } + delete p7; + } + catch (errorEx &err) { + Error(err); + } +} + +void CertView::encryptP7() +{ + QStringList filt; + try { + pki_x509 *cert = (pki_x509 *)getSelected(); + if (!cert) return; + pki_key *privkey = cert->getRefKey(); + if (!privkey || privkey->isPubKey()) { + QMessageBox::warning(this,tr(XCA_TITLE), + tr("There was no key found for the Certificate: ") + + cert->getIntName()) ; + return; + } + filt.append("All Files ( *.* )"); + QString s=""; + QStringList slist; + QFileDialog *dlg = new QFileDialog(this,0,true); + dlg->setCaption(tr("Import Certificate signing request")); + dlg->setFilters(filt); + dlg->setMode( QFileDialog::ExistingFiles ); + dlg->setDir(MainWindow::getPath()); + if (dlg->exec()) { + slist = dlg->selectedFiles(); + MainWindow::setPath(dlg->dirPath()); + } + delete dlg; + pki_pkcs7 * p7 = new pki_pkcs7(""); + for ( QStringList::Iterator it = slist.begin(); it != slist.end(); ++it ) { + s = *it; + s = QDir::convertSeparators(s); + p7->encryptFile(cert, s); + p7->writeP7((s + ".p7m"), true); + } + delete p7; + } + catch (errorEx &err) { + Error(err); + } +} + +void CertView::popupMenu(QListViewItem *item, const QPoint &pt, int x) { + CERR( "popup Cert"); + QPopupMenu *menu = new QPopupMenu(this); + QPopupMenu *subCa = new QPopupMenu(this); + QPopupMenu *subP7 = new QPopupMenu(this); + QPopupMenu *subExport = new QPopupMenu(this); + int itemExtend, itemRevoke, itemTrust, itemCA, itemTemplate, itemReq, itemP7, itemtca; + bool canSign, parentCanSign, hasTemplates, hasPrivkey; + + emit init_database(); + if (!item) { + menu->insertItem(tr("New Certificate"), this, SLOT(newCert())); + menu->insertItem(tr("Import"), this, SLOT(loadCert())); + menu->insertItem(tr("Import PKCS#12"), this, SLOT(loadPKCS12())); + menu->insertItem(tr("Import from PKCS#7"), this, SLOT(loadPKCS7())); + } + else { + pki_x509 *cert = (pki_x509 *)db->getByName(item->text(0)); + menu->insertItem(tr("Rename"), this, SLOT(startRenameCert())); + menu->insertItem(tr("Show Details"), this, SLOT(showDetailsCert())); + menu->insertItem(tr("Export"), subExport); + subExport->insertItem(tr("File"), this, SLOT(writeCert())); + itemReq = subExport->insertItem(tr("Request"), this, SLOT(toRequest())); + itemtca = subExport->insertItem(tr("TinyCA"), this, SLOT(toTinyCA())); + + menu->insertItem(tr("Delete"), this, SLOT(deleteCert())); + itemTrust = menu->insertItem(tr("Trust"), this, SLOT(setTrust())); + menu->insertSeparator(); + itemCA = menu->insertItem(tr("CA"), subCa); + subCa->insertItem(tr("Serial"), this, SLOT(setSerial())); + subCa->insertItem(tr("CRL days"), this, SLOT(setCrlDays())); + itemTemplate = subCa->insertItem(tr("Signing Template"), this, SLOT(setTemplate())); + subCa->insertItem(tr("Generate CRL"), this, SLOT(genCrl())); + + itemP7 = menu->insertItem(tr("PKCS#7"), subP7); + subP7->insertItem(tr("Sign"), this, SLOT(signP7())); + subP7->insertItem(tr("Encrypt"), this, SLOT(encryptP7())); + menu->insertSeparator(); + itemExtend = menu->insertItem(tr("Renewal"), this, SLOT(extendCert())); + if (cert) { + if (cert->isRevoked()) { + itemRevoke = menu->insertItem(tr("Unrevoke"), this, SLOT(unRevoke())); + menu->setItemEnabled(itemTrust, false); + } + else + itemRevoke = menu->insertItem(tr("Revoke"), this, SLOT(revoke())); + parentCanSign = (cert->getSigner() && cert->getSigner()->canSign() && (cert->getSigner() != cert)); + canSign = cert->canSign(); + hasTemplates = MainWindow::temps->getDesc().count() > 0 ; + hasPrivkey = cert->getRefKey(); + } + menu->setItemEnabled(itemExtend, parentCanSign); + menu->setItemEnabled(itemRevoke, parentCanSign); + menu->setItemEnabled(itemCA, canSign); + subExport->setItemEnabled(itemReq, hasPrivkey); + subExport->setItemEnabled(itemtca, canSign); + menu->setItemEnabled(itemP7, hasPrivkey); + subCa->setItemEnabled(itemTemplate, hasTemplates); + + } + menu->exec(pt); + delete menu; + delete subCa; + delete subP7; + delete subExport; + + return; +} + +void CertView::setTrust() +{ + pki_x509 *cert = (pki_x509 *)getSelected(); + if (!cert) return; + TrustState_UI *dlg = new TrustState_UI(this,0,true); + int state, newstate; + state = cert->getTrust(); + if (cert->getSigner() == cert) { + if (state == 1) state = 0; + dlg->trust1->setDisabled(true); + } + if (state == 0 ) dlg->trust0->setChecked(true); + if (state == 1 ) dlg->trust1->setChecked(true); + if (state == 2 ) dlg->trust2->setChecked(true); + dlg->certName->setText(cert->getIntName()); + if (dlg->exec()) { + if (dlg->trust0->isChecked()) newstate = 0; + if (dlg->trust1->isChecked()) newstate = 1; + if (dlg->trust2->isChecked()) newstate = 2; + if (newstate!=state) { + cert->setTrust(newstate); + db->updatePKI(cert); + updateView(); + } + } + delete dlg; +} + +void CertView::toRequest() +{ + pki_x509 *cert = (pki_x509 *)getSelected(); + if (!cert) return; + try { + pki_x509req *req = new pki_x509req(); + req->createReq(cert->getRefKey(), cert->getSubject()); + // FIXME: insert(req); + } + catch (errorEx &err) { + Error(err); + } + +} + +void CertView::revoke() +{ + pki_x509 *cert = (pki_x509 *)getSelected(); + if (!cert) return; + cert->setRevoked(true); + CERR("setRevoked..." ); + db->updatePKI(cert); + CERR("updatePKI done"); + updateView(); + CERR("view updated"); +} + +void CertView::unRevoke() +{ + pki_x509 *cert = (pki_x509 *)getSelected(); + if (!cert) return; + cert->setRevoked(false); + db->updatePKI(cert); + updateView(); +} + +void CertView::setSerial() +{ + pki_x509 *cert = (pki_x509 *)getSelected(); + if (!cert) return; + a1int serial = cert->getCaSerial(); + bool ok; + a1int nserial = QInputDialog::getInteger (tr(XCA_TITLE), + tr("Please enter the new Serial for signing"), + serial.getLong(), serial.getLong(), 2147483647, 1, &ok, this ); + if (ok && nserial > serial) { + cert->setCaSerial(nserial); + db->updatePKI(cert); + } +} + +void CertView::setCrlDays() +{ + pki_x509 *cert = (pki_x509 *)getSelected(); + if (!cert) return; + int crlDays = cert->getCrlDays(); + bool ok; + int nCrlDays = QInputDialog::getInteger (tr(XCA_TITLE), + tr("Please enter the CRL renewal periode in days"), + crlDays, 1, 2147483647, 1, &ok, this ); + if (ok && (crlDays != nCrlDays)) { + cert->setCrlDays(nCrlDays); + db->updatePKI(cert); + } +} + +void CertView::setTemplate() +{ + pki_x509 *cert = (pki_x509 *)getSelected(); + if (!cert) return; + QString templ = cert->getTemplate(); + QStringList tempList = MainWindow::temps->getDesc(); + unsigned int i, sel=0; + bool ok; + for (i=0; isetTemplate(nTempl); + db->updatePKI(cert); + } +} + + +void CertView::changeView() +{ + if (viewState == 0) { // Plain view + viewState = 1; + // FIXME: bnViewState->setText(tr("Plain View")); + } + else { // Tree View + viewState = 0; + // FIXME: bnViewState->setText(tr("Tree View")); + } + updateView(); +} + +#define fopenerror(file) \ + QMessageBox::warning(this,tr(XCA_TITLE), \ + tr("The file '") + file + tr("' could not be opened")); + +void CertView::toTinyCA() +{ +#ifndef WIN32 + pki_x509 *crt = (pki_x509 *)getSelected(); + if (!crt) return; + pki_key *key = crt->getRefKey(); + if (!key) return; + FILE *fp, *fpr; + char buf[200]; + QList list; + pki_x509 *issuedcert; + QString dname = crt->getIntName(); + QString tcatempdir = MainWindow::settings->getString("TinyCAtempdir"); + QString tcadir = MainWindow::settings->getString("TinyCAdir"); + if (tcatempdir.isEmpty()) { + tcatempdir = "templates"; + } + if (tcadir.isEmpty()) { + tcadir = QDir::homeDirPath(); + tcadir += QDir::separator(); + tcadir += ".TinyCA"; + } + ExportTinyCA *dlg = new ExportTinyCA( tcatempdir, tcadir, this, NULL); + if (!dlg->exec()) return; + + tcatempdir = dlg->tempdir->text(); + tcadir = dlg->tinycadir->text(); + dname = dlg->dname->text(); + + MainWindow::settings->putString("TinyCAtempdir", tcatempdir); + MainWindow::settings->putString("TinyCAdir", tcadir); + + if (dname.isEmpty()) return; + const EVP_CIPHER *enc = EVP_des_ede3_cbc(); + + + // OK, we have all names now... + tcadir += QDir::separator(); + tcadir += dname; + + //create directory tree + if (! mkDir(tcadir)) return; + chdir(tcadir); + if (! mkDir("certs")) return; + if (! mkDir("crl")) return; + if (! mkDir("keys")) return; + if (! mkDir("newcerts")) return; + if (! mkDir("req")) return; + + // write the CA cert and key + crt->writeCert("cacert.pem", true, false); + key->writeKey("cacert.key", enc, &MainWindow::passWrite, true); + // write the crl + chdir("crl"); + pki_crl *crl; // FIXME: = genCrl(crt); + crl->writeCrl("crl.pem"); + delete crl; + chdir(".."); + // write the serial + fp = fopen("serial", "w"); + if (!fp) { + fopenerror("serial"); + return; + } + fprintf(fp, "%08lx", crt->getCaSerial().getLong()); + fclose(fp); + + // copy openssl.cnf + tcatempdir += QDir::separator(); + tcatempdir += "openssl.cnf"; + fpr = fopen(tcatempdir, "r"); + if (!fpr) { + fopenerror("openssl.cnf" ); + return; + } + fp = fopen("openssl.cnf", "w"); + if (!fp) { + fopenerror("openssl.cnf" ); + fclose(fpr); + return; + } + while (fgets(buf ,200, fpr) != NULL) { + char *x = strstr(buf,"%dir%"); + if (x != 0) { + x[0]='\0'; + fputs(buf, fp); + fputs(tcadir, fp); + fputs(x+5, fp); + } + else { + fputs(buf, fp); + } + } + fclose(fp); + fclose(fpr); + + // store the issued certificates + fp = fopen("index.txt", "w"); + if (!fp) return; + list = ((db_x509 *)db)->getIssuedCerts(crt); + if (!list.isEmpty()) { + for ( issuedcert = list.first(); issuedcert != NULL; issuedcert = list.next() ) { + QString fname = issuedcert->tinyCAfname(); + chdir("certs"); + crt->writeCert(fname, true, false); + chdir(".."); + key = issuedcert->getRefKey(); + if (key) { + chdir("keys"); + key->writeKey(fname, NULL, &MainWindow::passWrite, true); + chdir(".."); + } + fprintf(fp, "%c\t%s\t%s\t%s\tunknown\t%s\n", + issuedcert->isRevoked() ? 'R':'V', + issuedcert->getNotAfter().toPlain().latin1(), + issuedcert->getRevoked().toPlain().latin1(), + issuedcert->getSerial().toHex().latin1(), + issuedcert->getSubject().oneLine().latin1() ); + + } + } + fclose(fp); + +#endif +} + +bool CertView::updateView() +{ + clear(); + setRootIsDecorated(true); + pki_x509 *pki; + pki_base *pkib; + pki_x509 *signer; + QListViewItem *parentitem; + QListViewItem *current; + CERR("myUPDATE"); + QList container = db->getContainer(); + if ( container.isEmpty() ) return false; + QList mycont = container; + for ( pkib = container.first(); pkib != NULL; pkib = container.next() ) pkib->delLvi(); + int f=0; + while (! mycont.isEmpty() ) { + CERR("-----------------------------------------------------------------Round "<< f++); + QListIterator it(mycont); + for ( ; it.current(); ++it ) { + pki = (pki_x509 *)it.current(); + parentitem = NULL; + signer = pki->getSigner(); + if ((signer != pki) && (signer != NULL) && (viewState != 0)) // foreign signed + parentitem = signer->getLvi(); + if (((parentitem != NULL) || (signer == pki) || (signer == NULL) || viewState == 0) && (pki->getLvi() == NULL )) { + // create the listview item + if (parentitem != NULL) { + current = new QListViewItem(parentitem, pki->getIntName()); + CERR("Adding as client: "<getIntName()); + } + else { + current = new QListViewItem(this, pki->getIntName()); + CERR("Adding as parent: "<getIntName()); + } + pki->setLvi(current); + mycont.remove(pki); + pki->updateView(); + it.toFirst(); + } + } + + } + return true; +} + +bool CertView::mkDir(QString dir) +{ +#ifdef WIN32 + int ret = mkdir(dir.latin1()); + // in direct.h declare _CRTIMP int __cdecl mkdir(const char *); +#else + int ret = mkdir(dir.latin1(), S_IRUSR | S_IWUSR | S_IXUSR); +#endif + if (ret) { + QString desc = " ("; + desc += strerror(ret); + desc += ")"; + QMessageBox::critical(this,tr(XCA_TITLE), + tr("Error creating: ") + dir + desc); + return false; + } + return true; + +} + +void CertView::updateViewAll() +{ + emit init_database(); + QList c = db->getContainer(); + for (pki_x509 *pki = (pki_x509 *)c.first(); pki != 0; pki = (pki_x509 *)c.next() ) + pki->updateView(); + return; +} + diff --git a/view/CertView.h b/view/CertView.h new file mode 100644 index 00000000..99a54cb7 --- /dev/null +++ b/view/CertView.h @@ -0,0 +1,104 @@ +/* + * 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$ + * + */ + + +#ifndef CERTVIEW_H +#define CERTVIEW_H + +#include "XcaListView.h" +#include "lib/pki_x509.h" +#include "lib/pki_pkcs12.h" +#include +#include "widgets/NewX509.h" + +class CertView : public XcaListView +{ + Q_OBJECT + + private: + int viewState; + bool mkDir(QString dir); + public: + CertView(QWidget * parent = 0, const char * name = 0, WFlags f = 0); + void showItem(pki_base *item, bool import); + void newItem(); + void deleteItem(); + void updateViewItem(pki_base *); + void load(); + pki_base* loadItem(QString fname); + pki_base* insert(pki_base *item); + void store(); + void popupMenu(QListViewItem *item, const QPoint &pt, int x); + void newCert(); + void newCert(NewX509 *dlg); + void extendCert(); + void loadPKCS12(); + void insertP12(pki_pkcs12 *pk12); + void loadPKCS7(); + void writePKCS12(QString s, bool chain); + void writePKCS7(QString s, int type); + public slots: + void signP7(); + void encryptP7(); + void setTrust(); + void toRequest(); + void revoke(); + void unRevoke(); + void setSerial(); + void setCrlDays(); + void setTemplate(); + void changeView(); + void toTinyCA(); + bool updateView(); + void updateViewAll(); + +}; + +#endif diff --git a/view/CrlView.cpp b/view/CrlView.cpp new file mode 100644 index 00000000..34af6b6c --- /dev/null +++ b/view/CrlView.cpp @@ -0,0 +1,236 @@ +/* + * 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$ + * + */ + + +#include "CrlView.h" +#include +#include "lib/pki_crl.h" +#include "widgets/MainWindow.h" + + +void CrlView::showItem(pki_base *item, bool import) +{ + pki_crl *crl = (pki_crl *)item; + if (!crl) return; + try { + CrlDetail_UI *dlg = new CrlDetail(this,0,true); + connect( dlg->certList, SIGNAL( doubleClicked(QListViewItem*) ), + this, SLOT( showDetailsCert(QListViewItem *) )); + QString odesc = crl->getIntName(); + ret = dlg->exec(); + QString ndesc = dlg->descr->text(); + delete dlg; + if (!ret && import) { + delete crl; + } + if (!ret) return; + if (MainWindow::crls == NULL) { + emit init_database(); + } + if (import) { + crl = insert(crl); + } + + if (ndesc != odesc) { + crls->renamePKI(crl, ndesc); + } + + + } + catch (errorEx &err) { + Error(err); + } + return; +} + +void CrlView::deleteItem() +{ + deleteItem_default(tr("The Revokation list"), + tr("is going to be deleted")); +} + +pki_base *CrlView::loadItem(QString fname) +{ + pki_base *crl = new pki_crl(fname, &MainWindow::passRead); + return crl; +} + +void CrlView::loadCrl() +{ + QStringList filter; + filt.append(tr("Revokation lists ( *.pem *.crl )")); + filt.append(tr("All files ( *.* )")); + load_default(filter, tr("Load CRL")); +} + +pki_crl *CrlView::insert(pki_base *item) +{ + pki_crl * crl = (pki_crl *)item; + try { + MARK + pki_crl *oldcrl = (pki_crl *)crls->findPKI(crl); + MARK + if (oldcrl) { + QMessageBox::information(this,tr(XCA_TITLE), + tr("The revokation list already exists in the database as") +":\n'" + + QString::fromLatin1(oldcrl->getDescription().c_str()) + + "'\n" + tr("and so it was not imported"), "OK"); + delete(crl); + return oldcrl; + } + CERR( "insertCrl: inserting" ); + crls->insertPKI(crl); + } + catch (errorEx &err) { + Error(err); + } + return crl; +} + +void CrlView::writeCrl_pem() +{ + store(true); +} +void CrlView::writeCrl_der() +{ + store(false); +} + +void CrlView::store(bool pem) + { + pki_crl *crl; + try { + crl = (pki_crl *)crls->getSelectedPKI(); + } + catch (errorEx &err) { + Error(err); + return; + } + + if (!crl) return; + QStringList filt; + filt.append("Revokation Lists ( *.crl *.pem)"); + filt.append("All Files ( *.* )"); + QString s=""; + QFileDialog *dlg = new QFileDialog(this,0,true); + dlg->setCaption(tr("Export Certificate revokation list")); + dlg->setFilters(filt); + dlg->setMode( QFileDialog::AnyFile ); + dlg->setSelection( (crl->getDescription() + ".crl").c_str() ); + setPath(dlg); + if (dlg->exec()) { + s = dlg->selectedFile(); + newPath(dlg); + } + delete dlg; + if (s.isEmpty()) return; + s=QDir::convertSeparators(s); + try { + crl->writeCrl(s.latin1(), pem); + } + catch (errorEx &err) { + Error(err); + } + +} + + +void CrlView::popupMenu(QListViewItem *item, const QPoint &pt, int x) { + CERR( "popup Crl"); + QPopupMenu *menu = new QPopupMenu(this); + QPopupMenu *subExport = new QPopupMenu(this); + + if (!item) { + menu->insertItem(tr("Import"), this, SLOT(loadCrl())); + } + else { + menu->insertItem(tr("Rename"), this, SLOT(startRenameCrl())); + menu->insertItem(tr("Show Details"), this, SLOT(showDetailsCrl())); + menu->insertItem(tr("Export"), subExport); + subExport->insertItem(tr("PEM"), this, SLOT(writeCrl_pem())); + subExport->insertItem(tr("DER"), this, SLOT(writeCrl_der())); + menu->insertItem(tr("Delete"), this, SLOT(deleteCrl())); + } + menu->exec(pt); + delete menu; + delete subExport; + + return; +} + +pki_crl *CrlView::newItem(pki_x509 *cert) +{ + QList list; + pki_x509 *issuedcert = NULL; + pki_crl *crl = NULL; + try { + crl = new pki_crl(cert->getIntName(), cert); + + list = MainWindow::certs->getIssuedCerts(cert); + if (!list.isEmpty()) { + for ( issuedcert = list.first(); issuedcert != NULL; issuedcert = list.next() ) { + if (issuedcert->isRevoked() ) { + crl->addRevoked(issuedcert); + } + } + } + crl->addV3ext(NID_authority_key_identifier,"keyid,issuer"); + crl->addV3ext(NID_issuer_alt_name,"issuer:copy"); + crl->sign(cert->getKey()); + cert->setLastCrl(crl->getDate()); + certs->updatePKI(cert); + CERR( "CRL done, completely"); + } + catch (errorEx &err) { + Error(err); + } + return crl; +} + diff --git a/view/CrlView.h b/view/CrlView.h new file mode 100644 index 00000000..1899a6ae --- /dev/null +++ b/view/CrlView.h @@ -0,0 +1,79 @@ +/* + * 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$ + * + */ + + +#ifndef CRLVIEW_H +#define CRLVIEW_H + +#include "XcaListView.h" +#include + +class CrlView : public XcaListView +{ + Q_OBJECT + + private: + static const int sizeList[]; + static void incProgress(int a, int b, void *progress); + public: + CrlView(QWidget * parent = 0, const char * name = 0, WFlags f = 0); + void showItem(pki_base *item, bool import); + void newItem(); + void deleteItem(); + void load(); + pki_base *loadItem(QString fname); + pki_base* insert(pki_base *item); + void store(bool); + void popupMenu(QListViewItem *item, const QPoint &pt, int x); + void writeCrl_pem(); + void writeCrl_der(); +}; + +#endif diff --git a/view/KeyView.cpp b/view/KeyView.cpp new file mode 100644 index 00000000..09199930 --- /dev/null +++ b/view/KeyView.cpp @@ -0,0 +1,283 @@ +/* + * 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$ + * + */ + +#include "KeyView.h" +#include "ui/NewKey.h" +#include "ui/KeyDetail.h" +#include "widgets/ExportKey.h" +#include "widgets/MainWindow.h" +#include +#include +#include +#include +#include +#include + +const int KeyView::sizeList[] = {256, 512, 1024, 2048, 4096, 0 }; + +KeyView::KeyView(QWidget * parent = 0, const char * name = 0, WFlags f = 0) + :XcaListView(parent, name, f) +{ + addColumn(tr("Keysize")); + addColumn(tr("Use count")); +} + +void KeyView::newItem() +{ + NewKey_UI *dlg = new NewKey_UI(this,0,true,0); + QString x; + for (int i=0; sizeList[i] != 0; i++ ) + dlg->keyLength->insertItem( x.number(sizeList[i]) +" bit"); + dlg->keyLength->setCurrentItem(2); + dlg->image->setPixmap(*MainWindow::keyImg); + if (dlg->exec()) { + try { + int sel = dlg->keyLength->currentItem(); + QProgressDialog *progress = new QProgressDialog( + tr("Please wait, Key generation is in progress"), + tr("Cancel"),90, 0, 0, true); + progress->setMinimumDuration(0); + progress->setProgress(0); + progress->setCaption(tr(XCA_TITLE)); + pki_key *nkey = new pki_key (dlg->keyDesc->text(), + &incProgress, + progress, + sizeList[sel]); + progress->cancel(); + delete progress; + insert(nkey); + x = nkey->getIntName(); + emit keyDone(x); + } + catch (errorEx &err) { + Error(err); + } + } + delete dlg; +} + +void KeyView::deleteItem() +{ + deleteItem_default(tr("The key"), tr("is going to be deleted")); +} + +void KeyView::showItem(pki_base *item, bool import) +{ + pki_key *key = (pki_key *)item; + if (!key) return; + KeyDetail_UI *detDlg = new KeyDetail_UI(this, 0, true, 0 ); + try { + detDlg->setCaption(tr(XCA_TITLE)); + detDlg->keyDesc->setText( key->getIntName() ); + detDlg->keyLength->setText( key->length() ); + detDlg->keyPubEx->setText( key->pubEx() ); + detDlg->keyModulus->setText( key->modulus()); + if (key->isPubKey()) { + detDlg->keyPrivEx->setText(tr("not available") ); + detDlg->keyPrivEx->setDisabled(true); + } + detDlg->image->setPixmap(*MainWindow::keyImg); + if (import) { + detDlg->but_ok->setText(tr("Import")); + detDlg->but_cancel->setText(tr("Discard")); + } + } + catch (errorEx &err) { + Error(err); + delete detDlg; + return; + } + QString odesc = key->getIntName(); + bool ret = detDlg->exec(); + QString ndesc = detDlg->keyDesc->text(); + delete detDlg; + if (!ret && import) { + delete key; + } + if (!ret) return; + + emit init_database(); + + if (import) { + key = (pki_key *)insert(key); + } + CERR(ndesc << " " << key->getIntName()); + if ( ndesc != odesc) { + MARK + try { + db->renamePKI(key, ndesc); + MARK + } + catch (errorEx &err) { + Error(err); + } + return; + } +} + +void KeyView::load() +{ + QStringList filter; + filter.append( "PKI Keys ( *.pem *.der *.key )"); + filter.append( "PKCS#8 Keys ( *.p8 *.pk8 )"); + load_default(filter, tr("Import key")); +} + +pki_base *KeyView::loadItem(QString fname) +{ + pki_base *lkey = new pki_key(fname, &MainWindow::passRead); + return lkey; +} + +pki_base* KeyView::insert(pki_base *item) +{ + pki_key *lkey = (pki_key *)item; + pki_key *oldkey; + emit init_database(); + try { + oldkey = (pki_key *)db->getByReference(lkey); + if (oldkey != NULL) { + if ((oldkey->isPrivKey() && lkey->isPrivKey()) || + lkey->isPubKey()){ + QMessageBox::information(this,tr(XCA_TITLE), + tr("The key is already in the database as") +":\n'" + + oldkey->getIntName() + + "'\n" + tr("and is not going to be imported"), "OK"); + delete(lkey); + return oldkey; + } + else { + QMessageBox::information(this,tr(XCA_TITLE), + tr("The database already contains the public part of the imported key as") +":\n'" + + oldkey->getIntName() + + "'\n" + tr("and will be completed by the new, private part of the key"), "OK"); + CERR( "before deleting pki..."); + db->deletePKI(oldkey); + lkey->setIntName(oldkey->getIntName()); + delete(oldkey); + } + } + CERR( "after findkey"); + db->insertPKI(lkey); + } + catch (errorEx &err) { + Error(err); + } + return lkey; +} + + +void KeyView::store() +{ + bool PEM = false; + const EVP_CIPHER *enc = NULL; + pki_key *targetKey = NULL; + targetKey = (pki_key *)getSelected(); + if (!targetKey) return; + ExportKey *dlg = new ExportKey((targetKey->getIntName() + ".pem"), + targetKey->isPubKey(), MainWindow::getPath(), this); + dlg->image->setPixmap(*MainWindow::keyImg); + int dlgret = dlg->exec(); + MainWindow::setPath(dlg->dirPath); + + if (!dlgret) { + delete dlg; + return; + } + QString fname = dlg->filename->text(); + if (fname.isEmpty()) { + delete dlg; + return; + } + try { + if (dlg->exportFormat->currentText() == "PEM") PEM = true; + if (dlg->exportFormat->currentText() == "PKCS#8") + targetKey->writePKCS8(fname, &MainWindow::passWrite); + else if (dlg->exportPrivate->isChecked()) { + if (dlg->encryptKey->isChecked()) + enc = EVP_des_ede3_cbc(); + targetKey->writeKey(fname, enc, &MainWindow::passWrite, PEM); + } + else { + targetKey->writePublic(fname, PEM); + } + } + catch (errorEx &err) { + Error(err); + } + delete dlg; + +} + + +void KeyView::popupMenu(QListViewItem *item, const QPoint &pt, int x) { + CERR( " popup key" ); + QPopupMenu *menu = new QPopupMenu(this); + if (!item) { + menu->insertItem(tr("New Key"), this, SLOT(newItem())); + menu->insertItem(tr("Import"), this, SLOT(load())); + } + else { + menu->insertItem(tr("Rename"), this, SLOT(startRename())); + menu->insertItem(tr("Show Details"), this, SLOT(show())); + menu->insertItem(tr("Export"), this, SLOT(store())); + menu->insertItem(tr("Delete"), this, SLOT(deleteItem())); + } + menu->exec(pt); + delete menu; + return; +} + +void KeyView::incProgress(int a, int b, void *progress) +{ + int i = ((QProgressDialog *)progress)->progress(); + ((QProgressDialog *)progress)->setProgress(++i); +} + diff --git a/view/KeyView.h b/view/KeyView.h new file mode 100644 index 00000000..98c4bb9a --- /dev/null +++ b/view/KeyView.h @@ -0,0 +1,82 @@ +/* + * 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$ + * + */ + + +#ifndef KEYVIEW_H +#define KEYVIEW_H + +#include "XcaListView.h" +#include "lib/pki_key.h" +#include + +class KeyView : public XcaListView +{ + Q_OBJECT + + private: + static const int sizeList[]; + static void incProgress(int a, int b, void *progress); + public: + KeyView(QWidget * parent = 0, const char * name = 0, WFlags f = 0); + void showItem(pki_base *item, bool import); + void newItem(); + void deleteItem(); + void load(); + pki_base *loadItem(QString fname); + pki_base* insert(pki_base *item); + void store(); + void popupMenu(QListViewItem *item, const QPoint &pt, int x); + signals: + void keyDone(QString &); + void init_database(); + +}; + +#endif diff --git a/view/MainWindowCrl.cpp b/view/MainWindowCrl.cpp new file mode 100644 index 00000000..3a034157 --- /dev/null +++ b/view/MainWindowCrl.cpp @@ -0,0 +1,356 @@ +/* + * 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$ + * + */ + + +#include "MainWindow.h" + + +void MainWindow::showDetailsCrl() +{ + pki_crl *crl = (pki_crl *)crls->getSelectedPKI(); + showDetailsCrl(crl); +} + +void MainWindow::showDetailsCrl(QListViewItem *item) +{ + string crl = item->text(0).latin1(); + showDetailsCrl((pki_crl *)crls->getSelectedPKI(crl)); +} + + +bool MainWindow::showDetailsCrl(pki_crl *crl, bool import) +{ + if (!crl) return false; + if (opensslError(crl)) return false; + char buf[20]; + bool ret; + int numc, i; + pki_x509 *iss, *rev; + QListViewItem *current; + try { + CrlDetail_UI *dlg = new CrlDetail_UI(this,0,true); + dlg->image->setPixmap(*revImg); + dlg->descr->setText(crl->getDescription().c_str()); + dlg->setCaption(tr(XCA_TITLE)); + iss = certs->getBySubject(crl->getIssuerX509_NAME()); + numc = crl->numRev(); + dlg->certList->clear(); + dlg->certList->addColumn(tr("Name")); + dlg->certList->addColumn(tr("Serial")); + dlg->certList->addColumn(tr("Revokation")); + CERR("NUMBER:" << numc); + for (i=0; igetSerial(i)); + rev = certs->getByIssSerial(iss, crl->getSerial(i)); + if (rev != NULL) { + CERR(rev->getDescription()); + current = new QListViewItem(dlg->certList, + rev->getDescription().c_str()); + } + else { + current = new QListViewItem(dlg->certList, "Unknown certificate" ); + } + current->setText(1, QString::number(crl->getSerial(i)) ); + current->setText(2, pki_x509::asn1TimeToSortable(crl->getRevDate(i)).c_str()); + } + dlg->v3Extensions->setText(crl->printV3ext().c_str()); + dlg->issuer->setText(iss->getDescription().c_str()); + if (crl->verify(iss->getKey()) == 0) { + dlg->signCheck->setText(tr("Success")); + } + sprintf(buf, "%d", ASN1_INTEGER_get(crl->crl->crl->version)+1); + /* yeah, this is really oo programming :-( */ + dlg->lUpdate->setText(pki_x509::asn1TimeToSortable(crl->crl->crl->lastUpdate).c_str()); + dlg->nUpdate->setText(pki_x509::asn1TimeToSortable(crl->crl->crl->nextUpdate).c_str()); + dlg->version->setText(buf); + connect( dlg->certList, SIGNAL( doubleClicked(QListViewItem*) ), + this, SLOT( showDetailsCert(QListViewItem *) )); + string odesc = crl->getDescription(); + ret = dlg->exec(); + string ndesc = dlg->descr->text().latin1(); + delete dlg; + if (!ret && import) { + delete crl; + } + if (!ret) return false; + if (crls == NULL) { + init_database(); + } + if (import) { + crl = insertCrl(crl); + } + + if (ndesc != odesc) { + crls->renamePKI(crl, ndesc); + } + + + } + catch (errorEx &err) { + Error(err); + } + return false; +} + +void MainWindow::deleteCrl() +{ + try { + pki_crl *crl = (pki_crl *)crls->getSelectedPKI(); + if (!crl) return; + if (QMessageBox::information(this,tr(XCA_TITLE), + tr("Really want to delete the Revokation list") +":\n'" + + QString::fromLatin1(crl->getDescription().c_str()) + "'\n" , + tr("Delete"), tr("Cancel") ) + ) return; + crls->deletePKI(crl); + } + catch (errorEx &err) { + Error(err); + } +} + +void MainWindow::loadCrl() +{ + QStringList filt; + filt.append(tr("Revokation lists ( *.pem *.crl )")); + filt.append(tr("All files ( *.* )")); + QStringList slist; + QString s=""; + QFileDialog *dlg = new QFileDialog(this,0,true); + dlg->setCaption(tr("Certificate import")); + dlg->setFilters(filt); + dlg->setMode( QFileDialog::ExistingFiles ); + setPath(dlg); + MARK + if (dlg->exec()) { + slist = dlg->selectedFiles(); + newPath(dlg); + } + delete dlg; + MARK + for ( QStringList::Iterator it = slist.begin(); it != slist.end(); ++it ) { + s = *it; + s = QDir::convertSeparators(s); + MARK + try { + pki_crl *crl = new pki_crl(s.latin1()); + MARK + insertCrl(crl); + MARK + } + catch (errorEx &err) { + Error(err); + } + } + + +} + + +pki_crl *MainWindow::insertCrl(pki_crl *crl) +{ + try { + MARK + pki_crl *oldcrl = (pki_crl *)crls->findPKI(crl); + MARK + if (oldcrl) { + QMessageBox::information(this,tr(XCA_TITLE), + tr("The revokation list already exists in the database as") +":\n'" + + QString::fromLatin1(oldcrl->getDescription().c_str()) + + "'\n" + tr("and so it was not imported"), "OK"); + delete(crl); + return oldcrl; + } + CERR( "insertCrl: inserting" ); + crls->insertPKI(crl); + } + catch (errorEx &err) { + Error(err); + } + return crl; +} + +void MainWindow::writeCrl_pem() +{ + writeCrl(true); +} +void MainWindow::writeCrl_der() +{ + writeCrl(false); +} + +void MainWindow::writeCrl(bool pem) + { + pki_crl *crl; + try { + crl = (pki_crl *)crls->getSelectedPKI(); + } + catch (errorEx &err) { + Error(err); + return; + } + + if (!crl) return; + QStringList filt; + filt.append("Revokation Lists ( *.crl *.pem)"); + filt.append("All Files ( *.* )"); + QString s=""; + QFileDialog *dlg = new QFileDialog(this,0,true); + dlg->setCaption(tr("Export Certificate revokation list")); + dlg->setFilters(filt); + dlg->setMode( QFileDialog::AnyFile ); + dlg->setSelection( (crl->getDescription() + ".crl").c_str() ); + setPath(dlg); + if (dlg->exec()) { + s = dlg->selectedFile(); + newPath(dlg); + } + delete dlg; + if (s.isEmpty()) return; + s=QDir::convertSeparators(s); + try { + crl->writeCrl(s.latin1(), pem); + } + catch (errorEx &err) { + Error(err); + } + +} + + +void MainWindow::showPopupCrl(QListViewItem *item, const QPoint &pt, int x) { + CERR( "popup Crl"); + QPopupMenu *menu = new QPopupMenu(this); + QPopupMenu *subExport = new QPopupMenu(this); + + if (!item) { + menu->insertItem(tr("Import"), this, SLOT(loadCrl())); + } + else { + menu->insertItem(tr("Rename"), this, SLOT(startRenameCrl())); + menu->insertItem(tr("Show Details"), this, SLOT(showDetailsCrl())); + menu->insertItem(tr("Export"), subExport); + subExport->insertItem(tr("PEM"), this, SLOT(writeCrl_pem())); + subExport->insertItem(tr("DER"), this, SLOT(writeCrl_der())); + menu->insertItem(tr("Delete"), this, SLOT(deleteCrl())); + } + menu->exec(pt); + delete menu; + delete subExport; + + return; +} + +void MainWindow::renameCrl(QListViewItem *item, int col, const QString &text) +{ + if (col != 0) return; + try { + pki_base *pki = crls->getSelectedPKI(item); + string txt = text.latin1(); + crls->renamePKI(pki, txt); + } + catch (errorEx &err) { + Error(err); + } +} +void MainWindow::genCrl() +{ + pki_x509 *cert = (pki_x509 *)certs->getSelectedPKI(); + if (!cert) return; + if (cert->getKey()->isPubKey()) return; + pki_crl *crl = genCrl(cert); + crls->insertPKI(crl); +} + +pki_crl *MainWindow::genCrl(pki_x509 *cert) +{ + QList list; + pki_x509 *issuedcert = NULL; + pki_crl *crl = NULL; + try { + crl = new pki_crl(cert->getDescription(), cert); + + list = certs->getIssuedCerts(cert); + if (!list.isEmpty()) { + for ( issuedcert = list.first(); issuedcert != NULL; issuedcert = list.next() ) { + if (issuedcert->isRevoked() ) { + crl->addRevoked(issuedcert); + } + } + } + crl->addV3ext(NID_authority_key_identifier,"keyid,issuer"); + crl->addV3ext(NID_issuer_alt_name,"issuer:copy"); + crl->sign(cert->getKey()); + cert->setLastCrl(crl->getDate()); + certs->updatePKI(cert); + CERR( "CRL done, completely"); + } + catch (errorEx &err) { + Error(err); + } + return crl; +} + +void MainWindow::startRenameCrl() +{ + try { +#ifdef qt3 + pki_base *pki = crls->getSelectedPKI(); + if (!pki) return; + QListViewItem *item = (QListViewItem *)pki->getPointer(); + item->startRename(0); +#else + renamePKI(crls); +#endif + } + catch (errorEx &err) { + Error(err); + } +} diff --git a/view/Makefile.in b/view/Makefile.in new file mode 100644 index 00000000..b4bdfec3 --- /dev/null +++ b/view/Makefile.in @@ -0,0 +1,46 @@ +# +# @configure_input@ +# +# $Id$ + +VERSION=@PACKAGE_VERSION@ +TARGET=xca-$(VERSION) + +GCC=@CXX@ +CC=@CC@ + +MOC=@MOC@ +UIC=@UIC@ + +AR=@AR@ +RANLIB=@RANLIB@ + +CPPFLAGS=-I.. @CPPFLAGS@ @DEFS@ +CFLAGS=-Wall @ac_DEBUG@ + +############################################## + +NAMES= XcaListView KeyView ReqView TempView CertView #CrlView + + +OBJS=$(patsubst %,moc_%.o,$(NAMES)) $(patsubst %,%.o,$(NAMES)) main.o + +MOC_CPP=$(patsubst %,moc_%.cpp,$(NAMES)) + +all: view.o + +view.o: $(OBJS) + $(LD) -r -o $@ $(OBJS) + +%.o: %.cpp + $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ +clean: + rm -rf *~ *.o *.a $(MOC_CPP) + +distclean: clean + rm -f Makefile + +moc_%.cpp: %.h %.cpp + $(MOC) $< -o $@ + +.SECONDARY: $(UI_CPP) $(UI_H) $(MOC_CPP) diff --git a/view/ReqView.cpp b/view/ReqView.cpp new file mode 100644 index 00000000..a767ddc8 --- /dev/null +++ b/view/ReqView.cpp @@ -0,0 +1,295 @@ +/* + * 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$ + * + */ + + +#include "ReqView.h" +#include "ui/ReqDetail.h" +#include +#include +#include +#include +#include +#include +#include + +#include "widgets/MainWindow.h" +#include "widgets/NewX509.h" +#include "widgets/distname.h" + + +ReqView::ReqView(QWidget * parent = 0, const char * name = 0, WFlags f = 0) + :XcaListView(parent, name, f) +{ + addColumn(tr("Common Name")); + /* + connect(keyl, SIGNAL(delKey(pki_key *)), this, SLOT(delKey(pki_key *))); + connect(keyl, SIGNAL(newKey(pki_key *)), this, SLOT(newKey(pki_key *))); + */ +} + +void ReqView::newItem() +{ + newItem(NULL); +} + +void ReqView::newItem(pki_temp *temp) +{ + NewX509 *dlg = MainWindow::newX509(MainWindow::csrImg); + if (temp) { + dlg->defineTemplate(temp); + } + dlg->setRequest(); + if (! dlg->exec()){ + delete dlg; + return; + } + try { + pki_key *key = dlg->getSelectedKey(); + x509name xn = dlg->getX509name(); + pki_x509req *req = new pki_x509req(); + req->createReq(key, xn); + insert(req); + } + catch (errorEx &err) { + Error(err); + } +} + + + +void ReqView::showItem(pki_base *item, bool import) +{ + if (!item) return; + emit init_database(); + try { + pki_x509req *req = (pki_x509req *)item; + ReqDetail_UI *dlg = new ReqDetail_UI(this,0,true); + dlg->descr->setText(req->getIntName()); + dlg->setCaption(tr(XCA_TITLE)); + if (!req->verify() ) { + dlg->verify->setDisabled(true); + dlg->verify->setText("ERROR"); + } + pki_key *key =req->getRefKey(); + if (key) { + dlg->privKey->setText(key->getIntName()); + dlg->privKey->setDisabled(false); + } + /* + x509name rn = req->getSubject(); + dlg->dnCN->setText(rn.getEntryByNid(NID_commonName)); + dlg->dnC->setText(rn.getEntryByNid(NID_countryName) + " / " + + rn.getEntryByNid(NID_stateOrProvinceName)); + dlg->dnL->setText(rn.getEntryByNid(NID_localityName)); + dlg->dnO->setText(rn.getEntryByNid(NID_organizationName)); + dlg->dnOU->setText(rn.getEntryByNid(NID_organizationalUnitName)); + dlg->dnEmail->setText(rn.getEntryByNid(NID_pkcs9_emailAddress)); + dlg->image->setPixmap(*MainWindow::csrImg); + */ + + dlg->subject->setX509name(req->getSubject()); + + // rename the buttons in case of import + if (import) { + dlg->but_ok->setText(tr("Import")); + dlg->but_cancel->setText(tr("Discard")); + } + + QString odesc = req->getIntName(); + bool ret = dlg->exec(); + QString ndesc = dlg->descr->text(); + delete dlg; + if (!ret && import) { + delete req; + } + if (!ret) return; + + emit init_database(); + + if (import) { + req = (pki_x509req *)insert((pki_x509req *)req); + } + + if (ndesc != odesc) { + db->renamePKI(req, ndesc); + } + } + catch (errorEx &err) { + Error(err); + } +} + +void ReqView::deleteItem() +{ + deleteItem_default(tr("The Certificate signing request"), + tr("is going to be deleted")); +} + +void ReqView::load() +{ + QStringList filter; + filter.append("PKCS#10 CSR ( *.pem *.der *.csr )"); + filter.append("All Files ( *.* )"); + load_default(filter, tr("Import CSR")); +} + +pki_base *ReqView::loadItem(QString fname) +{ + pki_base *req = new pki_x509req(fname); + return req; +} + + +void ReqView::writeReq_pem() { store(true); } +void ReqView::writeReq_der() { store(false); } + +void ReqView::store(bool pem) +{ + pki_x509req *req; + try { + req = (pki_x509req *)getSelected(); + } + catch (errorEx &err) { + Error(err); + return; + } + + if (!req) return; + QStringList filt; + filt.append("PKCS#10 CSR ( *.pem *.der *.csr )"); + filt.append("All Files ( *.* )"); + QString s=""; + QFileDialog *dlg = new QFileDialog(this,0,true); + dlg->setCaption(tr("Export Certificate signing request")); + dlg->setFilters(filt); + dlg->setMode( QFileDialog::AnyFile ); + dlg->setSelection( req->getIntName() + ".csr" ); + + if (dlg->exec()) { + s = dlg->selectedFile(); + MainWindow::setPath(dlg->dirPath()); + } + delete dlg; + if (s.isEmpty()) return; + s=QDir::convertSeparators(s); + try { + req->writeReq(s, pem); + } + catch (errorEx &err) { + Error(err); + } +} + +void ReqView::signReq() +{ + pki_x509req *req; + try { + req = (pki_x509req *)getSelected(); + } + catch (errorEx &err) { + Error(err); + return; + } + newCert(req); +} + + +pki_base *ReqView::insert(pki_base *item) +{ + pki_x509req *oldreq, *req; + req = (pki_x509req *)item; + emit init_database(); + try { + oldreq = (pki_x509req *)db->getByReference(req); + } + catch (errorEx &err) { + Error(err); + } + if (oldreq) { + QMessageBox::information(this,tr(XCA_TITLE), + tr("The certificate signing request already exists in the database as") +":\n'" + + oldreq->getIntName() + + "'\n" + tr("and thus was not stored"), "OK"); + delete(req); + return oldreq; + } + try { + db->insertPKI(req); + } + catch (errorEx &err) { + Error(err); + } + return req; +} + + +void ReqView::popupMenu(QListViewItem *item, const QPoint &pt, int x) { + CERR("hallo popup Req"); + QPopupMenu *menu = new QPopupMenu(this); + QPopupMenu *subExport = new QPopupMenu(this); + if (!item) { + menu->insertItem(tr("New Request"), this, SLOT(newReq())); + menu->insertItem(tr("Import"), this, SLOT(loadReq())); + } + else { + menu->insertItem(tr("Rename"), this, SLOT(startRenameReq())); + menu->insertItem(tr("Show Details"), this, SLOT(showDetailsReq())); + menu->insertItem(tr("Sign"), this, SLOT(signReq())); + menu->insertItem(tr("Export"), subExport); + subExport->insertItem(tr("PEM"), this, SLOT(writeReq_pem())); + subExport->insertItem(tr("DER"), this, SLOT(writeReq_der())); + menu->insertItem(tr("Delete"), this, SLOT(deleteItem())); + } + menu->exec(pt); + delete menu; + delete subExport; + return; +} + diff --git a/view/ReqView.h b/view/ReqView.h new file mode 100644 index 00000000..d694ceeb --- /dev/null +++ b/view/ReqView.h @@ -0,0 +1,87 @@ +/* + * 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$ + * + */ + + +#ifndef REQVIEW_H +#define REQVIEW_H + +#include "XcaListView.h" +#include "lib/pki_x509req.h" +#include "lib/pki_temp.h" +#include "widgets/NewX509.h" + + +class ReqView : public XcaListView +{ + Q_OBJECT + + public: + ReqView(QWidget * parent = 0, const char * name = 0, WFlags f = 0); + void showItem(pki_base *item, bool import); + void newItem(); + void newItem(pki_temp *temp); + void deleteItem(); + void load(); + void updateViewItem(pki_base *); + pki_base *loadItem(QString fname); + pki_base* insert(pki_base *item); + void store(bool pem); + void popupMenu(QListViewItem *item, const QPoint &pt, int x); + public slots: + void writeReq_pem(); + void writeReq_der(); + void signReq(); + signals: + void keyDone(QString &); + void newCert(pki_x509req *req); + +}; + +#endif diff --git a/view/TempView.cpp b/view/TempView.cpp new file mode 100644 index 00000000..3121d40b --- /dev/null +++ b/view/TempView.cpp @@ -0,0 +1,151 @@ +/* + * 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$ + * + */ + + +#include "TempView.h" +#include "widgets/MainWindow.h" +#include "widgets/NewX509.h" +#include +#include + +TempView::TempView(QWidget * parent = 0, const char * name = 0, WFlags f = 0) + :XcaListView(parent, name, f) +{ + keyicon = loadImg("template.png"); + addColumn(tr("Type")); +} + +void TempView::newItem(int type) +{ + pki_temp *temp = new pki_temp("--", type); + if (alterTemp(temp)) { + insert(temp); + } +} + +bool TempView::alterTemp(pki_temp *temp) +{ + NewX509 *dlg = MainWindow::newX509(MainWindow::tempImg); + dlg->setTemp(temp); + dlg->fromTemplate(temp); + if (!dlg->exec()) { + delete dlg; + return false; + } + dlg->toTemplate(temp); + delete dlg; + return true; +} + +void TempView::showItem(pki_base *item, bool import) +{ + pki_temp *temp = (pki_temp *)item; + if (!temp) return; + QString oldname = temp->getIntName(); + alterTemp(temp); + QString newname = temp->getIntName(); + if (newname!= oldname) { + temp->setIntName(oldname); + MainWindow::temps->renamePKI(temp, newname); + } + MainWindow::temps->updatePKI(temp); +} + + +void TempView::deleteItem() +{ + deleteItem_default(tr("The Template"), tr("is going to be deleted")); +} + + + +pki_base *TempView::insert(pki_base *temp) +{ + MainWindow::temps->insertPKI(temp); + return temp; +} + +void TempView::certFromTemp() +{ + pki_temp *temp = (pki_temp *)getSelected(); + // FIXME: newCert(temp); +} + +void TempView::reqFromTemp() +{ + pki_temp *temp = (pki_temp *)getSelected(); + // FIXME: newReq(temp); +} + +void TempView::popupMenu(QListViewItem *item, const QPoint &pt, int x) +{ + QPopupMenu *menu = new QPopupMenu(this); + QPopupMenu *subMenu = new QPopupMenu(this); + if (!item) { + menu->insertItem(tr("New Template"), subMenu); + subMenu->insertItem(tr("Empty"), this, SLOT(newEmpTemp())); + subMenu->insertItem(tr("CA"), this, SLOT(newCATemp())); + subMenu->insertItem(tr("Client"), this, SLOT(newCliTemp())); + subMenu->insertItem(tr("Server"), this, SLOT(newSerTemp())); + + } + else { + menu->insertItem(tr("Rename"), this, SLOT(startRenameTemp())); + menu->insertItem(tr("Change"), this, SLOT(alterTemp())); + menu->insertItem(tr("Delete"), this, SLOT(deleteTemp())); + menu->insertItem(tr("Create certificate"), this, SLOT(certFromTemp())); + menu->insertItem(tr("Create request"), this, SLOT(reqFromTemp())); + } + menu->exec(pt); + delete menu; + delete subMenu; + return; +} + diff --git a/view/TempView.h b/view/TempView.h new file mode 100644 index 00000000..82127a4e --- /dev/null +++ b/view/TempView.h @@ -0,0 +1,85 @@ +/* + * 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$ + * + */ + + +#ifndef TEMPVIEW_H +#define TEMPVIEW_H + +#include "XcaListView.h" +#include "lib/pki_temp.h" +#include + +class TempView : public XcaListView +{ + Q_OBJECT + + private: + QPixmap *keyicon; + public: + TempView(QWidget * parent = 0, const char * name = 0, WFlags f = 0); + void showItem(pki_base *item, bool import); + void newItem(int type); + void deleteItem(); + //void load(); + void updateViewItem(pki_base *); + //pki_base *loadItem(QString fname); + pki_base* insert(pki_base *item); + //void store(); + void popupMenu(QListViewItem *item, const QPoint &pt, int x); + bool alterTemp(pki_temp *temp); + public slots: + void certFromTemp(); + void reqFromTemp(); + signals: + void init_database(); + +}; + +#endif diff --git a/view/XcaListView.cpp b/view/XcaListView.cpp new file mode 100644 index 00000000..b1854a6a --- /dev/null +++ b/view/XcaListView.cpp @@ -0,0 +1,272 @@ +/* + * 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$ + * + */ + + + +#include "XcaListView.h" +#include "widgets/MainWindow.h" +#include +#include +#include + +#ifdef WIN32 +#include +#endif + +XcaListView::XcaListView( QWidget * parent = 0, + const char * name = 0, WFlags f = 0) + :QListView(parent, name, f) +{ +#ifdef qt3 + connect( this, SIGNAL(itemRenamed(QListViewItem *, int, const QString &)), + this, SLOT(rename(QListViewItem *, int, const QString &))); +#endif + connect( this, SIGNAL(rightButtonPressed(QListViewItem *, const QPoint &, int)), + this, SLOT(popupMenu(QListViewItem *, const QPoint &, int))) ; + + connect( this, SIGNAL(doubleClicked(QListViewItem *)), + this, SLOT(showItem(QListViewItem *))) ; +} + +void XcaListView::setDB(db_base *mydb) +{ + db = mydb; + updateView(); +} + +void XcaListView::loadCont() +{ + emit init_database(); + db->loadContainer(); + updateView(); +} + +pki_base *XcaListView::getSelected() +{ + emit init_database(); + QListViewItem *lvi = selectedItem(); + if (!lvi) return NULL; + QString name = lvi->text(0); + return db->getByName(name); +} + +void XcaListView::showItem() +{ + showItem(getSelected(), false); +} + +void XcaListView::showItem(QListViewItem *item) +{ + showItem(db->getByName(item->text(0)), false); +} + +void XcaListView::rename(QListViewItem *item, int col, const QString &text) +{ + emit init_database(); + try { + pki_base *pki = db->getByPtr(item); + db->renamePKI(pki, text); + } + catch (errorEx &err) { + Error(err); + } +} + +void XcaListView::startRename() +{ + try { +#ifdef qt3 + QListViewItem *item = selectedItem(); + if (item == NULL) return; + item->startRename(0); +#else + renameDialog(); +#endif + } + catch (errorEx &err) { + Error(err); + } +} + +void XcaListView::renameDialog() +{ + pki_base * pki = getSelected(); + if (!pki) return; + QString name= pki->getIntName(); + 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); + pki->getLvi()->setText(0, pki->getIntName()); + + } +} + +void XcaListView::deleteItem_default(QString t1, QString t2) +{ + pki_base *del = getSelected(); + if (!del) return; + if (QMessageBox::information(this,tr(XCA_TITLE), + t1 + ": '" + del->getIntName() + "'\n" + t2, + tr("Delete"), tr("Cancel")) + ) return; + try { + db->deletePKI(del); + } + catch (errorEx &err) { + Error(err); + } +} + +void XcaListView::load_default(QStringList &filter, QString caption) +{ + filter.append( tr("All Files ( *.* )") ); + QString s = ""; + QStringList slist; + QFileDialog *dlg = new QFileDialog(this,0,true); + dlg->setCaption(caption); + dlg->setFilters(filter); + dlg->setMode( QFileDialog::ExistingFiles ); + dlg->setDir(MainWindow::getPath()); + if (dlg->exec()) { + slist = dlg->selectedFiles(); + MainWindow::setPath(dlg->dirPath()); + } + delete dlg; + for ( QStringList::Iterator it = slist.begin(); it != slist.end(); ++it ) { + s = *it; + s = QDir::convertSeparators(s); + try { + pki_base *item = loadItem(s); + insert(item); + } + catch (errorEx &err) { + Error(err); + } + } +} + +void XcaListView::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())); +} + +bool XcaListView::Error(pki_base *pki) +{ + 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"); + } + + return false; +} + +void XcaListView::updateView() +{ + clear(); + QList container; + pki_base *pki; + container = db->getContainer(); + if (container.isEmpty()) return; + for ( pki = container.first(); pki != NULL; pki = container.next() ) pki->delLvi(); + QListIterator it(container); + for ( ; it.current(); ++it ) { + pki = it.current(); + QListViewItem *lvi = new QListViewItem(this, pki->getIntName()); + insertItem(lvi); + pki->setLvi(lvi); + pki->updateView(); + } +} + +pki_base *XcaListView::loadItem(QString) { CERR("Virtual called..."); return NULL; } +void XcaListView::newItem(void) { CERR("Virtual called..."); } +void XcaListView::deleteItem(void) { CERR("Virtual called..."); } +void XcaListView::load(void) { CERR("Virtual called..."); } +void XcaListView::store(void) { CERR("Virtual called..."); } +pki_base *XcaListView::insert(pki_base *) { CERR("Virtual called..."); return NULL; } +void XcaListView::popupMenu(QListViewItem *, QPoint const &, int) { CERR("Virtual called..."); } +void XcaListView::showItem(pki_base *, bool) { CERR("Virtual called...");} + +QPixmap *XcaListView::loadImg(const char *name ) +{ +#ifdef WIN32 + static unsigned char PREFIX[100]=""; + if (PREFIX[0] == '\0') { + LONG lRc; + HKEY hKey; + lRc=RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\xca",0,KEY_READ, &hKey); + if(lRc!= ERROR_SUCCESS){ + // No key error + QMessageBox::warning(NULL,tr(XCA_TITLE), "Registry Key: 'HKEY_LOCAL_MACHINE->Software->xca' not found"); + PREFIX[0] = '\0'; + } + else { + ULONG dwLength = 100; + lRc=RegQueryValueEx(hKey,"Install_Dir",NULL,NULL, PREFIX, &dwLength); + if(lRc!= ERROR_SUCCESS){ + // No key error + QMessageBox::warning(NULL,tr(XCA_TITLE), "Registry Key: 'HKEY_LOCAL_MACHINE->Software->xca->Install_Dir' not found"); + PREFIX[0] = '\0'; + } + } + lRc=RegCloseKey(hKey); + } +#endif + QString path = (char *)PREFIX; + path += QDir::separator(); + return new QPixmap(path + name); +} diff --git a/view/XcaListView.h b/view/XcaListView.h new file mode 100644 index 00000000..b3fcb212 --- /dev/null +++ b/view/XcaListView.h @@ -0,0 +1,95 @@ +/* + * 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$ + * + */ + + +#ifndef XCALISTVIEW_H +#define XCALISTVIEW_H + +#include +#include "lib/db_base.h" +#include "lib/exception.h" + +class XcaListView : public QListView +{ + Q_OBJECT + + protected: + db_base *db; + public: + XcaListView(QWidget * parent = 0, const char * name = 0, WFlags f = 0); + void setDB(db_base *mydb); + virtual pki_base *getSelected(); + virtual void showItem(pki_base *item, bool import); + void deleteItem_default(QString t1, QString t2); + virtual pki_base *loadItem(QString fname); + void load_default(QStringList &filter, QString caption); + void setDB(db_base *mydb, QPixmap *myimage); + void Error(errorEx &err); + bool Error(pki_base *pki); + void loadCont(); + QPixmap *loadImg(const char *name ); + public slots: + virtual void newItem(); + virtual void deleteItem(); + void showItem(); + void showItem(QListViewItem *item); + virtual void load(); + virtual void store(); + virtual pki_base *insert(pki_base *item); + virtual void popupMenu(QListViewItem *item, const QPoint &pt, int x); + void startRename(); + void renameDialog(); + void rename(QListViewItem *item, int col, const QString &text); + void updateView(); + signals: + void init_database(); +}; + +#endif diff --git a/view/main.cpp b/view/main.cpp new file mode 100644 index 00000000..ebc42e10 --- /dev/null +++ b/view/main.cpp @@ -0,0 +1,88 @@ +/* + * 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$ + * + */ + + +#include +#include +#include +#include "widgets/MainWindow.h" + + +int main( int argc, char *argv[] ) +{ + int ret = 0; + QApplication a( argc, argv ); + MainWindow *mw = new MainWindow( NULL, "Main Widget"); + a.setMainWidget( mw ); + // translation file for Qt + QTranslator qtTr( 0 ); + qtTr.load( QString( "qt_" ) + QTextCodec::locale(), "." ); + a.installTranslator( &qtTr ); + //translation file for application strings + QTranslator xcaTr( 0 ); +#ifdef WIN32 + xcaTr.load( QString( "xca_" ) + QTextCodec::locale(), "." ); + a.installTranslator( &xcaTr ); +#else + xcaTr.load( QString( "xca_" ) + QTextCodec::locale(), PREFIX ); + a.installTranslator( &xcaTr ); +#endif + CERR("PKI Counter:" << pki_base::get_pki_counter()); + if (mw->exitApp == 0) { + mw->show(); + ret = a.exec(); + } + MARK + delete mw; + MARK + clog << "PKI Counter: " << pki_base::get_pki_counter() << endl; + clog << "The PKI counter must be 0, if not contact me." << endl; + return ret; +} diff --git a/widgets/ExportKey.h b/widgets/ExportKey.h index ffe0eba7..34b5a4eb 100644 --- a/widgets/ExportKey.h +++ b/widgets/ExportKey.h @@ -55,6 +55,7 @@ #include #include #include "lib/pki_base.h" +#include #ifndef EXPORTKEY_H #define EXPORTKEY_H diff --git a/widgets/MainWindow.cpp b/widgets/MainWindow.cpp index a8295d5e..6707cca7 100644 --- a/widgets/MainWindow.cpp +++ b/widgets/MainWindow.cpp @@ -54,10 +54,10 @@ #include #include #include "lib/pki_pkcs12.h" -#include "KeyView.h" -#include "ReqView.h" -#include "CertView.h" -#include "TempView.h" +#include "view/KeyView.h" +#include "view/ReqView.h" +#include "view/CertView.h" +#include "view/TempView.h" #include "lib/pass_info.h" #include "lib/func.h" #include "ui/PassRead.h" diff --git a/widgets/Makefile.in b/widgets/Makefile.in index 1cb40b74..991a9e1b 100644 --- a/widgets/Makefile.in +++ b/widgets/Makefile.in @@ -20,17 +20,17 @@ CFLAGS=-Wall @ac_DEBUG@ ############################################## -NAMES= MainWindow ExportCert ExportKey ExportTinyCA NewX509 CrlDetail +NAMES= ExportCert ExportKey ExportTinyCA NewX509 CrlDetail \ + MainWindow validity distname OBJS=$(patsubst %,moc_%.o,$(NAMES)) $(patsubst %,%.o,$(NAMES)) MOC_CPP=$(patsubst %,moc_%.cpp,$(NAMES)) -all: libwidget.a +all: widgets.o -libwidget.a: $(OBJS) - $(AR) rc $@ $(OBJS) - $(RANLIB) $@ +widgets.o: $(OBJS) + $(LD) -r -o $@ $(OBJS) %.o: %.cpp $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ diff --git a/widgets/validity.cpp b/widgets/validity.cpp new file mode 100644 index 00000000..77be64c1 --- /dev/null +++ b/widgets/validity.cpp @@ -0,0 +1,149 @@ +/* + * 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$ + * + */ + +#include "validity.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "lib/asn1time.h" + +Validity::Validity( QWidget* parent, const char* name ) + : QGroupBox( parent, name ) +{ + QStringList months, days; + months << tr("Jan") << tr("Feb") << tr("Mar") << tr("Apr") + << tr("Mai") << tr("Jun") << tr("Jul") << tr("Aug") + << tr("Sep") << tr("Okt") << tr("Nov") << tr("Dez"); + for (int i=1; i<32; i++) + days += QString::number(i); + + if ( !name ) + setName( "Validity" ); + setTitle( tr( "Validity" ) ); + ValidityLayout = new QGridLayout( this ); + ValidityLayout->setSpacing( 6 ); + ValidityLayout->setMargin( 11 ); + + Label1 = new QLabel( this, "Label1" ); + Label1->setText( tr( "not Before" ) ); + + Label2 = new QLabel( this, "Label2" ); + Label2->setText( tr( "not After" ) ); + + nbDay = new QComboBox( FALSE, this, "nbDay" ); + nbMon = new QComboBox( FALSE, this, "nbMon" ); + nbYear = new QLineEdit( this, "nbYear" ); + + naDay = new QComboBox( FALSE, this, "naDay" ); + naMon = new QComboBox( FALSE, this, "naMon" ); + naYear = new QLineEdit( this, "naYear" ); + + ValidityLayout->addWidget( Label1, 0, 0 ); + ValidityLayout->addWidget( nbDay, 0, 1 ); + ValidityLayout->addWidget( nbMon, 0, 2 ); + ValidityLayout->addWidget( nbYear, 0, 3 ); + + ValidityLayout->addWidget( Label2, 1, 0 ); + ValidityLayout->addWidget( naDay, 1, 1 ); + ValidityLayout->addWidget( naMon, 1, 2 ); + ValidityLayout->addWidget( naYear, 1, 3 ); + + + nbMon->insertStringList(months); + naMon->insertStringList(months); + nbDay->insertStringList(days); + naDay->insertStringList(days); +} + +Validity::~Validity() +{ + // no need to delete child widgets, Qt does it all for us +} + +a1time Validity::getNotBefore() const +{ + a1time date; + date.set(nbYear->text().toInt(), nbMon->currentItem() + 1, + nbDay->currentItem() +1, 0, 0, 0); + return date; +} + +a1time Validity::getNotAfter() const +{ + a1time date; + date.set(naYear->text().toInt(), naMon->currentItem() + 1, + naDay->currentItem() +1, 0, 0, 0); + return date; +} + +void Validity::setNotBefore(const a1time &a) +{ + int y, m, d, g; + a.ymdg(&y,&m,&d,&g); + nbYear->setText(QString::number(y)); + nbMon->setCurrentItem(m-1); + nbDay->setCurrentItem(d-1); +} + +void Validity::setNotAfter(const a1time &a) +{ + int y, m, d, g; + a.ymdg(&y,&m,&d,&g); + naYear->setText(QString::number(y)); + naMon->setCurrentItem(m-1); + naDay->setCurrentItem(d-1); +} + diff --git a/widgets/validity.h b/widgets/validity.h new file mode 100644 index 00000000..efdc3240 --- /dev/null +++ b/widgets/validity.h @@ -0,0 +1,83 @@ +/* + * 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$ + * + */ + +#ifndef VALIDITY_H +#define VALIDITY_H + +#include +#include + +class QGridLayout; +class a1time; +class QLabel; +class QComboBox; +class QLineEdit; + +class Validity : public QGroupBox +{ + Q_OBJECT + + public: + Validity( QWidget* parent = 0, const char* name = 0); + ~Validity(); + a1time getNotBefore() const; + a1time getNotAfter() const; + void setNotBefore(const a1time &t); + void setNotAfter(const a1time &t); + + protected: + QGridLayout* ValidityLayout; + QLabel *Label1, *Label2; + QComboBox *nbDay, *nbMon, *naMon, *naDay; + QLineEdit *nbYear, *naYear; + +}; + +#endif // VALIDITY_H