Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : :
21 : : #include "signatureengine.hxx"
22 : : #include <com/sun/star/xml/crypto/XXMLSignatureTemplate.hpp>
23 : : #include <com/sun/star/xml/wrapper/XXMLElementWrapper.hpp>
24 : : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
25 : :
26 : : namespace cssu = com::sun::star::uno;
27 : : namespace cssl = com::sun::star::lang;
28 : : namespace cssxc = com::sun::star::xml::crypto;
29 : : namespace cssxw = com::sun::star::xml::wrapper;
30 : :
31 : : #define SIGNATURE_TEMPLATE "com.sun.star.xml.crypto.XMLSignatureTemplate"
32 : :
33 : 0 : SignatureEngine::SignatureEngine( )
34 : 0 : :m_nTotalReferenceNumber(-1)
35 : : {
36 : 0 : }
37 : :
38 : 0 : bool SignatureEngine::checkReady() const
39 : : /****** SignatureEngine/checkReady *******************************************
40 : : *
41 : : * NAME
42 : : * checkReady -- checks the conditions for the main operation.
43 : : *
44 : : * SYNOPSIS
45 : : * bReady = checkReady( );
46 : : *
47 : : * FUNCTION
48 : : * checks whether all following conditions are satisfied:
49 : : * 1. the main operation has't begun yet;
50 : : * 2. the key material is known;
51 : : * 3. the amount of reference is known;
52 : : * 4. all of referenced elements, the key element and the signature
53 : : * template are bufferred.
54 : : *
55 : : * INPUTS
56 : : * empty
57 : : *
58 : : * RESULT
59 : : * bReady - true if all conditions are satisfied, false otherwise
60 : : *
61 : : * AUTHOR
62 : : * Michael Mi
63 : : * Email: michael.mi@sun.com
64 : : ******************************************************************************/
65 : : {
66 : 0 : bool rc = true;
67 : :
68 : 0 : sal_Int32 nKeyInc = 0;
69 : 0 : if (m_nIdOfKeyEC != 0)
70 : : {
71 : 0 : nKeyInc = 1;
72 : : }
73 : :
74 : 0 : if (m_bMissionDone ||
75 : : m_nIdOfKeyEC == -1 ||
76 : : m_nTotalReferenceNumber == -1 ||
77 : : m_nTotalReferenceNumber+1+nKeyInc > m_nNumOfResolvedReferences)
78 : : {
79 : 0 : rc = false;
80 : : }
81 : :
82 : 0 : return rc;
83 : : }
84 : :
85 : 0 : void SignatureEngine::tryToPerform( )
86 : : throw (cssu::Exception, cssu::RuntimeException)
87 : : /****** SignatureEngine/tryToPerform *****************************************
88 : : *
89 : : * NAME
90 : : * tryToPerform -- tries to perform the signature operation.
91 : : *
92 : : * SYNOPSIS
93 : : * tryToPerform( );
94 : : *
95 : : * FUNCTION
96 : : * if the situation is ready, perform following operations.
97 : : * 1. prepares a signature template;
98 : : * 2. calls the signature bridge component;
99 : : * 3. clears up all used resources;
100 : : * 4. notifies the result listener;
101 : : * 5. sets the "accomplishment" flag.
102 : : *
103 : : * INPUTS
104 : : * empty
105 : : *
106 : : * RESULT
107 : : * empty
108 : : *
109 : : * AUTHOR
110 : : * Michael Mi
111 : : * Email: michael.mi@sun.com
112 : : ******************************************************************************/
113 : : {
114 : 0 : if (checkReady())
115 : : {
116 : : const rtl::OUString ouSignatureTemplate (
117 : 0 : RTL_CONSTASCII_USTRINGPARAM( SIGNATURE_TEMPLATE ) );
118 : : cssu::Reference < cssxc::XXMLSignatureTemplate >
119 : 0 : xSignatureTemplate( mxMSF->createInstance( ouSignatureTemplate ), cssu::UNO_QUERY );
120 : :
121 : : OSL_ASSERT( xSignatureTemplate.is() );
122 : :
123 : : cssu::Reference< cssxw::XXMLElementWrapper >
124 : 0 : xXMLElement = m_xSAXEventKeeper->getElement( m_nIdOfTemplateEC );
125 : :
126 : 0 : xSignatureTemplate->setTemplate(xXMLElement);
127 : :
128 : 0 : std::vector< sal_Int32 >::const_iterator ii = m_vReferenceIds.begin();
129 : :
130 : 0 : for( ; ii != m_vReferenceIds.end() ; ++ii )
131 : : {
132 : 0 : xXMLElement = m_xSAXEventKeeper->getElement( *ii );
133 : 0 : xSignatureTemplate->setTarget(xXMLElement);
134 : : }
135 : :
136 : : /*
137 : : * set the Uri binding
138 : : */
139 : 0 : xSignatureTemplate->setBinding( this );
140 : :
141 : 0 : startEngine( xSignatureTemplate );
142 : :
143 : : /*
144 : : * done
145 : : */
146 : 0 : clearUp( );
147 : :
148 : 0 : notifyResultListener();
149 : :
150 : 0 : m_bMissionDone = true;
151 : : }
152 : 0 : }
153 : :
154 : 0 : void SignatureEngine::clearUp( ) const
155 : : /****** SignatureEngine/clearUp **********************************************
156 : : *
157 : : * NAME
158 : : * clearUp -- clear up all resources used by this operation.
159 : : *
160 : : * SYNOPSIS
161 : : * clearUp( );
162 : : *
163 : : * FUNCTION
164 : : * cleaning resources up includes:
165 : : * 1. releases the ElementCollector for the signature template element;
166 : : * 2. releases ElementCollectors for referenced elements;
167 : : * 3. releases the ElementCollector for the key element, if there is one.
168 : : *
169 : : * INPUTS
170 : : * empty
171 : : *
172 : : * RESULT
173 : : * empty
174 : : *
175 : : * AUTHOR
176 : : * Michael Mi
177 : : * Email: michael.mi@sun.com
178 : : ******************************************************************************/
179 : : {
180 : : cssu::Reference < cssxc::sax::XReferenceResolvedBroadcaster >
181 : 0 : xReferenceResolvedBroadcaster( m_xSAXEventKeeper, cssu::UNO_QUERY );
182 : 0 : xReferenceResolvedBroadcaster->removeReferenceResolvedListener(
183 : : m_nIdOfTemplateEC,
184 : 0 : (const cssu::Reference < cssxc::sax::XReferenceResolvedListener >)((SecurityEngine *)this));
185 : :
186 : 0 : m_xSAXEventKeeper->removeElementCollector(m_nIdOfTemplateEC);
187 : :
188 : 0 : std::vector< sal_Int32 >::const_iterator ii = m_vReferenceIds.begin();
189 : :
190 : 0 : for( ; ii != m_vReferenceIds.end() ; ++ii )
191 : : {
192 : 0 : xReferenceResolvedBroadcaster->removeReferenceResolvedListener(
193 : 0 : *ii,
194 : 0 : (const cssu::Reference < cssxc::sax::XReferenceResolvedListener >)((SecurityEngine *)this));
195 : 0 : m_xSAXEventKeeper->removeElementCollector(*ii);
196 : : }
197 : :
198 : 0 : if (m_nIdOfKeyEC != 0 && m_nIdOfKeyEC != -1)
199 : : {
200 : 0 : m_xSAXEventKeeper->removeElementCollector(m_nIdOfKeyEC);
201 : 0 : }
202 : 0 : }
203 : :
204 : : /* XReferenceCollector */
205 : 0 : void SAL_CALL SignatureEngine::setReferenceCount( sal_Int32 count )
206 : : throw (cssu::Exception, cssu::RuntimeException)
207 : : {
208 : 0 : m_nTotalReferenceNumber = count;
209 : 0 : tryToPerform();
210 : 0 : }
211 : :
212 : 0 : void SAL_CALL SignatureEngine::setReferenceId( sal_Int32 id )
213 : : throw (cssu::Exception, cssu::RuntimeException)
214 : : {
215 : 0 : m_vReferenceIds.push_back( id );
216 : 0 : }
217 : :
218 : : /* XUriBinding */
219 : 0 : void SAL_CALL SignatureEngine::setUriBinding(
220 : : const rtl::OUString& uri,
221 : : const cssu::Reference< com::sun::star::io::XInputStream >& aInputStream )
222 : : throw (cssu::Exception, cssu::RuntimeException)
223 : : {
224 : 0 : m_vUris.push_back(uri);
225 : 0 : m_vXInputStreams.push_back(aInputStream);
226 : 0 : }
227 : :
228 : 0 : cssu::Reference< com::sun::star::io::XInputStream > SAL_CALL SignatureEngine::getUriBinding( const rtl::OUString& uri )
229 : : throw (cssu::Exception, cssu::RuntimeException)
230 : : {
231 : 0 : cssu::Reference< com::sun::star::io::XInputStream > xInputStream;
232 : :
233 : 0 : int size = m_vUris.size();
234 : :
235 : 0 : for( int i=0; i<size; ++i)
236 : : {
237 : 0 : if (m_vUris[i] == uri)
238 : : {
239 : 0 : xInputStream = m_vXInputStreams[i];
240 : 0 : break;
241 : : }
242 : : }
243 : :
244 : 0 : return xInputStream;
245 : : }
246 : :
247 : :
248 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|