usr/src/cmd/auths/auths.c
author bubbva
Wed, 26 Apr 2006 15:16:04 -0700
changeset 1891 c16c598db638
parent 0 68f95e015346
child 6059 6f4d284e50d9
permissions -rw-r--r--
6249706 rbac utilities have unused variables Contributed by Stephen Potter <[email protected]>.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1891
c16c598db638 6249706 rbac utilities have unused variables
bubbva
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
c16c598db638 6249706 rbac utilities have unused variables
bubbva
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
1891
c16c598db638 6249706 rbac utilities have unused variables
bubbva
parents: 0
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <pwd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <deflt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <libintl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <user_attr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <prof_attr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <auth_attr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#define	ALL_AUTHS	"All"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#define	ALL_SUN_AUTHS	"solaris.*"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#define	EXIT_OK		0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#define	EXIT_FATAL	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#define	EXIT_NON_FATAL	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#ifndef	TEXT_DOMAIN			/* Should be defined by cc -D */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#define	TEXT_DOMAIN	"SYS_TEST"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#define	PROFLIST_SEP	","
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#define	AUTH_SEP	","
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#define	MAXAUTHS	4096
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
static int show_auths(char *, char **, int, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
static int list_auths(userattr_t *, char **, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
static char *get_default_auths(char **, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
static void getProfiles(char *, char **, int *, char **, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
static void add_auths(char *, char **, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
static char *progname = "auths";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
main(int argc, char *argv[])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	int		status = EXIT_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	char		*defauths[MAXAUTHS];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	int		defauth_cnt = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	int		i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	(void) setlocale(LC_ALL, "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	(void) textdomain(TEXT_DOMAIN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	(void) get_default_auths(defauths, &defauth_cnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	switch (argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	case 1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
		status = show_auths(NULL, defauths, defauth_cnt, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	case 2:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
		status = show_auths(argv[argc-1], defauths, defauth_cnt, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
		while (*++argv) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
			status = show_auths(*argv, defauths, defauth_cnt, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
			if (status == EXIT_FATAL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	/* free memory allocated for default authorizations */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	for (i = 0; i < defauth_cnt; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
		free(defauths[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	status = (status == EXIT_OK) ? status : EXIT_FATAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	return (status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
show_auths(char *username, char **defauths, int defauth_cnt, int print_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	int		status = EXIT_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	struct passwd	*pw;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	userattr_t	*user;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	char		*userauths[MAXAUTHS];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	int		userauth_cnt = 0, old_userauth_cnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	int		i, j, have_allauths, duplicate;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	if (username == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		if ((pw = getpwuid(getuid())) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
			status = EXIT_NON_FATAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
			(void) fprintf(stderr, "%s: ", progname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
			(void) fprintf(stderr, gettext("No passwd entry\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
			return (status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
		username = pw->pw_name;
1891
c16c598db638 6249706 rbac utilities have unused variables
bubbva
parents: 0
diff changeset
   126
	} else if (getpwnam(username) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
		status = EXIT_NON_FATAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
		(void) fprintf(stderr, "%s: %s : ", progname, username);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
		(void) fprintf(stderr, gettext("No such user\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
		return (status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	have_allauths = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	if (username != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
		/* if ALL_AUTHS is default, don't need to look at other auths */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
		for (i = 0; i < defauth_cnt; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
			if (strcmp(defauths[i], ALL_AUTHS) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
				have_allauths = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
		if (have_allauths) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
			status = EXIT_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
		} else if ((user = getusernam(username)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
			status = list_auths(user, userauths, &userauth_cnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
			/* check if any profiles have ALL_AUTHS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
			for (i = 0; i < userauth_cnt; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
				if (strcmp(userauths[i], ALL_AUTHS) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
					have_allauths = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
		if ((defauth_cnt + userauth_cnt) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
			status = EXIT_NON_FATAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	if (status == EXIT_NON_FATAL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		(void) fprintf(stderr, "%s: %s : ", progname, username);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
		(void) fprintf(stderr, gettext("No authorizations\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
		if (print_name) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
			(void) printf("%s : ", username);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
		if (have_allauths) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
			(void) printf("%s\n", ALL_SUN_AUTHS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
			 * combine the user auths and default auths,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
			 * and eliminate duplicates from the two
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
			old_userauth_cnt = userauth_cnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
			for (i = 0; i < defauth_cnt; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
				duplicate = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
				for (j = 0; j < old_userauth_cnt; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
					if (strcmp(userauths[j], defauths[i]) ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
					    0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
						duplicate = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
						break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
				if (!duplicate) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
					userauths[userauth_cnt] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
					    strdup(defauths[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
					userauth_cnt++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
			/* print out the auths */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
			for (i = 0; i < (userauth_cnt - 1); i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
				(void) printf("%s,", userauths[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
			/* print out the last entry, without the comma */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
			(void) printf("%s\n", userauths[userauth_cnt - 1]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	/* free memory allocated for authorizations */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	for (i = 0; i < userauth_cnt; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		free(userauths[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	return (status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
list_auths(userattr_t *user, char **authArray, int *authcnt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	int		status = EXIT_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	char		*authlist = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	char		*proflist = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	char		*profArray[MAXPROFS];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	int		profcnt = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	authlist = kva_match(user->attr, USERATTR_AUTHS_KW);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	if (authlist != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
		add_auths(authlist, authArray, authcnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	if ((proflist = kva_match(user->attr, USERATTR_PROFILES_KW)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		if (authcnt == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
			status = EXIT_NON_FATAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
		getProfiles(proflist, profArray, &profcnt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
		    authArray, authcnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
		free_proflist(profArray, profcnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	if (authcnt == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
		status = EXIT_NON_FATAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	free_userattr(user);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	return (status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
get_default_auths(char **authArray, int *authcnt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	char *auths = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	char *profs = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	char *profArray[MAXPROFS];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	int profcnt = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	if (defopen(AUTH_POLICY) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
		auths = defread(DEF_AUTH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		if (auths != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
			add_auths(auths, authArray, authcnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
		/* get authorizations from default profiles */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
		profs = defread(DEF_PROF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
		if (profs != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
			getProfiles(profs, profArray, &profcnt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
			    authArray, authcnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
			free_proflist(profArray, profcnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	return (auths);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
add_auths(char *auths, char **authArray, int *authcnt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	char	*authname, *lasts, *real_authname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	int	i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	for (authname = (char *)strtok_r(auths, AUTH_SEP, &lasts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	    authname != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	    authname = (char *)strtok_r(NULL, AUTH_SEP, &lasts)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
		if ((strcmp(authname, KV_WILDCARD) == 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
		    (strcmp(authname, ALL_SUN_AUTHS) == 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
			real_authname = ALL_AUTHS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
			real_authname = authname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
		/* check to see if authorization is already in list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		for (i = 0; i < *authcnt; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
			if (strcmp(real_authname, authArray[i]) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
				break;	/* already in list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
		/* not in list, add it in */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		if (i == *authcnt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
			authArray[i] = strdup(real_authname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
			*authcnt = i + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
getProfiles(char *profiles, char **profArray, int *profcnt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	char **authArray, int *authcnt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	char		*prof;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	char		*lasts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	profattr_t	*pa;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	char		*auths;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	int		i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	for (prof = (char *)strtok_r(profiles, PROFLIST_SEP, &lasts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	    prof != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	    prof = (char *)strtok_r(NULL, PROFLIST_SEP, &lasts)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
		getproflist(prof, profArray, profcnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	/* get authorizations from list of profiles */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	for (i = 0; i < *profcnt; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
		if ((pa = getprofnam(profArray[i])) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
			 *  this should never happen.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
			 *  unless the database has an undefined profile
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		/* get auths this profile */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		auths = kva_match(pa->attr, PROFATTR_AUTHS_KW);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		if (auths != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
			add_auths(auths, authArray, authcnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
		free_profattr(pa);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
}