1caf54c4fSMartin Matuska /*-
2caf54c4fSMartin Matuska * Copyright (c) 2003-2007 Tim Kientzle
3e9ed7ea4SMartin Matuska * Copyright (c) 2016 Martin Matuska
4caf54c4fSMartin Matuska * All rights reserved.
5caf54c4fSMartin Matuska *
6caf54c4fSMartin Matuska * Redistribution and use in source and binary forms, with or without
7caf54c4fSMartin Matuska * modification, are permitted provided that the following conditions
8caf54c4fSMartin Matuska * are met:
9caf54c4fSMartin Matuska * 1. Redistributions of source code must retain the above copyright
10caf54c4fSMartin Matuska * notice, this list of conditions and the following disclaimer.
11caf54c4fSMartin Matuska * 2. Redistributions in binary form must reproduce the above copyright
12caf54c4fSMartin Matuska * notice, this list of conditions and the following disclaimer in the
13caf54c4fSMartin Matuska * documentation and/or other materials provided with the distribution.
14caf54c4fSMartin Matuska *
15caf54c4fSMartin Matuska * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16caf54c4fSMartin Matuska * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17caf54c4fSMartin Matuska * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18caf54c4fSMartin Matuska * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19caf54c4fSMartin Matuska * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20caf54c4fSMartin Matuska * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21caf54c4fSMartin Matuska * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22caf54c4fSMartin Matuska * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23caf54c4fSMartin Matuska * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24caf54c4fSMartin Matuska * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25caf54c4fSMartin Matuska */
26caf54c4fSMartin Matuska #include "test.h"
27caf54c4fSMartin Matuska
28caf54c4fSMartin Matuska /*
29caf54c4fSMartin Matuska * Exercise the system-independent portion of the ACL support.
30e9ed7ea4SMartin Matuska * Check that pax archive can save and restore POSIX.1e ACL data.
31caf54c4fSMartin Matuska *
32caf54c4fSMartin Matuska * This should work on all systems, regardless of whether local
33caf54c4fSMartin Matuska * filesystems support ACLs or not.
34caf54c4fSMartin Matuska */
35caf54c4fSMartin Matuska
36caf54c4fSMartin Matuska static unsigned char buff[16384];
37caf54c4fSMartin Matuska
38e9ed7ea4SMartin Matuska static struct archive_test_acl_t acls0[] = {
39caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE,
40caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" },
41caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
42caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" },
43caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE,
44caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_OTHER, 0, "" },
45caf54c4fSMartin Matuska };
46caf54c4fSMartin Matuska
47e9ed7ea4SMartin Matuska static struct archive_test_acl_t acls1[] = {
48caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE,
49caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
50caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
51caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
52caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
53caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
54caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE,
55caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
56caf54c4fSMartin Matuska };
57caf54c4fSMartin Matuska
58e9ed7ea4SMartin Matuska static struct archive_test_acl_t acls2[] = {
59caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE | ARCHIVE_ENTRY_ACL_READ,
60caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
61caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
62caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
63caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0,
64caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_USER, 78, "user78" },
65caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
66caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
67caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0007,
68caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" },
69caf54c4fSMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_EXECUTE,
70caf54c4fSMartin Matuska ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
71caf54c4fSMartin Matuska };
72caf54c4fSMartin Matuska
73e9ed7ea4SMartin Matuska static struct archive_test_acl_t acls3[] = {
74e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
75e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
76e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_DATA |
77e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_EXECUTE |
78e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_APPEND_DATA |
79e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
80e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
81e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
82e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
83e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
84e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_ACL |
85e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_OWNER |
86e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
87e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" },
88e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
89e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
90e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_DATA |
91e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_APPEND_DATA |
92e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
93e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
94e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
95e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
96e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
97e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" },
98e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
99e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
100e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
101e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
102e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
103e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
104e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" },
105e9ed7ea4SMartin Matuska };
106caf54c4fSMartin Matuska
107e9ed7ea4SMartin Matuska static struct archive_test_acl_t acls4[] = {
108e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
109e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
110e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_DATA |
111e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_APPEND_DATA |
112e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
113e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
114e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
115e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
116e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
117e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_ACL |
118e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_OWNER |
119e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
120e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" },
121e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
122e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
123e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
124e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
125e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
126e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_SYNCHRONIZE |
127e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_ENTRY_INHERITED,
128e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
129e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_DENY,
130e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
131e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_DATA |
132e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_EXECUTE,
133e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_USER, 78, "user78" },
134e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
135e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
136e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_DATA |
137e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_APPEND_DATA |
138e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
139e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
140e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
141e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
142e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" },
143e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_DENY,
144e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_DATA |
145e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_APPEND_DATA |
146e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
147e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
148e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_ACL |
149e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_OWNER,
150e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" },
151e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
152e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
153e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
154e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
155e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
156e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
157e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" },
158e9ed7ea4SMartin Matuska };
159caf54c4fSMartin Matuska
160e9ed7ea4SMartin Matuska static struct archive_test_acl_t acls5[] = {
161e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
162e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
163e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_DATA |
164e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_EXECUTE |
165e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_APPEND_DATA |
166e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
167e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
168e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
169e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
170e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
171e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_ACL |
172e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_OWNER |
173e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
174e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" },
175e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
176e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
177e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_DATA |
178e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_APPEND_DATA |
179e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
180e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
181e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
182e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_OWNER |
183e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
184e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
185e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_AUDIT,
186e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_DATA |
187e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_APPEND_DATA |
188e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS,
189e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
190e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
191e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
192e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_WRITE_DATA |
193e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_APPEND_DATA |
194e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
195e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
196e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
197e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
198e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" },
199e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ALARM,
200e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
201e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
202e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
203e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
204e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS,
205e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" },
206e9ed7ea4SMartin Matuska { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
207e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_DATA |
208e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
209e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
210e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_READ_ACL |
211e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
212e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" },
213e9ed7ea4SMartin Matuska };
214caf54c4fSMartin Matuska
DEFINE_TEST(test_acl_pax_posix1e)215e9ed7ea4SMartin Matuska DEFINE_TEST(test_acl_pax_posix1e)
216caf54c4fSMartin Matuska {
217caf54c4fSMartin Matuska struct archive *a;
218caf54c4fSMartin Matuska struct archive_entry *ae;
219caf54c4fSMartin Matuska size_t used;
220caf54c4fSMartin Matuska FILE *f;
2216c95142eSMartin Matuska void *reference;
2226c95142eSMartin Matuska size_t reference_size;
223caf54c4fSMartin Matuska
224caf54c4fSMartin Matuska /* Write an archive to memory. */
225caf54c4fSMartin Matuska assert(NULL != (a = archive_write_new()));
226caf54c4fSMartin Matuska assertA(0 == archive_write_set_format_pax(a));
227acc60b03SMartin Matuska assertA(0 == archive_write_add_filter_none(a));
228caf54c4fSMartin Matuska assertA(0 == archive_write_set_bytes_per_block(a, 1));
229caf54c4fSMartin Matuska assertA(0 == archive_write_set_bytes_in_last_block(a, 1));
230caf54c4fSMartin Matuska assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used));
231caf54c4fSMartin Matuska
232caf54c4fSMartin Matuska /* Write a series of files to the archive with different ACL info. */
233caf54c4fSMartin Matuska
234caf54c4fSMartin Matuska /* Create a simple archive_entry. */
235caf54c4fSMartin Matuska assert((ae = archive_entry_new()) != NULL);
236caf54c4fSMartin Matuska archive_entry_set_pathname(ae, "file");
237caf54c4fSMartin Matuska archive_entry_set_mode(ae, S_IFREG | 0777);
238caf54c4fSMartin Matuska
239caf54c4fSMartin Matuska /* Basic owner/owning group should just update mode bits. */
24064287048SMartin Matuska assertEntrySetAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
241caf54c4fSMartin Matuska assertA(0 == archive_write_header(a, ae));
242caf54c4fSMartin Matuska
243caf54c4fSMartin Matuska /* With any extended ACL entry, we should read back a full set. */
24464287048SMartin Matuska assertEntrySetAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
245caf54c4fSMartin Matuska assertA(0 == archive_write_header(a, ae));
246caf54c4fSMartin Matuska
247caf54c4fSMartin Matuska /* A more extensive set of ACLs. */
24864287048SMartin Matuska assertEntrySetAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
249caf54c4fSMartin Matuska assertA(0 == archive_write_header(a, ae));
250caf54c4fSMartin Matuska
251caf54c4fSMartin Matuska /*
252caf54c4fSMartin Matuska * Check that clearing ACLs gets rid of them all by repeating
253caf54c4fSMartin Matuska * the first test.
254caf54c4fSMartin Matuska */
25564287048SMartin Matuska assertEntrySetAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
256caf54c4fSMartin Matuska assertA(0 == archive_write_header(a, ae));
257caf54c4fSMartin Matuska archive_entry_free(ae);
258caf54c4fSMartin Matuska
259caf54c4fSMartin Matuska /* Close out the archive. */
2606c95142eSMartin Matuska assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
2616c95142eSMartin Matuska assertEqualInt(ARCHIVE_OK, archive_write_free(a));
262caf54c4fSMartin Matuska
263caf54c4fSMartin Matuska /* Write out the data we generated to a file for manual inspection. */
264caf54c4fSMartin Matuska assert(NULL != (f = fopen("testout", "wb")));
265caf54c4fSMartin Matuska assertEqualInt(used, (size_t)fwrite(buff, 1, (unsigned int)used, f));
266caf54c4fSMartin Matuska fclose(f);
267caf54c4fSMartin Matuska
268caf54c4fSMartin Matuska /* Write out the reference data to a file for manual inspection. */
269e9ed7ea4SMartin Matuska extract_reference_file("test_acl_pax_posix1e.tar");
270e9ed7ea4SMartin Matuska reference = slurpfile(&reference_size, "test_acl_pax_posix1e.tar");
271caf54c4fSMartin Matuska
272caf54c4fSMartin Matuska /* Assert that the generated data matches the built-in reference data.*/
273e9ed7ea4SMartin Matuska failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_posix1e.tar' reference file.");
2746c95142eSMartin Matuska assertEqualMem(buff, reference, reference_size);
275e9ed7ea4SMartin Matuska failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_posix1e.tar' reference file.");
2766c95142eSMartin Matuska assertEqualInt((int)used, reference_size);
2776c95142eSMartin Matuska free(reference);
278caf54c4fSMartin Matuska
279caf54c4fSMartin Matuska /* Read back each entry and check that the ACL data is right. */
280caf54c4fSMartin Matuska assert(NULL != (a = archive_read_new()));
281caf54c4fSMartin Matuska assertA(0 == archive_read_support_format_all(a));
2826c95142eSMartin Matuska assertA(0 == archive_read_support_filter_all(a));
283caf54c4fSMartin Matuska assertA(0 == archive_read_open_memory(a, buff, used));
284caf54c4fSMartin Matuska
285caf54c4fSMartin Matuska /* First item has no ACLs */
286caf54c4fSMartin Matuska assertA(0 == archive_read_next_header(a, &ae));
287caf54c4fSMartin Matuska failure("Basic ACLs shouldn't be stored as extended ACLs");
288caf54c4fSMartin Matuska assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
289caf54c4fSMartin Matuska failure("Basic ACLs should set mode to 0142, not %04o",
290caf54c4fSMartin Matuska archive_entry_mode(ae)&0777);
291caf54c4fSMartin Matuska assert((archive_entry_mode(ae) & 0777) == 0142);
292caf54c4fSMartin Matuska
293caf54c4fSMartin Matuska /* Second item has a few ACLs */
294caf54c4fSMartin Matuska assertA(0 == archive_read_next_header(a, &ae));
295caf54c4fSMartin Matuska failure("One extended ACL should flag all ACLs to be returned.");
296caf54c4fSMartin Matuska assert(4 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
29764287048SMartin Matuska assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
298e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0142);
299caf54c4fSMartin Matuska failure("Basic ACLs should set mode to 0142, not %04o",
300caf54c4fSMartin Matuska archive_entry_mode(ae)&0777);
301caf54c4fSMartin Matuska assert((archive_entry_mode(ae) & 0777) == 0142);
302caf54c4fSMartin Matuska
303caf54c4fSMartin Matuska /* Third item has pretty extensive ACLs */
304caf54c4fSMartin Matuska assertA(0 == archive_read_next_header(a, &ae));
305e9ed7ea4SMartin Matuska assertEqualInt(6, archive_entry_acl_reset(ae,
306e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
30764287048SMartin Matuska assertEntryCompareAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
308e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0543);
309caf54c4fSMartin Matuska failure("Basic ACLs should set mode to 0543, not %04o",
310caf54c4fSMartin Matuska archive_entry_mode(ae)&0777);
311caf54c4fSMartin Matuska assert((archive_entry_mode(ae) & 0777) == 0543);
312caf54c4fSMartin Matuska
313caf54c4fSMartin Matuska /* Fourth item has no ACLs */
314caf54c4fSMartin Matuska assertA(0 == archive_read_next_header(a, &ae));
315caf54c4fSMartin Matuska failure("Basic ACLs shouldn't be stored as extended ACLs");
316caf54c4fSMartin Matuska assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
317caf54c4fSMartin Matuska failure("Basic ACLs should set mode to 0142, not %04o",
318caf54c4fSMartin Matuska archive_entry_mode(ae)&0777);
319caf54c4fSMartin Matuska assert((archive_entry_mode(ae) & 0777) == 0142);
320caf54c4fSMartin Matuska
321caf54c4fSMartin Matuska /* Close the archive. */
3226c95142eSMartin Matuska assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
3236c95142eSMartin Matuska assertEqualInt(ARCHIVE_OK, archive_read_free(a));
324caf54c4fSMartin Matuska }
325e9ed7ea4SMartin Matuska
DEFINE_TEST(test_acl_pax_nfs4)326e9ed7ea4SMartin Matuska DEFINE_TEST(test_acl_pax_nfs4)
327e9ed7ea4SMartin Matuska {
328e9ed7ea4SMartin Matuska struct archive *a;
329e9ed7ea4SMartin Matuska struct archive_entry *ae;
330e9ed7ea4SMartin Matuska size_t used;
331e9ed7ea4SMartin Matuska FILE *f;
332e9ed7ea4SMartin Matuska void *reference;
333e9ed7ea4SMartin Matuska size_t reference_size;
334e9ed7ea4SMartin Matuska
335e9ed7ea4SMartin Matuska /* Write an archive to memory. */
336e9ed7ea4SMartin Matuska assert(NULL != (a = archive_write_new()));
337e9ed7ea4SMartin Matuska assertA(0 == archive_write_set_format_pax(a));
338e9ed7ea4SMartin Matuska assertA(0 == archive_write_add_filter_none(a));
339e9ed7ea4SMartin Matuska assertA(0 == archive_write_set_bytes_per_block(a, 1));
340e9ed7ea4SMartin Matuska assertA(0 == archive_write_set_bytes_in_last_block(a, 1));
341e9ed7ea4SMartin Matuska assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used));
342e9ed7ea4SMartin Matuska
343e9ed7ea4SMartin Matuska /* Write a series of files to the archive with different ACL info. */
344e9ed7ea4SMartin Matuska
345e9ed7ea4SMartin Matuska /* Create a simple archive_entry. */
346e9ed7ea4SMartin Matuska assert((ae = archive_entry_new()) != NULL);
347e9ed7ea4SMartin Matuska archive_entry_set_pathname(ae, "file");
348e9ed7ea4SMartin Matuska archive_entry_set_mode(ae, S_IFREG | 0777);
349e9ed7ea4SMartin Matuska
350e9ed7ea4SMartin Matuska /* NFS4 ACLs mirroring 0754 file mode */
35164287048SMartin Matuska assertEntrySetAcls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]));
352e9ed7ea4SMartin Matuska assertA(0 == archive_write_header(a, ae));
353e9ed7ea4SMartin Matuska
354e9ed7ea4SMartin Matuska /* A more extensive set of NFS4 ACLs. */
35564287048SMartin Matuska assertEntrySetAcls(ae, acls4, sizeof(acls4)/sizeof(acls4[0]));
356e9ed7ea4SMartin Matuska assertA(0 == archive_write_header(a, ae));
357e9ed7ea4SMartin Matuska
358e9ed7ea4SMartin Matuska /* Set with special (audit, alarm) NFS4 ACLs. */
35964287048SMartin Matuska assertEntrySetAcls(ae, acls5, sizeof(acls5)/sizeof(acls5[0]));
360e9ed7ea4SMartin Matuska assertA(0 == archive_write_header(a, ae));
361e9ed7ea4SMartin Matuska
362e9ed7ea4SMartin Matuska archive_entry_free(ae);
363e9ed7ea4SMartin Matuska
364e9ed7ea4SMartin Matuska /* Close out the archive. */
365e9ed7ea4SMartin Matuska assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
366e9ed7ea4SMartin Matuska assertEqualInt(ARCHIVE_OK, archive_write_free(a));
367e9ed7ea4SMartin Matuska
368e9ed7ea4SMartin Matuska /* Write out the data we generated to a file for manual inspection. */
369e9ed7ea4SMartin Matuska assert(NULL != (f = fopen("testout", "wb")));
370e9ed7ea4SMartin Matuska assertEqualInt(used, (size_t)fwrite(buff, 1, (unsigned int)used, f));
371e9ed7ea4SMartin Matuska fclose(f);
372e9ed7ea4SMartin Matuska
373e9ed7ea4SMartin Matuska /* Write out the reference data to a file for manual inspection. */
374e9ed7ea4SMartin Matuska extract_reference_file("test_acl_pax_nfs4.tar");
375e9ed7ea4SMartin Matuska reference = slurpfile(&reference_size, "test_acl_pax_nfs4.tar");
376e9ed7ea4SMartin Matuska
377e9ed7ea4SMartin Matuska /* Assert that the generated data matches the built-in reference data.*/
378e9ed7ea4SMartin Matuska failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_nfs4.tar' reference file.");
379e9ed7ea4SMartin Matuska assertEqualMem(buff, reference, reference_size);
380e9ed7ea4SMartin Matuska failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_nfs4.tar' reference file.");
381e9ed7ea4SMartin Matuska assertEqualInt((int)used, reference_size);
382e9ed7ea4SMartin Matuska free(reference);
383e9ed7ea4SMartin Matuska
384e9ed7ea4SMartin Matuska /* Read back each entry and check that the ACL data is right. */
385e9ed7ea4SMartin Matuska assert(NULL != (a = archive_read_new()));
386e9ed7ea4SMartin Matuska assertA(0 == archive_read_support_format_all(a));
387e9ed7ea4SMartin Matuska assertA(0 == archive_read_support_filter_all(a));
388e9ed7ea4SMartin Matuska assertA(0 == archive_read_open_memory(a, buff, used));
389e9ed7ea4SMartin Matuska
390e9ed7ea4SMartin Matuska /* First item has NFS4 ACLs mirroring file mode */
391e9ed7ea4SMartin Matuska assertA(0 == archive_read_next_header(a, &ae));
392e9ed7ea4SMartin Matuska assertEqualInt(3, archive_entry_acl_reset(ae,
393e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_TYPE_ALLOW));
39464287048SMartin Matuska assertEntryCompareAcls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]),
395e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 0);
396e9ed7ea4SMartin Matuska
397e9ed7ea4SMartin Matuska /* Second item has has more fine-grained NFS4 ACLs */
398e9ed7ea4SMartin Matuska assertA(0 == archive_read_next_header(a, &ae));
399e9ed7ea4SMartin Matuska assertEqualInt(6, archive_entry_acl_reset(ae,
400e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_TYPE_NFS4));
40164287048SMartin Matuska assertEntryCompareAcls(ae, acls4, sizeof(acls4)/sizeof(acls4[0]),
402e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
403e9ed7ea4SMartin Matuska
404e9ed7ea4SMartin Matuska /* Third item has has audit and alarm NFS4 ACLs */
405e9ed7ea4SMartin Matuska assertA(0 == archive_read_next_header(a, &ae));
406e9ed7ea4SMartin Matuska assertEqualInt(6, archive_entry_acl_reset(ae,
407e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_TYPE_NFS4));
40864287048SMartin Matuska assertEntryCompareAcls(ae, acls5, sizeof(acls5)/sizeof(acls5[0]),
409e9ed7ea4SMartin Matuska ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
410e9ed7ea4SMartin Matuska
411e9ed7ea4SMartin Matuska /* Close the archive. */
412e9ed7ea4SMartin Matuska assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
413e9ed7ea4SMartin Matuska assertEqualInt(ARCHIVE_OK, archive_read_free(a));
414e9ed7ea4SMartin Matuska }
415