#include "k5-int.h"
#include "os-proto.h"
#include <krb5/hostrealm_plugin.h>
#ifdef KRB5_DNS_LOOKUP
static char *
txt_lookup(krb5_context context, const char *fqdn)
{
char *realm;
while (fqdn != NULL && *fqdn != '\0') {
if (k5_try_realm_txt_rr(context, "_kerberos", fqdn, &realm) == 0)
return realm;
fqdn = strchr(fqdn, '.');
if (fqdn != NULL)
fqdn++;
}
return NULL;
}
static krb5_error_code
dns_fallback_realm(krb5_context context, krb5_hostrealm_moddata data,
const char *host, char ***realms_out)
{
krb5_error_code ret;
char *realm;
*realms_out = NULL;
if (!_krb5_use_dns_realm(context) || k5_is_numeric_address(host))
return KRB5_PLUGIN_NO_HANDLE;
realm = txt_lookup(context, host);
if (realm == NULL)
return KRB5_PLUGIN_NO_HANDLE;
ret = k5_make_realmlist(realm, realms_out);
free(realm);
return ret;
}
static krb5_error_code
dns_default_realm(krb5_context context, krb5_hostrealm_moddata data,
char ***realms_out)
{
krb5_error_code ret;
char *localhost, *realm;
*realms_out = NULL;
if (!_krb5_use_dns_realm(context))
return KRB5_PLUGIN_NO_HANDLE;
ret = krb5int_get_fq_local_hostname(&localhost);
if (ret)
return ret;
realm = txt_lookup(context, localhost);
free(localhost);
if (realm == NULL)
(void)k5_try_realm_txt_rr(context, "_kerberos", NULL, &realm);
if (realm == NULL)
return KRB5_PLUGIN_NO_HANDLE;
ret = k5_make_realmlist(realm, realms_out);
free(realm);
return ret;
}
static void
dns_free_realmlist(krb5_context context, krb5_hostrealm_moddata data,
char **list)
{
krb5_free_host_realm(context, list);
}
krb5_error_code
hostrealm_dns_initvt(krb5_context context, int maj_ver, int min_ver,
krb5_plugin_vtable vtable)
{
krb5_hostrealm_vtable vt = (krb5_hostrealm_vtable)vtable;
vt->name = "dns";
vt->fallback_realm = dns_fallback_realm;
vt->default_realm = dns_default_realm;
vt->free_list = dns_free_realmlist;
return 0;
}
#else
krb5_error_code
hostrealm_dns_initvt(krb5_context context, int maj_ver, int min_ver,
krb5_plugin_vtable vtable)
{
krb5_hostrealm_vtable vt = (krb5_hostrealm_vtable)vtable;
vt->name = "dns";
return 0;
}
#endif