#88919# bootstrapping native ac; removed ac_defimpl functions

This commit is contained in:
Daniel Boelzle 2002-01-25 08:36:50 +00:00
parent 655994fe08
commit 7ef59dba1a
8 changed files with 148 additions and 378 deletions

View File

@ -2,9 +2,9 @@
* *
* $RCSfile: access_control.hxx,v $ * $RCSfile: access_control.hxx,v $
* *
* $Revision: 1.5 $ * $Revision: 1.6 $
* *
* last change: $Author: dbo $ $Date: 2002-01-11 10:06:02 $ * last change: $Author: dbo $ $Date: 2002-01-25 09:36:50 $
* *
* The Contents of this file are made available subject to the terms of * The Contents of this file are made available subject to the terms of
* either of the following licenses * either of the following licenses
@ -61,9 +61,6 @@
#ifndef _CPPUHELPER_ACCESS_CONTROL_HXX_ #ifndef _CPPUHELPER_ACCESS_CONTROL_HXX_
#define _CPPUHELPER_ACCESS_CONTROL_HXX_ #define _CPPUHELPER_ACCESS_CONTROL_HXX_
#ifndef _COM_SUN_STAR_UNO_XCURRENTCONTEXT_HPP_
#include <com/sun/star/uno/XCurrentContext.hpp>
#endif
#ifndef _COM_SUN_STAR_UNO_XCOMPONENTCONTEXT_HPP_ #ifndef _COM_SUN_STAR_UNO_XCOMPONENTCONTEXT_HPP_
#include <com/sun/star/uno/XComponentContext.hpp> #include <com/sun/star/uno/XComponentContext.hpp>
#endif #endif
@ -71,8 +68,6 @@
#include <com/sun/star/security/XAccessController.hpp> #include <com/sun/star/security/XAccessController.hpp>
#endif #endif
#define AC_SINGLETON "/singletons/com.sun.star.security.theAccessController"
namespace cppu namespace cppu
{ {
@ -150,50 +145,6 @@ public:
SAL_THROW( (::com::sun::star::uno::RuntimeException) ); SAL_THROW( (::com::sun::star::uno::RuntimeException) );
}; };
/** Default implementation retieving the current access control restriction.
@param xCurrentContext current context
@return current access control restriction
*/
::com::sun::star::uno::Reference< ::com::sun::star::security::XAccessControlContext > SAL_CALL
ac_defimpl_getRestriction(
::com::sun::star::uno::Reference<
::com::sun::star::uno::XCurrentContext > const & xCurrentContext )
SAL_THROW( (::com::sun::star::uno::RuntimeException) );
/** Default implementation performing a restricted action.
@param xAction action to be performed
@param xRestriction additional restriction to be in effect
@param xCurrentContext current context
*/
::com::sun::star::uno::Any SAL_CALL
ac_defimpl_doRestricted(
::com::sun::star::uno::Reference<
::com::sun::star::security::XAction > const & xAction,
::com::sun::star::uno::Reference<
::com::sun::star::security::XAccessControlContext > const & xRestriction,
::com::sun::star::uno::Reference<
::com::sun::star::uno::XCurrentContext > const & xCurrentContext )
SAL_THROW( (::com::sun::star::uno::Exception) );
/** Default implementation performed a privileged action.
@param xAction action to be performed
@param xRestriction (the one and only) restriction to be in effect
@param xCurrentContext current context
*/
::com::sun::star::uno::Any SAL_CALL
ac_defimpl_doPrivileged(
::com::sun::star::uno::Reference<
::com::sun::star::security::XAction > const & xAction,
::com::sun::star::uno::Reference<
::com::sun::star::security::XAccessControlContext > const & xRestriction,
::com::sun::star::uno::Reference<
::com::sun::star::uno::XCurrentContext > const & xCurrentContext )
SAL_THROW( (::com::sun::star::uno::Exception) );
} }
#endif #endif

View File

