Jump to content
NSN

Geolocation in Prestashop

Recommended Posts

Ich weis nicht wer von euch alles die Funktion "Geolocation" in Prestashop verwendet aber ich hab da mal zwei Fragen dazu.

Zum einen habe ich gelesen dass wenn man die Funktion aktiviert hat Nutzer welche mit einer IP unterwegs sind die nicht in der GeoIP Datei ist automatisch ausgesperrt werden. Wenn dem so ist könnte man dies verhindern indem man in FrontController.php den Code ändert?

    /**
     * Geolocation management
     *
     * @param Country $default_country
     * @return Country|false
     */
    protected function geolocationManagement($default_country)
    {
        if (!in_array($_SERVER['SERVER_NAME'], array('localhost', '127.0.0.1'))) {
            /* Check if Maxmind Database exists */
            if (@filemtime(_PS_GEOIP_DIR_._PS_GEOIP_CITY_FILE_)) {
                if (!isset($this->context->cookie->iso_code_country) || (isset($this->context->cookie->iso_code_country) && !in_array(strtoupper($this->context->cookie->iso_code_country), explode(';', Configuration::get('PS_ALLOWED_COUNTRIES'))))) {
                    include_once(_PS_GEOIP_DIR_.'geoipcity.inc');

                    $gi = geoip_open(realpath(_PS_GEOIP_DIR_._PS_GEOIP_CITY_FILE_), GEOIP_STANDARD);
                    $record = geoip_record_by_addr($gi, Tools::getRemoteAddr());

                    if (is_object($record)) {
                        if (!in_array(strtoupper($record->country_code), explode(';', Configuration::get('PS_ALLOWED_COUNTRIES'))) && !FrontController::isInWhitelistForGeolocation()) {
                            if (Configuration::get('PS_GEOLOCATION_BEHAVIOR') == _PS_GEOLOCATION_NO_CATALOG_) {
                                $this->restrictedCountry = true;
                            } elseif (Configuration::get('PS_GEOLOCATION_BEHAVIOR') == _PS_GEOLOCATION_NO_ORDER_) {
                                $this->context->smarty->assign(array(
                                    'restricted_country_mode' => true,
                                    'geolocation_country'     => $record->country_name
                                ));
                            }
                        } else {
                            $has_been_set = !isset($this->context->cookie->iso_code_country);
                            $this->context->cookie->iso_code_country = strtoupper($record->country_code);
                        }
                    }
                }

                if (isset($this->context->cookie->iso_code_country) && $this->context->cookie->iso_code_country && !Validate::isLanguageIsoCode($this->context->cookie->iso_code_country)) {
                    $this->context->cookie->iso_code_country = Country::getIsoById(Configuration::get('PS_COUNTRY_DEFAULT'));
                }

                if (isset($this->context->cookie->iso_code_country) && ($id_country = (int)Country::getByIso(strtoupper($this->context->cookie->iso_code_country)))) {
                    /* Update defaultCountry */
                    if ($default_country->iso_code != $this->context->cookie->iso_code_country) {
                        $default_country = new Country($id_country);
                    }
                    if (isset($has_been_set) && $has_been_set) {
                        $this->context->cookie->id_currency = (int)($default_country->id_currency ? (int)$default_country->id_currency : (int)Configuration::get('PS_CURRENCY_DEFAULT'));
                    }
                    return $default_country;
                } elseif (Configuration::get('PS_GEOLOCATION_NA_BEHAVIOR') == _PS_GEOLOCATION_NO_CATALOG_ && !FrontController::isInWhitelistForGeolocation()) {
                    $this->restrictedCountry = true;
                } elseif (Configuration::get('PS_GEOLOCATION_NA_BEHAVIOR') == _PS_GEOLOCATION_NO_ORDER_ && !FrontController::isInWhitelistForGeolocation()) {
                    $this->context->smarty->assign(array(
                        'restricted_country_mode' => true,
                        'geolocation_country'     => isset($record->country_name) && $record->country_name ? $record->country_name : 'Undefined'
                    ));
                }
            }
        }
        return false;
    }

Wenn ich es richtig verstehe müsste es doch gehen wenn man im letzten Teil die zwei "true" auf "false" ändert. Oder ist das zu einfach gedacht? Ich geb zu dass ich in den Dingen nicht so ganz bewandert bin.

                } elseif (Configuration::get('PS_GEOLOCATION_NA_BEHAVIOR') == _PS_GEOLOCATION_NO_CATALOG_ && !FrontController::isInWhitelistForGeolocation()) {
                    $this->restrictedCountry = false;
                } elseif (Configuration::get('PS_GEOLOCATION_NA_BEHAVIOR') == _PS_GEOLOCATION_NO_ORDER_ && !FrontController::isInWhitelistForGeolocation()) {
                    $this->context->smarty->assign(array(
                        'restricted_country_mode' => false,
                        'geolocation_country'     => isset($record->country_name) && $record->country_name ? $record->country_name : 'Undefined'
                    ));
                }
            }
        }
        return false;
    }

 

