1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_comphelper.hxx"
30 
31 #include <stdio.h>
32 #include <osl/file.hxx>
33 #include <osl/security.hxx>
34 #include <osl/thread.h>
35 #include <vos/process.hxx>
36 #include <rtl/textenc.h>
37 #include <rtl/uri.h>
38 #include <rtl/uri.hxx>
39 
40 using namespace vos;
41 using namespace osl;
42 using namespace rtl;
43 
44 #define PATH_DELEMITTER	'/'
45 
46 #define USER_REGISTRY_NAME_ENV 		"STAR_USER_REGISTRY"
47 #define SYSTEM_REGISTRY_NAME_ENV 	"STAR_REGISTRY"
48 #define REGISTRY_SYSTEM_NAME	"services.rdb"
49 
50 #define REGISTRY_LOCAL_NAME		"user60.rdb"
51 
52 #ifdef SAL_UNX
53 #define CONFIG_PATH_PREFIX		"."
54 #else
55 #define CONFIG_PATH_PREFIX		""
56 #endif
57 
58 namespace comphelper
59 {
60 
61 /**
62    @return sal_True, if the office is started in a portal
63                      environment.
64 		   sal_False, if the common office is started
65  */
66 static sal_Bool retrievePortalUserDir( OUString *pDirectory )
67 {
68 	OStartupInfo startInfo;
69 	sal_uInt32 nArgs = startInfo.getCommandArgCount();
70 	sal_Bool bIsPortalUser = sal_False;
71 	OUString sArg;
72 	while( nArgs > 0 )
73   	{
74 		if ( !startInfo.getCommandArg(--nArgs, sArg) )
75 	  	{
76 	    	if ( sArg.indexOf(OUString::createFromAscii("-userid")) == 0 )
77 	    	{
78 
79 	      		bIsPortalUser = sal_True;
80 				sal_Int32 nStart = sArg.lastIndexOf( '[' );
81 				sal_Int32 nEnd   = sArg.lastIndexOf( ']' );
82 				if( -1 == nStart || -1 == nEnd || nEnd < nStart)
83 				{
84 					*pDirectory = OUString();
85 				}
86 				else
87 				{
88 					OUString aEncHome = sArg.copy( nStart + 1 , nEnd - nStart -1 );
89 					*pDirectory = rtl::Uri::decode(aEncHome,
90 												   rtl_UriDecodeWithCharset,
91 												   RTL_TEXTENCODING_UTF8);
92 				}
93 	      		break;
94 	    	}
95 	  	}
96  	}
97 	return bIsPortalUser;
98 }
99 
100 
101 static OUString getDefaultLocalRegistry()
102 {
103 	OUString uBuffer, userRegistryName;
104 	OUString portalUserDir;
105 
106 	sal_Bool bIsPortalUser = retrievePortalUserDir( &portalUserDir );
107 
108 	if ( bIsPortalUser )
109    	{
110 		if(  portalUserDir.getLength() )
111 		{
112 			FileBase::getFileURLFromSystemPath( portalUserDir , portalUserDir );
113 			userRegistryName = portalUserDir;
114 			userRegistryName += OUString( RTL_CONSTASCII_USTRINGPARAM(
115 				"/user/" REGISTRY_LOCAL_NAME ) );
116 
117 			// Directory creation is probably necessary for bootstrapping a new
118 			// user in the portal environment (the ucb uses this function).
119 			// This should be solved differently, as
120 			// no one expects this function to create anything ...
121 			OUString sSeparator(RTL_CONSTASCII_USTRINGPARAM("/"));
122 			OUString sPath(RTL_CONSTASCII_USTRINGPARAM("file://"));
123 			FileBase::RC retRC = FileBase::E_None;
124 
125 			sal_Int32 nIndex = 3;
126 			sPath += userRegistryName.getToken(2, '/', nIndex);
127 			while( nIndex != -1 )
128 			{
129 				sPath += sSeparator;
130 				sPath += userRegistryName.getToken(0, '/', nIndex);
131 				if( nIndex == -1 )
132 					break;
133 				Directory aDir( sPath );
134 				if( aDir.open() == FileBase::E_NOENT )
135 				{
136 					retRC = Directory::create(sPath);
137 					if ( retRC != FileBase::E_None && retRC != FileBase::E_EXIST)
138 					{
139 						return OUString();
140 					}
141 				}
142 			}
143 		}
144 	}
145 	else /* bIsPortalUser */
146 	{
147 		::osl::Security aUserSecurity;
148 		aUserSecurity.getConfigDir( userRegistryName );
149 		userRegistryName += OUString( RTL_CONSTASCII_USTRINGPARAM(
150 			"/" CONFIG_PATH_PREFIX REGISTRY_LOCAL_NAME ) );
151 	}
152 
153 	return userRegistryName;
154 }
155 
156 
157 OUString getPathToUserRegistry()
158 {
159 	OUString  	userRegistryName;
160 	FILE  		*f=NULL;
161 
162 	// search the environment STAR_USER_REGISTRY
163 	OString sBuffer( getenv(USER_REGISTRY_NAME_ENV) );
164 	if ( sBuffer.getLength() > 0 )
165 	{
166 		f = fopen( sBuffer.getStr(), "r" );
167 
168 		if (f != NULL)
169 		{
170 			fclose(f);
171 			userRegistryName = OStringToOUString( sBuffer, osl_getThreadTextEncoding() );
172 		}
173 	}
174 
175 	if ( !userRegistryName.getLength() )
176 	{
177 		userRegistryName = getDefaultLocalRegistry();
178 	}
179 
180 	return userRegistryName;
181 }
182 
183 OUString getPathToSystemRegistry()
184 {
185 	OUString uBuffer;
186 	OUString registryBaseName( RTL_CONSTASCII_USTRINGPARAM(REGISTRY_SYSTEM_NAME) );
187 	OUString systemRegistryName;
188 	FILE  	 *f=NULL;
189 
190 	// search in the directory of the executable
191     OStartupInfo info;
192 	if( OStartupInfo::E_None == info.getExecutableFile(uBuffer) )
193 	{
194 		sal_uInt32 	lastIndex = uBuffer.lastIndexOf(PATH_DELEMITTER);
195 		if (lastIndex > 0)
196 		{
197 			uBuffer = uBuffer.copy(0, lastIndex + 1);
198 		}
199 
200 		uBuffer += registryBaseName;
201 
202 		if (!FileBase::getSystemPathFromFileURL(uBuffer, systemRegistryName))
203 		{
204 			OString tmpStr( OUStringToOString(systemRegistryName, osl_getThreadTextEncoding()) );
205 			f = fopen( tmpStr.getStr(), "r" );
206 		}
207 	}
208 
209 	if (f == NULL)
210 	{
211 		// search the environment STAR_REGISTRY
212 		OString tmpStr( getenv(SYSTEM_REGISTRY_NAME_ENV) );
213 		if ( tmpStr.getLength() > 0 )
214 		{
215 			f = fopen(tmpStr.getStr(), "r");
216 
217 			if (f != NULL)
218 			{
219 				fclose(f);
220 				systemRegistryName = OStringToOUString( tmpStr, osl_getThreadTextEncoding() );
221 			} else
222 			{
223 				systemRegistryName = OUString();
224 			}
225 		}
226 	} else
227 	{
228 		fclose(f);
229 	}
230 
231 	return systemRegistryName;
232 }
233 
234 }
235 
236