Platon Technologies
neprihlásený Prihlásiť Registrácia
SlovakEnglish
open source software development oslavujeme 10 rokov vývoja otvoreného softvéru! Sobota, 20. apríl 2024

Súbor: [Platon] / web-apps / call-centre-system / modules / User.pm (stiahnutie)

Revízia 1.1, Wed Mar 10 11:34:53 2004 UTC (20 years, 1 month ago) by nepto

CALL CENTRE SYSTEM added into CVS.

#
# modules/User.pm
#
# Developed by Ondrej Jombik <nepto@platon.sk>
# Copyright (c) 2004 Platon SDG, http://platon.sk/
# Licensed under terms of GNU General Public License.
# All rights reserved.
#
# Changelog:
# 17/01/2004 - created
#

# $Platon$

package User;

use strict;
use Carp;
use vars qw($VERSION @ISA @EXPORT $AUTOLOAD);

@ISA     = qw(Exporter);
@EXPORT  = qw( );
$VERSION = '0.1';

use dbh_query;
use Digest::MD5 qw(md5_hex);

sub new    # {{{
{
    my $this  = shift;
    my $class = ref($this) || $this;
    my $self  = {};
    bless $self, $class;

    $self->{'sid'} = shift;
    $self->{'uid'} = $self->getUserID();

    return $self;
}          # }}}

sub login  # {{{
{
    my $self     = shift;
    my $login    = shift;
    my $password = shift;
    $password = md5_hex($password);
    my $query = sprintf( 'SELECT uid FROM users'
          . ' WHERE login = %s AND password = %s',
        dbh_quote($login), dbh_quote($password) );
    my $new_uid = dbh_query( $query, 'SCALAR' );
    return 0 if ( !defined $new_uid || !$new_uid > 0 );
    $self->{'uid'} = $new_uid;
    $self->{'sid'} = md5_hex( $password . time() );
    $query = sprintf( 'UPDATE users SET'
          . ' session_id = %s, login_count = login_count + 1,'
          . ' last_login = SYSDATE(), last_access = SYSDATE()'
          . ' WHERE login = %s AND password = %s',
        dbh_quote( $self->{'sid'} ),
        dbh_quote($login), dbh_quote($password) );
    dbh_query( $query, 'UNDEF' );
    return 1;
}    # }}}

sub logout    # {{{
{
    my $self  = shift;
    my $query = 'UPDATE users SET'
      . ' session_id = NULL, last_logout = SYSDATE()'
      . ' WHERE uid = ' . dbh_quote( $self->{'uid'} );
    dbh_query( $query, 'UNDEF' );
    $self->{'uid'} = 0;
    $self->{'sid'} = undef;
    return 1;
}             # }}}

sub getUserID # {{{
{
    my $self = shift;
    my $sid  = shift;
    return $self->{'uid'} if ( defined $self->{'uid'} );
    $sid = $self->{'sid'} if ( !defined $sid );
    my $query = sprintf( 'SELECT uid FROM users WHERE session_id = %s',
        dbh_quote($sid) );
    my $uid = dbh_query( $query, 'SCALAR' );
    return defined $uid ? $uid : 0;    # anonymous uid is 0
}    # }}}

sub updateLastAccess    # {{{
{
    my $self = shift;
    return 1 if $self->isAnonymous();    # do not update for anonymous
    my $query = 'UPDATE users SET'
      . ' last_access = SYSDATE() WHERE uid = ' . dbh_quote( $self->{'uid'} );
    dbh_query( $query, 'UNDEF' );
    return 1;
}    # }}}

sub isAnonymous    # {{{
{
    my $self = shift;
    return $self->getUserID() == 0;
}                  # }}}

sub getAnnonymous  # {{{
{
    my $anonymous_user = {
        uid => '0',
        login => 'anonymous',
        password    => '',
        session_id  => '',
        parent_uid  => 'N/A',
        login_count => 'N/A',
        last_login  => 'N/A',
        last_logout => 'N/A',
        last_access => 'N/A'
    };
    return $anonymous_user;
}    # }}}

sub getAnnonymousLogin    # {{{
{
    return User::getAnnonymous()->{'login'};
}                         # }}}

sub exist                 # {{{
{
    my $uid   = shift;
    my $query = 'SELECT COUNT(*) FROM users WHERE uid = ' . dbh_quote($uid);
    return dbh_query( $query, 'SCALAR' ) == 1;
}                         # }}}

sub get                   # {{{
{
    my $self = shift;
    my $uid = $self =~ /^User=HASH/ ? $self->{'uid'} : $self;
    return User::getAnnonymous() if ( $uid == 0 );
    my $query = 'SELECT u.*, u0.login AS parent_login,'
      . ' u1.login AS created_by_login, u2.login AS changed_by_login FROM users u'
      . ' LEFT JOIN users u0 ON u.parent_uid = u0.uid'
      . ' LEFT JOIN users u1 ON u.created_by = u1.uid'
      . ' LEFT JOIN users u2 ON u.changed_by = u2.uid'
      . ' WHERE u.uid = ' . dbh_quote($uid);
    my $user = ( dbh_query( $query, 'HASHREF' ) )[0];
    $user->{'created_by_login'} ||= User::getAnnonymousLogin();
    $user->{'changed_by_login'} ||= User::getAnnonymousLogin();
    return $user;
}    # }}}

