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:
SET
2020-11-13 18:28:17 +01:00
parent b9b4396b12
commit 1b73407db2
11 changed files with 565 additions and 5 deletions

View File

@@ -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();
}
}

View File

@@ -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
View 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
View 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 */

View File

@@ -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.

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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">