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 Jagielski SEInitializer_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 Jagielski SEInitializer_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 Jagielski void 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 Jagielski rtl::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 Jagielski sal_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 Jagielski cssu::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 Jagielski cssu::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 Jagielski rtl::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 Jagielski sal_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 Jagielski cssu::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