The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- perl -*-

#
# $Id: NISUser.pm,v 1.4 2003/12/16 15:21:23 eserte Exp $
# Author: Slaven Rezic
#
# Copyright (C) 2001 Online Office Berlin. All rights reserved.
# Copyright (C) 2002 Slaven Rezic.
# This is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License, see the file COPYING.

#
# Mail: slaven@rezic.de
# WWW:  http://we-framework.sourceforge.net
#

package WE::DB::NISUser;

use strict;
use vars qw($VERSION);
$VERSION = sprintf("%d.%02d", q$Revision: 1.4 $ =~ /(\d+)\.(\d+)/);

use Net::NIS;

sub new {
    my($class, $root, %args) = @_;
    my $self = {};
    bless $self, $class;
    $self->{Domain} = scalar Net::NIS::yp_get_default_domain();
    $self;
}

sub identify {
    my($self, $user, $password) = @_;
    my $ret = 0;
    my($status, $entry) = Net::NIS::yp_match($self->{Domain}, "passwd.byname", $user);
    return 0 if $status;
    my $hash = (split /:/, $entry)[1];
    crypt($password, $hash) eq $hash ? 1 : 0;
}

sub get_fullname {
    my($self, $user) = @_;
    my($status, $entry) = Net::NIS::yp_match($self->{Domain},"passwd.byname", $user);
    return 0 if $status;
    (split /:/, $entry)[4];
}

sub user_exists {
    my($self, $user) = @_;
    my($status, $entry) = Net::NIS::yp_match($self->{Domain},"passwd.byname", $user);
    $status ? 0 : 1;
}

sub add_user {
    my($self, $user, $password, $fullname) = @_;
    die "Not implemented with " . __PACKAGE__;
}

sub update_user {
    my($self, $user, $password, $fullname,$groups) = @_;
    die "Not implemented with " . __PACKAGE__;
}

sub delete_user {
    my($self, $user) = @_;
    die "Not implemented with " . __PACKAGE__;
}

sub is_in_group {
    my($self, $user, $group) = @_;
    my($status, $entry) = Net::NIS::yp_match($self->{Domain},"group.byname", $group);
    return 0 if $status;
    scalar grep { $user eq $_ } split(/,/, (split(/:/, $entry))[3]);
}

sub get_groups {
    my($self, $user) = @_;
    my($status, $values) = Net::NIS::yp_all($self->{Domain},"group.byname");
    return () if !$values;
    my @groups;
    while(my($group, $entry) = each %$values) {
	my $users = (split(/:/, $entry))[3];
	if (defined $users) {
	    if (grep { $user eq $_ } split(/,/, $users)) {
		push @groups, $group;
	    }
	}
    }
    @groups;
}

sub get_user {
    my($self, $user) = @_;
    my($status, $entry) = Net::NIS::yp_match($self->{Domain},"passwd.byname", $user);
    if ($status == 0) {
	my @things = split /:/, $entry;
	my @groups = $self->get_groups($user);
	return {'groups' => \@groups,
		'username' => $user,
		'password' => $things[1],
		'fullname' => $things[4],
	       };
    }
    0;
}

sub add_group {
    my($self, $user, $group) = @_;
    die "Not implemented with " . __PACKAGE__;
}

sub delete_group {
    my($self, $user, $delgroup) = @_;
    die "Not implemented with " . __PACKAGE__;
}

sub get_users_of_group {
    my($self, $group) = @_;
    my @users;
    foreach my $usr (keys %{$self->{DB}}) {
	if ( $self->is_in_group($usr,$group) ) { push(@users,$usr); }
    }
    return @users;
}

sub get_all_users {
    my($self) = @_;
    my($status, $values) = Net::NIS::yp_all($self->{Domain},"passwd.byname");
    keys %$values;
}

sub get_all_groups {
    my($self) = @_;
    my($status, $values) = Net::NIS::yp_all($self->{Domain},"group.byname");
    keys %$values;
}

1;

__END__

=head1 NAME

WE::DB::NISUser - Webeditor interface to NIS user databases.

=head1 SYNOPSIS

    my $u = WE::DB::NISUser->new(undef);

=head1 DESCRIPTION

See L<WE::DB::User> for a list of methods.

=head1 AUTHOR

Slaven Rezic - slaven@rezic.de

=head1 SEE ALSO

L<WE::DB::User>, L<WE::DB>

=cut