Add krb5_parse_name flag to ignore realm
authorGreg Hudson <ghudson@mit.edu>
Thu, 10 May 2012 17:34:10 +0000 (17:34 +0000)
committerGreg Hudson <ghudson@mit.edu>
Thu, 10 May 2012 17:34:10 +0000 (17:34 +0000)
The flag KRB5_PRINCIPAL_PARSE_IGNORE_REALM causes krb5_parse_name to
return the principal with an empty realm whether or not a realm is
present in the name.

ticket: 7129

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@25862 dc483132-0cff-0310-8789-dd5450dbe970

src/include/krb5/krb5.hin
src/lib/krb5/krb/parse.c

index 284e6b327c0b53c6752fef471f73bd85ba960ac1..3208be54c49d9681bf7aa2c7a8d261f48dc0abc7 100644 (file)
@@ -3409,6 +3409,7 @@ krb5_parse_name(krb5_context context, const char *name,
 #define KRB5_PRINCIPAL_PARSE_REQUIRE_REALM 0x2 /**< Error if realm is not present */
 #define KRB5_PRINCIPAL_PARSE_ENTERPRISE    0x4 /**< Create single-component
                                                   enterprise principle */
+#define KRB5_PRINCIPAL_PARSE_IGNORE_REALM  0x8 /**< Ignore realm if present */
 
 /**
  * Convert a string principal name to a krb5_principal with flags.
@@ -3426,6 +3427,12 @@ krb5_parse_name(krb5_context context, const char *name,
  * @li #KRB5_PRINCIPAL_PARSE_REQUIRE_REALM - realm must be present in @a name
  * @li #KRB5_PRINCIPAL_PARSE_ENTERPRISE - create single-component enterprise
  *                                        principal
+ * @li #KRB5_PRINCIPAL_PARSE_IGNORE_REALM - ignore realm if present in @a name
+ *
+ * If @c KRB5_PRINCIPAL_PARSE_NO_REALM or @c KRB5_PRINCIPAL_PARSE_IGNORE_REALM
+ * is specified in @a flags, the realm of the new principal will be empty.
+ * Otherwise, the default realm for @a context will be used if @a name does not
+ * specify a realm.
  *
  * Use krb5_free_principal() to free @a principal_out when it is no longer
  * needed.
index fb28229a35e4139a1912b905d2ac4e8225a50e79..dd4f44d11eb6555cbf2d66961b51b9e8208ecda5 100644 (file)
@@ -180,6 +180,7 @@ krb5_parse_name_flags(krb5_context context, const char *name,
     krb5_boolean enterprise = (flags & KRB5_PRINCIPAL_PARSE_ENTERPRISE);
     krb5_boolean require_realm = (flags & KRB5_PRINCIPAL_PARSE_REQUIRE_REALM);
     krb5_boolean no_realm = (flags & KRB5_PRINCIPAL_PARSE_NO_REALM);
+    krb5_boolean ignore_realm = (flags & KRB5_PRINCIPAL_PARSE_IGNORE_REALM);
 
     *principal_out = NULL;
 
@@ -201,7 +202,7 @@ krb5_parse_name_flags(krb5_context context, const char *name,
                                    name);
             goto cleanup;
         }
-        if (!no_realm) {
+        if (!no_realm && !ignore_realm) {
             ret = krb5_get_default_realm(context, &default_realm);
             if (ret)
                 goto cleanup;
@@ -212,6 +213,9 @@ krb5_parse_name_flags(krb5_context context, const char *name,
         krb5_set_error_message(context, ret,
                                _("Principal %s has realm present"), name);
         goto cleanup;
+    } else if (ignore_realm) {
+        krb5_free_data_contents(context, &princ->realm);
+        princ->realm = empty_data();
     }
 
     princ->type = (enterprise) ? KRB5_NT_ENTERPRISE_PRINCIPAL :