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