Allow to create keys.
A popup shows required parameters. Created keys are added to the list of secret keys managed by the user.
This commit is contained in:
73
K7Main.cpp
73
K7Main.cpp
@@ -29,6 +29,7 @@ K7Main::K7Main(const WEnvironment& env)
|
|||||||
{
|
{
|
||||||
m_config = NULL;
|
m_config = NULL;
|
||||||
m_btnUpload = NULL; m_btnImport = NULL; m_btnDelete = NULL;
|
m_btnUpload = NULL; m_btnImport = NULL; m_btnDelete = NULL;
|
||||||
|
m_btnCreate = NULL; m_popupCreate = NULL;
|
||||||
WApplication::setTitle(_APPNAME_);
|
WApplication::setTitle(_APPNAME_);
|
||||||
const WString bundle = WApplication::appRoot() + _APPNAME_;
|
const WString bundle = WApplication::appRoot() + _APPNAME_;
|
||||||
WApplication::instance()->messageResourceBundle().use(bundle.toUTF8());
|
WApplication::instance()->messageResourceBundle().use(bundle.toUTF8());
|
||||||
@@ -70,7 +71,7 @@ K7Main::K7Main(const WEnvironment& env)
|
|||||||
K7Main::~K7Main()
|
K7Main::~K7Main()
|
||||||
{
|
{
|
||||||
delete m_config; delete m_uploader; delete m_deleter;
|
delete m_config; delete m_uploader; delete m_deleter;
|
||||||
delete m_keyEdit;
|
delete m_keyEdit; delete m_popupCreate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -137,7 +138,14 @@ K7Main::Create()
|
|||||||
m_btnDelete->clicked().connect(this, &K7Main::PopupDeleter);
|
m_btnDelete->clicked().connect(this, &K7Main::PopupDeleter);
|
||||||
m_btnDelete->hide();
|
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<WPushButton> (m_btnCreate));
|
||||||
|
m_btnCreate->clicked().connect(this, &K7Main::ShowPopupCreate);
|
||||||
|
}
|
||||||
grlMain->addWidget(unique_ptr<WContainerWidget> (cwButtons), 1, 1);
|
grlMain->addWidget(unique_ptr<WContainerWidget> (cwButtons), 1, 1);
|
||||||
|
|
||||||
// Add and hide detail tables
|
// Add and hide detail tables
|
||||||
@@ -523,3 +531,64 @@ void K7Main::DoDeleteKey() {
|
|||||||
m_leSearch->setText(fpr);
|
m_leSearch->setText(fpr);
|
||||||
Search();
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
11
K7Main.h
11
K7Main.h
@@ -24,6 +24,7 @@
|
|||||||
#include "AppConfig.h"
|
#include "AppConfig.h"
|
||||||
#include "PopupUploader.h"
|
#include "PopupUploader.h"
|
||||||
#include "PopupDeleter.h"
|
#include "PopupDeleter.h"
|
||||||
|
#include "PopupCreate.h"
|
||||||
#include "TransientMessageWidget.h"
|
#include "TransientMessageWidget.h"
|
||||||
#include "KeyEdit.h"
|
#include "KeyEdit.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
@@ -54,12 +55,14 @@ private:
|
|||||||
WPushButton * m_btnUpload;
|
WPushButton * m_btnUpload;
|
||||||
WPushButton * m_btnImport;
|
WPushButton * m_btnImport;
|
||||||
WPushButton * m_btnDelete ;
|
WPushButton * m_btnDelete ;
|
||||||
|
WPushButton * m_btnCreate ;
|
||||||
WTreeTable * m_ttbKeys;
|
WTreeTable * m_ttbKeys;
|
||||||
WTreeTable * m_ttbUids;
|
WTreeTable * m_ttbUids;
|
||||||
WTreeTable * m_ttbSubKeys;
|
WTreeTable * m_ttbSubKeys;
|
||||||
Uploader * m_uploader;
|
Uploader * m_uploader;
|
||||||
Deleter * m_deleter;
|
Deleter * m_deleter;
|
||||||
KeyEdit * m_keyEdit;
|
KeyEdit * m_keyEdit;
|
||||||
|
PopupCreate * m_popupCreate;
|
||||||
/**
|
/**
|
||||||
* Finds public keys as per criteria,
|
* Finds public keys as per criteria,
|
||||||
* and private keys if any is declared in config file for current client.
|
* and private keys if any is declared in config file for current client.
|
||||||
@@ -121,6 +124,14 @@ private:
|
|||||||
* Translates unit time to readable date.
|
* Translates unit time to readable date.
|
||||||
*/
|
*/
|
||||||
WString MakeDateTimeLabel(time_t ticks);
|
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 */
|
#endif /* K7MAIN_H */
|
||||||
|
|||||||
258
PopupCreate.cpp
Normal file
258
PopupCreate.cpp
Normal file
@@ -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 <Wt/WVBoxLayout.h>
|
||||||
|
#include <Wt/WHBoxLayout.h>
|
||||||
|
#include <Wt/WGridLayout.h>
|
||||||
|
#include <Wt/WText.h>
|
||||||
|
|
||||||
|
PopupCreate::PopupCreate(WWidget * anchorWidget,
|
||||||
|
TransientMessageWidget * txtMessage, const WLength& width)
|
||||||
|
: WPopupWidget(cpp14::make_unique<WContainerWidget>())
|
||||||
|
{
|
||||||
|
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<WContainerWidget*> (implementation());
|
||||||
|
m_cwMain->setStyleClass("popup");
|
||||||
|
WVBoxLayout * vblMain = new WVBoxLayout();
|
||||||
|
m_cwMain->setLayout(unique_ptr<WVBoxLayout> (vblMain));
|
||||||
|
WGridLayout * grlOther = new WGridLayout();
|
||||||
|
grlOther->setColumnStretch(1, 1);
|
||||||
|
vblMain->addLayout(unique_ptr<WGridLayout> (grlOther));
|
||||||
|
|
||||||
|
WText * lblName = new WText(TR("Name"));
|
||||||
|
grlOther->addWidget(unique_ptr<WText> (lblName), 0, 0);
|
||||||
|
m_leName = new WLineEdit();
|
||||||
|
grlOther->addWidget(unique_ptr<WLineEdit> (m_leName), 0, 1);
|
||||||
|
WText * lblEmail = new WText(TR("Email"));
|
||||||
|
grlOther->addWidget(unique_ptr<WText> (lblEmail), 1, 0);
|
||||||
|
m_leEmail = new WLineEdit();
|
||||||
|
m_leEmail->setToolTip(TR("TTTEmailRecommended"));
|
||||||
|
grlOther->addWidget(unique_ptr<WLineEdit> (m_leEmail), 1, 1);
|
||||||
|
WText * lblComment = new WText(TR("Comment"));
|
||||||
|
grlOther->addWidget(unique_ptr<WText> (lblComment), 2, 0);
|
||||||
|
m_leComment = new WLineEdit();
|
||||||
|
grlOther->addWidget(unique_ptr<WLineEdit> (m_leComment), 2, 1);
|
||||||
|
WText * lblExpiry = new WText(TR("Expiration"));
|
||||||
|
grlOther->addWidget(unique_ptr<WText> (lblExpiry), 3, 0);
|
||||||
|
m_deExpiry = new WDateEdit();
|
||||||
|
grlOther->addWidget(unique_ptr<WDateEdit> (m_deExpiry), 3, 1);
|
||||||
|
m_cbDefaultAlgo = new WCheckBox(TR("DefaultAlgo"));
|
||||||
|
grlOther->addWidget(unique_ptr<WCheckBox> (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<WGridLayout> (grlAlgo));
|
||||||
|
grlAlgo->setColumnStretch(0, 1);
|
||||||
|
grlAlgo->setColumnStretch(1, 1);
|
||||||
|
vblMain->addWidget(unique_ptr<WContainerWidget> (cwAlgo));
|
||||||
|
WText * lblKey = new WText(TR("Key"));
|
||||||
|
grlAlgo->addWidget(unique_ptr<WText> (lblKey), 0, 0);
|
||||||
|
WText * lblSubkey = new WText(TR("Subkey"));
|
||||||
|
grlAlgo->addWidget(unique_ptr<WText> (lblSubkey), 0, 1);
|
||||||
|
WComboBox * cmbKeyRSA = new WComboBox();
|
||||||
|
cmbKeyRSA->setToolTip("RSA");
|
||||||
|
grlAlgo->addWidget(unique_ptr<WComboBox> (cmbKeyRSA), 1, 0);
|
||||||
|
WComboBox * cmbSubkeyRSA = new WComboBox();
|
||||||
|
cmbSubkeyRSA->setToolTip("RSA");
|
||||||
|
grlAlgo->addWidget(unique_ptr<WComboBox> (cmbSubkeyRSA), 1, 1);
|
||||||
|
WComboBox * cmbKeyDSA = new WComboBox();
|
||||||
|
cmbKeyDSA->setToolTip("DSA");
|
||||||
|
grlAlgo->addWidget(unique_ptr<WComboBox> (cmbKeyDSA), 2, 0);
|
||||||
|
WComboBox * cmbSubkeyDSA = new WComboBox();
|
||||||
|
cmbSubkeyDSA->setToolTip("Elgamal");
|
||||||
|
grlAlgo->addWidget(unique_ptr<WComboBox> (cmbSubkeyDSA), 2, 1);
|
||||||
|
WComboBox * cmbKeyECDSA = new WComboBox();
|
||||||
|
cmbKeyECDSA->setToolTip("ECDSA/EdDSA");
|
||||||
|
grlAlgo->addWidget(unique_ptr<WComboBox> (cmbKeyECDSA), 3, 0);
|
||||||
|
WComboBox * cmbSubkeyECDSA = new WComboBox();
|
||||||
|
cmbSubkeyECDSA->setToolTip("ECDH");
|
||||||
|
grlAlgo->addWidget(unique_ptr<WComboBox> (cmbSubkeyECDSA), 3, 1);
|
||||||
|
|
||||||
|
WGridLayout * grlPassphrase = new WGridLayout();
|
||||||
|
grlPassphrase->setColumnStretch(1, 1);
|
||||||
|
vblMain->addLayout(unique_ptr<WGridLayout> (grlPassphrase));
|
||||||
|
WText * lblPassphrase = new WText(TR("Passphrase"));
|
||||||
|
grlPassphrase->addWidget(unique_ptr<WText> (lblPassphrase), 0, 0);
|
||||||
|
m_lePassphrase = new WLineEdit();
|
||||||
|
m_lePassphrase->setEchoMode(EchoMode::Password);
|
||||||
|
grlPassphrase->addWidget(unique_ptr<WLineEdit> (m_lePassphrase), 0, 1);
|
||||||
|
WText * lblConfirm = new WText(TR("Confirm"));
|
||||||
|
grlPassphrase->addWidget(unique_ptr<WText> (lblConfirm), 1, 0);
|
||||||
|
m_leConfirm = new WLineEdit();
|
||||||
|
m_leConfirm->setEchoMode(EchoMode::Password);
|
||||||
|
grlPassphrase->addWidget(unique_ptr<WLineEdit> (m_leConfirm), 1, 1);
|
||||||
|
|
||||||
|
WHBoxLayout * hblButtons = new WHBoxLayout();
|
||||||
|
WPushButton * btnClose = new WPushButton(TR("Close"));
|
||||||
|
hblButtons->addWidget(unique_ptr<WPushButton> (btnClose));
|
||||||
|
m_btnApply = new WPushButton(TR("Apply"));
|
||||||
|
hblButtons->addWidget(unique_ptr<WPushButton> (m_btnApply));
|
||||||
|
vblMain->addLayout(unique_ptr<WHBoxLayout> (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<WComboBox*>::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<WComboBox*>::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<WComboBox*>::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<WComboBox*>::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;
|
||||||
|
}
|
||||||
|
}
|
||||||
160
PopupCreate.h
Normal file
160
PopupCreate.h
Normal file
@@ -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 <Wt/WPopupWidget.h>
|
||||||
|
#include <Wt/WContainerWidget.h>
|
||||||
|
#include <Wt/WLineEdit.h>
|
||||||
|
#include <Wt/WCheckBox.h>
|
||||||
|
#include <Wt/WDateEdit.h>
|
||||||
|
#include <Wt/WComboBox.h>
|
||||||
|
#include <Wt/WPushButton.h>
|
||||||
|
#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
|
||||||
|
* <ul>
|
||||||
|
* <li>an email address</li>
|
||||||
|
* <li>a passphrase</li>
|
||||||
|
* <li>a passphrase confirmation</li>
|
||||||
|
* <li>a key algorithm</li>
|
||||||
|
* </ul>
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
bool Validate() const;
|
||||||
|
/**
|
||||||
|
* If completely is false :
|
||||||
|
* <ul>
|
||||||
|
* <li>name</li>
|
||||||
|
* <li>email</li>
|
||||||
|
* <li>comment</li>
|
||||||
|
* <li>password fields</li>
|
||||||
|
* </ul>
|
||||||
|
* 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<WComboBox*> m_cmbKeyAlgo;
|
||||||
|
list<WComboBox*> 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 */
|
||||||
|
|
||||||
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
It is developed in C++ as a NetBeans project on the [WebToolkit](https://www.webtoolkit.eu/)(Wt) libraries.
|
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.
|
It allows to view, import, create, 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.
|
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.
|
K7 is released under the GPL version 2 license. It does not intend nor need to be a full blown key manager.
|
||||||
|
|
||||||
|
|||||||
@@ -7,11 +7,13 @@
|
|||||||
<message id='Upload'>Upload</message>
|
<message id='Upload'>Upload</message>
|
||||||
<message id='Import'>Import</message>
|
<message id='Import'>Import</message>
|
||||||
<message id='Delete'>Delete</message>
|
<message id='Delete'>Delete</message>
|
||||||
|
<message id='Create'>Create</message>
|
||||||
<message id='SignKey'>Sign key</message>
|
<message id='SignKey'>Sign key</message>
|
||||||
<message id='TTTSearch'>Find keys with this pattern</message>
|
<message id='TTTSearch'>Find keys with this pattern</message>
|
||||||
<message id='TTTUpload'>Upload a new key</message>
|
<message id='TTTUpload'>Upload a new key</message>
|
||||||
<message id='TTTImport'>Add a new key</message>
|
<message id='TTTImport'>Add a new key</message>
|
||||||
<message id='TTTDelete'>Delete selected key</message>
|
<message id='TTTDelete'>Delete selected key</message>
|
||||||
|
<message id='TTTCreate'>Create a pair of keys</message>
|
||||||
<message id='TTTSignKey'>Sign selected key with your secret key if available</message>
|
<message id='TTTSignKey'>Sign selected key with your secret key if available</message>
|
||||||
<message id='CantUpload'>Can't upload</message>
|
<message id='CantUpload'>Can't upload</message>
|
||||||
|
|
||||||
@@ -112,4 +114,17 @@
|
|||||||
<message id='SetExpirationTimeFailure'>Set expiration time failed</message>
|
<message id='SetExpirationTimeFailure'>Set expiration time failed</message>
|
||||||
<message id='Close'>Close</message>
|
<message id='Close'>Close</message>
|
||||||
|
|
||||||
|
<message id='Name'>Name</message>
|
||||||
|
<message id='Email'>Email</message>
|
||||||
|
<message id='DefaultAlgo'>Default algorithms</message>
|
||||||
|
<message id='Type'>Type</message>
|
||||||
|
<message id='Subkey'>Subkey</message>
|
||||||
|
<message id='TTTKeyAlgo'>Key algorithms</message>
|
||||||
|
<message id='TTTEmailRecommended'>An email address is highly recommended</message>
|
||||||
|
|
||||||
|
<message id='ValidateEmailMissing'>Email is missing</message>
|
||||||
|
<message id='ValidateKeyAlgoMissing'>Select at least a key algorithm</message>
|
||||||
|
<message id='ValidatePassphraseMissing'>Passphrase missing</message>
|
||||||
|
<message id='ValidatePassphraseNoMatch'>Passphrase does not match</message>
|
||||||
|
<message id='CreateSuccess'>Create success : </message>
|
||||||
</messages>
|
</messages>
|
||||||
@@ -7,11 +7,13 @@
|
|||||||
<message id='Upload'>Télécharger</message>
|
<message id='Upload'>Télécharger</message>
|
||||||
<message id='Import'>Importer</message>
|
<message id='Import'>Importer</message>
|
||||||
<message id='Delete'>Supprimer</message>
|
<message id='Delete'>Supprimer</message>
|
||||||
|
<message id='Create'>Créer</message>
|
||||||
<message id='SignKey'>Signer</message>
|
<message id='SignKey'>Signer</message>
|
||||||
<message id='TTTSearch'>Rechercher des clés correspondant au motif</message>
|
<message id='TTTSearch'>Rechercher des clés correspondant au motif</message>
|
||||||
<message id='TTTUpload'>Télécharger une nouvelle clé</message>
|
<message id='TTTUpload'>Télécharger une nouvelle clé</message>
|
||||||
<message id='TTTImport'>Ajouter une nouvelle clé au porte clés</message>
|
<message id='TTTImport'>Ajouter une nouvelle clé au porte clés</message>
|
||||||
<message id='TTTDelete'>Supprimer la clé sélectionnée</message>
|
<message id='TTTDelete'>Supprimer la clé sélectionnée</message>
|
||||||
|
<message id='TTTCreate'>Créer une paire de clés</message>
|
||||||
<message id='TTTSignKey'>Signer la clé sélectionnée avec votre clé secrète si elle est disponible</message>
|
<message id='TTTSignKey'>Signer la clé sélectionnée avec votre clé secrète si elle est disponible</message>
|
||||||
<message id='CantUpload'>Ne peut télécharger</message>
|
<message id='CantUpload'>Ne peut télécharger</message>
|
||||||
|
|
||||||
@@ -112,4 +114,17 @@
|
|||||||
<message id='SetExpirationTimeFailure'>Echec de changement de la date d'expiration</message>
|
<message id='SetExpirationTimeFailure'>Echec de changement de la date d'expiration</message>
|
||||||
<message id='Close'>Fermer</message>
|
<message id='Close'>Fermer</message>
|
||||||
|
|
||||||
|
<message id='Name'>Nom</message>
|
||||||
|
<message id='Email'>Courriel</message>
|
||||||
|
<message id='DefaultAlgo'>Algorithmes par défaut</message>
|
||||||
|
<message id='Type'>Type</message>
|
||||||
|
<message id='Subkey'>Sous clé</message>
|
||||||
|
<message id='TTTKeyAlgo'>Algorithmes des clés</message>
|
||||||
|
<message id='TTTEmailRecommended'>Une adresse de courriel est fortement recommandée</message>
|
||||||
|
|
||||||
|
<message id='ValidateEmailMissing'>Courriel manquant</message>
|
||||||
|
<message id='ValidateKeyAlgoMissing'>Sélectionnez un algorithme de clé au moins</message>
|
||||||
|
<message id='ValidatePassphraseMissing'>Phrase de passe manquante</message>
|
||||||
|
<message id='ValidatePassphraseNoMatch'>Les phrases de passe ne sont pas identiques</message>
|
||||||
|
<message id='CreateSuccess'>Création réussie : </message>
|
||||||
</messages>
|
</messages>
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ OBJECTFILES= \
|
|||||||
${OBJECTDIR}/KeyEdit.o \
|
${OBJECTDIR}/KeyEdit.o \
|
||||||
${OBJECTDIR}/LoopbackPassphraseProvider.o \
|
${OBJECTDIR}/LoopbackPassphraseProvider.o \
|
||||||
${OBJECTDIR}/PopupCertifyUserId.o \
|
${OBJECTDIR}/PopupCertifyUserId.o \
|
||||||
|
${OBJECTDIR}/PopupCreate.o \
|
||||||
${OBJECTDIR}/PopupDeleter.o \
|
${OBJECTDIR}/PopupDeleter.o \
|
||||||
${OBJECTDIR}/PopupExpiryTime.o \
|
${OBJECTDIR}/PopupExpiryTime.o \
|
||||||
${OBJECTDIR}/PopupUploader.o \
|
${OBJECTDIR}/PopupUploader.o \
|
||||||
@@ -110,6 +111,11 @@ ${OBJECTDIR}/PopupCertifyUserId.o: PopupCertifyUserId.cpp
|
|||||||
${RM} "$@.d"
|
${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
|
$(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
|
${OBJECTDIR}/PopupDeleter.o: PopupDeleter.cpp
|
||||||
${MKDIR} -p ${OBJECTDIR}
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
${RM} "$@.d"
|
${RM} "$@.d"
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ OBJECTFILES= \
|
|||||||
${OBJECTDIR}/KeyEdit.o \
|
${OBJECTDIR}/KeyEdit.o \
|
||||||
${OBJECTDIR}/LoopbackPassphraseProvider.o \
|
${OBJECTDIR}/LoopbackPassphraseProvider.o \
|
||||||
${OBJECTDIR}/PopupCertifyUserId.o \
|
${OBJECTDIR}/PopupCertifyUserId.o \
|
||||||
|
${OBJECTDIR}/PopupCreate.o \
|
||||||
${OBJECTDIR}/PopupDeleter.o \
|
${OBJECTDIR}/PopupDeleter.o \
|
||||||
${OBJECTDIR}/PopupExpiryTime.o \
|
${OBJECTDIR}/PopupExpiryTime.o \
|
||||||
${OBJECTDIR}/PopupUploader.o \
|
${OBJECTDIR}/PopupUploader.o \
|
||||||
@@ -110,6 +111,11 @@ ${OBJECTDIR}/PopupCertifyUserId.o: PopupCertifyUserId.cpp
|
|||||||
${RM} "$@.d"
|
${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
|
$(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
|
${OBJECTDIR}/PopupDeleter.o: PopupDeleter.cpp
|
||||||
${MKDIR} -p ${OBJECTDIR}
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
${RM} "$@.d"
|
${RM} "$@.d"
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ OBJECTFILES= \
|
|||||||
${OBJECTDIR}/KeyEdit.o \
|
${OBJECTDIR}/KeyEdit.o \
|
||||||
${OBJECTDIR}/LoopbackPassphraseProvider.o \
|
${OBJECTDIR}/LoopbackPassphraseProvider.o \
|
||||||
${OBJECTDIR}/PopupCertifyUserId.o \
|
${OBJECTDIR}/PopupCertifyUserId.o \
|
||||||
|
${OBJECTDIR}/PopupCreate.o \
|
||||||
${OBJECTDIR}/PopupDeleter.o \
|
${OBJECTDIR}/PopupDeleter.o \
|
||||||
${OBJECTDIR}/PopupExpiryTime.o \
|
${OBJECTDIR}/PopupExpiryTime.o \
|
||||||
${OBJECTDIR}/PopupUploader.o \
|
${OBJECTDIR}/PopupUploader.o \
|
||||||
@@ -110,6 +111,11 @@ ${OBJECTDIR}/PopupCertifyUserId.o: PopupCertifyUserId.cpp
|
|||||||
${RM} "$@.d"
|
${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
|
$(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
|
${OBJECTDIR}/PopupDeleter.o: PopupDeleter.cpp
|
||||||
${MKDIR} -p ${OBJECTDIR}
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
${RM} "$@.d"
|
${RM} "$@.d"
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
<itemPath>KeyEdit.h</itemPath>
|
<itemPath>KeyEdit.h</itemPath>
|
||||||
<itemPath>LoopbackPassphraseProvider.h</itemPath>
|
<itemPath>LoopbackPassphraseProvider.h</itemPath>
|
||||||
<itemPath>PopupCertifyUserId.h</itemPath>
|
<itemPath>PopupCertifyUserId.h</itemPath>
|
||||||
|
<itemPath>PopupCreate.h</itemPath>
|
||||||
<itemPath>PopupDeleter.h</itemPath>
|
<itemPath>PopupDeleter.h</itemPath>
|
||||||
<itemPath>PopupExpiryTime.h</itemPath>
|
<itemPath>PopupExpiryTime.h</itemPath>
|
||||||
<itemPath>PopupUploader.h</itemPath>
|
<itemPath>PopupUploader.h</itemPath>
|
||||||
@@ -37,6 +38,7 @@
|
|||||||
<itemPath>KeyEdit.cpp</itemPath>
|
<itemPath>KeyEdit.cpp</itemPath>
|
||||||
<itemPath>LoopbackPassphraseProvider.cpp</itemPath>
|
<itemPath>LoopbackPassphraseProvider.cpp</itemPath>
|
||||||
<itemPath>PopupCertifyUserId.cpp</itemPath>
|
<itemPath>PopupCertifyUserId.cpp</itemPath>
|
||||||
|
<itemPath>PopupCreate.cpp</itemPath>
|
||||||
<itemPath>PopupDeleter.cpp</itemPath>
|
<itemPath>PopupDeleter.cpp</itemPath>
|
||||||
<itemPath>PopupExpiryTime.cpp</itemPath>
|
<itemPath>PopupExpiryTime.cpp</itemPath>
|
||||||
<itemPath>PopupUploader.cpp</itemPath>
|
<itemPath>PopupUploader.cpp</itemPath>
|
||||||
@@ -127,6 +129,10 @@
|
|||||||
</item>
|
</item>
|
||||||
<item path="PopupCertifyUserId.h" ex="false" tool="3" flavor2="0">
|
<item path="PopupCertifyUserId.h" ex="false" tool="3" flavor2="0">
|
||||||
</item>
|
</item>
|
||||||
|
<item path="PopupCreate.cpp" ex="false" tool="1" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="PopupCreate.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
<item path="PopupDeleter.cpp" ex="false" tool="1" flavor2="0">
|
<item path="PopupDeleter.cpp" ex="false" tool="1" flavor2="0">
|
||||||
</item>
|
</item>
|
||||||
<item path="PopupDeleter.h" ex="false" tool="3" flavor2="0">
|
<item path="PopupDeleter.h" ex="false" tool="3" flavor2="0">
|
||||||
@@ -231,6 +237,10 @@
|
|||||||
</item>
|
</item>
|
||||||
<item path="PopupCertifyUserId.h" ex="false" tool="3" flavor2="0">
|
<item path="PopupCertifyUserId.h" ex="false" tool="3" flavor2="0">
|
||||||
</item>
|
</item>
|
||||||
|
<item path="PopupCreate.cpp" ex="false" tool="1" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="PopupCreate.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
<item path="PopupDeleter.cpp" ex="false" tool="1" flavor2="0">
|
<item path="PopupDeleter.cpp" ex="false" tool="1" flavor2="0">
|
||||||
</item>
|
</item>
|
||||||
<item path="PopupDeleter.h" ex="false" tool="3" flavor2="0">
|
<item path="PopupDeleter.h" ex="false" tool="3" flavor2="0">
|
||||||
@@ -339,6 +349,10 @@
|
|||||||
</item>
|
</item>
|
||||||
<item path="PopupCertifyUserId.h" ex="false" tool="3" flavor2="0">
|
<item path="PopupCertifyUserId.h" ex="false" tool="3" flavor2="0">
|
||||||
</item>
|
</item>
|
||||||
|
<item path="PopupCreate.cpp" ex="false" tool="1" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="PopupCreate.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
<item path="PopupDeleter.cpp" ex="false" tool="1" flavor2="0">
|
<item path="PopupDeleter.cpp" ex="false" tool="1" flavor2="0">
|
||||||
</item>
|
</item>
|
||||||
<item path="PopupDeleter.h" ex="false" tool="3" flavor2="0">
|
<item path="PopupDeleter.h" ex="false" tool="3" flavor2="0">
|
||||||
|
|||||||
Reference in New Issue
Block a user