@ -2,9 +2,9 @@
* *
* $RCSfile: access_control.cxx,v $ * $RCSfile: access_control.cxx,v $
* *
* $Revision: 1.4 $ * $Revision: 1.5 $
* *
* last change: $Author: dbo $ $Date: 2002-01-11 10:15:50 $ * last change: $Author: dbo $ $Date: 2002-01-25 09:36:50 $
* *
* The Contents of this file are made available subject to the terms of * The Contents of this file are made available subject to the terms of
* either of the following licenses * either of the following licenses
@ -59,26 +59,15 @@
* *
************************************************************************/ ************************************************************************/
#include <osl/diagnose.h>
#include <osl/interlck.h>
#include <uno/current_context.h>
#include <cppuhelper/implbase1.hxx>
#include <cppuhelper/factory.hxx>
#include <cppuhelper/access_control.hxx> #include <cppuhelper/access_control.hxx>
#include <com/sun/star/uno/XCurrentContext.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/security/XAccessController.hpp> #include <com/sun/star/security/XAccessController.hpp>
#include <com/sun/star/security/RuntimePermission.hpp> #include <com/sun/star/security/RuntimePermission.hpp>
#include <com/sun/star/io/FilePermission.hpp> #include <com/sun/star/io/FilePermission.hpp>
#include <com/sun/star/connection/SocketPermission.hpp> #include <com/sun/star/connection/SocketPermission.hpp>
#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) ) #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
#define AC_RESTRICTION "access-control.restriction"
using namespace ::rtl; using namespace ::rtl;
using namespace ::osl; using namespace ::osl;
@ -89,269 +78,7 @@ namespace cppu
{ {
static OUString str_envType = OUSTR(CPPU_CURRENT_LANGUAGE_BINDING_NAME); static OUString str_envType = OUSTR(CPPU_CURRENT_LANGUAGE_BINDING_NAME);
static OUString str_acRestriction = OUSTR(AC_RESTRICTION); static OUString str_ac_singleton = OUSTR("/singletons/com.sun.star.security.theAccessController");
//==================================================================================================
class acc_Combiner
: public WeakImplHelper1< security::XAccessControlContext >
{
Reference< security::XAccessControlContext > m_x1, m_x2;
public:
inline acc_Combiner(
Reference< security::XAccessControlContext > const & x1,
Reference< security::XAccessControlContext > const & x2 )
SAL_THROW( () )
: m_x1( x1 )
, m_x2( x2 )
{}
// XAccessControlContext impl
virtual void SAL_CALL checkPermission(
Any const & perm )
throw (RuntimeException);
};
//__________________________________________________________________________________________________
void acc_Combiner::checkPermission(
Any const & perm )
throw (RuntimeException)
{
m_x1->checkPermission( perm );
m_x2->checkPermission( perm );
}
//==================================================================================================
class acc_CurrentContext
: public ImplHelper1< XCurrentContext >
{
oslInterlockedCount m_refcount;
Reference< XCurrentContext > m_xDelegate;
Any m_restriction;
public:
inline acc_CurrentContext(
Reference< XCurrentContext > const & xDelegate,
Reference< security::XAccessControlContext > const & xRestriction )
SAL_THROW( () );
// XInterface impl
virtual void SAL_CALL acquire()
throw ();
virtual void SAL_CALL release()
throw ();
// XCurrentContext
virtual Any SAL_CALL getValueByName( OUString const & name )
throw (RuntimeException);
};
//__________________________________________________________________________________________________
inline acc_CurrentContext::acc_CurrentContext(
Reference< XCurrentContext > const & xDelegate,
Reference< security::XAccessControlContext > const & xRestriction )
SAL_THROW( () )
: m_refcount( 0 )
, m_xDelegate( xDelegate )
{
if (xRestriction.is())
{
m_restriction = makeAny( xRestriction );
}
// return empty any otherwise on getValueByName(), not null interface
}
//__________________________________________________________________________________________________
void acc_CurrentContext::acquire()
throw ()
{
::osl_incrementInterlockedCount( &m_refcount );
}
//__________________________________________________________________________________________________
void acc_CurrentContext::release()
throw ()
{
if (! ::osl_decrementInterlockedCount( &m_refcount ))
{
delete this;
}
}
//__________________________________________________________________________________________________
Any acc_CurrentContext::getValueByName( OUString const & name )
throw (RuntimeException)
{
if (name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(AC_RESTRICTION) ))
{
return m_restriction;
}
else
{
return m_xDelegate->getValueByName( name );
}
}
//--------------------------------------------------------------------------------------------------
Reference< security::XAccessControlContext > SAL_CALL ac_defimpl_getRestriction(
Reference< XCurrentContext > const & xContext )
SAL_THROW( (RuntimeException) )
{
if (xContext.is())
{
Any acc( xContext->getValueByName( str_acRestriction ) );
if (typelib_TypeClass_INTERFACE == acc.pType->eTypeClass)
{
OUString const & typeName =
* reinterpret_cast< OUString const * >( &acc.pType->pTypeName );
if (typeName.equalsAsciiL(
RTL_CONSTASCII_STRINGPARAM("com.sun.star.security.XAccessControlContext") ))
{
return Reference< security::XAccessControlContext >(
* reinterpret_cast< security::XAccessControlContext * * const >( acc.pData ) );
}
else // try to query
{
return Reference< security::XAccessControlContext >::query(
* reinterpret_cast< XInterface * * const >( acc.pData ) );
}
}
}
return Reference< security::XAccessControlContext >();
}
//==================================================================================================
struct __cc_reset
{
void * m_cc;
inline __cc_reset( void * cc ) SAL_THROW( () )
: m_cc( cc ) {}
inline ~__cc_reset() SAL_THROW( () )
{ ::uno_setCurrentContext( m_cc, str_envType.pData, 0 ); }
};
//==================================================================================================
Any SAL_CALL ac_defimpl_doRestricted(
Reference< security::XAction > const & xAction,
Reference< security::XAccessControlContext > const & xRestriction,
Reference< XCurrentContext > const & xContext )
SAL_THROW( (Exception) )
{
if (xRestriction.is())
{
Reference< security::XAccessControlContext > xOldRestr(
ac_defimpl_getRestriction( xContext ) );
if (xOldRestr.is())
{
Reference< XCurrentContext > xNewContext( new acc_CurrentContext(
xContext, new acc_Combiner( xRestriction, xOldRestr ) ) );
::uno_setCurrentContext( xNewContext.get(), str_envType.pData, 0 );
}
else
{
Reference< XCurrentContext > xNewContext( new acc_CurrentContext(
xContext, xRestriction ) );
::uno_setCurrentContext( xNewContext.get(), str_envType.pData, 0 );
}
__cc_reset reset( xContext.get() );
return xAction->run();
}
else
{
return xAction->run();
}
}
//==================================================================================================
Any SAL_CALL ac_defimpl_doPrivileged(
Reference< security::XAction > const & xAction,
Reference< security::XAccessControlContext > const & xRestriction,
Reference< XCurrentContext > const & xContext )
SAL_THROW( (Exception) )
{
// override AC_RESTRICTION
Reference< XCurrentContext > xNewContext( new acc_CurrentContext(
xContext, xRestriction ) );
::uno_setCurrentContext( xNewContext.get(), str_envType.pData, 0 );
__cc_reset reset( xContext.get() );
return xAction->run();
}
//##################################################################################################
//### default service impl: does not check for static permissions! #################################
//##################################################################################################
//==================================================================================================
class DefaultAccessController
: public WeakImplHelper1< security::XAccessController >
{
public:
// XAccessController impl
virtual void SAL_CALL checkPermission(
Any const & perm )
throw (RuntimeException);
virtual Any SAL_CALL doRestricted(
Reference< security::XAction > const & xAction,
Reference< security::XAccessControlContext > const & xRestriction )
throw (Exception);
virtual Any SAL_CALL doPrivileged(
Reference< security::XAction > const & xAction,
Reference< security::XAccessControlContext > const & xRestriction )
throw (Exception);
virtual Reference< security::XAccessControlContext > SAL_CALL getContext()
throw (RuntimeException);
};
//__________________________________________________________________________________________________
void DefaultAccessController::checkPermission(
Any const & perm )
throw (RuntimeException)
{
// only dynamic checks of ac contexts, no static checks concerning credentials
Reference< XCurrentContext > xContext;
::uno_getCurrentContext( (void **)&xContext, str_envType.pData, 0 );
Reference< security::XAccessControlContext > xACC( ac_defimpl_getRestriction( xContext ) );
if (xACC.is())
{
xACC->checkPermission( perm );
}
}
//__________________________________________________________________________________________________
Any DefaultAccessController::doRestricted(
Reference< security::XAction > const & xAction,
Reference< security::XAccessControlContext > const & xRestriction )
throw (Exception)
{
Reference< XCurrentContext > xContext;
::uno_getCurrentContext( (void **)&xContext, str_envType.pData, 0 );
return ac_defimpl_doRestricted( xAction, xRestriction, xContext );
}
//__________________________________________________________________________________________________
Any DefaultAccessController::doPrivileged(
Reference< security::XAction > const & xAction,
Reference< security::XAccessControlContext > const & xRestriction )
throw (Exception)
{
Reference< XCurrentContext > xContext;
::uno_getCurrentContext( (void **)&xContext, str_envType.pData, 0 );
return ac_defimpl_doPrivileged( xAction, xRestriction, xContext );
}
//__________________________________________________________________________________________________
Reference< security::XAccessControlContext > DefaultAccessController::getContext()
throw (RuntimeException)
{
Reference< XCurrentContext > xContext;
::uno_getCurrentContext( (void **)&xContext, str_envType.pData, 0 );
return ac_defimpl_getRestriction( xContext );
}
//=== run on bootstrapping =========================================================================
Reference< security::XAccessController > createDefaultAccessController()
SAL_THROW( () )
{
return new DefaultAccessController();
}
//##################################################################################################
//### helper class #################################################################################
//##################################################################################################
static OUString str_ac_singleton = OUSTR(AC_SINGLETON);
//__________________________________________________________________________________________________ //__________________________________________________________________________________________________
AccessControl::AccessControl( Reference< XComponentContext > const & xContext ) AccessControl::AccessControl( Reference< XComponentContext > const & xContext )
@ -447,4 +174,3 @@ void AccessControl::checkSocketPermission(
} }
} }

