Useraccounts vom wbb4 übertragen. WM Tippspiel!

Ich habe einen Blog Artikel verfasst - Wie benutze ich die Suche richtig - Bitte diesen beachten und auch umsetzen bevor Ihr ein Neues Thema eröffnet!

  • Man denkt als Lösung sofort an etwas wie:

    Code
    1. insert into emtipp_users(usr,email,pwd,name,...)select username as usr, email, password as pwd, username as name, ...from wbb4.wcf1_user

    Leider wird es an der anderen Art des password-hash scheitern.


    Die Lösung ist eine Login-Bridge:
    Anstatt die eigene Tabelle zum Verifizieren des Kennwortes zu nutzen, wird die WBB4-Tabelle genutzt (Lesezugriff notwendig). Ist nach erfolgreicher Anmeldung der Benutzer noch nicht existent, dann muss ein entsprechender Datensatz in emtipp_users angelegt werden.


    Diese Lösung hat auch den Vorteil, dass neue WBB4-User Zugang zum Tipp-Spiel erhalten. Ich habe eine solche Bridge auch schon realisiert, einmal für Mediawiki und einmal für selbst geschriebene Software. Beide greifen auf die Anmeldedaten von WBB4 zurück und haben nur Lesezugriff auf die WBB4-Tabelle .


    Da ich mich in der Tipp-Software nicht auskenne, kann ich nichts dazu sagen, wie man dort die Bridge einhängt. Ich kann aber den WBB4-Part zur Verfügung stellen:


    Natürlich muss der DB-Zugriff noch an das DB-Objekt vom Tipp-Spiel angepasst werden. Daher ist es nur eine Vorlage zur Umsetzung.

  • Da ich per PN nach der Bridge gefragt wurde, hole ich hier etwas aus:


    Die Bridge ist u.a. seit 2 Jahren bei Wiimmfi.de im Einsatz um beim WBB4-Forum die Kennwörter abzugleichen. Aus Wiimmfi habe ich auch die Funktionen kopiert. Die beiden Funktionen LoginHandlerWBB4() und LoginWBB4() kann man natürlich zusammenfassen; sie sind bei mir nur getrennt, da sie Bestandteil einer Source-Lib sind und ich 2 Interfaces nutze.


    Wichtig ist, dass nur Hashs im WBB3 und WBB4 Format unterstützt werden, nicht aber ältere. Bei jeder Kennwort-Änderung im WBB wird das jeweils aktuelle Hash-Verfahren verwendet. Ansonsten bleiben beim Update von WBB alte Hash-Formate erhalten.


    Ich verwende das Object $DB, welches automatisch bei einem einen SQL-Fehler sowohl die Query als auch den Fehlerstatus ausgibt. Die Fehlerausgabe wäre hier auch sinnvoll. Denn wie ich schon im Forum schrieb: Ein gut genutzter Fehlerkanal hilft ungemein. Bei uns wird konsequent jeder Fehler im error log beseitigt, so dass das Log im Normalfall aktiviert ist und trotzdem leer bleibt.


    Dann muss das Tipp-Spiel Lesezugriff auf die WBB4-Tabelle wcf1_users haben. DB- und Tabellen-Name müssen richtig angegeben sein. Zur Rechtevergabe nutze ich den SQL-Befehl:

    Code
    1. grant select on WBB4.wcf1_user for USER@localhost

    Unter der Annahme, dass USER der DB-Nutzer des Tipp-Spiels ist und WBB4 der Datenbankname. Genau diese Rechtevergabe kann aber Probleme bereiten, wenn man nicht Herr der Datenbank ist und somit keine Rechte für GRANT hat.


    Die Alternative ist, ein mysqli-Object mit den Anmeldedaten vom WBB4 zu erstellen, um den Benutzer zu verifizieren. Die Funktionen könnten dann so aussehen:


    Anmerkungen:

    • Der neue Kode wurde von mir auf die schnelle runtergeschriebenen und ist absolut ungetestet.
    • Ich habe keine Ahnung, ob und wie sich die Klasse mysqli und die globalen Funktionen mysql_*() gegenseitig beeinflussen und ob sie störungsfrei nebeneinander genutzt werden können. Die Funktionen gelten sowieso schon lange als deprecated, so dass das TippSpiel kurzfristig auf die Klasse mysqli umgestellt werden muss.
    • Ich weiß nicht, ob WBB4 auch auf Windows läuft. Ich weiß aber, dass die Funktion crypt() unter Windows andere Algorithmen unterstützt. Falls WBB4 Windows-tauglich ist, kann es durchaus sein, dass die Windows-Funktion den Hash anders berechnet. Dann müsste die Funktion VerifyPasswordWBB4() angepasst werden.
  • Hab die WBB4 Login-Bridge von @Wiimm erfolgreich in das Tippspiel implementieren können! Vielen Dank für das zur Verfügung stellen! Und zwar wird bei einem Loginversuch in der WBB4-Tabelle geprüft ob es diesen User gibt und ob das Passwort richtig ist. Wenn alles korrekt ist, dann wird automatisch ein Datensatz in die Tippspiel-Tabelle users eingefügt.


    Die Funktion "checkUserState()" in der include/inc.functions.php wird etwas überarbeitet und muss am Ende so aussehen:

    PHP
    1. global $CONFIG, $RUNTIME; if (isset($_POST['loginSubmit'])) { setcookie("xUser",$_POST['loginUser'],time() + (60*60*24),"/"); if(isset($_POST['loginPass']) && $_POST['loginPass'] != '') { setcookie("xPass", 1, time() + (60*60*24), "/"); } else { setcookie("xPass", 0, time() + (60*60*24), "/"); } } $usr = (isset($_POST['loginUser']) ? $_POST['loginUser'] : (isset($_COOKIE['xUser']) ? $_COOKIE['xUser'] : "")); if(isset($_POST['loginPass'])) { $acc = (object)LoginWBB4($usr, $_POST['loginPass']); } $sql = "SELECT pwd, isUnlocked FROM ". $CONFIG['MYSQL']['PREFIX'] ."users WHERE usr = '". mysql_real_escape_string($usr) ."'"; $query = mysql_query($sql); $num = mysql_num_rows($query); $showmsg = 0; if ($num > 0) { $row = mysql_fetch_array($query); if((isset($acc) && is_object($acc) && $acc->pw_ok) || (isset($_COOKIE['xPass']) && $_COOKIE['xPass'] == 1)) { $sql = mysql_query("SELECT * FROM ". $CONFIG['MYSQL']['PREFIX'] ."users WHERE usr = '".mysql_real_escape_string($usr)."'"); $row = mysql_fetch_array($sql); $_SESSION['s_id'] = $row['id']; $_SESSION['s_usr'] = $row['usr']; $_SESSION['s_name'] = $row['name']; $_SESSION['s_email'] = $row['email']; $_SESSION['s_level'] = $row['status']; $_SESSION['s_flash'] = $row['showflash']; $_SESSION['s_group'] = $row['department']; $sql = mysql_query("UPDATE ". $CONFIG['MYSQL']['PREFIX'] ."users SET lastLogin = '". (time() + getTimeOffset()) ."', currentPage='". mysql_real_escape_string($RUNTIME['FULL']) ."' WHERE id = '". $_SESSION['s_id'] ."'"); } else { $_SESSION['s_level'] = 0; $showmsg = 1; } } else { if(isset($_POST['loginPass']) && $_POST['loginPass'] != '') { if(is_object($acc) && $acc->pw_ok) { $sql = "INSERT INTO ". $CONFIG['MYSQL']['PREFIX'] ."users (usr,email,pwd,name,department,regDate,isUnlocked,showflash,bezahlt) VALUES " ."('". mysql_real_escape_string($acc->account) ."'," ."'". mysql_real_escape_string($acc->email) ."'," ."''," ."'". mysql_real_escape_string($acc->account) ."'," ."'ohne Gruppe'," ."'". (time() + getTimeOffset()) ."'," ."'1'," ."'1'," ."1)"; $result = mysql_query($sql); $sql = mysql_query("SELECT * FROM ". $CONFIG['MYSQL']['PREFIX'] ."users WHERE usr = '".mysql_real_escape_string($usr)."'"); $row = mysql_fetch_array($sql); $_SESSION['s_id'] = $row['id']; $_SESSION['s_usr'] = $row['usr']; $_SESSION['s_name'] = $row['name']; $_SESSION['s_email'] = $row['email']; $_SESSION['s_level'] = $row['status']; $_SESSION['s_flash'] = $row['showflash']; $_SESSION['s_group'] = $row['department']; $sql = mysql_query("UPDATE ". $CONFIG['MYSQL']['PREFIX'] ."users SET lastLogin = '". (time() + getTimeOffset()) ."', currentPage='". mysql_real_escape_string($RUNTIME['FULL']) ."' WHERE id = '". $_SESSION['s_id'] ."'"); } else { $_SESSION['s_level'] = 0; $showmsg = 1; } } else { $_SESSION['s_level'] = 0; $showmsg = 1; } } if (isset($_POST['loginSubmit'])) { if ($CONFIG['TEXTART'] == 0) { if ($showmsg == 2) { $msgtext = 'Ihr Zugang ist nicht aktiviert! Sie erhalten nach der Aktivierung automatisch eine E-Mail. Sollten Sie schon lange auf die Aktivierung warten, dann melden Sie sich beim Administrator: <a href="index.php?page=home/kontakt/formular/">zum&nbsp;Kontaktformular</a>'; } elseif ($showmsg == 1) { $msgtext = 'Die Zugangsdaten sind falsch! Überprüfen Sie Benutzername und Passwort. Haben Sie ihr Passwort vergessen? Dann klicken Sie hier: <a href="index.php?page=home/passwort/">Passwort&nbsp;zurücksetzen.</a>'; } } else { if ($showmsg == 2) { $msgtext = 'Dein Zugang ist nicht aktiviert! Du erhälst nach der Aktivierung automatisch eine E-Mail. Solltest du schon lange auf die Aktivierung warten, dann melde dich beim Administrator: <a href="index.php?page=home/kontakt/formular/">zum&nbsp;Kontaktformular</a>'; } elseif ($showmsg == 1) { $msgtext = 'Die Zugangsdaten sind falsch! Überprüfe Benutzername und Passwort. Hast du dein Passwort vergessen? Dann klicke hier: <a href="index.php?page=home/passwort/">Passwort&nbsp;zurücksetzen.</a>'; } } if ($showmsg > 0) { $_SESSION['message'] = array("alert",$msgtext); } }


    Über diese Funktion müssen dann noch die drei Funktionen von @Wiimm eingefügt werden:



    Code
    1. function VerifyPasswordWBB4 ( $pw, $hash ){ // Verify a password entered by the user against a WBB4 hash value. // Only WBB3 and WBB4 style hashes are supported. // Returns TRUE for a correct password and FALSE otherwise. if ( substr($hash, 0, 5) == 'wcf1:' ) // WBB3 { $param = explode(':', substr($hash, 5)); // hash:salt return count($param) == 2 && sha1( $param[1] . sha1( $param[1] . sha1( $pw )) ) == $param[0]; } return crypt( crypt($pw, $hash), $hash ) == $hash;}function LoginHandlerWBB4 ( $db, $tab, $user, $pw ){ // Verify a password entered by the user against a WBB4 hash value // stored in DB table.column 'wcf1_user.password'. // Only WBB3 and WBB4 style hashes are supported. // Returns an object or FALSE on error. global $CONFIG; $query = mysql_query("SELECT userid,username,email,password,banned FROM `$db`.`$tab`" ." WHERE username=\"{mysql_real_escape_string($user)}\""); $res = mysql_fetch_object($query); if (!is_object($res)) return FALSE; // return an object $acc = (object)NULL; $acc->user_id = $res->userid; $acc->account = $res->username; $acc->email = $res->email; $acc->disabled = $res->banned > 0; $acc->pw_ok = VerifyPasswordWBB4($pw, $res->password); return $acc;}function LoginWBB4 ( $user, $pw ){ return LoginHandlerWBB4('DATENBANKNAME', 'USER-TABELLE', $user, $pw);}



    In der include/inc.config.php werden ganz unten noch folgende Zeilen ergänzt:

    PHP
    1. $CONFIG['wbb']['MYSQL']['SERVER'] = "localhost";$CONFIG['wbb']['MYSQL']['USER'] = "";$CONFIG['wbb']['MYSQL']['PASS'] = "";$CONFIG['wbb']['MYSQL']['DATENBANK'] = "";$CONFIG['wbb']['MYSQL']['LINK'] = mysqli_connect($CONFIG['wbb']['MYSQL']['SERVER'], $CONFIG['wbb']['MYSQL']['USER'], $CONFIG['wbb']['MYSQL']['PASS'], $CONFIG['wbb']['MYSQL']['DATENBANK']) or die("Error " . $CONFIG['wbb']['MYSQL']['LINK']->error);

    In der content/default.menu.php muss dann nur noch der Code für die Registrierungsseite entfernt werden:


    PHP
    1. if (noMember())
    2. {
    3. ?>
    4. <a class="nav<?php echo ($RUNTIME['PATH'][1] == "registrieren" ? " active" : "")?>" href="<?php echo $CONFIG['PATH'].gLink("home/registrieren/")?>">Registrieren</a><span class="hide"> | </span>
    5. <a class="nav<?php echo ($RUNTIME['PATH'][1] == "passwort" ? " active" : "")?>" href="<?php echo $CONFIG['PATH'].gLink("home/passwort/")?>">Passwort vergessen</a><span class="hide"> | </span>
    6. <?php
    7. }

    Zufrieden mit dem Script und dem Support? Möchtest du uns unterstützen?

    Dann könntest du etwas SPENDEN. :)


    HERTHA BSC heißt unser Verein
    HERTHA BSC wird es immer sein!

  • Wurde der Code irgendwo erfolgreich eingebaut? Bei uns geht er nämlich nicht.


    Ich hab mal in der inc.config diesen Code hinter das "?" gepackt, laut
    Anleitung sollte es zuletzt rein kommen, so bekomme ich dann eine
    Fehlermeldung ganz oben:


    $CONFIG['wbb']['MYSQL']['SERVER'] = "localhost";
    $CONFIG['wbb']['MYSQL']['USER'] = "...;
    $CONFIG['wbb']['MYSQL']['PASS'] = "...";
    $CONFIG['wbb']['MYSQL']['DATENBANK'] = "....";
    $CONFIG['wbb']['MYSQL']['LINK'] =
    mysqli_connect($CONFIG['wbb']['MYSQL']['SERVER'],
    $CONFIG['wbb']['MYSQL']['USER'], $CONFIG['wbb']['MYSQL']['PASS'],
    $CONFIG['wbb']['MYSQL']['DATENBANK']) or die("Error " .
    $CONFIG['wbb']['MYSQL']['LINK']->error);



    Fehlermeldung verdeckt vom Cover:



    $CONFIG['wbb']['MYSQL']['SERVER'] = "localhost";$CONFIG['wbb']['MYSQL']['USER'] = "...";$CONFIG['wbb']['MYSQL']['PASS'] = "...";$CONFIG['wbb']['MYSQL']['DATENBANK'] = "...";$CONFIG['wbb']['MYSQL']['LINK'] = mysqli_connect($CONFIG['wbb']['MYSQL']['SERVER'], $CONFIG['wbb']['MYSQL']['USER'], $CONFIG['wbb']['MYSQL']['PASS'], $CONFIG['wbb']['MYSQL']['DATENBANK']) or die("Error " . $CONFIG['wbb']


    hier Life:
    http://www.nightmare-horrormovies.de/tippspiel/



    Wenn ich den Code vor das "?" packe, wie ich erst vermutete, kommt die Fehlermeldung nicht. Beides funktioniert aber nicht bei mir in Verbindung mit dem WBB Register.


    Edit: Hab bei der inc.config den Code wieder vor dem ? geschoben, sonst sind die Zugangsdaten zu sehen.

  • Hab dir dazu gerade schon deine PN beantwortet. Ich habe es bei mir erfolgreich getestet.
    Wenn es nach den Hinweisen immer noch nicht funktioniert, dann könntest du mir ja deine inc.functions.php-Datei per PN zu senden.

    Zufrieden mit dem Script und dem Support? Möchtest du uns unterstützen?

    Dann könntest du etwas SPENDEN. :)


    HERTHA BSC heißt unser Verein
    HERTHA BSC wird es immer sein!

  • Hallo,


    das ist ja super das es hier eine Bridge gibt, kann man diese auch für das Buli-Tipp verwenden, wenn ja welche Datein müssen editiert werden?


    Gruß

  • Jup.
    Falls es nicht funktioniert, mal die Abfrage austauschen:

    SQL
    1. $query = mysql_query("SELECT userid,username,email,password,banned FROM `$db`.`$tab`"
    2. ." WHERE username='" . mysql_real_escape_string($user) . "'");

    Zufrieden mit dem Script und dem Support? Möchtest du uns unterstützen?

    Dann könntest du etwas SPENDEN. :)


    HERTHA BSC heißt unser Verein
    HERTHA BSC wird es immer sein!

  • In Beitrag 4 findest du alle Angaben.
    Sofern ich Dateien hier anhänge, könnten deine bisherigen Sachen überschrieben werden, falls du welche gemacht hast. Auch neue Config-Dateien sind immer etwas problematisch, da viele dann wieder alles neu einschreiben müssen.

    Zufrieden mit dem Script und dem Support? Möchtest du uns unterstützen?

    Dann könntest du etwas SPENDEN. :)


    HERTHA BSC heißt unser Verein
    HERTHA BSC wird es immer sein!

  • Das Ganze jetzt bitte noch mal für das WM Tippspiel für das WBB 4.1 ^^ Damals hatte das geklappt bei mir. Was muss geändert werden? Muss das Tippspiel noch mal neu installieren, da beim Boardumzug das nicht übernommen wurde.

  • Dr.Doom

    Hat den Titel des Themas von „Useraccounts vom wbb4 übertragen.“ zu „Useraccounts vom wbb4 übertragen. WM Tippspiel!“ geändert.
  • Ich habe mal den Code von oben angepasst, hab es aber nicht getestet.

    Zufrieden mit dem Script und dem Support? Möchtest du uns unterstützen?

    Dann könntest du etwas SPENDEN. :)


    HERTHA BSC heißt unser Verein
    HERTHA BSC wird es immer sein!

  • Was sagt denn dein Apache-Error-Log?

    Den Datenbanknamen und die User-Tabelle in der LoginWBB4-Funktion auch angepasst?

    Zufrieden mit dem Script und dem Support? Möchtest du uns unterstützen?

    Dann könntest du etwas SPENDEN. :)


    HERTHA BSC heißt unser Verein
    HERTHA BSC wird es immer sein!

  • Was sagt denn dein Apache-Error-Log?

    Den Datenbanknamen und die User-Tabelle in der LoginWBB4-Funktion auch angepasst?

    Ich weis nicht mal wo ich den Error-Log findne kann, im ACP steht nur das drin was direkt im Forum los ist. Hab dort nichts mit der URL "wm" gefunden. Ich hab sonst nichts angpasst, ausser das wasi m Code hier steht zum einbauen.