2 * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved
7 #if !defined(lint) && !defined(__CODECENTER__)
8 static char *rcsid = "$Header$";
14 #include <kadm5/admin.h>
15 #include <kadm5/kadm_rpc.h>
20 _xdr_kadm5_principal_ent_rec(XDR *xdrs, kadm5_principal_ent_rec *objp,
26 * Purpose: XDR function which serves as a wrapper for xdr_u_int32,
27 * to prevent compiler warnings about type clashes between u_int32
30 bool_t xdr_ui_4(XDR *xdrs, krb5_ui_4 *objp)
32 /* Assumes that krb5_ui_4 and u_int32 are both four bytes long.
33 This should not be a harmful assumption. */
34 return xdr_u_int32(xdrs, (rpc_u_int32 *) objp);
39 * Function: xdr_nullstring
41 * Purpose: XDR function for "strings" that are either NULL-terminated
44 bool_t xdr_nullstring(XDR *xdrs, char **objp)
48 if (xdrs->x_op == XDR_ENCODE) {
52 size = strlen(*objp) + 1;
54 if (! xdr_u_int(xdrs, &size)) {
62 } else if (*objp == NULL) {
63 *objp = (char *) mem_alloc(size);
69 return (xdr_opaque(xdrs, *objp, size));
73 return (xdr_opaque(xdrs, *objp, size));
78 mem_free(*objp, size);
87 * Function: xdr_nulltype
89 * Purpose: XDR function for arbitrary pointer types that are either
90 * NULL or contain data.
92 bool_t xdr_nulltype(XDR *xdrs, void **objp, xdrproc_t proc)
98 if (!xdr_bool(xdrs, &null))
104 return (*proc)(xdrs, objp);
111 if (!xdr_bool(xdrs, &null))
114 return (*proc)(xdrs, objp);
119 return (*proc)(xdrs, objp);
127 xdr_krb5_timestamp(XDR *xdrs, krb5_timestamp *objp)
129 /* This assumes that int32 and krb5_timestamp are the same size.
130 This shouldn't be a problem, since we've got a unit test which
132 if (!xdr_int32(xdrs, (rpc_int32 *) objp)) {
139 xdr_krb5_kvno(XDR *xdrs, krb5_kvno *objp)
143 tmp = '\0'; /* for purify, else xdr_u_char performs a umr */
145 if (xdrs->x_op == XDR_ENCODE)
146 tmp = (unsigned char) *objp;
148 if (!xdr_u_char(xdrs, &tmp))
151 if (xdrs->x_op == XDR_DECODE)
152 *objp = (krb5_kvno) tmp;
158 xdr_krb5_deltat(XDR *xdrs, krb5_deltat *objp)
160 /* This assumes that int32 and krb5_deltat are the same size.
161 This shouldn't be a problem, since we've got a unit test which
163 if (!xdr_int32(xdrs, (rpc_int32 *) objp)) {
170 xdr_krb5_flags(XDR *xdrs, krb5_flags *objp)
172 /* This assumes that int32 and krb5_flags are the same size.
173 This shouldn't be a problem, since we've got a unit test which
175 if (!xdr_int32(xdrs, (rpc_int32 *) objp)) {
182 xdr_krb5_ui_4(XDR *xdrs, krb5_ui_4 *objp)
184 if (!xdr_u_int32(xdrs, (rpc_u_int32 *) objp)) {
191 xdr_krb5_int16(XDR *xdrs, krb5_int16 *objp)
197 if (!xdr_int(xdrs, &tmp))
200 *objp = (krb5_int16) tmp;
205 bool_t xdr_krb5_key_data_nocontents(XDR *xdrs, krb5_key_data *objp)
208 * Note that this function intentionally DOES NOT tranfer key
209 * length or contents! xdr_krb5_key_data in adb_xdr.c does, but
210 * that is only for use within the server-side library.
214 if (xdrs->x_op == XDR_DECODE)
215 memset((char *) objp, 0, sizeof(krb5_key_data));
217 if (!xdr_krb5_int16(xdrs, &objp->key_data_ver)) {
220 if (!xdr_krb5_int16(xdrs, &objp->key_data_kvno)) {
223 if (!xdr_krb5_int16(xdrs, &objp->key_data_type[0])) {
226 if (objp->key_data_ver > 1) {
227 if (!xdr_krb5_int16(xdrs, &objp->key_data_type[1])) {
232 * kadm5_get_principal on the server side allocates and returns
233 * key contents when asked. Even though this function refuses to
234 * transmit that data, it still has to *free* the data at the
235 * appropriate time to avoid a memory leak.
237 if (xdrs->x_op == XDR_FREE) {
238 tmp = (unsigned int) objp->key_data_length[0];
239 if (!xdr_bytes(xdrs, (char **) &objp->key_data_contents[0],
243 tmp = (unsigned int) objp->key_data_length[1];
244 if (!xdr_bytes(xdrs, (char **) &objp->key_data_contents[1],
252 bool_t xdr_krb5_tl_data(XDR *xdrs, krb5_tl_data **tl_data_head)
254 krb5_tl_data *tl, *tl2;
258 switch (xdrs->x_op) {
260 tl = tl2 = *tl_data_head;
262 tl2 = tl->tl_data_next;
263 free(tl->tl_data_contents);
273 if (!xdr_bool(xdrs, &more))
277 if (!xdr_krb5_int16(xdrs, &tl->tl_data_type))
279 len = tl->tl_data_length;
280 if (!xdr_bytes(xdrs, (char **) &tl->tl_data_contents, &len, ~0))
282 tl = tl->tl_data_next;
289 if (!xdr_bool(xdrs, &more))
293 tl2 = (krb5_tl_data *) malloc(sizeof(krb5_tl_data));
296 memset((char *) tl2, 0, sizeof(krb5_tl_data));
297 if (!xdr_krb5_int16(xdrs, &tl2->tl_data_type))
299 if (!xdr_bytes(xdrs, (char **)&tl2->tl_data_contents, &len, ~0))
301 tl2->tl_data_length = len;
303 tl2->tl_data_next = tl;
315 xdr_kadm5_ret_t(XDR *xdrs, kadm5_ret_t *objp)
319 if (xdrs->x_op == XDR_ENCODE)
320 tmp = (rpc_u_int32) *objp;
322 if (!xdr_u_int32(xdrs, &tmp))
325 if (xdrs->x_op == XDR_DECODE)
326 *objp = (kadm5_ret_t) tmp;
331 bool_t xdr_kadm5_principal_ent_rec_v1(XDR *xdrs,
332 kadm5_principal_ent_rec *objp)
334 return _xdr_kadm5_principal_ent_rec(xdrs, objp, KADM5_API_VERSION_1);
337 bool_t xdr_kadm5_principal_ent_rec(XDR *xdrs,
338 kadm5_principal_ent_rec *objp)
340 return _xdr_kadm5_principal_ent_rec(xdrs, objp, KADM5_API_VERSION_2);
344 _xdr_kadm5_principal_ent_rec(XDR *xdrs, kadm5_principal_ent_rec *objp,
349 if (!xdr_krb5_principal(xdrs, &objp->principal)) {
352 if (!xdr_krb5_timestamp(xdrs, &objp->princ_expire_time)) {
355 if (!xdr_krb5_timestamp(xdrs, &objp->last_pwd_change)) {
358 if (!xdr_krb5_timestamp(xdrs, &objp->pw_expiration)) {
361 if (!xdr_krb5_deltat(xdrs, &objp->max_life)) {
364 if (v == KADM5_API_VERSION_1) {
365 if (!xdr_krb5_principal(xdrs, &objp->mod_name)) {
369 if (!xdr_nulltype(xdrs, (void **) &objp->mod_name,
370 xdr_krb5_principal)) {
374 if (!xdr_krb5_timestamp(xdrs, &objp->mod_date)) {
377 if (!xdr_krb5_flags(xdrs, &objp->attributes)) {
380 if (!xdr_krb5_kvno(xdrs, &objp->kvno)) {
383 if (!xdr_krb5_kvno(xdrs, &objp->mkvno)) {
386 if (!xdr_nullstring(xdrs, &objp->policy)) {
389 if (!xdr_long(xdrs, &objp->aux_attributes)) {
392 if (v != KADM5_API_VERSION_1) {
393 if (!xdr_krb5_deltat(xdrs, &objp->max_renewable_life)) {
396 if (!xdr_krb5_timestamp(xdrs, &objp->last_success)) {
399 if (!xdr_krb5_timestamp(xdrs, &objp->last_failed)) {
402 if (!xdr_krb5_kvno(xdrs, &objp->fail_auth_count)) {
405 if (!xdr_krb5_int16(xdrs, &objp->n_key_data)) {
408 if (!xdr_krb5_int16(xdrs, &objp->n_tl_data)) {
411 if (!xdr_nulltype(xdrs, (void **) &objp->tl_data,
415 n = objp->n_key_data;
416 if (!xdr_array(xdrs, (caddr_t *) &objp->key_data,
417 &n, ~0, sizeof(krb5_key_data),
418 xdr_krb5_key_data_nocontents)) {
426 xdr_kadm5_policy_ent_rec(XDR *xdrs, kadm5_policy_ent_rec *objp)
428 if (!xdr_nullstring(xdrs, &objp->policy)) {
431 /* these all used to be u_int32, but it's stupid for sized types
432 to be exposed at the api, and they're the same as longs on the
434 if (!xdr_long(xdrs, &objp->pw_min_life)) {
437 if (!xdr_long(xdrs, &objp->pw_max_life)) {
440 if (!xdr_long(xdrs, &objp->pw_min_length)) {
443 if (!xdr_long(xdrs, &objp->pw_min_classes)) {
446 if (!xdr_long(xdrs, &objp->pw_history_num)) {
449 if (!xdr_long(xdrs, &objp->policy_refcnt)) {
456 xdr_cprinc_arg(XDR *xdrs, cprinc_arg *objp)
458 if (!xdr_ui_4(xdrs, &objp->api_version)) {
461 if (objp->api_version == KADM5_API_VERSION_1) {
462 if (!xdr_kadm5_principal_ent_rec_v1(xdrs, &objp->rec)) {
466 if (!xdr_kadm5_principal_ent_rec(xdrs, &objp->rec)) {
470 if (!xdr_long(xdrs, &objp->mask)) {
473 if (!xdr_nullstring(xdrs, &objp->passwd)) {
480 xdr_generic_ret(XDR *xdrs, generic_ret *objp)
482 if (!xdr_ui_4(xdrs, &objp->api_version)) {
485 if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {
492 xdr_dprinc_arg(XDR *xdrs, dprinc_arg *objp)
494 if (!xdr_ui_4(xdrs, &objp->api_version)) {
497 if (!xdr_krb5_principal(xdrs, &objp->princ)) {
504 xdr_mprinc_arg(XDR *xdrs, mprinc_arg *objp)
506 if (!xdr_ui_4(xdrs, &objp->api_version)) {
509 if (objp->api_version == KADM5_API_VERSION_1) {
510 if (!xdr_kadm5_principal_ent_rec_v1(xdrs, &objp->rec)) {
514 if (!xdr_kadm5_principal_ent_rec(xdrs, &objp->rec)) {
518 if (!xdr_long(xdrs, &objp->mask)) {
525 xdr_rprinc_arg(XDR *xdrs, rprinc_arg *objp)
527 if (!xdr_ui_4(xdrs, &objp->api_version)) {
530 if (!xdr_krb5_principal(xdrs, &objp->src)) {
533 if (!xdr_krb5_principal(xdrs, &objp->dest)) {
540 xdr_gprincs_arg(XDR *xdrs, gprincs_arg *objp)
542 if (!xdr_ui_4(xdrs, &objp->api_version)) {
545 if (!xdr_nullstring(xdrs, &objp->exp)) {
552 xdr_gprincs_ret(XDR *xdrs, gprincs_ret *objp)
554 if (!xdr_ui_4(xdrs, &objp->api_version)) {
557 if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {
560 if (objp->code == KADM5_OK) {
561 if (!xdr_int(xdrs, &objp->count)) {
564 if (!xdr_array(xdrs, (caddr_t *) &objp->princs,
565 (unsigned int *) &objp->count, ~0,
566 sizeof(char *), xdr_nullstring)) {
574 xdr_chpass_arg(XDR *xdrs, chpass_arg *objp)
576 if (!xdr_ui_4(xdrs, &objp->api_version)) {
579 if (!xdr_krb5_principal(xdrs, &objp->princ)) {
582 if (!xdr_nullstring(xdrs, &objp->pass)) {
589 xdr_setkey_arg(XDR *xdrs, setkey_arg *objp)
591 if (!xdr_ui_4(xdrs, &objp->api_version)) {
594 if (!xdr_krb5_principal(xdrs, &objp->princ)) {
597 if (!xdr_array(xdrs, (caddr_t *) &objp->keyblocks,
598 (unsigned int *) &objp->n_keys, ~0,
599 sizeof(krb5_keyblock), xdr_krb5_keyblock)) {
606 xdr_chrand_arg(XDR *xdrs, chrand_arg *objp)
608 if (!xdr_ui_4(xdrs, &objp->api_version)) {
611 if (!xdr_krb5_principal(xdrs, &objp->princ)) {
618 xdr_chrand_ret(XDR *xdrs, chrand_ret *objp)
620 if (!xdr_ui_4(xdrs, &objp->api_version)) {
623 if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {
626 if (objp->api_version == KADM5_API_VERSION_1) {
627 if(objp->code == KADM5_OK) {
628 if (!xdr_krb5_keyblock(xdrs, &objp->key)) {
633 if (objp->code == KADM5_OK) {
634 if (!xdr_array(xdrs, (char **)&objp->keys, &objp->n_keys, ~0,
635 sizeof(krb5_keyblock),
645 xdr_gprinc_arg(XDR *xdrs, gprinc_arg *objp)
647 if (!xdr_ui_4(xdrs, &objp->api_version)) {
650 if (!xdr_krb5_principal(xdrs, &objp->princ)) {
653 if ((objp->api_version > KADM5_API_VERSION_1) &&
654 !xdr_long(xdrs, &objp->mask)) {
662 xdr_gprinc_ret(XDR *xdrs, gprinc_ret *objp)
664 if (!xdr_ui_4(xdrs, &objp->api_version)) {
667 if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {
670 if(objp->code == KADM5_OK) {
671 if (objp->api_version == KADM5_API_VERSION_1) {
672 if (!xdr_kadm5_principal_ent_rec_v1(xdrs, &objp->rec)) {
676 if (!xdr_kadm5_principal_ent_rec(xdrs, &objp->rec)) {
685 xdr_cpol_arg(XDR *xdrs, cpol_arg *objp)
687 if (!xdr_ui_4(xdrs, &objp->api_version)) {
690 if (!xdr_kadm5_policy_ent_rec(xdrs, &objp->rec)) {
693 if (!xdr_long(xdrs, &objp->mask)) {
700 xdr_dpol_arg(XDR *xdrs, dpol_arg *objp)
702 if (!xdr_ui_4(xdrs, &objp->api_version)) {
705 if (!xdr_nullstring(xdrs, &objp->name)) {
712 xdr_mpol_arg(XDR *xdrs, mpol_arg *objp)
714 if (!xdr_ui_4(xdrs, &objp->api_version)) {
717 if (!xdr_kadm5_policy_ent_rec(xdrs, &objp->rec)) {
720 if (!xdr_long(xdrs, &objp->mask)) {
727 xdr_gpol_arg(XDR *xdrs, gpol_arg *objp)
729 if (!xdr_ui_4(xdrs, &objp->api_version)) {
732 if (!xdr_nullstring(xdrs, &objp->name)) {
739 xdr_gpol_ret(XDR *xdrs, gpol_ret *objp)
741 if (!xdr_ui_4(xdrs, &objp->api_version)) {
744 if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {
747 if(objp->code == KADM5_OK) {
748 if (!xdr_kadm5_policy_ent_rec(xdrs, &objp->rec))
755 xdr_gpols_arg(XDR *xdrs, gpols_arg *objp)
757 if (!xdr_ui_4(xdrs, &objp->api_version)) {
760 if (!xdr_nullstring(xdrs, &objp->exp)) {
767 xdr_gpols_ret(XDR *xdrs, gpols_ret *objp)
769 if (!xdr_ui_4(xdrs, &objp->api_version)) {
772 if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {
775 if (objp->code == KADM5_OK) {
776 if (!xdr_int(xdrs, &objp->count)) {
779 if (!xdr_array(xdrs, (caddr_t *) &objp->pols,
780 (unsigned int *) &objp->count, ~0,
781 sizeof(char *), xdr_nullstring)) {
788 bool_t xdr_getprivs_ret(XDR *xdrs, getprivs_ret *objp)
790 if (!xdr_ui_4(xdrs, &objp->api_version)) {
793 if (! xdr_kadm5_ret_t(xdrs, &objp->code) ||
794 ! xdr_long(xdrs, &objp->privs))
800 xdr_krb5_principal(XDR *xdrs, krb5_principal *objp)
804 krb5_principal pr = NULL;
805 static krb5_context context = NULL;
807 /* using a static context here is ugly, but should work
808 ok, and the other solutions are even uglier */
811 krb5_init_context(&context))
817 if((ret = krb5_unparse_name(context, *objp, &p)) != 0)
820 if(!xdr_nullstring(xdrs, &p))
825 if(!xdr_nullstring(xdrs, &p))
828 ret = krb5_parse_name(context, p, &pr);
838 krb5_free_principal(context, *objp);
845 xdr_krb5_octet(XDR *xdrs, krb5_octet *objp)
847 if (!xdr_u_char(xdrs, objp))
853 xdr_krb5_enctype(XDR *xdrs, krb5_enctype *objp)
856 * This used to be xdr_krb5_keytype, but keytypes and enctypes have
857 * been merged into only enctypes. However, randkey_principal
858 * already ensures that only a key of ENCTYPE_DES_CBC_CRC will be
859 * returned to v1 clients, and ENCTYPE_DES_CBC_CRC has the same
860 * value as KEYTYPE_DES used too, which is what all v1 clients
861 * expect. Therefore, IMHO, just encoding whatever enctype we get
865 if (!xdr_u_int(xdrs, (unsigned int *) objp))
871 xdr_krb5_keyblock(XDR *xdrs, krb5_keyblock *objp)
873 /* XXX This only works because free_keyblock assumes ->contents
874 is allocated by malloc() */
876 if(!xdr_krb5_enctype(xdrs, &objp->enctype))
878 if(!xdr_bytes(xdrs, (char **) &objp->contents, (unsigned int *)