1*db859879SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*db859879SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*db859879SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*db859879SAndrew Rist  * distributed with this work for additional information
6*db859879SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*db859879SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*db859879SAndrew Rist  * "License"); you may not use this file except in compliance
9*db859879SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*db859879SAndrew Rist  *
11*db859879SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*db859879SAndrew Rist  *
13*db859879SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*db859879SAndrew Rist  * software distributed under the License is distributed on an
15*db859879SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*db859879SAndrew Rist  * KIND, either express or implied.  See the License for the
17*db859879SAndrew Rist  * specific language governing permissions and limitations
18*db859879SAndrew Rist  * under the License.
19*db859879SAndrew Rist  *
20*db859879SAndrew Rist  *************************************************************/
21*db859879SAndrew Rist 
22*db859879SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir package com.sun.star.xml.security.uno;
25cdf0e10cSrcweir 
26cdf0e10cSrcweir import java.util.Stack;
27cdf0e10cSrcweir import java.util.Vector;
28cdf0e10cSrcweir 
29cdf0e10cSrcweir /* uno classes */
30cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
31cdf0e10cSrcweir import com.sun.star.lang.XMultiComponentFactory;
32cdf0e10cSrcweir import com.sun.star.lang.XInitialization;
33cdf0e10cSrcweir import com.sun.star.uno.XComponentContext;
34cdf0e10cSrcweir import com.sun.star.xml.sax.XDocumentHandler;
35cdf0e10cSrcweir import com.sun.star.xml.sax.XAttributeList;
36cdf0e10cSrcweir import com.sun.star.xml.sax.SAXException;
37cdf0e10cSrcweir 
38cdf0e10cSrcweir import com.sun.star.xml.crypto.*;
39cdf0e10cSrcweir import com.sun.star.xml.crypto.sax.*;
40cdf0e10cSrcweir import com.sun.star.xml.wrapper.*;
41cdf0e10cSrcweir 
42cdf0e10cSrcweir /*
43cdf0e10cSrcweir  * the XMLSecurityFrameworkController class is used to controll the xml security framework.
44cdf0e10cSrcweir  */
45cdf0e10cSrcweir public class XMLSecurityFrameworkController
46cdf0e10cSrcweir 	implements XDocumentHandler, XSignatureCreationResultListener, XSignatureVerifyResultListener,
47cdf0e10cSrcweir 		   XEncryptionResultListener, XDecryptionResultListener, XSAXEventKeeperStatusChangeListener
48cdf0e10cSrcweir {
49cdf0e10cSrcweir 	/*
50cdf0e10cSrcweir 	 * UNO framework component
51cdf0e10cSrcweir 	 */
52cdf0e10cSrcweir 	private XMultiComponentFactory  m_xRemoteServiceManager;
53cdf0e10cSrcweir 	private XComponentContext       m_xRemoteContext;
54cdf0e10cSrcweir 
55cdf0e10cSrcweir 	/*
56cdf0e10cSrcweir 	 * xml security related UNO components
57cdf0e10cSrcweir 	 */
58cdf0e10cSrcweir 	private XSecuritySAXEventKeeper m_xSAXEventKeeper;
59cdf0e10cSrcweir 	private XXMLDocumentWrapper     m_xXMLDocumentWrapper;
60cdf0e10cSrcweir 	private XDocumentHandler        m_xOutputHandler;
61cdf0e10cSrcweir 	private XXMLSecurityContext     m_xXMLSecurityContext;
62cdf0e10cSrcweir 	private XXMLSignature           m_xXMLSignature;
63cdf0e10cSrcweir 	private XXMLEncryption          m_xXMLEncryption;
64cdf0e10cSrcweir 
65cdf0e10cSrcweir         /*
66cdf0e10cSrcweir          * used to reserve the current SAX ancestor path
67cdf0e10cSrcweir          */
68cdf0e10cSrcweir 	private Stack  m_currentPath;
69cdf0e10cSrcweir 
70cdf0e10cSrcweir 	/*
71cdf0e10cSrcweir 	 * maintains all SignatureEntities.
72cdf0e10cSrcweir 	 */
73cdf0e10cSrcweir 	private Vector m_signatureList;
74cdf0e10cSrcweir 
75cdf0e10cSrcweir 	/*
76cdf0e10cSrcweir 	 * maintains all EncryptionEntities.
77cdf0e10cSrcweir 	 */
78cdf0e10cSrcweir 	private Vector m_encryptionList;
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 	/*
81cdf0e10cSrcweir 	 * maintains all unsolved reference Ids.
82cdf0e10cSrcweir 	 * These ids are strings which is the value of the id attribute
83cdf0e10cSrcweir 	 * of the referenced element.
84cdf0e10cSrcweir 	 */
85cdf0e10cSrcweir 	private Vector m_vUnsolvedReferenceIds;
86cdf0e10cSrcweir 
87cdf0e10cSrcweir 	/*
88cdf0e10cSrcweir 	 * maintains all unsolved reference keeper ids.
89cdf0e10cSrcweir 	 * The keeper id is used to uniquely identify a bufferred element
90cdf0e10cSrcweir 	 * by the SAXEventKeeper.
91cdf0e10cSrcweir 	 */
92cdf0e10cSrcweir 	private Vector m_vUnsolvedReferencedKeeperIds;
93cdf0e10cSrcweir 
94cdf0e10cSrcweir 	/*
95cdf0e10cSrcweir 	 * maintains the left time that each unsolved reference can be
96cdf0e10cSrcweir 	 * claimed.
97cdf0e10cSrcweir 	 */
98cdf0e10cSrcweir 	private Vector m_vUnsolvedReferenceRefNum;
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 	/*
101cdf0e10cSrcweir 	 * whether exporting or importing
102cdf0e10cSrcweir 	 */
103cdf0e10cSrcweir 	private boolean m_bIsExporting;
104cdf0e10cSrcweir 
105cdf0e10cSrcweir 	/*
106cdf0e10cSrcweir 	 * whether java or c
107cdf0e10cSrcweir 	 */
108cdf0e10cSrcweir 	private boolean m_bIsJavaBased;
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 	/*
111cdf0e10cSrcweir 	 * whether the SAXEventKeeper is blocking
112cdf0e10cSrcweir 	 */
113cdf0e10cSrcweir 	private boolean m_bIsBlocking;
114cdf0e10cSrcweir 
115cdf0e10cSrcweir 	/*
116cdf0e10cSrcweir 	 * whether it is collecting a bufferred element
117cdf0e10cSrcweir 	 */
118cdf0e10cSrcweir 	private boolean m_bIsInsideCollectedElement;
119cdf0e10cSrcweir 
120cdf0e10cSrcweir 	/*
121cdf0e10cSrcweir 	 * whether a SAXEventKeeper is in the SAX chain
122cdf0e10cSrcweir 	 */
123cdf0e10cSrcweir 	private boolean m_bSAXEventKeeperIncluded;
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 	/*
126cdf0e10cSrcweir 	 * the ParsingThread used to parse the document
127cdf0e10cSrcweir 	 */
128cdf0e10cSrcweir 	private ParsingThread m_parsingThread;
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 	/*
131cdf0e10cSrcweir 	 * the next document handler that will receives SAX events
132cdf0e10cSrcweir 	 * from the parsing thread.
133cdf0e10cSrcweir 	 * if the SAXEventKeeper is on the SAX chain, then this
134cdf0e10cSrcweir 	 * variable will be the SAXEventKeeper, otherwise, this
135cdf0e10cSrcweir 	 * variable will be the xOutputHandler.
136cdf0e10cSrcweir 	 */
137cdf0e10cSrcweir 	private XDocumentHandler m_xExportHandler;
138cdf0e10cSrcweir 
139cdf0e10cSrcweir 	/*
140cdf0e10cSrcweir 	 * the TestTool used to feedback information
141cdf0e10cSrcweir 	 */
142cdf0e10cSrcweir 	private TestTool m_testTool;
143cdf0e10cSrcweir 
144cdf0e10cSrcweir 	/*
145cdf0e10cSrcweir 	 * for encryption target
146cdf0e10cSrcweir 	 */
147cdf0e10cSrcweir 	private boolean m_bIsEncryptionTarget;
148cdf0e10cSrcweir 	private EncryptionEntity m_EncryptionForTarget;
149cdf0e10cSrcweir 
XMLSecurityFrameworkController( TestTool testTool, boolean bIsExporting, boolean bIsJavaBased, XDocumentHandler xOutputHandler, ParsingThread parsingThread, XXMLSecurityContext xXMLSecurityContext, XXMLSignature xXMLSignature, XXMLEncryption xXMLEncryption, XMultiComponentFactory xRemoteServiceManager, XComponentContext xRemoteContext)150cdf0e10cSrcweir 	XMLSecurityFrameworkController(
151cdf0e10cSrcweir 		TestTool testTool,
152cdf0e10cSrcweir 		boolean bIsExporting,
153cdf0e10cSrcweir 		boolean bIsJavaBased,
154cdf0e10cSrcweir 		XDocumentHandler xOutputHandler,
155cdf0e10cSrcweir 		ParsingThread parsingThread,
156cdf0e10cSrcweir 		XXMLSecurityContext xXMLSecurityContext,
157cdf0e10cSrcweir 		XXMLSignature xXMLSignature,
158cdf0e10cSrcweir 		XXMLEncryption xXMLEncryption,
159cdf0e10cSrcweir 		XMultiComponentFactory xRemoteServiceManager,
160cdf0e10cSrcweir 		XComponentContext xRemoteContext)
161cdf0e10cSrcweir 	{
162cdf0e10cSrcweir 		m_bIsExporting = bIsExporting;
163cdf0e10cSrcweir 		m_bIsJavaBased = bIsJavaBased;
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 		m_xOutputHandler = xOutputHandler;
166cdf0e10cSrcweir 		m_xXMLSecurityContext = xXMLSecurityContext;
167cdf0e10cSrcweir 		m_xXMLSignature = xXMLSignature;
168cdf0e10cSrcweir 		m_xXMLEncryption = xXMLEncryption;
169cdf0e10cSrcweir 		m_xRemoteServiceManager = xRemoteServiceManager;
170cdf0e10cSrcweir 		m_xRemoteContext = xRemoteContext;
171cdf0e10cSrcweir 
172cdf0e10cSrcweir 		m_testTool = testTool;
173cdf0e10cSrcweir 		m_parsingThread = parsingThread;
174cdf0e10cSrcweir 
175cdf0e10cSrcweir 		m_signatureList = new Vector();
176cdf0e10cSrcweir 		m_encryptionList = new Vector();
177cdf0e10cSrcweir 
178cdf0e10cSrcweir 		m_vUnsolvedReferenceIds = new Vector();
179cdf0e10cSrcweir 		m_vUnsolvedReferencedKeeperIds = new Vector();
180cdf0e10cSrcweir 		m_vUnsolvedReferenceRefNum = new Vector();
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 		m_xXMLDocumentWrapper = null;
183cdf0e10cSrcweir 		m_xSAXEventKeeper = null;
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 		m_bSAXEventKeeperIncluded = false;
186cdf0e10cSrcweir 		m_bIsBlocking = false;
187cdf0e10cSrcweir 		m_bIsInsideCollectedElement = false;
188cdf0e10cSrcweir 
189cdf0e10cSrcweir 		m_bIsEncryptionTarget = false;
190cdf0e10cSrcweir 		m_EncryptionForTarget = null;
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 		changeOutput();
193cdf0e10cSrcweir 
194cdf0e10cSrcweir 		m_currentPath = new Stack();
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 		foundSecurityRelated();
197cdf0e10cSrcweir 	}
198cdf0e10cSrcweir 
199cdf0e10cSrcweir /**************************************************************************************
200cdf0e10cSrcweir  * private methods
201cdf0e10cSrcweir  **************************************************************************************/
202cdf0e10cSrcweir 
203cdf0e10cSrcweir         /*
204cdf0e10cSrcweir          * changes the output document handler.
205cdf0e10cSrcweir          */
changeOutput()206cdf0e10cSrcweir         private void changeOutput()
207cdf0e10cSrcweir         {
208cdf0e10cSrcweir 		if (m_bIsExporting)
209cdf0e10cSrcweir 		{
210cdf0e10cSrcweir 			m_parsingThread.setHandler(this);
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 			/*
213cdf0e10cSrcweir 			 * If the SAXEventKeeper is in the SAX chain, then redirects output
214cdf0e10cSrcweir 			 * to the SAXEventKeeper, otherwise, to the m_xOutputHandler
215cdf0e10cSrcweir 			 */
216cdf0e10cSrcweir 			if (m_bSAXEventKeeperIncluded)
217cdf0e10cSrcweir 			{
218cdf0e10cSrcweir 				m_xExportHandler = (XDocumentHandler)UnoRuntime.queryInterface(
219cdf0e10cSrcweir 							XDocumentHandler.class, m_xSAXEventKeeper);
220cdf0e10cSrcweir 				m_xSAXEventKeeper.setNextHandler(m_xOutputHandler);
221cdf0e10cSrcweir 
222cdf0e10cSrcweir 				m_testTool.updatesSAXChainInformation("XMLExporter -> SAXEventKeeper -> SAXWriter");
223cdf0e10cSrcweir 			}
224cdf0e10cSrcweir 			else
225cdf0e10cSrcweir 			{
226cdf0e10cSrcweir 				m_xExportHandler = m_xOutputHandler;
227cdf0e10cSrcweir 				m_testTool.updatesSAXChainInformation("XMLExporter -> SAXWriter");
228cdf0e10cSrcweir 			}
229cdf0e10cSrcweir 		}
230cdf0e10cSrcweir 		else
231cdf0e10cSrcweir 		{
232cdf0e10cSrcweir 			if (m_bSAXEventKeeperIncluded)
233cdf0e10cSrcweir 			{
234cdf0e10cSrcweir 				m_parsingThread.setHandler(
235cdf0e10cSrcweir 					(XDocumentHandler)UnoRuntime.queryInterface(XDocumentHandler.class, m_xSAXEventKeeper));
236cdf0e10cSrcweir 				m_xSAXEventKeeper.setNextHandler(this);
237cdf0e10cSrcweir 				m_testTool.updatesSAXChainInformation("SAXParser -> SAXEventKeeper -> XMLImporter");
238cdf0e10cSrcweir 			}
239cdf0e10cSrcweir 			else
240cdf0e10cSrcweir 			{
241cdf0e10cSrcweir 				m_parsingThread.setHandler(this);
242cdf0e10cSrcweir 				m_testTool.updatesSAXChainInformation("SAXParser -> XMLImporter");
243cdf0e10cSrcweir 			}
244cdf0e10cSrcweir 			m_xExportHandler = m_xOutputHandler;
245cdf0e10cSrcweir 		}
246cdf0e10cSrcweir 	}
247cdf0e10cSrcweir 
248cdf0e10cSrcweir         /*
249cdf0e10cSrcweir          * handles the situation when a security related element is found.
250cdf0e10cSrcweir          * if the SAXEventKeeper is not initialized, then creates a
251cdf0e10cSrcweir          * SAXEventKeeper.
252cdf0e10cSrcweir          * the return value represents whether the SAXEventKeeper is newly
253cdf0e10cSrcweir          * created.
254cdf0e10cSrcweir          */
foundSecurityRelated()255cdf0e10cSrcweir 	private boolean foundSecurityRelated()
256cdf0e10cSrcweir 	{
257cdf0e10cSrcweir 		if (m_xSAXEventKeeper == null)
258cdf0e10cSrcweir 		{
259cdf0e10cSrcweir 			m_testTool.showMessage("Message from : "+
260cdf0e10cSrcweir 						(m_bIsExporting?"XMLExporter":"XMLImporter")+
261cdf0e10cSrcweir 						"\n\nA security related content found, a SAXEventKeeper is created.\n ");
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 			m_bIsBlocking = false;
264cdf0e10cSrcweir 			m_bIsInsideCollectedElement = false;
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 			try
267cdf0e10cSrcweir 			{
268cdf0e10cSrcweir 				/*
269cdf0e10cSrcweir 				 * creates an XMLDocumentWrapper component.
270cdf0e10cSrcweir 				 */
271cdf0e10cSrcweir 				Object xmlDocumentObj = null;
272cdf0e10cSrcweir 
273cdf0e10cSrcweir 				if (m_bIsJavaBased)
274cdf0e10cSrcweir 				{
275cdf0e10cSrcweir 					xmlDocumentObj = m_xRemoteServiceManager.createInstanceWithContext(
276cdf0e10cSrcweir 						TestTool.XMLDOCUMENTWRAPPER_COMPONENT_JAVA, m_xRemoteContext);
277cdf0e10cSrcweir 				}
278cdf0e10cSrcweir 				else
279cdf0e10cSrcweir 				{
280cdf0e10cSrcweir 					xmlDocumentObj = m_xRemoteServiceManager.createInstanceWithContext(
281cdf0e10cSrcweir 						TestTool.XMLDOCUMENTWRAPPER_COMPONENT_C, m_xRemoteContext);
282cdf0e10cSrcweir 				}
283cdf0e10cSrcweir 
284cdf0e10cSrcweir 				m_xXMLDocumentWrapper = (XXMLDocumentWrapper)UnoRuntime.queryInterface(
285cdf0e10cSrcweir 					XXMLDocumentWrapper.class, xmlDocumentObj);
286cdf0e10cSrcweir 
287cdf0e10cSrcweir 				/*
288cdf0e10cSrcweir 				 * creates a SAXEventKeeper component.
289cdf0e10cSrcweir 				 */
290cdf0e10cSrcweir 				Object saxEventKeeperObj = m_xRemoteServiceManager.createInstanceWithContext(
291cdf0e10cSrcweir 					TestTool.SAXEVENTKEEPER_COMPONENT, m_xRemoteContext);
292cdf0e10cSrcweir 
293cdf0e10cSrcweir 				m_xSAXEventKeeper =
294cdf0e10cSrcweir 					(XSecuritySAXEventKeeper)UnoRuntime.queryInterface(
295cdf0e10cSrcweir 						XSecuritySAXEventKeeper.class, saxEventKeeperObj);
296cdf0e10cSrcweir 
297cdf0e10cSrcweir 	                        /*
298cdf0e10cSrcweir 	                         * initializes the SAXEventKeeper component with the XMLDocumentWrapper component.
299cdf0e10cSrcweir 	                         */
300cdf0e10cSrcweir 				XInitialization xInitialization =
301cdf0e10cSrcweir 					(XInitialization)UnoRuntime.queryInterface(
302cdf0e10cSrcweir 						XInitialization.class, m_xSAXEventKeeper);
303cdf0e10cSrcweir 				Object args[]=new Object[1];
304cdf0e10cSrcweir 				args[0] = m_xXMLDocumentWrapper;
305cdf0e10cSrcweir 				xInitialization.initialize(args);
306cdf0e10cSrcweir 			}
307cdf0e10cSrcweir 			catch( com.sun.star.uno.Exception e)
308cdf0e10cSrcweir 			{
309cdf0e10cSrcweir 				e.printStackTrace();
310cdf0e10cSrcweir 			}
311cdf0e10cSrcweir 
312cdf0e10cSrcweir 			/*
313cdf0e10cSrcweir 			 * configures the SAXEventKeeper's status change listener.
314cdf0e10cSrcweir 			 */
315cdf0e10cSrcweir 			XSAXEventKeeperStatusChangeBroadcaster xSaxEventKeeperStatusChangeBroadcaster =
316cdf0e10cSrcweir 				(XSAXEventKeeperStatusChangeBroadcaster)UnoRuntime.queryInterface(
317cdf0e10cSrcweir 					XSAXEventKeeperStatusChangeBroadcaster.class, m_xSAXEventKeeper);
318cdf0e10cSrcweir 			xSaxEventKeeperStatusChangeBroadcaster.addSAXEventKeeperStatusChangeListener(this);
319cdf0e10cSrcweir 		}
320cdf0e10cSrcweir 
321cdf0e10cSrcweir 		boolean rc = !m_bSAXEventKeeperIncluded;
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 		/*
324cdf0e10cSrcweir 		 * changes the export document handler.
325cdf0e10cSrcweir 		 */
326cdf0e10cSrcweir 		m_bSAXEventKeeperIncluded=true;
327cdf0e10cSrcweir 		changeOutput();
328cdf0e10cSrcweir 
329cdf0e10cSrcweir 		return rc;
330cdf0e10cSrcweir 	}
331cdf0e10cSrcweir 
332cdf0e10cSrcweir 	/*
333cdf0e10cSrcweir 	 * finds key element or referenced element for a signature.
334cdf0e10cSrcweir 	 */
findKeyOrReference(SecurityEntity signatureEntity, String uriStr, boolean isFindingKey)335cdf0e10cSrcweir 	private void findKeyOrReference(SecurityEntity signatureEntity, String uriStr, boolean isFindingKey)
336cdf0e10cSrcweir 	{
337cdf0e10cSrcweir 		int i=0;
338cdf0e10cSrcweir 
339cdf0e10cSrcweir 		while (i<m_vUnsolvedReferenceIds.size())
340cdf0e10cSrcweir 		{
341cdf0e10cSrcweir 			String id = (String)m_vUnsolvedReferenceIds.elementAt(i);
342cdf0e10cSrcweir 
343cdf0e10cSrcweir 			if (id.equals(uriStr))
344cdf0e10cSrcweir 			{
345cdf0e10cSrcweir 				int refNum = ((Integer)m_vUnsolvedReferenceRefNum.elementAt(i)).intValue();
346cdf0e10cSrcweir 				int keeperId = ((Integer)m_vUnsolvedReferencedKeeperIds.elementAt(i)).intValue();
347cdf0e10cSrcweir 
348cdf0e10cSrcweir 				if (isFindingKey)
349cdf0e10cSrcweir 				{
350cdf0e10cSrcweir 					/*
351cdf0e10cSrcweir 					 * clones a new ElementCollector for the key element.
352cdf0e10cSrcweir 					 */
353cdf0e10cSrcweir 					int cloneKeeperId = m_xSAXEventKeeper.cloneElementCollector(
354cdf0e10cSrcweir 						keeperId,
355cdf0e10cSrcweir 						m_bIsExporting?
356cdf0e10cSrcweir 						(ElementMarkPriority.BEFOREMODIFY):(ElementMarkPriority.AFTERMODIFY));
357cdf0e10cSrcweir 
358cdf0e10cSrcweir 					/*
359cdf0e10cSrcweir 					 * notifies the key keeper id.
360cdf0e10cSrcweir 					 */
361cdf0e10cSrcweir 					signatureEntity.setKeyId(cloneKeeperId);
362cdf0e10cSrcweir 
363cdf0e10cSrcweir 					/*
364cdf0e10cSrcweir 					 * sets the security id for the key.
365cdf0e10cSrcweir 					 */
366cdf0e10cSrcweir 					m_xSAXEventKeeper.setSecurityId(cloneKeeperId, signatureEntity.getSecurityId());
367cdf0e10cSrcweir 
368cdf0e10cSrcweir 					/*
369cdf0e10cSrcweir 					 * sets the resolve listener.
370cdf0e10cSrcweir 					 */
371cdf0e10cSrcweir 					XReferenceResolvedBroadcaster xReferenceResolvedBroadcaster =
372cdf0e10cSrcweir 						(XReferenceResolvedBroadcaster)UnoRuntime.queryInterface(
373cdf0e10cSrcweir 							XReferenceResolvedBroadcaster.class, m_xSAXEventKeeper);
374cdf0e10cSrcweir 					xReferenceResolvedBroadcaster.addReferenceResolvedListener(
375cdf0e10cSrcweir 						cloneKeeperId,
376cdf0e10cSrcweir 						signatureEntity.getReferenceListener());
377cdf0e10cSrcweir 				}
378cdf0e10cSrcweir 				else
379cdf0e10cSrcweir 				{
380cdf0e10cSrcweir 					/*
381cdf0e10cSrcweir 					 * clones a new ElementCollector for the referenced element.
382cdf0e10cSrcweir 					 */
383cdf0e10cSrcweir 					int cloneKeeperId = m_xSAXEventKeeper.cloneElementCollector(
384cdf0e10cSrcweir 						keeperId,
385cdf0e10cSrcweir 						m_bIsExporting?
386cdf0e10cSrcweir 						(ElementMarkPriority.AFTERMODIFY):(ElementMarkPriority.BEFOREMODIFY));
387cdf0e10cSrcweir 
388cdf0e10cSrcweir 					/*
389cdf0e10cSrcweir 					 * sets the security id.
390cdf0e10cSrcweir 					 */
391cdf0e10cSrcweir 					m_xSAXEventKeeper.setSecurityId(cloneKeeperId, signatureEntity.getSecurityId());
392cdf0e10cSrcweir 
393cdf0e10cSrcweir 					/*
394cdf0e10cSrcweir 					 * sets the resolve listener.
395cdf0e10cSrcweir 					 */
396cdf0e10cSrcweir 					XReferenceResolvedBroadcaster xReferenceResolvedBroadcaster =
397cdf0e10cSrcweir 						(XReferenceResolvedBroadcaster)UnoRuntime.queryInterface(
398cdf0e10cSrcweir 							XReferenceResolvedBroadcaster.class, m_xSAXEventKeeper);
399cdf0e10cSrcweir 					xReferenceResolvedBroadcaster.addReferenceResolvedListener(cloneKeeperId,
400cdf0e10cSrcweir 						signatureEntity.getReferenceListener());
401cdf0e10cSrcweir 
402cdf0e10cSrcweir 					try{
403cdf0e10cSrcweir 						XReferenceCollector xReferenceCollector =
404cdf0e10cSrcweir 							(XReferenceCollector)UnoRuntime.queryInterface(
405cdf0e10cSrcweir 								XReferenceCollector.class, signatureEntity.getReferenceListener());
406cdf0e10cSrcweir 						xReferenceCollector.setReferenceId(cloneKeeperId);
407cdf0e10cSrcweir 					}
408cdf0e10cSrcweir 					catch( com.sun.star.uno.Exception e)
409cdf0e10cSrcweir 					{
410cdf0e10cSrcweir 						e.printStackTrace();
411cdf0e10cSrcweir 					}
412cdf0e10cSrcweir 				}
413cdf0e10cSrcweir 
414cdf0e10cSrcweir 				/*
415cdf0e10cSrcweir 				 * if this unsolved reference reaches its max reference number, remove this reference
416cdf0e10cSrcweir 				 * from all vectors.
417cdf0e10cSrcweir 				 */
418cdf0e10cSrcweir 				refNum--;
419cdf0e10cSrcweir 				if (refNum == 0)
420cdf0e10cSrcweir 				{
421cdf0e10cSrcweir 					m_xSAXEventKeeper.removeElementCollector(keeperId);
422cdf0e10cSrcweir 					m_vUnsolvedReferenceIds.remove(i);
423cdf0e10cSrcweir 					m_vUnsolvedReferencedKeeperIds.remove(i);
424cdf0e10cSrcweir 					m_vUnsolvedReferenceRefNum.remove(i);
425cdf0e10cSrcweir 				}
426cdf0e10cSrcweir 				else
427cdf0e10cSrcweir 				{
428cdf0e10cSrcweir 					m_vUnsolvedReferenceRefNum.setElementAt(new Integer(refNum),(i));
429cdf0e10cSrcweir 					++i;
430cdf0e10cSrcweir 				}
431cdf0e10cSrcweir 
432cdf0e10cSrcweir 				/*
433cdf0e10cSrcweir 				 * If it is find a key, then no further search is needed, one
434cdf0e10cSrcweir 				 * signature has one key at most.
435cdf0e10cSrcweir 				 */
436cdf0e10cSrcweir 				if (isFindingKey)
437cdf0e10cSrcweir 				{
438cdf0e10cSrcweir 					break;
439cdf0e10cSrcweir 				}
440cdf0e10cSrcweir 			}
441cdf0e10cSrcweir 			else
442cdf0e10cSrcweir 			{
443cdf0e10cSrcweir 				++i;
444cdf0e10cSrcweir 			}
445cdf0e10cSrcweir 		}
446cdf0e10cSrcweir 	}
447cdf0e10cSrcweir 
448cdf0e10cSrcweir 	/*
449cdf0e10cSrcweir 	 * checks whether a startElement event represents any security related information.
450cdf0e10cSrcweir 	 * return true if this event can't be forwarded into the SAX chain.
451cdf0e10cSrcweir 	 */
checkSecurityElement(String localName, com.sun.star.xml.sax.XAttributeList xattribs)452cdf0e10cSrcweir 	private boolean checkSecurityElement(String localName, com.sun.star.xml.sax.XAttributeList xattribs)
453cdf0e10cSrcweir 	{
454cdf0e10cSrcweir 		boolean rc = false;
455cdf0e10cSrcweir 
456cdf0e10cSrcweir 		if (localName.equals("Signature"))
457cdf0e10cSrcweir 		/*
458cdf0e10cSrcweir 		 * this element is a Signature element.
459cdf0e10cSrcweir 		 */
460cdf0e10cSrcweir 		{
461cdf0e10cSrcweir 			SignatureEntity signatureEntity = new SignatureEntity(
462cdf0e10cSrcweir 				m_xSAXEventKeeper,
463cdf0e10cSrcweir 				m_bIsExporting,
464cdf0e10cSrcweir 				this,
465cdf0e10cSrcweir 				m_xXMLSecurityContext,
466cdf0e10cSrcweir 				m_xXMLSignature,
467cdf0e10cSrcweir 				m_xXMLEncryption,
468cdf0e10cSrcweir 				m_xRemoteServiceManager,
469cdf0e10cSrcweir 				m_xRemoteContext);
470cdf0e10cSrcweir 
471cdf0e10cSrcweir 			m_signatureList.add(signatureEntity);
472cdf0e10cSrcweir 			m_currentPath.push(signatureEntity);
473cdf0e10cSrcweir 		}
474cdf0e10cSrcweir 		else if(localName.equals("Reference"))
475cdf0e10cSrcweir 		{
476cdf0e10cSrcweir 			if (!m_currentPath.empty())
477cdf0e10cSrcweir 			{
478cdf0e10cSrcweir 				Object signedInfo = m_currentPath.pop();
479cdf0e10cSrcweir 
480cdf0e10cSrcweir 				if (!m_currentPath.empty())
481cdf0e10cSrcweir 				{
482cdf0e10cSrcweir 					Object objSignature = m_currentPath.peek();
483cdf0e10cSrcweir 
484cdf0e10cSrcweir 					if ((objSignature instanceof SignatureEntity) && signedInfo.toString().equals("SignedInfo"))
485cdf0e10cSrcweir 					/*
486cdf0e10cSrcweir 					 * this element is a Reference element in a signature.
487cdf0e10cSrcweir 					 */
488cdf0e10cSrcweir 					{
489cdf0e10cSrcweir 						String uriStr = xattribs.getValueByName("URI");
490cdf0e10cSrcweir 
491cdf0e10cSrcweir 						if (uriStr.charAt(0) == '#')
492cdf0e10cSrcweir 						{
493cdf0e10cSrcweir 							uriStr = uriStr.substring(1);
494cdf0e10cSrcweir 							SignatureEntity signatureEntity = (SignatureEntity)objSignature;
495cdf0e10cSrcweir 
496cdf0e10cSrcweir 							if (uriStr != null && uriStr.length()>0)
497cdf0e10cSrcweir 							{
498cdf0e10cSrcweir 								signatureEntity.addReferenceId(uriStr);
499cdf0e10cSrcweir 								findKeyOrReference(signatureEntity, uriStr, false);
500cdf0e10cSrcweir 							}
501cdf0e10cSrcweir 						}
502cdf0e10cSrcweir 					}
503cdf0e10cSrcweir 				}
504cdf0e10cSrcweir 				m_currentPath.push(signedInfo);
505cdf0e10cSrcweir 			}
506cdf0e10cSrcweir 			m_currentPath.push(localName);
507cdf0e10cSrcweir 		}
508cdf0e10cSrcweir 		else if(localName.equals("KeyValue") ||
509cdf0e10cSrcweir 		        localName.equals("KeyName") ||
510cdf0e10cSrcweir 		        localName.equals("X509Data") ||
511cdf0e10cSrcweir 		        localName.equals("EncryptedKey"))
512cdf0e10cSrcweir 		{
513cdf0e10cSrcweir 			if (!m_currentPath.empty())
514cdf0e10cSrcweir 			{
515cdf0e10cSrcweir 				Object keyInfo = m_currentPath.pop();
516cdf0e10cSrcweir 
517cdf0e10cSrcweir 				if (!m_currentPath.empty())
518cdf0e10cSrcweir 				{
519cdf0e10cSrcweir 					Object objSorE = m_currentPath.peek();
520cdf0e10cSrcweir 
521cdf0e10cSrcweir 					if ((objSorE instanceof SignatureEntity) && keyInfo.toString().equals("KeyInfo"))
522cdf0e10cSrcweir 					/*
523cdf0e10cSrcweir 					 * this element is the key element of a signature.
524cdf0e10cSrcweir 					 */
525cdf0e10cSrcweir 					{
526cdf0e10cSrcweir 						SignatureEntity signatureEntity = (SignatureEntity)objSorE;
527cdf0e10cSrcweir 						signatureEntity.setKeyId(0);
528cdf0e10cSrcweir 					}
529cdf0e10cSrcweir 					else if ((objSorE instanceof EncryptionEntity) && keyInfo.toString().equals("KeyInfo"))
530cdf0e10cSrcweir 					/*
531cdf0e10cSrcweir 					 * this element is the key element of an encryption.
532cdf0e10cSrcweir 					 */
533cdf0e10cSrcweir 					{
534cdf0e10cSrcweir 						EncryptionEntity theEncryption = (EncryptionEntity)objSorE;
535cdf0e10cSrcweir 						theEncryption.setKeyId(0);
536cdf0e10cSrcweir 					}
537cdf0e10cSrcweir 				}
538cdf0e10cSrcweir 				m_currentPath.push(keyInfo);
539cdf0e10cSrcweir 			}
540cdf0e10cSrcweir 
541cdf0e10cSrcweir 			m_currentPath.push(localName);
542cdf0e10cSrcweir 		}
543cdf0e10cSrcweir 		else if(localName.equals("RetrievalMethod"))
544cdf0e10cSrcweir 		{
545cdf0e10cSrcweir 			if (!m_currentPath.empty())
546cdf0e10cSrcweir 			{
547cdf0e10cSrcweir 				Object keyInfo = m_currentPath.pop();
548cdf0e10cSrcweir 
549cdf0e10cSrcweir 				if (!m_currentPath.empty())
550cdf0e10cSrcweir 				{
551cdf0e10cSrcweir 					Object objSorE = m_currentPath.peek();
552cdf0e10cSrcweir 
553cdf0e10cSrcweir 					if ((objSorE instanceof SignatureEntity) && keyInfo.toString().equals("KeyInfo"))
554cdf0e10cSrcweir 					/*
555cdf0e10cSrcweir 					 * this element is the RetrievalMethod element in a signature,
556cdf0e10cSrcweir 					 * which will include the key uri of this signature.
557cdf0e10cSrcweir 					 */
558cdf0e10cSrcweir 					{
559cdf0e10cSrcweir 						String uriStr = xattribs.getValueByName("URI");
560cdf0e10cSrcweir 						SignatureEntity signatureEntity = (SignatureEntity)objSorE;
561cdf0e10cSrcweir 
562cdf0e10cSrcweir 						if (uriStr != null && uriStr.length()>0)
563cdf0e10cSrcweir 						{
564cdf0e10cSrcweir 							signatureEntity.setKeyURI(uriStr);
565cdf0e10cSrcweir 							findKeyOrReference(signatureEntity,uriStr, true);
566cdf0e10cSrcweir 						}
567cdf0e10cSrcweir 					}
568cdf0e10cSrcweir 					else if ((objSorE instanceof EncryptionEntity) && keyInfo.toString().equals("KeyInfo"))
569cdf0e10cSrcweir 					/*
570cdf0e10cSrcweir 					 * this element is the RetrievalMethod element in an encryption,
571cdf0e10cSrcweir 					 * which will include the key uri of this encryption.
572cdf0e10cSrcweir 					 */
573cdf0e10cSrcweir 					{
574cdf0e10cSrcweir 						String uriStr = xattribs.getValueByName("URI");
575cdf0e10cSrcweir 						EncryptionEntity theEncryption = (EncryptionEntity)objSorE;
576cdf0e10cSrcweir 
577cdf0e10cSrcweir 						if (uriStr != null && uriStr.length()>0)
578cdf0e10cSrcweir 						{
579cdf0e10cSrcweir 							theEncryption.setKeyURI(uriStr);
580cdf0e10cSrcweir 							findKeyOrReference(theEncryption, uriStr, true);
581cdf0e10cSrcweir 						}
582cdf0e10cSrcweir 					}
583cdf0e10cSrcweir 				}
584cdf0e10cSrcweir 				m_currentPath.push(keyInfo);
585cdf0e10cSrcweir 			}
586cdf0e10cSrcweir 			m_currentPath.push(localName);
587cdf0e10cSrcweir 		}
588cdf0e10cSrcweir 		else if (localName.equals("EncryptedData")) /* || localName.equals("EncryptedKey")) */
589cdf0e10cSrcweir 		/*
590cdf0e10cSrcweir 		 * this element is an Encryption element.
591cdf0e10cSrcweir 		 */
592cdf0e10cSrcweir 		{
593cdf0e10cSrcweir 			EncryptionEntity theEncryption = new EncryptionEntity(
594cdf0e10cSrcweir 				m_xSAXEventKeeper,
595cdf0e10cSrcweir 				m_bIsExporting,
596cdf0e10cSrcweir 				this,
597cdf0e10cSrcweir 				m_xXMLSecurityContext,
598cdf0e10cSrcweir 				m_xXMLSignature,
599cdf0e10cSrcweir 				m_xXMLEncryption,
600cdf0e10cSrcweir 				m_xRemoteServiceManager,
601cdf0e10cSrcweir 				m_xRemoteContext);
602cdf0e10cSrcweir 
603cdf0e10cSrcweir 			m_encryptionList.add(theEncryption);
604cdf0e10cSrcweir 
605cdf0e10cSrcweir 			if (m_bIsExporting)
606cdf0e10cSrcweir 			{
607cdf0e10cSrcweir 				m_currentPath.push(theEncryption);
608cdf0e10cSrcweir 			}
609cdf0e10cSrcweir 			else
610cdf0e10cSrcweir 			{
611cdf0e10cSrcweir 				String uriStr = xattribs.getValueByName("keyURI");
612cdf0e10cSrcweir 				if (uriStr != null && uriStr.length()>0)
613cdf0e10cSrcweir 				{
614cdf0e10cSrcweir 					theEncryption.setKeyURI(uriStr);
615cdf0e10cSrcweir 					findKeyOrReference(theEncryption,uriStr, true);
616cdf0e10cSrcweir 				}
617cdf0e10cSrcweir 				else
618cdf0e10cSrcweir 				{
619cdf0e10cSrcweir 					theEncryption.setKeyId(0);
620cdf0e10cSrcweir 				}
621cdf0e10cSrcweir 
622cdf0e10cSrcweir 				rc = true;
623cdf0e10cSrcweir 			}
624cdf0e10cSrcweir 		}
625cdf0e10cSrcweir 		else
626cdf0e10cSrcweir 		/*
627cdf0e10cSrcweir 		 * not a security related element.
628cdf0e10cSrcweir 		 */
629cdf0e10cSrcweir 		{
630cdf0e10cSrcweir 			m_currentPath.push(localName);
631cdf0e10cSrcweir 		}
632cdf0e10cSrcweir 
633cdf0e10cSrcweir 		return rc;
634cdf0e10cSrcweir 	}
635cdf0e10cSrcweir 
636cdf0e10cSrcweir 	/*
637cdf0e10cSrcweir 	 * checks whether a startElement event is referenced by any security entity.
638cdf0e10cSrcweir 	 */
checkReference(String localName, com.sun.star.xml.sax.XAttributeList xattribs, String id)639cdf0e10cSrcweir 	private void checkReference(String localName, com.sun.star.xml.sax.XAttributeList xattribs, String id)
640cdf0e10cSrcweir 	{
641cdf0e10cSrcweir 		String refNumStr = xattribs.getValueByName("refNum");
642cdf0e10cSrcweir 
643cdf0e10cSrcweir 		if ( m_bIsEncryptionTarget )
644cdf0e10cSrcweir 		{
645cdf0e10cSrcweir 			m_EncryptionForTarget.setReference(m_bIsExporting);
646cdf0e10cSrcweir 			m_bIsEncryptionTarget = false;
647cdf0e10cSrcweir 		}
648cdf0e10cSrcweir 
649cdf0e10cSrcweir 		if (id != null && id.length()>0 )
650cdf0e10cSrcweir 		/*
651cdf0e10cSrcweir 		 * only if this element has id attribute, then it can be referenced by
652cdf0e10cSrcweir 		 * a security entity.
653cdf0e10cSrcweir 		 */
654cdf0e10cSrcweir 		{
655cdf0e10cSrcweir 			/*
656cdf0e10cSrcweir 			 * if this element has an "refNum" attribute, then the value will be
657cdf0e10cSrcweir 			 * the max referencing number on this element, otherwise, set the max
658cdf0e10cSrcweir 			 * referencing number to 999.
659cdf0e10cSrcweir 			 */
660cdf0e10cSrcweir 			int refNum = 999;
661cdf0e10cSrcweir 
662cdf0e10cSrcweir 			if (refNumStr != null && refNumStr.length()>0 )
663cdf0e10cSrcweir 			{
664cdf0e10cSrcweir 				refNum = new Integer(refNumStr).intValue();
665cdf0e10cSrcweir 			}
666cdf0e10cSrcweir 
667cdf0e10cSrcweir 			int length;
668cdf0e10cSrcweir 
669cdf0e10cSrcweir 			/*
670cdf0e10cSrcweir 			 * searches the signature list to check whether any sigture has
671cdf0e10cSrcweir 			 * reference on this element.
672cdf0e10cSrcweir 			 */
673cdf0e10cSrcweir 			length = m_signatureList.size();
674cdf0e10cSrcweir 			for (int i=0; i<length; ++i)
675cdf0e10cSrcweir 			{
676cdf0e10cSrcweir 				SignatureEntity signatureEntity = (SignatureEntity)m_signatureList.elementAt(i);
677cdf0e10cSrcweir 
678cdf0e10cSrcweir 				if (signatureEntity.setReference(id, m_bIsExporting))
679cdf0e10cSrcweir 				{
680cdf0e10cSrcweir 					refNum--;
681cdf0e10cSrcweir 				}
682cdf0e10cSrcweir 
683cdf0e10cSrcweir 				if (signatureEntity.setKey(id, m_bIsExporting))
684cdf0e10cSrcweir 				{
685cdf0e10cSrcweir 					refNum--;
686cdf0e10cSrcweir 				}
687cdf0e10cSrcweir 			}
688cdf0e10cSrcweir 
689cdf0e10cSrcweir 			/*
690cdf0e10cSrcweir 			 * searches the encryption list for reference.
691cdf0e10cSrcweir 			 */
692cdf0e10cSrcweir 			length = m_encryptionList.size();
693cdf0e10cSrcweir 			for (int i=0; i<length; ++i)
694cdf0e10cSrcweir 			{
695cdf0e10cSrcweir 				EncryptionEntity theEncryption = (EncryptionEntity)m_encryptionList.elementAt(i);
696cdf0e10cSrcweir 
697cdf0e10cSrcweir 				if (theEncryption.setKey(id, m_bIsExporting))
698cdf0e10cSrcweir 				{
699cdf0e10cSrcweir 					refNum--;
700cdf0e10cSrcweir 				}
701cdf0e10cSrcweir 			}
702cdf0e10cSrcweir 
703cdf0e10cSrcweir 			/*
704cdf0e10cSrcweir 			 * if the max referencing number is not reached, then add this element
705cdf0e10cSrcweir 			 * into the unsolved reference list.
706cdf0e10cSrcweir 			 */
707cdf0e10cSrcweir 			if (refNum>0)
708cdf0e10cSrcweir 			{
709cdf0e10cSrcweir 				int keeperId;
710cdf0e10cSrcweir 
711cdf0e10cSrcweir 				if (localName.equals("EncryptedKey"))
712cdf0e10cSrcweir 				{
713cdf0e10cSrcweir 					keeperId = m_xSAXEventKeeper.addSecurityElementCollector(
714cdf0e10cSrcweir 						m_bIsExporting?
715cdf0e10cSrcweir 						(ElementMarkPriority.BEFOREMODIFY):(ElementMarkPriority.AFTERMODIFY),
716cdf0e10cSrcweir 						true);
717cdf0e10cSrcweir 				}
718cdf0e10cSrcweir 				else
719cdf0e10cSrcweir 				{
720cdf0e10cSrcweir 					keeperId = m_xSAXEventKeeper.addSecurityElementCollector(
721cdf0e10cSrcweir 						m_bIsExporting?
722cdf0e10cSrcweir 						(ElementMarkPriority.AFTERMODIFY):(ElementMarkPriority.BEFOREMODIFY),
723cdf0e10cSrcweir 						false);
724cdf0e10cSrcweir 				}
725cdf0e10cSrcweir 
726cdf0e10cSrcweir 				m_vUnsolvedReferenceIds.add(id);
727cdf0e10cSrcweir 				m_vUnsolvedReferencedKeeperIds.add(new Integer(keeperId));
728cdf0e10cSrcweir 				m_vUnsolvedReferenceRefNum.add(new Integer(refNum));
729cdf0e10cSrcweir 			}
730cdf0e10cSrcweir 		}
731cdf0e10cSrcweir 	}
732cdf0e10cSrcweir 
733cdf0e10cSrcweir 	/*
734cdf0e10cSrcweir 	 * configures the output handler.
735cdf0e10cSrcweir 	 */
setOutputHandler(XDocumentHandler handler)736cdf0e10cSrcweir 	private void setOutputHandler(XDocumentHandler handler)
737cdf0e10cSrcweir 	{
738cdf0e10cSrcweir 		m_xOutputHandler = handler;
739cdf0e10cSrcweir 		changeOutput();
740cdf0e10cSrcweir 	}
741cdf0e10cSrcweir 
742cdf0e10cSrcweir 
743cdf0e10cSrcweir /**************************************************************************************
744cdf0e10cSrcweir  * protected methods
745cdf0e10cSrcweir  **************************************************************************************/
746cdf0e10cSrcweir 
747cdf0e10cSrcweir         /*
748cdf0e10cSrcweir          * methods used to transfer unsolved reference information.
749cdf0e10cSrcweir          */
getUnsolvedReferenceIds()750cdf0e10cSrcweir 	protected Vector getUnsolvedReferenceIds()
751cdf0e10cSrcweir 	{
752cdf0e10cSrcweir 		return m_vUnsolvedReferenceIds;
753cdf0e10cSrcweir 	}
754cdf0e10cSrcweir 
getUnsolvedReferenceKeeperIds()755cdf0e10cSrcweir 	protected Vector getUnsolvedReferenceKeeperIds()
756cdf0e10cSrcweir 	{
757cdf0e10cSrcweir 		return m_vUnsolvedReferencedKeeperIds;
758cdf0e10cSrcweir 	}
759cdf0e10cSrcweir 
getUnsolvedReferenceRefNum()760cdf0e10cSrcweir 	protected Vector getUnsolvedReferenceRefNum()
761cdf0e10cSrcweir 	{
762cdf0e10cSrcweir 		return m_vUnsolvedReferenceRefNum;
763cdf0e10cSrcweir 	}
764cdf0e10cSrcweir 
getBufferNodeTreeInformation()765cdf0e10cSrcweir 	protected String getBufferNodeTreeInformation()
766cdf0e10cSrcweir 	{
767cdf0e10cSrcweir 		if (m_xSAXEventKeeper != null)
768cdf0e10cSrcweir 		{
769cdf0e10cSrcweir 			return m_xSAXEventKeeper.printBufferNodeTree();
770cdf0e10cSrcweir 		}
771cdf0e10cSrcweir 		else
772cdf0e10cSrcweir 		{
773cdf0e10cSrcweir 			return null;
774cdf0e10cSrcweir 		}
775cdf0e10cSrcweir 	}
776cdf0e10cSrcweir 
getDocument(XDocumentHandler handler)777cdf0e10cSrcweir 	protected void getDocument(XDocumentHandler handler)
778cdf0e10cSrcweir 	{
779cdf0e10cSrcweir 		if (m_xXMLDocumentWrapper != null)
780cdf0e10cSrcweir 		{
781cdf0e10cSrcweir 			try
782cdf0e10cSrcweir 			{
783cdf0e10cSrcweir 				m_xXMLDocumentWrapper.getTree(handler);
784cdf0e10cSrcweir 			}
785cdf0e10cSrcweir 			catch(SAXException e)
786cdf0e10cSrcweir 			{
787cdf0e10cSrcweir 				e.printStackTrace();
788cdf0e10cSrcweir 			}
789cdf0e10cSrcweir 		}
790cdf0e10cSrcweir 	}
791cdf0e10cSrcweir 
endMission()792cdf0e10cSrcweir 	protected void endMission()
793cdf0e10cSrcweir 	{
794cdf0e10cSrcweir 		while (m_signatureList.size()>0 || m_encryptionList.size()>0)
795cdf0e10cSrcweir 		{
796cdf0e10cSrcweir 			if (m_signatureList.size()>0)
797cdf0e10cSrcweir 			{
798cdf0e10cSrcweir 				SignatureEntity signatureEntity = (SignatureEntity)m_signatureList.elementAt(0);
799cdf0e10cSrcweir 				m_signatureList.remove(0);
800cdf0e10cSrcweir 				signatureEntity.endMission();
801cdf0e10cSrcweir 			}
802cdf0e10cSrcweir 			else if (m_encryptionList.size()>0)
803cdf0e10cSrcweir 			{
804cdf0e10cSrcweir 				EncryptionEntity theEncryption = (EncryptionEntity)m_encryptionList.elementAt(0);
805cdf0e10cSrcweir 				m_encryptionList.remove(0);
806cdf0e10cSrcweir 				theEncryption.endMission();
807cdf0e10cSrcweir 			}
808cdf0e10cSrcweir 		}
809cdf0e10cSrcweir 
810cdf0e10cSrcweir 		while (m_vUnsolvedReferenceIds.size()>0)
811cdf0e10cSrcweir 		{
812cdf0e10cSrcweir 			int keeperId = ((Integer)m_vUnsolvedReferencedKeeperIds.elementAt(0)).intValue();
813cdf0e10cSrcweir 			m_xSAXEventKeeper.removeElementCollector(keeperId);
814cdf0e10cSrcweir 			m_vUnsolvedReferenceIds.remove(0);
815cdf0e10cSrcweir 			m_vUnsolvedReferencedKeeperIds.remove(0);
816cdf0e10cSrcweir 			m_vUnsolvedReferenceRefNum.remove(0);
817cdf0e10cSrcweir 		}
818cdf0e10cSrcweir 
819cdf0e10cSrcweir 		m_xSAXEventKeeper.setNextHandler(null);
820cdf0e10cSrcweir 
821cdf0e10cSrcweir 		XSAXEventKeeperStatusChangeBroadcaster xSaxEventKeeperStatusChangeBroadcaster =
822cdf0e10cSrcweir 			(XSAXEventKeeperStatusChangeBroadcaster)UnoRuntime.queryInterface(
823cdf0e10cSrcweir 				XSAXEventKeeperStatusChangeBroadcaster.class, m_xSAXEventKeeper);
824cdf0e10cSrcweir 		xSaxEventKeeperStatusChangeBroadcaster.addSAXEventKeeperStatusChangeListener(null);
825cdf0e10cSrcweir 
826cdf0e10cSrcweir 		m_xSAXEventKeeper = null;
827cdf0e10cSrcweir 		m_xXMLDocumentWrapper = null;
828cdf0e10cSrcweir 		m_xOutputHandler = null;
829cdf0e10cSrcweir 		m_xXMLSecurityContext = null;
830cdf0e10cSrcweir 		m_xXMLSignature = null;
831cdf0e10cSrcweir 		m_xXMLEncryption = null;
832cdf0e10cSrcweir 
833cdf0e10cSrcweir 		m_xExportHandler = null;
834cdf0e10cSrcweir 		m_parsingThread.setHandler(null);
835cdf0e10cSrcweir 	}
836cdf0e10cSrcweir 
837cdf0e10cSrcweir /**************************************************************************************
838cdf0e10cSrcweir  * public methods
839cdf0e10cSrcweir  **************************************************************************************/
840cdf0e10cSrcweir 
841cdf0e10cSrcweir 	/*
842cdf0e10cSrcweir 	 * XDocumentHandler
843cdf0e10cSrcweir 	 */
startDocument()844cdf0e10cSrcweir         public void startDocument()
845cdf0e10cSrcweir 	{
846cdf0e10cSrcweir 		try{
847cdf0e10cSrcweir 			m_xExportHandler.startDocument();
848cdf0e10cSrcweir 		}
849cdf0e10cSrcweir 		catch( com.sun.star.xml.sax.SAXException e)
850cdf0e10cSrcweir 		{
851cdf0e10cSrcweir 			e.printStackTrace();
852cdf0e10cSrcweir 		}
853cdf0e10cSrcweir 
854cdf0e10cSrcweir 	}
855cdf0e10cSrcweir 
endDocument()856cdf0e10cSrcweir         public void endDocument()
857cdf0e10cSrcweir 	{
858cdf0e10cSrcweir 		try{
859cdf0e10cSrcweir 			m_xExportHandler.endDocument();
860cdf0e10cSrcweir 		}
861cdf0e10cSrcweir 		catch( com.sun.star.xml.sax.SAXException e)
862cdf0e10cSrcweir 		{
863cdf0e10cSrcweir 			e.printStackTrace();
864cdf0e10cSrcweir 		}
865cdf0e10cSrcweir 	}
866cdf0e10cSrcweir 
startElement(String str, com.sun.star.xml.sax.XAttributeList xattribs)867cdf0e10cSrcweir 	public void startElement (String str, com.sun.star.xml.sax.XAttributeList xattribs)
868cdf0e10cSrcweir 	{
869cdf0e10cSrcweir 		try{
870cdf0e10cSrcweir 			String idAttr = xattribs.getValueByName("id");
871cdf0e10cSrcweir 			if (idAttr == null)
872cdf0e10cSrcweir 			{
873cdf0e10cSrcweir 				idAttr = xattribs.getValueByName("Id");
874cdf0e10cSrcweir 			}
875cdf0e10cSrcweir 
876cdf0e10cSrcweir 			boolean hasIdAttr = (idAttr != null && idAttr.length()>0 );
877cdf0e10cSrcweir 			boolean needResend = false;
878cdf0e10cSrcweir 
879cdf0e10cSrcweir 			if (hasIdAttr ||
880cdf0e10cSrcweir 			    (str.equals("Signature")||str.equals("EncryptedData")))/* || str.equals("EncryptedKey"))) */
881cdf0e10cSrcweir 			{
882cdf0e10cSrcweir 				if (foundSecurityRelated() && !m_bIsExporting)
883cdf0e10cSrcweir 				{
884cdf0e10cSrcweir 					needResend = true;
885cdf0e10cSrcweir 				}
886cdf0e10cSrcweir 			}
887cdf0e10cSrcweir 
888cdf0e10cSrcweir 			boolean suppressToNext = checkSecurityElement(str, xattribs);
889cdf0e10cSrcweir 
890cdf0e10cSrcweir 			checkReference(str, xattribs, idAttr);
891cdf0e10cSrcweir 
892cdf0e10cSrcweir 			if (needResend)
893cdf0e10cSrcweir 			{
894cdf0e10cSrcweir 				m_xSAXEventKeeper.setNextHandler(null);
895cdf0e10cSrcweir 
896cdf0e10cSrcweir 				XDocumentHandler saxEventKeeperHandler =
897cdf0e10cSrcweir 					(XDocumentHandler)UnoRuntime.queryInterface(
898cdf0e10cSrcweir 						XDocumentHandler.class, m_xSAXEventKeeper);
899cdf0e10cSrcweir 				saxEventKeeperHandler.startElement(str, xattribs);
900cdf0e10cSrcweir 				m_xSAXEventKeeper.setNextHandler((XDocumentHandler)this);
901cdf0e10cSrcweir 			}
902cdf0e10cSrcweir 
903cdf0e10cSrcweir 			if (!suppressToNext)
904cdf0e10cSrcweir 			{
905cdf0e10cSrcweir 				m_xExportHandler.startElement(str, xattribs);
906cdf0e10cSrcweir 			}
907cdf0e10cSrcweir 		}
908cdf0e10cSrcweir 		catch( com.sun.star.xml.sax.SAXException e)
909cdf0e10cSrcweir 		{
910cdf0e10cSrcweir 			e.printStackTrace();
911cdf0e10cSrcweir 		}
912cdf0e10cSrcweir 	}
913cdf0e10cSrcweir 
endElement(String str)914cdf0e10cSrcweir 	public void endElement(String str)
915cdf0e10cSrcweir 	{
916cdf0e10cSrcweir 		if (!m_currentPath.empty())
917cdf0e10cSrcweir 		{
918cdf0e10cSrcweir 	        	Object obj = m_currentPath.pop();
919cdf0e10cSrcweir 
920cdf0e10cSrcweir         		if (obj.toString().equals("SignedInfo"))
921cdf0e10cSrcweir         		{
922cdf0e10cSrcweir 				if (!m_currentPath.empty())
923cdf0e10cSrcweir 				{
924cdf0e10cSrcweir 		        		Object objSignature = m_currentPath.peek();
925cdf0e10cSrcweir 		        		if (objSignature != null && objSignature instanceof SignatureEntity)
926cdf0e10cSrcweir 	        			{
927cdf0e10cSrcweir 	        				((SignatureEntity)objSignature).setReferenceNumber();
928cdf0e10cSrcweir 	        			}
929cdf0e10cSrcweir 	        		}
930cdf0e10cSrcweir 	        	}
931cdf0e10cSrcweir 	        	else if (obj instanceof EncryptionEntity)
932cdf0e10cSrcweir 	        	{
933cdf0e10cSrcweir        				m_bIsEncryptionTarget = true;
934cdf0e10cSrcweir 				m_EncryptionForTarget = (EncryptionEntity)obj;
935cdf0e10cSrcweir 
936cdf0e10cSrcweir 	        	}
937cdf0e10cSrcweir         	}
938cdf0e10cSrcweir 
939cdf0e10cSrcweir 		try{
940cdf0e10cSrcweir 			m_xExportHandler.endElement(str);
941cdf0e10cSrcweir 		}
942cdf0e10cSrcweir 		catch( com.sun.star.xml.sax.SAXException e)
943cdf0e10cSrcweir 		{
944cdf0e10cSrcweir 			e.printStackTrace();
945cdf0e10cSrcweir 		}
946cdf0e10cSrcweir 	}
947cdf0e10cSrcweir 
characters(String str)948cdf0e10cSrcweir 	public void characters(String str)
949cdf0e10cSrcweir 	{
950cdf0e10cSrcweir 		try{
951cdf0e10cSrcweir 		        m_xExportHandler.characters(str);
952cdf0e10cSrcweir 		}
953cdf0e10cSrcweir 		catch( com.sun.star.xml.sax.SAXException e)
954cdf0e10cSrcweir 		{
955cdf0e10cSrcweir 			e.printStackTrace();
956cdf0e10cSrcweir 		}
957cdf0e10cSrcweir 	}
958cdf0e10cSrcweir 
ignorableWhitespace(String str)959cdf0e10cSrcweir 	public void ignorableWhitespace(String str)
960cdf0e10cSrcweir 	{
961cdf0e10cSrcweir 	}
962cdf0e10cSrcweir 
processingInstruction(String aTarget, String aData)963cdf0e10cSrcweir 	public void processingInstruction(String aTarget, String aData)
964cdf0e10cSrcweir 	{
965cdf0e10cSrcweir 		try{
966cdf0e10cSrcweir 			m_xExportHandler.processingInstruction(aTarget, aData);
967cdf0e10cSrcweir 		}
968cdf0e10cSrcweir 		catch( com.sun.star.xml.sax.SAXException e)
969cdf0e10cSrcweir 		{
970cdf0e10cSrcweir 			e.printStackTrace();
971cdf0e10cSrcweir 		}
972cdf0e10cSrcweir 	}
973cdf0e10cSrcweir 
setDocumentLocator(com.sun.star.xml.sax.XLocator xLocator )974cdf0e10cSrcweir 	public void setDocumentLocator (com.sun.star.xml.sax.XLocator xLocator )
975cdf0e10cSrcweir 		throws com.sun.star.xml.sax.SAXException
976cdf0e10cSrcweir 	{
977cdf0e10cSrcweir 	}
978cdf0e10cSrcweir 
979cdf0e10cSrcweir 
980cdf0e10cSrcweir 	/*
981cdf0e10cSrcweir 	 * XSignatureCreationResultListener
982cdf0e10cSrcweir 	 */
signatureCreated(int securityId, SecurityOperationStatus creationResult)983cdf0e10cSrcweir 	public void signatureCreated(int securityId, SecurityOperationStatus creationResult)
984cdf0e10cSrcweir 	{
985cdf0e10cSrcweir 		String message = new String();
986cdf0e10cSrcweir 		message += "A Signature is created:";
987cdf0e10cSrcweir 		message += "\nSecurity Id = "+securityId;
988cdf0e10cSrcweir 		message += "\nCreation result = "+((creationResult==SecurityOperationStatus.OPERATION_SUCCEEDED)?"Succeed":"Fail");
989cdf0e10cSrcweir 
990cdf0e10cSrcweir 		m_testTool.showMessage("Message from : SignatureCreator\n\n"+message+"\n ");
991cdf0e10cSrcweir 	}
992cdf0e10cSrcweir 
993cdf0e10cSrcweir 	/*
994cdf0e10cSrcweir 	 * XSignatureVerifyResultListener
995cdf0e10cSrcweir 	 */
signatureVerified(int securityId, SecurityOperationStatus verifyResult)996cdf0e10cSrcweir 	public void signatureVerified(int securityId, SecurityOperationStatus verifyResult)
997cdf0e10cSrcweir 	{
998cdf0e10cSrcweir 		String message = new String();
999cdf0e10cSrcweir 		message += "A Signature is verified:";
1000cdf0e10cSrcweir 		message += "\nSecurity Id = "+securityId;
1001cdf0e10cSrcweir 		message += "\nVerify result = "+((verifyResult==SecurityOperationStatus.OPERATION_SUCCEEDED)?"Succeed":"Fail");
1002cdf0e10cSrcweir 
1003cdf0e10cSrcweir 		m_testTool.showMessage("Message from : SignatureVerifier\n\n"+message+"\n ");
1004cdf0e10cSrcweir 	}
1005cdf0e10cSrcweir 
1006cdf0e10cSrcweir 	/*
1007cdf0e10cSrcweir 	 * XEncryptionResultListener
1008cdf0e10cSrcweir 	 */
encrypted(int securityId, SecurityOperationStatus encryptionResult)1009cdf0e10cSrcweir 	public void encrypted(int securityId, SecurityOperationStatus encryptionResult)
1010cdf0e10cSrcweir 	{
1011cdf0e10cSrcweir 		String message = new String();
1012cdf0e10cSrcweir 		message += "An EncryptedData is encrypted:";
1013cdf0e10cSrcweir 		message += "\nSecurity Id = "+securityId;
1014cdf0e10cSrcweir 		message += "\nEncrypt result = "+((encryptionResult==SecurityOperationStatus.OPERATION_SUCCEEDED)?"Succeed":"Fail");
1015cdf0e10cSrcweir 
1016cdf0e10cSrcweir 		m_testTool.showMessage("Message from : Encryptor\n\n"+message+"\n ");
1017cdf0e10cSrcweir 	}
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir 	/*
1020cdf0e10cSrcweir 	 * XDecryptionResultListener methods
1021cdf0e10cSrcweir 	 */
decrypted(int securityId, SecurityOperationStatus decryptionResult)1022cdf0e10cSrcweir 	public void decrypted(int securityId, SecurityOperationStatus decryptionResult)
1023cdf0e10cSrcweir 	{
1024cdf0e10cSrcweir 		String message = new String();
1025cdf0e10cSrcweir 		message += "An EncryptedData is decrypted:";
1026cdf0e10cSrcweir 		message += "\nSecurity Id = "+securityId;
1027cdf0e10cSrcweir 		message += "\nDecrypt result = "+((decryptionResult==SecurityOperationStatus.OPERATION_SUCCEEDED)?"Succeed":"Fail");
1028cdf0e10cSrcweir 
1029cdf0e10cSrcweir 		m_testTool.showMessage("Message from : Decryptor\n\n"+message+"\n ");
1030cdf0e10cSrcweir 	}
1031cdf0e10cSrcweir 
1032cdf0e10cSrcweir 	/*
1033cdf0e10cSrcweir 	 * XSAXEventKeeperStatusChangeListener methods
1034cdf0e10cSrcweir 	 */
blockingStatusChanged(boolean isBlocking)1035cdf0e10cSrcweir 	public void blockingStatusChanged(boolean isBlocking)
1036cdf0e10cSrcweir 	{
1037cdf0e10cSrcweir 		m_testTool.showMessage("Message from : SAXEventKeeper\n\n"+
1038cdf0e10cSrcweir 					(isBlocking?"The SAX event stream is blocked.":"The SAX event stream is unblocked.")+
1039cdf0e10cSrcweir 					"\n ");
1040cdf0e10cSrcweir 
1041cdf0e10cSrcweir 		this.m_bIsBlocking = isBlocking;
1042cdf0e10cSrcweir 	}
1043cdf0e10cSrcweir 
collectionStatusChanged(boolean isInsideCollectedElement)1044cdf0e10cSrcweir 	public void collectionStatusChanged(boolean isInsideCollectedElement)
1045cdf0e10cSrcweir 	{
1046cdf0e10cSrcweir 		m_testTool.showMessage("Message from : SAXEventKeeper\n\n"+
1047cdf0e10cSrcweir 					(isInsideCollectedElement?"Begin to buffer data ...":"End of data bufferring.")+
1048cdf0e10cSrcweir 					"\n ");
1049cdf0e10cSrcweir 
1050cdf0e10cSrcweir 		/*
1051cdf0e10cSrcweir 		this.m_bIsInsideCollectedElement = isInsideCollectedElement;
1052cdf0e10cSrcweir 
1053cdf0e10cSrcweir 		if ( !m_bIsInsideCollectedElement && !m_bIsBlocking)
1054cdf0e10cSrcweir 		{
1055cdf0e10cSrcweir 			m_bSAXEventKeeperIncluded = false;
1056cdf0e10cSrcweir 		}
1057cdf0e10cSrcweir 		else
1058cdf0e10cSrcweir 		{
1059cdf0e10cSrcweir 			m_bSAXEventKeeperIncluded = true;
1060cdf0e10cSrcweir 		}
1061cdf0e10cSrcweir 		changeOutput();
1062cdf0e10cSrcweir 		*/
1063cdf0e10cSrcweir 	}
1064cdf0e10cSrcweir 
bufferStatusChanged(boolean isBufferEmpty)1065cdf0e10cSrcweir 	public void bufferStatusChanged(boolean isBufferEmpty)
1066cdf0e10cSrcweir 	{
1067cdf0e10cSrcweir 		m_testTool.showMessage("Message from : SAXEventKeeper\n\n"+
1068cdf0e10cSrcweir 					(isBufferEmpty?"All bufferred data are released, the SAXEventKeeper is destroyed.":"buffer data appears.")+
1069cdf0e10cSrcweir 					"\n ");
1070cdf0e10cSrcweir 		/*
1071cdf0e10cSrcweir 		if (isBufferEmpty)
1072cdf0e10cSrcweir 		{
1073cdf0e10cSrcweir 			m_xXMLDocumentWrapper = null;
1074cdf0e10cSrcweir 			m_xSAXEventKeeper = null;
1075cdf0e10cSrcweir 			m_bSAXEventKeeperIncluded = false;
1076cdf0e10cSrcweir 			changeOutput();
1077cdf0e10cSrcweir 		}
1078cdf0e10cSrcweir 		*/
1079cdf0e10cSrcweir 	}
1080cdf0e10cSrcweir }
1081cdf0e10cSrcweir 
1082