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
25*b1cdbd2cSJim Jagielski #include "system.h"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #include <osl/security.h>
28*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
29*b1cdbd2cSJim Jagielski #include <osl/thread.h>
30*b1cdbd2cSJim Jagielski #include <osl/file.h>
31*b1cdbd2cSJim Jagielski #include <systools/win32/uwinapi.h>
32*b1cdbd2cSJim Jagielski #include "secimpl.h"
33*b1cdbd2cSJim Jagielski
34*b1cdbd2cSJim Jagielski /*****************************************************************************/
35*b1cdbd2cSJim Jagielski /* Data Type Definition */
36*b1cdbd2cSJim Jagielski /*****************************************************************************/
37*b1cdbd2cSJim Jagielski
38*b1cdbd2cSJim Jagielski
39*b1cdbd2cSJim Jagielski /* Data for use in (un)LoadProfile Functions */
40*b1cdbd2cSJim Jagielski /* Declarations based on USERENV.H for Windows 2000 Beta 2 */
41*b1cdbd2cSJim Jagielski #define PI_NOUI 0x00000001 // Prevents displaying of messages
42*b1cdbd2cSJim Jagielski #define PI_APPLYPOLICY 0x00000002 // Apply NT4 style policy
43*b1cdbd2cSJim Jagielski
44*b1cdbd2cSJim Jagielski typedef struct _PROFILEINFOW {
45*b1cdbd2cSJim Jagielski DWORD dwSize; // Must be set to sizeof(PROFILEINFO)
46*b1cdbd2cSJim Jagielski DWORD dwFlags; // See flags above
47*b1cdbd2cSJim Jagielski LPWSTR lpUserName; // User name (required)
48*b1cdbd2cSJim Jagielski LPWSTR lpProfilePath; // Roaming profile path
49*b1cdbd2cSJim Jagielski LPWSTR lpDefaultPath; // Default user profile path
50*b1cdbd2cSJim Jagielski LPWSTR lpServerName; // Validating DC name in netbios format
51*b1cdbd2cSJim Jagielski LPWSTR lpPolicyPath; // Path to the NT4 style policy file
52*b1cdbd2cSJim Jagielski HANDLE hProfile; // Registry key handle - filled by function
53*b1cdbd2cSJim Jagielski } PROFILEINFOW, FAR * LPPROFILEINFOW;
54*b1cdbd2cSJim Jagielski
55*b1cdbd2cSJim Jagielski /* Typedefs for function pointers in USERENV.DLL */
56*b1cdbd2cSJim Jagielski typedef BOOL (STDMETHODCALLTYPE FAR * LPFNLOADUSERPROFILE) (
57*b1cdbd2cSJim Jagielski HANDLE hToken,
58*b1cdbd2cSJim Jagielski LPPROFILEINFOW lpProfileInfo
59*b1cdbd2cSJim Jagielski );
60*b1cdbd2cSJim Jagielski
61*b1cdbd2cSJim Jagielski typedef BOOL (STDMETHODCALLTYPE FAR * LPFNUNLOADUSERPROFILE) (
62*b1cdbd2cSJim Jagielski HANDLE hToken,
63*b1cdbd2cSJim Jagielski HANDLE hProfile
64*b1cdbd2cSJim Jagielski );
65*b1cdbd2cSJim Jagielski
66*b1cdbd2cSJim Jagielski typedef BOOL (STDMETHODCALLTYPE FAR * LPFNGETUSERPROFILEDIR) (
67*b1cdbd2cSJim Jagielski HANDLE hToken,
68*b1cdbd2cSJim Jagielski LPTSTR lpProfileDir,
69*b1cdbd2cSJim Jagielski LPDWORD lpcchSize
70*b1cdbd2cSJim Jagielski );
71*b1cdbd2cSJim Jagielski
72*b1cdbd2cSJim Jagielski /* To get an impersonation token we need to create an impersonation
73*b1cdbd2cSJim Jagielski duplicate so every access token has to be created with duplicate
74*b1cdbd2cSJim Jagielski access rights */
75*b1cdbd2cSJim Jagielski
76*b1cdbd2cSJim Jagielski #define TOKEN_DUP_QUERY (TOKEN_QUERY|TOKEN_DUPLICATE)
77*b1cdbd2cSJim Jagielski
78*b1cdbd2cSJim Jagielski /*****************************************************************************/
79*b1cdbd2cSJim Jagielski /* Static Module Function Declarations */
80*b1cdbd2cSJim Jagielski /*****************************************************************************/
81*b1cdbd2cSJim Jagielski
82*b1cdbd2cSJim Jagielski static sal_Bool isWNT(void);
83*b1cdbd2cSJim Jagielski static sal_Bool GetSpecialFolder(rtl_uString **strPath,int nFolder);
84*b1cdbd2cSJim Jagielski static BOOL Privilege(LPTSTR pszPrivilege, BOOL bEnable);
85*b1cdbd2cSJim Jagielski static sal_Bool SAL_CALL getUserNameImpl(oslSecurity Security, rtl_uString **strName, sal_Bool bIncludeDomain);
86*b1cdbd2cSJim Jagielski
87*b1cdbd2cSJim Jagielski /*****************************************************************************/
88*b1cdbd2cSJim Jagielski /* Exported Module Functions */
89*b1cdbd2cSJim Jagielski /*****************************************************************************/
90*b1cdbd2cSJim Jagielski
osl_getCurrentSecurity(void)91*b1cdbd2cSJim Jagielski oslSecurity SAL_CALL osl_getCurrentSecurity(void)
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski oslSecurityImpl* pSecImpl = malloc(sizeof(oslSecurityImpl));
94*b1cdbd2cSJim Jagielski
95*b1cdbd2cSJim Jagielski pSecImpl->m_pNetResource = NULL;
96*b1cdbd2cSJim Jagielski pSecImpl->m_User[0] = '\0';
97*b1cdbd2cSJim Jagielski pSecImpl->m_hToken = NULL;
98*b1cdbd2cSJim Jagielski pSecImpl->m_hProfile = NULL;
99*b1cdbd2cSJim Jagielski
100*b1cdbd2cSJim Jagielski return ((oslSecurity)pSecImpl);
101*b1cdbd2cSJim Jagielski }
102*b1cdbd2cSJim Jagielski
osl_loginUser(rtl_uString * strUserName,rtl_uString * strPasswd,oslSecurity * pSecurity)103*b1cdbd2cSJim Jagielski oslSecurityError SAL_CALL osl_loginUser( rtl_uString *strUserName, rtl_uString *strPasswd, oslSecurity *pSecurity )
104*b1cdbd2cSJim Jagielski {
105*b1cdbd2cSJim Jagielski oslSecurityError ret;
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielski if (!isWNT())
108*b1cdbd2cSJim Jagielski {
109*b1cdbd2cSJim Jagielski *pSecurity = osl_getCurrentSecurity();
110*b1cdbd2cSJim Jagielski ret = osl_Security_E_None;
111*b1cdbd2cSJim Jagielski }
112*b1cdbd2cSJim Jagielski else
113*b1cdbd2cSJim Jagielski {
114*b1cdbd2cSJim Jagielski sal_Unicode* strUser;
115*b1cdbd2cSJim Jagielski sal_Unicode* strDomain = _wcsdup(rtl_uString_getStr(strUserName));
116*b1cdbd2cSJim Jagielski HANDLE hUserToken;
117*b1cdbd2cSJim Jagielski
118*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
119*b1cdbd2cSJim Jagielski LUID luid;
120*b1cdbd2cSJim Jagielski #endif
121*b1cdbd2cSJim Jagielski
122*b1cdbd2cSJim Jagielski if (NULL != (strUser = wcschr(strDomain, L'/')))
123*b1cdbd2cSJim Jagielski *strUser++ = L'\0';
124*b1cdbd2cSJim Jagielski else
125*b1cdbd2cSJim Jagielski {
126*b1cdbd2cSJim Jagielski strUser = strDomain;
127*b1cdbd2cSJim Jagielski strDomain = NULL;
128*b1cdbd2cSJim Jagielski }
129*b1cdbd2cSJim Jagielski
130*b1cdbd2cSJim Jagielski // this process must have the right: 'act as a part of operatingsystem'
131*b1cdbd2cSJim Jagielski OSL_ASSERT(LookupPrivilegeValue(NULL, SE_TCB_NAME, &luid));
132*b1cdbd2cSJim Jagielski
133*b1cdbd2cSJim Jagielski if (LogonUserW(strUser, strDomain ? strDomain : L"", rtl_uString_getStr(strPasswd),
134*b1cdbd2cSJim Jagielski LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
135*b1cdbd2cSJim Jagielski &hUserToken))
136*b1cdbd2cSJim Jagielski {
137*b1cdbd2cSJim Jagielski oslSecurityImpl* pSecImpl = malloc(sizeof(oslSecurityImpl));
138*b1cdbd2cSJim Jagielski
139*b1cdbd2cSJim Jagielski pSecImpl->m_pNetResource = NULL;
140*b1cdbd2cSJim Jagielski pSecImpl->m_hToken = hUserToken;
141*b1cdbd2cSJim Jagielski pSecImpl->m_hProfile = NULL;
142*b1cdbd2cSJim Jagielski wcscpy(pSecImpl->m_User, strUser);
143*b1cdbd2cSJim Jagielski
144*b1cdbd2cSJim Jagielski *pSecurity = (oslSecurity)pSecImpl;
145*b1cdbd2cSJim Jagielski ret = osl_Security_E_None;
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski else
148*b1cdbd2cSJim Jagielski ret = osl_Security_E_UserUnknown;
149*b1cdbd2cSJim Jagielski
150*b1cdbd2cSJim Jagielski if (strDomain)
151*b1cdbd2cSJim Jagielski free(strDomain);
152*b1cdbd2cSJim Jagielski else
153*b1cdbd2cSJim Jagielski free(strUser);
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim Jagielski return ret;
157*b1cdbd2cSJim Jagielski }
158*b1cdbd2cSJim Jagielski
osl_loginUserOnFileServer(rtl_uString * strUserName,rtl_uString * strPasswd,rtl_uString * strFileServer,oslSecurity * pSecurity)159*b1cdbd2cSJim Jagielski oslSecurityError SAL_CALL osl_loginUserOnFileServer(rtl_uString *strUserName,
160*b1cdbd2cSJim Jagielski rtl_uString *strPasswd,
161*b1cdbd2cSJim Jagielski rtl_uString *strFileServer,
162*b1cdbd2cSJim Jagielski oslSecurity *pSecurity)
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski oslSecurityError ret;
165*b1cdbd2cSJim Jagielski DWORD err;
166*b1cdbd2cSJim Jagielski NETRESOURCEW netResource;
167*b1cdbd2cSJim Jagielski sal_Unicode* remoteName;
168*b1cdbd2cSJim Jagielski sal_Unicode* userName;
169*b1cdbd2cSJim Jagielski
170*b1cdbd2cSJim Jagielski remoteName = malloc(rtl_uString_getLength(strFileServer) + rtl_uString_getLength(strUserName) + 4);
171*b1cdbd2cSJim Jagielski userName = malloc(rtl_uString_getLength(strFileServer) + rtl_uString_getLength(strUserName) + 2);
172*b1cdbd2cSJim Jagielski
173*b1cdbd2cSJim Jagielski wcscpy(remoteName, L"\\\\");
174*b1cdbd2cSJim Jagielski wcscat(remoteName, rtl_uString_getStr(strFileServer));
175*b1cdbd2cSJim Jagielski wcscat(remoteName, L"\\");
176*b1cdbd2cSJim Jagielski wcscat(remoteName, rtl_uString_getStr(strUserName));
177*b1cdbd2cSJim Jagielski
178*b1cdbd2cSJim Jagielski wcscpy(userName, rtl_uString_getStr(strFileServer));
179*b1cdbd2cSJim Jagielski wcscat(userName, L"\\");
180*b1cdbd2cSJim Jagielski wcscat(userName, rtl_uString_getStr(strUserName));
181*b1cdbd2cSJim Jagielski
182*b1cdbd2cSJim Jagielski netResource.dwScope = RESOURCE_GLOBALNET;
183*b1cdbd2cSJim Jagielski netResource.dwType = RESOURCETYPE_DISK;
184*b1cdbd2cSJim Jagielski netResource.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
185*b1cdbd2cSJim Jagielski netResource.dwUsage = RESOURCEUSAGE_CONNECTABLE;
186*b1cdbd2cSJim Jagielski netResource.lpLocalName = NULL;
187*b1cdbd2cSJim Jagielski netResource.lpRemoteName = remoteName;
188*b1cdbd2cSJim Jagielski netResource.lpComment = NULL;
189*b1cdbd2cSJim Jagielski netResource.lpProvider = NULL;
190*b1cdbd2cSJim Jagielski
191*b1cdbd2cSJim Jagielski err = WNetAddConnection2W(&netResource, rtl_uString_getStr(strPasswd), userName, 0);
192*b1cdbd2cSJim Jagielski
193*b1cdbd2cSJim Jagielski if ((err == NO_ERROR) || (err == ERROR_ALREADY_ASSIGNED))
194*b1cdbd2cSJim Jagielski {
195*b1cdbd2cSJim Jagielski oslSecurityImpl* pSecImpl = malloc(sizeof(oslSecurityImpl));
196*b1cdbd2cSJim Jagielski
197*b1cdbd2cSJim Jagielski pSecImpl->m_pNetResource = malloc(sizeof(NETRESOURCE));
198*b1cdbd2cSJim Jagielski *pSecImpl->m_pNetResource = netResource;
199*b1cdbd2cSJim Jagielski
200*b1cdbd2cSJim Jagielski pSecImpl->m_hToken = NULL;
201*b1cdbd2cSJim Jagielski pSecImpl->m_hProfile = NULL;
202*b1cdbd2cSJim Jagielski wcscpy(pSecImpl->m_User, rtl_uString_getStr(strUserName));
203*b1cdbd2cSJim Jagielski
204*b1cdbd2cSJim Jagielski *pSecurity = (oslSecurity)pSecImpl;
205*b1cdbd2cSJim Jagielski
206*b1cdbd2cSJim Jagielski ret = osl_Security_E_None;
207*b1cdbd2cSJim Jagielski }
208*b1cdbd2cSJim Jagielski else
209*b1cdbd2cSJim Jagielski ret = osl_Security_E_UserUnknown;
210*b1cdbd2cSJim Jagielski
211*b1cdbd2cSJim Jagielski free(remoteName);
212*b1cdbd2cSJim Jagielski free(userName);
213*b1cdbd2cSJim Jagielski
214*b1cdbd2cSJim Jagielski return ret;
215*b1cdbd2cSJim Jagielski }
216*b1cdbd2cSJim Jagielski
217*b1cdbd2cSJim Jagielski
CheckTokenMembership_Stub(HANDLE TokenHandle,PSID SidToCheck,PBOOL IsMember)218*b1cdbd2cSJim Jagielski static BOOL WINAPI CheckTokenMembership_Stub( HANDLE TokenHandle, PSID SidToCheck, PBOOL IsMember )
219*b1cdbd2cSJim Jagielski {
220*b1cdbd2cSJim Jagielski typedef BOOL (WINAPI *CheckTokenMembership_PROC)( HANDLE, PSID, PBOOL );
221*b1cdbd2cSJim Jagielski
222*b1cdbd2cSJim Jagielski static HMODULE hModule = NULL;
223*b1cdbd2cSJim Jagielski static CheckTokenMembership_PROC pCheckTokenMembership = NULL;
224*b1cdbd2cSJim Jagielski
225*b1cdbd2cSJim Jagielski if ( !hModule )
226*b1cdbd2cSJim Jagielski {
227*b1cdbd2cSJim Jagielski /* SAL is always linked against ADVAPI32 so we can rely on that it is already mapped */
228*b1cdbd2cSJim Jagielski
229*b1cdbd2cSJim Jagielski hModule = GetModuleHandleA( "ADVAPI32.DLL" );
230*b1cdbd2cSJim Jagielski
231*b1cdbd2cSJim Jagielski pCheckTokenMembership = (CheckTokenMembership_PROC)GetProcAddress( hModule, "CheckTokenMembership" );
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski
234*b1cdbd2cSJim Jagielski if ( pCheckTokenMembership )
235*b1cdbd2cSJim Jagielski return pCheckTokenMembership( TokenHandle, SidToCheck, IsMember );
236*b1cdbd2cSJim Jagielski else
237*b1cdbd2cSJim Jagielski {
238*b1cdbd2cSJim Jagielski SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
239*b1cdbd2cSJim Jagielski return FALSE;
240*b1cdbd2cSJim Jagielski }
241*b1cdbd2cSJim Jagielski
242*b1cdbd2cSJim Jagielski }
243*b1cdbd2cSJim Jagielski
244*b1cdbd2cSJim Jagielski
osl_isAdministrator(oslSecurity Security)245*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_isAdministrator(oslSecurity Security)
246*b1cdbd2cSJim Jagielski {
247*b1cdbd2cSJim Jagielski if (Security != NULL)
248*b1cdbd2cSJim Jagielski {
249*b1cdbd2cSJim Jagielski /* ts: on Window 95 systems any user seems to be an adminstrator */
250*b1cdbd2cSJim Jagielski if (!isWNT())
251*b1cdbd2cSJim Jagielski {
252*b1cdbd2cSJim Jagielski return(sal_True);
253*b1cdbd2cSJim Jagielski }
254*b1cdbd2cSJim Jagielski else
255*b1cdbd2cSJim Jagielski {
256*b1cdbd2cSJim Jagielski HANDLE hImpersonationToken = NULL;
257*b1cdbd2cSJim Jagielski PSID psidAdministrators;
258*b1cdbd2cSJim Jagielski SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
259*b1cdbd2cSJim Jagielski sal_Bool bSuccess = sal_False;
260*b1cdbd2cSJim Jagielski
261*b1cdbd2cSJim Jagielski
262*b1cdbd2cSJim Jagielski /* If Security contains an access token we need to duplicate it to an impersonation
263*b1cdbd2cSJim Jagielski access token. NULL works with CheckTokenMembership() as the current effective
264*b1cdbd2cSJim Jagielski impersonation token
265*b1cdbd2cSJim Jagielski */
266*b1cdbd2cSJim Jagielski
267*b1cdbd2cSJim Jagielski if ( ((oslSecurityImpl*)Security)->m_hToken )
268*b1cdbd2cSJim Jagielski {
269*b1cdbd2cSJim Jagielski if ( !DuplicateToken (((oslSecurityImpl*)Security)->m_hToken, SecurityImpersonation, &hImpersonationToken) )
270*b1cdbd2cSJim Jagielski return sal_False;
271*b1cdbd2cSJim Jagielski }
272*b1cdbd2cSJim Jagielski
273*b1cdbd2cSJim Jagielski /* CheckTokenMembership() can be used on W2K and higher (NT4 no longer supported by OOo)
274*b1cdbd2cSJim Jagielski and also works on Vista to retrieve the effective user rights. Just checking for
275*b1cdbd2cSJim Jagielski membership of Administrators group is not enough on Vista this would require additional
276*b1cdbd2cSJim Jagielski complicated checks as described in KB arcticle Q118626: http://support.microsoft.com/kb/118626/en-us
277*b1cdbd2cSJim Jagielski */
278*b1cdbd2cSJim Jagielski
279*b1cdbd2cSJim Jagielski if (AllocateAndInitializeSid(&siaNtAuthority,
280*b1cdbd2cSJim Jagielski 2,
281*b1cdbd2cSJim Jagielski SECURITY_BUILTIN_DOMAIN_RID,
282*b1cdbd2cSJim Jagielski DOMAIN_ALIAS_RID_ADMINS,
283*b1cdbd2cSJim Jagielski 0, 0, 0, 0, 0, 0,
284*b1cdbd2cSJim Jagielski &psidAdministrators))
285*b1cdbd2cSJim Jagielski {
286*b1cdbd2cSJim Jagielski BOOL fSuccess = FALSE;
287*b1cdbd2cSJim Jagielski
288*b1cdbd2cSJim Jagielski if ( CheckTokenMembership_Stub( hImpersonationToken, psidAdministrators, &fSuccess ) && fSuccess )
289*b1cdbd2cSJim Jagielski bSuccess = sal_True;
290*b1cdbd2cSJim Jagielski
291*b1cdbd2cSJim Jagielski FreeSid(psidAdministrators);
292*b1cdbd2cSJim Jagielski }
293*b1cdbd2cSJim Jagielski
294*b1cdbd2cSJim Jagielski if ( hImpersonationToken )
295*b1cdbd2cSJim Jagielski CloseHandle( hImpersonationToken );
296*b1cdbd2cSJim Jagielski
297*b1cdbd2cSJim Jagielski return (bSuccess);
298*b1cdbd2cSJim Jagielski }
299*b1cdbd2cSJim Jagielski }
300*b1cdbd2cSJim Jagielski else
301*b1cdbd2cSJim Jagielski return (sal_False);
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski
304*b1cdbd2cSJim Jagielski
osl_freeSecurityHandle(oslSecurity Security)305*b1cdbd2cSJim Jagielski void SAL_CALL osl_freeSecurityHandle(oslSecurity Security)
306*b1cdbd2cSJim Jagielski {
307*b1cdbd2cSJim Jagielski if (Security)
308*b1cdbd2cSJim Jagielski {
309*b1cdbd2cSJim Jagielski oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
310*b1cdbd2cSJim Jagielski
311*b1cdbd2cSJim Jagielski if (pSecImpl->m_pNetResource != NULL)
312*b1cdbd2cSJim Jagielski {
313*b1cdbd2cSJim Jagielski WNetCancelConnection2W(pSecImpl->m_pNetResource->lpRemoteName, 0, sal_True);
314*b1cdbd2cSJim Jagielski
315*b1cdbd2cSJim Jagielski free(pSecImpl->m_pNetResource->lpRemoteName);
316*b1cdbd2cSJim Jagielski free(pSecImpl->m_pNetResource);
317*b1cdbd2cSJim Jagielski }
318*b1cdbd2cSJim Jagielski
319*b1cdbd2cSJim Jagielski if (pSecImpl->m_hToken)
320*b1cdbd2cSJim Jagielski CloseHandle(pSecImpl->m_hToken);
321*b1cdbd2cSJim Jagielski
322*b1cdbd2cSJim Jagielski if ( pSecImpl->m_hProfile )
323*b1cdbd2cSJim Jagielski CloseHandle(pSecImpl->m_hProfile);
324*b1cdbd2cSJim Jagielski
325*b1cdbd2cSJim Jagielski free (pSecImpl);
326*b1cdbd2cSJim Jagielski }
327*b1cdbd2cSJim Jagielski }
328*b1cdbd2cSJim Jagielski
329*b1cdbd2cSJim Jagielski
osl_getUserIdent(oslSecurity Security,rtl_uString ** strIdent)330*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_getUserIdent(oslSecurity Security, rtl_uString **strIdent)
331*b1cdbd2cSJim Jagielski {
332*b1cdbd2cSJim Jagielski if (Security != NULL)
333*b1cdbd2cSJim Jagielski {
334*b1cdbd2cSJim Jagielski oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
335*b1cdbd2cSJim Jagielski
336*b1cdbd2cSJim Jagielski HANDLE hAccessToken = pSecImpl->m_hToken;
337*b1cdbd2cSJim Jagielski
338*b1cdbd2cSJim Jagielski if (hAccessToken == NULL)
339*b1cdbd2cSJim Jagielski OpenProcessToken(GetCurrentProcess(), TOKEN_DUP_QUERY, &hAccessToken);
340*b1cdbd2cSJim Jagielski
341*b1cdbd2cSJim Jagielski if (hAccessToken)
342*b1cdbd2cSJim Jagielski {
343*b1cdbd2cSJim Jagielski sal_Char *Ident;
344*b1cdbd2cSJim Jagielski DWORD nInfoBuffer = 512;
345*b1cdbd2cSJim Jagielski UCHAR* pInfoBuffer = malloc(nInfoBuffer);
346*b1cdbd2cSJim Jagielski
347*b1cdbd2cSJim Jagielski
348*b1cdbd2cSJim Jagielski while (!GetTokenInformation(hAccessToken, TokenUser,
349*b1cdbd2cSJim Jagielski pInfoBuffer, nInfoBuffer, &nInfoBuffer))
350*b1cdbd2cSJim Jagielski {
351*b1cdbd2cSJim Jagielski if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
352*b1cdbd2cSJim Jagielski pInfoBuffer = realloc(pInfoBuffer, nInfoBuffer);
353*b1cdbd2cSJim Jagielski else
354*b1cdbd2cSJim Jagielski {
355*b1cdbd2cSJim Jagielski free(pInfoBuffer);
356*b1cdbd2cSJim Jagielski pInfoBuffer = NULL;
357*b1cdbd2cSJim Jagielski break;
358*b1cdbd2cSJim Jagielski }
359*b1cdbd2cSJim Jagielski }
360*b1cdbd2cSJim Jagielski
361*b1cdbd2cSJim Jagielski if (pSecImpl->m_hToken == NULL)
362*b1cdbd2cSJim Jagielski CloseHandle(hAccessToken);
363*b1cdbd2cSJim Jagielski
364*b1cdbd2cSJim Jagielski if (pInfoBuffer)
365*b1cdbd2cSJim Jagielski {
366*b1cdbd2cSJim Jagielski PSID pSid = ((PTOKEN_USER)pInfoBuffer)->User.Sid;
367*b1cdbd2cSJim Jagielski PSID_IDENTIFIER_AUTHORITY psia;
368*b1cdbd2cSJim Jagielski DWORD dwSubAuthorities;
369*b1cdbd2cSJim Jagielski DWORD dwSidRev=SID_REVISION;
370*b1cdbd2cSJim Jagielski DWORD dwCounter;
371*b1cdbd2cSJim Jagielski DWORD dwSidSize;
372*b1cdbd2cSJim Jagielski
373*b1cdbd2cSJim Jagielski /* obtain SidIdentifierAuthority */
374*b1cdbd2cSJim Jagielski psia=GetSidIdentifierAuthority(pSid);
375*b1cdbd2cSJim Jagielski
376*b1cdbd2cSJim Jagielski /* obtain sidsubauthority count */
377*b1cdbd2cSJim Jagielski dwSubAuthorities=min(*GetSidSubAuthorityCount(pSid), 5);
378*b1cdbd2cSJim Jagielski
379*b1cdbd2cSJim Jagielski /* buffer length: S-SID_REVISION- + identifierauthority- + subauthorities- + NULL */
380*b1cdbd2cSJim Jagielski Ident=malloc(88*sizeof(sal_Char));
381*b1cdbd2cSJim Jagielski
382*b1cdbd2cSJim Jagielski /* prepare S-SID_REVISION- */
383*b1cdbd2cSJim Jagielski dwSidSize=wsprintf(Ident, TEXT("S-%lu-"), dwSidRev);
384*b1cdbd2cSJim Jagielski
385*b1cdbd2cSJim Jagielski /* prepare SidIdentifierAuthority */
386*b1cdbd2cSJim Jagielski if ((psia->Value[0] != 0) || (psia->Value[1] != 0))
387*b1cdbd2cSJim Jagielski {
388*b1cdbd2cSJim Jagielski dwSidSize+=wsprintf(Ident + strlen(Ident),
389*b1cdbd2cSJim Jagielski TEXT("0x%02hx%02hx%02hx%02hx%02hx%02hx"),
390*b1cdbd2cSJim Jagielski (USHORT)psia->Value[0],
391*b1cdbd2cSJim Jagielski (USHORT)psia->Value[1],
392*b1cdbd2cSJim Jagielski (USHORT)psia->Value[2],
393*b1cdbd2cSJim Jagielski (USHORT)psia->Value[3],
394*b1cdbd2cSJim Jagielski (USHORT)psia->Value[4],
395*b1cdbd2cSJim Jagielski (USHORT)psia->Value[5]);
396*b1cdbd2cSJim Jagielski }
397*b1cdbd2cSJim Jagielski else
398*b1cdbd2cSJim Jagielski {
399*b1cdbd2cSJim Jagielski dwSidSize+=wsprintf(Ident + strlen(Ident),
400*b1cdbd2cSJim Jagielski TEXT("%lu"),
401*b1cdbd2cSJim Jagielski (ULONG)(psia->Value[5] ) +
402*b1cdbd2cSJim Jagielski (ULONG)(psia->Value[4] << 8) +
403*b1cdbd2cSJim Jagielski (ULONG)(psia->Value[3] << 16) +
404*b1cdbd2cSJim Jagielski (ULONG)(psia->Value[2] << 24) );
405*b1cdbd2cSJim Jagielski }
406*b1cdbd2cSJim Jagielski
407*b1cdbd2cSJim Jagielski /* loop through SidSubAuthorities */
408*b1cdbd2cSJim Jagielski for (dwCounter=0; dwCounter < dwSubAuthorities; dwCounter++)
409*b1cdbd2cSJim Jagielski {
410*b1cdbd2cSJim Jagielski dwSidSize+=wsprintf(Ident + dwSidSize, TEXT("-%lu"),
411*b1cdbd2cSJim Jagielski *GetSidSubAuthority(pSid, dwCounter) );
412*b1cdbd2cSJim Jagielski }
413*b1cdbd2cSJim Jagielski
414*b1cdbd2cSJim Jagielski rtl_uString_newFromAscii( strIdent, Ident );
415*b1cdbd2cSJim Jagielski
416*b1cdbd2cSJim Jagielski free(pInfoBuffer);
417*b1cdbd2cSJim Jagielski free(Ident);
418*b1cdbd2cSJim Jagielski
419*b1cdbd2cSJim Jagielski return (sal_True);
420*b1cdbd2cSJim Jagielski }
421*b1cdbd2cSJim Jagielski }
422*b1cdbd2cSJim Jagielski else
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski DWORD needed=0;
425*b1cdbd2cSJim Jagielski sal_Unicode *Ident;
426*b1cdbd2cSJim Jagielski
427*b1cdbd2cSJim Jagielski WNetGetUserA(NULL, NULL, &needed);
428*b1cdbd2cSJim Jagielski needed = max( 16 , needed );
429*b1cdbd2cSJim Jagielski Ident=malloc(needed*sizeof(sal_Unicode));
430*b1cdbd2cSJim Jagielski
431*b1cdbd2cSJim Jagielski if (WNetGetUserW(NULL, Ident, &needed) != NO_ERROR)
432*b1cdbd2cSJim Jagielski {
433*b1cdbd2cSJim Jagielski wcscpy(Ident, L"unknown");
434*b1cdbd2cSJim Jagielski Ident[7] = L'\0';
435*b1cdbd2cSJim Jagielski }
436*b1cdbd2cSJim Jagielski
437*b1cdbd2cSJim Jagielski rtl_uString_newFromStr( strIdent, Ident);
438*b1cdbd2cSJim Jagielski
439*b1cdbd2cSJim Jagielski free(Ident);
440*b1cdbd2cSJim Jagielski
441*b1cdbd2cSJim Jagielski return sal_True;
442*b1cdbd2cSJim Jagielski }
443*b1cdbd2cSJim Jagielski }
444*b1cdbd2cSJim Jagielski
445*b1cdbd2cSJim Jagielski return sal_False;
446*b1cdbd2cSJim Jagielski }
447*b1cdbd2cSJim Jagielski
448*b1cdbd2cSJim Jagielski
449*b1cdbd2cSJim Jagielski
osl_getUserName(oslSecurity Security,rtl_uString ** strName)450*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_getUserName(oslSecurity Security, rtl_uString **strName)
451*b1cdbd2cSJim Jagielski {
452*b1cdbd2cSJim Jagielski return getUserNameImpl(Security, strName, sal_True);
453*b1cdbd2cSJim Jagielski }
454*b1cdbd2cSJim Jagielski
455*b1cdbd2cSJim Jagielski
osl_getHomeDir(oslSecurity Security,rtl_uString ** pustrDirectory)456*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_getHomeDir(oslSecurity Security, rtl_uString **pustrDirectory)
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski rtl_uString *ustrSysDir = NULL;
459*b1cdbd2cSJim Jagielski sal_Bool bSuccess = sal_False;
460*b1cdbd2cSJim Jagielski
461*b1cdbd2cSJim Jagielski if (Security != NULL)
462*b1cdbd2cSJim Jagielski {
463*b1cdbd2cSJim Jagielski oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
464*b1cdbd2cSJim Jagielski
465*b1cdbd2cSJim Jagielski if (pSecImpl->m_pNetResource != NULL)
466*b1cdbd2cSJim Jagielski {
467*b1cdbd2cSJim Jagielski rtl_uString_newFromStr( &ustrSysDir, pSecImpl->m_pNetResource->lpRemoteName);
468*b1cdbd2cSJim Jagielski
469*b1cdbd2cSJim Jagielski bSuccess = (sal_Bool)(osl_File_E_None == osl_getFileURLFromSystemPath( ustrSysDir, pustrDirectory ));
470*b1cdbd2cSJim Jagielski }
471*b1cdbd2cSJim Jagielski else
472*b1cdbd2cSJim Jagielski {
473*b1cdbd2cSJim Jagielski #if 0
474*b1cdbd2cSJim Jagielski if (pSecImpl->m_hToken)
475*b1cdbd2cSJim Jagielski {
476*b1cdbd2cSJim Jagielski DWORD nInfoBuffer = 512;
477*b1cdbd2cSJim Jagielski UCHAR* pInfoBuffer = malloc(nInfoBuffer);
478*b1cdbd2cSJim Jagielski
479*b1cdbd2cSJim Jagielski while (!GetTokenInformation(pSecImpl->m_hToken, TokenUser,
480*b1cdbd2cSJim Jagielski pInfoBuffer, nInfoBuffer, &nInfoBuffer))
481*b1cdbd2cSJim Jagielski {
482*b1cdbd2cSJim Jagielski if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
483*b1cdbd2cSJim Jagielski pInfoBuffer = realloc(pInfoBuffer, nInfoBuffer);
484*b1cdbd2cSJim Jagielski else
485*b1cdbd2cSJim Jagielski {
486*b1cdbd2cSJim Jagielski free(pInfoBuffer);
487*b1cdbd2cSJim Jagielski pInfoBuffer = NULL;
488*b1cdbd2cSJim Jagielski break;
489*b1cdbd2cSJim Jagielski }
490*b1cdbd2cSJim Jagielski }
491*b1cdbd2cSJim Jagielski
492*b1cdbd2cSJim Jagielski /* not implemented */
493*b1cdbd2cSJim Jagielski OSL_ASSERT(sal_False);
494*b1cdbd2cSJim Jagielski
495*b1cdbd2cSJim Jagielski if (pInfoBuffer)
496*b1cdbd2cSJim Jagielski {
497*b1cdbd2cSJim Jagielski /* if (EqualSid() ... */
498*b1cdbd2cSJim Jagielski
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski }
501*b1cdbd2cSJim Jagielski else
502*b1cdbd2cSJim Jagielski #endif
503*b1cdbd2cSJim Jagielski
504*b1cdbd2cSJim Jagielski bSuccess = (sal_Bool)(GetSpecialFolder(&ustrSysDir, CSIDL_PERSONAL) &&
505*b1cdbd2cSJim Jagielski (osl_File_E_None == osl_getFileURLFromSystemPath(ustrSysDir, pustrDirectory)));
506*b1cdbd2cSJim Jagielski }
507*b1cdbd2cSJim Jagielski }
508*b1cdbd2cSJim Jagielski
509*b1cdbd2cSJim Jagielski if ( ustrSysDir )
510*b1cdbd2cSJim Jagielski rtl_uString_release( ustrSysDir );
511*b1cdbd2cSJim Jagielski
512*b1cdbd2cSJim Jagielski return bSuccess;
513*b1cdbd2cSJim Jagielski }
514*b1cdbd2cSJim Jagielski
osl_getConfigDir(oslSecurity Security,rtl_uString ** pustrDirectory)515*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, rtl_uString **pustrDirectory)
516*b1cdbd2cSJim Jagielski {
517*b1cdbd2cSJim Jagielski sal_Bool bSuccess = sal_False;
518*b1cdbd2cSJim Jagielski
519*b1cdbd2cSJim Jagielski if (Security != NULL)
520*b1cdbd2cSJim Jagielski {
521*b1cdbd2cSJim Jagielski oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
522*b1cdbd2cSJim Jagielski
523*b1cdbd2cSJim Jagielski if (pSecImpl->m_pNetResource != NULL)
524*b1cdbd2cSJim Jagielski {
525*b1cdbd2cSJim Jagielski rtl_uString *ustrSysDir = NULL;
526*b1cdbd2cSJim Jagielski
527*b1cdbd2cSJim Jagielski rtl_uString_newFromStr( &ustrSysDir, pSecImpl->m_pNetResource->lpRemoteName);
528*b1cdbd2cSJim Jagielski bSuccess = (sal_Bool)(osl_File_E_None == osl_getFileURLFromSystemPath( ustrSysDir, pustrDirectory));
529*b1cdbd2cSJim Jagielski
530*b1cdbd2cSJim Jagielski if ( ustrSysDir )
531*b1cdbd2cSJim Jagielski rtl_uString_release( ustrSysDir );
532*b1cdbd2cSJim Jagielski }
533*b1cdbd2cSJim Jagielski else
534*b1cdbd2cSJim Jagielski {
535*b1cdbd2cSJim Jagielski if (pSecImpl->m_hToken)
536*b1cdbd2cSJim Jagielski {
537*b1cdbd2cSJim Jagielski /* not implemented */
538*b1cdbd2cSJim Jagielski OSL_ASSERT(sal_False);
539*b1cdbd2cSJim Jagielski }
540*b1cdbd2cSJim Jagielski else
541*b1cdbd2cSJim Jagielski {
542*b1cdbd2cSJim Jagielski rtl_uString *ustrFile = NULL;
543*b1cdbd2cSJim Jagielski sal_Unicode sFile[_MAX_PATH];
544*b1cdbd2cSJim Jagielski
545*b1cdbd2cSJim Jagielski if ( !GetSpecialFolder( &ustrFile, CSIDL_APPDATA) )
546*b1cdbd2cSJim Jagielski {
547*b1cdbd2cSJim Jagielski OSL_VERIFY(GetWindowsDirectoryW(sFile, _MAX_DIR) > 0);
548*b1cdbd2cSJim Jagielski
549*b1cdbd2cSJim Jagielski rtl_uString_newFromStr( &ustrFile, sFile);
550*b1cdbd2cSJim Jagielski }
551*b1cdbd2cSJim Jagielski
552*b1cdbd2cSJim Jagielski bSuccess = (sal_Bool)(osl_File_E_None == osl_getFileURLFromSystemPath(ustrFile, pustrDirectory));
553*b1cdbd2cSJim Jagielski
554*b1cdbd2cSJim Jagielski if ( ustrFile )
555*b1cdbd2cSJim Jagielski rtl_uString_release( ustrFile );
556*b1cdbd2cSJim Jagielski }
557*b1cdbd2cSJim Jagielski }
558*b1cdbd2cSJim Jagielski }
559*b1cdbd2cSJim Jagielski
560*b1cdbd2cSJim Jagielski return bSuccess;
561*b1cdbd2cSJim Jagielski }
562*b1cdbd2cSJim Jagielski
563*b1cdbd2cSJim Jagielski
osl_loadUserProfile(oslSecurity Security)564*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_loadUserProfile(oslSecurity Security)
565*b1cdbd2cSJim Jagielski {
566*b1cdbd2cSJim Jagielski /* CreateProcessAsUser does not load the specified user's profile
567*b1cdbd2cSJim Jagielski into the HKEY_USERS registry key. This means that access to information
568*b1cdbd2cSJim Jagielski in the HKEY_CURRENT_USER registry key may not produce results consistent
569*b1cdbd2cSJim Jagielski with a normal interactive logon.
570*b1cdbd2cSJim Jagielski It is your responsibility to load the user's registry hive into HKEY_USERS
571*b1cdbd2cSJim Jagielski with the LoadUserProfile function before calling CreateProcessAsUser.
572*b1cdbd2cSJim Jagielski */
573*b1cdbd2cSJim Jagielski BOOL bOk = FALSE;
574*b1cdbd2cSJim Jagielski
575*b1cdbd2cSJim Jagielski RegCloseKey(HKEY_CURRENT_USER);
576*b1cdbd2cSJim Jagielski
577*b1cdbd2cSJim Jagielski if (Privilege(SE_RESTORE_NAME, TRUE))
578*b1cdbd2cSJim Jagielski {
579*b1cdbd2cSJim Jagielski HMODULE hUserEnvLib = NULL;
580*b1cdbd2cSJim Jagielski LPFNLOADUSERPROFILE fLoadUserProfile = NULL;
581*b1cdbd2cSJim Jagielski LPFNUNLOADUSERPROFILE fUnloadUserProfile = NULL;
582*b1cdbd2cSJim Jagielski HANDLE hAccessToken = ((oslSecurityImpl*)Security)->m_hToken;
583*b1cdbd2cSJim Jagielski DWORD nError = 0;
584*b1cdbd2cSJim Jagielski
585*b1cdbd2cSJim Jagielski /* try to create user profile */
586*b1cdbd2cSJim Jagielski if ( !hAccessToken )
587*b1cdbd2cSJim Jagielski {
588*b1cdbd2cSJim Jagielski /* retrieve security handle if not done before e.g. osl_getCurrentSecurity()
589*b1cdbd2cSJim Jagielski */
590*b1cdbd2cSJim Jagielski HANDLE hProcess = GetCurrentProcess();
591*b1cdbd2cSJim Jagielski
592*b1cdbd2cSJim Jagielski if (hProcess != NULL)
593*b1cdbd2cSJim Jagielski {
594*b1cdbd2cSJim Jagielski OpenProcessToken(hProcess, TOKEN_IMPERSONATE, &hAccessToken);
595*b1cdbd2cSJim Jagielski CloseHandle(hProcess);
596*b1cdbd2cSJim Jagielski }
597*b1cdbd2cSJim Jagielski }
598*b1cdbd2cSJim Jagielski
599*b1cdbd2cSJim Jagielski hUserEnvLib = LoadLibraryA("userenv.dll");
600*b1cdbd2cSJim Jagielski
601*b1cdbd2cSJim Jagielski if (hUserEnvLib)
602*b1cdbd2cSJim Jagielski {
603*b1cdbd2cSJim Jagielski fLoadUserProfile = (LPFNLOADUSERPROFILE)GetProcAddress(hUserEnvLib, "LoadUserProfileW");
604*b1cdbd2cSJim Jagielski fUnloadUserProfile = (LPFNUNLOADUSERPROFILE)GetProcAddress(hUserEnvLib, "UnloadUserProfile");
605*b1cdbd2cSJim Jagielski
606*b1cdbd2cSJim Jagielski if (fLoadUserProfile && fUnloadUserProfile)
607*b1cdbd2cSJim Jagielski {
608*b1cdbd2cSJim Jagielski rtl_uString *buffer = 0;
609*b1cdbd2cSJim Jagielski PROFILEINFOW pi;
610*b1cdbd2cSJim Jagielski
611*b1cdbd2cSJim Jagielski getUserNameImpl(Security, &buffer, sal_False);
612*b1cdbd2cSJim Jagielski
613*b1cdbd2cSJim Jagielski ZeroMemory( &pi, sizeof(pi) );
614*b1cdbd2cSJim Jagielski pi.dwSize = sizeof(pi);
615*b1cdbd2cSJim Jagielski pi.lpUserName = rtl_uString_getStr(buffer);
616*b1cdbd2cSJim Jagielski pi.dwFlags = PI_NOUI;
617*b1cdbd2cSJim Jagielski
618*b1cdbd2cSJim Jagielski if (fLoadUserProfile(hAccessToken, &pi))
619*b1cdbd2cSJim Jagielski {
620*b1cdbd2cSJim Jagielski fUnloadUserProfile(hAccessToken, pi.hProfile);
621*b1cdbd2cSJim Jagielski
622*b1cdbd2cSJim Jagielski bOk = TRUE;
623*b1cdbd2cSJim Jagielski }
624*b1cdbd2cSJim Jagielski else
625*b1cdbd2cSJim Jagielski nError = GetLastError();
626*b1cdbd2cSJim Jagielski
627*b1cdbd2cSJim Jagielski rtl_uString_release(buffer);
628*b1cdbd2cSJim Jagielski }
629*b1cdbd2cSJim Jagielski
630*b1cdbd2cSJim Jagielski FreeLibrary(hUserEnvLib);
631*b1cdbd2cSJim Jagielski }
632*b1cdbd2cSJim Jagielski
633*b1cdbd2cSJim Jagielski if (hAccessToken && (hAccessToken != ((oslSecurityImpl*)Security)->m_hToken))
634*b1cdbd2cSJim Jagielski CloseHandle(hAccessToken);
635*b1cdbd2cSJim Jagielski }
636*b1cdbd2cSJim Jagielski
637*b1cdbd2cSJim Jagielski return (sal_Bool)bOk;
638*b1cdbd2cSJim Jagielski }
639*b1cdbd2cSJim Jagielski
640*b1cdbd2cSJim Jagielski
osl_unloadUserProfile(oslSecurity Security)641*b1cdbd2cSJim Jagielski void SAL_CALL osl_unloadUserProfile(oslSecurity Security)
642*b1cdbd2cSJim Jagielski {
643*b1cdbd2cSJim Jagielski if ( ((oslSecurityImpl*)Security)->m_hProfile != NULL )
644*b1cdbd2cSJim Jagielski {
645*b1cdbd2cSJim Jagielski HMODULE hUserEnvLib = NULL;
646*b1cdbd2cSJim Jagielski LPFNLOADUSERPROFILE fLoadUserProfile = NULL;
647*b1cdbd2cSJim Jagielski LPFNUNLOADUSERPROFILE fUnloadUserProfile = NULL;
648*b1cdbd2cSJim Jagielski BOOL bOk = FALSE;
649*b1cdbd2cSJim Jagielski HANDLE hAccessToken = ((oslSecurityImpl*)Security)->m_hToken;
650*b1cdbd2cSJim Jagielski
651*b1cdbd2cSJim Jagielski if ( !hAccessToken )
652*b1cdbd2cSJim Jagielski {
653*b1cdbd2cSJim Jagielski /* retrieve security handle if not done before e.g. osl_getCurrentSecurity()
654*b1cdbd2cSJim Jagielski */
655*b1cdbd2cSJim Jagielski HANDLE hProcess = GetCurrentProcess();
656*b1cdbd2cSJim Jagielski
657*b1cdbd2cSJim Jagielski if (hProcess != NULL)
658*b1cdbd2cSJim Jagielski {
659*b1cdbd2cSJim Jagielski OpenProcessToken(hProcess, TOKEN_IMPERSONATE, &hAccessToken);
660*b1cdbd2cSJim Jagielski CloseHandle(hProcess);
661*b1cdbd2cSJim Jagielski }
662*b1cdbd2cSJim Jagielski }
663*b1cdbd2cSJim Jagielski
664*b1cdbd2cSJim Jagielski hUserEnvLib = LoadLibrary("userenv.dll");
665*b1cdbd2cSJim Jagielski
666*b1cdbd2cSJim Jagielski if (hUserEnvLib)
667*b1cdbd2cSJim Jagielski {
668*b1cdbd2cSJim Jagielski fLoadUserProfile = (LPFNLOADUSERPROFILE)GetProcAddress(hUserEnvLib, "LoadUserProfileA");
669*b1cdbd2cSJim Jagielski fUnloadUserProfile = (LPFNUNLOADUSERPROFILE)GetProcAddress(hUserEnvLib, "UnloadUserProfile");
670*b1cdbd2cSJim Jagielski
671*b1cdbd2cSJim Jagielski if (fLoadUserProfile && fUnloadUserProfile)
672*b1cdbd2cSJim Jagielski {
673*b1cdbd2cSJim Jagielski /* unloading the user profile */
674*b1cdbd2cSJim Jagielski if (fLoadUserProfile && fUnloadUserProfile)
675*b1cdbd2cSJim Jagielski bOk = fUnloadUserProfile(hAccessToken, ((oslSecurityImpl*)Security)->m_hProfile);
676*b1cdbd2cSJim Jagielski
677*b1cdbd2cSJim Jagielski if (hUserEnvLib)
678*b1cdbd2cSJim Jagielski FreeLibrary(hUserEnvLib);
679*b1cdbd2cSJim Jagielski }
680*b1cdbd2cSJim Jagielski }
681*b1cdbd2cSJim Jagielski
682*b1cdbd2cSJim Jagielski ((oslSecurityImpl*)Security)->m_hProfile;
683*b1cdbd2cSJim Jagielski
684*b1cdbd2cSJim Jagielski if (hAccessToken && (hAccessToken != ((oslSecurityImpl*)Security)->m_hToken))
685*b1cdbd2cSJim Jagielski {
686*b1cdbd2cSJim Jagielski CloseHandle(hAccessToken);
687*b1cdbd2cSJim Jagielski }
688*b1cdbd2cSJim Jagielski }
689*b1cdbd2cSJim Jagielski }
690*b1cdbd2cSJim Jagielski
691*b1cdbd2cSJim Jagielski /*****************************************************************************/
692*b1cdbd2cSJim Jagielski /* Static Module Functions */
693*b1cdbd2cSJim Jagielski /*****************************************************************************/
694*b1cdbd2cSJim Jagielski
695*b1cdbd2cSJim Jagielski
GetSpecialFolder(rtl_uString ** strPath,int nFolder)696*b1cdbd2cSJim Jagielski static sal_Bool GetSpecialFolder(rtl_uString **strPath, int nFolder)
697*b1cdbd2cSJim Jagielski {
698*b1cdbd2cSJim Jagielski sal_Bool bRet = sal_False;
699*b1cdbd2cSJim Jagielski HINSTANCE hLibrary;
700*b1cdbd2cSJim Jagielski sal_Char PathA[_MAX_PATH];
701*b1cdbd2cSJim Jagielski sal_Unicode PathW[_MAX_PATH];
702*b1cdbd2cSJim Jagielski
703*b1cdbd2cSJim Jagielski if ((hLibrary = LoadLibrary("shell32.dll")) != NULL)
704*b1cdbd2cSJim Jagielski {
705*b1cdbd2cSJim Jagielski BOOL (WINAPI *pSHGetSpecialFolderPathA)(HWND, LPSTR, int, BOOL);
706*b1cdbd2cSJim Jagielski BOOL (WINAPI *pSHGetSpecialFolderPathW)(HWND, LPWSTR, int, BOOL);
707*b1cdbd2cSJim Jagielski
708*b1cdbd2cSJim Jagielski pSHGetSpecialFolderPathA = (BOOL (WINAPI *)(HWND, LPSTR, int, BOOL))GetProcAddress(hLibrary, "SHGetSpecialFolderPathA");
709*b1cdbd2cSJim Jagielski pSHGetSpecialFolderPathW = (BOOL (WINAPI *)(HWND, LPWSTR, int, BOOL))GetProcAddress(hLibrary, "SHGetSpecialFolderPathW");
710*b1cdbd2cSJim Jagielski
711*b1cdbd2cSJim Jagielski if (pSHGetSpecialFolderPathA)
712*b1cdbd2cSJim Jagielski {
713*b1cdbd2cSJim Jagielski if (pSHGetSpecialFolderPathA(GetActiveWindow(), PathA, nFolder, TRUE))
714*b1cdbd2cSJim Jagielski {
715*b1cdbd2cSJim Jagielski rtl_string2UString( strPath, PathA, strlen(PathA), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS);
716*b1cdbd2cSJim Jagielski OSL_ASSERT(*strPath != NULL);
717*b1cdbd2cSJim Jagielski bRet = sal_True;
718*b1cdbd2cSJim Jagielski }
719*b1cdbd2cSJim Jagielski }
720*b1cdbd2cSJim Jagielski else if (pSHGetSpecialFolderPathW)
721*b1cdbd2cSJim Jagielski {
722*b1cdbd2cSJim Jagielski if (pSHGetSpecialFolderPathW(GetActiveWindow(), PathW, nFolder, TRUE))
723*b1cdbd2cSJim Jagielski {
724*b1cdbd2cSJim Jagielski rtl_uString_newFromStr( strPath, PathW);
725*b1cdbd2cSJim Jagielski bRet = sal_True;
726*b1cdbd2cSJim Jagielski }
727*b1cdbd2cSJim Jagielski }
728*b1cdbd2cSJim Jagielski else
729*b1cdbd2cSJim Jagielski {
730*b1cdbd2cSJim Jagielski HRESULT (WINAPI *pSHGetSpecialFolderLocation)(HWND, int, LPITEMIDLIST *) = (HRESULT (WINAPI *)(HWND, int, LPITEMIDLIST *))GetProcAddress(hLibrary, "SHGetSpecialFolderLocation");
731*b1cdbd2cSJim Jagielski BOOL (WINAPI *pSHGetPathFromIDListA)(LPCITEMIDLIST, LPSTR) = (BOOL (WINAPI *)(LPCITEMIDLIST, LPSTR))GetProcAddress(hLibrary, "SHGetPathFromIDListA");
732*b1cdbd2cSJim Jagielski BOOL (WINAPI *pSHGetPathFromIDListW)(LPCITEMIDLIST, LPWSTR) = (BOOL (WINAPI *)(LPCITEMIDLIST, LPWSTR))GetProcAddress(hLibrary, "SHGetPathFromIDListW");
733*b1cdbd2cSJim Jagielski HRESULT (WINAPI *pSHGetMalloc)(LPMALLOC *) = (HRESULT (WINAPI *)(LPMALLOC *))GetProcAddress(hLibrary, "SHGetMalloc");
734*b1cdbd2cSJim Jagielski
735*b1cdbd2cSJim Jagielski
736*b1cdbd2cSJim Jagielski if (pSHGetSpecialFolderLocation && (pSHGetPathFromIDListA || pSHGetPathFromIDListW ) && pSHGetMalloc )
737*b1cdbd2cSJim Jagielski {
738*b1cdbd2cSJim Jagielski LPITEMIDLIST pidl;
739*b1cdbd2cSJim Jagielski LPMALLOC pMalloc;
740*b1cdbd2cSJim Jagielski HRESULT hr;
741*b1cdbd2cSJim Jagielski
742*b1cdbd2cSJim Jagielski hr = pSHGetSpecialFolderLocation(GetActiveWindow(), nFolder, &pidl);
743*b1cdbd2cSJim Jagielski
744*b1cdbd2cSJim Jagielski /* Get SHGetSpecialFolderLocation fails if directory does not exists. */
745*b1cdbd2cSJim Jagielski /* If it fails we try to create the directory and redo the call */
746*b1cdbd2cSJim Jagielski if (! SUCCEEDED(hr))
747*b1cdbd2cSJim Jagielski {
748*b1cdbd2cSJim Jagielski HKEY hRegKey;
749*b1cdbd2cSJim Jagielski
750*b1cdbd2cSJim Jagielski if (RegOpenKey(HKEY_CURRENT_USER,
751*b1cdbd2cSJim Jagielski "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
752*b1cdbd2cSJim Jagielski &hRegKey) == ERROR_SUCCESS)
753*b1cdbd2cSJim Jagielski {
754*b1cdbd2cSJim Jagielski LONG lRet;
755*b1cdbd2cSJim Jagielski DWORD lSize = elementsof(PathA);
756*b1cdbd2cSJim Jagielski DWORD Type = REG_SZ;
757*b1cdbd2cSJim Jagielski
758*b1cdbd2cSJim Jagielski switch (nFolder)
759*b1cdbd2cSJim Jagielski {
760*b1cdbd2cSJim Jagielski case CSIDL_APPDATA:
761*b1cdbd2cSJim Jagielski lRet = RegQueryValueEx(hRegKey, "AppData", NULL, &Type, (LPBYTE)PathA, &lSize);
762*b1cdbd2cSJim Jagielski break;
763*b1cdbd2cSJim Jagielski
764*b1cdbd2cSJim Jagielski case CSIDL_PERSONAL:
765*b1cdbd2cSJim Jagielski lRet = RegQueryValueEx(hRegKey, "Personal", NULL, &Type, (LPBYTE)PathA, &lSize);
766*b1cdbd2cSJim Jagielski break;
767*b1cdbd2cSJim Jagielski
768*b1cdbd2cSJim Jagielski default:
769*b1cdbd2cSJim Jagielski lRet = -1l;
770*b1cdbd2cSJim Jagielski }
771*b1cdbd2cSJim Jagielski
772*b1cdbd2cSJim Jagielski if ((lRet == ERROR_SUCCESS) && (Type == REG_SZ))
773*b1cdbd2cSJim Jagielski {
774*b1cdbd2cSJim Jagielski if (_access(PathA, 0) < 0)
775*b1cdbd2cSJim Jagielski CreateDirectory(PathA, NULL);
776*b1cdbd2cSJim Jagielski
777*b1cdbd2cSJim Jagielski hr = pSHGetSpecialFolderLocation(GetActiveWindow(), nFolder, &pidl);
778*b1cdbd2cSJim Jagielski }
779*b1cdbd2cSJim Jagielski
780*b1cdbd2cSJim Jagielski RegCloseKey(hRegKey);
781*b1cdbd2cSJim Jagielski }
782*b1cdbd2cSJim Jagielski }
783*b1cdbd2cSJim Jagielski
784*b1cdbd2cSJim Jagielski if (SUCCEEDED(hr))
785*b1cdbd2cSJim Jagielski {
786*b1cdbd2cSJim Jagielski if (pSHGetPathFromIDListW && pSHGetPathFromIDListW(pidl, PathW))
787*b1cdbd2cSJim Jagielski {
788*b1cdbd2cSJim Jagielski /* if directory does not exist, create it */
789*b1cdbd2cSJim Jagielski if (_waccess(PathW, 0) < 0)
790*b1cdbd2cSJim Jagielski CreateDirectoryW(PathW, NULL);
791*b1cdbd2cSJim Jagielski
792*b1cdbd2cSJim Jagielski rtl_uString_newFromStr( strPath, PathW);
793*b1cdbd2cSJim Jagielski bRet = sal_True;
794*b1cdbd2cSJim Jagielski }
795*b1cdbd2cSJim Jagielski else if (pSHGetPathFromIDListA && pSHGetPathFromIDListA(pidl, PathA))
796*b1cdbd2cSJim Jagielski {
797*b1cdbd2cSJim Jagielski /* if directory does not exist, create it */
798*b1cdbd2cSJim Jagielski if (_access(PathA, 0) < 0)
799*b1cdbd2cSJim Jagielski CreateDirectoryA(PathA, NULL);
800*b1cdbd2cSJim Jagielski
801*b1cdbd2cSJim Jagielski rtl_string2UString( strPath, PathA, strlen(PathA), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS);
802*b1cdbd2cSJim Jagielski OSL_ASSERT(*strPath != NULL);
803*b1cdbd2cSJim Jagielski bRet = sal_True;
804*b1cdbd2cSJim Jagielski }
805*b1cdbd2cSJim Jagielski }
806*b1cdbd2cSJim Jagielski
807*b1cdbd2cSJim Jagielski if (SUCCEEDED(pSHGetMalloc(&pMalloc)))
808*b1cdbd2cSJim Jagielski {
809*b1cdbd2cSJim Jagielski pMalloc->lpVtbl->Free(pMalloc, pidl);
810*b1cdbd2cSJim Jagielski pMalloc->lpVtbl->Release(pMalloc);
811*b1cdbd2cSJim Jagielski }
812*b1cdbd2cSJim Jagielski }
813*b1cdbd2cSJim Jagielski }
814*b1cdbd2cSJim Jagielski }
815*b1cdbd2cSJim Jagielski
816*b1cdbd2cSJim Jagielski FreeLibrary(hLibrary);
817*b1cdbd2cSJim Jagielski
818*b1cdbd2cSJim Jagielski return (bRet);
819*b1cdbd2cSJim Jagielski }
820*b1cdbd2cSJim Jagielski
821*b1cdbd2cSJim Jagielski
isWNT(void)822*b1cdbd2cSJim Jagielski static sal_Bool isWNT(void)
823*b1cdbd2cSJim Jagielski {
824*b1cdbd2cSJim Jagielski static sal_Bool isInit = sal_False;
825*b1cdbd2cSJim Jagielski static sal_Bool isWNT = sal_False;
826*b1cdbd2cSJim Jagielski
827*b1cdbd2cSJim Jagielski if (!isInit)
828*b1cdbd2cSJim Jagielski {
829*b1cdbd2cSJim Jagielski OSVERSIONINFO VersionInformation =
830*b1cdbd2cSJim Jagielski
831*b1cdbd2cSJim Jagielski {
832*b1cdbd2cSJim Jagielski sizeof(OSVERSIONINFO),
833*b1cdbd2cSJim Jagielski 0,
834*b1cdbd2cSJim Jagielski 0,
835*b1cdbd2cSJim Jagielski 0,
836*b1cdbd2cSJim Jagielski 0,
837*b1cdbd2cSJim Jagielski "",
838*b1cdbd2cSJim Jagielski };
839*b1cdbd2cSJim Jagielski
840*b1cdbd2cSJim Jagielski if (
841*b1cdbd2cSJim Jagielski GetVersionEx(&VersionInformation) &&
842*b1cdbd2cSJim Jagielski (VersionInformation.dwPlatformId == VER_PLATFORM_WIN32_NT)
843*b1cdbd2cSJim Jagielski )
844*b1cdbd2cSJim Jagielski {
845*b1cdbd2cSJim Jagielski isWNT = sal_True;
846*b1cdbd2cSJim Jagielski }
847*b1cdbd2cSJim Jagielski
848*b1cdbd2cSJim Jagielski isInit = sal_True;
849*b1cdbd2cSJim Jagielski }
850*b1cdbd2cSJim Jagielski
851*b1cdbd2cSJim Jagielski return(isWNT);
852*b1cdbd2cSJim Jagielski }
853*b1cdbd2cSJim Jagielski
Privilege(LPTSTR strPrivilege,BOOL bEnable)854*b1cdbd2cSJim Jagielski static BOOL Privilege(LPTSTR strPrivilege, BOOL bEnable)
855*b1cdbd2cSJim Jagielski {
856*b1cdbd2cSJim Jagielski HANDLE hToken;
857*b1cdbd2cSJim Jagielski TOKEN_PRIVILEGES tp;
858*b1cdbd2cSJim Jagielski
859*b1cdbd2cSJim Jagielski /*
860*b1cdbd2cSJim Jagielski obtain the processes token
861*b1cdbd2cSJim Jagielski */
862*b1cdbd2cSJim Jagielski if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_DUP_QUERY, &hToken))
863*b1cdbd2cSJim Jagielski return FALSE;
864*b1cdbd2cSJim Jagielski
865*b1cdbd2cSJim Jagielski /*
866*b1cdbd2cSJim Jagielski get the luid
867*b1cdbd2cSJim Jagielski */
868*b1cdbd2cSJim Jagielski if (!LookupPrivilegeValue(NULL, strPrivilege, &tp.Privileges[0].Luid))
869*b1cdbd2cSJim Jagielski return FALSE;
870*b1cdbd2cSJim Jagielski
871*b1cdbd2cSJim Jagielski tp.PrivilegeCount = 1;
872*b1cdbd2cSJim Jagielski
873*b1cdbd2cSJim Jagielski if (bEnable)
874*b1cdbd2cSJim Jagielski tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
875*b1cdbd2cSJim Jagielski else
876*b1cdbd2cSJim Jagielski tp.Privileges[0].Attributes = 0;
877*b1cdbd2cSJim Jagielski
878*b1cdbd2cSJim Jagielski /*
879*b1cdbd2cSJim Jagielski enable or disable the privilege
880*b1cdbd2cSJim Jagielski */
881*b1cdbd2cSJim Jagielski if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0))
882*b1cdbd2cSJim Jagielski return FALSE;
883*b1cdbd2cSJim Jagielski
884*b1cdbd2cSJim Jagielski if (!CloseHandle(hToken))
885*b1cdbd2cSJim Jagielski return FALSE;
886*b1cdbd2cSJim Jagielski
887*b1cdbd2cSJim Jagielski return TRUE;
888*b1cdbd2cSJim Jagielski }
889*b1cdbd2cSJim Jagielski
getUserNameImpl(oslSecurity Security,rtl_uString ** strName,sal_Bool bIncludeDomain)890*b1cdbd2cSJim Jagielski static sal_Bool SAL_CALL getUserNameImpl(oslSecurity Security, rtl_uString **strName, sal_Bool bIncludeDomain)
891*b1cdbd2cSJim Jagielski {
892*b1cdbd2cSJim Jagielski if (Security != NULL)
893*b1cdbd2cSJim Jagielski {
894*b1cdbd2cSJim Jagielski oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
895*b1cdbd2cSJim Jagielski
896*b1cdbd2cSJim Jagielski HANDLE hAccessToken = pSecImpl->m_hToken;
897*b1cdbd2cSJim Jagielski
898*b1cdbd2cSJim Jagielski if (hAccessToken == NULL)
899*b1cdbd2cSJim Jagielski OpenProcessToken(GetCurrentProcess(), TOKEN_DUP_QUERY, &hAccessToken);
900*b1cdbd2cSJim Jagielski
901*b1cdbd2cSJim Jagielski if (hAccessToken)
902*b1cdbd2cSJim Jagielski {
903*b1cdbd2cSJim Jagielski DWORD nInfoBuffer = 512;
904*b1cdbd2cSJim Jagielski UCHAR* pInfoBuffer = malloc(nInfoBuffer);
905*b1cdbd2cSJim Jagielski
906*b1cdbd2cSJim Jagielski while (!GetTokenInformation(hAccessToken, TokenUser,
907*b1cdbd2cSJim Jagielski pInfoBuffer, nInfoBuffer, &nInfoBuffer))
908*b1cdbd2cSJim Jagielski {
909*b1cdbd2cSJim Jagielski if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
910*b1cdbd2cSJim Jagielski pInfoBuffer = realloc(pInfoBuffer, nInfoBuffer);
911*b1cdbd2cSJim Jagielski else
912*b1cdbd2cSJim Jagielski {
913*b1cdbd2cSJim Jagielski free(pInfoBuffer);
914*b1cdbd2cSJim Jagielski pInfoBuffer = NULL;
915*b1cdbd2cSJim Jagielski break;
916*b1cdbd2cSJim Jagielski }
917*b1cdbd2cSJim Jagielski }
918*b1cdbd2cSJim Jagielski
919*b1cdbd2cSJim Jagielski if (pSecImpl->m_hToken == NULL)
920*b1cdbd2cSJim Jagielski CloseHandle(hAccessToken);
921*b1cdbd2cSJim Jagielski
922*b1cdbd2cSJim Jagielski if (pInfoBuffer)
923*b1cdbd2cSJim Jagielski {
924*b1cdbd2cSJim Jagielski sal_Unicode UserName[128];
925*b1cdbd2cSJim Jagielski sal_Unicode DomainName[128];
926*b1cdbd2cSJim Jagielski sal_Unicode Name[257];
927*b1cdbd2cSJim Jagielski DWORD nUserName = sizeof(UserName);
928*b1cdbd2cSJim Jagielski DWORD nDomainName = sizeof(DomainName);
929*b1cdbd2cSJim Jagielski SID_NAME_USE sUse;
930*b1cdbd2cSJim Jagielski
931*b1cdbd2cSJim Jagielski if (LookupAccountSidW(NULL, ((PTOKEN_USER)pInfoBuffer)->User.Sid,
932*b1cdbd2cSJim Jagielski UserName, &nUserName,
933*b1cdbd2cSJim Jagielski DomainName, &nDomainName, &sUse))
934*b1cdbd2cSJim Jagielski {
935*b1cdbd2cSJim Jagielski if (bIncludeDomain)
936*b1cdbd2cSJim Jagielski {
937*b1cdbd2cSJim Jagielski wcscpy(Name, DomainName);
938*b1cdbd2cSJim Jagielski wcscat(Name, L"/");
939*b1cdbd2cSJim Jagielski wcscat(Name, UserName);
940*b1cdbd2cSJim Jagielski }
941*b1cdbd2cSJim Jagielski else
942*b1cdbd2cSJim Jagielski {
943*b1cdbd2cSJim Jagielski wcscpy(Name, UserName);
944*b1cdbd2cSJim Jagielski }
945*b1cdbd2cSJim Jagielski }
946*b1cdbd2cSJim Jagielski rtl_uString_newFromStr( strName, Name);
947*b1cdbd2cSJim Jagielski
948*b1cdbd2cSJim Jagielski free(pInfoBuffer);
949*b1cdbd2cSJim Jagielski
950*b1cdbd2cSJim Jagielski return (sal_True);
951*b1cdbd2cSJim Jagielski }
952*b1cdbd2cSJim Jagielski }
953*b1cdbd2cSJim Jagielski else
954*b1cdbd2cSJim Jagielski {
955*b1cdbd2cSJim Jagielski DWORD needed=0;
956*b1cdbd2cSJim Jagielski sal_Unicode *pNameW=NULL;
957*b1cdbd2cSJim Jagielski
958*b1cdbd2cSJim Jagielski WNetGetUserW(NULL, NULL, &needed);
959*b1cdbd2cSJim Jagielski pNameW = malloc (needed*sizeof(sal_Unicode));
960*b1cdbd2cSJim Jagielski
961*b1cdbd2cSJim Jagielski if (WNetGetUserW(NULL, pNameW, &needed) == NO_ERROR)
962*b1cdbd2cSJim Jagielski {
963*b1cdbd2cSJim Jagielski rtl_uString_newFromStr( strName, pNameW);
964*b1cdbd2cSJim Jagielski
965*b1cdbd2cSJim Jagielski if (pNameW)
966*b1cdbd2cSJim Jagielski free(pNameW);
967*b1cdbd2cSJim Jagielski return (sal_True);
968*b1cdbd2cSJim Jagielski }
969*b1cdbd2cSJim Jagielski else
970*b1cdbd2cSJim Jagielski if (wcslen(pSecImpl->m_User) > 0)
971*b1cdbd2cSJim Jagielski {
972*b1cdbd2cSJim Jagielski rtl_uString_newFromStr( strName, pSecImpl->m_pNetResource->lpRemoteName);
973*b1cdbd2cSJim Jagielski
974*b1cdbd2cSJim Jagielski if (pNameW)
975*b1cdbd2cSJim Jagielski free(pNameW);
976*b1cdbd2cSJim Jagielski
977*b1cdbd2cSJim Jagielski return (sal_True);
978*b1cdbd2cSJim Jagielski }
979*b1cdbd2cSJim Jagielski
980*b1cdbd2cSJim Jagielski if (pNameW)
981*b1cdbd2cSJim Jagielski free(pNameW);
982*b1cdbd2cSJim Jagielski }
983*b1cdbd2cSJim Jagielski }
984*b1cdbd2cSJim Jagielski
985*b1cdbd2cSJim Jagielski return sal_False;
986*b1cdbd2cSJim Jagielski }
987*b1cdbd2cSJim Jagielski
988