View File

@ -2,9 +2,9 @@
* *
* $RCSfile: bootstrap.cxx,v $ * $RCSfile: bootstrap.cxx,v $
* *
* $Revision: 1.6 $ * $Revision: 1.7 $
* *
* last change: $Author: jbu $ $Date: 2002-01-16 16:24:14 $ * last change: $Author: dbo $ $Date: 2002-01-25 09:36:50 $
* *
* The Contents of this file are made available subject to the terms of * The Contents of this file are made available subject to the terms of
* either of the following licenses * either of the following licenses
@ -60,7 +60,6 @@
************************************************************************/ ************************************************************************/
#include <vector> #include <vector>
// #include <string.h>
#include <rtl/process.h> #include <rtl/process.h>
#include <rtl/bootstrap.hxx> #include <rtl/bootstrap.hxx>

View File

@ -246,10 +246,6 @@ __1cEcppubJWeakAggComponentImplHelper_getTypes6Fpn0AKclass_data__nDcomDsunEstarD
__1cEcppubEImplHelper_getImplementationId6Fpn0AKclass_data__nDcomDsunEstarDunoISequence4CW___; __1cEcppubEImplHelper_getImplementationId6Fpn0AKclass_data__nDcomDsunEstarDunoISequence4CW___;
__1cEcppubOdefaultBootstrap_InitialComponentContext6FrknDrtlIOUString__nDcomDsunEstarDunoJReference4n0GRXComponentContext____; __1cEcppubOdefaultBootstrap_InitialComponentContext6FrknDrtlIOUString__nDcomDsunEstarDunoJReference4n0GRXComponentContext____;
__1cEcppuXac_defimpl_doPrivileged6FrknDcomDsunEstarDunoJReference4n0DIsecurityHXAction___rkn0EJReference4n0FVXAccessControlContext___rkn0EJReference4n0EPXCurrentContext____n0EDAny__;
__1cEcppuXac_defimpl_doRestricted6FrknDcomDsunEstarDunoJReference4n0DIsecurityHXAction___rkn0EJReference4n0FVXAccessControlContext___rkn0EJReference4n0EPXCurrentContext____n0EDAny__;
__1cEcppuZac_defimpl_getRestriction6FrknDcomDsunEstarDunoJReference4n0EPXCurrentContext____n0EJReference4n0DIsecurityVXAccessControlContext____;
__1cEcppuNAccessControl2t5B6MrknDcomDsunEstarDunoJReference4n0EIsecurityRXAccessController____v_; __1cEcppuNAccessControl2t5B6MrknDcomDsunEstarDunoJReference4n0EIsecurityRXAccessController____v_;
__1cEcppuNAccessControl2t5B6MrknDcomDsunEstarDunoJReference4n0FRXComponentContext____v_; __1cEcppuNAccessControl2t5B6MrknDcomDsunEstarDunoJReference4n0FRXComponentContext____v_;
__1cEcppuNAccessControl2t5B6Mrk1_v_; __1cEcppuNAccessControl2t5B6Mrk1_v_;

