[mp2] php response handler clears authenticated user in mod_perl

"Peter Albrecht" <[email protected]>
Newsgroups gmane.comp.apache.mod-perl
Message-ID <[email protected]>
Hello everyone,

1. Problem Description:

  Using PHP as response handler seems to clear the authenticated user ("$r->user()") in successive mod_perl handlers.

  
*** Reproduce:

  1.1. Install attached simple Apache2 server setup (see "4. Source-snippets")
  
  1.2. PHP response handler

  1.2.1. Ensure the following lines of "/etc/apache2/vhosts/bug.conf" are commented out:

    # SetHandler modperl
    # PerlResponseHandler MyApache2::MyResponseHandler

    => PHP response handler will be in action

  1.2.2. visit http://<yourServer>/index.php with your browser
  
  1.2.3. error.log tells us:
      [Tue Jan 04 11:29:03 2011] [info] [client 90.148.54.54] Start Authentication
      [Tue Jan 04 11:29:03 2011] [info] [client 90.148.54.54] Session started for user: 'JonDoe'
      [Tue Jan 04 11:29:03 2011] [error] [client 90.148.54.54] OutputFilter: user = ""               <-- failure! Should be 'JonDoe'

  1.3. mod_perl response handler
  
  1.3.1. Enable the following lines of "/etc/apache2/vhosts/bug.conf":

    SetHandler modperl
    PerlResponseHandler MyApache2::MyResponseHandler

    => mod_perl response handler (MyResponseHandler.pm) will be in action

  1.3.2. visit http://<yourServer>/index.php with your browser
  
  1.3.3. error.log tells us:
      [Tue Jan 04 11:30:28 2011] [info] [client 90.148.54.54] Start Authentication
      [Tue Jan 04 11:30:28 2011] [info] [client 90.148.54.54] Session started for user: 'JonDoe'
      [Tue Jan 04 11:30:28 2011] [error] [client 90.148.54.54] OutputFilter: user = "JonDoe"            <-- correct behaviour!



*** Actual result:

  Both ResponseHandlers know the authenticated user (see browser output). But in case of the PHP response handler, "$r->user()" seems to be resetted for futher mod_perl handlers (like MyOutputFilter). Using a mod_perl response handler, I always get the correct authenticated user via "$r->user()" in succesive handlers.


*** Expected result:

  After PHP response handler "$r->user()" should provide the authenticated user for use in succesive mod_perl handlers like OutputFilter or LogHandler.


*** Workaround:

  In your AuthenticationHandler make a backup of the user in an user defined Apache note:
  
    $r->notes->set('myAuthenUser', $r->user()); 

  and use that one in later handlers:
  
    my $user = $r->notes->get('myAuthenUser');
  

2. Used Components and their Configuration:

*** mod_perl version 2.000004

*** using /usr/lib/perl5/vendor_perl/5.10.0/i586-linux-thread-multi/Apache2/BuildConfig.pm

*** Makefile.PL options:
  MP_APR_LIB     => aprext
  MP_APXS        => /usr/sbin/apxs2
  MP_CCOPTS      => -march=i586 -mtune=i686 -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g -fPIC -Wall -fno-strict-aliasing -DLDAP_DEPRECATED
  MP_COMPAT_1X   => 1
  MP_GENERATE_XS => 1
  MP_LIBNAME     => mod_perl
  MP_USE_DSO     => 1


*** The httpd binary was not found

  .. but "httpd2 -V" tells:
  
     Server version: Apache/2.2.10 (Linux/SUSE)
     Server built:   Feb 23 2009 21:11:31
     Server's Module Magic Number: 20051115:18
     Server loaded:  APR 1.3.3, APR-Util 1.3.4
     Compiled using: APR 1.3.3, APR-Util 1.3.4
     Architecture:   32-bit
     Server MPM:     Prefork
       threaded:     no
         forked:     yes (variable process count)
     Server compiled with....
      -D APACHE_MPM_DIR="server/mpm/prefork"
      -D APR_HAS_SENDFILE
      -D APR_HAS_MMAP
      -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
      -D APR_USE_SYSVSEM_SERIALIZE
      -D APR_USE_PTHREAD_SERIALIZE
      -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
      -D APR_HAS_OTHER_CHILD
      -D AP_HAVE_RELIABLE_PIPED_LOGS
      -D DYNAMIC_MODULE_LIMIT=128
      -D HTTPD_ROOT="/srv/www"
      -D SUEXEC_BIN="/usr/sbin/suexec2"
      -D DEFAULT_PIDLOG="/var/run/httpd2.pid"
      -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
      -D DEFAULT_LOCKFILE="/var/run/accept.lock"
      -D DEFAULT_ERRORLOG="/var/log/apache2/error_log"
      -D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
      -D SERVER_CONFIG_FILE="/etc/apache2/httpd.conf"


*** (apr|apu)-config linking info

(apr|apu)-config scripts were not found



*** /usr/bin/perl -V
Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
  Platform:
    osname=linux, osvers=2.6.27, archname=i586-linux-thread-multi
    uname='linux eisler 2.6.27 #1 smp 2009-02-09 15:38:31 +0100 i686 athlon i386 gnulinux '
    config_args='-ds -e -Dprefix=/usr -Dvendorprefix=/usr -Dinstallusrbinperl -Dusethreads -Di_db -Di_dbm -Di_ndbm -Di_gdbm -Duseshrplib=true -Doptimize=-march=i586 -mtune=i686 -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g -Wall -pipe -Accflags=-DPERL_USE_SAFE_PUTENV'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DPERL_USE_SAFE_PUTENV -DDEBUGGING -fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-march=i586 -mtune=i686 -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g -Wall -pipe',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -DPERL_USE_SAFE_PUTENV -DDEBUGGING -fno-strict-aliasing -pipe'
    ccversion='', gccversion='4.3.2 [gcc-4_3-branch revision 141291]', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =''
    libpth=/lib /usr/lib /usr/local/lib
    libs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    libc=/lib/libc-2.9.so, so=so, useshrplib=true, libperl=libperl.so
    gnulibc_version='2.9'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-rpath,/usr/lib/perl5/5.10.0/i586-linux-thread-multi/CORE'
    cccdlflags='-fPIC', lddlflags='-shared -march=i586 -mtune=i686 -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g -Wall -pipe'


