10Sstevel@tonic-gate /*
2*12492SZdenek.Kotala@Sun.COM * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
30Sstevel@tonic-gate */
40Sstevel@tonic-gate
50Sstevel@tonic-gate
60Sstevel@tonic-gate /*
70Sstevel@tonic-gate * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
80Sstevel@tonic-gate *
90Sstevel@tonic-gate * Openvision retains the copyright to derivative works of
100Sstevel@tonic-gate * this source code. Do *NOT* create a derivative of this
110Sstevel@tonic-gate * source code before consulting with your legal department.
120Sstevel@tonic-gate * Do *NOT* integrate *ANY* of this source code into another
130Sstevel@tonic-gate * product before consulting with your legal department.
140Sstevel@tonic-gate *
150Sstevel@tonic-gate * For further information, read the top-level Openvision
160Sstevel@tonic-gate * copyright which is contained in the top-level MIT Kerberos
170Sstevel@tonic-gate * copyright.
180Sstevel@tonic-gate *
190Sstevel@tonic-gate * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
200Sstevel@tonic-gate *
210Sstevel@tonic-gate */
220Sstevel@tonic-gate
230Sstevel@tonic-gate
240Sstevel@tonic-gate /*
250Sstevel@tonic-gate * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved
260Sstevel@tonic-gate *
270Sstevel@tonic-gate */
280Sstevel@tonic-gate
297934SMark.Phalan@Sun.COM #include <kadm5/admin.h>
300Sstevel@tonic-gate #include <gssapi/gssapi.h>
310Sstevel@tonic-gate #include <gssapi_krb5.h> /* for gss_nt_krb5_name */
320Sstevel@tonic-gate #include <kadm5/kadm_rpc.h>
330Sstevel@tonic-gate #include <kadm5/server_internal.h>
340Sstevel@tonic-gate #include <kadm5/srv/server_acl.h>
350Sstevel@tonic-gate #include <security/pam_appl.h>
360Sstevel@tonic-gate
370Sstevel@tonic-gate #include <syslog.h>
382881Smp153739 #include <arpa/inet.h> /* inet_ntoa */
392881Smp153739 #include <krb5/adm_proto.h> /* krb5_klog_syslog */
400Sstevel@tonic-gate #include <libintl.h>
417934SMark.Phalan@Sun.COM #include <krb5.h>
420Sstevel@tonic-gate #include "misc.h"
430Sstevel@tonic-gate
442881Smp153739 #define LOG_UNAUTH gettext("Unauthorized request: %s, %s, " \
450Sstevel@tonic-gate "client=%s, service=%s, addr=%s")
462881Smp153739 #define LOG_DONE gettext("Request: %s, %s, %s, client=%s, " \
470Sstevel@tonic-gate "service=%s, addr=%s")
480Sstevel@tonic-gate
492881Smp153739 extern gss_name_t gss_changepw_name;
502881Smp153739 extern gss_name_t gss_oldchangepw_name;
512881Smp153739 extern void * global_server_handle;
520Sstevel@tonic-gate extern short l_port;
530Sstevel@tonic-gate
540Sstevel@tonic-gate char buf[33];
550Sstevel@tonic-gate
562881Smp153739 #define CHANGEPW_SERVICE(rqstp) \
570Sstevel@tonic-gate (cmp_gss_names_rel_1(acceptor_name(rqstp), gss_changepw_name) |\
582881Smp153739 (gss_oldchangepw_name && \
592881Smp153739 cmp_gss_names_rel_1(acceptor_name(rqstp), \
600Sstevel@tonic-gate gss_oldchangepw_name)))
610Sstevel@tonic-gate
622881Smp153739
632881Smp153739 static int gss_to_krb5_name(kadm5_server_handle_t handle,
642881Smp153739 gss_name_t gss_name, krb5_principal *princ);
652881Smp153739
662881Smp153739 static int gss_name_to_string(gss_name_t gss_name, gss_buffer_desc *str);
672881Smp153739
682881Smp153739 static gss_name_t acceptor_name(struct svc_req * rqstp);
692881Smp153739
700Sstevel@tonic-gate kadm5_ret_t
710Sstevel@tonic-gate kadm5_get_priv(void *server_handle,
720Sstevel@tonic-gate long *privs, gss_name_t clnt);
730Sstevel@tonic-gate
740Sstevel@tonic-gate gss_name_t
get_clnt_name(struct svc_req * rqstp)750Sstevel@tonic-gate get_clnt_name(struct svc_req * rqstp)
760Sstevel@tonic-gate {
770Sstevel@tonic-gate OM_uint32 maj_stat, min_stat;
780Sstevel@tonic-gate gss_name_t name;
790Sstevel@tonic-gate rpc_gss_rawcred_t *raw_cred;
800Sstevel@tonic-gate void *cookie;
810Sstevel@tonic-gate gss_buffer_desc name_buff;
820Sstevel@tonic-gate
830Sstevel@tonic-gate rpc_gss_getcred(rqstp, &raw_cred, NULL, &cookie);
840Sstevel@tonic-gate name_buff.value = raw_cred->client_principal->name;
850Sstevel@tonic-gate name_buff.length = raw_cred->client_principal->len;
860Sstevel@tonic-gate maj_stat = gss_import_name(&min_stat, &name_buff,
870Sstevel@tonic-gate (gss_OID) GSS_C_NT_EXPORT_NAME, &name);
880Sstevel@tonic-gate if (maj_stat != GSS_S_COMPLETE) {
890Sstevel@tonic-gate return (NULL);
900Sstevel@tonic-gate }
910Sstevel@tonic-gate return (name);
920Sstevel@tonic-gate }
930Sstevel@tonic-gate
940Sstevel@tonic-gate char *
client_addr(struct svc_req * req,char * buf)950Sstevel@tonic-gate client_addr(struct svc_req * req, char *buf)
960Sstevel@tonic-gate {
970Sstevel@tonic-gate struct sockaddr *ca;
980Sstevel@tonic-gate u_char *b;
990Sstevel@tonic-gate char *frontspace = " ";
1000Sstevel@tonic-gate
1010Sstevel@tonic-gate /*
1020Sstevel@tonic-gate * Convert the caller's IP address to a dotted string
1030Sstevel@tonic-gate */
1040Sstevel@tonic-gate ca = (struct sockaddr *)
1050Sstevel@tonic-gate svc_getrpccaller(req->rq_xprt)->buf;
1060Sstevel@tonic-gate
1070Sstevel@tonic-gate if (ca->sa_family == AF_INET) {
1080Sstevel@tonic-gate b = (u_char *) & ((struct sockaddr_in *) ca)->sin_addr;
1090Sstevel@tonic-gate (void) sprintf(buf, "%s(%d.%d.%d.%d) ", frontspace,
1100Sstevel@tonic-gate b[0] & 0xFF, b[1] & 0xFF, b[2] & 0xFF, b[3] & 0xFF);
1110Sstevel@tonic-gate } else {
1120Sstevel@tonic-gate /*
1130Sstevel@tonic-gate * No IP address to print. If there was a host name
1140Sstevel@tonic-gate * printed, then we print a space.
1150Sstevel@tonic-gate */
1160Sstevel@tonic-gate (void) sprintf(buf, frontspace);
1170Sstevel@tonic-gate }
1180Sstevel@tonic-gate
1190Sstevel@tonic-gate return (buf);
1200Sstevel@tonic-gate }
1210Sstevel@tonic-gate
cmp_gss_names(gss_name_t n1,gss_name_t n2)1222881Smp153739 static int cmp_gss_names(gss_name_t n1, gss_name_t n2)
1230Sstevel@tonic-gate {
1242881Smp153739 OM_uint32 emaj, emin;
1252881Smp153739 int equal;
1260Sstevel@tonic-gate
1272881Smp153739 if (GSS_ERROR(emaj = gss_compare_name(&emin, n1, n2, &equal)))
1282881Smp153739 return(0);
1290Sstevel@tonic-gate
1302881Smp153739 return(equal);
1310Sstevel@tonic-gate }
1320Sstevel@tonic-gate
1330Sstevel@tonic-gate /* Does a comparison of the names and then releases the first entity */
1340Sstevel@tonic-gate /* For use above in CHANGEPW_SERVICE */
cmp_gss_names_rel_1(gss_name_t n1,gss_name_t n2)1352881Smp153739 static int cmp_gss_names_rel_1(gss_name_t n1, gss_name_t n2)
1360Sstevel@tonic-gate {
1370Sstevel@tonic-gate OM_uint32 min_stat;
1380Sstevel@tonic-gate int ret;
1392881Smp153739
1402881Smp153739 ret = cmp_gss_names(n1, n2);
1410Sstevel@tonic-gate if (n1) (void) gss_release_name(&min_stat, &n1);
1420Sstevel@tonic-gate return ret;
1430Sstevel@tonic-gate }
1440Sstevel@tonic-gate
1450Sstevel@tonic-gate /*
1460Sstevel@tonic-gate * Function check_handle
1470Sstevel@tonic-gate *
1480Sstevel@tonic-gate * Purpose: Check a server handle and return a com_err code if it is
1490Sstevel@tonic-gate * invalid or 0 if it is valid.
1500Sstevel@tonic-gate *
1510Sstevel@tonic-gate * Arguments:
1520Sstevel@tonic-gate *
1530Sstevel@tonic-gate * handle The server handle.
1540Sstevel@tonic-gate */
1550Sstevel@tonic-gate
check_handle(void * handle)1562881Smp153739 static int check_handle(void *handle)
1570Sstevel@tonic-gate {
1582881Smp153739 CHECK_HANDLE(handle);
1592881Smp153739 return 0;
1600Sstevel@tonic-gate }
1610Sstevel@tonic-gate
1620Sstevel@tonic-gate /*
1630Sstevel@tonic-gate * Function: new_server_handle
1640Sstevel@tonic-gate *
1650Sstevel@tonic-gate * Purpose: Constructs a server handle suitable for passing into the
1660Sstevel@tonic-gate * server library API functions, by folding the client's API version
1670Sstevel@tonic-gate * and calling principal into the server handle returned by
1680Sstevel@tonic-gate * kadm5_init.
1690Sstevel@tonic-gate *
1700Sstevel@tonic-gate * Arguments:
1710Sstevel@tonic-gate * api_version (input) The API version specified by the client
1720Sstevel@tonic-gate * rqstp (input) The RPC request
1730Sstevel@tonic-gate * handle (output) The returned handle
1740Sstevel@tonic-gate * <return value> (output) An error code, or 0 if no error occurred
1752881Smp153739 *
1760Sstevel@tonic-gate * Effects:
1770Sstevel@tonic-gate * Returns a pointer to allocated storage containing the server
1780Sstevel@tonic-gate * handle. If an error occurs, then no allocated storage is
1790Sstevel@tonic-gate * returned, and the return value of the function will be a
1800Sstevel@tonic-gate * non-zero com_err code.
1812881Smp153739 *
1820Sstevel@tonic-gate * The allocated storage for the handle should be freed with
1830Sstevel@tonic-gate * free_server_handle (see below) when it is no longer needed.
1840Sstevel@tonic-gate */
1850Sstevel@tonic-gate
new_server_handle(krb5_ui_4 api_version,struct svc_req * rqstp,kadm5_server_handle_t * out_handle)1862881Smp153739 static kadm5_ret_t new_server_handle(krb5_ui_4 api_version,
1872881Smp153739 struct svc_req *rqstp,
1882881Smp153739 kadm5_server_handle_t
1892881Smp153739 *out_handle)
1900Sstevel@tonic-gate {
1912881Smp153739 kadm5_server_handle_t handle;
1920Sstevel@tonic-gate gss_name_t name;
1930Sstevel@tonic-gate OM_uint32 min_stat;
1940Sstevel@tonic-gate
1952881Smp153739 if (! (handle = (kadm5_server_handle_t)
1962881Smp153739 malloc(sizeof(*handle))))
1972881Smp153739 return ENOMEM;
1980Sstevel@tonic-gate
1992881Smp153739 *handle = *(kadm5_server_handle_t)global_server_handle;
2002881Smp153739 handle->api_version = api_version;
2010Sstevel@tonic-gate
2022881Smp153739 if (!(name = get_clnt_name(rqstp))) {
2032881Smp153739 free(handle);
2042881Smp153739 return KADM5_FAILURE;
2052881Smp153739 }
2062881Smp153739 if (! gss_to_krb5_name(handle, name, &handle->current_caller)) {
2072881Smp153739 free(handle);
2080Sstevel@tonic-gate gss_release_name(&min_stat, &name);
2092881Smp153739 return KADM5_FAILURE;
2100Sstevel@tonic-gate }
2110Sstevel@tonic-gate gss_release_name(&min_stat, &name);
2120Sstevel@tonic-gate
2132881Smp153739 *out_handle = handle;
2142881Smp153739 return 0;
2150Sstevel@tonic-gate }
2160Sstevel@tonic-gate
2170Sstevel@tonic-gate /*
2180Sstevel@tonic-gate * Function: free_server_handle
2190Sstevel@tonic-gate *
2200Sstevel@tonic-gate * Purpose: Free handle memory allocated by new_server_handle
2210Sstevel@tonic-gate *
2220Sstevel@tonic-gate * Arguments:
2230Sstevel@tonic-gate * handle (input/output) The handle to free
2240Sstevel@tonic-gate */
free_server_handle(kadm5_server_handle_t handle)2252881Smp153739 static void free_server_handle(kadm5_server_handle_t handle)
2260Sstevel@tonic-gate {
2272881Smp153739 krb5_free_principal(handle->context, handle->current_caller);
2282881Smp153739 free(handle);
2290Sstevel@tonic-gate }
2300Sstevel@tonic-gate
2310Sstevel@tonic-gate /*
2320Sstevel@tonic-gate * Function: setup_gss_names
2330Sstevel@tonic-gate *
2340Sstevel@tonic-gate * Purpose: Create printable representations of the client and server
2350Sstevel@tonic-gate * names.
2360Sstevel@tonic-gate *
2370Sstevel@tonic-gate * Arguments:
2380Sstevel@tonic-gate * rqstp (r) the RPC request
2390Sstevel@tonic-gate * client_name (w) pointer to client_name string
2400Sstevel@tonic-gate * server_name (w) pointer to server_name string
2410Sstevel@tonic-gate *
2420Sstevel@tonic-gate * Effects:
2430Sstevel@tonic-gate *
2440Sstevel@tonic-gate * Unparses the client and server names into client_name and
2450Sstevel@tonic-gate * server_name, both of which must be freed by the caller. Returns 0
2460Sstevel@tonic-gate * on success and -1 on failure. On failure client_name and server_name
2470Sstevel@tonic-gate * will point to null.
2480Sstevel@tonic-gate */
2492881Smp153739 /* SUNW14resync */
setup_gss_names(struct svc_req * rqstp,char ** client_name,char ** server_name)2502881Smp153739 int setup_gss_names(struct svc_req *rqstp,
2510Sstevel@tonic-gate char **client_name, char **server_name)
2520Sstevel@tonic-gate {
2532881Smp153739 OM_uint32 maj_stat, min_stat;
2540Sstevel@tonic-gate rpc_gss_rawcred_t *raw_cred;
2550Sstevel@tonic-gate gss_buffer_desc name_buf;
2560Sstevel@tonic-gate char *tmp, *val;
2570Sstevel@tonic-gate size_t len;
2580Sstevel@tonic-gate gss_name_t name;
2590Sstevel@tonic-gate
2600Sstevel@tonic-gate *client_name = NULL;
2610Sstevel@tonic-gate
2620Sstevel@tonic-gate rpc_gss_getcred(rqstp, &raw_cred, NULL, NULL);
2630Sstevel@tonic-gate
2640Sstevel@tonic-gate /* Return a copy of the service principal from the raw_cred */
2650Sstevel@tonic-gate *server_name = strdup(raw_cred->svc_principal);
2660Sstevel@tonic-gate
2670Sstevel@tonic-gate if (*server_name == NULL)
2680Sstevel@tonic-gate return (-1);
2690Sstevel@tonic-gate
2700Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
2710Sstevel@tonic-gate free(*server_name);
2720Sstevel@tonic-gate *server_name = NULL;
2730Sstevel@tonic-gate return (-1);
2740Sstevel@tonic-gate }
2750Sstevel@tonic-gate maj_stat = gss_display_name(&min_stat, name, &name_buf, NULL);
2760Sstevel@tonic-gate if (maj_stat != GSS_S_COMPLETE) {
2770Sstevel@tonic-gate free(*server_name);
2780Sstevel@tonic-gate gss_release_name(&min_stat, &name);
2790Sstevel@tonic-gate *server_name = NULL;
2800Sstevel@tonic-gate return (-1);
2810Sstevel@tonic-gate }
2820Sstevel@tonic-gate gss_release_name(&min_stat, &name);
2830Sstevel@tonic-gate
2840Sstevel@tonic-gate /*
2850Sstevel@tonic-gate * Allocate space to copy the client principal. We allocate an
2860Sstevel@tonic-gate * extra byte to make the string null terminated if we need to.
2870Sstevel@tonic-gate */
2880Sstevel@tonic-gate
2890Sstevel@tonic-gate val = name_buf.value;
2900Sstevel@tonic-gate len = name_buf.length + (val[name_buf.length - 1] != '\0');
2910Sstevel@tonic-gate
2920Sstevel@tonic-gate /* len is the length including the null terminating byte. */
2930Sstevel@tonic-gate
2940Sstevel@tonic-gate tmp = malloc(len);
2950Sstevel@tonic-gate if (tmp) {
2960Sstevel@tonic-gate memcpy(tmp, val, len - 1);
2970Sstevel@tonic-gate tmp[len - 1] = '\0';
2980Sstevel@tonic-gate } else {
2990Sstevel@tonic-gate free(*server_name);
3000Sstevel@tonic-gate *server_name = NULL;
3010Sstevel@tonic-gate }
3020Sstevel@tonic-gate
3030Sstevel@tonic-gate /* Were done with the GSS buffer */
3040Sstevel@tonic-gate (void) gss_release_buffer(&min_stat, &name_buf);
3050Sstevel@tonic-gate
3060Sstevel@tonic-gate *client_name = tmp;
3070Sstevel@tonic-gate
3080Sstevel@tonic-gate return (tmp ? 0 : -1);
3090Sstevel@tonic-gate }
3100Sstevel@tonic-gate
acceptor_name(struct svc_req * rqstp)3112881Smp153739 static gss_name_t acceptor_name(struct svc_req * rqstp)
3120Sstevel@tonic-gate {
3132881Smp153739 OM_uint32 maj_stat, min_stat;
3142881Smp153739 gss_name_t name;
3152881Smp153739 rpc_gss_rawcred_t *raw_cred;
3162881Smp153739 void *cookie;
3172881Smp153739 gss_buffer_desc name_buff;
3180Sstevel@tonic-gate
3192881Smp153739 rpc_gss_getcred(rqstp, &raw_cred, NULL, &cookie);
3202881Smp153739 name_buff.value = raw_cred->svc_principal;
3212881Smp153739 name_buff.length = strlen(raw_cred->svc_principal);
3222881Smp153739 maj_stat = gss_import_name(&min_stat, &name_buff,
3232881Smp153739 (gss_OID) gss_nt_krb5_name, &name);
3242881Smp153739 if (maj_stat != GSS_S_COMPLETE) {
3252881Smp153739 gss_release_buffer(&min_stat, &name_buff);
3262881Smp153739 return (NULL);
3272881Smp153739 }
3282881Smp153739 maj_stat = gss_display_name(&min_stat, name, &name_buff, NULL);
3292881Smp153739 if (maj_stat != GSS_S_COMPLETE) {
3302881Smp153739 gss_release_buffer(&min_stat, &name_buff);
3312881Smp153739 return (NULL);
3322881Smp153739 }
3332881Smp153739 gss_release_buffer(&min_stat, &name_buff);
3342881Smp153739
3352881Smp153739 return name;
3362881Smp153739 }
3372881Smp153739
cmp_gss_krb5_name(kadm5_server_handle_t handle,gss_name_t gss_name,krb5_principal princ)3382881Smp153739 static int cmp_gss_krb5_name(kadm5_server_handle_t handle,
3392881Smp153739 gss_name_t gss_name, krb5_principal princ)
3402881Smp153739 {
3412881Smp153739 krb5_principal princ2;
3422881Smp153739 int status;
3432881Smp153739
3442881Smp153739 if (! gss_to_krb5_name(handle, gss_name, &princ2))
3452881Smp153739 return 0;
3462881Smp153739 status = krb5_principal_compare(handle->context, princ, princ2);
3472881Smp153739 krb5_free_principal(handle->context, princ2);
3482881Smp153739 return status;
3490Sstevel@tonic-gate }
3500Sstevel@tonic-gate
3510Sstevel@tonic-gate
3520Sstevel@tonic-gate /*
3530Sstevel@tonic-gate * This routine primarily validates the username and password
3540Sstevel@tonic-gate * of the principal to be created, if a prior acl check for
3550Sstevel@tonic-gate * the 'u' privilege succeeds. Validation is done using
3560Sstevel@tonic-gate * the PAM `k5migrate' service. k5migrate normally stacks
3570Sstevel@tonic-gate * pam_unix_auth.so and pam_unix_account.so in its auth and
3580Sstevel@tonic-gate * account stacks respectively.
3590Sstevel@tonic-gate *
3600Sstevel@tonic-gate * Returns 1 (true), if validation is successful,
3610Sstevel@tonic-gate * else returns 0 (false).
3620Sstevel@tonic-gate */
verify_pam_pw(char * userdata,char * pwd)3630Sstevel@tonic-gate int verify_pam_pw(char *userdata, char *pwd) {
3640Sstevel@tonic-gate pam_handle_t *pamh;
3650Sstevel@tonic-gate int err = 0;
3660Sstevel@tonic-gate int result = 1;
3670Sstevel@tonic-gate char *user = NULL;
3680Sstevel@tonic-gate char *ptr = NULL;
3690Sstevel@tonic-gate
3700Sstevel@tonic-gate ptr = strchr(userdata, '@');
3710Sstevel@tonic-gate if (ptr != NULL) {
3720Sstevel@tonic-gate user = (char *)malloc(ptr - userdata + 1);
3730Sstevel@tonic-gate (void) strlcpy(user, userdata, (ptr - userdata) + 1);
3740Sstevel@tonic-gate } else {
3750Sstevel@tonic-gate user = (char *)strdup(userdata);
3760Sstevel@tonic-gate }
3770Sstevel@tonic-gate
3780Sstevel@tonic-gate err = pam_start("k5migrate", user, NULL, &pamh);
3790Sstevel@tonic-gate if (err != PAM_SUCCESS) {
3800Sstevel@tonic-gate syslog(LOG_ERR, "verify_pam_pw: pam_start() failed, %s\n",
3810Sstevel@tonic-gate pam_strerror(pamh, err));
3820Sstevel@tonic-gate if (user)
3830Sstevel@tonic-gate free(user);
3840Sstevel@tonic-gate return (0);
3850Sstevel@tonic-gate }
3860Sstevel@tonic-gate if (user)
3870Sstevel@tonic-gate free(user);
3880Sstevel@tonic-gate
3890Sstevel@tonic-gate err = pam_set_item(pamh, PAM_AUTHTOK, (void *)pwd);
3900Sstevel@tonic-gate if (err != PAM_SUCCESS) {
3910Sstevel@tonic-gate syslog(LOG_ERR, "verify_pam_pw: pam_set_item() failed, %s\n",
3920Sstevel@tonic-gate pam_strerror(pamh, err));
3930Sstevel@tonic-gate (void) pam_end(pamh, err);
3940Sstevel@tonic-gate return (0);
3950Sstevel@tonic-gate }
3960Sstevel@tonic-gate
3970Sstevel@tonic-gate err = pam_authenticate(pamh, PAM_SILENT);
3980Sstevel@tonic-gate if (err != PAM_SUCCESS) {
3990Sstevel@tonic-gate syslog(LOG_ERR, "verify_pam_pw: pam_authenticate() "
4000Sstevel@tonic-gate "failed, %s\n", pam_strerror(pamh, err));
4010Sstevel@tonic-gate (void) pam_end(pamh, err);
4020Sstevel@tonic-gate return (0);
4030Sstevel@tonic-gate }
4040Sstevel@tonic-gate
4050Sstevel@tonic-gate err = pam_acct_mgmt(pamh, PAM_SILENT);
4060Sstevel@tonic-gate if (err != PAM_SUCCESS) {
4070Sstevel@tonic-gate syslog(LOG_ERR, "verify_pam_pw: pam_acct_mgmt() failed, %s\n",
4080Sstevel@tonic-gate pam_strerror(pamh, err));
4090Sstevel@tonic-gate (void) pam_end(pamh, err);
4100Sstevel@tonic-gate return (0);
4110Sstevel@tonic-gate }
4120Sstevel@tonic-gate
4130Sstevel@tonic-gate (void) pam_end(pamh, PAM_SUCCESS);
4140Sstevel@tonic-gate return (result);
4150Sstevel@tonic-gate }
4160Sstevel@tonic-gate
gss_to_krb5_name(kadm5_server_handle_t handle,gss_name_t gss_name,krb5_principal * princ)4172881Smp153739 static int gss_to_krb5_name(kadm5_server_handle_t handle,
4182881Smp153739 gss_name_t gss_name, krb5_principal *princ)
4190Sstevel@tonic-gate {
4202881Smp153739 OM_uint32 status, minor_stat;
4212881Smp153739 gss_buffer_desc gss_str;
4222881Smp153739 gss_OID gss_type;
4232881Smp153739 int success;
4240Sstevel@tonic-gate
4252881Smp153739 status = gss_display_name(&minor_stat, gss_name, &gss_str, &gss_type);
4262881Smp153739 if ((status != GSS_S_COMPLETE) || (!g_OID_equal(gss_type, gss_nt_krb5_name)))
4272881Smp153739 return 0;
4282881Smp153739 success = (krb5_parse_name(handle->context, gss_str.value, princ) == 0);
4292881Smp153739 gss_release_buffer(&minor_stat, &gss_str);
4302881Smp153739 return success;
4312881Smp153739 }
4320Sstevel@tonic-gate
4332881Smp153739 static int
gss_name_to_string(gss_name_t gss_name,gss_buffer_desc * str)4342881Smp153739 gss_name_to_string(gss_name_t gss_name, gss_buffer_desc *str)
4352881Smp153739 {
4362881Smp153739 OM_uint32 status, minor_stat;
4372881Smp153739 gss_OID gss_type;
4382881Smp153739
4392881Smp153739 status = gss_display_name(&minor_stat, gss_name, str, &gss_type);
4402881Smp153739 if ((status != GSS_S_COMPLETE) || (gss_type != gss_nt_krb5_name))
4412881Smp153739 return 1;
4422881Smp153739 return 0;
4432881Smp153739 }
4440Sstevel@tonic-gate
4453998Ssemery static int
log_unauth(char * op,char * target,char * client,char * server,char * addr)4463998Ssemery log_unauth(
4473998Ssemery char *op,
4483998Ssemery char *target,
4493998Ssemery char *client,
4503998Ssemery char *server,
4513998Ssemery char *addr)
4523998Ssemery {
4533998Ssemery size_t tlen, clen, slen;
4543998Ssemery char *tdots, *cdots, *sdots;
4553998Ssemery
4563998Ssemery tlen = strlen(target);
4573998Ssemery trunc_name(&tlen, &tdots);
4583998Ssemery clen = strlen(client);
4593998Ssemery trunc_name(&clen, &cdots);
4603998Ssemery slen = strlen(server);
4613998Ssemery trunc_name(&slen, &sdots);
4623998Ssemery
4633998Ssemery return krb5_klog_syslog(LOG_NOTICE,
4647934SMark.Phalan@Sun.COM "Unauthorized request: %s, %.*s%s, "
4657934SMark.Phalan@Sun.COM "client=%.*s%s, service=%.*s%s, addr=%s",
4667934SMark.Phalan@Sun.COM op, tlen, target, tdots,
4677934SMark.Phalan@Sun.COM clen, client, cdots,
4687934SMark.Phalan@Sun.COM slen, server, sdots,
4697934SMark.Phalan@Sun.COM addr);
4703998Ssemery }
4713998Ssemery
4723998Ssemery static int
log_done(char * op,char * target,const char * errmsg,char * client,char * server,char * addr)4733998Ssemery log_done(
4743998Ssemery char *op,
4753998Ssemery char *target,
4763998Ssemery const char *errmsg,
4773998Ssemery char *client,
4783998Ssemery char *server,
4793998Ssemery char *addr)
4803998Ssemery {
4813998Ssemery size_t tlen, clen, slen;
4823998Ssemery char *tdots, *cdots, *sdots;
4833998Ssemery
4843998Ssemery tlen = strlen(target);
4853998Ssemery trunc_name(&tlen, &tdots);
4863998Ssemery clen = strlen(client);
4873998Ssemery trunc_name(&clen, &cdots);
4883998Ssemery slen = strlen(server);
4893998Ssemery trunc_name(&slen, &sdots);
4903998Ssemery
4913998Ssemery return krb5_klog_syslog(LOG_NOTICE,
4927934SMark.Phalan@Sun.COM "Request: %s, %.*s%s, %s, "
4937934SMark.Phalan@Sun.COM "client=%.*s%s, service=%.*s%s, addr=%s",
4947934SMark.Phalan@Sun.COM op, tlen, target, tdots, errmsg,
4957934SMark.Phalan@Sun.COM clen, client, cdots,
4967934SMark.Phalan@Sun.COM slen, server, sdots,
4977934SMark.Phalan@Sun.COM addr);
4983998Ssemery }
4993998Ssemery
5002881Smp153739 generic_ret *
create_principal_2_svc(cprinc_arg * arg,struct svc_req * rqstp)5017934SMark.Phalan@Sun.COM create_principal_2_svc(cprinc_arg *arg, struct svc_req *rqstp)
5022881Smp153739 {
5032881Smp153739 static generic_ret ret;
5042881Smp153739 char *prime_arg = NULL;
5052881Smp153739 char *client_name = NULL, *service_name = NULL;
5062881Smp153739 int policy_migrate = 0;
5070Sstevel@tonic-gate
5082881Smp153739 OM_uint32 minor_stat;
5092881Smp153739 kadm5_server_handle_t handle;
5102881Smp153739 kadm5_ret_t retval;
5112881Smp153739 restriction_t *rp;
5127934SMark.Phalan@Sun.COM const char *errmsg = NULL;
5132881Smp153739 gss_name_t name = NULL;
5142881Smp153739
5152881Smp153739 xdr_free(xdr_generic_ret, (char *) &ret);
5160Sstevel@tonic-gate
5172881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
5182881Smp153739 return &ret;
5192881Smp153739
5202881Smp153739 if ((ret.code = check_handle((void *)handle)))
5210Sstevel@tonic-gate goto error;
5222881Smp153739 ret.api_version = handle->api_version;
5232881Smp153739
5242881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
5252881Smp153739 ret.code = KADM5_FAILURE;
5262881Smp153739 goto error;
5272881Smp153739 }
5282881Smp153739 if (krb5_unparse_name(handle->context, arg->rec.principal, &prime_arg)) {
5292881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
5302881Smp153739 goto error;
5312881Smp153739 }
5320Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
5330Sstevel@tonic-gate ret.code = KADM5_FAILURE;
5340Sstevel@tonic-gate goto error;
5350Sstevel@tonic-gate }
5360Sstevel@tonic-gate
5372881Smp153739 if (kadm5int_acl_check(handle->context, name, ACL_MIGRATE,
5380Sstevel@tonic-gate arg->rec.principal, &rp) &&
5390Sstevel@tonic-gate verify_pam_pw(prime_arg, arg->passwd)) {
5400Sstevel@tonic-gate policy_migrate = 1;
5410Sstevel@tonic-gate }
5420Sstevel@tonic-gate
5432881Smp153739 if (CHANGEPW_SERVICE(rqstp)
5442881Smp153739 || (!kadm5int_acl_check(handle->context, name, ACL_ADD,
5450Sstevel@tonic-gate arg->rec.principal, &rp) &&
5460Sstevel@tonic-gate !(policy_migrate))
5472881Smp153739 || kadm5int_acl_impose_restrictions(handle->context,
5482881Smp153739 &arg->rec, &arg->mask, rp)) {
5492881Smp153739 ret.code = KADM5_AUTH_ADD;
5500Sstevel@tonic-gate
5510Sstevel@tonic-gate audit_kadmind_unauth(rqstp->rq_xprt, l_port,
5520Sstevel@tonic-gate "kadm5_create_principal",
5530Sstevel@tonic-gate prime_arg, client_name);
5543998Ssemery log_unauth("kadm5_create_principal", prime_arg,
5553998Ssemery client_name, service_name, client_addr(rqstp, buf));
5562881Smp153739 } else {
5572881Smp153739 ret.code = kadm5_create_principal((void *)handle,
5582881Smp153739 &arg->rec, arg->mask,
5592881Smp153739 arg->passwd);
5607934SMark.Phalan@Sun.COM /* Solaris Kerberos */
5617934SMark.Phalan@Sun.COM if( ret.code != 0 )
5627934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
5630Sstevel@tonic-gate
5640Sstevel@tonic-gate audit_kadmind_auth(rqstp->rq_xprt, l_port,
5650Sstevel@tonic-gate "kadm5_create_principal",
5660Sstevel@tonic-gate prime_arg, client_name, ret.code);
5673998Ssemery log_done("kadm5_create_principal", prime_arg,
5687934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
5693998Ssemery client_name, service_name, client_addr(rqstp, buf));
5700Sstevel@tonic-gate
5717934SMark.Phalan@Sun.COM if (errmsg != NULL)
5727934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
5737934SMark.Phalan@Sun.COM
5740Sstevel@tonic-gate if (policy_migrate && (ret.code == 0)) {
5750Sstevel@tonic-gate arg->rec.policy = strdup("default");
5760Sstevel@tonic-gate if ((arg->mask & KADM5_PW_EXPIRATION)) {
5770Sstevel@tonic-gate arg->mask = 0;
5780Sstevel@tonic-gate arg->mask |= KADM5_POLICY;
5790Sstevel@tonic-gate arg->mask |= KADM5_PW_EXPIRATION;
5800Sstevel@tonic-gate } else {
5810Sstevel@tonic-gate arg->mask = 0;
5820Sstevel@tonic-gate arg->mask |= KADM5_POLICY;
5830Sstevel@tonic-gate }
5840Sstevel@tonic-gate
5850Sstevel@tonic-gate retval = kadm5_modify_principal((void *)handle,
5860Sstevel@tonic-gate &arg->rec, arg->mask);
5873998Ssemery log_done("kadm5_modify_principal",
5880Sstevel@tonic-gate prime_arg, ((retval == 0) ? "success" :
5890Sstevel@tonic-gate error_message(retval)), client_name,
5900Sstevel@tonic-gate service_name, client_addr(rqstp, buf));
5910Sstevel@tonic-gate }
5920Sstevel@tonic-gate }
5930Sstevel@tonic-gate
5940Sstevel@tonic-gate error:
5952881Smp153739 if (name)
5962881Smp153739 gss_release_name(&minor_stat, &name);
5972881Smp153739 free_server_handle(handle);
5982881Smp153739 if (prime_arg)
5992881Smp153739 free(prime_arg);
6002881Smp153739 if (client_name)
6012881Smp153739 free(client_name);
6022881Smp153739 if (service_name)
6032881Smp153739 free(service_name);
6042881Smp153739 return (&ret);
6050Sstevel@tonic-gate }
6060Sstevel@tonic-gate
6070Sstevel@tonic-gate generic_ret *
create_principal3_2_svc(cprinc3_arg * arg,struct svc_req * rqstp)6087934SMark.Phalan@Sun.COM create_principal3_2_svc(cprinc3_arg *arg, struct svc_req *rqstp)
6090Sstevel@tonic-gate {
6100Sstevel@tonic-gate static generic_ret ret;
6110Sstevel@tonic-gate char *prime_arg = NULL;
6120Sstevel@tonic-gate char *client_name = NULL, *service_name = NULL;
6130Sstevel@tonic-gate int policy_migrate = 0;
6140Sstevel@tonic-gate
6152881Smp153739 OM_uint32 minor_stat;
6160Sstevel@tonic-gate kadm5_server_handle_t handle;
6170Sstevel@tonic-gate kadm5_ret_t retval;
6180Sstevel@tonic-gate restriction_t *rp;
6197934SMark.Phalan@Sun.COM const char *errmsg = NULL;
6200Sstevel@tonic-gate gss_name_t name = NULL;
6210Sstevel@tonic-gate
6220Sstevel@tonic-gate xdr_free(xdr_generic_ret, (char *) &ret);
6230Sstevel@tonic-gate
6242881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
6250Sstevel@tonic-gate return &ret;
6260Sstevel@tonic-gate
6272881Smp153739 if ((ret.code = check_handle((void *)handle)))
6280Sstevel@tonic-gate goto error;
6290Sstevel@tonic-gate ret.api_version = handle->api_version;
6300Sstevel@tonic-gate
6310Sstevel@tonic-gate if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
6322881Smp153739 ret.code = KADM5_FAILURE;
6330Sstevel@tonic-gate goto error;
6340Sstevel@tonic-gate }
6350Sstevel@tonic-gate if (krb5_unparse_name(handle->context, arg->rec.principal, &prime_arg)) {
6362881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
6370Sstevel@tonic-gate goto error;
6380Sstevel@tonic-gate }
6390Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
6400Sstevel@tonic-gate ret.code = KADM5_FAILURE;
6410Sstevel@tonic-gate goto error;
6420Sstevel@tonic-gate }
6430Sstevel@tonic-gate
6442881Smp153739 if (kadm5int_acl_check(handle->context, name, ACL_MIGRATE,
6450Sstevel@tonic-gate arg->rec.principal, &rp) &&
6460Sstevel@tonic-gate verify_pam_pw(prime_arg, arg->passwd)) {
6470Sstevel@tonic-gate policy_migrate = 1;
6480Sstevel@tonic-gate }
6490Sstevel@tonic-gate
6500Sstevel@tonic-gate if (CHANGEPW_SERVICE(rqstp)
6512881Smp153739 || (!kadm5int_acl_check(handle->context, name, ACL_ADD,
6520Sstevel@tonic-gate arg->rec.principal, &rp) &&
6530Sstevel@tonic-gate !(policy_migrate))
6542881Smp153739 || kadm5int_acl_impose_restrictions(handle->context,
6550Sstevel@tonic-gate &arg->rec, &arg->mask, rp)) {
6560Sstevel@tonic-gate ret.code = KADM5_AUTH_ADD;
6573998Ssemery log_unauth("kadm5_create_principal", prime_arg,
6587934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
6590Sstevel@tonic-gate } else {
6600Sstevel@tonic-gate ret.code = kadm5_create_principal_3((void *)handle,
6610Sstevel@tonic-gate &arg->rec, arg->mask,
6620Sstevel@tonic-gate arg->n_ks_tuple,
6630Sstevel@tonic-gate arg->ks_tuple,
6640Sstevel@tonic-gate arg->passwd);
6657934SMark.Phalan@Sun.COM /* Solaris Kerberos */
6667934SMark.Phalan@Sun.COM if( ret.code != 0 )
6677934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
6687934SMark.Phalan@Sun.COM
6693998Ssemery log_done("kadm5_create_principal", prime_arg,
6707934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
6717934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
6727934SMark.Phalan@Sun.COM
6737934SMark.Phalan@Sun.COM if (errmsg != NULL)
6747934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
6750Sstevel@tonic-gate
6760Sstevel@tonic-gate if (policy_migrate && (ret.code == 0)) {
6770Sstevel@tonic-gate arg->rec.policy = strdup("default");
6780Sstevel@tonic-gate if ((arg->mask & KADM5_PW_EXPIRATION)) {
6790Sstevel@tonic-gate arg->mask = 0;
6800Sstevel@tonic-gate arg->mask |= KADM5_POLICY;
6810Sstevel@tonic-gate arg->mask |= KADM5_PW_EXPIRATION;
6820Sstevel@tonic-gate } else {
6830Sstevel@tonic-gate arg->mask = 0;
6840Sstevel@tonic-gate arg->mask |= KADM5_POLICY;
6850Sstevel@tonic-gate }
6860Sstevel@tonic-gate
6870Sstevel@tonic-gate retval = kadm5_modify_principal((void *)handle,
6880Sstevel@tonic-gate &arg->rec, arg->mask);
6893998Ssemery log_done("kadm5_modify_principal", prime_arg,
6903998Ssemery ((retval == 0) ? "success" : error_message(retval)),
6913998Ssemery client_name, service_name, client_addr(rqstp, buf));
6920Sstevel@tonic-gate }
6930Sstevel@tonic-gate }
6940Sstevel@tonic-gate
6950Sstevel@tonic-gate error:
6960Sstevel@tonic-gate if (name)
6972881Smp153739 gss_release_name(&minor_stat, &name);
6980Sstevel@tonic-gate free_server_handle(handle);
6990Sstevel@tonic-gate if (client_name)
7002881Smp153739 free(client_name);
7010Sstevel@tonic-gate if (service_name)
7022881Smp153739 free(service_name);
7030Sstevel@tonic-gate if (prime_arg)
7042881Smp153739 free(prime_arg);
7052881Smp153739 return &ret;
7062881Smp153739 }
7072881Smp153739
7082881Smp153739 generic_ret *
delete_principal_2_svc(dprinc_arg * arg,struct svc_req * rqstp)7097934SMark.Phalan@Sun.COM delete_principal_2_svc(dprinc_arg *arg, struct svc_req *rqstp)
7102881Smp153739 {
7112881Smp153739 static generic_ret ret;
7122881Smp153739 char *prime_arg = NULL;
7132881Smp153739 char *client_name = NULL, *service_name = NULL;
7147934SMark.Phalan@Sun.COM OM_uint32 min_stat;
7157934SMark.Phalan@Sun.COM kadm5_server_handle_t handle;
7167934SMark.Phalan@Sun.COM const char *errmsg = NULL;
7177934SMark.Phalan@Sun.COM
7182881Smp153739 gss_name_t name = NULL;
7192881Smp153739
7207934SMark.Phalan@Sun.COM
7212881Smp153739 xdr_free(xdr_generic_ret, (char *) &ret);
7222881Smp153739
7232881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
7242881Smp153739 return &ret;
7252881Smp153739
7262881Smp153739 if ((ret.code = check_handle((void *)handle)))
7272881Smp153739 goto error;
7282881Smp153739 ret.api_version = handle->api_version;
7292881Smp153739
7302881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
7312881Smp153739 ret.code = KADM5_FAILURE;
7322881Smp153739 goto error;
7332881Smp153739 }
7342881Smp153739 if (krb5_unparse_name(handle->context, arg->princ, &prime_arg)) {
7352881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
7362881Smp153739 goto error;
7372881Smp153739 }
7382881Smp153739 if (!(name = get_clnt_name(rqstp))) {
7392881Smp153739 ret.code = KADM5_FAILURE;
7402881Smp153739 goto error;
7412881Smp153739 }
7422881Smp153739
7432881Smp153739 if (CHANGEPW_SERVICE(rqstp)
7442881Smp153739 || !kadm5int_acl_check(handle->context, name, ACL_DELETE,
7452881Smp153739 arg->princ, NULL)) {
7462881Smp153739 ret.code = KADM5_AUTH_DELETE;
7472881Smp153739
7482881Smp153739 audit_kadmind_unauth(rqstp->rq_xprt, l_port,
7492881Smp153739 "kadm5_delete_principal",
7502881Smp153739 prime_arg, client_name);
7513998Ssemery log_unauth("kadm5_delete_principal", prime_arg, client_name,
7522881Smp153739 service_name, client_addr(rqstp, buf));
7532881Smp153739 } else {
7542881Smp153739 ret.code = kadm5_delete_principal((void *)handle, arg->princ);
7557934SMark.Phalan@Sun.COM /* Solaris Kerberos */
7567934SMark.Phalan@Sun.COM if( ret.code != 0 )
7577934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
7582881Smp153739
7592881Smp153739 audit_kadmind_auth(rqstp->rq_xprt, l_port,
7602881Smp153739 "kadm5_delete_principal",
7612881Smp153739 prime_arg, client_name, ret.code);
7627934SMark.Phalan@Sun.COM log_done("kadm5_delete_principal", prime_arg,
7637934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
7647934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
7657934SMark.Phalan@Sun.COM
7667934SMark.Phalan@Sun.COM if (errmsg != NULL)
7677934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
7687934SMark.Phalan@Sun.COM
7692881Smp153739 }
7702881Smp153739
7712881Smp153739 error:
7722881Smp153739 if (name)
7732881Smp153739 gss_release_name(&min_stat, &name);
7742881Smp153739 if (prime_arg)
7752881Smp153739 free(prime_arg);
7762881Smp153739 free_server_handle(handle);
7772881Smp153739 if (client_name)
7782881Smp153739 free(client_name);
7792881Smp153739 if (service_name)
7802881Smp153739 free(service_name);
7812881Smp153739 return &ret;
7820Sstevel@tonic-gate }
7830Sstevel@tonic-gate
7840Sstevel@tonic-gate generic_ret *
modify_principal_2_svc(mprinc_arg * arg,struct svc_req * rqstp)7857934SMark.Phalan@Sun.COM modify_principal_2_svc(mprinc_arg *arg, struct svc_req *rqstp)
7860Sstevel@tonic-gate {
7872881Smp153739 static generic_ret ret;
7882881Smp153739 char *prime_arg = NULL;
7892881Smp153739 char *client_name = NULL, *service_name = NULL;
7902881Smp153739 OM_uint32 min_stat;
7912881Smp153739 kadm5_server_handle_t handle;
7922881Smp153739 restriction_t *rp;
7932881Smp153739 gss_name_t name = NULL;
7947934SMark.Phalan@Sun.COM const char *errmsg = NULL;
7952881Smp153739
7962881Smp153739 xdr_free(xdr_generic_ret, (char *) &ret);
7970Sstevel@tonic-gate
7982881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
7992881Smp153739 return &ret;
8000Sstevel@tonic-gate
8012881Smp153739 if ((ret.code = check_handle((void *)handle)))
8022881Smp153739 goto error;
8032881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
8042881Smp153739 ret.code = KADM5_FAILURE;
8050Sstevel@tonic-gate goto error;
8062881Smp153739 }
8072881Smp153739 if (krb5_unparse_name(handle->context, arg->rec.principal, &prime_arg)) {
8082881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
8092881Smp153739 goto error;
8102881Smp153739 }
8112881Smp153739 if (!(name = get_clnt_name(rqstp))) {
8120Sstevel@tonic-gate ret.code = KADM5_FAILURE;
8130Sstevel@tonic-gate goto error;
8140Sstevel@tonic-gate }
8152881Smp153739
8162881Smp153739 if (CHANGEPW_SERVICE(rqstp)
8172881Smp153739 || !kadm5int_acl_check(handle->context, name, ACL_MODIFY,
8182881Smp153739 arg->rec.principal, &rp)
8192881Smp153739 || kadm5int_acl_impose_restrictions(handle->context,
8202881Smp153739 &arg->rec, &arg->mask, rp)) {
8212881Smp153739 ret.code = KADM5_AUTH_MODIFY;
8222881Smp153739
8232881Smp153739 audit_kadmind_unauth(rqstp->rq_xprt, l_port,
8242881Smp153739 "kadm5_modify_principal",
8252881Smp153739 prime_arg, client_name);
8263998Ssemery log_unauth("kadm5_modify_principal", prime_arg, client_name,
8272881Smp153739 service_name, client_addr(rqstp, buf));
8282881Smp153739 } else {
8292881Smp153739 ret.code = kadm5_modify_principal((void *)handle, &arg->rec,
8302881Smp153739 arg->mask);
8317934SMark.Phalan@Sun.COM /* Solaris Kerberos */
8327934SMark.Phalan@Sun.COM if( ret.code != 0 )
8337934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
8342881Smp153739
8352881Smp153739 audit_kadmind_auth(rqstp->rq_xprt, l_port,
8362881Smp153739 "kadm5_modify_principal",
8372881Smp153739 prime_arg, client_name, ret.code);
8383998Ssemery log_done("kadm5_modify_principal", prime_arg,
8397934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
8407934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
8417934SMark.Phalan@Sun.COM
8427934SMark.Phalan@Sun.COM if (errmsg != NULL)
8437934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
8442881Smp153739 }
8452881Smp153739
8462881Smp153739 error:
8472881Smp153739 if (name)
8482881Smp153739 gss_release_name(&min_stat, &name);
8492881Smp153739 free_server_handle(handle);
8502881Smp153739 if (prime_arg)
8512881Smp153739 free(prime_arg);
8522881Smp153739 if (client_name)
8532881Smp153739 free(client_name);
8542881Smp153739 if (service_name)
8552881Smp153739 free(service_name);
8562881Smp153739 return &ret;
8572881Smp153739 }
8582881Smp153739
8592881Smp153739 generic_ret *
rename_principal_2_svc(rprinc_arg * arg,struct svc_req * rqstp)8607934SMark.Phalan@Sun.COM rename_principal_2_svc(rprinc_arg *arg, struct svc_req *rqstp)
8612881Smp153739 {
8622881Smp153739 static generic_ret ret;
8632881Smp153739 char *prime_arg1 = NULL, *prime_arg2 = NULL;
8642881Smp153739 char prime_arg[BUFSIZ];
8652881Smp153739 char *client_name = NULL, *service_name = NULL;
8662881Smp153739 OM_uint32 min_stat;
8672881Smp153739 kadm5_server_handle_t handle;
8682881Smp153739 restriction_t *rp;
8697934SMark.Phalan@Sun.COM const char *errmsg = NULL;
8702881Smp153739 gss_name_t name = NULL;
8714819Sps57422 size_t tlen1, tlen2, clen, slen;
8724819Sps57422 char *tdots1, *tdots2, *cdots, *sdots;
8732881Smp153739
8742881Smp153739 xdr_free(xdr_generic_ret, (char *) &ret);
8752881Smp153739
8762881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
8772881Smp153739 return &ret;
8782881Smp153739
8792881Smp153739 if ((ret.code = check_handle((void *)handle)))
8802881Smp153739 goto error;
8812881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
8822881Smp153739 ret.code = KADM5_FAILURE;
8832881Smp153739 goto error;
8842881Smp153739 }
8852881Smp153739 if (krb5_unparse_name(handle->context, arg->src, &prime_arg1) ||
8862881Smp153739 krb5_unparse_name(handle->context, arg->dest, &prime_arg2)) {
8872881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
8882881Smp153739 goto error;
8892881Smp153739 }
8904819Sps57422 tlen1 = strlen(prime_arg1);
8914819Sps57422 trunc_name(&tlen1, &tdots1);
8924819Sps57422 tlen2 = strlen(prime_arg2);
8934819Sps57422 trunc_name(&tlen2, &tdots2);
8944819Sps57422 clen = strlen(client_name);
8954819Sps57422 trunc_name(&clen, &cdots);
8964819Sps57422 slen = strlen(service_name);
8974819Sps57422 trunc_name(&slen, &sdots);
8982881Smp153739
8994819Sps57422 (void) snprintf(prime_arg, sizeof (prime_arg), "%.*s%s to %.*s*s",
9004819Sps57422 tlen1, prime_arg1, tdots1,
9014819Sps57422 tlen2, prime_arg2, tdots2);
9022881Smp153739 ret.code = KADM5_OK;
9032881Smp153739
9040Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
9050Sstevel@tonic-gate ret.code = KADM5_FAILURE;
9060Sstevel@tonic-gate goto error;
9070Sstevel@tonic-gate }
9080Sstevel@tonic-gate
9092881Smp153739 if (! CHANGEPW_SERVICE(rqstp)) {
9102881Smp153739 if (!kadm5int_acl_check(handle->context, name,
9112881Smp153739 ACL_DELETE, arg->src, NULL))
9122881Smp153739 ret.code = KADM5_AUTH_DELETE;
9132881Smp153739 /* any restrictions at all on the ADD kills the RENAME */
9142881Smp153739 if (!kadm5int_acl_check(handle->context, name,
9152881Smp153739 ACL_ADD, arg->dest, &rp)) {
9162881Smp153739 if (ret.code == KADM5_AUTH_DELETE)
9172881Smp153739 ret.code = KADM5_AUTH_INSUFFICIENT;
9182881Smp153739 else
9192881Smp153739 ret.code = KADM5_AUTH_ADD;
9202881Smp153739 }
9212881Smp153739 } else
9222881Smp153739 ret.code = KADM5_AUTH_INSUFFICIENT;
9232881Smp153739 if (ret.code != KADM5_OK) {
9242881Smp153739
9252881Smp153739 audit_kadmind_unauth(rqstp->rq_xprt, l_port,
9262881Smp153739 "kadm5_rename_principal",
9272881Smp153739 prime_arg, client_name);
9284819Sps57422 krb5_klog_syslog(LOG_NOTICE,
9294819Sps57422 "Unauthorized request: kadm5_rename_principal, "
9304819Sps57422 "%.*s%s to %.*s%s, "
9314819Sps57422 "client=%.*s%s, service=%.*s%s, addr=%s",
9324819Sps57422 tlen1, prime_arg1, tdots1,
9334819Sps57422 tlen2, prime_arg2, tdots2,
9344819Sps57422 clen, client_name, cdots,
9354819Sps57422 slen, service_name, sdots,
9364819Sps57422 client_addr(rqstp, buf));
9372881Smp153739 } else {
9382881Smp153739 ret.code = kadm5_rename_principal((void *)handle, arg->src,
9392881Smp153739 arg->dest);
9407934SMark.Phalan@Sun.COM /* Solaris Kerberos */
9417934SMark.Phalan@Sun.COM if( ret.code != 0 )
9427934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
9432881Smp153739
9442881Smp153739 audit_kadmind_auth(rqstp->rq_xprt, l_port,
9452881Smp153739 "kadm5_rename_principal",
9462881Smp153739 prime_arg, client_name, ret.code);
9477934SMark.Phalan@Sun.COM krb5_klog_syslog(LOG_NOTICE,
9487934SMark.Phalan@Sun.COM "Request: kadm5_rename_principal, "
9497934SMark.Phalan@Sun.COM "%.*s%s to %.*s%s, %s, "
9507934SMark.Phalan@Sun.COM "client=%.*s%s, service=%.*s%s, addr=%s",
9517934SMark.Phalan@Sun.COM tlen1, prime_arg1, tdots1,
9527934SMark.Phalan@Sun.COM tlen2, prime_arg2, tdots2,
9537934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
9547934SMark.Phalan@Sun.COM clen, client_name, cdots,
9557934SMark.Phalan@Sun.COM slen, service_name, sdots,
9567934SMark.Phalan@Sun.COM client_addr(rqstp, buf));
9577934SMark.Phalan@Sun.COM
9587934SMark.Phalan@Sun.COM if (errmsg != NULL)
9597934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
9602881Smp153739 }
9612881Smp153739
9622881Smp153739 error:
9632881Smp153739 if (name)
9642881Smp153739 gss_release_name(&min_stat, &name);
9652881Smp153739 free_server_handle(handle);
9662881Smp153739 if (prime_arg1)
9672881Smp153739 free(prime_arg1);
9682881Smp153739 if (prime_arg2)
9692881Smp153739 free(prime_arg2);
9702881Smp153739 if (client_name)
9712881Smp153739 free(client_name);
9722881Smp153739 if (service_name)
9732881Smp153739 free(service_name);
9742881Smp153739 return &ret;
9752881Smp153739 }
9762881Smp153739
9772881Smp153739 gprinc_ret *
get_principal_2_svc(gprinc_arg * arg,struct svc_req * rqstp)9787934SMark.Phalan@Sun.COM get_principal_2_svc(gprinc_arg *arg, struct svc_req *rqstp)
9792881Smp153739 {
9802881Smp153739 static gprinc_ret ret;
9812881Smp153739 kadm5_principal_ent_t_v1 e;
9822881Smp153739 char *prime_arg = NULL, *funcname;
9832881Smp153739 char *client_name = NULL, *service_name = NULL;
9842881Smp153739 OM_uint32 min_stat;
9852881Smp153739 kadm5_server_handle_t handle;
9867934SMark.Phalan@Sun.COM const char *errmsg = NULL;
9872881Smp153739 gss_name_t name = NULL;
9882881Smp153739
9892881Smp153739 xdr_free(xdr_gprinc_ret, (char *) &ret);
9902881Smp153739
9912881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
9922881Smp153739 return &ret;
9932881Smp153739
9942881Smp153739 if ((ret.code = check_handle((void *)handle)))
9952881Smp153739 goto error;
9962881Smp153739 ret.api_version = handle->api_version;
9972881Smp153739
9982881Smp153739 funcname = handle->api_version == KADM5_API_VERSION_1 ?
9992881Smp153739 "kadm5_get_principal (V1)" : "kadm5_get_principal";
10002881Smp153739
10012881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
10022881Smp153739 ret.code = KADM5_FAILURE;
10032881Smp153739 goto error;
10042881Smp153739 }
10052881Smp153739 if (krb5_unparse_name(handle->context, arg->princ, &prime_arg)) {
10062881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
10072881Smp153739 goto error;
10082881Smp153739 }
10092881Smp153739 if (!(name = get_clnt_name(rqstp))) {
10102881Smp153739 ret.code = KADM5_FAILURE;
10112881Smp153739 goto error;
10122881Smp153739 }
10132881Smp153739
10142881Smp153739 if (! cmp_gss_krb5_name(handle, name, arg->princ) &&
10152881Smp153739 (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
10162881Smp153739 name,
10172881Smp153739 ACL_INQUIRE,
10182881Smp153739 arg->princ,
10192881Smp153739 NULL))) {
10202881Smp153739 ret.code = KADM5_AUTH_GET;
10210Sstevel@tonic-gate
10220Sstevel@tonic-gate audit_kadmind_unauth(rqstp->rq_xprt, l_port,
10232881Smp153739 funcname,
10240Sstevel@tonic-gate prime_arg, client_name);
10253998Ssemery log_unauth(funcname, prime_arg, client_name, service_name,
10262881Smp153739 client_addr(rqstp, buf));
10272881Smp153739 } else {
10282881Smp153739 if (handle->api_version == KADM5_API_VERSION_1) {
10292881Smp153739 ret.code = kadm5_get_principal_v1((void *)handle,
10302881Smp153739 arg->princ, &e);
10312881Smp153739 if(ret.code == KADM5_OK) {
10322881Smp153739 memcpy(&ret.rec, e, sizeof(kadm5_principal_ent_rec_v1));
10332881Smp153739 free(e);
10342881Smp153739 }
10352881Smp153739 } else {
10362881Smp153739 ret.code = kadm5_get_principal((void *)handle,
10372881Smp153739 arg->princ, &ret.rec,
10382881Smp153739 arg->mask);
10392881Smp153739 }
10402881Smp153739
10417934SMark.Phalan@Sun.COM /* Solaris Kerberos */
10427934SMark.Phalan@Sun.COM if( ret.code != 0 )
10437934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
10447934SMark.Phalan@Sun.COM
10452881Smp153739 audit_kadmind_auth(rqstp->rq_xprt, l_port,
10462881Smp153739 funcname,
10472881Smp153739 prime_arg, client_name, ret.code);
10487934SMark.Phalan@Sun.COM log_done(funcname, prime_arg, errmsg ? errmsg : "success",
10497934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
10507934SMark.Phalan@Sun.COM
10517934SMark.Phalan@Sun.COM if (errmsg != NULL)
10527934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
10532881Smp153739 }
10542881Smp153739
10552881Smp153739 error:
10562881Smp153739 if (name)
10572881Smp153739 gss_release_name(&min_stat, &name);
10582881Smp153739 free_server_handle(handle);
10592881Smp153739 if (prime_arg)
10602881Smp153739 free(prime_arg);
10612881Smp153739 if (client_name)
10622881Smp153739 free(client_name);
10632881Smp153739 if (service_name)
10642881Smp153739 free(service_name);
10652881Smp153739 return &ret;
10662881Smp153739 }
10672881Smp153739
10682881Smp153739 gprincs_ret *
get_princs_2_svc(gprincs_arg * arg,struct svc_req * rqstp)10697934SMark.Phalan@Sun.COM get_princs_2_svc(gprincs_arg *arg, struct svc_req *rqstp)
10702881Smp153739 {
10712881Smp153739 static gprincs_ret ret;
10722881Smp153739 char *prime_arg = NULL;
10732881Smp153739 char *client_name = NULL, *service_name = NULL;
10742881Smp153739 OM_uint32 min_stat;
10752881Smp153739 kadm5_server_handle_t handle;
10762881Smp153739 gss_name_t name = NULL;
10777934SMark.Phalan@Sun.COM const char *errmsg = NULL;
10782881Smp153739
10792881Smp153739 xdr_free(xdr_gprincs_ret, (char *) &ret);
10802881Smp153739
10812881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
10822881Smp153739 return &ret;
10832881Smp153739
10842881Smp153739 if ((ret.code = check_handle((void *)handle)))
10852881Smp153739 goto error;
10862881Smp153739 ret.api_version = handle->api_version;
10872881Smp153739
10882881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
10892881Smp153739 ret.code = KADM5_FAILURE;
10902881Smp153739 goto error;
10912881Smp153739 }
10922881Smp153739 prime_arg = arg->exp;
10932881Smp153739 if (prime_arg == NULL)
10942881Smp153739 prime_arg = "*";
10952881Smp153739
10962881Smp153739 if (!(name = get_clnt_name(rqstp))) {
10972881Smp153739 ret.code = KADM5_FAILURE;
10982881Smp153739 goto error;
10992881Smp153739 }
11002881Smp153739
11012881Smp153739 if (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
11022881Smp153739 name,
11032881Smp153739 ACL_LIST,
11042881Smp153739 NULL,
11052881Smp153739 NULL)) {
11062881Smp153739 ret.code = KADM5_AUTH_LIST;
11072881Smp153739
11082881Smp153739 audit_kadmind_unauth(rqstp->rq_xprt, l_port,
11092881Smp153739 "kadm5_get_principals",
11102881Smp153739 prime_arg, client_name);
11113998Ssemery log_unauth("kadm5_get_principals", prime_arg, client_name,
11122881Smp153739 service_name, client_addr(rqstp, buf));
11132881Smp153739 } else {
11142881Smp153739 ret.code = kadm5_get_principals((void *)handle,
11152881Smp153739 arg->exp, &ret.princs,
11162881Smp153739 &ret.count);
11177934SMark.Phalan@Sun.COM /* Solaris Kerberos */
11187934SMark.Phalan@Sun.COM if( ret.code != 0 )
11197934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
11200Sstevel@tonic-gate
11210Sstevel@tonic-gate audit_kadmind_auth(rqstp->rq_xprt, l_port,
11222881Smp153739 "kadm5_get_principals",
11230Sstevel@tonic-gate prime_arg, client_name, ret.code);
11247934SMark.Phalan@Sun.COM log_done("kadm5_get_principals", prime_arg,
11257934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
11267934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
11277934SMark.Phalan@Sun.COM
11287934SMark.Phalan@Sun.COM if (errmsg != NULL)
11297934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
11300Sstevel@tonic-gate }
11310Sstevel@tonic-gate
11320Sstevel@tonic-gate error:
11330Sstevel@tonic-gate if (name)
11340Sstevel@tonic-gate gss_release_name(&min_stat, &name);
11350Sstevel@tonic-gate free_server_handle(handle);
11360Sstevel@tonic-gate if (client_name)
11370Sstevel@tonic-gate free(client_name);
11380Sstevel@tonic-gate if (service_name)
11390Sstevel@tonic-gate free(service_name);
11400Sstevel@tonic-gate return (&ret);
11410Sstevel@tonic-gate }
11420Sstevel@tonic-gate
11430Sstevel@tonic-gate generic_ret *
chpass_principal_2_svc(chpass_arg * arg,struct svc_req * rqstp)11447934SMark.Phalan@Sun.COM chpass_principal_2_svc(chpass_arg *arg, struct svc_req *rqstp)
11450Sstevel@tonic-gate {
11462881Smp153739 static generic_ret ret;
11472881Smp153739 char *prime_arg = NULL;
11482881Smp153739 char *client_name = NULL, *service_name = NULL;
11492881Smp153739 OM_uint32 min_stat;
11502881Smp153739 kadm5_server_handle_t handle;
11517934SMark.Phalan@Sun.COM const char *errmsg = NULL;
11522881Smp153739 gss_name_t name = NULL;
11530Sstevel@tonic-gate
11542881Smp153739 xdr_free(xdr_generic_ret, (char *) &ret);
11550Sstevel@tonic-gate
11562881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
11572881Smp153739 return &ret;
11580Sstevel@tonic-gate
11592881Smp153739 if ((ret.code = check_handle((void *)handle)))
11600Sstevel@tonic-gate goto error;
11612881Smp153739 ret.api_version = handle->api_version;
11622881Smp153739
11632881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
11642881Smp153739 ret.code = KADM5_FAILURE;
11650Sstevel@tonic-gate goto error;
11662881Smp153739 }
11672881Smp153739 if (krb5_unparse_name(handle->context, arg->princ, &prime_arg)) {
11682881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
11690Sstevel@tonic-gate goto error;
11700Sstevel@tonic-gate }
11710Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
11720Sstevel@tonic-gate ret.code = KADM5_FAILURE;
11730Sstevel@tonic-gate goto error;
11740Sstevel@tonic-gate }
11750Sstevel@tonic-gate
11762881Smp153739 if (cmp_gss_krb5_name(handle, name, arg->princ)) {
11772881Smp153739 ret.code = chpass_principal_wrapper_3((void *)handle, arg->princ,
11782881Smp153739 FALSE, 0, NULL, arg->pass);
11792881Smp153739 } else if (!(CHANGEPW_SERVICE(rqstp)) &&
11802881Smp153739 kadm5int_acl_check(handle->context, name,
11812881Smp153739 ACL_CHANGEPW, arg->princ, NULL)) {
11822881Smp153739 ret.code = kadm5_chpass_principal((void *)handle, arg->princ,
11832881Smp153739 arg->pass);
11842881Smp153739 } else {
11850Sstevel@tonic-gate audit_kadmind_unauth(rqstp->rq_xprt, l_port,
11862881Smp153739 "kadm5_chpass_principal",
11870Sstevel@tonic-gate prime_arg, client_name);
11883998Ssemery log_unauth("kadm5_chpass_principal", prime_arg, client_name,
11890Sstevel@tonic-gate service_name, client_addr(rqstp, buf));
11902881Smp153739 ret.code = KADM5_AUTH_CHANGEPW;
11912881Smp153739 }
11920Sstevel@tonic-gate
11932881Smp153739 if(ret.code != KADM5_AUTH_CHANGEPW) {
11947934SMark.Phalan@Sun.COM /* Solaris Kerberos */
11957934SMark.Phalan@Sun.COM if( ret.code != 0 )
11967934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
11977934SMark.Phalan@Sun.COM
11980Sstevel@tonic-gate audit_kadmind_auth(rqstp->rq_xprt, l_port,
11992881Smp153739 "kadm5_chpass_principal",
12000Sstevel@tonic-gate prime_arg, client_name, ret.code);
12013998Ssemery log_done("kadm5_chpass_principal", prime_arg,
12027934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
12037934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
12047934SMark.Phalan@Sun.COM
12057934SMark.Phalan@Sun.COM if (errmsg != NULL)
12067934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
12072881Smp153739 }
12080Sstevel@tonic-gate
12090Sstevel@tonic-gate error:
12100Sstevel@tonic-gate if (name)
12110Sstevel@tonic-gate gss_release_name(&min_stat, &name);
12120Sstevel@tonic-gate free_server_handle(handle);
12130Sstevel@tonic-gate if (prime_arg)
12140Sstevel@tonic-gate free(prime_arg);
12150Sstevel@tonic-gate if (client_name)
12160Sstevel@tonic-gate free(client_name);
12170Sstevel@tonic-gate if (service_name)
12180Sstevel@tonic-gate free(service_name);
12190Sstevel@tonic-gate return (&ret);
12200Sstevel@tonic-gate }
12210Sstevel@tonic-gate
12220Sstevel@tonic-gate generic_ret *
chpass_principal3_2_svc(chpass3_arg * arg,struct svc_req * rqstp)12237934SMark.Phalan@Sun.COM chpass_principal3_2_svc(chpass3_arg *arg, struct svc_req *rqstp)
12240Sstevel@tonic-gate {
12250Sstevel@tonic-gate static generic_ret ret;
12260Sstevel@tonic-gate char *prime_arg = NULL;
12270Sstevel@tonic-gate char *client_name = NULL,
12280Sstevel@tonic-gate *service_name = NULL;
12290Sstevel@tonic-gate OM_uint32 min_stat;
12300Sstevel@tonic-gate kadm5_server_handle_t handle;
12317934SMark.Phalan@Sun.COM const char *errmsg = NULL;
12320Sstevel@tonic-gate gss_name_t name = NULL;
12330Sstevel@tonic-gate
12340Sstevel@tonic-gate xdr_free(xdr_generic_ret, (char *) &ret);
12350Sstevel@tonic-gate
12362881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
12370Sstevel@tonic-gate return &ret;
12380Sstevel@tonic-gate
12392881Smp153739 if ((ret.code = check_handle((void *)handle)))
12400Sstevel@tonic-gate goto error;
12410Sstevel@tonic-gate ret.api_version = handle->api_version;
12420Sstevel@tonic-gate
12430Sstevel@tonic-gate if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
12442881Smp153739 ret.code = KADM5_FAILURE;
12450Sstevel@tonic-gate goto error;
12460Sstevel@tonic-gate }
12470Sstevel@tonic-gate if (krb5_unparse_name(handle->context, arg->princ, &prime_arg)) {
12482881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
12490Sstevel@tonic-gate goto error;
12500Sstevel@tonic-gate }
12510Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
12520Sstevel@tonic-gate ret.code = KADM5_FAILURE;
12530Sstevel@tonic-gate goto error;
12540Sstevel@tonic-gate }
12550Sstevel@tonic-gate
12560Sstevel@tonic-gate if (cmp_gss_krb5_name(handle, name, arg->princ)) {
12572881Smp153739 ret.code = chpass_principal_wrapper_3((void *)handle, arg->princ,
12582881Smp153739 arg->keepold,
12592881Smp153739 arg->n_ks_tuple,
12602881Smp153739 arg->ks_tuple,
12612881Smp153739 arg->pass);
12620Sstevel@tonic-gate } else if (!(CHANGEPW_SERVICE(rqstp)) &&
12632881Smp153739 kadm5int_acl_check(handle->context, name,
12640Sstevel@tonic-gate ACL_CHANGEPW, arg->princ, NULL)) {
12650Sstevel@tonic-gate ret.code = kadm5_chpass_principal_3((void *)handle, arg->princ,
12660Sstevel@tonic-gate arg->keepold,
12670Sstevel@tonic-gate arg->n_ks_tuple,
12680Sstevel@tonic-gate arg->ks_tuple,
12690Sstevel@tonic-gate arg->pass);
12700Sstevel@tonic-gate } else {
12713998Ssemery log_unauth("kadm5_chpass_principal", prime_arg,
12723998Ssemery client_name, service_name, client_addr(rqstp, buf));
12730Sstevel@tonic-gate ret.code = KADM5_AUTH_CHANGEPW;
12740Sstevel@tonic-gate }
12750Sstevel@tonic-gate
12760Sstevel@tonic-gate if(ret.code != KADM5_AUTH_CHANGEPW) {
12777934SMark.Phalan@Sun.COM /* Solaris Kerberos */
12787934SMark.Phalan@Sun.COM if( ret.code != 0 )
12797934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
12807934SMark.Phalan@Sun.COM
12813998Ssemery log_done("kadm5_chpass_principal", prime_arg,
12827934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
12833998Ssemery client_name, service_name, client_addr(rqstp, buf));
12847934SMark.Phalan@Sun.COM
12857934SMark.Phalan@Sun.COM if (errmsg != NULL)
12867934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
12870Sstevel@tonic-gate }
12880Sstevel@tonic-gate
12890Sstevel@tonic-gate error:
12900Sstevel@tonic-gate if (name)
12910Sstevel@tonic-gate gss_release_name(&min_stat, &name);
12920Sstevel@tonic-gate free_server_handle(handle);
12930Sstevel@tonic-gate if (client_name)
12942881Smp153739 free(client_name);
12950Sstevel@tonic-gate if (service_name)
12962881Smp153739 free(service_name);
12970Sstevel@tonic-gate if (prime_arg)
12982881Smp153739 free(prime_arg);
12990Sstevel@tonic-gate return (&ret);
13000Sstevel@tonic-gate }
13010Sstevel@tonic-gate
13020Sstevel@tonic-gate #ifdef SUNWOFF
13030Sstevel@tonic-gate generic_ret *
setv4key_principal_2_svc(setv4key_arg * arg,struct svc_req * rqstp)13047934SMark.Phalan@Sun.COM setv4key_principal_2_svc(setv4key_arg *arg, struct svc_req *rqstp)
13050Sstevel@tonic-gate {
13060Sstevel@tonic-gate static generic_ret ret;
13070Sstevel@tonic-gate char *prime_arg = NULL;
13080Sstevel@tonic-gate char *client_name = NULL,
13090Sstevel@tonic-gate *service_name = NULL;
13100Sstevel@tonic-gate OM_uint32 min_stat;
13110Sstevel@tonic-gate kadm5_server_handle_t handle;
13127934SMark.Phalan@Sun.COM const char *errmsg = NULL;
13130Sstevel@tonic-gate gss_name_t name = NULL;
13140Sstevel@tonic-gate
13150Sstevel@tonic-gate xdr_free(xdr_generic_ret, (char *) &ret);
13160Sstevel@tonic-gate
13172881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
13180Sstevel@tonic-gate return &ret;
13190Sstevel@tonic-gate
13202881Smp153739 if ((ret.code = check_handle((void *)handle)))
13210Sstevel@tonic-gate goto error;
13220Sstevel@tonic-gate ret.api_version = handle->api_version;
13230Sstevel@tonic-gate
13240Sstevel@tonic-gate if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
13252881Smp153739 ret.code = KADM5_FAILURE;
13260Sstevel@tonic-gate goto error;
13270Sstevel@tonic-gate }
13280Sstevel@tonic-gate if (krb5_unparse_name(handle->context, arg->princ, &prime_arg)) {
13292881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
13300Sstevel@tonic-gate goto error;
13310Sstevel@tonic-gate }
13320Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
13330Sstevel@tonic-gate ret.code = KADM5_FAILURE;
13340Sstevel@tonic-gate goto error;
13350Sstevel@tonic-gate }
13360Sstevel@tonic-gate
13370Sstevel@tonic-gate if (!(CHANGEPW_SERVICE(rqstp)) &&
13382881Smp153739 kadm5int_acl_check(handle->context, name,
13392881Smp153739 ACL_SETKEY, arg->princ, NULL)) {
13400Sstevel@tonic-gate ret.code = kadm5_setv4key_principal((void *)handle, arg->princ,
13410Sstevel@tonic-gate arg->keyblock);
13420Sstevel@tonic-gate } else {
13433998Ssemery log_unauth("kadm5_setv4key_principal", prime_arg,
13443998Ssemery client_name, service_name, client_addr(rqstp, buf));
13450Sstevel@tonic-gate ret.code = KADM5_AUTH_SETKEY;
13460Sstevel@tonic-gate }
13470Sstevel@tonic-gate
13480Sstevel@tonic-gate if(ret.code != KADM5_AUTH_SETKEY) {
13497934SMark.Phalan@Sun.COM /* Solaris Kerberos */
13507934SMark.Phalan@Sun.COM if( ret.code != 0 )
13517934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
13527934SMark.Phalan@Sun.COM
13533998Ssemery log_done("kadm5_setv4key_principal", prime_arg,
13547934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
13557934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
13567934SMark.Phalan@Sun.COM
13577934SMark.Phalan@Sun.COM if (errmsg != NULL)
13587934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
13590Sstevel@tonic-gate }
13600Sstevel@tonic-gate
13610Sstevel@tonic-gate error:
13620Sstevel@tonic-gate if (name)
13630Sstevel@tonic-gate gss_release_name(&min_stat, &name);
13640Sstevel@tonic-gate free_server_handle(handle);
13650Sstevel@tonic-gate if (client_name)
13660Sstevel@tonic-gate free(client_name);
13670Sstevel@tonic-gate if (service_name)
13680Sstevel@tonic-gate free(service_name);
13690Sstevel@tonic-gate if (prime_arg)
13700Sstevel@tonic-gate free(prime_arg);
13710Sstevel@tonic-gate return (&ret);
13720Sstevel@tonic-gate }
13730Sstevel@tonic-gate #endif
13740Sstevel@tonic-gate
13750Sstevel@tonic-gate generic_ret *
setkey_principal_2_svc(setkey_arg * arg,struct svc_req * rqstp)13767934SMark.Phalan@Sun.COM setkey_principal_2_svc(setkey_arg *arg, struct svc_req *rqstp)
13770Sstevel@tonic-gate {
13780Sstevel@tonic-gate static generic_ret ret;
13790Sstevel@tonic-gate char *prime_arg;
13800Sstevel@tonic-gate char *client_name,
13810Sstevel@tonic-gate *service_name;
13820Sstevel@tonic-gate OM_uint32 min_stat;
13830Sstevel@tonic-gate kadm5_server_handle_t handle;
13847934SMark.Phalan@Sun.COM const char *errmsg = NULL;
13850Sstevel@tonic-gate gss_name_t name;
13860Sstevel@tonic-gate
13870Sstevel@tonic-gate xdr_free(xdr_generic_ret, (char *) &ret);
13880Sstevel@tonic-gate
13892881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
13900Sstevel@tonic-gate return &ret;
13910Sstevel@tonic-gate
13922881Smp153739 if ((ret.code = check_handle((void *)handle)))
13930Sstevel@tonic-gate goto error;
13940Sstevel@tonic-gate ret.api_version = handle->api_version;
13950Sstevel@tonic-gate
13960Sstevel@tonic-gate if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
13972881Smp153739 ret.code = KADM5_FAILURE;
13980Sstevel@tonic-gate goto error;
13990Sstevel@tonic-gate }
14000Sstevel@tonic-gate if (krb5_unparse_name(handle->context, arg->princ, &prime_arg)) {
14012881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
14020Sstevel@tonic-gate goto error;
14030Sstevel@tonic-gate }
14040Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
14052881Smp153739 ret.code = KADM5_FAILURE;
14060Sstevel@tonic-gate goto error;
14070Sstevel@tonic-gate }
14080Sstevel@tonic-gate
14090Sstevel@tonic-gate if (!(CHANGEPW_SERVICE(rqstp)) &&
14102881Smp153739 kadm5int_acl_check(handle->context, name, ACL_SETKEY, arg->princ, NULL)) {
14110Sstevel@tonic-gate ret.code = kadm5_setkey_principal((void *)handle, arg->princ,
14120Sstevel@tonic-gate arg->keyblocks, arg->n_keys);
14130Sstevel@tonic-gate } else {
14143998Ssemery log_unauth("kadm5_setkey_principal", prime_arg,
14153998Ssemery client_name, service_name, client_addr(rqstp, buf));
14160Sstevel@tonic-gate ret.code = KADM5_AUTH_SETKEY;
14170Sstevel@tonic-gate }
14180Sstevel@tonic-gate
14190Sstevel@tonic-gate if(ret.code != KADM5_AUTH_SETKEY) {
14207934SMark.Phalan@Sun.COM /* Solaris Kerberos */
14217934SMark.Phalan@Sun.COM if( ret.code != 0 )
14227934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
14237934SMark.Phalan@Sun.COM
14243998Ssemery log_done("kadm5_setkey_principal", prime_arg,
14257934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
14267934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
14277934SMark.Phalan@Sun.COM
14287934SMark.Phalan@Sun.COM if (errmsg != NULL)
14297934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
14300Sstevel@tonic-gate }
14310Sstevel@tonic-gate
14320Sstevel@tonic-gate error:
14330Sstevel@tonic-gate if (name)
14340Sstevel@tonic-gate gss_release_name(&min_stat, &name);
14350Sstevel@tonic-gate free_server_handle(handle);
14360Sstevel@tonic-gate if (client_name)
14372881Smp153739 free(client_name);
14380Sstevel@tonic-gate if (service_name)
14392881Smp153739 free(service_name);
14400Sstevel@tonic-gate if (prime_arg)
14412881Smp153739 free(prime_arg);
14420Sstevel@tonic-gate return (&ret);
14430Sstevel@tonic-gate }
14440Sstevel@tonic-gate
14450Sstevel@tonic-gate generic_ret *
setkey_principal3_2_svc(setkey3_arg * arg,struct svc_req * rqstp)14467934SMark.Phalan@Sun.COM setkey_principal3_2_svc(setkey3_arg *arg, struct svc_req *rqstp)
14470Sstevel@tonic-gate {
14480Sstevel@tonic-gate static generic_ret ret;
14490Sstevel@tonic-gate char *prime_arg = NULL;
14500Sstevel@tonic-gate char *client_name = NULL,
14510Sstevel@tonic-gate *service_name = NULL;
14520Sstevel@tonic-gate OM_uint32 min_stat;
14530Sstevel@tonic-gate kadm5_server_handle_t handle;
14547934SMark.Phalan@Sun.COM const char *errmsg = NULL;
14550Sstevel@tonic-gate gss_name_t name = NULL;
14560Sstevel@tonic-gate
14570Sstevel@tonic-gate xdr_free(xdr_generic_ret, (char *) &ret);
14580Sstevel@tonic-gate
14592881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
14600Sstevel@tonic-gate return &ret;
14610Sstevel@tonic-gate
14622881Smp153739 if ((ret.code = check_handle((void *)handle)))
14630Sstevel@tonic-gate goto error;
14640Sstevel@tonic-gate ret.api_version = handle->api_version;
14650Sstevel@tonic-gate
14660Sstevel@tonic-gate if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
14672881Smp153739 ret.code = KADM5_FAILURE;
14680Sstevel@tonic-gate goto error;
14690Sstevel@tonic-gate }
14700Sstevel@tonic-gate if (krb5_unparse_name(handle->context, arg->princ, &prime_arg)) {
14712881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
14720Sstevel@tonic-gate goto error;
14730Sstevel@tonic-gate }
14740Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
14752881Smp153739 ret.code = KADM5_FAILURE;
14760Sstevel@tonic-gate goto error;
14770Sstevel@tonic-gate }
14780Sstevel@tonic-gate
14790Sstevel@tonic-gate if (!(CHANGEPW_SERVICE(rqstp)) &&
14802881Smp153739 kadm5int_acl_check(handle->context, name,
14812881Smp153739 ACL_SETKEY, arg->princ, NULL)) {
14820Sstevel@tonic-gate ret.code = kadm5_setkey_principal_3((void *)handle, arg->princ,
14830Sstevel@tonic-gate arg->keepold,
14840Sstevel@tonic-gate arg->n_ks_tuple,
14850Sstevel@tonic-gate arg->ks_tuple,
14860Sstevel@tonic-gate arg->keyblocks, arg->n_keys);
14870Sstevel@tonic-gate } else {
14883998Ssemery log_unauth("kadm5_setkey_principal", prime_arg,
14893998Ssemery client_name, service_name, client_addr(rqstp, buf));
14900Sstevel@tonic-gate ret.code = KADM5_AUTH_SETKEY;
14910Sstevel@tonic-gate }
14920Sstevel@tonic-gate
14930Sstevel@tonic-gate if(ret.code != KADM5_AUTH_SETKEY) {
14947934SMark.Phalan@Sun.COM /* Solaris Kerberos */
14957934SMark.Phalan@Sun.COM if( ret.code != 0 )
14967934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
14977934SMark.Phalan@Sun.COM
14983998Ssemery log_done("kadm5_setkey_principal", prime_arg,
14997934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
15007934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
15017934SMark.Phalan@Sun.COM
15027934SMark.Phalan@Sun.COM if (errmsg != NULL)
15037934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
15040Sstevel@tonic-gate }
15050Sstevel@tonic-gate
15060Sstevel@tonic-gate error:
15070Sstevel@tonic-gate if (name)
15080Sstevel@tonic-gate gss_release_name(&min_stat, &name);
15090Sstevel@tonic-gate free_server_handle(handle);
15100Sstevel@tonic-gate if (client_name)
15110Sstevel@tonic-gate free(client_name);
15120Sstevel@tonic-gate if (service_name)
15132881Smp153739 free(service_name);
15140Sstevel@tonic-gate if (prime_arg)
15152881Smp153739 free(prime_arg);
15162881Smp153739 return &ret;
15170Sstevel@tonic-gate }
15180Sstevel@tonic-gate
15190Sstevel@tonic-gate chrand_ret *
chrand_principal_2_svc(chrand_arg * arg,struct svc_req * rqstp)15207934SMark.Phalan@Sun.COM chrand_principal_2_svc(chrand_arg *arg, struct svc_req *rqstp)
15210Sstevel@tonic-gate {
15222881Smp153739 static chrand_ret ret;
15232881Smp153739 krb5_keyblock *k;
15242881Smp153739 int nkeys;
15252881Smp153739 char *prime_arg = NULL, *funcname;
15262881Smp153739 char *client_name = NULL, *service_name = NULL;
15272881Smp153739 OM_uint32 min_stat;
15282881Smp153739 kadm5_server_handle_t handle;
15297934SMark.Phalan@Sun.COM const char *errmsg = NULL;
15302881Smp153739 gss_name_t name = NULL;
15310Sstevel@tonic-gate
15322881Smp153739 xdr_free(xdr_chrand_ret, (char *) &ret);
15330Sstevel@tonic-gate
15342881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
15352881Smp153739 return &ret;
15360Sstevel@tonic-gate
15372881Smp153739 if ((ret.code = check_handle((void *)handle)))
15380Sstevel@tonic-gate goto error;
15392881Smp153739
15402881Smp153739 ret.api_version = handle->api_version;
15410Sstevel@tonic-gate
15422881Smp153739 funcname = handle->api_version == KADM5_API_VERSION_1 ?
15432881Smp153739 "kadm5_randkey_principal (V1)" : "kadm5_randkey_principal";
15440Sstevel@tonic-gate
15452881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
15462881Smp153739 ret.code = KADM5_FAILURE;
15470Sstevel@tonic-gate goto error;
15482881Smp153739 }
15492881Smp153739 if (krb5_unparse_name(handle->context, arg->princ, &prime_arg)) {
15502881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
15510Sstevel@tonic-gate goto error;
15522881Smp153739 }
15530Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
15540Sstevel@tonic-gate ret.code = KADM5_FAILURE;
15550Sstevel@tonic-gate goto error;
15560Sstevel@tonic-gate }
15570Sstevel@tonic-gate
15582881Smp153739 if (cmp_gss_krb5_name(handle, name, arg->princ)) {
15593641Ssemery ret.code = randkey_principal_wrapper((void *)handle, arg->princ, &k,
15603641Ssemery &nkeys);
15612881Smp153739 } else if (!(CHANGEPW_SERVICE(rqstp)) &&
15622881Smp153739 kadm5int_acl_check(handle->context, name,
15632881Smp153739 ACL_CHANGEPW, arg->princ, NULL)) {
15642881Smp153739 ret.code = kadm5_randkey_principal((void *)handle, arg->princ,
15652881Smp153739 &k, &nkeys);
15662881Smp153739 } else {
15670Sstevel@tonic-gate audit_kadmind_unauth(rqstp->rq_xprt, l_port,
15680Sstevel@tonic-gate funcname, prime_arg, client_name);
15693998Ssemery log_unauth(funcname, prime_arg,
15703998Ssemery client_name, service_name, client_addr(rqstp, buf));
15712881Smp153739 ret.code = KADM5_AUTH_CHANGEPW;
15722881Smp153739 }
15730Sstevel@tonic-gate
15742881Smp153739 if(ret.code == KADM5_OK) {
15752881Smp153739 if (handle->api_version == KADM5_API_VERSION_1) {
15762881Smp153739 krb5_copy_keyblock_contents(handle->context, k, &ret.key);
15772881Smp153739 krb5_free_keyblock(handle->context, k);
15782881Smp153739 } else {
15792881Smp153739 ret.keys = k;
15802881Smp153739 ret.n_keys = nkeys;
15812881Smp153739 }
15822881Smp153739 }
15832881Smp153739
15842881Smp153739 if(ret.code != KADM5_AUTH_CHANGEPW) {
15857934SMark.Phalan@Sun.COM /* Solaris Kerberos */
15867934SMark.Phalan@Sun.COM if( ret.code != 0 )
15877934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
15887934SMark.Phalan@Sun.COM
15890Sstevel@tonic-gate audit_kadmind_auth(rqstp->rq_xprt, l_port,
15900Sstevel@tonic-gate funcname, prime_arg, client_name, ret.code);
15917934SMark.Phalan@Sun.COM log_done(funcname, prime_arg, errmsg ? errmsg : "success",
15927934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
15937934SMark.Phalan@Sun.COM
15947934SMark.Phalan@Sun.COM if (errmsg != NULL)
15957934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
15967934SMark.Phalan@Sun.COM }
15970Sstevel@tonic-gate
15980Sstevel@tonic-gate error:
15990Sstevel@tonic-gate if (name)
16000Sstevel@tonic-gate gss_release_name(&min_stat, &name);
16010Sstevel@tonic-gate free_server_handle(handle);
16020Sstevel@tonic-gate if (prime_arg)
16032881Smp153739 free(prime_arg);
16042881Smp153739 if (client_name)
16052881Smp153739 free(client_name);
16062881Smp153739 if (service_name)
16072881Smp153739 free(service_name);
16082881Smp153739 return &ret;
16090Sstevel@tonic-gate }
16100Sstevel@tonic-gate
16110Sstevel@tonic-gate chrand_ret *
chrand_principal3_2_svc(chrand3_arg * arg,struct svc_req * rqstp)16127934SMark.Phalan@Sun.COM chrand_principal3_2_svc(chrand3_arg *arg, struct svc_req *rqstp)
16130Sstevel@tonic-gate {
16140Sstevel@tonic-gate static chrand_ret ret;
16150Sstevel@tonic-gate krb5_keyblock *k;
16160Sstevel@tonic-gate int nkeys;
16170Sstevel@tonic-gate char *prime_arg = NULL, *funcname;
16180Sstevel@tonic-gate char *client_name = NULL,
16190Sstevel@tonic-gate *service_name = NULL;
16200Sstevel@tonic-gate OM_uint32 min_stat;
16210Sstevel@tonic-gate kadm5_server_handle_t handle;
16227934SMark.Phalan@Sun.COM const char *errmsg = NULL;
16230Sstevel@tonic-gate gss_name_t name = NULL;
16240Sstevel@tonic-gate
16250Sstevel@tonic-gate xdr_free(xdr_chrand_ret, (char *) &ret);
16260Sstevel@tonic-gate
16272881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
16280Sstevel@tonic-gate return &ret;
16290Sstevel@tonic-gate
16302881Smp153739 if ((ret.code = check_handle((void *)handle)))
16310Sstevel@tonic-gate goto error;
16320Sstevel@tonic-gate ret.api_version = handle->api_version;
16330Sstevel@tonic-gate
16340Sstevel@tonic-gate funcname = handle->api_version == KADM5_API_VERSION_1 ?
16350Sstevel@tonic-gate "kadm5_randkey_principal (V1)" : "kadm5_randkey_principal";
16360Sstevel@tonic-gate
16370Sstevel@tonic-gate if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
16380Sstevel@tonic-gate ret.code = KADM5_FAILURE;
16390Sstevel@tonic-gate goto error;
16400Sstevel@tonic-gate }
16410Sstevel@tonic-gate if (krb5_unparse_name(handle->context, arg->princ, &prime_arg)) {
16422881Smp153739 ret.code = KADM5_BAD_PRINCIPAL;
16430Sstevel@tonic-gate goto error;
16440Sstevel@tonic-gate }
16450Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
16460Sstevel@tonic-gate ret.code = KADM5_FAILURE;
16470Sstevel@tonic-gate goto error;
16480Sstevel@tonic-gate }
16490Sstevel@tonic-gate
16500Sstevel@tonic-gate if (cmp_gss_krb5_name(handle, name, arg->princ)) {
16512881Smp153739 ret.code = randkey_principal_wrapper_3((void *)handle, arg->princ,
16522881Smp153739 arg->keepold,
16532881Smp153739 arg->n_ks_tuple,
16542881Smp153739 arg->ks_tuple,
16552881Smp153739 &k, &nkeys);
16560Sstevel@tonic-gate } else if (!(CHANGEPW_SERVICE(rqstp)) &&
16572881Smp153739 kadm5int_acl_check(handle->context, name,
16580Sstevel@tonic-gate ACL_CHANGEPW, arg->princ, NULL)) {
16590Sstevel@tonic-gate ret.code = kadm5_randkey_principal_3((void *)handle, arg->princ,
16600Sstevel@tonic-gate arg->keepold,
16610Sstevel@tonic-gate arg->n_ks_tuple,
16620Sstevel@tonic-gate arg->ks_tuple,
16630Sstevel@tonic-gate &k, &nkeys);
16640Sstevel@tonic-gate } else {
16653998Ssemery log_unauth(funcname, prime_arg,
16663998Ssemery client_name, service_name, client_addr(rqstp, buf));
16670Sstevel@tonic-gate ret.code = KADM5_AUTH_CHANGEPW;
16680Sstevel@tonic-gate }
16690Sstevel@tonic-gate
16700Sstevel@tonic-gate if(ret.code == KADM5_OK) {
16710Sstevel@tonic-gate if (handle->api_version == KADM5_API_VERSION_1) {
16720Sstevel@tonic-gate krb5_copy_keyblock_contents(handle->context, k, &ret.key);
16730Sstevel@tonic-gate krb5_free_keyblock(handle->context, k);
16740Sstevel@tonic-gate } else {
16750Sstevel@tonic-gate ret.keys = k;
16760Sstevel@tonic-gate ret.n_keys = nkeys;
16770Sstevel@tonic-gate }
16780Sstevel@tonic-gate }
16790Sstevel@tonic-gate
16800Sstevel@tonic-gate if(ret.code != KADM5_AUTH_CHANGEPW) {
16817934SMark.Phalan@Sun.COM /* Solaris Kerberos */
16827934SMark.Phalan@Sun.COM if( ret.code != 0 )
16837934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
16847934SMark.Phalan@Sun.COM
16857934SMark.Phalan@Sun.COM log_done(funcname, prime_arg, errmsg ? errmsg : "success",
16867934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
16877934SMark.Phalan@Sun.COM
16887934SMark.Phalan@Sun.COM if (errmsg != NULL)
16897934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
16900Sstevel@tonic-gate }
16910Sstevel@tonic-gate
16920Sstevel@tonic-gate error:
16930Sstevel@tonic-gate if (name)
16940Sstevel@tonic-gate gss_release_name(&min_stat, &name);
16950Sstevel@tonic-gate free_server_handle(handle);
16960Sstevel@tonic-gate if (client_name)
16970Sstevel@tonic-gate free(client_name);
16980Sstevel@tonic-gate if (service_name)
16990Sstevel@tonic-gate free(service_name);
17000Sstevel@tonic-gate if (prime_arg)
17010Sstevel@tonic-gate free(prime_arg);
17020Sstevel@tonic-gate return (&ret);
17030Sstevel@tonic-gate }
17040Sstevel@tonic-gate
17050Sstevel@tonic-gate generic_ret *
create_policy_2_svc(cpol_arg * arg,struct svc_req * rqstp)17067934SMark.Phalan@Sun.COM create_policy_2_svc(cpol_arg *arg, struct svc_req *rqstp)
17070Sstevel@tonic-gate {
17082881Smp153739 static generic_ret ret;
17092881Smp153739 char *prime_arg = NULL;
17102881Smp153739 char *client_name = NULL, *service_name = NULL;
17112881Smp153739 OM_uint32 min_stat;
17122881Smp153739 kadm5_server_handle_t handle;
17137934SMark.Phalan@Sun.COM const char *errmsg = NULL;
17142881Smp153739 gss_name_t name = NULL;
17150Sstevel@tonic-gate
17162881Smp153739 xdr_free(xdr_generic_ret, (char *) &ret);
17170Sstevel@tonic-gate
17182881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
17192881Smp153739 return &ret;
17200Sstevel@tonic-gate
17212881Smp153739 if ((ret.code = check_handle((void *)handle)))
17220Sstevel@tonic-gate goto error;
17232881Smp153739
17242881Smp153739 ret.api_version = handle->api_version;
17250Sstevel@tonic-gate
17262881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
17272881Smp153739 ret.code = KADM5_FAILURE;
17280Sstevel@tonic-gate goto error;
17292881Smp153739 }
17302881Smp153739 prime_arg = arg->rec.policy;
17310Sstevel@tonic-gate
17320Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
17330Sstevel@tonic-gate ret.code = KADM5_FAILURE;
17340Sstevel@tonic-gate goto error;
17350Sstevel@tonic-gate }
17360Sstevel@tonic-gate
17372881Smp153739 if (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
17382881Smp153739 name,
17392881Smp153739 ACL_ADD, NULL, NULL)) {
17402881Smp153739 ret.code = KADM5_AUTH_ADD;
17410Sstevel@tonic-gate
17420Sstevel@tonic-gate audit_kadmind_unauth(rqstp->rq_xprt, l_port,
17430Sstevel@tonic-gate "kadm5_create_policy",
17440Sstevel@tonic-gate prime_arg, client_name);
17453998Ssemery log_unauth("kadm5_create_policy", prime_arg,
17467934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
17477934SMark.Phalan@Sun.COM
17482881Smp153739 } else {
17492881Smp153739 ret.code = kadm5_create_policy((void *)handle, &arg->rec,
17502881Smp153739 arg->mask);
17517934SMark.Phalan@Sun.COM /* Solaris Kerberos */
17527934SMark.Phalan@Sun.COM if( ret.code != 0 )
17537934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
17540Sstevel@tonic-gate
17550Sstevel@tonic-gate audit_kadmind_auth(rqstp->rq_xprt, l_port,
17560Sstevel@tonic-gate "kadm5_create_policy",
17570Sstevel@tonic-gate prime_arg, client_name, ret.code);
17583998Ssemery log_done("kadm5_create_policy",
17597934SMark.Phalan@Sun.COM ((prime_arg == NULL) ? "(null)" : prime_arg),
17607934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
17617934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
17627934SMark.Phalan@Sun.COM
17637934SMark.Phalan@Sun.COM if (errmsg != NULL)
17647934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
17652881Smp153739 }
17660Sstevel@tonic-gate
17670Sstevel@tonic-gate error:
17680Sstevel@tonic-gate if (name)
17690Sstevel@tonic-gate gss_release_name(&min_stat, &name);
17702881Smp153739 free_server_handle(handle);
17712881Smp153739 if (client_name)
17722881Smp153739 free(client_name);
17732881Smp153739 if (service_name)
17742881Smp153739 free(service_name);
17752881Smp153739 return &ret;
17760Sstevel@tonic-gate }
17770Sstevel@tonic-gate
17780Sstevel@tonic-gate generic_ret *
delete_policy_2_svc(dpol_arg * arg,struct svc_req * rqstp)17797934SMark.Phalan@Sun.COM delete_policy_2_svc(dpol_arg *arg, struct svc_req *rqstp)
17800Sstevel@tonic-gate {
17812881Smp153739 static generic_ret ret;
17822881Smp153739 char *prime_arg = NULL;
17832881Smp153739 char *client_name = NULL, *service_name = NULL;
17842881Smp153739 OM_uint32 min_stat;
17852881Smp153739 kadm5_server_handle_t handle;
17867934SMark.Phalan@Sun.COM const char *errmsg = NULL;
17872881Smp153739 gss_name_t name = NULL;
17880Sstevel@tonic-gate
17892881Smp153739 xdr_free(xdr_generic_ret, (char *) &ret);
17900Sstevel@tonic-gate
17912881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
17922881Smp153739 return &ret;
17930Sstevel@tonic-gate
17942881Smp153739 if ((ret.code = check_handle((void *)handle)))
17950Sstevel@tonic-gate goto error;
17962881Smp153739 ret.api_version = handle->api_version;
17970Sstevel@tonic-gate
17982881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
17992881Smp153739 ret.code = KADM5_FAILURE;
18000Sstevel@tonic-gate goto error;
18012881Smp153739 }
18022881Smp153739 prime_arg = arg->name;
18032881Smp153739
18040Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
18050Sstevel@tonic-gate ret.code = KADM5_FAILURE;
18060Sstevel@tonic-gate goto error;
18070Sstevel@tonic-gate }
18080Sstevel@tonic-gate
18092881Smp153739 if (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
18100Sstevel@tonic-gate name,
18112881Smp153739 ACL_DELETE, NULL, NULL)) {
18120Sstevel@tonic-gate
18130Sstevel@tonic-gate audit_kadmind_unauth(rqstp->rq_xprt, l_port,
18140Sstevel@tonic-gate "kadm5_delete_policy",
18150Sstevel@tonic-gate prime_arg, client_name);
18163998Ssemery log_unauth("kadm5_delete_policy", prime_arg,
18173998Ssemery client_name, service_name, client_addr(rqstp, buf));
18182881Smp153739 ret.code = KADM5_AUTH_DELETE;
18192881Smp153739 } else {
18202881Smp153739 ret.code = kadm5_delete_policy((void *)handle, arg->name);
18217934SMark.Phalan@Sun.COM /* Solaris Kerberos */
18227934SMark.Phalan@Sun.COM if( ret.code != 0 )
18237934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
18240Sstevel@tonic-gate
18250Sstevel@tonic-gate audit_kadmind_auth(rqstp->rq_xprt, l_port,
18260Sstevel@tonic-gate "kadm5_delete_policy",
18270Sstevel@tonic-gate prime_arg, client_name, ret.code);
18283998Ssemery log_done("kadm5_delete_policy",
18297934SMark.Phalan@Sun.COM ((prime_arg == NULL) ? "(null)" : prime_arg),
18307934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
18317934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
18327934SMark.Phalan@Sun.COM
18337934SMark.Phalan@Sun.COM if (errmsg != NULL)
18347934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
18352881Smp153739 }
18362881Smp153739
18372881Smp153739 error:
18382881Smp153739 if (name)
18392881Smp153739 gss_release_name(&min_stat, &name);
18402881Smp153739 free_server_handle(handle);
18412881Smp153739 if (client_name)
18422881Smp153739 free(client_name);
18432881Smp153739 if (service_name)
18442881Smp153739 free(service_name);
18452881Smp153739 return &ret;
18462881Smp153739 }
18472881Smp153739
18482881Smp153739 generic_ret *
modify_policy_2_svc(mpol_arg * arg,struct svc_req * rqstp)18497934SMark.Phalan@Sun.COM modify_policy_2_svc(mpol_arg *arg, struct svc_req *rqstp)
18502881Smp153739 {
18512881Smp153739 static generic_ret ret;
18522881Smp153739 char *prime_arg = NULL;
18532881Smp153739 char *client_name = NULL, *service_name = NULL;
18542881Smp153739 OM_uint32 min_stat;
18552881Smp153739 kadm5_server_handle_t handle;
18567934SMark.Phalan@Sun.COM const char *errmsg = NULL;
18572881Smp153739 gss_name_t name = NULL;
18582881Smp153739
18592881Smp153739 xdr_free(xdr_generic_ret, (char *) &ret);
18602881Smp153739
18612881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
18622881Smp153739 return &ret;
18632881Smp153739
18642881Smp153739 if ((ret.code = check_handle((void *)handle)))
18652881Smp153739 goto error;
18662881Smp153739 ret.api_version = handle->api_version;
18672881Smp153739
18682881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
18692881Smp153739 ret.code = KADM5_FAILURE;
18702881Smp153739 goto error;
18712881Smp153739 }
18722881Smp153739 prime_arg = arg->rec.policy;
18732881Smp153739
18742881Smp153739 if (!(name = get_clnt_name(rqstp))) {
18752881Smp153739 ret.code = KADM5_FAILURE;
18762881Smp153739 goto error;
18772881Smp153739 }
18782881Smp153739
18792881Smp153739 if (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
18802881Smp153739 name,
18812881Smp153739 ACL_MODIFY, NULL, NULL)) {
18822881Smp153739
18832881Smp153739 audit_kadmind_unauth(rqstp->rq_xprt, l_port,
18842881Smp153739 "kadm5_modify_policy",
18852881Smp153739 prime_arg, client_name);
18863998Ssemery log_unauth("kadm5_modify_policy", prime_arg,
18873998Ssemery client_name, service_name, client_addr(rqstp, buf));
18882881Smp153739 ret.code = KADM5_AUTH_MODIFY;
18892881Smp153739 } else {
18902881Smp153739 ret.code = kadm5_modify_policy((void *)handle, &arg->rec,
18912881Smp153739 arg->mask);
18927934SMark.Phalan@Sun.COM /* Solaris Kerberos */
18937934SMark.Phalan@Sun.COM if( ret.code != 0 )
18947934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
18952881Smp153739
18962881Smp153739 audit_kadmind_auth(rqstp->rq_xprt, l_port,
18972881Smp153739 "kadm5_modify_policy",
18982881Smp153739 prime_arg, client_name, ret.code);
18993998Ssemery log_done("kadm5_modify_policy",
19007934SMark.Phalan@Sun.COM ((prime_arg == NULL) ? "(null)" : prime_arg),
19017934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
19027934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
19037934SMark.Phalan@Sun.COM
19047934SMark.Phalan@Sun.COM if (errmsg != NULL)
19057934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
19067934SMark.Phalan@Sun.COM }
19070Sstevel@tonic-gate
19080Sstevel@tonic-gate error:
19090Sstevel@tonic-gate if (name)
19100Sstevel@tonic-gate gss_release_name(&min_stat, &name);
19110Sstevel@tonic-gate free_server_handle(handle);
19120Sstevel@tonic-gate if (client_name)
19130Sstevel@tonic-gate free(client_name);
19140Sstevel@tonic-gate if (service_name)
19150Sstevel@tonic-gate free(service_name);
19160Sstevel@tonic-gate return (&ret);
19170Sstevel@tonic-gate }
19180Sstevel@tonic-gate
19192881Smp153739 gpol_ret *
get_policy_2_svc(gpol_arg * arg,struct svc_req * rqstp)19207934SMark.Phalan@Sun.COM get_policy_2_svc(gpol_arg *arg, struct svc_req *rqstp)
19210Sstevel@tonic-gate {
19222881Smp153739 static gpol_ret ret;
19232881Smp153739 kadm5_ret_t ret2;
19242881Smp153739 char *prime_arg = NULL, *funcname;
19252881Smp153739 char *client_name = NULL, *service_name = NULL;
19262881Smp153739 OM_uint32 min_stat;
19272881Smp153739 kadm5_policy_ent_t e;
19282881Smp153739 kadm5_principal_ent_rec caller_ent;
19292881Smp153739 krb5_principal caller;
19302881Smp153739 kadm5_server_handle_t handle;
19317934SMark.Phalan@Sun.COM const char *errmsg = NULL;
19322881Smp153739 gss_name_t name = NULL;
19330Sstevel@tonic-gate
19342881Smp153739 xdr_free(xdr_gpol_ret, (char *) &ret);
19350Sstevel@tonic-gate
19362881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
19372881Smp153739 return &ret;
19380Sstevel@tonic-gate
19392881Smp153739 if ((ret.code = check_handle((void *) handle)))
19402881Smp153739 goto error;
19412881Smp153739
19422881Smp153739 ret.api_version = handle->api_version;
19430Sstevel@tonic-gate
19442881Smp153739 funcname = handle->api_version == KADM5_API_VERSION_1 ?
19452881Smp153739 "kadm5_get_policy (V1)" : "kadm5_get_policy";
19460Sstevel@tonic-gate
19472881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
19482881Smp153739 ret.code = KADM5_FAILURE;
19490Sstevel@tonic-gate goto error;
19502881Smp153739 }
19512881Smp153739 prime_arg = arg->name;
19520Sstevel@tonic-gate ret.code = KADM5_AUTH_GET;
19530Sstevel@tonic-gate
19540Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
19550Sstevel@tonic-gate ret.code = KADM5_FAILURE;
19560Sstevel@tonic-gate goto error;
19570Sstevel@tonic-gate }
19580Sstevel@tonic-gate
19592881Smp153739 if (!CHANGEPW_SERVICE(rqstp) && kadm5int_acl_check(handle->context,
19600Sstevel@tonic-gate name,
19610Sstevel@tonic-gate ACL_INQUIRE, NULL, NULL))
19620Sstevel@tonic-gate ret.code = KADM5_OK;
19630Sstevel@tonic-gate else {
19640Sstevel@tonic-gate ret.code = kadm5_get_principal(handle->lhandle,
19650Sstevel@tonic-gate handle->current_caller,
19660Sstevel@tonic-gate &caller_ent,
19670Sstevel@tonic-gate KADM5_PRINCIPAL_NORMAL_MASK);
19680Sstevel@tonic-gate if (ret.code == KADM5_OK) {
19690Sstevel@tonic-gate if (caller_ent.aux_attributes & KADM5_POLICY &&
19700Sstevel@tonic-gate strcmp(caller_ent.policy, arg->name) == 0) {
19712881Smp153739 ret.code = KADM5_OK;
19722881Smp153739 } else ret.code = KADM5_AUTH_GET;
19732881Smp153739 ret2 = kadm5_free_principal_ent(handle->lhandle,
19742881Smp153739 &caller_ent);
19752881Smp153739 ret.code = ret.code ? ret.code : ret2;
19762881Smp153739 }
19772881Smp153739 }
19782881Smp153739
19792881Smp153739 if (ret.code == KADM5_OK) {
19802881Smp153739 if (handle->api_version == KADM5_API_VERSION_1) {
19812881Smp153739 ret.code = kadm5_get_policy_v1((void *)handle, arg->name, &e);
19822881Smp153739 if(ret.code == KADM5_OK) {
19832881Smp153739 memcpy(&ret.rec, e, sizeof(kadm5_policy_ent_rec));
19842881Smp153739 free(e);
19852881Smp153739 }
19862881Smp153739 } else {
19872881Smp153739 ret.code = kadm5_get_policy((void *)handle, arg->name,
19882881Smp153739 &ret.rec);
19892881Smp153739 }
19902881Smp153739
19917934SMark.Phalan@Sun.COM /* Solaris Kerberos */
19927934SMark.Phalan@Sun.COM if( ret.code != 0 )
19937934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
19947934SMark.Phalan@Sun.COM
19950Sstevel@tonic-gate audit_kadmind_auth(rqstp->rq_xprt, l_port,
19960Sstevel@tonic-gate funcname, prime_arg, client_name, ret.code);
19977934SMark.Phalan@Sun.COM log_done(funcname,
19987934SMark.Phalan@Sun.COM ((prime_arg == NULL) ? "(null)" : prime_arg),
19997934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
20007934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
20017934SMark.Phalan@Sun.COM
20027934SMark.Phalan@Sun.COM if (errmsg != NULL)
20037934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
20047934SMark.Phalan@Sun.COM
20057934SMark.Phalan@Sun.COM } else {
20060Sstevel@tonic-gate audit_kadmind_unauth(rqstp->rq_xprt, l_port,
20070Sstevel@tonic-gate funcname, prime_arg, client_name);
20087934SMark.Phalan@Sun.COM log_unauth(funcname, prime_arg,
20097934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
20102881Smp153739 }
20110Sstevel@tonic-gate
20120Sstevel@tonic-gate error:
20130Sstevel@tonic-gate if (name)
20140Sstevel@tonic-gate gss_release_name(&min_stat, &name);
20150Sstevel@tonic-gate free_server_handle(handle);
20160Sstevel@tonic-gate if (client_name)
20170Sstevel@tonic-gate free(client_name);
20180Sstevel@tonic-gate if (service_name)
20190Sstevel@tonic-gate free(service_name);
20200Sstevel@tonic-gate return (&ret);
20210Sstevel@tonic-gate
20220Sstevel@tonic-gate }
20230Sstevel@tonic-gate
20240Sstevel@tonic-gate gpols_ret *
get_pols_2_svc(gpols_arg * arg,struct svc_req * rqstp)20257934SMark.Phalan@Sun.COM get_pols_2_svc(gpols_arg *arg, struct svc_req *rqstp)
20260Sstevel@tonic-gate {
20272881Smp153739 static gpols_ret ret;
20282881Smp153739 char *prime_arg = NULL;
20292881Smp153739 char *client_name = NULL, *service_name = NULL;
20302881Smp153739 OM_uint32 min_stat;
20312881Smp153739 kadm5_server_handle_t handle;
20327934SMark.Phalan@Sun.COM const char *errmsg = NULL;
20332881Smp153739 gss_name_t name = NULL;
20340Sstevel@tonic-gate
20352881Smp153739 xdr_free(xdr_gpols_ret, (char *) &ret);
20360Sstevel@tonic-gate
20372881Smp153739 if ((ret.code = new_server_handle(arg->api_version, rqstp, &handle)))
20382881Smp153739 return &ret;
20390Sstevel@tonic-gate
20402881Smp153739 if ((ret.code = check_handle((void *)handle)))
20410Sstevel@tonic-gate goto error;
20422881Smp153739
20432881Smp153739 ret.api_version = handle->api_version;
20440Sstevel@tonic-gate
20452881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
20462881Smp153739 ret.code = KADM5_FAILURE;
20472881Smp153739 goto error;
20482881Smp153739 }
20492881Smp153739 prime_arg = arg->exp;
20502881Smp153739 if (prime_arg == NULL)
20512881Smp153739 prime_arg = "*";
20520Sstevel@tonic-gate
20530Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
20540Sstevel@tonic-gate ret.code = KADM5_FAILURE;
20550Sstevel@tonic-gate goto error;
20560Sstevel@tonic-gate }
20570Sstevel@tonic-gate
20582881Smp153739 if (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
20592881Smp153739 name,
20602881Smp153739 ACL_LIST, NULL, NULL)) {
20612881Smp153739 ret.code = KADM5_AUTH_LIST;
20620Sstevel@tonic-gate
20630Sstevel@tonic-gate audit_kadmind_unauth(rqstp->rq_xprt, l_port,
20640Sstevel@tonic-gate "kadm5_get_policies",
20650Sstevel@tonic-gate prime_arg, client_name);
20663998Ssemery log_unauth("kadm5_get_policies", prime_arg,
20677934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
20682881Smp153739 } else {
20692881Smp153739 ret.code = kadm5_get_policies((void *)handle,
20707934SMark.Phalan@Sun.COM arg->exp, &ret.pols,
20717934SMark.Phalan@Sun.COM &ret.count);
20727934SMark.Phalan@Sun.COM /* Solaris Kerberos */
20737934SMark.Phalan@Sun.COM if( ret.code != 0 )
20747934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
20750Sstevel@tonic-gate
20760Sstevel@tonic-gate audit_kadmind_auth(rqstp->rq_xprt, l_port,
20770Sstevel@tonic-gate "kadm5_get_policies",
20780Sstevel@tonic-gate prime_arg, client_name, ret.code);
20797934SMark.Phalan@Sun.COM log_done("kadm5_get_policies", prime_arg,
20807934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
20817934SMark.Phalan@Sun.COM client_name, service_name, client_addr(rqstp, buf));
20827934SMark.Phalan@Sun.COM
20837934SMark.Phalan@Sun.COM if (errmsg != NULL)
20847934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
20852881Smp153739 }
20860Sstevel@tonic-gate
20870Sstevel@tonic-gate error:
20880Sstevel@tonic-gate if (name)
20890Sstevel@tonic-gate gss_release_name(&min_stat, &name);
20900Sstevel@tonic-gate free_server_handle(handle);
20910Sstevel@tonic-gate if (client_name)
20920Sstevel@tonic-gate free(client_name);
20930Sstevel@tonic-gate if (service_name)
20940Sstevel@tonic-gate free(service_name);
20950Sstevel@tonic-gate return (&ret);
20960Sstevel@tonic-gate }
20970Sstevel@tonic-gate
get_privs_2_svc(krb5_ui_4 * arg,struct svc_req * rqstp)20987934SMark.Phalan@Sun.COM getprivs_ret * get_privs_2_svc(krb5_ui_4 *arg, struct svc_req *rqstp)
20990Sstevel@tonic-gate {
21002881Smp153739 static getprivs_ret ret;
21012881Smp153739 char *client_name = NULL, *service_name = NULL;
21022881Smp153739 OM_uint32 min_stat;
21032881Smp153739 kadm5_server_handle_t handle;
21047934SMark.Phalan@Sun.COM const char *errmsg = NULL;
21052881Smp153739 gss_name_t name = NULL;
21060Sstevel@tonic-gate
21072881Smp153739 xdr_free(xdr_getprivs_ret, (char *) &ret);
21080Sstevel@tonic-gate
21092881Smp153739 if ((ret.code = new_server_handle(*arg, rqstp, &handle)))
21102881Smp153739 return &ret;
21110Sstevel@tonic-gate
21122881Smp153739 if ((ret.code = check_handle((void *)handle)))
21130Sstevel@tonic-gate goto error;
21142881Smp153739
21152881Smp153739 ret.api_version = handle->api_version;
21160Sstevel@tonic-gate
21172881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
21182881Smp153739 ret.code = KADM5_FAILURE;
21192881Smp153739 goto error;
21202881Smp153739 }
21210Sstevel@tonic-gate if (!(name = get_clnt_name(rqstp))) {
21220Sstevel@tonic-gate ret.code = KADM5_FAILURE;
21230Sstevel@tonic-gate goto error;
21240Sstevel@tonic-gate }
21250Sstevel@tonic-gate
21260Sstevel@tonic-gate ret.code = __kadm5_get_priv((void *) handle, &ret.privs, name);
21277934SMark.Phalan@Sun.COM /* Solaris Kerberos */
21287934SMark.Phalan@Sun.COM if( ret.code != 0 )
21297934SMark.Phalan@Sun.COM errmsg = krb5_get_error_message(handle ? handle->context : NULL, ret.code);
21300Sstevel@tonic-gate
21310Sstevel@tonic-gate audit_kadmind_auth(rqstp->rq_xprt, l_port,
21320Sstevel@tonic-gate "kadm5_get_privs", NULL, client_name,
21330Sstevel@tonic-gate ret.code);
21343998Ssemery log_done("kadm5_get_privs", client_name,
21357934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
21360Sstevel@tonic-gate client_name, service_name, client_addr(rqstp, buf));
21377934SMark.Phalan@Sun.COM
21387934SMark.Phalan@Sun.COM if (errmsg != NULL)
21397934SMark.Phalan@Sun.COM krb5_free_error_message(handle ? handle->context : NULL, errmsg);
21400Sstevel@tonic-gate
21410Sstevel@tonic-gate error:
21420Sstevel@tonic-gate if (name)
21430Sstevel@tonic-gate gss_release_name(&min_stat, &name);
21440Sstevel@tonic-gate free_server_handle(handle);
21450Sstevel@tonic-gate if (client_name)
21460Sstevel@tonic-gate free(client_name);
21470Sstevel@tonic-gate if (service_name)
21480Sstevel@tonic-gate free(service_name);
21490Sstevel@tonic-gate return (&ret);
21500Sstevel@tonic-gate }
21510Sstevel@tonic-gate
init_2_svc(krb5_ui_4 * arg,struct svc_req * rqstp)21527934SMark.Phalan@Sun.COM generic_ret *init_2_svc(krb5_ui_4 *arg, struct svc_req *rqstp)
21530Sstevel@tonic-gate {
21542881Smp153739 static generic_ret ret;
21553998Ssemery char *client_name, *service_name;
21563998Ssemery kadm5_server_handle_t handle;
21577934SMark.Phalan@Sun.COM const char *errmsg = NULL;
21583998Ssemery size_t clen, slen;
21593998Ssemery char *cdots, *sdots;
21600Sstevel@tonic-gate
21612881Smp153739 xdr_free(xdr_generic_ret, (char *) &ret);
21620Sstevel@tonic-gate
21632881Smp153739 if ((ret.code = new_server_handle(*arg, rqstp, &handle)))
21642881Smp153739 return &ret;
21652881Smp153739 if (! (ret.code = check_handle((void *)handle))) {
21662881Smp153739 ret.api_version = handle->api_version;
21672881Smp153739 }
21680Sstevel@tonic-gate
21692881Smp153739 free_server_handle(handle);
21702881Smp153739
21712881Smp153739 if (setup_gss_names(rqstp, &client_name, &service_name) < 0) {
21722881Smp153739 ret.code = KADM5_FAILURE;
21732881Smp153739 return &ret;
21742881Smp153739 }
21750Sstevel@tonic-gate
21767934SMark.Phalan@Sun.COM /* Solaris Kerberos */
21777934SMark.Phalan@Sun.COM if (ret.code != 0)
2178*12492SZdenek.Kotala@Sun.COM errmsg = krb5_get_error_message(NULL, ret.code);
21797934SMark.Phalan@Sun.COM
21800Sstevel@tonic-gate audit_kadmind_auth(rqstp->rq_xprt, l_port,
21810Sstevel@tonic-gate (ret.api_version == KADM5_API_VERSION_1 ?
21820Sstevel@tonic-gate "kadm5_init (V1)" : "kadm5_init"),
21830Sstevel@tonic-gate NULL, client_name, ret.code);
21843998Ssemery
21857934SMark.Phalan@Sun.COM clen = strlen(client_name);
21867934SMark.Phalan@Sun.COM trunc_name(&clen, &cdots);
21877934SMark.Phalan@Sun.COM slen = strlen(service_name);
21887934SMark.Phalan@Sun.COM trunc_name(&slen, &sdots);
21897934SMark.Phalan@Sun.COM krb5_klog_syslog(LOG_NOTICE, "Request: %s, %.*s%s, %s, "
21907934SMark.Phalan@Sun.COM "client=%.*s%s, service=%.*s%s, addr=%s, flavor=%d",
21917934SMark.Phalan@Sun.COM (ret.api_version == KADM5_API_VERSION_1 ?
21927934SMark.Phalan@Sun.COM "kadm5_init (V1)" : "kadm5_init"),
21937934SMark.Phalan@Sun.COM clen, client_name, cdots,
21947934SMark.Phalan@Sun.COM errmsg ? errmsg : "success",
21957934SMark.Phalan@Sun.COM clen, client_name, cdots,
21967934SMark.Phalan@Sun.COM slen, service_name, sdots,
21977934SMark.Phalan@Sun.COM client_addr(rqstp, buf),
21987934SMark.Phalan@Sun.COM rqstp->rq_cred.oa_flavor);
21997934SMark.Phalan@Sun.COM if (errmsg != NULL)
2200*12492SZdenek.Kotala@Sun.COM krb5_free_error_message(NULL, errmsg);
22010Sstevel@tonic-gate free(client_name);
22020Sstevel@tonic-gate free(service_name);
22030Sstevel@tonic-gate
22040Sstevel@tonic-gate return (&ret);
22050Sstevel@tonic-gate }
2206