1d3bfc725SMariusz Zaborski /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 328b6f7c8SMariusz Zaborski * 4d3bfc725SMariusz Zaborski * Copyright (c) 2013 The FreeBSD Foundation 5d3bfc725SMariusz Zaborski * 6d3bfc725SMariusz Zaborski * This software was developed by Pawel Jakub Dawidek under sponsorship from 7d3bfc725SMariusz Zaborski * the FreeBSD Foundation. 8d3bfc725SMariusz Zaborski * 9d3bfc725SMariusz Zaborski * Redistribution and use in source and binary forms, with or without 10d3bfc725SMariusz Zaborski * modification, are permitted provided that the following conditions 11d3bfc725SMariusz Zaborski * are met: 12d3bfc725SMariusz Zaborski * 1. Redistributions of source code must retain the above copyright 13d3bfc725SMariusz Zaborski * notice, this list of conditions and the following disclaimer. 14d3bfc725SMariusz Zaborski * 2. Redistributions in binary form must reproduce the above copyright 15d3bfc725SMariusz Zaborski * notice, this list of conditions and the following disclaimer in the 16d3bfc725SMariusz Zaborski * documentation and/or other materials provided with the distribution. 17d3bfc725SMariusz Zaborski * 18d3bfc725SMariusz Zaborski * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 19d3bfc725SMariusz Zaborski * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20d3bfc725SMariusz Zaborski * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21d3bfc725SMariusz Zaborski * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 22d3bfc725SMariusz Zaborski * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23d3bfc725SMariusz Zaborski * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24d3bfc725SMariusz Zaborski * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25d3bfc725SMariusz Zaborski * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26d3bfc725SMariusz Zaborski * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27d3bfc725SMariusz Zaborski * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28d3bfc725SMariusz Zaborski * SUCH DAMAGE. 29d3bfc725SMariusz Zaborski */ 30d3bfc725SMariusz Zaborski 31d3bfc725SMariusz Zaborski #include <sys/capsicum.h> 32ceb36bc9SMariusz Zaborski #include <sys/nv.h> 33d3bfc725SMariusz Zaborski 34d3bfc725SMariusz Zaborski #include <assert.h> 35d3bfc725SMariusz Zaborski #include <err.h> 36d3bfc725SMariusz Zaborski #include <errno.h> 37d3bfc725SMariusz Zaborski #include <pwd.h> 38d3bfc725SMariusz Zaborski #include <stdio.h> 39d3bfc725SMariusz Zaborski #include <stdlib.h> 40d3bfc725SMariusz Zaborski #include <string.h> 41d3bfc725SMariusz Zaborski #include <unistd.h> 42d3bfc725SMariusz Zaborski 43d3bfc725SMariusz Zaborski #include <libcasper.h> 44d3bfc725SMariusz Zaborski 45d3bfc725SMariusz Zaborski #include <casper/cap_pwd.h> 46d3bfc725SMariusz Zaborski 47d3bfc725SMariusz Zaborski static int ntest = 1; 48d3bfc725SMariusz Zaborski 49d3bfc725SMariusz Zaborski #define CHECK(expr) do { \ 50d3bfc725SMariusz Zaborski if ((expr)) \ 51ebe3e93cSEnji Cooper printf("ok %d # %s:%u\n", ntest, __FILE__, __LINE__); \ 52d3bfc725SMariusz Zaborski else \ 53ebe3e93cSEnji Cooper printf("not ok %d # %s:%u\n", ntest, __FILE__, __LINE__); \ 54ebe3e93cSEnji Cooper fflush(stdout); \ 55d3bfc725SMariusz Zaborski ntest++; \ 56d3bfc725SMariusz Zaborski } while (0) 57d3bfc725SMariusz Zaborski #define CHECKX(expr) do { \ 58d3bfc725SMariusz Zaborski if ((expr)) { \ 59ebe3e93cSEnji Cooper printf("ok %d # %s:%u\n", ntest, __FILE__, __LINE__); \ 60d3bfc725SMariusz Zaborski } else { \ 61ebe3e93cSEnji Cooper printf("not ok %d # %s:%u\n", ntest, __FILE__, __LINE__); \ 62d3bfc725SMariusz Zaborski exit(1); \ 63d3bfc725SMariusz Zaborski } \ 64ebe3e93cSEnji Cooper fflush(stdout); \ 65d3bfc725SMariusz Zaborski ntest++; \ 66d3bfc725SMariusz Zaborski } while (0) 67d3bfc725SMariusz Zaborski 68d3bfc725SMariusz Zaborski #define UID_ROOT 0 69d3bfc725SMariusz Zaborski #define UID_OPERATOR 2 70d3bfc725SMariusz Zaborski 71d3bfc725SMariusz Zaborski #define GETPWENT0 0x0001 72d3bfc725SMariusz Zaborski #define GETPWENT1 0x0002 73d3bfc725SMariusz Zaborski #define GETPWENT2 0x0004 74d3bfc725SMariusz Zaborski #define GETPWENT (GETPWENT0 | GETPWENT1 | GETPWENT2) 75d3bfc725SMariusz Zaborski #define GETPWENT_R0 0x0008 76d3bfc725SMariusz Zaborski #define GETPWENT_R1 0x0010 77d3bfc725SMariusz Zaborski #define GETPWENT_R2 0x0020 78d3bfc725SMariusz Zaborski #define GETPWENT_R (GETPWENT_R0 | GETPWENT_R1 | GETPWENT_R2) 79d3bfc725SMariusz Zaborski #define GETPWNAM 0x0040 80d3bfc725SMariusz Zaborski #define GETPWNAM_R 0x0080 81d3bfc725SMariusz Zaborski #define GETPWUID 0x0100 82d3bfc725SMariusz Zaborski #define GETPWUID_R 0x0200 83d3bfc725SMariusz Zaborski 84d3bfc725SMariusz Zaborski static bool 85d3bfc725SMariusz Zaborski passwd_compare(const struct passwd *pwd0, const struct passwd *pwd1) 86d3bfc725SMariusz Zaborski { 87d3bfc725SMariusz Zaborski 88d3bfc725SMariusz Zaborski if (pwd0 == NULL && pwd1 == NULL) 89d3bfc725SMariusz Zaborski return (true); 90d3bfc725SMariusz Zaborski if (pwd0 == NULL || pwd1 == NULL) 91d3bfc725SMariusz Zaborski return (false); 92d3bfc725SMariusz Zaborski 93d3bfc725SMariusz Zaborski if (strcmp(pwd0->pw_name, pwd1->pw_name) != 0) 94d3bfc725SMariusz Zaborski return (false); 95d3bfc725SMariusz Zaborski 96d3bfc725SMariusz Zaborski if (pwd0->pw_passwd != NULL || pwd1->pw_passwd != NULL) { 97d3bfc725SMariusz Zaborski if (pwd0->pw_passwd == NULL || pwd1->pw_passwd == NULL) 98d3bfc725SMariusz Zaborski return (false); 99d3bfc725SMariusz Zaborski if (strcmp(pwd0->pw_passwd, pwd1->pw_passwd) != 0) 100d3bfc725SMariusz Zaborski return (false); 101d3bfc725SMariusz Zaborski } 102d3bfc725SMariusz Zaborski 103d3bfc725SMariusz Zaborski if (pwd0->pw_uid != pwd1->pw_uid) 104d3bfc725SMariusz Zaborski return (false); 105d3bfc725SMariusz Zaborski 106d3bfc725SMariusz Zaborski if (pwd0->pw_gid != pwd1->pw_gid) 107d3bfc725SMariusz Zaborski return (false); 108d3bfc725SMariusz Zaborski 109d3bfc725SMariusz Zaborski if (pwd0->pw_change != pwd1->pw_change) 110d3bfc725SMariusz Zaborski return (false); 111d3bfc725SMariusz Zaborski 112d3bfc725SMariusz Zaborski if (pwd0->pw_class != NULL || pwd1->pw_class != NULL) { 113d3bfc725SMariusz Zaborski if (pwd0->pw_class == NULL || pwd1->pw_class == NULL) 114d3bfc725SMariusz Zaborski return (false); 115d3bfc725SMariusz Zaborski if (strcmp(pwd0->pw_class, pwd1->pw_class) != 0) 116d3bfc725SMariusz Zaborski return (false); 117d3bfc725SMariusz Zaborski } 118d3bfc725SMariusz Zaborski 119d3bfc725SMariusz Zaborski if (pwd0->pw_gecos != NULL || pwd1->pw_gecos != NULL) { 120d3bfc725SMariusz Zaborski if (pwd0->pw_gecos == NULL || pwd1->pw_gecos == NULL) 121d3bfc725SMariusz Zaborski return (false); 122d3bfc725SMariusz Zaborski if (strcmp(pwd0->pw_gecos, pwd1->pw_gecos) != 0) 123d3bfc725SMariusz Zaborski return (false); 124d3bfc725SMariusz Zaborski } 125d3bfc725SMariusz Zaborski 126d3bfc725SMariusz Zaborski if (pwd0->pw_dir != NULL || pwd1->pw_dir != NULL) { 127d3bfc725SMariusz Zaborski if (pwd0->pw_dir == NULL || pwd1->pw_dir == NULL) 128d3bfc725SMariusz Zaborski return (false); 129d3bfc725SMariusz Zaborski if (strcmp(pwd0->pw_dir, pwd1->pw_dir) != 0) 130d3bfc725SMariusz Zaborski return (false); 131d3bfc725SMariusz Zaborski } 132d3bfc725SMariusz Zaborski 133d3bfc725SMariusz Zaborski if (pwd0->pw_shell != NULL || pwd1->pw_shell != NULL) { 134d3bfc725SMariusz Zaborski if (pwd0->pw_shell == NULL || pwd1->pw_shell == NULL) 135d3bfc725SMariusz Zaborski return (false); 136d3bfc725SMariusz Zaborski if (strcmp(pwd0->pw_shell, pwd1->pw_shell) != 0) 137d3bfc725SMariusz Zaborski return (false); 138d3bfc725SMariusz Zaborski } 139d3bfc725SMariusz Zaborski 140d3bfc725SMariusz Zaborski if (pwd0->pw_expire != pwd1->pw_expire) 141d3bfc725SMariusz Zaborski return (false); 142d3bfc725SMariusz Zaborski 143d3bfc725SMariusz Zaborski if (pwd0->pw_fields != pwd1->pw_fields) 144d3bfc725SMariusz Zaborski return (false); 145d3bfc725SMariusz Zaborski 146d3bfc725SMariusz Zaborski return (true); 147d3bfc725SMariusz Zaborski } 148d3bfc725SMariusz Zaborski 149d3bfc725SMariusz Zaborski static unsigned int 150d3bfc725SMariusz Zaborski runtest_cmds(cap_channel_t *cappwd) 151d3bfc725SMariusz Zaborski { 152d3bfc725SMariusz Zaborski char bufs[1024], bufc[1024]; 153d3bfc725SMariusz Zaborski unsigned int result; 154d3bfc725SMariusz Zaborski struct passwd *pwds, *pwdc; 155d3bfc725SMariusz Zaborski struct passwd sts, stc; 156d3bfc725SMariusz Zaborski 157d3bfc725SMariusz Zaborski result = 0; 158d3bfc725SMariusz Zaborski 159d3bfc725SMariusz Zaborski setpwent(); 160d3bfc725SMariusz Zaborski cap_setpwent(cappwd); 161d3bfc725SMariusz Zaborski 162d3bfc725SMariusz Zaborski pwds = getpwent(); 163d3bfc725SMariusz Zaborski pwdc = cap_getpwent(cappwd); 164d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) { 165d3bfc725SMariusz Zaborski result |= GETPWENT0; 166d3bfc725SMariusz Zaborski pwds = getpwent(); 167d3bfc725SMariusz Zaborski pwdc = cap_getpwent(cappwd); 168d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) 169d3bfc725SMariusz Zaborski result |= GETPWENT1; 170d3bfc725SMariusz Zaborski } 171d3bfc725SMariusz Zaborski 172d3bfc725SMariusz Zaborski getpwent_r(&sts, bufs, sizeof(bufs), &pwds); 173d3bfc725SMariusz Zaborski cap_getpwent_r(cappwd, &stc, bufc, sizeof(bufc), &pwdc); 174d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) { 175d3bfc725SMariusz Zaborski result |= GETPWENT_R0; 176d3bfc725SMariusz Zaborski getpwent_r(&sts, bufs, sizeof(bufs), &pwds); 177d3bfc725SMariusz Zaborski cap_getpwent_r(cappwd, &stc, bufc, sizeof(bufc), &pwdc); 178d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) 179d3bfc725SMariusz Zaborski result |= GETPWENT_R1; 180d3bfc725SMariusz Zaborski } 181d3bfc725SMariusz Zaborski 182d3bfc725SMariusz Zaborski setpwent(); 183d3bfc725SMariusz Zaborski cap_setpwent(cappwd); 184d3bfc725SMariusz Zaborski 185d3bfc725SMariusz Zaborski getpwent_r(&sts, bufs, sizeof(bufs), &pwds); 186d3bfc725SMariusz Zaborski cap_getpwent_r(cappwd, &stc, bufc, sizeof(bufc), &pwdc); 187d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) 188d3bfc725SMariusz Zaborski result |= GETPWENT_R2; 189d3bfc725SMariusz Zaborski 190d3bfc725SMariusz Zaborski pwds = getpwent(); 191d3bfc725SMariusz Zaborski pwdc = cap_getpwent(cappwd); 192d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) 193d3bfc725SMariusz Zaborski result |= GETPWENT2; 194d3bfc725SMariusz Zaborski 195d3bfc725SMariusz Zaborski pwds = getpwnam("root"); 196d3bfc725SMariusz Zaborski pwdc = cap_getpwnam(cappwd, "root"); 197d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) { 198d3bfc725SMariusz Zaborski pwds = getpwnam("operator"); 199d3bfc725SMariusz Zaborski pwdc = cap_getpwnam(cappwd, "operator"); 200d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) 201d3bfc725SMariusz Zaborski result |= GETPWNAM; 202d3bfc725SMariusz Zaborski } 203d3bfc725SMariusz Zaborski 204d3bfc725SMariusz Zaborski getpwnam_r("root", &sts, bufs, sizeof(bufs), &pwds); 205d3bfc725SMariusz Zaborski cap_getpwnam_r(cappwd, "root", &stc, bufc, sizeof(bufc), &pwdc); 206d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) { 207d3bfc725SMariusz Zaborski getpwnam_r("operator", &sts, bufs, sizeof(bufs), &pwds); 208d3bfc725SMariusz Zaborski cap_getpwnam_r(cappwd, "operator", &stc, bufc, sizeof(bufc), 209d3bfc725SMariusz Zaborski &pwdc); 210d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) 211d3bfc725SMariusz Zaborski result |= GETPWNAM_R; 212d3bfc725SMariusz Zaborski } 213d3bfc725SMariusz Zaborski 214d3bfc725SMariusz Zaborski pwds = getpwuid(UID_ROOT); 215d3bfc725SMariusz Zaborski pwdc = cap_getpwuid(cappwd, UID_ROOT); 216d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) { 217d3bfc725SMariusz Zaborski pwds = getpwuid(UID_OPERATOR); 218d3bfc725SMariusz Zaborski pwdc = cap_getpwuid(cappwd, UID_OPERATOR); 219d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) 220d3bfc725SMariusz Zaborski result |= GETPWUID; 221d3bfc725SMariusz Zaborski } 222d3bfc725SMariusz Zaborski 223d3bfc725SMariusz Zaborski getpwuid_r(UID_ROOT, &sts, bufs, sizeof(bufs), &pwds); 224d3bfc725SMariusz Zaborski cap_getpwuid_r(cappwd, UID_ROOT, &stc, bufc, sizeof(bufc), &pwdc); 225d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) { 226d3bfc725SMariusz Zaborski getpwuid_r(UID_OPERATOR, &sts, bufs, sizeof(bufs), &pwds); 227d3bfc725SMariusz Zaborski cap_getpwuid_r(cappwd, UID_OPERATOR, &stc, bufc, sizeof(bufc), 228d3bfc725SMariusz Zaborski &pwdc); 229d3bfc725SMariusz Zaborski if (passwd_compare(pwds, pwdc)) 230d3bfc725SMariusz Zaborski result |= GETPWUID_R; 231d3bfc725SMariusz Zaborski } 232d3bfc725SMariusz Zaborski 233d3bfc725SMariusz Zaborski return (result); 234d3bfc725SMariusz Zaborski } 235d3bfc725SMariusz Zaborski 236d3bfc725SMariusz Zaborski static void 237d3bfc725SMariusz Zaborski test_cmds(cap_channel_t *origcappwd) 238d3bfc725SMariusz Zaborski { 239d3bfc725SMariusz Zaborski cap_channel_t *cappwd; 240d3bfc725SMariusz Zaborski const char *cmds[7], *fields[10], *names[6]; 241d3bfc725SMariusz Zaborski uid_t uids[5]; 242d3bfc725SMariusz Zaborski 243d3bfc725SMariusz Zaborski fields[0] = "pw_name"; 244d3bfc725SMariusz Zaborski fields[1] = "pw_passwd"; 245d3bfc725SMariusz Zaborski fields[2] = "pw_uid"; 246d3bfc725SMariusz Zaborski fields[3] = "pw_gid"; 247d3bfc725SMariusz Zaborski fields[4] = "pw_change"; 248d3bfc725SMariusz Zaborski fields[5] = "pw_class"; 249d3bfc725SMariusz Zaborski fields[6] = "pw_gecos"; 250d3bfc725SMariusz Zaborski fields[7] = "pw_dir"; 251d3bfc725SMariusz Zaborski fields[8] = "pw_shell"; 252d3bfc725SMariusz Zaborski fields[9] = "pw_expire"; 253d3bfc725SMariusz Zaborski 254d3bfc725SMariusz Zaborski names[0] = "root"; 255d3bfc725SMariusz Zaborski names[1] = "toor"; 256d3bfc725SMariusz Zaborski names[2] = "daemon"; 257d3bfc725SMariusz Zaborski names[3] = "operator"; 258d3bfc725SMariusz Zaborski names[4] = "bin"; 259d3bfc725SMariusz Zaborski names[5] = "kmem"; 260d3bfc725SMariusz Zaborski 261d3bfc725SMariusz Zaborski uids[0] = 0; 262d3bfc725SMariusz Zaborski uids[1] = 1; 263d3bfc725SMariusz Zaborski uids[2] = 2; 264d3bfc725SMariusz Zaborski uids[3] = 3; 265d3bfc725SMariusz Zaborski uids[4] = 5; 266d3bfc725SMariusz Zaborski 267d3bfc725SMariusz Zaborski /* 268d3bfc725SMariusz Zaborski * Allow: 269d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent, getpwent_r, getpwnam, getpwnam_r, 270d3bfc725SMariusz Zaborski * getpwuid, getpwuid_r 271d3bfc725SMariusz Zaborski * users: 272d3bfc725SMariusz Zaborski * names: root, toor, daemon, operator, bin, kmem 273d3bfc725SMariusz Zaborski * uids: 274d3bfc725SMariusz Zaborski */ 275d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 276d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 277d3bfc725SMariusz Zaborski 278d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 279d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 280d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 281d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 282d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 283d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 284d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 285d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == 0); 286d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 287d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0); 288d3bfc725SMariusz Zaborski 289d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R | 290d3bfc725SMariusz Zaborski GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R)); 291d3bfc725SMariusz Zaborski 292d3bfc725SMariusz Zaborski cap_close(cappwd); 293d3bfc725SMariusz Zaborski 294d3bfc725SMariusz Zaborski /* 295d3bfc725SMariusz Zaborski * Allow: 296d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent, getpwent_r, getpwnam, getpwnam_r, 297d3bfc725SMariusz Zaborski * getpwuid, getpwuid_r 298d3bfc725SMariusz Zaborski * users: 299d3bfc725SMariusz Zaborski * names: 300d3bfc725SMariusz Zaborski * uids: 0, 1, 2, 3, 5 301d3bfc725SMariusz Zaborski */ 302d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 303d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 304d3bfc725SMariusz Zaborski 305d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 306d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 307d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 308d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 309d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 310d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 311d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 312d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == 0); 313d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 314d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0); 315d3bfc725SMariusz Zaborski 316d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R | 317d3bfc725SMariusz Zaborski GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R)); 318d3bfc725SMariusz Zaborski 319d3bfc725SMariusz Zaborski cap_close(cappwd); 320d3bfc725SMariusz Zaborski 321d3bfc725SMariusz Zaborski /* 322d3bfc725SMariusz Zaborski * Allow: 323d3bfc725SMariusz Zaborski * cmds: getpwent, getpwent_r, getpwnam, getpwnam_r, 324d3bfc725SMariusz Zaborski * getpwuid, getpwuid_r 325d3bfc725SMariusz Zaborski * users: 326d3bfc725SMariusz Zaborski * names: root, toor, daemon, operator, bin, kmem 327d3bfc725SMariusz Zaborski * uids: 328d3bfc725SMariusz Zaborski * Disallow: 329d3bfc725SMariusz Zaborski * cmds: setpwent 330d3bfc725SMariusz Zaborski * users: 331d3bfc725SMariusz Zaborski */ 332d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 333d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 334d3bfc725SMariusz Zaborski 335d3bfc725SMariusz Zaborski cap_setpwent(cappwd); 336d3bfc725SMariusz Zaborski 337d3bfc725SMariusz Zaborski cmds[0] = "getpwent"; 338d3bfc725SMariusz Zaborski cmds[1] = "getpwent_r"; 339d3bfc725SMariusz Zaborski cmds[2] = "getpwnam"; 340d3bfc725SMariusz Zaborski cmds[3] = "getpwnam_r"; 341d3bfc725SMariusz Zaborski cmds[4] = "getpwuid"; 342d3bfc725SMariusz Zaborski cmds[5] = "getpwuid_r"; 343d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 344d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 345d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 346d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 347d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 348d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 349d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 350d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 351d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 352d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 353d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 354d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 355d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0); 356d3bfc725SMariusz Zaborski 357d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT0 | GETPWENT1 | GETPWENT_R0 | 358d3bfc725SMariusz Zaborski GETPWENT_R1 | GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R)); 359d3bfc725SMariusz Zaborski 360d3bfc725SMariusz Zaborski cap_close(cappwd); 361d3bfc725SMariusz Zaborski 362d3bfc725SMariusz Zaborski /* 363d3bfc725SMariusz Zaborski * Allow: 364d3bfc725SMariusz Zaborski * cmds: getpwent, getpwent_r, getpwnam, getpwnam_r, 365d3bfc725SMariusz Zaborski * getpwuid, getpwuid_r 366d3bfc725SMariusz Zaborski * users: 367d3bfc725SMariusz Zaborski * names: 368d3bfc725SMariusz Zaborski * uids: 0, 1, 2, 3, 5 369d3bfc725SMariusz Zaborski * Disallow: 370d3bfc725SMariusz Zaborski * cmds: setpwent 371d3bfc725SMariusz Zaborski * users: 372d3bfc725SMariusz Zaborski */ 373d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 374d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 375d3bfc725SMariusz Zaborski 376d3bfc725SMariusz Zaborski cap_setpwent(cappwd); 377d3bfc725SMariusz Zaborski 378d3bfc725SMariusz Zaborski cmds[0] = "getpwent"; 379d3bfc725SMariusz Zaborski cmds[1] = "getpwent_r"; 380d3bfc725SMariusz Zaborski cmds[2] = "getpwnam"; 381d3bfc725SMariusz Zaborski cmds[3] = "getpwnam_r"; 382d3bfc725SMariusz Zaborski cmds[4] = "getpwuid"; 383d3bfc725SMariusz Zaborski cmds[5] = "getpwuid_r"; 384d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 385d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 386d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 387d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 388d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 389d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 390d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 391d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 392d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 393d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 394d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 395d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 396d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0); 397d3bfc725SMariusz Zaborski 398d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT0 | GETPWENT1 | GETPWENT_R0 | 399d3bfc725SMariusz Zaborski GETPWENT_R1 | GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R)); 400d3bfc725SMariusz Zaborski 401d3bfc725SMariusz Zaborski cap_close(cappwd); 402d3bfc725SMariusz Zaborski 403d3bfc725SMariusz Zaborski /* 404d3bfc725SMariusz Zaborski * Allow: 405d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent_r, getpwnam, getpwnam_r, 406d3bfc725SMariusz Zaborski * getpwuid, getpwuid_r 407d3bfc725SMariusz Zaborski * users: 408d3bfc725SMariusz Zaborski * names: root, toor, daemon, operator, bin, kmem 409d3bfc725SMariusz Zaborski * uids: 410d3bfc725SMariusz Zaborski * Disallow: 411d3bfc725SMariusz Zaborski * cmds: getpwent 412d3bfc725SMariusz Zaborski * users: 413d3bfc725SMariusz Zaborski */ 414d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 415d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 416d3bfc725SMariusz Zaborski 417d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 418d3bfc725SMariusz Zaborski cmds[1] = "getpwent_r"; 419d3bfc725SMariusz Zaborski cmds[2] = "getpwnam"; 420d3bfc725SMariusz Zaborski cmds[3] = "getpwnam_r"; 421d3bfc725SMariusz Zaborski cmds[4] = "getpwuid"; 422d3bfc725SMariusz Zaborski cmds[5] = "getpwuid_r"; 423d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 424d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 425d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 426d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 427d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 428d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 429d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 430d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 431d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 432d3bfc725SMariusz Zaborski cmds[0] = "getpwent"; 433d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 434d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 435d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0); 436d3bfc725SMariusz Zaborski 437d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT_R2 | 438d3bfc725SMariusz Zaborski GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R)); 439d3bfc725SMariusz Zaborski 440d3bfc725SMariusz Zaborski cap_close(cappwd); 441d3bfc725SMariusz Zaborski 442d3bfc725SMariusz Zaborski /* 443d3bfc725SMariusz Zaborski * Allow: 444d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent_r, getpwnam, getpwnam_r, 445d3bfc725SMariusz Zaborski * getpwuid, getpwuid_r 446d3bfc725SMariusz Zaborski * users: 447d3bfc725SMariusz Zaborski * names: 448d3bfc725SMariusz Zaborski * uids: 0, 1, 2, 3, 5 449d3bfc725SMariusz Zaborski * Disallow: 450d3bfc725SMariusz Zaborski * cmds: getpwent 451d3bfc725SMariusz Zaborski * users: 452d3bfc725SMariusz Zaborski */ 453d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 454d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 455d3bfc725SMariusz Zaborski 456d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 457d3bfc725SMariusz Zaborski cmds[1] = "getpwent_r"; 458d3bfc725SMariusz Zaborski cmds[2] = "getpwnam"; 459d3bfc725SMariusz Zaborski cmds[3] = "getpwnam_r"; 460d3bfc725SMariusz Zaborski cmds[4] = "getpwuid"; 461d3bfc725SMariusz Zaborski cmds[5] = "getpwuid_r"; 462d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 463d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 464d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 465d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 466d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 467d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 468d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 469d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 470d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 471d3bfc725SMariusz Zaborski cmds[0] = "getpwent"; 472d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 473d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 474d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0); 475d3bfc725SMariusz Zaborski 476d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT_R2 | 477d3bfc725SMariusz Zaborski GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R)); 478d3bfc725SMariusz Zaborski 479d3bfc725SMariusz Zaborski cap_close(cappwd); 480d3bfc725SMariusz Zaborski 481d3bfc725SMariusz Zaborski /* 482d3bfc725SMariusz Zaborski * Allow: 483d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent, getpwnam, getpwnam_r, 484d3bfc725SMariusz Zaborski * getpwuid, getpwuid_r 485d3bfc725SMariusz Zaborski * users: 486d3bfc725SMariusz Zaborski * names: root, toor, daemon, operator, bin, kmem 487d3bfc725SMariusz Zaborski * uids: 488d3bfc725SMariusz Zaborski * Disallow: 489d3bfc725SMariusz Zaborski * cmds: getpwent_r 490d3bfc725SMariusz Zaborski * users: 491d3bfc725SMariusz Zaborski */ 492d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 493d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 494d3bfc725SMariusz Zaborski 495d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 496d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 497d3bfc725SMariusz Zaborski cmds[2] = "getpwnam"; 498d3bfc725SMariusz Zaborski cmds[3] = "getpwnam_r"; 499d3bfc725SMariusz Zaborski cmds[4] = "getpwuid"; 500d3bfc725SMariusz Zaborski cmds[5] = "getpwuid_r"; 501d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 502d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 503d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 504d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 505d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 506d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 507d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 508d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 509d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 510d3bfc725SMariusz Zaborski cmds[0] = "getpwent_r"; 511d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 512d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 513d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0); 514d3bfc725SMariusz Zaborski 515d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT0 | GETPWENT1 | 516d3bfc725SMariusz Zaborski GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R)); 517d3bfc725SMariusz Zaborski 518d3bfc725SMariusz Zaborski cap_close(cappwd); 519d3bfc725SMariusz Zaborski 520d3bfc725SMariusz Zaborski /* 521d3bfc725SMariusz Zaborski * Allow: 522d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent, getpwnam, getpwnam_r, 523d3bfc725SMariusz Zaborski * getpwuid, getpwuid_r 524d3bfc725SMariusz Zaborski * users: 525d3bfc725SMariusz Zaborski * names: 526d3bfc725SMariusz Zaborski * uids: 0, 1, 2, 3, 5 527d3bfc725SMariusz Zaborski * Disallow: 528d3bfc725SMariusz Zaborski * cmds: getpwent_r 529d3bfc725SMariusz Zaborski * users: 530d3bfc725SMariusz Zaborski */ 531d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 532d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 533d3bfc725SMariusz Zaborski 534d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 535d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 536d3bfc725SMariusz Zaborski cmds[2] = "getpwnam"; 537d3bfc725SMariusz Zaborski cmds[3] = "getpwnam_r"; 538d3bfc725SMariusz Zaborski cmds[4] = "getpwuid"; 539d3bfc725SMariusz Zaborski cmds[5] = "getpwuid_r"; 540d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 541d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 542d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 543d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 544d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 545d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 546d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 547d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 548d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 549d3bfc725SMariusz Zaborski cmds[0] = "getpwent_r"; 550d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 551d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 552d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0); 553d3bfc725SMariusz Zaborski 554d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT0 | GETPWENT1 | 555d3bfc725SMariusz Zaborski GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R)); 556d3bfc725SMariusz Zaborski 557d3bfc725SMariusz Zaborski cap_close(cappwd); 558d3bfc725SMariusz Zaborski 559d3bfc725SMariusz Zaborski /* 560d3bfc725SMariusz Zaborski * Allow: 561d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent, getpwent_r, getpwnam_r, 562d3bfc725SMariusz Zaborski * getpwuid, getpwuid_r 563d3bfc725SMariusz Zaborski * users: 564d3bfc725SMariusz Zaborski * names: root, toor, daemon, operator, bin, kmem 565d3bfc725SMariusz Zaborski * uids: 566d3bfc725SMariusz Zaborski * Disallow: 567d3bfc725SMariusz Zaborski * cmds: getpwnam 568d3bfc725SMariusz Zaborski * users: 569d3bfc725SMariusz Zaborski */ 570d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 571d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 572d3bfc725SMariusz Zaborski 573d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 574d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 575d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 576d3bfc725SMariusz Zaborski cmds[3] = "getpwnam_r"; 577d3bfc725SMariusz Zaborski cmds[4] = "getpwuid"; 578d3bfc725SMariusz Zaborski cmds[5] = "getpwuid_r"; 579d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 580d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 581d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 582d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 583d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 584d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 585d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 586d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 587d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 588d3bfc725SMariusz Zaborski cmds[0] = "getpwnam"; 589d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 590d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 591d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0); 592d3bfc725SMariusz Zaborski 593d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R | 594d3bfc725SMariusz Zaborski GETPWNAM_R | GETPWUID | GETPWUID_R)); 595d3bfc725SMariusz Zaborski 596d3bfc725SMariusz Zaborski cap_close(cappwd); 597d3bfc725SMariusz Zaborski 598d3bfc725SMariusz Zaborski /* 599d3bfc725SMariusz Zaborski * Allow: 600d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent, getpwent_r, getpwnam_r, 601d3bfc725SMariusz Zaborski * getpwuid, getpwuid_r 602d3bfc725SMariusz Zaborski * users: 603d3bfc725SMariusz Zaborski * names: 604d3bfc725SMariusz Zaborski * uids: 0, 1, 2, 3, 5 605d3bfc725SMariusz Zaborski * Disallow: 606d3bfc725SMariusz Zaborski * cmds: getpwnam 607d3bfc725SMariusz Zaborski * users: 608d3bfc725SMariusz Zaborski */ 609d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 610d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 611d3bfc725SMariusz Zaborski 612d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 613d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 614d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 615d3bfc725SMariusz Zaborski cmds[3] = "getpwnam_r"; 616d3bfc725SMariusz Zaborski cmds[4] = "getpwuid"; 617d3bfc725SMariusz Zaborski cmds[5] = "getpwuid_r"; 618d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 619d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 620d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 621d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 622d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 623d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 624d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 625d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 626d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 627d3bfc725SMariusz Zaborski cmds[0] = "getpwnam"; 628d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 629d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 630d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0); 631d3bfc725SMariusz Zaborski 632d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R | 633d3bfc725SMariusz Zaborski GETPWNAM_R | GETPWUID | GETPWUID_R)); 634d3bfc725SMariusz Zaborski 635d3bfc725SMariusz Zaborski cap_close(cappwd); 636d3bfc725SMariusz Zaborski 637d3bfc725SMariusz Zaborski /* 638d3bfc725SMariusz Zaborski * Allow: 639d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent, getpwent_r, getpwnam, 640d3bfc725SMariusz Zaborski * getpwuid, getpwuid_r 641d3bfc725SMariusz Zaborski * users: 642d3bfc725SMariusz Zaborski * names: root, toor, daemon, operator, bin, kmem 643d3bfc725SMariusz Zaborski * uids: 644d3bfc725SMariusz Zaborski * Disallow: 645d3bfc725SMariusz Zaborski * cmds: getpwnam_r 646d3bfc725SMariusz Zaborski * users: 647d3bfc725SMariusz Zaborski */ 648d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 649d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 650d3bfc725SMariusz Zaborski 651d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 652d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 653d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 654d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 655d3bfc725SMariusz Zaborski cmds[4] = "getpwuid"; 656d3bfc725SMariusz Zaborski cmds[5] = "getpwuid_r"; 657d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 658d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 659d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 660d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 661d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 662d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 663d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 664d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 665d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 666d3bfc725SMariusz Zaborski cmds[0] = "getpwnam_r"; 667d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 668d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 669d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0); 670d3bfc725SMariusz Zaborski 671d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R | 672d3bfc725SMariusz Zaborski GETPWNAM | GETPWUID | GETPWUID_R)); 673d3bfc725SMariusz Zaborski 674d3bfc725SMariusz Zaborski cap_close(cappwd); 675d3bfc725SMariusz Zaborski 676d3bfc725SMariusz Zaborski /* 677d3bfc725SMariusz Zaborski * Allow: 678d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent, getpwent_r, getpwnam, 679d3bfc725SMariusz Zaborski * getpwuid, getpwuid_r 680d3bfc725SMariusz Zaborski * users: 681d3bfc725SMariusz Zaborski * names: 682d3bfc725SMariusz Zaborski * uids: 0, 1, 2, 3, 5 683d3bfc725SMariusz Zaborski * Disallow: 684d3bfc725SMariusz Zaborski * cmds: getpwnam_r 685d3bfc725SMariusz Zaborski * users: 686d3bfc725SMariusz Zaborski */ 687d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 688d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 689d3bfc725SMariusz Zaborski 690d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 691d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 692d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 693d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 694d3bfc725SMariusz Zaborski cmds[4] = "getpwuid"; 695d3bfc725SMariusz Zaborski cmds[5] = "getpwuid_r"; 696d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 697d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 698d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 699d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 700d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 701d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 702d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 703d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 704d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 705d3bfc725SMariusz Zaborski cmds[0] = "getpwnam_r"; 706d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 707d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 708d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0); 709d3bfc725SMariusz Zaborski 710d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R | 711d3bfc725SMariusz Zaborski GETPWNAM | GETPWUID | GETPWUID_R)); 712d3bfc725SMariusz Zaborski 713d3bfc725SMariusz Zaborski cap_close(cappwd); 714d3bfc725SMariusz Zaborski 715d3bfc725SMariusz Zaborski /* 716d3bfc725SMariusz Zaborski * Allow: 717d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent, getpwent_r, getpwnam, getpwnam_r, 718d3bfc725SMariusz Zaborski * getpwuid_r 719d3bfc725SMariusz Zaborski * users: 720d3bfc725SMariusz Zaborski * names: root, toor, daemon, operator, bin, kmem 721d3bfc725SMariusz Zaborski * uids: 722d3bfc725SMariusz Zaborski * Disallow: 723d3bfc725SMariusz Zaborski * cmds: getpwuid 724d3bfc725SMariusz Zaborski * users: 725d3bfc725SMariusz Zaborski */ 726d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 727d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 728d3bfc725SMariusz Zaborski 729d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 730d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 731d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 732d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 733d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 734d3bfc725SMariusz Zaborski cmds[5] = "getpwuid_r"; 735d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 736d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 737d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 738d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 739d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 740d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 741d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 742d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 743d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 744d3bfc725SMariusz Zaborski cmds[0] = "getpwuid"; 745d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 746d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 747d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0); 748d3bfc725SMariusz Zaborski 749d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R | 750d3bfc725SMariusz Zaborski GETPWNAM | GETPWNAM_R | GETPWUID_R)); 751d3bfc725SMariusz Zaborski 752d3bfc725SMariusz Zaborski cap_close(cappwd); 753d3bfc725SMariusz Zaborski 754d3bfc725SMariusz Zaborski /* 755d3bfc725SMariusz Zaborski * Allow: 756d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent, getpwent_r, getpwnam, getpwnam_r, 757d3bfc725SMariusz Zaborski * getpwuid_r 758d3bfc725SMariusz Zaborski * users: 759d3bfc725SMariusz Zaborski * names: 760d3bfc725SMariusz Zaborski * uids: 0, 1, 2, 3, 5 761d3bfc725SMariusz Zaborski * Disallow: 762d3bfc725SMariusz Zaborski * cmds: getpwuid 763d3bfc725SMariusz Zaborski * users: 764d3bfc725SMariusz Zaborski */ 765d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 766d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 767d3bfc725SMariusz Zaborski 768d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 769d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 770d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 771d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 772d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 773d3bfc725SMariusz Zaborski cmds[5] = "getpwuid_r"; 774d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 775d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 776d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 777d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 778d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 779d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 780d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 781d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 782d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 783d3bfc725SMariusz Zaborski cmds[0] = "getpwuid"; 784d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 785d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 786d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0); 787d3bfc725SMariusz Zaborski 788d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R | 789d3bfc725SMariusz Zaborski GETPWNAM | GETPWNAM_R | GETPWUID_R)); 790d3bfc725SMariusz Zaborski 791d3bfc725SMariusz Zaborski cap_close(cappwd); 792d3bfc725SMariusz Zaborski 793d3bfc725SMariusz Zaborski /* 794d3bfc725SMariusz Zaborski * Allow: 795d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent, getpwent_r, getpwnam, getpwnam_r, 796d3bfc725SMariusz Zaborski * getpwuid 797d3bfc725SMariusz Zaborski * users: 798d3bfc725SMariusz Zaborski * names: root, toor, daemon, operator, bin, kmem 799d3bfc725SMariusz Zaborski * uids: 800d3bfc725SMariusz Zaborski * Disallow: 801d3bfc725SMariusz Zaborski * cmds: getpwuid_r 802d3bfc725SMariusz Zaborski * users: 803d3bfc725SMariusz Zaborski */ 804d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 805d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 806d3bfc725SMariusz Zaborski 807d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 808d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 809d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 810d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 811d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 812d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 813d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 814d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 815d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 816d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 817d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 818d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 819d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 820d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 821d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 822d3bfc725SMariusz Zaborski cmds[0] = "getpwuid_r"; 823d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 824d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 825d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0); 826d3bfc725SMariusz Zaborski 827d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R | 828d3bfc725SMariusz Zaborski GETPWNAM | GETPWNAM_R | GETPWUID)); 829d3bfc725SMariusz Zaborski 830d3bfc725SMariusz Zaborski cap_close(cappwd); 831d3bfc725SMariusz Zaborski 832d3bfc725SMariusz Zaborski /* 833d3bfc725SMariusz Zaborski * Allow: 834d3bfc725SMariusz Zaborski * cmds: setpwent, getpwent, getpwent_r, getpwnam, getpwnam_r, 835d3bfc725SMariusz Zaborski * getpwuid 836d3bfc725SMariusz Zaborski * users: 837d3bfc725SMariusz Zaborski * names: 838d3bfc725SMariusz Zaborski * uids: 0, 1, 2, 3, 5 839d3bfc725SMariusz Zaborski * Disallow: 840d3bfc725SMariusz Zaborski * cmds: getpwuid_r 841d3bfc725SMariusz Zaborski * users: 842d3bfc725SMariusz Zaborski */ 843d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 844d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 845d3bfc725SMariusz Zaborski 846d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 847d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 848d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 849d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 850d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 851d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 852d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0); 853d3bfc725SMariusz Zaborski cmds[0] = "setpwent"; 854d3bfc725SMariusz Zaborski cmds[1] = "getpwent"; 855d3bfc725SMariusz Zaborski cmds[2] = "getpwent_r"; 856d3bfc725SMariusz Zaborski cmds[3] = "getpwnam"; 857d3bfc725SMariusz Zaborski cmds[4] = "getpwnam_r"; 858d3bfc725SMariusz Zaborski cmds[5] = "getpwuid"; 859d3bfc725SMariusz Zaborski cmds[6] = "getpwuid_r"; 860d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE); 861d3bfc725SMariusz Zaborski cmds[0] = "getpwuid_r"; 862d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE); 863d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 864d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0); 865d3bfc725SMariusz Zaborski 866d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R | 867d3bfc725SMariusz Zaborski GETPWNAM | GETPWNAM_R | GETPWUID)); 868d3bfc725SMariusz Zaborski 869d3bfc725SMariusz Zaborski cap_close(cappwd); 870d3bfc725SMariusz Zaborski } 871d3bfc725SMariusz Zaborski 872d3bfc725SMariusz Zaborski #define PW_NAME _PWF_NAME 873d3bfc725SMariusz Zaborski #define PW_PASSWD _PWF_PASSWD 874d3bfc725SMariusz Zaborski #define PW_UID _PWF_UID 875d3bfc725SMariusz Zaborski #define PW_GID _PWF_GID 876d3bfc725SMariusz Zaborski #define PW_CHANGE _PWF_CHANGE 877d3bfc725SMariusz Zaborski #define PW_CLASS _PWF_CLASS 878d3bfc725SMariusz Zaborski #define PW_GECOS _PWF_GECOS 879d3bfc725SMariusz Zaborski #define PW_DIR _PWF_DIR 880d3bfc725SMariusz Zaborski #define PW_SHELL _PWF_SHELL 881d3bfc725SMariusz Zaborski #define PW_EXPIRE _PWF_EXPIRE 882d3bfc725SMariusz Zaborski 883d3bfc725SMariusz Zaborski static unsigned int 884d3bfc725SMariusz Zaborski passwd_fields(const struct passwd *pwd) 885d3bfc725SMariusz Zaborski { 886d3bfc725SMariusz Zaborski unsigned int result; 887d3bfc725SMariusz Zaborski 888d3bfc725SMariusz Zaborski result = 0; 889d3bfc725SMariusz Zaborski 890d3bfc725SMariusz Zaborski if (pwd->pw_name != NULL && pwd->pw_name[0] != '\0') 891d3bfc725SMariusz Zaborski result |= PW_NAME; 892d3bfc725SMariusz Zaborski // else 893d3bfc725SMariusz Zaborski // printf("No pw_name\n"); 894d3bfc725SMariusz Zaborski 895d3bfc725SMariusz Zaborski if (pwd->pw_passwd != NULL && pwd->pw_passwd[0] != '\0') 896d3bfc725SMariusz Zaborski result |= PW_PASSWD; 897d3bfc725SMariusz Zaborski else if ((pwd->pw_fields & _PWF_PASSWD) != 0) 898d3bfc725SMariusz Zaborski result |= PW_PASSWD; 899d3bfc725SMariusz Zaborski // else 900d3bfc725SMariusz Zaborski // printf("No pw_passwd\n"); 901d3bfc725SMariusz Zaborski 902d3bfc725SMariusz Zaborski if (pwd->pw_uid != (uid_t)-1) 903d3bfc725SMariusz Zaborski result |= PW_UID; 904d3bfc725SMariusz Zaborski // else 905d3bfc725SMariusz Zaborski // printf("No pw_uid\n"); 906d3bfc725SMariusz Zaborski 907d3bfc725SMariusz Zaborski if (pwd->pw_gid != (gid_t)-1) 908d3bfc725SMariusz Zaborski result |= PW_GID; 909d3bfc725SMariusz Zaborski // else 910d3bfc725SMariusz Zaborski // printf("No pw_gid\n"); 911d3bfc725SMariusz Zaborski 912d3bfc725SMariusz Zaborski if (pwd->pw_change != 0 || (pwd->pw_fields & _PWF_CHANGE) != 0) 913d3bfc725SMariusz Zaborski result |= PW_CHANGE; 914d3bfc725SMariusz Zaborski // else 915d3bfc725SMariusz Zaborski // printf("No pw_change\n"); 916d3bfc725SMariusz Zaborski 917d3bfc725SMariusz Zaborski if (pwd->pw_class != NULL && pwd->pw_class[0] != '\0') 918d3bfc725SMariusz Zaborski result |= PW_CLASS; 919d3bfc725SMariusz Zaborski else if ((pwd->pw_fields & _PWF_CLASS) != 0) 920d3bfc725SMariusz Zaborski result |= PW_CLASS; 921d3bfc725SMariusz Zaborski // else 922d3bfc725SMariusz Zaborski // printf("No pw_class\n"); 923d3bfc725SMariusz Zaborski 924d3bfc725SMariusz Zaborski if (pwd->pw_gecos != NULL && pwd->pw_gecos[0] != '\0') 925d3bfc725SMariusz Zaborski result |= PW_GECOS; 926d3bfc725SMariusz Zaborski else if ((pwd->pw_fields & _PWF_GECOS) != 0) 927d3bfc725SMariusz Zaborski result |= PW_GECOS; 928d3bfc725SMariusz Zaborski // else 929d3bfc725SMariusz Zaborski // printf("No pw_gecos\n"); 930d3bfc725SMariusz Zaborski 931d3bfc725SMariusz Zaborski if (pwd->pw_dir != NULL && pwd->pw_dir[0] != '\0') 932d3bfc725SMariusz Zaborski result |= PW_DIR; 933d3bfc725SMariusz Zaborski else if ((pwd->pw_fields & _PWF_DIR) != 0) 934d3bfc725SMariusz Zaborski result |= PW_DIR; 935d3bfc725SMariusz Zaborski // else 936d3bfc725SMariusz Zaborski // printf("No pw_dir\n"); 937d3bfc725SMariusz Zaborski 938d3bfc725SMariusz Zaborski if (pwd->pw_shell != NULL && pwd->pw_shell[0] != '\0') 939d3bfc725SMariusz Zaborski result |= PW_SHELL; 940d3bfc725SMariusz Zaborski else if ((pwd->pw_fields & _PWF_SHELL) != 0) 941d3bfc725SMariusz Zaborski result |= PW_SHELL; 942d3bfc725SMariusz Zaborski // else 943d3bfc725SMariusz Zaborski // printf("No pw_shell\n"); 944d3bfc725SMariusz Zaborski 945d3bfc725SMariusz Zaborski if (pwd->pw_expire != 0 || (pwd->pw_fields & _PWF_EXPIRE) != 0) 946d3bfc725SMariusz Zaborski result |= PW_EXPIRE; 947d3bfc725SMariusz Zaborski // else 948d3bfc725SMariusz Zaborski // printf("No pw_expire\n"); 949d3bfc725SMariusz Zaborski 950d3bfc725SMariusz Zaborski if (false && pwd->pw_fields != (int)result) { 951d3bfc725SMariusz Zaborski printf("fields=0x%x != result=0x%x\n", (const unsigned int)pwd->pw_fields, result); 952d3bfc725SMariusz Zaborski printf(" fields result\n"); 953d3bfc725SMariusz Zaborski printf("PW_NAME %d %d\n", (pwd->pw_fields & PW_NAME) != 0, (result & PW_NAME) != 0); 954d3bfc725SMariusz Zaborski printf("PW_PASSWD %d %d\n", (pwd->pw_fields & PW_PASSWD) != 0, (result & PW_PASSWD) != 0); 955d3bfc725SMariusz Zaborski printf("PW_UID %d %d\n", (pwd->pw_fields & PW_UID) != 0, (result & PW_UID) != 0); 956d3bfc725SMariusz Zaborski printf("PW_GID %d %d\n", (pwd->pw_fields & PW_GID) != 0, (result & PW_GID) != 0); 957d3bfc725SMariusz Zaborski printf("PW_CHANGE %d %d\n", (pwd->pw_fields & PW_CHANGE) != 0, (result & PW_CHANGE) != 0); 958d3bfc725SMariusz Zaborski printf("PW_CLASS %d %d\n", (pwd->pw_fields & PW_CLASS) != 0, (result & PW_CLASS) != 0); 959d3bfc725SMariusz Zaborski printf("PW_GECOS %d %d\n", (pwd->pw_fields & PW_GECOS) != 0, (result & PW_GECOS) != 0); 960d3bfc725SMariusz Zaborski printf("PW_DIR %d %d\n", (pwd->pw_fields & PW_DIR) != 0, (result & PW_DIR) != 0); 961d3bfc725SMariusz Zaborski printf("PW_SHELL %d %d\n", (pwd->pw_fields & PW_SHELL) != 0, (result & PW_SHELL) != 0); 962d3bfc725SMariusz Zaborski printf("PW_EXPIRE %d %d\n", (pwd->pw_fields & PW_EXPIRE) != 0, (result & PW_EXPIRE) != 0); 963d3bfc725SMariusz Zaborski } 964d3bfc725SMariusz Zaborski 965d3bfc725SMariusz Zaborski //printf("result=0x%x\n", result); 966d3bfc725SMariusz Zaborski return (result); 967d3bfc725SMariusz Zaborski } 968d3bfc725SMariusz Zaborski 969d3bfc725SMariusz Zaborski static bool 970d3bfc725SMariusz Zaborski runtest_fields(cap_channel_t *cappwd, unsigned int expected) 971d3bfc725SMariusz Zaborski { 972d3bfc725SMariusz Zaborski char buf[1024]; 973d3bfc725SMariusz Zaborski struct passwd *pwd; 974d3bfc725SMariusz Zaborski struct passwd st; 975d3bfc725SMariusz Zaborski 976d3bfc725SMariusz Zaborski //printf("expected=0x%x\n", expected); 977d3bfc725SMariusz Zaborski cap_setpwent(cappwd); 978d3bfc725SMariusz Zaborski pwd = cap_getpwent(cappwd); 979d3bfc725SMariusz Zaborski if ((passwd_fields(pwd) & ~expected) != 0) 980d3bfc725SMariusz Zaborski return (false); 981d3bfc725SMariusz Zaborski 982d3bfc725SMariusz Zaborski cap_setpwent(cappwd); 983d3bfc725SMariusz Zaborski cap_getpwent_r(cappwd, &st, buf, sizeof(buf), &pwd); 984d3bfc725SMariusz Zaborski if ((passwd_fields(pwd) & ~expected) != 0) 985d3bfc725SMariusz Zaborski return (false); 986d3bfc725SMariusz Zaborski 987d3bfc725SMariusz Zaborski pwd = cap_getpwnam(cappwd, "root"); 988d3bfc725SMariusz Zaborski if ((passwd_fields(pwd) & ~expected) != 0) 989d3bfc725SMariusz Zaborski return (false); 990d3bfc725SMariusz Zaborski 991d3bfc725SMariusz Zaborski cap_getpwnam_r(cappwd, "root", &st, buf, sizeof(buf), &pwd); 992d3bfc725SMariusz Zaborski if ((passwd_fields(pwd) & ~expected) != 0) 993d3bfc725SMariusz Zaborski return (false); 994d3bfc725SMariusz Zaborski 995d3bfc725SMariusz Zaborski pwd = cap_getpwuid(cappwd, UID_ROOT); 996d3bfc725SMariusz Zaborski if ((passwd_fields(pwd) & ~expected) != 0) 997d3bfc725SMariusz Zaborski return (false); 998d3bfc725SMariusz Zaborski 999d3bfc725SMariusz Zaborski cap_getpwuid_r(cappwd, UID_ROOT, &st, buf, sizeof(buf), &pwd); 1000d3bfc725SMariusz Zaborski if ((passwd_fields(pwd) & ~expected) != 0) 1001d3bfc725SMariusz Zaborski return (false); 1002d3bfc725SMariusz Zaborski 1003d3bfc725SMariusz Zaborski return (true); 1004d3bfc725SMariusz Zaborski } 1005d3bfc725SMariusz Zaborski 1006d3bfc725SMariusz Zaborski static void 1007d3bfc725SMariusz Zaborski test_fields(cap_channel_t *origcappwd) 1008d3bfc725SMariusz Zaborski { 1009d3bfc725SMariusz Zaborski cap_channel_t *cappwd; 1010d3bfc725SMariusz Zaborski const char *fields[10]; 1011d3bfc725SMariusz Zaborski 1012d3bfc725SMariusz Zaborski /* No limits. */ 1013d3bfc725SMariusz Zaborski 1014d3bfc725SMariusz Zaborski CHECK(runtest_fields(origcappwd, PW_NAME | PW_PASSWD | PW_UID | 1015d3bfc725SMariusz Zaborski PW_GID | PW_CHANGE | PW_CLASS | PW_GECOS | PW_DIR | PW_SHELL | 1016d3bfc725SMariusz Zaborski PW_EXPIRE)); 1017d3bfc725SMariusz Zaborski 1018d3bfc725SMariusz Zaborski /* 1019d3bfc725SMariusz Zaborski * Allow: 1020d3bfc725SMariusz Zaborski * fields: pw_name, pw_passwd, pw_uid, pw_gid, pw_change, pw_class, 1021d3bfc725SMariusz Zaborski * pw_gecos, pw_dir, pw_shell, pw_expire 1022d3bfc725SMariusz Zaborski */ 1023d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1024d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1025d3bfc725SMariusz Zaborski 1026d3bfc725SMariusz Zaborski fields[0] = "pw_name"; 1027d3bfc725SMariusz Zaborski fields[1] = "pw_passwd"; 1028d3bfc725SMariusz Zaborski fields[2] = "pw_uid"; 1029d3bfc725SMariusz Zaborski fields[3] = "pw_gid"; 1030d3bfc725SMariusz Zaborski fields[4] = "pw_change"; 1031d3bfc725SMariusz Zaborski fields[5] = "pw_class"; 1032d3bfc725SMariusz Zaborski fields[6] = "pw_gecos"; 1033d3bfc725SMariusz Zaborski fields[7] = "pw_dir"; 1034d3bfc725SMariusz Zaborski fields[8] = "pw_shell"; 1035d3bfc725SMariusz Zaborski fields[9] = "pw_expire"; 1036d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0); 1037d3bfc725SMariusz Zaborski 1038d3bfc725SMariusz Zaborski CHECK(runtest_fields(origcappwd, PW_NAME | PW_PASSWD | PW_UID | 1039d3bfc725SMariusz Zaborski PW_GID | PW_CHANGE | PW_CLASS | PW_GECOS | PW_DIR | PW_SHELL | 1040d3bfc725SMariusz Zaborski PW_EXPIRE)); 1041d3bfc725SMariusz Zaborski 1042d3bfc725SMariusz Zaborski cap_close(cappwd); 1043d3bfc725SMariusz Zaborski 1044d3bfc725SMariusz Zaborski /* 1045d3bfc725SMariusz Zaborski * Allow: 1046d3bfc725SMariusz Zaborski * fields: pw_name, pw_passwd, pw_uid, pw_gid, pw_change 1047d3bfc725SMariusz Zaborski */ 1048d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1049d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1050d3bfc725SMariusz Zaborski 1051d3bfc725SMariusz Zaborski fields[0] = "pw_name"; 1052d3bfc725SMariusz Zaborski fields[1] = "pw_passwd"; 1053d3bfc725SMariusz Zaborski fields[2] = "pw_uid"; 1054d3bfc725SMariusz Zaborski fields[3] = "pw_gid"; 1055d3bfc725SMariusz Zaborski fields[4] = "pw_change"; 1056d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 5) == 0); 1057d3bfc725SMariusz Zaborski fields[5] = "pw_class"; 1058d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 6) == -1 && 1059d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1060d3bfc725SMariusz Zaborski fields[0] = "pw_class"; 1061d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == -1 && 1062d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1063d3bfc725SMariusz Zaborski 1064d3bfc725SMariusz Zaborski CHECK(runtest_fields(cappwd, PW_NAME | PW_PASSWD | PW_UID | 1065d3bfc725SMariusz Zaborski PW_GID | PW_CHANGE)); 1066d3bfc725SMariusz Zaborski 1067d3bfc725SMariusz Zaborski cap_close(cappwd); 1068d3bfc725SMariusz Zaborski 1069d3bfc725SMariusz Zaborski /* 1070d3bfc725SMariusz Zaborski * Allow: 1071d3bfc725SMariusz Zaborski * fields: pw_class, pw_gecos, pw_dir, pw_shell, pw_expire 1072d3bfc725SMariusz Zaborski */ 1073d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1074d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1075d3bfc725SMariusz Zaborski 1076d3bfc725SMariusz Zaborski fields[0] = "pw_class"; 1077d3bfc725SMariusz Zaborski fields[1] = "pw_gecos"; 1078d3bfc725SMariusz Zaborski fields[2] = "pw_dir"; 1079d3bfc725SMariusz Zaborski fields[3] = "pw_shell"; 1080d3bfc725SMariusz Zaborski fields[4] = "pw_expire"; 1081d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 5) == 0); 1082d3bfc725SMariusz Zaborski fields[5] = "pw_uid"; 1083d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 6) == -1 && 1084d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1085d3bfc725SMariusz Zaborski fields[0] = "pw_uid"; 1086d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == -1 && 1087d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1088d3bfc725SMariusz Zaborski 1089d3bfc725SMariusz Zaborski CHECK(runtest_fields(cappwd, PW_CLASS | PW_GECOS | PW_DIR | 1090d3bfc725SMariusz Zaborski PW_SHELL | PW_EXPIRE)); 1091d3bfc725SMariusz Zaborski 1092d3bfc725SMariusz Zaborski cap_close(cappwd); 1093d3bfc725SMariusz Zaborski 1094d3bfc725SMariusz Zaborski /* 1095d3bfc725SMariusz Zaborski * Allow: 1096d3bfc725SMariusz Zaborski * fields: pw_name, pw_uid, pw_change, pw_gecos, pw_shell 1097d3bfc725SMariusz Zaborski */ 1098d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1099d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1100d3bfc725SMariusz Zaborski 1101d3bfc725SMariusz Zaborski fields[0] = "pw_name"; 1102d3bfc725SMariusz Zaborski fields[1] = "pw_uid"; 1103d3bfc725SMariusz Zaborski fields[2] = "pw_change"; 1104d3bfc725SMariusz Zaborski fields[3] = "pw_gecos"; 1105d3bfc725SMariusz Zaborski fields[4] = "pw_shell"; 1106d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 5) == 0); 1107d3bfc725SMariusz Zaborski fields[5] = "pw_class"; 1108d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 6) == -1 && 1109d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1110d3bfc725SMariusz Zaborski fields[0] = "pw_class"; 1111d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == -1 && 1112d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1113d3bfc725SMariusz Zaborski 1114d3bfc725SMariusz Zaborski CHECK(runtest_fields(cappwd, PW_NAME | PW_UID | PW_CHANGE | 1115d3bfc725SMariusz Zaborski PW_GECOS | PW_SHELL)); 1116d3bfc725SMariusz Zaborski 1117d3bfc725SMariusz Zaborski cap_close(cappwd); 1118d3bfc725SMariusz Zaborski 1119d3bfc725SMariusz Zaborski /* 1120d3bfc725SMariusz Zaborski * Allow: 1121d3bfc725SMariusz Zaborski * fields: pw_passwd, pw_gid, pw_class, pw_dir, pw_expire 1122d3bfc725SMariusz Zaborski */ 1123d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1124d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1125d3bfc725SMariusz Zaborski 1126d3bfc725SMariusz Zaborski fields[0] = "pw_passwd"; 1127d3bfc725SMariusz Zaborski fields[1] = "pw_gid"; 1128d3bfc725SMariusz Zaborski fields[2] = "pw_class"; 1129d3bfc725SMariusz Zaborski fields[3] = "pw_dir"; 1130d3bfc725SMariusz Zaborski fields[4] = "pw_expire"; 1131d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 5) == 0); 1132d3bfc725SMariusz Zaborski fields[5] = "pw_uid"; 1133d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 6) == -1 && 1134d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1135d3bfc725SMariusz Zaborski fields[0] = "pw_uid"; 1136d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == -1 && 1137d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1138d3bfc725SMariusz Zaborski 1139d3bfc725SMariusz Zaborski CHECK(runtest_fields(cappwd, PW_PASSWD | PW_GID | PW_CLASS | 1140d3bfc725SMariusz Zaborski PW_DIR | PW_EXPIRE)); 1141d3bfc725SMariusz Zaborski 1142d3bfc725SMariusz Zaborski cap_close(cappwd); 1143d3bfc725SMariusz Zaborski 1144d3bfc725SMariusz Zaborski /* 1145d3bfc725SMariusz Zaborski * Allow: 1146d3bfc725SMariusz Zaborski * fields: pw_uid, pw_class, pw_shell 1147d3bfc725SMariusz Zaborski */ 1148d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1149d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1150d3bfc725SMariusz Zaborski 1151d3bfc725SMariusz Zaborski fields[0] = "pw_uid"; 1152d3bfc725SMariusz Zaborski fields[1] = "pw_class"; 1153d3bfc725SMariusz Zaborski fields[2] = "pw_shell"; 1154d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 3) == 0); 1155d3bfc725SMariusz Zaborski fields[3] = "pw_change"; 1156d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 4) == -1 && 1157d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1158d3bfc725SMariusz Zaborski fields[0] = "pw_change"; 1159d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == -1 && 1160d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1161d3bfc725SMariusz Zaborski 1162d3bfc725SMariusz Zaborski CHECK(runtest_fields(cappwd, PW_UID | PW_CLASS | PW_SHELL)); 1163d3bfc725SMariusz Zaborski 1164d3bfc725SMariusz Zaborski cap_close(cappwd); 1165d3bfc725SMariusz Zaborski 1166d3bfc725SMariusz Zaborski /* 1167d3bfc725SMariusz Zaborski * Allow: 1168d3bfc725SMariusz Zaborski * fields: pw_change 1169d3bfc725SMariusz Zaborski */ 1170d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1171d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1172d3bfc725SMariusz Zaborski 1173d3bfc725SMariusz Zaborski fields[0] = "pw_change"; 1174d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == 0); 1175d3bfc725SMariusz Zaborski fields[1] = "pw_uid"; 1176d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 2) == -1 && 1177d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1178d3bfc725SMariusz Zaborski fields[0] = "pw_uid"; 1179d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == -1 && 1180d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1181d3bfc725SMariusz Zaborski 1182d3bfc725SMariusz Zaborski CHECK(runtest_fields(cappwd, PW_CHANGE)); 1183d3bfc725SMariusz Zaborski 1184d3bfc725SMariusz Zaborski cap_close(cappwd); 1185d3bfc725SMariusz Zaborski } 1186d3bfc725SMariusz Zaborski 1187d3bfc725SMariusz Zaborski static bool 1188d3bfc725SMariusz Zaborski runtest_users(cap_channel_t *cappwd, const char **names, const uid_t *uids, 1189d3bfc725SMariusz Zaborski size_t nusers) 1190d3bfc725SMariusz Zaborski { 1191d3bfc725SMariusz Zaborski char buf[1024]; 1192d3bfc725SMariusz Zaborski struct passwd *pwd; 1193d3bfc725SMariusz Zaborski struct passwd st; 1194d3bfc725SMariusz Zaborski unsigned int i, got; 1195d3bfc725SMariusz Zaborski 1196d3bfc725SMariusz Zaborski cap_setpwent(cappwd); 1197d3bfc725SMariusz Zaborski got = 0; 1198d3bfc725SMariusz Zaborski for (;;) { 1199d3bfc725SMariusz Zaborski pwd = cap_getpwent(cappwd); 1200d3bfc725SMariusz Zaborski if (pwd == NULL) 1201d3bfc725SMariusz Zaborski break; 1202d3bfc725SMariusz Zaborski got++; 1203d3bfc725SMariusz Zaborski for (i = 0; i < nusers; i++) { 1204d3bfc725SMariusz Zaborski if (strcmp(names[i], pwd->pw_name) == 0 && 1205d3bfc725SMariusz Zaborski uids[i] == pwd->pw_uid) { 1206d3bfc725SMariusz Zaborski break; 1207d3bfc725SMariusz Zaborski } 1208d3bfc725SMariusz Zaborski } 1209d3bfc725SMariusz Zaborski if (i == nusers) 1210d3bfc725SMariusz Zaborski return (false); 1211d3bfc725SMariusz Zaborski } 1212d3bfc725SMariusz Zaborski if (got != nusers) 1213d3bfc725SMariusz Zaborski return (false); 1214d3bfc725SMariusz Zaborski 1215d3bfc725SMariusz Zaborski cap_setpwent(cappwd); 1216d3bfc725SMariusz Zaborski got = 0; 1217d3bfc725SMariusz Zaborski for (;;) { 1218d3bfc725SMariusz Zaborski cap_getpwent_r(cappwd, &st, buf, sizeof(buf), &pwd); 1219d3bfc725SMariusz Zaborski if (pwd == NULL) 1220d3bfc725SMariusz Zaborski break; 1221d3bfc725SMariusz Zaborski got++; 1222d3bfc725SMariusz Zaborski for (i = 0; i < nusers; i++) { 1223d3bfc725SMariusz Zaborski if (strcmp(names[i], pwd->pw_name) == 0 && 1224d3bfc725SMariusz Zaborski uids[i] == pwd->pw_uid) { 1225d3bfc725SMariusz Zaborski break; 1226d3bfc725SMariusz Zaborski } 1227d3bfc725SMariusz Zaborski } 1228d3bfc725SMariusz Zaborski if (i == nusers) 1229d3bfc725SMariusz Zaborski return (false); 1230d3bfc725SMariusz Zaborski } 1231d3bfc725SMariusz Zaborski if (got != nusers) 1232d3bfc725SMariusz Zaborski return (false); 1233d3bfc725SMariusz Zaborski 1234d3bfc725SMariusz Zaborski for (i = 0; i < nusers; i++) { 1235d3bfc725SMariusz Zaborski pwd = cap_getpwnam(cappwd, names[i]); 1236d3bfc725SMariusz Zaborski if (pwd == NULL) 1237d3bfc725SMariusz Zaborski return (false); 1238d3bfc725SMariusz Zaborski } 1239d3bfc725SMariusz Zaborski 1240d3bfc725SMariusz Zaborski for (i = 0; i < nusers; i++) { 1241d3bfc725SMariusz Zaborski cap_getpwnam_r(cappwd, names[i], &st, buf, sizeof(buf), &pwd); 1242d3bfc725SMariusz Zaborski if (pwd == NULL) 1243d3bfc725SMariusz Zaborski return (false); 1244d3bfc725SMariusz Zaborski } 1245d3bfc725SMariusz Zaborski 1246d3bfc725SMariusz Zaborski for (i = 0; i < nusers; i++) { 1247d3bfc725SMariusz Zaborski pwd = cap_getpwuid(cappwd, uids[i]); 1248d3bfc725SMariusz Zaborski if (pwd == NULL) 1249d3bfc725SMariusz Zaborski return (false); 1250d3bfc725SMariusz Zaborski } 1251d3bfc725SMariusz Zaborski 1252d3bfc725SMariusz Zaborski for (i = 0; i < nusers; i++) { 1253d3bfc725SMariusz Zaborski cap_getpwuid_r(cappwd, uids[i], &st, buf, sizeof(buf), &pwd); 1254d3bfc725SMariusz Zaborski if (pwd == NULL) 1255d3bfc725SMariusz Zaborski return (false); 1256d3bfc725SMariusz Zaborski } 1257d3bfc725SMariusz Zaborski 1258d3bfc725SMariusz Zaborski return (true); 1259d3bfc725SMariusz Zaborski } 1260d3bfc725SMariusz Zaborski 1261d3bfc725SMariusz Zaborski static void 1262d3bfc725SMariusz Zaborski test_users(cap_channel_t *origcappwd) 1263d3bfc725SMariusz Zaborski { 1264d3bfc725SMariusz Zaborski cap_channel_t *cappwd; 1265d3bfc725SMariusz Zaborski const char *names[6]; 1266d3bfc725SMariusz Zaborski uid_t uids[6]; 1267d3bfc725SMariusz Zaborski 1268d3bfc725SMariusz Zaborski /* 1269d3bfc725SMariusz Zaborski * Allow: 1270d3bfc725SMariusz Zaborski * users: 1271d3bfc725SMariusz Zaborski * names: root, toor, daemon, operator, bin, tty 1272d3bfc725SMariusz Zaborski * uids: 1273d3bfc725SMariusz Zaborski */ 1274d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1275d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1276d3bfc725SMariusz Zaborski 1277d3bfc725SMariusz Zaborski names[0] = "root"; 1278d3bfc725SMariusz Zaborski names[1] = "toor"; 1279d3bfc725SMariusz Zaborski names[2] = "daemon"; 1280d3bfc725SMariusz Zaborski names[3] = "operator"; 1281d3bfc725SMariusz Zaborski names[4] = "bin"; 1282d3bfc725SMariusz Zaborski names[5] = "tty"; 1283d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0); 1284d3bfc725SMariusz Zaborski uids[0] = 0; 1285d3bfc725SMariusz Zaborski uids[1] = 0; 1286d3bfc725SMariusz Zaborski uids[2] = 1; 1287d3bfc725SMariusz Zaborski uids[3] = 2; 1288d3bfc725SMariusz Zaborski uids[4] = 3; 1289d3bfc725SMariusz Zaborski uids[5] = 4; 1290d3bfc725SMariusz Zaborski 1291d3bfc725SMariusz Zaborski CHECK(runtest_users(cappwd, names, uids, 6)); 1292d3bfc725SMariusz Zaborski 1293d3bfc725SMariusz Zaborski cap_close(cappwd); 1294d3bfc725SMariusz Zaborski 1295d3bfc725SMariusz Zaborski /* 1296d3bfc725SMariusz Zaborski * Allow: 1297d3bfc725SMariusz Zaborski * users: 1298d3bfc725SMariusz Zaborski * names: daemon, operator, bin 1299d3bfc725SMariusz Zaborski * uids: 1300d3bfc725SMariusz Zaborski */ 1301d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1302d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1303d3bfc725SMariusz Zaborski 1304d3bfc725SMariusz Zaborski names[0] = "daemon"; 1305d3bfc725SMariusz Zaborski names[1] = "operator"; 1306d3bfc725SMariusz Zaborski names[2] = "bin"; 1307d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 3, NULL, 0) == 0); 1308d3bfc725SMariusz Zaborski names[3] = "tty"; 1309d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 4, NULL, 0) == -1 && 1310d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1311d3bfc725SMariusz Zaborski names[0] = "tty"; 1312d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 1, NULL, 0) == -1 && 1313d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1314d3bfc725SMariusz Zaborski names[0] = "daemon"; 1315d3bfc725SMariusz Zaborski uids[0] = 1; 1316d3bfc725SMariusz Zaborski uids[1] = 2; 1317d3bfc725SMariusz Zaborski uids[2] = 3; 1318d3bfc725SMariusz Zaborski 1319d3bfc725SMariusz Zaborski CHECK(runtest_users(cappwd, names, uids, 3)); 1320d3bfc725SMariusz Zaborski 1321d3bfc725SMariusz Zaborski cap_close(cappwd); 1322d3bfc725SMariusz Zaborski 1323d3bfc725SMariusz Zaborski /* 1324d3bfc725SMariusz Zaborski * Allow: 1325d3bfc725SMariusz Zaborski * users: 1326d3bfc725SMariusz Zaborski * names: daemon, bin, tty 1327d3bfc725SMariusz Zaborski * uids: 1328d3bfc725SMariusz Zaborski */ 1329d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1330d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1331d3bfc725SMariusz Zaborski 1332d3bfc725SMariusz Zaborski names[0] = "daemon"; 1333d3bfc725SMariusz Zaborski names[1] = "bin"; 1334d3bfc725SMariusz Zaborski names[2] = "tty"; 1335d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 3, NULL, 0) == 0); 1336d3bfc725SMariusz Zaborski names[3] = "operator"; 1337d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 4, NULL, 0) == -1 && 1338d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1339d3bfc725SMariusz Zaborski names[0] = "operator"; 1340d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 1, NULL, 0) == -1 && 1341d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1342d3bfc725SMariusz Zaborski names[0] = "daemon"; 1343d3bfc725SMariusz Zaborski uids[0] = 1; 1344d3bfc725SMariusz Zaborski uids[1] = 3; 1345d3bfc725SMariusz Zaborski uids[2] = 4; 1346d3bfc725SMariusz Zaborski 1347d3bfc725SMariusz Zaborski CHECK(runtest_users(cappwd, names, uids, 3)); 1348d3bfc725SMariusz Zaborski 1349d3bfc725SMariusz Zaborski cap_close(cappwd); 1350d3bfc725SMariusz Zaborski 1351d3bfc725SMariusz Zaborski /* 1352d3bfc725SMariusz Zaborski * Allow: 1353d3bfc725SMariusz Zaborski * users: 1354d3bfc725SMariusz Zaborski * names: 1355d3bfc725SMariusz Zaborski * uids: 1, 2, 3 1356d3bfc725SMariusz Zaborski */ 1357d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1358d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1359d3bfc725SMariusz Zaborski 1360d3bfc725SMariusz Zaborski names[0] = "daemon"; 1361d3bfc725SMariusz Zaborski names[1] = "operator"; 1362d3bfc725SMariusz Zaborski names[2] = "bin"; 1363d3bfc725SMariusz Zaborski uids[0] = 1; 1364d3bfc725SMariusz Zaborski uids[1] = 2; 1365d3bfc725SMariusz Zaborski uids[2] = 3; 1366d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 3) == 0); 1367d3bfc725SMariusz Zaborski uids[3] = 4; 1368d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 4) == -1 && 1369d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1370d3bfc725SMariusz Zaborski uids[0] = 4; 1371d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 1) == -1 && 1372d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1373d3bfc725SMariusz Zaborski uids[0] = 1; 1374d3bfc725SMariusz Zaborski 1375d3bfc725SMariusz Zaborski CHECK(runtest_users(cappwd, names, uids, 3)); 1376d3bfc725SMariusz Zaborski 1377d3bfc725SMariusz Zaborski cap_close(cappwd); 1378d3bfc725SMariusz Zaborski 1379d3bfc725SMariusz Zaborski /* 1380d3bfc725SMariusz Zaborski * Allow: 1381d3bfc725SMariusz Zaborski * users: 1382d3bfc725SMariusz Zaborski * names: 1383d3bfc725SMariusz Zaborski * uids: 1, 3, 4 1384d3bfc725SMariusz Zaborski */ 1385d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1386d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1387d3bfc725SMariusz Zaborski 1388d3bfc725SMariusz Zaborski names[0] = "daemon"; 1389d3bfc725SMariusz Zaborski names[1] = "bin"; 1390d3bfc725SMariusz Zaborski names[2] = "tty"; 1391d3bfc725SMariusz Zaborski uids[0] = 1; 1392d3bfc725SMariusz Zaborski uids[1] = 3; 1393d3bfc725SMariusz Zaborski uids[2] = 4; 1394d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 3) == 0); 1395d3bfc725SMariusz Zaborski uids[3] = 5; 1396d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 4) == -1 && 1397d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1398d3bfc725SMariusz Zaborski uids[0] = 5; 1399d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 1) == -1 && 1400d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1401d3bfc725SMariusz Zaborski uids[0] = 1; 1402d3bfc725SMariusz Zaborski 1403d3bfc725SMariusz Zaborski CHECK(runtest_users(cappwd, names, uids, 3)); 1404d3bfc725SMariusz Zaborski 1405d3bfc725SMariusz Zaborski cap_close(cappwd); 1406d3bfc725SMariusz Zaborski 1407d3bfc725SMariusz Zaborski /* 1408d3bfc725SMariusz Zaborski * Allow: 1409d3bfc725SMariusz Zaborski * users: 1410d3bfc725SMariusz Zaborski * names: bin 1411d3bfc725SMariusz Zaborski * uids: 1412d3bfc725SMariusz Zaborski */ 1413d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1414d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1415d3bfc725SMariusz Zaborski 1416d3bfc725SMariusz Zaborski names[0] = "bin"; 1417d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 1, NULL, 0) == 0); 1418d3bfc725SMariusz Zaborski names[1] = "operator"; 1419d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 2, NULL, 0) == -1 && 1420d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1421d3bfc725SMariusz Zaborski names[0] = "operator"; 1422d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 1, NULL, 0) == -1 && 1423d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1424d3bfc725SMariusz Zaborski names[0] = "bin"; 1425d3bfc725SMariusz Zaborski uids[0] = 3; 1426d3bfc725SMariusz Zaborski 1427d3bfc725SMariusz Zaborski CHECK(runtest_users(cappwd, names, uids, 1)); 1428d3bfc725SMariusz Zaborski 1429d3bfc725SMariusz Zaborski cap_close(cappwd); 1430d3bfc725SMariusz Zaborski 1431d3bfc725SMariusz Zaborski /* 1432d3bfc725SMariusz Zaborski * Allow: 1433d3bfc725SMariusz Zaborski * users: 1434d3bfc725SMariusz Zaborski * names: daemon, tty 1435d3bfc725SMariusz Zaborski * uids: 1436d3bfc725SMariusz Zaborski */ 1437d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1438d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1439d3bfc725SMariusz Zaborski 1440d3bfc725SMariusz Zaborski names[0] = "daemon"; 1441d3bfc725SMariusz Zaborski names[1] = "tty"; 1442d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 2, NULL, 0) == 0); 1443d3bfc725SMariusz Zaborski names[2] = "operator"; 1444d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 3, NULL, 0) == -1 && 1445d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1446d3bfc725SMariusz Zaborski names[0] = "operator"; 1447d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, names, 1, NULL, 0) == -1 && 1448d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1449d3bfc725SMariusz Zaborski names[0] = "daemon"; 1450d3bfc725SMariusz Zaborski uids[0] = 1; 1451d3bfc725SMariusz Zaborski uids[1] = 4; 1452d3bfc725SMariusz Zaborski 1453d3bfc725SMariusz Zaborski CHECK(runtest_users(cappwd, names, uids, 2)); 1454d3bfc725SMariusz Zaborski 1455d3bfc725SMariusz Zaborski cap_close(cappwd); 1456d3bfc725SMariusz Zaborski 1457d3bfc725SMariusz Zaborski /* 1458d3bfc725SMariusz Zaborski * Allow: 1459d3bfc725SMariusz Zaborski * users: 1460d3bfc725SMariusz Zaborski * names: 1461d3bfc725SMariusz Zaborski * uids: 3 1462d3bfc725SMariusz Zaborski */ 1463d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1464d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1465d3bfc725SMariusz Zaborski 1466d3bfc725SMariusz Zaborski names[0] = "bin"; 1467d3bfc725SMariusz Zaborski uids[0] = 3; 1468d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 1) == 0); 1469d3bfc725SMariusz Zaborski uids[1] = 4; 1470d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 2) == -1 && 1471d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1472d3bfc725SMariusz Zaborski uids[0] = 4; 1473d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 1) == -1 && 1474d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1475d3bfc725SMariusz Zaborski uids[0] = 3; 1476d3bfc725SMariusz Zaborski 1477d3bfc725SMariusz Zaborski CHECK(runtest_users(cappwd, names, uids, 1)); 1478d3bfc725SMariusz Zaborski 1479d3bfc725SMariusz Zaborski cap_close(cappwd); 1480d3bfc725SMariusz Zaborski 1481d3bfc725SMariusz Zaborski /* 1482d3bfc725SMariusz Zaborski * Allow: 1483d3bfc725SMariusz Zaborski * users: 1484d3bfc725SMariusz Zaborski * names: 1485d3bfc725SMariusz Zaborski * uids: 1, 4 1486d3bfc725SMariusz Zaborski */ 1487d3bfc725SMariusz Zaborski cappwd = cap_clone(origcappwd); 1488d3bfc725SMariusz Zaborski CHECK(cappwd != NULL); 1489d3bfc725SMariusz Zaborski 1490d3bfc725SMariusz Zaborski names[0] = "daemon"; 1491d3bfc725SMariusz Zaborski names[1] = "tty"; 1492d3bfc725SMariusz Zaborski uids[0] = 1; 1493d3bfc725SMariusz Zaborski uids[1] = 4; 1494d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 2) == 0); 1495d3bfc725SMariusz Zaborski uids[2] = 3; 1496d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 3) == -1 && 1497d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1498d3bfc725SMariusz Zaborski uids[0] = 3; 1499d3bfc725SMariusz Zaborski CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 1) == -1 && 1500d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1501d3bfc725SMariusz Zaborski uids[0] = 1; 1502d3bfc725SMariusz Zaborski 1503d3bfc725SMariusz Zaborski CHECK(runtest_users(cappwd, names, uids, 2)); 1504d3bfc725SMariusz Zaborski 1505d3bfc725SMariusz Zaborski cap_close(cappwd); 1506d3bfc725SMariusz Zaborski } 1507d3bfc725SMariusz Zaborski 1508d3bfc725SMariusz Zaborski int 1509d3bfc725SMariusz Zaborski main(void) 1510d3bfc725SMariusz Zaborski { 1511d3bfc725SMariusz Zaborski cap_channel_t *capcas, *cappwd; 1512d3bfc725SMariusz Zaborski 1513d3bfc725SMariusz Zaborski printf("1..188\n"); 1514ebe3e93cSEnji Cooper fflush(stdout); 1515d3bfc725SMariusz Zaborski 1516d3bfc725SMariusz Zaborski capcas = cap_init(); 1517d3bfc725SMariusz Zaborski CHECKX(capcas != NULL); 1518d3bfc725SMariusz Zaborski 1519d3bfc725SMariusz Zaborski cappwd = cap_service_open(capcas, "system.pwd"); 1520d3bfc725SMariusz Zaborski CHECKX(cappwd != NULL); 1521d3bfc725SMariusz Zaborski 1522d3bfc725SMariusz Zaborski cap_close(capcas); 1523d3bfc725SMariusz Zaborski 1524d3bfc725SMariusz Zaborski /* No limits. */ 1525d3bfc725SMariusz Zaborski 1526d3bfc725SMariusz Zaborski CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R | GETPWNAM | 1527d3bfc725SMariusz Zaborski GETPWNAM_R | GETPWUID | GETPWUID_R)); 1528d3bfc725SMariusz Zaborski 1529d3bfc725SMariusz Zaborski test_cmds(cappwd); 1530d3bfc725SMariusz Zaborski 1531d3bfc725SMariusz Zaborski test_fields(cappwd); 1532d3bfc725SMariusz Zaborski 1533d3bfc725SMariusz Zaborski test_users(cappwd); 1534d3bfc725SMariusz Zaborski 1535d3bfc725SMariusz Zaborski cap_close(cappwd); 1536d3bfc725SMariusz Zaborski 1537d3bfc725SMariusz Zaborski exit(0); 1538d3bfc725SMariusz Zaborski } 1539