Lemonldap-NG-Portal

 view release on metacpan or  search on metacpan

t/30-SAML-Key-Override-IDP.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 ( $client, $res );

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

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

    ok(
        $res = $client->_get(
            '/',
            query  => { idpName => $sp },
            accept => 'text/html',
        ),
        'Initiate authentication'
    );
    expectOK($res);

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

    my $sr       = expectSamlRequest($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');
    }

    $client = register( 'sp', sub { sp() } );

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

    # SP-targeted metadata contains sp-specific key
    $md = $client->_get(
        "/saml/metadata/sp",
        query => {
            idp => "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 = $client->_get(
        "/saml/metadata/sp",
        query => {
            idp => "http://auth.override-key.com/saml/metadata",
        }
    );
    expectMetadataCerts(
        $md->[2]->[0],
        [ saml_key_proxy_cert_sig(), saml_key_idp_cert_sig() ],
        [ saml_key_proxy_cert_sig(), saml_key_idp_cert_sig() ]
    );

    # Run signature tests
    runTest( "default-idp",     saml_key_sp_cert_sig(),    "rsa-sha256" );
    runTest( "override-method", saml_key_sp_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 sp {
    return LLNG::Manager::Test->new( {
            ini => {
                authentication                      => 'SAML',



( run in 1.618 second using v1.01-cache-2.11-cpan-140bd7fdf52 )