1/*
2   Unix SMB/Netbios implementation.
3   Version 1.9.
4   Security context tests
5   Copyright (C) Tim Potter 2000
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 2 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20*/
21
22#include "includes.h"
23#include "sec_ctx_utils.h"
24
25int main (int argc, char **argv)
26{
27	int ngroups, initial_ngroups, check_ngroups, final_ngroups;
28	gid_t *groups, *initial_groups, *check_groups, *final_groups;
29	int i;
30
31	init_sec_ctx();
32
33	/* Save current groups */
34
35	initial_ngroups = sys_getgroups(0, NULL);
36	initial_groups = malloc(sizeof(gid_t) * initial_ngroups);
37	sys_getgroups(initial_ngroups, initial_groups);
38
39	printf("Initial groups are: ");
40	for (i = 0; i < initial_ngroups; i++) {
41		printf("%d, ", initial_groups[i]);
42	}
43	printf("\n");
44
45	/* Push a context plus groups */
46
47	get_random_grouplist(&ngroups, &groups);
48
49	printf("Random groups are: ");
50	for (i = 0; i < ngroups; i++) {
51		printf("%d, ", groups[i]);
52	}
53	printf("\n");
54
55	if (!push_sec_ctx()) {
56		printf("FAIL: push_sec_ctx\n");
57		return 1;
58	}
59
60	set_sec_ctx(1, 2, ngroups, groups);
61
62	/* Check grouplist stuck */
63
64	check_ngroups = sys_getgroups(0, NULL);
65	check_groups = malloc(sizeof(gid_t) * check_ngroups);
66	sys_getgroups(check_ngroups, check_groups);
67
68	printf("Actual groups are: ");
69	for (i = 0; i < check_ngroups; i++) {
70		printf("%d, ", check_groups[i]);
71	}
72	printf("\n");
73
74	if (ngroups != check_ngroups) {
75		printf("FAIL: number of groups differs\n");
76		return 1;
77	}
78
79	for (i = 0; i < ngroups; i++) {
80		if (groups[i] != check_groups[i]) {
81			printf("FAIL: group %d differs\n", i);
82			return 1;
83		}
84	}
85
86	safe_free(groups);
87	safe_free(check_groups);
88
89	/* Pop and check initial groups are back */
90
91	if (!pop_sec_ctx()) {
92		printf("FAIL: pop_sec_ctx\n");
93		return 1;
94	}
95
96	final_ngroups = sys_getgroups(0, NULL);
97	final_groups = malloc(sizeof(gid_t) * final_ngroups);
98	sys_getgroups(final_ngroups, final_groups);
99
100	printf("Final groups are: ");
101	for (i = 0; i < final_ngroups; i++) {
102		printf("%d, ", final_groups[i]);
103	}
104	printf("\n");
105
106	if (initial_ngroups != final_ngroups) {
107		printf("FAIL: final number of groups differ\n");
108		return 1;
109	}
110
111	for (i = 0; i < initial_ngroups; i++) {
112		if (initial_groups[i] != final_groups[i]) {
113			printf("FAIL: final group %d differs\n", i);
114			return 1;
115		}
116	}
117
118	printf("Final groups are: ");
119	for (i = 0; i < final_ngroups; i++) {
120		printf("%d, ", final_groups[i]);
121	}
122	printf("\n");
123
124	safe_free(initial_groups);
125	safe_free(final_groups);
126
127	/* Everything's cool */
128
129	printf("PASS\n");
130	return 0;
131}
132