From 1b73407db2924900f191896053c81f5b56c49310 Mon Sep 17 00:00:00 2001 From: SET Date: Fri, 13 Nov 2020 18:28:17 +0100 Subject: [PATCH] Allow to create keys. A popup shows required parameters. Created keys are added to the list of secret keys managed by the user. --- K7Main.cpp | 73 ++++++++- K7Main.h | 11 ++ PopupCreate.cpp | 258 ++++++++++++++++++++++++++++++ PopupCreate.h | 160 ++++++++++++++++++ README.md | 6 +- WTAPPROOT/K7/K7.xml | 15 ++ WTAPPROOT/K7/K7_fr.xml | 15 ++ nbproject/Makefile-ARM-Release.mk | 6 + nbproject/Makefile-Debug.mk | 6 + nbproject/Makefile-Release.mk | 6 + nbproject/configurations.xml | 14 ++ 11 files changed, 565 insertions(+), 5 deletions(-) create mode 100644 PopupCreate.cpp create mode 100644 PopupCreate.h diff --git a/K7Main.cpp b/K7Main.cpp index 64b43ff..ed01d22 100644 --- a/K7Main.cpp +++ b/K7Main.cpp @@ -29,6 +29,7 @@ K7Main::K7Main(const WEnvironment& env) { m_config = NULL; m_btnUpload = NULL; m_btnImport = NULL; m_btnDelete = NULL; + m_btnCreate = NULL; m_popupCreate = NULL; WApplication::setTitle(_APPNAME_); const WString bundle = WApplication::appRoot() + _APPNAME_; WApplication::instance()->messageResourceBundle().use(bundle.toUTF8()); @@ -70,7 +71,7 @@ K7Main::K7Main(const WEnvironment& env) K7Main::~K7Main() { delete m_config; delete m_uploader; delete m_deleter; - delete m_keyEdit; + delete m_keyEdit; delete m_popupCreate; } void @@ -137,7 +138,14 @@ K7Main::Create() m_btnDelete->clicked().connect(this, &K7Main::PopupDeleter); m_btnDelete->hide(); } - vblButtons->addSpacing(300); + vblButtons->addSpacing(150); + vblButtons->addStretch(1); + if (m_config->CanCreateKeys()) { + m_btnCreate = new WPushButton(TR("Create")); + m_btnCreate->setToolTip(TR("TTTCreate")); + vblButtons->addWidget(unique_ptr (m_btnCreate)); + m_btnCreate->clicked().connect(this, &K7Main::ShowPopupCreate); + } grlMain->addWidget(unique_ptr (cwButtons), 1, 1); // Add and hide detail tables @@ -523,3 +531,64 @@ void K7Main::DoDeleteKey() { m_leSearch->setText(fpr); Search(); } + +void K7Main::ShowPopupCreate() +{ + if (m_popupCreate == NULL) + { + m_popupCreate = new PopupCreate(m_btnCreate, m_tmwMessage); + m_popupCreate->Create(); + m_popupCreate->GetApplyButton()->clicked().connect(this, &K7Main::DoCreateKey); + } + m_popupCreate->show(); +} + +void K7Main::DoCreateKey() +{ + if (!m_popupCreate->Validate()) + return; + Error e; + GpgME::Key k; + GpgMEWorker gpgw; + if (m_popupCreate->UseDefaultEngineAlgorithms()) + { + e = gpgw.CreateKeyWithEngineDefaultAlgo(k, m_popupCreate->GetName().toUTF8(), + m_popupCreate->GetEmail().toUTF8(), + m_popupCreate->GetComment().toUTF8(), + m_popupCreate->GetPassphrase().toUTF8(), + m_popupCreate->GetExpiry()); + } + else + { + e = gpgw.CreateKey(k, m_popupCreate->GetName().toUTF8(), + m_popupCreate->GetEmail().toUTF8(), + m_popupCreate->GetComment().toUTF8(), + m_popupCreate->GetArbitraryKeyAlgo().toUTF8().c_str(), + m_popupCreate->GetPassphrase().toUTF8(), + m_popupCreate->GetExpiry()); + // GPGME accepts a missing subkey. + if (e.code() == 0 && !m_popupCreate->GetArbitrarySubkeyAlgo().empty()) + e = gpgw.CreateSubKey(k, + m_popupCreate->GetArbitrarySubkeyAlgo().toUTF8().c_str(), + m_popupCreate->GetPassphrase().toUTF8(), + m_popupCreate->GetExpiry()); + } + if (e.code() != 0) + { + m_tmwMessage->SetText(e.asString()); + } + else + { + const WString fpr(k.primaryFingerprint()); + m_tmwMessage->SetText(TR("CreateSuccess") + + fpr + WString(" - ") + WString(k.userID(0).name())); + // Add the key fingerprint to the list of keys managed by the user. + m_config->UpdateSecretKeyOwnership(fpr, true); + m_popupCreate->hide(); +#ifndef DEVTIME + m_popupCreate->Reset(); +#endif + m_leSearch->setText(fpr); + Search(); + } +} diff --git a/K7Main.h b/K7Main.h index 4f5ba66..03089e6 100644 --- a/K7Main.h +++ b/K7Main.h @@ -24,6 +24,7 @@ #include "AppConfig.h" #include "PopupUploader.h" #include "PopupDeleter.h" +#include "PopupCreate.h" #include "TransientMessageWidget.h" #include "KeyEdit.h" #include "global.h" @@ -54,12 +55,14 @@ private: WPushButton * m_btnUpload; WPushButton * m_btnImport; WPushButton * m_btnDelete ; + WPushButton * m_btnCreate ; WTreeTable * m_ttbKeys; WTreeTable * m_ttbUids; WTreeTable * m_ttbSubKeys; Uploader * m_uploader; Deleter * m_deleter; KeyEdit * m_keyEdit; + PopupCreate * m_popupCreate; /** * Finds public keys as per criteria, * and private keys if any is declared in config file for current client. @@ -121,6 +124,14 @@ private: * Translates unit time to readable date. */ WString MakeDateTimeLabel(time_t ticks); + /** + * Shows a non-blocking popup to create keys. + */ + void ShowPopupCreate(); + /** + * Validates input and creates the keys. + */ + void DoCreateKey(); }; #endif /* K7MAIN_H */ diff --git a/PopupCreate.cpp b/PopupCreate.cpp new file mode 100644 index 0000000..8f68738 --- /dev/null +++ b/PopupCreate.cpp @@ -0,0 +1,258 @@ +/* + * File: PopupCreate.cpp + * Author: SET - nmset@yandex.com + * License : GPL v2 + * Copyright SET - © 2019 + * + * Created on November 11, 2020, 10:20 PM + */ + +#include "PopupCreate.h" +#include "global.h" +#include +#include +#include +#include + +PopupCreate::PopupCreate(WWidget * anchorWidget, + TransientMessageWidget * txtMessage, const WLength& width) +: WPopupWidget(cpp14::make_unique()) +{ + m_tmwMessage = txtMessage; + m_cwMain = NULL; + m_leName = NULL; + m_leEmail = NULL; + m_leComment = NULL; + m_deExpiry = NULL; + m_lePassphrase = NULL; + m_leConfirm = NULL; + m_cbDefaultAlgo = NULL; + m_btnApply = NULL; + m_arbitraryKeyAlgo = WString::Empty; + m_arbitrarySubkeyAlgo = WString::Empty; + setTransient(true); + setAnchorWidget(anchorWidget); + setWidth(width); +} + +PopupCreate::~PopupCreate() +{ +} + +void PopupCreate::Create() +{ + m_cwMain = static_cast (implementation()); + m_cwMain->setStyleClass("popup"); + WVBoxLayout * vblMain = new WVBoxLayout(); + m_cwMain->setLayout(unique_ptr (vblMain)); + WGridLayout * grlOther = new WGridLayout(); + grlOther->setColumnStretch(1, 1); + vblMain->addLayout(unique_ptr (grlOther)); + + WText * lblName = new WText(TR("Name")); + grlOther->addWidget(unique_ptr (lblName), 0, 0); + m_leName = new WLineEdit(); + grlOther->addWidget(unique_ptr (m_leName), 0, 1); + WText * lblEmail = new WText(TR("Email")); + grlOther->addWidget(unique_ptr (lblEmail), 1, 0); + m_leEmail = new WLineEdit(); + m_leEmail->setToolTip(TR("TTTEmailRecommended")); + grlOther->addWidget(unique_ptr (m_leEmail), 1, 1); + WText * lblComment = new WText(TR("Comment")); + grlOther->addWidget(unique_ptr (lblComment), 2, 0); + m_leComment = new WLineEdit(); + grlOther->addWidget(unique_ptr (m_leComment), 2, 1); + WText * lblExpiry = new WText(TR("Expiration")); + grlOther->addWidget(unique_ptr (lblExpiry), 3, 0); + m_deExpiry = new WDateEdit(); + grlOther->addWidget(unique_ptr (m_deExpiry), 3, 1); + m_cbDefaultAlgo = new WCheckBox(TR("DefaultAlgo")); + grlOther->addWidget(unique_ptr (m_cbDefaultAlgo), 4, 1); + + /* + * Key and subkey algorithms are grouped by category for clarity. + * They are not constrained across categories, as kleopatra enforces. + * Ex : an RSA subkey can be attached to a DSA secret key. Good? Bad? + * There could have been only two comboboxes, one for key algorithm and one + * for subkey algorithms. + */ + WContainerWidget * cwAlgo = new WContainerWidget(); + cwAlgo->setToolTip(TR("TTTKeyAlgo")); + WGridLayout * grlAlgo = new WGridLayout(); + cwAlgo->setLayout(unique_ptr (grlAlgo)); + grlAlgo->setColumnStretch(0, 1); + grlAlgo->setColumnStretch(1, 1); + vblMain->addWidget(unique_ptr (cwAlgo)); + WText * lblKey = new WText(TR("Key")); + grlAlgo->addWidget(unique_ptr (lblKey), 0, 0); + WText * lblSubkey = new WText(TR("Subkey")); + grlAlgo->addWidget(unique_ptr (lblSubkey), 0, 1); + WComboBox * cmbKeyRSA = new WComboBox(); + cmbKeyRSA->setToolTip("RSA"); + grlAlgo->addWidget(unique_ptr (cmbKeyRSA), 1, 0); + WComboBox * cmbSubkeyRSA = new WComboBox(); + cmbSubkeyRSA->setToolTip("RSA"); + grlAlgo->addWidget(unique_ptr (cmbSubkeyRSA), 1, 1); + WComboBox * cmbKeyDSA = new WComboBox(); + cmbKeyDSA->setToolTip("DSA"); + grlAlgo->addWidget(unique_ptr (cmbKeyDSA), 2, 0); + WComboBox * cmbSubkeyDSA = new WComboBox(); + cmbSubkeyDSA->setToolTip("Elgamal"); + grlAlgo->addWidget(unique_ptr (cmbSubkeyDSA), 2, 1); + WComboBox * cmbKeyECDSA = new WComboBox(); + cmbKeyECDSA->setToolTip("ECDSA/EdDSA"); + grlAlgo->addWidget(unique_ptr (cmbKeyECDSA), 3, 0); + WComboBox * cmbSubkeyECDSA = new WComboBox(); + cmbSubkeyECDSA->setToolTip("ECDH"); + grlAlgo->addWidget(unique_ptr (cmbSubkeyECDSA), 3, 1); + + WGridLayout * grlPassphrase = new WGridLayout(); + grlPassphrase->setColumnStretch(1, 1); + vblMain->addLayout(unique_ptr (grlPassphrase)); + WText * lblPassphrase = new WText(TR("Passphrase")); + grlPassphrase->addWidget(unique_ptr (lblPassphrase), 0, 0); + m_lePassphrase = new WLineEdit(); + m_lePassphrase->setEchoMode(EchoMode::Password); + grlPassphrase->addWidget(unique_ptr (m_lePassphrase), 0, 1); + WText * lblConfirm = new WText(TR("Confirm")); + grlPassphrase->addWidget(unique_ptr (lblConfirm), 1, 0); + m_leConfirm = new WLineEdit(); + m_leConfirm->setEchoMode(EchoMode::Password); + grlPassphrase->addWidget(unique_ptr (m_leConfirm), 1, 1); + + WHBoxLayout * hblButtons = new WHBoxLayout(); + WPushButton * btnClose = new WPushButton(TR("Close")); + hblButtons->addWidget(unique_ptr (btnClose)); + m_btnApply = new WPushButton(TR("Apply")); + hblButtons->addWidget(unique_ptr (m_btnApply)); + vblMain->addLayout(unique_ptr (hblButtons)); + + // All theses values come from kleopatra. + cmbKeyRSA->addItem(WString::Empty); + cmbKeyRSA->addItem("RSA2048"); + cmbKeyRSA->addItem("RSA3072"); + cmbKeyRSA->addItem("RSA4096"); + cmbSubkeyRSA->addItem(WString::Empty); + cmbSubkeyRSA->addItem("RSA2048"); + cmbSubkeyRSA->addItem("RSA3072"); + cmbSubkeyRSA->addItem("RSA4096"); + cmbKeyDSA->addItem(WString::Empty); + cmbKeyDSA->addItem("DSA2048"); + cmbSubkeyDSA->addItem(WString::Empty); + cmbSubkeyDSA->addItem("ELG2048"); + cmbSubkeyDSA->addItem("ELG3072"); + cmbSubkeyDSA->addItem("ELG4096"); + cmbKeyECDSA->addItem(WString::Empty); + cmbKeyECDSA->addItem("ed25519"); + cmbKeyECDSA->addItem("brainpoolP256r1"); + cmbKeyECDSA->addItem("brainpoolP384r1"); + cmbKeyECDSA->addItem("brainpoolP512r1"); + cmbKeyECDSA->addItem("NIST P-256"); + cmbKeyECDSA->addItem("NIST P-384"); + cmbKeyECDSA->addItem("NIST P-521"); + cmbSubkeyECDSA->addItem(WString::Empty); + cmbSubkeyECDSA->addItem("cv25519"); + cmbSubkeyECDSA->addItem("brainpoolP256r1"); + cmbSubkeyECDSA->addItem("brainpoolP384r1"); + cmbSubkeyECDSA->addItem("brainpoolP512r1"); + cmbSubkeyECDSA->addItem("NIST P-256"); + cmbSubkeyECDSA->addItem("NIST P-384"); + cmbSubkeyECDSA->addItem("NIST P-521"); + + // Group in lists for easy access by ::iterator. + m_cmbKeyAlgo.push_back(cmbKeyRSA); + m_cmbKeyAlgo.push_back(cmbKeyDSA); + m_cmbKeyAlgo.push_back(cmbKeyECDSA); + m_cmbSubkeyAlgo.push_back(cmbSubkeyRSA); + m_cmbSubkeyAlgo.push_back(cmbSubkeyDSA); + m_cmbSubkeyAlgo.push_back(cmbSubkeyECDSA); + + list::iterator it; + for (it = m_cmbKeyAlgo.begin(); it != m_cmbKeyAlgo.end(); it++) + (*it)->changed().connect(std::bind(&PopupCreate::OnComboKeyAlgoSelect, this, *it)); + for (it = m_cmbSubkeyAlgo.begin(); it != m_cmbSubkeyAlgo.end(); it++) + (*it)->changed().connect(std::bind(&PopupCreate::OnComboSubkeyAlgoSelect, this, *it)); + + m_cbDefaultAlgo->setChecked(); + cwAlgo->hide(); + m_cbDefaultAlgo->checked().connect(cwAlgo, &WContainerWidget::hide); + m_cbDefaultAlgo->unChecked().connect(cwAlgo, &WContainerWidget::show); + m_deExpiry->setDate(WDate::currentDate().addYears(2)); + btnClose->clicked().connect(this, &WPopupWidget::hide); + +} + +void PopupCreate::OnComboKeyAlgoSelect(WComboBox * cmb) +{ + list::iterator it; + for (it = m_cmbKeyAlgo.begin(); it != m_cmbKeyAlgo.end(); it++) + { + if (*it != cmb) + (*it)->setCurrentIndex(0); + else + m_arbitraryKeyAlgo = (*it)->currentText(); + } +} + +void PopupCreate::OnComboSubkeyAlgoSelect(WComboBox * cmb) +{ + list::iterator it; + for (it = m_cmbSubkeyAlgo.begin(); it != m_cmbSubkeyAlgo.end(); it++) + { + if (*it != cmb) + (*it)->setCurrentIndex(0); + else + m_arbitrarySubkeyAlgo = (*it)->currentText(); + } +} + +bool PopupCreate::Validate() const +{ + if (m_leEmail->text().empty()) + { + m_tmwMessage->SetText(TR("ValidateEmailMissing")); + return false; + } + if (m_lePassphrase->text().empty()) + { + m_tmwMessage->SetText(TR("ValidatePassphraseMissing")); + return false; + } + if (m_lePassphrase->text() != m_leConfirm->text()) + { + m_tmwMessage->SetText(TR("ValidatePassphraseNoMatch")); + return false; + } + if (!m_cbDefaultAlgo->isChecked() && m_arbitraryKeyAlgo.empty()) + { + m_tmwMessage->SetText(TR("ValidateKeyAlgoMissing")); + return false; + } + return true; +} + +const ulong PopupCreate::GetExpiry() const +{ + return ((WDate::currentDate().daysTo(m_deExpiry->date())) * 24 * 3600); +} + +void PopupCreate::Reset(bool completely) +{ + m_leName->setText((WString::Empty)); + m_leEmail->setText((WString::Empty)); + m_leComment->setText((WString::Empty)); + m_lePassphrase->setText(WString::Empty); + m_leConfirm->setText(WString::Empty); + if (completely) + { + m_deExpiry->setDate(WDate::currentDate().addYears(2)); + m_cbDefaultAlgo->setChecked(); + list::iterator it; + for (it = m_cmbKeyAlgo.begin(); it != m_cmbKeyAlgo.end(); it++) + (*it)->setCurrentIndex(0); + for (it = m_cmbSubkeyAlgo.begin(); it != m_cmbSubkeyAlgo.end(); it++) + (*it)->setCurrentIndex(0); + m_arbitraryKeyAlgo = WString::Empty; + m_arbitrarySubkeyAlgo = WString::Empty; + } +} diff --git a/PopupCreate.h b/PopupCreate.h new file mode 100644 index 0000000..0b79325 --- /dev/null +++ b/PopupCreate.h @@ -0,0 +1,160 @@ +/* + * File: PopupCreate.h + * Author: SET - nmset@yandex.com + * License : GPL v2 + * Copyright SET - © 2019 + * + * Created on November 11, 2020, 10:20 PM + */ + +#ifndef POPUPCREATE_H +#define POPUPCREATE_H + +#include +#include +#include +#include +#include +#include +#include +#include "TransientMessageWidget.h" + +using namespace Wt; + +/** + * A popup with all parameters to create keys. A secret key must be created, a + * subkey is optional (GPGME allows this). Key algorithm identifiers are poked + * from kleopatra. + * @param anchorWidget + * @param txtMessage + * @param width + */ +class PopupCreate : public WPopupWidget +{ +public: + PopupCreate(WWidget * anchorWidget, TransientMessageWidget * txtMessage, + const WLength& width = 400); + virtual ~PopupCreate(); + void Create(); + + const WString GetName() const + { + return m_leName->text(); + } + + /** + * GPGME accepts anything here, it may not be an email address. + * @return + */ + const WString GetEmail() const + { + return m_leEmail->text(); + } + + const WString GetComment() const + { + return m_leComment->text(); + } + /** + * Number of seconds from now. Default is 2 years. + * \n NB : with default engine algorithms, GPGME does not set an expiry time + * for the subkey. + * @return + */ + const ulong GetExpiry() const; + + bool UseDefaultEngineAlgorithms() const + { + return m_cbDefaultAlgo->isChecked(); + } + + /** + * Selected by the user. + * @return + */ + const WString GetArbitraryKeyAlgo() const + { + return m_arbitraryKeyAlgo; + } + + /** + * Selected by the user. + * @return + */ + const WString GetArbitrarySubkeyAlgo() const + { + return m_arbitrarySubkeyAlgo; + } + + const WString GetPassphrase() const + { + return m_lePassphrase->text(); + } + + /** + * For caller to bind its key creation function. + * @return + */ + WPushButton * GetApplyButton() const + { + return m_btnApply; + } + /** + * There must be + *
    + *
  • an email address
  • + *
  • a passphrase
  • + *
  • a passphrase confirmation
  • + *
  • a key algorithm
  • + *
