Add KeyAuthority extension elements.
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / metadata / provider / XMLMetadataProvider.java
index 068c90f..ed8a222 100644 (file)
@@ -315,6 +315,35 @@ public class XMLMetadataProvider implements Metadata {
         }
     }
 
+    class XMLKeyAuthority implements KeyAuthority {
+        private int depth = 1;
+        private ArrayList /* <KeyInfo> */ keys = new ArrayList();
+        
+        XMLKeyAuthority(Element e) {
+            if (e.hasAttributeNS(null,"VerifyDepth"))
+                depth = Integer.parseInt(e.getAttributeNS(null,"VerifyDepth"));
+            e = XML.getFirstChildElement(e, XML.XMLSIG_NS, "KeyInfo");
+            while (e != null) {
+                try {
+                    keys.add(new KeyInfo(e, null));
+                }
+                catch (XMLSecurityException e1) {
+                    log.error("unable to process ds:KeyInfo element: " + e1.getMessage());
+                }
+                e = XML.getNextSiblingElement(e, XML.XMLSIG_NS, "KeyInfo");
+            }
+        }
+        
+        public int getVerifyDepth() {
+            return depth;
+        }
+
+        public Iterator getKeyInfos() {
+            return keys.iterator();
+        }
+        
+    }
+        
     class XMLOrganization implements Organization {
         private Element root = null;
         private HashMap /* <String,String> */ names = new HashMap();
@@ -655,7 +684,7 @@ public class XMLMetadataProvider implements Metadata {
                     if (ext1 != null && ext1.hasChildNodes())
                         sourceId=ext1.getFirstChild().getNodeValue();
                     // Save off any domain elements for later.
-                    domains = ext.getElementsByTagNameNS(edu.internet2.middleware.shibboleth.common.XML.SHIBMETA_NS,"Domain");
+                    domains = ext.getElementsByTagNameNS(edu.internet2.middleware.shibboleth.common.XML.SHIBMETA_NS,"Scope");
                 }
                 
                 int i;
@@ -765,7 +794,7 @@ public class XMLMetadataProvider implements Metadata {
         }
     }
 
-    class AARole extends SSORole implements AttributeAuthorityDescriptor, ScopedRoleDescriptor {
+    class AARole extends Role implements AttributeAuthorityDescriptor, ScopedRoleDescriptor {
         private ArrayList /* <Scope> */ scopes = new ArrayList();
         private XMLEndpointManager query = new XMLEndpointManager();
         private XMLEndpointManager idreq = new XMLEndpointManager();
@@ -784,7 +813,7 @@ public class XMLMetadataProvider implements Metadata {
                 Element ext=XML.getFirstChildElement(e,edu.internet2.middleware.shibboleth.common.XML.SAML2META_NS,"Extensions");
                 if (ext != null) {
                     // Save off any domain elements for later.
-                    domains = ext.getElementsByTagNameNS(edu.internet2.middleware.shibboleth.common.XML.SHIBMETA_NS,"Domain");
+                    domains = ext.getElementsByTagNameNS(edu.internet2.middleware.shibboleth.common.XML.SHIBMETA_NS,"Scope");
                 }
                 
                 int i;
@@ -828,6 +857,7 @@ public class XMLMetadataProvider implements Metadata {
                 protocolEnum.add(XML.SAML11_PROTOCOL_ENUM);
                 formats.add(Constants.SHIB_NAMEID_FORMAT_URI);
                 attrprofs.add(Constants.SHIB_ATTRIBUTE_NAMESPACE_URI);
+                domains = e.getElementsByTagNameNS(edu.internet2.middleware.shibboleth.common.XML.SHIB_NS,"Domain");
                 int i;
                 NodeList nlist=e.getElementsByTagNameNS(edu.internet2.middleware.shibboleth.common.XML.SHIB_NS,"AttributeAuthority");
                 for (i=0; i<nlist.getLength(); i++) {
@@ -885,6 +915,10 @@ public class XMLMetadataProvider implements Metadata {
         public Iterator getAttributes() {
             return attrs.iterator();
         }
+
+        public Iterator getNameIDFormats() {
+            return formats.iterator();
+        }
     }
     
     class SPRole extends SSORole implements SPSSODescriptor {
@@ -894,7 +928,6 @@ public class XMLMetadataProvider implements Metadata {
         
         public SPRole(XMLEntityDescriptor provider, long validUntil, Element e) throws MetadataException {
             super(provider, validUntil, e);
-            // TODO Auto-generated constructor stub
 
             // Check the root element namespace. If SAML2, assume it's the std schema.
             if (edu.internet2.middleware.shibboleth.common.XML.SAML2META_NS.equals(e.getNamespaceURI())) {
@@ -986,7 +1019,7 @@ public class XMLMetadataProvider implements Metadata {
         }
     }
     
-    class XMLEntityDescriptor implements EntityDescriptor {
+    class XMLEntityDescriptor implements ExtendedEntityDescriptor {
         private Element root = null;
         private EntitiesDescriptor parent = null;
         private String id = null;
@@ -996,7 +1029,8 @@ public class XMLMetadataProvider implements Metadata {
         private ArrayList /* <RoleDescriptor> */ roles = new ArrayList();
         private AffiliationDescriptor affiliation = null;
         private HashMap /* <String,String> */ locs = new HashMap();
-        private long validUntil = 0;
+        private long validUntil = Long.MAX_VALUE;
+        private ArrayList /* <KeyAuthority> */ keyauths = new ArrayList();
         
         public XMLEntityDescriptor(Element e, XMLMetadataProvider wrapper, long validUntil, EntitiesDescriptor parent) throws SAMLException {
             root = e;
@@ -1027,7 +1061,14 @@ public class XMLMetadataProvider implements Metadata {
                 Element child=XML.getFirstChildElement(e);
                 while (child != null) {
                     // Process the various kinds of children that we care about...
-                    if (XML.isElementNamed(child,edu.internet2.middleware.shibboleth.common.XML.SAML2META_NS,"ContactPerson")) {
+                    if (XML.isElementNamed(child,edu.internet2.middleware.shibboleth.common.XML.SAML2META_NS,"Extensions")) {
+                        Element ext = XML.getFirstChildElement(child,edu.internet2.middleware.shibboleth.common.XML.SHIBMETA_NS,"KeyAuthority");
+                        while (ext != null) {
+                            keyauths.add(new XMLKeyAuthority(ext));
+                            ext = XML.getNextSiblingElement(ext,edu.internet2.middleware.shibboleth.common.XML.SHIBMETA_NS,"KeyAuthority");
+                        }
+                    }
+                    else if (XML.isElementNamed(child,edu.internet2.middleware.shibboleth.common.XML.SAML2META_NS,"ContactPerson")) {
                         contacts.add(new XMLContactPerson(child));
                     }
                     else if (XML.isElementNamed(child,edu.internet2.middleware.shibboleth.common.XML.SAML2META_NS,"Organization")) {
@@ -1224,15 +1265,20 @@ public class XMLMetadataProvider implements Metadata {
         public URL getErrorURL() {
             return errorURL;
         }
+
+        public Iterator getKeyAuthorities() {
+            return keyauths.iterator();
+        }
     }
     
-    class XMLEntitiesDescriptor implements EntitiesDescriptor {
+    class XMLEntitiesDescriptor implements ExtendedEntitiesDescriptor {
         private Element root = null;
         private EntitiesDescriptor parent = null;
         private String name = null;
         private ArrayList /* <EntitiesDescriptor> */ groups = new ArrayList();
         private ArrayList /* <EntityDescriptor> */ providers = new ArrayList();
         private long validUntil = Long.MAX_VALUE;
+        private ArrayList /* <KeyAuthority> */ keyauths = new ArrayList();
         
         public XMLEntitiesDescriptor(Element e, XMLMetadataProvider wrapper, long validUntil, EntitiesDescriptor parent) throws SAMLException {
             root = e;
@@ -1262,7 +1308,14 @@ public class XMLMetadataProvider implements Metadata {
 
                 e = XML.getFirstChildElement(e);
                 while (e != null) {
-                    if (XML.isElementNamed(e,edu.internet2.middleware.shibboleth.common.XML.SAML2META_NS,"EntitiesDescriptor"))
+                    if (XML.isElementNamed(e,edu.internet2.middleware.shibboleth.common.XML.SAML2META_NS,"Extensions")) {
+                        Element ext = XML.getFirstChildElement(e,edu.internet2.middleware.shibboleth.common.XML.SHIBMETA_NS,"KeyAuthority");
+                        while (ext != null) {
+                            keyauths.add(new XMLKeyAuthority(ext));
+                            ext = XML.getNextSiblingElement(ext,edu.internet2.middleware.shibboleth.common.XML.SHIBMETA_NS,"KeyAuthority");
+                        }
+                    }
+                    else if (XML.isElementNamed(e,edu.internet2.middleware.shibboleth.common.XML.SAML2META_NS,"EntitiesDescriptor"))
                         groups.add(new XMLEntitiesDescriptor(e, wrapper, this.validUntil, this));
                     else if (XML.isElementNamed(e,edu.internet2.middleware.shibboleth.common.XML.SAML2META_NS,"EntityDescriptor"))
                         providers.add(new XMLEntityDescriptor(e, wrapper, this.validUntil, this));
@@ -1306,5 +1359,9 @@ public class XMLMetadataProvider implements Metadata {
         public Element getElement() {
             return root;
         }
+
+        public Iterator getKeyAuthorities() {
+            return keyauths.iterator();
+        }
     }
 }