Lemonldap-NG-Portal

 view release on metacpan or  search on metacpan

t/30-SAML-Key-Override-SP.t  view on Meta::CPAN

use warnings;
use Test::More;
use strict;
no strict "subs";
use IO::String;
use LWP::UserAgent;
use LWP::Protocol::PSGI;
use MIME::Base64;

BEGIN {
    require 't/test-lib.pm';
    require 't/saml-lib.pm';
}

my $debug = 'error';
my ( $issuer, $res );

# Redefine LWP methods for tests
LWP::Protocol::PSGI->register( denyLwpRequests() );

sub runTest {
    my ( $sp, $expected_cert, $expected_alg ) = @_;

    my $id = $issuer->login("french");

    # Initialization
    my $request = getAuthnRequest($sp);

    # Push SAML request to IdP
    ok(
        $res = $issuer->_post(
            '/saml/singleSignOn',
            { SAMLRequest => $request },
            accept => 'text/html',
            cookie => "lemonldap=$id",
        ),
        'Post SAML request to IdP'
    );
    expectOK($res);

    my ( $host, $url, $s ) =
      expectAutoPost( $res, "auth.$sp.com", '/saml/proxySingleSignOnPost',
        'SAMLResponse' );

    my $sr       = expectSamlResponse($s);
    my $sig_cert = getXPath( $sr, '//sig:X509Certificate/text()' )->pop->data;
    is(
        normalizeX509Data($sig_cert),
        normalizeX509Data($expected_cert),
        "Expected key was used"
    );

    expectXPath(
        $sr,
        '//sig:SignatureMethod/@Algorithm',
        "http://www.w3.org/2001/04/xmldsig-more#$expected_alg",
        "Expected alg $expected_alg was used"
    );
}

SKIP: {
    eval "use Lasso";
    if ($@) {
        skip('Lasso not found');
    }

    $issuer = register( 'issuer', sub { issuer() } );

    # Default metadata contains default keys
    my $md = $issuer->_get("/saml/metadata/idp");
    expectMetadataCerts(
        $md->[2]->[0],
        [ saml_key_idp_cert_sig() ],
        [ saml_key_idp_cert_sig() ]
    );

    # SP-targeted metadata contains sp-specific key
    $md = $issuer->_get(
        "/saml/metadata/idp",
        query => {
            sp => "http://auth.override-both.com/saml/metadata",
        }
    );
    expectMetadataCerts(
        $md->[2]->[0],
        [ saml_key_proxy_cert_sig() ],
        [ saml_key_proxy_cert_sig() ]
    );

    # Extra keys can be specified
    $md = $issuer->_get(
        "/saml/metadata/idp",
        query => {
            sp => "http://auth.override-key.com/saml/metadata",
        }
    );
    expectMetadataCerts(
        $md->[2]->[0],
        [ saml_key_proxy_cert_sig(), saml_key_sp_cert_sig() ],
        [ saml_key_proxy_cert_sig(), saml_key_sp_cert_sig() ]
    );

    # Run signature tests
    runTest( "default-sp",      saml_key_idp_cert_sig(),   "rsa-sha256" );
    runTest( "override-method", saml_key_idp_cert_sig(),   "rsa-sha384" );
    runTest( "override-key",    saml_key_proxy_cert_sig(), "rsa-sha256" );
    runTest( "override-both",   saml_key_proxy_cert_sig(), "rsa-sha384" );

}
clean_sessions();
done_testing();

sub getAuthnRequest {
    my ($sp) = @_;
    my $server =
      Lasso::Server::new_from_buffers( samlSPMetaDataXML( $sp, "HTTP-POST" ),



( run in 0.420 second using v1.01-cache-2.11-cpan-5511b514fd6 )