1#!/bin/bash
2# Test script for busybox id vs. coreutils id.
3# Needs root privileges for some tests.
4
5cp /usr/bin/id .
6BUSYBOX=./busybox
7ID=./id
8LIST=`awk -F: '{ printf "%s\n", $1 }' /etc/passwd`
9FLAG_USER_EXISTS="no"
10TEST_USER="f583ca884c1d93458fb61ed137ff44f6"
11
12echo "test 1: id [options] nousername"
13rm -f foo bar
14for OPTIONS in "" "-u" "-un" "-unr" "-g" "-gn" "-gnr" "-G" "-Gn" "-Gnr"
15do
16	#echo "$OPTIONS"
17	$BUSYBOX id $OPTIONS >foo 2>/dev/null
18	RET1=$?
19	$ID $OPTIONS >bar 2>/dev/null
20	RET2=$?
21	if test "$RET1" != "$RET2"; then
22		echo "Return Values differ ($RET1 != $RET2): options $OPTIONS"
23	fi
24	diff foo bar
25done
26
27echo "test 2: id [options] username"
28rm -f foo bar
29for OPTIONS in "" "-u" "-un" "-unr" "-g" "-gn" "-gnr" "-G" "-Gn" "-Gnr"
30do
31	#echo "$OPTIONS"
32	for i in $LIST ; do
33		if test "$i" = "$TEST_USER"; then
34			FLAG_USER_EXISTS="yes"
35		fi
36		$BUSYBOX id $OPTIONS $i >foo 2>/dev/null
37		RET1=$?
38		$ID $OPTIONS $i >bar 2>/dev/null
39		RET2=$?
40		if test "$RET1" != "$RET2"; then
41			echo "Return Values differ ($RET1 != $RET2): options $OPTIONS"
42		fi
43		diff foo bar
44	done
45done
46
47if test $FLAG_USER_EXISTS = "yes"; then
48	echo "test 3,4,5,6,7,8,9,10,11,12 skipped because test user $TEST_USER already exists"
49	rm -f foo bar
50	exit 1
51fi
52
53adduser -s /bin/true -g "" -H -D "$TEST_USER" || exit 1
54
55chown $TEST_USER.$TEST_USER $BUSYBOX
56chmod u+s $BUSYBOX 2>&1 /dev/null
57chown $TEST_USER.$TEST_USER $ID
58chmod u+s $ID 2>&1 /dev/null
59
60echo "test 3 setuid, existing user: id [options] no username"
61rm -f foo bar
62for OPTIONS in "" "-u" "-un" "-unr" "-g" "-gn" "-gnr" "-G" "-Gn" "-Gnr"
63do
64	#echo "$OPTIONS"
65	$BUSYBOX id $OPTIONS >foo 2>/dev/null
66	RET1=$?
67	$ID $OPTIONS >bar 2>/dev/null
68	RET2=$?
69	if test "$RET1" != "$RET2"; then
70		echo "Return Values differ ($RET1 != $RET2): options $OPTIONS"
71	fi
72	diff foo bar
73	#done
74done
75
76echo "test 4 setuid, existing user: id [options] username"
77rm -f foo bar
78for OPTIONS in "" "-u" "-un" "-unr" "-g" "-gn" "-gnr" "-G" "-Gn" "-Gnr"
79do
80	#echo "$OPTIONS"
81	for i in $LIST ; do
82		$BUSYBOX id $OPTIONS $i >foo 2>/dev/null
83		RET1=$?
84		$ID $OPTIONS $i >bar 2>/dev/null
85		RET2=$?
86		if test "$RET1" != "$RET2"; then
87			echo "Return Values differ ($RET1 != $RET2): options $OPTIONS"
88		fi
89		diff foo bar
90	done
91done
92
93chown $TEST_USER.$TEST_USER $BUSYBOX
94chmod g+s $BUSYBOX 2>&1 /dev/null
95chown $TEST_USER.$TEST_USER $ID
96chmod g+s $ID 2>&1 /dev/null
97
98echo "test 5 setgid, existing user: id [options] no username"
99rm -f foo bar
100for OPTIONS in "" "-u" "-un" "-unr" "-g" "-gn" "-gnr" "-G" "-Gn" "-Gnr"
101do
102	#echo "$OPTIONS"
103	$BUSYBOX id $OPTIONS >foo 2>/dev/null
104	RET1=$?
105	$ID $OPTIONS >bar 2>/dev/null
106	RET2=$?
107	if test "$RET1" != "$RET2"; then
108		echo "Return Values differ ($RET1 != $RET2): options $OPTIONS"
109	fi
110	diff foo bar
111	#done
112done
113
114echo "test 6 setgid, existing user: id [options] username"
115rm -f foo bar
116for OPTIONS in "" "-u" "-un" "-unr" "-g" "-gn" "-gnr" "-G" "-Gn" "-Gnr"
117do
118	#echo "$OPTIONS"
119	for i in $LIST ; do
120		$BUSYBOX id $OPTIONS $i >foo 2>/dev/null
121		RET1=$?
122		$ID $OPTIONS $i >bar 2>/dev/null
123		RET2=$?
124		if test "$RET1" != "$RET2"; then
125			echo "Return Values differ ($RET1 != $RET2): options $OPTIONS"
126		fi
127		diff foo bar
128	done
129done
130
131chown $TEST_USER.$TEST_USER $BUSYBOX
132chmod u+s,g+s $BUSYBOX 2>&1 /dev/null
133chown $TEST_USER.$TEST_USER $ID
134chmod u+s,g+s $ID 2>&1 /dev/null
135
136echo "test 7 setuid, setgid, existing user: id [options] no username"
137rm -f foo bar
138for OPTIONS in "" "-u" "-un" "-unr" "-g" "-gn" "-gnr" "-G" "-Gn" "-Gnr"
139do
140	#echo "$OPTIONS"
141	$BUSYBOX id $OPTIONS >foo 2>/dev/null
142	RET1=$?
143	$ID $OPTIONS >bar 2>/dev/null
144	RET2=$?
145	if test "$RET1" != "$RET2"; then
146		echo "Return Values differ ($RET1 != $RET2): options $OPTIONS"
147	fi
148	diff foo bar
149	#done
150done
151
152echo "test 8 setuid, setgid, existing user: id [options] username"
153rm -f foo bar
154for OPTIONS in "" "-u" "-un" "-unr" "-g" "-gn" "-gnr" "-G" "-Gn" "-Gnr"
155do
156	#echo "$OPTIONS"
157	for i in $LIST ; do
158		$BUSYBOX id $OPTIONS $i >foo 2>/dev/null
159		RET1=$?
160		$ID $OPTIONS $i >bar 2>/dev/null
161		RET2=$?
162		if test "$RET1" != "$RET2"; then
163			echo "Return Values differ ($RET1 != $RET2): options $OPTIONS"
164		fi
165		diff foo bar
166	done
167done
168
169deluser $TEST_USER || exit 1
170
171echo "test 9 setuid, setgid, not existing user: id [options] no username"
172rm -f foo bar
173for OPTIONS in "" "-u" "-un" "-unr" "-g" "-gn" "-gnr" "-G" "-Gn" "-Gnr"
174do
175	#echo "$OPTIONS"
176	$BUSYBOX id $OPTIONS >foo 2>/dev/null
177	RET1=$?
178	$ID $OPTIONS >bar 2>/dev/null
179	RET2=$?
180	if test "$RET1" != "$RET2"; then
181		echo "Return Values differ ($RET1 != $RET2): options $OPTIONS"
182	fi
183	diff foo bar
184done
185
186echo "test 10 setuid, setgid, not existing user: id [options] username"
187rm -f foo bar
188for OPTIONS in "" "-u" "-un" "-unr" "-g" "-gn" "-gnr" "-G" "-Gn" "-Gnr"
189do
190	#echo "$OPTIONS"
191	for i in $LIST ; do
192		$BUSYBOX id $OPTIONS $i >foo 2>/dev/null
193		RET1=$?
194		$ID $OPTIONS $i >bar 2>/dev/null
195		RET2=$?
196		if test "$RET1" != "$RET2"; then
197			echo "Return Values differ ($RET1 != $RET2): options $OPTIONS"
198		fi
199		diff foo bar
200	done
201done
202
203chown .root $BUSYBOX 2>&1 /dev/null
204chown .root $ID 2>&1 /dev/null
205chmod g+s $BUSYBOX 2>&1 /dev/null
206chmod g+s $ID 2>&1 /dev/null
207
208echo "test 11 setgid, not existing group: id [options] no username"
209rm -f foo bar
210for OPTIONS in "" "-u" "-un" "-unr" "-g" "-gn" "-gnr" "-G" "-Gn" "-Gnr"
211do
212	#echo "$OPTIONS"
213	$BUSYBOX id $OPTIONS >foo 2>/dev/null
214	RET1=$?
215	$ID $OPTIONS >bar 2>/dev/null
216	RET2=$?
217	if test "$RET1" != "$RET2"; then
218		echo "Return Values differ ($RET1 != $RET2): options $OPTIONS"
219	fi
220	diff foo bar
221	#done
222done
223
224echo "test 12 setgid, not existing group: id [options] username"
225rm -f foo bar
226for OPTIONS in "" "-u" "-un" "-unr" "-g" "-gn" "-gnr" "-G" "-Gn" "-Gnr"
227do
228	#echo "$OPTIONS"
229	for i in $LIST ; do
230		$BUSYBOX id $OPTIONS $i >foo 2>/dev/null
231		RET1=$?
232		$ID $OPTIONS $i >bar 2>/dev/null
233		RET2=$?
234		if test "$RET1" != "$RET2"; then
235			echo "Return Values differ ($RET1 != $RET2): options $OPTIONS"
236		fi
237		diff foo bar
238	done
239done
240
241chown root.root $BUSYBOX 2>&1 /dev/null
242chown root.root $ID 2>&1 /dev/null
243rm -f $ID
244rm -f foo bar
245