svn commit: lorikeet r448 - in trunk/heimdal/lib/krb5: .

abartlet at samba.org abartlet at samba.org
Fri Sep 2 09:59:22 GMT 2005


Author: abartlet
Date: 2005-09-02 09:59:21 +0000 (Fri, 02 Sep 2005)
New Revision: 448

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=lorikeet&rev=448

Log:
More kerberos parsing code, I think I need a function to parse names
which *must* have a realm.

Add more tests.

Andrew Bartlett

Modified:
   trunk/heimdal/lib/krb5/principal.c
   trunk/heimdal/lib/krb5/test_princ.c


Changeset:
Modified: trunk/heimdal/lib/krb5/principal.c
===================================================================
--- trunk/heimdal/lib/krb5/principal.c	2005-09-01 07:02:24 UTC (rev 447)
+++ trunk/heimdal/lib/krb5/principal.c	2005-09-02 09:59:21 UTC (rev 448)
@@ -91,10 +91,16 @@
     return princ_ncomp(principal, component);
 }
 
-krb5_error_code 
+enum realm_presence {
+	MAY,
+	MUSTNOT,
+	MUST
+};
+
+static krb5_error_code 
 parse_name(krb5_context context,
 	   const char *name,
-	   krb5_boolean short_form,
+	   enum realm_presence realm_presence,
 	   krb5_principal *principal)
 {
     krb5_error_code ret;
@@ -186,7 +192,7 @@
 	*q++ = c;
     }
     if (got_realm) {
-	if (short_form) {
+	if (realm_presence == MUSTNOT) {
 	    krb5_set_error_string (context, "realm found in 'short' principal expected to be without one!");
 	    ret = KRB5_PARSE_MALFORMED;
 	    goto exit;
@@ -201,12 +207,16 @@
 	    realm[q - start] = 0;
 	}
     }else{
-	if (short_form) {
+	if (realm_presence == MAY) {
 	    ret = krb5_get_default_realm (context, &realm);
 	    if (ret)
 	        goto exit;
-	} else {
+	} else if (realm_presence == MUSTNOT) {
 	    realm = NULL;
+	} else if (realm_presence == MUST) {
+	    krb5_set_error_string (context, "realm NOT found in principal expected to be with one!");
+	    ret = KRB5_PARSE_MALFORMED;
+	    goto exit;
 	}
 
 	comp[n] = malloc(q - start + 1);
@@ -245,7 +255,7 @@
 		const char *name,
 		krb5_principal *principal)
 {
-    return parse_name(context, name, FALSE, principal);
+    return parse_name(context, name, MAY, principal);
 }
 
 krb5_error_code KRB5_LIB_FUNCTION
@@ -253,8 +263,16 @@
 			const char *name,
 			krb5_principal *principal)
 {
-    return parse_name(context, name, TRUE, principal);
+    return parse_name(context, name, MUSTNOT, principal);
 }
+
+krb5_error_code KRB5_LIB_FUNCTION
+krb5_parse_name_mustrealm(krb5_context context,
+			  const char *name,
+			  krb5_principal *principal)
+{
+    return parse_name(context, name, MUST, principal);
+}
 static const char quotable_chars[] = " \n\t\b\\/@";
 static const char replace_chars[] = " ntb\\/@";
 

Modified: trunk/heimdal/lib/krb5/test_princ.c
===================================================================
--- trunk/heimdal/lib/krb5/test_princ.c	2005-09-01 07:02:24 UTC (rev 447)
+++ trunk/heimdal/lib/krb5/test_princ.c	2005-09-02 09:59:21 UTC (rev 448)
@@ -78,7 +78,7 @@
 
     asprintf(&princ_reformed, "%s@%s", princ_short, realm);
 
-    ret = krb5_parse_name(context, princ, &p2);
+    ret = krb5_parse_name(context, princ_reformed, &p2);
     if (ret)
 	krb5_err(context, 1, ret, "krb5_parse_name");
 
@@ -99,12 +99,65 @@
     if (strcmp(princ_short, princ_unparsed)) {
 	krb5_errx(context, 1, "%s != %s", princ_short, princ_unparsed);
     }
+
     free(princ_unparsed);
 
+    ret = krb5_parse_name(context, princ_short, &p2);
+    if (ret)
+	krb5_err(context, 1, ret, "krb5_parse_name");
+
+    if (!krb5_principal_compare(context, p, p2)) {
+	krb5_errx(context, 1, "p != p2");
+    }    
+
+    ret = krb5_unparse_name(context, p, &princ_unparsed);
+    if (ret)
+	krb5_err(context, 1, ret, "krb5_parse_name");
+
+    if (strcmp(princ, princ_unparsed)) {
+	krb5_errx(context, 1, "%s != %s", princ, princ_unparsed);
+    }
+
     ret = krb5_set_default_realm(context, "SAMBA.ORG");
     if (ret)
 	krb5_err(context, 1, ret, "krb5_parse_name");
 
+    ret = krb5_parse_name(context, princ_short, &p2);
+    if (ret)
+	krb5_err(context, 1, ret, "krb5_parse_name");
+
+    if (krb5_principal_compare(context, p, p2)) {
+	krb5_errx(context, 1, "p == p2");
+    }    
+
+    ret = krb5_unparse_name(context, p2, &princ_unparsed);
+    if (ret)
+	krb5_err(context, 1, ret, "krb5_parse_name");
+
+    if (strcmp(princ, princ_unparsed) == 0) {
+	krb5_errx(context, 1, "%s == %s", princ, princ_unparsed);
+    }
+
+    krb5_free_principal(context, p2);
+
+    ret = krb5_parse_name(context, princ, &p2);
+    if (ret)
+	krb5_err(context, 1, ret, "krb5_parse_name");
+
+    if (!krb5_principal_compare(context, p, p2)) {
+	krb5_errx(context, 1, "p != p2");
+    }    
+
+    ret = krb5_unparse_name(context, p2, &princ_unparsed);
+    if (ret)
+	krb5_err(context, 1, ret, "krb5_parse_name");
+
+    if (strcmp(princ, princ_unparsed)) {
+	krb5_errx(context, 1, "%s != %s", princ, princ_unparsed);
+    }
+
+    krb5_free_principal(context, p2);
+
     ret = krb5_unparse_name_short(context, p, &princ_unparsed);
     if (ret)
 	krb5_err(context, 1, ret, "krb5_unparse_name_short");
@@ -114,6 +167,15 @@
     }
     free(princ_unparsed);
 
