PrestaShopCorp / ogone

0 stars 7 forks source link

Session disconnected when I come back on confirmation.php #7

Open oranocha opened 8 years ago

oranocha commented 8 years ago

We use Prestashop 1.6. When customer make payment with Ingenico, the return is done on confirmation.php (so, after, module use confirmation's controller).

The page continue loading because when we come back on the page, the user is disconnected. So, nothing is present in $this->context and script is in error.

Can you help me to understand why user is disconnected from his session when we come back from Ingenico?

Olivier

peterkenne commented 8 years ago

Hi, I am facing exactly the same problem. Did you find a solution ? Also PrestaShop 1.6 with Ingenico.

oranocha commented 8 years ago

Bonjour,

Pas encore de retour du développeur du module donc j'ai du "hacker" le code pour résoudre le problème.

Voici ce que j'ai fait :

// BOF HACK FROM ORA

    if (!$this->context->customer->isLogged()) {

          $query = 'SELECT id_customer FROM ' . _DB_PREFIX_ . 'orders WHERE id_cart = ' . (int) $id_cart . ' AND secure_key = "' . Tools::getValue('secure_key') . '"';

          $id_customer = Db::getInstance()->getValue($query);

          if (!$id_customer) {

            die('error!');

          }

          $customer = new Customer($id_customer);

          $this->context->cookie->id_compare = isset($this->context->cookie->id_compare) ? $this->context->cookie->id_compare: CompareProduct::getIdCompareByIdCustomer($customer->id);

          $this->context->cookie->id_customer = (int)($customer->id);

          $this->context->cookie->customer_lastname = $customer->lastname;

          $this->context->cookie->customer_firstname = $customer->firstname;

          $this->context->cookie->logged = 1;

          $customer->logged = 1;

          $this->context->cookie->is_guest = $customer->isGuest();

          $this->context->cookie->passwd = $customer->passwd;

          $this->context->cookie->email = $customer->email;

          // Add customer to the context

          $this->context->customer = $customer;

          if (Configuration::get('PS_CART_FOLLOWING') && (empty($this->context->cookie->id_cart) || Cart::getNbProducts($this->context->cookie->id_cart) == 0) && $idCart = (int)Cart::lastNoneOrderedCart($this->context->customer->id)) {

              $this->context->cart = new Cart($idCart);

          } else {

              $id_carrier = (int)$this->context->cart->id_carrier;

              $this->context->cart->id_carrier = 0;

              $this->context->cart->setDeliveryOption(null);

              $this->context->cart->id_address_delivery = (int)Address::getFirstCustomerAddressId((int)($customer->id));

              $this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId((int)($customer->id));

          }

          $this->context->cart->id_customer = (int)$customer->id;

          $this->context->cart->secure_key = $customer->secure_key;

          $this->context->cookie->write();

    }

    // EOF HACK FROM ORA

Ceci est à placer dans le fichier /modules/ogone/controllers/front/confirmation.php

Olivier

peterkenne commented 8 years ago

Grand merci pour ces infos. Donc, tu n'as pas compris pourquoi l'utilisateur était déconnecté ? De mon côté, je suspecte un passage par une adresse HTTP au lieu de HTTPS. Je continue à chercher et te tiens au courant de la solution (si je trouve ...)

oranocha commented 8 years ago

C'est également ce que je suspectais mais sans vraiment trouver donc j'ai préféré "hacker" le système pour que cela fonctionne.

Le ven. 24 juin 2016 à 08:54, Peterkenne notifications@github.com a écrit :

Grand merci pour ces infos. Donc, tu n'as pas compris pourquoi l'utilisateur était déconnecté ? De mon côté, je suspecte un passage par une adresse HTTP au lieu de HTTPS. Je continue à chercher et te tiens au courant de la solution (si je trouve ...)

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/PrestaShop/ogone/issues/7#issuecomment-228271543, or mute the thread https://github.com/notifications/unsubscribe/AKT_hL0EWxKWNc1hcY56-QalX8l42Lo-ks5qO38xgaJpZM4Ih6cb .

Olivier Ranocha Youonweb - Directeur

Recevez GRATUITEMENT ma formation sur les 7 habitudes des gens efficaces ( http://www.ranochaolivier.com)

Web : http://www.youonweb.be Web solutions serving Business performance

Téléphone : 0032 65 980173 Skype : oranocha

peterkenne commented 8 years ago

J'ai trouvé chez moi. Je pense que c'est un bug du module ogone : dans la classe ogone.php, la méthode getconfirmationUrl appelle getPtotocol, mais sans argument, ce qui force le protocole à HTTP. Donc, dans le formulaire caché d'Ogone, l'adresse de confrmation est en HTTP, ce qui fait que le user est déconnecté au retour d'Ogone. On n'a donc plus accès à son cookie, utilisé pour aller récupérer la secure-key au cours du checkwaitingorder qui cherrche simplement à vérifier que l'ordre a été créé. donc, la page de confirmation tourne en boucle ...

rGaillard commented 8 years ago

@oranocha there is a security issue on the SQL request of your code. You must escape the secure_key variable using the pSQL() function to prevent SQL injections.