@@ -314,6 +314,7 @@ class MetadataTest < Minitest::Test
314314 assert_match %r[<ds:SignatureValue>([a-zA-Z0-9/+=]+)</ds:SignatureValue>]m , xml_text
315315 assert_match %r[<ds:SignatureMethod Algorithm='http://www.w3.org/2000/09/xmldsig#rsa-sha1'/>] , xml_text
316316 assert_match %r[<ds:DigestMethod Algorithm='http://www.w3.org/2000/09/xmldsig#sha1'/>] , xml_text
317+
317318 signed_metadata = XMLSecurity ::SignedDocument . new ( xml_text )
318319 assert signed_metadata . validate_document ( ruby_saml_cert_fingerprint , false )
319320
@@ -331,9 +332,51 @@ class MetadataTest < Minitest::Test
331332 assert_match %r[<ds:SignatureMethod Algorithm='http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'/>] , xml_text
332333 assert_match %r[<ds:DigestMethod Algorithm='http://www.w3.org/2001/04/xmlenc#sha512'/>] , xml_text
333334
334- signed_metadata_2 = XMLSecurity ::SignedDocument . new ( xml_text )
335+ signed_metadata = XMLSecurity ::SignedDocument . new ( xml_text )
336+ assert signed_metadata . validate_document ( ruby_saml_cert_fingerprint , false )
337+
338+ assert validate_xml! ( xml_text , "saml-schema-metadata-2.0.xsd" )
339+ end
340+ end
341+
342+ describe "when custom metadata elements have been inserted" do
343+ let ( :xml_text ) { subclass . new . generate ( settings , false ) }
344+ let ( :subclass ) do
345+ Class . new ( OneLogin ::RubySaml ::Metadata ) do
346+ def add_extras ( root , _settings )
347+ idp = REXML ::Element . new ( "md:IDPSSODescriptor" )
348+ idp . attributes [ 'protocolSupportEnumeration' ] = 'urn:oasis:names:tc:SAML:2.0:protocol'
349+
350+ nid = REXML ::Element . new ( "md:NameIDFormat" )
351+ nid . text = 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress'
352+ idp . add_element ( nid )
353+
354+ sso = REXML ::Element . new ( "md:SingleSignOnService" )
355+ sso . attributes [ 'Binding' ] = 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST'
356+ sso . attributes [ 'Location' ] = 'https://foobar.com/sso'
357+ idp . add_element ( sso )
358+ root . insert_before ( root . children [ 0 ] , idp )
359+
360+ org = REXML ::Element . new ( "md:Organization" )
361+ org . add_element ( "md:OrganizationName" , 'xml:lang' => "en-US" ) . text = 'ACME Inc.'
362+ org . add_element ( "md:OrganizationDisplayName" , 'xml:lang' => "en-US" ) . text = 'ACME'
363+ org . add_element ( "md:OrganizationURL" , 'xml:lang' => "en-US" ) . text = 'https://www.acme.com'
364+ root . insert_after ( root . children [ 3 ] , org )
365+ end
366+ end
367+ end
368+
369+ it "inserts signature as the first child of root element" do
370+ first_child = xml_doc . root . children [ 0 ]
371+ assert_equal first_child . prefix , 'ds'
372+ assert_equal first_child . name , 'Signature'
373+
374+ assert_match %r[<ds:SignatureValue>([a-zA-Z0-9/+=]+)</ds:SignatureValue>]m , xml_text
375+ assert_match %r[<ds:SignatureMethod Algorithm='http://www.w3.org/2000/09/xmldsig#rsa-sha1'/>] , xml_text
376+ assert_match %r[<ds:DigestMethod Algorithm='http://www.w3.org/2000/09/xmldsig#sha1'/>] , xml_text
335377
336- assert signed_metadata_2 . validate_document ( ruby_saml_cert_fingerprint , false )
378+ signed_metadata = XMLSecurity ::SignedDocument . new ( xml_text )
379+ assert signed_metadata . validate_document ( ruby_saml_cert_fingerprint , false )
337380
338381 assert validate_xml! ( xml_text , "saml-schema-metadata-2.0.xsd" )
339382 end
0 commit comments