[java-identity-provider COMMIT] /trunk/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonica...

noreply at shibboleth.net noreply at shibboleth.net
Tue Nov 18 10:55:16 EST 2014


Author: scantor
Date: Tue Nov 18 10:55:16 2014
New Revision: 6931

URL: http://svn.shibboleth.net/view/java-identity-provider?rev=6931&view=rev
Log:
IDP-115 - fix test, make a little more general so it operates without a certificate

Modified:
    trunk/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java

Modified: trunk/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java
URL: http://svn.shibboleth.net/view/java-identity-provider/trunk/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java?rev=6931&r1=6930&r2=6931&view=diff
==============================================================================
--- trunk/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java (original)
+++ trunk/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java Tue Nov 18 10:55:16 2014
@@ -54,7 +54,8 @@
 /**
  * An action that operates on a {@link SubjectCanonicalizationContext} child of the current
  * {@link ProfileRequestContext}, and transforms the input {@link javax.security.auth.Subject}
- * into a principal name by searching for one and only one {@link X509Certificate} public credential.
+ * into a principal name by searching for one and only one {@link X509Certificate} public credential,
+ * or in its absence one and only one {@link X500Principal}.
  * 
  * <p>A list of OIDs is used to locate an RDN to extract from the Subject DN and use as the principal name
  * after applying the transforms from the base class.</p>
@@ -88,6 +89,9 @@
     /** The certificate to operate on. */
     @Nullable private X509Certificate certificate;
     
+    /** The subject DN to operate on. */
+    @Nullable private X500Principal x500Principal;
+    
     /** Constructor. */
     public X500SubjectCanonicalization() {
         embeddedPredicate = new ActivationCondition();
@@ -125,11 +129,25 @@
     protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext, 
             @Nonnull final SubjectCanonicalizationContext c14nContext) {
 
-        if (embeddedPredicate.apply(profileRequestContext, c14nContext, true)) {
-            certificate = c14nContext.getSubject().getPublicCredentials(X509Certificate.class).iterator().next();
+        final Set<X509Certificate> certificates =
+                c14nContext.getSubject().getPublicCredentials(X509Certificate.class);
+        if (certificates != null && certificates.size() == 1) {
+            certificate = certificates.iterator().next();
+            x500Principal = certificate.getSubjectX500Principal();
+        } else {
+            final Set<X500Principal> principals = c14nContext.getSubject().getPrincipals(X500Principal.class);
+            if (principals != null && principals.size() == 1) {
+                x500Principal = principals.iterator().next();
+            }
+        }
+        
+        if (x500Principal != null) {
             return super.doPreExecute(profileRequestContext, c14nContext);
         }
         
+        c14nContext.setException(new SubjectCanonicalizationException(
+                "Neither a single X509Certificate nor X500Principal were found"));
+        ActionSupport.buildEvent(profileRequestContext, AuthnEventIds.INVALID_SUBJECT);
         return false;
     }
     
@@ -138,7 +156,7 @@
     protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext, 
             @Nonnull final SubjectCanonicalizationContext c14nContext) {
 
-        if (!subjectAltNameTypes.isEmpty()) {
+        if (certificate != null && !subjectAltNameTypes.isEmpty()) {
             log.debug("{} Searching for subjectAltName types ({})", getLogPrefix(), subjectAltNameTypes);
             final List altnames = X509Support.getAltNames(certificate, subjectAltNameTypes.toArray(new Integer[0]));
             for (final Object altname : altnames) {
@@ -150,8 +168,6 @@
             }
             log.debug("{} No suitable subjectAltName extension");
         }
-        
-        final X500Principal x500Principal = certificate.getSubjectX500Principal();
         
         log.debug("{} Searching for RDN to extract from DN: {}", getLogPrefix(), x500Principal.getName());
         
@@ -229,30 +245,25 @@
         public boolean apply(@Nonnull final ProfileRequestContext profileRequestContext,
                 @Nonnull final SubjectCanonicalizationContext c14nContext, final boolean duringAction) {
 
-            final Set<X509Certificate> certificates;
             if (c14nContext.getSubject() != null) {
-                certificates = c14nContext.getSubject().getPublicCredentials(X509Certificate.class);
-            } else {
-                certificates = null;
+                final Set<X509Certificate> certificates =
+                        c14nContext.getSubject().getPublicCredentials(X509Certificate.class);
+                if (certificates != null && certificates.size() == 1) {
+                    return true;
+                }
+                

[... 32 lines stripped ...]


More information about the commits mailing list