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