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