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.Vector;
27cdf0e10cSrcweir 
28cdf0e10cSrcweir /* uno classes */
29cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
30cdf0e10cSrcweir import com.sun.star.lang.XMultiComponentFactory;
31cdf0e10cSrcweir import com.sun.star.lang.XInitialization;
32cdf0e10cSrcweir import com.sun.star.uno.XComponentContext;
33cdf0e10cSrcweir 
34cdf0e10cSrcweir import com.sun.star.xml.crypto.*;
35cdf0e10cSrcweir import com.sun.star.xml.crypto.sax.*;
36cdf0e10cSrcweir 
37cdf0e10cSrcweir /*
38cdf0e10cSrcweir  * this class maintains the data for a signature operation.
39cdf0e10cSrcweir  */
40cdf0e10cSrcweir class SignatureEntity extends SecurityEntity
41cdf0e10cSrcweir {
42cdf0e10cSrcweir 	private Vector m_vReferenceIds;
43cdf0e10cSrcweir 	private int    m_nSignatureElementCollectorId;
44cdf0e10cSrcweir 
SignatureEntity( XSecuritySAXEventKeeper xSAXEventKeeper, boolean isExporting, Object resultListener, XXMLSecurityContext xXMLSecurityContext, XXMLSignature xXMLSignature, XXMLEncryption xXMLEncryption, XMultiComponentFactory xRemoteServiceManager, XComponentContext xRemoteContext)45cdf0e10cSrcweir 	SignatureEntity(
46cdf0e10cSrcweir 		XSecuritySAXEventKeeper xSAXEventKeeper,
47cdf0e10cSrcweir 		boolean isExporting,
48cdf0e10cSrcweir 		Object resultListener,
49cdf0e10cSrcweir 		XXMLSecurityContext xXMLSecurityContext,
50cdf0e10cSrcweir 		XXMLSignature xXMLSignature,
51cdf0e10cSrcweir 		XXMLEncryption xXMLEncryption,
52cdf0e10cSrcweir 		XMultiComponentFactory xRemoteServiceManager,
53cdf0e10cSrcweir 		XComponentContext xRemoteContext)
54cdf0e10cSrcweir 	{
55cdf0e10cSrcweir 		super(xSAXEventKeeper, xXMLSecurityContext, xXMLSignature,
56cdf0e10cSrcweir 			xXMLEncryption, xRemoteServiceManager, xRemoteContext);
57cdf0e10cSrcweir 
58cdf0e10cSrcweir 		m_vReferenceIds = new Vector();
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 		if (isExporting)
61cdf0e10cSrcweir 		{
62cdf0e10cSrcweir 			m_nSignatureElementCollectorId = m_xSAXEventKeeper.addSecurityElementCollector(
63cdf0e10cSrcweir 				ElementMarkPriority.AFTERMODIFY,
64cdf0e10cSrcweir 				true);
65cdf0e10cSrcweir 
66cdf0e10cSrcweir 			m_xSAXEventKeeper.setSecurityId(m_nSignatureElementCollectorId, m_nSecurityId);
67cdf0e10cSrcweir 
68cdf0e10cSrcweir 			try
69cdf0e10cSrcweir 			{
70cdf0e10cSrcweir 				/*
71cdf0e10cSrcweir 				 * creates a SignatureCreator.
72cdf0e10cSrcweir 				 */
73cdf0e10cSrcweir 				Object signatureCreator = m_xRemoteServiceManager.createInstanceWithContext(
74cdf0e10cSrcweir 					TestTool.SIGNATURECREATOR_COMPONENT, m_xRemoteContext);
75cdf0e10cSrcweir 
76cdf0e10cSrcweir 				m_xReferenceResolvedListener =
77cdf0e10cSrcweir 					(XReferenceResolvedListener)UnoRuntime.queryInterface(
78cdf0e10cSrcweir 						XReferenceResolvedListener.class, signatureCreator);
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 	                        /*
81cdf0e10cSrcweir 	                         * initializes the SignatureCreator.
82cdf0e10cSrcweir 	                         */
83cdf0e10cSrcweir 				XInitialization xInitialization =
84cdf0e10cSrcweir 					(XInitialization)UnoRuntime.queryInterface(
85cdf0e10cSrcweir 						XInitialization.class, m_xReferenceResolvedListener);
86cdf0e10cSrcweir 
87cdf0e10cSrcweir 				Object args[]=new Object[5];
88cdf0e10cSrcweir 				args[0] = new Integer(m_nSecurityId).toString();
89cdf0e10cSrcweir 				args[1] = m_xSAXEventKeeper;
90cdf0e10cSrcweir 				args[2] = new Integer(m_nSignatureElementCollectorId).toString();
91cdf0e10cSrcweir 				args[3] = m_xXMLSecurityContext.getSecurityEnvironment();
92cdf0e10cSrcweir 				args[4] = m_xXMLSignature;
93cdf0e10cSrcweir 				xInitialization.initialize(args);
94cdf0e10cSrcweir 
95cdf0e10cSrcweir 				/*
96cdf0e10cSrcweir 				 * creates a Blocker.
97cdf0e10cSrcweir 				 */
98cdf0e10cSrcweir 				int blockerId = m_xSAXEventKeeper.addBlocker();
99cdf0e10cSrcweir 				m_xSAXEventKeeper.setSecurityId(blockerId, m_nSecurityId);
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 				XBlockerMonitor xBlockerMonitor = (XBlockerMonitor)UnoRuntime.queryInterface(
102cdf0e10cSrcweir 					XBlockerMonitor.class, m_xReferenceResolvedListener);
103cdf0e10cSrcweir 				xBlockerMonitor.setBlockerId(blockerId);
104cdf0e10cSrcweir 
105cdf0e10cSrcweir 				/*
106cdf0e10cSrcweir 				 * sets signature creation result listener.
107cdf0e10cSrcweir 				 */
108cdf0e10cSrcweir 				XSignatureCreationResultBroadcaster xSignatureCreationResultBroadcaster =
109cdf0e10cSrcweir 					(XSignatureCreationResultBroadcaster)UnoRuntime.queryInterface(
110cdf0e10cSrcweir 						XSignatureCreationResultBroadcaster.class, m_xReferenceResolvedListener);
111cdf0e10cSrcweir 				xSignatureCreationResultBroadcaster.addSignatureCreationResultListener(
112cdf0e10cSrcweir 					(XSignatureCreationResultListener)UnoRuntime.queryInterface(
113cdf0e10cSrcweir 						XSignatureCreationResultListener.class, resultListener));
114cdf0e10cSrcweir 			}
115cdf0e10cSrcweir 			catch( com.sun.star.uno.Exception e)
116cdf0e10cSrcweir 			{
117cdf0e10cSrcweir 				e.printStackTrace();
118cdf0e10cSrcweir 			}
119cdf0e10cSrcweir 
120cdf0e10cSrcweir 		}
121cdf0e10cSrcweir 		else
122cdf0e10cSrcweir 		{
123cdf0e10cSrcweir 			m_nSignatureElementCollectorId = m_xSAXEventKeeper.addSecurityElementCollector(
124cdf0e10cSrcweir 				ElementMarkPriority.BEFOREMODIFY, false);
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 			m_xSAXEventKeeper.setSecurityId(m_nSignatureElementCollectorId, m_nSecurityId);
127cdf0e10cSrcweir 
128cdf0e10cSrcweir 			try
129cdf0e10cSrcweir 			{
130cdf0e10cSrcweir 				/*
131cdf0e10cSrcweir 				 * creates a SignatureVerifier.
132cdf0e10cSrcweir 				 */
133cdf0e10cSrcweir 				Object signatureVerifier = m_xRemoteServiceManager.createInstanceWithContext(
134cdf0e10cSrcweir 					TestTool.SIGNATUREVERIFIER_COMPONENT, m_xRemoteContext);
135cdf0e10cSrcweir 
136cdf0e10cSrcweir 				m_xReferenceResolvedListener =
137cdf0e10cSrcweir 					(XReferenceResolvedListener)UnoRuntime.queryInterface(
138cdf0e10cSrcweir 						XReferenceResolvedListener.class, signatureVerifier);
139cdf0e10cSrcweir 
140cdf0e10cSrcweir 	                        /*
141cdf0e10cSrcweir 	                         * initializes the SignatureVerifier.
142cdf0e10cSrcweir 	                         */
143cdf0e10cSrcweir 				XInitialization xInitialization =
144cdf0e10cSrcweir 					(XInitialization)UnoRuntime.queryInterface(
145cdf0e10cSrcweir 						XInitialization.class, m_xReferenceResolvedListener);
146cdf0e10cSrcweir 				Object args[]=new Object[5];
147cdf0e10cSrcweir 				args[0] = new Integer(m_nSecurityId).toString();
148cdf0e10cSrcweir 				args[1] = m_xSAXEventKeeper;
149cdf0e10cSrcweir 				args[2] = new Integer(m_nSignatureElementCollectorId).toString();
150cdf0e10cSrcweir 				args[3] = m_xXMLSecurityContext;
151cdf0e10cSrcweir 				args[4] = m_xXMLSignature;
152cdf0e10cSrcweir 				xInitialization.initialize(args);
153cdf0e10cSrcweir 
154cdf0e10cSrcweir 				/*
155cdf0e10cSrcweir 				 * sets signature verify result listener.
156cdf0e10cSrcweir 				 */
157cdf0e10cSrcweir 				XSignatureVerifyResultBroadcaster xSignatureVerifyResultBroadcaster =
158cdf0e10cSrcweir 					(XSignatureVerifyResultBroadcaster)UnoRuntime.queryInterface(
159cdf0e10cSrcweir 						XSignatureVerifyResultBroadcaster.class, m_xReferenceResolvedListener);
160cdf0e10cSrcweir 				xSignatureVerifyResultBroadcaster.addSignatureVerifyResultListener(
161cdf0e10cSrcweir 					(XSignatureVerifyResultListener)UnoRuntime.queryInterface(
162cdf0e10cSrcweir 						XSignatureVerifyResultListener.class, resultListener));
163cdf0e10cSrcweir 			}
164cdf0e10cSrcweir 			catch( com.sun.star.uno.Exception e)
165cdf0e10cSrcweir 			{
166cdf0e10cSrcweir 				e.printStackTrace();
167cdf0e10cSrcweir 			}
168cdf0e10cSrcweir 		}
169cdf0e10cSrcweir 
170cdf0e10cSrcweir 		/*
171cdf0e10cSrcweir 		 * configures the resolve listener for the signature template.
172cdf0e10cSrcweir 		 */
173cdf0e10cSrcweir 		XReferenceResolvedBroadcaster xReferenceResolvedBroadcaster =
174cdf0e10cSrcweir 			(XReferenceResolvedBroadcaster)UnoRuntime.queryInterface(
175cdf0e10cSrcweir 				XReferenceResolvedBroadcaster.class, m_xSAXEventKeeper);
176cdf0e10cSrcweir 		xReferenceResolvedBroadcaster.addReferenceResolvedListener(
177cdf0e10cSrcweir 			m_nSignatureElementCollectorId, m_xReferenceResolvedListener);
178cdf0e10cSrcweir 	}
179cdf0e10cSrcweir 
180cdf0e10cSrcweir /**************************************************************************************
181cdf0e10cSrcweir  * private methods
182cdf0e10cSrcweir  **************************************************************************************/
183cdf0e10cSrcweir 
184cdf0e10cSrcweir 	/*
185cdf0e10cSrcweir 	 * checks whether this signature has a reference with
186cdf0e10cSrcweir 	 * the particular id.
187cdf0e10cSrcweir 	 */
hasReference(String id)188cdf0e10cSrcweir 	private boolean hasReference(String id)
189cdf0e10cSrcweir 	{
190cdf0e10cSrcweir 		boolean rc = false;
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 		int length = m_vReferenceIds.size();
193cdf0e10cSrcweir 		for (int i=0; i<length; ++i)
194cdf0e10cSrcweir 		{
195cdf0e10cSrcweir 			if (id.equals((String)m_vReferenceIds.elementAt(i)))
196cdf0e10cSrcweir 			{
197cdf0e10cSrcweir 				rc = true;
198cdf0e10cSrcweir 				break;
199cdf0e10cSrcweir 			}
200cdf0e10cSrcweir 		}
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 		return rc;
203cdf0e10cSrcweir 	}
204cdf0e10cSrcweir 
205cdf0e10cSrcweir 
206cdf0e10cSrcweir /**************************************************************************************
207cdf0e10cSrcweir  * protected methods
208cdf0e10cSrcweir  **************************************************************************************/
209cdf0e10cSrcweir 
210cdf0e10cSrcweir 	/*
211cdf0e10cSrcweir 	 * adds a new reference id.
212cdf0e10cSrcweir 	 */
addReferenceId(String referenceId)213cdf0e10cSrcweir 	protected void addReferenceId(String referenceId)
214cdf0e10cSrcweir 	{
215cdf0e10cSrcweir 		m_vReferenceIds.add(referenceId);
216cdf0e10cSrcweir 	}
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 	/*
219cdf0e10cSrcweir 	 * notifies how many reference in this signature.
220cdf0e10cSrcweir 	 */
setReferenceNumber()221cdf0e10cSrcweir 	protected void setReferenceNumber()
222cdf0e10cSrcweir 	{
223cdf0e10cSrcweir 		try
224cdf0e10cSrcweir 		{
225cdf0e10cSrcweir 			XReferenceCollector xReferenceCollector =
226cdf0e10cSrcweir 				(XReferenceCollector)UnoRuntime.queryInterface(
227cdf0e10cSrcweir 					XReferenceCollector.class, m_xReferenceResolvedListener);
228cdf0e10cSrcweir 			xReferenceCollector.setReferenceCount(m_vReferenceIds.size());
229cdf0e10cSrcweir 		}
230cdf0e10cSrcweir 		catch( com.sun.star.uno.Exception e)
231cdf0e10cSrcweir 		{
232cdf0e10cSrcweir 			e.printStackTrace();
233cdf0e10cSrcweir 		}
234cdf0e10cSrcweir 	}
235cdf0e10cSrcweir 
236cdf0e10cSrcweir 	/*
237cdf0e10cSrcweir 	 * tries to add a reference to this signature.
238cdf0e10cSrcweir 	 *
239cdf0e10cSrcweir 	 * If the specific id belongs to this signature's references, then:
240cdf0e10cSrcweir 	 * 1. askes the SAXEventKeeper to add a ElementCollector to for the new
241cdf0e10cSrcweir 	 * referenced element;
242cdf0e10cSrcweir 	 * 2. configures this ElementCollector's security id;
243cdf0e10cSrcweir 	 * 3. tells the SAXEventKeeper which listener will receive the reference
244cdf0e10cSrcweir 	 * resolved notification.
245cdf0e10cSrcweir 	 * 4. notifies the SignatureCollector about the reference id.
246cdf0e10cSrcweir 	 */
setReference(String id, boolean isExporting)247cdf0e10cSrcweir 	protected boolean setReference(String id, boolean isExporting)
248cdf0e10cSrcweir 	{
249cdf0e10cSrcweir 		boolean rc = false;
250cdf0e10cSrcweir 
251cdf0e10cSrcweir 		if (hasReference(id))
252cdf0e10cSrcweir 		{
253cdf0e10cSrcweir 			int referenceId = m_xSAXEventKeeper.addSecurityElementCollector(
254cdf0e10cSrcweir 				isExporting?
255cdf0e10cSrcweir 				(ElementMarkPriority.AFTERMODIFY):(ElementMarkPriority.BEFOREMODIFY),
256cdf0e10cSrcweir 				false );
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 			m_xSAXEventKeeper.setSecurityId(referenceId, m_nSecurityId);
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 			XReferenceResolvedBroadcaster xReferenceResolvedBroadcaster =
261cdf0e10cSrcweir 				(XReferenceResolvedBroadcaster)UnoRuntime.queryInterface(
262cdf0e10cSrcweir 					XReferenceResolvedBroadcaster.class, m_xSAXEventKeeper);
263cdf0e10cSrcweir 			xReferenceResolvedBroadcaster.addReferenceResolvedListener(
264cdf0e10cSrcweir 				referenceId, m_xReferenceResolvedListener);
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 			try
267cdf0e10cSrcweir 			{
268cdf0e10cSrcweir 				XReferenceCollector xReferenceCollector =
269cdf0e10cSrcweir 					(XReferenceCollector)UnoRuntime.queryInterface(
270cdf0e10cSrcweir 						XReferenceCollector.class, m_xReferenceResolvedListener);
271cdf0e10cSrcweir 				xReferenceCollector.setReferenceId(referenceId);
272cdf0e10cSrcweir 			}
273cdf0e10cSrcweir 			catch( com.sun.star.uno.Exception e)
274cdf0e10cSrcweir 			{
275cdf0e10cSrcweir 				e.printStackTrace();
276cdf0e10cSrcweir 			}
277cdf0e10cSrcweir 
278cdf0e10cSrcweir 			rc = true;
279cdf0e10cSrcweir 		}
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 		return rc;
282cdf0e10cSrcweir 	}
283cdf0e10cSrcweir }
284cdf0e10cSrcweir 
285