Example #1
0
static int
dns_find_realm(krb5_context context,
	       const char *domain,
	       krb5_realm **realms)
{
    static const char *default_labels[] = { "_kerberos", NULL };
    char dom[MAXHOSTNAMELEN];
    struct rk_dns_reply *r;
    const char **labels;
    char **config_labels;
    int i, ret;

    config_labels = krb5_config_get_strings(context, NULL, "libdefaults",
					    "dns_lookup_realm_labels", NULL);
    if(config_labels != NULL)
	labels = (const char **)config_labels;
    else
	labels = default_labels;
    if(*domain == '.')
	domain++;
    for (i = 0; labels[i] != NULL; i++) {
	ret = snprintf(dom, sizeof(dom), "%s.%s.", labels[i], domain);
	if(ret < 0 || (size_t)ret >= sizeof(dom)) {
	    if (config_labels)
		krb5_config_free_strings(config_labels);
	    return -1;
	}
    	r = rk_dns_lookup(dom, "TXT");
    	if(r != NULL) {
	    ret = copy_txt_to_realms (r->head, realms);
	    rk_dns_free_data(r);
	    if(ret == 0) {
		if (config_labels)
		    krb5_config_free_strings(config_labels);
		return 0;
	    }
	}
    }
    if (config_labels)
	krb5_config_free_strings(config_labels);
    return -1;
}
Example #2
0
static int
dns_find_cell(const char *cell, char *dbserver, size_t len)
{
    struct rk_dns_reply *r;
    int ok = -1;
    r = rk_dns_lookup(cell, "afsdb");
    if(r){
	struct rk_resource_record *rr = r->head;
	while(rr){
	    if(rr->type == rk_ns_t_afsdb && rr->u.afsdb->preference == 1){
		strlcpy(dbserver,
				rr->u.afsdb->domain,
				len);
		ok = 0;
		break;
	    }
	    rr = rr->next;
	}
	rk_dns_free_data(r);
    }
    return ok;
}
Example #3
0
static krb5_error_code
srv_find_realm(krb5_context context, krb5_krbhst_info ***res, int *count,
	       const char *realm, const char *dns_type,
	       const char *proto, const char *service, int port)
{
    char domain[1024];
    struct rk_dns_reply *r;
    struct rk_resource_record *rr;
    int num_srv;
    int proto_num;
    int def_port;

    *res = NULL;
    *count = 0;

    proto_num = string_to_proto(proto);
    if(proto_num < 0) {
	krb5_set_error_message(context, EINVAL,
			       N_("unknown protocol `%s' to lookup", ""),
			       proto);
	return EINVAL;
    }

    if(proto_num == KRB5_KRBHST_HTTP)
	def_port = ntohs(krb5_getportbyname (context, "http", "tcp", 80));
    else if(port == 0)
	def_port = ntohs(krb5_getportbyname (context, service, proto, 88));
    else
	def_port = port;

    snprintf(domain, sizeof(domain), "_%s._%s.%s.", service, proto, realm);

    r = rk_dns_lookup(domain, dns_type);
    if(r == NULL) {
	_krb5_debug(context, 0,
		    "DNS lookup failed domain: %s", domain);
	return KRB5_KDC_UNREACH;
    }

    for(num_srv = 0, rr = r->head; rr; rr = rr->next)
	if(rr->type == rk_ns_t_srv)
	    num_srv++;

    *res = malloc(num_srv * sizeof(**res));
    if(*res == NULL) {
	rk_dns_free_data(r);
	krb5_set_error_message(context, ENOMEM,
			       N_("malloc: out of memory", ""));
	return ENOMEM;
    }

    rk_dns_srv_order(r);

    for(num_srv = 0, rr = r->head; rr; rr = rr->next)
	if(rr->type == rk_ns_t_srv) {
	    krb5_krbhst_info *hi;
	    size_t len = strlen(rr->u.srv->target);

	    hi = calloc(1, sizeof(*hi) + len);
	    if(hi == NULL) {
		rk_dns_free_data(r);
		while(--num_srv >= 0)
		    free((*res)[num_srv]);
		free(*res);
		*res = NULL;
		return ENOMEM;
	    }
	    (*res)[num_srv++] = hi;

	    hi->proto = proto_num;

	    hi->def_port = def_port;
	    if (port != 0)
		hi->port = port;
	    else
		hi->port = rr->u.srv->port;

	    strlcpy(hi->hostname, rr->u.srv->target, len + 1);
	}

    *count = num_srv;

    rk_dns_free_data(r);
    return 0;
}
Example #4
0
int
main(int argc, char **argv)
{
    struct rk_dns_reply *r;
    struct rk_resource_record *rr;
    int optidx = 0, i, exit_code = 0;

    setprogname (argv[0]);

    if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
	usage(1);

    if (help_flag)
	usage (0);

    if(version_flag){
	printf("some version\n");
	exit(0);
    }

    argc -= optidx;
    argv += optidx;

    if (argc != 2)
	usage(1);

    for (i = 0; i < loop_integer; i++) {

	r = rk_dns_lookup(argv[0], argv[1]);
	if(r == NULL){
	    printf("No reply.\n");
	    exit_code = 1;
	    break;
	}
	if(r->q.type == rk_ns_t_srv)
	    rk_dns_srv_order(r);

	for(rr = r->head; rr;rr=rr->next){
	    printf("%-30s %-5s %-6d ", rr->domain, rk_dns_type_to_string(rr->type), rr->ttl);
	    switch(rr->type){
	    case rk_ns_t_ns:
	    case rk_ns_t_cname:
	    case rk_ns_t_ptr:
		printf("%s\n", (char*)rr->u.data);
		break;
	    case rk_ns_t_a:
		printf("%s\n", inet_ntoa(*rr->u.a));
		break;
	    case rk_ns_t_mx:
	    case rk_ns_t_afsdb:{
		printf("%d %s\n", rr->u.mx->preference, rr->u.mx->domain);
		break;
	    }
	    case rk_ns_t_srv:{
		struct rk_srv_record *srv = rr->u.srv;
		printf("%d %d %d %s\n", srv->priority, srv->weight,
		       srv->port, srv->target);
		break;
	    }
	    case rk_ns_t_txt: {
		printf("%s\n", rr->u.txt);
		break;
	    }
	    case rk_ns_t_sig : {
		struct rk_sig_record *sig = rr->u.sig;
		const char *type_string = rk_dns_type_to_string (sig->type);

		printf ("type %u (%s), algorithm %u, labels %u, orig_ttl %u, sig_expiration %u, sig_inception %u, key_tag %u, signer %s\n",
			sig->type, type_string ? type_string : "",
			sig->algorithm, sig->labels, sig->orig_ttl,
			sig->sig_expiration, sig->sig_inception, sig->key_tag,
			sig->signer);
		break;
	    }
	    case rk_ns_t_key : {
		struct rk_key_record *key = rr->u.key;

		printf ("flags %u, protocol %u, algorithm %u\n",
			key->flags, key->protocol, key->algorithm);
		break;
	    }
	    case rk_ns_t_sshfp : {
		struct rk_sshfp_record *sshfp = rr->u.sshfp;
		size_t i;

		printf ("alg %u type %u length %lu data ", sshfp->algorithm,
			sshfp->type,  (unsigned long)sshfp->sshfp_len);
		for (i = 0; i < sshfp->sshfp_len; i++)
		    printf("%02X", sshfp->sshfp_data[i]);
		printf("\n");

		break;
	    }
	    case rk_ns_t_ds : {
		struct rk_ds_record *ds = rr->u.ds;
		size_t i;

		printf ("key tag %u alg %u type %u length %lu data ",
			ds->key_tag, ds->algorithm, ds->digest_type,
			(unsigned long)ds->digest_len);
		for (i = 0; i < ds->digest_len; i++)
		    printf("%02X", ds->digest_data[i]);
		printf("\n");

		break;
	    }
	    default:
		printf("\n");
		break;
	    }
	}
	rk_dns_free_data(r);
    }

    return exit_code;
}