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 package com.sun.star.xml.security.uno;
29 
30 /* uno classes */
31 import com.sun.star.uno.UnoRuntime;
32 import com.sun.star.lang.XMultiComponentFactory;
33 import com.sun.star.lang.XInitialization;
34 import com.sun.star.uno.XComponentContext;
35 
36 import com.sun.star.xml.crypto.*;
37 import com.sun.star.xml.crypto.sax.*;
38 
39 /*
40  * this class maintains the data for an encryption operation.
41  */
42 class EncryptionEntity extends SecurityEntity
43 {
44 	private int m_nEncryptionElementCollectorId;
45 
46 	EncryptionEntity(
47 		XSecuritySAXEventKeeper xSAXEventKeeper,
48 		boolean isExporting,
49 		Object resultListener,
50 		XXMLSecurityContext xXMLSecurityContext,
51 		XXMLSignature xXMLSignature,
52 		XXMLEncryption xXMLEncryption,
53 		XMultiComponentFactory xRemoteServiceManager,
54 		XComponentContext xRemoteContext)
55 	{
56 		super(xSAXEventKeeper, xXMLSecurityContext, xXMLSignature,
57 			 xXMLEncryption, xRemoteServiceManager, xRemoteContext);
58 
59 		m_nEncryptionElementCollectorId = m_xSAXEventKeeper.addSecurityElementCollector(
60 			ElementMarkPriority.AFTERMODIFY,
61 			true);
62 
63 		m_xSAXEventKeeper.setSecurityId(m_nEncryptionElementCollectorId, m_nSecurityId);
64 
65 		if (isExporting)
66 		{
67 			try
68 			{
69 				/*
70 				 * creates a Encryptor.
71 				 */
72 				Object encryptor = m_xRemoteServiceManager.createInstanceWithContext(
73 					TestTool.ENCRYPTOR_COMPONENT, m_xRemoteContext);
74 
75 				m_xReferenceResolvedListener =
76 					(XReferenceResolvedListener)UnoRuntime.queryInterface(
77 						XReferenceResolvedListener.class, encryptor);
78 
79 				/*
80 				 * initializes the Encryptor.
81 				 */
82 				XInitialization xInitialization =
83 					(XInitialization)UnoRuntime.queryInterface(
84 						XInitialization.class, m_xReferenceResolvedListener);
85 				Object args[]=new Object[5];
86 				args[0] = new Integer(m_nSecurityId).toString();
87 				args[1] = m_xSAXEventKeeper;
88 				args[2] = new Integer(m_nEncryptionElementCollectorId).toString();
89 				args[3] = m_xXMLSecurityContext.getSecurityEnvironment();
90 				args[4] = m_xXMLEncryption;
91 				xInitialization.initialize(args);
92 
93 				/*
94 				 * sets encryption result listener.
95 				 */
96 				XEncryptionResultBroadcaster m_xEncryptionResultBroadcaster =
97 					(XEncryptionResultBroadcaster)UnoRuntime.queryInterface(
98 						XEncryptionResultBroadcaster.class, m_xReferenceResolvedListener);
99 				m_xEncryptionResultBroadcaster.addEncryptionResultListener(
100 					(XEncryptionResultListener)UnoRuntime.queryInterface(
101 						XEncryptionResultListener.class, resultListener));
102 			}
103 			catch( com.sun.star.uno.Exception e)
104 			{
105 				e.printStackTrace();
106 			}
107 		}
108 		else
109 		{
110 			try{
111 				/*
112 				 * creates a Decryptor.
113 				 */
114 				Object decryptor = m_xRemoteServiceManager.createInstanceWithContext(
115 					TestTool.DECRYPTOR_COMPONENT, m_xRemoteContext);
116 
117 				m_xReferenceResolvedListener =
118 					(XReferenceResolvedListener)UnoRuntime.queryInterface(
119 						XReferenceResolvedListener.class, decryptor);
120 
121 				/*
122 				 * initializes the Decryptor.
123 				 */
124 				XInitialization xInitialization = (XInitialization)UnoRuntime.queryInterface(XInitialization.class, m_xReferenceResolvedListener);
125 				Object args[]=new Object[5];
126 				args[0] = new Integer(m_nSecurityId).toString();
127 				args[1] = m_xSAXEventKeeper;
128 				args[2] = new Integer(m_nEncryptionElementCollectorId).toString();
129 				args[3] = m_xXMLSecurityContext;
130 				args[4] = m_xXMLEncryption;
131 				xInitialization.initialize(args);
132 
133 				/*
134 				 * sets decryption result listener.
135 				 */
136 				XDecryptionResultBroadcaster m_xDecryptionResultBroadcaster =
137 					(XDecryptionResultBroadcaster)UnoRuntime.queryInterface(
138 						XDecryptionResultBroadcaster.class, m_xReferenceResolvedListener);
139 				m_xDecryptionResultBroadcaster.addDecryptionResultListener(
140 					(XDecryptionResultListener)UnoRuntime.queryInterface(
141 						XDecryptionResultListener.class, resultListener));
142 			}
143 			catch( com.sun.star.uno.Exception e)
144 			{
145 				e.printStackTrace();
146 			}
147 		}
148 
149 		/*
150 		 * creates a Blocker.
151 		 */
152 		int blockerId = m_xSAXEventKeeper.addBlocker();
153 		m_xSAXEventKeeper.setSecurityId(blockerId, m_nSecurityId);
154 
155 		try
156 		{
157 			XBlockerMonitor xBlockerMonitor = (XBlockerMonitor)UnoRuntime.queryInterface(
158 				XBlockerMonitor.class, m_xReferenceResolvedListener);
159 			xBlockerMonitor.setBlockerId(blockerId);
160 		}
161 		catch( com.sun.star.uno.Exception e)
162 		{
163 			e.printStackTrace();
164 		}
165 
166 		/*
167 		 * configures the resolve listener for the encryption template.
168 		 */
169 		XReferenceResolvedBroadcaster xReferenceResolvedBroadcaster =
170 			(XReferenceResolvedBroadcaster)UnoRuntime.queryInterface(
171 				XReferenceResolvedBroadcaster.class, m_xSAXEventKeeper);
172 		xReferenceResolvedBroadcaster.addReferenceResolvedListener(m_nEncryptionElementCollectorId, m_xReferenceResolvedListener);
173 	}
174 
175 	/*
176 	 * add the reference to this encryption.
177 	 *
178 	 * 1. askes the SAXEventKeeper to add a ElementCollector to for the new
179 	 * referenced element;
180 	 * 2. configures this ElementCollector's security id;
181 	 * 3. tells the SAXEventKeeper which listener will receive the reference
182 	 * resolved notification.
183 	 * 4. notifies the SignatureCollector about the reference id.
184 	 */
185 	protected boolean setReference(boolean isExporting)
186 	{
187 		boolean rc = false;
188 
189 		int referenceId = m_xSAXEventKeeper.addSecurityElementCollector(
190 			isExporting?
191 			(ElementMarkPriority.AFTERMODIFY):(ElementMarkPriority.BEFOREMODIFY),
192 			true);
193 
194 		m_xSAXEventKeeper.setSecurityId(referenceId, m_nSecurityId);
195 
196 		XReferenceResolvedBroadcaster xReferenceResolvedBroadcaster =
197 			(XReferenceResolvedBroadcaster)UnoRuntime.queryInterface(
198 				XReferenceResolvedBroadcaster.class, m_xSAXEventKeeper);
199 		xReferenceResolvedBroadcaster.addReferenceResolvedListener(
200 			referenceId, m_xReferenceResolvedListener);
201 
202 		try
203 		{
204 			XReferenceCollector xReferenceCollector =
205 				(XReferenceCollector)UnoRuntime.queryInterface(
206 					XReferenceCollector.class, m_xReferenceResolvedListener);
207 			xReferenceCollector.setReferenceId(referenceId);
208 		}
209 		catch( com.sun.star.uno.Exception e)
210 		{
211 			e.printStackTrace();
212 			rc = false;
213 		}
214 
215 		return rc;
216 	}
217 }
218 
219