package Apache::AuthzNIS;
use strict;
# use Apache::Constants ':common';
use Net::NIS;
$Apache::AuthzNIS::VERSION = '0.11';
############################################
# here is where we start the new code....
############################################
use mod_perl ;
# setting the constants to help identify which version of mod_perl
# is installed
use constant MP2 => ($mod_perl::VERSION >= 1.99);
# test for the version of mod_perl, and use the appropriate libraries
BEGIN {
if (MP2) {
require Apache::Const;
require Apache::Access;
require Apache::Connection;
require Apache::Log;
require Apache::RequestRec;
require Apache::RequestUtil;
Apache::Const->import(-compile => 'HTTP_UNAUTHORIZED','OK', 'HTTP_INTERNAL_SERVER_ERROR');
} else {
require Apache::Constants;
Apache::Constants->import('HTTP_UNAUTHORIZED','OK', 'HTTP_INTERNAL_SERVER_ERROR');
}
}
##################### end modperl code ######################
sub handler {
my $r = shift;
my $requires = $r->requires;
return (MP2 ? Apache::OK : Apache::Constants::OK) unless $requires;
my $name = MP2 ? $r->user : $r->connection->user;
for my $req (@$requires) {
my($require, @list) = split /\s+/, $req->{requirement};
#ok if user is one of these users
if ($require eq "user") {
return (MP2 ? Apache::OK : Apache::Constants::OK) if grep $name eq $_, @list;
}
#ok if user is simply authenticated
elsif ($require eq "valid-user") {
return MP2 ? Apache::OK : Apache::Constants::OK;
}
elsif ($require eq "group") {
my $domain = Net::NIS::yp_get_default_domain();
unless($domain) {
$r->note_basic_auth_failure;
MP2 ? $r->log_error("Apache::AuthenNIS - cannot obtain NIS domain", $r->uri) : $r->log_reason("Apache::AuthenNIS - cannot obtain NIS domain", $r->uri);
return MP2 ? Apache::HTTP_INTERNAL_SERVER_ERROR : Apache::Constants::HTTP_INTERNAL_SERVER_ERROR;
}
foreach my $thisgroup (@list) {
my ($status, $entry) = Net::NIS::yp_match($domain, "group.byname", $thisgroup);
if($status) {
my $error_msg = Net::NIS::yperr_string($status);
$r->note_basic_auth_failure;
MP2 ? $r->log_error("Apache::AuthzNIS - group: $thisgroup: yp_match status $status, $error_msg", $r->uri) : $r->log_reason("Apache::AuthzNIS - group: $thisgroup: yp_match status $status, $error_msg", $r->uri);
return MP2 ? Apache::HTTP_INTERNAL_SERVER_ERROR : Apache::Constants::HTTP_INTERNAL_SERVER_ERROR;
}
my @names = split /\,/, $entry;
$names[0] =~ s/^.*:.*:.*://;
foreach my $oneuser (@names) {
if ($oneuser eq $name) {
return MP2 ? Apache::OK : Apache::Constants::OK;
}
}
}
}
}
$r->note_basic_auth_failure;
MP2 ? $r->log_error("Apache::AuthzNIS - user $name: not authorized", $r->uri) : $r->log_reason("Apache::AuthzNIS - user $name: not authorized", $r->uri);
return MP2 ? Apache::HTTP_UNAUTHORIZED : Apache::Constants::HTTP_UNAUTHORIZED;
}
1;
__END__
=head1 NAME
Apache::AuthzNIS - mod_perl NIS Group Authorization module
=head1 SYNOPSIS
# This is the standard authentication stuff
AuthName "Foo Bar Authentication"
AuthType Basic
# The following is actually only needed when you will authenticate
# via NIS passwd as well as authorize via NIS group.
# Apache::AuthenNIS is a separate module.
PerlAuthenHandler Apache::AuthenNIS
# Standard require stuff, NIS users or groups, and
# "valid-user" all work OK
require user username1 username2 ...
require group groupname1 groupname2 ...
require valid-user
PerlAuthzHandler Apache::AuthzNIS
These directives can also be used in the directive or in
an .htaccess file.
= head1 DESCRIPTION
This perl module is designed to work with mod_perl, the Net::NIS module by
Rik Haris (B), and the Apache::AuthenNIS module
by Demetrios E. Paneras (B). It is a direct adaptation
(i.e. I modified the code) of Michael Parker's (B)
Apache::AuthenSmb module (which also included an authorization routine).
The module calls B using each of the B
elements as keys to the the B map, until a match with the
(already authenticated) B is found.
For completeness, the module also handles B and B directives.
= head2 Apache::AuthenNIS vs. Apache::AuthzNIS
I've taken "authentication" to be meaningful only in terms of a user and
password combination, not group membership. This means that you can use
Apache::AuthenNIS with the B and B
directives. In the NIS context I consider B to be an
"authorization" concern. I.e., Group authorization consists of
establishing whether the already authenticated user is a member of one of
the indicated groups in the B directive. This process may
be handled by B.
I welcome any feedback on this module, esp. code improvements, given
that it was written hastily, to say the least.
=head1 AUTHOR
Demetrios E. Paneras
Ported by Shannon Eric Peevey
=head1 COPYRIGHT
Copyright (c) 1998 Demetrios E. Paneras, MIT Media Laboratory.
This library is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
=cut