summaryrefslogtreecommitdiff
path: root/configmgr/workben/apitest/cfgadduser.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/workben/apitest/cfgadduser.cxx')
-rw-r--r--configmgr/workben/apitest/cfgadduser.cxx358
1 files changed, 358 insertions, 0 deletions
diff --git a/configmgr/workben/apitest/cfgadduser.cxx b/configmgr/workben/apitest/cfgadduser.cxx
new file mode 100644
index 000000000000..f0b6e2fcddd1
--- /dev/null
+++ b/configmgr/workben/apitest/cfgadduser.cxx
@@ -0,0 +1,358 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: cfgadduser.cxx,v $
+ * $Revision: 1.8 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_configmgr.hxx"
+
+#include <stdio.h>
+#include <string.h>
+#include <comphelper/stl_types.hxx>
+#include <cppuhelper/extract.hxx>
+#include <com/sun/star/uno/Type.hxx>
+#include <com/sun/star/uno/TypeClass.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <cppuhelper/servicefactory.hxx>
+
+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;
+}