Location: PHPKode > scripts > Admidio > admidio-2.2.9/adm_program/system/login_check.php
<?php
/******************************************************************************
 * Meldet den User bei Admidio an, wenn sich dieser einloggen darf
 * Cookies setzen
 *
 * Copyright    : (c) 2004 - 2011 The Admidio Team
 * Homepage     : http://www.admidio.org
 * License      : GNU Public License 2 http://www.gnu.org/licenses/gpl-2.0.html
 *
 *****************************************************************************/

require_once('common.php');
require_once('classes/table_auto_login.php');

// Variablen initialisieren
$user_found   = 0;
$b_auto_login = false;
$loginname    = '';
$password     = '';

// Uebergabevariablen filtern
// hierbei muss beruecksichtigt werden, dass diese evtl. von dem Loginplugin
// oder vom Standarddialog kommen
if(isset($_POST['usr_login_name']) && strlen($_POST['usr_login_name']) > 0)
{
    $loginname = $_POST['usr_login_name'];
    $password  = $_POST['usr_password'];

    if($g_preferences['enable_auto_login'] == 1
    && isset($_POST['auto_login']) && $_POST['auto_login'] == 1)
    {
        $b_auto_login = true;
    }
}

if(isset($_POST['plg_usr_login_name']) && strlen($_POST['plg_usr_login_name']) > 0)
{
    $loginname = $_POST['plg_usr_login_name'];
    $password  = $_POST['plg_usr_password'];

    if($g_preferences['enable_auto_login'] == 1
    && isset($_POST['plg_auto_login']) && $_POST['plg_auto_login'] == 1)
    {
        $b_auto_login = true;
    }
}

if(strlen($loginname) == 0)
{
    $g_message->show($g_l10n->get('SYS_FIELD_EMPTY', $g_l10n->get('SYS_USERNAME')));
}

if(strlen($password) == 0)
{
    $g_message->show($g_l10n->get('SYS_FIELD_EMPTY', $g_l10n->get('SYS_PASSWORD')));
}
$password = md5($password);

// Name und Passwort pruefen
// Rolle muss mind. Mitglied sein

$sql    = 'SELECT usr_id
             FROM '. TBL_USERS. ', '. TBL_MEMBERS. ', '. TBL_ROLES. ', '. TBL_CATEGORIES. '
            WHERE usr_login_name LIKE "'. $loginname. '"
              AND usr_valid      = 1
              AND mem_usr_id     = usr_id
              AND mem_rol_id     = rol_id
              AND mem_begin     <= "'.DATE_NOW.'"
              AND mem_end        > "'.DATE_NOW.'"
              AND rol_valid      = 1 
              AND rol_cat_id     = cat_id
              AND cat_org_id     = '. $g_current_organization->getValue('org_id');
$result = $g_db->query($sql);

$user_found = $g_db->num_rows($result);
$user_row   = $g_db->fetch_array($result);

