1caf54c4fSMartin Matuska /*-
2*bd66c1b4SMartin Matuska * SPDX-License-Identifier: BSD-2-Clause
3*bd66c1b4SMartin Matuska *
4caf54c4fSMartin Matuska * Copyright (c) 2003-2009 Tim Kientzle
5caf54c4fSMartin Matuska * All rights reserved.
6caf54c4fSMartin Matuska */
7caf54c4fSMartin Matuska #include "test.h"
8caf54c4fSMartin Matuska
9caf54c4fSMartin Matuska #include "../cpio.h"
10caf54c4fSMartin Matuska #include "err.h"
11caf54c4fSMartin Matuska
12caf54c4fSMartin Matuska #if !defined(_WIN32)
13caf54c4fSMartin Matuska #define ROOT "root"
146c95142eSMartin Matuska static const int root_uids[] = { 0 };
156c95142eSMartin Matuska static const int root_gids[] = { 0, 1 };
16caf54c4fSMartin Matuska #elif defined(__CYGWIN__)
17caf54c4fSMartin Matuska /* On cygwin, the Administrator user most likely exists (unless
18caf54c4fSMartin Matuska * it has been renamed or is in a non-English localization), but
19caf54c4fSMartin Matuska * its primary group membership depends on how the user set up
20caf54c4fSMartin Matuska * their /etc/passwd. Likely values are 513 (None), 545 (Users),
21caf54c4fSMartin Matuska * or 544 (Administrators). Just check for one of those...
22caf54c4fSMartin Matuska * TODO: Handle non-English localizations... e.g. French 'Administrateur'
23caf54c4fSMartin Matuska * Use CreateWellKnownSID() and LookupAccountName()?
24caf54c4fSMartin Matuska */
25caf54c4fSMartin Matuska #define ROOT "Administrator"
266c95142eSMartin Matuska static const int root_uids[] = { 500 };
276c95142eSMartin Matuska static const int root_gids[] = { 513, 545, 544 };
28caf54c4fSMartin Matuska #endif
29caf54c4fSMartin Matuska
30caf54c4fSMartin Matuska #if defined(ROOT)
31caf54c4fSMartin Matuska static int
int_in_list(int i,const int * l,size_t n)326c95142eSMartin Matuska int_in_list(int i, const int *l, size_t n)
33caf54c4fSMartin Matuska {
34caf54c4fSMartin Matuska while (n-- > 0)
35caf54c4fSMartin Matuska if (*l++ == i)
36caf54c4fSMartin Matuska return (1);
37caf54c4fSMartin Matuska failure("%d", i);
38caf54c4fSMartin Matuska return (0);
39caf54c4fSMartin Matuska }
40*bd66c1b4SMartin Matuska
41*bd66c1b4SMartin Matuska static void
free_cpio_owner(struct cpio_owner * owner)42*bd66c1b4SMartin Matuska free_cpio_owner(struct cpio_owner *owner) {
43*bd66c1b4SMartin Matuska owner->uid = -1;
44*bd66c1b4SMartin Matuska owner->gid = -1;
45*bd66c1b4SMartin Matuska free(owner->uname);
46*bd66c1b4SMartin Matuska free(owner->gname);
47*bd66c1b4SMartin Matuska }
48caf54c4fSMartin Matuska #endif
49caf54c4fSMartin Matuska
DEFINE_TEST(test_owner_parse)50caf54c4fSMartin Matuska DEFINE_TEST(test_owner_parse)
51caf54c4fSMartin Matuska {
52caf54c4fSMartin Matuska #if !defined(ROOT)
53caf54c4fSMartin Matuska skipping("No uid/gid configuration for this OS");
54caf54c4fSMartin Matuska #else
55*bd66c1b4SMartin Matuska struct cpio_owner owner;
56*bd66c1b4SMartin Matuska const char *errstr;
57caf54c4fSMartin Matuska
58*bd66c1b4SMartin Matuska assert(0 == owner_parse(ROOT, &owner, &errstr));
59*bd66c1b4SMartin Matuska assert(int_in_list(owner.uid, root_uids,
60caf54c4fSMartin Matuska sizeof(root_uids)/sizeof(root_uids[0])));
61*bd66c1b4SMartin Matuska assertEqualInt(-1, owner.gid);
62*bd66c1b4SMartin Matuska free_cpio_owner(&owner);
63caf54c4fSMartin Matuska
64*bd66c1b4SMartin Matuska assert(0 == owner_parse(ROOT ":", &owner, &errstr));
65*bd66c1b4SMartin Matuska assert(int_in_list(owner.uid, root_uids,
66caf54c4fSMartin Matuska sizeof(root_uids)/sizeof(root_uids[0])));
67*bd66c1b4SMartin Matuska assert(int_in_list(owner.gid, root_gids,
68caf54c4fSMartin Matuska sizeof(root_gids)/sizeof(root_gids[0])));
69*bd66c1b4SMartin Matuska free_cpio_owner(&owner);
70caf54c4fSMartin Matuska
71*bd66c1b4SMartin Matuska assert(0 == owner_parse(ROOT ".", &owner, &errstr));
72*bd66c1b4SMartin Matuska assert(int_in_list(owner.uid, root_uids,
73caf54c4fSMartin Matuska sizeof(root_uids)/sizeof(root_uids[0])));
74*bd66c1b4SMartin Matuska assert(int_in_list(owner.gid, root_gids,
75caf54c4fSMartin Matuska sizeof(root_gids)/sizeof(root_gids[0])));
76*bd66c1b4SMartin Matuska free_cpio_owner(&owner);
77caf54c4fSMartin Matuska
78*bd66c1b4SMartin Matuska assert(0 == owner_parse("111", &owner, &errstr));
79*bd66c1b4SMartin Matuska assertEqualInt(111, owner.uid);
80*bd66c1b4SMartin Matuska assertEqualInt(-1, owner.gid);
81*bd66c1b4SMartin Matuska free_cpio_owner(&owner);
82caf54c4fSMartin Matuska
83*bd66c1b4SMartin Matuska assert(0 == owner_parse("112:", &owner, &errstr));
84*bd66c1b4SMartin Matuska assertEqualInt(112, owner.uid);
85caf54c4fSMartin Matuska /* Can't assert gid, since we don't know gid for user #112. */
86*bd66c1b4SMartin Matuska free_cpio_owner(&owner);
87caf54c4fSMartin Matuska
88*bd66c1b4SMartin Matuska assert(0 == owner_parse("113.", &owner, &errstr));
89*bd66c1b4SMartin Matuska assertEqualInt(113, owner.uid);
90caf54c4fSMartin Matuska /* Can't assert gid, since we don't know gid for user #113. */
91*bd66c1b4SMartin Matuska free_cpio_owner(&owner);
92caf54c4fSMartin Matuska
93*bd66c1b4SMartin Matuska assert(0 == owner_parse(":114", &owner, &errstr));
94*bd66c1b4SMartin Matuska assertEqualInt(-1, owner.uid);
95*bd66c1b4SMartin Matuska assertEqualInt(114, owner.gid);
96*bd66c1b4SMartin Matuska free_cpio_owner(&owner);
97caf54c4fSMartin Matuska
98*bd66c1b4SMartin Matuska assert(0 == owner_parse(".115", &owner, &errstr));
99*bd66c1b4SMartin Matuska assertEqualInt(-1, owner.uid);
100*bd66c1b4SMartin Matuska assertEqualInt(115, owner.gid);
101*bd66c1b4SMartin Matuska free_cpio_owner(&owner);
102caf54c4fSMartin Matuska
103*bd66c1b4SMartin Matuska assert(0 == owner_parse("116:117", &owner, &errstr));
104*bd66c1b4SMartin Matuska assertEqualInt(116, owner.uid);
105*bd66c1b4SMartin Matuska assertEqualInt(117, owner.gid);
106*bd66c1b4SMartin Matuska free_cpio_owner(&owner);
107caf54c4fSMartin Matuska
108caf54c4fSMartin Matuska /*
109caf54c4fSMartin Matuska * TODO: Lookup current user/group name, build strings and
110caf54c4fSMartin Matuska * use those to verify username/groupname lookups for ordinary
111caf54c4fSMartin Matuska * users.
112caf54c4fSMartin Matuska */
113caf54c4fSMartin Matuska
114*bd66c1b4SMartin Matuska errstr = NULL;
115*bd66c1b4SMartin Matuska assert(0 != owner_parse(":nonexistentgroup", &owner, &errstr));
116*bd66c1b4SMartin Matuska assertEqualString(errstr, "Couldn't lookup group ``nonexistentgroup''");
117*bd66c1b4SMartin Matuska free_cpio_owner(&owner);
118*bd66c1b4SMartin Matuska
119*bd66c1b4SMartin Matuska errstr = NULL;
120*bd66c1b4SMartin Matuska assert(0 != owner_parse(ROOT ":nonexistentgroup", &owner, &errstr));
121*bd66c1b4SMartin Matuska assertEqualString(errstr, "Couldn't lookup group ``nonexistentgroup''");
122*bd66c1b4SMartin Matuska free_cpio_owner(&owner);
123*bd66c1b4SMartin Matuska
124*bd66c1b4SMartin Matuska errstr = NULL;
125*bd66c1b4SMartin Matuska assert(0 != owner_parse("nonexistentuser:nonexistentgroup", &owner,
126*bd66c1b4SMartin Matuska &errstr));
127*bd66c1b4SMartin Matuska assertEqualString(errstr, "Couldn't lookup user ``nonexistentuser''");
128*bd66c1b4SMartin Matuska free_cpio_owner(&owner);
129caf54c4fSMartin Matuska #endif
130caf54c4fSMartin Matuska }
131