r9931: Make use of new 'norealm' parsing functions rather than strchr(p '@').
authorAndrew Bartlett <abartlet@samba.org>
Thu, 1 Sep 2005 23:31:51 +0000 (23:31 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:36:23 +0000 (13:36 -0500)
Merge these norealm functions from lorikeet-heimdal.

Andrew Bartlett

source/heimdal/lib/krb5/krb5-protos.h
source/heimdal/lib/krb5/principal.c
source/kdc/hdb-ldb.c

index 71d42b43b8db65617aa4df8ecf50ebaa3274846b..cc619314a3f8af9c1f11979b06fa7b60f7a76526 100644 (file)
@@ -2377,6 +2377,12 @@ krb5_parse_name (
        const char */*name*/,
        krb5_principal */*principal*/);
 
+krb5_error_code KRB5_LIB_FUNCTION
+krb5_parse_name_norealm (
+       krb5_context /*context*/,
+       const char */*name*/,
+       krb5_principal */*principal*/);
+
 const char* KRB5_LIB_FUNCTION
 krb5_passwd_result_to_string (
        krb5_context /*context*/,
@@ -3430,6 +3436,13 @@ krb5_write_safe_message (
 krb5_error_code KRB5_LIB_FUNCTION
 krb5_xfree (void */*ptr*/);
 
+krb5_error_code
+parse_name (
+       krb5_context /*context*/,
+       const char */*name*/,
+       krb5_boolean /*short_form*/,
+       krb5_principal */*principal*/);
+
 #ifdef __cplusplus
 }
 #endif
index 74db080ab7c4b12e116f049b1caeba4cbad59f21..8540636403ff10ef1400e7187beef2a384d8deb8 100644 (file)
@@ -91,10 +91,11 @@ krb5_principal_get_comp_string(krb5_context context,
     return princ_ncomp(principal, component);
 }
 
-krb5_error_code KRB5_LIB_FUNCTION
-krb5_parse_name(krb5_context context,
-               const char *name,
-               krb5_principal *principal)
+krb5_error_code 
+parse_name(krb5_context context,
+          const char *name,
+          krb5_boolean short_form,
+          krb5_principal *principal)
 {
     krb5_error_code ret;
     heim_general_string *comp;
@@ -184,19 +185,29 @@ krb5_parse_name(krb5_context context,
        }
        *q++ = c;
     }
-    if(got_realm){
-       realm = malloc(q - start + 1);
-       if (realm == NULL) {
-           krb5_set_error_string (context, "malloc: out of memory");
-           ret = ENOMEM;
+    if (got_realm) {
+       if (short_form) {
+           krb5_set_error_string (context, "realm found in 'short' principal expected to be without one!");
+           ret = KRB5_PARSE_MALFORMED;
            goto exit;
+       } else {
+           realm = malloc(q - start + 1);
+           if (realm == NULL) {
+               krb5_set_error_string (context, "malloc: out of memory");
+               ret = ENOMEM;
+               goto exit;
+           }
+           memcpy(realm, start, q - start);
+           realm[q - start] = 0;
        }
-       memcpy(realm, start, q - start);
-       realm[q - start] = 0;
     }else{
-       ret = krb5_get_default_realm (context, &realm);
-       if (ret)
-           goto exit;
+       if (short_form) {
+           ret = krb5_get_default_realm (context, &realm);
+           if (ret)
+               goto exit;
+       } else {
+           realm = NULL;
+       }
 
        comp[n] = malloc(q - start + 1);
        if (comp[n] == NULL) {
@@ -229,6 +240,21 @@ exit:
     return ret;
 }
 
+krb5_error_code KRB5_LIB_FUNCTION
+krb5_parse_name(krb5_context context,
+               const char *name,
+               krb5_principal *principal)
+{
+    return parse_name(context, name, FALSE, principal);
+}
+
+krb5_error_code KRB5_LIB_FUNCTION
+krb5_parse_name_norealm(krb5_context context,
+                       const char *name,
+                       krb5_principal *principal)
+{
+    return parse_name(context, name, TRUE, principal);
+}
 static const char quotable_chars[] = " \n\t\b\\/@";
 static const char replace_chars[] = " ntb\\/@";
 
@@ -323,12 +349,17 @@ unparse_name(krb5_context context,
     int i;
     krb5_error_code ret;
     /* count length */
-    plen = strlen(princ_realm(principal));
-    if(strcspn(princ_realm(principal), quotable_chars) == plen)
-       len += plen;
-    else
-       len += 2*plen;
-    len++;
+    if (!short_flag) {
+       plen = strlen(princ_realm(principal));
+       if(strcspn(princ_realm(principal), quotable_chars) == plen)
+           len += plen;
+       else
+           len += 2*plen;
+       len++;
+    } else {
+       len = 0;
+    }
+
     for(i = 0; i < princ_num_comp(principal); i++){
        plen = strlen(princ_ncomp(principal, i));
        if(strcspn(princ_ncomp(principal, i), quotable_chars) == plen)
index ccdd64f40b248c68e1bdc9f6580eacbf08d4a90b..ecdda16150c60b3d12d04de18dc5813fb509df02 100644 (file)
@@ -454,11 +454,11 @@ static krb5_error_code LDB_lookup_principal(krb5_context context, struct ldb_con
        int count;
        char *filter = NULL;
        const char * const *princ_attrs = krb5_attrs;
-       char *p;
 
        char *princ_str;
        char *princ_str_talloc;
        char *short_princ;
+       char *short_princ_talloc;
 
        char *realm_dn_str;
 
@@ -481,20 +481,24 @@ static krb5_error_code LDB_lookup_principal(krb5_context context, struct ldb_con
                return ret;
        }
 
+       ret = krb5_unparse_name_norealm(context, &princ, &short_princ);
+
+       if (ret != 0) {
+               free(princ_str);
+               krb5_set_error_string(context, "LDB_lookup_principal: could not parse principal");
+               krb5_warnx(context, "LDB_lookup_principal: could not parse principal");
+               return ret;
+       }
+
        princ_str_talloc = talloc_strdup(mem_ctx, princ_str);
-       short_princ = talloc_strdup(mem_ctx, princ_str);
+       short_princ_talloc = talloc_strdup(mem_ctx, short_princ);
        free(princ_str);
+       free(short_princ);
        if (!short_princ || !princ_str_talloc) {
                krb5_set_error_string(context, "LDB_lookup_principal: talloc_strdup() failed!");
                return ENOMEM;
        }
 
-       p = strchr(short_princ, '@');
-       if (p) {
-               p[0] = '\0';
-       }
-
-       
        switch (ent_type) {
        case HDB_LDB_ENT_TYPE_KRBTGT:
                filter = talloc_asprintf(mem_ctx, "(&(objectClass=user)(samAccountName=%s))", 
@@ -502,15 +506,15 @@ static krb5_error_code LDB_lookup_principal(krb5_context context, struct ldb_con
                break;
        case HDB_LDB_ENT_TYPE_CLIENT:
                filter = talloc_asprintf(mem_ctx, "(&(objectClass=user)(|(samAccountName=%s)(userPrincipalName=%s)))", 
-                                        short_princ, princ_str_talloc);
+                                        short_princ_talloc, princ_str_talloc);
                break;
        case HDB_LDB_ENT_TYPE_SERVER:
                filter = talloc_asprintf(mem_ctx, "(&(objectClass=user)(|(samAccountName=%s)(servicePrincipalName=%s)))", 
-                                        short_princ, short_princ);
+                                        short_princ_talloc, short_princ_talloc);
                break;
        case HDB_LDB_ENT_TYPE_ANY:
                filter = talloc_asprintf(mem_ctx, "(&(objectClass=user)(|(|(samAccountName=%s)(servicePrincipalName=%s))(userPrincipalName=%s)))", 
-                                        short_princ, short_princ, princ_str_talloc);
+                                        short_princ_talloc, short_princ_talloc, princ_str_talloc);
                break;
        }