if ($user_found >= 1)
{
    // Userobjekt anlegen
    $g_current_user = new User($g_db, $user_row['usr_id']);
    
    if($g_current_user->getValue('usr_number_invalid') >= 3)
    {
        // wenn innerhalb 15 min. 3 falsche Logins stattfanden -> Konto 15 min. sperren
        if(time() - strtotime($g_current_user->getValue('usr_date_invalid', 'Y-m-d H:i:s')) < 900)
        {
            $g_current_user->clear();
            $g_message->show($g_l10n->get('SYS_LOGIN_FAILED'));
        }
    }

    if($g_current_user->getValue('usr_password') == $password)
    {
        $g_current_session->setValue('ses_usr_id', $g_current_user->getValue('usr_id'));
        $g_current_session->save();

        // Cookies fuer die Anmeldung setzen und evtl. Ports entfernen
        $domain = substr($_SERVER['HTTP_HOST'], 0, strpos($_SERVER['HTTP_HOST'], ':'));
        // soll der Besucher automatisch eingeloggt bleiben, dann verfaellt das Cookie erst nach einem Jahr
        if($b_auto_login == true)
        {
            $timestamp_expired = time() + 60*60*24*365;
            $auto_login = new TableAutoLogin($g_db, $g_session_id);
            
            // falls bereits ein Autologin existiert (Doppelanmeldung an 1 Browser), 
            // dann kein Neues anlegen, da dies zu 'Duplicate Key' fuehrt
            if(strlen($auto_login->getValue('atl_usr_id')) == 0)
            {
                $auto_login->setValue('atl_session_id', $g_session_id);
                $auto_login->setValue('atl_usr_id', $user_row['usr_id']);            
                $auto_login->save();
            }
        }
        else
        {
            $timestamp_expired = 0;
            $g_current_user->setValue('usr_last_session_id', NULL);
        }
        setcookie($cookie_praefix. '_ID', $g_session_id , $timestamp_expired, '/', $domain, 0);
        // User-Id und Autologin auch noch als Cookie speichern
        // vorher allerdings noch serialisieren, damit der Inhalt nicht so einfach ausgelesen werden kann
        setcookie($cookie_praefix. '_DATA', $b_auto_login. ';'. $g_current_user->getValue('usr_id') , $timestamp_expired, '/', $domain, 0);

        // Logins zaehlen und aktuelles Login-Datum aktualisieren
        $g_current_user->updateLoginData();

        // Parallel im Forum einloggen
        if($g_preferences['enable_forum_interface'])
        {
            $set_admin = false;
            if($g_preferences['forum_set_admin'] == 1 && $g_current_user->isWebmaster())
            {
                $set_admin = true;
            }
            $g_forum->userLogin($loginname, $password, $g_current_user->getValue('EMAIL'), $set_admin);
            $login_message = $g_forum->message;
        }
        else
        {
            // User gibt es im Forum nicht, also eine reine Admidio-Anmeldung.
            $login_message = 'SYS_LOGIN_SUCCESSFUL';
        }

        // bei einer Beta-Version noch einen Hinweis ausgeben !
        if(BETA_VERSION > 0 && $g_debug == false)
        {
            $login_message = 'SYS_BETA_VERSION';
        }

        // falls noch keine Forward-Url gesetzt wurde, dann nach dem Login auf
        // die Startseite verweisen
        if(isset($_SESSION['login_forward_url']) == false)
        {
            $_SESSION['login_forward_url'] = $g_root_path. '/'. $g_preferences['homepage_login'];
        }

        // bevor zur entsprechenden Seite weitergeleitet wird, muss noch geprueft werden,
        // ob der Browser Cookies setzen darf -> sonst kein Login moeglich
        $location = 'Location: '.$g_root_path.'/adm_program/system/cookie_check.php?message_code='.$login_message;
        header($location);
        exit();
    }
    else
    {
        // ungueltige Logins werden mitgeloggt
        
        if($g_current_user->getValue('usr_number_invalid') >= 3)
        {
            $g_current_user->setValue('usr_number_invalid', 1);
        }
        else
        {
            $g_current_user->setValue('usr_number_invalid', $g_current_user->getValue('usr_number_invalid') + 1);
        }
        $g_current_user->setValue('usr_date_invalid', DATETIME_NOW);
        $g_current_user->save(false);   // Zeitstempel nicht aktualisieren
        $g_current_user->clear();

        if($g_current_user->getValue('usr_number_invalid') >= 3)
        {
            $g_message->show($g_l10n->get('SYS_LOGIN_FAILED'));
        }
        else
        {
            $g_message->show($g_l10n->get('SYS_PASSWORD_UNKNOWN'));
        }
    }
}
else
{
    // nun noch pruefen ob Login ggf. noch nicht freigeschaltet wurde
    $sql    = 'SELECT usr_id
                 FROM '. TBL_USERS. '
                WHERE usr_login_name LIKE "'. $loginname. '"
                  AND usr_valid      = 0
                  AND usr_reg_org_shortname LIKE "'.$g_current_organization->getValue('org_shortname').'" ';
    $result = $g_db->query($sql);

    if($g_db->num_rows($result) == 1)
    {
        $g_message->show($g_l10n->get('SYS_LOGIN_NOT_ACTIVATED'));
    }
    else
    {
        $g_message->show($g_l10n->get('SYS_LOGIN_UNKNOWN'));
    }
}

?>
Return current item: Admidio