View File

@ -2,9 +2,9 @@
* *
* $RCSfile: component_context.cxx,v $ * $RCSfile: component_context.cxx,v $
* *
* $Revision: 1.13 $ * $Revision: 1.14 $
* *
* last change: $Author: dbo $ $Date: 2001-12-17 12:25:55 $ * last change: $Author: dbo $ $Date: 2002-01-25 09:36:50 $
* *
* The Contents of this file are made available subject to the terms of * The Contents of this file are made available subject to the terms of
* either of the following licenses * either of the following licenses
@ -76,7 +76,6 @@
#include <cppuhelper/implbase1.hxx> #include <cppuhelper/implbase1.hxx>
#include <cppuhelper/compbase1.hxx> #include <cppuhelper/compbase1.hxx>
#include <cppuhelper/component_context.hxx> #include <cppuhelper/component_context.hxx>
#include <cppuhelper/access_control.hxx>
#include <com/sun/star/lang/XSingleServiceFactory.hpp> #include <com/sun/star/lang/XSingleServiceFactory.hpp>
#include <com/sun/star/lang/XMultiComponentFactory.hpp> #include <com/sun/star/lang/XMultiComponentFactory.hpp>
@ -90,7 +89,7 @@
#define SMGR_SINGLETON "/singletons/com.sun.star.lang.theServiceManager" #define SMGR_SINGLETON "/singletons/com.sun.star.lang.theServiceManager"
#define TDMGR_SINGLETON "/singletons/com.sun.star.reflection.theTypeDescriptionManager" #define TDMGR_SINGLETON "/singletons/com.sun.star.reflection.theTypeDescriptionManager"
#define AC_SINGLETON "/singletons/com.sun.star.security.theAccessController"
#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) ) #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )

