diff options
| author | Greg Hudson <ghudson@mit.edu> | 2011-09-21 16:29:00 +0000 |
|---|---|---|
| committer | Greg Hudson <ghudson@mit.edu> | 2011-09-21 16:29:00 +0000 |
| commit | af105268217bc5d8b93c3c0c66eca087ffb10085 (patch) | |
| tree | 53fccb58581d01e3bd8c0e693b785ff12e4bf1ce /src/lib | |
| parent | 237e57c297708c8009cf2af4833b78abc4e05bbc (diff) | |
Add kadmin functionality for string attributes
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@25215 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/kadm5/admin.h | 14 | ||||
| -rw-r--r-- | src/lib/kadm5/admin_xdr.h | 4 | ||||
| -rw-r--r-- | src/lib/kadm5/clnt/client_principal.c | 48 | ||||
| -rw-r--r-- | src/lib/kadm5/clnt/client_rpc.c | 30 | ||||
| -rw-r--r-- | src/lib/kadm5/clnt/libkadm5clnt_mit.exports | 3 | ||||
| -rw-r--r-- | src/lib/kadm5/kadm_rpc.h | 32 | ||||
| -rw-r--r-- | src/lib/kadm5/kadm_rpc_xdr.c | 69 | ||||
| -rw-r--r-- | src/lib/kadm5/misc_free.c | 19 | ||||
| -rw-r--r-- | src/lib/kadm5/srv/libkadm5srv_mit.exports | 7 | ||||
| -rw-r--r-- | src/lib/kadm5/srv/svr_principal.c | 52 |
10 files changed, 278 insertions, 0 deletions
diff --git a/src/lib/kadm5/admin.h b/src/lib/kadm5/admin.h index 7bcc7fcbc..d1a76f737 100644 --- a/src/lib/kadm5/admin.h +++ b/src/lib/kadm5/admin.h @@ -513,6 +513,20 @@ kadm5_ret_t kadm5_purgekeys(void *server_handle, krb5_principal principal, int keepkvno); +kadm5_ret_t kadm5_get_strings(void *server_handle, + krb5_principal principal, + krb5_string_attr **strings_out, + int *count_out); + +kadm5_ret_t kadm5_set_string(void *server_handle, + krb5_principal principal, + const char *key, + const char *value); + +kadm5_ret_t kadm5_free_strings(void *server_handle, + krb5_string_attr *strings, + int count); + KADM5INT_END_DECLS #endif /* __KADM5_ADMIN_H__ */ diff --git a/src/lib/kadm5/admin_xdr.h b/src/lib/kadm5/admin_xdr.h index 927a0e5b0..e46d5429d 100644 --- a/src/lib/kadm5/admin_xdr.h +++ b/src/lib/kadm5/admin_xdr.h @@ -56,6 +56,9 @@ bool_t xdr_gpols_arg(XDR *xdrs, gpols_arg *objp); bool_t xdr_gpols_ret(XDR *xdrs, gpols_ret *objp); bool_t xdr_getprivs_ret(XDR *xdrs, getprivs_ret *objp); bool_t xdr_purgekeys_arg(XDR *xdrs, purgekeys_arg *objp); +bool_t xdr_gstrings_arg(XDR *xdrs, gstrings_arg *objp); +bool_t xdr_gstrings_ret(XDR *xdrs, gstrings_ret *objp); +bool_t xdr_sstring_arg(XDR *xdrs, sstring_arg *objp); bool_t xdr_krb5_principal(XDR *xdrs, krb5_principal *objp); bool_t xdr_krb5_octet(XDR *xdrs, krb5_octet *objp); bool_t xdr_krb5_int32(XDR *xdrs, krb5_int32 *objp); @@ -63,4 +66,5 @@ bool_t xdr_krb5_enctype(XDR *xdrs, krb5_enctype *objp); bool_t xdr_krb5_salttype(XDR *xdrs, krb5_int32 *objp); bool_t xdr_krb5_keyblock(XDR *xdrs, krb5_keyblock *objp); bool_t xdr_krb5_key_data(XDR *xdrs, krb5_key_data *objp); +bool_t xdr_krb5_string_attr(XDR *xdrs, krb5_string_attr *objp); bool_t xdr_osa_pw_hist_ent(XDR *xdrs, osa_pw_hist_ent *objp); diff --git a/src/lib/kadm5/clnt/client_principal.c b/src/lib/kadm5/clnt/client_principal.c index 41324be80..6af2a1751 100644 --- a/src/lib/kadm5/clnt/client_principal.c +++ b/src/lib/kadm5/clnt/client_principal.c @@ -482,3 +482,51 @@ kadm5_purgekeys(void *server_handle, eret(); return r->code; } + +kadm5_ret_t +kadm5_get_strings(void *server_handle, krb5_principal principal, + krb5_string_attr **strings_out, int *count_out) +{ + gstrings_arg arg; + gstrings_ret *r; + kadm5_server_handle_t handle = server_handle; + + *strings_out = NULL; + *count_out = 0; + CHECK_HANDLE(server_handle); + if (principal == NULL) + return EINVAL; + + arg.princ = principal; + arg.api_version = handle->api_version; + r = get_strings_2(&arg, handle->clnt); + if (r == NULL) + eret(); + if (r->code == 0) { + *strings_out = r->strings; + *count_out = r->count; + } + return r->code; +} + +kadm5_ret_t +kadm5_set_string(void *server_handle, krb5_principal principal, + const char *key, const char *value) +{ + sstring_arg arg; + generic_ret *r; + kadm5_server_handle_t handle = server_handle; + + CHECK_HANDLE(server_handle); + if (principal == NULL || key == NULL) + return EINVAL; + + arg.princ = principal; + arg.key = (char *)key; + arg.value = (char *)value; + arg.api_version = handle->api_version; + r = set_string_2(&arg, handle->clnt); + if (r == NULL) + eret(); + return r->code; +} diff --git a/src/lib/kadm5/clnt/client_rpc.c b/src/lib/kadm5/clnt/client_rpc.c index 95417a60c..e11346d82 100644 --- a/src/lib/kadm5/clnt/client_rpc.c +++ b/src/lib/kadm5/clnt/client_rpc.c @@ -341,3 +341,33 @@ purgekeys_2(purgekeys_arg *argp, CLIENT *clnt) } return (&clnt_res); } + +gstrings_ret * +get_strings_2(gstrings_arg *argp, CLIENT *clnt) +{ + static gstrings_ret clnt_res; + + memset(&clnt_res, 0, sizeof(clnt_res)); + if (clnt_call(clnt, GET_STRINGS, + (xdrproc_t) xdr_gstrings_arg, (caddr_t) argp, + (xdrproc_t) xdr_gstrings_ret, (caddr_t) &clnt_res, + TIMEOUT) != RPC_SUCCESS) { + return (NULL); + } + return (&clnt_res); +} + +generic_ret * +set_string_2(sstring_arg *argp, CLIENT *clnt) +{ + static generic_ret clnt_res; + + memset(&clnt_res, 0, sizeof(clnt_res)); + if (clnt_call(clnt, SET_STRING, + (xdrproc_t) xdr_sstring_arg, (caddr_t) argp, + (xdrproc_t) xdr_generic_ret, (caddr_t) &clnt_res, + TIMEOUT) != RPC_SUCCESS) { + return (NULL); + } + return (&clnt_res); +} diff --git a/src/lib/kadm5/clnt/libkadm5clnt_mit.exports b/src/lib/kadm5/clnt/libkadm5clnt_mit.exports index 249a3c774..4732766ae 100644 --- a/src/lib/kadm5/clnt/libkadm5clnt_mit.exports +++ b/src/lib/kadm5/clnt/libkadm5clnt_mit.exports @@ -16,6 +16,7 @@ kadm5_free_key_data kadm5_free_name_list kadm5_free_policy_ent kadm5_free_principal_ent +kadm5_free_strings kadm5_get_admin_service_name kadm5_get_config_params kadm5_get_policies @@ -23,6 +24,7 @@ kadm5_get_policy kadm5_get_principal kadm5_get_principals kadm5_get_privs +kadm5_get_strings kadm5_init kadm5_init_anonymous kadm5_init_krb5_context @@ -36,6 +38,7 @@ kadm5_purgekeys kadm5_randkey_principal kadm5_randkey_principal_3 kadm5_rename_principal +kadm5_set_string kadm5_setkey_principal kadm5_setkey_principal_3 kadm5_setv4key_principal diff --git a/src/lib/kadm5/kadm_rpc.h b/src/lib/kadm5/kadm_rpc.h index 1aa98d0fd..d5e9e7f07 100644 --- a/src/lib/kadm5/kadm_rpc.h +++ b/src/lib/kadm5/kadm_rpc.h @@ -207,6 +207,28 @@ struct purgekeys_arg { }; typedef struct purgekeys_arg purgekeys_arg; +struct gstrings_arg { + krb5_ui_4 api_version; + krb5_principal princ; +}; +typedef struct gstrings_arg gstrings_arg; + +struct gstrings_ret { + krb5_ui_4 api_version; + kadm5_ret_t code; + krb5_string_attr *strings; + int count; +}; +typedef struct gstrings_ret gstrings_ret; + +struct sstring_arg { + krb5_ui_4 api_version; + krb5_principal princ; + char *key; + char *value; +}; +typedef struct sstring_arg sstring_arg; + #define KADM 2112 #define KADMVERS 2 #define CREATE_PRINCIPAL 1 @@ -275,6 +297,12 @@ extern generic_ret * setkey_principal3_2_svc(setkey3_arg *, struct svc_req *); #define PURGEKEYS 22 extern generic_ret * purgekeys_2(purgekeys_arg *, CLIENT *); extern generic_ret * purgekeys_2_svc(purgekeys_arg *, struct svc_req *); +#define GET_STRINGS 23 +extern gstrings_ret * get_strings_2(gstrings_arg *, CLIENT *); +extern gstrings_ret * get_strings_2_svc(gstrings_arg *, struct svc_req *); +#define SET_STRING 24 +extern generic_ret * set_string_2(sstring_arg *, CLIENT *); +extern generic_ret * set_string_2_svc(sstring_arg *, struct svc_req *); extern bool_t xdr_cprinc_arg (); extern bool_t xdr_cprinc3_arg (); @@ -312,6 +340,10 @@ extern bool_t xdr_gpols_arg (); extern bool_t xdr_gpols_ret (); extern bool_t xdr_getprivs_ret (); extern bool_t xdr_purgekeys_arg (); +extern bool_t xdr_gstrings_arg (); +extern bool_t xdr_gstrings_ret (); +extern bool_t xdr_sstring_arg (); +extern bool_t xdr_krb5_string_attr (); #endif /* __KADM_RPC_H__ */ diff --git a/src/lib/kadm5/kadm_rpc_xdr.c b/src/lib/kadm5/kadm_rpc_xdr.c index 0b14ff8f5..0b0253a5c 100644 --- a/src/lib/kadm5/kadm_rpc_xdr.c +++ b/src/lib/kadm5/kadm_rpc_xdr.c @@ -972,6 +972,62 @@ xdr_purgekeys_arg(XDR *xdrs, purgekeys_arg *objp) } bool_t +xdr_gstrings_arg(XDR *xdrs, gstrings_arg *objp) +{ + if (!xdr_ui_4(xdrs, &objp->api_version)) { + return (FALSE); + } + if (!xdr_krb5_principal(xdrs, &objp->princ)) { + return (FALSE); + } + + return (TRUE); +} + +bool_t +xdr_gstrings_ret(XDR *xdrs, gstrings_ret *objp) +{ + if (!xdr_ui_4(xdrs, &objp->api_version)) { + return (FALSE); + } + if (!xdr_kadm5_ret_t(xdrs, &objp->code)) { + return (FALSE); + } + if (objp->code == KADM5_OK) { + if (!xdr_int(xdrs, &objp->count)) { + return (FALSE); + } + if (!xdr_array(xdrs, (caddr_t *) &objp->strings, + (unsigned int *) &objp->count, ~0, + sizeof(krb5_string_attr), + xdr_krb5_string_attr)) { + return (FALSE); + } + } + + return (TRUE); +} + +bool_t +xdr_sstring_arg(XDR *xdrs, sstring_arg *objp) +{ + if (!xdr_ui_4(xdrs, &objp->api_version)) { + return (FALSE); + } + if (!xdr_krb5_principal(xdrs, &objp->princ)) { + return (FALSE); + } + if (!xdr_nullstring(xdrs, &objp->key)) { + return (FALSE); + } + if (!xdr_nullstring(xdrs, &objp->value)) { + return (FALSE); + } + + return (TRUE); +} + +bool_t xdr_krb5_principal(XDR *xdrs, krb5_principal *objp) { int ret; @@ -1063,3 +1119,16 @@ xdr_krb5_keyblock(XDR *xdrs, krb5_keyblock *objp) return FALSE; return TRUE; } + +bool_t +xdr_krb5_string_attr(XDR *xdrs, krb5_string_attr *objp) +{ + if (!xdr_nullstring(xdrs, &objp->key)) + return FALSE; + if (!xdr_nullstring(xdrs, &objp->value)) + return FALSE; + if (xdrs->x_op == XDR_DECODE && + (objp->key == NULL || objp->value == NULL)) + return FALSE; + return TRUE; +} diff --git a/src/lib/kadm5/misc_free.c b/src/lib/kadm5/misc_free.c index 4d38c0f99..1d7079199 100644 --- a/src/lib/kadm5/misc_free.c +++ b/src/lib/kadm5/misc_free.c @@ -89,3 +89,22 @@ kadm5_free_principal_ent(void *server_handle, kadm5_principal_ent_t val) } return KADM5_OK; } + +kadm5_ret_t +kadm5_free_strings(void *server_handle, krb5_string_attr *strings, + int count) +{ + int i; + + _KADM5_CHECK_HANDLE(server_handle); + + if (!strings) + return KADM5_OK; + + for (i = 0; i < count; i++) { + free(strings[i].key); + free(strings[i].value); + } + free(strings); + return KADM5_OK; +} diff --git a/src/lib/kadm5/srv/libkadm5srv_mit.exports b/src/lib/kadm5/srv/libkadm5srv_mit.exports index 49a1b8803..44311ee26 100644 --- a/src/lib/kadm5/srv/libkadm5srv_mit.exports +++ b/src/lib/kadm5/srv/libkadm5srv_mit.exports @@ -26,6 +26,7 @@ kadm5_free_key_data kadm5_free_name_list kadm5_free_policy_ent kadm5_free_principal_ent +kadm5_free_strings kadm5_get_config_params kadm5_get_policies kadm5_get_policy @@ -33,6 +34,7 @@ kadm5_get_principal kadm5_get_principal_keys kadm5_get_principals kadm5_get_privs +kadm5_get_strings kadm5_init kadm5_init_anonymous kadm5_init_krb5_context @@ -47,6 +49,7 @@ kadm5_purgekeys kadm5_randkey_principal kadm5_randkey_principal_3 kadm5_rename_principal +kadm5_set_string kadm5_setkey_principal kadm5_setkey_principal_3 kadm5_setv4key_principal @@ -105,6 +108,8 @@ xdr_gprinc_arg xdr_gprinc_ret xdr_gprincs_arg xdr_gprincs_ret +xdr_gstrings_arg +xdr_gstrings_ret xdr_kadm5_policy_ent_rec xdr_kadm5_principal_ent_rec xdr_kadm5_ret_t @@ -120,6 +125,7 @@ xdr_krb5_kvno xdr_krb5_octet xdr_krb5_principal xdr_krb5_salttype +xdr_krb5_string_attr xdr_krb5_timestamp xdr_krb5_tl_data xdr_krb5_ui_2 @@ -135,5 +141,6 @@ xdr_rprinc_arg xdr_setkey3_arg xdr_setkey_arg xdr_setv4key_arg +xdr_sstring_arg xdr_ui_4 kadm5_init_iprop diff --git a/src/lib/kadm5/srv/svr_principal.c b/src/lib/kadm5/srv/svr_principal.c index 464d5e8e4..a9d0cdb88 100644 --- a/src/lib/kadm5/srv/svr_principal.c +++ b/src/lib/kadm5/srv/svr_principal.c @@ -2307,3 +2307,55 @@ done: kdb_free_entry(handle, kdb, &adb); return ret; } + +kadm5_ret_t +kadm5_get_strings(void *server_handle, krb5_principal principal, + krb5_string_attr **strings_out, int *count_out) +{ + kadm5_server_handle_t handle = server_handle; + kadm5_ret_t ret; + krb5_db_entry *kdb = NULL; + + *strings_out = NULL; + *count_out = 0; + CHECK_HANDLE(server_handle); + if (principal == NULL) + return EINVAL; + + ret = kdb_get_entry(handle, principal, &kdb, NULL); + if (ret) + return ret; + + ret = krb5_dbe_get_strings(handle->context, kdb, strings_out, count_out); + kdb_free_entry(handle, kdb, NULL); + return ret; +} + +kadm5_ret_t +kadm5_set_string(void *server_handle, krb5_principal principal, + const char *key, const char *value) +{ + kadm5_server_handle_t handle = server_handle; + kadm5_ret_t ret; + krb5_db_entry *kdb; + osa_princ_ent_rec adb; + + CHECK_HANDLE(server_handle); + if (principal == NULL || key == NULL) + return EINVAL; + + ret = kdb_get_entry(handle, principal, &kdb, &adb); + if (ret) + return ret; + + ret = krb5_dbe_set_string(handle->context, kdb, key, value); + if (ret) + goto done; + + kdb->mask = KADM5_TL_DATA; + ret = kdb_put_entry(handle, kdb, &adb); + +done: + kdb_free_entry(handle, kdb, &adb); + return ret; +} |
