summaryrefslogtreecommitdiff
path: root/src/lib/gssapi/krb5/inq_cred.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/gssapi/krb5/inq_cred.c')
-rw-r--r--src/lib/gssapi/krb5/inq_cred.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/src/lib/gssapi/krb5/inq_cred.c b/src/lib/gssapi/krb5/inq_cred.c
index 4e35a056316f..3a73417c083d 100644
--- a/src/lib/gssapi/krb5/inq_cred.c
+++ b/src/lib/gssapi/krb5/inq_cred.c
@@ -130,8 +130,9 @@ krb5_gss_inquire_cred(minor_status, cred_handle, name, lifetime_ret,
goto fail;
}
- if (cred->expire > 0) {
- if ((lifetime = cred->expire - now) < 0)
+ if (cred->expire != 0) {
+ lifetime = ts_delta(cred->expire, now);
+ if (lifetime < 0)
lifetime = 0;
}
else
@@ -245,3 +246,44 @@ krb5_gss_inquire_cred_by_mech(minor_status, cred_handle,
}
return(mstat);
}
+
+OM_uint32
+gss_krb5int_get_cred_impersonator(OM_uint32 *minor_status,
+ const gss_cred_id_t cred_handle,
+ const gss_OID desired_object,
+ gss_buffer_set_t *data_set)
+{
+ krb5_gss_cred_id_t cred = (krb5_gss_cred_id_t)cred_handle;
+ gss_buffer_desc rep = GSS_C_EMPTY_BUFFER;
+ krb5_context context = NULL;
+ char *impersonator = NULL;
+ krb5_error_code ret;
+ OM_uint32 major;
+
+ *data_set = GSS_C_NO_BUFFER_SET;
+
+ /* Return an empty buffer set if no impersonator is present */
+ if (cred->impersonator == NULL)
+ return generic_gss_create_empty_buffer_set(minor_status, data_set);
+
+ ret = krb5_gss_init_context(&context);
+ if (ret) {
+ *minor_status = ret;
+ return GSS_S_FAILURE;
+ }
+
+ ret = krb5_unparse_name(context, cred->impersonator, &impersonator);
+ if (ret) {
+ krb5_free_context(context);
+ *minor_status = ret;
+ return GSS_S_FAILURE;
+ }
+
+ rep.value = impersonator;
+ rep.length = strlen(impersonator);
+ major = generic_gss_add_buffer_set_member(minor_status, &rep, data_set);
+
+ krb5_free_unparsed_name(context, impersonator);
+ krb5_free_context(context);
+ return major;
+}