Skip to content
Snippets Groups Projects
Commit 2ab1c9d3 authored by Guillaume ROUSSE's avatar Guillaume ROUSSE
Browse files

allows to merge entities from different federations

parent 4ee9759f
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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"
......
......@@ -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>
......
......@@ -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>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment