Beispiel #1
0
function logout($o_id, $u_id, $info = "")
{
    // Logout aus dem Gesamtsystem
    global $dbase, $u_farbe, $conn, $communityfeatures, $logout_logging;
    if ($logout_logging) {
        logout_debug($o_id, $info);
    }
    // Tabellen online+user exklusiv locken
    $query = "LOCK TABLES online WRITE, user WRITE";
    $result = mysql_query($query, $conn);
    $o_id = mysql_real_escape_string($o_id);
    // sec
    // Aktuelle Punkte auf Punkte in Usertabelle addieren
    $result = @mysql_query("select o_punkte,o_name,o_knebel, UNIX_TIMESTAMP(o_knebel)-UNIX_TIMESTAMP(NOW()) as knebelrest FROM online WHERE o_id={$o_id}", $conn);
    if ($result && mysql_num_rows($result) == 1) {
        $row = mysql_fetch_object($result);
        $u_name = $row->o_name;
        if ($row->knebelrest > 0) {
            $knebelzeit = $row->o_knebel;
        } else {
            $knebelzeit = NULL;
        }
        $query = "update user set " . "u_punkte_monat=u_punkte_monat+{$row->o_punkte}, " . "u_punkte_jahr=u_punkte_jahr+{$row->o_punkte}, " . "u_punkte_gesamt=u_punkte_gesamt+{$row->o_punkte}, " . "u_knebel='{$knebelzeit}' " . "where u_id={$u_id}";
        $result2 = mysql_query($query, $conn);
    }
    @mysql_free_result($result);
    // User löschen
    $result2 = mysql_query("DELETE FROM online WHERE o_id={$o_id} OR o_user={$u_id}", $conn);
    // Lock freigeben
    $query = "UNLOCK TABLES";
    $result = mysql_query($query, $conn);
    // Punkterepair
    $repair1 = "UPDATE user SET u_punkte_jahr = 0, u_punkte_monat = 0, u_punkte_datum_jahr = YEAR(NOW()), u_punkte_datum_monat = MONTH(NOW()), u_login=u_login WHERE u_punkte_datum_jahr != YEAR(NOW()) AND u_id={$u_id}";
    mysql_query($repair1);
    $repair2 = "UPDATE user SET u_punkte_monat = 0, u_punkte_datum_monat = MONTH(NOW()), u_login=u_login WHERE u_punkte_datum_monat != MONTH(NOW()) AND u_id={$u_id}";
    mysql_query($repair2);
    // Nachrichten an Freunde verschicken
    if ($communityfeatures) {
        $query = "SELECT f_id,f_text,f_userid,f_freundid,f_zeit FROM freunde WHERE f_userid={$u_id} AND f_status = 'bestaetigt' " . "UNION " . "SELECT f_id,f_text,f_userid,f_freundid,f_zeit FROM freunde WHERE f_freundid={$u_id} AND f_status = 'bestaetigt' " . "ORDER BY f_zeit desc ";
        $result = mysql_query($query, $conn);
        if ($result && mysql_num_rows($result) > 0) {
            while ($row = mysql_fetch_object($result)) {
                unset($f);
                $f['aktion'] = "Logout";
                $f['f_text'] = $row->f_text;
                if ($row->f_userid == $u_id) {
                    if (ist_online($row->f_freundid)) {
                        $wann = "Sofort/Online";
                        $an_u_id = $row->f_freundid;
                    } else {
                        $wann = "Sofort/Offline";
                        $an_u_id = $row->f_freundid;
                    }
                } else {
                    if (ist_online($row->f_userid)) {
                        $wann = "Sofort/Online";
                        $an_u_id = $row->f_userid;
                    } else {
                        $wann = "Sofort/Offline";
                        $an_u_id = $row->f_userid;
                    }
                }
                // Aktion ausführen
                aktion($wann, $an_u_id, $u_name, "", "Freunde", $f);
            }
        }
        @mysql_free_result($result);
    }
}
function login($u_id, $u_name, $u_level, $hash_id, $javascript, $ip_historie, $u_agb, $u_punkte_monat, $u_punkte_jahr, $u_punkte_datum_monat, $u_punkte_datum_jahr, $u_punkte_gesamt)
{
    // In das System einloggen
    // $o_id wird zurückgeliefert
    // u_id=User-ID, u_name ist Nickname, u_level ist Level, hash_id ist Session-ID
    // javascript=JS WAHR/FALSCH, ip_historie ist Array mit IPs alter Logins, u_agb ist AGB gelesen Y/N
    global $dbase, $conn, $http_host, $HTTP_SERVER_VARS, $punkte_gruppe, $communityfeatures, $logout_logging;
    // IP/Browser Adresse des User setzen
    $ip = $_SERVER["REMOTE_ADDR"];
    $browser = $_SERVER["HTTP_USER_AGENT"];
    $browser = str_replace("MSIE 8.0", "MSIE 7.0", $browser);
    // Alle wichtigen HTTP-Header merken
    $http_stuff = $_SERVER;
    // ausblenden vom uninteressanten Sachen...
    unset($http_stuff['DOCUMENT_ROOT']);
    unset($http_stuff['HTTP_ACCEPT']);
    unset($http_stuff['HTTP_ACCEPT_ENCODING']);
    unset($http_stuff['HTTP_ACCEPT_CHARSET']);
    unset($http_stuff['HTTP_ACCEPT_LANGUAGE']);
    unset($http_stuff['HTTP_CACHE_CONTROL']);
    unset($http_stuff['HTTP_CONNECTION']);
    unset($http_stuff['HTTP_PRAGMA']);
    unset($http_stuff['PATH']);
    unset($http_stuff['SCRIPT_FILENAME']);
    unset($http_stuff['SERVER_ADMIN']);
    unset($http_stuff['SERVER_NAME']);
    unset($http_stuff['SERVER_PORT']);
    unset($http_stuff['SERVER_SIGNATURE']);
    unset($http_stuff['SERVER_SOFTWARE']);
    unset($http_stuff['GATEWAY_INTERFACE']);
    unset($http_stuff['SERVER_PROTOCOL']);
    unset($http_stuff['REQUEST_METHOD']);
    unset($http_stuff['REQUEST_URI']);
    unset($http_stuff['SCRIPT_NAME']);
    unset($http_stuff['PATH_TRANSLATED']);
    unset($http_stuff['PHP_SELF']);
    unset($http_stuff['SERVER_ADDR']);
    unset($http_stuff['argv']);
    unset($http_stuff['argc']);
    unset($http_stuff['CONTENT_TYPE']);
    unset($http_stuff['CONTENT_LENGTH']);
    unset($http_stuff['HTTP_REFERER']);
    unset($http_stuff['HTTP_KEEP_ALIVE']);
    unset($http_stuff['QUERY_STRING']);
    unset($http_stuff['REMOTE_PORT']);
    unset($http_stuff['PHP_AUTH_PW']);
    // Aktionen initialisieren, nicht für Gäste
    if ($u_level != "G" && $communityfeatures) {
        $query = "select a_id FROM aktion WHERE a_user={$u_id} ";
        $result = mysql_query($query, $conn);
        if ($result && (mysql_num_rows($result) == 0 || mysql_num_rows($result) > 20)) {
            mysql_query("INSERT INTO aktion set a_user={$u_id}, a_text='" . mysql_real_escape_string($u_name) . "', a_wann='Sofort/Online', a_was='Freunde', a_wie='OLM'", $conn);
            mysql_query("INSERT INTO aktion set a_user={$u_id}, a_text='" . mysql_real_escape_string($u_name) . "', a_wann='Login', a_was='Freunde', a_wie='OLM'", $conn);
            mysql_query("INSERT INTO aktion set a_user={$u_id}, a_text='" . mysql_real_escape_string($u_name) . "', a_wann='Sofort/Online', a_was='Neue Mail', a_wie='OLM'", $conn);
            mysql_query("INSERT INTO aktion set a_user={$u_id}, a_text='" . mysql_real_escape_string($u_name) . "', a_wann='Login',\ta_was='Neue Mail', a_wie='OLM'", $conn);
            mysql_query("INSERT INTO aktion set a_user={$u_id}, a_text='" . mysql_real_escape_string($u_name) . "', a_wann='Alle 5 Minuten', a_was='Neue Mail', a_wie='OLM'", $conn);
        }
        mysql_free_result($result);
    }
    // Prüfen, ob User noch online ist und ggf. ausloggen
    $alteloginzeit = "";
    $query = "select o_id, o_login FROM online WHERE o_user={$u_id} ";
    $result = mysql_query($query, $conn);
    if ($result && mysql_num_rows($result) != 0) {
        $alteloginzeit = mysql_result($result, 0, 1);
        logout(mysql_result($result, 0, 0), $u_id, "login");
    }
    @mysql_free_result($result);
    // Userdaten ändern
    // Login als letzten Login merken, dabei away und loginfehler zurücksetzen.
    $query = "UPDATE user SET u_login=NOW(),u_away='',u_loginfehler='' WHERE u_id={$u_id}";
    $result = mysql_query($query, $conn);
    if (!$result) {
        echo "Fehler beim Login: {$query}<BR>";
        exit;
    }
    // Punkte des Vormonats/Vorjahres löschen und Usergruppe ermitteln, falls nicht Gast
    if ($u_level != "G" && $communityfeatures) {
        // TODO
        // Ist u_sms_anzahl_monat vom aktuellen Monat?
        // if ($u_sms_anzahl_monat!=date("n",time())){
        // 	$f[u_sms_anzahl_monat]=date("n",time());
        //	$f[u_sms_anzahl_monat]=0;
        //}
        // Ist u_punkte_monat vom aktuellen Monat?
        if ($u_punkte_datum_monat != date("n", time())) {
            $f['u_punkte_datum_monat'] = date("n", time());
            $f['u_punkte_monat'] = 0;
        }
        // Ist u_punkte_jahr vom aktuellen Jahr?
        if ($u_punkte_datum_jahr != date("Y", time())) {
            $f['u_punkte_datum_jahr'] = date("Y", time());
            $f['u_punkte_jahr'] = 0;
        }
        // Aus der Zahl der Gesamtpunkten die Usergruppe ableiten und in u_punkte_gruppe
        // speichern
        $f['u_punkte_gruppe'] = 0;
        foreach ($punkte_gruppe as $key => $value) {
            if ($u_punkte_gesamt < $value) {
                break;
            } else {
                $f['u_punkte_gruppe'] = dechex($key);
            }
        }
    }
    // Aktuelle IP/Datum zu ip_historie hinzufügen
    $datum = time();
    $ip_historie_neu[$datum] = $ip;
    if (is_array($ip_historie)) {
        $i = 0;
        while ($i < 3 and list($datum, $ip_adr) = each($ip_historie)) {
            $ip_historie_neu[$datum] = $ip_adr;
            $i++;
        }
    }
    // u_agb, ip_historie und Temp-Admin schreiben
    if ($u_agb == "Y") {
        $f['u_agb'] = $u_agb;
    }
    $f['u_ip_historie'] = serialize($ip_historie_neu);
    if ($u_level == "A") {
        // falls Status bisher Temp-Admin -> zurücksetzen.
        $f['u_level'] = "U";
        $u_level = "U";
    }
    $u_id = schreibe_db("user", $f, $u_id, "u_id");
    if (!$u_id) {
        echo "Fataler Fehler beim Login:<PRE>";
        print_r($f);
        echo "</PRE>";
        exit;
    }
    // Aktuelle Daten des Users aus Tabelle iignore lesen
    // Query muss mit Code in ignore übereinstimmen
    $query = "SELECT i_user_passiv FROM iignore WHERE i_user_aktiv={$u_id}";
    $result = mysql_query($query, $conn);
    if (!$result) {
        echo "Fehler beim Login (iignore): {$query}<BR>";
        exit;
    } else {
        if (mysql_num_rows($result) == 0) {
            $ignore[0] = FALSE;
        } else {
            while ($iignore = mysql_fetch_array($result)) {
                $ignore[$iignore[i_user_passiv]] = TRUE;
            }
        }
    }
    $knebelzeit = NULL;
    // Aktuelle Userdaten aus Tabelle user lesen
    // Query muss mit Code in schreibe_db übereinstimmen
    $query = "SELECT u_id,u_name,u_nick,u_level,u_farbe,u_zeilen,u_backup,u_farbe_bg,u_farbe_alle,u_farbe_priv,u_farbe_noise,u_farbe_sys,u_clearedit,u_away,u_email,u_adminemail,u_smilie,u_punkte_gesamt,u_punkte_gruppe,u_chathomepage,u_systemmeldungen,u_punkte_anzeigen FROM user WHERE u_id={$u_id}";
    $result = mysql_query($query, $conn);
    if (!$result) {
        echo "Fehler beim Login: {$query}<BR>";
        exit;
    } else {
        $userdata = mysql_fetch_array($result, MYSQL_ASSOC);
        $userdata_array = zerlege(serialize($userdata));
        $http_stuff_array = zerlege(serialize($http_stuff));
        if (!isset($http_stuff_array[0])) {
            $http_stuff_array[0] = "";
        }
        if (!isset($http_stuff_array[1])) {
            $http_stuff_array[1] = "";
        }
        if (!isset($userdata_array[0])) {
            $userdata_array[0] = "";
        }
        if (!isset($userdata_array[1])) {
            $userdata_array[1] = "";
        }
        if (!isset($userdata_array[2])) {
            $userdata_array[2] = "";
        }
        if (!isset($userdata_array[3])) {
            $userdata_array[3] = "";
        }
        // Hole Knebelzeit aus Usertabelle
        $query = "SELECT u_knebel FROM user WHERE u_id={$u_id}";
        $result = mysql_query($query, $conn);
        if ($result && mysql_num_rows($result) == 1) {
            $row = mysql_fetch_object($result);
            $knebelzeit = $row->u_knebel;
        }
        @mysql_free_result($result);
    }
    // Vorbereitung für Login ist abgeschlossen. Jetzt nochmals Prüfen ob User online ist,
    // ggf. Session löschen und neue Session schreiben
    // Tabellen online+user exklusiv locken
    $query = "LOCK   TABLES online WRITE, user WRITE";
    $result = mysql_query($query, $conn);
    $query = "DELETE FROM online WHERE o_user={$u_id}";
    $result = mysql_query($query, $conn);
    // User in in Tabelle online merken -> User ist online
    unset($f);
    $f['o_user'] = $u_id;
    $f['o_raum'] = 0;
    $f['o_hash'] = $hash_id;
    $f['o_ip'] = $ip;
    $f['o_who'] = "1";
    $f['o_browser'] = $browser;
    $f['o_name'] = $userdata['u_nick'];
    $f['o_vhost'] = $http_host;
    $f['o_js'] = $javascript;
    $f['o_level'] = $userdata['u_level'];
    $f['o_http_stuff'] = $http_stuff_array[0];
    $f['o_http_stuff2'] = $http_stuff_array[1];
    $f['o_userdata'] = $userdata_array[0];
    $f['o_userdata2'] = $userdata_array[1];
    $f['o_userdata3'] = $userdata_array[2];
    $f['o_userdata4'] = $userdata_array[3];
    $f['o_ignore'] = serialize($ignore);
    $f['o_punkte'] = 0;
    // Zähler mit 0 Punkten neu initialisieren
    $f['o_aktion'] = time();
    // 5-min Aktionen initialisieren
    $o_id = schreibe_db("online", $f, "", "o_id");
    if (!$o_id) {
        echo "Fataler Fehler beim Login:<PRE>";
        print_r($f);
        echo "</PRE>";
        exit;
    }
    // Timestamps im Datensatz aktualisieren -> User gilt als eingeloggt
    if ($alteloginzeit != "") {
        $query = "UPDATE online SET o_aktiv=NULL, o_login='******', o_knebel='{$knebelzeit}', o_timeout_zeit=DATE_FORMAT(NOW(),\"%Y%m%d%H%i%s\"), o_timeout_warnung='N' WHERE o_user={$u_id} ";
    } else {
        $query = "UPDATE online SET o_aktiv=NULL, o_login=NULL, o_knebel='{$knebelzeit}', o_timeout_zeit=DATE_FORMAT(NOW(),\"%Y%m%d%H%i%s\"), o_timeout_warnung='N' WHERE o_user={$u_id} ";
    }
    $result = mysql_query($query, $conn);
    // Lock freigeben
    $query = "UNLOCK TABLES";
    $result = mysql_query($query, $conn);
    // Bei Admins Cookie setzen zur Überprüfung der Session
    if ($userdata['u_level'] == "C" || $userdata['u_level'] == "S") {
        setcookie("MAINCHAT" . $userdata['u_nick'], md5($o_id . $hash_id . "42"), 0, "/");
    }
    if ($logout_logging) {
        logout_debug($o_id, "login");
    }
    return $o_id;
}