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