This file is indexed.

/usr/share/perl5/HTML/Mason/ApacheUserDirHandler.pm is in libhtml-mason-perl 1:1.48-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
# -*- perl -*-

# Written by Steve Haslam.
# Updated for Apache2 by Derek W. Poon.
# All rights reserved.
# This program is free software; you can redistribute it and/or modify it
# under the same terms as Perl itself.

# HTML::Mason::ApacheUserDirHandler
#  Run as a mod_perl request handler, create
#  HTML::Mason::ApacheHandler objects on demand to handle requests,
#  keying on the username from the URI. Keep the created ApacheHandler
#  objects in a cache.

require 5;
package HTML::Mason::ApacheUserDirHandler;
use strict;
use HTML::Mason::ApacheHandler;
BEGIN {
    if (HTML::Mason::ApacheHandler::APACHE2) {
        require Apache2::Const;
        import Apache2::Const qw(DECLINED);
        require Apache2::Log;
        require Apache2::RequestUtil;
    } else {
        require Apache::Constants;
        import Apache::Constants qw(DECLINED);
        require Apache::Log;
    }
}
use vars qw(%userdir_handlers);

sub handler {
    my $r = shift;

    my $apr = HTML::Mason::ApacheHandler::APACHE2 ? $r
                                                  : Apache::Request->new($r);

    $apr->log->debug("Finding correct handler for ".$r->uri);

    if ($r->uri =~ m|^/~([a-zA-Z][a-zA-Z0-9_]*)/(.*)|) {
    my($username, $subpath) = ($1, $2);

    my $h = $userdir_handlers{$username};
    if ($h) {
        if (ref($h)) {
        $apr->log->debug("Reusing $h for user \"$username\"");
        return $h->handle_request($r);
        }
        else {
        $apr->log->debug("Skipping previously bad username \"$username\" ($h)");
        return DECLINED;
        }
    }

    $apr->log->debug("Trying to create new handler for \"$username\"");
    my ($u_name, $u_passwd, $u_uid, $u_gid, $u_quota, $u_comment, $u_gcos, $u_dir, $u_shell, $u_expire) = getpwnam($username);
    if (!$u_name) {
        $apr->log->error("User \"$username\" not found");
        $userdir_handlers{$username} = "User not found";
        return DECLINED;
    }

    if (!-d $u_dir) {
        $apr->log->error("User \"$username\" has non-existent home directory \"$u_dir\"");
        $userdir_handlers{$username} = "Home directory does not exist";
        return DECLINED;
    }

    my $comp_root = "$u_dir/public_html";
    if (!-d $comp_root) {
        $apr->log->error("User \"$username\": proposed component root $comp_root does not exist");
        $userdir_handlers{$username} = "Proposed component root does not exist";
        return DECLINED;
    }

    eval {
        my $spooldir = $r->dir_config('XMasonSpoolDir') || "/var/cache/mason";
        my $spoolname = $username; # Vet $username here if we expand the regex to match it above
        my @args_method = defined $r->dir_config('MasonArgsMethod') ?
            (args_method => $r->dir_config('MasonArgsMethod')) : ();
        $h = HTML::Mason::ApacheHandler->new(data_dir => "$spooldir/$spoolname",
                         comp_root => $comp_root,
                         apache_status_title => "HTML::Mason status (for $username)",
                         in_package => "HTML::Mason::UserDirCommands::$username",
                         @args_method);
    };
    if ($@) {
        my $err = $@;
        $apr->log->error("Failed to create Mason handler object: $err");
        $userdir_handlers{$username} = $err;
        return DECLINED;
    }

    $apr->log->debug("New handler created as $h, chaining request");
    $userdir_handlers{$username} = $h;
    return $h->handle_request($r);
    }
    else {
    $apr->log->debug("$r->uri does not look like a userdir URI, declining");
    return DECLINED;
    }
}

__END__