OTRS CVS - Manual
Prev | Chapter 25. Developer's guide - Writing OTRS Modules | Next

# Agent Auth Modules

There are several agent autentification modules (DB, LDAP and HTTPBasicAuth) which comes with OTRS. It's also possible to develop your own autentification modules.

The agent authentification modules are located under Kernel/System/Auth/*.pm. To configure it see under chapter "User" -> "User Auth Backend".

A example of a simple agent auth module, save it under Kernel/System/Auth/Simple.pm. You just need 3 functions, new(), GetOption() and Auth(). If Auth() is true, the the autentification is valid:

    # --
    # Kernel/System/Auth/Simple.pm - provides the db authentification
    # Copyright (C) 2001-2004 Martin Edenhofer martin+code at otrs.org
    # --
    # This software comes with ABSOLUTELY NO WARRANTY. For details, see
    # the enclosed file COPYING for license information (GPL). If you
    # did not receive this file, see http://www.gnu.org/licenses/gpl.txt.
    # --
    # Note:
    # available objects are: ConfigObject, LogObject and DBObject
    # --

    package Kernel::System::Auth::Simple;

    use strict;

    # --
    sub new {
        my $Type = shift;
        my %Param = @_;

        # allocate new hash for object
        my $Self = {};
        bless ($Self, $Type);

        # check needed objects
        foreach (qw(LogObject ConfigObject DBObject)) {
            $Self->{$_} = $Param{$_} || die "No $_!";
        }

        # Debug 0=off 1=on
        $Self->{Debug} = 0;

        return $Self;
    }
    # --
    sub GetOption {
        my $Self = shift;
        my %Param = @_;
        # check needed stuff
        if (!$Param{What}) {
            $Self->{LogObject}->Log(Priority => 'error', Message => "Need What!");
            return;
        }
        # module options
        my %Option = (
            PreAuth => 0,
        );
        # return option
        return $Option{$Param{What}};
    }
    # --
    sub Auth {
        my $Self = shift;
        my %Param = @_;
        # check needed stuff
        if (!$Param{User}) {
            $Self->{LogObject}->Log(Priority => 'error', Message => "Need User!");
            return;
        }
        # get params
        my $User = $Param{User} || '';
        my $Pw = $Param{Pw} || '';
        my $RemoteAddr = $ENV{REMOTE_ADDR} || 'Got no REMOTE_ADDR env!';
        my $UserID = '';
        my $GetPw = '';
        # sql query
        my $SQL = "SELECT pw, user ".
          " FROM ".
          " users ".
          " WHERE ".
          " user = '$User'";
        $Self->{DBObject}->Prepare(SQL => $SQL);
        while (my @RowTmp = $Self->{DBObject}->FetchrowArray()) {
            $GetPw = $RowTmp[0];
            $UserID = $RowTmp[1];
        }

        my $Salt = $GetPw;
        $Salt =~ s/^(..).*/$1/;
        my $CryptedPw = crypt($Pw, $Salt);

        # just a note
        if (!$Pw) {
            $Self->{LogObject}->Log(
              Priority => 'notice',
              Message => "User: $User without Pw!!! (REMOTE_ADDR: $RemoteAddr)",
            );
            return;
        }
        # login note
        elsif ((($GetPw)&&($User)&&($UserID)) && $CryptedPw eq $GetPw) {
            $Self->{LogObject}->Log(
              Priority => 'notice',
              Message => "User: $User logged in (REMOTE_ADDR: $RemoteAddr).",
            );
            return $User;
        }
        # just a note
        elsif (($UserID) && ($GetPw)) {
            $Self->{LogObject}->Log(
              Priority => 'notice',
              Message => "User: $User with wrong Pw!!! (REMOTE_ADDR: $RemoteAddr)"
            );
            return;
        }
        # just a note
        else {
            $Self->{LogObject}->Log(
              Priority => 'notice',
              Message => "User: $User doesn't exist or is invalid!!! (REMOTE_ADDR: $RemoteAddr)"
            );
            return;
        }
    }
    # --

    1;

Prev | Home | Next
Ticket Number Generator | Up | Customer Auth Modules