allow keytab specifiction to gsskrb5_register_acceptor_identity
This commit is contained in:
@@ -36,6 +36,24 @@
|
||||
HEIMDAL_MUTEX gssapi_keytab_mutex = HEIMDAL_MUTEX_INITIALIZER;
|
||||
krb5_keytab _gsskrb5_keytab;
|
||||
|
||||
static krb5_error_code
|
||||
validate_keytab(krb5_context context, const char *name, krb5_keytab *id)
|
||||
{
|
||||
krb5_error_code ret;
|
||||
|
||||
ret = krb5_kt_resolve(context, name, id);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = krb5_kt_have_content(context, *id);
|
||||
if (ret) {
|
||||
krb5_kt_close(context, *id);
|
||||
*id = NULL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
OM_uint32
|
||||
_gsskrb5_register_acceptor_identity (const char *identity)
|
||||
{
|
||||
@@ -55,15 +73,23 @@ _gsskrb5_register_acceptor_identity (const char *identity)
|
||||
if (identity == NULL) {
|
||||
ret = krb5_kt_default(context, &_gsskrb5_keytab);
|
||||
} else {
|
||||
char *p = NULL;
|
||||
|
||||
ret = asprintf(&p, "FILE:%s", identity);
|
||||
if(ret < 0 || p == NULL) {
|
||||
HEIMDAL_MUTEX_unlock(&gssapi_keytab_mutex);
|
||||
return GSS_S_FAILURE;
|
||||
/*
|
||||
* First check if we can the keytab as is and if it has content...
|
||||
*/
|
||||
ret = validate_keytab(context, identity, &_gsskrb5_keytab);
|
||||
/*
|
||||
* if it doesn't, lets prepend FILE: and try again
|
||||
*/
|
||||
if (ret) {
|
||||
char *p = NULL;
|
||||
ret = asprintf(&p, "FILE:%s", identity);
|
||||
if(ret < 0 || p == NULL) {
|
||||
HEIMDAL_MUTEX_unlock(&gssapi_keytab_mutex);
|
||||
return GSS_S_FAILURE;
|
||||
}
|
||||
ret = validate_keytab(context, p, &_gsskrb5_keytab);
|
||||
free(p);
|
||||
}
|
||||
ret = krb5_kt_resolve(context, p, &_gsskrb5_keytab);
|
||||
free(p);
|
||||
}
|
||||
HEIMDAL_MUTEX_unlock(&gssapi_keytab_mutex);
|
||||
if(ret)
|
||||
|
@@ -81,17 +81,18 @@ __gsskrb5_ccache_lifetime(OM_uint32 *minor_status,
|
||||
static krb5_error_code
|
||||
get_keytab(krb5_context context, krb5_keytab *keytab)
|
||||
{
|
||||
char kt_name[256];
|
||||
krb5_error_code kret;
|
||||
|
||||
HEIMDAL_MUTEX_lock(&gssapi_keytab_mutex);
|
||||
|
||||
if (_gsskrb5_keytab != NULL) {
|
||||
kret = krb5_kt_get_name(context,
|
||||
_gsskrb5_keytab,
|
||||
kt_name, sizeof(kt_name));
|
||||
if (kret == 0)
|
||||
kret = krb5_kt_resolve(context, kt_name, keytab);
|
||||
char *name = NULL;
|
||||
|
||||
kret = krb5_kt_get_full_name(context, _gsskrb5_keytab, &name);
|
||||
if (kret == 0) {
|
||||
kret = krb5_kt_resolve(context, name, keytab);
|
||||
krb5_xfree(name);
|
||||
}
|
||||
} else
|
||||
kret = krb5_kt_default(context, keytab);
|
||||
|
||||
|
@@ -123,23 +123,11 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_add_cred (
|
||||
}
|
||||
|
||||
if (cred->keytab) {
|
||||
char name[KRB5_KT_PREFIX_MAX_LEN + MAXPATHLEN];
|
||||
int len;
|
||||
char *name = NULL;
|
||||
|
||||
ret = GSS_S_FAILURE;
|
||||
|
||||
kret = krb5_kt_get_type(context, cred->keytab,
|
||||
name, KRB5_KT_PREFIX_MAX_LEN);
|
||||
if (kret) {
|
||||
*minor_status = kret;
|
||||
goto failure;
|
||||
}
|
||||
len = strlen(name);
|
||||
name[len++] = ':';
|
||||
|
||||
kret = krb5_kt_get_name(context, cred->keytab,
|
||||
name + len,
|
||||
sizeof(name) - len);
|
||||
kret = krb5_kt_get_full_name(context, cred->keytab, &name);
|
||||
if (kret) {
|
||||
*minor_status = kret;
|
||||
goto failure;
|
||||
@@ -147,6 +135,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_add_cred (
|
||||
|
||||
kret = krb5_kt_resolve(context, name,
|
||||
&handle->keytab);
|
||||
krb5_xfree(name);
|
||||
if (kret){
|
||||
*minor_status = kret;
|
||||
goto failure;
|
||||
|
Reference in New Issue
Block a user