From 78db3d054b6f2b5ca04f69bdd92680b89ec2372b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Hu=C4=8D=C3=ADk?= Date: Fri, 1 May 2020 09:34:03 +0200 Subject: [PATCH] Initial version --- LICENSE.txt | 173 ++++++++++++++++++++++++++++++++++++++++++++ build.sh | 20 +++++ cloudflaregeoip.php | 108 +++++++++++++++++++++++++++ logo.png | Bin 0 -> 16590 bytes 4 files changed, 301 insertions(+) create mode 100644 LICENSE.txt create mode 100755 build.sh create mode 100644 cloudflaregeoip.php create mode 100644 logo.png diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..8cfbed5 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,173 @@ +Academic Free License (“AFL”) v. 3.0 + +This Academic Free License (the "License") applies to any original work of +authorship (the "Original Work") whose owner (the "Licensor") has placed the +following licensing notice adjacent to the copyright notice for the Original +Work: + +Licensed under the Academic Free License version 3.0 + +1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, +non-exclusive, sublicensable license, for the duration of the copyright, to do +the following: + +a) to reproduce the Original Work in copies, either alone or as part of a +collective work; + +b) to translate, adapt, alter, transform, modify, or arrange the Original +Work, thereby creating derivative works ("Derivative Works") based upon the +Original Work; + +c) to distribute or communicate copies of the Original Work and Derivative +Works to the public, under any license of your choice that does not contradict +the terms and conditions, including Licensor’s reserved rights and remedies, +in this Academic Free License; + +d) to perform the Original Work publicly; and + +e) to display the Original Work publicly. + +2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, +non-exclusive, sublicensable license, under patent claims owned or controlled +by the Licensor that are embodied in the Original Work as furnished by the +Licensor, for the duration of the patents, to make, use, sell, offer for sale, +have made, and import the Original Work and Derivative Works. + +3) Grant of Source Code License. The term "Source Code" means the preferred +form of the Original Work for making modifications to it and all available +documentation describing how to modify the Original Work. Licensor agrees to +provide a machine-readable copy of the Source Code of the Original Work along +with each copy of the Original Work that Licensor distributes. Licensor +reserves the right to satisfy this obligation by placing a machine-readable +copy of the Source Code in an information repository reasonably calculated to +permit inexpensive and convenient access by You for as long as Licensor +continues to distribute the Original Work. + +4) Exclusions From License Grant. Neither the names of Licensor, nor the names +of any contributors to the Original Work, nor any of their trademarks or +service marks, may be used to endorse or promote products derived from this +Original Work without express prior permission of the Licensor. Except as +expressly stated herein, nothing in this License grants any license to +Licensor’s trademarks, copyrights, patents, trade secrets or any other +intellectual property. No patent license is granted to make, use, sell, offer +for sale, have made, or import embodiments of any patent claims other than the +licensed claims defined in Section 2. No license is granted to the trademarks +of Licensor even if such marks are included in the Original Work. Nothing in +this License shall be interpreted to prohibit Licensor from licensing under +terms different from this License any Original Work that Licensor otherwise +would have a right to license. + +5) External Deployment. The term "External Deployment" means the use, +distribution, or communication of the Original Work or Derivative Works in any +way such that the Original Work or Derivative Works may be used by anyone +other than You, whether those works are distributed or communicated to those +persons or made available as an application intended for use over a network. +As an express condition for the grants of license hereunder, You must treat +any External Deployment by You of the Original Work or a Derivative Work as a +distribution under section 1(c). + +6) Attribution Rights. You must retain, in the Source Code of any Derivative +Works that You create, all copyright, patent, or trademark notices from the +Source Code of the Original Work, as well as any notices of licensing and any +descriptive text identified therein as an "Attribution Notice." You must cause +the Source Code for any Derivative Works that You create to carry a prominent +Attribution Notice reasonably calculated to inform recipients that You have +modified the Original Work. + +7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that +the copyright in and to the Original Work and the patent rights granted herein +by Licensor are owned by the Licensor or are sublicensed to You under the +terms of this License with the permission of the contributor(s) of those +copyrights and patent rights. Except as expressly stated in the immediately +preceding sentence, the Original Work is provided under this License on an "AS +IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without +limitation, the warranties of non-infringement, merchantability or fitness for +a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK +IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this +License. No license to the Original Work is granted by this License except +under this disclaimer. + +8) Limitation of Liability. Under no circumstances and under no legal theory, +whether in tort (including negligence), contract, or otherwise, shall the +Licensor be liable to anyone for any indirect, special, incidental, or +consequential damages of any character arising as a result of this License or +the use of the Original Work including, without limitation, damages for loss +of goodwill, work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses. This limitation of liability shall not +apply to the extent applicable law prohibits such limitation. + +9) Acceptance and Termination. If, at any time, You expressly assented to this +License, that assent indicates your clear and irrevocable acceptance of this +License and all of its terms and conditions. If You distribute or communicate +copies of the Original Work or a Derivative Work, You must make a reasonable +effort under the circumstances to obtain the express assent of recipients to +the terms of this License. This License conditions your rights to undertake +the activities listed in Section 1, including your right to create Derivative +Works based upon the Original Work, and doing so without honoring these terms +and conditions is prohibited by copyright law and international treaty. +Nothing in this License is intended to affect copyright exceptions and +limitations (including “fair use” or “fair dealing”). This License shall +terminate immediately and You may no longer exercise any of the rights granted +to You by this License upon your failure to honor the conditions in Section +1(c). + +10) Termination for Patent Action. This License shall terminate automatically +and You may no longer exercise any of the rights granted to You by this +License as of the date You commence an action, including a cross-claim or +counterclaim, against Licensor or any licensee alleging that the Original Work +infringes a patent. This termination provision shall not apply for an action +alleging patent infringement by combinations of the Original Work with other +software or hardware. + +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this +License may be brought only in the courts of a jurisdiction wherein the +Licensor resides or in which Licensor conducts its primary business, and under +the laws of that jurisdiction excluding its conflict-of-law provisions. The +application of the United Nations Convention on Contracts for the +International Sale of Goods is expressly excluded. Any use of the Original +Work outside the scope of this License or after its termination shall be +subject to the requirements and penalties of copyright or patent law in the +appropriate jurisdiction. This section shall survive the termination of this +License. + +12) Attorneys’ Fees. In any action to enforce the terms of this License or +seeking damages relating thereto, the prevailing party shall be entitled to +recover its costs and expenses, including, without limitation, reasonable +attorneys' fees and costs incurred in connection with such action, +including any appeal of such action. This section shall survive the +termination of this License. + +13) Miscellaneous. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent necessary +to make it enforceable. + +14) Definition of "You" in This License. "You" throughout this License, +whether in upper or lower case, means an individual or a legal entity +exercising rights under, and complying with all of the terms of, this License. +For legal entities, "You" includes any entity that controls, is controlled by, +or is under common control with you. For purposes of this definition, +"control" means (i) the power, direct or indirect, to cause the direction or +management of such entity, whether by contract or otherwise, or (ii) ownership +of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial +ownership of such entity. + +15) Right to Use. You may use the Original Work in all ways not otherwise +restricted or conditioned by this License or by law, and Licensor promises not +to interfere with or be responsible for such uses by You. + +16) Modification of This License. This License is Copyright © 2005 Lawrence +Rosen. Permission is granted to copy, distribute, or communicate this License +without modification. Nothing in this License permits You to modify this +License as applied to the Original Work or to Derivative Works. However, You +may modify the text of this License and copy, distribute or communicate your +modified version (the "Modified License") and apply it to other original works +of authorship subject to the following conditions: (i) You may not indicate in +any way that your Modified License is the "Academic Free License" or "AFL" and +you may not use those names in the name of your Modified License; (ii) You +must replace the notice specified in the first paragraph above with the notice +"Licensed under " or with a notice of your own +that is not confusingly similar to the notice in this License; and (iii) You +may not claim that your original works are open source software unless your +Modified License has been approved by Open Source Initiative (OSI) and You +comply with its license review and certification process. + diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..36c7187 --- /dev/null +++ b/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +CWD_BASENAME=${PWD##*/} + +FILES+=("${CWD_BASENAME}.php") +FILES+=("LICENSE.txt") +FILES+=("logo.png") + +MODULE_VERSION="$(sed -ne "s/\\\$this->version *= *['\"]\([^'\"]*\)['\"] *;.*/\1/p" ${CWD_BASENAME}.php)" +MODULE_VERSION_FILE=`echo ${MODULE_VERSION} | sed -e "s/\./_/g"`; +MODULE_VERSION=${MODULE_VERSION//[[:space:]]} +ZIP_FILE="${CWD_BASENAME}-${MODULE_VERSION_FILE}.zip" + +echo "Going to zip ${CWD_BASENAME} version ${MODULE_VERSION}" + +cd .. +rm -f ${ZIP_FILE}; + +for E in "${FILES[@]}"; do + find ${CWD_BASENAME}/${E} -type f -exec zip -9 ${ZIP_FILE} {} \; +done diff --git a/cloudflaregeoip.php b/cloudflaregeoip.php new file mode 100644 index 0000000..e59806e --- /dev/null +++ b/cloudflaregeoip.php @@ -0,0 +1,108 @@ + + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@getdatakick.com so we can send you a copy immediately. + * + * @author Petr Hucik + * @copyright 2017-2019 Petr Hucik + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +class CloudflareGeoIp extends Module +{ + public function __construct() + { + $this->name = 'cloudflaregeoip'; + $this->tab = 'back_office_features'; + $this->author = 'datakick'; + $this->version = '1.0.0'; + $this->need_instance = 0; + $this->bootstrap = true; + parent::__construct(); + + $this->displayName = $this->l('Cloudflare GeoIp'); + $this->description = $this->l('use cloudflare geoip header to choose country and currency'); + $this->controllers = ['login']; + $this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_); + } + + /** + * @return bool + * @throws PrestaShopDatabaseException + * @throws PrestaShopException + */ + public function install() + { + return (parent::install() && $this->registerHook('moduleRoutes')); + } + + /** + * @throws PrestaShopException + */ + public function hookModuleRoutes() + { + $this->setCountry(); + + return []; + } + + private function setCountry() + { + // get cloudflare header + $countryCode = $this->getCountryCode(); + if (!$countryCode) { + return; + } + + // check that we not in back office + $cookie = $this->context->cookie; + if (isset($cookie->id_employee)) { + return; + } + + // get currently set country code from cookie + $currentCountryCode = isset($this->context->cookie->iso_code_country) ? $this->context->cookie->iso_code_country : null; + if ($currentCountryCode && $currentCountryCode != $countryCode) { + // if country is already set to different country, don't interfere + return; + } + + $countryId = Country::getByIso($countryCode, true); + if (! $countryId) { + return; + } + + $country = new Country($countryId, (int)$cookie->id_lang); + if (!Validate::isLoadedObject($country)) { + return; + } + + // ok, let's set up country + $this->context->country = $country; + $cookie->iso_code_country = $countryCode; + unset($cookie->detect_language); + + // set currency, if not set up yet + $currentCurrencyId = isset($this->context->cookie->id_currency) ? (int)$this->context->cookie->id_currency : 0; + if (!$currentCurrencyId) { + $cookie->id_currency = (int)Currency::getCurrencyInstance($country->id_currency ? (int)$country->id_currency : (int)Configuration::get('PS_CURRENCY_DEFAULT'))->id; + } + } + + private function getCountryCode() + { + if (isset($_SERVER["HTTP_CF_IPCOUNTRY"])) { + return $_SERVER["HTTP_CF_IPCOUNTRY"]; + } + return null; + } +} diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..48051965a5863287b228c0b8a05ff2ccccae2070 GIT binary patch literal 16590 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 AasU7T literal 0 HcmV?d00001