diff options
author | Matthieu Aubry <matt@piwik.org> | 2015-07-13 01:58:12 +0300 |
---|---|---|
committer | Matthieu Aubry <matt@piwik.org> | 2015-07-13 01:58:12 +0300 |
commit | 286a5fb304660c1e7eaad08da5c5dedd98b414f1 (patch) | |
tree | 832d784ae77f46bab16a08027a1db103a5d051e4 | |
parent | 319e45771a9bd8732b3271e6d0838c8aa00cb918 (diff) | |
parent | cb5f565b5a9f621ffa6cea56f7c10c31cbf8e89e (diff) |
Merge pull request #8229 from Zeichen32/OptOutManager
Add OptOutManager
-rw-r--r-- | plugins/CoreAdminHome/Controller.php | 55 | ||||
-rw-r--r-- | plugins/CoreAdminHome/OptOutManager.php | 180 | ||||
-rw-r--r-- | plugins/CoreAdminHome/templates/optOut.twig | 30 |
3 files changed, 216 insertions, 49 deletions
diff --git a/plugins/CoreAdminHome/Controller.php b/plugins/CoreAdminHome/Controller.php index b80ef1bc7a..cb8f862643 100644 --- a/plugins/CoreAdminHome/Controller.php +++ b/plugins/CoreAdminHome/Controller.php @@ -21,7 +21,6 @@ use Piwik\Piwik; use Piwik\Plugin\ControllerAdmin; use Piwik\Plugins\CorePluginsAdmin\UpdateCommunication; use Piwik\Plugins\CustomVariables\CustomVariables; -use Piwik\Plugins\LanguagesManager\API as APILanguagesManager; use Piwik\Plugins\LanguagesManager\LanguagesManager; use Piwik\Plugins\PrivacyManager\DoNotTrackHeaderChecker; use Piwik\Plugins\SitesManager\API as APISitesManager; @@ -29,7 +28,6 @@ use Piwik\Settings\Manager as SettingsManager; use Piwik\Settings\SystemSetting; use Piwik\Settings\UserSetting; use Piwik\Site; -use Piwik\Tracker\IgnoreCookie; use Piwik\Translation\Translator; use Piwik\Url; use Piwik\View; @@ -43,9 +41,13 @@ class Controller extends ControllerAdmin */ private $translator; - public function __construct(Translator $translator) + /** @var OptOutManager */ + private $optOutManager; + + public function __construct(Translator $translator, OptOutManager $optOutManager) { $this->translator = $translator; + $this->optOutManager = $optOutManager; parent::__construct(); } @@ -317,52 +319,7 @@ class Controller extends ControllerAdmin */ public function optOut() { - $trackVisits = !IgnoreCookie::isIgnoreCookieFound(); - - $dntChecker = new DoNotTrackHeaderChecker(); - $dntFound = $dntChecker->isDoNotTrackFound(); - - $setCookieInNewWindow = Common::getRequestVar('setCookieInNewWindow', false, 'int'); - if ($setCookieInNewWindow) { - $reloadUrl = Url::getCurrentQueryStringWithParametersModified(array( - 'showConfirmOnly' => 1, - 'setCookieInNewWindow' => 0, - )); - } else { - $reloadUrl = false; - - $nonce = Common::getRequestVar('nonce', false); - if ($nonce !== false && Nonce::verifyNonce('Piwik_OptOut', $nonce)) { - Nonce::discardNonce('Piwik_OptOut'); - IgnoreCookie::setIgnoreCookie(); - $trackVisits = !$trackVisits; - } - } - - $language = Common::getRequestVar('language', ''); - $lang = APILanguagesManager::getInstance()->isLanguageAvailable($language) - ? $language - : LanguagesManager::getLanguageCodeForCurrentUser(); - - // should not use self::renderTemplate since that uses setBasicVariablesView. this will cause - // an error when setBasicVariablesAdminView is called, and MenuTop is requested (the idSite query - // parameter is required) - $view = new View("@CoreAdminHome/optOut"); - $view->setXFrameOptions('allow'); - $view->dntFound = $dntFound; - $view->trackVisits = $trackVisits; - $view->nonce = Nonce::getNonce('Piwik_OptOut', 3600); - $view->language = $lang; - $view->isSafari = $this->isUserAgentSafari(); - $view->showConfirmOnly = Common::getRequestVar('showConfirmOnly', false, 'int'); - $view->reloadUrl = $reloadUrl; - return $view->render(); - } - - private function isUserAgentSafari() - { - $userAgent = @$_SERVER['HTTP_USER_AGENT'] ?: ''; - return strpos($userAgent, 'Safari') !== false && strpos($userAgent, 'Chrome') === false; + return $this->optOutManager->getOptOutView()->render(); } public function uploadCustomLogo() diff --git a/plugins/CoreAdminHome/OptOutManager.php b/plugins/CoreAdminHome/OptOutManager.php new file mode 100644 index 0000000000..42a1cd9aea --- /dev/null +++ b/plugins/CoreAdminHome/OptOutManager.php @@ -0,0 +1,180 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ +namespace Piwik\Plugins\CoreAdminHome; + +use Piwik\Common; +use Piwik\Nonce; +use Piwik\Plugins\LanguagesManager\API as APILanguagesManager; +use Piwik\Plugins\LanguagesManager\LanguagesManager; +use Piwik\Plugins\PrivacyManager\DoNotTrackHeaderChecker; +use Piwik\Tracker\IgnoreCookie; +use Piwik\Url; +use Piwik\View; + +class OptOutManager +{ + /** @var DoNotTrackHeaderChecker */ + private $doNotTrackHeaderChecker; + + /** @var array */ + private $javascripts; + + /** @var array */ + private $stylesheets; + + /** @var string */ + private $title; + + /** @var View|null */ + private $view; + + /** + * @param DoNotTrackHeaderChecker $doNotTrackHeaderChecker + */ + public function __construct(DoNotTrackHeaderChecker $doNotTrackHeaderChecker = null) + { + $this->doNotTrackHeaderChecker = $doNotTrackHeaderChecker ?: new DoNotTrackHeaderChecker(); + + $this->javascripts = array( + 'inline' => array(), + 'external' => array(), + ); + + $this->stylesheets = array( + 'inline' => array(), + 'external' => array(), + ); + } + + /** + * Add a javascript file|code into the OptOut View + * Note: This method will not escape the inline javascript code! + * + * @param string $javascript + * @param bool $inline + */ + public function addJavascript($javascript, $inline = true) + { + $type = $inline ? 'inline' : 'external'; + $this->javascripts[$type][] = $javascript; + } + + /** + * @return array + */ + public function getJavascripts() + { + return $this->javascripts; + } + + /** + * Add a stylesheet file|code into the OptOut View + * Note: This method will not escape the inline css code! + * + * @param string $stylesheet Escaped stylesheet + * @param bool $inline + */ + public function addStylesheet($stylesheet, $inline = true) + { + $type = $inline ? 'inline' : 'external'; + $this->stylesheets[$type][] = $stylesheet; + } + + /** + * @return array + */ + public function getStylesheets() + { + return $this->stylesheets; + } + + /** + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * @param string $title + */ + public function setTitle($title) + { + $this->title = $title; + } + + /** + * @return View + * @throws \Exception + */ + public function getOptOutView() + { + if ($this->view) { + return $this->view; + } + + $trackVisits = !IgnoreCookie::isIgnoreCookieFound(); + $dntFound = $this->getDoNotTrackHeaderChecker()->isDoNotTrackFound(); + + $setCookieInNewWindow = Common::getRequestVar('setCookieInNewWindow', false, 'int'); + if ($setCookieInNewWindow) { + $reloadUrl = Url::getCurrentQueryStringWithParametersModified(array( + 'showConfirmOnly' => 1, + 'setCookieInNewWindow' => 0, + )); + } else { + $reloadUrl = false; + + $nonce = Common::getRequestVar('nonce', false); + if ($nonce !== false && Nonce::verifyNonce('Piwik_OptOut', $nonce)) { + Nonce::discardNonce('Piwik_OptOut'); + IgnoreCookie::setIgnoreCookie(); + $trackVisits = !$trackVisits; + } + } + + $language = Common::getRequestVar('language', ''); + $lang = APILanguagesManager::getInstance()->isLanguageAvailable($language) + ? $language + : LanguagesManager::getLanguageCodeForCurrentUser(); + + $this->view = new View("@CoreAdminHome/optOut"); + $this->view->setXFrameOptions('allow'); + $this->view->dntFound = $dntFound; + $this->view->trackVisits = $trackVisits; + $this->view->nonce = Nonce::getNonce('Piwik_OptOut', 3600); + $this->view->language = $lang; + $this->view->isSafari = $this->isUserAgentSafari(); + $this->view->showConfirmOnly = Common::getRequestVar('showConfirmOnly', false, 'int'); + $this->view->reloadUrl = $reloadUrl; + $this->view->javascripts = $this->getJavascripts(); + $this->view->stylesheets = $this->getStylesheets(); + $this->view->title = $this->getTitle(); + + return $this->view; + } + + /** + * @return DoNotTrackHeaderChecker + */ + protected function getDoNotTrackHeaderChecker() + { + return $this->doNotTrackHeaderChecker; + } + + /** + * @return bool + */ + protected function isUserAgentSafari() + { + $userAgent = @$_SERVER['HTTP_USER_AGENT'] ?: ''; + return strpos($userAgent, 'Safari') !== false && strpos($userAgent, 'Chrome') === false; + } +} diff --git a/plugins/CoreAdminHome/templates/optOut.twig b/plugins/CoreAdminHome/templates/optOut.twig index 55cd9da01d..e24d47f85b 100644 --- a/plugins/CoreAdminHome/templates/optOut.twig +++ b/plugins/CoreAdminHome/templates/optOut.twig @@ -2,9 +2,13 @@ <html> <head> <meta charset="utf-8"> + {% if title %} + <title>{{ title }}</title> + {% endif %} {% if reloadUrl %} <meta http-equiv="refresh" content="0; url={{ reloadUrl }}&nonce={{ nonce }}" /> {% endif %} + <script> function submitForm(event, form, loadInNewWindow) { event.preventDefault(); @@ -21,6 +25,19 @@ } } </script> + + {% if stylesheets.external|length > 0 %} + {% for style in stylesheets.external %} + <link href="{{ style|raw }}" rel="stylesheet" type="text/css"> + {% endfor %} + {% endif %} + {% if stylesheets.inline|length > 0 %} + <style> + {% for style in stylesheets.inline %} + {{ style|raw }} + {% endfor %} + </style> + {% endif %} </head> <body> {% if dntFound %} @@ -69,5 +86,18 @@ </form> {% endif %} {% endif %} + +{% if javascripts.external|length > 0 %} + {% for script in javascripts.external %} + <script type="text/javascript" src="{{ script|raw }}"></script> + {% endfor %} +{% endif %} +{% if javascripts.inline|length > 0 %} + <script> + {% for script in javascripts.inline %} + {{ script|raw }} + {% endfor %} + </script> +{% endif %} </body> </html> |