Version 3.6.0.4, tag libreoffice-3.6.0.4
[LibreOffice.git] / sfx2 / source / doc / sfxacldetect.cxx
blob235ec032e347363615031c5bfa55730cc6036f0e
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*************************************************************************
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * Copyright 2000, 2010 Oracle and/or its affiliates.
8 * OpenOffice.org - a multi-platform office productivity suite
10 * This file is part of OpenOffice.org.
12 * OpenOffice.org is free software: you can redistribute it and/or modify
13 * it under the terms of the GNU Lesser General Public License version 3
14 * only, as published by the Free Software Foundation.
16 * OpenOffice.org is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU Lesser General Public License version 3 for more details
20 * (a copy is included in the LICENSE file that accompanied this code).
22 * You should have received a copy of the GNU Lesser General Public License
23 * version 3 along with OpenOffice.org. If not, see
24 * <http://www.openoffice.org/license.html>
25 * for a copy of the LGPLv3 License.
27 ************************************************************************/
32 #if EXTRA_ACL_CHECK
34 #ifdef WNT
36 // necessary to include system headers without warnings
37 #ifdef _MSC_VER
38 #pragma warning(disable:4668 4917)
39 #endif
41 #include <windows.h>
42 #include <lmaccess.h>
43 #include <sal/types.h>
45 sal_Bool IsReadonlyAccordingACL( const sal_Unicode* pFilePath )
47 sal_Bool bResult = sal_False;
49 sal_uInt32 nFDSize = 0;
50 GetFileSecurityW( reinterpret_cast< LPCWSTR >(pFilePath), DACL_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|OWNER_SECURITY_INFORMATION, NULL, 0, &nFDSize );
51 if ( nFDSize )
53 PSECURITY_DESCRIPTOR pFileDescr = reinterpret_cast< PSECURITY_DESCRIPTOR >( malloc( nFDSize ) );
54 if ( GetFileSecurityW( reinterpret_cast< LPCWSTR >(pFilePath), DACL_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|OWNER_SECURITY_INFORMATION, pFileDescr, nFDSize, &nFDSize ) )
56 HANDLE hToken = NULL;
57 if ( OpenThreadToken( GetCurrentThread(), TOKEN_DUPLICATE|TOKEN_QUERY, TRUE, &hToken )
58 || OpenProcessToken( GetCurrentProcess(), TOKEN_DUPLICATE|TOKEN_QUERY, &hToken) )
60 HANDLE hImpersonationToken = NULL;
61 if ( DuplicateToken( hToken, SecurityImpersonation, &hImpersonationToken) )
63 sal_uInt32 nDesiredAccess = ACCESS_WRITE;
64 GENERIC_MAPPING aGenericMapping = { ACCESS_READ, ACCESS_WRITE, 0, ACCESS_READ | ACCESS_WRITE };
65 MapGenericMask( &nDesiredAccess, &aGenericMapping );
67 PRIVILEGE_SET aPrivilegeSet;
68 sal_uInt32 nPrivilegeSetSize = sizeof( PRIVILEGE_SET );
70 sal_uInt32 nGrantedAccess;
71 BOOL bAccessible = TRUE;
72 if ( AccessCheck( pFileDescr,
73 hImpersonationToken,
74 nDesiredAccess,
75 &aGenericMapping,
76 &aPrivilegeSet,
77 &nPrivilegeSetSize,
78 &nGrantedAccess,
79 &bAccessible ) )
81 bResult = !bAccessible;
84 CloseHandle( hImpersonationToken );
87 CloseHandle( hToken );
91 free( pFileDescr );
94 return bResult;
97 #else // this is UNX
100 #include <sal/types.h>
102 sal_Bool IsReadonlyAccordingACL( const sal_Unicode* )
104 // to be implemented
105 return sal_False;
108 #endif
110 #endif
112 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */