summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2011-09-21 16:29:00 +0000
committerGreg Hudson <ghudson@mit.edu>2011-09-21 16:29:00 +0000
commitaf105268217bc5d8b93c3c0c66eca087ffb10085 (patch)
tree53fccb58581d01e3bd8c0e693b785ff12e4bf1ce /src/lib
parent237e57c297708c8009cf2af4833b78abc4e05bbc (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.h14
-rw-r--r--src/lib/kadm5/admin_xdr.h4
-rw-r--r--src/lib/kadm5/clnt/client_principal.c48
-rw-r--r--src/lib/kadm5/clnt/client_rpc.c30
-rw-r--r--src/lib/kadm5/clnt/libkadm5clnt_mit.exports3
-rw-r--r--src/lib/kadm5/kadm_rpc.h32
-rw-r--r--src/lib/kadm5/kadm_rpc_xdr.c69
-rw-r--r--src/lib/kadm5/misc_free.c19
-rw-r--r--src/lib/kadm5/srv/libkadm5srv_mit.exports7
-rw-r--r--src/lib/kadm5/srv/svr_principal.c52
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;
+}