/************************************************************** * * 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; } }