tdf#159040: add sign with default certificate to save dialog
Include X.509 certificates under Tools->Options->UserData among the keys for signing. Add a new checkbox to Save file dialog, to sign with that selected key easily. The checkbox is disabled if there's no matching key found. Change-Id: I9fc16790c479819cd1f35bcad040d0ebc7c4bdef Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170619 Tested-by: Jenkins Reviewed-by: Sarper Akdemir <sarper.akdemir@allotropia.de>
This commit is contained in:
parent
6ca02ef177
commit
426c641976
27 changed files with 293 additions and 24 deletions
|
@ -22,6 +22,7 @@
|
||||||
#include <rtl/ustrbuf.hxx>
|
#include <rtl/ustrbuf.hxx>
|
||||||
#include <osl/diagnose.h>
|
#include <osl/diagnose.h>
|
||||||
#include <o3tl/string_view.hxx>
|
#include <o3tl/string_view.hxx>
|
||||||
|
#include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -308,6 +309,34 @@ std::vector< std::pair< OUString, OUString> > parseDN(std::u16string_view rRawSt
|
||||||
|
|
||||||
return aStr.makeStringAndClear();
|
return aStr.makeStringAndClear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
css::uno::Reference<css::security::XCertificate> FindCertInContext(
|
||||||
|
const css::uno::Reference<css::xml::crypto::XXMLSecurityContext>& xSecurityContext,
|
||||||
|
const OUString& rContentPart)
|
||||||
|
{
|
||||||
|
if (!xSecurityContext.is())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
css::uno::Reference<css::xml::crypto::XSecurityEnvironment> xSE
|
||||||
|
= xSecurityContext->getSecurityEnvironment();
|
||||||
|
css::uno::Sequence<css::uno::Reference<css::security::XCertificate>> xCertificates
|
||||||
|
= xSE->getPersonalCertificates();
|
||||||
|
|
||||||
|
auto aCertsIter = asNonConstRange(xCertificates);
|
||||||
|
|
||||||
|
auto pxCert
|
||||||
|
= std::find_if(aCertsIter.begin(), aCertsIter.end(),
|
||||||
|
[&rContentPart](auto& xCert)
|
||||||
|
{
|
||||||
|
return comphelper::xmlsec::GetContentPart(
|
||||||
|
xCert->getSubjectName(), xCert->getCertificateKind())
|
||||||
|
== rContentPart;
|
||||||
|
});
|
||||||
|
if (pxCert == aCertsIter.end())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
return *pxCert;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
# include <com/sun/star/xml/crypto/GPGSEInitializer.hpp>
|
# include <com/sun/star/xml/crypto/GPGSEInitializer.hpp>
|
||||||
# include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
|
# include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
#include <com/sun/star/xml/crypto/SEInitializer.hpp>
|
||||||
|
#include <comphelper/xmlsechelper.hxx>
|
||||||
|
|
||||||
#include <i18nlangtag/languagetag.hxx>
|
#include <i18nlangtag/languagetag.hxx>
|
||||||
#include <i18nlangtag/mslangid.hxx>
|
#include <i18nlangtag/mslangid.hxx>
|
||||||
|
@ -300,26 +302,52 @@ void SvxGeneralTabPage::InitCryptography()
|
||||||
#if HAVE_FEATURE_GPGME
|
#if HAVE_FEATURE_GPGME
|
||||||
m_xCryptoFrame->show();
|
m_xCryptoFrame->show();
|
||||||
|
|
||||||
uno::Reference< xml::crypto::XSEInitializer > xSEInitializer;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
xSEInitializer = xml::crypto::GPGSEInitializer::create( comphelper::getProcessComponentContext() );
|
uno::Reference<xml::crypto::XXMLSecurityContext> xSecurityContext
|
||||||
uno::Reference<xml::crypto::XXMLSecurityContext> xSC = xSEInitializer->createSecurityContext( OUString() );
|
= xml::crypto::SEInitializer::create(comphelper::getProcessComponentContext())
|
||||||
if (xSC.is())
|
->createSecurityContext("");
|
||||||
|
uno::Reference<xml::crypto::XXMLSecurityContext> xSecurityContextGPG
|
||||||
|
= xml::crypto::GPGSEInitializer::create(comphelper::getProcessComponentContext())
|
||||||
|
->createSecurityContext("");
|
||||||
|
if (xSecurityContextGPG.is())
|
||||||
{
|
{
|
||||||
uno::Reference<xml::crypto::XSecurityEnvironment> xSE = xSC->getSecurityEnvironment();
|
uno::Reference<xml::crypto::XSecurityEnvironment> xSE = xSecurityContextGPG->getSecurityEnvironment();
|
||||||
uno::Sequence<uno::Reference<security::XCertificate>> xCertificates = xSE->getPersonalCertificates();
|
uno::Sequence<uno::Reference<security::XCertificate>> xCertificates = xSE->getPersonalCertificates();
|
||||||
|
|
||||||
if (xCertificates.hasElements())
|
if (xCertificates.hasElements())
|
||||||
{
|
{
|
||||||
for (auto& xCert : asNonConstRange(xCertificates))
|
for (auto& xCert : asNonConstRange(xCertificates))
|
||||||
{
|
{
|
||||||
m_xSigningKeyLB->append_text( xCert->getIssuerName());
|
const auto aIssuer = comphelper::xmlsec::GetContentPart(
|
||||||
m_xEncryptionKeyLB->append_text( xCert->getIssuerName());
|
xCert->getSubjectName(), xCert->getCertificateKind());
|
||||||
|
m_xSigningKeyLB->append_text(aIssuer);
|
||||||
|
m_xEncryptionKeyLB->append_text(aIssuer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//tdf#115015: wrap checkbox text and listboxes if necessary
|
if (xSecurityContext.is())
|
||||||
|
{
|
||||||
|
uno::Reference<xml::crypto::XSecurityEnvironment> xSE = xSecurityContext->getSecurityEnvironment();
|
||||||
|
uno::Sequence<uno::Reference<security::XCertificate>> xCertificates
|
||||||
|
= xSE->getPersonalCertificates();
|
||||||
|
|
||||||
|
if (xCertificates.hasElements())
|
||||||
|
{
|
||||||
|
for (auto& xCert : asNonConstRange(xCertificates))
|
||||||
|
{
|
||||||
|
const auto aIssuer
|
||||||
|
= comphelper::xmlsec::GetContentPart(xCert->getSubjectName(),
|
||||||
|
xCert->getCertificateKind());
|
||||||
|
m_xSigningKeyLB->append_text(aIssuer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xSecurityContext.is() || xSecurityContextGPG.is())
|
||||||
|
{
|
||||||
|
//tdf#115015: wrap checkbox text and listboxes if necessary
|
||||||
int nPrefWidth(m_xEncryptToSelfCB->get_preferred_size().Width());
|
int nPrefWidth(m_xEncryptToSelfCB->get_preferred_size().Width());
|
||||||
int nMaxWidth = m_xEncryptToSelfCB->get_approximate_digit_width() * 40;
|
int nMaxWidth = m_xEncryptToSelfCB->get_approximate_digit_width() * 40;
|
||||||
if (nPrefWidth > nMaxWidth)
|
if (nPrefWidth > nMaxWidth)
|
||||||
|
|
|
@ -1098,7 +1098,7 @@
|
||||||
<object class="GtkLabel" id="signingkeylabel">
|
<object class="GtkLabel" id="signingkeylabel">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="label" translatable="yes" context="optuserpage|signingkeylabel">_OpenPGP signing key:</property>
|
<property name="label" translatable="yes" context="optuserpage|signingkeylabel">_Signing key:</property>
|
||||||
<property name="use-underline">True</property>
|
<property name="use-underline">True</property>
|
||||||
<property name="mnemonic-widget">signingkey</property>
|
<property name="mnemonic-widget">signingkey</property>
|
||||||
<property name="xalign">0</property>
|
<property name="xalign">0</property>
|
||||||
|
@ -1151,7 +1151,7 @@
|
||||||
</items>
|
</items>
|
||||||
<child internal-child="accessible">
|
<child internal-child="accessible">
|
||||||
<object class="AtkObject" id="signingkey-atkobject">
|
<object class="AtkObject" id="signingkey-atkobject">
|
||||||
<property name="AtkObject::accessible-description" translatable="yes" context="extended tip | signingkey">Select your OpenPGP key from the drop-down list for signing ODF documents.</property>
|
<property name="AtkObject::accessible-description" translatable="yes" context="extended tip | signingkey">Select your key from the drop-down list for signing ODF documents.</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|
|
@ -70,6 +70,7 @@ public:
|
||||||
AUTOEXTENSION, //but autoextension is handled differently on MacOSX
|
AUTOEXTENSION, //but autoextension is handled differently on MacOSX
|
||||||
PASSWORD,
|
PASSWORD,
|
||||||
GPGENCRYPTION,
|
GPGENCRYPTION,
|
||||||
|
GPGSIGN,
|
||||||
FILTEROPTIONS,
|
FILTEROPTIONS,
|
||||||
READONLY,
|
READONLY,
|
||||||
LINK,
|
LINK,
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <config_gpgme.h>
|
||||||
#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
|
#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
|
||||||
#include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
|
#include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
|
||||||
#include <com/sun/star/ui/dialogs/ControlActions.hpp>
|
#include <com/sun/star/ui/dialogs/ControlActions.hpp>
|
||||||
|
@ -185,11 +186,17 @@ void ControlHelper::initialize( sal_Int16 nTemplateId )
|
||||||
m_bToggleVisibility[AUTOEXTENSION] = true;
|
m_bToggleVisibility[AUTOEXTENSION] = true;
|
||||||
m_bToggleVisibility[PASSWORD] = true;
|
m_bToggleVisibility[PASSWORD] = true;
|
||||||
m_bToggleVisibility[GPGENCRYPTION] = true;
|
m_bToggleVisibility[GPGENCRYPTION] = true;
|
||||||
|
#if HAVE_FEATURE_GPGME
|
||||||
|
m_bToggleVisibility[GPGSIGN] = true;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
|
case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
|
||||||
m_bToggleVisibility[AUTOEXTENSION] = true;
|
m_bToggleVisibility[AUTOEXTENSION] = true;
|
||||||
m_bToggleVisibility[PASSWORD] = true;
|
m_bToggleVisibility[PASSWORD] = true;
|
||||||
m_bToggleVisibility[GPGENCRYPTION] = true;
|
m_bToggleVisibility[GPGENCRYPTION] = true;
|
||||||
|
#if HAVE_FEATURE_GPGME
|
||||||
|
m_bToggleVisibility[GPGSIGN] = true;
|
||||||
|
#endif
|
||||||
m_bToggleVisibility[FILTEROPTIONS] = true;
|
m_bToggleVisibility[FILTEROPTIONS] = true;
|
||||||
break;
|
break;
|
||||||
case FILESAVE_AUTOEXTENSION_SELECTION:
|
case FILESAVE_AUTOEXTENSION_SELECTION:
|
||||||
|
@ -605,6 +612,7 @@ int ControlHelper::getControlElementName(const Class aClazz, const int nControlI
|
||||||
TOGGLE_ELEMENT( AUTOEXTENSION );
|
TOGGLE_ELEMENT( AUTOEXTENSION );
|
||||||
TOGGLE_ELEMENT( PASSWORD );
|
TOGGLE_ELEMENT( PASSWORD );
|
||||||
TOGGLE_ELEMENT( GPGENCRYPTION );
|
TOGGLE_ELEMENT( GPGENCRYPTION );
|
||||||
|
TOGGLE_ELEMENT( GPGSIGN );
|
||||||
TOGGLE_ELEMENT( FILTEROPTIONS );
|
TOGGLE_ELEMENT( FILTEROPTIONS );
|
||||||
TOGGLE_ELEMENT( READONLY );
|
TOGGLE_ELEMENT( READONLY );
|
||||||
TOGGLE_ELEMENT( LINK );
|
TOGGLE_ELEMENT( LINK );
|
||||||
|
@ -729,6 +737,7 @@ case ExtendedFilePickerElementIds::LISTBOX_##elem##_LABEL: \
|
||||||
MAP_TOGGLE( AUTOEXTENSION );
|
MAP_TOGGLE( AUTOEXTENSION );
|
||||||
MAP_TOGGLE( PASSWORD );
|
MAP_TOGGLE( PASSWORD );
|
||||||
MAP_TOGGLE( GPGENCRYPTION );
|
MAP_TOGGLE( GPGENCRYPTION );
|
||||||
|
MAP_TOGGLE( GPGSIGN );
|
||||||
MAP_TOGGLE( FILTEROPTIONS );
|
MAP_TOGGLE( FILTEROPTIONS );
|
||||||
MAP_TOGGLE( READONLY );
|
MAP_TOGGLE( READONLY );
|
||||||
MAP_TOGGLE( LINK );
|
MAP_TOGGLE( LINK );
|
||||||
|
|
|
@ -51,6 +51,7 @@ Entry const CtrlIdToResIdTable[] = {
|
||||||
{ CHECKBOX_AUTOEXTENSION, STR_SVT_FILEPICKER_AUTO_EXTENSION },
|
{ CHECKBOX_AUTOEXTENSION, STR_SVT_FILEPICKER_AUTO_EXTENSION },
|
||||||
{ CHECKBOX_PASSWORD, STR_SVT_FILEPICKER_PASSWORD },
|
{ CHECKBOX_PASSWORD, STR_SVT_FILEPICKER_PASSWORD },
|
||||||
{ CHECKBOX_GPGENCRYPTION, STR_SVT_FILEPICKER_GPGENCRYPT },
|
{ CHECKBOX_GPGENCRYPTION, STR_SVT_FILEPICKER_GPGENCRYPT },
|
||||||
|
{ CHECKBOX_GPGSIGN, STR_SVT_FILEPICKER_GPGSIGN },
|
||||||
{ CHECKBOX_FILTEROPTIONS, STR_SVT_FILEPICKER_FILTER_OPTIONS },
|
{ CHECKBOX_FILTEROPTIONS, STR_SVT_FILEPICKER_FILTER_OPTIONS },
|
||||||
{ CHECKBOX_READONLY, STR_SVT_FILEPICKER_READONLY },
|
{ CHECKBOX_READONLY, STR_SVT_FILEPICKER_READONLY },
|
||||||
{ CHECKBOX_LINK, STR_SVT_FILEPICKER_INSERT_AS_LINK },
|
{ CHECKBOX_LINK, STR_SVT_FILEPICKER_INSERT_AS_LINK },
|
||||||
|
|
|
@ -79,6 +79,7 @@ namespace svt
|
||||||
{ "FilterListLabel", LISTBOX_FILTER_LABEL, PROPERTY_FLAGS_COMMON | PropFlags::Text },
|
{ "FilterListLabel", LISTBOX_FILTER_LABEL, PROPERTY_FLAGS_COMMON | PropFlags::Text },
|
||||||
{ "FilterOptionsBox", CHECKBOX_FILTEROPTIONS, PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_CHECKBOX },
|
{ "FilterOptionsBox", CHECKBOX_FILTEROPTIONS, PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_CHECKBOX },
|
||||||
{ "GpgPassword", CHECKBOX_GPGENCRYPTION, PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_CHECKBOX },
|
{ "GpgPassword", CHECKBOX_GPGENCRYPTION, PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_CHECKBOX },
|
||||||
|
{ "GpgSign", CHECKBOX_GPGSIGN, PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_CHECKBOX },
|
||||||
{ "HelpButton", PUSHBUTTON_HELP, PROPERTY_FLAGS_COMMON | PropFlags::Text },
|
{ "HelpButton", PUSHBUTTON_HELP, PROPERTY_FLAGS_COMMON | PropFlags::Text },
|
||||||
{ "ImageAnchorList", LISTBOX_IMAGE_ANCHOR, PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_LISTBOX },
|
{ "ImageAnchorList", LISTBOX_IMAGE_ANCHOR, PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_LISTBOX },
|
||||||
{ "ImageAnchorListLabel", LISTBOX_IMAGE_ANCHOR_LABEL, PROPERTY_FLAGS_COMMON | PropFlags::Text },
|
{ "ImageAnchorListLabel", LISTBOX_IMAGE_ANCHOR_LABEL, PROPERTY_FLAGS_COMMON | PropFlags::Text },
|
||||||
|
@ -399,6 +400,7 @@ namespace svt
|
||||||
case CHECKBOX_AUTOEXTENSION:
|
case CHECKBOX_AUTOEXTENSION:
|
||||||
case CHECKBOX_PASSWORD:
|
case CHECKBOX_PASSWORD:
|
||||||
case CHECKBOX_GPGENCRYPTION:
|
case CHECKBOX_GPGENCRYPTION:
|
||||||
|
case CHECKBOX_GPGSIGN:
|
||||||
case CHECKBOX_FILTEROPTIONS:
|
case CHECKBOX_FILTEROPTIONS:
|
||||||
case CHECKBOX_READONLY:
|
case CHECKBOX_READONLY:
|
||||||
case CHECKBOX_LINK:
|
case CHECKBOX_LINK:
|
||||||
|
|
|
@ -302,6 +302,7 @@ SvtFileDialog::SvtFileDialog(weld::Window* pParent, PickerFlags nStyle)
|
||||||
m_xImpl->m_xBtnNewFolder = m_xBuilder->weld_button(u"new_folder"_ustr);
|
m_xImpl->m_xBtnNewFolder = m_xBuilder->weld_button(u"new_folder"_ustr);
|
||||||
m_xImpl->m_xCbPassword = m_xBuilder->weld_check_button(u"password"_ustr);
|
m_xImpl->m_xCbPassword = m_xBuilder->weld_check_button(u"password"_ustr);
|
||||||
m_xImpl->m_xCbGPGEncrypt = m_xBuilder->weld_check_button(u"gpgencrypt"_ustr);
|
m_xImpl->m_xCbGPGEncrypt = m_xBuilder->weld_check_button(u"gpgencrypt"_ustr);
|
||||||
|
m_xImpl->m_xCbGPGSign = m_xBuilder->weld_check_button(u"gpgsign"_ustr);
|
||||||
m_xImpl->m_xCbAutoExtension = m_xBuilder->weld_check_button(u"extension"_ustr);
|
m_xImpl->m_xCbAutoExtension = m_xBuilder->weld_check_button(u"extension"_ustr);
|
||||||
m_xImpl->m_xSharedLabel = m_xBuilder->weld_label(u"shared_label"_ustr);
|
m_xImpl->m_xSharedLabel = m_xBuilder->weld_label(u"shared_label"_ustr);
|
||||||
m_xImpl->m_xSharedListBox = m_xBuilder->weld_combo_box(u"shared"_ustr);
|
m_xImpl->m_xSharedListBox = m_xBuilder->weld_combo_box(u"shared"_ustr);
|
||||||
|
@ -367,8 +368,12 @@ SvtFileDialog::SvtFileDialog(weld::Window* pParent, PickerFlags nStyle)
|
||||||
m_xImpl->m_xCbPassword->set_label( FpsResId( STR_SVT_FILEPICKER_PASSWORD ) );
|
m_xImpl->m_xCbPassword->set_label( FpsResId( STR_SVT_FILEPICKER_PASSWORD ) );
|
||||||
m_xImpl->m_xCbPassword->connect_toggled( LINK( this, SvtFileDialog, ClickHdl_Impl ) );
|
m_xImpl->m_xCbPassword->connect_toggled( LINK( this, SvtFileDialog, ClickHdl_Impl ) );
|
||||||
m_xImpl->m_xCbPassword->show();
|
m_xImpl->m_xCbPassword->show();
|
||||||
|
|
||||||
m_xImpl->m_xCbGPGEncrypt->connect_toggled( LINK( this, SvtFileDialog, ClickHdl_Impl ) );
|
m_xImpl->m_xCbGPGEncrypt->connect_toggled( LINK( this, SvtFileDialog, ClickHdl_Impl ) );
|
||||||
m_xImpl->m_xCbGPGEncrypt->show();
|
m_xImpl->m_xCbGPGEncrypt->show();
|
||||||
|
|
||||||
|
m_xImpl->m_xCbGPGSign->connect_toggled( LINK( this, SvtFileDialog, ClickHdl_Impl ) );
|
||||||
|
m_xImpl->m_xCbGPGSign->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the ini file for extracting the size
|
// set the ini file for extracting the size
|
||||||
|
@ -1240,6 +1245,8 @@ IMPL_LINK( SvtFileDialog, ClickHdl_Impl, weld::Toggleable&, rCheckBox, void )
|
||||||
nId = CHECKBOX_PASSWORD;
|
nId = CHECKBOX_PASSWORD;
|
||||||
else if ( &rCheckBox == m_xImpl->m_xCbGPGEncrypt.get() )
|
else if ( &rCheckBox == m_xImpl->m_xCbGPGEncrypt.get() )
|
||||||
nId = CHECKBOX_GPGENCRYPTION;
|
nId = CHECKBOX_GPGENCRYPTION;
|
||||||
|
else if ( &rCheckBox == m_xImpl->m_xCbGPGSign.get() )
|
||||||
|
nId = CHECKBOX_GPGSIGN;
|
||||||
else if ( &rCheckBox == m_xCbLinkBox.get() )
|
else if ( &rCheckBox == m_xCbLinkBox.get() )
|
||||||
nId = CHECKBOX_LINK;
|
nId = CHECKBOX_LINK;
|
||||||
else if ( &rCheckBox == m_xCbPreviewBox.get() )
|
else if ( &rCheckBox == m_xCbPreviewBox.get() )
|
||||||
|
@ -1918,6 +1925,10 @@ weld::Widget* SvtFileDialog::getControl( sal_Int16 nControlId, bool bLabelContro
|
||||||
pReturn = m_xImpl->m_xCbGPGEncrypt.get();
|
pReturn = m_xImpl->m_xCbGPGEncrypt.get();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CHECKBOX_GPGSIGN:
|
||||||
|
pReturn = m_xImpl->m_xCbGPGSign.get();
|
||||||
|
break;
|
||||||
|
|
||||||
case CHECKBOX_FILTEROPTIONS:
|
case CHECKBOX_FILTEROPTIONS:
|
||||||
pReturn = m_xImpl->m_xCbOptions.get();
|
pReturn = m_xImpl->m_xCbOptions.get();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -127,6 +127,7 @@ public:
|
||||||
std::unique_ptr<weld::Button> m_xBtnNewFolder;
|
std::unique_ptr<weld::Button> m_xBtnNewFolder;
|
||||||
std::unique_ptr<weld::CheckButton> m_xCbPassword;
|
std::unique_ptr<weld::CheckButton> m_xCbPassword;
|
||||||
std::unique_ptr<weld::CheckButton> m_xCbGPGEncrypt;
|
std::unique_ptr<weld::CheckButton> m_xCbGPGEncrypt;
|
||||||
|
std::unique_ptr<weld::CheckButton> m_xCbGPGSign;
|
||||||
std::unique_ptr<SvtURLBox> m_xEdCurrentPath;
|
std::unique_ptr<SvtURLBox> m_xEdCurrentPath;
|
||||||
std::unique_ptr<weld::CheckButton> m_xCbAutoExtension;
|
std::unique_ptr<weld::CheckButton> m_xCbAutoExtension;
|
||||||
std::unique_ptr<weld::CheckButton> m_xCbOptions;
|
std::unique_ptr<weld::CheckButton> m_xCbOptions;
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sal/config.h>
|
#include <sal/config.h>
|
||||||
|
#include <config_gpgme.h>
|
||||||
|
|
||||||
#include "VistaFilePicker.hxx"
|
#include "VistaFilePicker.hxx"
|
||||||
|
|
||||||
|
@ -362,6 +363,9 @@ void SAL_CALL VistaFilePicker::initialize(const css::uno::Sequence< css::uno::An
|
||||||
nFeatures |= FEATURE_AUTOEXTENSION;
|
nFeatures |= FEATURE_AUTOEXTENSION;
|
||||||
nFeatures |= FEATURE_PASSWORD;
|
nFeatures |= FEATURE_PASSWORD;
|
||||||
nFeatures |= FEATURE_GPGPASSWORD;
|
nFeatures |= FEATURE_GPGPASSWORD;
|
||||||
|
#if HAVE_FEATURE_GPGME
|
||||||
|
nFeatures |= FEATURE_GPGSIGN;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -372,6 +376,9 @@ void SAL_CALL VistaFilePicker::initialize(const css::uno::Sequence< css::uno::An
|
||||||
nFeatures |= FEATURE_PASSWORD;
|
nFeatures |= FEATURE_PASSWORD;
|
||||||
nFeatures |= FEATURE_FILTEROPTIONS;
|
nFeatures |= FEATURE_FILTEROPTIONS;
|
||||||
nFeatures |= FEATURE_GPGPASSWORD;
|
nFeatures |= FEATURE_GPGPASSWORD;
|
||||||
|
#if HAVE_FEATURE_GPGME
|
||||||
|
nFeatures |= FEATURE_GPGSIGN;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -641,6 +641,13 @@ void VistaFilePickerImpl::impl_sta_enableFeatures(::sal_Int32 nFeatures, ::sal_I
|
||||||
setLabelToControl(iCustom, nControlId);
|
setLabelToControl(iCustom, nControlId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((nFeatures & FEATURE_GPGSIGN) == FEATURE_GPGSIGN)
|
||||||
|
{
|
||||||
|
nControlId = css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_GPGSIGN;
|
||||||
|
iCustom->AddCheckButton (nControlId, L"GpgSign", false);
|
||||||
|
setLabelToControl(iCustom, nControlId);
|
||||||
|
}
|
||||||
|
|
||||||
if ((nFeatures & FEATURE_READONLY) == FEATURE_READONLY)
|
if ((nFeatures & FEATURE_READONLY) == FEATURE_READONLY)
|
||||||
{
|
{
|
||||||
nControlId = css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_READONLY;
|
nControlId = css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_READONLY;
|
||||||
|
@ -1093,6 +1100,7 @@ void VistaFilePickerImpl::impl_sta_GetControlValue(Request& rRequest)
|
||||||
{
|
{
|
||||||
case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PASSWORD :
|
case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PASSWORD :
|
||||||
case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_GPGENCRYPTION :
|
case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_GPGENCRYPTION :
|
||||||
|
case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_GPGSIGN :
|
||||||
case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_READONLY :
|
case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_READONLY :
|
||||||
case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS :
|
case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS :
|
||||||
case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK :
|
case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK :
|
||||||
|
|
|
@ -56,6 +56,7 @@ const ::sal_Int32 FEATURE_READONLY = 512;
|
||||||
const ::sal_Int32 FEATURE_VERSION = 1024;
|
const ::sal_Int32 FEATURE_VERSION = 1024;
|
||||||
const ::sal_Int32 FEATURE_GPGPASSWORD = 2048;
|
const ::sal_Int32 FEATURE_GPGPASSWORD = 2048;
|
||||||
const ::sal_Int32 FEATURE_IMAGEANCHOR = 4096;
|
const ::sal_Int32 FEATURE_IMAGEANCHOR = 4096;
|
||||||
|
const ::sal_Int32 FEATURE_GPGSIGN = 8192;
|
||||||
|
|
||||||
inline constexpr OUString PROP_PICKER_LISTENER(u"picker_listener"_ustr ); // [XFilePickerListenert]
|
inline constexpr OUString PROP_PICKER_LISTENER(u"picker_listener"_ustr ); // [XFilePickerListenert]
|
||||||
inline constexpr OUString PROP_DIALOG_SHOW_RESULT(u"dialog_show_result"_ustr ); // [sal_Bool] true=OK, false=CANCEL
|
inline constexpr OUString PROP_DIALOG_SHOW_RESULT(u"dialog_show_result"_ustr ); // [sal_Bool] true=OK, false=CANCEL
|
||||||
|
|
|
@ -66,7 +66,8 @@ Entry const CtrlIdToResIdTable[] = {
|
||||||
{ CHECKBOX_SELECTION, STR_SVT_FILEPICKER_SELECTION },
|
{ CHECKBOX_SELECTION, STR_SVT_FILEPICKER_SELECTION },
|
||||||
{ FOLDERPICKER_TITLE, STR_SVT_FOLDERPICKER_DEFAULT_TITLE },
|
{ FOLDERPICKER_TITLE, STR_SVT_FOLDERPICKER_DEFAULT_TITLE },
|
||||||
{ FOLDER_PICKER_DEF_DESCRIPTION, STR_SVT_FOLDERPICKER_DEFAULT_DESCRIPTION },
|
{ FOLDER_PICKER_DEF_DESCRIPTION, STR_SVT_FOLDERPICKER_DEFAULT_DESCRIPTION },
|
||||||
{ CHECKBOX_GPGENCRYPTION, STR_SVT_FILEPICKER_GPGENCRYPT }
|
{ CHECKBOX_GPGENCRYPTION, STR_SVT_FILEPICKER_GPGENCRYPT },
|
||||||
|
{ CHECKBOX_GPGSIGN, STR_SVT_FILEPICKER_GPGSIGN }
|
||||||
};
|
};
|
||||||
|
|
||||||
const sal_Int32 SIZE_TABLE = SAL_N_ELEMENTS( CtrlIdToResIdTable );
|
const sal_Int32 SIZE_TABLE = SAL_N_ELEMENTS( CtrlIdToResIdTable );
|
||||||
|
|
|
@ -755,7 +755,17 @@
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<placeholder/>
|
<object class="GtkCheckButton" id="gpgsign">
|
||||||
|
<property name="label" translatable="yes" context="explorerfiledialog|gpgencrypt">Sign with default certificate</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="draw_indicator">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="top_attach">1</property>
|
||||||
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
|
|
|
@ -27,6 +27,16 @@
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
namespace com::sun::star::xml::crypto
|
||||||
|
{
|
||||||
|
class XXMLSecurityContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace com::sun::star::security
|
||||||
|
{
|
||||||
|
class XCertificate;
|
||||||
|
}
|
||||||
|
|
||||||
namespace comphelper::xmlsec
|
namespace comphelper::xmlsec
|
||||||
{
|
{
|
||||||
COMPHELPER_DLLPUBLIC OUString GetCertificateKind(const css::security::CertificateKind& rKind);
|
COMPHELPER_DLLPUBLIC OUString GetCertificateKind(const css::security::CertificateKind& rKind);
|
||||||
|
@ -40,6 +50,10 @@ COMPHELPER_DLLPUBLIC OUString GetContentPart(const OUString& _rRawString,
|
||||||
|
|
||||||
COMPHELPER_DLLPUBLIC OUString GetHexString(const css::uno::Sequence<sal_Int8>& _rSeq,
|
COMPHELPER_DLLPUBLIC OUString GetHexString(const css::uno::Sequence<sal_Int8>& _rSeq,
|
||||||
const char* _pSep, sal_uInt16 _nLineBreak = 0xFFFF);
|
const char* _pSep, sal_uInt16 _nLineBreak = 0xFFFF);
|
||||||
|
|
||||||
|
COMPHELPER_DLLPUBLIC css::uno::Reference<css::security::XCertificate> FindCertInContext(
|
||||||
|
const css::uno::Reference<css::xml::crypto::XXMLSecurityContext>& xSecurityContext,
|
||||||
|
const OUString& rContentPart);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#define STR_SVT_FILEPICKER_PASSWORD NC_("STR_SVT_FILEPICKER_PASSWORD", "Save with pass~word")
|
#define STR_SVT_FILEPICKER_PASSWORD NC_("STR_SVT_FILEPICKER_PASSWORD", "Save with pass~word")
|
||||||
//dear loplugins, please don't remove this constant, it will be used in follow-up commits
|
//dear loplugins, please don't remove this constant, it will be used in follow-up commits
|
||||||
#define STR_SVT_FILEPICKER_GPGENCRYPT NC_("STR_SVT_FILEPICKER_GPGENCRYPT", "Encrypt with ~GPG key")
|
#define STR_SVT_FILEPICKER_GPGENCRYPT NC_("STR_SVT_FILEPICKER_GPGENCRYPT", "Encrypt with ~GPG key")
|
||||||
|
#define STR_SVT_FILEPICKER_GPGSIGN NC_("STR_SVT_FILEPICKER_GPGSIGN", "Sign with ~default certificate")
|
||||||
#define STR_SVT_FILEPICKER_FILTER_OPTIONS NC_("STR_SVT_FILEPICKER_FILTER_OPTIONS", "~Edit filter settings")
|
#define STR_SVT_FILEPICKER_FILTER_OPTIONS NC_("STR_SVT_FILEPICKER_FILTER_OPTIONS", "~Edit filter settings")
|
||||||
#define STR_SVT_FILEPICKER_READONLY NC_("STR_SVT_FILEPICKER_READONLY", "~Read-only")
|
#define STR_SVT_FILEPICKER_READONLY NC_("STR_SVT_FILEPICKER_READONLY", "~Read-only")
|
||||||
#define STR_SVT_FILEPICKER_INSERT_AS_LINK NC_("STR_SVT_FILEPICKER_INSERT_AS_LINK", "~Link")
|
#define STR_SVT_FILEPICKER_INSERT_AS_LINK NC_("STR_SVT_FILEPICKER_INSERT_AS_LINK", "~Link")
|
||||||
|
|
|
@ -477,6 +477,7 @@ public:
|
||||||
bool IsAvoidRecentDocs() const { return mbAvoidRecentDocs; }
|
bool IsAvoidRecentDocs() const { return mbAvoidRecentDocs; }
|
||||||
|
|
||||||
bool IsRememberingSignature() const { return bRememberSignature; }
|
bool IsRememberingSignature() const { return bRememberSignature; }
|
||||||
|
void SetRememberCurrentSignature(bool bRemember);
|
||||||
|
|
||||||
/// Don't add to the recent documents - it's an expensive operation, sometimes it is not wanted.
|
/// Don't add to the recent documents - it's an expensive operation, sometimes it is not wanted.
|
||||||
void AvoidRecentDocs(bool bAvoid) { mbAvoidRecentDocs = bAvoid; }
|
void AvoidRecentDocs(bool bAvoid) { mbAvoidRecentDocs = bAvoid; }
|
||||||
|
|
|
@ -301,7 +301,7 @@ class SvxZoomItem;
|
||||||
#define FN_CHANGE_THEME (SID_SFX_START + 1745)
|
#define FN_CHANGE_THEME (SID_SFX_START + 1745)
|
||||||
#define FN_PARAM_NEW_THEME TypedWhichId<SfxStringItem>(SID_SFX_START + 1746)
|
#define FN_PARAM_NEW_THEME TypedWhichId<SfxStringItem>(SID_SFX_START + 1746)
|
||||||
#define SID_OPTIONS_PAGEID TypedWhichId<SfxUInt16Item>(SID_SFX_START + 1747)
|
#define SID_OPTIONS_PAGEID TypedWhichId<SfxUInt16Item>(SID_SFX_START + 1747)
|
||||||
|
#define SID_GPGSIGN TypedWhichId<SfxBoolItem>(SID_SFX_START + 1748)
|
||||||
// SID_SFX_free_END (SID_SFX_START + 3999)
|
// SID_SFX_free_END (SID_SFX_START + 3999)
|
||||||
|
|
||||||
#define SID_OPEN_NEW_VIEW TypedWhichId<SfxBoolItem>(SID_SFX_START + 520)
|
#define SID_OPEN_NEW_VIEW TypedWhichId<SfxBoolItem>(SID_SFX_START + 520)
|
||||||
|
|
|
@ -49,6 +49,7 @@ published constants ExtendedFilePickerElementIds
|
||||||
/** @since LibreOffice 6.0 */ const short CHECKBOX_GPGENCRYPTION = 211;
|
/** @since LibreOffice 6.0 */ const short CHECKBOX_GPGENCRYPTION = 211;
|
||||||
/** @since LibreOffice 6.1 */ const short LISTBOX_IMAGE_ANCHOR = 212;
|
/** @since LibreOffice 6.1 */ const short LISTBOX_IMAGE_ANCHOR = 212;
|
||||||
/** @since LibreOffice 6.1 */ const short LISTBOX_IMAGE_ANCHOR_LABEL = 213;
|
/** @since LibreOffice 6.1 */ const short LISTBOX_IMAGE_ANCHOR_LABEL = 213;
|
||||||
|
/** @since LibreOffice 25.2 */ const short CHECKBOX_GPGSIGN = 214;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -170,7 +170,7 @@
|
||||||
<prop oor:name="signingkey" oor:type="xs:string" oor:nillable="false">
|
<prop oor:name="signingkey" oor:type="xs:string" oor:nillable="false">
|
||||||
<!-- UIHints: Tools - Options - General - User Data -->
|
<!-- UIHints: Tools - Options - General - User Data -->
|
||||||
<info>
|
<info>
|
||||||
<desc>Specifies user's preferred OpenPGP key used for document signing.</desc>
|
<desc>Specifies user's preferred key used for document signing.</desc>
|
||||||
</info>
|
</info>
|
||||||
<value/>
|
<value/>
|
||||||
</prop>
|
</prop>
|
||||||
|
|
|
@ -96,6 +96,15 @@
|
||||||
#include <o3tl/string_view.hxx>
|
#include <o3tl/string_view.hxx>
|
||||||
#include <officecfg/Office/Common.hxx>
|
#include <officecfg/Office/Common.hxx>
|
||||||
|
|
||||||
|
#include <config_gpgme.h>
|
||||||
|
#if HAVE_FEATURE_GPGME
|
||||||
|
# include <com/sun/star/xml/crypto/SEInitializer.hpp>
|
||||||
|
# include <com/sun/star/xml/crypto/GPGSEInitializer.hpp>
|
||||||
|
# include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
|
||||||
|
#endif
|
||||||
|
#include <comphelper/xmlsechelper.hxx>
|
||||||
|
#include <unotools/useroptions.hxx>
|
||||||
|
|
||||||
#ifdef UNX
|
#ifdef UNX
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
@ -284,6 +293,7 @@ void FileDialogHelper_Impl::handleControlStateChanged( const FilePickerEvent& aE
|
||||||
enablePasswordBox( false );
|
enablePasswordBox( false );
|
||||||
enableGpgEncrBox( false );
|
enableGpgEncrBox( false );
|
||||||
updateSelectionBox();
|
updateSelectionBox();
|
||||||
|
updateSignByDefault();
|
||||||
// only use it for export and with our own dialog
|
// only use it for export and with our own dialog
|
||||||
if ( mbExport && !mbSystemPicker )
|
if ( mbExport && !mbSystemPicker )
|
||||||
updateExportButton();
|
updateExportButton();
|
||||||
|
@ -508,6 +518,43 @@ void FileDialogHelper_Impl::updateSelectionBox()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FileDialogHelper_Impl::updateSignByDefault()
|
||||||
|
{
|
||||||
|
#if HAVE_FEATURE_GPGME
|
||||||
|
if (!mbHasSignByDefault)
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto HaveMatchingUserSigningKey = []() -> bool
|
||||||
|
{
|
||||||
|
auto aSigningKey = SvtUserOptions{}.GetSigningKey();
|
||||||
|
if (aSigningKey.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::vector<uno::Reference<xml::crypto::XXMLSecurityContext>> xSecurityContexts{
|
||||||
|
xml::crypto::SEInitializer::create(comphelper::getProcessComponentContext())
|
||||||
|
->createSecurityContext({}),
|
||||||
|
xml::crypto::GPGSEInitializer::create(comphelper::getProcessComponentContext())
|
||||||
|
->createSecurityContext({}),
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const auto& xSecurityContext : xSecurityContexts)
|
||||||
|
{
|
||||||
|
if (xSecurityContext.is())
|
||||||
|
{
|
||||||
|
css::uno::Reference<css::security::XCertificate> xCert
|
||||||
|
= comphelper::xmlsec::FindCertInContext(xSecurityContext, aSigningKey);
|
||||||
|
if (xCert.is())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
updateExtendedControl(ExtendedFilePickerElementIds::CHECKBOX_GPGSIGN,
|
||||||
|
HaveMatchingUserSigningKey());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void FileDialogHelper_Impl::enablePasswordBox( bool bInit )
|
void FileDialogHelper_Impl::enablePasswordBox( bool bInit )
|
||||||
{
|
{
|
||||||
if ( ! mbHasPassword )
|
if ( ! mbHasPassword )
|
||||||
|
@ -918,6 +965,7 @@ FileDialogHelper_Impl::FileDialogHelper_Impl(
|
||||||
mpAntiImpl = _pAntiImpl;
|
mpAntiImpl = _pAntiImpl;
|
||||||
mbHasAutoExt = false;
|
mbHasAutoExt = false;
|
||||||
mbHasPassword = false;
|
mbHasPassword = false;
|
||||||
|
mbHasSignByDefault = false;
|
||||||
m_bHaveFilterOptions = false;
|
m_bHaveFilterOptions = false;
|
||||||
mbIsPwdEnabled = true;
|
mbIsPwdEnabled = true;
|
||||||
mbIsGpgEncrEnabled = true;
|
mbIsGpgEncrEnabled = true;
|
||||||
|
@ -982,6 +1030,7 @@ FileDialogHelper_Impl::FileDialogHelper_Impl(
|
||||||
mbHasPassword = true;
|
mbHasPassword = true;
|
||||||
mbHasAutoExt = true;
|
mbHasAutoExt = true;
|
||||||
mbIsSaveDlg = true;
|
mbIsSaveDlg = true;
|
||||||
|
mbHasSignByDefault = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
|
case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
|
||||||
|
@ -998,6 +1047,7 @@ FileDialogHelper_Impl::FileDialogHelper_Impl(
|
||||||
|
|
||||||
mbHasAutoExt = true;
|
mbHasAutoExt = true;
|
||||||
mbIsSaveDlg = true;
|
mbIsSaveDlg = true;
|
||||||
|
mbHasSignByDefault = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FILESAVE_AUTOEXTENSION_SELECTION:
|
case FILESAVE_AUTOEXTENSION_SELECTION:
|
||||||
|
@ -1257,6 +1307,7 @@ IMPL_LINK_NOARG( FileDialogHelper_Impl, InitControls, void*, void )
|
||||||
enableGpgEncrBox( true );
|
enableGpgEncrBox( true );
|
||||||
updateFilterOptionsBox( );
|
updateFilterOptionsBox( );
|
||||||
updateSelectionBox( );
|
updateSelectionBox( );
|
||||||
|
updateSignByDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileDialogHelper_Impl::preExecute()
|
void FileDialogHelper_Impl::preExecute()
|
||||||
|
@ -1606,6 +1657,19 @@ ErrCode FileDialogHelper_Impl::execute( std::vector<OUString>& rpURLList,
|
||||||
}
|
}
|
||||||
catch( const IllegalArgumentException& ){}
|
catch( const IllegalArgumentException& ){}
|
||||||
}
|
}
|
||||||
|
if ( pCurrentFilter && xCtrlAccess.is() )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Any aValue = xCtrlAccess->getValue( ExtendedFilePickerElementIds::CHECKBOX_GPGSIGN, 0 );
|
||||||
|
bool bSign = false;
|
||||||
|
if ((aValue >>= bSign) && bSign)
|
||||||
|
{
|
||||||
|
rpSet->Put(SfxBoolItem(SID_GPGSIGN, bSign));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( const IllegalArgumentException& ){}
|
||||||
|
}
|
||||||
|
|
||||||
SaveLastUsedFilter();
|
SaveLastUsedFilter();
|
||||||
return ERRCODE_NONE;
|
return ERRCODE_NONE;
|
||||||
|
|
|
@ -95,6 +95,7 @@ namespace sfx2
|
||||||
bool mbSelectionEnabled : 1;
|
bool mbSelectionEnabled : 1;
|
||||||
bool mbHasSelectionBox : 1;
|
bool mbHasSelectionBox : 1;
|
||||||
bool mbSelectionFltrEnabled : 1;
|
bool mbSelectionFltrEnabled : 1;
|
||||||
|
bool mbHasSignByDefault : 1;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void addFilters( const OUString& rFactory,
|
void addFilters( const OUString& rFactory,
|
||||||
|
@ -108,6 +109,7 @@ namespace sfx2
|
||||||
void updateFilterOptionsBox();
|
void updateFilterOptionsBox();
|
||||||
void updateExportButton();
|
void updateExportButton();
|
||||||
void updateSelectionBox();
|
void updateSelectionBox();
|
||||||
|
void updateSignByDefault();
|
||||||
void updateVersions();
|
void updateVersions();
|
||||||
void updatePreviewState( bool _bUpdatePreviewWindow );
|
void updatePreviewState( bool _bUpdatePreviewWindow );
|
||||||
void dispose();
|
void dispose();
|
||||||
|
|
|
@ -16,6 +16,14 @@
|
||||||
* except in compliance with the License. You may obtain a copy of
|
* except in compliance with the License. You may obtain a copy of
|
||||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||||
*/
|
*/
|
||||||
|
#include <config_gpgme.h>
|
||||||
|
#if HAVE_FEATURE_GPGME
|
||||||
|
#include <com/sun/star/xml/crypto/GPGSEInitializer.hpp>
|
||||||
|
#include <com/sun/star/xml/crypto/SEInitializer.hpp>
|
||||||
|
#include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
|
||||||
|
#endif
|
||||||
|
#include <com/sun/star/security/DocumentDigitalSignatures.hpp>
|
||||||
|
#include <com/sun/star/security/XCertificate.hpp>
|
||||||
|
|
||||||
#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
|
#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
|
||||||
#include <com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp>
|
#include <com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp>
|
||||||
|
@ -63,6 +71,7 @@
|
||||||
#include <comphelper/sequenceashashmap.hxx>
|
#include <comphelper/sequenceashashmap.hxx>
|
||||||
#include <comphelper/mimeconfighelper.hxx>
|
#include <comphelper/mimeconfighelper.hxx>
|
||||||
#include <comphelper/lok.hxx>
|
#include <comphelper/lok.hxx>
|
||||||
|
#include <comphelper/xmlsechelper.hxx>
|
||||||
#include <LibreOfficeKit/LibreOfficeKitEnums.h>
|
#include <LibreOfficeKit/LibreOfficeKitEnums.h>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vcl/svapp.hxx>
|
#include <vcl/svapp.hxx>
|
||||||
|
@ -275,6 +284,7 @@ class ModelData_Impl
|
||||||
::comphelper::SequenceAsHashMap m_aMediaDescrHM;
|
::comphelper::SequenceAsHashMap m_aMediaDescrHM;
|
||||||
|
|
||||||
bool m_bRecommendReadOnly;
|
bool m_bRecommendReadOnly;
|
||||||
|
bool m_bSignWithDefaultSignature;
|
||||||
|
|
||||||
DECL_LINK(OptionsDialogClosedHdl, css::ui::dialogs::DialogClosedEvent*, void);
|
DECL_LINK(OptionsDialogClosedHdl, css::ui::dialogs::DialogClosedEvent*, void);
|
||||||
|
|
||||||
|
@ -294,6 +304,7 @@ public:
|
||||||
::comphelper::SequenceAsHashMap& GetMediaDescr() { return m_aMediaDescrHM; }
|
::comphelper::SequenceAsHashMap& GetMediaDescr() { return m_aMediaDescrHM; }
|
||||||
|
|
||||||
bool IsRecommendReadOnly() const { return m_bRecommendReadOnly; }
|
bool IsRecommendReadOnly() const { return m_bRecommendReadOnly; }
|
||||||
|
bool IsSignWithDefaultSignature() const { return m_bSignWithDefaultSignature; }
|
||||||
|
|
||||||
const ::comphelper::SequenceAsHashMap& GetDocProps();
|
const ::comphelper::SequenceAsHashMap& GetDocProps();
|
||||||
|
|
||||||
|
@ -1093,6 +1104,10 @@ bool ModelData_Impl::OutputFileDialog( sal_Int16 nStoreMode,
|
||||||
m_bRecommendReadOnly = ( pRecommendReadOnly && pRecommendReadOnly->GetValue() );
|
m_bRecommendReadOnly = ( pRecommendReadOnly && pRecommendReadOnly->GetValue() );
|
||||||
pDialogParams->ClearItem( SID_RECOMMENDREADONLY );
|
pDialogParams->ClearItem( SID_RECOMMENDREADONLY );
|
||||||
|
|
||||||
|
const SfxBoolItem* pSignWithDefaultKey = SfxItemSet::GetItem<SfxBoolItem>(&*pDialogParams, SID_GPGSIGN, false);
|
||||||
|
m_bSignWithDefaultSignature = (pSignWithDefaultKey && pSignWithDefaultKey->GetValue());
|
||||||
|
pDialogParams->ClearItem( SID_GPGSIGN );
|
||||||
|
|
||||||
uno::Sequence< beans::PropertyValue > aPropsFromDialog;
|
uno::Sequence< beans::PropertyValue > aPropsFromDialog;
|
||||||
TransformItems( nSlotID, *pDialogParams, aPropsFromDialog );
|
TransformItems( nSlotID, *pDialogParams, aPropsFromDialog );
|
||||||
GetMediaDescr() << aPropsFromDialog;
|
GetMediaDescr() << aPropsFromDialog;
|
||||||
|
@ -1878,6 +1893,52 @@ bool SfxStoringHelper::FinishGUIStoreModel(::comphelper::SequenceAsHashMap::cons
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (aModelData.IsSignWithDefaultSignature())
|
||||||
|
{
|
||||||
|
auto SignWithDefaultSignature = [&]()
|
||||||
|
{
|
||||||
|
#if HAVE_FEATURE_GPGME
|
||||||
|
auto aSigningKey = SvtUserOptions().GetSigningKey();
|
||||||
|
if (aSigningKey.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::vector<uno::Reference<xml::crypto::XXMLSecurityContext>> xSecurityContexts{
|
||||||
|
xml::crypto::SEInitializer::create(comphelper::getProcessComponentContext())
|
||||||
|
->createSecurityContext({}),
|
||||||
|
xml::crypto::GPGSEInitializer::create(comphelper::getProcessComponentContext())
|
||||||
|
->createSecurityContext({}),
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const auto& xSecurityContext : xSecurityContexts)
|
||||||
|
{
|
||||||
|
if (xSecurityContext.is())
|
||||||
|
{
|
||||||
|
css::uno::Reference<css::security::XCertificate> xCert
|
||||||
|
= comphelper::xmlsec::FindCertInContext(xSecurityContext, aSigningKey);
|
||||||
|
|
||||||
|
if (xCert.is() && SfxViewShell::Current())
|
||||||
|
{
|
||||||
|
SfxObjectShell* pDocShell = SfxViewShell::Current()->GetObjectShell();
|
||||||
|
bool bSigned = pDocShell->SignDocumentContentUsingCertificate(xCert);
|
||||||
|
if (bSigned && pDocShell->HasValidSignatures())
|
||||||
|
{
|
||||||
|
std::unique_ptr<weld::MessageDialog> xBox(
|
||||||
|
Application::CreateMessageDialog(
|
||||||
|
SfxStoringHelper::GetModelWindow(aModelData.GetModel()),
|
||||||
|
VclMessageType::Question, VclButtonsType::YesNo,
|
||||||
|
SfxResId(STR_QUERY_REMEMBERSIGNATURE)));
|
||||||
|
pDocShell->SetRememberCurrentSignature(xBox->run() == RET_YES);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
SignWithDefaultSignature();
|
||||||
|
}
|
||||||
|
|
||||||
// Launch PDF viewer
|
// Launch PDF viewer
|
||||||
if ( nStoreMode & PDFEXPORT_REQUESTED && !comphelper::LibreOfficeKit::isActive() )
|
if ( nStoreMode & PDFEXPORT_REQUESTED && !comphelper::LibreOfficeKit::isActive() )
|
||||||
{
|
{
|
||||||
|
|
|
@ -600,16 +600,7 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
|
||||||
{
|
{
|
||||||
std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog( pDialogParent,
|
std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog( pDialogParent,
|
||||||
VclMessageType::Question, VclButtonsType::YesNo, SfxResId(STR_QUERY_REMEMBERSIGNATURE)));
|
VclMessageType::Question, VclButtonsType::YesNo, SfxResId(STR_QUERY_REMEMBERSIGNATURE)));
|
||||||
if (xBox->run() == RET_YES)
|
SetRememberCurrentSignature(xBox->run() == RET_YES);
|
||||||
{
|
|
||||||
rSignatureInfosRemembered = GetDocumentSignatureInformation(false);
|
|
||||||
bRememberSignature = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rSignatureInfosRemembered = uno::Sequence< security::DocumentSignatureInformation >();
|
|
||||||
bRememberSignature = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -1899,6 +1890,20 @@ uno::Sequence< security::DocumentSignatureInformation > SfxObjectShell::GetDocum
|
||||||
return aResult;
|
return aResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SfxObjectShell::SetRememberCurrentSignature(bool bRemember)
|
||||||
|
{
|
||||||
|
if (bRemember)
|
||||||
|
{
|
||||||
|
rSignatureInfosRemembered = GetDocumentSignatureInformation(false);
|
||||||
|
bRememberSignature = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rSignatureInfosRemembered = uno::Sequence<security::DocumentSignatureInformation>();
|
||||||
|
bRememberSignature = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SignatureState SfxObjectShell::ImplGetSignatureState( bool bScriptingContent )
|
SignatureState SfxObjectShell::ImplGetSignatureState( bool bScriptingContent )
|
||||||
{
|
{
|
||||||
SignatureState* pState = bScriptingContent ? &pImpl->nScriptingSignatureState : &pImpl->nDocumentSignatureState;
|
SignatureState* pState = bScriptingContent ? &pImpl->nScriptingSignatureState : &pImpl->nDocumentSignatureState;
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config_gio.h>
|
#include <config_gio.h>
|
||||||
|
#include <config_gpgme.h>
|
||||||
|
|
||||||
#include <com/sun/star/awt/SystemDependentXWindow.hpp>
|
#include <com/sun/star/awt/SystemDependentXWindow.hpp>
|
||||||
#include <com/sun/star/awt/Toolkit.hpp>
|
#include <com/sun/star/awt/Toolkit.hpp>
|
||||||
|
@ -201,6 +202,7 @@ SalGtkFilePicker::SalGtkFilePicker( const uno::Reference< uno::XComponentContext
|
||||||
LABEL_TOGGLE( AUTOEXTENSION );
|
LABEL_TOGGLE( AUTOEXTENSION );
|
||||||
LABEL_TOGGLE( PASSWORD );
|
LABEL_TOGGLE( PASSWORD );
|
||||||
LABEL_TOGGLE( GPGENCRYPTION );
|
LABEL_TOGGLE( GPGENCRYPTION );
|
||||||
|
LABEL_TOGGLE( GPGSIGN );
|
||||||
LABEL_TOGGLE( FILTEROPTIONS );
|
LABEL_TOGGLE( FILTEROPTIONS );
|
||||||
LABEL_TOGGLE( READONLY );
|
LABEL_TOGGLE( READONLY );
|
||||||
LABEL_TOGGLE( LINK );
|
LABEL_TOGGLE( LINK );
|
||||||
|
@ -1118,6 +1120,7 @@ GtkWidget *SalGtkFilePicker::getWidget( sal_Int16 nControlId, GType *pType )
|
||||||
MAP_TOGGLE( AUTOEXTENSION );
|
MAP_TOGGLE( AUTOEXTENSION );
|
||||||
MAP_TOGGLE( PASSWORD );
|
MAP_TOGGLE( PASSWORD );
|
||||||
MAP_TOGGLE( GPGENCRYPTION );
|
MAP_TOGGLE( GPGENCRYPTION );
|
||||||
|
MAP_TOGGLE( GPGSIGN );
|
||||||
MAP_TOGGLE( FILTEROPTIONS );
|
MAP_TOGGLE( FILTEROPTIONS );
|
||||||
MAP_TOGGLE( READONLY );
|
MAP_TOGGLE( READONLY );
|
||||||
MAP_TOGGLE( LINK );
|
MAP_TOGGLE( LINK );
|
||||||
|
@ -1698,6 +1701,9 @@ void SalGtkFilePicker::impl_initialize(GtkWidget* pParentWidget, sal_Int16 templ
|
||||||
first_button_text = sSave.getStr();
|
first_button_text = sSave.getStr();
|
||||||
mbToggleVisibility[PASSWORD] = true;
|
mbToggleVisibility[PASSWORD] = true;
|
||||||
mbToggleVisibility[GPGENCRYPTION] = true;
|
mbToggleVisibility[GPGENCRYPTION] = true;
|
||||||
|
#if HAVE_FEATURE_GPGME
|
||||||
|
mbToggleVisibility[GPGSIGN] = true;
|
||||||
|
#endif
|
||||||
// TODO
|
// TODO
|
||||||
break;
|
break;
|
||||||
case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
|
case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
|
||||||
|
@ -1705,6 +1711,9 @@ void SalGtkFilePicker::impl_initialize(GtkWidget* pParentWidget, sal_Int16 templ
|
||||||
first_button_text = sSave.getStr();
|
first_button_text = sSave.getStr();
|
||||||
mbToggleVisibility[PASSWORD] = true;
|
mbToggleVisibility[PASSWORD] = true;
|
||||||
mbToggleVisibility[GPGENCRYPTION] = true;
|
mbToggleVisibility[GPGENCRYPTION] = true;
|
||||||
|
#if HAVE_FEATURE_GPGME
|
||||||
|
mbToggleVisibility[GPGSIGN] = true;
|
||||||
|
#endif
|
||||||
mbToggleVisibility[FILTEROPTIONS] = true;
|
mbToggleVisibility[FILTEROPTIONS] = true;
|
||||||
// TODO
|
// TODO
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -162,6 +162,7 @@ class SalGtkFilePicker : public SalGtkPicker, public SalGtkFilePicker_Base
|
||||||
PREVIEW,
|
PREVIEW,
|
||||||
SELECTION,
|
SELECTION,
|
||||||
GPGENCRYPTION,
|
GPGENCRYPTION,
|
||||||
|
GPGSIGN,
|
||||||
TOGGLE_LAST
|
TOGGLE_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ const struct
|
||||||
{ CHECKBOX_AUTOEXTENSION, STR_SVT_FILEPICKER_AUTO_EXTENSION },
|
{ CHECKBOX_AUTOEXTENSION, STR_SVT_FILEPICKER_AUTO_EXTENSION },
|
||||||
{ CHECKBOX_PASSWORD, STR_SVT_FILEPICKER_PASSWORD },
|
{ CHECKBOX_PASSWORD, STR_SVT_FILEPICKER_PASSWORD },
|
||||||
{ CHECKBOX_GPGENCRYPTION, STR_SVT_FILEPICKER_GPGENCRYPT },
|
{ CHECKBOX_GPGENCRYPTION, STR_SVT_FILEPICKER_GPGENCRYPT },
|
||||||
|
{ CHECKBOX_GPGSIGN, STR_SVT_FILEPICKER_GPGSIGN },
|
||||||
{ CHECKBOX_FILTEROPTIONS, STR_SVT_FILEPICKER_FILTER_OPTIONS },
|
{ CHECKBOX_FILTEROPTIONS, STR_SVT_FILEPICKER_FILTER_OPTIONS },
|
||||||
{ CHECKBOX_READONLY, STR_SVT_FILEPICKER_READONLY },
|
{ CHECKBOX_READONLY, STR_SVT_FILEPICKER_READONLY },
|
||||||
{ CHECKBOX_LINK, STR_SVT_FILEPICKER_INSERT_AS_LINK },
|
{ CHECKBOX_LINK, STR_SVT_FILEPICKER_INSERT_AS_LINK },
|
||||||
|
|
Loading…
Reference in a new issue