| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_xmlsecurity.hxx" |
| |
| /* |
| * Turn off DEBUG Assertions |
| */ |
| #ifdef _DEBUG |
| #define _DEBUG_WAS_DEFINED _DEBUG |
| #undef _DEBUG |
| #else |
| #undef _DEBUG_WAS_DEFINED |
| #endif |
| |
| /* |
| * and turn off the additional virtual methods which are part of some interfaces when compiled |
| * with debug |
| */ |
| #ifdef DEBUG |
| #define DEBUG_WAS_DEFINED DEBUG |
| #undef DEBUG |
| #else |
| #undef DEBUG_WAS_DEFINED |
| #endif |
| |
| #include <sal/types.h> |
| #include <rtl/bootstrap.hxx> |
| #include <rtl/string.hxx> |
| #include <rtl/strbuf.hxx> |
| #include <osl/file.hxx> |
| #include <osl/thread.h> |
| #include <tools/debug.hxx> |
| #include <rtl/logfile.hxx> |
| |
| #include "seinitializer_nssimpl.hxx" |
| #include "securityenvironment_nssimpl.hxx" |
| |
| #include <nspr.h> |
| #include <cert.h> |
| #include <nss.h> |
| #include <pk11pub.h> |
| #include <secmod.h> |
| #include <nssckbi.h> |
| |
| |
| namespace css = ::com::sun::star; |
| namespace cssu = css::uno; |
| namespace cssl = css::lang; |
| namespace cssxc = css::xml::crypto; |
| |
| using namespace com::sun::star; |
| using ::rtl::OUString; |
| using ::rtl::OString; |
| |
| #define SE_SERVICE_NAME "com.sun.star.xml.crypto.SEInitializer" |
| #define IMPLEMENTATION_NAME "com.sun.star.xml.security.bridge.xmlsec.SEInitializer_NssImpl" |
| #define SECURITY_ENVIRONMENT "com.sun.star.xml.crypto.SecurityEnvironment" |
| #define SECURITY_CONTEXT "com.sun.star.xml.crypto.XMLSecurityContext" |
| |
| SEInitializer_NssImpl::SEInitializer_NssImpl( |
| const css::uno::Reference< css::lang::XMultiServiceFactory > &rxMSF ) |
| { |
| mxMSF = rxMSF; |
| } |
| |
| SEInitializer_NssImpl::~SEInitializer_NssImpl() |
| { |
| } |
| |
| /* XSEInitializer */ |
| cssu::Reference< cssxc::XXMLSecurityContext > SAL_CALL |
| SEInitializer_NssImpl::createSecurityContext( const ::rtl::OUString& ) |
| throw (cssu::RuntimeException) |
| { |
| CERTCertDBHandle *pCertHandle = NULL ; |
| |
| if( !initNSS( mxMSF ) ) |
| return NULL; |
| |
| pCertHandle = CERT_GetDefaultCertDB() ; |
| |
| try |
| { |
| /* Build XML Security Context */ |
| const rtl::OUString sSecyrutyContext ( RTL_CONSTASCII_USTRINGPARAM( SECURITY_CONTEXT ) ); |
| cssu::Reference< cssxc::XXMLSecurityContext > xSecCtx( mxMSF->createInstance ( sSecyrutyContext ), cssu::UNO_QUERY ); |
| if( !xSecCtx.is() ) |
| return NULL; |
| |
| const rtl::OUString sSecyrutyEnvironment ( RTL_CONSTASCII_USTRINGPARAM( SECURITY_ENVIRONMENT ) ); |
| cssu::Reference< cssxc::XSecurityEnvironment > xSecEnv( mxMSF->createInstance ( sSecyrutyEnvironment ), cssu::UNO_QUERY ); |
| cssu::Reference< cssl::XUnoTunnel > xEnvTunnel( xSecEnv , cssu::UNO_QUERY ) ; |
| if( !xEnvTunnel.is() ) |
| return NULL; |
| SecurityEnvironment_NssImpl* pSecEnv = reinterpret_cast<SecurityEnvironment_NssImpl*>( |
| sal::static_int_cast<sal_uIntPtr>( |
| xEnvTunnel->getSomething(SecurityEnvironment_NssImpl::getUnoTunnelId() ))) ; |
| pSecEnv->setCertDb(pCertHandle); |
| |
| sal_Int32 n = xSecCtx->addSecurityEnvironment(xSecEnv); |
| //originally the SecurityEnvironment with the internal slot was set as default |
| xSecCtx->setDefaultSecurityEnvironmentIndex( n ); |
| return xSecCtx; |
| } |
| catch( cssu::Exception& ) |
| { |
| //PK11_LogoutAll(); |
| //NSS_Shutdown(); |
| return NULL; |
| } |
| } |
| |
| void SAL_CALL SEInitializer_NssImpl::freeSecurityContext( const cssu::Reference< cssxc::XXMLSecurityContext >& ) |
| throw (cssu::RuntimeException) |
| { |
| /* |
| * because the security context will free all its content when it |
| * is destructed, so here no free process for the security context |
| * is needed. |
| */ |
| //PK11_LogoutAll(); |
| //NSS_Shutdown(); |
| } |
| |
| rtl::OUString SEInitializer_NssImpl_getImplementationName () |
| throw (cssu::RuntimeException) |
| { |
| |
| return rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( IMPLEMENTATION_NAME ) ); |
| } |
| |
| sal_Bool SAL_CALL SEInitializer_NssImpl_supportsService( const rtl::OUString& ServiceName ) |
| throw (cssu::RuntimeException) |
| { |
| return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SE_SERVICE_NAME )) || ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( NSS_SERVICE_NAME )); |
| } |
| |
| cssu::Sequence< rtl::OUString > SAL_CALL SEInitializer_NssImpl_getSupportedServiceNames( ) |
| throw (cssu::RuntimeException) |
| { |
| cssu::Sequence < rtl::OUString > aRet(2); |
| rtl::OUString* pArray = aRet.getArray(); |
| pArray[0] = rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( SE_SERVICE_NAME ) ); |
| pArray[1] = rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( NSS_SERVICE_NAME ) ); |
| return aRet; |
| } |
| |
| cssu::Reference< cssu::XInterface > SAL_CALL SEInitializer_NssImpl_createInstance( const cssu::Reference< cssl::XMultiServiceFactory > & rSMgr) |
| throw( cssu::Exception ) |
| { |
| return (cppu::OWeakObject*) new SEInitializer_NssImpl(rSMgr); |
| } |
| |
| /* XServiceInfo */ |
| rtl::OUString SAL_CALL SEInitializer_NssImpl::getImplementationName( ) |
| throw (cssu::RuntimeException) |
| { |
| return SEInitializer_NssImpl_getImplementationName(); |
| } |
| sal_Bool SAL_CALL SEInitializer_NssImpl::supportsService( const rtl::OUString& rServiceName ) |
| throw (cssu::RuntimeException) |
| { |
| return SEInitializer_NssImpl_supportsService( rServiceName ); |
| } |
| cssu::Sequence< rtl::OUString > SAL_CALL SEInitializer_NssImpl::getSupportedServiceNames( ) |
| throw (cssu::RuntimeException) |
| { |
| return SEInitializer_NssImpl_getSupportedServiceNames(); |
| } |
| |