163 lines
5.2 KiB
Perl
163 lines
5.2 KiB
Perl
# ==================================================================
|
|
# Gossamer Links - enhanced directory management system
|
|
#
|
|
# Website : http://gossamer-threads.com/
|
|
# Support : http://gossamer-threads.com/scripts/support/
|
|
# CVS Info : 087,071,086,086,085
|
|
# Revision : $Id: Users.pm,v 1.5 2005/05/12 20:51:24 brewt Exp $
|
|
#
|
|
# Copyright (c) 2001 Gossamer Threads Inc. All Rights Reserved.
|
|
# Redistribution in part or in whole strictly prohibited. Please
|
|
# see LICENSE file for full details.
|
|
# ==================================================================
|
|
|
|
package Links::Table::Users;
|
|
# ==================================================================
|
|
use strict;
|
|
use GT::SQL;
|
|
use GT::SQL::Table;
|
|
use Links qw/$CFG $PLG/;
|
|
use vars qw/@ISA $ERRORS $ERROR_MESSAGE $AUTH/;
|
|
|
|
@ISA = qw/GT::SQL::Table/;
|
|
$ERROR_MESSAGE = 'GT::SQL';
|
|
|
|
$ERRORS = {
|
|
AUTHERROR => "Authentication Error: %s",
|
|
INVALIDFORMAT => "Invalid format for username: %s"
|
|
};
|
|
|
|
sub init {
|
|
# -------------------------------------------------------------------
|
|
# Load the authentication module.
|
|
#
|
|
require Links::Authenticate;
|
|
Links::Authenticate::auth('init', {});
|
|
return 1;
|
|
}
|
|
|
|
|
|
sub add {
|
|
# -------------------------------------------------------------------
|
|
my ($self, @args) = @_;
|
|
return $PLG->dispatch('add_user', sub { return $self->_plg_add(@_); }, @args );
|
|
}
|
|
|
|
sub _plg_add {
|
|
# -------------------------------------------------------------------
|
|
init();
|
|
my $self = shift;
|
|
my $p = ref $_[0] eq 'HASH' ? shift : {@_};
|
|
|
|
if (! Links::Authenticate::auth('valid_format', { Username => $p->{Username} })) {
|
|
$ERRORS->{INVALIDFORMAT} = Links::language('USER_INVALIDUSERNAME');
|
|
return $self->error('INVALIDFORMAT', 'WARN', $p->{Username});
|
|
}
|
|
|
|
my $h = Links::Authenticate::auth('add_user', { Username => $p->{Username}, Password => $p->{Password} });
|
|
unless ($h) {
|
|
$ERRORS->{AUTHERROR} = Links::language('USER_AUTHERROR');
|
|
return $self->error('AUTHERROR', 'WARN', $Links::Authenticate::error);
|
|
}
|
|
|
|
$p->{Username} = $h->{Username};
|
|
$p->{Password} = $h->{Password};
|
|
|
|
return $self->SUPER::add($p);
|
|
}
|
|
|
|
sub delete {
|
|
# -------------------------------------------------------------------
|
|
my ($self, @args) = @_;
|
|
return $PLG->dispatch('delete_user', sub { return $self->_plg_delete(@_); }, @args );
|
|
}
|
|
|
|
sub _plg_delete {
|
|
# -------------------------------------------------------------------
|
|
init();
|
|
my ($self, $cond) = @_;
|
|
if (! ref $cond) {
|
|
$cond = { Username => $cond };
|
|
}
|
|
my $count = 0;
|
|
my $link_db = $Links::DB->table('Links');
|
|
my $sth = $self->select('Username', $cond);
|
|
while (my ($user) = $sth->fetchrow_array) {
|
|
my @links = $link_db->select('ID', { LinkOwner => $user })->fetchall_list;
|
|
for my $link_id (@links) {
|
|
$link_db->delete($link_id);
|
|
}
|
|
if (Links::Authenticate::auth('del_user', { Username => $user })) {
|
|
my $ret = $self->SUPER::delete($user);
|
|
$count++ if $ret;
|
|
}
|
|
}
|
|
return $count;
|
|
}
|
|
|
|
sub modify {
|
|
# -------------------------------------------------------------------
|
|
my ($self, @args) = @_;
|
|
return $PLG->dispatch('modify_user', sub { return $self->_plg_modify(@_); }, @args );
|
|
}
|
|
|
|
sub _plg_modify {
|
|
# -------------------------------------------------------------------
|
|
init();
|
|
my $self = shift;
|
|
my $input = $self->common_param(@_) or return $self->error('BADARGS', 'FATAL', '$obj->insert(HASH or HASH_REF or CGI) only.');
|
|
my $id = $input->{Username} or return $self->error("BADARGS", "FATAL", "No primary key passed to modify!");
|
|
my $sth = $self->select('Username', 'Password', { Username => $id });
|
|
my $rec = $sth->fetchrow_hashref;
|
|
if ($rec) {
|
|
if ($input->{Password} ne $rec->{Password}) {
|
|
Links::Authenticate::auth('change_pass', { Username => $rec->{Username}, Password => $rec->{Password}, New_Password => $input->{Password} })
|
|
or return $self->error('AUTHERROR', 'WARN', $Links::Authenticate::error);
|
|
}
|
|
}
|
|
|
|
# Connect to the database if we are not already connected
|
|
$self->connect;
|
|
|
|
# Copy the data and remove anything that doesn't make sense here.
|
|
my $c = $self->{schema}->{cols};
|
|
my $set = {};
|
|
for (keys %$c) {
|
|
$set->{$_} = $input->{$_} if exists $input->{$_};
|
|
}
|
|
|
|
# Remove primary keys from update clause.
|
|
my $where;
|
|
if ($input->{orig_username}) {
|
|
$where->{Username} = $input->{orig_username};
|
|
}
|
|
else {
|
|
foreach my $key (@{$self->{schema}->{pk}}) {
|
|
$where->{$key} = delete $set->{$key} if exists $set->{$key};
|
|
}
|
|
}
|
|
return $self->error("NOPKTOMOD", "WARN") unless keys %$where == @{$self->{schema}->{pk}};
|
|
|
|
# Remove timestamps - no sense updating.
|
|
$self->_check_timestamp($where, $set) or return;
|
|
foreach my $col (keys %$c) {
|
|
delete $set->{$col} if $c->{$col}->{type} eq 'TIMESTAMP';
|
|
}
|
|
|
|
# Execute the update
|
|
$self->update($set, $where) or return;
|
|
return 1;
|
|
}
|
|
|
|
sub random_pass {
|
|
# -------------------------------------------------------------------
|
|
# Returns a random password.
|
|
#
|
|
my $self = shift;
|
|
my $pass = '';
|
|
for (1 .. 8) { $pass .= chr(65 + int rand 57); }
|
|
return $pass;
|
|
}
|
|
|
|
1;
|