| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| package com.sun.star.xml.security.uno; |
| |
| /* uno classes */ |
| import com.sun.star.uno.UnoRuntime; |
| import com.sun.star.lang.XMultiComponentFactory; |
| import com.sun.star.uno.XComponentContext; |
| |
| import com.sun.star.xml.crypto.*; |
| import com.sun.star.xml.crypto.sax.*; |
| |
| /* |
| * this class maintains the data for a security operation. |
| */ |
| class SecurityEntity |
| { |
| /* |
| * the security id, which identifies this security entity |
| * uniquely. |
| */ |
| private static int m_nNextSecurityId = 1; |
| protected int m_nSecurityId; |
| |
| /* |
| * xml security related components |
| */ |
| protected XXMLSecurityContext m_xXMLSecurityContext; |
| protected XXMLSignature m_xXMLSignature; |
| protected XXMLEncryption m_xXMLEncryption; |
| protected XMultiComponentFactory m_xRemoteServiceManager; |
| protected XComponentContext m_xRemoteContext; |
| protected XReferenceResolvedListener m_xReferenceResolvedListener; |
| protected XSecuritySAXEventKeeper m_xSAXEventKeeper; |
| |
| /* |
| * the uri of the key material of this security entity |
| */ |
| private String m_keyURI; |
| |
| SecurityEntity( |
| XSecuritySAXEventKeeper xSAXEventKeeper, |
| XXMLSecurityContext xXMLSecurityContext, |
| XXMLSignature xXMLSignature, |
| XXMLEncryption xXMLEncryption, |
| XMultiComponentFactory xRemoteServiceManager, |
| XComponentContext xRemoteContext) |
| { |
| m_xSAXEventKeeper = xSAXEventKeeper; |
| m_xXMLSecurityContext = xXMLSecurityContext; |
| m_xXMLSignature = xXMLSignature; |
| m_xXMLEncryption = xXMLEncryption; |
| m_xRemoteServiceManager = xRemoteServiceManager; |
| m_xRemoteContext = xRemoteContext; |
| |
| m_nSecurityId = getNextSecurityId(); |
| m_keyURI = null; |
| } |
| |
| /************************************************************************************** |
| * private methods |
| **************************************************************************************/ |
| |
| /* |
| * generates a new security id. |
| */ |
| private static int getNextSecurityId() |
| { |
| int id = m_nNextSecurityId++; |
| return id; |
| } |
| |
| /************************************************************************************** |
| * protected methods |
| **************************************************************************************/ |
| |
| /* |
| * notifies the key collector about the key id, this key id |
| * is used to ask the SAXEventKeeper to release the bufferred |
| * key element. |
| * when the id is 0, that means there is no independant key |
| * element needed. |
| */ |
| protected void setKeyId(int id) |
| { |
| try |
| { |
| XKeyCollector xKeyCollector = |
| (XKeyCollector)UnoRuntime.queryInterface( |
| XKeyCollector.class, m_xReferenceResolvedListener); |
| xKeyCollector.setKeyId(id); |
| } |
| catch( com.sun.star.uno.Exception e) |
| { |
| e.printStackTrace(); |
| } |
| } |
| |
| /* |
| * set the key uri, which will be the value of the id attribute |
| * of the key element |
| */ |
| protected void setKeyURI(String uri) |
| { |
| m_keyURI = new String(uri); |
| } |
| |
| protected XReferenceResolvedListener getReferenceListener() |
| { |
| return m_xReferenceResolvedListener; |
| } |
| |
| protected int getSecurityId() |
| { |
| return m_nSecurityId; |
| } |
| |
| /* |
| * configures the key material to the security entity. |
| * |
| * if the uri is the key, then: |
| * 1. askes the SAXEventKeeper to add a ElementCollector to the key |
| * element; |
| * 2. notifies the key collector; |
| * 3. configures this ElementCollector's security id; |
| * 4. tells the SAXEventKeeper which listener will receive the reference |
| * resolved notification. |
| */ |
| protected boolean setKey(String uri, boolean isExporting) |
| { |
| boolean rc = false; |
| |
| if (m_keyURI != null && |
| m_keyURI.equals(uri)) |
| { |
| int referenceId = m_xSAXEventKeeper.addSecurityElementCollector( |
| isExporting? |
| (ElementMarkPriority.BEFOREMODIFY):(ElementMarkPriority.AFTERMODIFY), |
| false ); |
| |
| setKeyId(referenceId); |
| m_xSAXEventKeeper.setSecurityId(referenceId, m_nSecurityId); |
| |
| XReferenceResolvedBroadcaster xReferenceResolvedBroadcaster = |
| (XReferenceResolvedBroadcaster)UnoRuntime.queryInterface( |
| XReferenceResolvedBroadcaster.class, m_xSAXEventKeeper); |
| |
| xReferenceResolvedBroadcaster.addReferenceResolvedListener(referenceId, m_xReferenceResolvedListener); |
| |
| rc = true; |
| } |
| |
| return rc; |
| } |
| |
| /* |
| * ends this misstion, asks the security engine to clear up all |
| * resources. |
| */ |
| protected boolean endMission() |
| { |
| XMissionTaker xMissionTaker = |
| (XMissionTaker)UnoRuntime.queryInterface( |
| XMissionTaker.class, m_xReferenceResolvedListener); |
| |
| boolean rc = xMissionTaker.endMission(); |
| |
| m_xXMLSecurityContext = null; |
| m_xXMLSignature = null; |
| m_xXMLEncryption = null; |
| m_xReferenceResolvedListener = null; |
| m_xSAXEventKeeper = null; |
| |
| return rc; |
| } |
| } |
| |