View File

@ -2,9 +2,9 @@
# #
# $RCSfile: makefile.mk,v $ # $RCSfile: makefile.mk,v $
# #
# $Revision: 1.23 $ # $Revision: 1.24 $
# #
# last change: $Author: dbo $ $Date: 2002-01-11 11:08:58 $ # last change: $Author: dbo $ $Date: 2002-01-25 09:36:50 $
# #
# The Contents of this file are made available subject to the terms of # The Contents of this file are made available subject to the terms of
# either of the following licenses # either of the following licenses
@ -90,7 +90,6 @@ UNOTYPES= \
com.sun.star.uno.XAggregation \ com.sun.star.uno.XAggregation \
com.sun.star.uno.XComponentContext \ com.sun.star.uno.XComponentContext \
com.sun.star.uno.XUnloadingPreference \ com.sun.star.uno.XUnloadingPreference \
com.sun.star.uno.XCurrentContext \
com.sun.star.lang.XMultiServiceFactory \ com.sun.star.lang.XMultiServiceFactory \
com.sun.star.lang.XSingleServiceFactory \ com.sun.star.lang.XSingleServiceFactory \
com.sun.star.lang.XMultiComponentFactory \ com.sun.star.lang.XMultiComponentFactory \
@ -98,7 +97,6 @@ UNOTYPES= \
com.sun.star.lang.XServiceInfo \ com.sun.star.lang.XServiceInfo \
com.sun.star.lang.XInitialization \ com.sun.star.lang.XInitialization \
com.sun.star.lang.XEventListener \ com.sun.star.lang.XEventListener \
com.sun.star.security.XAccessController \
com.sun.star.reflection.XIdlReflection \ com.sun.star.reflection.XIdlReflection \
com.sun.star.reflection.XIdlClass \ com.sun.star.reflection.XIdlClass \
com.sun.star.reflection.XIdlClassProvider \ com.sun.star.reflection.XIdlClassProvider \
@ -123,6 +121,8 @@ UNOTYPES= \
com.sun.star.loader.XImplementationLoader \ com.sun.star.loader.XImplementationLoader \
com.sun.star.lang.XTypeProvider \ com.sun.star.lang.XTypeProvider \
com.sun.star.lang.XComponent \ com.sun.star.lang.XComponent \
com.sun.star.uno.XCurrentContext \
com.sun.star.security.XAccessController \
com.sun.star.security.RuntimePermission \ com.sun.star.security.RuntimePermission \
com.sun.star.io.FilePermission \ com.sun.star.io.FilePermission \
com.sun.star.connection.SocketPermission com.sun.star.connection.SocketPermission

View File

