From f5416addc0b18cb69748abd7d5016bb530ec57a8 Mon Sep 17 00:00:00 2001 From: SET Date: Tue, 3 Nov 2020 22:48:31 +0100 Subject: [PATCH] Create and use a sensitive WText in some tree table nodes. It may be of interest to copy WTreeTableNode items text content. These cannot be selected with the mouse for copy to clipboard. The text is here shown read-only in an extended auto-replaced WLineEdit. --- K7Main.cpp | 19 ++++--- SensitiveTreeTableNodeText.cpp | 90 +++++++++++++++++++++++++++++++ SensitiveTreeTableNodeText.h | 73 +++++++++++++++++++++++++ WTAPPROOT/K7/K7.xml | 2 + WTAPPROOT/K7/K7_fr.xml | 2 + nbproject/Makefile-ARM-Release.mk | 6 +++ nbproject/Makefile-Debug.mk | 6 +++ nbproject/Makefile-Release.mk | 6 +++ nbproject/configurations.xml | 14 +++++ 9 files changed, 212 insertions(+), 6 deletions(-) create mode 100644 SensitiveTreeTableNodeText.cpp create mode 100644 SensitiveTreeTableNodeText.h diff --git a/K7Main.cpp b/K7Main.cpp index 81f004b..53ea50e 100644 --- a/K7Main.cpp +++ b/K7Main.cpp @@ -20,6 +20,7 @@ #include "GpgMEWorker.h" #include "GpgMECWorker.h" #include "Tools.h" +#include "SensitiveTreeTableNodeText.h" using namespace std; @@ -267,7 +268,8 @@ void K7Main::DisplayKeys(const vector& kList, const WString& grpLabe } } keyNode->setColumnWidget(2, unique_ptr (lblOwnerTrust)); - keyNode->setColumnWidget(3, cpp14::make_unique (k.primaryFingerprint())); + TreeTableNodeText * ttntFpr = new TreeTableNodeText(k.primaryFingerprint(), keyNode, 3); + keyNode->setColumnWidget(3, unique_ptr (ttntFpr)); grpNode->addChildNode(unique_ptr (keyNode)); } if (expand) @@ -315,7 +317,8 @@ void K7Main::DisplayUids(const WString& fullKeyID, bool secret) { UserID uid = k.userID(i); WTreeTableNode * uidNode = new WTreeTableNode(uid.name()); - uidNode->setColumnWidget(1, cpp14::make_unique (uid.email())); + TreeTableNodeText * ttntUidEmail = new TreeTableNodeText(uid.email(), uidNode, 1); + uidNode->setColumnWidget(1, unique_ptr (ttntUidEmail)); // Show key certify popup on double click WText * lblUidValidity = new WText(UidValidities[uid.validity()]); if (m_config->CanEditUidValidity()) { @@ -323,7 +326,8 @@ void K7Main::DisplayUids(const WString& fullKeyID, bool secret) lblUidValidity->doubleClicked().connect(std::bind(&KeyEdit::OnUidValidityClicked, m_keyEdit, uidNode, privateKeys, WString(k.primaryFingerprint()))); } uidNode->setColumnWidget(2, unique_ptr (lblUidValidity)); - uidNode->setColumnWidget(3, cpp14::make_unique (uid.comment())); + TreeTableNodeText * ttntUidComment = new TreeTableNodeText(uid.comment(), uidNode, 3); + uidNode->setColumnWidget(3, unique_ptr (ttntUidComment)); rootNode->addChildNode(unique_ptr (uidNode)); // uid.numSignatures() is always 0, even for signed keys ! for (uint s = 0; s < uid.numSignatures(); s++) @@ -332,11 +336,13 @@ void K7Main::DisplayUids(const WString& fullKeyID, bool secret) const WString signer = WString(sig.signerName()) + _SPACE_ + WString(sig.signerKeyID()); WTreeTableNode * sigNode = new WTreeTableNode(signer); - sigNode->setColumnWidget(1, cpp14::make_unique (sig.signerEmail())); + TreeTableNodeText * ttntEmail = new TreeTableNodeText(sig.signerEmail(), sigNode, 1); + sigNode->setColumnWidget(1, unique_ptr (ttntEmail)); WString exp = TR("Expiration") + _SPACE_ + _COLON_ + _SPACE_; exp += sig.neverExpires() ? TR("Never") : MakeDateTimeLabel(sig.expirationTime()); sigNode->setColumnWidget(2, cpp14::make_unique (exp)); - sigNode->setColumnWidget(3, cpp14::make_unique (sig.signerComment())); + TreeTableNodeText * ttntComment = new TreeTableNodeText(sig.signerComment(), sigNode, 3); + sigNode->setColumnWidget(3, unique_ptr (ttntComment)); uidNode->addChild(unique_ptr (sigNode)); } } @@ -370,7 +376,8 @@ void K7Main::DisplaySubKeys(const WString& fullKeyID, bool secret) { Subkey sk = k.subkey(i); WTreeTableNode * skNode = new WTreeTableNode(sk.keyID()); - skNode->setColumnWidget(1, cpp14::make_unique (sk.fingerprint())); + TreeTableNodeText * ttntFpr = new TreeTableNodeText(sk.fingerprint(), skNode, 1); + skNode->setColumnWidget(1, unique_ptr (ttntFpr)); WString exp = sk.neverExpires() ? TR("Never") : MakeDateTimeLabel(sk.expirationTime()); skNode->setColumnWidget(2, cpp14::make_unique (exp)); WString usage = sk.canAuthenticate() ? WString("A") : WString::Empty; diff --git a/SensitiveTreeTableNodeText.cpp b/SensitiveTreeTableNodeText.cpp new file mode 100644 index 0000000..d56c212 --- /dev/null +++ b/SensitiveTreeTableNodeText.cpp @@ -0,0 +1,90 @@ +/* + * File: SensitiveTreeTableNodeText.cpp + * Author: SET - nmset@yandex.com + * License : LGPL v2.1 + * Copyright SET - © 2019 + * + * Created on November 3, 2020, 8:26 PM + */ + +#include "SensitiveTreeTableNodeText.h" +#include + +using namespace std; + +TreeTableNodeText::TreeTableNodeText(WTreeTableNode * node, uint colIndex) +: WText() +{ + Init(node, colIndex); +} + +TreeTableNodeText::~TreeTableNodeText() +{ +} + +TreeTableNodeText::TreeTableNodeText(const WString& text, + WTreeTableNode * node, uint colIndex) +: WText(text) +{ + Init(node, colIndex); +} + +TreeTableNodeText::TreeTableNodeText(const WString& text, TextFormat textFormat, + WTreeTableNode * node, uint colIndex) +: WText(text, textFormat) +{ + Init(node, colIndex); +} + +void TreeTableNodeText::Init(WTreeTableNode * node, uint colIndex) +{ + m_node = node; + m_colIndex = colIndex; + m_lineEdit = NULL; + clicked().connect(this, &TreeTableNodeText::OnClick); + setToolTip(WString::tr("PrepareCopy")); +} + +void TreeTableNodeText::OnClick() +{ + m_lineEdit = new TreeTableNodeLineEdit(text(), m_node, m_colIndex); + m_lineEdit->setReadOnly(true); + m_lineEdit->blurred().connect(m_lineEdit, &TreeTableNodeLineEdit::OnBlurred); + m_lineEdit->setSelection(0, text().toUTF8().length()); + m_node->setColumnWidget(m_colIndex, unique_ptr (m_lineEdit)); + m_lineEdit->setFocus(true); // +++ +} + +/////////////////////////////////////////////////////////////////////////////// + +TreeTableNodeLineEdit::TreeTableNodeLineEdit(WTreeTableNode* node, uint colIndex) +: WLineEdit() +{ + Init(node, colIndex); +} + +TreeTableNodeLineEdit::~TreeTableNodeLineEdit() +{ +} + +TreeTableNodeLineEdit::TreeTableNodeLineEdit(const WString& content, + WTreeTableNode* node, uint colIndex) +: WLineEdit(content) +{ + Init(node, colIndex); +} + +void TreeTableNodeLineEdit::Init(WTreeTableNode* node, uint colIndex) +{ + m_node = node; + m_colIndex = colIndex; + m_text = NULL; + clicked().connect(this, &TreeTableNodeLineEdit::OnBlurred); +} + +void TreeTableNodeLineEdit::OnBlurred() +{ + m_text = new TreeTableNodeText(text(), m_node, m_colIndex); + m_text->clicked().connect(m_text, &TreeTableNodeText::OnClick); + m_node->setColumnWidget(m_colIndex, unique_ptr (m_text)); +} diff --git a/SensitiveTreeTableNodeText.h b/SensitiveTreeTableNodeText.h new file mode 100644 index 0000000..f716ad4 --- /dev/null +++ b/SensitiveTreeTableNodeText.h @@ -0,0 +1,73 @@ +/* + * File: SensitiveTreeTableNodeText.h + * Author: SET - nmset@yandex.com + * License : LGPL v2.1 + * Copyright SET - © 2019 + * + * Created on November 3, 2020, 8:26 PM + */ + +#ifndef TREETABLENODETEXT_H +#define TREETABLENODETEXT_H + +#include +#include +#include + +using namespace Wt; + +class TreeTableNodeText; +class TreeTableNodeLineEdit; + +/** + * An extended WText in a WTreeTableNode. + * It is replaced by a TreeTableNodeLineEdit on click. + * \n This allows to copy the text to clipboard. + */ +class TreeTableNodeText : public WText +{ +public: + TreeTableNodeText(WTreeTableNode * node, uint colIndex); + TreeTableNodeText(const WString& text, + WTreeTableNode * node, uint colIndex); + TreeTableNodeText(const WString& text, TextFormat textFormat, + WTreeTableNode * node, uint colIndex); + virtual ~TreeTableNodeText(); + /** + * Creates a read-only TreeTableNodeLineEdit replacing this + * TreeTableNodeText. + */ + void OnClick(); +private: + WTreeTableNode * m_node; + uint m_colIndex; + TreeTableNodeLineEdit * m_lineEdit; + + void Init(WTreeTableNode * node, uint colIndex); +}; + +/** + * An extended WLineEdit replacing a WText in a WTreeTableNode. + * Switches back to a WTreeTableNodeText when it loses focus. + */ +class TreeTableNodeLineEdit : public WLineEdit +{ +public: + TreeTableNodeLineEdit(WTreeTableNode * node, uint colIndex); + TreeTableNodeLineEdit(const WString& content, + WTreeTableNode * node, uint colIndex); + virtual ~TreeTableNodeLineEdit(); + /** + * Creates back a TreeTableNodeText replacing this TreeTableNodeLineEdit. + */ + void OnBlurred(); +private: + WTreeTableNode * m_node; + uint m_colIndex; + TreeTableNodeText * m_text; + + void Init(WTreeTableNode * node, uint colIndex); +}; + +#endif /* TREETABLENODETEXT_H */ + diff --git a/WTAPPROOT/K7/K7.xml b/WTAPPROOT/K7/K7.xml index 5413515..b30b2a1 100644 --- a/WTAPPROOT/K7/K7.xml +++ b/WTAPPROOT/K7/K7.xml @@ -79,4 +79,6 @@ Apply Key succesfully certified Key certification failed + + Click to be able to copy next \ No newline at end of file diff --git a/WTAPPROOT/K7/K7_fr.xml b/WTAPPROOT/K7/K7_fr.xml index 5fbc74c..fd259da 100644 --- a/WTAPPROOT/K7/K7_fr.xml +++ b/WTAPPROOT/K7/K7_fr.xml @@ -79,4 +79,6 @@ Appliquer Succès de certification de la clé Échec de certification de la clé + + Cliquez pour pouvoir ensuite copier diff --git a/nbproject/Makefile-ARM-Release.mk b/nbproject/Makefile-ARM-Release.mk index 621fc36..785fa7b 100644 --- a/nbproject/Makefile-ARM-Release.mk +++ b/nbproject/Makefile-ARM-Release.mk @@ -44,6 +44,7 @@ OBJECTFILES= \ ${OBJECTDIR}/PopupCertifyUserId.o \ ${OBJECTDIR}/PopupDeleter.o \ ${OBJECTDIR}/PopupUploader.o \ + ${OBJECTDIR}/SensitiveTreeTableNodeText.o \ ${OBJECTDIR}/Tools.o \ ${OBJECTDIR}/TransientMessageWidget.o \ ${OBJECTDIR}/main.o @@ -118,6 +119,11 @@ ${OBJECTDIR}/PopupUploader.o: PopupUploader.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}/PopupUploader.o PopupUploader.cpp +${OBJECTDIR}/SensitiveTreeTableNodeText.o: SensitiveTreeTableNodeText.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}/SensitiveTreeTableNodeText.o SensitiveTreeTableNodeText.cpp + ${OBJECTDIR}/Tools.o: Tools.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} "$@.d" diff --git a/nbproject/Makefile-Debug.mk b/nbproject/Makefile-Debug.mk index d7b0b80..592fb2b 100644 --- a/nbproject/Makefile-Debug.mk +++ b/nbproject/Makefile-Debug.mk @@ -44,6 +44,7 @@ OBJECTFILES= \ ${OBJECTDIR}/PopupCertifyUserId.o \ ${OBJECTDIR}/PopupDeleter.o \ ${OBJECTDIR}/PopupUploader.o \ + ${OBJECTDIR}/SensitiveTreeTableNodeText.o \ ${OBJECTDIR}/Tools.o \ ${OBJECTDIR}/TransientMessageWidget.o \ ${OBJECTDIR}/main.o @@ -118,6 +119,11 @@ ${OBJECTDIR}/PopupUploader.o: PopupUploader.cpp ${RM} "$@.d" $(COMPILE.cc) -g -DDEVTIME -I/usr/local/Wt-Debug/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/PopupUploader.o PopupUploader.cpp +${OBJECTDIR}/SensitiveTreeTableNodeText.o: SensitiveTreeTableNodeText.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}/SensitiveTreeTableNodeText.o SensitiveTreeTableNodeText.cpp + ${OBJECTDIR}/Tools.o: Tools.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} "$@.d" diff --git a/nbproject/Makefile-Release.mk b/nbproject/Makefile-Release.mk index 8996b57..613bfc3 100644 --- a/nbproject/Makefile-Release.mk +++ b/nbproject/Makefile-Release.mk @@ -44,6 +44,7 @@ OBJECTFILES= \ ${OBJECTDIR}/PopupCertifyUserId.o \ ${OBJECTDIR}/PopupDeleter.o \ ${OBJECTDIR}/PopupUploader.o \ + ${OBJECTDIR}/SensitiveTreeTableNodeText.o \ ${OBJECTDIR}/Tools.o \ ${OBJECTDIR}/TransientMessageWidget.o \ ${OBJECTDIR}/main.o @@ -118,6 +119,11 @@ ${OBJECTDIR}/PopupUploader.o: PopupUploader.cpp ${RM} "$@.d" $(COMPILE.cc) -O2 -s -I/usr/local/Wt/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/PopupUploader.o PopupUploader.cpp +${OBJECTDIR}/SensitiveTreeTableNodeText.o: SensitiveTreeTableNodeText.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}/SensitiveTreeTableNodeText.o SensitiveTreeTableNodeText.cpp + ${OBJECTDIR}/Tools.o: Tools.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} "$@.d" diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index 0332d86..7fe494b 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -13,6 +13,7 @@ PopupCertifyUserId.h PopupDeleter.h PopupUploader.h + SensitiveTreeTableNodeText.h Tools.h TransientMessageWidget.h global.h @@ -37,6 +38,7 @@ PopupCertifyUserId.cpp PopupDeleter.cpp PopupUploader.cpp + SensitiveTreeTableNodeText.cpp Tools.cpp TransientMessageWidget.cpp main.cpp @@ -131,6 +133,10 @@ + + + + @@ -227,6 +233,10 @@ + + + + @@ -327,6 +337,10 @@ + + + +