sub set    # {{{
{
    my $uid       = shift;
    my $data      = shift;
    my $cur_login = shift;
    my %real_data = ();
    my $key;
    my $val;
    foreach $key ( keys %$data ) {
        $val = $data->{$key};
        next if ( $key !~ /^(login|password|firstname|middlename|lastname|parent_uid|notes)$/ );
        if ( $key eq 'password' ) {    # password change
            next if not( length $val > 0 );
            $val = md5_hex($val)
        }

        # exit immidiatelly if someone is trying to insert anonymous account
        return 0 if ( $key eq 'login' && $val eq User::getAnnonymousLogin() );
        $real_data{$key} = dbh_quote($val);
    }
    if ( scalar keys %real_data ) {
        $real_data{'changed_by'}   = dbh_quote($cur_login);
        $real_data{'changed_date'} = 'SYSDATE()';
        my $query;
        if ( User::exist($uid) ) {
            my $delim = ' ';
            $query = 'UPDATE users SET';
            foreach $key ( keys %real_data ) {
                $val = $real_data{$key};
                $query .= $delim;
                $query .= $key;
                $query .= '=';
                $query .= $val;
                $delim = ',' if $delim ne ',';
            }
            $query .= ' WHERE uid = ' . dbh_quote($uid)
        } else {
            $query = sprintf( 'INSERT INTO users'
                  . '(login, password, firstname, middlename, lastname,'
                  . ' parent_uid, notes, login_count,'
                  . ' created_by, created_date, changed_by, changed_date)'
                  . ' VALUES (%s, %s, %s, %s, %s, %s, %s, 0, %s, %s, %s, %s) ',
                $real_data{'login'}, $real_data{'password'},
                $real_data{'firstname'}, $real_data{'middlename'}, $real_data{'lastname'},
                $real_data{'parent_uid'}, $real_data{'notes'},
                $real_data{'changed_by'}, $real_data{'changed_date'},
                $real_data{'changed_by'}, $real_data{'changed_date'} );
        }
        dbh_query( $query, 'UNDEF' );
    }
}    # }}}

sub delete    # {{{
{
    my $uid   = shift;
    my $query = 'DELETE FROM users WHERE uid = ' . dbh_quote($uid);
    dbh_query( $query, 'UNDEF' );
}             # }}}

sub getCount  # {{{
{
    my $query = 'SELECT COUNT(*) FROM users';
    return dbh_query( $query, 'SCALAR' );
}             # }}}

sub getAll    # {{{
{
    return User::getFilteredList( undef, undef );
}             # }}}

sub getFilteredList    # {{{
{
    my $where = User::_createWhere(shift);
    my $order = User::_createOrder(shift);
    my $query = 'SELECT u.*, u0.login AS parent_login'
      . ' FROM users u LEFT JOIN users u0 ON u.parent_uid = u0.uid';
    $query .= " WHERE $where"    if ( length $where );
    $query .= " ORDER BY $order" if ( length $order );
    my $ret = dbh_query( $query, 'HASHREF' );
    unshift @$ret, User::getAnnonymous();
    return $ret;
}                      # }}}

sub getLoginList       # {{{
{
    my $query = 'SELECT uid, login FROM users';
    my %ret = dbh_query( $query, 'HASH' );
    $ret{0} = User::getAnnonymousLogin();
    return wantarray ? %ret : \%ret;
}                      # }}}

sub _createWhere       # {{{
{
    my $filter = shift;
    my @ret_ar = ();
    my $key;
    my $val;
    foreach $key ( keys %$filter ) {
        $val = $filter->{$key};
        next if ( $key !~ /^(uid|login|firstname|middlename|lastname|parent_login|login_count)$/ );
        next if ( !length $val );
        if ( $key eq 'uid' ) {
            push @ret_ar, sprintf( 'u.%s = %d', $key, $val ) if ( $val =~ /\d+/ );
            next;
        }
        if ( $key =~ /_price$/ ) {
            push @ret_ar, sprintf( 'u.%s = %f', $key, $val ) if ( $val =~ /[\d]*\.[\d]*/ );
            next;
        }
        my $prefix;
        if ( $key =~ /parent_login$/ ) {
            $key =~ s/parent_//g;
            $prefix = 'u0.';
        } else {
            $prefix = 'u.';
        }
        push @ret_ar, sprintf( 'LOWER(%s%s) LIKE LOWER(%s)',
            $prefix, $key, dbh_quote( '%' . $val . '%' ) );
    }
    return join ( ' AND ', @ret_ar );
}    # }}}

sub _createOrder    # {{{
{
    my $key = shift;
    return '' if ( not defined $key );
    return '' if ( $key !~ /^[-]?(uid|login|firstname|middlename|lastname|parent_login|login_count)$/ );
    my $prefix;
    if ( $key =~ /parent_login$/ ) {
        $key =~ s/parent_//g;
        $prefix = 'u0.';
    } else {
        $prefix = 'u.';
    }
    return $prefix . substr( $key, 1 ) . ' DESC' if ( substr( $key, 0, 1 ) eq '-' );
    return $prefix . $key;
}    # }}}

1;

__END__

=head1 NAME

User - <<<description of module>>>

=head1 SYNOPSIS

use User;

my $xxx = new User;

=head1 DESCRIPTION

The User module allows you ...
<<<your description here>>>

=head2 EXPORT

<<here describe exported methods>>>

=head1 SEE ALSO

=head1 AUTHORS

Ondrej Jombik, <nepto@platon.sk>

=cut







# vim: ts=4
# vim600: fdm=marker fdl=0 fdc=3


Platon Group <platon@platon.sk> http://platon.sk/
Copyright © 2002-2006 Platon Group
Stránka používa redakčný systém Metafox
Na začiatok