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