xref: /AOO41X/main/xmlsecurity/tools/uno/SecurityEntity.java (revision 8809db7a87f97847b57a57f4cd2b0104b2b83182)
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 /* uno classes */
27 import com.sun.star.uno.UnoRuntime;
28 import com.sun.star.lang.XMultiComponentFactory;
29 import com.sun.star.uno.XComponentContext;
30 
31 import com.sun.star.xml.crypto.*;
32 import com.sun.star.xml.crypto.sax.*;
33 
34 /*
35  * this class maintains the data for a security operation.
36  */
37 class SecurityEntity
38 {
39     /*
40      * the security id, which identifies this security entity
41      * uniquely.
42      */
43     private static int m_nNextSecurityId = 1;
44     protected int m_nSecurityId;
45 
46     /*
47      * xml security related components
48      */
49     protected XXMLSecurityContext        m_xXMLSecurityContext;
50     protected XXMLSignature              m_xXMLSignature;
51     protected XXMLEncryption             m_xXMLEncryption;
52     protected XMultiComponentFactory     m_xRemoteServiceManager;
53     protected XComponentContext          m_xRemoteContext;
54     protected XReferenceResolvedListener m_xReferenceResolvedListener;
55     protected XSecuritySAXEventKeeper    m_xSAXEventKeeper;
56 
57     /*
58      * the uri of the key material of this security entity
59      */
60     private String m_keyURI;
61 
62     SecurityEntity(
63         XSecuritySAXEventKeeper xSAXEventKeeper,
64         XXMLSecurityContext xXMLSecurityContext,
65         XXMLSignature xXMLSignature,
66         XXMLEncryption xXMLEncryption,
67         XMultiComponentFactory xRemoteServiceManager,
68         XComponentContext xRemoteContext)
69     {
70         m_xSAXEventKeeper = xSAXEventKeeper;
71         m_xXMLSecurityContext = xXMLSecurityContext;
72         m_xXMLSignature = xXMLSignature;
73         m_xXMLEncryption = xXMLEncryption;
74         m_xRemoteServiceManager = xRemoteServiceManager;
75         m_xRemoteContext = xRemoteContext;
76 
77         m_nSecurityId = getNextSecurityId();
78         m_keyURI = null;
79     }
80 
81 /**************************************************************************************
82  * private methods
83  **************************************************************************************/
84 
85     /*
86      * generates a new security id.
87      */
88     private static int getNextSecurityId()
89     {
90         int id = m_nNextSecurityId++;
91         return id;
92     }
93 
94 /**************************************************************************************
95  * protected methods
96  **************************************************************************************/
97 
98     /*
99      * notifies the key collector about the key id, this key id
100      * is used to ask the SAXEventKeeper to release the bufferred
101      * key element.
102      * when the id is 0, that means there is no independant key
103      * element needed.
104      */
105     protected void setKeyId(int id)
106     {
107         try
108         {
109             XKeyCollector xKeyCollector =
110                 (XKeyCollector)UnoRuntime.queryInterface(
111                     XKeyCollector.class, m_xReferenceResolvedListener);
112             xKeyCollector.setKeyId(id);
113         }
114         catch( com.sun.star.uno.Exception e)
115         {
116             e.printStackTrace();
117         }
118     }
119 
120     /*
121      * set the key uri, which will be the value of the id attribute
122      * of the key element
123      */
124     protected void setKeyURI(String uri)
125     {
126         m_keyURI = new String(uri);
127     }
128 
129     protected XReferenceResolvedListener getReferenceListener()
130     {
131         return m_xReferenceResolvedListener;
132     }
133 
134     protected int getSecurityId()
135     {
136         return m_nSecurityId;
137     }
138 
139     /*
140      * configures the key material to the security entity.
141      *
142      * if the uri is the key, then:
143      * 1. askes the SAXEventKeeper to add a ElementCollector to the key
144      * element;
145      * 2. notifies the key collector;
146      * 3. configures this ElementCollector's security id;
147      * 4. tells the SAXEventKeeper which listener will receive the reference
148      * resolved notification.
149      */
150     protected boolean setKey(String uri, boolean isExporting)
151     {
152         boolean rc = false;
153 
154         if (m_keyURI != null &&
155             m_keyURI.equals(uri))
156         {
157             int referenceId = m_xSAXEventKeeper.addSecurityElementCollector(
158                 isExporting?
159                 (ElementMarkPriority.BEFOREMODIFY):(ElementMarkPriority.AFTERMODIFY),
160                 false );
161 
162             setKeyId(referenceId);
163             m_xSAXEventKeeper.setSecurityId(referenceId, m_nSecurityId);
164 
165             XReferenceResolvedBroadcaster xReferenceResolvedBroadcaster =
166                 (XReferenceResolvedBroadcaster)UnoRuntime.queryInterface(
167                     XReferenceResolvedBroadcaster.class, m_xSAXEventKeeper);
168 
169             xReferenceResolvedBroadcaster.addReferenceResolvedListener(referenceId, m_xReferenceResolvedListener);
170 
171             rc = true;
172         }
173 
174         return rc;
175     }
176 
177     /*
178      * ends this misstion, asks the security engine to clear up all
179      * resources.
180      */
181     protected boolean endMission()
182     {
183         XMissionTaker xMissionTaker =
184             (XMissionTaker)UnoRuntime.queryInterface(
185                 XMissionTaker.class, m_xReferenceResolvedListener);
186 
187         boolean rc = xMissionTaker.endMission();
188 
189         m_xXMLSecurityContext = null;
190         m_xXMLSignature = null;
191         m_xXMLEncryption = null;
192         m_xReferenceResolvedListener = null;
193         m_xSAXEventKeeper = null;
194 
195         return rc;
196     }
197 }
198 
199