1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_xmlsecurity.hxx" 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski /* 28*b1cdbd2cSJim Jagielski * Turn off DEBUG Assertions 29*b1cdbd2cSJim Jagielski */ 30*b1cdbd2cSJim Jagielski #ifdef _DEBUG 31*b1cdbd2cSJim Jagielski #define _DEBUG_WAS_DEFINED _DEBUG 32*b1cdbd2cSJim Jagielski #undef _DEBUG 33*b1cdbd2cSJim Jagielski #else 34*b1cdbd2cSJim Jagielski #undef _DEBUG_WAS_DEFINED 35*b1cdbd2cSJim Jagielski #endif 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski /* 38*b1cdbd2cSJim Jagielski * and turn off the additional virtual methods which are part of some interfaces when compiled 39*b1cdbd2cSJim Jagielski * with debug 40*b1cdbd2cSJim Jagielski */ 41*b1cdbd2cSJim Jagielski #ifdef DEBUG 42*b1cdbd2cSJim Jagielski #define DEBUG_WAS_DEFINED DEBUG 43*b1cdbd2cSJim Jagielski #undef DEBUG 44*b1cdbd2cSJim Jagielski #else 45*b1cdbd2cSJim Jagielski #undef DEBUG_WAS_DEFINED 46*b1cdbd2cSJim Jagielski #endif 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski #include <sal/types.h> 49*b1cdbd2cSJim Jagielski #include <rtl/bootstrap.hxx> 50*b1cdbd2cSJim Jagielski #include <rtl/string.hxx> 51*b1cdbd2cSJim Jagielski #include <rtl/strbuf.hxx> 52*b1cdbd2cSJim Jagielski #include <osl/file.hxx> 53*b1cdbd2cSJim Jagielski #include <osl/thread.h> 54*b1cdbd2cSJim Jagielski #include <tools/debug.hxx> 55*b1cdbd2cSJim Jagielski #include <rtl/logfile.hxx> 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski #include "seinitializer_nssimpl.hxx" 58*b1cdbd2cSJim Jagielski #include "securityenvironment_nssimpl.hxx" 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski #include <nspr.h> 61*b1cdbd2cSJim Jagielski #include <cert.h> 62*b1cdbd2cSJim Jagielski #include <nss.h> 63*b1cdbd2cSJim Jagielski #include <pk11pub.h> 64*b1cdbd2cSJim Jagielski #include <secmod.h> 65*b1cdbd2cSJim Jagielski #include <nssckbi.h> 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski namespace css = ::com::sun::star; 69*b1cdbd2cSJim Jagielski namespace cssu = css::uno; 70*b1cdbd2cSJim Jagielski namespace cssl = css::lang; 71*b1cdbd2cSJim Jagielski namespace cssxc = css::xml::crypto; 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielski using namespace com::sun::star; 74*b1cdbd2cSJim Jagielski using ::rtl::OUString; 75*b1cdbd2cSJim Jagielski using ::rtl::OString; 76*b1cdbd2cSJim Jagielski 77*b1cdbd2cSJim Jagielski #define SE_SERVICE_NAME "com.sun.star.xml.crypto.SEInitializer" 78*b1cdbd2cSJim Jagielski #define IMPLEMENTATION_NAME "com.sun.star.xml.security.bridge.xmlsec.SEInitializer_NssImpl" 79*b1cdbd2cSJim Jagielski #define SECURITY_ENVIRONMENT "com.sun.star.xml.crypto.SecurityEnvironment" 80*b1cdbd2cSJim Jagielski #define SECURITY_CONTEXT "com.sun.star.xml.crypto.XMLSecurityContext" 81*b1cdbd2cSJim Jagielski SEInitializer_NssImpl(const css::uno::Reference<css::lang::XMultiServiceFactory> & rxMSF)82*b1cdbd2cSJim JagielskiSEInitializer_NssImpl::SEInitializer_NssImpl( 83*b1cdbd2cSJim Jagielski const css::uno::Reference< css::lang::XMultiServiceFactory > &rxMSF ) 84*b1cdbd2cSJim Jagielski { 85*b1cdbd2cSJim Jagielski mxMSF = rxMSF; 86*b1cdbd2cSJim Jagielski } 87*b1cdbd2cSJim Jagielski ~SEInitializer_NssImpl()88*b1cdbd2cSJim JagielskiSEInitializer_NssImpl::~SEInitializer_NssImpl() 89*b1cdbd2cSJim Jagielski { 90*b1cdbd2cSJim Jagielski } 91*b1cdbd2cSJim Jagielski 92*b1cdbd2cSJim Jagielski /* XSEInitializer */ 93*b1cdbd2cSJim Jagielski cssu::Reference< cssxc::XXMLSecurityContext > SAL_CALL createSecurityContext(const::rtl::OUString &)94*b1cdbd2cSJim Jagielski SEInitializer_NssImpl::createSecurityContext( const ::rtl::OUString& ) 95*b1cdbd2cSJim Jagielski throw (cssu::RuntimeException) 96*b1cdbd2cSJim Jagielski { 97*b1cdbd2cSJim Jagielski CERTCertDBHandle *pCertHandle = NULL ; 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielski if( !initNSS( mxMSF ) ) 100*b1cdbd2cSJim Jagielski return NULL; 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski pCertHandle = CERT_GetDefaultCertDB() ; 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski try 105*b1cdbd2cSJim Jagielski { 106*b1cdbd2cSJim Jagielski /* Build XML Security Context */ 107*b1cdbd2cSJim Jagielski const rtl::OUString sSecyrutyContext ( RTL_CONSTASCII_USTRINGPARAM( SECURITY_CONTEXT ) ); 108*b1cdbd2cSJim Jagielski cssu::Reference< cssxc::XXMLSecurityContext > xSecCtx( mxMSF->createInstance ( sSecyrutyContext ), cssu::UNO_QUERY ); 109*b1cdbd2cSJim Jagielski if( !xSecCtx.is() ) 110*b1cdbd2cSJim Jagielski return NULL; 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski const rtl::OUString sSecyrutyEnvironment ( RTL_CONSTASCII_USTRINGPARAM( SECURITY_ENVIRONMENT ) ); 113*b1cdbd2cSJim Jagielski cssu::Reference< cssxc::XSecurityEnvironment > xSecEnv( mxMSF->createInstance ( sSecyrutyEnvironment ), cssu::UNO_QUERY ); 114*b1cdbd2cSJim Jagielski cssu::Reference< cssl::XUnoTunnel > xEnvTunnel( xSecEnv , cssu::UNO_QUERY ) ; 115*b1cdbd2cSJim Jagielski if( !xEnvTunnel.is() ) 116*b1cdbd2cSJim Jagielski return NULL; 117*b1cdbd2cSJim Jagielski SecurityEnvironment_NssImpl* pSecEnv = reinterpret_cast<SecurityEnvironment_NssImpl*>( 118*b1cdbd2cSJim Jagielski sal::static_int_cast<sal_uIntPtr>( 119*b1cdbd2cSJim Jagielski xEnvTunnel->getSomething(SecurityEnvironment_NssImpl::getUnoTunnelId() ))) ; 120*b1cdbd2cSJim Jagielski pSecEnv->setCertDb(pCertHandle); 121*b1cdbd2cSJim Jagielski 122*b1cdbd2cSJim Jagielski sal_Int32 n = xSecCtx->addSecurityEnvironment(xSecEnv); 123*b1cdbd2cSJim Jagielski //originally the SecurityEnvironment with the internal slot was set as default 124*b1cdbd2cSJim Jagielski xSecCtx->setDefaultSecurityEnvironmentIndex( n ); 125*b1cdbd2cSJim Jagielski return xSecCtx; 126*b1cdbd2cSJim Jagielski } 127*b1cdbd2cSJim Jagielski catch( cssu::Exception& ) 128*b1cdbd2cSJim Jagielski { 129*b1cdbd2cSJim Jagielski //PK11_LogoutAll(); 130*b1cdbd2cSJim Jagielski //NSS_Shutdown(); 131*b1cdbd2cSJim Jagielski return NULL; 132*b1cdbd2cSJim Jagielski } 133*b1cdbd2cSJim Jagielski } 134*b1cdbd2cSJim Jagielski freeSecurityContext(const cssu::Reference<cssxc::XXMLSecurityContext> &)135*b1cdbd2cSJim Jagielskivoid SAL_CALL SEInitializer_NssImpl::freeSecurityContext( const cssu::Reference< cssxc::XXMLSecurityContext >& ) 136*b1cdbd2cSJim Jagielski throw (cssu::RuntimeException) 137*b1cdbd2cSJim Jagielski { 138*b1cdbd2cSJim Jagielski /* 139*b1cdbd2cSJim Jagielski * because the security context will free all its content when it 140*b1cdbd2cSJim Jagielski * is destructed, so here no free process for the security context 141*b1cdbd2cSJim Jagielski * is needed. 142*b1cdbd2cSJim Jagielski */ 143*b1cdbd2cSJim Jagielski //PK11_LogoutAll(); 144*b1cdbd2cSJim Jagielski //NSS_Shutdown(); 145*b1cdbd2cSJim Jagielski } 146*b1cdbd2cSJim Jagielski SEInitializer_NssImpl_getImplementationName()147*b1cdbd2cSJim Jagielskirtl::OUString SEInitializer_NssImpl_getImplementationName () 148*b1cdbd2cSJim Jagielski throw (cssu::RuntimeException) 149*b1cdbd2cSJim Jagielski { 150*b1cdbd2cSJim Jagielski 151*b1cdbd2cSJim Jagielski return rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( IMPLEMENTATION_NAME ) ); 152*b1cdbd2cSJim Jagielski } 153*b1cdbd2cSJim Jagielski SEInitializer_NssImpl_supportsService(const rtl::OUString & ServiceName)154*b1cdbd2cSJim Jagielskisal_Bool SAL_CALL SEInitializer_NssImpl_supportsService( const rtl::OUString& ServiceName ) 155*b1cdbd2cSJim Jagielski throw (cssu::RuntimeException) 156*b1cdbd2cSJim Jagielski { 157*b1cdbd2cSJim Jagielski return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SE_SERVICE_NAME )) || ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( NSS_SERVICE_NAME )); 158*b1cdbd2cSJim Jagielski } 159*b1cdbd2cSJim Jagielski SEInitializer_NssImpl_getSupportedServiceNames()160*b1cdbd2cSJim Jagielskicssu::Sequence< rtl::OUString > SAL_CALL SEInitializer_NssImpl_getSupportedServiceNames( ) 161*b1cdbd2cSJim Jagielski throw (cssu::RuntimeException) 162*b1cdbd2cSJim Jagielski { 163*b1cdbd2cSJim Jagielski cssu::Sequence < rtl::OUString > aRet(2); 164*b1cdbd2cSJim Jagielski rtl::OUString* pArray = aRet.getArray(); 165*b1cdbd2cSJim Jagielski pArray[0] = rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( SE_SERVICE_NAME ) ); 166*b1cdbd2cSJim Jagielski pArray[1] = rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( NSS_SERVICE_NAME ) ); 167*b1cdbd2cSJim Jagielski return aRet; 168*b1cdbd2cSJim Jagielski } 169*b1cdbd2cSJim Jagielski SEInitializer_NssImpl_createInstance(const cssu::Reference<cssl::XMultiServiceFactory> & rSMgr)170*b1cdbd2cSJim Jagielskicssu::Reference< cssu::XInterface > SAL_CALL SEInitializer_NssImpl_createInstance( const cssu::Reference< cssl::XMultiServiceFactory > & rSMgr) 171*b1cdbd2cSJim Jagielski throw( cssu::Exception ) 172*b1cdbd2cSJim Jagielski { 173*b1cdbd2cSJim Jagielski return (cppu::OWeakObject*) new SEInitializer_NssImpl(rSMgr); 174*b1cdbd2cSJim Jagielski } 175*b1cdbd2cSJim Jagielski 176*b1cdbd2cSJim Jagielski /* XServiceInfo */ getImplementationName()177*b1cdbd2cSJim Jagielskirtl::OUString SAL_CALL SEInitializer_NssImpl::getImplementationName( ) 178*b1cdbd2cSJim Jagielski throw (cssu::RuntimeException) 179*b1cdbd2cSJim Jagielski { 180*b1cdbd2cSJim Jagielski return SEInitializer_NssImpl_getImplementationName(); 181*b1cdbd2cSJim Jagielski } supportsService(const rtl::OUString & rServiceName)182*b1cdbd2cSJim Jagielskisal_Bool SAL_CALL SEInitializer_NssImpl::supportsService( const rtl::OUString& rServiceName ) 183*b1cdbd2cSJim Jagielski throw (cssu::RuntimeException) 184*b1cdbd2cSJim Jagielski { 185*b1cdbd2cSJim Jagielski return SEInitializer_NssImpl_supportsService( rServiceName ); 186*b1cdbd2cSJim Jagielski } getSupportedServiceNames()187*b1cdbd2cSJim Jagielskicssu::Sequence< rtl::OUString > SAL_CALL SEInitializer_NssImpl::getSupportedServiceNames( ) 188*b1cdbd2cSJim Jagielski throw (cssu::RuntimeException) 189*b1cdbd2cSJim Jagielski { 190*b1cdbd2cSJim Jagielski return SEInitializer_NssImpl_getSupportedServiceNames(); 191*b1cdbd2cSJim Jagielski } 192*b1cdbd2cSJim Jagielski 193