Kaydet (Commit) e514a558 authored tarafından Miklos Vajna's avatar Miklos Vajna

xmlsecurity: allow creating multiple signatures with the same certificate

Now that the user can provide a description of the signature, it makes
sense to allow multiple signatures from the same user, assuming that the
descriptions explain the purpose of the different signatures.

Change-Id: I2cd4680594732d6b40dc3ffbcb6b4a9a6ca87919
üst ef16f72d
...@@ -46,7 +46,6 @@ private: ...@@ -46,7 +46,6 @@ private:
css::uno::Reference< css::uno::XComponentContext > mxCtx; css::uno::Reference< css::uno::XComponentContext > mxCtx;
css::uno::Reference< css::xml::crypto::XSecurityEnvironment > mxSecurityEnvironment; css::uno::Reference< css::xml::crypto::XSecurityEnvironment > mxSecurityEnvironment;
css::uno::Sequence< css::uno::Reference< css::security::XCertificate > > maCerts; css::uno::Sequence< css::uno::Reference< css::security::XCertificate > > maCerts;
SignatureInformations maCertsToIgnore;
VclPtr<SvSimpleTable> m_pCertLB; VclPtr<SvSimpleTable> m_pCertLB;
VclPtr<PushButton> m_pViewBtn; VclPtr<PushButton> m_pViewBtn;
...@@ -65,7 +64,7 @@ private: ...@@ -65,7 +64,7 @@ private:
void ImplInitialize(); void ImplInitialize();
public: public:
CertificateChooser( vcl::Window* pParent, css::uno::Reference< css::uno::XComponentContext>& rxCtx, css::uno::Reference< css::xml::crypto::XSecurityEnvironment >& rxSecurityEnvironment, const SignatureInformations& rCertsToIgnore ); CertificateChooser(vcl::Window* pParent, css::uno::Reference< css::uno::XComponentContext>& rxCtx, css::uno::Reference< css::xml::crypto::XSecurityEnvironment >& rxSecurityEnvironment);
virtual ~CertificateChooser(); virtual ~CertificateChooser();
virtual void dispose() override; virtual void dispose() override;
......
...@@ -439,7 +439,7 @@ Reference< css::security::XCertificate > DocumentDigitalSignatures::chooseCertif ...@@ -439,7 +439,7 @@ Reference< css::security::XCertificate > DocumentDigitalSignatures::chooseCertif
if ( aSignatureHelper.Init() ) if ( aSignatureHelper.Init() )
xSecEnv = aSignatureHelper.GetSecurityEnvironment(); xSecEnv = aSignatureHelper.GetSecurityEnvironment();
ScopedVclPtrInstance< CertificateChooser > aChooser( nullptr, mxCtx, xSecEnv, aSignatureHelper.GetSignatureInformations()); ScopedVclPtrInstance< CertificateChooser > aChooser(nullptr, mxCtx, xSecEnv);
if (aChooser->Execute() != RET_OK) if (aChooser->Execute() != RET_OK)
return Reference< css::security::XCertificate >(nullptr); return Reference< css::security::XCertificate >(nullptr);
......
...@@ -48,9 +48,8 @@ sal_uInt16 CertificateChooser::GetSelectedEntryPos() const ...@@ -48,9 +48,8 @@ sal_uInt16 CertificateChooser::GetSelectedEntryPos() const
return (sal_uInt16) nSel; return (sal_uInt16) nSel;
} }
CertificateChooser::CertificateChooser( vcl::Window* _pParent, uno::Reference< uno::XComponentContext>& _rxCtx, uno::Reference< css::xml::crypto::XSecurityEnvironment >& _rxSecurityEnvironment, const SignatureInformations& _rCertsToIgnore ) CertificateChooser::CertificateChooser(vcl::Window* _pParent, uno::Reference<uno::XComponentContext>& _rxCtx, uno::Reference<xml::crypto::XSecurityEnvironment>& _rxSecurityEnvironment)
: ModalDialog(_pParent, "SelectCertificateDialog", "xmlsec/ui/selectcertificatedialog.ui") : ModalDialog(_pParent, "SelectCertificateDialog", "xmlsec/ui/selectcertificatedialog.ui")
, maCertsToIgnore( _rCertsToIgnore )
{ {
get(m_pOKBtn, "ok"); get(m_pOKBtn, "ok");
get(m_pViewBtn, "viewcert"); get(m_pViewBtn, "viewcert");
...@@ -136,39 +135,13 @@ void CertificateChooser::ImplInitialize() ...@@ -136,39 +135,13 @@ void CertificateChooser::ImplInitialize()
::com::sun::star::security::SerialNumberAdapter::create(mxCtx); ::com::sun::star::security::SerialNumberAdapter::create(mxCtx);
sal_Int32 nCertificates = maCerts.getLength(); sal_Int32 nCertificates = maCerts.getLength();
sal_Int32 nCertificatesToIgnore = maCertsToIgnore.size();
for( sal_Int32 nCert = nCertificates; nCert; ) for( sal_Int32 nCert = nCertificates; nCert; )
{ {
uno::Reference< security::XCertificate > xCert = maCerts[ --nCert ]; uno::Reference< security::XCertificate > xCert = maCerts[ --nCert ];
bool bIgnoreThis = false; // Check if we have a private key for this...
long nCertificateCharacters = mxSecurityEnvironment->getCertificateCharacters(xCert);
// Do we already use that? if (!(nCertificateCharacters & security::CertificateCharacters::HAS_PRIVATE_KEY))
if( nCertificatesToIgnore )
{
OUString aIssuerName = xCert->getIssuerName();
for( sal_Int32 nSig = 0; nSig < nCertificatesToIgnore; ++nSig )
{
const SignatureInformation& rInf = maCertsToIgnore[ nSig ];
if ( ( aIssuerName == rInf.ouX509IssuerName ) &&
( xSerialNumberAdapter->toString( xCert->getSerialNumber() ) == rInf.ouX509SerialNumber ) )
{
bIgnoreThis = true;
break;
}
}
}
if ( !bIgnoreThis )
{
// Check if we have a private key for this...
long nCertificateCharacters = mxSecurityEnvironment->getCertificateCharacters( xCert );
if ( !( nCertificateCharacters & security::CertificateCharacters::HAS_PRIVATE_KEY ) )
bIgnoreThis = true;
}
if ( bIgnoreThis )
{ {
::comphelper::removeElementAt( maCerts, nCert ); ::comphelper::removeElementAt( maCerts, nCert );
nCertificates = maCerts.getLength(); nCertificates = maCerts.getLength();
......
...@@ -430,7 +430,7 @@ IMPL_LINK_NOARG_TYPED(DigitalSignaturesDialog, AddButtonHdl, Button*, void) ...@@ -430,7 +430,7 @@ IMPL_LINK_NOARG_TYPED(DigitalSignaturesDialog, AddButtonHdl, Button*, void)
uno::Reference<com::sun::star::security::XSerialNumberAdapter> xSerialNumberAdapter = uno::Reference<com::sun::star::security::XSerialNumberAdapter> xSerialNumberAdapter =
::com::sun::star::security::SerialNumberAdapter::create(mxCtx); ::com::sun::star::security::SerialNumberAdapter::create(mxCtx);
ScopedVclPtrInstance< CertificateChooser > aChooser( this, mxCtx, xSecEnv, maCurrentSignatureInformations ); ScopedVclPtrInstance< CertificateChooser > aChooser( this, mxCtx, xSecEnv );
if ( aChooser->Execute() == RET_OK ) if ( aChooser->Execute() == RET_OK )
{ {
uno::Reference< ::com::sun::star::security::XCertificate > xCert = aChooser->GetSelectedCertificate(); uno::Reference< ::com::sun::star::security::XCertificate > xCert = aChooser->GetSelectedCertificate();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment