From 3f8033c03add257bdbb845f1c90361d04495ab92 Mon Sep 17 00:00:00 2001 From: Ian Young Date: Mon, 22 Feb 2010 15:08:33 +0000 Subject: [PATCH] Include new version 1.2 of mdcheck that allows relative URLs to be used in checking rulesets, either for xsl:include, xsl:import or the document function. Use this to refactor the rulesets into a common framework plus smaller rulesets for specific functional areas such as individual standards. --- build.xml | 11 +- build/check.xsl | 302 +------------------------ build/check_framework.xsl | 66 ++++++ build/check_idpdisc.xsl | 42 ++++ build/check_imported.xsl | 255 +-------------------- build/check_misc.xsl | 168 ++++++++++++++ build/check_shibboleth.xsl | 140 ++++++++++++ tools/mdcheck/lib/sdss-mdcheck-1.1.jar | Bin 6533 -> 0 bytes tools/mdcheck/lib/sdss-mdcheck-1.2.jar | Bin 0 -> 6782 bytes 9 files changed, 434 insertions(+), 550 deletions(-) create mode 100644 build/check_framework.xsl create mode 100644 build/check_idpdisc.xsl create mode 100644 build/check_misc.xsl create mode 100644 build/check_shibboleth.xsl delete mode 100644 tools/mdcheck/lib/sdss-mdcheck-1.1.jar create mode 100644 tools/mdcheck/lib/sdss-mdcheck-1.2.jar diff --git a/build.xml b/build.xml index 5c7a8cb8..5090f0f5 100644 --- a/build.xml +++ b/build.xml @@ -742,8 +742,12 @@ Parameter 'i' is the file to be checked; no assumption is made about its location so this must contain a full path. - Parameter 's' is the checking stylesheet to use; assumed to be + Parameter 's' is the primary checking stylesheet to use; assumed to be present in the build.dir. + + A fixed set of additional checking stylesheets are included in every run; + the one passed as a parameter should only contain rules specific to the + calling context. --> @@ -761,6 +765,11 @@ + + + + + diff --git a/build/check.xsl b/build/check.xsl index 755d18fd..7677c190 100644 --- a/build/check.xsl +++ b/build/check.xsl @@ -23,73 +23,18 @@ xmlns="urn:oasis:names:tc:SAML:2.0:metadata"> - - + + - + - - - - - - - - - - - - - duplicate entityID: - - - - - - - - - - - - duplicate OrganisationDisplayName: - - - - - - - - - - - - - entity lacks OrganizationName - - - - - - - OrganizationURL '' does not start with acceptable prefix - - - - - - - - Shibboleth 1.x auth request needs urn:oasis:names:tc:SAML:1.1:protocol in IDPSSODescriptor/@protocolSupportEnumeration - - - - - - Shibboleth 1.x auth request needs urn:mace:shibboleth:1.0 in IDPSSODescriptor/@protocolSupportEnumeration - - - - - - - - - IdP SSO KeyDescriptor lacking @use - - - - - - IdP AA KeyDescriptor lacking @use - - - - - - - - - IdP SSO Descriptor lacking KeyDescriptor - - - - - - SP SSO Descriptor lacking KeyDescriptor - - - - - - IdP AA Descriptor lacking KeyDescriptor - - - - - - - - ds:KeyInfo child element not in ds namespace - - - - - - - - SIDPO-34: Attribute lacking NameFormat in IDPSSODescriptor - - - - - - - - entity ID contains space character - - - - - - - - entity ID does not start with acceptable prefix - - - - - - - - Location contains space character - - - - - - - - - missing Binding attribute on DiscoveryResponse - - - - - - incorrect Binding value on DiscoveryResponse - - - - - - - - Location does not start with https:// - - - - @@ -302,53 +57,4 @@ - - - - Scope lacks @regexp - - - - - - - - empty xml:lang attribute - - - - - - - - - - *** - - : - - - - - - - - - - - - - - - diff --git a/build/check_framework.xsl b/build/check_framework.xsl new file mode 100644 index 00000000..b673682d --- /dev/null +++ b/build/check_framework.xsl @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + *** + + + + + + + + + + + + : + + + + + + + + + + + + + + + + + + diff --git a/build/check_idpdisc.xsl b/build/check_idpdisc.xsl new file mode 100644 index 00000000..a42ee1d9 --- /dev/null +++ b/build/check_idpdisc.xsl @@ -0,0 +1,42 @@ + + + + + + + + + + + + + missing Binding attribute on DiscoveryResponse + + + + + + incorrect Binding value on DiscoveryResponse + + + + + diff --git a/build/check_imported.xsl b/build/check_imported.xsl index 9e18504a..6955e945 100644 --- a/build/check_imported.xsl +++ b/build/check_imported.xsl @@ -3,8 +3,7 @@ check_imported.xsl - XSL stylesheet that takes an imported metadata document destined for - the UK federation and checks it against local conventions. + Checking ruleset containing rules associated with imported metadata. Author: Ian A. Young @@ -21,258 +20,12 @@ xmlns="urn:oasis:names:tc:SAML:2.0:metadata"> - - - - - - entity lacks OrganizationName - - - + - - - OrganizationURL '' does not start with acceptable prefix - - - - - - - - Shibboleth 1.x auth request needs urn:oasis:names:tc:SAML:1.1:protocol in IDPSSODescriptor/@protocolSupportEnumeration - - - - - - Shibboleth 1.x auth request needs urn:mace:shibboleth:1.0 in IDPSSODescriptor/@protocolSupportEnumeration - - - - - - - - - IdP SSO KeyDescriptor lacking @use - - - - - - IdP AA KeyDescriptor lacking @use - - - - - - - - - IdP SSO Descriptor lacking KeyDescriptor - - - - - - SP SSO Descriptor lacking KeyDescriptor - - - - - - IdP AA Descriptor lacking KeyDescriptor - - - - - - - - ds:KeyInfo child element not in ds namespace - - - - - - - - SIDPO-34: Attribute lacking NameFormat in IDPSSODescriptor - - - - - - - - entity ID contains space character - - - - - - - - entity ID does not start with acceptable prefix - - - - - - - - Location contains space character - - - - - - - - - missing Binding attribute on DiscoveryResponse - - - - - - incorrect Binding value on DiscoveryResponse - - - - - - - - Location does not start with https:// - - - - - - - - Scope lacks @regexp - - - - - - - - empty xml:lang attribute - - - - - - - - - *** - - : - - - - - - - - - - - - - - diff --git a/build/check_misc.xsl b/build/check_misc.xsl new file mode 100644 index 00000000..42f54668 --- /dev/null +++ b/build/check_misc.xsl @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + duplicate entityID: + + + + + + + + + + + + duplicate OrganisationDisplayName: + + + + + + + + + + + + + entity lacks OrganizationName + + + + + + + + + IdP SSO Descriptor lacking KeyDescriptor + + + + + + SP SSO Descriptor lacking KeyDescriptor + + + + + + IdP AA Descriptor lacking KeyDescriptor + + + + + + + + entity ID contains space character + + + + + + + + entity ID does not start with acceptable prefix + + + + + + + + Location contains space character + + + + + + + + Location does not start with https:// + + + + + + + + empty xml:lang attribute + + + + diff --git a/build/check_shibboleth.xsl b/build/check_shibboleth.xsl new file mode 100644 index 00000000..c2e33385 --- /dev/null +++ b/build/check_shibboleth.xsl @@ -0,0 +1,140 @@ + + + + + + + + + + + + OrganizationURL '' does not start with acceptable prefix + + + + + + + + Shibboleth 1.x auth request needs urn:oasis:names:tc:SAML:1.1:protocol in IDPSSODescriptor/@protocolSupportEnumeration + + + + + + Shibboleth 1.x auth request needs urn:mace:shibboleth:1.0 in IDPSSODescriptor/@protocolSupportEnumeration + + + + + + + + + IdP SSO KeyDescriptor lacking @use + + + + + + IdP AA KeyDescriptor lacking @use + + + + + + + + ds:KeyInfo child element not in ds namespace + + + + + + + + SIDPO-34: Attribute lacking NameFormat in IDPSSODescriptor + + + + + + + + Scope lacks @regexp + + + + + diff --git a/tools/mdcheck/lib/sdss-mdcheck-1.1.jar b/tools/mdcheck/lib/sdss-mdcheck-1.1.jar deleted file mode 100644 index 470ce9c60e5f3873c1b8f43498112c0a0bc908e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6533 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 diff --git a/tools/mdcheck/lib/sdss-mdcheck-1.2.jar b/tools/mdcheck/lib/sdss-mdcheck-1.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..47001af660361c1c4f0120378ab5ae42d47575ab GIT binary patch literal 6782 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 b{vX`ewMJ7F@J9w=BVZ!{E