Support hostname:port svc princs

This commit is contained in:
Nicolas Williams
2015-03-20 17:42:59 -05:00
parent 5fffc4061f
commit a7587b08e2

View File

@@ -1718,7 +1718,10 @@ apply_name_canon_rule(krb5_context context, krb5_name_canon_rule rules,
const char *orig_hostname = NULL;
const char *new_hostname = NULL;
const char *new_realm = NULL;
const char *port = "";
const char *cp;
char *hostname_sans_port = NULL;
char *hostname_with_port = NULL;
char *tmp_hostname = NULL;
char *tmp_realm = NULL;
@@ -1733,6 +1736,18 @@ apply_name_canon_rule(krb5_context context, krb5_name_canon_rule rules,
sname = krb5_principal_get_comp_string(context, in_princ, 0);
orig_hostname = krb5_principal_get_comp_string(context, in_princ, 1);
/*
* Some apps want to use the very non-standard svc/hostname:port@REALM
* form. We do our best to support that here :(
*/
port = strchr(orig_hostname, ':');
if (port != NULL) {
hostname_sans_port = strndup(orig_hostname, port - orig_hostname);
if (hostname_sans_port == NULL)
return krb5_enomem(context);
orig_hostname = hostname_sans_port;
}
_krb5_debug(context, 5, N_("Applying a name rule (type %d) to %s", ""),
rule->type, orig_hostname);
@@ -1827,6 +1842,16 @@ apply_name_canon_rule(krb5_context context, krb5_name_canon_rule rules,
new_realm = tmp_realm;
}
/* If we stripped off a :port, add it back in */
if (port != NULL) {
if (asprintf(&hostname_with_port, "%s%s", new_hostname, port) == -1 ||
hostname_with_port == NULL) {
ret = krb5_enomem(context);
goto out;
}
new_hostname = hostname_with_port;
}
if (new_realm != NULL)
krb5_principal_set_realm(context, *out_princ, new_realm);
if (new_hostname != NULL)
@@ -1854,6 +1879,8 @@ apply_name_canon_rule(krb5_context context, krb5_name_canon_rule rules,
}
out:
free(hostname_sans_port);
free(hostname_with_port);
free(tmp_hostname);
free(tmp_realm);
krb5_free_principal(context, nss);