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