Seite 1 von 1

Migration Webs (xtc Fork) nach Shopware

Verfasst: 4. Aug 2018 10:09
von Kopernikus
Hallo zusammen

Nach etlichen Jahren webs (www.webs.de) möchte ich meinen Shop nun gerne modernisieren. Als geeignetes Shopsystem habe ich mir deshalb Shopware ausgesucht. Die Migration der Produkte und Kategorien, Benutzerbewertungen oder auch Preisinformationen ging alles ohne Probleme. Nur beim Kundenimport streikt das Migrationsprogramm und spuckt dabei folgende Fehlermeldung aus:

Code: Alles auswählen

Beim Importieren der Kunden ist ein Fehler aufgetreten

Code : 23000
Line : 224
File : /home/www/web282/html/shopware/engine/Library/Zend/Db/Statement/Pdo.php

Error : SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`shopware`.`s_user_addresses`, CONSTRAINT `s_user_addresses_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `s_core_countries` (`id`) ON UPDATE CASCADE)
Trace : #0 /home/www/web282/html/shopware/engine/Library/Zend/Db/Statement.php(297): Zend_Db_Statement_Pdo->_execute(Array) #1 /home/www/web282/html/shopware/engine/Library/Zend/Db/Adapter/Abstract.php(470): Zend_Db_Statement->execute(Array) #2 /home/www/web282/html/shopware/engine/Library/Zend/Db/Adapter/Pdo/Abstract.php(232): Zend_Db_Adapter_Abstract->query('INSERT INTO s_u...', Array) #3 /home/www/web282/html/shopware/engine/Library/Enlight/Components/Db/Adapter/Pdo/Mysql.php(96): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO s_u...', Array) #4 /home/www/web282/html/shopware/engine/Shopware/Plugins/Community/Backend/SwagMigration/Components/DbServices/Import/CustomerImporter.php(641): Enlight_Components_Db_Adapter_Pdo_Mysql->query('INSERT INTO s_u...') #5 /home/www/web282/html/shopware/engine/Shopware/Plugins/Community/Backend/SwagMigration/Components/DbServices/Import/CustomerImporter.php(312): Shopware\SwagMigration\Components\DbServices\Import\CustomerImporter->createOrUpdate(Array, 's_user_addresse...', 'address_id', Array) #6 /home/www/web282/html/shopware/engine/Shopware/Plugins/Community/Backend/SwagMigration/Components/DbServices/Import/Import.php(176): Shopware\SwagMigration\Components\DbServices\Import\CustomerImporter->import(Array) #7 /home/www/web282/html/shopware/engine/Shopware/Plugins/Community/Backend/SwagMigration/Components/Migration/Import/Resource/Customer.php(207): Shopware\SwagMigration\Components\DbServices\Import\Import->customer(Array) #8 /home/www/web282/html/shopware/engine/Shopware/Plugins/Community/Backend/SwagMigration/Components/Migration/Import/Resource/Customer.php(82): Shopware\SwagMigration\Components\Migration\Import\Resource\Customer->migrateCustomer(Array, Object(Shopware\SwagMigration\Components\DbServices\Import\Import), '') #9 /home/www/web282/html/shopware/engine/Shopware/Plugins/Community/Backend/SwagMigration/Controllers/Backend/SwagMigration.php(444): Shopware\SwagMigration\Components\Migration\Import\Resource\Customer->run() #10 /home/www/web282/html/shopware/engine/Shopware/Plugins/Community/Backend/SwagMigration/Controllers/Backend/SwagMigration.php(479): Shopware_Controllers_Backend_SwagMigration->runImport('import_customer...') #11 /home/www/web282/html/shopware/engine/Library/Enlight/Controller/Action.php(193): Shopware_Controllers_Backend_SwagMigration->importAction() #12 /home/www/web282/html/shopware/engine/Library/Enlight/Con
Im Kundenforum von Shopware habe ich den Fehler bereits im Juni publiziert, leider bis jetzt jedoch kein Lösungsansatz gefunden. Vielleicht kann mir hier ja jemand auf die Sprünge helfen?

Besten Dank im Voraus

Re: Migration Webs (xtc Fork) nach Shopware

Verfasst: 4. Aug 2018 12:52
von xMerchant
Rein vom Stacktrace her, kenne weder Webs noch Shopware:

Das System versucht eine Kundenadresse anzulegen, deren address_id in der Datenbank schon vorkommt. Der Fehler wird durch folgenden Befehl ausgelöst: createOrUpdate(Array, 's_user_addresse...', 'address_id', Array)

Schau mal in den Adressen nach, ob dort mehrfach die gleiche AdressID vorkommt.

Edit: Es scheint wohl eher bei den Ländern ein Problem mit doppelten IDs zu geben. Schau mal nach, ob er ein Land doppelt eintragen will.

Re: Migration Webs (xtc Fork) nach Shopware

Verfasst: 4. Aug 2018 13:03
von costumes
Ich denke mal das scheitert an den Passwörtern!
Falls Du nur die Kundendaten benötigst, dann probiere mal dies hier:
In neuen Shop einen Kunden mit allen benötigten Einträgen erstellen.
Dann die Kundendatenbank exportieren.
Die Datei in OpenOffice öffnen.
Beim alten Shop die Kundendatenbank exportieren und auch in OpenOffice öffnen.
Jetzt alle wichtigen Spalten in die Shopwaredatei reinkopieren (darauf achten, dass die oberste Zeile nicht überschrieben wird).

Danach das Ganze hochladen und Du hast alle Kunden in der Datenbank.

Re: Migration Webs (xtc Fork) nach Shopware

Verfasst: 4. Aug 2018 13:39
von Xantiva
Hi Kopernikus, :winken:

bei Shopware kann ich Dir leider auch nicht helfen. Aber bgzl. Passwörter - die werden im Webs als salted hash gespeichert. Ich konnte die beim Wechsel nach JTL(-Shop) 1:1 importieren und die Kunden waren in der Lage sich sofort wieder einzuloggen.

Re: Migration Webs (xtc Fork) nach Shopware

Verfasst: 6. Aug 2018 06:38
von Templer
Das sieht danach aus, als würde der beim Adressimport auf ein Land referenzieren (country_id), welches in der Ländertabelle (s_core_countries) nicht existiert. Daher schlägt der Import bei MySQL fehl, weil MySQL die Fremdschlüssel bzw. die Beziehung zwischen den Schlüsseln checkt.

Re: Migration Webs (xtc Fork) nach Shopware

Verfasst: 31. Aug 2018 11:18
von Kopernikus
Hallo zusammen und ein freundliches :winken: an Xantiva

Nach langem gebastel und endlosen Versuchen, habe ich den Import meiner Kundendaten schliesslich hinbekommen. So weit so gut. Doch nun stecke ich exakt bei Xantivas Hinweis fest. Der Migrationsassistent von Shopware bietet ledliglich einen Import von xtCommerce 3.04 an. Dort sind die md5 Passworter natürlich noch ungesalzen. :( Folglich kann sich kein Kunde mit seinem alten Passwort einloggen.

Es gibt zwar eine ausführliche Dokumentation (https://developers.shopware.com/develop ... ch-results) wie man Kundenpasswörter aus anderen Systemen nach Shopware importiert, doch für mich als nicht coder leider absolut nicht nachvollziehbar. Vor allem weiss ich nicht, wie die Passwörter aus Webs genau verschlüsselt sind und was ich da wo genau anpassen müsste. Die erste Frage (wie genau in webs.de verschlüsselt) könnte mir vielleicht Xantiva beantworten. Die zweite Frage, wo und wie genau implementieren möglicherweise ein Shopware Spezi. Aktuell stehe ich absolut auf dem Schlauch und habe das Projekt Shopware nach über 100 Stunden Arbeit schon fast wieder beerdigt. :(

Ich würde mich deshalb über jeden Tipp/Hinweis sehr freuen.

LG
Kopernikus

Re: Migration Webs (xtc Fork) nach Shopware

Verfasst: 31. Aug 2018 11:54
von Kopernikus
Ich habe mal in webs nachgeschaut und vermute, dass hier das Passwort generiert wird. Doch weiter weiss ich dann auch nicht mehr. :gruebel:

Code: Alles auswählen

<?php
/** ----------------------------------------------------------------------------
 **
 *F xtc_encrypt_password.inc.php
 **
 ** WEB-Shop Software http://www.webs.de
 **
 ** Encode a given password. Give salt value to verify a stored password
 **
 ** ----------------------------------------------------------------------------
 ** based on:
 **  (c) 2000-2001 The Exchange Project (earlier name of osCommerce)
 **  (c) 2002-2003 osCommerce(password_funcs.php,v 1.10 2003/02/11); www.oscommerce.com 
 **  (c) 2003 nextcommerce (xtc_encrypt_password.inc.php,v 1.4 2003/08/13); www.nextcommerce.org
 **  (c) 2006 XT-Commerce
 **
 ** Released under the GNU General Public License
 **
 ** @version $Id: xtc_encrypt_password.inc.php 2458 2014-01-15 16:39:13Z joerg $
 ** @copyright 2014 WEB-Shop Software http://www.webs.de/
 **
 ** ------------------------------------------------------------------------- */
  
// This function makes a new password from a plaintext password. 
function xtc_encrypt_password($plain) {

  $password = NULL;

  $release = 0;
  // check the DB revision for siez of customers.customers_password column
  $sql = '-- inc/xtc_encrypt_password
    SELECT `release`
    FROM database_version
    WHERE version=\'V1.0\'';
  $query = xtc_db_query($sql);
  while ($row = xtc_db_fetch_array($query)) {
    $release = $row['release'];
  }

  if ($release >= 13) {
    $methods = array(
      'CRYPT_SHA512' => '$6$%16.16s$',
      'CRYPT_SHA256' => '$5$%16.16s$',
      'CRYPT_BLOWFISH' => '$2a$07$%22.22s$',
      'CRYPT_MD5' => '$1$%12.12s$',
      'CRYPT_EXT_DES' => '%9.9s',
      'CRYPT_STD_DES' => '%2.2s',
    );

    // this salt, generated by md5 from time and Pid is good enough for us:
    $salt = md5(time().getMyPid());

    foreach($methods as $method => $hash) {
      if (defined($method) and constant($method) == 1) {
        $hash = sprintf($hash, $salt);
        $password = NULL;
        // found a method to use:
        if (function_exists('pcntl_fork') && function_exists('posix_kill')) {
          $pid = pcntl_fork();

          if ($pid == -1) {
            $password = crypt($plain, $hash);
          } elseif ($pid) {
            pcntl_wait($status); // prevent from zombies

            // check if the child terminates by SIGUSR1 what we expect
            if (pcntl_wifsignaled($status) and pcntl_wtermsig($status) == SIGUSR1) {
              // we could process the crypt
              $password = crypt($plain, $hash);
            }
          } else {
            register_shutdown_function(create_function(NULL, 'posix_kill(getmypid(), SIGUSR1);'));
            $password = crypt($plain, $hash); // on error this cause a SIGSEGV
            exit(0);
          }
        } else {
          $password = crypt($plain, $hash);
        }

        // verify the encryption:
        if ($password !== NULL and crypt($plain, $password) == $password) {
          break;
        } else {
          $password = NULL;
        }
      }
    }
  }

  // fallback to old method
  if (empty($password)) {
    $password=md5($plain);
  }

  return $password;
}
 ?>

Re: Migration Webs (xtc Fork) nach Shopware

Verfasst: 2. Sep 2018 00:25
von Xantiva
Wenn ich das richtig verstehe, speichert Shopware den Hash und den jeweiligen zu benutzenden Encoder:
Any customer's password data is stored in two fields in the s_user table: The hash of the password and the responsible encoder, which takes care of hashing / comparing the password.
Das Migrationstool geht dann vermutlich von einem MD5 Encoder (wegen XTC3.04) aus. Was steht da normalerweise für ein Encoder drin? Wenn Du einen neuen Kunden anlegst? Das müsste dann ein anderer Encoder sein. Wenn Du den mal bei einer der alten Kundenkonten einträgst - funktioniert es dann?

Re: Migration Webs (xtc Fork) nach Shopware

Verfasst: 2. Sep 2018 13:14
von Kopernikus
Hallo Xantiva

Freut mich von Dir zu hören. :-)
Also wenn ich ein neuer Kunde anlege, steht da bcrypt drin. Bei den migrierten Kunden steht überall md5 drin. Und ja tatsächlich. Wenn ich bei einem alten Kunden bcrypt eintrage, kann ich mich ohne Probleme einloggen. :-) Weisst Du gerade wie der Befehl heist, um über mySQL md5 durch bcrypt zu ersetzen?

LG

Re: Migration Webs (xtc Fork) nach Shopware

Verfasst: 2. Sep 2018 14:13
von Xantiva
Da ich die Tabellen und Felder nicht kenne - Nein.

Das ist die Syntax:

Code: Alles auswählen

UPDATE table_name
SET column1=value, column2=value2,...
WHERE some_column=some_value 
Und so in der Art muss der Befehl dann aussehen:

Code: Alles auswählen

UPDATE table_name
SET column1="bcrypt"
WHERE column1="MD5"

Re: Migration Webs (xtc Fork) nach Shopware

Verfasst: 4. Sep 2018 12:12
von Kopernikus
Hallo Xantiva

Das hat hervorragend funktioniert, Herzlichen Dank. Jetzt muss ich nur noch meine anderen 99 Probleme in den Griff bekommen. :-)