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