Die andere Frage welche mich beschäftigt und auch noch nicht beantworten konnte ist dass die IP Liste welche genutzt wird ( GeoLite ) vom März ist und durch GeoLite2 ersetzt wurde welche in einem anderen Format ist. Da Prestashop 1.6 ja nicht mehr aktiv betreut wird nehme ich an dass es keine Anpassung dafür geben wird.
Inwiefern ändern sich eigentlich die Länder welchen eine IP zugeordnet ist. Ich hab da echt keinen Plan und kanns mir auch überhaupt nicht vorstellen.

Share this post


Link to post
Share on other sites

Keiner die Geolocation aktiviert oder wenigstens eine Idee davon ob das so hinhaut wie ich mir das vorstelle?
Da ich ja nicht prüfen kann ob es mit der Änderung geht grübel ich doch ständig etwas darüber nach. Potenzielle Kunden ausschließen ist ja nicht mein Ziel.

Share this post


Link to post
Share on other sites

Ich denke, daß deine Frage eher theoretischer Natur ist, das betrifft wohl nur sehr exotische Länder oder die IPs von Spammern. Es dürfte sich in der IP-Liste auch sehr wenig ändern und wenn nun ein User, der auf der Krim wohnt z. B. statt Russland noch der Ukraine zugeordnet wird dürfte sich das auch eher selten negativ auswirken ...

Edited by rictools (see edit history)

Share this post


Link to post
Share on other sites

Ja, die Frage beschäftigt mich vielleicht mehr als nötigt, es geht ja eigentlich auch nicht darum ob einer der auf der Krim wohnt Russland oder der Ukraine zugeordnet wird, sondern was mit denen ist bei denen die IP keinem Land zugeordnet ist. Nachdem was ich im Internet zusammengetragen habe sind das bei der verwendeten freien IP Liste von Maxmind doch einige.
Über der Zuverlässigkeit der IP Liste habe ich immer wieder unterschiedliches gefunden und unter anderem irgendwo mal gelesen habe dass diese für DE bei fast 99% liegen soll, in AT aber bei unter 90% habe ich mir eben überlegt ob es nicht einfach möglich wäre den Code zu ändern damit IPs welche nicht erkannt werden dennoch vollen Zugriff haben. (Wenn ich bei Matomo nachschaue finde ich dort hin und wieder "Unbekannt" beim Land, auch schon mal welche gehabt die ich definitiv DE zuordnen konnte)

Share this post


Link to post
Share on other sites

Letztendlich ist das eine ziemlich ungenaue Angelegenheit, weil es -zig Möglichkeiten gibt, die nach außen sichtbare IP zu manipulieren, was ja beispielsweise bei Filesharing die wichtigste Grundfunktion ist.

Bevor man also nun Leute anhand der IP aussperrt, sollte man eher daran arbeiten, potenziellen Betrugsversuchen anders zu begegnen. Denn andersrum wird ein Gauner aus einer Gegend, die man aussperren will, immer über einen Proxy kommen, der deinem Shop erzählt, er käme aus einer Gegend ohne Betrüger.... Und wenn die Ware dann auch noch in so eine Gegend geht und erst dort dann weitergeschickt wird, funktioniert das am Besten, wenn man meint, alles safe zu haben ;)

Natürlich wird es immer mal einen erfolgreichen Versuch geben, weil man zwar 100 potenzielle Gefahren ausgeschaltet hat, aber eben die 101. dann doch funktioniert hat. das erleben wir auch immer wieder. Wichtig ist dann, daraus zu lernen, aber bestimmt nicht, daraus zu schließen, dass alle Leute aus der Gegend, wohin die Ware verschwand, auch so sind. Da ist die beste Lösung dann, den Shop dicht zu machen.

Share this post


Link to post
Share on other sites

Ich habe gerade eben NICHT die Absicht jemanden auszusperren oder zu blockieren. Darum ja meine Absicht den Code so zu ändern dass eben auch IPs welche keinen Ländern zugeordnet sind (die IP Liste ist ja eben nicht perfekt) kompletten Zugang haben und nicht blockiert werden wie es eben im Originalcode der Fall ist.

Ich benötige die Geolocation eigentlich nur dafür dass ein Besucher automatisch die für Ihn passende Währung angezeigt bekommt. Er kann die Währung selbst zwar nach belieben ändern aber ich habe eben die Erfahrung gemacht dass wenn der Shop die Preise in Yen anzeigt (Standardwährung des Shops) die Absprungrate viel höher ist als wenn die gewohnte Währung sichtbar ist. Früher haben wir deshalb per Override für alle Kunden EUR angezeigt aber nachdem immer mehr und mehr Kunden aus anderen Teilen der Welt bestellen ist die erzwungene Anzeige von EUR auch wieder in Frage zu stellen.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More