office-gobmx/configmgr/workben/apitest/cfgadduser.cxx
Rüdiger Timm f976195f8b INTEGRATION: CWS ooo19126 (1.5.194); FILE MERGED
2005/09/05 17:05:47 rt 1.5.194.1: #i54170# Change license header: remove SISSL
2005-09-08 03:45:24 +00:00

383 lines
14 KiB
C++

/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: cfgadduser.cxx,v $
*
* $Revision: 1.6 $
*
* last change: $Author: rt $ $Date: 2005-09-08 04:45:24 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
************************************************************************/
#include <stdio.h>
#include <string.h>
#ifndef _COMPHELPER_STLTYPES_HXX_
#include <comphelper/stl_types.hxx>
#endif
#include <cppuhelper/extract.hxx>
#ifndef _COM_SUN_STAR_UNO_TYPE_HXX_
#include <com/sun/star/uno/Type.hxx>
#endif
#ifndef _COM_SUN_STAR_UNO_TYPECLASS_HPP_
#include <com/sun/star/uno/TypeClass.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_
#include <com/sun/star/beans/PropertyValue.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_
#include <com/sun/star/beans/PropertyValue.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_XCHANGESBATCH_HPP_
#include <com/sun/star/util/XChangesBatch.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_
#include <com/sun/star/container/XNameContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XSINGLESERVICEFACTORY_HPP_
#include <com/sun/star/lang/XSingleServiceFactory.hpp>
#endif
#ifndef _CPPUHELPER_SERVICEFACTORY_HXX_
#include <cppuhelper/servicefactory.hxx>
#endif
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::container;
#define ASCII_STRING(rtlOUString) ::rtl::OString((rtlOUString).getStr(), (rtlOUString).getLength(), RTL_TEXTENCODING_ASCII_US).getStr()
//=============================================================================
void explain(sal_Bool _bVerbose)
{
cout << "cfgadduser - adding users to a registry server\n";
cout << "\nusage :\n";
cout << "cfgadduser [-s <server> -p <port>] [-portal] [-r <registry>] [-a <sysaccount>]";
cout << " [-h <homedirbase>] [-pwd] <user> [<user>]*\n";
cout << "\nparameters\n";
cout << " <server> - machine where the registry server is running\n";
cout << " <port> - port the registry server is listening at\n";
cout << " <registry> - registry file to use to instantiate services. Defaulted to\n";
cout << " applicat.rdb\n";
cout << " <sysaccount> - system account to use for the newly created user(s)\n";
cout << " <homedirbase> - home directory base. The concret home dir of a user will\n";
cout << " be built by appending the the user name to the base dir.\n";
cout << " <user> - user name to add\n";
cout << " -portal - specify that the program should connect to a running portal,\n";
cout << " not directly to the registry server (you need a ";
#ifdef WIN32
cout << "portal.dll\n";
#else
cout << "libportal.so\n";
#endif
cout << " for this)\n";
cout << " In this case, <server> and <port> specify the location where\n";
cout << " StarPortal is running\n";
cout << "\n";
cout << "If no server is specified, the configuration proxy will try to bootstrap from\n";
cout << "the initialization file (";
#ifdef WIN32
cout << "sregistry.ini";
#else
cout << "sregistryrc";
#endif
cout << ")\n\n";
cout.flush();
}
//=============================================================================
#if (defined UNX) || (defined OS2)
int main( int argc, char * argv[] )
#else
int _cdecl main( int argc, char * argv[] )
#endif
{
sal_Char* pPort = NULL;
sal_Char* pServer = NULL;
sal_Char* pRegistry = NULL;
sal_Char* pSysAccount = NULL;
sal_Char* pHomeDirBase = NULL;
sal_Bool bPortal = sal_False;
::std::vector< sal_Char* > aUsers;
// collect some parameters
sal_Char** pArgs = argv + 1;
for (sal_Int32 i=1; i<argc; ++i, ++pArgs)
{
sal_Char* pCurArg = *pArgs;
sal_Int32 nLen = strlen(pCurArg);
sal_Bool bInvalidArg = sal_True;
if (nLen && ('-' == *pCurArg))
{ // it's a switch
sal_Char* pSwitch = pCurArg + 1;
switch (nLen)
{
case 2:
switch (*pSwitch)
{
case '?':
explain(sal_True);
return 1;
case 'h':
pHomeDirBase = *++pArgs;
++i;
bInvalidArg = sal_False;
break;
case 'a':
pSysAccount = *++pArgs;
++i;
bInvalidArg = sal_False;
break;
case 'p':
pPort = *++pArgs;
++i;
bInvalidArg = sal_False;
break;
case 's':
pServer = *++pArgs;
++i;
bInvalidArg = sal_False;
break;
case 'r':
pRegistry = *++pArgs;
++i;
bInvalidArg = sal_False;
break;
}
break;
case 7:
if (0 == strncmp(pSwitch, "portal", 6))
{
bInvalidArg = sal_False;
bPortal = sal_True;
}
break;
}
}
else
{
if ((1 == nLen) && ('?' == *pCurArg))
{
explain(sal_True);
return 1;
}
else
{
bInvalidArg = sal_False;
aUsers.push_back(pCurArg);
}
}
if (bInvalidArg)
{
explain(sal_False);
return 1;
}
}
if ((!pServer && pPort) || (!pPort && pServer))
{
explain(sal_False);
return 1;
}
if (0 == aUsers.size())
{
explain(sal_False);
return 1;
}
// refine some params
::rtl::OUString sHomeDirBase, sSystemAccountName;
if (pHomeDirBase)
{
sHomeDirBase = ::rtl::OUString::createFromAscii(pHomeDirBase);
if (!sHomeDirBase.getLength() || ('/' != sHomeDirBase.getStr()[sHomeDirBase.getLength() - 1]))
sHomeDirBase += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/"));
}
if (pSysAccount)
sSystemAccountName = ::rtl::OUString::createFromAscii(pSysAccount);
try
{
::rtl::OUString const sServiceRegistry = ::rtl::OUString::createFromAscii( pRegistry ? pRegistry : "applicat.rdb" );
Reference< XMultiServiceFactory > xORB = ::cppu::createRegistryServiceFactory(
sServiceRegistry,
::rtl::OUString()
);
if (!xORB.is())
{
cerr << "Could not create the service factory !\n\n";
return 1;
}
// collect the params for the config provider
Sequence< Any > aProviderArgs(3 + (pServer ? 2 : 0));
aProviderArgs[0] = makeAny(PropertyValue(
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("servertype")),
0,
makeAny(::rtl::OUString::createFromAscii(bPortal ? "portal" : "remote")),
PropertyState_DIRECT_VALUE
));
aProviderArgs[1] = makeAny(PropertyValue(
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("user")),
0,
makeAny(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Administrator"))),
PropertyState_DIRECT_VALUE
));
aProviderArgs[2] = makeAny(PropertyValue(
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("password")),
0,
makeAny(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("unused"))),
PropertyState_DIRECT_VALUE
));
if (pServer)
{
aProviderArgs[3] = makeAny(PropertyValue(
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("server")),
0,
makeAny(::rtl::OUString::createFromAscii(pServer)),
PropertyState_DIRECT_VALUE
));
sal_Int32 nPort = ::rtl::OUString::createFromAscii(pPort).toInt32();
aProviderArgs[4] = makeAny(PropertyValue(
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("port")),
0,
makeAny(nPort),
PropertyState_DIRECT_VALUE
));
}
Reference< XMultiServiceFactory > xCfgProvider(
xORB->createInstanceWithArguments(::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider"),
aProviderArgs),
UNO_QUERY);
if (!xCfgProvider.is())
{
cerr << "Could not create the configuration provider !\n\n";
return 3;
}
Reference< XInterface > xIFace = xCfgProvider->createInstance(
::rtl::OUString::createFromAscii("com.sun.star.configuration.UserAdministration"));
if (!xIFace.is())
{
cerr << "Could not create the configuration provider !\n\n";
return 4;
}
Reference< XChangesBatch > xUserChanges(xIFace, UNO_QUERY);
Reference< XNameContainer > xUserContainer(xIFace, UNO_QUERY);
Reference< XSingleServiceFactory> xUserFactory(xIFace, UNO_QUERY);
if (!xUserChanges.is() || !xUserContainer.is() || !xUserFactory.is())
{
cerr << "the user admin access does not provide the necessary interfaces !\n\n";
return 5;
}
cout << "going to add the users ..." << endl << endl;
for ( ::std::vector< sal_Char* >::const_iterator aUserLoop = aUsers.begin();
aUserLoop != aUsers.end();
++aUserLoop
)
{
cout << *aUserLoop << " ... ";
sal_Bool bHadLinebreak = sal_False;
try
{
Reference< XInterface > xNewUser = xUserFactory->createInstance();
// the user name as unicode string use more than once)
::rtl::OUString sUserName = ::rtl::OUString::createFromAscii(*aUserLoop);
// the XNameContainer access to the Security node in the user profile data
Reference< XNameReplace > xSecurityDataAccess;
Reference< XNameAccess > xUserDataAccess(xNewUser, UNO_QUERY);
if (xUserDataAccess.is())
{
Any aSecurity = xUserDataAccess->getByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Security")));
::cppu::extractInterface(xSecurityDataAccess, aSecurity);
}
if (!xSecurityDataAccess.is())
throw Exception(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("The user administration service did not provide a valid user template.")), NULL);
// set the home directory
if (sHomeDirBase.getLength())
{
::rtl::OUString sHomeDir(sHomeDirBase);
sHomeDir += sUserName;
xSecurityDataAccess->replaceByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HomeDirectory")), makeAny(sHomeDir));
cout << "\n\thome dir : " << ASCII_STRING(sHomeDir) << " ... ";
cout.flush();
bHadLinebreak = sal_True;
}
if (sSystemAccountName.getLength())
{
xSecurityDataAccess->replaceByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SystemAccount")), makeAny(sSystemAccountName));
cout << "\n\tsystem account: " << ASCII_STRING(sSystemAccountName) << " ... ";
cout.flush();
bHadLinebreak = sal_True;
}
xUserContainer->insertByName(sUserName, makeAny(xNewUser));
xUserChanges->commitChanges();
if (bHadLinebreak)
cout << "\n";
cout << "done.\n";
cout.flush();
}
catch(Exception& e)
{
cout << "\n";
if (!bHadLinebreak)
cout << "\t";
cerr << "unable to add the user named " << *aUserLoop << endl;
if (!bHadLinebreak)
cout << "\t";
cerr << "(exception message: " << ::rtl::OString(e.Message.getStr(), e.Message.getLength(), RTL_TEXTENCODING_ASCII_US).getStr() << ")" << endl;
}
cout << "\n";
}
}
catch(Exception& e)
{
cerr << "Caught exception: " << ASCII_STRING(e.Message) << endl;
return 2;
}
return 0;
}