+ * @return + */ + bool Validate() const; + /** + * If completely is false : + *
    + *
  • name
  • + *
  • email
  • + *
  • comment
  • + *
  • password fields
  • + *
+ * are set to default values. + * \n If completely is true, all parameters are reset to default. + * @param completely + */ + void Reset(bool completely = false); + +private: + TransientMessageWidget * m_tmwMessage; + WContainerWidget * m_cwMain; + WLineEdit * m_leName; + WLineEdit * m_leEmail; + WLineEdit * m_leComment; + WDateEdit * m_deExpiry; + WLineEdit * m_lePassphrase; + WLineEdit * m_leConfirm; + WCheckBox * m_cbDefaultAlgo; + WPushButton * m_btnApply; + + list m_cmbKeyAlgo; + list m_cmbSubkeyAlgo; + WString m_arbitraryKeyAlgo; + WString m_arbitrarySubkeyAlgo; + + /** + * Sets the other comboboxes in the list to empty values. + * \n Assigns the selected algorithm to m_arbitraryKeyAlgo. + * @param cmb + */ + void OnComboKeyAlgoSelect(WComboBox * cmb); + /** + * Sets the other comboboxes in the list to empty values. + * \n Assigns the selected algorithm to m_arbitrarySubkeyAlgo. + * @param cmb + */ + void OnComboSubkeyAlgoSelect(WComboBox * cmb); + +}; + +#endif /* POPUPCREATE_H */ + diff --git a/README.md b/README.md index 1f75ca4..31b96f2 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@ It is developed in C++ as a NetBeans project on the [WebToolkit](https://www.webtoolkit.eu/)(Wt) libraries. -It allows to view, import, delete and certify keys. Certification trust level and secret key expiry date can also be changed. -Key generation, exporting keys and adding user identities are not (yet) implemented. +It allows to view, import, create, delete and certify keys. Certification trust level and secret key expiry date can also be changed. +Exporting keys and adding user identities are not (yet) implemented. -These keys can then be used by other Wt applications, or applications based on other libraries, to encrypt and sign data. As such, it suits my personal needs. +These keys can then be used by other Wt applications, or web applications based on other libraries, to encrypt and sign data. As such, it suits my personal needs. K7 is released under the GPL version 2 license. It does not intend nor need to be a full blown key manager. diff --git a/WTAPPROOT/K7/K7.xml b/WTAPPROOT/K7/K7.xml index d32d86f..55907b0 100644 --- a/WTAPPROOT/K7/K7.xml +++ b/WTAPPROOT/K7/K7.xml @@ -7,11 +7,13 @@ Upload Import Delete + Create Sign key Find keys with this pattern Upload a new key Add a new key Delete selected key + Create a pair of keys Sign selected key with your secret key if available Can't upload @@ -112,4 +114,17 @@ Set expiration time failed Close + Name + Email + Default algorithms + Type + Subkey + Key algorithms + An email address is highly recommended + + Email is missing + Select at least a key algorithm + Passphrase missing + Passphrase does not match + Create success : \ No newline at end of file diff --git a/WTAPPROOT/K7/K7_fr.xml b/WTAPPROOT/K7/K7_fr.xml index d82d5ed..e7bb674 100644 --- a/WTAPPROOT/K7/K7_fr.xml +++ b/WTAPPROOT/K7/K7_fr.xml @@ -7,11 +7,13 @@ Télécharger Importer Supprimer + Créer Signer Rechercher des clés correspondant au motif Télécharger une nouvelle clé Ajouter une nouvelle clé au porte clés Supprimer la clé sélectionnée + Créer une paire de clés Signer la clé sélectionnée avec votre clé secrète si elle est disponible Ne peut télécharger @@ -112,4 +114,17 @@ Echec de changement de la date d'expiration Fermer + Nom + Courriel + Algorithmes par défaut + Type + Sous clé + Algorithmes des clés + Une adresse de courriel est fortement recommandée + + Courriel manquant + Sélectionnez un algorithme de clé au moins + Phrase de passe manquante + Les phrases de passe ne sont pas identiques + Création réussie : diff --git a/nbproject/Makefile-ARM-Release.mk b/nbproject/Makefile-ARM-Release.mk index ff9a183..fac73e3 100644 --- a/nbproject/Makefile-ARM-Release.mk +++ b/nbproject/Makefile-ARM-Release.mk @@ -42,6 +42,7 @@ OBJECTFILES= \ ${OBJECTDIR}/KeyEdit.o \ ${OBJECTDIR}/LoopbackPassphraseProvider.o \ ${OBJECTDIR}/PopupCertifyUserId.o \ + ${OBJECTDIR}/PopupCreate.o \ ${OBJECTDIR}/PopupDeleter.o \ ${OBJECTDIR}/PopupExpiryTime.o \ ${OBJECTDIR}/PopupUploader.o \ @@ -110,6 +111,11 @@ ${OBJECTDIR}/PopupCertifyUserId.o: PopupCertifyUserId.cpp ${RM} "$@.d" $(COMPILE.cc) -O2 -s -DLARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -I/usr/local/Wt/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/PopupCertifyUserId.o PopupCertifyUserId.cpp +${OBJECTDIR}/PopupCreate.o: PopupCreate.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} "$@.d" + $(COMPILE.cc) -O2 -s -DLARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -I/usr/local/Wt/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/PopupCreate.o PopupCreate.cpp + ${OBJECTDIR}/PopupDeleter.o: PopupDeleter.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} "$@.d" diff --git a/nbproject/Makefile-Debug.mk b/nbproject/Makefile-Debug.mk index 5777086..9b2653a 100644 --- a/nbproject/Makefile-Debug.mk +++ b/nbproject/Makefile-Debug.mk @@ -42,6 +42,7 @@ OBJECTFILES= \ ${OBJECTDIR}/KeyEdit.o \ ${OBJECTDIR}/LoopbackPassphraseProvider.o \ ${OBJECTDIR}/PopupCertifyUserId.o \ + ${OBJECTDIR}/PopupCreate.o \ ${OBJECTDIR}/PopupDeleter.o \ ${OBJECTDIR}/PopupExpiryTime.o \ ${OBJECTDIR}/PopupUploader.o \ @@ -110,6 +111,11 @@ ${OBJECTDIR}/PopupCertifyUserId.o: PopupCertifyUserId.cpp ${RM} "$@.d" $(COMPILE.cc) -g -DDEVTIME -I/usr/local/Wt-Debug/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/PopupCertifyUserId.o PopupCertifyUserId.cpp +${OBJECTDIR}/PopupCreate.o: PopupCreate.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} "$@.d" + $(COMPILE.cc) -g -DDEVTIME -I/usr/local/Wt-Debug/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/PopupCreate.o PopupCreate.cpp + ${OBJECTDIR}/PopupDeleter.o: PopupDeleter.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} "$@.d" diff --git a/nbproject/Makefile-Release.mk b/nbproject/Makefile-Release.mk index 8b95ec3..a985b53 100644 --- a/nbproject/Makefile-Release.mk +++ b/nbproject/Makefile-Release.mk @@ -42,6 +42,7 @@ OBJECTFILES= \ ${OBJECTDIR}/KeyEdit.o \ ${OBJECTDIR}/LoopbackPassphraseProvider.o \ ${OBJECTDIR}/PopupCertifyUserId.o \ + ${OBJECTDIR}/PopupCreate.o \ ${OBJECTDIR}/PopupDeleter.o \ ${OBJECTDIR}/PopupExpiryTime.o \ ${OBJECTDIR}/PopupUploader.o \ @@ -110,6 +111,11 @@ ${OBJECTDIR}/PopupCertifyUserId.o: PopupCertifyUserId.cpp ${RM} "$@.d" $(COMPILE.cc) -O2 -s -I/usr/local/Wt/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/PopupCertifyUserId.o PopupCertifyUserId.cpp +${OBJECTDIR}/PopupCreate.o: PopupCreate.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} "$@.d" + $(COMPILE.cc) -O2 -s -I/usr/local/Wt/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/PopupCreate.o PopupCreate.cpp + ${OBJECTDIR}/PopupDeleter.o: PopupDeleter.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} "$@.d" diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index 4408b73..ef2a819 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -11,6 +11,7 @@ KeyEdit.h LoopbackPassphraseProvider.h PopupCertifyUserId.h + PopupCreate.h PopupDeleter.h PopupExpiryTime.h PopupUploader.h @@ -37,6 +38,7 @@ KeyEdit.cpp LoopbackPassphraseProvider.cpp PopupCertifyUserId.cpp + PopupCreate.cpp PopupDeleter.cpp PopupExpiryTime.cpp PopupUploader.cpp @@ -127,6 +129,10 @@ + + + + @@ -231,6 +237,10 @@ + + + + @@ -339,6 +349,10 @@ + + + +