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

Reply via email to