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