diff options
Diffstat (limited to 'src/lib/gssapi/krb5/inq_cred.c')
| -rw-r--r-- | src/lib/gssapi/krb5/inq_cred.c | 46 | 
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; +}  | 
