You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Cris Shupp <cs...@gmail.com> on 2017/06/13 16:52:48 UTC

lost headers

Hello all...

I have a simple mod_perl program that does some custom role based
authentication before granting access to certain resources.  That part does
work, but for a new feature I need to be able to embed roles into my
headers.  Try as may, try as I might, those roles never show up...


consider a portion of my mod_perl program:

sub handler {
...
if($user) {
        my $val = rest_call($user,$context, $r->log);
        my $roles = $cache_hash{'roles'}->{$user};
        my $role_string = join(',', @$roles);
        $r->headers_out->set('prisme-roles'=> $role_string );
        #$r->headers_out->add('prisme.roles'=> $role_string );
        $r->err_headers_out->add('prisme-roles2', $role_string);
        #$|++;
        $r->rflush();# $r->rflush can't be called before the response phase
if using PerlFixupHandler Prisme::ValidateHeader
        $r->log->info("Request end on pid $$: The user for this request is
$user, the roles are $role_string, returning $val");
        return $val; #OK or FORBIDDEN
        }

With either config in http.conf:

<Location /rails_prisme/>
  SetHandler perl-script
  PerlResponseHandler Prisme::ValidateHeader
  #PerlFixupHandler Prisme::ValidateHeader
</Location>

My Ruby on Rails controller:

Re: lost headers

Posted by "André Warnier (tomcat)" <aw...@ice-sa.com>.
Hi.
To avoid another round of questions/answers, it would be better to provide some versions 
of what you are using, right away.
One quick way of doing this, is to insert here the line which appears in your Apache 
webserver main error logfile at startup.
It shows the Apache httpd version, the version of perl, and the version of mod_perl.

Secondly, in your explanation below, it is not very clear when/if your "Ruby on Rails 
controller" is even called.

You are seting this in the Apache httpd configuration :

  <Location /rails_prisme/>
     SetHandler perl-script
     PerlResponseHandler Prisme::ValidateHeader
  </Location>

That means that mod_perl (and the Prisme::ValidateHeader mod_perl module) are effectively, 
for Apache, the code which generates the HTTP response to this request.
No further "response generator" will be called for this request (such as any "Ruby on 
Rails" module which might then have seen these response headers).

(In other words : I think that your headers /are/ being set; but that there is nothing 
that runs afterward to show you that they are set.)

Configuring your module as a PerlFixupHandler (*and* dropping the "SetHandler 
perl-script") would avoid this. But in such a handler, you can only return "OK" or 
"DECLINED" (and not "FORBIDDEN"), see : 
http://perl.apache.org/docs/2.0/user/handlers/intro.html#Stacked_Handlers

Personally however, considering that this seems to be a part of an AAA phase, I would make 
adding this header as either a part of the already-existing Perl Authentication module, or 
configure your perl module as a PerlAuthenHandler.
(In that case also, you /can/ return FORBIDDEN).



On 13.06.2017 18:54, Cris Shupp wrote:
> Hello all...
>
> I have a simple mod_perl program that does some custom role based authentication before
> granting access to certain resources.  That part does work, but for a new feature I need
> to be able to embed roles into my headers.  Try as may, try as I might, those roles never
> show up...
>
>
> consider a portion of my mod_perl program:
>
> #####################
> sub handler {
> ...
> if($user) {
>          my $val = rest_call($user,$context, $r->log);
>          my $roles = $cache_hash{'roles'}->{$user};
>          my $role_string = join(',', @$roles);
>          $r->headers_out->set('prisme-roles'=> $role_string );
>          #$r->headers_out->add('prisme.roles'=> $role_string );
>          $r->err_headers_out->add('prisme-roles2', $role_string);
>          #$|++;
>          $r->rflush();# $r->rflush can't be called before the response phase if using
> PerlFixupHandler Prisme::ValidateHeader
>          $r->log->info("Request end on pid $$: The user for this request is $user, the
> roles are $role_string, returning $val");
>          return $val; #OK or FORBIDDEN
>          }
> ###################################
>
> With either config in http.conf:
> ##############################
> <Location /rails_prisme/>
>    SetHandler perl-script
>    PerlResponseHandler Prisme::ValidateHeader
>    #PerlFixupHandler Prisme::ValidateHeader
> </Location>
> ####################
>
>
> My Ruby on Rails controller:
> #######################
> def warmup
>      @headers = {}
>      @warmup_count = $PROPS['PRISME.warmup_apache'].to_i
>      request.headers.each do |elem|
>        @headers[elem.first.to_s] = elem.last.to_s
>      end
>      response.headers.each do |elem|
>        @headers[elem.first.to_s] = elem.last.to_s
> end
>      respond_to do |format|
>        format.html # list_headers.html.erb
>        format.json { render :json => params['counter'] }
>      end
>    end
> #######################
>
>
> Never sees those headers!  Help!
>
> Thanks,
>
> Cris
>
>
> On Tue, Jun 13, 2017 at 12:52 PM, Cris Shupp <cshupp@gmail.com <ma...@gmail.com>>
> wrote:
>
>     Hello all...
>
>     I have a simple mod_perl program that does some custom role based authentication
>     before granting access to certain resources.  That part does work, but for a new
>     feature I need to be able to embed roles into my headers.  Try as may, try as I might,
>     those roles never show up...
>
>
>     consider a portion of my mod_perl program:
>
>     sub handler {
>     ...
>     if($user) {
>              my $val = rest_call($user,$context, $r->log);
>              my $roles = $cache_hash{'roles'}->{$user};
>              my $role_string = join(',', @$roles);
>              $r->headers_out->set('prisme-roles'=> $role_string );
>              #$r->headers_out->add('prisme.roles'=> $role_string );
>              $r->err_headers_out->add('prisme-roles2', $role_string);
>              #$|++;
>              $r->rflush();# $r->rflush can't be called before the response phase if using
>     PerlFixupHandler Prisme::ValidateHeader
>              $r->log->info("Request end on pid $$: The user for this request is $user, the
>     roles are $role_string, returning $val");
>              return $val; #OK or FORBIDDEN
>              }
>
>     With either config in http.conf:
>
>     <Location /rails_prisme/>
>        SetHandler perl-script
>        PerlResponseHandler Prisme::ValidateHeader
>        #PerlFixupHandler Prisme::ValidateHeader
>     </Location>
>
>     My Ruby on Rails controller:
>
>
>
>


Re: lost headers

Posted by Cris Shupp <cs...@gmail.com>.
Hello all...

I have a simple mod_perl program that does some custom role based
authentication before granting access to certain resources.  That part does
work, but for a new feature I need to be able to embed roles into my
headers.  Try as may, try as I might, those roles never show up...


consider a portion of my mod_perl program:

#####################
sub handler {
...
if($user) {
        my $val = rest_call($user,$context, $r->log);
        my $roles = $cache_hash{'roles'}->{$user};
        my $role_string = join(',', @$roles);
        $r->headers_out->set('prisme-roles'=> $role_string );
        #$r->headers_out->add('prisme.roles'=> $role_string );
        $r->err_headers_out->add('prisme-roles2', $role_string);
        #$|++;
        $r->rflush();# $r->rflush can't be called before the response phase
if using PerlFixupHandler Prisme::ValidateHeader
        $r->log->info("Request end on pid $$: The user for this request is
$user, the roles are $role_string, returning $val");
        return $val; #OK or FORBIDDEN
        }
###################################

With either config in http.conf:
##############################
<Location /rails_prisme/>
  SetHandler perl-script
  PerlResponseHandler Prisme::ValidateHeader
  #PerlFixupHandler Prisme::ValidateHeader
</Location>
####################


My Ruby on Rails controller:
#######################
def warmup
    @headers = {}
    @warmup_count = $PROPS['PRISME.warmup_apache'].to_i
    request.headers.each do |elem|
      @headers[elem.first.to_s] = elem.last.to_s
    end
    response.headers.each do |elem|
      @headers[elem.first.to_s] = elem.last.to_s
end
    respond_to do |format|
      format.html # list_headers.html.erb
      format.json { render :json => params['counter'] }
    end
  end
#######################


Never sees those headers!  Help!

Thanks,

Cris


On Tue, Jun 13, 2017 at 12:52 PM, Cris Shupp <cs...@gmail.com> wrote:

> Hello all...
>
> I have a simple mod_perl program that does some custom role based
> authentication before granting access to certain resources.  That part does
> work, but for a new feature I need to be able to embed roles into my
> headers.  Try as may, try as I might, those roles never show up...
>
>
> consider a portion of my mod_perl program:
>
> sub handler {
> ...
> if($user) {
>         my $val = rest_call($user,$context, $r->log);
>         my $roles = $cache_hash{'roles'}->{$user};
>         my $role_string = join(',', @$roles);
>         $r->headers_out->set('prisme-roles'=> $role_string );
>         #$r->headers_out->add('prisme.roles'=> $role_string );
>         $r->err_headers_out->add('prisme-roles2', $role_string);
>         #$|++;
>         $r->rflush();# $r->rflush can't be called before the response
> phase if using PerlFixupHandler Prisme::ValidateHeader
>         $r->log->info("Request end on pid $$: The user for this request is
> $user, the roles are $role_string, returning $val");
>         return $val; #OK or FORBIDDEN
>         }
>
> With either config in http.conf:
>
> <Location /rails_prisme/>
>   SetHandler perl-script
>   PerlResponseHandler Prisme::ValidateHeader
>   #PerlFixupHandler Prisme::ValidateHeader
> </Location>
>
> My Ruby on Rails controller:
>
>
>
>