@ -193,10 +193,6 @@ component_getDescriptionFunc;
?WeakComponentImplHelper_getTypes@cppu@@YA?AV?$Sequence@VType@uno@star@sun@com@@@uno@star@sun@com@@PAUclass_data@1@@Z; ?WeakComponentImplHelper_getTypes@cppu@@YA?AV?$Sequence@VType@uno@star@sun@com@@@uno@star@sun@com@@PAUclass_data@1@@Z;
?defaultBootstrap_InitialComponentContext@cppu@@YA?AV?$Reference@VXComponentContext@uno@star@sun@com@@@uno@star@sun@com@@ABVOUString@rtl@@@Z; ?defaultBootstrap_InitialComponentContext@cppu@@YA?AV?$Reference@VXComponentContext@uno@star@sun@com@@@uno@star@sun@com@@ABVOUString@rtl@@@Z;
?ac_defimpl_getRestriction@cppu@@YA?AV?$Reference@VXAccessControlContext@security@star@sun@com@@@uno@star@sun@com@@ABV?$Reference@VXCurrentContext@uno@star@sun@com@@@3456@@Z;
?ac_defimpl_doRestricted@cppu@@YA?AVAny@uno@star@sun@com@@ABV?$Reference@VXAction@security@star@sun@com@@@3456@ABV?$Reference@VXAccessControlContext@security@star@sun@com@@@3456@ABV?$Reference@VXCurrentContext@uno@star@sun@com@@@3456@@Z;
?ac_defimpl_doPrivileged@cppu@@YA?AVAny@uno@star@sun@com@@ABV?$Reference@VXAction@security@star@sun@com@@@3456@ABV?$Reference@VXAccessControlContext@security@star@sun@com@@@3456@ABV?$Reference@VXCurrentContext@uno@star@sun@com@@@3456@@Z;
??0AccessControl@cppu@@QAE@ABV?$Reference@VXComponentContext@uno@star@sun@com@@@uno@star@sun@com@@@Z; ??0AccessControl@cppu@@QAE@ABV?$Reference@VXComponentContext@uno@star@sun@com@@@uno@star@sun@com@@@Z;
??0AccessControl@cppu@@QAE@ABV?$Reference@VXAccessController@security@star@sun@com@@@uno@star@sun@com@@@Z; ??0AccessControl@cppu@@QAE@ABV?$Reference@VXAccessController@security@star@sun@com@@@uno@star@sun@com@@@Z;
??0AccessControl@cppu@@QAE@ABV01@@Z; ??0AccessControl@cppu@@QAE@ABV01@@Z;

View File

