Support hostname:port svc princs
This commit is contained in:
		| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Nicolas Williams
					Nicolas Williams