Hi Marco,
vorab eine Ergänzung, das Frontend von xtc läuft auf “ISO-8859-15”.
Dein Vorschlag klappt nicht, nach meinen Verständnis dürfte dies auch nicht klappen, da ich ja nur den MD5 hash in UTF-8 konvertieren würde. Damit es funktioniert, müsste ich das eigentliche Passwort von “ISO-8859-15” in “UTF-8” konvertieren, nur den Zugriff auf das eigentlich Passwort soll MD5 ja verhindern. Oder habe ich hier etwas missverstanden?
mein Lösungsversuch im Detail:
Ich bin dabei von einem xtc-fork auf oxid PE Edition umzusteigen. Dabei ergibt sich folgendes Problem:
In xtc wurde im Frontend “ISO-8859-15” verwendet und dementsprechend basieren die aus den Passwörtern generierten MD5 hashes auf den Passwörtern in “ISO-8859-15” Format.
Alle Stamm- und Bewegungsdaten werden per Skript (danke avenger) in die oxid-DB migriert. Da ich die MD5 hashes nicht rückumwandeln kann, werden diese ohne Anpassung der Zeichenkodierung in die oxid-DB geschrieben.
Oxid soll komplett in “UTF-8” laufen und dadurch können sich Kunden, die sich bereits in xtc ein Konto erstellt haben und in den Passwörtern z.B. Umlaute verwendet haben, nicht anmelden.
Nach meinem Verständnis musste ich nur einen Weg finden, dass beim Login, das vom Kunden eingegebene Passwort zusätzlich in “ISO-8859-15” konvertiert wird. Realisiert habe ich dies über eine Codeanpassung der oxuser.php. Bei folgenden Punkten bräuchte ich bitte Euren Rat:
- Könnt Ihr Euch bitte die Code-Anpassung anschauen und mir sagen ob dies so in Ordnung ist. (Ich bin kein PHP-Programmierer, eher versierter Anwender und mir meines Laien"wissen" bewußt.)
- Um es update-sicher zu machen, würde ich dies gerne noch als Modul einbinden, mir ist aber nach dem Lesen mehrer Tutorials immer noch einiges unklar.
- Kann ich über die /modules/functions.php Funktionen aus der Klasse “oxuser” überladen?
- Falls nein, kann ich dies über ein Modul realisieren?
Code:
(Dieselbe Codeanpassung habe ich auf für die “public function encodePassword” gemacht.)
/application/models/oxuser.php
protected function _getLoginQuery( $sUser, $sPassword, $sShopID, $blAdmin )
{
$myConfig = $this->getConfig();
$oDb = oxDb::getDb();
$sUserSelect = is_numeric( $sUser ) ? "oxuser.oxcustnr = {$sUser} " : "oxuser.oxusername = " . $oDb->quote( $sUser );
/* angepasster Code */
if ( strlen( $this->oxuser__oxsalt->value ) === 0 )
{
$sPassword = $oDb->quote( $sPassword );
$sPassword = mb_convert_encoding($sPassword, "ISO-8859-15", "UTF-8");
$sPassSelect = " oxuser.oxpassword = MD5( CONCAT( ".$sPassword.", UNHEX( oxuser.oxpasssalt ) ) ) ";
}
else
{
$sPassSelect = " oxuser.oxpassword = MD5( CONCAT( ".$oDb->quote( $sPassword ).", UNHEX( oxuser.oxpasssalt ) ) ) ";
}
/* angepasster Code */
/* ursprünglischer Code
$sPassSelect = " oxuser.oxpassword = MD5( CONCAT( ".$oDb->quote( $sPassword ).", UNHEX( oxuser.oxpasssalt ) ) ) ";
*/
$sShopSelect = "";
// admin view: can only login with higher than 'user' rights
if ( $blAdmin ) {
$sShopSelect = " and ( oxrights != 'user' ) ";
}
$blStagingMode = false;
$blDemoMode = false;
$sWhat = "oxid";
if ($myConfig->isDemoShop()) {
$blDemoMode = true;
}
$sSelect = "select $sWhat from oxuser where oxuser.oxactive = 1 and {$sPassSelect} and {$sUserSelect} {$sShopSelect} ";
if ( ( $blDemoMode || $blStagingMode ) && $blAdmin ) {
if ( $sPassword == "admin" && $sUser == "admin" ) {
$sSelect = "select $sWhat from oxuser where oxrights = 'malladmin' ";
} elseif ( $blDemoMode ) {
$oEx = oxNew( 'oxUserException' );
$oEx->setMessage( 'EXCEPTION_USER_NOVALIDLOGIN' );
throw $oEx;
}
}
return $sSelect;
}