xref: /trunk/main/xmlsecurity/source/framework/decryptorimpl.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_xmlsecurity.hxx"
30 
31 #include "decryptorimpl.hxx"
32 #include <com/sun/star/xml/crypto/XXMLEncryptionTemplate.hpp>
33 #include <com/sun/star/xml/wrapper/XXMLElementWrapper.hpp>
34 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
35 
36 namespace cssu = com::sun::star::uno;
37 namespace cssl = com::sun::star::lang;
38 namespace cssxc = com::sun::star::xml::crypto;
39 namespace cssxw = com::sun::star::xml::wrapper;
40 
41 #define SERVICE_NAME "com.sun.star.xml.crypto.sax.Decryptor"
42 #define IMPLEMENTATION_NAME "com.sun.star.xml.security.framework.DecryptorImpl"
43 
44 #define DECLARE_ASCII( SASCIIVALUE )                                                                            \
45     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SASCIIVALUE ) )
46 
47 DecryptorImpl::DecryptorImpl( const cssu::Reference< cssl::XMultiServiceFactory >& rxMSF)
48 {
49     mxMSF = rxMSF;
50 }
51 
52 DecryptorImpl::~DecryptorImpl()
53 {
54 }
55 
56 bool DecryptorImpl::checkReady() const
57 /****** DecryptorImpl/checkReady *********************************************
58  *
59  *   NAME
60  *  checkReady -- checks the conditions for the decryption.
61  *
62  *   SYNOPSIS
63  *  bReady = checkReady( );
64  *
65  *   FUNCTION
66  *  checks whether all following conditions are satisfied:
67  *  1. the result listener is ready;
68  *  2. the EncryptionEngine is ready.
69  *
70  *   INPUTS
71  *  empty
72  *
73  *   RESULT
74  *  bReady - true if all conditions are satisfied, false otherwise
75  *
76  *   HISTORY
77  *  05.01.2004 -    implemented
78  *
79  *   AUTHOR
80  *  Michael Mi
81  *  Email: michael.mi@sun.com
82  ******************************************************************************/
83 {
84     return (m_xResultListener.is() && EncryptionEngine::checkReady());
85 }
86 
87 void DecryptorImpl::notifyResultListener() const
88     throw (cssu::Exception, cssu::RuntimeException)
89 /****** DecryptorImpl/notifyResultListener ***********************************
90  *
91  *   NAME
92  *  notifyResultListener -- notifies the listener about the decryption
93  *  result.
94  *
95  *   SYNOPSIS
96  *  notifyResultListener( );
97  *
98  *   FUNCTION
99  *  see NAME.
100  *
101  *   INPUTS
102  *  empty
103  *
104  *   RESULT
105  *  empty
106  *
107  *   HISTORY
108  *  05.01.2004 -    implemented
109  *
110  *   AUTHOR
111  *  Michael Mi
112  *  Email: michael.mi@sun.com
113  ******************************************************************************/
114 {
115     cssu::Reference< cssxc::sax::XDecryptionResultListener >
116         xDecryptionResultListener ( m_xResultListener , cssu::UNO_QUERY ) ;
117 
118     xDecryptionResultListener->decrypted(m_nSecurityId,m_nStatus);
119 }
120 
121 void DecryptorImpl::startEngine( const cssu::Reference<
122     cssxc::XXMLEncryptionTemplate >&
123     xEncryptionTemplate)
124     throw (cssu::Exception, cssu::RuntimeException)
125 /****** DecryptorImpl/startEngine ********************************************
126  *
127  *   NAME
128  *  startEngine -- decrypts the encryption.
129  *
130  *   SYNOPSIS
131  *  startEngine( xEncryptionTemplate );
132  *
133  *   FUNCTION
134  *  decrypts the encryption element, then if succeeds, updates the link
135  *  of old template element to the new encryption element in
136  *  SAXEventKeeper.
137  *
138  *   INPUTS
139  *  xEncryptionTemplate - the encryption template to be decrypted.
140  *
141  *   RESULT
142  *  empty
143  *
144  *   HISTORY
145  *  05.01.2004 -    implemented
146  *
147  *   AUTHOR
148  *  Michael Mi
149  *  Email: michael.mi@sun.com
150  ******************************************************************************/
151 {
152     cssu::Reference< cssxc::XXMLEncryptionTemplate > xResultTemplate;
153     try
154     {
155         xResultTemplate = m_xXMLEncryption->decrypt(xEncryptionTemplate, m_xXMLSecurityContext);
156         m_nStatus = xResultTemplate->getStatus();
157     }
158     catch( cssu::Exception& )
159     {
160         m_nStatus = cssxc::SecurityOperationStatus_RUNTIMEERROR_FAILED;
161     }
162 
163     if (m_nStatus == cssxc::SecurityOperationStatus_OPERATION_SUCCEEDED)
164     {
165         cssu::Reference< cssxw::XXMLElementWrapper > xDecryptedElement
166             = xResultTemplate->getTemplate();
167         m_xSAXEventKeeper->setElement(m_nIdOfTemplateEC, xDecryptedElement);
168     }
169 }
170 
171 /* XDecryptionResultBroadcaster */
172 void SAL_CALL DecryptorImpl::addDecryptionResultListener( const cssu::Reference< cssxc::sax::XDecryptionResultListener >& listener )
173         throw (cssu::Exception, cssu::RuntimeException)
174 {
175     m_xResultListener = listener;
176     tryToPerform();
177 }
178 
179 void SAL_CALL DecryptorImpl::removeDecryptionResultListener( const cssu::Reference< cssxc::sax::XDecryptionResultListener >&)
180         throw (cssu::RuntimeException)
181 {
182 }
183 
184 /* XInitialization */
185 void SAL_CALL DecryptorImpl::initialize( const cssu::Sequence< cssu::Any >& aArguments )
186     throw (cssu::Exception, cssu::RuntimeException)
187 {
188     OSL_ASSERT(aArguments.getLength() == 5);
189 
190     rtl::OUString ouTempString;
191 
192     aArguments[0] >>= ouTempString;
193     m_nSecurityId = ouTempString.toInt32();
194     aArguments[1] >>= m_xSAXEventKeeper;
195     aArguments[2] >>= ouTempString;
196     m_nIdOfTemplateEC = ouTempString.toInt32();
197     aArguments[3] >>= m_xXMLSecurityContext;
198     aArguments[4] >>= m_xXMLEncryption;
199 }
200 
201 rtl::OUString DecryptorImpl_getImplementationName ()
202     throw (cssu::RuntimeException)
203 {
204     return rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( IMPLEMENTATION_NAME ) );
205 }
206 
207 sal_Bool SAL_CALL DecryptorImpl_supportsService( const rtl::OUString& ServiceName )
208     throw (cssu::RuntimeException)
209 {
210     return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME ));
211 }
212 
213 cssu::Sequence< rtl::OUString > SAL_CALL DecryptorImpl_getSupportedServiceNames(  )
214     throw (cssu::RuntimeException)
215 {
216     cssu::Sequence < rtl::OUString > aRet(1);
217     rtl::OUString* pArray = aRet.getArray();
218     pArray[0] =  rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( SERVICE_NAME ) );
219     return aRet;
220 }
221 #undef SERVICE_NAME
222 
223 cssu::Reference< cssu::XInterface > SAL_CALL DecryptorImpl_createInstance( const cssu::Reference< cssl::XMultiServiceFactory >& rSMgr)
224     throw( cssu::Exception )
225 {
226     return (cppu::OWeakObject*) new DecryptorImpl(rSMgr);
227 }
228 
229 /* XServiceInfo */
230 rtl::OUString SAL_CALL DecryptorImpl::getImplementationName(  )
231     throw (cssu::RuntimeException)
232 {
233     return DecryptorImpl_getImplementationName();
234 }
235 sal_Bool SAL_CALL DecryptorImpl::supportsService( const rtl::OUString& rServiceName )
236     throw (cssu::RuntimeException)
237 {
238     return DecryptorImpl_supportsService( rServiceName );
239 }
240 cssu::Sequence< rtl::OUString > SAL_CALL DecryptorImpl::getSupportedServiceNames(  )
241     throw (cssu::RuntimeException)
242 {
243     return DecryptorImpl_getSupportedServiceNames();
244 }
245 
246