1*57718be8SEnji Cooper /* $NetBSD: pwgr.c,v 1.1 2012/03/17 16:33:14 jruoho Exp $ */ 2*57718be8SEnji Cooper /* 3*57718be8SEnji Cooper * Copyright (c) 2007 The NetBSD Foundation, Inc. 4*57718be8SEnji Cooper * All rights reserved. 5*57718be8SEnji Cooper * 6*57718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 7*57718be8SEnji Cooper * modification, are permitted provided that the following conditions 8*57718be8SEnji Cooper * are met: 9*57718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 10*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 11*57718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 12*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 13*57718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 14*57718be8SEnji Cooper * 15*57718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16*57718be8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17*57718be8SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18*57718be8SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19*57718be8SEnji Cooper * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20*57718be8SEnji Cooper * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21*57718be8SEnji Cooper * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22*57718be8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23*57718be8SEnji Cooper * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24*57718be8SEnji Cooper * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25*57718be8SEnji Cooper * POSSIBILITY OF SUCH DAMAGE. 26*57718be8SEnji Cooper */ 27*57718be8SEnji Cooper 28*57718be8SEnji Cooper /* 29*57718be8SEnji Cooper * This file implements replacements for all user/group-related functions 30*57718be8SEnji Cooper * called by id(1). It provides fake but deterministic user and group 31*57718be8SEnji Cooper * information. The details are as such: 32*57718be8SEnji Cooper * User root, uid 0, primary group 0 (wheel). 33*57718be8SEnji Cooper * User test, uid 100, primary group 100 (users), secondary group 0 (wheel). 34*57718be8SEnji Cooper */ 35*57718be8SEnji Cooper 36*57718be8SEnji Cooper #include <sys/types.h> 37*57718be8SEnji Cooper 38*57718be8SEnji Cooper #include <errno.h> 39*57718be8SEnji Cooper #include <grp.h> 40*57718be8SEnji Cooper #include <pwd.h> 41*57718be8SEnji Cooper #include <stdlib.h> 42*57718be8SEnji Cooper #include <unistd.h> 43*57718be8SEnji Cooper #include <string.h> 44*57718be8SEnji Cooper 45*57718be8SEnji Cooper char Login[16]; 46*57718be8SEnji Cooper struct group GrEntry; 47*57718be8SEnji Cooper struct passwd PwEntry; 48*57718be8SEnji Cooper 49*57718be8SEnji Cooper gid_t 50*57718be8SEnji Cooper getgid(void) 51*57718be8SEnji Cooper { 52*57718be8SEnji Cooper return 100; 53*57718be8SEnji Cooper } 54*57718be8SEnji Cooper 55*57718be8SEnji Cooper gid_t 56*57718be8SEnji Cooper getegid(void) 57*57718be8SEnji Cooper { 58*57718be8SEnji Cooper if (getenv("LIBFAKE_EGID_ROOT") != NULL) 59*57718be8SEnji Cooper return 0; 60*57718be8SEnji Cooper else 61*57718be8SEnji Cooper return 100; 62*57718be8SEnji Cooper } 63*57718be8SEnji Cooper 64*57718be8SEnji Cooper uid_t 65*57718be8SEnji Cooper getuid(void) 66*57718be8SEnji Cooper { 67*57718be8SEnji Cooper return 100; 68*57718be8SEnji Cooper } 69*57718be8SEnji Cooper 70*57718be8SEnji Cooper uid_t 71*57718be8SEnji Cooper geteuid(void) 72*57718be8SEnji Cooper { 73*57718be8SEnji Cooper if (getenv("LIBFAKE_EUID_ROOT") != NULL) 74*57718be8SEnji Cooper return 0; 75*57718be8SEnji Cooper else 76*57718be8SEnji Cooper return 100; 77*57718be8SEnji Cooper } 78*57718be8SEnji Cooper 79*57718be8SEnji Cooper char * 80*57718be8SEnji Cooper getlogin(void) 81*57718be8SEnji Cooper { 82*57718be8SEnji Cooper strcpy(Login, "test"); 83*57718be8SEnji Cooper return Login; 84*57718be8SEnji Cooper } 85*57718be8SEnji Cooper 86*57718be8SEnji Cooper struct group * 87*57718be8SEnji Cooper getgrgid(gid_t gid) 88*57718be8SEnji Cooper { 89*57718be8SEnji Cooper struct group *g = &GrEntry; 90*57718be8SEnji Cooper 91*57718be8SEnji Cooper memset(g, 0, sizeof(*g)); 92*57718be8SEnji Cooper if (gid == 0) { 93*57718be8SEnji Cooper g->gr_name = __UNCONST("wheel"); 94*57718be8SEnji Cooper g->gr_gid = 0; 95*57718be8SEnji Cooper } else if (gid == 100) { 96*57718be8SEnji Cooper g->gr_name = __UNCONST("users"); 97*57718be8SEnji Cooper g->gr_gid = 100; 98*57718be8SEnji Cooper } else 99*57718be8SEnji Cooper g = NULL; 100*57718be8SEnji Cooper 101*57718be8SEnji Cooper return g; 102*57718be8SEnji Cooper } 103*57718be8SEnji Cooper 104*57718be8SEnji Cooper int 105*57718be8SEnji Cooper getgrouplist(const char *name, gid_t basegid, gid_t *groups, int *ngroups) 106*57718be8SEnji Cooper { 107*57718be8SEnji Cooper int cnt, ret; 108*57718be8SEnji Cooper 109*57718be8SEnji Cooper if (strcmp(name, "root") == 0) { 110*57718be8SEnji Cooper if (*ngroups >= 1) { 111*57718be8SEnji Cooper groups[0] = basegid; 112*57718be8SEnji Cooper cnt = 1; 113*57718be8SEnji Cooper } 114*57718be8SEnji Cooper 115*57718be8SEnji Cooper ret = (*ngroups >= cnt) ? 0 : -1; 116*57718be8SEnji Cooper *ngroups = cnt; 117*57718be8SEnji Cooper } else if (strcmp(name, "test") == 0) { 118*57718be8SEnji Cooper if (*ngroups >= 1) { 119*57718be8SEnji Cooper groups[0] = basegid; 120*57718be8SEnji Cooper cnt = 1; 121*57718be8SEnji Cooper } 122*57718be8SEnji Cooper 123*57718be8SEnji Cooper if (*ngroups >= 2) { 124*57718be8SEnji Cooper groups[1] = 0; 125*57718be8SEnji Cooper cnt = 2; 126*57718be8SEnji Cooper } 127*57718be8SEnji Cooper 128*57718be8SEnji Cooper ret = (*ngroups >= cnt) ? 0 : -1; 129*57718be8SEnji Cooper *ngroups = cnt; 130*57718be8SEnji Cooper } else 131*57718be8SEnji Cooper ret = -1; 132*57718be8SEnji Cooper 133*57718be8SEnji Cooper return ret; 134*57718be8SEnji Cooper } 135*57718be8SEnji Cooper 136*57718be8SEnji Cooper int 137*57718be8SEnji Cooper getgroups(int gidsetlen, gid_t *gidset) 138*57718be8SEnji Cooper { 139*57718be8SEnji Cooper if (gidsetlen < 2) { 140*57718be8SEnji Cooper errno = EINVAL; 141*57718be8SEnji Cooper return -1; 142*57718be8SEnji Cooper } 143*57718be8SEnji Cooper 144*57718be8SEnji Cooper gidset[0] = 100; 145*57718be8SEnji Cooper gidset[1] = 0; 146*57718be8SEnji Cooper return 2; 147*57718be8SEnji Cooper } 148*57718be8SEnji Cooper 149*57718be8SEnji Cooper struct passwd * 150*57718be8SEnji Cooper getpwnam(const char *login) 151*57718be8SEnji Cooper { 152*57718be8SEnji Cooper struct passwd *p = &PwEntry; 153*57718be8SEnji Cooper 154*57718be8SEnji Cooper memset(p, 0, sizeof(*p)); 155*57718be8SEnji Cooper if (strcmp(login, "root") == 0) { 156*57718be8SEnji Cooper p->pw_name = __UNCONST("root"); 157*57718be8SEnji Cooper p->pw_uid = 0; 158*57718be8SEnji Cooper p->pw_gid = 0; 159*57718be8SEnji Cooper } else if (strcmp(login, "test") == 0) { 160*57718be8SEnji Cooper p->pw_name = __UNCONST("test"); 161*57718be8SEnji Cooper p->pw_uid = 100; 162*57718be8SEnji Cooper p->pw_gid = 100; 163*57718be8SEnji Cooper } else 164*57718be8SEnji Cooper p = NULL; 165*57718be8SEnji Cooper 166*57718be8SEnji Cooper return p; 167*57718be8SEnji Cooper } 168*57718be8SEnji Cooper 169*57718be8SEnji Cooper struct passwd * 170*57718be8SEnji Cooper getpwuid(uid_t uid) 171*57718be8SEnji Cooper { 172*57718be8SEnji Cooper struct passwd *p = &PwEntry; 173*57718be8SEnji Cooper 174*57718be8SEnji Cooper memset(p, 0, sizeof(*p)); 175*57718be8SEnji Cooper if (uid == 0) { 176*57718be8SEnji Cooper p->pw_name = __UNCONST("root"); 177*57718be8SEnji Cooper p->pw_uid = 0; 178*57718be8SEnji Cooper p->pw_gid = 0; 179*57718be8SEnji Cooper } else if (uid == 100) { 180*57718be8SEnji Cooper p->pw_name = __UNCONST("test"); 181*57718be8SEnji Cooper p->pw_uid = 100; 182*57718be8SEnji Cooper p->pw_gid = 100; 183*57718be8SEnji Cooper } else 184*57718be8SEnji Cooper p = NULL; 185*57718be8SEnji Cooper 186*57718be8SEnji Cooper return p; 187*57718be8SEnji Cooper } 188