2 * Copyright (c) 2003-2009 Tim Kientzle
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 __FBSDID("$FreeBSD$");
33 static int root_uids
[] = { 0 };
34 /* Solaris 9 root has gid 1 (other) */
35 static int root_gids
[] = { 0, 1 };
36 #elif defined(__CYGWIN__)
37 /* On cygwin, the Administrator user most likely exists (unless
38 * it has been renamed or is in a non-English localization), but
39 * its primary group membership depends on how the user set up
40 * their /etc/passwd. Likely values are 513 (None), 545 (Users),
41 * or 544 (Administrators). Just check for one of those...
42 * TODO: Handle non-English localizations...e.g. French 'Administrateur'
43 * Use CreateWellKnownSID() and LookupAccountName()?
45 #define ROOT "Administrator"
46 static int root_uids
[] = { 500 };
47 static int root_gids
[] = { 513, 545, 544 };
52 int_in_list(int i
, int *l
, size_t n
)
62 DEFINE_TEST(test_owner_parse
)
65 skipping("No uid/gid configuration for this OS");
69 assert(NULL
== owner_parse(ROOT
, &uid
, &gid
));
70 assert(int_in_list(uid
, root_uids
,
71 sizeof(root_uids
)/sizeof(root_uids
[0])));
72 assertEqualInt(-1, gid
);
75 assert(NULL
== owner_parse(ROOT
":", &uid
, &gid
));
76 assert(int_in_list(uid
, root_uids
,
77 sizeof(root_uids
)/sizeof(root_uids
[0])));
78 assert(int_in_list(gid
, root_gids
,
79 sizeof(root_gids
)/sizeof(root_gids
[0])));
81 assert(NULL
== owner_parse(ROOT
".", &uid
, &gid
));
82 assert(int_in_list(uid
, root_uids
,
83 sizeof(root_uids
)/sizeof(root_uids
[0])));
84 assert(int_in_list(gid
, root_gids
,
85 sizeof(root_gids
)/sizeof(root_gids
[0])));
87 assert(NULL
== owner_parse("111", &uid
, &gid
));
88 assertEqualInt(111, uid
);
89 assertEqualInt(-1, gid
);
91 assert(NULL
== owner_parse("112:", &uid
, &gid
));
92 assertEqualInt(112, uid
);
93 /* Can't assert gid, since we don't know gid for user #112. */
95 assert(NULL
== owner_parse("113.", &uid
, &gid
));
96 assertEqualInt(113, uid
);
97 /* Can't assert gid, since we don't know gid for user #113. */
99 assert(NULL
== owner_parse(":114", &uid
, &gid
));
100 assertEqualInt(-1, uid
);
101 assertEqualInt(114, gid
);
103 assert(NULL
== owner_parse(".115", &uid
, &gid
));
104 assertEqualInt(-1, uid
);
105 assertEqualInt(115, gid
);
107 assert(NULL
== owner_parse("116:117", &uid
, &gid
));
108 assertEqualInt(116, uid
);
109 assertEqualInt(117, gid
);
112 * TODO: Lookup current user/group name, build strings and
113 * use those to verify username/groupname lookups for ordinary
117 assert(NULL
!= owner_parse(":nonexistentgroup", &uid
, &gid
));
118 assert(NULL
!= owner_parse(ROOT
":nonexistentgroup", &uid
, &gid
));
120 owner_parse("nonexistentuser:nonexistentgroup", &uid
, &gid
));