Enable complex routes for plugins (#595)

This commit is contained in:
Xavier Guimard 2016-12-17 20:19:46 +00:00
parent ec83414576
commit f1ef6e8938
3 changed files with 34 additions and 25 deletions

View File

@ -19,19 +19,19 @@ has 'defaultRoute' => ( is => 'rw', default => 'index.html' );
# Routes initialization # Routes initialization
sub addRoute { sub addRoute {
my ( $self, $word, $dest, $methods ) = (@_); my ( $self, $word, $dest, $methods, $transform ) = (@_);
$methods ||= [qw(GET POST PUT DELETE)]; $methods ||= [qw(GET POST PUT DELETE)];
foreach my $method (@$methods) { foreach my $method (@$methods) {
$self->genRoute( $self->routes->{$method}, $word, $dest ); $self->genRoute( $self->routes->{$method}, $word, $dest, $transform );
} }
return $self; return $self;
} }
sub genRoute { sub genRoute {
my ( $self, $routes, $word, $dest ) = @_; my ( $self, $routes, $word, $dest, $transform ) = @_;
if ( ref $word eq 'ARRAY' ) { if ( ref $word eq 'ARRAY' ) {
foreach my $w (@$word) { foreach my $w (@$word) {
$self->genRoute( $routes, $w, $dest ); $self->genRoute( $routes, $w, $dest, $transform );
} }
} }
else { else {
@ -42,11 +42,14 @@ sub genRoute {
} }
elsif ( $word =~ m#/# ) { elsif ( $word =~ m#/# ) {
$word =~ s#^(.*?)/##; $word =~ s#^(.*?)/##;
return $self->genRoute( $routes->{$1}, $word, $dest ); return $self->genRoute( $routes->{$1}, $word, $dest, $transform );
} }
else { else {
$dest ||= $word; $dest ||= $word;
} }
if ( $transform and ( not ref($dest) or ref($dest) eq 'CODE' ) ) {
$dest = $transform->($dest);
}
if ( my $t = ref $dest ) { if ( my $t = ref $dest ) {
if ( $t eq 'CODE' ) { if ( $t eq 'CODE' ) {
$routes->{$word} = $dest; $routes->{$word} = $dest;
@ -54,13 +57,14 @@ sub genRoute {
elsif ( $t eq 'HASH' ) { elsif ( $t eq 'HASH' ) {
$routes->{$word} ||= {}; $routes->{$word} ||= {};
foreach my $w ( keys %$dest ) { foreach my $w ( keys %$dest ) {
$self->genRoute( $routes->{$word}, $w, $dest->{$w} ); $self->genRoute( $routes->{$word}, $w, $dest->{$w},
$transform );
} }
} }
elsif ( $t eq 'ARRAY' ) { elsif ( $t eq 'ARRAY' ) {
$routes->{$word} ||= {}; $routes->{$word} ||= {};
foreach my $w ( @{$dest} ) { foreach my $w ( @{$dest} ) {
$self->genRoute( $routes->{$word}, $w ); $self->genRoute( $routes->{$word}, $w, $transform );
} }
} }
else { else {

View File

@ -34,10 +34,10 @@ sub init {
$self->type($type); $self->type($type);
if ( my $path = $self->conf->{"issuerDB${type}Path"} ) { if ( my $path = $self->conf->{"issuerDB${type}Path"} ) {
$path =~ s/^.*?(\w+).*?$/$1/; $path =~ s/^.*?(\w+).*?$/$1/;
$self->addUnauthRoute( $path => '_redirect', ['GET'] ); $self->addUnauthRoute( $path => { '*' => '_redirect' }, ['GET'] );
$self->addUnauthRoute( $path => '_pRedirect', ['POST'] ); $self->addUnauthRoute( $path => { '*' => '_pRedirect' }, ['POST'] );
$self->addAuthRoute( $path => "_forAuthUser", ['GET'] ); $self->addAuthRoute( $path => { '*' => "_forAuthUser" }, ['GET'] );
$self->addAuthRoute( $path => "_pForAuthUser", ['POST'] ); $self->addAuthRoute( $path => { '*' => "_pForAuthUser" }, ['POST'] );
} }
else { else {
$self->lmLog( "No path declared for issuer $type. Skipping", 'debug' ); $self->lmLog( "No path declared for issuer $type. Skipping", 'debug' );

View File

@ -11,27 +11,32 @@ extends 'Lemonldap::NG::Common::Module';
sub addAuthRoute { sub addAuthRoute {
my $self = shift; my $self = shift;
return $self->_addRoute('addAuthRoute',@_); return $self->_addRoute( 'addAuthRoute', @_ );
} }
sub addUnauthRoute { sub addUnauthRoute {
my $self = shift; my $self = shift;
return $self->_addRoute('addUnauthRoute',@_); return $self->_addRoute( 'addUnauthRoute', @_ );
} }
sub _addRoute { sub _addRoute {
my ( $self, $type, $word, $subName, $methods ) = @_; my ( $self, $type, $word, $subName, $methods, $transform ) = @_;
die 'Only simple route are authorizated here. Uses $self->p->addAuthRoute' $transform //= sub {
if ( ref $subName ); my ($sub) = @_;
$self->can($subName) or die "Unknown sub $subName"; if ( ref $sub ) {
$self->p->$type( return sub {
$word, shift;
sub { return $sub->( $self, @_ );
my $p = shift; }
return $self->$subName(@_); }
}, else {
$methods return sub {
); shift;
return $self->$sub(@_);
}
}
};
return $self->p->$type( $word, $subName, $methods, $transform );
} }
1; 1;