20#include <config_gpgme.h>
23#include <com/sun/star/xml/crypto/XSecurityEnvironment.hpp>
24#include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
28#include <com/sun/star/security/NoPasswordException.hpp>
29#include <com/sun/star/security/CertificateCharacters.hpp>
43 std::vector< css::uno::Reference< css::xml::crypto::XXMLSecurityContext > > && rxSecurityContexts,
45 : GenericDialogController(_pParent,
"xmlsec/ui/selectcertificatedialog.ui",
"SelectCertificateDialog")
47 , m_xFTSign(m_xBuilder->weld_label(
"sign"))
48 , m_xFTEncrypt(m_xBuilder->weld_label(
"encrypt"))
49 , m_xCertLB(m_xBuilder->weld_tree_view(
"signatures"))
50 , m_xViewBtn(m_xBuilder->weld_button(
"viewcert"))
51 , m_xOKBtn(m_xBuilder->weld_button(
"ok"))
52 , m_xFTDescription(m_xBuilder->weld_label(
"description-label"))
53 , m_xDescriptionED(m_xBuilder->weld_entry(
"description"))
54 , m_xSearchBox(m_xBuilder->weld_entry(
"searchbox"))
56 auto nControlWidth =
m_xCertLB->get_approximate_digit_width() * 105;
60 std::vector<int> aWidths
62 o3tl::narrowing<int>(30*nControlWidth/100),
63 o3tl::narrowing<int>(30*nControlWidth/100),
64 o3tl::narrowing<int>(10*nControlWidth/100),
65 o3tl::narrowing<int>(20*nControlWidth/100)
67 m_xCertLB->set_column_fixed_widths(aWidths);
101 return GenericDialogController::run();
108 if (!
string.isEmpty())
133 result +=
"0x" + OUString::number(bits, 16);
171 m_xCertLB->set_selection_mode(SelectionMode::Multiple);
178 uno::Sequence<uno::Reference< security::XCertificate>> xCerts;
181 if (!secContext.is())
183 auto secEnvironment = secContext->getSecurityEnvironment();
184 if (!secEnvironment.is())
196 xCerts = secEnvironment->getPersonalCertificates();
198 xCerts = secEnvironment->getAllCertificates();
200 for (sal_Int32 nCert = xCerts.getLength(); nCert;)
202 uno::Reference< security::XCertificate > xCert = xCerts[ --nCert ];
204 tools::Long nCertificateCharacters = secEnvironment->getCertificateCharacters(xCert);
206 if (!(nCertificateCharacters & security::CertificateCharacters::HAS_PRIVATE_KEY))
208 ::comphelper::removeElementAt( xCerts, nCert );
214 catch (security::NoPasswordException&)
219 for (
const auto& xCert : std::as_const(xCerts))
221 std::shared_ptr<UserData> userData = std::make_shared<UserData>();
222 userData->xCertificate = xCert;
223 userData->xSecurityContext = secContext;
224 userData->xSecurityEnvironment = secEnvironment;
227 OUString sIssuer = xmlsec::GetContentPart( xCert->getIssuerName(), xCert->getCertificateKind());
231 && rCharClass.
uppercase(sIssuer).indexOf(aSearchStr) < 0
232 && rCharClass.
uppercase(sIssuer).indexOf(aSearchStr) < 0
233 && !aSearchStr.isEmpty())
238 m_xCertLB->set_text(nRow, xmlsec::GetContentPart(xCert->getSubjectName(), xCert->getCertificateKind()), 0);
240 m_xCertLB->set_text(nRow, xmlsec::GetCertificateKind(xCert->getCertificateKind()), 2);
246#if HAVE_FEATURE_GPGME
271 std::vector< uno::Reference< css::security::XCertificate > > aRet;
277 aRet.push_back( userData->xCertificate );
283 uno::Reference< css::security::XCertificate > xCert;
284 int nSel =
m_xCertLB->get_selected_index();
288 xCert = userData->xCertificate;
290 aRet.push_back( xCert );
293#if HAVE_FEATURE_GPGME
303 int nSel =
m_xCertLB->get_selected_index();
305 return uno::Reference<xml::crypto::XXMLSecurityContext>();
308 uno::Reference<xml::crypto::XXMLSecurityContext> xCert = userData->xSecurityContext;
319 uno::Sequence< uno::Reference<css::security::XCertificate> > xCerts =
321 return (xCerts.hasElements() && xCerts[0].is()) ?
327 ImplInitialize(
true);
332 bool bEnable = m_xCertLB->get_selected_index() != -1;
333 m_xViewBtn->set_sensitive(bEnable);
334 m_xOKBtn->set_sensitive(bEnable);
335 m_xDescriptionED->set_sensitive(bEnable);
346 ImplShowCertificateDetails();
351 int nSel =
m_xCertLB->get_selected_index();
357 if (!userData->xSecurityEnvironment.is() || !userData->xCertificate.is())
Reference< XExecutableDialog > m_xDialog
IMPL_LINK_NOARG(CertificateChooser, SearchModifyHdl, weld::Entry &, void)
static OUString UsageInClearText(int bits)
CertificateChooser(weld::Window *pParent, std::vector< css::uno::Reference< css::xml::crypto::XXMLSecurityContext > > &&rxSecurityContexts, UserAction eAction)
std::unique_ptr< weld::Button > m_xViewBtn
void ImplInitialize(bool mbSearch=false)
std::unique_ptr< weld::Entry > m_xSearchBox
static void HandleOneUsageBit(OUString &string, int &bits, int bit, TranslateId name)
virtual ~CertificateChooser() override
std::unique_ptr< weld::Label > m_xFTDescription
UserAction const meAction
std::vector< std::shared_ptr< UserData > > mvUserData
css::uno::Reference< css::security::XCertificate > mxEncryptToSelf
std::vector< css::uno::Reference< css::xml::crypto::XXMLSecurityContext > > mxSecurityContexts
std::unique_ptr< weld::Button > m_xOKBtn
css::uno::Reference< css::xml::crypto::XXMLSecurityContext > GetSelectedSecurityContext() const
std::unique_ptr< weld::Label > m_xFTEncrypt
std::unique_ptr< weld::Label > m_xFTSign
std::unordered_map< css::uno::Reference< css::xml::crypto::XXMLSecurityContext >, css::uno::Sequence< css::uno::Reference< css::security::XCertificate > > > xMemCerts
OUString GetDescription() const
Gets the description string provided when selecting the certificate.
css::uno::Sequence< css::uno::Reference< css::security::XCertificate > > GetSelectedCertificates()
std::unique_ptr< weld::Entry > m_xDescriptionED
std::unique_ptr< weld::TreeView > m_xCertLB
OUString GetUsageText()
Returns the usage string of the selected certificate, if any.
void ImplShowCertificateDetails()
OUString uppercase(const OUString &rStr, sal_Int32 nPos, sal_Int32 nCount) const
const CharClass & GetCharClass() const
OUString GetSigningKey() const
bool GetEncryptToSelf() const
OUString GetEncryptionKey() const
std::shared_ptr< weld::Dialog > m_xDialog
#define LINK(Instance, Class, Member)
css::uno::Sequence< DstElementType > containerToSequence(const SrcType &i_Container)
OUString GetDateString(const css::util::DateTime &_rDT)
OUString toId(const void *pValue)
OUString XsResId(TranslateId aId)