Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 12 additions & 15 deletions lib/saml2.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -61,30 +61,27 @@ sign_authn_request = (xml, private_key, options) ->
# Creates metadata and returns it as a string of XML. The metadata has one POST assertion endpoint.
create_metadata = (entity_id, assert_endpoint, signing_certificates, encryption_certificates) ->
signing_cert_descriptors = for signing_certificate in signing_certificates or []
{'md:KeyDescriptor': certificate_to_keyinfo('signing', signing_certificate)}
certificate_to_keyinfo('signing', signing_certificate)

encryption_cert_descriptors = for encryption_certificate in encryption_certificates or []
{'md:KeyDescriptor': certificate_to_keyinfo('encryption', encryption_certificate)}
certificate_to_keyinfo('encryption', encryption_certificate)

xmlbuilder.create
'md:EntityDescriptor':
'@xmlns:md': XMLNS.MD
'@xmlns:ds': XMLNS.DS
'@entityID': entity_id
'@validUntil': (new Date(Date.now() + 1000 * 60 * 60)).toISOString()
'md:SPSSODescriptor': []
.concat {'@protocolSupportEnumeration': 'urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol'}
.concat signing_cert_descriptors
.concat encryption_cert_descriptors
.concat [
'md:SingleLogoutService':
'@Binding': 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'
'@Location': assert_endpoint
'md:AssertionConsumerService':
'@Binding': 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST'
'@Location': assert_endpoint
'@index': '0'
]
'md:SPSSODescriptor':
'@protocolSupportEnumeration': 'urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol'
'md:KeyDescriptor': signing_cert_descriptors.concat(encryption_cert_descriptors)
'md:SingleLogoutService':
'@Binding': 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'
'@Location': assert_endpoint
'md:AssertionConsumerService':
'@Binding': 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST'
'@Location': assert_endpoint
'@index': '0'
.end()

# Creates a LogoutRequest and returns it as a string of xml.
Expand Down
7 changes: 7 additions & 0 deletions test/saml2.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,13 @@ describe 'saml2', ->
has_attribute logout_service, 'Location', 'https://sp.example.com/assert',
"Expected to find an SingleLogoutService with location 'htps://sp.example.com/assert'")

it 'contains only one SPSSODescriptor', ->
sp_sso_descriptor = entity_descriptor.getElementsByTagNameNS(
'urn:oasis:names:tc:SAML:2.0:metadata', 'SPSSODescriptor')

assert.equal(
sp_sso_descriptor.length, 1, "Expected 1 SP SSO descriptor; found #{sp_sso_descriptor.length}")

describe 'format_pem', ->
it 'formats an unformatted private key', ->
raw_private_key = (/-----BEGIN PRIVATE KEY-----([^-]*)-----END PRIVATE KEY-----/g.exec get_test_file("test.pem"))[1]
Expand Down