1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
3 * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved
7 #include <k5-platform.h>
8 #include <socket-utils.h>
9 #include <gssapi/gssapi.h>
10 #include <gssapi/gssapi_krb5.h> /* for gss_nt_krb5_name */
12 #include <kadm5/admin.h>
13 #include <kadm5/kadm_rpc.h>
14 #include <kadm5/server_internal.h>
15 #include <kadm5/server_acl.h>
17 #include <adm_proto.h> /* krb5_klog_syslog */
20 extern gss_name_t gss_changepw_name;
21 extern gss_name_t gss_oldchangepw_name;
22 extern void * global_server_handle;
24 #define CHANGEPW_SERVICE(rqstp) \
25 (cmp_gss_names_rel_1(acceptor_name(rqstp->rq_svccred), gss_changepw_name) | \
26 (gss_oldchangepw_name && \
27 cmp_gss_names_rel_1(acceptor_name(rqstp->rq_svccred), \
28 gss_oldchangepw_name)))
31 static int gss_to_krb5_name(kadm5_server_handle_t handle,
32 gss_name_t gss_name, krb5_principal *princ);
34 static int gss_name_to_string(gss_name_t gss_name, gss_buffer_desc *str);
36 static gss_name_t acceptor_name(gss_ctx_id_t context);
38 gss_name_t rqst2name(struct svc_req *rqstp);
40 static int cmp_gss_names(gss_name_t n1, gss_name_t n2)
45 if (GSS_ERROR(gss_compare_name(&emin, n1, n2, &equal)))
51 /* Does a comparison of the names and then releases the first entity */
52 /* For use above in CHANGEPW_SERVICE */
53 static int cmp_gss_names_rel_1(gss_name_t n1, gss_name_t n2)
58 ret = cmp_gss_names(n1, n2);
59 if (n1) (void) gss_release_name(&min_stat, &n1);
64 * Function check_handle
66 * Purpose: Check a server handle and return a com_err code if it is
67 * invalid or 0 if it is valid.
71 * handle The server handle.
74 static int check_handle(void *handle)
81 * Function: new_server_handle
83 * Purpose: Constructs a server handle suitable for passing into the
84 * server library API functions, by folding the client's API version
85 * and calling principal into the server handle returned by
89 * api_version (input) The API version specified by the client
90 * rqstp (input) The RPC request
91 * handle (output) The returned handle
92 * <return value> (output) An error code, or 0 if no error occurred
95 * Returns a pointer to allocated storage containing the server
96 * handle. If an error occurs, then no allocated storage is
97 * returned, and the return value of the function will be a
98 * non-zero com_err code.
100 * The allocated storage for the handle should be freed with
101 * free_server_handle (see below) when it is no longer needed.
104 static kadm5_ret_t new_server_handle(krb5_ui_4 api_version,
105 struct svc_req *rqstp,
106 kadm5_server_handle_t
109 kadm5_server_handle_t handle;
113 if (! (handle = (kadm5_server_handle_t)
114 malloc(sizeof(*handle))))
117 *handle = *(kadm5_server_handle_t)global_server_handle;
118 handle->api_version = api_version;
120 if (! gss_to_krb5_name(handle, rqst2name(rqstp),
121 &handle->current_caller)) {
123 return KADM5_FAILURE;
126 *out_handle = handle;
131 * Function: free_server_handle
133 * Purpose: Free handle memory allocated by new_server_handle
136 * handle (input/output) The handle to free
138 static void free_server_handle(kadm5_server_handle_t handle)
142 krb5_free_principal(handle->context, handle->current_caller);
146 /* Result is stored in a static buffer and is invalidated by the next call. */
148 client_addr(SVCXPRT *xprt)
150 static char abuf[128];
151 struct sockaddr_storage ss;
152 socklen_t len = sizeof(ss);
153 const char *p = NULL;
155 if (getpeername(xprt->xp_sock, ss2sa(&ss), &len) != 0)
157 if (ss2sa(&ss)->sa_family == AF_INET)
158 p = inet_ntop(AF_INET, &ss2sin(&ss)->sin_addr, abuf, sizeof(abuf));
159 else if (ss2sa(&ss)->sa_family == AF_INET6)
160 p = inet_ntop(AF_INET6, &ss2sin6(&ss)->sin6_addr, abuf, sizeof(abuf));
161 return (p == NULL) ? "(unknown)" : p;
165 * Function: setup_gss_names
167 * Purpose: Create printable representations of the client and server
171 * rqstp (r) the RPC request
172 * client_name (w) the gss_buffer_t for the client name
173 * server_name (w) the gss_buffer_t for the server name
177 * Unparses the client and server names into client_name and
178 * server_name, both of which must be freed by the caller. Returns 0
179 * on success and -1 on failure.
181 int setup_gss_names(struct svc_req *rqstp,
182 gss_buffer_desc *client_name,
183 gss_buffer_desc *server_name)
185 OM_uint32 maj_stat, min_stat;
186 gss_name_t server_gss_name;
188 if (gss_name_to_string(rqst2name(rqstp), client_name) != 0)
190 maj_stat = gss_inquire_context(&min_stat, rqstp->rq_svccred, NULL,
191 &server_gss_name, NULL, NULL, NULL,
193 if (maj_stat != GSS_S_COMPLETE) {
194 gss_release_buffer(&min_stat, client_name);
195 gss_release_name(&min_stat, &server_gss_name);
198 if (gss_name_to_string(server_gss_name, server_name) != 0) {
199 gss_release_buffer(&min_stat, client_name);
200 gss_release_name(&min_stat, &server_gss_name);
203 gss_release_name(&min_stat, &server_gss_name);
207 static gss_name_t acceptor_name(gss_ctx_id_t context)
209 OM_uint32 maj_stat, min_stat;
212 maj_stat = gss_inquire_context(&min_stat, context, NULL, &name,
213 NULL, NULL, NULL, NULL, NULL);
214 if (maj_stat != GSS_S_COMPLETE)
219 static int cmp_gss_krb5_name(kadm5_server_handle_t handle,
220 gss_name_t gss_name, krb5_principal princ)
222 krb5_principal princ2;
225 if (! gss_to_krb5_name(handle, gss_name, &princ2))
227 status = krb5_principal_compare(handle->context, princ, princ2);
228 krb5_free_principal(handle->context, princ2);
232 static int gss_to_krb5_name(kadm5_server_handle_t handle,
233 gss_name_t gss_name, krb5_principal *princ)
235 OM_uint32 minor_stat;
236 gss_buffer_desc gss_str;
240 if (gss_name_to_string(gss_name, &gss_str) != 0)
242 if (asprintf(&s, "%.*s", (int)gss_str.length, (char *)gss_str.value) < 0) {
243 gss_release_buffer(&minor_stat, &gss_str);
246 success = (krb5_parse_name(handle->context, s, princ) == 0);
248 gss_release_buffer(&minor_stat, &gss_str);
253 gss_name_to_string(gss_name_t gss_name, gss_buffer_desc *str)
255 OM_uint32 status, minor_stat;
257 const char pref[] = KRB5_WELLKNOWN_NAMESTR "/" KRB5_ANONYMOUS_PRINCSTR "@";
258 const size_t preflen = sizeof(pref) - 1;
260 status = gss_display_name(&minor_stat, gss_name, str, &gss_type);
261 if (status != GSS_S_COMPLETE)
263 if (gss_oid_equal(gss_type, GSS_C_NT_ANONYMOUS)) {
264 /* Guard against non-krb5 mechs with different anonymous displays. */
265 if (str->length < preflen || memcmp(str->value, pref, preflen) != 0)
267 } else if (!gss_oid_equal(gss_type, GSS_KRB5_NT_PRINCIPAL_NAME)) {
274 * Perform common initialization for server stub functions. A subset of the
275 * output arguments may be set on failure; the caller is responsible for
276 * initializing outputs and calling stub_cleanup() on success or failure.
277 * princ and princ_str_out may be NULL to omit unparsing a principal name.
280 stub_setup(krb5_ui_4 api_version, struct svc_req *rqstp, krb5_principal princ,
281 kadm5_server_handle_t *handle_out, krb5_ui_4 *api_version_out,
282 gss_buffer_t client_name_out, gss_buffer_t service_name_out,
283 char **princ_str_out)
287 ret = new_server_handle(api_version, rqstp, handle_out);
291 ret = check_handle(*handle_out);
295 *api_version_out = (*handle_out)->api_version;
297 if (setup_gss_names(rqstp, client_name_out, service_name_out) < 0)
298 return KADM5_FAILURE;
300 if (princ_str_out != NULL) {
302 return KADM5_BAD_PRINCIPAL;
303 if (krb5_unparse_name((*handle_out)->context, princ, princ_str_out))
304 return KADM5_BAD_PRINCIPAL;
310 /* Perform common cleanup for server stub functions. */
312 stub_cleanup(kadm5_server_handle_t handle, char *princ_str,
313 gss_buffer_t client_name, gss_buffer_t service_name)
315 OM_uint32 minor_stat;
317 free_server_handle(handle);
319 gss_release_buffer(&minor_stat, client_name);
320 gss_release_buffer(&minor_stat, service_name);
329 struct svc_req *rqstp)
331 size_t tlen, clen, slen;
332 char *tdots, *cdots, *sdots;
334 tlen = strlen(target);
335 trunc_name(&tlen, &tdots);
336 clen = client->length;
337 trunc_name(&clen, &cdots);
338 slen = server->length;
339 trunc_name(&slen, &sdots);
341 /* okay to cast lengths to int because trunc_name limits max value */
342 return krb5_klog_syslog(LOG_NOTICE,
343 _("Unauthorized request: %s, %.*s%s, "
344 "client=%.*s%s, service=%.*s%s, addr=%s"),
345 op, (int)tlen, target, tdots,
346 (int)clen, (char *)client->value, cdots,
347 (int)slen, (char *)server->value, sdots,
348 client_addr(rqstp->rq_xprt));
358 struct svc_req *rqstp)
360 size_t tlen, clen, slen;
361 char *tdots, *cdots, *sdots;
364 errmsg = _("success");
365 tlen = strlen(target);
366 trunc_name(&tlen, &tdots);
367 clen = client->length;
368 trunc_name(&clen, &cdots);
369 slen = server->length;
370 trunc_name(&slen, &sdots);
372 /* okay to cast lengths to int because trunc_name limits max value */
373 return krb5_klog_syslog(LOG_NOTICE,
374 _("Request: %s, %.*s%s, %s, "
375 "client=%.*s%s, service=%.*s%s, addr=%s"),
376 op, (int)tlen, target, tdots, errmsg,
377 (int)clen, (char *)client->value, cdots,
378 (int)slen, (char *)server->value, sdots,
379 client_addr(rqstp->rq_xprt));
383 create_principal_2_svc(cprinc_arg *arg, generic_ret *ret,
384 struct svc_req *rqstp)
386 char *prime_arg = NULL;
387 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
388 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
389 kadm5_server_handle_t handle;
391 const char *errmsg = NULL;
393 ret->code = stub_setup(arg->api_version, rqstp, arg->rec.principal,
394 &handle, &ret->api_version, &client_name,
395 &service_name, &prime_arg);
399 if (CHANGEPW_SERVICE(rqstp)
400 || !kadm5int_acl_check(handle->context, rqst2name(rqstp), ACL_ADD,
401 arg->rec.principal, &rp)
402 || kadm5int_acl_impose_restrictions(handle->context,
403 &arg->rec, &arg->mask, rp)) {
404 ret->code = KADM5_AUTH_ADD;
405 log_unauth("kadm5_create_principal", prime_arg,
406 &client_name, &service_name, rqstp);
408 ret->code = kadm5_create_principal(handle, &arg->rec, arg->mask,
412 errmsg = krb5_get_error_message(handle->context, ret->code);
414 log_done("kadm5_create_principal", prime_arg, errmsg,
415 &client_name, &service_name, rqstp);
418 krb5_free_error_message(handle->context, errmsg);
422 stub_cleanup(handle, prime_arg, &client_name, &service_name);
427 create_principal3_2_svc(cprinc3_arg *arg, generic_ret *ret,
428 struct svc_req *rqstp)
430 char *prime_arg = NULL;
431 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
432 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
433 kadm5_server_handle_t handle;
435 const char *errmsg = NULL;
437 ret->code = stub_setup(arg->api_version, rqstp, arg->rec.principal,
438 &handle, &ret->api_version, &client_name,
439 &service_name, &prime_arg);
443 if (CHANGEPW_SERVICE(rqstp)
444 || !kadm5int_acl_check(handle->context, rqst2name(rqstp), ACL_ADD,
445 arg->rec.principal, &rp)
446 || kadm5int_acl_impose_restrictions(handle->context,
447 &arg->rec, &arg->mask, rp)) {
448 ret->code = KADM5_AUTH_ADD;
449 log_unauth("kadm5_create_principal", prime_arg,
450 &client_name, &service_name, rqstp);
452 ret->code = kadm5_create_principal_3(handle, &arg->rec, arg->mask,
453 arg->n_ks_tuple, arg->ks_tuple,
456 errmsg = krb5_get_error_message(handle->context, ret->code);
458 log_done("kadm5_create_principal", prime_arg, errmsg,
459 &client_name, &service_name, rqstp);
462 krb5_free_error_message(handle->context, errmsg);
466 stub_cleanup(handle, prime_arg, &client_name, &service_name);
470 /* Return KADM5_PROTECT_KEYS if KRB5_KDB_LOCKDOWN_KEYS is set for princ. */
472 check_lockdown_keys(kadm5_server_handle_t handle, krb5_principal princ)
474 kadm5_principal_ent_rec rec;
477 ret = kadm5_get_principal(handle, princ, &rec, KADM5_ATTRIBUTES);
480 ret = (rec.attributes & KRB5_KDB_LOCKDOWN_KEYS) ? KADM5_PROTECT_KEYS : 0;
481 kadm5_free_principal_ent(handle, &rec);
486 delete_principal_2_svc(dprinc_arg *arg, generic_ret *ret,
487 struct svc_req *rqstp)
489 char *prime_arg = NULL;
490 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
491 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
492 kadm5_server_handle_t handle;
493 const char *errmsg = NULL;
495 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
496 &ret->api_version, &client_name, &service_name,
501 if (CHANGEPW_SERVICE(rqstp)
502 || !kadm5int_acl_check(handle->context, rqst2name(rqstp), ACL_DELETE,
504 ret->code = KADM5_AUTH_DELETE;
505 log_unauth("kadm5_delete_principal", prime_arg,
506 &client_name, &service_name, rqstp);
508 ret->code = check_lockdown_keys(handle, arg->princ);
509 if (ret->code == KADM5_PROTECT_KEYS) {
510 log_unauth("kadm5_delete_principal", prime_arg, &client_name,
511 &service_name, rqstp);
512 ret->code = KADM5_AUTH_DELETE;
516 if (ret->code == KADM5_OK)
517 ret->code = kadm5_delete_principal(handle, arg->princ);
518 if (ret->code != KADM5_AUTH_DELETE) {
520 errmsg = krb5_get_error_message(handle->context, ret->code);
522 log_done("kadm5_delete_principal", prime_arg, errmsg,
523 &client_name, &service_name, rqstp);
526 krb5_free_error_message(handle->context, errmsg);
531 stub_cleanup(handle, prime_arg, &client_name, &service_name);
536 modify_principal_2_svc(mprinc_arg *arg, generic_ret *ret,
537 struct svc_req *rqstp)
539 char *prime_arg = NULL;
540 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
541 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
542 kadm5_server_handle_t handle;
544 const char *errmsg = NULL;
546 ret->code = stub_setup(arg->api_version, rqstp, arg->rec.principal,
547 &handle, &ret->api_version, &client_name,
548 &service_name, &prime_arg);
552 if (CHANGEPW_SERVICE(rqstp)
553 || !kadm5int_acl_check(handle->context, rqst2name(rqstp), ACL_MODIFY,
554 arg->rec.principal, &rp)
555 || kadm5int_acl_impose_restrictions(handle->context,
556 &arg->rec, &arg->mask, rp)) {
557 ret->code = KADM5_AUTH_MODIFY;
558 log_unauth("kadm5_modify_principal", prime_arg,
559 &client_name, &service_name, rqstp);
560 } else if ((arg->mask & KADM5_ATTRIBUTES) &&
561 (!(arg->rec.attributes & KRB5_KDB_LOCKDOWN_KEYS))) {
562 ret->code = check_lockdown_keys(handle, arg->rec.principal);
563 if (ret->code == KADM5_PROTECT_KEYS) {
564 log_unauth("kadm5_modify_principal", prime_arg, &client_name,
565 &service_name, rqstp);
566 ret->code = KADM5_AUTH_MODIFY;
570 if (ret->code == KADM5_OK) {
571 ret->code = kadm5_modify_principal(handle, &arg->rec, arg->mask);
573 errmsg = krb5_get_error_message(handle->context, ret->code);
575 log_done("kadm5_modify_principal", prime_arg, errmsg,
576 &client_name, &service_name, rqstp);
579 krb5_free_error_message(handle->context, errmsg);
583 stub_cleanup(handle, prime_arg, &client_name, &service_name);
588 rename_principal_2_svc(rprinc_arg *arg, generic_ret *ret,
589 struct svc_req *rqstp)
591 char *prime_arg1 = NULL, *prime_arg2 = NULL;
592 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
593 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
594 kadm5_server_handle_t handle;
596 const char *errmsg = NULL;
597 size_t tlen1, tlen2, clen, slen;
598 char *tdots1, *tdots2, *cdots, *sdots;
600 ret->code = stub_setup(arg->api_version, rqstp, NULL, &handle,
601 &ret->api_version, &client_name, &service_name,
606 if (krb5_unparse_name(handle->context, arg->src, &prime_arg1) ||
607 krb5_unparse_name(handle->context, arg->dest, &prime_arg2)) {
608 ret->code = KADM5_BAD_PRINCIPAL;
611 tlen1 = strlen(prime_arg1);
612 trunc_name(&tlen1, &tdots1);
613 tlen2 = strlen(prime_arg2);
614 trunc_name(&tlen2, &tdots2);
615 clen = client_name.length;
616 trunc_name(&clen, &cdots);
617 slen = service_name.length;
618 trunc_name(&slen, &sdots);
620 ret->code = KADM5_OK;
621 if (! CHANGEPW_SERVICE(rqstp)) {
622 if (!kadm5int_acl_check(handle->context, rqst2name(rqstp),
623 ACL_DELETE, arg->src, NULL))
624 ret->code = KADM5_AUTH_DELETE;
625 /* any restrictions at all on the ADD kills the RENAME */
626 if (!kadm5int_acl_check(handle->context, rqst2name(rqstp),
627 ACL_ADD, arg->dest, &rp) || rp) {
628 if (ret->code == KADM5_AUTH_DELETE)
629 ret->code = KADM5_AUTH_INSUFFICIENT;
631 ret->code = KADM5_AUTH_ADD;
633 if (ret->code == KADM5_OK) {
634 ret->code = check_lockdown_keys(handle, arg->src);
635 if (ret->code == KADM5_PROTECT_KEYS) {
636 log_unauth("kadm5_rename_principal", prime_arg1, &client_name,
637 &service_name, rqstp);
638 ret->code = KADM5_AUTH_DELETE;
642 ret->code = KADM5_AUTH_INSUFFICIENT;
643 if (ret->code != KADM5_OK) {
644 /* okay to cast lengths to int because trunc_name limits max value */
645 krb5_klog_syslog(LOG_NOTICE,
646 _("Unauthorized request: kadm5_rename_principal, "
648 "client=%.*s%s, service=%.*s%s, addr=%s"),
649 (int)tlen1, prime_arg1, tdots1,
650 (int)tlen2, prime_arg2, tdots2,
651 (int)clen, (char *)client_name.value, cdots,
652 (int)slen, (char *)service_name.value, sdots,
653 client_addr(rqstp->rq_xprt));
655 ret->code = kadm5_rename_principal(handle, arg->src, arg->dest);
657 errmsg = krb5_get_error_message(handle->context, ret->code);
659 /* okay to cast lengths to int because trunc_name limits max value */
660 krb5_klog_syslog(LOG_NOTICE,
661 _("Request: kadm5_rename_principal, "
662 "%.*s%s to %.*s%s, %s, "
663 "client=%.*s%s, service=%.*s%s, addr=%s"),
664 (int)tlen1, prime_arg1, tdots1,
665 (int)tlen2, prime_arg2, tdots2,
666 errmsg ? errmsg : _("success"),
667 (int)clen, (char *)client_name.value, cdots,
668 (int)slen, (char *)service_name.value, sdots,
669 client_addr(rqstp->rq_xprt));
672 krb5_free_error_message(handle->context, errmsg);
678 stub_cleanup(handle, NULL, &client_name, &service_name);
683 get_principal_2_svc(gprinc_arg *arg, gprinc_ret *ret, struct svc_req *rqstp)
685 char *funcname, *prime_arg = NULL;
686 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
687 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
688 kadm5_server_handle_t handle;
689 const char *errmsg = NULL;
691 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
692 &ret->api_version, &client_name, &service_name,
697 funcname = "kadm5_get_principal";
699 if (! cmp_gss_krb5_name(handle, rqst2name(rqstp), arg->princ) &&
700 (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
705 ret->code = KADM5_AUTH_GET;
706 log_unauth(funcname, prime_arg,
707 &client_name, &service_name, rqstp);
709 ret->code = kadm5_get_principal(handle, arg->princ, &ret->rec,
713 errmsg = krb5_get_error_message(handle->context, ret->code);
715 log_done(funcname, prime_arg, errmsg,
716 &client_name, &service_name, rqstp);
719 krb5_free_error_message(handle->context, errmsg);
723 stub_cleanup(handle, prime_arg, &client_name, &service_name);
728 get_princs_2_svc(gprincs_arg *arg, gprincs_ret *ret, struct svc_req *rqstp)
730 char *prime_arg = NULL;
731 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
732 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
733 kadm5_server_handle_t handle;
734 const char *errmsg = NULL;
736 ret->code = stub_setup(arg->api_version, rqstp, NULL, &handle,
737 &ret->api_version, &client_name, &service_name,
742 prime_arg = arg->exp;
743 if (prime_arg == NULL)
746 if (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
751 ret->code = KADM5_AUTH_LIST;
752 log_unauth("kadm5_get_principals", prime_arg,
753 &client_name, &service_name, rqstp);
755 ret->code = kadm5_get_principals(handle, arg->exp, &ret->princs,
758 errmsg = krb5_get_error_message(handle->context, ret->code);
760 log_done("kadm5_get_principals", prime_arg, errmsg,
761 &client_name, &service_name, rqstp);
764 krb5_free_error_message(handle->context, errmsg);
769 stub_cleanup(handle, NULL, &client_name, &service_name);
774 chpass_principal_2_svc(chpass_arg *arg, generic_ret *ret,
775 struct svc_req *rqstp)
777 char *prime_arg = NULL;
778 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
779 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
780 kadm5_server_handle_t handle;
781 const char *errmsg = NULL;
783 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
784 &ret->api_version, &client_name, &service_name,
789 ret->code = check_lockdown_keys(handle, arg->princ);
790 if (ret->code != KADM5_OK) {
791 if (ret->code == KADM5_PROTECT_KEYS) {
792 log_unauth("kadm5_chpass_principal", prime_arg, &client_name,
793 &service_name, rqstp);
794 ret->code = KADM5_AUTH_CHANGEPW;
796 } else if (cmp_gss_krb5_name(handle, rqst2name(rqstp), arg->princ)) {
797 ret->code = chpass_principal_wrapper_3(handle, arg->princ, FALSE, 0,
799 } else if (!(CHANGEPW_SERVICE(rqstp)) &&
800 kadm5int_acl_check(handle->context, rqst2name(rqstp),
801 ACL_CHANGEPW, arg->princ, NULL)) {
802 ret->code = kadm5_chpass_principal(handle, arg->princ, arg->pass);
804 log_unauth("kadm5_chpass_principal", prime_arg,
805 &client_name, &service_name, rqstp);
806 ret->code = KADM5_AUTH_CHANGEPW;
809 if (ret->code != KADM5_AUTH_CHANGEPW) {
811 errmsg = krb5_get_error_message(handle->context, ret->code);
813 log_done("kadm5_chpass_principal", prime_arg, errmsg,
814 &client_name, &service_name, rqstp);
817 krb5_free_error_message(handle->context, errmsg);
821 stub_cleanup(handle, prime_arg, &client_name, &service_name);
826 chpass_principal3_2_svc(chpass3_arg *arg, generic_ret *ret,
827 struct svc_req *rqstp)
829 char *prime_arg = NULL;
830 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
831 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
832 kadm5_server_handle_t handle;
833 const char *errmsg = NULL;
835 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
836 &ret->api_version, &client_name, &service_name,
841 ret->code = check_lockdown_keys(handle, arg->princ);
842 if (ret->code != KADM5_OK) {
843 if (ret->code == KADM5_PROTECT_KEYS) {
844 log_unauth("kadm5_chpass_principal", prime_arg, &client_name,
845 &service_name, rqstp);
846 ret->code = KADM5_AUTH_CHANGEPW;
848 } else if (cmp_gss_krb5_name(handle, rqst2name(rqstp), arg->princ)) {
849 ret->code = chpass_principal_wrapper_3(handle, arg->princ,
850 arg->keepold, arg->n_ks_tuple,
851 arg->ks_tuple, arg->pass);
852 } else if (!(CHANGEPW_SERVICE(rqstp)) &&
853 kadm5int_acl_check(handle->context, rqst2name(rqstp),
854 ACL_CHANGEPW, arg->princ, NULL)) {
855 ret->code = kadm5_chpass_principal_3(handle, arg->princ, arg->keepold,
856 arg->n_ks_tuple, arg->ks_tuple,
859 log_unauth("kadm5_chpass_principal", prime_arg,
860 &client_name, &service_name, rqstp);
861 ret->code = KADM5_AUTH_CHANGEPW;
864 if (ret->code != KADM5_AUTH_CHANGEPW) {
866 errmsg = krb5_get_error_message(handle->context, ret->code);
868 log_done("kadm5_chpass_principal", prime_arg, errmsg,
869 &client_name, &service_name, rqstp);
872 krb5_free_error_message(handle->context, errmsg);
876 stub_cleanup(handle, prime_arg, &client_name, &service_name);
881 setv4key_principal_2_svc(setv4key_arg *arg, generic_ret *ret,
882 struct svc_req *rqstp)
884 char *prime_arg = NULL;
885 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
886 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
887 kadm5_server_handle_t handle;
888 const char *errmsg = NULL;
890 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
891 &ret->api_version, &client_name, &service_name,
896 ret->code = check_lockdown_keys(handle, arg->princ);
897 if (ret->code != KADM5_OK) {
898 if (ret->code == KADM5_PROTECT_KEYS) {
899 log_unauth("kadm5_setv4key_principal", prime_arg, &client_name,
900 &service_name, rqstp);
901 ret->code = KADM5_AUTH_SETKEY;
903 } else if (!(CHANGEPW_SERVICE(rqstp)) &&
904 kadm5int_acl_check(handle->context, rqst2name(rqstp),
905 ACL_SETKEY, arg->princ, NULL)) {
906 ret->code = kadm5_setv4key_principal(handle, arg->princ,
909 log_unauth("kadm5_setv4key_principal", prime_arg,
910 &client_name, &service_name, rqstp);
911 ret->code = KADM5_AUTH_SETKEY;
914 if (ret->code != KADM5_AUTH_SETKEY) {
916 errmsg = krb5_get_error_message(handle->context, ret->code);
918 log_done("kadm5_setv4key_principal", prime_arg, errmsg,
919 &client_name, &service_name, rqstp);
922 krb5_free_error_message(handle->context, errmsg);
926 stub_cleanup(handle, prime_arg, &client_name, &service_name);
932 setkey_principal_2_svc(setkey_arg *arg, generic_ret *ret,
933 struct svc_req *rqstp)
935 char *prime_arg = NULL;
936 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
937 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
938 kadm5_server_handle_t handle;
939 const char *errmsg = NULL;
941 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
942 &ret->api_version, &client_name, &service_name,
947 ret->code = check_lockdown_keys(handle, arg->princ);
948 if (ret->code != KADM5_OK) {
949 if (ret->code == KADM5_PROTECT_KEYS) {
950 log_unauth("kadm5_setkey_principal", prime_arg, &client_name,
951 &service_name, rqstp);
952 ret->code = KADM5_AUTH_SETKEY;
954 } else if (!(CHANGEPW_SERVICE(rqstp)) &&
955 kadm5int_acl_check(handle->context, rqst2name(rqstp),
956 ACL_SETKEY, arg->princ, NULL)) {
957 ret->code = kadm5_setkey_principal(handle, arg->princ, arg->keyblocks,
960 log_unauth("kadm5_setkey_principal", prime_arg,
961 &client_name, &service_name, rqstp);
962 ret->code = KADM5_AUTH_SETKEY;
965 if (ret->code != KADM5_AUTH_SETKEY) {
967 errmsg = krb5_get_error_message(handle->context, ret->code);
969 log_done("kadm5_setkey_principal", prime_arg, errmsg,
970 &client_name, &service_name, rqstp);
973 krb5_free_error_message(handle->context, errmsg);
977 stub_cleanup(handle, prime_arg, &client_name, &service_name);
982 setkey_principal3_2_svc(setkey3_arg *arg, generic_ret *ret,
983 struct svc_req *rqstp)
985 char *prime_arg = NULL;
986 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
987 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
988 kadm5_server_handle_t handle;
989 const char *errmsg = NULL;
991 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
992 &ret->api_version, &client_name, &service_name,
997 ret->code = check_lockdown_keys(handle, arg->princ);
998 if (ret->code != KADM5_OK) {
999 if (ret->code == KADM5_PROTECT_KEYS) {
1000 log_unauth("kadm5_setkey_principal", prime_arg, &client_name,
1001 &service_name, rqstp);
1002 ret->code = KADM5_AUTH_SETKEY;
1004 } else if (!(CHANGEPW_SERVICE(rqstp)) &&
1005 kadm5int_acl_check(handle->context, rqst2name(rqstp),
1006 ACL_SETKEY, arg->princ, NULL)) {
1007 ret->code = kadm5_setkey_principal_3(handle, arg->princ, arg->keepold,
1008 arg->n_ks_tuple, arg->ks_tuple,
1009 arg->keyblocks, arg->n_keys);
1011 log_unauth("kadm5_setkey_principal", prime_arg,
1012 &client_name, &service_name, rqstp);
1013 ret->code = KADM5_AUTH_SETKEY;
1016 if (ret->code != KADM5_AUTH_SETKEY) {
1018 errmsg = krb5_get_error_message(handle->context, ret->code);
1020 log_done("kadm5_setkey_principal", prime_arg, errmsg,
1021 &client_name, &service_name, rqstp);
1024 krb5_free_error_message(handle->context, errmsg);
1028 stub_cleanup(handle, prime_arg, &client_name, &service_name);
1033 setkey_principal4_2_svc(setkey4_arg *arg, generic_ret *ret,
1034 struct svc_req *rqstp)
1036 char *prime_arg = NULL;
1037 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1038 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1039 kadm5_server_handle_t handle;
1040 const char *errmsg = NULL;
1042 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
1043 &ret->api_version, &client_name, &service_name,
1048 ret->code = check_lockdown_keys(handle, arg->princ);
1049 if (ret->code != KADM5_OK) {
1050 if (ret->code == KADM5_PROTECT_KEYS) {
1051 log_unauth("kadm5_setkey_principal", prime_arg, &client_name,
1052 &service_name, rqstp);
1053 ret->code = KADM5_AUTH_SETKEY;
1055 } else if (!(CHANGEPW_SERVICE(rqstp)) &&
1056 kadm5int_acl_check(handle->context, rqst2name(rqstp),
1057 ACL_SETKEY, arg->princ, NULL)) {
1058 ret->code = kadm5_setkey_principal_4(handle, arg->princ, arg->keepold,
1059 arg->key_data, arg->n_key_data);
1061 log_unauth("kadm5_setkey_principal", prime_arg, &client_name,
1062 &service_name, rqstp);
1063 ret->code = KADM5_AUTH_SETKEY;
1066 if (ret->code != KADM5_AUTH_SETKEY) {
1068 errmsg = krb5_get_error_message(handle->context, ret->code);
1070 log_done("kadm5_setkey_principal", prime_arg, errmsg, &client_name,
1071 &service_name, rqstp);
1074 krb5_free_error_message(handle->context, errmsg);
1078 stub_cleanup(handle, prime_arg, &client_name, &service_name);
1082 /* Empty out *keys/*nkeys if princ is protected with the lockdown attribute, or
1083 * if we fail to check. */
1085 chrand_check_lockdown(kadm5_server_handle_t handle, krb5_principal princ,
1086 krb5_keyblock **keys, int *nkeys)
1091 ret = check_lockdown_keys(handle, princ);
1095 for (i = 0; i < *nkeys; i++)
1096 krb5_free_keyblock_contents(handle->context, &((*keys)[i]));
1100 return (ret == KADM5_PROTECT_KEYS) ? KADM5_OK : ret;
1104 chrand_principal_2_svc(chrand_arg *arg, chrand_ret *ret, struct svc_req *rqstp)
1106 char *funcname, *prime_arg = NULL;
1107 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1108 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1111 kadm5_server_handle_t handle;
1112 const char *errmsg = NULL;
1114 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
1115 &ret->api_version, &client_name, &service_name,
1120 funcname = "kadm5_randkey_principal";
1122 if (cmp_gss_krb5_name(handle, rqst2name(rqstp), arg->princ)) {
1123 ret->code = randkey_principal_wrapper_3(handle, arg->princ, FALSE, 0,
1125 } else if (!(CHANGEPW_SERVICE(rqstp)) &&
1126 kadm5int_acl_check(handle->context, rqst2name(rqstp),
1127 ACL_CHANGEPW, arg->princ, NULL)) {
1128 ret->code = kadm5_randkey_principal(handle, arg->princ, &k, &nkeys);
1130 log_unauth(funcname, prime_arg,
1131 &client_name, &service_name, rqstp);
1132 ret->code = KADM5_AUTH_CHANGEPW;
1135 if (ret->code == KADM5_OK) {
1136 ret->code = chrand_check_lockdown(handle, arg->princ, &k, &nkeys);
1137 if (ret->code == KADM5_PROTECT_KEYS)
1138 ret->code = KADM5_OK;
1140 ret->n_keys = nkeys;
1143 if (ret->code != KADM5_AUTH_CHANGEPW) {
1145 errmsg = krb5_get_error_message(handle->context, ret->code);
1147 log_done(funcname, prime_arg, errmsg,
1148 &client_name, &service_name, rqstp);
1151 krb5_free_error_message(handle->context, errmsg);
1155 stub_cleanup(handle, prime_arg, &client_name, &service_name);
1160 chrand_principal3_2_svc(chrand3_arg *arg, chrand_ret *ret,
1161 struct svc_req *rqstp)
1163 char *funcname, *prime_arg = NULL;
1164 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1165 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1168 kadm5_server_handle_t handle;
1169 const char *errmsg = NULL;
1171 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
1172 &ret->api_version, &client_name, &service_name,
1177 funcname = "kadm5_randkey_principal";
1179 if (cmp_gss_krb5_name(handle, rqst2name(rqstp), arg->princ)) {
1180 ret->code = randkey_principal_wrapper_3(handle, arg->princ,
1181 arg->keepold, arg->n_ks_tuple,
1182 arg->ks_tuple, &k, &nkeys);
1183 } else if (!(CHANGEPW_SERVICE(rqstp)) &&
1184 kadm5int_acl_check(handle->context, rqst2name(rqstp),
1185 ACL_CHANGEPW, arg->princ, NULL)) {
1186 ret->code = kadm5_randkey_principal_3(handle, arg->princ, arg->keepold,
1187 arg->n_ks_tuple, arg->ks_tuple,
1190 log_unauth(funcname, prime_arg,
1191 &client_name, &service_name, rqstp);
1192 ret->code = KADM5_AUTH_CHANGEPW;
1195 if (ret->code == KADM5_OK) {
1196 ret->code = chrand_check_lockdown(handle, arg->princ, &k, &nkeys);
1197 if (ret->code == KADM5_PROTECT_KEYS)
1198 ret->code = KADM5_OK;
1200 ret->n_keys = nkeys;
1203 if (ret->code != KADM5_AUTH_CHANGEPW) {
1205 errmsg = krb5_get_error_message(handle->context, ret->code);
1207 log_done(funcname, prime_arg, errmsg,
1208 &client_name, &service_name, rqstp);
1211 krb5_free_error_message(handle->context, errmsg);
1215 stub_cleanup(handle, prime_arg, &client_name, &service_name);
1220 create_policy_2_svc(cpol_arg *arg, generic_ret *ret, struct svc_req *rqstp)
1222 char *prime_arg = NULL;
1223 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1224 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1225 kadm5_server_handle_t handle;
1226 const char *errmsg = NULL;
1228 ret->code = stub_setup(arg->api_version, rqstp, NULL, &handle,
1229 &ret->api_version, &client_name, &service_name,
1234 prime_arg = arg->rec.policy;
1236 if (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
1238 ACL_ADD, NULL, NULL)) {
1239 ret->code = KADM5_AUTH_ADD;
1240 log_unauth("kadm5_create_policy", prime_arg,
1241 &client_name, &service_name, rqstp);
1244 ret->code = kadm5_create_policy(handle, &arg->rec, arg->mask);
1246 errmsg = krb5_get_error_message(handle->context, ret->code);
1248 log_done("kadm5_create_policy",
1249 ((prime_arg == NULL) ? "(null)" : prime_arg), errmsg,
1250 &client_name, &service_name, rqstp);
1253 krb5_free_error_message(handle->context, errmsg);
1257 stub_cleanup(handle, NULL, &client_name, &service_name);
1262 delete_policy_2_svc(dpol_arg *arg, generic_ret *ret, struct svc_req *rqstp)
1264 char *prime_arg = NULL;
1265 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1266 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1267 kadm5_server_handle_t handle;
1268 const char *errmsg = NULL;
1270 ret->code = stub_setup(arg->api_version, rqstp, NULL, &handle,
1271 &ret->api_version, &client_name, &service_name,
1276 prime_arg = arg->name;
1278 if (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
1280 ACL_DELETE, NULL, NULL)) {
1281 log_unauth("kadm5_delete_policy", prime_arg,
1282 &client_name, &service_name, rqstp);
1283 ret->code = KADM5_AUTH_DELETE;
1285 ret->code = kadm5_delete_policy(handle, arg->name);
1287 errmsg = krb5_get_error_message(handle->context, ret->code);
1289 log_done("kadm5_delete_policy",
1290 ((prime_arg == NULL) ? "(null)" : prime_arg), errmsg,
1291 &client_name, &service_name, rqstp);
1294 krb5_free_error_message(handle->context, errmsg);
1298 stub_cleanup(handle, NULL, &client_name, &service_name);
1303 modify_policy_2_svc(mpol_arg *arg, generic_ret *ret, struct svc_req *rqstp)
1305 char *prime_arg = NULL;
1306 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1307 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1308 kadm5_server_handle_t handle;
1309 const char *errmsg = NULL;
1311 ret->code = stub_setup(arg->api_version, rqstp, NULL, &handle,
1312 &ret->api_version, &client_name, &service_name,
1317 prime_arg = arg->rec.policy;
1319 if (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
1321 ACL_MODIFY, NULL, NULL)) {
1322 log_unauth("kadm5_modify_policy", prime_arg,
1323 &client_name, &service_name, rqstp);
1324 ret->code = KADM5_AUTH_MODIFY;
1326 ret->code = kadm5_modify_policy(handle, &arg->rec, arg->mask);
1328 errmsg = krb5_get_error_message(handle->context, ret->code);
1330 log_done("kadm5_modify_policy",
1331 ((prime_arg == NULL) ? "(null)" : prime_arg), errmsg,
1332 &client_name, &service_name, rqstp);
1335 krb5_free_error_message(handle->context, errmsg);
1339 stub_cleanup(handle, NULL, &client_name, &service_name);
1344 get_policy_2_svc(gpol_arg *arg, gpol_ret *ret, struct svc_req *rqstp)
1346 char *funcname, *prime_arg = NULL;
1347 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1348 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1350 kadm5_principal_ent_rec caller_ent;
1351 kadm5_server_handle_t handle;
1352 const char *errmsg = NULL;
1354 ret->code = stub_setup(arg->api_version, rqstp, NULL, &handle,
1355 &ret->api_version, &client_name, &service_name,
1360 funcname = "kadm5_get_policy";
1362 prime_arg = arg->name;
1364 ret->code = KADM5_AUTH_GET;
1365 if (!CHANGEPW_SERVICE(rqstp) && kadm5int_acl_check(handle->context,
1367 ACL_INQUIRE, NULL, NULL))
1368 ret->code = KADM5_OK;
1370 ret->code = kadm5_get_principal(handle->lhandle,
1371 handle->current_caller, &caller_ent,
1372 KADM5_PRINCIPAL_NORMAL_MASK);
1373 if (ret->code == KADM5_OK) {
1374 if (caller_ent.aux_attributes & KADM5_POLICY &&
1375 strcmp(caller_ent.policy, arg->name) == 0) {
1376 ret->code = KADM5_OK;
1378 ret->code = KADM5_AUTH_GET;
1380 ret2 = kadm5_free_principal_ent(handle->lhandle,
1382 ret->code = ret->code ? ret->code : ret2;
1386 if (ret->code == KADM5_OK) {
1387 ret->code = kadm5_get_policy(handle, arg->name, &ret->rec);
1390 errmsg = krb5_get_error_message(handle->context, ret->code);
1393 ((prime_arg == NULL) ? "(null)" : prime_arg), errmsg,
1394 &client_name, &service_name, rqstp);
1396 krb5_free_error_message(handle->context, errmsg);
1399 log_unauth(funcname, prime_arg,
1400 &client_name, &service_name, rqstp);
1404 stub_cleanup(handle, NULL, &client_name, &service_name);
1409 get_pols_2_svc(gpols_arg *arg, gpols_ret *ret, struct svc_req *rqstp)
1411 char *prime_arg = NULL;
1412 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1413 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1414 kadm5_server_handle_t handle;
1415 const char *errmsg = NULL;
1417 ret->code = stub_setup(arg->api_version, rqstp, NULL, &handle,
1418 &ret->api_version, &client_name, &service_name,
1423 prime_arg = arg->exp;
1424 if (prime_arg == NULL)
1427 if (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
1429 ACL_LIST, NULL, NULL)) {
1430 ret->code = KADM5_AUTH_LIST;
1431 log_unauth("kadm5_get_policies", prime_arg,
1432 &client_name, &service_name, rqstp);
1434 ret->code = kadm5_get_policies(handle, arg->exp, &ret->pols,
1437 errmsg = krb5_get_error_message(handle->context, ret->code);
1439 log_done("kadm5_get_policies", prime_arg, errmsg,
1440 &client_name, &service_name, rqstp);
1443 krb5_free_error_message(handle->context, errmsg);
1447 stub_cleanup(handle, NULL, &client_name, &service_name);
1452 get_privs_2_svc(krb5_ui_4 *arg, getprivs_ret *ret, struct svc_req *rqstp)
1454 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1455 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1456 kadm5_server_handle_t handle;
1457 const char *errmsg = NULL;
1459 ret->code = stub_setup(*arg, rqstp, NULL, &handle, &ret->api_version,
1460 &client_name, &service_name, NULL);
1464 ret->code = kadm5_get_privs(handle, &ret->privs);
1466 errmsg = krb5_get_error_message(handle->context, ret->code);
1468 log_done("kadm5_get_privs", client_name.value, errmsg,
1469 &client_name, &service_name, rqstp);
1472 krb5_free_error_message(handle->context, errmsg);
1475 stub_cleanup(handle, NULL, &client_name, &service_name);
1480 purgekeys_2_svc(purgekeys_arg *arg, generic_ret *ret, struct svc_req *rqstp)
1482 char *funcname, *prime_arg = NULL;
1483 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1484 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1485 kadm5_server_handle_t handle;
1487 const char *errmsg = NULL;
1489 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
1490 &ret->api_version, &client_name, &service_name,
1495 funcname = "kadm5_purgekeys";
1497 if (!cmp_gss_krb5_name(handle, rqst2name(rqstp), arg->princ) &&
1498 (CHANGEPW_SERVICE(rqstp)
1499 || !kadm5int_acl_check(handle->context, rqst2name(rqstp), ACL_MODIFY,
1500 arg->princ, NULL))) {
1501 ret->code = KADM5_AUTH_MODIFY;
1502 log_unauth(funcname, prime_arg, &client_name, &service_name, rqstp);
1504 ret->code = kadm5_purgekeys(handle, arg->princ, arg->keepkvno);
1506 errmsg = krb5_get_error_message(handle->context, ret->code);
1508 log_done(funcname, prime_arg, errmsg,
1509 &client_name, &service_name, rqstp);
1512 krb5_free_error_message(handle->context, errmsg);
1516 stub_cleanup(handle, prime_arg, &client_name, &service_name);
1521 get_strings_2_svc(gstrings_arg *arg, gstrings_ret *ret, struct svc_req *rqstp)
1523 char *prime_arg = NULL;
1524 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1525 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1526 kadm5_server_handle_t handle;
1527 const char *errmsg = NULL;
1529 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
1530 &ret->api_version, &client_name, &service_name,
1535 if (! cmp_gss_krb5_name(handle, rqst2name(rqstp), arg->princ) &&
1536 (CHANGEPW_SERVICE(rqstp) || !kadm5int_acl_check(handle->context,
1541 ret->code = KADM5_AUTH_GET;
1542 log_unauth("kadm5_get_strings", prime_arg,
1543 &client_name, &service_name, rqstp);
1545 ret->code = kadm5_get_strings(handle, arg->princ, &ret->strings,
1548 errmsg = krb5_get_error_message(handle->context, ret->code);
1550 log_done("kadm5_get_strings", prime_arg, errmsg,
1551 &client_name, &service_name, rqstp);
1554 krb5_free_error_message(handle->context, errmsg);
1558 stub_cleanup(handle, prime_arg, &client_name, &service_name);
1563 set_string_2_svc(sstring_arg *arg, generic_ret *ret, struct svc_req *rqstp)
1565 char *prime_arg = NULL;
1566 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1567 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1568 kadm5_server_handle_t handle;
1569 const char *errmsg = NULL;
1571 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
1572 &ret->api_version, &client_name, &service_name,
1577 if (CHANGEPW_SERVICE(rqstp)
1578 || !kadm5int_acl_check(handle->context, rqst2name(rqstp), ACL_MODIFY,
1579 arg->princ, NULL)) {
1580 ret->code = KADM5_AUTH_MODIFY;
1581 log_unauth("kadm5_mod_strings", prime_arg,
1582 &client_name, &service_name, rqstp);
1584 ret->code = kadm5_set_string(handle, arg->princ, arg->key, arg->value);
1586 errmsg = krb5_get_error_message(handle->context, ret->code);
1588 log_done("kadm5_mod_strings", prime_arg, errmsg,
1589 &client_name, &service_name, rqstp);
1592 krb5_free_error_message(handle->context, errmsg);
1596 stub_cleanup(handle, prime_arg, &client_name, &service_name);
1601 init_2_svc(krb5_ui_4 *arg, generic_ret *ret, struct svc_req *rqstp)
1603 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1604 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1605 kadm5_server_handle_t handle;
1606 const char *errmsg = NULL;
1608 char *cdots, *sdots;
1610 ret->code = stub_setup(*arg, rqstp, NULL, &handle, &ret->api_version,
1611 &client_name, &service_name, NULL);
1616 errmsg = krb5_get_error_message(handle->context, ret->code);
1618 clen = client_name.length;
1619 trunc_name(&clen, &cdots);
1620 slen = service_name.length;
1621 trunc_name(&slen, &sdots);
1622 /* okay to cast lengths to int because trunc_name limits max value */
1623 krb5_klog_syslog(LOG_NOTICE, _("Request: kadm5_init, %.*s%s, %s, "
1624 "client=%.*s%s, service=%.*s%s, addr=%s, "
1625 "vers=%d, flavor=%d"),
1626 (int)clen, (char *)client_name.value, cdots,
1627 errmsg ? errmsg : _("success"),
1628 (int)clen, (char *)client_name.value, cdots,
1629 (int)slen, (char *)service_name.value, sdots,
1630 client_addr(rqstp->rq_xprt),
1631 ret->api_version & ~(KADM5_API_VERSION_MASK),
1632 rqstp->rq_cred.oa_flavor);
1634 krb5_free_error_message(handle->context, errmsg);
1637 stub_cleanup(handle, NULL, &client_name, &service_name);
1642 rqst2name(struct svc_req *rqstp)
1645 if (rqstp->rq_cred.oa_flavor == RPCSEC_GSS)
1646 return rqstp->rq_clntname;
1648 return rqstp->rq_clntcred;
1652 get_principal_keys_2_svc(getpkeys_arg *arg, getpkeys_ret *ret,
1653 struct svc_req *rqstp)
1655 char *prime_arg = NULL;
1656 gss_buffer_desc client_name = GSS_C_EMPTY_BUFFER;
1657 gss_buffer_desc service_name = GSS_C_EMPTY_BUFFER;
1658 kadm5_server_handle_t handle;
1659 const char *errmsg = NULL;
1661 ret->code = stub_setup(arg->api_version, rqstp, arg->princ, &handle,
1662 &ret->api_version, &client_name, &service_name,
1667 if (!(CHANGEPW_SERVICE(rqstp)) &&
1668 kadm5int_acl_check(handle->context, rqst2name(rqstp),
1669 ACL_EXTRACT, arg->princ, NULL)) {
1670 ret->code = kadm5_get_principal_keys(handle, arg->princ, arg->kvno,
1671 &ret->key_data, &ret->n_key_data);
1673 log_unauth("kadm5_get_principal_keys", prime_arg,
1674 &client_name, &service_name, rqstp);
1675 ret->code = KADM5_AUTH_EXTRACT;
1678 if (ret->code == KADM5_OK) {
1679 ret->code = check_lockdown_keys(handle, arg->princ);
1680 if (ret->code != KADM5_OK) {
1681 kadm5_free_kadm5_key_data(handle->context, ret->n_key_data,
1683 ret->key_data = NULL;
1684 ret->n_key_data = 0;
1686 if (ret->code == KADM5_PROTECT_KEYS) {
1687 log_unauth("kadm5_get_principal_keys", prime_arg,
1688 &client_name, &service_name, rqstp);
1689 ret->code = KADM5_AUTH_EXTRACT;
1693 if (ret->code != KADM5_AUTH_EXTRACT) {
1695 errmsg = krb5_get_error_message(handle->context, ret->code);
1697 log_done("kadm5_get_principal_keys", prime_arg, errmsg,
1698 &client_name, &service_name, rqstp);
1701 krb5_free_error_message(handle->context, errmsg);
1705 stub_cleanup(handle, prime_arg, &client_name, &service_name);