]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/libarchive/libarchive/test/test_compat_solaris_tar_acl.c
MFC r368207,368607:
[FreeBSD/stable/10.git] / contrib / libarchive / libarchive / test / test_compat_solaris_tar_acl.c
1 /*-
2  * Copyright (c) 2003-2009 Tim Kientzle
3  * Copyright (c) 2016 Martin Matuska
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 #include "test.h"
27 __FBSDID("$FreeBSD$");
28
29 /*
30  * Verify reading entries with POSIX.1e and NFSv4 ACLs from archives created
31  * with Solaris tar.
32  *
33  * This should work on all systems, regardless of whether local filesystems
34  * support ACLs or not.
35  */
36
37 static struct archive_test_acl_t acls0[] = {
38         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE |
39             ARCHIVE_ENTRY_ACL_READ,
40           ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
41         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE,
42           ARCHIVE_ENTRY_ACL_USER, 71, "lp" },
43         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
44           ARCHIVE_ENTRY_ACL_USER, 666, "666" },
45         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE |
46             ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_READ,
47           ARCHIVE_ENTRY_ACL_USER, 1000, "1000" },
48         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
49           ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
50         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
51           ARCHIVE_ENTRY_ACL_MASK, -1, ""},
52         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
53           ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
54 };
55
56 static struct archive_test_acl_t acls1[] = {
57         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE |
58             ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_READ,
59           ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
60         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE |
61             ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_READ,
62           ARCHIVE_ENTRY_ACL_USER, 2, "bin" },
63         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE |
64             ARCHIVE_ENTRY_ACL_READ,
65           ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
66         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE |
67             ARCHIVE_ENTRY_ACL_READ,
68           ARCHIVE_ENTRY_ACL_GROUP, 3, "sys" },
69         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE |
70             ARCHIVE_ENTRY_ACL_READ,
71           ARCHIVE_ENTRY_ACL_MASK, -1, ""},
72         { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0,
73           ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
74 };
75
76 static struct archive_test_acl_t acls2[] = {
77         { ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, ARCHIVE_ENTRY_ACL_EXECUTE |
78             ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_READ,
79           ARCHIVE_ENTRY_ACL_USER_OBJ, -1 ,"" },
80         { ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, ARCHIVE_ENTRY_ACL_EXECUTE |
81             ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_READ,
82           ARCHIVE_ENTRY_ACL_USER, 2, "bin" },
83         { ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, ARCHIVE_ENTRY_ACL_EXECUTE |
84             ARCHIVE_ENTRY_ACL_READ,
85           ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
86         { ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, ARCHIVE_ENTRY_ACL_EXECUTE |
87             ARCHIVE_ENTRY_ACL_READ,
88           ARCHIVE_ENTRY_ACL_GROUP, 3, "sys" },
89         { ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, ARCHIVE_ENTRY_ACL_EXECUTE |
90             ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_READ,
91           ARCHIVE_ENTRY_ACL_MASK, -1, ""},
92         { ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0,
93           ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
94 };
95
96 static struct archive_test_acl_t acls3[] = {
97         { ARCHIVE_ENTRY_ACL_TYPE_DENY,
98             ARCHIVE_ENTRY_ACL_EXECUTE |
99             ARCHIVE_ENTRY_ACL_READ_DATA |
100             ARCHIVE_ENTRY_ACL_WRITE_DATA |
101             ARCHIVE_ENTRY_ACL_APPEND_DATA |
102             ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
103             ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
104             ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
105             ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
106             ARCHIVE_ENTRY_ACL_READ_ACL |
107             ARCHIVE_ENTRY_ACL_WRITE_ACL |
108             ARCHIVE_ENTRY_ACL_WRITE_OWNER |
109             ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
110           ARCHIVE_ENTRY_ACL_GROUP, 12, "daemon" },
111         { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
112             ARCHIVE_ENTRY_ACL_EXECUTE |
113             ARCHIVE_ENTRY_ACL_READ_DATA |
114             ARCHIVE_ENTRY_ACL_WRITE_DATA |
115             ARCHIVE_ENTRY_ACL_APPEND_DATA |
116             ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
117           ARCHIVE_ENTRY_ACL_GROUP, 2, "bin" },
118         { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
119             ARCHIVE_ENTRY_ACL_READ_DATA |
120             ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
121             ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
122             ARCHIVE_ENTRY_ACL_READ_ACL |
123             ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
124           ARCHIVE_ENTRY_ACL_USER, 4, "adm" },
125         { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
126             ARCHIVE_ENTRY_ACL_READ_DATA |
127             ARCHIVE_ENTRY_ACL_WRITE_DATA |
128             ARCHIVE_ENTRY_ACL_APPEND_DATA |
129             ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
130             ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
131             ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
132             ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
133             ARCHIVE_ENTRY_ACL_READ_ACL |
134             ARCHIVE_ENTRY_ACL_WRITE_ACL |
135             ARCHIVE_ENTRY_ACL_WRITE_OWNER |
136             ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
137           ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" },
138         { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
139             ARCHIVE_ENTRY_ACL_READ_DATA |
140             ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
141             ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
142             ARCHIVE_ENTRY_ACL_READ_ACL |
143             ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
144           ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" },
145         { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
146             ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
147             ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
148             ARCHIVE_ENTRY_ACL_READ_ACL |
149             ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
150           ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" },
151 };
152
153 static struct archive_test_acl_t acls4[] = {
154         { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
155             ARCHIVE_ENTRY_ACL_EXECUTE |
156             ARCHIVE_ENTRY_ACL_READ_DATA |
157             ARCHIVE_ENTRY_ACL_WRITE_DATA |
158             ARCHIVE_ENTRY_ACL_APPEND_DATA |
159             ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
160             ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
161             ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
162             ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
163             ARCHIVE_ENTRY_ACL_READ_ACL |
164             ARCHIVE_ENTRY_ACL_WRITE_ACL |
165             ARCHIVE_ENTRY_ACL_WRITE_OWNER |
166             ARCHIVE_ENTRY_ACL_SYNCHRONIZE |
167             ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT |
168             ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT |
169             ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY,
170           ARCHIVE_ENTRY_ACL_USER, 1100, "1100" },
171         { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
172             ARCHIVE_ENTRY_ACL_READ_DATA |
173             ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
174             ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
175             ARCHIVE_ENTRY_ACL_READ_ACL |
176             ARCHIVE_ENTRY_ACL_SYNCHRONIZE |
177             ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT |
178             ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT,
179           ARCHIVE_ENTRY_ACL_GROUP, 4, "adm" },
180         { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
181             ARCHIVE_ENTRY_ACL_EXECUTE |
182             ARCHIVE_ENTRY_ACL_READ_DATA |
183             ARCHIVE_ENTRY_ACL_WRITE_DATA |
184             ARCHIVE_ENTRY_ACL_APPEND_DATA |
185             ARCHIVE_ENTRY_ACL_DELETE_CHILD |
186             ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
187             ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
188             ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
189             ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
190             ARCHIVE_ENTRY_ACL_READ_ACL |
191             ARCHIVE_ENTRY_ACL_WRITE_ACL |
192             ARCHIVE_ENTRY_ACL_WRITE_OWNER |
193             ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
194           ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" },
195         { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
196             ARCHIVE_ENTRY_ACL_EXECUTE |
197             ARCHIVE_ENTRY_ACL_READ_DATA |
198             ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
199             ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
200             ARCHIVE_ENTRY_ACL_READ_ACL |
201             ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
202           ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" },
203         { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
204             ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
205             ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
206             ARCHIVE_ENTRY_ACL_READ_ACL |
207             ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
208           ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" },
209 };
210
211 DEFINE_TEST(test_compat_solaris_tar_acl)
212 {
213         char name[] = "test_compat_solaris_tar_acl.tar";
214         struct archive *a;
215         struct archive_entry *ae;
216
217         /* Read archive file */
218         assert(NULL != (a = archive_read_new()));
219         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
220         assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
221         extract_reference_file(name);
222         assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name,
223             10240));
224
225         /* First item has access ACLs */
226         assertA(0 == archive_read_next_header(a, &ae));
227         failure("One extended ACL should flag all ACLs to be returned.");
228         assertEqualInt(7, archive_entry_acl_reset(ae,
229             ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
230         assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
231             ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0644);
232         failure("Basic ACLs should set mode to 0644, not %04o",
233             archive_entry_mode(ae)&0777);
234         assert((archive_entry_mode(ae) & 0777) == 0644);
235
236         /* Second item has default and access ACLs */
237         assertA(0 == archive_read_next_header(a, &ae));
238         assertEqualInt(6, archive_entry_acl_reset(ae,
239             ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
240         assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
241             ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0750);
242         failure("Basic ACLs should set mode to 0750, not %04o",
243             archive_entry_mode(ae)&0777);
244         assert((archive_entry_mode(ae) & 0777) == 0750);
245         assertEqualInt(6, archive_entry_acl_reset(ae,
246             ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
247         assertEntryCompareAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
248             ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0750);
249
250         /* Third item has NFS4 ACLs */
251         assertA(0 == archive_read_next_header(a, &ae));
252         assertEqualInt(6, archive_entry_acl_reset(ae,
253             ARCHIVE_ENTRY_ACL_TYPE_NFS4));
254         assertEntryCompareAcls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]),
255             ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
256
257         /* Fourth item has NFS4 ACLs and inheritance flags */
258         assertA(0 == archive_read_next_header(a, &ae));
259         assertEqualInt(5, archive_entry_acl_reset(ae,
260             ARCHIVE_ENTRY_ACL_TYPE_NFS4));
261         assertEntryCompareAcls(ae, acls4, sizeof(acls4)/sizeof(acls0[4]),
262             ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
263
264         /* Close the archive. */
265         assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
266         assertEqualInt(ARCHIVE_OK, archive_read_free(a));
267 }