Az Übercart uc_credit modulja nem kezeli az ékezeteket

moroland képe

Az Übercart Credit Card modulja fura hibákat produkál, ha ékezetes nevet megadva próbál az ember fizetni.

Belefutottam ebbe a "kis" problémába, és gondoltam leírom a tapasztalataimat.

Ott kezdődik a gond, hogy ha az Übercart Credit Card payment modulját bekapcsolod, és beállítod, hogy kérjen kártyán szereplő nevet is, majd megpróbálsz egy olyan nevet megadni a fizetésnél, amiben van ékezet, akkor ahelyett, hogy jelezné hogy ez a probléma, a következő hibaüzenetekkel töltődik újra az oldal:

user warning: in site_könyvtár\modules\dblog\dblog.module on line 147.
user warning: in site_könyvtár\modules\dblog\dblog.module on line 147.
A bankkártya adatai kitörlődnek, ha a böngészőben frissül a rendelési előnézetet, mindez annak érdekében történik, hogy a kártyahasználó személyes adatai 3. személyhez ne kerülhessen. Újból meg kell adni a kártyaszámot majd be kell küldeni az űrlapot.

És tényleg, a kártya adatok kitörlődnek az űrlapból.

A hiba alapvető oka, hogy az uc_credit modul egy saját titkosító eljárást használ a kártya-adatok ideiglenes tárolására. Az ezt megvalósító függvényekbe pedig "bele van égetve", hogy milyen karaktereket hajlandó elkódolni:

    $this->scramble1 = '! #$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`"abcdefghijklmnopqrstuvwxyz{|}~';
    $this->scramble2 = 'f^jAE]okIOzU[2&q1{3`h5w_794p@6s8?BgP>dFV=m" D<TcS%Ze|r:lGK/uCy.Jx)HiQ!#$~(;Lt-R}Ma,NvW+Ynb*0X';

A problémát tetőzi, hogy a hibát megpróbálja belogolni a watchdog-ba, de mivel érvénytelen karakter van a hibaüzenetben is emiatt, ezért a watchdog is hibát jelez (ezért az első 2 user warning).

Ha helyregyógyítja az ember az us_store.module uc_store_encryption_errors függvényét mondjuk egy utf8_encode()-al, akkor már legalább beíródik a watchdogba, hogy mi is a baja.
Persze ez továbbra sem jelenik meg a felhasználónak. Szóval azt gondolná az ember, hogy akkor most vagy fogadja el az ékezeteket, vagy ha nem, legalább írja ki. De ezen hiba-burjázás midkét esetet meghiúsítja.

A problémára van egy issue: http://drupal.org/node/912742 ez azonban csak egy patch, mely az alábbi kódrészlettel egészíti ki a modult:

      // Transliterate owner name field if possible.
      if (module_exists('transliteration')) {
        $cc_data['cc_owner'] = check_plain(transliteration_get($_POST['cc_owner']));
      }

Azaz, ha fel van telepítve a Transliterate modul, akkor meghívja az átakakító függvényét, így a Molnár Rolandból Molnar Roland lesz. Ezt persze korántsem tartom megfelelő megoldásnak, hiszen ekkor a kártyafeldolgozó gateway-nek is így lesz átadva a kártyán szereplő név. Persze tudtommal a kártyaelfogadó rendszereket ez nem nagyon zavarja, de azért hát mégis... :)

Szóval a fent említett patch működik, megszűnik tőle a fent leírt hiba, de tényleges megoldás az lenne, ha az uc_store.module-ban lévő uc_encryption_class-t írnák újra, hogy mondjuk ne csak az angol ábécével menjen. Másik alternatíva lehet még, hogyha a kártyaszám validálásával egyidőben leellenőrizzük, hogy ezen "scramble1"-nek megfelel-e a beírt név, és hibaüzenettel kidobjuk, ha nem. Na persze ezt is megpróbáltam, de érdekes módon ha az encryption-ben hiba van, nem jelenített meg semmilyen drupal_set_message() által kiíratandó hibaüzenetet nekem. Bevallom, nem volt kedvem tovább vacakolni, maradt a Transliterate és a patch :/

Ehhez kapcsolódóan másik érdekes probléma, hogy ha hibával újratöltődik a checkout képernyő, a beírt kártyaszám kicserélődik arra, hogy

(Utolsó 4) XXXX

- ahol az XXXX a beírt szám utolsó 4 jegye. Na és most jön a vicc: ezt az űrlapot így újra beküldve megint jönnek a watchdog warning-ok, mert hát az ó betű sem tetszik az encrypt-nek, és persze ezt próbálja logolni és persze ezen elhasal a watchdog :)
Ekkor már nagyon ideges az ember, és a fordításban kicserélni az '(Utolsó 4)' szöveget a sokkal egyértelműbb XXXX XXXX XXXX -re (vagy ---- ---- ---- vagy hasonló, kinek mi tetszik). :)

Übercart verzió: 6.x-2.4

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: