diff --git a/conf/manager.conf.in b/conf/manager.conf.in index 9c4b251845f71123ad15965ab833c1a434e9ef68..f665c521fd3fb19d2860e91a9e5ec3a2218578ec 100644 --- a/conf/manager.conf.in +++ b/conf/manager.conf.in @@ -9,7 +9,10 @@ templates_dir = @templatesdir@ # templates theme templates_theme = edugain accounts_file = /var/lib/access-check/accounts.php -federations = edugain + +[federations] +list = edugain +merge = 0 [edugain] metadata = /var/lib/access-check/edugain.xml diff --git a/lib/AccountManager/App.pm b/lib/AccountManager/App.pm index 0e5c05d106c2548db75475768dc2c5cf0ab52832..995a945c5e512aaf5c864d5853bbaa638528ae27 100644 --- a/lib/AccountManager/App.pm +++ b/lib/AccountManager/App.pm @@ -114,7 +114,7 @@ sub new { ); } - if (!$self->{configuration}->{setup}->{federations}) { + if (!$self->{configuration}->{federations}->{list}) { $self->{logger}->fatal( "No federations defined in configuration, aborting" ); @@ -250,10 +250,13 @@ sub abort { sub req_start { my ($self, %args) = @_; - my $federations = $self->{configuration}->{setup}->{federations}; + my $federations = $self->{configuration}->{federations}->{list}; my @federations = split(/, */, $federations); - if (@federations == 1) { - $self->req_select_sp(federation => $federations[0]); + if ( + @federations == 1 || + $self->{configuration}->{federations}->{merge} + ) { + $self->req_select_sp(); } else { $self->req_select_federation(); } @@ -263,7 +266,7 @@ sub req_start { sub req_select_federation { my ($self, %args) = @_; - my $federations = $self->{configuration}->{setup}->{federations}; + my $federations = $self->{configuration}->{federations}->{list}; my @federations = split(/, */, $federations); my %federations = map { $_ => $self->{configuration}->{$_}->{label} } @federations; @@ -279,27 +282,36 @@ sub req_select_federation { sub req_select_sp { my ($self, %args) = @_; - my $federation = $args{federation} || - $self->get_parameter(name => 'federation'); + my $federation = $self->{cgi}->param('federation'); # not mandatory - my $metadata_file = $self->get_metadata_file(federation => $federation); + my @federations = $federation ? + $federation : + split(/, */, $self->{configuration}->{federations}->{list}); - my $metadata; - eval { - $metadata = AccountManager::Metadata->new( - file => $metadata_file - ); - }; - $self->abort( - log => "Failed to load federation metadata: $EVAL_ERROR", - user => "internal" - ) if $EVAL_ERROR; + my @entities; + foreach $federation (@federations) { + my $file = $self->get_metadata_file(federation => $federation); + + my $metadata; + eval { + $metadata = AccountManager::Metadata->new( + file => $file + ); + }; + $self->abort( + log => "Failed to load federation metadata: $EVAL_ERROR", + user => "internal" + ) if $EVAL_ERROR; + + my $entities = $metadata->parse(type => 'sp'); + push @entities, @$entities; + } $self->respond( template => 'select_sp.tt2.html', data => { action => 'select_sp', - metadata => $metadata->parse(type => 'sp'), + entities => \@entities, federation => $federation, } ); @@ -308,10 +320,8 @@ sub req_select_sp { sub req_select_email { my ($self, %args) = @_; - my $federation = $self->get_parameter(name => 'federation'); my $entityid = $self->get_parameter(name => 'entityid'); - - my $metadata_file = $self->get_metadata_file(federation => $federation); + my $federation = $self->{cgi}->param('federation'); # not mandatory # Create a persistent service provider object my $sp = AccountManager::ServiceProvider->new( @@ -323,20 +333,29 @@ sub req_select_email { # already present in DB, nothing todo } else { # extract information from metadata - my $metadata; - - eval { - $metadata = AccountManager::Metadata->new( - file => $metadata_file - ); - }; - $self->abort( - log => "Failed to load federation metadata: $EVAL_ERROR", - user => "internal" - ) if $EVAL_ERROR; - - my $entities = $metadata->parse(id => $entityid); - my $entity = $entities->[0]; + my @federations = $federation ? + $federation : + split(/, */, $self->{configuration}->{federations}->{list}); + + my $entity; + foreach $federation (@federations) { + my $file = $self->get_metadata_file(federation => $federation); + my $metadata; + + eval { + $metadata = AccountManager::Metadata->new( + file => $file + ); + }; + $self->abort( + log => "Failed to load federation metadata: $EVAL_ERROR", + user => "internal" + ) if $EVAL_ERROR; + + my $entities = $metadata->parse(id => $entityid); + $entity = $entities->[0]; + last if $entity; + } $self->abort( log => "No such SP $entityid in metadata", user => "no_such_entity" diff --git a/templates/web/edugain/select_sp.tt2.html b/templates/web/edugain/select_sp.tt2.html index 09cc6ecd774b98dd4b99f36f3fe0b8a73fb07c6c..cdac8844da2605f9aa94ac6d2fb353c2ef325d62 100644 --- a/templates/web/edugain/select_sp.tt2.html +++ b/templates/web/edugain/select_sp.tt2.html @@ -20,7 +20,7 @@ <legend for="entityid">[% lh.maketext("Type the name or entityID of service to test:") %]</legend> <select id="entityid" name="entityid" class="required"> <option value=""></option> - [% FOREACH entity IN metadata.sort('display_name') %] + [% FOREACH entity IN entities.sort('display_name') %] <option value="[% entity.entityid %]">[% entity.display_name %]</option> [% END %] </select> diff --git a/templates/web/renater/select_sp.tt2.html b/templates/web/renater/select_sp.tt2.html index 8633dedb4af9c4a4b7eda6152402975b9a09639c..7ba07815450a2dd51d1d623588a4cdd8185d91cc 100644 --- a/templates/web/renater/select_sp.tt2.html +++ b/templates/web/renater/select_sp.tt2.html @@ -20,7 +20,7 @@ <legend for="entityid">[% lh.maketext("Type the name or entityID of service to test:") %]</legend> <select id="entityid" name="entityid" class="required"> <option value=""></option> - [% FOREACH entity IN metadata.sort('display_name') %] + [% FOREACH entity IN entities.sort('display_name') %] <option value="[% entity.entityid %]">[% entity.display_name %]</option> [% END %] </select>