/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
/* * private methods
*/ int XSecController::findSignatureInfor( sal_Int32 nSecurityId) const /****** XSecController/findSignatureInfor ************************************* * * NAME * findSignatureInfor -- find SignatureInformation struct for a particular * signature * * SYNOPSIS * index = findSignatureInfor( nSecurityId ); * * INPUTS * nSecurityId - the signature's id * * RESULT * index - the index of the signature, or -1 when no such signature * existing
******************************************************************************/
{ int i; int size = m_vInternalSignatureInformations.size();
for (i=0; i<size; ++i)
{ if (m_vInternalSignatureInformations[i].signatureInfor.nSecurityId == nSecurityId)
{ return i;
}
}
return -1;
}
void XSecController::createXSecComponent( ) /****** XSecController/createXSecComponent ************************************ * * NAME * bResult = createXSecComponent -- creates xml security components * * FUNCTION * Creates xml security components, including: * 1. an xml signature bridge component * 2. an XMLDocumentWrapper component * 3. a SAXEventKeeper component
******************************************************************************/
{ /* * marks all security components are not available.
*/
m_eStatusOfSecurityComponents = InitializationState::FAILTOINITIALIZED;
m_xXMLSignature = nullptr;
m_xXMLDocumentWrapper = nullptr;
m_xSAXEventKeeper = nullptr;
bool XSecController::chainOn() /****** XSecController/chainOn ************************************************ * * NAME * chainOn -- tries to connect the SAXEventKeeper with the SAX chain. * * SYNOPSIS * bJustChainingOn = chainOn(); * * FUNCTION * First, checks whether the SAXEventKeeper is on the SAX chain. If not, * creates xml security components, and chains the SAXEventKeeper into * the SAX chain. * Before being chained in, the SAXEventKeeper needs to receive all * missed key SAX events, which can promise the DOM tree buffered by the * SAXEventKeeper has the same structure with the original document. * * RESULT * bJustChainingOn - whether the SAXEventKeeper is just chained into the * SAX chain. * * NOTES * Sometimes, the last key SAX event can't be transferred to the * SAXEventKeeper together. * For instance, at the time a referenced element is detected, the * startElement event has already been reserved by the ElementStackKeeper. * Meanwhile, an ElementCollector needs to be created before the * SAXEventKeeper receives that startElement event. * So for the SAXEventKeeper, it needs to receive all missed key SAX * events except that startElement event, then adds a new * ElementCollector, then receives that startElement event.
******************************************************************************/
{ bool rc = false;
if (!m_bIsSAXEventKeeperSticky && !m_bIsSAXEventKeeperConnected)
{ if ( m_eStatusOfSecurityComponents == InitializationState::UNINITIALIZED )
{
createXSecComponent();
}
if ( m_eStatusOfSecurityComponents == InitializationState::INITIALIZED ) /* * if all security components are ready, chains on the SAXEventKeeper
*/
{ /* * disconnect the SAXEventKeeper with its current output handler, * to make sure no SAX event is forwarded during the connecting * phase.
*/
m_xSAXEventKeeper->setNextHandler( nullptr );
/* * connects the next document handler on the SAX chain
*/
m_xSAXEventKeeper->setNextHandler(uno::Reference<xml::sax::XDocumentHandler>());
m_bIsSAXEventKeeperConnected = true;
rc = true;
}
}
return rc;
}
void XSecController::chainOff() /****** XSecController/chainOff *********************************************** * * NAME * chainOff -- disconnects the SAXEventKeeper from the SAX chain.
******************************************************************************/
{ if (m_bIsSAXEventKeeperSticky ) return;
if (!m_bIsSAXEventKeeperConnected) return;
m_xSAXEventKeeper->setNextHandler( nullptr );
if ( m_xPreviousNodeOnSAXChain.is() )
{ if ( m_bIsPreviousNodeInitializable )
{
css::uno::Reference< css::lang::XInitialization > xInitialization
(m_xPreviousNodeOnSAXChain, css::uno::UNO_QUERY);
void XSecController::checkChainingStatus() /****** XSecController/checkChainingStatus ************************************ * * NAME * checkChainingStatus -- connects or disconnects the SAXEventKeeper * according to the current situation. * * SYNOPSIS * checkChainingStatus( ); * * FUNCTION * The SAXEventKeeper is chained into the SAX chain, when: * 1. some element is being collected, or * 2. the SAX event stream is blocking. * Otherwise, chain off the SAXEventKeeper.
******************************************************************************/
{ if ( m_bIsCollectingElement || m_bIsBlocking )
{
chainOn();
} else
{
chainOff();
}
}
void XSecController::initializeSAXChain() /****** XSecController/initializeSAXChain ************************************* * * NAME * initializeSAXChain -- initializes the SAX chain according to the * current setting. * * FUNCTION * Initializes the SAX chain, if the SAXEventKeeper is asked to be always * on the SAX chain, chains it on. Otherwise, starts the * ElementStackKeeper to reserve key SAX events.
******************************************************************************/
{
m_bIsSAXEventKeeperConnected = false;
m_bIsCollectingElement = false;
m_bIsBlocking = false;
chainOff();
}
css::uno::Reference< css::io::XInputStream >
XSecController::getObjectInputStream( const OUString& objectURL ) /****** XSecController/getObjectInputStream ************************************ * * NAME * getObjectInputStream -- get a XInputStream interface from a SotStorage * * SYNOPSIS * xInputStream = getObjectInputStream( objectURL ); * * INPUTS * objectURL - the object uri * * RESULT * xInputStream - the XInputStream interface
******************************************************************************/
{
css::uno::Reference< css::io::XInputStream > xObjectInputStream;
void XSecController::startMission(const rtl::Reference<UriBindingHelper>& xUriBinding, const css::uno::Reference< css::xml::crypto::XXMLSecurityContext >& xSecurityContext ) /****** XSecController/startMission ******************************************* * * NAME * startMission -- starts a new security mission. * * FUNCTION * get ready for a new mission. * * INPUTS * xUriBinding - the Uri binding that provide maps between uris and * XInputStreams * xSecurityContext - the security context component which can provide * cryptoken
******************************************************************************/
{
m_xUriBinding = xUriBinding;
void XSecController::setSAXChainConnector(const css::uno::Reference< css::lang::XInitialization >& xInitialization) /****** XSecController/setSAXChainConnector *********************************** * * NAME * setSAXChainConnector -- configures the components which will * collaborate with the SAXEventKeeper on the SAX chain. * * SYNOPSIS * setSAXChainConnector(xInitialization); * * INPUTS * xInitialization - the previous node on the SAX chain
******************************************************************************/
{
m_bIsPreviousNodeInitializable = true;
m_xPreviousNodeOnSAXChain = xInitialization;
initializeSAXChain( );
}
void XSecController::clearSAXChainConnector() /****** XSecController/clearSAXChainConnector ********************************* * * NAME * clearSAXChainConnector -- resets the collaborating components.
******************************************************************************/
{
chainOff();
m_xPreviousNodeOnSAXChain = nullptr;
}
void XSecController::endMission() /****** XSecController/endMission ********************************************* * * NAME * endMission -- forces to end all missions * * FUNCTION * Deletes all signature information and forces all missions to an end.
******************************************************************************/
{
sal_Int32 size = m_vInternalSignatureInformations.size();
for (int i=0; i<size; ++i)
{ if ( m_eStatusOfSecurityComponents == InitializationState::INITIALIZED ) /* * ResolvedListener only exist when the security components are created.
*/
{
css::uno::Reference< css::xml::crypto::sax::XMissionTaker > xMissionTaker
( m_vInternalSignatureInformations[i].xReferenceResolvedListener, css::uno::UNO_QUERY );
/* * asks the SignatureCreator/SignatureVerifier to release * all resources it uses.
*/
xMissionTaker->endMission();
}
}
/* * free the status change listener reference to this object
*/ if (m_xSAXEventKeeper.is())
m_xSAXEventKeeper->addSAXEventKeeperStatusChangeListener( nullptr );
}
void XSecController::exportSignature( const css::uno::Reference<css::xml::sax::XDocumentHandler>& xDocumentHandler, const SignatureInformation& signatureInfo, bool bXAdESCompliantIfODF ) /****** XSecController/exportSignature **************************************** * * NAME * exportSignature -- export a signature structure to an XDocumentHandler * * SYNOPSIS * exportSignature( xDocumentHandler, signatureInfo); * * INPUTS * xDocumentHandler - the document handler to receive the signature * signatureInfo - signature to be exported
******************************************************************************/
{ const SignatureReferenceInformations& vReferenceInfors = signatureInfo.vSignatureReferenceInfors;
rtl::Reference<comphelper::AttributeList> pAttributeList;
/* * Write Signature element
*/
pAttributeList = new comphelper::AttributeList();
pAttributeList->AddAttribute(
u"xmlns"_ustr,
NS_XMLDSIG);
if (!signatureInfo.ouSignatureId.isEmpty())
{
pAttributeList->AddAttribute(
u"Id"_ustr,
signatureInfo.ouSignatureId);
}
xDocumentHandler->startElement( u"Signature"_ustr, pAttributeList);
{ /* Write SignedInfo element */
xDocumentHandler->startElement(
u"SignedInfo"_ustr,
css::uno::Reference< css::xml::sax::XAttributeList > (new comphelper::AttributeList()));
{ /* Write CanonicalizationMethod element */
pAttributeList = new comphelper::AttributeList();
pAttributeList->AddAttribute(
u"Algorithm"_ustr,
ALGO_C14N);
xDocumentHandler->startElement( u"CanonicalizationMethod"_ustr, pAttributeList );
xDocumentHandler->endElement( u"CanonicalizationMethod"_ustr );
/* Write SignatureMethod element */
pAttributeList = new comphelper::AttributeList();
// TODO: actually roundtrip this value from parsing documentsignatures.xml - entirely // broken to assume this would in any way relate to the 1st reference's digest algo
// Assume that all Reference elements use the same DigestMethod:Algorithm, and that the // SignatureMethod:Algorithm should be the corresponding one.
pAttributeList->AddAttribute(
u"Algorithm"_ustr,
getSignatureURI(signatureInfo.eAlgorithmID, vReferenceInfors[0].nDigestID));
xDocumentHandler->startElement( u"SignatureMethod"_ustr, pAttributeList );
xDocumentHandler->endElement( u"SignatureMethod"_ustr );
/* Write Reference element */ int j; int refNum = vReferenceInfors.size();
OUStringBuffer buffer; //If the xml signature was already contained in the document, //then we use the original date and time string, rather than the //converted one. This avoids writing a different string due to //e.g. rounding issues and thus breaking the signature. if (!signatureInfo.ouDateTime.isEmpty())
buffer = signatureInfo.ouDateTime; else
{
buffer = utl::toISO8601(signatureInfo.stDateTime); // xsd:dateTime must use period as separator for fractional seconds, while // utl::toISO8601 uses comma (as allowed, and even recommended, by ISO8601).
buffer.replace(',', '.');
}
sDate = buffer.makeStringAndClear();
xDocumentHandler->characters( sDate );
SignatureInformations XSecController::getSignatureInformations() const
{
SignatureInformations vInfors; int sigNum = m_vInternalSignatureInformations.size();
for (int i=0; i<sigNum; ++i)
{
SignatureInformation si = m_vInternalSignatureInformations[i].signatureInfor;
vInfors.push_back(si);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.