@ -2,9 +2,9 @@
* *
* $RCSfile: servicefactory.cxx,v $ * $RCSfile: servicefactory.cxx,v $
* *
* $Revision: 1.28 $ * $Revision: 1.29 $
* *
* last change: $Author: dbo $ $Date: 2002-01-11 10:06:02 $ * last change: $Author: dbo $ $Date: 2002-01-25 09:36:50 $
* *
* The Contents of this file are made available subject to the terms of * The Contents of this file are made available subject to the terms of
* either of the following licenses * either of the following licenses
@ -59,6 +59,9 @@
* *
************************************************************************/ ************************************************************************/
#ifdef _DEBUG
#include <stdio.h>
#endif
#include <vector> #include <vector>
#include <rtl/process.h> #include <rtl/process.h>
@ -67,16 +70,16 @@
#include <rtl/bootstrap.hxx> #include <rtl/bootstrap.hxx>
#include <osl/diagnose.h> #include <osl/diagnose.h>
#include <osl/file.hxx> #include <osl/file.h>
#include <osl/module.h> #include <osl/module.h>
#include <osl/thread.h> #include <osl/thread.h>
#include <osl/process.h>
#include <cppuhelper/shlib.hxx> #include <cppuhelper/shlib.hxx>
#include <cppuhelper/factory.hxx> #include <cppuhelper/factory.hxx>
#include <cppuhelper/component_context.hxx> #include <cppuhelper/component_context.hxx>
#include <cppuhelper/servicefactory.hxx> #include <cppuhelper/servicefactory.hxx>
#include <cppuhelper/bootstrap.hxx> #include <cppuhelper/bootstrap.hxx>
#include <cppuhelper/access_control.hxx>
#include <com/sun/star/uno/XComponentContext.hpp> #include <com/sun/star/uno/XComponentContext.hpp>
#include <com/sun/star/lang/XInitialization.hpp> #include <com/sun/star/lang/XInitialization.hpp>
@ -171,7 +174,9 @@ Reference< registry::XSimpleRegistry > SAL_CALL createNestedRegistry(
createInstance( loadSharedLibComponentFactory( createInstance( loadSharedLibComponentFactory(
OUString( RTL_CONSTASCII_USTRINGPARAM("defreg") ), rBootstrapPath, OUString( RTL_CONSTASCII_USTRINGPARAM("defreg") ), rBootstrapPath,
OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.stoc.NestedRegistry") ), OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.stoc.NestedRegistry") ),
Reference< lang::XMultiServiceFactory >(), Reference< registry::XRegistryKey >() ) ), UNO_QUERY ); Reference< lang::XMultiServiceFactory >(),
Reference< registry::XRegistryKey >() ) ),
UNO_QUERY );
} }
catch (Exception &) catch (Exception &)
{ {
@ -181,6 +186,116 @@ Reference< registry::XSimpleRegistry > SAL_CALL createNestedRegistry(
return Reference< registry::XSimpleRegistry >(); return Reference< registry::XSimpleRegistry >();
} }
/** bootstrap variables:
UNO_AC=<mode> [mandatory]
-- mode := { on, off, dynamic-only, single-user, single-default-user }
UNO_AC_SERVICE=<service_name> [optional]
-- override ac singleton service name
UNO_AC_SINGLEUSER=<user-id|nothing> [optional]
-- run with this user id or with default user policy (<nothing>)
set UNO_AC=single-[default-]user
UNO_AC_POLICYSERVICE=<service_name> [optional]
-- override policy singleton service name
UNO_AC_POLICYFILE=<file_url> [optional]
-- read policy out of simple text file
*/
static void add_access_control_entries(
::std::vector< ContextEntry_Init > * values,
Bootstrap const & bootstrap )
SAL_THROW( (Exception) )
{
ContextEntry_Init entry;
::std::vector< ContextEntry_Init > & context_values = *values;
OUString ac_policy;
if (bootstrap.getFrom( OUSTR("UNO_AC_POLICYSERVICE"), ac_policy )) // overridden service name
{
// - policy singleton
entry.bLateInitService = true;
entry.name = OUSTR("/singletons/com.sun.star.security.thePolicy");
entry.value <<= ac_policy;
context_values.push_back( entry );
}
else if (bootstrap.getFrom( OUSTR("UNO_AC_POLICYFILE"), ac_policy )) // check for file policy
{
// - file policy prop: file-name
if (0 != ac_policy.compareToAscii( RTL_CONSTASCII_STRINGPARAM("file:///") )) // no file url
{
OUString baseDir;
oslProcessError prc = ::osl_getProcessWorkingDir(
&baseDir.pData );
OSL_ASSERT( osl_Process_E_None == prc );
OUString fileURL;
oslFileError frc = ::osl_getAbsoluteFileURL(
baseDir.pData, ac_policy.pData, &fileURL.pData );
OSL_ASSERT( osl_File_E_None == frc );
ac_policy = fileURL;
}
entry.bLateInitService = false;
entry.name = OUSTR("/implementations/com.sun.star.security.comp.stoc.FilePolicy/file-name");
entry.value <<= ac_policy;
context_values.push_back( entry );
// - policy singleton
entry.bLateInitService = true;
entry.name = OUSTR("/singletons/com.sun.star.security.thePolicy");
entry.value <<= OUSTR("com.sun.star.security.comp.stoc.FilePolicy");
context_values.push_back( entry );
} // else policy singleton comes from storage
OUString ac_mode;
if (! bootstrap.getFrom( OUSTR("UNO_AC"), ac_mode ))
{
ac_mode = OUSTR("off"); // default
}
OUString ac_user;
if (bootstrap.getFrom( OUSTR("UNO_AC_SINGLEUSER"), ac_user )) // ac in single-user mode
{
if (ac_user.getLength())
{
// - ac prop: single-user-id
entry.bLateInitService = false;
entry.name = OUSTR("/services/com.sun.star.security.AccessController/single-user-id");
entry.value <<= ac_user;
context_values.push_back( entry );
if (! ac_mode.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("single-user") ))
{
throw SecurityException(
OUSTR("set UNO_AC=single-user if you set UNO_AC_SINGLEUSER=<user-id>!"),
Reference< XInterface >() );
}
}
else
{
if (! ac_mode.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("single-default-user") ))
{
throw SecurityException(
OUSTR("set UNO_AC=single-default-user if you set UNO_AC_SINGLEUSER=<nothing>!"),
Reference< XInterface >() );
}
}
}
OUString ac_service;
if (! bootstrap.getFrom( OUSTR("UNO_AC_SERVICE"), ac_service )) // override service name
{
ac_service = OUSTR("com.sun.star.security.AccessController"); // default
// ac = OUSTR("com.sun.star.security.comp.stoc.AccessController");
}
// - ac prop: mode { "off", "on", "dynamic-only", "single-user", "single-default-user" }
entry.bLateInitService = false;
entry.name = OUSTR("/services/com.sun.star.security.AccessController/mode");
entry.value <<= ac_mode;
context_values.push_back( entry );
// - ac singleton
entry.bLateInitService = true;
entry.name = OUSTR("/singletons/com.sun.star.security.theAccessController");
entry.value <<= ac_service;
context_values.push_back( entry );
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
Reference< lang::XMultiComponentFactory > bootstrapInitialSF( Reference< lang::XMultiComponentFactory > bootstrapInitialSF(
OUString const & rBootstrapPath ) OUString const & rBootstrapPath )
@ -198,6 +313,8 @@ Reference< lang::XMultiComponentFactory > bootstrapInitialSF(
"defreg", "com.sun.star.comp.stoc.NestedRegistry", "defreg", "com.sun.star.comp.stoc.NestedRegistry",
"tdmgr", "com.sun.star.comp.stoc.TypeDescriptionManager", "tdmgr", "com.sun.star.comp.stoc.TypeDescriptionManager",
"impreg", "com.sun.star.comp.stoc.ImplementationRegistration", "impreg", "com.sun.star.comp.stoc.ImplementationRegistration",
"sec", "com.sun.star.security.comp.stoc.AccessController",
"sec", "com.sun.star.security.comp.stoc.FilePolicy",
0 0
}; };
addFactories( addFactories(
@ -227,7 +344,7 @@ Reference< XComponentContext > bootstrapInitialContext(
// basic context values // basic context values
ContextEntry_Init entry; ContextEntry_Init entry;
::std::vector< ContextEntry_Init > context_values; ::std::vector< ContextEntry_Init > context_values;
context_values.reserve( 6 ); context_values.reserve( 12 );
// read out singleton infos from registry // read out singleton infos from registry
if (services_xRegistry.is()) if (services_xRegistry.is())
@ -270,29 +387,27 @@ Reference< XComponentContext > bootstrapInitialContext(
} }
} }
// smgr // smgr:
// - smgr singleton
entry.bLateInitService = false; entry.bLateInitService = false;
entry.name = OUSTR("/singletons/com.sun.star.lang.theServiceManager"); entry.name = OUSTR("/singletons/com.sun.star.lang.theServiceManager");
entry.value <<= xSF; entry.value <<= xSF;
context_values.push_back( entry ); context_values.push_back( entry );
// ac // ac, policy:
entry.bLateInitService = false; add_access_control_entries( &context_values, bootstrap );
entry.name = OUSTR(AC_SINGLETON);
entry.value <<= createDefaultAccessController();
context_values.push_back( entry );
// tdmgr // tdmgr:
entry.bLateInitService = true; // - tdmgr prop: cache size
entry.name = OUSTR("/singletons/com.sun.star.reflection.theTypeDescriptionManager");
entry.value <<= OUSTR("com.sun.star.reflection.TypeDescriptionManager");
context_values.push_back( entry );
// tdmgr: cache size
entry.bLateInitService = false; entry.bLateInitService = false;
entry.name = OUSTR("/implementations/com.sun.star.comp.stoc.TypeDescriptionManager/CacheSize"); entry.name = OUSTR("/implementations/com.sun.star.comp.stoc.TypeDescriptionManager/CacheSize");
entry.value <<= (sal_Int32)512; entry.value <<= (sal_Int32)512;
context_values.push_back( entry ); context_values.push_back( entry );
// - tdmgr singleton
entry.bLateInitService = true;
entry.name = OUSTR("/singletons/com.sun.star.reflection.theTypeDescriptionManager");
entry.value <<= OUSTR("com.sun.star.comp.stoc.TypeDescriptionManager");
context_values.push_back( entry );
Reference< XComponentContext > xContext; Reference< XComponentContext > xContext;
Reference< container::XHierarchicalNameAccess > xTDMgr; Reference< container::XHierarchicalNameAccess > xTDMgr;
@ -349,18 +464,6 @@ Reference< XComponentContext > bootstrapInitialContext(
installTypeDescriptionManager( xTDMgr ); installTypeDescriptionManager( xTDMgr );
} }
// wrap ac for subsequent services
OUString ac_service;
if (bootstrap.getFrom( OUSTR("UNO_AC"), ac_service ) && ac_service.getLength())
{
// wrap ac
ContextEntry_Init entry;
entry.bLateInitService = true;
entry.name = OUSTR(AC_SINGLETON);
entry.value <<= ac_service;
xContext = createComponentContext( &entry, 1, xContext );
}
return xContext; return xContext;
} }