+    ret = krb5_unparse_name(context, p, &princ_unparsed);
+    if (ret)
+	krb5_err(context, 1, ret, "krb5_unparse_name_short");
+
+    if (strcmp(princ, princ_unparsed)) {
+	krb5_errx(context, 1, "%s != %s", princ, princ_unparsed);
+    }
+    free(princ_unparsed);
+
     ret = krb5_parse_name_norealm(context, princ, &p2);
     if (!ret)
 	krb5_err(context, 1, ret, "Should have failed to parse %s a short name", princ);
@@ -131,8 +193,29 @@
     }
     free(princ_unparsed);
 
+    ret = krb5_parse_name_mustrealm(context, princ_short, &p2);
+    if (!ret)
+	krb5_err(context, 1, ret, "Should have failed to parse %s because it lacked a realm", princ);
+
+    ret = krb5_parse_name_mustrealm(context, princ, &p2);
+    if (ret)
+	krb5_err(context, 1, ret, "krb5_parse_name");
     
+    if (!krb5_principal_compare(context, p, p2)) {
+	krb5_errx(context, 1, "p != p2");
+    }    
 
+    ret = krb5_unparse_name(context, p2, &princ_unparsed);
+    if (ret)
+	krb5_err(context, 1, ret, "krb5_unparse_name_norealm");
+
+    if (strcmp(princ, princ_unparsed)) {
+	krb5_errx(context, 1, "%s != %s", princ_short, princ_unparsed);
+    }
+    free(princ_unparsed);
+
+    
+
     krb5_free_principal(context, p);
 }
 



More information about the samba-cvs mailing list