Characteristics of this binary (from libperl):
  Compile-time options: DEBUGGING MULTIPLICITY PERL_DONT_CREATE_GVSV
                        PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP
                        PERL_TRACK_MEMPOOL PERL_USE_SAFE_PUTENV USE_ITHREADS
                        USE_LARGE_FILES USE_PERLIO USE_REENTRANT_API
  Built under linux
  Compiled at Feb 21 2009 07:14:55
  %ENV:
    PERL_LWP_USE_HTTP_10="1"
  @INC:
    /usr/lib/perl5/5.10.0/i586-linux-thread-multi
    /usr/lib/perl5/5.10.0
    /usr/lib/perl5/site_perl/5.10.0/i586-linux-thread-multi
    /usr/lib/perl5/site_perl/5.10.0
    /usr/lib/perl5/vendor_perl/5.10.0/i586-linux-thread-multi
    /usr/lib/perl5/vendor_perl/5.10.0
    /usr/lib/perl5/vendor_perl
    .

*** Packages of interest status:

Apache2            : -
Apache2::Request   : -
CGI                : 3.29
ExtUtils::MakeMaker: 6.42
LWP                : 5.816
mod_perl           : -
mod_perl2          : 2.000004


3. This is the core dump trace: (if you get a core dump):

  got no core dump

This report was generated by /usr/bin/mp2bug on Wed Dec 22 06:49:14 2010 GMT.

*** Other environment information (manual addition)

  Linux: SuSE Linux Enterprise Server 11, PL0

  rpm -qa | grep php:
     apache2-mod_php5-5.2.6-50.17
     php5-5.2.6-50.17
     php5-zlib-5.2.6-50.17
     php5-iconv-5.2.6-50.17
     php5-xmlreader-5.2.6-50.17
     php5-pear-log-1.9.11-24.28
     php5-mcrypt-5.2.6-50.17
     php5-tokenizer-5.2.6-50.17
     php5-mbstring-5.2.6-50.17
     php5-gd-5.2.6-50.17
     php5-odbc-5.2.6-50.17
     php5-ncurses-5.2.6-50.17
     php5-sqlite-5.2.6-50.17
     php5-curl-5.2.6-50.17
     php5-pdo-5.2.6-50.17
     php5-json-5.2.6-50.17
     php5-dom-5.2.6-50.17
     php5-mysql-5.2.6-50.17
     php5-pear-5.2.12-5.1
     php5-devel-5.2.6-50.17
     php5-openssl-5.2.6-50.17
     php5-ctype-5.2.6-50.17
     php5-ldap-5.2.6-50.17
     php5-xmlwriter-5.2.6-50.17
     php5-hash-5.2.6-50.17
     php5-APC-3.1.3-1.1

  rpm -qa | grep apache2:
     apache2-utils-2.2.10-2.18
     apache2-2.2.10-2.18
     apache2-example-pages-2.2.10-2.18
     apache2-mod_php5-5.2.6-50.17
     apache2-mod_auth_kerb-5.4-7.1
     apache2-prefork-2.2.10-2.18
     apache2-worker-2.2.10-2.18
     apache2-doc-2.2.10-2.18
     apache2-mod_python-3.3.1-147.19
     apache2-mod_jk-1.2.26-1.29
     apache2-mod_perl-2.0.4-40.19


4. Source-snippets:

*** ./htdocs/index.php
<?php
print("Hello world! From php (REMOTE_USER: \"" . $_SERVER['REMOTE_USER'] . "\")");
?>


*** ./mp2/MyApache2/MyAuthenHandler.pm
  [...]
sub handler {
        my $r = shift;
        my $logger = $r->log;

        $logger->info('Start Authentication');

        $r->ap_auth_type('Session');
        $r->user('JonDoe');

        $logger->info("Session started for user: '" . $r->user() . "'");
        return Apache2::Const::OK;
}
  [...]


*** ./mp2/MyApache2/MyResponseHandler.pm
  [...]
sub handler {
        my $r = shift;

        $r->print("Hello world! From mod_perl (Request-User: \"" . $r->user() . "\")");

        return Apache2::Const::OK;
}
  [...]


*** ./mp2/MyApache2/MyOutputFilter.pm
  [...]
use base qw(Apache2::Filter);

sub handler : FilterRequestHandler {
        my $f = shift;

        my $r = $f->r;
        my $logger = $r->log;

        $logger->error("OutputFilter: user = \"" . $r->user() . "\"");

        return Apache2::Const::DECLINED;
}
  [...]


*** /etc/apache2/vhosts/bug.conf
<VirtualHost *:80>
  [...]
  php_value include_path ".:/usr/share/php5:/usr/share/php5/PEAR"
  <Perl>
    use lib qw#/srv/www/bug/mp2#;
  </Perl>

  <Directory /srv/www/bug/htdocs>
    AddType text/html .php
    PerlAuthenHandler MyApache2::MyAuthenHandler
    PerlOutputFilterHandler MyApache2::MyOutputFilter

    Allow from all
    AuthType MyAuthType
    AuthName "Secret Area"
    require valid-user

#    SetHandler modperl
#    PerlResponseHandler MyApache2::MyResponseHandler
  </Directory>
</VirtualHost>

-- 
Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.