Merge pull request #4324 from FernetMenta/wasapi
[vuplus_xbmc] / lib / UnrarXLib / win32acl.cpp
1 static void SetPrivileges();
2
3 static bool ReadSacl=false;
4
5
6
7 #ifndef SFX_MODULE
8 void ExtractACL(Archive &Arc,char *FileName,wchar *FileNameW)
9 {
10 #if defined(_XBOX) || defined (_LINUX)
11   return;
12 #else
13   if (!WinNT())
14     return;
15
16   SetPrivileges();
17
18   if (Arc.HeaderCRC!=Arc.EAHead.HeadCRC)
19   {
20     Log(Arc.FileName,St(MACLBroken),FileName);
21     ErrHandler.SetErrorCode(CRC_ERROR);
22     return;
23   }
24
25   if (Arc.EAHead.Method<0x31 || Arc.EAHead.Method>0x35 || Arc.EAHead.UnpVer>PACK_VER)
26   {
27     Log(Arc.FileName,St(MACLUnknown),FileName);
28     ErrHandler.SetErrorCode(WARNING);
29     return;
30   }
31
32   ComprDataIO DataIO;
33   Unpack Unpack(&DataIO);
34   Unpack.Init();
35
36   Array<unsigned char> UnpData(Arc.EAHead.UnpSize);
37   DataIO.SetUnpackToMemory(&UnpData[0],Arc.EAHead.UnpSize);
38   DataIO.SetPackedSizeToRead(Arc.EAHead.DataSize);
39   DataIO.EnableShowProgress(false);
40   DataIO.SetFiles(&Arc,NULL);
41   Unpack.SetDestSize(Arc.EAHead.UnpSize);
42   Unpack.DoUnpack(Arc.EAHead.UnpVer,false);
43
44   if (Arc.EAHead.EACRC!=~DataIO.UnpFileCRC)
45   {
46     Log(Arc.FileName,St(MACLBroken),FileName);
47     ErrHandler.SetErrorCode(CRC_ERROR);
48     return;
49   }
50
51   SECURITY_INFORMATION  si=OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|
52                            DACL_SECURITY_INFORMATION;
53   if (ReadSacl)
54     si|=SACL_SECURITY_INFORMATION;
55   SECURITY_DESCRIPTOR *sd=(SECURITY_DESCRIPTOR *)&UnpData[0];
56
57   int SetCode;
58   if (FileNameW!=NULL)
59     SetCode=SetFileSecurityW(FileNameW,si,sd);
60   else
61     SetCode=SetFileSecurity(FileName,si,sd);
62
63   if (!SetCode)
64   {
65     Log(Arc.FileName,St(MACLSetError),FileName);
66     ErrHandler.SysErrMsg();
67     ErrHandler.SetErrorCode(WARNING);
68   }
69 #endif
70 }
71 #endif
72
73
74 void ExtractACLNew(Archive &Arc,char *FileName,wchar *FileNameW)
75 {
76 #if defined(_XBOX) || defined(_LINUX)
77   return;
78 #else
79   if (!WinNT())
80     return;
81
82   Array<byte> SubData;
83   if (!Arc.ReadSubData(&SubData,NULL))
84     return;
85
86   SetPrivileges();
87
88   SECURITY_INFORMATION  si=OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|
89                            DACL_SECURITY_INFORMATION;
90   if (ReadSacl)
91     si|=SACL_SECURITY_INFORMATION;
92   SECURITY_DESCRIPTOR *sd=(SECURITY_DESCRIPTOR *)&SubData[0];
93
94   int SetCode;
95   if (FileNameW!=NULL)
96     SetCode=SetFileSecurityW(FileNameW,si,sd);
97   else
98     SetCode=SetFileSecurity(FileName,si,sd);
99
100   if (!SetCode)
101   {
102     Log(Arc.FileName,St(MACLSetError),FileName);
103     ErrHandler.SysErrMsg();
104     ErrHandler.SetErrorCode(WARNING);
105   }
106 #endif
107 }
108
109
110 void SetPrivileges()
111 {
112 #if defined(_XBOX) || defined(_LINUX)
113   return;
114 #else
115   static bool InitDone=false;
116   if (InitDone)
117     return;
118   InitDone=true;
119
120   HANDLE hToken;
121
122   if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
123     return;
124
125   TOKEN_PRIVILEGES tp;
126   tp.PrivilegeCount = 1;
127   tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
128
129   if (LookupPrivilegeValue(NULL,SE_SECURITY_NAME,&tp.Privileges[0].Luid))
130     if (AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL) &&
131         GetLastError() == ERROR_SUCCESS)
132       ReadSacl=true;
133
134   if (LookupPrivilegeValue(NULL,SE_RESTORE_NAME,&tp.Privileges[0].Luid))
135     AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
136
137   CloseHandle(hToken);
138 #endif
139 }