function schreibe_db($db, $f, $id, $id_name) { // Assoziatives Array $f in DB $db schreiben // Liefert als Ergebnis die ID des geschriebenen Datensatzes zurück // Sonderbehandlung für Passwörter // Akualiert ggf Kopie des Datensatzes in online-Tabelle global $dbase, $conn, $u_id, $valid_fields; $neu = array(); foreach ($valid_fields[$db] as $field) { if (isset($f[$field])) { $neu[$field] = $f[$field]; } } $f = $neu; $id == intval($id); if (strlen($id) == 0 || $id == 0) { // ID generieren if ($db == "online" || $db == "chat") { // ID aus sequence verwenden $query = "LOCK TABLES sequence WRITE"; $result = mysql_query($query, $conn); $query = "SELECT se_nextid FROM sequence WHERE se_name='{$db}'"; $result = mysql_query($query, $conn); if ($result) { $id = mysql_result($result, 0, 0); mysql_free_result($result); $query = "UPDATE sequence SET se_nextid='" . ($id + 1) . "' WHERE se_name='{$db}'"; $result = mysql_query($query, $conn); } else { echo "Schwerer Fehler in {$query}: " . mysql_errno() . " - " . mysql_error(); $query = "UNLOCK TABLES"; $result = mysql_query($query, $conn); die; } $query = "UNLOCK TABLES"; $result = mysql_query($query, $conn); } else { // ID mit auto_increment erzeugen $id = 0; } // Datensatz neu schreiben $q = ""; for (reset($f); list($name, $inhalt) = each($f);) { if ($name != $id_name && $name != "u_salt") { $q .= "," . mysql_real_escape_string($name); if ($name == "u_passwort") { if (!isset($f['u_salt'])) { $f['u_salt'] = substr($inhalt, 0, 2); } // Verschlüsseln $q .= "='" . mysql_real_escape_string(iCrypt($inhalt, $f['u_salt'])) . "'"; } else { $q .= "='" . mysql_real_escape_string($inhalt) . "'"; } } } $query = "INSERT INTO {$db} SET {$id_name}={$id} " . $q; $result = mysql_query($query, $conn); if (!$result) { echo "Fataler Fehler in {$query}: " . mysql_errno() . " - " . mysql_error(); die; } if ($id == 0) { $id = mysql_insert_id(); } } else { // bestehenden Datensatz updaten $q = ""; for (reset($f); list($name, $inhalt) = each($f);) { if ($name != "u_salt") { if ($q == "") { $q = mysql_real_escape_string($name); } else { $q .= "," . mysql_real_escape_string($name); } if ($name == "u_passwort") { // Verschlüsseln if (!isset($f['u_salt'])) { $f['u_salt'] = substr($inhalt, 0, 2); } $q .= "='" . mysql_real_escape_string(iCrypt($inhalt, $f['u_salt'])) . "'"; } else { $q .= "='" . mysql_real_escape_string($inhalt) . "'"; } } } $q = "UPDATE {$db} SET " . $q . " WHERE {$id_name}={$id}"; $result = mysql_query($q, $conn); } if ($db == "user" && $id_name == "u_id") { // Kopie in Onlinedatenbank aktualisieren // Query muss mit dem Code in login() ü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={$id}"; $result = mysql_query($query, $conn); if ($result && mysql_num_rows($result) == 1) { $userdata = mysql_fetch_array($result, MYSQL_ASSOC); // Slashes in jedem Eintrag des Array ergänzen reset($userdata); while (list($ukey, $udata) = each($userdata)) { $udata = mysql_real_escape_string($udata); } // Userdaten in 255-Byte Häppchen zerlegen $userdata_array = zerlege(serialize($userdata)); 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] = ""; } $query = "UPDATE online SET " . "o_userdata='" . mysql_real_escape_string($userdata_array[0]) . "', " . "o_userdata2='" . mysql_real_escape_string($userdata_array[1]) . "', " . "o_userdata3='" . mysql_real_escape_string($userdata_array[2]) . "', " . "o_userdata4='" . mysql_real_escape_string($userdata_array[3]) . "', " . "o_level='" . mysql_real_escape_string($userdata['u_level']) . "', " . "o_name='" . mysql_real_escape_string($userdata['u_nick']) . "' " . "WHERE o_user={$id}"; mysql_query($query, $conn); mysql_free_result($result); } } return $id; }
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; }